ref: 571745933ffa49c5a2f5f9ee1339b302cd6dfb5e
parent: 92bdf127ca8813f47e8e6d9ad1f9990e40fb8c39
parent: 806ffe22b9faacdb3bf704739112a98ca5b748fb
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Thu Oct 10 13:35:05 EDT 2024
Merge branch 'master' into mhs-builtin
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,3 +1,4 @@
*.comb binary
generated/mhs.c binary
generated/cpphs.c binary
+doc/hs2024.pdf binary
--- a/.github/workflows/mhs-ci.yml
+++ b/.github/workflows/mhs-ci.yml
@@ -6,9 +6,13 @@
pull_request:
branches: [ "master" ]
+# Using
+# runs-on: ubuntu-latest
+# fails, so use an older Ubuntu
+
jobs:
build-linux-x86_64:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- name: checkout repo
uses: actions/checkout@v4
@@ -36,7 +40,7 @@
run: cabal build
build-linux-micro-x86_64:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- name: checkout repo
uses: actions/checkout@v4
@@ -69,7 +73,7 @@
run: nmake -f Makefile.windows exampletest
build-linux-aarch64:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- uses: jirutka/setup-alpine@v1
with:
@@ -89,7 +93,7 @@
# run: cabal build
build-linux-s390x:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- uses: jirutka/setup-alpine@v1
with:
@@ -129,7 +133,7 @@
shell: alpine.sh {0}
build-linux-armv7:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- uses: jirutka/setup-alpine@v1
with:
@@ -149,7 +153,7 @@
shell: alpine.sh {0}
build-linux-riscv64:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- uses: jirutka/setup-alpine@v1
with:
@@ -169,7 +173,7 @@
shell: alpine.sh {0}
build-linux-ppc64le:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- uses: jirutka/setup-alpine@v1
with:
@@ -187,6 +191,26 @@
- name: make everytestmhs
run: make CONF=unix-64 everytestmhs
shell: alpine.sh {0}
+
+# build-linux-ppc64be:
+# runs-on: ubuntu-22.04
+# steps:
+# - uses: jirutka/setup-alpine@v1
+# with:
+# arch: ppc64be
+# branch: v3.15
+# packages: >
+# build-base
+# gcc
+# make
+# - name: checkout repo
+# uses: actions/checkout@v4
+# - name: make
+# run: make CONF=unix-64
+# shell: alpine.sh {0}
+# - name: make everytestmhs
+# run: make CONF=unix-64 everytestmhs
+# shell: alpine.sh {0}
build-linux-emscripten:
runs-on: ubuntu-latest
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,6 @@
*.pkg
targets.conf
*.bak
+timing
+mdist/*
+dist-mcabal/
--- a/Makefile
+++ b/Makefile
@@ -12,9 +12,8 @@
GHCINCS= -ighc -isrc -ipaths
GHCWARNS= -Wall -Wno-unrecognised-warning-flags -Wno-x-partial -Wno-deprecations
GHCOPTS= -O
-GHCEXTS= -DNOTCABAL -XScopedTypeVariables -XPatternGuards -XTupleSections -XTypeSynonymInstances -XFlexibleInstances -XOverloadedRecordDot -XDisambiguateRecordFields -XOverloadedStrings
-# -XOverloadedRecordUpdate
-GHCPKGS= -package mtl -package pretty -package haskeline -package process -package time -package ghc-prim -package containers -package deepseq -package directory
+GHCEXTS= -DNOTCABAL -XScopedTypeVariables -XTypeSynonymInstances -XMultiParamTypeClasses -XFlexibleInstances -XBangPatterns
+GHCPKGS= -package mtl -package pretty -package haskeline -package process -package time -package ghc-prim -package containers -package deepseq -package directory -package text
GHCTOOL= # -F -pgmF Tools/convertX.sh
GHCOUTDIR= ghc-out
GHCOUT= -outputdir $(GHCOUTDIR)
@@ -140,12 +139,12 @@
#
clean:
- rm -rf src/*/*.hi src/*/*.o *.comb *.tmp *~ bin/* a.out $(GHCOUTDIR) tmp/* Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* .mhscache targets.conf .mhscache dist-mcabal cpphssrc Interactive.hs
+ rm -rf src/*/*.hi src/*/*.o *.comb *.tmp *~ bin/* a.out $(GHCOUTDIR) Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* .mhscache targets.conf .mhscache dist-mcabal cpphssrc Interactive.hs .mhsi
make clean -f Makefile.emscripten
cd tests; make clean
-cabal clean
-install:
+oldinstall:
mkdir -p $(PREFIX)/bin
cp bin/mhs $(PREFIX)/bin
-cp bin/cpphs $(PREFIX)/bin
@@ -190,8 +189,8 @@
######
-VERSION=0.9.16.0
-HVERSION=0,9,16,0
+VERSION=0.10.3.0
+HVERSION=0,10,3,0
MCABAL=$(HOME)/.mcabal
MCABALMHS=$(MCABAL)/mhs-$(VERSION)
MDATA=$(MCABALMHS)/data/mhs-$(VERSION)/data
@@ -199,12 +198,12 @@
MCABALBIN=$(MCABAL)/bin
MDIST=dist-mcabal
BASE=base-$(VERSION)
-BASEMODULES=Control.Applicative Control.Arrow Control.DeepSeq Control.Error Control.Exception Control.Monad Control.Monad.Fail Control.Monad.ST Data.Array Data.Bits Data.Bool Data.Bounded Data.Char Data.Complex Data.Constraint Data.Data Data.Double Data.Dynamic Data.Either Data.Enum Data.Eq Data.Float Data.FloatW Data.Floating Data.Foldable Data.Fractional Data.Function Data.Functor Data.Functor.Const Data.Functor.Identity Data.IOArray Data.IORef Data.Int Data.Integer Data.Integral Data.Ix Data.List Data.List.NonEmpty Data.Maybe Data.Monoid Data.Num Data.Ord Data.Proxy Data.Ratio Data.Real Data.RealFloat Data.RealFrac Data.Records Data.STRef Data.Semigroup Data.String Data.Time.Clock Data.Time.Format Data.Traversable Data.Tuple Data.Type.Equality Data.TypeLits Data.Typeable Data.Version Data.Void Data.Word Data.ZipList Debug.Trace Foreign.C.String Foreign.C.Types Foreign.ForeignPtr Foreign.Marshal.Alloc Foreign.Marshal.Array Foreign.Marshal.Utils Foreign.Ptr Foreign.Storable GHC.Stack GHC.Types Numeric Numeric.FormatFloat Numeric.Natural Prelude System.Cmd System.Compress System.Directory System.Environment System.Exit System.IO System.IO.MD5 System.IO.PrintOrRun System.IO.Serialize System.IO.TimeMilli System.IO.Unsafe System.Info System.Process Text.Printf Text.Read Text.Read.Lex Text.Read.Numeric Text.Show TimeCompat Unsafe.Coerce
+BASEMODULES=Control.Applicative Control.Arrow Control.Category Control.DeepSeq Control.Error Control.Exception Control.Monad Control.Monad.Fail Control.Monad.Fix Control.Monad.IO.Class Control.Monad.ST Control.Monad.Zip Data.Array Data.Bifoldable Data.Bifunctor Data.Bitraversable Data.Bits Data.Bool Data.Bounded Data.ByteString Data.Char Data.Complex Data.Constraint Data.Data Data.Double Data.Dynamic Data.Either Data.Enum Data.Eq Data.Fixed Data.Float Data.FloatW Data.Floating Data.Foldable Data.Foldable1 Data.Fractional Data.Function Data.Functor Data.Functor.Classes Data.Functor.Compose Data.Functor.Const Data.Functor.Contravariant Data.Functor.Identity Data.Functor.Product Data.Functor.Sum Data.Hashable Data.IOArray Data.IORef Data.Int Data.Integer Data.Integral Data.Ix Data.Kind Data.List Data.List.NonEmpty Data.Maybe Data.Monoid Data.Num Data.Ord Data.Proxy Data.Ratio Data.Real Data.RealFloat Data.RealFrac Data.Records Data.STRef Data.Semigroup Data.String Data.Text Data.Traversable Data.Tuple Data.Tuple.Instances Data.Type.Equality Data.TypeLits Data.Typeable Data.Version Data.Void Data.Word Data.ZipList Debug.Trace Foreign Foreign.C Foreign.C.Error Foreign.C.String Foreign.C.Types Foreign.ForeignPtr Foreign.Marshal Foreign.Marshal.Alloc Foreign.Marshal.Array Foreign.Marshal.Error Foreign.Marshal.Utils Foreign.Ptr Foreign.Storable GHC.Stack GHC.Types Numeric Numeric.FormatFloat Numeric.Natural Prelude System.Cmd System.Console.GetOpt System.Compress System.Directory System.Environment System.Exit System.IO System.IO.Error System.IO.MD5 System.IO.PrintOrRun System.IO.Serialize System.IO.TimeMilli System.IO.Unsafe System.Info System.Process Text.Printf Text.ParserCombinators.ReadP Text.ParserCombinators.ReadPrec Text.Read Text.Read.Lex Text.Show Unsafe.Coerce
$(MCABALBIN)/mhs: bin/mhs
@mkdir -p $(MCABALBIN)
@mkdir -p $(MDIST)
- @echo 'module Paths_MicroHs where {import Data.Version; version :: Version; version = makeVersion [$(HVERSION)]; getDataDir :: IO FilePath; getDataDir = return "$(MDATA)" }' > $(MDIST)/Paths_MicroHs.hs
+ @echo 'module Paths_MicroHs where { import Prelude(); import MHSPrelude; import Data.Version; version :: Version; version = makeVersion [$(HVERSION)]; getDataDir :: IO FilePath; getDataDir = return "$(MDATA)" }' > $(MDIST)/Paths_MicroHs.hs
bin/mhs -z $(MHSINCNP) -i$(MDIST) MicroHs.Main -o$(MCABALBIN)/mhs
$(MCABALBIN)/cpphs: bin/cpphs
@@ -211,7 +210,7 @@
@mkdir -p $(MCABALBIN)
cp bin/cpphs $(MCABALBIN)
-$(MCABALMHS)/packages/$(BASE).pkg: bin/mhs lib/*.hs
+$(MCABALMHS)/packages/$(BASE).pkg: bin/mhs lib/*.hs lib/*/*.hs lib/*/*/*.hs
@mkdir -p $(MRUNTIME)
cp src/runtime/*.[ch] $(MRUNTIME)
bin/mhs -P$(BASE) -o$(BASE).pkg -ilib $(BASEMODULES)
@@ -218,7 +217,7 @@
bin/mhs -Q $(BASE).pkg $(MCABALMHS)
@rm $(BASE).pkg
-installmcabal: $(MCABALBIN)/mhs $(MCABALBIN)/cpphs $(MCABALMHS)/packages/$(BASE).pkg
+install: $(MCABALBIN)/mhs $(MCABALBIN)/cpphs $(MCABALMHS)/packages/$(BASE).pkg
@echo $$PATH | tr ':' '\012' | grep -q $(MCABALBIN) || echo '***' Add $(MCABALBIN) to the PATH
# mkdir ~/.mcabal/packages/array-0.5.6.0
--- a/MicroHs.cabal
+++ b/MicroHs.cabal
@@ -1,10 +1,10 @@
cabal-version: 3.0
name: MicroHs
-version: 0.9.16.0
+version: 0.10.3.0
-- *** When changing the version number, also
- -- *** run updateversion.sh.
+ -- *** run 'sh updateversion.sh'
-- *** Yeah, it stinks.
-synopsis: A compiler for Haskell
+synopsis: A small compiler for Haskell
license: Apache-2.0
license-file: LICENSE
copyright: 2023,2024 Lennart Augustsson
@@ -39,11 +39,16 @@
tests/*.ref
data-files:
- lib/**/*.hs
- lib/**/*.hs-boot
src/runtime/*.c
src/runtime/*.h
+-- Cabal doesn't seem to understand this, so it never copies
+-- these files.
+--if impl(ghc)
+-- data-files:
+ lib/**/*.hs
+ lib/**/*.hs-boot
+
source-repository head
type: git
location: https://github.com/augustss/MicroHs
@@ -93,6 +98,7 @@
Data.Integer
Compat
PrimTable
+ MHSPrelude
System.IO.MD5
System.IO.Serialize
System.IO.TimeMilli
@@ -108,6 +114,11 @@
time >= 1.1 && < 1.15,
process >= 1.6 && < 1.8,
directory >= 1.2 && < 1.5,
--- if impl(mhs)
--- hs-source-dirs: mhs src
--- build-depends: base
+ text >= 2.0 && < 2.3,
+
+-- Hackage does not accept 'mhs' as a valid Haskell compiler,
+-- so mcabal has a hack to recognize lines that start with
+-- '--MHS' as non-comments.
+--MHS if impl(mhs)
+--MHS hs-source-dirs: mhs src paths
+--MHS build-depends: base >= 0.1 && < 10.0,
--- a/README.md
+++ b/README.md
@@ -7,6 +7,10 @@
The compiler can compile itself.
+## Presentation
+You can find my [presentation from the Haskell Symposium 2024](https://docs.google.com/presentation/d/1WsSiSwypNVTm0oZ3spRYF8gA59wyteOsIkPRjCUAZec/edit?usp=sharing), [video](https://m.youtube.com/watch?v=uMurx1a6Zck&t=36m).
+There is also a short paper in `doc/hs2024.pdf`.
+
## Compiling MicroHs
There are two different ways to compile MicroHs:
* Using GHC. `Makefile` target `bin/gmhs`
@@ -23,12 +27,12 @@
Also note that there is no need to have a Haskell compiler to run MicroHs.
All you need is a C compiler, and MicroHs can bootstrap, given the included combinator file.
-To install `mhs` use `make installmcabal`. This will install `mhs` in `~/.mcabal` in the same
+To install `mhs` use `make install`. This will install `mhs` in `~/.mcabal` in the same
way as `mcabal` (MicroCabal) would have. It will install a compiler binary and a compiled base package.
You will have to add `~/.mcabal/bin` to your `PATH`.
-Alternatively, to install `mhs` use `make install`. By default this copies the files to `/usr/local`,
-but this can be overridden by `make PREFIX=dir install`.
+Alternatively, to install `mhs` use `make oldinstall`. By default this copies the files to `/usr/local`,
+but this can be overridden by `make PREFIX=dir oldinstall`.
You also need to set the environment variable `MHSDIR`.
To compile on Windows make sure `cl` is in the path, and then use `nmake` with `Makefile.windows`.
@@ -59,7 +63,9 @@
* ImportQualifiedPost
* IncoherentInstances
* KindSignatures
+ * LambdaCase
* MonoLocalBinds
+ * MultiWayIf
* MultiParamTypeClasses
* NamedFieldPuns
* NegativeLiterals
@@ -85,7 +91,6 @@
* Many things that should be an error (but which are mostly harmless) are not reported.
* Text file I/O uses UTF8, but the source code does not allow Unicode.
* The `BangPatterns` extension is parsed, but only effective at the a top level `let`/`where`.
- * Lazy patterns (`~pat`) are ignored.
* More differences that I don't remember right now.
Mutually recursive modules are allowed the same way as with GHC, using `.hs-boot` files.
--- a/TODO
+++ b/TODO
@@ -32,9 +32,18 @@
* Better naming of internal identifiers
* Add mask&co to exceptions
* Make deriving refer to identifiers that don't need to be in scope
+* Add reductions for underapplied K2,K3,K4
+* Move some Typeable instances from the class file to ST&co (makes it leaner)
+* Make a Unicode version of Data.Char
Bugs:
-* Missing IO in ccall show wrong location
+* Missing IO in ccall shows wrong location
* Check for escaping skolemized variables
* Type checking Data.Data
-* Class export with list does nt export $dflt
+* Install a targets.conf?
+* let...in... doesn't parse correctly in a do
+* let needs {} in a do with {}
+* missing import in Text.Read.Internal gmhs: expandDict: Data.Floating.Floating
+* export list in -boot doesn't work
+* Cannot derive Show for 'newtype Alt f a = Alt (f a)'
+* Fundep bug mtl:Control/Monad/RWS/Class.hs
--- /dev/null
+++ b/bw.c
@@ -1,0 +1,194 @@
+#include <inttypes.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+typedef uint32_t index_t;
+
+/*
+ * |.......................................|
+ * ^ ^
+ * a b
+ * <- n ->
+ * <- m ->
+ * <- o ->
+ */
+static uint8_t *compar_arg;
+static size_t compar_len;
+int compar(const void *pa, const void *pb)
+{
+ index_t a = *(index_t*)pa;
+ index_t b = *(index_t*)pb;
+ int r;
+ if (a == b)
+ return 0;
+ if (a < b) {
+ size_t n = compar_len - b; /* bytes until end of buffer */
+ r = memcmp(compar_arg + a, compar_arg + b, n);
+ if (r)
+ return r;
+ size_t m = b - a;
+ r = memcmp(compar_arg + a + n, compar_arg, m);
+ if (r)
+ return r;
+ size_t o = a;
+ return memcmp(compar_arg, compar_arg + m, o);
+ } else {
+ size_t n = compar_len - a; /* bytes until end of buffer */
+ r = memcmp(compar_arg + a, compar_arg + b, n);
+ if (r)
+ return r;
+ size_t m = a - b;
+ r = memcmp(compar_arg, compar_arg + b + n, m);
+ if (r)
+ return r;
+ size_t o = a;
+ return memcmp(compar_arg + m, compar_arg, o);
+
+ }
+ return 0;
+}
+
+/* Sort all rotations of buf, and the indices of the sorted strings in res. */
+void
+sort_buffer(uint8_t *buf, size_t buflen, index_t *res)
+{
+ for(size_t i = 0; i < buflen; i++)
+ res[i] = i;
+ compar_arg = buf;
+ compar_len = buflen;
+ qsort(res, buflen, sizeof(index_t), compar);
+}
+
+void
+put_rep(FILE *out, size_t n)
+{
+ if (n > 127)
+ put_rep(out, n / 128);
+ fputc(n % 128 + 128, out);
+}
+
+#define MINRLE 3
+
+void
+rle(FILE *out, uint8_t *data, size_t len)
+{
+ for(size_t i = 0; i < len; ) {
+ uint8_t c = data[i++];
+ size_t n;
+ for(n = 1; i < len && data[i] == c; i++, n++)
+ ;
+ if (n >= MINRLE) {
+ put_rep(out, n - 1);
+ fputc(c, out);
+ } else {
+ while(n-- > 0)
+ fputc(c, out);
+ }
+ }
+}
+
+size_t
+get_rep(FILE *in)
+{
+ size_t n = 0;
+ for(;;) {
+ int c = fgetc(in);
+ //fprintf(stderr,"get_rep %02x\n", c);
+ if (c < 0) abort();
+ if (c < 128) {
+ ungetc(c, in);
+ return n;
+ }
+ n = n * 128 + c - 128;
+ }
+}
+
+void
+unrle(FILE *in, uint8_t *data, size_t len)
+{
+ for(size_t i = 0; i < len; ) {
+ size_t n = get_rep(in);
+ int c = fgetc(stdin);
+ //fprintf(stderr,"unrle %02x\n", c);
+ if (c < 0) abort();
+ //fprintf(stderr, "n=%d c='%c'\n", (int)n, c);
+ n += 1;
+ for(size_t j = 0; j < n; j++) {
+ data[i++] = c;
+ }
+ //fprintf(stderr, "i=%d\n", (int)i);
+ }
+}
+
+#define MAXSIZE 10000000
+
+int
+main(int argc, char **argv)
+{
+ int encode = argc == 1;
+
+ if (encode) {
+ fprintf(stderr, "encode\n");
+ uint8_t *data = malloc(MAXSIZE);
+ size_t len = fread(data, 1, MAXSIZE, stdin);
+ index_t *res = malloc(len * sizeof(index_t));
+
+ sort_buffer((uint8_t*)data, len, res);
+#if 0
+ for(size_t i = 0; i < len; i++) {
+ index_t offs = res[i];
+ //fprintf(stderr, "offs=%d\n", (int)offs);
+ fwrite(data + offs, 1, len - offs, stdout);
+ fwrite(data,1, offs, stdout);
+ fputs("\n", stdout);
+ }
+#endif
+ uint8_t *last = malloc(len + 1);
+ index_t zero;
+ for(size_t i = 0; i < len; i++) {
+ index_t offs = res[i];
+ last[i] = data[(offs + len - 1) % len];
+ if (offs == 0)
+ zero = i;
+ }
+ last[len] = 0;
+ fprintf(stderr, "len=%d, zero=%d\n", (int)len, (int)zero);
+ // fprintf(stderr, "%s\n", last);
+ put_rep(stdout, len); fputc(0, stdout);
+ put_rep(stdout, zero); fputc(0, stdout);
+ rle(stdout, last, len);
+ // fwrite(last, 1, len, stdout);
+ } else {
+ fprintf(stderr, "decode\n");
+ size_t len = get_rep(stdin); if (fgetc(stdin) != 0) abort();
+ size_t zero = get_rep(stdin); if (fgetc(stdin) != 0) abort();
+ fprintf(stderr, "len=%d, zero=%d\n", (int)len, (int)zero);
+ uint8_t *data = malloc(len);
+ unrle(stdin, data, len);
+ // fwrite(data, 1, len, stdout);
+#define MAXCHAR 128
+ size_t count[MAXCHAR];
+ index_t *pred = malloc(len * sizeof(index_t));
+ uint8_t *odata = malloc(len);
+ for(size_t i = 0; i < MAXCHAR; i++) {
+ count[i] = 0;
+ }
+ for(size_t i = 0; i < len; i++) {
+ pred[i] = count[data[i]]++;
+ }
+ size_t sum = 0;
+ for(size_t i = 0; i < MAXCHAR; i++) {
+ size_t s = count[i];
+ count[i] = sum;
+ sum += s;
+ }
+ size_t i = zero;
+ for(size_t j = len; j > 0; j--) {
+ odata[j - 1] = data[i];
+ i = pred[i] + count[data[i]];
+ }
+ fwrite(odata, 1, len, stdout);
+ }
+ exit(0);
+}
binary files /dev/null b/doc/hs2024.pdf differ
--- a/generated/cpphs.c
+++ b/generated/cpphs.c
@@ -1,1390 +1,1522 @@
static unsigned char data[] = {
-122,2,118,55,46,2,48,10,54,2,53,57,10,2,65,32,95,2,48,32,
-95,2,50,52,32,2,64,95,50,2,54,32,95,2,51,52,32,2,64,95,
-51,2,54,32,64,2,64,95,48,224,22,3,2,56,32,64,224,22,10,2,
-52,48,32,192,22,2,49,49,32,160,23,2,49,56,32,2,64,67,39,2,
-32,95,49,160,17,2,64,66,32,2,95,52,51,32,15,2,50,32,95,96,
-15,2,64,83,32,2,83,32,95,2,50,50,52,64,4,32,60,2,95,49,
-54,2,56,32,95,2,49,55,48,2,32,64,102,2,114,111,109,2,85,84,
-70,2,56,32,34,2,45,45,99,2,112,112,34,64,45,2,64,73,32,32,
-95,2,50,52,51,64,12,32,75,224,105,1,2,52,53,32,32,76,2,39,
-32,83,32,109,160,150,2,64,64,67,2,39,66,32,32,37,2,50,52,55,
-64,94,96,58,224,105,23,2,118,101,114,2,115,105,111,2,110,34,32,64,
-109,96,187,192,77,64,72,2,53,51,32,2,64,67,32,2,95,49,53,64,
-236,64,5,224,69,2,2,79,32,35,2,51,50,32,2,64,75,32,32,55,
-32,41,96,128,65,26,64,63,2,54,49,32,64,13,224,159,58,2,104,101,
-108,161,10,224,156,12,65,19,224,150,5,224,60,1,2,85,115,97,2,103,
-101,58,2,32,34,32,96,60,224,197,14,224,46,1,2,32,91,102,2,105,
-108,101,2,32,46,46,2,46,93,32,2,91,32,45,2,68,115,121,2,109,
-32,124,128,7,2,61,118,97,2,108,32,124,2,32,45,73,2,112,97,116,
-2,104,32,93,2,42,32,32,2,91,45,79,64,45,2,93,92,49,2,48,
-38,34,97,1,224,87,16,2,92,57,38,32,2,2,91,45,45,2,110,111,
-109,2,97,99,114,2,111,93,32,96,11,2,108,105,110,2,101,93,32,32,
-10,64,8,2,112,114,97,2,103,109,97,96,14,224,10,2,2,116,101,120,
-2,116,93,92,224,97,34,2,115,116,114,2,105,112,93,64,58,96,9,2,
-45,101,111,2,108,93,32,32,13,2,104,97,115,2,104,101,115,128,109,2,
-97,121,111,2,117,116,93,64,10,2,117,110,108,2,105,116,93,224,95,0,
-224,79,8,2,32,45,45,34,135,2,32,115,116,2,100,45,99,2,112,112,
-45,2,111,112,116,34,40,2,115,32,93,64,59,2,105,110,99,2,108,117,
-100,2,101,61,102,33,4,2,110,97,109,2,101,93,34,129,163,226,2,8,
-2,66,32,67,2,32,67,39,34,244,65,190,128,8,160,9,160,12,96,13,
-224,29,0,2,39,32,64,32,50,32,52,224,8,7,32,6,98,59,226,75,
-0,2,66,32,83,34,15,226,74,3,2,54,50,32,192,91,224,38,3,163,
-130,98,46,160,15,226,50,17,2,110,107,110,2,111,119,110,2,32,111,112,
-64,235,162,58,64,195,67,211,98,62,2,50,54,51,130,126,224,67,16,2,
-44,32,102,2,111,114,32,34,49,2,105,100,32,193,51,2,116,114,121,226,
-135,6,226,119,2,130,228,225,135,0,225,67,3,2,52,32,35,129,70,224,
-135,0,97,10,225,7,2,64,153,225,4,1,128,167,32,13,2,55,55,32,
-32,69,2,57,50,32,2,64,35,49,228,185,3,225,9,0,224,127,1,2,
-65,116,32,2,109,111,115,2,116,32,111,2,110,101,32,34,26,2,112,117,
-116,2,32,102,105,35,8,2,40,45,79,2,41,32,99,2,97,110,32,2,
-98,101,32,2,115,112,101,2,99,105,102,2,105,101,100,130,137,224,157,1,
-64,116,128,0,131,235,33,201,97,98,68,228,2,54,53,32,161,222,32,181,
-129,120,2,50,52,56,193,152,2,95,54,50,2,57,32,64,32,75,2,48,
-57,32,2,95,49,56,96,43,162,11,128,26,32,20,132,83,32,15,2,51,
-48,32,96,6,96,203,2,54,51,50,128,6,97,208,2,95,54,53,64,235,
-160,0,2,58,54,53,37,130,37,217,2,89,32,66,32,74,32,119,226,129,
-0,98,65,64,5,226,100,0,32,144,2,51,53,56,101,149,130,145,133,82,
-224,9,8,160,65,66,138,32,50,2,53,56,53,66,7,2,56,48,32,64,
-189,96,6,32,22,64,111,2,80,32,75,160,45,64,119,161,16,64,251,128,
-65,2,32,61,61,65,142,195,23,2,66,32,85,160,25,37,214,70,71,193,
-250,224,82,41,129,133,224,82,68,97,91,224,82,25,2,95,54,52,97,64,
-192,72,160,2,224,60,0,98,11,129,124,128,20,224,39,4,64,116,224,39,
-4,128,16,224,17,0,66,71,224,16,6,225,135,0,32,25,39,86,2,53,
-32,95,2,49,52,56,32,176,103,15,195,38,224,44,0,192,63,224,64,7,
-32,103,64,208,224,62,1,2,55,57,32,192,62,195,99,128,104,226,192,4,
-164,132,66,19,2,80,32,64,131,204,225,20,2,224,101,2,128,103,224,101,
-7,224,164,2,224,43,0,64,91,35,45,2,54,53,54,72,79,2,53,57,
-32,224,133,13,224,82,1,164,143,64,128,224,127,7,224,52,1,97,72,224,
-51,3,160,26,96,53,104,160,32,54,130,13,36,196,200,75,64,222,227,42,
-1,225,96,6,131,101,193,84,225,72,15,160,38,98,92,96,101,192,17,128,
-130,224,175,5,96,40,192,129,160,135,160,6,35,200,32,55,35,200,2,83,
-32,67,192,153,33,37,2,52,57,32,73,67,96,131,64,162,224,173,16,132,
-123,230,119,0,224,167,8,37,184,198,68,201,163,132,131,100,22,2,54,53,
-48,97,40,64,12,33,50,2,85,32,75,192,78,132,214,41,233,101,96,233,
-13,4,64,155,96,39,32,0,2,85,32,65,164,156,2,49,32,67,224,120,
-3,32,121,229,209,1,224,193,30,2,66,32,90,128,198,224,196,7,128,177,
-224,189,1,32,110,229,144,0,195,213,226,129,11,2,83,32,80,225,23,15,
-2,55,51,32,138,106,225,18,1,160,12,2,54,53,51,64,242,2,53,56,
-55,160,43,230,253,12,2,47,92,57,2,50,38,34,225,226,4,65,174,2,
-95,50,51,192,98,233,232,14,200,81,128,59,165,252,224,135,7,2,54,53,
-52,65,124,37,249,2,35,49,48,192,100,75,35,32,97,2,52,53,54,170,
-74,65,7,162,67,32,13,34,67,2,79,32,80,231,171,13,233,148,0,134,
-215,2,54,51,55,32,7,224,45,20,73,173,192,44,65,206,224,44,18,233,
-216,1,192,48,66,188,224,48,18,224,44,4,76,95,224,44,19,74,28,192,
-42,65,152,224,42,18,106,12,192,43,66,32,224,43,23,74,56,192,47,66,
-173,224,47,18,138,90,192,44,65,179,225,17,19,106,124,192,44,65,162,224,
-44,18,106,158,192,43,65,213,225,151,20,2,119,97,114,140,196,32,44,65,
-196,195,136,200,21,32,108,34,8,67,205,134,219,38,213,32,21,32,175,224,
-21,0,65,24,128,21,32,31,32,21,64,19,32,31,34,93,32,18,32,28,
-96,40,38,247,33,16,2,95,54,32,34,105,64,102,32,26,32,15,224,67,
-0,65,44,128,67,32,160,96,67,41,142,109,36,2,95,49,51,65,208,2,
-58,54,52,34,4,100,214,224,1,8,37,150,2,54,51,52,104,99,96,92,
-141,28,2,54,51,54,64,112,98,153,224,26,14,135,129,224,27,13,134,79,
-224,19,4,98,89,224,18,6,100,147,107,80,2,50,48,32,224,27,10,224,
-17,5,200,111,224,112,10,142,170,224,19,6,137,240,224,18,4,132,185,224,
-18,4,102,24,224,84,13,96,252,33,59,137,219,65,105,32,165,97,153,64,
-26,128,18,32,233,128,17,131,243,32,17,32,45,128,17,129,252,32,17,32,
-44,128,17,129,248,32,17,193,225,64,183,128,17,32,44,128,17,129,243,32,
-17,32,80,128,17,129,234,32,17,32,44,128,17,193,230,75,8,96,17,65,
-112,160,162,192,17,224,180,0,192,179,65,203,80,124,38,73,103,39,199,122,
-169,40,2,67,32,60,69,136,161,145,224,25,9,138,65,224,26,13,97,125,
-139,135,231,202,0,160,26,173,14,34,158,2,85,32,67,37,248,233,235,1,
-64,25,130,167,32,26,162,168,129,224,32,44,96,161,136,166,234,29,5,160,
-49,128,37,134,66,133,125,230,127,1,224,132,9,224,49,1,224,87,12,107,
-216,224,87,20,224,59,17,98,166,224,59,9,2,54,51,53,67,134,144,99,
-224,160,3,225,67,15,99,49,224,189,13,171,69,225,66,10,108,12,225,66,
-15,224,44,6,108,246,224,43,10,224,116,13,168,167,224,70,9,64,24,224,
-114,31,136,172,224,114,10,225,3,14,194,70,224,25,9,136,63,224,168,11,
-163,190,224,124,9,147,35,224,168,29,138,1,225,27,31,226,210,16,226,209,
-20,224,43,6,226,203,2,225,27,6,192,115,227,98,5,225,0,16,226,121,
-1,224,97,6,226,213,2,224,141,24,226,197,2,224,141,5,224,44,11,226,
-117,15,105,64,2,55,54,32,133,63,68,113,133,19,102,98,33,98,239,26,
-2,106,226,234,45,1,204,145,239,32,0,2,49,53,51,212,123,35,77,203,
-9,224,16,3,106,232,160,17,32,115,70,116,137,124,64,6,103,25,224,1,
-9,108,146,237,52,10,224,29,8,224,26,17,224,23,14,224,20,11,224,17,
-8,224,14,5,224,11,2,237,221,4,200,59,71,147,101,192,71,197,2,57,
-51,32,243,40,2,2,51,52,38,51,26,2,104,115,115,2,114,99,47,2,
-109,97,108,2,99,111,108,2,109,45,119,2,97,108,108,2,97,99,101,40,
-191,2,105,118,101,2,114,115,101,2,47,99,112,32,33,2,45,49,46,2,
-50,48,46,2,57,47,99,64,12,2,46,104,115,64,58,2,44,56,48,2,
-58,49,34,213,231,32,104,134,131,65,99,2,90,32,90,32,1,161,107,32,
-25,198,139,139,23,2,90,32,95,139,18,32,25,134,147,2,85,32,90,224,
-51,8,134,155,241,127,3,65,255,246,154,0,193,185,130,2,179,55,224,29,
-0,173,174,2,54,50,49,225,244,1,66,119,98,238,243,96,2,32,33,32,
-155,32,5,39,173,168,136,77,167,105,28,32,0,2,80,32,80,233,179,13,
-52,85,2,105,110,34,178,8,64,55,108,147,47,0,99,69,2,58,54,50,
-135,71,32,16,32,145,65,129,32,18,135,72,182,68,71,176,96,105,108,247,
-133,215,131,142,32,46,64,125,130,190,215,48,2,51,52,56,225,184,2,32,
-5,2,45,56,47,2,47,82,79,2,85,78,68,2,84,82,73,2,80,34,
-32,205,143,244,62,6,87,234,96,209,2,50,53,49,136,216,2,51,51,55,
-97,120,64,225,32,141,65,170,65,29,32,16,131,99,242,239,4,225,78,1,
+122,76,90,49,82,118,0,0,25,118,55,46,48,10,55,56,54,10,65,32,
+95,48,32,95,50,52,32,64,95,50,54,32,95,51,55,32,8,4,51,57,
+32,64,64,224,22,4,1,52,50,224,22,13,64,8,128,22,1,49,49,192,
+23,6,50,49,32,64,67,39,32,224,17,0,1,64,66,32,7,0,55,32,
+15,0,50,160,15,3,64,83,32,83,32,10,64,19,1,50,50,32,60,2,
+95,49,55,32,42,20,49,55,51,32,64,102,114,111,109,85,84,70,56,32,
+34,45,45,99,112,112,34,64,45,1,64,73,64,95,2,50,52,54,64,12,
+32,75,224,105,1,1,52,56,32,18,2,83,39,32,32,2,192,150,0,64,
+32,122,1,66,32,64,113,0,53,64,17,32,182,64,145,224,105,22,6,118,
+101,114,115,105,111,110,128,109,96,187,192,77,64,72,1,54,53,32,207,32,
+53,0,53,32,53,96,5,224,69,2,3,79,32,35,51,32,99,0,75,64,
+57,32,41,96,162,32,8,0,55,64,234,64,31,64,236,224,159,57,2,104,
+101,108,161,10,224,156,12,65,19,224,150,5,224,60,1,6,85,115,97,103,
+101,58,32,128,61,224,197,15,224,46,1,20,32,91,102,105,108,101,32,46,
+46,46,93,32,91,32,45,68,115,121,109,32,124,128,7,3,61,118,97,108,
+64,11,12,73,112,97,116,104,32,93,42,32,32,91,45,79,64,45,4,93,
+92,49,48,38,96,96,224,87,17,2,92,57,38,32,2,9,91,45,45,110,
+111,109,97,99,114,111,32,93,64,11,3,108,105,110,101,96,10,64,8,5,
+112,114,97,103,109,97,96,14,224,10,2,3,116,101,120,116,224,97,36,4,
+115,116,114,105,112,96,58,96,9,3,45,101,111,108,96,13,5,104,97,115,
+104,101,115,128,109,4,97,121,111,117,116,96,10,3,117,110,108,105,224,95,
+2,224,79,8,0,32,98,135,3,32,115,116,100,64,7,3,45,111,112,116,
+34,40,1,115,32,96,59,7,105,110,99,108,117,100,101,61,65,4,4,110,
+97,109,101,93,161,163,226,2,8,3,66,32,67,32,33,184,0,83,99,23,
+128,8,160,9,160,12,96,13,224,29,0,0,39,97,219,32,52,224,8,7,
+32,6,98,59,226,75,0,0,66,98,90,226,74,3,0,55,64,23,128,71,
+224,38,3,163,130,98,46,160,15,226,50,17,6,110,107,110,111,119,110,32,
+128,235,162,58,64,195,67,211,98,62,1,50,55,64,70,224,67,19,5,44,
+32,102,111,114,32,34,49,1,105,100,160,71,4,115,32,116,114,121,226,135,
+6,226,119,2,130,228,225,135,0,225,67,3,2,54,32,35,36,81,192,0,
+64,135,97,10,225,7,2,64,153,225,4,1,96,167,0,54,32,13,1,56,
+48,65,18,0,57,32,171,96,64,228,185,1,193,9,224,127,1,11,65,116,
+32,109,111,115,116,32,111,110,101,32,34,26,3,112,117,116,32,99,8,20,
+40,45,79,41,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,
+100,130,137,224,157,1,64,116,128,0,131,235,33,201,97,98,68,228,0,55,
+37,79,161,144,0,66,161,189,1,50,53,197,24,3,64,95,55,53,68,50,
+1,95,50,69,27,1,49,56,68,206,194,11,128,26,32,20,96,64,96,42,
+64,9,32,6,64,37,32,6,101,117,0,55,32,231,96,28,0,56,96,79,
+128,0,2,58,55,56,32,220,37,217,0,89,66,59,32,3,226,129,1,98,
+65,64,5,226,100,0,32,144,0,51,33,58,128,188,128,122,224,9,12,160,
+65,66,138,32,50,0,55,32,176,32,182,0,57,130,116,96,6,32,22,64,
+111,1,80,32,69,12,192,119,161,16,64,251,128,65,2,32,61,61,65,142,
+129,208,64,125,0,85,160,25,37,214,64,209,193,250,224,82,41,129,133,224,
+82,68,195,189,224,82,22,1,95,55,99,15,225,255,0,160,2,224,60,0,
+98,11,129,124,128,20,224,39,4,64,116,224,39,4,128,16,224,17,0,66,
+71,224,16,6,225,135,0,32,25,39,86,0,56,67,78,33,81,1,35,52,
+160,134,224,44,5,192,63,224,64,7,32,103,64,208,224,62,1,0,55,224,
+218,1,195,99,128,104,226,192,4,164,132,66,19,0,80,96,26,225,20,5,
+224,101,2,128,103,224,101,7,224,164,2,224,43,0,64,91,35,45,1,55,
+56,68,93,1,51,52,192,77,224,133,7,224,82,1,164,143,64,128,224,127,
+7,224,52,1,97,72,224,51,3,160,26,96,53,104,160,32,54,130,13,36,
+48,200,75,64,222,227,42,1,225,96,6,131,140,193,84,225,72,15,160,38,
+98,92,96,101,192,17,128,130,224,175,5,96,40,192,129,160,135,160,6,35,
+200,35,214,35,200,0,83,166,40,98,130,0,55,36,115,73,67,96,131,64,
+162,224,173,16,97,105,96,38,224,167,13,96,100,132,16,201,163,132,131,100,
+22,0,55,100,187,136,174,33,50,0,85,99,50,96,78,132,214,37,109,101,
+96,233,13,4,65,187,96,39,32,0,2,85,32,65,163,30,0,56,99,58,
+224,120,0,32,121,229,209,1,224,193,30,2,66,32,90,128,198,224,196,7,
+68,235,101,142,160,189,32,110,225,93,0,195,213,226,129,11,0,83,64,212,
+227,8,14,99,248,225,18,4,160,12,0,55,134,83,2,55,49,52,160,43,
+230,253,12,3,47,92,57,50,230,199,1,128,137,65,1,1,50,51,192,98,
+233,232,14,200,81,128,59,165,252,224,135,7,1,55,56,64,64,1,50,51,
+71,23,101,184,203,35,32,97,1,54,49,202,74,70,19,68,157,34,67,32,
+100,34,67,0,79,98,100,224,118,12,169,148,134,215,1,55,54,70,74,224,
+45,20,73,173,192,44,65,75,224,44,18,233,216,1,192,48,66,188,224,48,
+18,224,44,5,64,255,224,44,18,74,28,160,42,0,55,65,10,224,42,18,
+106,12,192,86,65,31,224,43,23,74,56,192,47,65,121,224,47,18,138,90,
+192,136,66,218,225,17,19,106,124,192,44,65,162,224,44,18,106,158,192,43,
+66,149,225,151,20,2,119,97,114,140,196,32,44,65,196,195,136,200,21,32,
+108,34,8,67,205,134,219,38,213,32,21,32,175,224,21,0,64,142,128,21,
+33,78,32,21,64,19,32,73,34,93,0,58,99,86,96,40,38,247,69,167,
+45,255,1,50,51,65,117,32,26,33,32,224,67,0,64,255,96,67,68,36,
+96,67,34,243,34,38,0,75,32,7,0,51,64,118,32,25,34,4,100,214,
+224,1,8,37,150,0,55,68,28,64,101,64,92,141,28,1,55,54,64,112,
+130,153,224,26,14,134,85,224,27,13,205,150,224,19,3,101,144,224,18,5,
+100,250,107,80,0,50,106,229,224,27,7,224,17,5,132,100,224,112,12,98,
+139,224,47,6,98,22,224,18,6,136,61,224,18,4,228,121,0,224,84,9,
+96,252,33,59,137,219,65,105,32,34,129,153,134,37,32,18,32,148,128,17,
+131,243,32,17,32,184,128,17,129,252,32,17,32,249,128,17,129,248,32,17,
+225,225,0,225,244,0,32,99,96,17,64,229,128,17,33,67,128,17,129,234,
+32,17,32,98,128,17,193,230,75,8,128,17,129,222,64,162,192,17,224,180,
+0,192,179,65,203,80,124,32,79,103,39,199,122,169,40,2,67,32,60,69,
+136,161,145,224,25,9,138,65,224,26,13,97,67,139,135,231,202,0,160,26,
+162,64,34,158,0,85,101,248,233,235,1,64,25,130,167,32,26,162,168,129,
+224,32,44,96,161,136,166,234,29,5,160,49,128,37,134,66,133,125,230,127,
+1,224,132,9,170,135,224,87,15,107,83,224,87,20,224,59,17,108,231,224,
+59,9,2,55,54,50,67,134,144,99,224,160,3,225,67,15,96,33,224,189,
+13,98,219,225,66,12,136,13,225,66,14,224,44,6,146,51,224,43,9,224,
+116,13,168,148,224,70,9,137,44,224,114,29,109,62,224,114,11,225,3,14,
+194,70,224,25,9,136,63,224,168,11,178,163,224,124,9,109,230,224,168,30,
+64,36,225,27,33,226,210,16,226,209,20,224,43,6,226,203,2,225,27,6,
+192,115,227,98,5,225,0,16,226,219,1,224,97,6,226,213,2,224,141,24,
+226,197,2,224,141,5,224,44,11,226,117,15,105,64,38,179,133,63,68,113,
+133,19,69,224,68,196,239,26,2,106,226,234,45,1,204,145,239,32,0,0,
+49,111,165,112,240,35,77,203,9,224,16,3,106,232,160,17,71,39,99,113,
+96,116,199,115,224,1,9,108,146,237,52,10,224,29,8,224,26,17,224,23,
+14,224,20,11,224,17,8,224,14,5,224,11,2,237,221,4,200,59,71,147,
+101,192,71,197,2,57,54,32,243,40,2,2,51,52,38,51,26,20,104,115,
+115,114,99,47,109,97,108,99,111,108,109,45,119,97,108,108,97,99,101,40,
+191,0,105,85,92,1,101,47,96,33,6,45,49,46,50,48,46,57,128,12,
+2,46,104,115,64,58,4,44,56,48,58,49,245,231,0,32,104,134,131,65,
+99,0,90,96,1,161,107,0,58,112,241,168,78,75,23,0,90,203,18,32,
+25,134,147,0,85,160,49,224,51,3,134,155,241,127,3,65,255,246,154,0,
+193,185,130,2,179,55,224,29,0,173,174,0,55,86,103,193,244,66,119,98,
+238,243,96,2,32,33,97,243,81,216,87,41,143,21,1,55,53,177,147,0,
+80,233,179,15,52,85,0,105,201,176,98,192,108,147,1,95,53,130,195,32,
+189,135,71,32,16,50,30,87,153,32,18,135,72,214,68,32,19,96,105,81,
+141,0,55,83,82,110,217,64,226,0,53,64,27,179,233,215,48,0,53,34,
+172,243,231,2,14,84,70,45,56,47,47,82,79,85,78,68,84,82,73,80,
+243,232,0,145,244,244,62,1,87,234,96,209,0,50,99,73,32,16,0,53,
+44,102,96,160,135,196,65,170,65,29,32,16,131,99,242,239,4,225,78,1,
32,55,69,247,97,64,224,22,2,160,204,225,77,0,128,93,248,47,2,64,
-88,131,71,32,228,2,51,32,58,65,104,64,13,2,94,102,108,2,117,115,
-104,2,98,32,58,64,21,96,30,64,161,97,130,32,18,130,46,209,219,225,
-214,4,45,192,32,35,100,9,105,234,2,53,56,51,96,5,64,222,32,57,
-130,78,228,14,3,224,176,5,97,115,2,48,55,32,227,69,2,224,173,3,
-228,72,3,98,41,111,182,2,53,55,57,71,142,96,218,2,54,49,56,165,
-65,135,195,234,239,2,2,53,55,49,142,157,165,86,234,143,1,2,54,48,
-54,96,5,174,6,2,50,54,55,71,204,84,57,2,52,49,56,227,196,0,
-148,221,2,54,54,32,32,100,138,247,203,87,2,53,54,53,192,63,128,75,
-32,108,32,39,96,6,244,61,0,32,253,163,50,34,138,35,27,78,87,2,
-75,32,79,138,108,99,1,2,58,54,49,130,150,161,182,76,6,96,63,160,
-11,64,144,2,54,48,56,162,138,32,18,99,50,32,141,32,64,133,172,2,
-54,49,49,128,6,136,135,32,8,32,62,32,86,162,218,180,182,227,102,0,
-2,79,32,64,69,216,113,17,131,131,243,96,1,163,181,240,60,12,179,190,
-164,207,115,4,242,251,17,207,73,198,13,145,163,224,119,0,2,64,64,82,
-67,189,161,37,245,230,6,128,127,224,122,10,224,39,25,128,117,178,151,64,
-40,132,112,178,54,224,144,31,224,180,28,130,123,33,102,204,44,128,37,226,
-104,1,98,107,98,143,243,3,20,87,79,211,127,241,140,2,138,85,228,93,
-1,2,98,101,103,2,105,110,123,2,99,111,100,2,101,125,34,205,41,64,
-158,161,253,243,118,4,242,2,2,201,108,225,162,10,224,120,9,241,79,22,
-2,101,110,100,224,128,3,224,130,7,226,128,0,228,129,0,97,62,32,22,
-247,208,1,247,1,5,225,195,12,121,113,244,11,17,104,7,249,62,0,64,
-96,211,204,47,70,36,47,128,247,72,108,64,208,35,252,32,202,229,21,3,
-2,54,49,51,64,42,32,252,2,95,51,50,151,236,2,50,55,57,195,56,
-184,69,226,43,2,160,100,96,57,70,148,116,126,120,44,224,241,3,248,13,
-0,128,114,2,50,56,50,185,208,129,30,106,129,160,44,225,52,14,34,72,
-133,235,2,75,50,32,197,253,64,55,32,17,199,133,87,52,96,22,208,97,
-51,193,224,4,3,96,6,168,102,32,37,133,194,224,37,8,32,4,224,72,
-0,133,210,136,25,196,140,208,122,2,89,32,64,193,159,201,214,226,192,7,
-84,239,32,9,36,160,2,56,54,32,32,9,2,57,55,32,100,145,129,59,
-2,82,32,64,215,127,163,125,2,85,32,35,212,167,128,76,130,12,151,79,
-251,192,0,251,198,2,224,21,15,248,23,4,224,43,3,224,15,2,248,39,
-5,118,239,233,180,2,65,41,233,180,4,224,67,0,224,53,1,224,154,5,
-234,200,0,192,83,247,12,4,32,16,33,120,33,67,69,224,166,57,2,50,
-49,54,188,60,213,105,37,200,34,106,227,81,1,2,112,114,111,2,103,114,
-97,2,109,34,32,253,42,4,2,99,111,109,2,109,101,110,146,166,251,161,
-4,194,140,227,181,2,245,194,1,102,16,234,155,5,128,228,248,18,1,224,
-61,0,107,169,32,51,2,57,49,32,97,186,172,129,224,61,3,193,17,161,
+88,131,71,96,132,73,25,0,55,82,179,32,22,130,150,7,94,102,108,117,
+115,104,98,32,32,16,130,62,96,170,97,139,0,58,97,155,131,247,160,216,
+225,223,2,45,201,33,80,106,117,79,162,32,14,96,92,0,48,130,87,65,
+247,128,57,226,61,13,129,230,0,51,245,99,0,128,238,224,182,1,228,81,
+3,98,50,143,191,0,48,115,216,147,205,174,139,112,172,99,118,233,251,0,
+1,54,57,138,143,197,95,234,152,1,0,55,66,31,32,5,66,105,98,4,
+103,213,64,119,0,53,180,6,245,240,1,43,153,32,100,139,0,203,96,0,
+54,82,182,128,63,128,75,64,108,160,6,244,70,0,32,253,163,59,34,147,
+35,36,78,96,0,75,46,68,103,230,99,10,32,33,130,159,161,191,76,15,
+111,122,160,11,64,144,1,55,51,143,193,64,117,66,170,97,47,32,87,133,
+181,0,55,47,15,97,4,162,86,0,55,90,79,32,86,162,227,180,191,227,
+111,0,0,79,67,133,177,26,131,140,243,105,1,163,190,240,69,12,179,199,
+164,216,115,13,243,4,17,207,82,198,22,145,172,224,119,0,2,64,64,82,
+67,198,161,37,245,239,6,128,127,224,122,10,224,39,25,128,117,178,160,64,
+40,100,121,98,40,178,44,224,144,27,224,180,28,130,123,33,102,204,53,128,
+37,226,104,1,98,107,98,143,243,12,20,148,252,179,4,225,70,1,138,94,
+228,102,1,10,98,101,103,105,110,123,99,111,100,101,125,132,97,160,158,161,
+253,243,127,4,242,11,2,201,117,225,162,10,224,120,9,241,88,22,2,101,
+110,100,224,128,3,224,130,7,226,128,0,228,138,0,97,62,32,29,235,40,
+3,247,10,3,225,195,12,103,241,244,20,17,131,9,217,71,64,96,211,213,
+47,79,67,28,246,13,0,64,208,49,180,33,19,184,60,147,142,0,52,68,
+21,0,51,37,8,2,95,52,56,96,152,32,55,147,70,32,27,142,93,192,
+200,224,100,2,64,57,64,199,148,135,100,51,224,241,3,248,22,0,128,114,
+0,50,100,0,225,30,0,102,204,192,44,225,52,14,34,72,133,244,1,75,
+50,230,6,0,64,55,32,17,199,142,87,61,96,22,208,106,51,202,224,4,
+3,96,6,168,111,32,37,133,194,224,37,8,32,4,192,72,64,208,166,119,
+167,236,32,19,208,131,0,89,234,174,1,201,223,226,192,7,78,250,42,42,
+33,74,65,73,3,95,50,48,48,110,152,162,27,0,82,160,64,213,189,72,
+38,250,130,0,128,76,130,12,151,88,251,201,0,251,207,2,224,21,15,248,
+32,4,224,43,3,224,15,2,248,48,5,118,248,233,189,2,65,41,233,189,
+4,224,67,0,224,53,1,224,154,5,234,209,0,192,83,247,21,4,32,16,
+33,120,33,67,69,224,198,57,135,166,252,147,0,99,11,34,162,227,81,1,
+6,112,114,111,103,114,97,109,253,51,6,5,99,111,109,109,101,110,146,175,
+251,170,4,194,140,227,181,2,245,203,1,102,16,234,164,5,128,228,248,27,
+1,224,61,0,107,178,32,51,34,166,97,186,172,138,224,61,3,193,17,161,
14,161,11,224,255,4,133,139,224,249,4,96,253,224,176,41,224,177,53,225,
-196,54,254,37,0,235,173,0,67,66,227,83,0,225,198,26,225,176,3,225,
-220,13,182,81,225,203,103,163,213,155,155,230,32,2,193,213,227,154,1,224,
-70,19,36,20,200,195,161,53,156,243,128,5,230,174,2,230,53,12,76,148,
-64,3,193,7,248,157,3,253,56,6,254,254,16,2,76,105,110,2,101,32,
-34,250,197,6,223,61,2,49,51,55,64,53,252,175,1,224,71,17,2,58,
-32,34,226,33,1,128,62,224,46,19,2,32,108,105,32,119,2,98,101,102,
-2,111,114,101,255,106,17,64,36,2,46,92,49,255,105,2,192,208,97,179,
-224,10,8,224,113,19,2,73,110,32,127,39,224,74,0,226,46,3,122,63,
-225,43,24,2,32,97,116,128,183,225,47,163,225,52,2,226,5,193,2,58,
-54,48,171,217,96,1,2,80,32,73,139,242,195,142,168,75,252,33,1,232,
-91,2,201,65,224,219,8,232,128,4,224,14,0,143,183,76,37,177,28,76,
-58,64,52,108,232,227,248,0,79,156,108,84,113,83,2,53,56,57,231,141,
-4,75,39,103,222,184,55,2,48,50,32,68,234,73,47,2,54,48,52,236,
-216,2,109,125,236,145,3,237,18,31,96,173,32,140,2,53,54,57,228,45,
-4,217,88,32,194,139,77,80,29,2,75,52,32,240,127,6,96,32,137,37,
-32,32,224,30,1,224,32,5,137,52,96,32,96,35,128,27,32,24,137,54,
-32,24,2,51,32,90,224,59,11,64,35,201,52,64,1,41,1,227,179,1,
-134,230,238,152,3,141,74,159,94,224,67,0,208,244,230,124,6,230,100,1,
-198,103,230,181,3,134,135,224,35,4,224,41,3,242,128,5,62,46,229,113,
-22,2,95,95,70,2,73,76,69,2,95,95,34,227,95,2,224,91,65,2,
-76,73,78,224,91,21,166,204,224,91,43,2,68,65,84,224,91,80,2,84,
-73,77,224,91,6,232,36,1,170,227,202,51,255,197,2,138,238,94,9,154,
-93,200,62,114,42,2,95,53,57,232,194,1,234,169,6,160,2,246,106,2,
-224,2,6,96,112,224,199,7,224,49,2,224,157,15,224,85,0,224,14,3,
-207,222,196,94,230,119,9,224,179,12,235,16,17,224,18,2,239,229,4,145,
-130,64,3,224,24,3,230,156,0,232,224,1,100,11,150,62,192,5,147,134,
-225,40,1,35,61,192,48,73,113,192,195,49,126,2,57,32,67,78,141,77,
-188,77,244,239,216,0,105,67,253,133,2,245,175,5,192,175,224,22,65,225,
-178,13,235,18,0,137,49,2,53,57,49,226,25,20,246,110,7,141,125,226,
-220,7,128,91,228,20,0,119,46,246,101,4,226,249,11,227,20,0,206,171,
-97,51,77,150,2,64,95,57,174,130,64,7,2,95,52,53,177,188,224,216,
-4,183,146,105,139,247,162,7,243,156,1,147,5,2,55,50,32,160,16,230,
+196,54,254,46,0,235,182,0,67,66,227,83,0,225,198,26,225,176,3,225,
+220,13,182,90,225,203,103,163,213,155,164,230,32,2,193,213,227,154,1,224,
+70,19,36,20,200,195,161,53,156,252,128,5,230,174,2,230,53,12,76,157,
+64,3,193,7,248,166,3,253,65,6,255,7,16,0,76,54,254,223,65,250,
+153,0,223,70,0,49,36,233,32,215,198,23,224,71,19,0,58,192,68,129,
+65,64,62,224,46,19,0,32,87,118,62,179,63,132,192,126,255,115,10,64,
+36,0,46,255,114,4,192,208,97,179,224,10,8,224,113,19,1,73,110,159,
+48,224,74,0,226,46,3,140,152,224,66,23,2,32,97,116,128,183,225,47,
+163,225,52,2,226,5,193,35,55,171,217,96,1,1,80,32,36,2,67,138,
+195,142,168,75,180,101,224,15,0,104,91,201,65,224,219,8,232,128,4,224,
+14,0,64,26,32,110,139,241,204,70,90,237,109,2,227,248,0,79,165,108,
+84,155,225,0,49,140,208,238,236,0,64,14,71,222,184,64,99,210,0,55,
+109,69,1,55,51,114,76,172,216,109,125,236,145,3,237,18,31,96,173,32,
+140,0,54,73,169,225,108,2,217,97,32,194,139,77,80,38,1,75,52,240,
+136,7,96,32,137,37,32,32,224,30,1,224,32,5,137,52,96,32,96,35,
+128,27,32,24,137,54,32,24,0,51,224,57,2,224,59,2,64,35,201,52,
+64,1,41,1,227,179,1,134,230,238,152,3,141,74,159,103,224,67,0,208,
+253,230,124,6,230,100,1,198,103,230,181,3,134,135,224,35,4,224,41,3,
+242,137,5,62,55,229,113,22,7,95,95,70,73,76,69,95,95,227,95,3,
+224,91,65,2,76,73,78,224,91,21,166,204,224,91,43,2,68,65,84,224,
+91,80,2,84,73,77,224,91,6,232,36,1,170,227,202,51,255,206,2,138,
+238,94,18,80,110,233,242,1,114,51,35,65,232,194,1,234,169,6,160,2,
+246,115,2,224,2,6,96,112,224,199,7,224,49,2,224,157,15,224,85,0,
+224,14,3,207,222,196,94,230,119,9,224,179,12,235,16,17,224,18,2,239,
+229,4,145,130,64,3,224,24,3,230,156,0,232,224,1,100,11,150,71,192,
+5,153,79,225,40,1,35,61,192,48,73,113,192,195,49,126,0,53,159,230,
+40,138,109,244,239,216,0,105,67,253,142,2,245,184,5,192,175,224,22,65,
+225,178,13,235,18,0,137,49,1,55,49,144,28,225,101,15,246,119,7,141,
+125,226,220,7,128,91,228,20,0,119,55,246,110,4,226,249,11,227,20,0,
+206,171,97,51,125,35,1,95,57,65,109,36,175,64,7,1,95,54,155,178,
+224,216,6,183,155,105,139,247,171,7,243,156,1,134,78,37,61,160,16,230,
92,7,230,77,8,226,52,15,226,58,3,224,233,2,226,60,1,235,30,5,
-226,64,16,227,106,4,98,68,224,56,1,110,253,171,165,2,52,54,48,226,
-47,10,227,8,13,103,74,247,135,55,2,76,97,110,2,103,117,97,2,103,
-101,47,2,80,114,101,43,253,2,99,101,115,2,115,111,114,2,47,67,112,
-32,34,2,47,77,97,2,99,114,111,2,80,97,115,247,167,0,32,205,2,
-58,50,50,237,228,1,246,90,6,55,183,128,9,33,96,230,114,0,32,179,
-32,10,2,53,57,51,235,96,7,2,37,72,58,2,37,77,58,2,37,83,
-92,235,104,0,32,37,242,205,0,226,151,19,224,114,49,2,100,32,37,2,
-98,32,37,2,89,92,51,224,114,37,192,23,32,122,96,25,64,130,232,223,
-1,32,19,149,123,224,46,24,37,143,32,51,96,112,32,25,226,123,1,224,
-123,14,227,204,2,98,35,245,219,0,64,34,230,50,2,245,154,3,240,85,
-6,240,169,34,224,39,12,226,249,0,224,137,9,224,141,32,224,221,14,224,
-164,3,132,57,235,31,0,224,234,34,224,137,59,206,115,233,89,1,233,101,
-4,250,24,0,246,109,1,249,121,0,193,226,64,85,2,51,57,48,96,16,
-206,142,242,102,7,185,56,2,54,48,48,230,30,2,228,219,0,128,148,2,
-54,48,49,138,173,161,33,2,95,53,52,32,39,129,118,39,207,32,75,145,
-172,169,250,147,12,211,243,194,254,2,50,55,52,235,174,0,229,2,3,148,
-219,105,252,96,61,147,54,203,233,59,213,2,52,53,49,228,77,2,76,30,
-2,98,114,101,2,97,107,115,2,44,32,97,2,116,32,92,228,92,69,2,
-72,97,115,2,104,68,101,2,102,105,110,2,101,46,104,132,93,2,50,53,
-58,2,54,34,32,64,217,224,138,130,108,127,2,75,32,65,101,149,2,50,
-32,65,140,180,144,91,156,108,148,132,99,206,252,180,0,192,19,140,220,228,
-175,1,2,53,57,53,98,34,66,172,225,154,4,130,189,187,99,2,49,49,
-55,89,68,162,38,96,7,96,77,140,103,2,73,32,58,96,41,64,88,2,
-53,57,52,64,13,140,62,2,94,71,69,2,84,84,73,2,77,69,77,2,
-73,76,76,96,36,140,60,114,12,225,74,1,2,100,101,102,2,97,117,108,
-2,116,84,105,2,109,101,76,2,111,99,97,2,108,101,34,64,210,101,44,
-149,201,230,221,0,228,227,3,67,74,85,218,192,216,130,120,150,66,214,192,
-173,88,195,147,221,164,228,85,4,234,19,5,36,93,33,47,33,7,192,40,
-236,98,3,248,85,4,227,213,5,67,19,131,156,224,57,2,224,132,6,224,
-112,1,224,9,8,2,39,32,89,228,196,3,173,53,242,97,3,192,7,246,
-66,4,224,5,3,246,78,27,244,150,7,229,85,3,235,14,3,172,35,137,
-17,41,105,237,222,1,233,88,1,124,32,225,17,19,35,203,234,100,10,191,
-30,225,146,1,245,231,0,2,56,48,32,160,43,238,7,14,233,204,3,225,
-3,51,234,16,4,198,120,230,103,10,234,41,12,225,23,14,234,100,5,225,
-29,26,34,35,225,29,2,224,126,4,96,231,233,137,0,64,184,251,58,0,
-225,28,1,235,11,3,226,215,2,237,66,24,230,209,0,231,142,6,239,72,
-9,245,51,11,96,214,234,41,0,235,50,2,148,255,38,27,224,167,0,220,
-103,239,47,13,235,207,6,238,122,15,227,89,4,231,50,5,224,85,10,225,
-214,3,226,151,31,192,199,100,228,251,121,1,246,229,4,245,215,1,2,49,
-50,56,245,216,5,224,54,3,224,53,16,246,13,7,224,52,3,38,88,225,
-187,2,158,138,129,237,160,6,135,93,224,38,2,64,16,252,24,1,127,116,
-163,58,92,190,82,68,32,33,96,53,226,198,1,226,186,17,226,172,3,251,
-117,2,226,105,1,37,90,218,204,231,211,37,106,129,32,61,134,153,127,253,
-103,210,128,214,2,67,32,79,229,187,0,76,243,192,96,184,30,175,15,237,
-63,1,240,71,3,133,225,252,44,0,2,53,56,48,96,5,124,9,2,53,
-56,50,128,6,109,170,237,25,3,184,207,32,252,243,51,8,251,217,3,230,
-108,1,64,177,244,210,19,2,35,105,110,2,99,108,117,2,100,101,32,235,
-188,1,212,210,247,195,17,244,219,3,224,92,20,117,47,2,49,32,92,224,
-91,1,224,152,0,2,51,53,52,224,87,20,64,254,129,53,225,153,2,52,
-94,46,216,44,148,2,53,56,54,64,160,97,32,66,60,53,94,32,19,108,
-12,254,179,15,2,92,57,50,2,38,47,34,128,94,161,97,65,182,245,40,
-5,162,133,161,186,130,154,98,156,128,104,78,75,2,50,50,52,158,43,96,
-42,32,65,136,63,32,151,2,55,32,75,33,152,196,110,228,108,7,224,11,
-0,32,124,196,96,32,61,136,114,227,245,3,231,176,6,224,61,6,192,8,
-189,220,96,75,244,228,0,128,144,244,221,0,2,52,32,65,128,17,136,133,
-180,239,194,176,136,108,104,41,235,150,1,32,23,227,41,2,231,224,4,132,
-166,136,6,232,123,6,251,56,7,255,215,2,118,33,96,239,246,43,1,99,
-217,34,154,33,180,166,20,225,112,2,99,19,67,227,32,45,35,83,227,140,
-0,2,52,54,55,150,245,118,62,2,52,54,54,174,105,71,39,32,181,202,
-59,118,45,161,11,64,206,64,67,73,83,81,18,50,77,176,179,107,255,214,
-179,32,104,32,13,2,85,32,67,248,4,0,226,210,7,37,114,87,103,229,
-114,1,32,50,32,134,32,93,170,138,2,53,55,54,42,109,165,168,32,209,
-32,25,130,22,251,40,0,231,212,17,133,79,129,60,134,210,132,35,2,95,
-53,51,64,234,97,54,252,30,2,160,13,229,198,2,128,35,99,37,138,221,
-132,252,32,63,32,29,32,137,226,98,5,137,149,231,93,17,242,83,7,71,
-201,225,147,0,64,201,228,180,0,102,114,202,169,35,23,32,173,33,212,101,
-24,32,15,33,64,99,41,171,134,2,50,53,50,32,8,186,183,228,50,17,
-2,85,110,109,2,97,116,99,2,104,101,100,2,32,35,105,2,102,58,32,
-2,112,111,115,2,105,116,105,2,111,110,115,2,32,111,102,2,32,111,112,
-2,101,110,32,2,99,111,110,2,116,101,120,2,116,32,97,2,114,101,58,
-228,48,1,67,163,66,31,132,9,107,97,2,50,54,56,249,25,0,164,64,
-232,130,1,238,145,3,244,69,14,128,250,69,104,224,61,8,244,66,41,231,
-232,4,240,40,0,243,211,4,253,2,0,232,5,7,212,1,224,69,9,224,
-72,0,224,184,7,96,75,244,117,15,199,226,200,95,101,50,186,124,246,194,
-21,224,136,0,224,31,15,233,26,1,98,207,247,171,3,224,8,2,224,36,
-1,224,71,16,247,224,5,224,113,20,241,124,6,224,45,31,224,93,5,192,
-175,224,128,7,224,224,18,224,191,27,224,56,17,237,87,1,224,5,12,225,
-61,7,224,60,6,225,211,8,234,137,29,238,174,4,39,154,253,118,7,224,
-152,5,224,201,3,225,196,6,225,202,11,224,152,61,2,117,110,100,2,101,
-102,34,224,151,26,225,103,6,225,69,7,224,151,71,2,105,102,110,224,152,
-143,224,151,15,227,123,3,224,151,12,192,11,227,213,0,224,145,25,224,190,
-7,224,187,55,224,184,11,226,128,27,226,125,13,224,141,53,2,101,108,115,
-227,17,12,224,143,113,225,31,13,172,69,121,26,207,5,249,191,4,224,5,
-27,245,117,2,240,114,1,224,139,18,2,110,100,105,224,140,0,201,223,231,
-236,67,96,96,84,132,184,64,231,194,4,231,130,14,225,160,120,225,20,3,
-224,144,123,2,112,114,97,2,103,109,97,224,145,11,243,129,0,226,50,8,
-254,83,5,143,90,224,22,3,192,146,104,153,224,11,10,241,122,9,232,219,
-7,254,79,6,222,166,232,124,4,252,147,0,196,100,239,210,2,87,163,187,
-240,108,51,228,231,13,253,59,11,230,172,7,228,233,3,228,221,12,225,147,
-10,228,221,50,143,89,225,142,9,242,84,13,224,159,5,224,156,28,224,153,
-47,2,119,97,114,2,110,105,110,2,103,34,32,224,152,9,232,196,34,227,
-54,48,2,114,114,111,2,114,34,32,225,197,18,255,102,7,243,105,8,233,
-243,11,225,208,14,228,220,26,80,165,224,143,7,224,214,8,177,186,100,246,
-82,98,2,49,54,52,224,50,3,227,94,1,227,91,3,255,72,2,227,89,
-0,224,8,9,154,164,238,2,5,140,12,34,247,90,190,2,50,55,50,96,
-5,242,14,0,111,86,128,21,111,14,176,165,111,103,64,29,67,50,2,50,
-56,53,227,120,1,160,27,144,52,245,235,9,245,93,6,227,47,5,224,38,
-13,224,19,10,224,16,7,224,13,0,110,180,128,141,243,29,3,147,246,79,
-17,2,50,57,50,59,232,2,50,51,32,255,130,1,227,233,2,226,26,34,
-237,63,9,228,162,1,224,22,10,225,98,3,225,211,0,64,149,238,203,2,
-225,225,20,231,82,4,231,8,3,193,167,252,208,1,2,50,52,55,64,88,
-79,186,2,51,50,52,228,167,0,231,43,5,231,45,19,2,87,97,114,67,
-181,2,58,32,117,2,110,107,110,2,111,119,110,2,32,100,105,2,114,101,
-99,2,116,105,118,2,101,32,35,162,190,150,52,116,41,224,73,19,79,55,
-2,105,110,32,231,106,11,232,100,16,246,21,0,130,172,226,84,11,226,56,
-9,129,246,32,239,112,177,225,210,5,227,46,255,227,46,24,243,75,2,81,
-102,227,48,9,119,11,50,221,96,218,227,61,8,128,207,183,102,226,30,59,
-231,87,2,160,240,182,149,250,197,0,226,224,4,231,205,27,249,208,0,194,
-101,163,81,227,78,1,227,42,9,226,233,60,232,110,35,232,71,7,233,24,
-23,247,252,6,226,41,1,226,228,0,245,209,5,161,250,2,51,53,55,160,
-144,52,228,130,206,160,132,225,86,0,224,98,0,33,247,226,56,1,225,57,
-3,115,166,32,16,224,193,1,251,212,1,149,79,247,183,27,225,54,3,2,
-49,52,53,64,44,226,99,0,224,225,0,117,47,181,142,224,92,2,117,174,
-163,249,225,110,24,2,51,48,32,225,110,4,225,150,21,115,236,32,41,226,
-242,3,225,200,22,2,52,54,56,117,104,192,106,224,49,35,128,16,235,215,
-1,229,250,4,225,206,4,225,238,3,193,146,53,133,76,184,225,196,0,247,
-28,5,155,97,224,119,2,197,197,226,109,1,224,41,15,193,255,85,251,243,
-188,1,224,59,37,131,85,70,236,224,70,6,228,156,0,253,198,0,248,11,
-3,137,8,160,86,32,54,96,218,225,197,13,228,212,2,197,10,252,98,6,
-224,28,4,224,15,5,224,64,3,118,109,243,113,6,183,198,228,63,1,101,
-57,196,31,247,205,0,231,87,12,247,210,5,32,31,2,51,53,51,224,31,
-6,2,52,57,32,128,31,166,53,182,76,224,230,6,76,241,136,42,33,250,
-124,84,251,153,7,134,160,70,76,134,189,226,89,6,253,3,0,194,215,192,
-17,224,91,5,152,247,217,47,224,116,24,224,58,17,245,99,12,252,154,0,
-228,160,6,162,70,228,213,4,237,98,6,167,142,165,32,193,216,223,85,226,
-136,1,167,157,2,53,55,49,229,208,0,2,53,55,50,198,150,2,51,57,
-48,226,165,1,224,203,6,231,177,13,2,53,55,51,237,46,10,251,63,16,
-226,84,1,227,128,0,231,105,1,121,100,235,208,1,32,107,222,239,249,173,
-13,64,32,72,78,2,52,49,57,255,167,0,110,202,63,30,196,96,225,130,
-2,64,252,72,95,196,6,223,7,39,205,254,25,0,246,68,12,97,91,37,
-69,227,152,1,226,234,1,231,48,12,233,156,16,225,17,6,230,139,22,223,
-77,200,135,226,238,1,229,210,1,248,81,9,160,135,203,132,239,153,18,238,
-81,9,237,184,9,248,195,3,248,196,66,224,156,5,229,204,7,225,125,4,
-224,122,9,228,195,4,248,80,16,239,221,12,245,252,4,239,53,9,65,236,
-2,50,50,48,224,209,1,110,175,246,129,13,224,43,26,96,39,224,30,17,
-246,51,9,228,0,2,237,99,7,239,120,5,250,113,11,227,3,0,224,105,
-7,244,195,6,225,21,6,224,78,42,245,162,4,224,173,5,224,77,1,251,
-61,4,224,74,15,243,188,5,128,46,99,45,101,160,235,144,4,243,41,1,
-142,181,126,157,206,29,224,57,2,125,236,128,34,157,40,253,244,1,36,23,
-229,124,0,97,103,128,101,96,34,221,199,128,34,200,213,232,229,10,245,105,
-109,224,224,3,113,79,225,110,0,229,213,1,224,234,11,225,12,24,161,104,
-196,90,231,24,0,227,190,3,234,212,6,233,119,39,101,7,234,42,6,228,
-239,7,232,203,0,195,214,194,72,254,255,2,201,1,224,240,19,230,226,1,
-137,81,224,223,7,226,153,3,133,150,229,57,3,226,15,0,198,120,192,85,
-232,12,12,231,243,13,238,141,10,245,246,5,226,190,1,231,185,2,231,137,
-38,231,109,29,230,79,9,231,107,85,231,73,0,231,74,10,231,71,11,231,
-70,5,161,30,241,170,0,64,167,225,0,27,224,239,19,231,63,5,231,56,
-3,129,213,2,57,51,32,238,167,2,2,51,52,38,2,99,112,112,2,104,
-115,115,2,114,99,47,2,109,97,108,2,99,111,108,2,109,45,119,2,97,
-108,108,2,97,99,101,2,45,117,110,49,227,2,114,115,101,2,47,99,112,
-32,33,2,45,49,46,2,50,48,46,2,57,47,76,2,97,110,103,2,117,
-97,103,2,101,47,80,2,114,101,112,2,114,111,99,2,101,115,115,2,111,
-114,47,2,67,112,112,2,104,115,47,32,5,2,73,102,100,2,101,102,46,
-2,104,115,92,32,89,2,44,54,56,2,58,53,34,96,124,2,58,53,55,
-32,145,2,10,65,32,108,0,215,158,235,212,0,131,177,33,76,64,170,226,
-140,3,194,142,32,63,33,103,32,63,2,80,32,95,100,34,99,230,111,244,
-231,135,2,97,151,139,128,66,188,201,170,160,15,2,35,57,50,164,58,64,
-12,96,43,233,204,0,32,95,32,8,96,159,239,63,4,33,147,132,245,64,
-54,164,163,65,69,107,223,32,52,32,81,32,52,2,85,32,90,224,1,8,
-225,183,3,32,40,32,197,96,93,99,0,65,225,2,52,52,54,2,32,64,
-73,197,156,212,155,72,121,64,192,66,59,2,53,54,53,32,116,75,246,171,
-252,32,17,96,213,111,13,32,44,2,79,32,64,67,210,32,16,67,232,240,
-143,23,2,35,100,101,95,124,165,127,208,198,44,111,65,9,160,173,96,6,
-97,155,132,140,128,171,128,204,64,3,98,156,96,180,226,74,12,97,244,2,
-48,58,48,225,243,0,32,89,32,245,32,160,2,56,32,102,250,46,2,2,
-101,68,101,64,138,2,100,34,32,64,37,64,189,32,37,71,51,146,105,64,
-228,2,51,53,52,65,208,196,143,138,185,32,43,33,230,97,112,2,75,50,
-32,2,75,52,32,225,106,5,32,30,33,25,128,30,2,51,32,75,128,30,
-160,28,32,27,32,86,161,130,133,10,230,107,1,227,87,1,168,122,233,191,
-17,233,220,21,224,29,13,233,129,3,224,33,16,248,229,4,224,37,19,249,
-14,5,224,41,22,249,59,6,224,45,25,250,135,7,224,49,28,252,80,8,
-239,107,13,247,79,11,251,28,4,244,239,11,224,103,19,224,40,19,250,53,
-12,225,78,55,224,41,44,235,138,3,236,142,1,244,188,7,224,5,9,236,
-9,0,250,100,11,2,89,32,64,251,16,21,224,32,2,224,172,14,230,177,
-1,250,206,26,224,155,2,233,92,1,192,5,253,245,8,160,222,230,226,1,
-253,248,15,226,17,8,236,170,17,128,132,2,67,32,60,36,23,237,111,3,
-224,67,9,236,244,5,224,203,12,128,70,231,24,2,224,37,5,148,224,236,
-131,5,236,51,2,238,96,18,238,110,10,230,162,9,200,9,2,85,32,95,
-2,53,52,49,209,121,114,24,232,37,1,234,133,11,240,243,0,69,245,2,
-52,50,32,235,47,3,225,50,9,224,197,0,224,25,4,2,82,32,64,244,
-17,1,225,123,10,225,247,11,224,195,5,64,120,233,146,10,193,187,239,45,
-23,58,144,240,85,4,235,110,12,160,234,150,77,230,215,16,2,32,32,34,
-225,194,1,225,19,11,225,151,7,235,81,1,97,123,129,77,135,241,246,49,
-4,226,131,16,238,74,17,254,44,9,226,104,1,236,93,1,239,214,5,225,
-31,0,2,67,32,61,2,61,32,64,224,39,15,193,200,225,178,8,229,61,
-0,224,81,1,252,118,0,226,132,5,194,169,235,57,4,245,102,0,116,232,
-225,4,4,192,106,240,168,8,192,36,64,61,76,78,39,175,162,210,226,147,
-12,228,163,20,226,166,7,224,43,21,194,184,239,185,10,225,151,9,241,68,
-11,226,206,14,235,205,1,241,116,7,253,192,12,242,2,25,250,86,14,227,
-193,5,233,246,2,162,140,125,163,129,59,225,66,8,229,80,11,224,239,47,
-227,127,2,224,239,27,194,102,227,196,6,228,3,1,236,212,8,226,149,0,
-228,199,30,32,11,227,210,14,244,121,10,224,248,120,224,68,2,224,248,55,
-35,238,224,248,17,233,55,19,224,199,3,238,82,11,241,41,1,252,68,7,
-224,73,16,224,70,27,232,181,2,224,65,7,224,62,4,224,53,2,228,104,
-6,229,123,2,98,64,228,116,9,230,16,15,227,61,6,224,88,5,247,238,
-2,36,77,79,0,80,169,32,5,184,181,45,41,247,210,2,224,100,71,98,
-17,224,100,5,212,214,224,100,26,225,57,2,235,52,1,230,253,2,224,88,
-5,229,100,17,234,126,9,225,172,0,251,247,2,234,88,1,247,138,7,155,
-212,69,225,96,123,192,96,237,65,0,237,36,16,192,64,161,30,166,77,251,
-54,8,223,180,232,238,0,165,119,224,96,0,240,155,85,2,84,111,107,2,
-101,110,105,2,115,101,46,176,155,2,50,49,53,2,58,49,51,245,137,7,
-235,67,17,230,149,15,235,103,4,236,21,16,235,107,12,224,83,14,235,110,
-39,235,111,10,235,114,74,250,244,1,247,79,11,235,189,255,235,189,255,235,
-189,115,226,80,48,246,28,1,226,80,17,224,86,6,235,126,8,252,63,3,
-232,74,23,2,49,50,51,225,138,10,2,83,32,80,225,138,31,226,60,7,
-246,11,4,107,215,216,60,2,53,52,56,247,229,14,225,156,15,2,45,123,
-34,228,217,7,224,251,13,251,67,6,233,142,13,194,130,83,191,247,110,7,
-235,126,2,226,145,22,233,145,14,227,67,11,225,69,33,64,10,226,209,63,
-2,125,45,34,226,209,21,226,211,3,234,45,0,229,69,13,227,201,26,224,
-248,11,227,201,33,224,248,3,226,63,31,252,53,7,225,11,31,243,127,2,
-243,1,1,250,225,3,104,47,129,93,96,107,234,26,7,229,229,80,188,45,
-229,229,12,234,188,17,123,89,224,161,5,229,246,46,224,222,15,255,24,2,
-240,115,18,231,104,21,240,78,2,163,191,232,17,2,240,68,2,229,29,28,
-237,240,2,225,136,24,226,220,2,231,225,10,226,223,31,121,175,226,223,17,
-246,73,8,255,213,13,192,195,251,193,4,224,90,10,201,162,129,34,155,71,
-224,50,2,227,39,22,122,138,2,53,53,48,220,205,130,24,250,119,2,227,
-103,26,224,63,0,224,54,2,224,65,8,225,80,10,253,13,6,255,39,2,
-224,194,10,227,136,35,96,142,226,230,26,255,21,5,130,238,128,39,224,60,
-6,229,18,21,242,234,217,242,236,9,224,46,18,242,239,5,228,30,9,242,
-242,214,245,79,12,231,36,104,224,62,2,229,224,30,38,26,233,69,2,231,
-4,4,224,213,65,234,58,13,224,214,83,2,56,32,35,66,52,234,32,17,
-242,139,12,244,167,226,243,65,9,244,171,225,240,247,7,232,174,16,228,239,
-13,166,174,228,92,4,237,140,2,236,3,7,227,49,44,2,51,57,32,227,
-48,51,224,62,2,233,232,33,225,48,1,2,39,39,34,224,207,91,2,83,
-32,83,226,99,10,2,66,32,90,229,213,15,224,230,7,232,104,3,224,231,
-29,40,35,128,139,2,79,32,35,64,7,244,169,0,225,184,104,135,194,237,
-246,11,224,199,0,225,211,16,245,176,67,2,66,32,79,161,18,117,186,225,
-23,9,245,195,30,227,70,60,224,226,2,224,95,24,248,86,2,244,83,13,
-248,89,11,172,88,248,167,255,248,167,166,249,12,200,229,156,33,227,151,9,
-228,240,34,70,157,64,64,32,7,228,240,6,249,136,255,249,136,32,2,57,
-52,58,2,49,49,34,225,68,0,236,21,5,228,234,11,249,113,1,237,57,
-15,249,100,4,249,101,15,249,136,21,129,44,249,220,4,237,169,17,250,3,
-5,250,4,19,228,223,1,224,162,26,225,201,2,249,254,3,250,10,19,235,
-131,27,245,183,12,230,9,17,224,156,14,242,104,4,240,158,3,230,18,6,
-250,43,12,251,5,26,250,124,16,242,203,7,245,165,4,224,106,19,224,97,
-20,234,110,3,239,105,10,100,122,2,67,32,61,2,61,32,64,224,42,18,
-249,180,15,243,14,3,240,217,9,240,215,6,240,213,8,249,202,96,2,39,
-32,80,246,178,21,242,106,6,178,198,245,195,18,249,156,9,225,240,15,241,
-23,3,226,59,2,252,182,2,245,210,11,234,210,9,248,130,1,224,102,8,
-229,47,0,224,28,11,235,33,0,237,157,10,98,104,232,93,0,245,164,10,
-230,173,0,235,76,17,228,21,10,225,247,8,193,68,202,194,162,43,231,105,
-1,133,209,241,64,3,73,222,225,172,0,184,156,229,210,2,229,211,1,247,
-40,15,226,139,64,245,172,22,248,140,24,242,145,1,228,194,0,209,78,224,
-224,19,246,7,6,253,207,56,129,80,253,207,3,234,4,1,246,252,255,246,
-252,241,231,93,1,96,42,229,46,9,246,97,13,228,250,13,228,60,1,167,
-164,227,139,13,249,148,8,249,171,26,249,248,2,226,174,24,240,31,8,224,
-134,4,227,65,11,247,117,60,230,114,21,247,77,30,247,79,10,243,134,13,
-232,139,15,233,65,3,225,145,10,233,54,21,227,141,16,231,209,50,231,146,
-1,231,209,44,227,42,1,225,94,3,181,187,253,166,2,230,21,13,232,37,
-23,255,94,43,232,100,14,133,214,254,53,9,245,86,9,253,3,3,232,14,
-1,199,16,232,21,14,232,18,13,232,15,17,231,242,12,138,85,231,248,10,
-226,39,5,231,249,38,230,162,5,231,225,2,231,246,3,227,236,6,225,92,
-1,128,148,249,66,13,128,56,99,100,225,91,2,46,166,70,230,225,241,2,
-232,20,4,235,22,9,241,182,5,232,226,2,226,226,19,129,37,232,55,130,
-228,82,3,225,22,29,224,241,10,228,48,3,227,212,8,231,115,17,232,102,
-16,231,183,38,247,16,14,246,171,34,225,19,40,241,18,6,224,63,41,241,
-17,9,226,186,5,224,182,3,224,202,0,98,61,192,212,230,37,0,224,16,
-0,2,53,53,49,241,71,1,99,117,2,95,53,54,97,15,96,30,253,150,
-0,245,92,21,225,50,5,238,45,10,228,14,0,241,190,5,239,138,6,224,
-5,1,244,113,0,226,184,13,242,203,5,231,32,20,244,23,35,227,189,2,
-254,49,17,245,226,25,245,224,11,245,69,5,239,185,12,237,93,2,224,61,
-20,211,243,245,130,78,229,33,12,229,30,4,244,158,33,224,76,71,234,34,
-22,160,217,128,204,224,60,6,242,63,16,224,246,10,244,67,2,172,189,128,
-98,237,242,14,230,241,7,238,142,25,244,70,11,242,221,14,233,27,11,128,
-44,244,100,126,2,49,55,49,2,58,49,50,232,90,4,108,182,229,101,1,
-2,50,50,54,232,146,4,96,166,196,140,196,98,2,73,32,64,96,56,165,
-110,224,51,20,68,183,2,52,54,32,224,59,0,32,40,98,47,32,114,32,
-56,32,18,2,95,50,57,98,1,32,13,2,52,32,95,140,165,225,16,1,
-2,95,96,34,128,173,224,47,3,32,34,224,47,15,2,39,95,96,160,48,
-224,33,15,2,40,41,44,2,91,93,59,2,123,125,34,175,75,224,37,13,
-2,32,92,57,2,38,34,32,224,33,19,2,58,33,35,2,36,37,38,2,
-42,43,46,2,47,60,61,2,62,63,64,2,92,57,50,2,38,94,124,2,
-45,126,34,160,52,193,28,230,250,2,83,58,224,20,4,83,207,143,96,128,
-11,231,34,0,2,58,53,54,34,195,2,10,65,32,130,244,199,100,231,41,
-1,244,90,0,2,95,54,32,226,112,0,35,100,2,49,56,52,246,231,6,
-224,30,1,225,231,20,224,215,1,2,108,105,110,2,101,34,32,230,2,18,
-224,71,30,2,112,114,97,2,103,109,97,224,73,0,232,80,0,128,208,224,
-68,30,2,100,101,102,224,142,1,132,83,193,67,224,52,17,2,117,110,100,
-2,101,102,34,162,108,129,16,135,80,2,56,53,32,32,18,2,54,32,80,
-32,11,227,118,83,2,72,97,115,2,104,68,101,64,185,195,120,2,56,56,
-58,2,53,34,32,99,248,69,56,2,53,50,32,2,64,35,48,234,125,10,
-160,163,242,242,4,2,95,50,51,40,94,2,53,53,53,64,238,2,56,51,
-32,244,27,1,97,252,193,249,224,208,102,2,57,58,53,227,153,1,230,216,
-2,232,0,5,233,159,13,225,186,7,41,48,2,52,48,32,230,0,2,238,
-170,0,130,222,225,10,0,120,97,236,122,2,64,7,76,47,136,255,103,22,
-129,69,48,181,226,26,12,2,105,110,99,2,111,109,112,2,108,101,116,2,
-101,32,109,2,97,99,114,2,111,32,100,64,213,2,105,116,105,2,111,110,
-58,2,92,49,48,163,242,224,68,22,2,32,32,35,130,151,205,164,64,220,
-96,46,100,245,224,54,5,224,219,4,2,95,50,55,64,23,224,28,4,234,
-41,8,253,252,6,241,217,6,227,58,22,224,81,9,235,199,8,227,202,31,
-64,74,42,112,224,74,0,226,144,1,161,148,64,65,240,206,6,228,47,9,
-228,169,0,161,38,2,53,53,52,230,12,2,244,36,0,2,95,56,56,224,
-16,0,160,96,237,208,0,102,110,232,48,0,163,13,32,46,227,13,0,163,
-59,160,25,111,83,64,25,43,29,128,101,192,31,2,54,54,32,2,95,52,
-49,128,104,132,76,232,46,0,65,185,32,29,96,151,128,8,2,51,32,95,
-2,50,55,49,64,9,105,119,235,94,5,128,147,64,40,77,184,64,7,2,
-52,49,57,229,222,5,197,204,32,69,243,56,2,131,224,97,7,39,6,226,
-101,19,2,35,112,114,229,64,1,224,68,2,224,67,4,135,96,224,67,17,
-229,204,1,224,65,2,64,187,96,191,219,180,230,62,1,169,157,227,210,12,
-238,185,8,226,48,10,2,51,53,32,234,81,8,196,11,236,114,3,236,8,
-2,234,229,2,32,200,158,226,135,113,96,95,224,33,1,130,103,74,73,2,
-54,49,32,235,95,10,254,84,5,224,167,18,225,31,2,2,35,34,32,192,
-171,254,165,8,228,209,19,242,35,7,224,98,28,192,59,176,226,229,226,1,
-141,16,225,6,8,160,245,64,12,226,138,6,224,12,2,236,164,4,224,53,
-0,245,252,2,225,74,4,225,73,8,160,67,224,23,8,252,106,4,2,89,
-32,66,32,91,227,43,1,229,207,2,224,138,6,40,184,35,222,40,184,106,
-224,32,13,32,71,32,13,2,75,32,75,96,13,32,38,96,13,2,65,32,
-64,32,13,33,197,32,13,34,197,35,106,67,254,224,4,1,32,28,33,68,
-64,28,2,50,51,55,32,47,73,57,2,67,32,80,32,9,2,95,52,53,
-2,49,32,102,225,93,0,38,170,70,210,2,109,101,110,2,116,44,32,2,
-97,116,32,230,247,88,2,50,53,58,2,54,34,32,64,234,224,139,131,2,
-64,75,50,224,141,131,2,90,32,66,67,76,97,217,96,157,34,129,224,157,
-129,34,93,70,35,226,93,12,101,81,65,218,101,158,64,9,201,174,96,12,
-218,19,192,216,96,18,141,229,224,26,1,242,161,0,32,103,34,203,99,12,
-120,91,224,4,1,151,174,32,31,32,100,32,31,224,29,6,224,34,5,32,
-144,227,8,26,69,232,2,98,114,101,2,97,107,115,227,7,120,224,138,113,
-34,120,193,172,97,67,193,167,217,219,225,156,0,33,86,141,95,249,247,2,
-224,10,30,251,183,4,214,171,32,79,132,246,192,44,224,7,11,224,70,2,
-224,59,2,32,58,133,35,225,255,3,224,60,5,128,41,32,40,133,62,2,
-90,32,90,121,239,32,16,133,65,71,186,2,35,50,32,93,163,64,20,133,
-57,32,18,32,87,39,230,2,58,53,52,130,237,96,38,64,255,96,38,72,
-162,101,139,143,158,32,16,130,139,162,171,128,96,64,25,224,213,10,64,144,
-32,28,225,66,1,32,88,103,146,32,24,32,23,129,10,32,19,32,32,128,
-128,128,225,32,17,32,155,128,17,128,202,32,17,32,97,128,17,128,203,113,
-155,234,66,1,112,157,145,126,2,95,53,51,70,30,2,52,50,50,34,112,
-2,50,56,32,2,95,52,52,129,204,245,44,2,129,41,144,97,32,82,129,
-9,239,59,0,224,65,15,32,62,73,189,64,118,74,121,70,213,2,51,49,
-32,199,51,32,42,240,184,2,2,58,53,51,193,77,201,59,238,215,4,158,
-5,96,8,153,60,32,116,201,119,245,115,7,177,6,248,87,5,236,223,0,
-74,94,39,24,2,55,55,32,224,60,11,246,54,2,64,182,65,97,200,82,
-128,230,72,251,32,226,2,56,54,32,244,109,4,99,5,36,74,224,20,5,
-160,89,192,70,224,44,2,165,200,192,49,64,255,130,56,226,19,3,194,206,
-32,28,228,208,2,98,102,64,252,160,45,107,86,2,50,55,32,40,191,136,
-70,193,56,225,125,7,233,81,1,225,125,1,64,37,2,50,49,32,225,255,
-11,64,101,194,138,209,47,2,95,51,54,96,44,2,55,52,32,205,81,96,
-106,32,147,238,43,32,2,67,97,110,2,110,111,116,2,32,101,120,2,112,
-97,110,2,100,32,35,2,105,102,32,2,100,105,114,2,101,99,116,36,177,
-2,32,105,110,2,32,102,105,2,108,101,32,238,0,2,206,2,2,95,49,
-51,2,55,32,95,2,50,54,56,96,190,224,93,16,110,110,2,32,32,32,
-251,232,2,224,166,1,32,75,32,54,41,184,209,56,97,153,64,183,35,165,
-33,26,65,197,2,50,50,50,225,82,3,201,130,128,222,36,42,2,95,52,
-48,240,249,1,224,133,15,2,87,97,114,2,110,105,110,2,103,58,32,2,
-116,114,97,2,105,108,105,2,110,103,32,2,99,104,97,2,114,97,99,2,
-116,101,114,2,115,32,97,2,102,116,101,2,114,32,35,2,105,102,34,239,
-21,28,143,80,97,46,2,115,105,111,2,110,32,105,225,35,57,253,5,4,
-113,250,65,215,34,142,96,236,225,214,52,2,112,97,114,2,115,101,32,225,
-213,90,227,184,3,225,213,24,64,20,171,240,225,222,11,32,249,238,241,1,
-225,229,109,225,45,68,225,223,4,35,247,193,29,163,213,134,72,225,5,1,
-64,8,35,234,143,95,224,81,12,2,47,47,34,174,237,111,191,129,53,32,
-73,134,128,38,37,34,65,44,177,65,72,32,5,102,55,192,17,2,51,55,
-56,32,10,64,49,65,165,160,19,47,104,36,157,2,52,32,102,224,97,0,
-2,124,124,34,128,97,33,187,32,26,64,42,86,143,160,43,162,153,193,70,
-64,35,64,213,96,77,96,150,36,233,150,198,128,151,135,6,224,151,4,178,
-69,224,151,39,2,38,38,34,224,151,20,207,50,224,151,18,142,118,96,151,
-173,154,2,51,54,50,192,123,224,10,13,224,145,9,80,4,32,70,178,239,
-224,198,1,224,150,7,96,232,96,233,224,135,0,129,229,224,54,5,2,53,
-50,56,225,15,6,2,53,50,57,227,227,0,224,38,5,241,232,0,224,218,
-3,139,71,224,83,9,247,140,1,2,52,57,54,112,41,33,1,2,53,49,
-48,64,10,2,57,55,32,181,157,224,74,1,34,210,145,206,224,17,2,172,
-23,32,220,2,49,53,32,224,221,2,194,6,33,72,174,198,225,72,24,225,
-94,31,225,240,1,2,62,61,34,224,162,7,2,50,57,57,32,195,2,48,
-54,32,96,23,225,155,12,79,130,193,155,224,200,2,35,173,192,55,224,117,
-21,2,60,61,34,224,61,7,39,99,224,60,20,64,117,245,1,1,224,55,
-1,72,221,224,116,29,2,61,61,34,224,178,8,225,185,0,224,61,24,2,
-33,61,34,225,40,8,73,223,192,61,2,58,53,50,174,14,225,121,2,226,
-45,3,32,38,69,151,224,29,1,226,144,7,66,181,226,144,38,227,126,5,
-98,63,128,50,32,141,137,96,227,102,24,70,60,225,84,8,2,57,49,32,
-130,197,225,139,16,75,182,226,1,9,73,80,192,55,32,130,137,198,225,16,
-14,32,10,225,16,22,73,222,225,16,8,250,169,2,225,16,31,64,50,32,
-141,175,2,228,130,34,76,95,224,228,8,98,229,225,27,21,32,247,224,54,
-9,64,10,2,53,50,52,226,224,19,74,247,225,84,10,66,225,160,56,32,
-198,138,164,33,19,2,56,32,80,196,118,128,143,32,6,224,42,0,32,11,
-67,80,128,11,2,49,50,49,224,11,2,224,135,0,32,6,72,35,2,49,
-57,57,192,17,109,67,64,9,107,6,2,83,32,73,97,129,174,76,32,109,
-73,25,227,18,1,2,73,110,116,2,101,103,101,2,114,58,32,2,100,105,
-118,2,105,115,105,41,172,2,98,121,32,2,48,34,32,166,33,206,136,108,
-195,148,178,2,85,32,80,90,99,93,7,133,46,107,194,224,17,9,198,98,
-238,46,3,216,41,248,215,0,180,67,248,232,1,250,211,2,184,244,191,75,
-255,71,1,116,105,197,178,104,88,251,64,1,213,58,32,51,33,61,96,152,
-2,53,50,48,248,129,3,189,67,32,22,33,152,2,85,32,65,137,76,76,
-118,233,161,5,110,105,64,5,160,71,184,38,154,99,136,219,2,85,32,75,
-248,237,2,32,81,66,132,88,5,104,117,205,39,168,194,65,166,33,145,128,
-212,64,69,34,53,70,32,2,50,51,51,97,176,135,255,253,229,0,186,227,
-214,97,238,80,6,64,63,2,67,32,79,247,97,1,247,81,5,141,174,240,
-163,0,236,77,3,193,99,160,98,118,23,98,157,2,50,48,48,253,91,1,
-207,69,121,210,73,191,192,28,96,252,68,89,110,77,82,228,32,29,96,11,
-2,95,56,52,199,2,2,55,53,32,249,38,1,130,13,32,224,208,161,143,
-200,254,202,4,174,197,207,11,224,7,2,115,116,2,48,50,32,33,133,2,
-48,55,32,225,224,0,32,255,33,150,96,118,128,6,193,158,96,26,79,106,
-64,21,32,59,2,52,56,55,96,59,129,222,132,137,128,49,96,28,194,167,
-174,230,128,46,96,26,129,198,194,155,139,143,128,12,188,121,239,174,5,243,
-247,1,66,8,2,48,53,32,33,6,61,134,227,5,1,226,222,1,255,200,
-3,33,128,151,156,251,80,0,2,53,49,55,224,95,3,160,163,128,220,160,
-12,65,18,128,37,64,253,102,92,155,23,224,197,16,64,39,192,18,64,66,
-225,16,3,138,1,227,188,0,204,120,33,186,64,142,2,51,57,48,128,8,
-240,66,1,98,225,113,228,99,118,32,28,34,135,131,65,162,141,224,78,4,
-224,13,4,34,6,210,147,228,135,6,2,108,97,115,2,116,58,32,2,91,
-93,34,196,17,112,53,82,224,227,156,0,2,58,53,49,167,157,224,81,1,
+226,64,16,227,106,4,98,68,224,56,1,110,253,171,165,1,54,50,98,53,
+226,47,6,227,8,13,103,74,247,144,55,11,76,97,110,103,117,97,103,101,
+47,80,114,101,43,253,7,99,101,115,115,111,114,47,67,64,34,8,47,77,
+97,99,114,111,80,97,115,247,176,0,5,49,53,50,58,50,50,237,228,1,
+246,99,5,0,52,52,182,128,9,33,96,230,114,0,32,179,80,57,64,215,
+224,168,5,7,37,72,58,37,77,58,37,83,235,104,1,32,37,161,242,226,
+151,21,224,114,49,6,100,32,37,98,32,37,89,224,114,39,192,23,81,81,
+64,25,64,130,232,223,1,32,67,161,228,224,46,23,54,85,37,228,97,225,
+32,52,226,123,1,224,123,14,227,204,2,98,35,245,219,0,64,34,230,50,
+2,245,154,3,240,85,6,240,169,34,224,39,12,226,249,0,224,137,9,224,
+141,32,224,221,14,224,164,3,132,57,235,31,0,224,234,34,224,137,59,206,
+115,233,89,1,233,101,4,250,33,0,246,109,1,249,130,0,193,226,64,85,
+0,52,95,131,68,189,174,142,242,102,7,211,177,121,158,246,109,0,248,91,
+0,128,148,92,84,70,87,161,33,1,95,54,84,9,129,118,39,207,32,11,
+145,172,137,250,72,58,105,250,248,219,4,36,220,139,21,248,146,4,244,219,
+0,105,252,96,61,147,54,203,233,59,222,0,54,32,46,227,49,1,76,30,
+6,98,114,101,97,107,115,44,77,160,228,92,70,6,72,97,115,104,68,101,
+102,76,130,164,93,3,50,53,58,54,131,149,224,138,130,108,127,0,75,156,
+43,52,230,64,7,33,57,144,91,156,117,180,132,67,206,252,189,0,192,19,
+140,220,228,175,1,1,55,50,43,233,162,172,225,154,4,98,189,89,226,150,
+58,91,16,0,48,64,13,34,38,34,58,161,237,140,103,0,73,58,235,64,
+41,64,88,2,55,50,49,64,13,140,62,3,94,71,69,84,74,49,3,77,
+73,76,76,96,36,140,60,114,12,225,74,1,16,100,101,102,97,117,108,116,
+84,105,109,101,76,111,99,97,108,101,64,231,32,44,140,69,32,226,230,221,
+0,228,227,3,67,74,91,47,160,216,66,72,130,58,99,21,178,139,173,142,
+163,147,221,173,228,85,4,234,19,5,36,93,33,47,71,50,160,40,236,98,
+3,248,85,4,227,213,5,86,39,131,156,224,57,2,224,132,6,224,112,1,
+224,9,8,0,39,237,38,5,173,53,242,97,3,192,7,246,66,4,224,5,
+3,246,78,27,244,150,7,229,85,3,235,14,3,172,35,137,17,41,105,237,
+222,1,233,88,1,124,32,225,17,19,32,135,234,100,10,191,39,225,146,1,
+230,69,0,185,73,232,107,3,238,7,5,233,204,3,225,3,51,234,16,4,
+198,120,230,103,10,234,41,12,225,23,14,234,100,5,225,29,26,35,57,225,
+29,2,224,126,4,96,231,233,137,0,64,184,251,58,0,225,28,1,235,11,
+3,226,215,2,237,66,24,230,209,0,231,142,6,239,72,9,245,51,11,96,
+214,234,41,0,235,50,2,148,255,2,95,54,55,225,196,0,220,103,239,47,
+13,235,207,6,238,122,15,227,89,4,231,50,5,224,85,10,225,214,3,226,
+151,31,192,199,64,49,182,11,246,229,8,245,215,1,0,49,75,192,245,216,
+3,224,54,3,224,53,16,246,13,7,224,52,3,38,88,225,187,2,158,138,
+129,237,160,6,135,93,224,38,2,64,16,252,24,1,101,170,163,58,92,190,
+82,68,32,33,96,53,226,198,1,226,186,17,226,172,3,251,117,2,226,105,
+1,37,90,218,204,231,211,36,0,53,99,112,32,61,134,153,127,253,103,210,
+128,214,0,67,76,115,197,187,134,168,239,134,0,192,170,237,63,3,240,71,
+3,133,225,252,44,0,0,55,72,132,32,5,156,9,0,48,98,136,0,55,
+136,204,237,25,3,184,207,32,252,243,51,8,251,217,3,230,108,1,64,177,
+244,210,19,7,35,105,110,99,108,117,100,101,103,252,244,210,5,247,195,17,
+244,219,3,224,92,20,117,47,0,49,224,91,3,224,152,0,0,53,84,162,
+224,87,18,64,254,169,218,225,153,1,52,94,46,216,76,133,0,49,96,160,
+161,189,39,139,32,34,0,55,46,217,254,179,18,4,92,57,50,38,47,160,
+94,161,97,65,182,245,40,5,162,133,161,186,226,27,0,0,50,175,66,78,
+75,0,50,106,104,94,43,64,42,32,65,136,63,32,161,0,48,34,25,0,
+85,228,110,0,228,108,7,224,11,0,32,168,196,96,32,61,136,114,227,245,
+3,231,176,6,224,61,6,192,8,221,220,64,75,244,228,0,128,144,244,221,
+0,0,52,169,88,66,71,244,239,1,162,176,65,1,128,20,94,102,245,28,
+1,66,130,226,200,0,231,224,3,132,166,136,6,232,123,6,251,56,7,255,
+215,2,118,33,129,84,246,43,0,99,217,35,123,65,164,134,20,225,112,2,
+99,19,67,227,32,45,32,15,227,140,0,0,54,161,119,108,95,32,13,128,
+135,48,27,32,82,32,181,202,59,118,45,161,11,96,206,183,120,76,10,170,
+38,33,231,107,255,214,179,32,67,32,13,0,85,187,76,130,250,226,210,5,
+37,114,86,76,229,114,1,32,155,33,246,32,93,170,138,0,55,42,86,1,
+95,53,118,243,96,209,32,25,130,22,251,40,0,231,212,17,130,229,129,60,
+134,210,132,35,32,164,118,92,128,93,232,74,0,160,13,229,198,2,96,35,
+0,54,67,22,170,221,130,94,32,63,32,13,32,137,226,98,5,137,149,231,
+93,17,242,83,7,71,201,225,147,0,64,201,228,180,0,102,114,202,169,35,
+151,71,228,1,50,55,193,88,75,108,64,191,171,134,0,50,32,204,0,95,
+72,49,228,50,21,31,85,110,109,97,116,99,104,101,100,32,35,105,102,58,
+32,112,111,115,105,116,105,111,110,115,32,111,102,32,111,112,101,110,12,32,
+99,111,110,116,101,120,116,32,97,114,101,58,228,48,1,96,100,97,81,68,
+9,107,97,1,50,56,201,45,228,64,0,232,130,1,238,145,3,244,69,14,
+128,250,69,104,224,61,8,244,66,41,231,232,4,240,40,0,243,211,4,253,
+2,0,232,5,7,212,1,224,69,9,224,72,0,224,184,7,96,75,244,117,
+15,199,226,200,95,101,50,186,124,246,194,21,224,136,0,224,31,15,233,26,
+1,98,207,247,171,3,224,8,2,224,36,1,224,71,16,247,224,5,224,113,
+20,241,124,6,224,45,31,224,93,5,192,175,224,128,7,224,224,18,224,191,
+27,224,56,17,237,87,1,224,5,12,225,61,7,224,60,6,225,211,8,234,
+137,29,238,174,4,39,154,253,118,7,224,152,5,224,201,3,225,196,6,225,
+202,11,224,152,61,1,117,110,32,154,224,151,27,225,103,6,225,69,7,224,
+151,71,1,105,102,224,152,144,224,151,15,227,123,3,224,151,12,192,11,227,
+213,0,224,145,25,224,190,7,224,187,55,224,184,11,226,128,27,226,125,13,
+224,141,53,2,101,108,115,227,17,12,224,143,113,225,31,13,172,69,121,26,
+207,5,249,191,4,224,5,27,245,117,2,240,114,1,224,139,18,1,110,100,
+224,140,1,201,223,231,236,67,96,96,84,132,184,64,231,194,4,231,130,14,
+225,160,120,225,20,3,224,144,123,5,112,114,97,103,109,97,224,145,11,243,
+129,0,226,50,8,254,83,5,143,90,224,22,3,192,146,104,153,224,11,10,
+241,122,9,232,219,7,254,79,6,222,166,232,124,4,187,245,236,222,1,239,
+210,2,87,163,187,240,108,51,228,231,13,253,59,11,230,172,7,228,233,3,
+228,221,12,225,147,10,228,221,50,143,89,225,142,9,242,84,13,224,159,5,
+224,156,28,224,153,47,6,119,97,114,110,105,110,103,224,153,8,233,3,25,
+224,125,59,4,101,114,114,111,114,224,123,11,224,2,9,225,15,0,224,99,
+6,233,243,11,225,208,14,228,220,26,80,165,224,143,7,224,214,8,177,186,
+100,246,82,98,0,49,110,65,229,148,10,227,91,3,255,72,2,227,89,0,
+224,8,9,154,164,238,2,5,140,12,34,247,78,159,1,50,56,68,251,1,
+50,56,99,3,180,182,69,29,101,17,96,58,128,69,115,92,64,29,67,50,
+0,50,78,212,255,181,0,128,27,144,52,245,235,9,245,93,6,227,47,5,
+224,38,13,224,19,10,224,16,7,224,13,0,110,180,142,148,243,29,3,70,
+27,0,51,89,135,51,104,37,224,0,52,174,204,141,179,227,233,2,226,26,
+34,237,63,9,228,162,1,224,22,10,225,98,3,225,211,0,65,45,238,203,
+2,225,225,20,231,82,4,231,8,3,193,167,252,208,1,0,50,52,76,34,
+132,79,186,1,52,57,134,215,128,30,231,43,3,231,45,19,0,87,131,181,
+15,58,32,117,110,107,110,111,119,110,32,100,105,114,101,99,116,59,150,1,
+32,35,162,190,150,52,116,41,224,73,19,79,55,1,105,110,231,106,12,232,
+100,16,246,21,0,130,172,226,84,11,226,56,9,129,246,32,239,65,203,225,
+210,6,227,46,255,227,46,24,243,75,2,32,25,227,48,10,119,11,34,90,
+225,193,1,225,106,3,128,207,183,102,226,30,59,231,87,2,160,240,182,149,
+250,197,0,226,224,4,231,205,27,249,208,0,194,101,163,81,227,78,1,227,
+42,9,226,233,60,232,110,35,232,71,7,233,24,23,247,252,6,226,41,1,
+226,228,0,245,209,5,161,250,1,53,51,120,90,84,139,0,54,94,144,34,
+153,160,132,225,86,0,224,98,0,33,247,226,56,1,225,57,3,115,166,32,
+16,224,193,1,251,212,1,149,79,247,183,27,225,54,3,1,49,52,73,173,
+0,55,225,59,0,224,225,0,117,47,181,142,224,92,2,117,174,163,249,225,
+110,24,137,255,224,172,6,225,150,16,99,159,85,72,226,242,2,225,200,22,
+0,54,40,1,85,104,192,106,224,49,35,128,16,235,215,1,229,250,4,225,
+206,4,225,238,3,193,146,53,133,96,170,193,8,247,28,5,155,97,224,119,
+2,197,197,226,109,1,224,41,15,193,255,85,251,0,54,252,177,0,224,59,
+37,131,85,70,236,224,70,6,228,156,0,253,198,0,248,11,3,137,8,160,
+86,32,54,97,251,225,197,13,228,212,2,197,10,252,98,6,224,28,4,224,
+15,5,224,64,3,118,109,243,113,6,183,198,228,63,1,64,18,133,199,129,
+152,228,33,0,226,237,9,247,210,5,32,31,1,53,51,90,62,253,101,4,
+34,201,96,31,166,53,182,76,224,230,6,76,241,136,42,33,250,120,155,251,
+153,7,134,160,70,76,154,102,226,89,6,253,3,0,194,215,192,17,224,91,
+5,98,235,249,47,0,224,116,24,224,58,17,245,99,12,252,154,0,228,160,
+6,162,70,228,213,4,237,98,6,167,142,165,32,193,216,223,85,226,136,1,
+167,157,1,54,57,96,134,129,10,0,57,230,150,0,0,52,123,237,162,165,
+224,203,6,231,177,13,0,55,71,9,231,157,9,251,63,15,226,84,1,227,
+128,0,231,105,1,121,100,228,170,1,32,107,222,239,249,173,13,64,32,33,
+188,1,95,53,40,100,238,202,4,63,30,224,149,0,225,130,1,64,252,0,
+56,32,246,196,6,223,7,32,15,154,198,246,110,12,193,91,42,58,128,37,
+226,234,5,231,48,12,233,156,16,225,17,6,230,139,22,223,77,200,135,226,
+238,1,229,210,1,248,81,9,160,135,203,132,239,153,18,238,81,9,237,184,
+9,248,195,3,248,196,66,224,156,5,229,204,7,225,125,4,224,122,9,228,
+195,4,248,80,16,239,221,12,245,252,4,239,53,9,97,236,71,239,192,209,
+110,175,246,129,13,224,43,26,96,39,224,30,17,246,51,9,228,0,2,237,
+99,7,239,120,5,250,113,11,227,3,0,224,105,7,244,195,6,225,21,6,
+224,78,42,245,162,4,224,173,5,224,77,1,251,61,4,224,74,15,243,188,
+5,128,46,99,45,101,160,235,144,4,243,41,1,142,181,126,157,206,29,224,
+57,2,125,236,128,34,157,40,253,244,1,36,23,229,124,0,97,103,128,101,
+64,34,253,199,0,128,34,200,213,232,229,10,245,105,109,224,224,3,113,79,
+225,110,0,229,213,1,224,234,11,225,12,24,161,104,196,90,231,24,0,227,
+190,3,234,212,6,233,119,39,65,37,68,175,237,29,4,228,239,6,232,203,
+0,195,214,194,72,254,255,2,201,1,224,240,19,230,226,1,137,81,224,223,
+7,226,153,3,133,150,229,57,3,226,15,0,198,120,192,85,232,12,12,231,
+243,13,238,141,10,245,246,5,226,190,1,231,185,2,231,137,38,231,109,29,
+230,79,9,231,107,85,231,73,0,231,74,10,231,71,11,231,70,5,161,30,
+241,170,0,71,58,225,0,27,224,239,19,231,63,5,231,56,3,129,213,32,
+175,238,167,2,29,51,52,38,99,112,112,104,115,115,114,99,47,109,97,108,
+99,111,108,109,45,119,97,108,108,97,99,101,45,117,110,49,227,3,114,115,
+101,47,96,33,30,45,49,46,50,48,46,57,47,76,97,110,103,117,97,103,
+101,47,80,114,101,112,114,111,99,101,115,115,111,114,47,67,64,34,64,5,
+0,73,69,227,2,46,104,115,64,89,4,44,54,56,58,53,131,238,0,58,
+96,145,1,10,65,140,0,215,158,235,212,0,131,177,33,76,110,131,226,140,
+2,194,142,32,63,32,7,32,63,0,80,83,46,98,177,164,11,231,135,3,
+97,151,139,128,66,188,201,170,160,15,1,35,57,65,20,192,12,96,43,233,
+204,0,32,95,32,8,96,159,239,63,4,33,147,65,187,131,237,164,163,65,
+69,107,223,0,58,98,189,32,52,0,85,32,205,224,1,7,225,183,3,32,
+40,32,178,96,93,99,0,65,225,1,54,48,33,236,0,73,197,156,212,155,
+72,121,64,192,66,59,0,54,32,175,139,246,171,252,32,17,110,244,33,29,
+96,53,0,79,65,59,33,16,0,54,98,131,240,143,23,0,35,159,124,165,
+127,208,198,44,111,65,9,160,173,96,6,97,155,132,140,128,171,128,204,64,
+3,98,156,96,180,226,74,12,97,244,2,48,58,48,161,243,109,19,32,245,
+32,160,0,53,224,41,2,3,112,114,101,68,96,138,0,100,64,39,32,37,
+32,189,32,37,71,51,65,123,98,4,45,22,35,123,97,251,96,4,138,185,
+32,43,32,21,97,112,4,75,50,32,75,52,225,106,6,32,30,33,25,128,
+30,0,51,192,30,160,28,32,27,32,237,161,130,133,10,230,107,1,227,87,
+1,168,122,233,191,17,233,220,21,224,29,13,233,129,3,224,33,16,248,229,
+4,224,37,19,249,14,5,224,41,22,249,59,6,224,45,25,250,135,7,224,
+49,28,252,80,8,239,107,13,247,79,11,251,28,4,244,239,11,224,103,19,
+224,40,19,250,53,12,225,78,55,224,41,44,235,138,3,236,142,1,244,188,
+7,224,5,9,236,9,0,250,100,11,0,89,252,82,21,224,32,4,224,172,
+14,230,177,1,250,206,26,224,155,2,233,92,1,192,5,253,245,8,160,222,
+230,226,1,253,248,15,226,17,8,236,170,17,128,132,2,67,32,60,36,23,
+237,111,3,224,67,9,236,244,5,224,203,12,128,70,238,222,1,224,37,6,
+148,224,236,131,5,236,51,2,238,96,18,238,110,10,230,162,9,200,9,0,
+85,82,74,105,171,102,146,82,24,232,37,1,234,133,11,240,243,0,69,245,
+0,54,104,186,235,47,0,225,50,9,224,197,0,224,25,4,0,82,224,198,
+0,227,144,7,239,95,10,161,229,224,195,5,0,52,243,175,5,255,129,6,
+239,160,10,239,45,5,106,68,224,232,22,192,234,150,77,230,215,16,0,32,
+166,205,225,19,16,225,151,7,235,81,1,65,123,182,86,135,241,252,5,2,
+226,131,18,238,74,17,254,44,9,226,104,1,233,129,2,240,77,13,3,67,
+32,61,61,224,39,17,193,200,225,178,8,229,61,0,224,81,1,252,118,0,
+226,132,5,194,169,235,57,4,245,102,0,116,232,225,4,4,192,106,240,168,
+8,192,36,64,61,76,78,39,175,162,14,226,147,12,228,163,20,226,166,7,
+224,43,21,194,184,239,185,10,225,151,9,241,68,11,226,206,14,235,205,1,
+241,116,7,253,192,12,242,2,25,250,86,14,227,193,5,233,246,2,130,140,
+65,58,193,59,225,66,8,229,80,11,224,239,47,227,127,2,224,239,27,194,
+102,227,196,6,228,3,1,236,212,8,226,149,0,228,199,29,67,133,227,210,
+14,244,121,10,224,248,120,224,68,2,224,248,54,65,227,224,248,17,233,55,
+19,224,199,3,238,82,11,241,41,1,252,68,7,224,73,16,224,70,27,232,
+181,2,224,65,7,224,62,4,224,53,2,228,104,6,229,123,1,98,238,228,
+116,10,230,16,15,227,61,6,224,88,5,247,238,2,36,77,90,28,81,32,
+32,5,98,165,0,67,77,41,247,210,2,224,100,71,110,19,224,100,5,212,
+214,224,100,26,225,57,2,235,52,1,230,253,2,224,88,5,229,100,17,234,
+126,9,225,172,0,251,247,2,234,88,1,247,138,7,155,212,109,129,145,229,
+128,96,237,65,0,237,36,16,192,64,161,30,166,77,251,54,8,223,180,232,
+238,0,165,119,224,96,0,240,155,85,7,84,111,107,101,110,105,115,101,208,
+155,5,50,49,53,58,49,51,245,137,7,235,67,17,230,149,15,235,103,4,
+236,21,16,235,107,12,224,83,14,235,110,39,235,111,10,235,114,74,222,191,
+247,79,13,235,189,255,235,189,255,235,189,115,226,80,48,151,201,226,80,21,
+224,86,6,235,126,8,252,63,3,232,74,23,0,49,91,75,226,170,10,221,
+60,225,138,24,227,72,1,246,11,10,107,215,216,60,1,54,55,32,43,247,
+229,12,225,156,15,1,45,123,232,142,8,224,251,13,251,67,6,233,142,13,
+194,130,103,49,247,110,6,235,126,2,226,145,22,233,145,14,225,6,7,225,
+69,37,1,49,50,224,63,1,226,209,55,1,125,45,226,209,22,226,211,3,
+234,45,0,229,69,13,227,201,26,224,248,11,227,201,33,224,248,3,226,63,
+31,252,53,7,225,11,31,243,127,2,243,1,1,250,225,3,104,47,129,93,
+96,107,234,26,7,229,229,80,188,45,229,229,12,234,188,16,0,55,102,123,
+224,161,5,229,246,46,224,222,15,255,24,2,240,115,18,231,104,21,240,78,
+2,163,191,232,17,2,240,68,2,229,29,28,237,240,2,225,136,24,226,220,
+2,231,225,10,226,223,31,208,88,226,223,14,246,73,8,255,213,13,192,195,
+251,193,4,224,90,10,201,162,129,34,155,71,224,50,2,227,39,22,122,138,
+0,54,127,155,124,205,130,24,250,119,2,227,103,26,224,63,0,224,54,2,
+224,65,8,225,80,10,253,13,6,255,39,2,224,194,10,227,136,36,98,184,
+226,230,25,255,21,5,130,238,128,39,224,60,6,229,18,21,242,234,217,242,
+236,9,224,46,18,242,239,5,228,30,9,242,242,214,245,79,12,231,36,104,
+224,62,2,242,205,30,38,26,233,69,2,231,4,4,224,213,65,234,58,13,
+224,214,83,0,53,137,168,234,32,17,242,139,12,244,167,226,243,65,9,244,
+171,225,240,247,7,232,174,16,228,239,13,166,174,228,92,4,237,140,2,236,
+3,7,227,49,44,0,51,234,74,1,227,48,43,224,62,2,233,232,33,225,
+48,1,1,39,39,225,48,5,224,207,78,0,83,226,99,12,2,66,32,90,
+229,213,15,224,230,7,232,104,3,227,21,30,0,55,48,250,64,139,0,79,
+128,7,244,169,0,225,184,104,135,194,237,246,11,224,199,0,225,211,16,245,
+176,67,0,66,53,176,128,91,117,186,225,23,9,245,195,30,227,70,60,252,
+213,5,224,95,21,248,86,2,244,83,13,248,89,11,172,88,248,167,255,248,
+167,166,249,12,200,229,156,33,227,151,9,228,240,34,64,229,64,64,32,7,
+228,240,6,249,136,255,249,136,32,4,57,52,58,49,49,231,29,1,236,21,
+5,228,234,11,249,113,1,237,57,15,249,100,4,249,101,15,249,136,21,129,
+44,249,220,4,237,169,17,250,3,5,250,4,19,228,223,1,224,162,26,225,
+201,2,249,254,3,250,10,19,235,131,27,245,183,12,230,9,17,224,156,14,
+242,104,4,240,158,3,230,18,6,250,43,12,251,5,26,250,124,16,242,203,
+7,245,165,4,224,106,19,224,97,20,234,110,3,239,105,10,100,122,3,67,
+32,61,61,224,42,20,249,180,15,243,14,3,240,217,9,240,215,6,240,213,
+8,249,202,96,0,39,48,229,246,178,20,242,106,6,178,198,245,195,18,249,
+156,9,225,240,15,241,23,3,226,59,2,252,182,2,245,210,11,234,210,9,
+248,130,1,224,102,8,229,47,0,224,28,11,235,33,0,237,157,10,98,104,
+232,93,0,245,164,10,230,173,0,235,76,17,228,21,10,225,247,8,193,68,
+202,194,162,43,231,105,1,133,209,241,64,2,118,135,225,172,0,184,156,229,
+210,2,229,211,1,247,40,15,226,139,64,245,172,22,248,140,24,242,145,1,
+228,194,0,209,78,224,224,19,246,7,6,253,207,55,161,80,253,207,3,234,
+4,1,246,252,255,246,252,241,231,93,1,96,42,229,46,9,246,97,13,228,
+250,13,228,60,1,167,164,227,139,13,249,148,8,249,171,26,249,248,2,226,
+174,24,240,31,8,224,134,4,227,65,11,247,117,60,230,114,21,247,77,30,
+247,79,10,243,134,13,232,139,15,233,65,3,225,145,10,233,54,21,227,141,
+16,231,209,50,231,146,1,231,209,44,227,42,1,229,67,3,181,187,253,166,
+2,230,21,13,232,37,23,255,94,43,232,100,13,133,214,254,53,10,245,86,
+9,253,3,3,232,14,1,199,16,232,21,14,232,18,13,232,15,17,231,242,
+12,138,85,231,248,10,226,39,5,231,249,38,230,162,5,231,225,2,231,246,
+3,227,236,6,225,92,1,128,148,249,66,13,128,56,99,100,225,91,2,46,
+166,70,230,225,241,2,232,20,4,235,22,9,241,182,5,232,226,2,226,226,
+19,129,37,232,55,129,228,82,4,225,22,29,224,241,10,228,48,3,227,212,
+8,231,115,17,232,102,16,231,183,38,247,16,14,246,171,34,225,19,40,241,
+18,6,224,63,41,241,17,9,226,186,5,224,182,3,224,202,0,98,61,192,
+212,230,37,0,224,16,0,1,54,55,169,255,229,218,0,2,95,54,57,102,
+227,146,30,227,110,3,230,79,17,225,50,5,238,45,10,228,14,0,241,190,
+5,239,138,6,224,5,1,244,113,0,226,184,13,242,203,5,231,32,20,244,
+23,35,227,189,2,254,49,17,245,226,25,245,224,11,245,69,5,239,185,12,
+237,93,2,224,61,20,211,243,245,130,78,229,33,12,229,30,4,244,158,33,
+224,76,71,234,34,22,160,217,128,204,224,60,6,242,63,16,224,246,10,244,
+67,2,172,189,128,98,237,242,14,230,241,7,238,142,25,244,70,11,242,221,
+14,233,27,11,128,44,244,100,126,36,163,2,58,49,50,232,90,4,108,182,
+229,101,1,1,50,50,97,165,233,33,5,196,140,196,98,0,73,129,240,0,
+83,165,110,224,51,20,100,183,32,20,228,158,0,32,35,64,7,32,114,32,
+56,64,24,1,52,54,33,19,34,78,0,50,53,231,172,165,225,16,1,1,
+95,96,160,173,224,47,3,32,34,224,47,15,0,39,224,48,0,224,33,15,
+7,40,41,44,91,93,59,123,125,128,38,224,37,15,3,32,92,57,38,224,
+33,21,22,58,33,35,36,37,38,42,43,46,47,60,61,62,63,64,92,57,
+50,38,94,124,45,126,192,52,193,28,230,250,2,83,58,224,20,4,83,207,
+143,96,128,11,231,34,0,1,58,54,65,44,1,10,65,162,244,199,100,231,
+41,1,244,90,0,0,95,79,169,162,112,35,100,1,49,56,138,103,229,186,
+11,225,231,20,224,215,1,3,108,105,110,101,226,33,0,224,71,50,5,112,
+114,97,103,109,97,224,73,0,232,80,0,128,208,224,68,30,2,100,101,102,
+224,142,1,132,83,193,67,224,52,17,1,117,110,32,54,128,51,193,16,135,
+80,0,56,68,24,33,49,65,40,227,118,83,4,72,97,115,104,68,96,185,
+195,120,3,56,56,58,53,96,145,0,90,64,191,1,54,55,32,186,108,139,
+228,160,7,160,163,242,242,4,1,95,50,40,141,2,95,54,56,34,17,32,
+30,97,239,162,9,97,252,193,249,224,208,102,0,57,160,208,233,203,3,232,
+38,2,239,50,4,233,159,7,225,186,7,41,48,0,52,234,132,4,238,170,
+0,130,222,225,10,0,120,97,236,122,2,64,7,76,47,136,255,103,22,129,
+69,1,53,51,233,144,3,225,23,1,16,105,110,99,111,109,112,108,101,116,
+101,32,109,97,99,114,111,32,98,96,8,105,116,105,111,110,58,92,49,48,
+163,242,224,68,22,2,32,32,35,130,151,205,164,64,220,96,46,100,245,224,
+54,5,224,219,4,37,4,0,48,224,28,7,234,41,8,253,252,6,241,217,
+6,227,58,22,224,81,9,235,199,8,227,202,31,64,74,36,166,224,74,0,
+226,144,1,161,148,64,65,240,206,6,228,47,9,228,169,0,161,38,1,54,
+56,72,52,198,12,244,36,0,0,95,138,200,187,241,130,228,200,45,102,110,
+232,48,0,163,13,55,88,227,13,0,163,59,160,25,111,83,96,5,0,54,
+165,13,192,31,43,63,2,95,53,56,140,65,132,76,232,46,0,102,167,171,
+67,128,8,0,53,32,4,0,56,33,202,1,50,57,96,48,235,94,5,128,
+147,64,40,32,39,96,7,0,53,32,145,244,96,6,133,204,32,69,235,129,
+0,195,224,97,7,32,86,226,101,19,0,35,229,64,3,224,68,2,224,67,
+4,226,114,12,224,67,2,229,204,1,224,65,2,64,187,96,191,219,180,230,
+62,1,169,157,227,210,12,238,185,8,226,48,10,0,51,33,13,234,81,7,
+196,11,236,114,3,236,8,2,234,229,2,32,200,65,208,199,113,96,95,224,
+33,1,130,103,74,73,225,80,1,235,95,3,254,84,5,224,167,18,225,31,
+2,0,35,230,159,1,254,165,8,228,209,19,242,35,7,224,98,28,192,59,
+176,226,229,226,1,141,16,225,6,8,160,245,64,12,226,138,6,224,12,2,
+236,164,4,224,53,0,245,252,2,225,74,4,225,73,8,225,97,14,36,166,
+228,145,2,0,89,96,181,227,43,1,229,207,2,224,138,6,40,184,34,250,
+40,184,106,224,32,13,32,71,32,13,0,75,128,13,64,109,96,13,0,65,
+96,13,32,75,32,13,32,132,37,19,64,54,224,4,1,32,28,35,185,64,
+28,0,50,37,60,0,75,75,230,32,1,0,80,32,9,3,95,54,49,50,
+230,231,2,38,170,70,210,8,109,101,110,116,44,32,97,116,32,230,247,88,
+3,50,53,58,54,129,208,224,139,131,2,64,75,50,224,141,131,0,90,140,
+249,97,217,96,157,0,52,224,157,131,66,93,35,82,226,93,13,69,81,97,
+218,134,38,64,28,137,174,96,12,218,19,192,216,96,18,141,229,224,26,1,
+248,117,0,32,103,37,14,99,12,120,91,224,4,1,151,174,32,31,32,100,
+32,31,224,29,6,224,34,5,32,144,227,8,26,69,232,5,98,114,101,97,
+107,115,227,7,120,224,138,113,34,120,193,172,97,67,193,167,217,219,225,156,
+0,33,86,141,95,249,247,2,224,10,30,251,183,4,214,171,32,79,132,246,
+192,44,224,7,11,224,70,2,224,59,2,32,58,133,35,225,255,3,224,60,
+5,128,41,0,58,96,217,98,77,0,90,121,239,32,16,133,65,71,186,0,
+35,72,156,32,21,32,20,133,57,32,18,34,57,39,230,32,17,130,237,96,
+38,66,213,128,38,130,154,65,189,70,176,32,16,130,139,162,171,160,96,130,
+124,224,144,11,32,28,225,66,1,32,88,97,88,32,24,32,23,129,10,32,
+19,32,98,128,128,128,225,32,17,32,8,96,17,82,11,128,17,32,155,128,
+17,128,203,113,155,234,66,1,112,157,145,126,50,64,73,106,0,53,38,54,
+1,95,53,38,112,2,95,54,48,32,15,245,130,3,193,41,144,97,32,82,
+129,9,239,59,0,224,65,15,32,62,73,189,64,118,74,121,70,213,53,191,
+199,51,32,27,138,101,96,86,32,85,193,77,201,59,238,215,4,158,5,96,
+8,153,60,32,116,111,218,233,0,6,200,92,248,87,8,236,223,0,66,174,
+42,87,196,105,224,60,6,246,54,2,107,20,202,232,96,195,64,230,32,174,
+0,51,40,141,231,224,4,128,54,32,31,167,174,243,162,2,96,89,192,70,
+224,44,2,165,200,192,49,64,255,130,56,226,19,3,194,206,32,28,228,208,
+2,98,102,64,252,160,45,107,86,0,51,32,206,32,102,210,2,128,118,225,
+125,6,233,81,1,225,125,1,96,37,32,53,225,255,10,64,101,194,138,209,
+47,1,95,53,77,116,2,95,54,51,97,123,201,173,116,184,238,43,32,23,
+67,97,110,110,111,116,32,101,120,112,97,110,100,32,35,105,102,32,100,105,
+114,101,99,116,36,177,6,32,105,110,32,102,105,108,238,0,4,206,2,1,
+95,49,32,122,41,23,139,252,224,93,16,110,110,0,32,32,0,234,30,1,
+224,166,1,32,75,64,67,97,116,97,238,97,153,64,183,0,53,64,23,67,
+235,32,5,44,161,225,82,1,201,130,128,222,33,135,0,95,78,7,224,227,
+23,12,87,97,114,110,105,110,103,58,32,116,114,97,105,37,184,8,103,32,
+99,104,97,114,97,99,116,37,148,2,32,97,102,32,6,64,248,239,21,29,
+143,80,97,46,0,115,47,79,225,35,59,253,5,4,113,250,65,215,2,95,
+54,53,98,27,225,214,52,1,112,97,38,118,225,213,91,227,184,3,225,213,
+24,64,20,171,240,225,222,11,35,136,132,14,225,229,113,225,45,68,225,223,
+4,35,247,193,29,163,213,134,72,225,5,1,96,8,207,95,224,81,12,1,
+47,47,206,237,111,191,129,53,32,73,134,128,38,37,66,65,68,70,1,54,
+53,143,66,224,17,1,0,51,33,128,1,95,53,96,89,32,187,128,19,1,
+53,53,33,97,0,53,32,198,224,97,1,1,124,124,192,97,45,86,0,53,
+39,90,1,95,53,101,224,128,43,162,153,225,161,0,86,55,64,86,191,254,
+33,213,64,227,86,198,96,151,64,45,224,151,7,130,18,224,151,40,0,38,
+178,187,224,151,15,240,62,1,224,151,16,142,118,96,151,173,154,1,51,49,
+64,103,96,123,224,10,13,224,145,9,80,4,216,3,88,243,192,32,224,150,
+7,96,232,96,233,224,135,0,129,229,224,54,5,1,54,53,37,228,225,15,
+4,0,54,96,165,167,244,224,38,4,241,232,0,224,218,3,139,71,224,83,
+9,247,140,1,0,52,120,85,0,49,55,135,2,95,52,51,96,170,1,48,
+48,104,169,194,147,128,53,0,49,134,75,224,17,3,128,116,102,164,64,92,
+224,221,0,194,6,33,72,174,198,225,72,24,225,94,31,225,240,1,1,62,
+61,214,226,224,144,0,1,52,49,34,244,0,52,128,167,225,155,14,71,41,
+193,155,224,200,1,35,31,224,55,0,224,117,21,0,60,224,117,9,39,204,
+224,60,20,64,117,245,1,1,224,55,1,72,221,224,116,29,0,61,224,116,
+9,225,185,1,224,61,24,0,33,224,61,9,105,223,192,61,33,165,174,14,
+225,121,2,226,45,3,32,38,69,151,224,29,1,226,144,7,68,101,226,144,
+38,227,126,5,98,63,128,50,32,141,137,96,227,102,24,0,52,227,102,2,
+224,217,0,73,24,98,197,225,139,16,0,52,243,162,0,226,220,4,32,128,
+192,55,32,130,137,198,225,16,14,37,130,225,16,22,70,202,225,16,8,97,
+109,225,16,37,64,50,32,141,175,2,228,130,34,0,52,226,230,11,130,229,
+225,27,20,32,16,224,54,9,118,86,96,230,224,56,16,64,85,225,84,9,
+0,50,34,225,192,56,32,198,138,164,32,22,0,49,85,107,132,118,128,143,
+1,95,54,136,214,64,42,32,11,96,251,96,11,0,49,39,15,224,11,1,
+72,17,160,35,40,49,68,168,81,246,96,17,109,67,64,9,107,6,1,83,
+32,85,223,238,76,0,32,109,73,25,227,18,1,7,73,110,116,101,103,101,
+114,58,39,205,1,118,105,105,172,3,98,121,32,48,232,0,0,206,136,108,
+195,148,178,0,85,154,99,70,55,0,57,255,199,1,224,17,9,198,98,238,
+46,3,216,41,248,215,0,180,67,248,232,1,250,211,2,184,244,191,75,255,
+71,1,116,105,197,178,78,98,251,64,2,213,58,32,51,33,61,107,29,0,
+54,130,73,214,16,189,67,32,22,32,164,0,85,84,127,96,35,134,239,233,
+161,2,110,105,64,5,160,71,184,38,154,99,136,219,0,85,223,186,96,56,
+32,39,64,252,88,5,104,117,249,9,0,161,243,136,120,128,212,64,69,2,
+95,52,48,127,72,0,51,32,122,0,58,96,59,253,229,3,186,227,214,97,
+238,80,6,64,63,0,67,34,109,247,97,0,247,81,5,141,174,240,163,0,
+236,77,3,193,99,160,98,118,23,98,157,1,50,48,165,65,129,30,143,69,
+96,28,73,191,192,28,96,252,68,89,110,77,82,228,32,29,96,11,0,95,
+185,97,35,145,150,50,185,38,130,13,32,224,208,161,143,200,254,202,4,174,
+197,207,11,224,7,2,65,231,0,52,119,81,0,52,37,168,225,224,0,32,
+255,33,110,136,61,96,6,193,158,96,26,78,96,64,21,64,59,35,23,64,
+59,186,70,142,124,96,49,96,28,194,55,174,230,128,46,96,26,186,200,251,
+39,1,226,147,0,188,121,239,174,5,243,247,1,64,69,95,200,32,182,192,
+93,252,248,0,183,150,224,253,1,33,128,151,156,251,80,1,203,197,128,95,
+160,163,128,220,160,12,65,117,128,37,64,253,98,110,155,23,224,197,16,64,
+39,64,48,192,243,225,16,3,138,1,227,188,0,204,120,65,62,64,74,37,
+182,96,8,240,66,1,98,225,113,228,99,118,32,28,34,135,131,65,162,141,
+224,78,4,224,13,4,34,6,210,147,228,135,6,7,108,97,115,116,58,32,
+91,93,100,121,129,41,38,13,82,224,227,156,0,32,60,167,157,224,81,1,
37,112,165,223,32,29,135,45,129,95,133,23,120,107,64,250,32,23,99,235,
-32,13,240,134,1,70,110,196,121,227,50,1,114,57,139,27,2,56,49,32,
-66,207,2,56,57,32,98,215,96,14,32,65,133,189,242,154,1,32,138,32,
-122,128,93,133,119,224,27,7,128,135,132,1,36,53,2,51,32,90,96,1,
-161,47,32,26,227,253,0,206,8,35,86,2,51,54,57,128,160,132,179,98,
-60,250,229,0,162,65,250,223,6,109,14,2,35,52,56,195,17,187,10,255,
-117,7,128,38,2,49,50,48,167,117,2,95,51,49,71,100,167,16,194,126,
-224,50,10,224,89,0,154,185,224,89,16,72,23,192,89,93,137,224,89,1,
-128,19,203,96,98,31,135,61,2,48,49,32,195,27,2,82,32,95,235,120,
-1,84,225,129,39,33,38,218,39,81,243,98,200,131,223,98,231,32,11,70,
-124,99,118,151,28,32,148,2,55,57,32,170,89,164,64,32,6,140,116,192,
-13,65,99,103,50,64,143,226,92,8,190,245,2,58,53,48,226,122,5,32,
-123,224,29,4,169,168,231,4,7,32,25,169,63,59,12,199,231,32,233,224,
-147,1,132,218,126,162,2,48,52,32,64,5,64,214,37,65,192,34,61,171,
-160,10,32,76,243,66,2,141,33,128,65,32,25,162,147,165,45,32,16,246,
-133,1,160,42,192,27,64,28,130,137,103,212,230,93,6,245,117,0,230,133,
-0,101,209,65,37,236,229,0,168,12,223,53,141,13,68,91,96,38,97,169,
-64,104,227,7,4,253,69,1,105,243,133,32,96,150,245,225,1,227,52,1,
-83,172,32,31,97,169,2,52,57,57,135,163,70,131,32,89,130,3,188,71,
-64,19,252,99,0,96,41,252,85,0,96,62,99,111,131,108,227,114,4,32,
-163,96,126,97,154,108,63,128,113,65,179,97,166,225,102,6,96,31,32,25,
-193,102,97,36,168,203,231,115,0,253,164,1,204,149,71,225,138,9,67,27,
-53,192,136,175,128,126,129,161,66,221,229,48,4,32,25,168,42,129,102,233,
-185,1,233,98,10,248,42,3,233,234,9,224,48,20,193,253,255,48,3,233,
-144,0,232,47,3,101,16,224,237,15,64,197,229,34,0,102,114,43,21,168,
-1,99,189,129,112,160,62,160,110,255,78,12,255,2,3,246,206,0,151,198,
-224,117,21,224,115,5,224,113,5,224,51,18,209,6,233,163,1,100,70,193,
-248,2,52,48,51,64,84,237,187,0,58,218,82,100,114,211,2,50,48,57,
-116,129,71,28,100,165,37,181,67,223,75,251,202,139,66,59,68,52,224,157,
-5,32,99,130,191,244,177,4,65,2,234,208,9,233,224,1,193,189,248,97,
-2,97,69,137,165,233,193,5,201,135,131,74,102,81,103,195,233,201,4,233,
-172,0,161,117,233,210,1,233,211,4,128,176,249,59,3,167,92,226,221,2,
-133,12,64,6,90,59,97,94,163,84,69,128,68,83,66,136,68,35,196,63,
-64,15,64,9,241,71,1,68,227,128,77,32,64,199,197,200,239,133,215,32,
-24,131,174,98,229,129,220,136,35,226,210,4,128,113,229,165,2,232,141,7,
-96,98,131,223,100,221,154,81,162,152,137,197,229,11,0,194,181,235,130,10,
-162,80,192,86,194,40,170,47,131,79,128,8,165,21,201,155,128,243,232,94,
-0,224,64,1,161,145,224,25,3,96,190,105,179,245,10,0,237,64,1,224,
-174,12,224,124,7,229,148,1,224,127,22,224,101,3,224,130,8,224,156,5,
-225,91,4,192,247,97,102,2,51,32,102,233,207,0,93,143,2,46,47,108,
-2,105,98,47,2,68,97,116,2,97,47,73,142,102,221,168,2,49,50,55,
-2,58,49,34,132,237,65,227,66,49,2,52,56,51,163,39,32,19,133,27,
-193,118,2,83,32,83,134,155,232,241,0,129,182,232,247,0,67,52,147,183,
-104,3,243,182,2,160,53,203,105,198,179,99,79,196,42,192,7,34,152,66,
-125,2,75,50,32,224,204,37,2,54,51,58,222,118,138,80,233,156,2,226,
-47,0,227,177,3,174,118,227,162,2,32,251,206,78,229,170,0,163,107,2,
-52,56,50,98,69,197,191,204,232,224,80,10,236,130,1,224,80,3,141,148,
-183,0,96,24,254,238,0,33,88,68,120,252,93,0,97,52,142,159,228,48,
-11,228,105,13,160,47,236,36,4,224,61,11,108,51,228,108,4,224,79,11,
-228,154,18,252,199,3,32,200,200,98,208,150,230,238,21,166,0,97,10,72,
-72,107,205,216,83,64,17,128,8,2,51,32,67,240,89,9,174,202,32,51,
-229,11,0,34,122,172,58,253,167,1,65,142,151,209,225,83,3,238,0,4,
-168,30,224,99,4,227,214,0,2,89,32,67,224,82,2,226,237,0,226,183,
-3,101,65,232,197,0,235,127,1,80,168,230,30,2,239,80,0,104,193,97,
-92,254,65,5,232,179,17,192,146,152,11,237,162,4,2,116,87,46,2,99,
-109,112,162,233,207,222,128,6,174,22,128,5,2,58,52,55,166,5,2,52,
-55,55,227,211,0,68,41,227,211,2,164,180,194,108,231,0,6,162,239,231,
-2,8,227,73,15,141,58,64,223,130,244,242,131,1,101,2,108,24,200,148,
-227,161,45,224,91,1,227,161,9,224,95,4,227,161,31,224,80,2,177,54,
-162,216,64,24,227,161,1,227,140,38,129,208,227,51,2,224,10,1,32,89,
-134,248,34,212,32,11,133,118,245,189,9,245,80,11,2,52,54,57,101,96,
-244,207,0,251,112,0,226,137,0,250,167,3,38,28,32,4,64,50,2,51,
-56,52,64,234,130,34,250,112,0,249,253,2,210,111,2,51,57,52,160,51,
-157,6,35,140,2,51,55,50,140,117,131,131,191,193,176,160,192,108,64,23,
-111,49,224,90,59,33,21,230,120,0,224,209,4,142,157,231,96,4,178,156,
-98,178,2,50,50,54,32,19,227,41,1,2,100,101,102,2,105,110,101,2,
-100,34,32,196,199,164,28,225,104,2,246,255,1,224,100,1,122,58,251,28,
-6,2,52,49,55,225,75,0,225,86,5,98,216,71,164,111,148,253,3,12,
-2,44,41,34,199,157,246,219,4,32,228,226,119,0,64,137,64,237,147,244,
-247,120,0,128,16,80,140,2,95,51,51,94,92,33,49,247,148,0,206,31,
-127,131,193,62,2,90,32,80,64,33,32,191,2,51,55,53,132,78,224,49,
-1,96,0,79,215,163,57,225,16,10,224,18,10,225,32,6,240,40,2,131,
-242,112,120,245,5,0,225,78,7,64,137,138,64,65,88,224,70,12,64,194,
-96,34,224,171,7,224,93,9,224,189,7,241,128,13,98,9,225,139,12,226,
-19,5,241,156,0,228,41,0,117,210,235,99,0,96,124,233,194,0,89,168,
-2,64,83,32,182,250,32,94,184,5,160,179,65,210,146,100,249,61,7,235,
-180,3,245,109,0,32,105,32,42,64,45,104,233,224,69,12,2,64,75,51,
-224,26,6,243,222,1,2,75,52,32,224,26,15,234,5,11,2,99,112,112,
-2,104,115,115,2,114,99,47,2,109,97,108,2,99,111,108,2,109,45,119,
-2,97,108,108,2,97,99,101,2,45,117,110,2,105,118,101,2,114,115,101,
-2,47,99,112,32,33,2,45,49,46,2,50,48,46,2,57,47,76,2,97,
-110,103,2,117,97,103,2,101,47,80,2,114,101,112,2,114,111,99,2,101,
-115,115,2,111,114,47,2,67,112,112,2,104,115,47,32,5,2,73,102,100,
-2,101,102,46,169,121,2,50,51,56,2,58,49,50,161,82,231,21,0,240,
-81,4,246,93,1,160,13,64,10,225,83,0,103,101,33,85,65,215,225,9,
-15,225,80,7,182,8,239,40,0,247,82,2,246,210,2,225,100,1,239,164,
-5,224,111,38,64,214,64,1,67,140,197,141,117,180,82,87,46,146,132,198,
-192,48,227,212,0,224,113,3,237,28,0,136,128,224,69,0,165,51,115,7,
-162,33,32,14,93,159,237,169,0,224,89,10,225,226,104,2,52,53,58,225,
-226,0,37,159,234,189,1,87,135,247,132,2,167,37,110,87,227,166,1,249,
-20,7,132,228,250,98,0,224,21,6,237,36,0,129,86,184,89,64,118,240,
-24,1,242,19,0,40,250,91,101,32,28,216,217,128,24,234,5,0,63,132,
-33,213,65,238,32,39,165,166,225,55,1,2,39,96,95,128,213,32,64,180,
-121,2,51,54,52,138,200,2,51,54,53,164,108,2,95,50,53,149,4,34,
-2,64,23,32,145,224,66,1,2,69,120,112,2,101,99,116,2,101,100,32,
-2,101,110,100,2,32,111,102,2,32,105,110,2,112,117,116,2,32,40,69,
-2,79,70,41,196,102,2,58,52,54,137,138,251,137,3,67,26,68,110,32,
-28,211,34,226,43,3,186,222,228,197,12,2,35,108,105,2,110,101,32,252,
-30,0,138,209,111,219,48,251,32,49,165,182,224,64,7,93,23,253,135,2,
-96,43,35,128,32,33,251,37,1,32,141,136,248,80,31,64,251,194,148,131,
-194,138,213,246,104,5,2,64,35,51,177,23,155,20,34,190,83,198,193,255,
-193,193,160,26,149,179,64,49,162,205,2,89,32,66,226,71,1,162,41,229,
-210,1,74,26,224,92,1,224,10,0,247,24,13,217,104,136,23,248,66,0,
-247,30,14,174,154,171,212,96,153,128,172,224,26,0,224,108,1,205,90,64,
-202,172,168,226,223,2,203,237,243,193,0,248,18,14,192,87,224,204,6,224,
-159,13,129,84,251,82,1,224,124,3,111,37,225,75,10,194,14,240,150,2,
-161,183,224,134,10,208,197,220,102,224,107,21,225,210,3,226,42,0,138,201,
-2,65,32,58,96,139,117,244,32,10,214,244,221,57,128,235,200,174,224,144,
-10,51,182,244,240,2,225,6,5,101,10,253,201,0,253,209,1,221,68,224,
-237,1,231,169,0,234,13,2,187,148,32,191,175,120,45,128,238,59,1,233,
-59,1,64,5,229,160,0,134,53,96,56,32,48,132,116,32,196,233,25,38,
-132,197,224,32,3,102,50,90,183,235,37,10,105,231,234,101,0,160,145,234,
-47,19,235,107,0,233,52,6,224,145,16,224,48,12,233,78,2,232,154,1,
-177,169,191,121,233,0,6,97,22,245,0,3,218,129,161,139,231,119,6,124,
-59,2,52,52,54,193,180,231,12,6,64,146,65,97,167,68,224,217,0,197,
-36,224,7,11,253,96,0,97,211,231,52,14,231,37,107,2,51,55,55,231,
-37,0,34,56,134,144,249,124,5,225,95,7,225,104,3,193,160,225,137,2,
-128,47,240,209,2,163,157,80,41,145,234,207,170,78,110,129,71,64,64,113,
-228,96,33,44,20,144,112,254,48,1,224,69,0,224,60,14,176,68,176,183,
-100,26,230,142,21,2,109,97,99,2,114,111,32,166,142,194,26,166,145,129,
-250,224,63,21,2,32,101,120,167,66,237,171,0,224,48,0,96,73,230,213,
-1,224,169,6,230,228,10,224,86,2,2,97,114,103,2,117,109,101,2,110,
-116,115,2,44,32,98,39,146,2,119,97,115,2,32,103,105,2,118,101,110,
-160,102,224,89,5,160,244,194,55,228,101,3,169,179,2,50,54,54,249,47,
-1,86,242,215,0,234,124,3,251,180,1,246,163,1,2,51,53,51,224,161,
-3,145,25,96,96,66,182,2,53,54,32,228,172,0,108,242,133,30,2,52,
-49,57,106,164,2,51,49,32,199,102,165,183,99,129,195,5,100,146,65,12,
-117,79,240,15,4,96,39,224,97,9,65,60,96,124,121,77,121,27,129,76,
-165,246,133,141,69,70,65,126,70,95,228,120,0,34,212,169,36,89,134,35,
-228,2,58,52,53,200,216,165,236,245,218,4,241,134,2,2,39,32,85,228,
-106,2,242,246,2,250,106,1,230,134,1,64,105,32,96,184,30,104,84,59,
-158,2,52,53,49,227,203,2,34,51,2,97,110,115,2,105,111,110,2,44,
-32,97,2,116,32,92,227,217,69,2,72,97,115,2,104,68,101,78,42,235,
-1,0,2,53,58,54,130,54,224,137,129,110,57,224,139,128,70,208,225,23,
-129,66,176,34,68,211,196,32,154,141,236,117,4,35,16,229,154,5,245,241,
-3,96,44,131,2,67,245,127,254,2,52,50,48,141,137,115,223,158,44,80,
-177,96,99,136,249,227,1,0,75,56,148,6,238,149,1,197,241,224,53,2,
-137,36,226,222,16,228,187,2,226,222,118,224,137,112,226,222,10,224,139,114,
-226,222,8,224,139,114,41,6,101,144,34,70,170,206,226,70,15,32,89,64,
-129,64,167,226,72,120,224,139,114,226,74,10,224,141,116,129,190,83,194,224,
-148,128,34,75,209,94,43,74,75,179,140,135,72,4,32,27,138,204,2,73,
-32,58,96,16,154,85,111,208,32,6,73,229,150,253,54,114,192,56,2,49,
-56,57,224,11,1,2,57,48,32,160,11,2,58,52,52,186,149,2,49,51,
-56,33,6,169,232,225,4,3,2,110,111,32,2,102,105,101,2,108,100,32,
-128,152,96,29,96,7,2,52,49,32,224,105,0,45,13,160,11,32,81,136,
-42,60,82,67,0,2,50,49,49,73,5,224,81,3,2,67,111,110,2,116,
-114,111,2,108,46,69,2,120,99,101,2,112,116,105,2,111,110,46,94,60,
-2,114,110,97,2,108,34,32,242,13,3,2,82,101,99,2,83,101,108,2,
-69,114,114,2,111,114,34,250,98,3,32,98,134,72,195,103,41,90,73,93,
-140,224,97,203,76,231,163,147,74,241,177,235,78,248,180,103,33,82,101,252,
-64,8,2,52,49,56,79,93,77,209,230,85,1,235,57,1,73,250,107,188,
-32,72,238,206,6,198,137,64,37,2,50,49,32,64,15,66,217,93,145,2,
-52,52,52,211,40,77,168,97,16,95,139,2,52,51,49,192,28,32,11,68,
-198,128,11,2,49,53,56,71,17,138,1,33,139,224,35,1,97,184,128,11,
-129,114,160,11,224,59,0,32,97,249,161,2,115,249,110,233,2,50,48,57,
-96,76,138,167,243,220,3,244,4,3,32,68,64,179,43,122,128,208,128,93,
-224,6,3,32,95,132,215,39,105,39,202,2,52,32,65,161,89,175,139,244,
-111,1,224,114,5,224,101,6,66,116,224,101,11,32,72,130,206,192,94,193,
-184,130,217,224,94,30,2,51,54,32,224,94,15,33,65,224,72,2,224,69,
-5,160,60,66,190,224,60,4,32,53,194,198,33,181,33,246,252,50,0,34,
-0,33,145,64,10,35,72,2,55,32,35,217,121,255,136,2,224,34,13,130,
-165,34,129,107,88,224,118,5,224,96,3,160,46,129,175,83,136,188,244,235,
-145,1,130,203,119,191,128,10,252,208,2,224,137,5,204,160,218,185,84,65,
-238,133,2,98,95,224,251,1,238,226,3,109,47,108,118,45,147,128,44,175,
-32,224,70,0,2,50,57,57,255,62,1,225,129,4,224,42,8,224,113,2,
-224,41,6,33,104,131,204,73,198,33,252,216,177,32,23,195,184,233,201,2,
-132,0,237,232,0,65,2,241,51,1,112,191,193,35,32,63,131,118,32,87,
-64,85,224,87,2,227,44,0,67,209,130,7,32,56,96,147,35,9,129,182,
-225,192,11,226,27,2,215,113,94,233,65,109,64,19,227,13,0,224,86,6,
-226,60,25,224,88,2,227,9,2,152,228,249,193,0,64,29,131,17,130,15,
-192,1,75,38,241,168,0,224,20,7,224,17,8,224,14,5,224,11,2,247,
-3,3,128,109,32,169,192,208,2,52,50,51,217,43,226,144,3,128,43,255,
-219,1,239,161,2,255,134,3,251,208,2,226,168,2,99,121,66,92,225,112,
-12,226,43,0,97,24,2,64,95,53,224,40,15,70,197,128,0,63,193,165,
-137,103,3,65,149,64,197,206,184,32,17,124,247,69,185,32,22,130,116,47,
-196,2,49,32,58,96,19,162,130,64,27,226,56,0,2,51,32,90,225,130,
-3,32,26,130,59,2,80,32,58,97,18,96,37,37,13,32,13,199,173,226,
-172,0,111,239,175,80,131,79,140,115,52,242,131,10,132,122,70,54,130,67,
-227,177,1,32,78,226,7,0,96,92,193,247,227,9,10,214,232,182,228,227,
-4,7,65,31,224,165,1,70,232,117,61,160,141,146,240,117,119,32,191,80,
-42,197,126,52,171,128,66,38,254,64,8,129,210,160,35,226,152,6,160,43,
-160,147,32,101,199,157,224,101,8,86,45,160,101,102,67,224,101,0,252,145,
-1,149,48,224,103,19,250,224,1,160,95,53,164,33,150,243,70,0,224,60,
-21,225,27,0,230,87,3,2,51,55,56,224,254,14,99,20,32,33,99,204,
-224,85,17,178,166,41,140,232,190,1,2,87,104,101,2,110,32,108,2,111,
-111,107,2,105,110,103,2,32,102,111,2,114,32,97,2,32,110,111,2,110,
-45,101,2,109,112,116,2,121,32,115,2,101,113,117,2,101,110,99,2,101,
-32,119,2,105,116,104,32,13,2,112,97,114,2,97,116,111,2,114,115,58,
-2,92,49,48,2,38,92,57,2,38,34,32,129,190,197,3,252,162,0,246,
-127,0,210,87,152,49,246,211,2,224,41,8,252,170,0,246,107,4,32,92,
-207,42,246,162,2,2,52,49,51,168,31,212,241,232,242,6,147,66,60,114,
-32,4,250,103,0,243,245,17,244,75,11,219,29,244,41,16,2,103,111,116,
-192,47,224,181,6,32,180,131,129,124,23,2,89,32,67,216,197,224,164,3,
-243,121,7,32,31,67,49,246,123,42,2,112,111,108,2,121,112,97,32,9,
-43,206,2,49,50,47,64,43,2,84,101,120,2,116,47,80,64,19,203,180,
-2,49,48,57,2,58,55,34,226,45,0,217,80,2,50,56,50,251,168,2,
-249,95,4,68,179,224,25,13,68,236,216,219,250,176,9,107,96,64,57,165,
-140,251,68,9,202,142,153,26,33,159,99,248,244,75,0,96,64,192,12,128,
-44,100,98,97,102,2,50,56,49,32,52,2,48,53,32,129,118,224,134,50,
-2,56,56,32,224,133,32,96,43,224,132,75,2,49,49,49,225,11,34,96,
-44,224,134,8,195,219,224,134,50,2,55,57,32,224,133,32,96,43,224,132,
-16,185,90,248,192,1,254,4,1,229,101,1,255,89,5,227,94,12,2,44,
-59,40,2,41,91,93,2,123,125,96,195,98,230,157,0,119,52,229,23,0,
-71,221,224,99,6,255,198,3,237,13,2,183,16,2,57,53,32,229,203,5,
-128,6,32,132,34,214,128,97,159,173,165,132,228,55,19,2,66,97,100,2,
-32,99,104,37,20,36,60,2,114,58,32,206,123,152,32,168,28,168,85,252,
-203,1,161,164,170,192,255,216,0,254,166,22,251,13,1,232,211,0,248,101,
-0,141,46,254,69,2,64,14,64,62,64,210,152,31,230,227,3,231,129,0,
-91,16,100,229,247,74,1,160,103,231,159,1,225,232,0,162,18,193,241,192,
-91,216,50,224,48,8,224,46,14,235,21,0,226,103,3,224,62,10,96,54,
-225,201,3,33,4,226,54,5,225,134,1,2,95,39,34,229,135,0,253,66,
-0,224,98,25,96,79,32,101,216,93,160,47,32,22,2,79,32,64,230,181,
-0,226,168,23,2,33,64,35,2,36,37,38,2,42,43,46,2,47,60,61,
-2,62,63,92,2,57,50,38,2,94,124,58,2,45,126,34,250,217,0,126,
-51,129,223,255,182,3,224,204,15,2,101,69,34,224,58,11,206,23,128,18,
-227,231,15,218,224,224,110,2,226,14,8,192,130,225,135,11,226,22,12,231,
-53,16,2,43,34,32,231,46,2,226,45,5,226,37,7,224,192,30,218,1,
-224,192,93,2,45,34,32,224,192,33,224,140,76,40,249,75,220,223,164,224,
-136,31,196,162,253,97,20,2,105,115,115,73,212,2,43,47,45,2,47,100,
-105,2,103,105,116,252,194,2,224,51,15,2,97,102,116,2,101,114,32,2,
-101,32,105,2,110,32,102,2,108,111,97,224,50,27,2,108,105,116,2,101,
-114,97,2,108,58,32,253,32,6,33,202,197,4,220,23,224,252,20,224,81,
-1,2,46,46,46,227,207,1,163,133,131,153,160,0,2,89,32,66,165,59,
-125,83,108,25,83,42,96,35,225,240,20,2,110,100,32,2,111,102,32,2,
-105,110,112,61,218,32,227,244,44,0,224,47,14,2,115,116,114,65,65,160,
-226,233,237,2,130,9,229,122,5,97,150,233,38,7,229,166,1,250,49,8,
-77,236,81,227,129,245,167,22,203,247,161,223,90,51,234,17,80,2,49,56,
-58,2,52,54,34,239,131,0,225,101,0,82,124,2,56,48,32,134,255,224,
-198,0,253,213,5,64,36,33,229,2,51,54,56,64,39,230,240,2,116,138,
-95,109,128,60,238,248,0,114,9,32,87,79,111,74,115,172,152,129,183,235,
-8,3,225,173,13,160,166,43,89,142,208,236,12,2,77,175,45,92,64,136,
-2,51,56,51,129,69,66,109,235,222,10,2,97,32,108,161,202,71,181,128,
-83,101,137,234,247,7,236,59,2,224,70,1,2,98,105,110,2,100,34,32,
-130,49,236,138,1,65,194,236,156,6,64,10,50,117,224,143,16,224,132,3,
-2,32,104,97,2,115,32,110,86,189,54,89,2,32,39,34,230,141,1,224,
-150,41,237,58,5,97,45,244,252,9,2,52,49,48,238,222,14,238,251,19,
-32,74,207,236,142,87,32,16,207,239,225,139,4,70,129,209,92,237,239,0,
-165,208,224,207,3,2,57,50,32,138,145,224,228,9,224,196,2,224,240,12,
-225,206,14,2,44,32,103,45,145,2,39,39,34,226,209,0,224,152,12,237,
-136,3,160,138,132,164,224,27,13,139,57,224,27,12,2,49,48,50,224,28,
-18,65,30,224,28,17,230,59,0,224,28,11,169,130,224,28,13,224,144,18,
-97,83,224,27,14,131,198,224,27,14,164,133,224,83,12,192,55,101,109,64,
-27,102,136,224,157,15,97,181,224,28,14,237,246,0,120,224,75,135,239,164,
-5,229,185,19,2,117,110,114,2,101,99,111,2,103,110,105,2,115,101,100,
-2,32,101,115,2,99,97,112,2,101,32,115,208,157,37,201,226,8,3,2,
-58,32,92,41,133,195,221,233,203,0,208,48,224,151,7,134,89,224,27,14,
-209,202,224,27,11,214,141,224,27,11,97,165,224,27,14,97,109,224,27,13,
-64,244,224,27,16,97,91,224,27,14,97,249,224,27,14,224,195,18,82,81,
-224,27,15,133,165,224,27,14,106,104,224,27,14,177,112,228,193,7,179,126,
-230,206,79,2,51,48,56,2,58,49,52,163,252,81,73,227,251,5,224,141,
-8,121,124,229,230,23,196,137,34,217,160,17,226,155,10,2,39,92,57,2,
-50,38,86,2,84,39,34,162,102,224,124,26,65,62,224,124,33,87,111,224,
-124,20,2,85,83,39,228,245,2,2,51,55,54,224,4,18,224,154,22,111,
-221,230,254,33,224,67,13,66,57,225,91,34,200,13,224,154,60,224,86,1,
-168,184,226,9,61,224,67,22,110,30,224,154,32,200,255,224,242,25,226,40,
-37,85,43,224,174,28,225,228,59,224,242,38,224,243,32,100,63,224,156,54,
-145,191,224,156,33,247,30,1,227,188,26,69,163,227,188,34,128,248,227,188,
-17,2,83,79,72,2,39,32,39,128,9,192,8,2,84,88,39,160,9,2,
-73,39,32,128,8,2,89,78,39,160,9,2,85,66,39,2,32,111,114,160,
-12,2,80,39,34,192,187,228,119,73,155,23,224,186,17,2,82,83,39,228,
-119,7,225,220,90,102,208,224,197,33,128,196,225,31,28,104,10,224,157,55,
-224,67,28,226,122,1,228,253,1,225,101,15,2,78,85,76,225,240,1,2,
-78,65,75,225,241,35,104,80,228,64,34,225,241,23,2,76,70,39,230,230,
-34,231,99,37,142,43,224,123,17,2,72,84,39,231,98,80,94,70,224,124,
-20,2,71,83,39,226,234,38,225,122,39,165,32,224,218,73,105,227,224,218,
-18,2,70,70,39,226,94,0,2,70,83,39,226,93,0,232,74,19,231,83,
-137,148,250,232,69,63,226,216,68,243,185,0,231,83,61,224,155,22,127,170,
-224,155,32,243,86,0,225,210,91,231,150,39,193,211,225,56,25,77,139,224,
-88,34,192,245,227,108,63,224,246,22,224,157,38,186,57,227,178,13,2,111,
-110,101,83,21,99,173,2,69,84,88,168,20,2,69,79,84,192,9,2,78,
-81,39,192,29,40,40,128,9,2,77,39,32,195,225,2,69,83,67,227,226,
-14,224,197,23,234,52,59,226,0,37,2,49,50,55,227,213,31,224,88,28,
-224,224,59,224,156,1,234,52,35,226,2,28,229,99,37,2,52,57,32,224,
-174,36,129,74,224,85,23,120,169,224,85,34,134,92,224,86,25,228,149,37,
-2,49,57,32,224,86,29,238,105,37,146,129,231,13,21,2,68,69,76,227,
-44,1,2,68,76,69,224,12,2,2,67,91,49,2,46,46,52,2,93,39,
-34,227,62,7,228,67,23,239,15,38,164,246,234,175,94,237,199,38,198,204,
-225,65,17,2,67,82,39,225,51,0,2,67,65,78,225,46,40,228,104,106,
-196,102,233,125,73,233,124,23,2,66,69,76,225,45,1,2,66,83,39,235,
-219,34,230,86,29,236,173,68,196,242,224,207,17,2,65,67,75,224,195,1,
-2,95,52,51,186,38,121,13,132,91,2,52,48,53,53,254,2,48,48,32,
-224,34,19,34,37,224,34,0,88,180,224,36,9,86,101,2,95,48,32,184,
-41,64,35,2,48,55,32,245,239,2,32,15,32,162,224,68,0,225,9,8,
-86,133,93,176,2,49,53,51,121,163,2,50,57,57,32,31,2,48,52,32,
-2,64,64,35,150,226,32,114,63,159,160,18,86,174,162,193,246,176,28,249,
-227,4,2,99,116,114,2,108,45,101,150,181,52,229,2,102,111,114,2,109,
-101,100,150,166,2,94,34,32,246,167,7,64,86,249,2,0,64,113,64,239,
-121,80,43,202,2,95,56,54,117,70,2,54,51,32,128,5,128,172,228,214,
-0,235,15,1,204,209,224,17,1,128,40,237,113,3,208,155,244,231,9,237,
-149,8,228,158,7,238,53,11,236,204,7,227,7,10,227,114,7,249,237,3,
-126,253,68,33,225,103,6,253,208,18,218,10,225,110,4,194,127,2,58,52,
-48,32,189,58,163,66,245,2,83,32,67,66,35,33,3,224,62,1,2,100,
-101,99,2,105,109,97,2,108,34,32,162,78,2,49,50,57,154,254,90,251,
-32,13,182,177,2,55,32,35,239,24,1,139,6,84,92,32,94,32,213,155,
-2,2,51,54,52,97,163,64,69,157,69,190,242,106,106,32,41,32,238,224,
-136,18,2,111,99,116,224,134,28,161,69,2,51,48,54,224,133,3,32,12,
-224,91,18,2,104,101,120,224,224,27,222,119,35,157,224,90,2,32,12,64,
-90,33,152,126,162,192,225,253,114,0,130,175,64,27,64,5,251,242,2,65,
-19,35,51,157,8,67,114,162,165,159,41,226,226,4,184,73,95,73,32,25,
-63,7,96,31,2,52,48,51,32,27,252,185,3,2,57,49,32,224,187,7,
-152,103,64,108,2,53,55,32,224,28,9,160,111,36,5,64,132,32,8,162,
-90,66,158,2,66,32,80,196,30,224,55,11,223,18,97,197,227,233,20,2,
-92,49,48,2,38,101,120,162,135,107,157,2,114,32,109,2,111,114,101,162,
-134,253,254,9,2,32,100,105,2,103,105,116,2,115,34,32,194,164,33,26,
-98,69,64,144,33,135,224,41,1,2,102,111,108,2,100,108,49,165,133,2,
-52,48,50,97,146,159,0,2,66,32,89,129,40,2,83,32,80,195,59,33,
-41,96,79,157,244,170,73,225,132,0,97,131,68,241,2,50,50,48,66,152,
-65,190,68,247,39,209,134,12,229,202,3,2,96,95,34,229,55,9,2,52,
-48,48,97,63,69,141,227,158,2,225,29,20,2,69,120,112,189,172,2,110,
-32,105,2,100,101,110,2,116,105,102,2,105,101,114,157,171,89,183,225,36,
-5,2,79,32,35,68,165,219,176,32,203,158,117,99,95,99,88,32,100,163,
-81,158,126,32,219,2,54,32,67,160,1,33,64,166,34,98,88,196,62,2,
-51,55,50,130,131,128,6,98,183,2,58,51,57,132,27,32,15,2,55,32,
-66,163,193,98,34,32,10,103,89,2,54,32,89,99,82,2,83,32,73,2,
-32,64,90,126,245,192,6,226,90,1,96,54,99,91,98,91,33,148,163,44,
-64,13,64,61,224,59,1,164,223,156,83,98,135,156,66,32,0,2,89,32,
-66,65,154,33,201,230,97,33,2,102,97,105,2,108,101,100,2,32,116,111,
-2,32,112,97,59,7,33,96,2,121,32,111,2,102,32,116,2,104,101,32,
-2,112,111,115,2,115,105,98,2,108,101,32,2,99,104,111,2,105,99,101,
-2,115,58,92,34,163,129,105,99,151,2,50,32,35,65,10,67,25,32,141,
-2,85,32,67,64,152,97,128,224,112,19,224,69,2,224,67,1,96,13,2,
-50,56,48,243,27,0,64,245,98,136,195,233,225,36,0,224,19,2,62,76,
-190,39,224,2,2,128,20,224,55,2,225,62,6,224,28,3,2,90,32,64,
-224,13,2,33,108,227,2,0,32,72,64,88,192,93,34,190,65,111,99,35,
-32,0,192,73,194,70,98,12,99,78,128,69,32,39,32,19,133,172,2,85,
-32,58,66,92,64,10,104,42,32,2,97,31,164,134,2,75,32,90,96,1,
-224,82,0,2,51,56,54,254,253,3,101,37,128,41,2,52,32,65,104,146,
-160,33,66,99,225,101,16,2,73,110,32,2,97,32,115,190,218,225,114,15,
-133,22,101,53,66,237,95,164,197,129,100,218,224,157,17,161,15,130,103,32,
-251,160,159,137,50,160,35,65,2,133,248,64,80,131,22,2,51,57,51,224,
-88,21,32,51,132,199,2,85,32,90,192,30,32,19,196,173,64,243,2,50,
-54,55,227,43,3,133,150,194,121,36,2,2,51,57,48,249,48,2,2,51,
-57,49,129,161,132,206,2,83,32,85,195,252,64,95,68,185,50,234,96,86,
-80,37,234,214,4,232,146,0,131,83,233,92,0,32,54,98,233,65,2,160,
-95,132,103,96,11,166,232,32,208,32,66,32,5,32,156,32,24,132,102,99,
-217,128,56,2,58,51,56,200,85,161,128,170,41,114,132,120,110,101,202,128,
-171,135,26,161,117,192,92,96,172,201,203,252,255,2,64,49,32,94,130,146,
-65,106,64,180,32,16,194,143,35,12,32,13,130,146,234,251,0,97,199,132,
-220,101,226,33,23,97,65,32,41,225,196,1,234,251,5,65,131,35,109,2,
-82,32,95,235,249,11,159,86,2,115,97,116,2,105,115,102,2,121,58,32,
-132,103,236,10,7,96,95,129,240,99,222,101,122,66,215,64,195,224,75,1,
-2,82,97,110,2,32,111,117,2,116,32,111,2,102,32,105,2,110,112,117,
-2,116,32,40,2,69,79,70,2,41,34,32,133,243,137,41,64,73,130,38,
-32,16,96,142,96,202,224,153,10,2,110,111,32,100,235,96,63,138,41,32,
-5,75,183,165,218,66,17,128,11,32,83,194,55,227,38,0,2,54,50,32,
-64,35,65,161,66,132,2,50,52,54,96,63,33,93,228,14,0,85,61,129,
-123,2,51,32,75,128,17,130,0,228,1,4,32,247,128,55,137,84,162,197,
-224,77,0,227,100,0,131,98,2,58,51,55,130,48,96,85,68,9,32,17,
-193,227,227,76,3,32,22,129,233,230,89,5,71,179,39,114,196,209,69,38,
-229,29,11,101,20,101,23,163,123,65,30,136,7,71,59,65,180,234,168,0,
-230,134,0,32,37,130,36,2,80,32,58,64,39,128,148,32,163,32,13,161,
-147,65,241,71,84,224,60,4,97,183,162,217,194,17,224,14,6,233,227,7,
-2,95,49,56,161,219,38,48,98,188,128,10,96,48,129,178,64,6,64,114,
-192,18,231,97,23,32,20,99,222,65,219,228,213,0,231,84,0,32,67,238,
-31,0,97,236,224,103,1,195,237,138,117,101,210,33,52,32,24,200,84,225,
-130,3,138,55,142,127,171,128,66,114,112,166,2,58,51,54,200,70,98,103,
-224,147,0,135,234,136,126,96,155,160,80,98,30,224,74,8,136,145,64,6,
-32,74,66,16,2,85,32,64,64,16,194,14,33,214,198,245,70,201,32,25,
-129,219,192,20,224,28,6,129,210,2,73,32,58,96,192,160,39,231,40,1,
-224,11,2,230,247,2,96,57,129,243,34,168,2,50,32,90,197,195,67,54,
-64,225,105,25,33,32,32,17,161,63,32,233,128,238,46,163,64,194,224,12,
-0,110,52,224,45,0,197,66,32,161,32,215,2,58,51,53,129,50,96,229,
-32,13,128,245,130,232,135,60,232,26,6,231,221,2,134,248,138,248,168,49,
-44,243,195,153,224,5,7,232,102,6,160,60,232,134,2,232,116,14,232,107,
-3,131,246,224,116,0,195,124,224,114,0,66,62,244,144,2,237,19,3,128,
-73,237,58,0,32,67,241,124,5,175,126,192,160,163,66,136,60,2,49,56,
-53,128,46,100,86,64,5,96,91,164,168,32,0,2,79,32,75,235,40,1,
-224,174,92,2,52,55,32,224,174,72,224,109,17,192,154,226,175,1,224,118,
-43,173,198,66,222,96,30,233,114,2,44,107,70,0,224,147,3,103,173,224,
-250,18,128,127,39,54,2,49,56,52,32,16,224,211,4,98,159,33,121,65,
-124,68,6,99,9,128,39,224,132,36,225,23,1,64,1,36,237,192,94,235,
-43,5,194,202,224,48,4,74,246,224,66,6,202,248,224,63,9,72,64,245,
-205,0,239,196,1,160,194,102,113,32,31,36,170,2,50,50,32,224,155,8,
-48,215,37,219,2,52,48,32,224,24,8,234,216,16,2,87,97,114,2,110,
-105,110,2,103,58,32,2,67,97,110,2,39,116,32,2,102,105,110,2,100,
-32,102,40,90,238,6,2,235,211,5,175,123,240,52,4,239,132,16,32,67,
-40,97,47,90,2,114,101,99,2,116,111,114,2,105,101,115,75,58,2,92,
-57,38,246,125,2,240,192,1,160,89,192,203,118,45,224,13,1,32,243,239,
-232,15,224,80,2,225,210,32,240,60,23,2,32,32,65,2,115,107,101,33,
-12,48,56,2,98,121,58,176,55,2,95,49,51,65,123,166,38,244,24,3,
-97,180,165,106,224,88,16,2,109,105,115,2,115,105,110,2,103,32,102,33,
-97,224,82,1,224,40,0,224,157,0,241,188,1,162,21,71,192,96,97,2,
-95,51,51,96,123,129,55,142,206,139,107,75,86,224,39,3,89,133,241,211,
-0,130,82,194,118,160,63,145,209,66,81,2,51,53,51,64,130,160,186,225,
-151,0,179,45,2,51,53,52,168,57,67,202,99,117,160,19,162,197,201,133,
-33,24,35,225,169,103,41,5,96,39,107,156,82,8,233,89,2,32,22,132,
-10,32,25,169,15,76,50,73,213,32,8,203,166,113,253,96,23,32,157,236,
-82,2,241,28,2,225,190,13,53,193,2,47,34,32,239,6,5,32,105,201,
-83,128,93,224,181,1,229,252,7,236,142,3,128,230,224,251,12,32,81,135,
-199,73,165,86,175,135,47,225,131,1,73,147,85,240,32,5,64,237,65,159,
-2,51,52,55,206,174,96,35,32,16,2,56,32,102,224,185,0,32,5,2,
-45,56,47,2,47,82,79,2,85,78,68,2,84,82,73,2,80,34,32,243,
-135,0,228,25,2,33,102,96,154,105,194,32,92,64,148,32,129,171,89,226,
-5,5,92,143,137,2,70,102,197,63,98,191,2,95,55,56,140,236,172,235,
-244,45,2,96,60,99,117,96,163,128,105,226,76,6,225,35,2,164,16,224,
-164,3,128,150,224,46,0,203,74,64,73,106,75,38,16,32,13,136,131,2,
-94,103,101,2,116,98,32,2,58,51,52,246,23,1,128,166,2,50,50,54,
-102,54,225,226,9,225,40,13,243,168,6,2,117,110,107,2,110,111,119,2,
-110,32,116,2,101,120,116,2,32,101,110,2,99,111,100,35,123,237,50,2,
-129,128,140,98,65,253,238,106,0,2,52,50,32,32,4,66,196,235,61,0,
-96,212,34,184,2,50,53,53,192,27,96,54,130,215,2,95,52,55,109,107,
-131,76,2,52,52,32,98,254,135,8,47,32,2,51,52,53,128,100,130,235,
-105,200,140,113,64,24,97,15,35,213,79,199,140,186,69,193,244,254,1,78,
-121,96,178,2,52,49,32,160,92,32,11,76,61,96,11,32,68,173,241,32,
-195,2,75,32,95,2,50,49,49,65,46,2,49,32,102,225,8,0,2,67,
-111,110,2,116,114,111,2,108,46,69,2,120,99,101,2,112,116,105,2,111,
-110,46,2,73,110,116,2,101,114,110,150,221,224,39,1,2,83,111,109,2,
-101,69,120,160,35,141,206,167,179,32,100,208,51,161,34,143,81,139,90,72,
-191,2,51,52,49,84,140,163,25,33,65,224,233,0,141,177,64,30,32,17,
-2,99,97,116,2,99,104,32,32,14,173,192,210,14,226,219,0,2,51,51,
-52,203,174,66,128,136,66,229,79,15,2,111,112,101,2,110,70,105,69,75,
-2,99,97,110,2,110,111,116,2,32,111,112,2,101,110,32,163,250,226,171,
-2,2,58,51,51,162,91,227,159,8,98,3,98,4,68,24,194,21,2,49,
-53,50,172,222,226,208,14,33,177,130,245,32,90,130,58,32,32,2,54,32,
-58,96,37,66,211,2,99,108,111,2,115,101,98,64,16,129,244,206,80,32,
-16,215,190,224,250,9,33,35,224,133,4,104,168,224,37,4,65,123,2,51,
-51,32,162,187,123,151,64,53,230,133,4,201,130,35,190,182,205,96,230,185,
-19,81,201,109,91,32,21,164,180,64,165,129,176,224,148,8,230,37,3,2,
-49,51,52,163,18,160,17,64,104,97,174,149,229,231,109,4,2,49,49,52,
-219,243,224,23,6,33,137,132,14,224,24,5,83,223,224,23,8,225,234,1,
-2,119,43,34,238,65,0,128,215,185,88,100,41,2,51,50,57,129,163,216,
-23,193,11,129,9,227,240,3,169,253,32,242,196,139,58,6,82,32,32,17,
-174,104,34,243,243,184,0,70,26,80,41,64,118,159,148,128,6,2,49,55,
-54,192,118,2,58,51,50,130,93,2,116,111,73,2,110,116,32,32,14,130,
-17,2,94,102,111,66,142,32,15,198,253,109,109,231,216,1,64,64,183,171,
-131,72,79,52,2,50,56,54,229,146,1,121,95,242,145,4,32,77,167,49,
-51,4,32,12,130,76,114,150,52,48,180,211,64,37,164,20,2,50,57,51,
-64,102,66,198,121,86,32,11,68,221,2,50,51,32,96,37,244,9,0,2,
-51,48,57,69,150,198,255,248,201,0,2,80,32,75,238,146,1,182,66,135,
-56,107,145,185,143,229,173,11,65,211,143,194,235,198,7,203,67,224,15,1,
-72,153,243,146,2,134,76,32,99,224,37,5,128,39,186,125,224,160,19,202,
-83,205,113,171,178,224,73,2,109,119,105,15,224,56,3,108,38,246,161,3,
-224,116,0,224,152,1,96,20,112,239,169,156,224,90,1,224,113,4,186,0,
-224,241,5,192,26,129,20,203,83,238,255,1,225,89,32,69,104,234,204,3,
-224,241,14,225,115,3,224,237,7,225,36,86,163,170,245,71,0,2,51,48,
-56,194,234,64,71,226,67,33,34,162,192,233,170,149,64,101,245,203,0,224,
-93,4,224,116,3,224,105,91,96,11,35,70,165,61,74,171,36,10,132,77,
-64,133,101,248,105,248,86,251,252,210,6,179,61,144,239,207,234,194,221,128,
-18,240,33,14,106,251,128,205,144,76,239,32,13,2,49,50,48,250,94,0,
-2,49,53,32,253,82,12,224,111,67,168,169,224,110,95,2,49,49,49,224,
-111,1,116,134,224,111,85,102,6,224,110,97,191,201,96,110,186,19,255,71,
-9,194,217,241,25,6,192,58,158,135,224,97,15,252,244,2,224,97,15,206,
-226,2,51,49,57,224,32,10,38,93,173,92,66,105,171,187,70,214,2,49,
-51,32,128,107,76,254,2,49,57,55,39,247,130,138,35,74,137,77,72,30,
-2,58,51,49,235,242,1,224,54,13,218,118,78,156,224,53,1,135,95,255,
-54,0,250,102,6,96,5,224,19,7,135,168,64,70,224,111,20,171,107,2,
-51,48,54,224,111,3,135,113,224,220,18,161,14,2,51,48,53,224,54,3,
-135,155,94,171,109,149,78,35,32,5,2,52,32,35,224,161,0,78,65,2,
-35,53,55,149,49,224,38,8,73,18,224,38,1,2,49,48,50,181,89,224,
-39,7,100,157,224,39,0,68,205,237,11,8,2,100,105,103,2,105,116,84,
-72,159,191,219,64,65,250,237,0,33,149,96,76,192,16,96,15,128,86,193,
-184,224,49,28,96,176,224,49,22,64,39,130,159,33,33,247,8,5,252,77,
-2,242,191,5,158,88,199,33,67,97,179,208,83,245,224,47,0,182,169,96,
-2,147,162,243,95,9,246,70,5,246,92,7,243,112,8,243,212,2,150,240,
-244,247,1,64,5,224,117,0,167,226,134,100,224,162,0,73,188,169,220,2,
-95,53,55,131,107,115,198,2,51,49,50,102,87,137,146,244,11,3,61,19,
-81,166,102,134,226,99,5,192,41,33,53,137,180,196,107,128,36,131,153,131,
-170,32,117,74,16,128,44,237,137,3,170,30,32,21,134,155,152,254,233,249,
-1,100,49,130,92,96,110,232,190,81,33,179,232,190,8,232,187,34,232,132,
-19,91,197,232,131,4,135,176,32,244,164,163,118,168,99,68,193,53,161,45,
-170,83,190,159,235,5,64,78,235,235,5,32,192,96,233,157,47,224,150,34,
-235,156,4,161,80,161,77,244,41,0,232,238,2,161,43,224,21,3,64,101,
-226,46,1,161,69,65,106,34,82,147,25,2,79,32,80,163,162,163,168,64,
-34,243,122,12,79,161,224,25,14,175,5,173,35,184,110,253,250,1,94,71,
-128,5,223,101,254,23,2,224,28,1,244,57,5,229,26,1,2,44,59,40,
-2,41,91,93,2,123,125,95,2,96,34,32,196,71,132,74,154,201,195,205,
-108,123,224,88,5,38,255,65,45,224,34,0,65,109,70,223,196,148,237,234,
-0,227,60,23,224,40,0,225,243,0,228,161,0,132,201,226,54,4,225,249,
-1,227,131,9,96,27,227,27,7,236,146,5,96,37,160,26,247,206,1,192,
-249,234,138,1,232,93,16,192,83,232,93,2,165,37,193,0,249,121,1,227,
-65,17,236,127,73,180,191,85,168,159,233,224,220,4,193,7,33,180,104,76,
-236,172,2,118,171,128,123,37,128,34,69,83,66,96,199,162,209,228,12,23,
-237,19,29,224,94,2,232,187,0,32,141,33,83,232,202,15,2,57,53,32,
-232,202,8,99,40,32,0,224,154,3,225,104,20,237,177,31,230,129,1,108,
-200,70,187,224,99,0,192,25,96,54,2,67,32,79,164,58,177,176,132,14,
-227,96,15,2,33,64,35,2,36,37,38,2,63,43,46,2,47,60,61,2,
-62,63,92,55,157,2,94,124,58,2,45,126,34,135,62,130,108,226,66,3,
-225,12,15,2,49,48,49,225,13,9,127,240,240,46,3,231,143,3,208,86,
-225,28,57,162,52,163,19,184,61,229,111,2,200,37,99,59,234,151,15,225,
-204,10,83,70,252,10,7,227,254,100,225,255,2,192,227,64,164,193,224,194,
-180,239,4,0,160,21,64,152,193,78,192,128,224,118,6,96,112,131,142,101,
-193,128,0,64,54,225,243,1,228,93,10,128,43,192,117,38,167,64,16,226,
-108,2,225,208,23,240,214,75,228,70,5,160,190,96,199,237,226,14,122,71,
-116,161,224,229,15,167,63,128,229,250,187,5,156,204,199,154,229,131,13,128,
-96,101,128,224,96,2,134,254,225,155,3,217,251,160,168,133,214,238,113,16,
-190,83,240,252,4,224,155,11,229,51,1,196,210,78,7,233,208,1,36,16,
-162,73,226,42,6,224,142,6,193,163,131,61,225,146,1,167,13,225,53,9,
-164,250,167,162,227,116,3,64,253,53,209,136,232,72,222,64,43,226,172,0,
-226,152,9,198,41,168,118,129,227,224,54,5,224,231,3,192,209,40,218,142,
-124,252,70,27,229,52,19,228,176,0,226,197,4,228,185,0,160,170,2,85,
-32,35,193,148,153,104,237,32,1,172,210,225,65,1,64,132,229,130,15,2,
-97,98,102,2,110,114,116,2,118,92,57,2,50,38,92,63,148,2,39,34,
-32,237,80,1,226,196,17,131,137,229,158,11,110,124,64,108,2,57,57,32,
-33,26,64,40,2,35,54,52,129,73,60,51,192,18,102,190,225,9,8,2,
-66,32,79,32,214,128,45,228,103,0,225,115,0,173,197,224,215,5,241,246,
-13,227,211,1,47,150,242,247,9,162,22,233,145,6,231,225,16,230,252,0,
-32,82,33,119,128,68,128,41,143,215,160,42,224,41,9,96,144,192,41,100,
-58,231,55,29,123,241,230,109,9,34,99,144,166,240,53,21,156,83,64,111,
-241,11,3,128,213,224,14,0,240,81,28,224,35,5,112,63,240,77,6,64,
-104,188,170,32,94,129,102,32,235,64,111,2,51,48,49,160,57,64,11,90,
-92,2,51,48,51,32,5,2,55,53,32,162,6,2,95,55,54,192,10,32,
-70,143,242,2,62,61,32,32,11,142,200,2,62,32,58,96,56,32,10,2,
-60,32,58,96,79,32,10,2,105,99,109,2,112,32,58,96,99,248,224,1,
-155,67,32,71,66,120,224,247,5,107,138,128,253,32,29,131,164,230,165,11,
-228,58,7,33,130,166,39,112,101,224,10,4,228,54,4,237,19,0,226,69,
-15,32,118,225,183,1,192,148,65,22,2,50,57,53,96,148,225,170,1,241,
-188,16,115,79,32,42,178,58,225,189,20,86,117,64,43,129,81,2,80,32,
-58,89,235,219,197,250,79,1,80,132,242,13,6,2,114,101,97,2,100,58,
-32,2,102,97,105,2,108,101,100,132,10,36,229,32,62,252,4,1,192,62,
-246,210,3,252,144,0,65,58,35,90,97,28,64,39,160,43,110,109,148,17,
-187,118,48,115,219,111,224,11,4,32,106,129,228,228,208,2,227,204,1,230,
-200,0,125,100,48,253,2,51,32,102,230,132,1,36,190,2,46,47,108,2,
-105,98,47,2,84,101,120,2,116,47,82,32,201,2,47,76,101,2,120,46,
-104,2,115,92,51,2,52,38,44,2,54,57,58,2,49,34,32,200,206,161,
-76,226,66,1,32,13,64,205,190,121,172,234,73,200,163,138,91,158,64,125,
-163,137,162,43,199,52,142,16,231,63,17,200,230,233,16,1,32,79,187,243,
-160,85,32,5,231,25,0,224,38,10,224,123,2,64,170,230,106,0,225,190,
-5,2,105,110,105,2,116,58,32,2,91,93,34,209,178,230,21,1,224,114,
-3,198,69,224,115,1,32,82,130,161,243,71,2,2,115,101,113,192,213,128,
-19,224,16,2,114,186,192,252,195,1,32,68,162,200,69,118,2,50,51,53,
-196,15,253,182,11,2,35,108,105,2,110,101,34,194,98,103,117,255,204,15,
-2,123,45,35,2,32,76,73,2,78,69,32,244,161,2,71,148,77,177,87,
-122,64,7,85,191,32,206,97,103,224,57,1,2,32,35,45,2,125,34,32,
-160,155,131,57,225,21,4,95,123,176,168,65,15,144,167,64,78,64,72,208,
-214,131,205,36,169,2,50,50,55,240,73,1,160,25,95,113,96,16,32,96,
-212,179,231,187,0,225,123,1,204,24,98,82,229,208,0,32,51,243,177,0,
-236,24,12,95,124,238,2,17,236,52,9,149,96,32,86,227,175,0,160,139,
-210,185,107,121,2,50,56,48,230,247,1,171,53,162,205,177,183,96,166,238,
-63,0,224,51,0,224,186,2,180,230,64,127,198,157,128,81,32,124,131,193,
-139,207,237,104,1,224,43,3,224,42,0,191,87,2,50,55,56,107,208,32,
-182,133,47,65,214,212,134,2,50,55,54,103,69,2,55,55,32,64,25,197,
-192,225,94,0,137,28,233,194,0,225,125,8,245,182,1,192,127,254,80,5,
-64,84,130,252,34,70,116,241,225,30,0,32,25,130,209,202,248,32,34,102,
-184,2,50,55,52,240,86,0,36,190,96,20,193,28,32,52,194,106,2,95,
-53,32,65,58,96,72,130,29,117,110,66,118,224,1,1,234,84,2,32,38,
-130,16,66,137,224,37,5,224,39,4,64,40,129,226,32,99,66,153,103,140,
-54,53,33,54,32,26,129,128,192,205,102,37,37,47,64,25,129,111,100,6,
-36,214,2,58,50,54,129,103,32,31,2,56,32,75,32,117,246,226,3,92,
-130,32,62,201,83,96,236,32,107,64,17,227,97,2,2,32,97,116,2,32,
-108,105,2,110,101,32,203,255,226,54,0,128,63,46,199,33,75,131,50,224,
-66,14,2,99,111,108,192,61,130,42,224,57,8,65,204,33,162,224,61,11,
-2,92,49,48,2,38,32,32,2,32,32,117,2,115,101,100,2,32,98,121,
-2,32,32,34,162,97,64,62,2,50,54,56,235,177,3,32,20,65,193,96,
-20,32,11,40,175,128,11,33,7,130,85,32,15,2,54,32,67,235,243,1,
-67,79,151,46,2,50,54,55,227,221,18,134,158,238,14,0,32,45,130,54,
-64,36,65,121,102,226,119,72,32,26,130,28,2,90,32,85,97,128,199,163,
-37,4,2,75,32,95,230,210,9,2,99,112,112,2,104,115,115,2,114,99,
-47,2,109,97,108,33,40,2,109,45,119,2,97,108,108,2,97,99,101,2,
-45,117,110,2,105,118,101,2,114,115,101,2,47,99,112,32,33,2,45,49,
-46,2,50,48,46,2,57,47,99,64,12,198,243,2,55,57,58,166,243,32,
-104,130,88,72,242,128,147,96,110,192,147,130,76,2,75,32,58,2,50,54,
-49,161,9,42,70,32,4,98,80,2,54,48,32,96,19,2,52,55,32,70,
-114,2,53,54,32,34,107,2,53,56,32,65,69,73,205,96,38,71,218,34,
-111,192,11,39,91,160,11,2,58,50,53,226,101,2,129,57,225,194,4,2,
-69,120,105,2,116,83,117,2,99,99,101,2,115,115,34,228,92,2,32,62,
-33,115,97,141,2,55,32,95,67,162,196,224,226,7,11,64,68,2,70,97,
-105,2,108,117,114,166,85,224,36,1,228,89,2,97,247,102,102,32,16,43,
-159,162,29,162,24,160,210,98,24,96,11,32,186,130,24,175,215,244,69,0,
-153,4,68,213,160,16,128,73,32,47,164,73,37,143,33,95,2,50,49,49,
-66,185,224,167,3,2,83,121,115,2,116,101,109,2,46,69,120,2,105,116,
-34,237,137,4,64,17,2,67,111,100,128,189,194,91,32,80,196,128,108,203,
-65,84,68,107,110,123,2,95,52,54,65,157,75,239,32,33,224,73,1,130,
-10,32,71,32,27,130,94,32,206,34,129,80,90,32,18,230,114,0,68,210,
-192,80,65,208,32,195,72,103,66,196,129,104,32,44,228,101,0,2,50,52,
-56,228,252,0,64,33,32,27,130,41,104,193,93,69,155,199,32,23,130,45,
-2,94,112,117,2,116,98,32,2,58,50,52,229,202,1,179,133,219,166,108,
-248,69,63,64,82,237,65,1,251,50,4,133,181,64,28,107,121,32,78,197,
-255,35,62,64,173,65,3,128,62,32,27,129,124,229,60,1,216,118,96,37,
-98,129,165,193,2,95,52,49,137,123,229,210,0,32,75,2,52,50,32,138,
-206,32,238,100,124,229,217,1,2,50,52,52,160,126,129,108,233,121,8,2,
-104,101,97,139,48,106,74,64,45,190,23,231,131,1,250,189,0,233,99,0,
-129,1,248,192,7,248,74,2,224,5,3,200,126,70,78,240,232,8,225,85,
-0,236,24,1,96,40,32,5,113,25,224,42,1,128,6,224,38,0,224,87,
-6,160,47,252,65,1,65,204,204,212,100,201,224,109,1,96,185,241,91,3,
-32,11,33,65,251,196,3,121,211,241,97,5,233,189,0,111,128,32,115,225,
-67,1,2,45,79,34,169,112,104,247,241,163,0,242,117,2,224,52,10,2,
-45,115,116,2,114,105,112,2,45,101,111,2,108,34,32,203,155,224,188,128,
-254,21,1,224,192,23,199,62,225,169,255,225,169,105,247,90,1,96,69,236,
-138,12,2,45,45,104,2,97,115,104,2,101,115,34,242,148,2,227,134,255,
-227,134,255,225,169,255,227,134,48,74,85,146,43,224,6,3,236,90,3,241,
-123,2,167,43,223,145,161,180,231,100,1,193,250,241,161,0,248,99,2,246,
-214,6,123,134,251,60,3,96,51,251,128,1,137,50,179,237,160,33,160,99,
-255,167,1,224,117,4,146,64,179,45,247,126,1,232,234,7,225,46,0,234,
-95,0,96,137,238,162,2,237,253,2,196,164,255,130,14,192,195,224,39,1,
-224,177,3,244,196,2,239,24,3,146,183,224,172,17,239,49,7,248,34,0,
-97,135,225,81,11,98,35,229,66,13,2,111,34,32,192,65,2,82,32,64,
-171,235,96,91,224,254,4,128,10,80,8,251,94,0,197,107,225,203,9,129,
-169,226,15,1,226,3,0,250,214,1,225,242,20,243,197,28,216,95,251,6,
-3,224,178,4,192,12,96,180,34,215,2,51,32,35,242,43,0,225,187,36,
-128,196,226,114,0,115,107,225,192,3,243,94,25,2,97,110,115,2,105,34,
-32,224,120,4,224,78,5,224,72,31,2,116,114,97,2,100,105,116,2,105,
-111,110,2,97,108,34,244,159,2,246,3,0,224,61,21,2,115,116,100,224,
-133,2,214,32,32,53,80,180,91,81,46,52,94,232,174,146,224,34,21,110,
-172,226,123,53,2,120,34,32,226,123,2,229,48,2,224,77,44,2,105,110,
-99,2,108,117,100,174,111,226,207,10,244,210,17,2,45,45,105,128,59,2,
-61,34,32,225,30,2,225,243,0,225,161,2,250,231,3,224,139,18,2,80,
-34,32,226,60,7,224,69,9,244,74,8,133,202,224,70,2,2,67,34,32,
-97,132,224,30,15,128,31,225,53,52,2,65,34,32,225,131,9,224,250,51,
-2,45,104,101,2,108,112,34,228,170,1,224,73,50,81,81,34,235,224,76,
-60,224,75,7,195,131,255,117,10,250,87,4,228,22,17,245,74,0,238,34,
-0,100,135,225,169,1,135,181,231,147,3,163,71,80,176,163,71,224,18,0,
-123,157,128,18,145,46,234,245,18,224,203,9,224,45,65,225,189,4,227,255,
-6,79,146,227,255,8,224,78,21,2,110,111,108,248,89,0,232,81,1,2,
-50,51,56,178,238,132,106,225,35,2,225,46,3,113,121,224,85,9,2,68,
-85,73,96,80,47,217,145,61,32,79,2,55,32,75,48,105,88,63,153,3,
-96,5,96,103,213,162,64,188,224,43,3,185,130,128,46,224,41,1,32,40,
-211,115,224,40,0,130,16,224,35,0,32,34,215,41,160,34,2,75,32,66,
-224,119,3,97,48,231,173,0,2,58,50,51,241,116,1,249,170,10,32,31,
-145,69,2,85,32,58,64,80,128,10,123,233,33,117,209,240,90,180,98,92,
-64,22,214,209,176,203,158,224,229,181,0,192,18,40,74,64,21,225,168,1,
-241,205,7,101,26,75,70,224,168,0,209,41,194,208,51,233,40,122,147,237,
-145,139,245,105,0,65,107,103,85,131,32,33,166,123,18,2,35,49,32,128,
-77,128,192,247,64,0,2,50,32,65,128,235,129,134,121,206,32,13,129,107,
-96,31,152,107,64,195,242,53,0,181,237,75,212,96,19,242,69,0,32,19,
-251,116,0,96,246,128,230,32,22,179,241,32,162,35,133,87,240,2,49,55,
-54,195,144,32,30,129,80,59,59,2,117,97,108,33,110,64,33,161,96,2,
-50,51,32,225,96,0,82,103,192,22,128,86,128,199,183,223,2,50,49,32,
-247,223,1,64,32,247,223,0,191,219,160,139,128,220,2,82,32,95,183,240,
-64,28,243,124,2,129,135,217,147,64,158,32,66,243,24,53,87,151,96,72,
-252,146,14,2,116,97,105,136,56,97,125,64,45,128,213,51,145,32,41,148,
-79,2,49,53,32,64,27,129,41,2,73,32,58,96,16,246,112,2,148,34,
-2,49,51,32,246,112,0,128,56,150,112,160,11,118,112,96,11,32,63,180,
-246,86,112,33,27,96,106,164,67,2,48,32,102,224,155,0,2,101,114,114,
-2,111,114,58,152,49,181,246,96,38,32,64,163,230,245,198,16,2,67,111,
-110,2,116,114,111,2,108,46,69,64,66,245,200,6,64,18,2,67,97,108,
-128,246,245,201,1,64,197,125,28,163,18,67,225,192,7,230,100,1,173,64,
-85,53,131,46,120,199,2,48,56,32,188,71,171,133,98,11,32,152,169,53,
-118,15,64,99,194,221,130,181,32,16,194,0,248,182,19,252,142,0,66,95,
-223,124,225,198,5,2,109,100,53,2,67,111,109,2,98,105,110,2,101,58,
-32,2,101,109,112,2,116,121,34,163,248,2,67,32,80,253,72,0,128,171,
-64,170,72,104,69,42,32,19,2,57,56,32,32,97,64,114,92,17,88,127,
-166,232,66,144,237,5,1,194,148,236,101,3,224,255,2,96,19,199,31,32,
-15,66,117,65,39,88,26,100,5,2,95,57,50,96,24,196,12,128,207,130,
-148,2,94,109,100,2,53,65,114,2,114,97,121,34,90,64,57,130,129,226,
-242,0,66,69,96,161,32,62,100,185,100,141,247,26,1,158,31,246,253,0,
-2,48,52,32,224,46,4,169,241,192,46,2,95,57,55,172,10,195,37,32,
-39,167,194,32,126,226,228,1,64,20,151,63,32,210,172,19,229,0,10,246,
-25,2,238,100,0,225,58,0,233,230,13,32,67,55,138,128,67,32,134,32,
-222,65,34,35,34,2,55,32,35,162,48,238,128,5,239,42,5,224,236,1,
-96,187,101,173,224,45,2,96,96,204,188,229,132,6,254,15,5,228,38,0,
-224,43,11,194,135,224,38,0,160,16,33,24,253,42,10,206,254,32,29,163,
-154,2,49,49,55,66,24,68,253,194,4,129,254,2,35,56,32,32,85,72,
-51,32,44,131,115,2,35,49,54,65,112,167,102,2,49,49,56,67,7,80,
-142,162,59,2,49,48,48,121,201,108,109,37,68,128,87,64,11,64,155,192,
-11,68,31,160,11,2,57,57,32,224,11,1,126,151,64,12,153,86,97,37,
-41,217,170,59,131,13,238,184,2,248,228,4,242,96,3,65,254,98,55,33,
-6,71,94,64,243,32,13,162,250,32,9,125,2,102,199,224,23,0,241,188,
-1,95,24,224,29,7,224,53,16,88,101,36,51,193,87,192,68,224,151,0,
-67,141,2,83,32,67,224,147,2,224,93,10,128,161,170,131,33,58,224,31,
-6,130,111,195,143,96,235,68,14,32,16,224,142,10,128,16,96,52,90,165,
-65,96,199,148,2,75,52,32,192,167,32,23,131,209,128,155,171,8,128,163,
-200,61,33,247,227,55,1,97,133,160,34,2,64,95,54,111,176,64,206,39,
-29,253,107,10,2,46,47,108,2,105,98,47,2,68,97,116,2,97,47,73,
-2,110,116,101,2,103,101,114,2,95,84,121,2,112,101,46,189,78,2,50,
-56,58,189,78,160,69,2,57,52,32,32,4,98,197,58,141,128,189,192,18,
-42,85,138,102,128,5,252,127,0,224,60,6,161,72,32,4,2,89,32,67,
-196,9,69,230,64,171,128,199,96,218,243,205,1,98,164,2,56,52,32,235,
-43,2,130,190,128,19,227,88,1,32,239,2,48,32,35,123,199,98,163,157,
-224,96,114,32,10,2,65,32,58,96,167,103,179,32,10,232,127,0,71,152,
-2,49,57,49,129,192,72,85,65,39,164,179,96,16,231,152,1,2,49,55,
-50,104,238,231,152,1,192,56,101,82,192,68,97,107,64,11,32,63,131,130,
-97,130,226,151,4,2,56,56,32,96,31,198,174,33,18,129,38,2,56,55,
-32,165,248,34,147,227,21,1,96,47,224,15,8,32,65,32,121,233,185,7,
-96,28,101,105,179,178,173,93,2,56,49,32,162,189,2,56,50,32,162,205,
-172,108,224,21,2,160,159,141,58,2,49,56,52,233,6,2,2,56,53,32,
-96,19,105,233,96,169,65,27,61,115,32,12,129,101,159,229,96,40,161,126,
-64,64,161,76,64,83,235,121,0,96,109,170,71,97,215,172,45,32,4,224,
-14,6,192,189,229,201,0,170,113,128,207,32,72,164,230,74,144,128,42,38,
-8,32,4,115,73,192,42,130,22,64,6,192,42,64,11,32,29,99,125,64,
-43,32,23,2,47,61,32,32,11,163,113,33,17,66,87,65,66,97,68,44,
-73,138,101,37,165,235,242,7,236,7,5,210,237,236,7,5,236,9,1,132,
-241,164,173,139,64,106,84,128,17,32,175,192,17,32,140,129,99,231,18,3,
-192,9,192,59,108,146,171,16,96,60,101,242,39,83,32,13,226,239,1,32,
-15,234,33,0,141,75,32,50,233,224,3,2,110,111,32,2,109,97,116,2,
-99,104,32,2,97,116,32,182,168,64,32,138,41,106,14,130,245,74,53,128,
-11,32,84,234,53,32,2,120,99,101,2,112,116,105,2,111,110,46,68,103,
-2,114,110,97,106,43,224,39,1,2,80,97,116,64,22,2,77,97,116,2,
-99,104,70,203,64,234,73,0,99,118,129,5,38,80,191,200,2,49,51,49,
-234,49,3,2,49,51,54,199,208,160,15,66,3,46,231,32,69,161,92,137,
-109,87,156,242,167,7,79,17,32,62,228,176,0,74,93,98,163,32,204,129,
-53,2,54,57,32,128,16,205,59,2,58,49,54,195,120,96,24,71,92,225,
-95,1,85,90,240,210,3,78,158,65,220,66,138,42,233,128,15,99,116,181,
-82,65,105,120,50,192,134,224,39,3,161,138,225,46,1,2,39,92,57,2,
-50,38,39,2,39,34,32,160,28,97,159,96,230,224,99,3,101,30,138,131,
-224,17,3,139,119,233,59,3,224,168,1,32,169,133,104,155,209,247,164,1,
-98,9,128,158,130,166,64,101,224,147,4,64,146,70,53,240,136,2,33,21,
-226,190,3,73,196,227,26,3,135,115,166,172,32,77,99,108,161,162,33,145,
-69,122,129,145,212,98,65,186,165,73,32,138,67,107,32,6,137,173,107,150,
-131,4,2,90,32,95,2,49,54,52,226,64,2,224,163,5,224,160,0,2,
-67,32,79,192,96,136,153,138,17,120,28,225,22,7,96,0,2,79,32,80,
-54,234,241,38,3,64,79,2,97,34,32,192,27,249,238,4,64,27,2,98,
-34,32,192,27,77,12,224,28,5,2,102,34,32,224,28,0,241,124,4,64,
-28,146,75,128,28,32,225,224,28,5,109,127,128,28,34,31,224,27,5,2,
-116,34,32,224,56,0,33,179,224,28,5,2,118,34,32,224,56,0,224,143,
-8,64,3,96,31,250,153,2,33,193,132,80,69,201,65,76,165,24,157,234,
-2,49,53,52,35,56,65,31,65,45,32,12,2,64,35,53,132,182,65,127,
-99,13,2,53,57,32,32,13,202,193,238,157,0,225,189,0,115,147,100,82,
-96,17,32,43,206,52,136,20,203,213,207,141,2,49,54,48,32,49,37,162,
-138,200,248,130,1,185,66,64,30,64,69,131,183,64,67,226,230,2,75,54,
-140,35,192,64,97,121,226,96,9,64,69,104,122,203,113,192,40,226,52,3,
-224,10,1,96,58,106,47,235,244,1,96,250,129,28,130,75,109,213,224,74,
-3,32,165,132,76,2,111,114,100,33,36,32,46,64,12,2,99,104,114,64,
-12,210,174,106,11,234,13,1,65,94,103,101,224,175,1,70,1,129,116,33,
-88,225,159,10,124,108,225,159,0,138,128,32,43,129,203,2,60,61,32,32,
-11,204,126,198,68,64,60,161,243,64,16,129,200,2,48,32,58,100,5,131,
-206,35,203,177,89,238,195,3,32,33,167,96,64,16,2,58,49,52,177,108,
-103,153,69,97,32,5,76,60,99,84,199,111,64,17,32,11,2,61,61,32,
-32,11,160,194,128,196,83,180,67,205,197,61,68,231,64,66,231,60,0,34,
-56,192,15,32,59,242,104,0,2,49,52,50,96,23,77,17,96,35,115,112,
-32,16,32,156,66,72,32,20,210,108,199,219,194,70,169,194,96,10,179,181,
-218,131,224,32,2,254,36,1,196,203,242,108,1,97,20,224,65,4,224,64,
-5,64,143,196,212,195,100,181,56,247,12,1,192,169,66,95,32,30,240,228,
-6,96,30,172,44,115,242,97,33,178,246,180,243,32,19,226,67,0,160,53,
-180,248,240,182,3,113,121,98,42,116,252,82,55,79,176,32,14,167,121,181,
-30,80,80,2,83,116,114,2,105,110,103,33,164,181,27,163,52,97,130,84,
-132,176,69,115,66,128,26,115,239,112,29,2,95,53,32,128,78,161,140,128,
-39,32,55,106,113,33,227,192,31,129,151,2,110,101,119,2,67,65,83,96,
-111,2,76,101,110,64,114,129,32,224,223,5,129,21,75,215,244,209,2,35,
-48,109,88,2,58,49,50,237,81,1,239,84,8,109,222,224,49,1,171,54,
-180,217,139,74,224,51,7,64,31,129,12,107,56,32,13,229,14,0,128,2,
-126,117,100,51,73,154,98,123,180,228,239,216,13,96,35,233,219,4,32,54,
-32,200,84,55,79,135,224,27,11,128,120,245,209,3,224,188,1,129,3,2,
-114,101,109,33,16,180,229,253,64,1,247,22,0,253,87,5,224,20,1,224,
-17,8,224,14,5,247,88,14,128,200,181,10,225,105,3,225,55,4,181,4,
-2,79,32,58,100,39,68,17,46,238,42,49,2,49,48,49,98,227,160,8,
-32,6,73,185,115,59,32,11,68,52,160,11,37,50,224,11,1,75,126,192,
-11,98,187,84,253,32,90,129,143,2,94,112,111,2,107,101,87,133,83,181,
-22,2,94,112,101,2,101,107,87,160,18,193,116,107,180,32,59,160,120,86,
-104,64,90,225,89,3,162,72,180,99,224,50,0,115,155,224,50,0,246,112,
-1,32,18,169,130,69,203,32,13,141,226,180,99,2,116,111,73,2,110,116,
-32,32,14,129,44,2,116,111,80,2,116,114,32,32,14,194,115,225,204,4,
-179,53,175,243,210,248,252,131,0,96,126,141,152,101,126,70,238,47,15,106,
-231,106,141,179,106,240,77,8,178,105,201,133,32,69,32,241,117,101,96,66,
-32,7,64,68,2,95,56,56,160,134,248,91,0,230,134,5,178,101,111,135,
-114,120,72,250,32,22,129,40,2,113,117,111,96,232,225,25,1,226,131,89,
-177,62,242,106,3,243,213,2,2,95,57,53,228,159,0,224,21,1,244,199,
-12,243,196,3,2,58,57,56,197,49,80,68,2,95,53,53,32,229,176,89,
-2,94,102,114,2,101,101,32,2,58,57,54,228,4,2,224,91,6,85,103,
-149,166,253,86,1,245,100,1,187,63,80,135,224,116,3,2,58,57,53,227,
-249,6,230,94,1,250,136,3,212,67,142,73,244,222,9,166,94,230,123,0,
-224,119,1,32,115,180,225,202,232,38,211,250,89,6,103,37,177,34,33,253,
-2,51,32,90,227,211,3,2,58,57,51,96,25,76,91,2,83,32,80,96,
-155,79,182,213,173,44,251,80,215,65,113,98,83,224,95,8,128,94,195,108,
-228,51,9,2,58,57,49,218,68,33,98,227,97,2,72,226,130,175,247,7,
-0,226,180,7,177,15,247,206,6,2,117,110,100,2,101,102,105,2,110,101,
-100,74,225,2,58,56,56,229,232,20,240,216,0,41,203,99,202,106,116,106,
-171,74,158,234,155,12,78,50,234,151,2,72,87,64,1,2,95,55,57,224,
-37,3,234,120,2,64,37,96,19,96,10,2,95,56,53,33,18,177,68,2,
-85,32,67,130,154,64,114,75,200,128,130,64,45,161,65,32,20,32,12,97,
-123,230,124,1,98,115,128,175,65,112,97,237,249,111,1,132,188,64,30,131,
-29,224,35,1,224,55,11,225,10,0,186,152,44,6,131,232,75,217,224,13,
-1,71,151,225,105,6,180,72,2,58,32,117,2,110,115,117,2,112,112,111,
-2,114,116,101,2,100,32,119,69,124,2,115,105,122,158,166,32,54,2,55,
-54,56,64,250,58,184,2,55,52,56,2,51,54,52,68,63,178,41,244,23,
-2,235,186,0,81,171,248,28,2,116,5,148,10,81,252,129,20,66,20,32,
-196,161,33,97,143,50,98,129,98,66,111,178,125,2,105,110,118,2,32,58,
-56,130,123,2,115,104,114,32,11,130,107,74,127,178,30,230,200,15,178,37,
-227,16,0,165,14,178,48,2,95,54,52,183,99,80,25,2,95,55,48,64,
-4,65,186,116,52,81,42,2,95,55,53,236,128,0,33,65,145,226,241,225,
-1,251,16,4,87,57,89,24,240,139,0,177,217,224,29,1,224,49,1,224,
-39,5,229,250,0,227,181,7,178,2,2,62,61,32,2,58,55,51,128,10,
-32,9,129,9,76,8,176,236,2,60,32,58,176,229,2,105,99,109,2,112,
-32,58,176,231,107,196,78,13,2,95,54,55,32,102,176,239,75,193,175,228,
-65,64,174,45,50,112,174,44,229,253,93,174,110,233,103,13,174,125,2,110,
-101,103,32,149,128,237,2,42,32,58,174,33,2,45,32,58,173,133,2,43,
-32,58,173,130,224,156,68,2,58,53,56,224,155,7,193,143,173,204,171,12,
-67,131,121,219,69,156,64,12,166,112,32,39,169,51,85,103,173,183,53,77,
-173,181,64,41,66,100,109,185,173,184,64,29,128,232,64,9,128,232,2,94,
-109,97,2,108,108,111,2,99,32,58,173,161,235,74,3,173,166,50,212,173,
-151,224,206,14,2,58,52,55,229,138,1,108,199,2,95,52,53,64,63,235,
-23,1,214,130,173,140,2,114,97,105,2,115,101,32,2,58,52,52,192,141,
-173,120,2,65,46,114,2,101,97,100,32,14,160,166,2,79,46,103,2,101,
-116,65,2,114,103,82,2,101,102,32,2,58,52,49,128,239,36,92,2,95,
-51,57,64,95,128,178,32,37,2,115,116,100,62,195,2,32,58,51,162,147,
-96,34,66,142,172,236,128,34,2,111,117,116,32,34,165,196,44,173,2,58,
-51,54,192,127,172,187,128,56,75,163,172,145,128,56,2,105,110,32,2,58,
-51,51,162,238,38,66,70,86,64,7,67,212,92,85,103,113,76,108,2,95,
-51,49,96,230,172,151,2,94,97,100,2,100,95,70,2,73,76,69,32,62,
-161,110,64,17,2,117,116,102,2,56,32,58,172,156,186,15,146,235,118,184,
-172,160,32,122,2,112,101,114,2,102,111,114,2,109,73,79,59,180,160,200,
-32,9,184,194,74,238,231,237,4,2,58,50,54,224,35,0,160,206,72,119,
-68,101,96,35,68,105,65,150,172,125,32,95,2,62,62,32,2,58,50,51,
-167,23,73,182,128,33,45,127,200,251,43,194,96,65,92,82,224,9,0,160,
-85,32,73,177,148,155,53,72,232,184,21,156,64,112,82,172,149,128,35,96,
-32,117,165,192,32,2,95,56,32,124,204,128,132,2,55,32,58,172,162,224,
-47,7,96,150,151,1,151,177,248,61,0,237,156,7,195,70,172,82,120,184,
-48,128,227,109,5,202,177,234,247,7,32,172,224,12,4,96,212,119,189,46,
-77,224,66,1,143,93,236,21,0,249,97,1,194,162,97,214,110,243,131,178,
-73,93,129,96,75,15,227,223,0,64,208,104,163,72,247,209,92,237,53,1,
-37,155,162,35,2,58,54,32,161,179,2,114,101,116,2,117,114,110,35,175,
-225,196,1,37,96,128,199,37,95,208,192,228,150,45,2,58,50,32,227,231,
-19,238,96,3,64,15,64,200,37,255,245,9,0,224,0,255,224,0,255,224,
-0,115,1,32,125,
-};
+32,13,240,134,1,70,110,196,121,227,50,1,114,57,98,40,0,51,63,72,
+99,167,141,113,128,14,32,65,133,189,242,154,1,35,30,33,14,128,93,133,
+119,224,27,7,128,135,132,1,36,53,0,51,115,185,121,24,128,216,38,87,
+160,54,206,8,75,35,96,247,195,10,154,117,250,229,0,162,65,250,223,6,
+109,14,0,35,67,106,163,226,155,10,255,117,7,128,38,67,217,135,117,38,
+216,106,46,163,193,162,126,224,50,10,224,89,0,154,185,224,89,16,66,53,
+192,89,105,219,224,89,0,128,19,106,39,196,47,135,61,83,76,163,27,0,
+82,68,112,203,120,84,225,129,39,33,38,212,25,64,216,32,70,33,151,64,
+120,99,110,96,49,157,103,68,115,103,75,0,53,84,110,32,54,179,253,224,
+54,16,128,213,32,131,102,201,192,53,130,108,224,108,18,180,12,0,53,224,
+108,5,243,20,1,199,47,231,16,6,246,1,2,243,226,0,255,151,0,96,
+253,224,47,1,231,24,0,134,14,255,87,4,231,36,0,224,91,8,252,163,
+1,228,125,0,147,198,255,250,1,156,104,224,57,4,167,156,230,48,8,64,
+19,224,162,0,69,252,244,11,0,176,129,64,27,1,95,51,69,255,67,214,
+230,42,1,160,171,36,30,84,19,97,196,225,65,5,197,32,33,53,131,163,
+234,75,9,233,222,11,0,54,157,98,233,93,1,239,254,0,163,80,234,110,
+4,0,53,70,162,0,53,84,142,32,71,48,126,0,54,174,90,238,254,0,
+238,139,2,198,253,0,53,45,181,128,51,101,33,39,156,32,76,136,230,138,
+188,212,79,165,46,192,108,64,23,32,221,224,90,61,33,21,132,171,97,124,
+224,209,4,98,121,225,253,1,130,104,245,47,5,229,90,1,0,100,121,35,
+0,100,241,156,0,168,131,225,104,3,235,141,1,224,100,1,75,119,240,65,
+8,93,227,161,75,225,86,5,73,150,113,220,170,161,241,145,10,1,44,41,
+209,227,235,105,5,32,66,233,71,0,194,78,136,130,236,6,0,246,218,1,
+1,95,52,69,251,0,54,70,141,204,34,245,233,12,0,90,107,88,96,174,
+73,90,236,84,5,96,0,227,103,2,225,16,10,224,18,10,225,32,7,228,
+182,1,66,215,165,6,233,147,0,224,45,6,97,73,77,76,129,88,224,70,
+12,64,194,96,34,224,171,7,224,93,9,224,189,7,230,14,13,98,9,225,
+139,12,226,19,5,230,42,0,203,62,138,96,97,87,229,225,0,96,101,105,
+241,102,150,203,136,197,107,224,179,0,65,210,32,152,237,3,7,225,168,0,
+224,5,3,139,10,32,42,64,45,94,185,224,69,13,0,64,39,49,224,26,
+5,32,215,192,26,33,62,224,26,14,72,122,0,54,232,99,2,252,127,70,
+32,5,1,73,102,33,72,252,125,0,4,51,56,58,49,50,252,127,0,160,
+132,250,193,2,195,121,133,123,224,10,0,225,83,0,107,147,66,230,142,50,
+225,9,12,225,80,7,170,150,160,81,237,68,2,202,116,225,100,6,237,212,
+3,224,111,40,64,214,64,1,67,140,197,141,98,181,66,92,61,251,100,35,
+224,48,0,227,212,0,254,212,11,170,238,224,69,0,131,47,96,72,194,33,
+33,22,104,161,211,93,224,89,10,225,226,104,1,52,53,225,226,1,37,159,
+252,247,1,71,156,231,199,2,33,112,101,142,239,13,2,231,84,9,71,78,
+137,41,234,133,4,192,21,203,206,64,69,81,117,171,203,32,118,207,220,149,
+38,120,62,144,66,87,39,65,209,107,211,100,181,225,26,1,2,39,96,95,
+128,184,32,64,183,4,0,53,42,174,104,160,0,53,42,211,128,168,37,197,
+137,117,33,229,64,23,228,53,4,2,69,120,112,55,241,3,101,100,32,101,
+59,6,1,111,102,55,247,7,112,117,116,32,40,69,79,70,229,218,0,0,
+58,103,156,252,21,16,36,149,139,3,254,227,5,248,24,17,0,35,56,164,
+248,88,0,166,23,248,87,1,0,49,124,223,207,144,224,64,2,81,136,241,
+248,2,96,43,34,213,32,28,240,42,0,64,141,236,140,0,96,251,194,119,
+189,126,157,123,234,217,4,1,64,35,73,222,192,212,32,55,0,54,88,165,
+225,226,0,193,164,160,26,32,42,64,135,243,101,0,1,64,89,226,42,3,
+162,12,229,181,1,78,12,224,92,1,224,10,0,235,137,13,111,91,192,33,
+236,179,1,235,143,14,254,57,0,76,244,128,153,128,172,224,26,0,224,108,
+1,66,186,208,0,143,195,226,194,3,140,125,232,118,1,236,131,15,192,87,
+224,204,6,224,159,13,129,84,239,195,1,224,124,3,66,57,225,75,11,194,
+14,239,124,0,255,54,0,224,134,10,210,119,208,215,224,107,21,225,210,3,
+226,42,0,140,13,1,65,32,32,10,139,225,0,75,64,10,222,228,209,170,
+128,235,200,145,224,144,10,208,197,225,6,11,139,79,210,58,242,66,1,209,
+181,224,237,1,231,140,0,255,32,3,144,5,32,191,96,201,32,156,138,61,
+210,244,201,30,52,115,165,146,135,231,33,79,96,56,32,48,132,206,32,196,
+232,252,38,172,93,233,178,3,127,165,32,57,235,8,10,107,5,234,72,0,
+160,145,234,18,19,250,168,12,235,230,8,224,145,2,224,48,12,237,87,3,
+231,24,0,177,132,179,234,232,227,6,97,22,194,243,167,87,225,139,3,231,
+90,6,144,172,0,48,160,158,230,239,8,82,121,65,97,167,39,245,31,12,
+245,47,12,82,21,97,211,231,23,14,231,8,107,2,51,55,55,231,8,0,
+34,56,240,245,7,132,32,225,95,5,225,104,3,193,160,225,137,2,128,47,
+230,203,0,254,68,1,33,137,100,143,245,237,0,84,129,32,248,33,71,66,
+62,114,137,96,33,90,125,126,103,242,161,1,224,69,0,224,60,14,213,174,
+128,143,100,26,230,142,21,4,109,97,99,114,111,198,142,194,26,166,145,129,
+250,255,52,22,0,101,199,66,255,43,10,64,7,230,213,1,224,169,6,230,
+228,10,224,86,2,11,97,114,103,117,109,101,110,116,115,44,32,98,39,146,
+4,119,97,115,32,103,33,227,0,110,160,102,224,89,5,160,244,194,55,226,
+176,0,244,133,1,1,50,55,99,40,142,20,121,149,128,167,234,109,2,202,
+93,246,151,2,67,243,91,78,239,143,5,160,96,66,182,32,9,228,172,0,
+108,213,133,30,2,53,56,53,106,135,96,59,135,102,165,183,244,215,4,66,
+27,64,95,82,66,239,242,6,96,39,224,97,9,65,60,160,200,32,9,69,
+230,161,76,165,246,133,141,69,70,65,126,70,95,228,120,0,34,212,169,36,
+2,52,48,56,67,228,0,58,96,64,178,16,71,224,0,75,64,83,0,50,
+227,114,2,33,218,1,97,110,89,66,4,44,32,97,116,32,227,128,70,4,
+72,97,115,104,68,109,180,234,139,0,2,53,58,54,129,221,224,137,129,109,
+195,224,139,128,81,236,225,23,129,150,164,66,143,139,187,0,54,84,63,100,
+153,64,22,180,162,238,44,3,160,9,152,179,63,207,144,7,32,11,145,137,
+102,233,1,95,49,121,118,85,34,32,10,98,235,32,76,136,171,232,149,0,
+74,223,153,157,248,133,5,67,181,224,53,2,183,62,226,222,15,228,98,2,
+226,222,118,224,137,112,226,222,10,224,139,114,226,222,8,224,139,114,216,204,
+34,70,139,18,226,70,16,32,89,64,129,64,167,226,72,120,224,139,114,226,
+74,10,224,141,116,129,190,83,76,224,148,128,34,75,219,171,53,245,64,152,
+105,220,0,54,81,28,32,27,140,172,0,73,45,133,64,16,112,206,0,48,
+111,119,39,175,73,140,149,245,40,200,192,56,0,49,45,226,224,11,1,99,
+61,64,11,32,63,167,233,0,49,49,14,0,75,183,7,44,77,225,4,1,
+6,110,111,32,102,105,101,108,201,180,96,29,144,87,65,47,160,105,44,102,
+160,11,0,58,96,6,96,145,64,80,42,88,105,20,224,81,3,13,67,111,
+110,116,114,111,108,46,69,120,99,101,112,116,38,145,8,46,73,110,116,101,
+114,110,97,108,64,98,224,39,1,10,82,101,99,83,101,108,69,114,114,111,
+114,96,123,204,194,32,98,251,11,1,67,103,41,1,73,4,140,135,97,203,
+252,96,0,32,43,134,93,207,139,179,241,45,145,101,252,64,8,1,53,56,
+78,244,0,50,173,42,198,46,234,224,0,73,161,107,99,75,140,238,117,5,
+198,137,96,37,152,56,32,28,0,53,58,38,33,13,170,103,32,129,189,185,
+0,52,33,210,32,28,32,113,128,28,32,11,65,160,128,11,0,49,82,190,
+32,5,77,36,0,53,46,252,192,23,0,54,58,43,224,11,1,65,196,192,
+11,224,100,0,32,97,134,190,243,131,1,110,144,0,50,115,130,0,53,170,
+240,243,102,3,243,142,3,32,68,32,150,0,52,138,168,32,45,98,34,224,
+6,4,32,95,222,69,71,202,0,52,94,75,96,21,249,161,2,187,8,224,
+114,4,224,101,6,42,180,224,101,12,32,72,130,206,192,94,193,184,130,217,
+224,94,29,0,52,39,247,224,94,16,130,226,225,208,0,224,69,3,160,60,
+33,87,224,60,5,0,58,65,131,219,149,72,171,96,46,64,199,65,194,77,
+108,120,93,51,103,128,9,157,20,221,212,192,66,200,239,92,48,0,49,84,
+185,32,19,130,142,224,86,9,34,90,66,55,64,77,224,88,25,130,81,97,
+48,150,149,247,114,0,64,29,226,13,0,34,143,32,67,253,65,1,221,150,
+115,50,253,28,1,236,210,1,110,107,32,226,220,200,249,19,0,224,155,1,
+193,206,225,2,14,254,216,0,96,170,125,39,224,40,13,236,167,0,0,64,
+125,10,67,66,36,151,64,56,68,95,32,197,199,75,32,17,113,35,82,164,
+32,22,130,116,45,36,1,49,32,32,13,226,57,0,96,27,130,49,32,13,
+0,51,225,20,5,32,26,130,3,0,80,32,51,64,131,96,37,34,198,32,
+13,193,163,234,47,0,109,79,182,166,143,149,138,44,49,94,143,98,141,236,
+100,37,97,213,161,23,96,103,64,21,224,144,1,68,29,234,140,7,132,195,
+252,191,1,180,68,145,36,211,161,32,58,129,196,192,165,190,34,192,141,144,
+80,190,34,32,7,32,111,163,55,50,11,131,239,32,161,177,55,119,68,96,
+35,226,42,6,160,43,160,147,32,101,179,52,224,101,8,0,53,80,136,160,
+101,99,252,224,101,0,249,212,1,146,144,224,103,19,248,35,1,160,95,126,
+15,240,166,1,224,60,21,225,27,0,228,16,3,0,51,82,27,224,254,12,
+99,116,32,33,33,176,224,85,19,176,6,47,2,230,119,1,1,87,104,48,
+59,31,108,111,111,107,105,110,103,32,102,111,114,32,97,32,110,111,110,45,
+101,109,112,116,121,32,115,101,113,117,101,110,99,101,4,32,119,105,116,104,
+32,13,15,112,97,114,97,116,111,114,115,58,92,49,48,38,92,57,38,102,
+169,33,74,217,29,255,185,1,211,223,32,145,128,133,117,145,244,51,2,224,
+41,8,33,78,252,73,10,32,92,249,3,0,244,2,2,0,55,65,29,149,
+34,130,89,230,171,6,132,233,254,20,1,241,172,22,241,171,11,216,125,241,
+137,16,2,103,111,116,192,47,224,181,6,32,180,249,119,2,0,89,241,63,
+0,39,144,253,173,12,219,174,67,49,243,219,42,3,112,111,108,121,33,153,
+1,115,101,41,135,2,49,50,47,64,43,5,84,101,120,116,47,80,64,19,
+201,109,4,49,48,57,58,55,210,35,248,249,0,54,122,35,82,224,14,1,
+246,191,3,65,55,224,25,13,68,179,214,59,248,16,9,92,83,96,57,254,
+82,2,248,164,5,116,212,151,53,122,144,46,213,67,104,209,171,96,64,192,
+12,128,44,100,98,97,102,0,50,73,207,0,53,126,137,99,31,224,134,49,
+143,14,224,133,29,96,43,224,132,75,0,49,156,22,225,11,30,96,44,224,
+134,8,216,191,224,134,50,99,79,224,133,30,96,43,224,132,16,255,244,1,
+182,32,251,100,1,229,101,1,252,185,5,227,94,12,8,44,59,40,41,91,
+93,123,125,96,195,98,230,157,0,116,148,229,23,0,71,221,224,99,6,253,
+38,3,34,60,251,215,6,234,33,1,165,203,128,6,38,23,33,206,128,97,
+157,13,165,132,228,55,19,5,66,97,100,32,99,104,37,20,36,60,1,114,
+58,236,52,0,117,128,220,127,168,85,250,43,1,161,164,128,128,251,93,0,
+252,6,23,0,52,153,129,252,6,3,245,197,0,138,231,251,165,2,64,14,
+64,62,162,161,114,77,225,125,1,231,129,0,126,115,68,229,217,244,65,234,
+96,103,231,159,1,225,232,0,162,18,193,241,192,91,213,146,224,48,8,224,
+46,14,246,94,0,226,103,3,224,62,10,96,54,254,240,30,1,95,39,229,
+135,1,250,162,0,224,98,25,96,79,73,98,197,20,128,47,32,22,0,79,
+230,181,2,226,168,23,22,33,64,35,36,37,38,42,43,46,47,60,61,62,
+63,92,57,50,38,94,124,58,45,126,248,57,1,123,147,129,223,253,22,3,
+224,204,15,1,101,69,224,58,12,253,145,0,254,74,5,227,231,6,128,204,
+224,110,4,226,14,8,192,130,225,135,11,226,22,12,231,53,16,0,43,231,
+46,4,226,45,5,226,37,7,224,192,30,232,207,1,224,192,91,0,45,224,
+192,35,224,140,76,40,249,75,220,221,4,224,136,31,196,162,250,193,20,2,
+105,115,115,73,212,7,43,47,45,47,100,105,103,105,200,173,224,51,19,1,
+97,102,36,200,8,32,101,32,105,110,32,102,108,111,50,5,224,50,25,1,
+108,105,32,50,1,97,108,196,253,250,128,0,38,51,197,4,217,119,224,252,
+20,224,81,1,2,46,46,46,227,207,1,163,133,131,153,160,0,0,89,129,
+107,98,73,58,179,126,241,97,34,198,166,225,240,16,4,110,100,32,111,102,
+32,221,0,112,59,58,32,227,241,229,0,224,47,14,2,115,116,114,65,65,
+160,226,233,237,2,191,160,229,122,4,97,150,233,38,7,229,166,1,247,234,
+8,64,213,0,55,98,239,64,68,167,22,203,247,161,223,87,236,234,17,80,
+3,49,56,58,52,212,22,228,255,3,80,53,78,107,251,57,2,64,0,251,
+53,4,64,36,95,237,67,176,230,240,4,65,140,92,83,160,60,238,248,0,
+0,67,103,100,0,50,39,125,138,115,172,152,97,183,235,8,4,225,173,13,
+160,166,0,58,107,249,115,194,236,12,1,45,175,40,128,111,78,0,53,32,
+182,194,109,235,222,10,0,97,225,202,0,71,181,128,83,101,137,234,247,7,
+236,59,2,224,70,1,3,98,105,110,100,194,49,236,138,2,144,211,224,17,
+3,65,24,0,54,83,102,224,143,14,224,132,3,1,32,104,61,193,116,118,
+52,18,0,32,198,200,65,141,224,150,41,237,58,5,97,45,143,240,238,69,
+3,1,53,55,238,222,15,238,251,19,32,74,207,236,142,87,32,16,207,239,
+225,139,4,175,134,111,137,237,239,0,165,208,224,207,3,66,96,106,145,224,
+228,9,224,196,2,224,240,12,225,206,14,0,44,109,145,0,39,232,11,0,
+224,152,14,237,136,3,160,138,229,200,0,224,27,10,208,192,224,27,10,0,
+49,83,202,224,28,16,158,216,224,28,15,99,1,224,28,15,169,130,224,28,
+13,224,144,18,97,83,224,27,14,131,198,224,27,14,99,165,224,83,14,192,
+55,101,109,64,27,102,136,224,157,15,108,205,224,28,14,237,246,0,64,24,
+0,52,81,13,239,164,5,229,185,19,9,117,110,114,101,99,111,103,110,105,
+115,33,247,5,101,115,99,97,112,101,240,157,1,37,201,226,8,3,1,58,
+32,73,133,195,221,233,203,0,208,48,224,151,7,0,54,245,96,0,224,27,
+10,97,138,224,27,14,215,57,224,27,11,97,165,224,27,14,97,109,224,27,
+13,133,67,224,27,14,97,91,224,27,14,97,249,224,27,14,224,195,18,68,
+31,224,27,15,115,81,224,27,15,106,104,224,27,14,97,79,228,193,9,120,
+61,230,206,81,5,51,48,56,58,49,52,163,252,81,73,227,251,5,224,141,
+8,66,215,229,230,24,196,137,34,217,160,17,226,155,10,0,39,66,110,1,
+86,84,228,120,0,224,124,26,110,94,224,124,32,87,76,224,124,20,1,85,
+83,228,245,3,0,53,59,30,224,4,17,224,154,22,111,221,230,254,34,224,
+67,12,66,57,225,91,34,200,13,224,154,60,224,86,1,168,101,226,9,61,
+224,67,22,67,71,224,154,33,234,203,0,224,242,24,226,40,37,0,49,181,
+230,224,174,24,225,228,59,224,242,38,224,243,32,100,63,224,156,54,101,183,
+224,156,34,177,92,227,188,29,123,111,227,188,33,128,248,227,188,17,4,83,
+79,72,39,32,160,9,192,8,1,84,88,192,9,0,73,192,8,1,89,78,
+192,9,0,85,41,200,55,168,128,12,0,80,240,251,1,228,119,73,146,194,
+224,186,17,0,82,228,119,9,225,220,90,102,208,224,197,33,179,135,225,31,
+27,104,10,224,157,55,224,67,28,226,122,1,228,253,1,225,101,15,2,78,
+85,76,225,240,1,2,78,65,75,225,241,35,104,80,228,64,34,225,241,23,
+1,76,70,230,230,35,231,99,37,174,249,224,123,16,0,72,231,98,82,154,
+54,224,124,18,0,71,226,234,40,225,122,39,165,32,224,218,73,151,154,224,
+218,17,1,70,70,226,94,1,0,70,224,230,1,232,74,20,231,83,137,181,
+199,232,69,62,226,216,68,208,238,231,83,62,224,155,22,118,169,224,155,32,
+254,24,0,225,210,91,231,150,39,193,211,225,56,25,77,139,224,88,34,192,
+245,227,108,63,224,246,22,224,157,38,209,191,227,178,12,2,111,110,101,83,
+21,99,173,0,69,232,39,0,2,69,79,84,192,9,1,78,81,192,9,0,
+84,40,40,128,9,0,77,227,225,1,2,69,83,67,227,226,14,224,197,23,
+234,52,59,226,0,37,0,49,225,10,2,224,88,59,224,224,59,224,156,1,
+234,52,35,226,2,28,229,99,37,113,51,224,174,34,129,74,224,85,23,32,
+120,224,85,36,189,247,224,86,24,228,149,37,183,5,224,86,25,238,105,37,
+146,129,231,13,21,1,68,69,233,109,2,2,68,76,69,224,12,2,6,67,
+91,49,46,46,52,93,227,62,9,228,67,23,239,15,38,164,246,234,175,94,
+237,199,38,247,187,0,225,65,16,1,67,82,225,51,1,2,67,65,78,225,
+46,40,228,104,106,251,91,0,233,125,72,233,124,23,0,66,226,110,3,0,
+66,233,125,2,228,83,62,236,173,69,196,242,224,207,17,1,65,67,236,159,
+2,0,95,94,224,122,38,32,56,2,95,52,52,100,4,0,53,64,58,1,
+50,48,162,228,224,34,14,32,113,224,34,0,90,143,224,36,9,86,101,0,
+95,69,42,120,41,120,216,32,47,245,239,1,32,15,0,52,224,68,2,225,
+9,8,86,133,93,176,0,49,88,242,33,20,0,52,49,60,1,95,51,99,
+170,0,35,89,188,64,19,89,201,160,18,58,184,128,138,246,176,30,249,227,
+4,4,99,116,114,108,45,182,181,52,229,5,102,111,114,109,101,100,150,166,
+0,94,246,167,9,64,86,249,2,0,64,113,64,239,121,80,52,8,0,95,
+145,187,0,49,73,74,96,5,128,172,228,214,0,235,15,1,204,209,224,17,
+1,128,40,237,113,3,208,155,244,231,9,237,149,8,228,158,7,238,53,11,
+236,204,7,227,7,10,227,114,7,249,237,3,126,253,68,33,225,103,6,253,
+208,18,218,10,225,110,4,194,127,58,163,33,181,58,163,66,245,0,83,124,
+224,68,91,224,62,1,3,100,101,99,105,33,143,96,47,129,96,32,183,90,
+254,90,251,32,153,96,124,2,50,48,48,94,167,160,191,131,116,0,53,77,
+220,32,94,33,81,155,2,0,53,161,163,64,69,157,69,190,242,106,106,32,
+41,32,11,224,136,18,2,111,99,116,224,134,28,161,69,0,53,120,95,224,
+133,0,32,45,224,91,18,2,104,101,120,224,224,27,131,218,32,60,224,224,
+4,32,213,92,63,227,43,3,32,5,2,55,32,35,63,222,191,216,108,69,
+153,11,224,38,9,123,91,224,38,0,187,49,64,165,224,39,6,102,201,224,
+39,0,153,6,1,95,50,40,6,225,172,2,7,105,103,105,116,84,111,73,
+110,190,12,227,17,13,192,16,163,27,64,86,193,188,224,49,28,96,176,224,
+49,22,64,39,96,255,65,33,32,41,65,124,34,186,127,196,194,3,254,148,
+0,131,209,64,27,64,5,253,20,2,66,53,0,54,68,192,99,192,32,49,
+224,44,2,128,42,253,204,3,89,107,32,65,64,29,0,39,96,5,35,33,
+0,48,64,27,253,219,3,91,172,225,221,6,153,137,64,108,32,107,224,28,
+9,160,111,33,106,191,249,125,255,36,244,32,90,1,66,32,38,131,133,64,
+224,55,11,160,90,130,231,229,11,20,3,92,49,48,38,227,169,0,108,191,
+5,114,32,109,111,114,101,163,168,255,32,9,0,32,97,235,0,115,255,244,
+0,66,208,158,198,226,130,18,131,104,67,25,160,42,0,50,78,63,131,177,
+224,14,0,226,158,28,226,154,25,64,104,159,15,171,175,225,200,0,97,199,
+224,125,1,1,52,54,68,23,64,13,38,74,103,114,231,48,3,1,96,95,
+196,170,230,157,3,64,112,166,243,229,4,2,225,97,20,0,69,255,18,0,
+10,110,32,105,100,101,110,116,105,102,105,101,191,17,91,29,225,104,5,1,
+79,32,102,11,221,22,32,203,159,202,100,197,100,190,33,53,65,92,32,25,
+133,64,32,148,0,49,100,96,64,1,34,21,135,136,130,156,197,164,0,53,
+97,143,32,255,135,194,98,251,32,64,133,34,32,15,0,50,229,39,0,98,
+102,32,10,98,247,2,54,32,89,100,184,6,83,32,73,32,64,90,32,96,
+148,160,6,226,158,1,96,54,99,141,98,159,0,89,69,107,99,84,64,13,
+64,61,224,59,1,166,69,0,52,131,77,96,10,199,32,0,89,32,49,33,
+154,0,80,254,120,35,3,102,97,105,108,33,87,2,116,111,32,124,129,33,
+96,0,121,79,126,11,116,104,101,32,112,111,115,115,105,98,108,101,38,116,
+5,111,105,99,101,115,58,66,231,129,105,102,199,1,56,32,121,232,97,202,
+0,56,35,64,96,152,97,128,224,112,19,224,69,2,224,67,1,137,41,167,
+174,164,79,67,246,228,45,1,225,36,0,224,19,2,63,178,191,141,224,2,
+2,128,20,224,55,2,225,62,6,224,28,3,0,90,160,204,192,40,193,94,
+100,233,64,88,192,93,34,190,65,72,33,89,96,0,192,73,226,70,1,134,
+254,192,69,32,39,32,19,134,182,1,85,32,32,10,230,102,0,32,159,100,
+222,67,15,100,117,0,75,32,132,64,1,224,82,0,0,53,99,232,96,119,
+96,40,69,105,128,41,0,52,100,162,224,33,0,66,99,225,101,16,12,73,
+110,32,97,32,115,101,113,117,101,110,99,101,225,114,15,133,90,101,121,99,
+216,32,226,197,197,167,70,224,157,15,161,15,101,74,90,249,160,159,170,152,
+128,35,65,2,134,60,64,80,101,185,32,44,32,54,224,88,19,0,58,96,
+133,128,51,32,223,0,50,116,205,227,23,0,133,198,194,101,106,212,75,228,
+218,130,0,53,103,166,32,66,165,35,32,103,161,161,64,106,68,165,0,57,
+33,46,64,86,89,249,236,40,4,231,18,0,131,63,234,174,0,32,54,98,
+213,64,238,160,95,164,83,64,11,97,222,0,75,96,196,32,16,132,100,0,
+85,66,108,32,13,164,88,203,193,97,39,132,60,101,66,32,139,99,182,32,
+41,233,100,0,235,193,6,64,247,34,205,0,82,227,203,3,225,225,1,0,
+80,67,174,9,46,115,97,116,105,115,102,121,58,32,131,199,236,208,7,96,
+95,130,155,99,62,100,218,66,50,65,21,224,75,1,0,82,37,86,2,111,
+117,116,67,248,2,105,110,112,32,8,4,40,69,79,70,41,137,85,201,239,
+64,73,130,209,1,95,51,76,74,101,14,224,153,12,0,110,164,75,96,63,
+138,239,32,253,64,39,133,58,0,51,42,51,160,11,32,83,131,26,229,5,
+5,102,95,102,186,227,210,0,227,201,11,99,192,99,195,96,16,32,76,130,
+111,32,149,45,26,97,0,234,186,0,229,50,0,0,58,96,173,64,37,97,
+36,130,87,224,35,1,96,234,161,243,193,68,224,14,6,232,186,7,0,95,
+50,36,198,29,49,129,224,10,0,96,48,132,31,64,6,64,114,192,18,229,
+244,23,32,20,98,133,70,117,96,181,229,231,4,33,65,96,113,102,157,0,
+50,32,206,224,103,1,167,180,0,51,225,80,3,136,245,142,95,131,153,0,
+95,96,50,75,17,32,50,167,27,103,213,224,122,1,134,100,107,232,128,130,
+160,80,102,211,224,74,8,136,155,64,6,32,74,67,108,0,85,128,16,194,
+218,33,164,197,111,69,67,32,25,229,48,1,64,20,224,28,6,130,103,0,
+73,37,57,64,192,64,157,71,79,77,241,32,17,170,144,32,165,128,170,1,
+95,51,115,211,192,12,136,76,192,45,64,5,106,190,96,221,96,224,230,49,
+6,229,244,2,133,15,96,140,69,168,171,202,197,178,224,5,7,230,125,6,
+160,60,230,157,2,230,139,14,230,130,3,134,15,224,116,0,194,231,224,114,
+0,73,163,244,13,2,180,140,224,73,2,235,149,0,32,67,240,249,5,199,
+76,224,230,1,64,36,134,83,0,49,90,123,64,46,100,214,64,5,96,91,
+165,44,32,0,0,79,67,98,231,47,1,224,174,90,195,76,224,174,67,224,
+109,17,192,154,224,42,0,224,118,44,172,33,66,180,96,30,231,137,2,42,
+130,67,88,224,147,3,64,43,224,250,19,128,127,37,237,0,49,76,156,224,
+211,5,98,159,33,121,65,124,67,163,98,234,128,39,224,132,36,225,23,1,
+64,1,36,113,192,94,233,66,5,194,202,224,48,4,73,13,224,66,6,201,
+15,224,63,9,70,247,245,74,0,238,31,1,160,194,101,220,48,58,64,36,
+201,243,233,233,3,0,50,43,85,50,22,224,131,8,232,239,17,15,87,97,
+114,110,105,110,103,58,32,67,97,110,39,116,32,102,51,220,32,4,42,187,
+236,29,1,233,234,5,173,214,238,143,4,237,223,16,32,67,39,24,45,181,
+0,114,44,133,4,111,114,105,101,115,73,81,1,92,57,224,89,1,239,27,
+3,160,89,192,203,125,231,224,13,1,225,161,4,238,67,5,224,80,2,225,
+210,32,238,151,23,4,32,32,65,115,107,43,224,51,147,1,32,98,40,39,
+200,33,37,70,32,140,248,47,0,230,213,0,97,180,165,75,224,88,16,1,
+109,105,44,25,1,110,103,97,97,224,82,1,224,40,0,224,157,0,240,23,
+1,162,21,71,68,96,97,1,95,53,153,89,129,55,140,229,137,150,142,158,
+224,39,1,0,51,108,79,224,157,3,235,134,0,160,63,129,88,105,54,45,
+246,32,130,160,186,225,151,0,178,170,1,53,51,70,166,169,205,131,117,160,
+19,162,197,203,158,32,76,96,67,106,227,40,112,96,39,32,17,38,78,135,
+199,0,85,170,189,32,22,146,86,32,25,167,121,74,93,69,122,32,8,86,
+225,68,42,112,88,96,23,40,247,234,125,2,239,51,2,225,190,13,53,62,
+0,47,239,64,0,173,29,32,105,135,176,192,93,224,181,1,229,252,7,234,
+185,3,128,230,224,251,12,32,81,135,183,0,80,39,111,79,55,135,47,225,
+131,1,73,23,128,69,209,144,1,95,53,65,110,169,20,64,35,32,16,0,
+56,242,202,2,32,5,12,45,56,47,47,82,79,85,78,68,84,82,73,80,
+128,196,135,129,228,25,1,35,230,96,154,96,215,32,98,139,188,65,239,208,
+224,97,211,140,50,224,145,4,32,52,162,41,98,58,116,21,96,253,83,207,
+2,64,95,56,178,208,0,35,142,47,242,153,2,96,61,99,134,224,122,2,
+226,93,6,225,52,0,183,135,128,241,192,181,128,167,224,199,3,97,30,33,
+65,32,78,129,202,160,73,240,126,1,64,102,32,210,1,75,51,69,210,32,
+14,136,211,4,94,103,101,116,98,65,114,170,180,0,50,38,92,0,79,41,
+135,32,153,32,6,0,50,77,7,170,214,65,1,181,0,128,230,0,50,64,
+17,226,51,12,225,121,13,244,105,6,12,117,110,107,110,111,119,110,32,116,
+101,120,116,32,46,32,1,111,100,35,204,236,58,2,97,209,66,234,64,123,
+130,241,138,15,108,194,65,181,235,18,1,97,2,35,9,0,50,50,47,160,
+27,96,54,210,61,0,48,108,115,114,43,0,53,96,43,35,79,135,89,45,
+156,0,53,182,61,64,54,141,75,0,50,110,227,32,17,173,62,0,49,33,
+131,78,47,148,169,74,53,243,170,1,0,57,215,203,38,41,160,92,32,11,
+96,134,64,11,32,68,209,155,0,49,33,120,33,3,100,28,0,52,225,8,
+2,17,67,111,110,116,114,111,108,46,69,120,99,101,112,116,105,111,110,46,
+53,125,2,101,114,110,150,171,224,39,1,3,83,111,109,101,224,35,0,140,
+214,168,4,32,100,202,201,161,34,66,152,203,195,73,16,0,53,44,7,34,
+75,173,140,70,238,192,233,142,54,64,30,32,17,4,99,97,116,99,104,34,
+13,64,63,130,254,226,241,4,67,124,89,199,209,221,65,208,229,160,18,4,
+111,112,101,110,70,101,156,3,99,97,110,110,51,36,64,16,216,55,226,235,
+2,0,58,99,216,227,240,11,64,109,163,240,68,105,194,21,0,49,111,166,
+226,254,3,131,16,224,33,2,67,192,128,90,244,170,1,227,185,2,0,48,
+32,21,228,9,7,65,47,134,7,224,5,0,33,58,106,51,69,126,64,3,
+224,96,1,98,51,226,210,7,3,72,97,110,100,39,237,11,97,108,114,101,
+97,100,121,32,99,108,111,115,207,13,227,190,7,133,124,0,53,80,57,32,
+5,136,126,227,195,1,152,39,32,188,130,192,35,179,34,108,32,14,130,161,
+114,148,0,90,140,172,96,51,136,163,32,31,217,136,32,19,32,255,0,35,
+120,93,64,29,32,20,3,65,46,119,114,57,190,33,220,64,26,67,249,96,
+158,67,251,64,126,131,251,0,55,64,13,130,10,134,93,33,41,67,109,0,
+48,37,174,167,165,32,32,130,28,7,116,111,70,117,110,80,116,114,32,50,
+32,30,208,133,67,132,112,54,32,40,65,100,173,137,130,101,65,200,129,139,
+225,142,4,34,152,0,57,110,124,119,11,225,195,1,170,89,167,185,229,58,
+4,1,52,57,68,128,64,37,1,52,57,149,23,57,94,233,71,1,35,150,
+32,3,79,242,99,228,243,80,1,98,78,162,2,167,115,32,150,193,86,117,
+117,68,250,49,210,125,177,96,5,101,4,32,37,129,92,248,99,4,194,77,
+100,3,172,155,225,229,2,129,59,232,3,1,224,55,6,229,248,1,229,250,
+4,162,126,0,95,162,194,64,122,129,194,5,73,79,46,112,101,114,92,215,
+4,73,79,32,94,38,161,191,64,31,129,209,1,102,112,42,113,65,142,129,
+207,4,102,112,110,101,119,64,14,165,233,7,97,100,100,95,70,73,76,69,
+64,18,129,194,96,18,5,117,116,102,56,32,58,97,70,146,0,0,52,87,
+175,116,26,32,21,165,120,64,32,129,188,244,138,0,192,174,232,250,3,0,
+49,72,128,224,17,3,64,216,64,19,161,91,234,66,4,0,49,66,153,147,
+172,224,23,6,198,116,224,24,6,64,129,224,23,8,227,125,1,1,119,43,
+232,166,0,0,52,136,166,187,170,102,173,0,52,114,233,32,6,201,126,193,
+111,194,34,226,120,8,32,242,176,149,0,49,34,74,99,76,96,61,105,96,
+0,56,225,206,0,104,239,126,190,32,92,65,178,192,6,0,49,52,54,160,
+118,32,56,129,194,0,116,91,89,65,76,163,131,0,102,101,18,32,15,197,
+145,131,212,234,173,0,67,77,100,11,197,204,66,24,0,50,65,149,200,86,
+122,143,155,57,160,18,32,77,195,194,52,21,53,15,181,178,64,24,167,229,
+0,51,69,178,0,51,51,243,50,164,99,62,0,51,91,73,160,11,0,52,
+61,207,155,171,0,52,95,154,96,20,83,99,65,68,96,12,0,58,96,6,
+162,44,65,43,48,239,32,207,32,22,130,45,97,23,0,51,70,154,32,7,
+35,13,0,51,81,74,32,41,33,95,0,52,39,5,65,201,32,160,168,153,
+67,49,0,51,89,230,0,80,64,165,165,218,64,185,171,89,114,144,184,80,
+233,68,3,96,84,32,121,86,213,224,23,9,160,76,131,66,227,95,0,128,
+27,246,55,0,160,24,192,52,32,238,166,7,103,235,236,55,0,66,187,1,
+61,61,33,113,129,227,84,107,0,52,73,185,226,121,1,0,98,45,232,237,
+51,1,128,61,239,203,1,144,165,233,51,13,65,11,236,171,2,132,163,233,
+96,15,77,118,233,210,0,33,178,192,196,68,180,96,12,225,54,0,224,237,
+1,240,39,4,65,162,169,18,116,156,96,33,65,171,75,112,37,185,160,219,
+183,56,96,228,224,43,1,73,138,40,192,0,51,43,167,64,6,69,52,128,
+37,235,183,0,64,39,130,119,70,173,64,76,162,36,0,51,64,182,32,70,
+100,82,67,42,128,22,66,26,64,85,32,31,212,209,65,139,96,18,0,52,
+95,111,231,136,1,112,110,163,200,142,47,32,242,116,224,96,233,96,50,135,
+146,64,97,211,174,35,164,184,91,39,195,210,56,32,72,0,60,87,174,188,
+132,224,25,9,96,70,203,213,178,86,128,25,163,137,33,222,154,103,226,25,
+0,64,24,226,186,0,232,124,0,160,43,96,131,226,74,6,64,41,160,48,
+128,36,160,219,120,105,128,0,224,129,12,162,160,224,85,14,132,206,224,85,
+8,98,71,224,144,22,132,177,224,58,19,236,233,2,224,145,3,100,115,224,
+171,12,166,221,224,112,14,99,76,224,171,45,140,224,224,171,20,224,59,16,
+66,59,224,59,10,143,0,160,0,165,185,98,103,34,77,165,51,98,77,110,
+231,70,205,154,174,128,3,196,40,164,79,101,176,238,9,2,192,12,0,49,
+32,73,192,17,0,64,41,210,192,134,243,87,2,107,145,224,23,0,224,24,
+0,224,93,0,116,224,224,99,6,224,86,4,252,57,1,224,142,11,0,52,
+61,33,224,47,6,224,24,2,0,52,76,68,225,1,4,98,141,0,58,96,
+6,171,66,133,212,193,7,71,209,66,235,36,15,224,179,0,128,123,67,5,
+219,164,77,188,131,221,64,72,96,107,96,85,198,44,33,132,227,29,11,164,
+223,192,31,69,21,1,52,55,73,155,224,24,0,229,213,7,187,129,64,91,
+132,229,0,80,169,90,103,224,68,135,82,247,0,52,104,163,32,11,0,55,
+69,56,0,50,73,59,160,19,252,240,2,97,225,210,130,192,66,224,63,2,
+96,108,160,10,0,50,41,77,219,184,97,10,170,183,224,10,1,32,144,133,
+74,231,25,1,230,123,14,131,64,250,106,1,254,125,0,108,172,117,180,227,
+235,2,234,61,0,70,112,246,214,0,229,42,1,230,64,11,33,91,243,25,
+4,230,255,11,96,253,231,77,2,225,108,10,69,99,160,0,114,155,32,226,
+169,26,69,236,32,74,104,16,64,80,188,127,229,233,2,133,220,32,29,188,
+19,1,51,54,40,124,0,51,64,13,128,10,0,52,156,170,128,10,64,193,
+128,10,76,86,192,10,224,32,1,94,244,32,80,192,142,32,85,220,31,33,
+115,32,30,107,205,0,55,105,188,64,36,137,206,224,142,0,38,188,129,186,
+230,124,4,160,58,206,81,128,20,236,142,3,224,43,9,96,33,224,43,8,
+235,220,3,96,25,224,18,1,0,52,54,93,105,87,0,54,164,181,32,159,
+222,168,250,142,1,191,199,32,28,64,38,224,188,6,129,54,96,193,156,210,
+64,11,128,78,66,123,224,40,5,224,55,11,123,49,160,10,219,224,231,130,
+2,32,5,162,215,224,196,7,207,26,254,187,4,128,77,82,246,227,78,0,
+224,68,6,224,66,2,237,152,0,32,217,220,150,225,83,2,64,145,68,183,
+224,199,5,225,173,4,224,74,12,168,221,224,74,7,64,31,224,74,5,68,
+33,206,132,160,70,64,94,224,233,8,225,171,2,32,6,213,166,32,105,227,
+208,1,188,50,32,19,206,33,0,80,57,163,104,10,64,20,163,2,224,123,
+3,0,52,148,88,114,143,1,52,54,144,10,225,73,3,108,163,225,141,7,
+43,178,224,53,3,158,42,245,189,2,234,142,1,1,95,39,234,140,3,224,
+205,10,135,123,171,4,32,162,201,168,32,183,66,6,128,183,131,70,224,168,
+6,42,78,86,130,96,126,224,29,5,122,148,0,52,111,42,96,41,209,115,
+70,126,32,5,0,55,34,153,113,180,64,18,32,66,0,35,76,138,32,42,
+64,48,224,42,9,77,233,224,42,1,0,49,121,158,32,43,226,40,8,0,
+52,108,194,102,104,0,83,141,235,97,16,136,9,0,79,241,153,2,1,46,
+46,65,18,224,17,3,1,58,58,128,17,37,19,64,204,69,19,96,12,77,
+137,224,12,0,0,49,213,66,224,57,3,1,60,45,224,75,7,1,45,62,
+224,75,1,224,48,0,96,62,185,37,224,44,3,0,61,96,44,251,147,4,
+226,207,6,0,52,205,242,224,20,5,100,226,33,5,130,227,97,173,66,150,
+97,173,64,49,145,249,226,17,12,13,33,64,35,36,37,38,63,43,46,47,
+60,61,62,63,87,210,4,94,124,58,45,126,64,136,32,59,194,182,226,163,
+3,99,125,134,138,60,12,139,107,237,101,3,192,148,255,148,0,226,101,2,
+226,90,2,33,159,224,91,10,143,130,141,217,237,36,2,189,158,249,171,3,
+102,255,192,31,224,161,10,255,180,1,104,64,227,208,4,224,151,17,237,33,
+0,140,211,160,170,166,141,227,168,5,32,226,228,112,8,67,67,65,96,0,
+67,33,227,224,62,1,204,214,33,150,66,174,129,150,131,38,225,150,15,8,
+44,59,40,41,91,93,123,125,96,161,136,170,105,228,189,6,77,156,32,102,
+0,89,225,1,6,0,89,96,238,69,204,0,64,231,95,1,224,58,6,113,
+6,228,248,5,65,54,65,104,249,168,3,96,213,105,97,0,50,80,167,205,
+90,231,181,6,224,91,15,237,128,7,225,93,4,224,20,3,0,52,97,248,
+239,97,4,140,74,129,224,201,123,132,81,123,137,87,43,133,18,97,4,225,
+135,10,69,218,238,246,0,162,58,152,23,100,76,225,240,0,123,144,65,100,
+72,80,193,167,64,89,97,167,64,69,225,121,11,64,61,225,62,4,96,194,
+0,85,215,24,193,32,162,106,0,51,39,192,32,4,180,12,97,244,67,30,
+224,201,7,207,182,224,109,12,117,215,227,247,4,162,231,130,101,65,136,192,
+189,66,151,128,189,242,166,0,225,229,8,230,88,7,65,179,224,95,4,191,
+196,171,189,232,52,18,226,55,11,165,166,224,20,6,128,86,224,20,5,0,
+49,84,147,224,21,9,103,204,224,21,9,151,254,224,21,7,121,241,224,21,
+8,224,109,11,156,120,226,228,7,128,85,225,17,4,129,115,240,74,8,193,
+163,224,17,3,130,127,224,17,2,148,98,224,17,3,85,50,224,35,6,224,
+34,8,141,98,224,17,3,140,56,224,17,3,224,88,8,136,222,224,16,2,
+137,94,225,163,8,74,138,104,217,224,95,8,229,25,5,105,149,216,145,227,
+75,0,226,190,2,33,36,83,250,0,52,112,200,41,24,94,47,109,40,0,
+49,107,115,33,30,34,151,173,109,227,147,10,88,212,109,32,148,59,224,171,
+13,68,66,132,217,226,102,23,105,125,224,20,8,136,77,224,20,6,226,35,
+11,72,177,224,20,9,226,55,11,107,59,224,20,7,75,149,224,20,9,129,
+37,224,20,6,226,118,11,76,214,224,20,9,224,209,11,77,64,224,20,9,
+224,209,11,65,226,224,20,9,224,209,11,111,193,224,20,7,112,216,224,20,
+8,224,209,11,118,214,224,20,8,224,209,11,83,250,224,20,9,224,209,11,
+84,85,224,20,9,224,209,11,107,214,224,20,8,224,209,11,106,76,224,20,
+8,224,209,11,228,26,12,119,175,224,20,8,228,47,11,107,153,228,47,10,
+227,249,8,95,79,224,17,5,178,157,224,17,3,227,215,8,89,50,224,17,
+6,133,253,224,17,3,197,170,224,17,1,228,155,8,177,201,224,17,3,228,
+84,8,93,242,224,17,6,228,138,9,228,192,9,224,179,8,135,88,224,17,
+4,224,179,8,92,152,224,17,6,224,179,8,229,26,10,229,97,26,229,62,
+9,224,178,8,229,61,15,224,16,1,224,175,8,224,174,8,224,173,8,225,
+96,9,224,153,8,224,16,7,178,33,71,210,0,51,42,57,133,174,233,99,
+0,0,52,49,54,255,235,2,1,79,72,191,225,224,79,5,224,47,17,224,
+46,8,128,178,32,103,224,50,14,2,78,85,76,224,51,7,96,161,224,49,
+17,2,83,84,88,224,49,7,96,245,224,49,17,0,69,224,49,9,97,56,
+224,49,18,1,79,84,224,49,7,96,200,224,49,18,1,78,81,224,49,7,
+97,190,224,49,17,2,65,67,75,224,49,7,98,1,224,49,17,1,66,69,
+225,43,8,98,68,224,49,18,0,83,224,48,7,98,134,224,48,17,0,72,
+224,247,8,98,200,224,48,17,1,76,70,225,242,8,225,191,22,0,86,224,
+98,8,131,79,224,49,17,0,70,224,99,9,225,241,22,1,67,82,224,49,
+8,225,241,22,1,83,73,224,49,8,225,191,22,2,68,76,69,224,50,8,
+225,192,22,2,68,67,49,224,50,8,225,193,22,2,68,67,50,224,50,8,
+225,195,22,2,68,67,51,224,50,8,225,197,22,2,68,67,52,227,83,8,
+225,198,22,1,78,65,226,190,8,133,203,225,99,18,1,89,78,224,50,8,
+227,186,24,0,66,224,50,8,225,201,22,1,67,65,224,101,9,227,188,23,
+0,77,224,49,8,225,252,22,1,83,85,224,151,9,225,252,22,2,69,83,
+67,224,50,8,225,252,22,0,70,227,190,8,135,172,224,49,17,0,71,224,
+49,9,225,250,22,0,82,224,49,8,136,52,224,49,17,0,85,224,49,9,
+225,248,23,0,80,224,49,8,225,247,22,0,68,228,234,9,0,49,129,45,
+242,178,5,224,0,17,238,95,11,221,17,46,172,242,109,12,115,193,0,39,
+146,18,250,191,2,155,159,247,59,3,187,18,58,95,137,132,224,19,0,185,
+30,112,67,238,243,3,224,39,2,242,65,16,82,63,216,201,32,161,146,179,
+127,85,141,38,50,150,122,132,32,39,96,4,112,95,145,121,71,203,192,217,
+178,64,1,52,52,33,90,77,4,156,108,96,9,0,49,46,212,32,3,128,
+95,184,160,0,49,52,119,32,13,146,34,95,62,32,55,255,62,2,78,131,
+213,25,246,164,24,250,218,26,32,81,176,229,32,119,1,95,52,58,180,32,
+28,79,150,1,95,52,68,164,32,11,77,182,0,52,68,125,74,245,106,249,
+43,255,206,4,0,52,111,1,32,6,107,1,224,13,0,65,66,33,54,32,
+92,215,122,48,20,32,4,32,81,85,0,147,31,32,29,208,162,128,29,32,
+136,224,29,4,186,58,224,59,1,33,28,32,35,32,25,183,61,45,195,156,
+159,32,5,92,170,160,147,122,223,0,52,67,54,32,5,96,190,66,222,0,
+95,124,205,128,34,124,199,96,10,32,76,214,231,82,99,99,107,128,65,32,
+25,129,146,92,98,160,16,129,149,224,42,2,192,27,64,28,129,167,123,157,
+254,249,0,125,16,158,114,252,68,6,1,95,51,108,74,253,238,1,254,150,
+1,93,38,131,26,32,94,128,38,97,169,64,104,64,97,245,30,0,147,39,
+156,23,157,81,32,141,108,160,224,34,0,224,9,1,79,187,64,31,129,169,
+133,29,32,7,119,184,64,58,32,89,0,75,83,50,32,13,129,180,0,90,
+160,13,129,164,0,75,130,127,64,62,98,141,0,90,224,1,2,228,3,0,
+32,31,193,154,126,58,130,59,123,214,65,166,225,102,8,32,31,32,25,193,
+102,179,163,224,6,0,254,174,14,66,192,255,62,13,32,75,129,161,83,251,
+226,55,2,96,25,184,125,129,102,99,179,83,47,226,93,8,195,250,160,4,
+1,83,32,67,254,224,48,32,193,253,253,174,4,182,191,224,207,1,158,64,
+244,152,4,224,237,4,115,65,32,232,157,252,64,242,0,53,66,8,204,42,
+193,112,160,62,160,110,128,113,164,208,160,116,193,254,64,90,192,25,160,123,
+224,117,22,224,115,5,224,113,5,224,51,17,174,7,224,0,2,0,58,100,
+70,193,248,1,52,48,33,59,0,51,111,88,186,117,0,48,101,146,67,194,
+0,50,36,186,64,235,69,15,165,35,68,204,0,52,73,145,205,37,66,59,
+74,107,224,157,5,32,99,164,195,0,52,42,86,32,67,35,50,146,100,242,
+111,1,191,143,163,106,32,23,36,237,224,34,18,33,244,32,2,79,250,64,
+190,64,168,224,139,0,64,62,224,96,0,160,46,149,249,38,167,161,100,192,
+56,223,127,255,177,1,224,60,3,224,137,6,198,107,152,177,0,52,77,170,
+179,113,113,154,225,16,4,217,133,225,251,0,128,75,59,98,160,44,161,234,
+224,70,0,0,52,43,62,192,71,64,72,83,176,175,163,224,42,7,224,113,
+2,224,41,6,33,104,132,26,67,95,1,75,52,227,249,0,32,23,132,36,
+224,23,9,199,215,33,27,195,63,131,52,130,74,185,204,58,76,224,22,2,
+250,41,2,64,146,162,60,224,1,1,68,205,255,71,2,224,20,5,224,17,
+8,224,14,5,224,11,2,255,73,3,160,109,132,163,32,197,64,195,224,197,
+2,164,161,64,155,1,52,48,102,93,77,85,32,24,198,16,32,222,128,181,
+32,19,198,7,130,20,225,81,4,98,199,225,5,2,131,75,160,239,192,92,
+226,20,4,162,96,66,167,134,251,64,33,225,81,3,198,48,228,138,0,233,
+13,3,192,21,160,104,224,29,0,219,5,250,249,1,32,88,131,67,96,157,
+0,50,32,24,233,252,1,4,102,111,108,100,108,141,41,67,121,33,234,32,
+45,216,114,160,134,0,83,228,209,4,96,79,130,18,97,5,201,182,248,124,
+3,101,180,97,16,251,49,1,192,176,194,24,219,240,128,169,96,57,214,116,
+1,64,95,116,29,132,226,103,93,100,20,128,36,35,6,224,36,5,197,9,
+227,124,2,32,40,99,46,161,2,32,176,130,171,224,79,0,234,50,0,134,
+113,136,160,64,6,97,230,68,242,166,232,73,20,67,130,65,214,71,183,199,
+211,64,15,64,9,199,205,58,109,72,119,96,77,32,64,130,108,162,84,137,
+119,103,15,73,125,102,169,36,12,163,37,106,105,230,102,4,128,113,233,57,
+2,96,153,230,240,1,128,209,220,104,128,252,32,59,164,48,253,91,2,68,
+58,193,182,97,118,232,184,3,229,228,0,192,86,197,188,65,31,230,227,0,
+128,8,168,169,162,124,160,243,155,1,0,57,87,228,224,64,0,229,23,1,
+192,25,131,249,64,14,226,143,0,231,26,0,224,174,13,224,124,7,233,40,
+1,224,127,22,224,101,3,224,130,8,224,156,5,225,91,4,192,247,97,102,
+0,54,227,28,2,24,92,51,52,38,46,47,108,105,98,47,68,97,116,97,
+47,73,110,116,101,103,101,114,46,104,115,64,24,0,44,34,63,0,58,131,
+57,33,141,189,200,0,51,32,82,134,187,0,58,96,111,163,36,136,109,165,
+202,128,225,130,255,96,23,162,138,67,52,230,177,7,200,22,225,230,0,64,
+57,228,22,4,196,201,192,7,34,152,87,6,0,75,32,70,224,204,36,3,
+54,52,58,54,132,6,166,243,227,161,1,96,116,198,74,227,177,0,108,180,
+227,162,3,64,251,221,153,228,157,0,163,107,0,51,72,76,231,212,0,228,
+200,0,224,80,11,98,161,224,80,8,154,81,104,146,65,90,196,207,131,65,
+100,120,90,109,229,136,1,32,85,36,180,228,48,11,228,105,13,160,47,98,
+92,197,159,224,61,11,101,179,228,108,4,224,79,11,228,154,18,232,20,3,
+32,200,133,106,196,10,65,213,234,130,19,169,148,97,10,36,124,32,63,173,
+101,64,127,88,232,128,8,0,53,229,136,10,34,80,121,9,32,51,229,11,
+0,136,100,172,67,167,178,65,142,254,197,0,225,83,0,232,74,1,97,34,
+107,178,224,99,4,227,214,0,0,89,236,195,2,173,16,194,66,194,183,101,
+65,236,89,0,160,85,68,162,130,102,198,30,168,63,140,85,96,145,224,143,
+4,236,71,19,192,146,96,246,230,239,4,6,108,116,87,46,99,109,112,162,
+233,161,19,160,6,32,8,153,237,161,91,166,5,0,51,32,28,227,211,0,
+133,216,229,74,6,194,108,231,0,6,162,239,231,2,8,227,73,15,97,91,
+64,109,162,244,231,226,1,100,217,68,30,236,40,0,227,161,46,224,91,0,
+227,161,10,224,95,3,227,161,32,224,80,1,162,150,97,121,33,40,134,232,
+163,161,227,140,38,129,208,227,51,2,224,10,1,32,89,134,248,34,212,32,
+11,133,118,113,13,32,205,146,122,128,75,0,58,81,31,232,164,0,235,191,
+4,138,20,233,77,2,128,229,32,133,98,66,32,70,225,98,0,205,95,162,
+147,64,5,64,140,224,243,0,97,9,32,19,40,109,225,7,1,96,142,32,
+201,128,246,129,52,225,36,2,132,100,225,229,1,229,232,1,32,179,132,216,
+195,2,192,39,97,118,96,86,32,160,160,74,32,44,235,176,0,0,50,74,
+213,96,36,32,21,132,18,243,110,10,195,189,242,91,0,240,183,0,202,111,
+162,208,242,107,4,234,106,3,235,217,1,129,22,162,34,64,97,62,14,38,
+122,102,195,169,118,224,69,16,203,181,243,153,10,160,27,115,158,64,92,179,
+226,65,97,203,133,194,106,108,183,66,154,212,214,97,32,63,187,32,4,66,
+132,208,139,1,95,50,127,60,244,86,5,33,38,234,17,3,237,106,2,98,
+236,81,51,129,102,225,172,2,65,95,129,172,132,44,224,58,44,227,115,3,
+224,58,38,188,248,194,147,224,67,0,224,56,25,188,237,0,51,42,125,229,
+9,1,15,118,97,108,68,105,103,58,32,66,97,100,32,98,97,115,101,133,
+18,71,76,96,83,67,10,108,220,0,51,52,18,59,146,149,218,224,17,1,
+59,115,142,171,224,48,14,102,168,224,48,5,0,49,74,253,64,49,98,101,
+224,49,8,0,54,98,163,224,49,4,33,205,97,185,100,23,66,48,99,229,
+231,125,4,231,177,4,34,99,98,39,32,5,128,78,254,46,0,224,61,39,
+135,103,224,61,12,224,48,13,97,32,165,4,0,56,106,79,224,231,15,225,
+74,11,96,171,224,231,10,224,107,23,224,99,34,0,52,168,126,224,99,38,
+35,41,135,7,224,206,35,163,112,224,106,37,32,105,183,79,85,251,119,203,
+35,202,100,29,45,91,77,121,106,67,71,255,32,5,64,29,85,245,128,114,
+117,245,128,10,32,70,134,123,1,62,61,38,33,64,39,64,11,64,10,134,
+44,0,60,32,10,64,79,32,10,0,105,40,9,64,13,178,97,228,142,6,
+71,207,248,87,2,0,35,108,45,224,20,7,64,197,224,20,8,151,247,224,
+21,7,64,116,224,42,9,123,251,119,122,224,21,2,65,47,216,199,252,243,
+8,224,17,21,129,75,224,16,19,168,234,224,16,6,33,6,207,246,230,58,
+10,246,107,2,103,44,121,182,201,233,128,23,192,35,135,54,148,162,199,66,
+224,35,4,237,244,3,232,189,2,233,208,6,32,18,79,23,224,21,0,224,
+66,0,102,119,243,166,9,241,242,0,234,114,0,77,46,64,66,83,119,211,
+125,245,252,1,66,142,230,57,0,138,180,141,141,237,140,24,97,32,251,75,
+0,166,185,150,225,241,221,11,225,104,1,40,95,232,32,1,89,1,161,102,
+234,172,0,192,23,225,128,0,138,69,81,189,64,0,71,67,96,75,128,48,
+96,143,33,182,231,239,0,1,51,55,35,169,251,9,3,32,28,251,123,12,
+98,179,97,163,51,156,226,101,7,96,54,170,250,226,6,6,225,51,4,231,
+109,5,167,101,224,236,2,1,51,55,194,87,131,213,0,80,37,146,117,121,
+32,17,187,15,0,51,84,184,0,51,90,246,128,133,187,97,0,51,43,236,
+192,86,0,51,33,51,160,11,32,55,131,204,137,87,32,44,82,55,76,174,
+68,218,32,41,65,178,97,98,32,41,219,88,0,75,243,236,3,96,49,135,
+244,104,241,128,72,123,217,32,54,234,221,1,96,17,208,240,32,10,32,217,
+233,191,0,89,41,0,51,72,201,195,42,0,51,123,24,69,25,96,189,64,
+29,227,72,2,97,207,128,29,52,239,32,164,98,45,32,35,225,181,0,57,
+145,32,57,34,94,92,12,166,146,65,118,92,52,64,228,32,213,192,143,96,
+7,64,41,129,113,32,246,32,38,217,31,96,195,225,235,2,64,63,32,46,
+64,69,105,224,138,83,110,228,253,60,1,78,45,113,90,96,90,65,118,64,
+79,33,141,206,191,32,86,130,11,33,0,0,51,193,73,32,20,165,169,0,
+51,61,58,130,27,32,19,203,242,129,18,0,90,125,178,133,219,32,28,251,
+94,2,224,158,2,128,103,204,79,64,5,229,7,3,101,3,171,246,75,97,
+224,113,1,66,45,0,58,96,27,96,19,33,100,58,20,0,51,84,150,64,
+22,165,207,160,156,84,211,96,104,129,249,32,45,83,199,0,51,71,115,67,
+66,32,27,246,224,0,0,50,98,2,32,17,225,74,0,160,44,93,233,32,
+22,246,177,3,246,103,8,32,31,251,7,2,0,51,51,160,105,113,170,169,
+64,113,84,2,1,51,53,214,112,192,244,66,140,85,153,65,90,216,79,138,
+23,206,254,207,75,129,26,0,50,125,3,0,49,35,12,32,4,32,113,204,
+88,128,33,235,34,2,224,236,0,226,83,7,64,205,164,195,129,134,129,40,
+235,38,2,96,40,96,42,134,137,34,106,234,57,1,19,80,114,101,108,117,
+100,101,46,114,101,97,100,58,32,110,111,32,112,97,114,202,63,154,130,32,
+235,33,89,82,131,224,57,19,8,97,109,98,105,103,117,111,117,115,224,64,
+3,65,33,130,43,66,64,64,13,205,227,37,182,96,16,67,237,206,0,64,
+158,228,168,10,229,207,1,155,44,240,99,1,226,241,3,236,129,11,108,121,
+229,179,10,32,106,190,238,66,108,33,216,32,67,32,19,177,126,160,19,99,
+6,64,127,227,6,2,93,103,65,95,237,169,1,98,42,65,130,96,184,163,
+114,228,74,2,64,167,143,114,237,167,1,130,64,65,253,193,195,44,218,160,
+11,32,76,165,79,96,180,32,166,227,130,1,164,36,69,98,146,123,224,64,
+0,59,86,164,60,38,220,224,10,0,0,51,36,132,224,86,1,229,110,0,
+254,190,0,102,178,239,14,0,224,18,3,79,27,108,139,193,46,163,175,96,
+147,33,38,197,11,71,145,128,135,96,218,128,135,96,159,128,135,160,10,96,
+251,127,124,96,6,193,42,64,11,229,87,2,214,73,225,30,2,128,85,129,
+30,96,11,32,64,196,15,229,176,3,64,172,69,121,64,155,112,98,161,59,
+64,47,193,233,229,194,3,195,153,83,21,224,49,2,132,113,64,6,32,49,
+0,73,34,145,64,44,192,10,196,46,32,39,95,39,99,139,160,16,80,163,
+231,207,5,32,30,161,198,64,232,90,174,135,162,224,5,0,101,29,207,160,
+96,67,98,45,239,211,2,200,72,160,30,141,79,224,30,9,165,40,249,189,
+1,230,155,4,100,68,224,46,2,121,220,175,176,0,51,38,172,247,135,1,
+251,249,2,100,131,253,14,4,255,19,2,160,176,81,130,224,21,1,69,49,
+252,16,4,134,131,113,187,169,55,192,24,193,217,130,161,129,217,136,16,64,
+6,167,69,168,3,89,191,64,34,131,110,231,251,0,0,58,96,25,165,118,
+226,180,0,99,155,79,60,104,158,129,22,161,59,130,69,91,144,64,34,194,
+16,104,175,65,154,128,43,184,159,234,240,0,234,220,1,224,19,2,247,185,
+5,224,32,2,224,9,10,181,48,225,223,3,232,58,7,0,64,101,239,74,
+205,160,218,224,4,0,222,95,96,58,175,125,224,57,9,224,179,7,129,169,
+226,102,0,162,96,64,41,192,83,224,84,5,224,82,5,224,81,11,224,91,
+4,224,82,9,224,183,3,224,58,17,226,239,5,224,59,20,225,114,9,224,
+9,2,213,163,177,28,209,57,227,87,1,224,240,10,160,100,227,69,2,194,
+254,139,137,236,195,3,96,164,97,163,98,185,97,47,179,103,0,51,95,94,
+0,51,109,223,194,74,96,0,224,98,2,47,83,250,12,0,224,151,32,226,
+162,5,224,100,2,131,170,178,85,225,7,0,205,140,224,13,21,99,166,130,
+124,224,252,0,224,254,0,243,177,1,204,139,196,1,96,248,155,124,219,155,
+73,4,225,19,9,224,248,6,136,235,224,98,20,245,157,0,192,97,223,80,
+96,96,228,41,3,194,11,226,202,6,225,71,31,225,224,24,160,107,225,214,
+21,226,202,21,226,142,3,193,99,224,49,41,224,176,2,228,22,9,225,93,
+10,230,3,4,224,45,5,224,47,8,234,143,3,224,141,15,150,33,226,35,
+4,193,63,224,142,23,252,140,16,5,84,101,120,116,47,80,73,255,2,114,
+67,111,42,16,7,110,97,116,111,114,115,47,82,42,33,0,80,252,156,0,
+3,53,49,58,51,252,156,0,166,18,72,66,96,108,174,35,96,11,37,171,
+135,138,116,148,64,169,96,150,64,35,137,90,238,45,5,150,146,32,52,135,
+180,108,227,137,159,64,46,192,70,215,18,128,71,220,0,70,157,64,21,142,
+177,102,155,166,177,32,14,103,238,90,179,192,85,140,87,64,23,230,152,0,
+238,150,1,64,61,134,95,0,55,135,64,255,213,1,226,254,0,226,251,1,
+249,142,2,64,64,206,182,96,120,105,77,98,155,32,11,72,160,96,11,32,
+97,135,17,241,197,3,128,216,64,100,250,76,0,83,195,250,53,2,150,73,
+68,84,64,17,119,206,224,117,0,248,183,4,236,165,3,135,231,236,191,5,
+164,143,251,219,3,32,198,192,126,96,88,33,135,64,104,130,185,224,104,5,
+224,158,1,90,42,192,22,224,159,30,138,142,224,205,38,242,201,2,224,182,
+9,224,140,1,224,179,19,224,112,30,201,146,232,67,8,161,153,233,164,2,
+225,88,3,229,227,1,224,157,2,64,5,248,79,0,225,92,146,244,21,1,
+193,96,224,195,14,225,105,76,224,125,5,122,197,244,100,4,130,179,171,235,
+97,99,101,241,166,197,224,147,2,251,241,1,225,45,37,128,78,224,7,1,
+224,123,99,224,86,10,224,85,58,96,71,128,163,224,204,101,255,221,8,31,
+115,116,105,109,101,115,58,32,112,111,115,105,116,105,118,101,32,109,117,108,
+116,105,112,108,105,101,114,32,101,120,112,101,3,99,116,101,100,102,71,0,
+58,69,29,140,58,108,221,172,200,190,27,246,133,4,193,167,96,52,243,247,
+1,177,245,32,19,221,133,133,207,32,16,211,218,242,39,2,168,96,242,51,
+8,64,46,230,123,0,0,50,236,173,1,70,107,207,61,79,82,75,202,75,
+126,173,186,175,64,134,116,69,242,76,147,175,64,160,10,206,68,64,76,211,
+172,163,112,128,5,252,63,0,117,2,236,111,0,189,106,79,26,175,203,233,
+38,4,224,28,7,238,76,11,140,39,224,65,9,182,53,96,24,157,161,97,
+123,159,142,175,80,96,49,32,178,214,33,164,13,199,4,66,77,226,44,0,
+192,75,68,88,199,5,132,71,128,46,167,50,224,34,7,32,93,199,111,33,
+96,64,105,128,121,135,41,64,6,110,14,0,58,96,67,114,135,128,1,120,
+142,32,33,64,199,210,144,224,4,3,158,182,128,205,32,37,130,22,225,212,
+0,32,17,130,23,0,90,224,57,7,224,87,0,210,56,224,87,6,224,34,
+3,130,22,234,230,6,237,40,2,64,242,255,106,0,239,79,2,132,244,160,
+14,32,77,99,132,160,38,230,98,3,168,194,0,67,129,148,98,117,128,64,
+64,84,96,26,32,132,240,197,0,82,91,0,50,116,221,32,6,117,145,84,
+239,193,61,242,61,0,211,136,69,212,161,243,32,211,115,137,184,217,230,207,
+1,131,28,168,45,243,182,4,251,30,2,113,192,180,241,132,102,193,40,105,
+224,64,85,32,5,237,112,0,224,38,10,224,123,2,64,181,193,243,228,78,
+6,7,105,110,105,116,58,32,91,93,100,50,68,29,225,90,0,224,114,4,
+193,54,224,115,1,0,58,96,9,97,36,230,216,0,2,115,101,113,192,213,
+128,19,224,16,2,228,25,11,64,68,130,105,95,98,1,95,50,50,197,189,
+20,245,250,1,224,170,1,3,35,108,105,110,181,65,144,7,106,43,224,42,
+12,8,123,45,35,32,76,73,78,69,32,245,177,0,138,87,81,69,0,57,
+152,109,0,50,69,148,32,13,100,248,224,57,1,3,32,35,45,125,128,52,
+32,155,216,228,225,21,2,67,37,212,187,229,181,0,96,86,104,90,131,126,
+32,13,32,152,45,67,0,50,81,166,213,141,160,25,35,172,128,16,32,96,
+197,70,242,100,0,225,123,1,207,117,98,82,242,40,0,32,51,131,66,64,
+129,0,50,75,125,248,77,5,0,35,70,90,107,62,224,28,11,130,247,224,
+18,4,159,253,32,86,227,118,0,198,39,101,53,182,235,1,50,57,119,228,
+128,155,167,1,239,129,0,232,206,1,243,52,0,224,51,0,224,186,2,244,
+200,0,242,245,2,96,81,32,124,131,110,88,35,134,158,224,43,9,224,42,
+0,214,7,4,57,48,32,79,32,96,238,100,122,97,214,216,152,0,50,158,
+92,0,50,92,164,32,25,215,93,225,94,0,207,102,96,91,225,125,10,239,
+250,2,160,127,243,198,6,0,58,96,90,96,135,44,239,130,91,192,161,64,
+123,96,110,212,149,109,150,32,140,66,105,132,128,32,50,96,20,193,28,32,
+52,194,106,0,95,93,51,74,12,32,19,249,179,2,197,160,237,84,3,192,
+137,231,92,0,224,37,6,224,39,4,64,40,245,171,0,66,153,0,56,119,
+34,102,27,32,26,167,62,160,205,71,0,0,49,85,201,32,25,218,241,184,
+154,1,50,56,166,88,0,49,55,58,0,75,32,117,225,43,1,167,57,0,
+49,90,66,241,94,1,32,107,64,17,227,97,2,3,32,97,116,32,67,202,
+163,156,226,54,2,128,63,56,113,33,75,152,147,224,66,14,2,99,111,108,
+192,61,130,42,224,57,8,65,204,152,38,224,61,8,4,92,49,48,38,32,
+32,0,7,117,115,101,100,32,98,121,32,160,73,128,62,1,50,56,235,195,
+0,160,20,47,241,128,20,32,11,39,139,128,11,33,7,215,252,1,55,56,
+122,148,66,2,34,144,67,79,136,224,1,50,55,197,31,227,221,11,168,72,
+145,233,96,45,245,163,0,97,121,90,88,0,49,91,163,64,26,130,28,154,
+44,0,50,191,12,0,80,55,127,32,105,240,116,10,11,99,112,112,104,115,
+115,114,99,47,109,97,108,33,40,11,109,45,119,97,108,108,97,99,101,45,
+117,110,42,47,48,133,0,47,96,33,6,45,49,46,50,48,46,57,128,12,
+208,134,3,55,57,58,49,196,254,191,88,86,249,128,147,96,110,192,147,130,
+76,1,75,32,32,10,194,60,62,20,33,14,92,1,0,50,222,254,58,217,
+70,114,64,246,32,26,129,69,32,233,128,38,81,49,67,10,192,11,72,171,
+159,6,96,6,194,101,129,57,225,194,4,10,69,120,105,116,83,117,99,99,
+101,115,115,197,225,131,248,127,47,65,103,42,38,97,168,164,224,226,7,11,
+64,68,5,70,97,105,108,117,114,166,85,224,36,1,228,89,2,97,247,70,
+102,66,87,0,35,105,212,226,24,2,160,210,98,24,96,11,32,186,176,135,
+147,174,164,54,222,249,105,185,128,16,128,73,0,58,96,178,97,42,67,79,
+35,144,32,86,0,49,33,93,224,167,1,6,83,121,115,116,101,109,46,64,
+174,64,167,224,192,5,2,67,111,100,128,189,194,91,32,80,235,193,1,39,
+84,33,8,100,107,137,14,82,24,32,33,130,80,224,73,1,130,10,32,71,
+32,27,187,239,0,50,63,20,0,95,91,37,32,18,230,114,0,68,210,192,
+80,33,208,95,34,72,103,95,22,129,104,32,44,228,101,0,0,50,32,209,
+196,252,64,33,32,27,130,41,193,172,75,236,0,50,94,244,103,64,95,62,
+32,196,114,226,96,47,32,41,4,94,112,117,116,98,34,98,191,90,32,82,
+0,56,33,155,0,95,65,59,32,6,0,50,95,28,163,108,191,59,234,139,
+1,96,28,167,189,209,164,74,188,132,150,125,3,168,150,229,166,5,94,187,
+228,147,3,224,242,4,181,31,0,50,34,214,37,43,170,63,0,50,72,133,
+0,50,132,245,233,93,6,8,66,97,100,32,72,97,110,100,108,45,166,193,
+168,96,37,95,171,129,254,191,201,98,25,233,228,4,221,31,160,121,98,57,
+0,50,99,125,102,140,0,50,133,165,230,74,0,128,76,185,197,35,74,32,
+12,129,201,3,102,112,50,112,64,13,129,196,0,95,34,29,251,116,6,246,
+66,2,116,251,228,131,0,163,236,224,6,12,224,42,2,64,15,164,32,224,
+42,29,160,28,224,49,10,224,42,15,224,49,10,224,42,22,224,49,3,68,
+115,75,198,97,162,33,9,194,161,130,133,73,162,65,146,66,142,32,28,162,
+162,34,100,33,62,81,208,32,19,199,3,242,159,0,209,199,73,33,158,16,
+223,68,252,19,2,208,32,129,199,223,120,32,78,200,169,37,206,66,62,117,
+172,96,62,32,27,219,214,199,204,167,194,0,58,96,37,101,17,162,18,0,
+95,95,132,226,187,4,224,179,2,99,80,36,147,232,105,2,0,50,95,220,
+96,72,230,104,0,226,171,5,0,104,54,142,98,160,92,50,96,45,97,7,
+117,167,166,193,128,255,235,223,2,161,1,247,88,3,75,220,246,82,2,224,
+5,3,203,14,189,118,243,228,0,114,160,225,85,0,98,247,98,220,96,40,
+32,5,99,104,224,42,1,128,6,224,38,0,224,87,6,160,47,192,159,135,
+97,32,151,0,79,96,33,71,89,224,109,1,152,53,0,50,45,107,33,254,
+159,148,94,219,37,253,65,92,248,55,4,234,10,0,164,48,96,85,140,124,
+229,145,2,1,45,79,168,75,96,71,166,63,205,229,128,64,224,52,10,9,
+45,115,116,114,105,112,45,101,111,108,164,32,224,188,131,229,38,5,224,192,
+19,196,221,225,169,255,225,169,105,252,98,2,64,69,239,26,12,6,45,45,
+104,97,115,104,101,169,55,227,134,255,227,134,255,225,169,255,227,134,54,72,
+113,136,171,224,6,3,234,86,3,244,11,2,167,43,116,16,252,84,8,99,
+148,129,250,244,49,0,96,148,167,88,106,3,244,53,0,64,200,226,44,3,
+187,63,167,153,219,118,182,141,160,33,160,99,248,215,1,224,117,4,148,208,
+114,140,105,34,178,55,232,234,7,225,46,0,236,239,0,96,137,241,50,2,
+240,141,2,196,164,213,149,244,249,5,224,195,0,224,39,1,224,177,3,235,
+191,2,241,168,3,149,71,224,172,17,241,193,7,192,78,129,135,225,81,11,
+98,35,229,66,13,0,111,195,99,2,66,32,82,149,29,192,91,224,254,4,
+128,10,80,6,192,0,252,215,5,225,203,4,220,233,194,15,226,3,0,214,
+49,225,242,22,246,85,28,0,49,206,191,227,95,2,224,178,4,192,12,96,
+180,34,215,0,54,250,138,4,225,187,34,255,122,0,188,139,225,192,7,245,
+238,25,3,97,110,115,105,230,164,0,225,3,3,192,78,224,72,31,3,116,
+114,97,100,59,42,2,111,110,97,196,46,160,255,162,40,224,61,21,1,115,
+116,139,21,194,70,180,151,1,50,51,76,81,79,31,58,157,186,175,195,227,
+224,34,17,140,185,226,123,52,0,120,226,123,4,229,48,2,224,77,44,4,
+105,110,99,108,117,238,152,1,226,207,8,247,98,17,0,45,192,59,0,61,
+225,30,4,254,244,4,226,42,0,64,144,224,139,24,0,80,232,146,6,225,
+231,6,163,38,246,218,7,133,202,224,70,2,0,67,96,70,224,30,17,128,
+31,225,53,52,0,65,225,131,11,224,250,51,3,45,104,101,108,231,184,0,
+224,73,53,83,225,34,235,224,76,60,224,75,7,195,131,225,48,2,196,158,
+241,82,0,227,87,0,228,22,12,247,218,0,238,34,0,100,135,225,169,1,
+135,181,231,147,3,195,71,112,144,99,71,224,18,0,79,6,160,18,147,190,
+234,245,18,224,203,9,224,45,65,225,189,4,227,255,7,112,156,227,255,6,
+224,78,21,1,110,111,250,233,1,232,81,1,0,50,50,245,241,108,3,225,
+35,2,225,46,3,104,109,224,85,9,2,68,85,73,96,80,47,217,211,224,
+52,146,87,192,90,207,155,147,96,5,96,103,210,79,64,85,224,43,3,254,
+6,0,64,46,224,41,1,32,40,223,204,224,40,0,130,16,224,35,0,32,
+34,214,38,160,34,0,75,224,119,5,113,9,231,173,0,32,46,241,116,1,
+252,58,10,32,31,145,69,0,85,50,218,85,91,96,10,52,227,0,58,65,
+117,212,128,0,51,84,97,66,92,64,22,213,21,176,203,222,70,165,181,192,
+18,40,74,64,21,225,168,1,241,205,7,101,26,75,70,192,168,64,100,149,
+239,162,208,63,178,40,122,150,125,145,139,247,249,0,65,107,103,85,99,32,
+43,126,0,95,90,71,39,151,160,78,128,192,249,247,2,92,79,32,17,217,
+226,32,14,32,13,129,107,96,31,148,234,64,195,242,53,0,181,16,75,212,
+96,19,242,69,0,32,19,129,51,243,223,5,32,22,184,202,32,162,35,133,
+87,170,147,47,99,144,0,58,96,6,32,30,61,203,2,117,97,108,33,110,
+64,33,161,96,0,50,148,131,97,96,83,63,192,22,96,86,64,28,250,111,
+1,181,94,154,111,64,32,250,111,0,101,206,192,139,64,38,32,25,0,82,
+160,162,32,16,223,138,146,124,129,135,220,35,96,158,184,106,243,24,48,94,
+8,96,72,225,29,0,243,24,5,0,116,56,35,99,59,97,125,64,45,128,
+213,51,145,32,41,83,85,32,6,97,2,71,49,32,27,0,73,33,36,64,
+16,249,0,2,0,49,123,214,0,49,132,5,121,0,128,56,153,0,192,11,
+86,71,96,11,32,63,181,201,89,0,33,27,96,106,164,67,0,51,224,155,
+2,5,101,114,114,111,114,58,154,193,184,134,96,38,32,64,163,230,248,86,
+16,8,67,111,110,116,114,111,108,46,69,64,66,248,88,6,64,18,0,67,
+58,53,248,89,6,64,197,127,172,163,18,215,79,64,7,230,100,1,173,64,
+119,72,215,232,32,128,98,227,67,193,171,133,98,11,32,4,169,53,120,159,
+64,99,194,221,215,199,64,32,251,70,24,255,30,0,66,95,96,162,35,197,
+225,198,5,6,109,100,53,67,111,109,98,37,89,6,58,32,101,109,112,116,
+121,217,244,86,68,223,216,128,171,64,93,104,104,156,65,1,49,48,65,131,
+65,209,0,64,94,162,91,16,166,233,66,145,237,6,1,194,149,236,102,3,
+225,0,1,0,48,96,19,199,32,32,156,66,118,65,40,122,171,97,17,95,
+219,32,40,215,207,128,208,130,149,0,94,32,190,4,65,114,114,97,121,66,
+91,226,130,0,226,243,0,66,70,96,161,32,62,183,29,64,192,248,184,0,
+248,76,4,32,35,67,2,224,46,2,169,242,192,46,32,241,163,43,227,39,
+0,32,40,159,252,32,146,64,201,162,230,64,20,121,209,64,211,172,21,229,
+2,10,246,27,2,238,102,0,225,59,0,233,232,13,32,67,58,11,128,67,
+36,11,32,135,65,35,32,134,1,48,32,128,82,238,130,7,239,44,5,249,
+58,2,64,52,101,175,224,45,2,96,96,172,190,229,134,7,226,161,0,98,
+251,249,96,1,224,43,10,194,137,224,38,0,160,16,33,24,131,191,255,188,
+4,207,0,32,29,163,156,0,49,36,77,32,157,68,255,194,5,129,255,0,
+35,64,69,0,95,72,53,32,44,131,117,0,35,35,209,32,12,167,104,0,
+49,36,173,35,9,80,144,162,60,0,49,96,70,0,49,69,14,32,5,80,
+228,64,16,64,11,0,53,224,11,2,98,137,96,11,1,50,48,64,179,192,
+11,120,232,64,12,155,232,97,37,154,30,137,240,238,186,6,248,230,4,242,
+98,3,65,254,98,55,32,192,71,96,64,243,32,13,162,251,33,64,32,104,
+64,23,70,216,192,23,241,190,1,0,56,32,206,224,29,7,224,53,16,88,
+103,36,53,193,87,192,68,224,151,0,67,142,0,83,162,95,128,69,224,93,
+10,128,161,134,47,71,50,224,31,6,130,111,199,158,96,235,32,73,0,57,
+33,132,224,142,10,128,16,96,52,127,4,33,96,199,150,1,75,52,225,255,
+0,32,23,131,210,128,155,171,10,128,163,200,63,198,173,97,103,220,13,64,
+34,34,39,111,178,96,206,77,153,255,253,8,22,46,47,108,105,98,47,68,
+97,116,97,47,73,110,116,101,103,101,114,95,84,121,112,101,223,224,1,50,
+56,223,224,160,69,0,57,68,10,0,57,98,197,58,143,98,203,224,18,0,
+42,87,32,133,224,5,0,255,17,0,224,60,6,161,72,32,4,0,89,228,
+9,1,69,232,64,171,128,199,96,218,243,207,1,98,164,0,56,122,144,227,
+134,0,98,190,128,19,227,88,1,32,239,0,51,131,239,33,54,189,226,1,
+32,58,96,114,32,10,0,65,64,10,218,206,32,10,232,129,0,71,154,0,
+49,65,165,64,205,72,87,65,39,164,179,96,16,231,154,1,1,49,55,107,
+81,65,114,167,154,224,56,0,69,83,192,11,97,107,124,63,96,6,165,126,
+74,121,226,8,1,0,57,66,39,32,31,198,176,33,18,161,38,133,77,147,
+122,227,21,1,96,47,224,15,8,64,65,233,187,9,96,28,191,59,133,219,
+141,95,0,56,104,224,64,14,0,56,32,199,192,73,108,110,224,21,2,128,
+159,173,60,0,49,97,100,201,8,0,56,100,105,0,49,100,67,32,101,170,
+10,62,72,0,58,96,19,32,12,0,90,64,200,32,13,129,104,65,126,64,
+64,161,76,64,83,235,123,0,96,109,222,100,254,208,6,224,14,5,192,189,
+167,252,253,163,0,128,207,32,72,164,230,74,146,160,42,37,31,1,49,56,
+114,140,192,42,64,60,32,42,172,87,64,42,64,11,32,24,67,125,96,43,
+32,23,1,47,61,64,165,163,113,71,109,100,152,222,240,203,10,37,165,235,
+244,7,236,9,5,210,239,236,9,5,236,11,1,132,241,167,51,107,66,102,
+185,160,17,83,78,160,17,32,140,129,99,231,18,3,192,9,192,59,254,232,
+2,0,58,96,60,101,242,39,83,32,13,226,239,1,32,15,234,35,0,141,
+77,32,50,233,226,3,10,110,111,32,109,97,116,99,104,32,97,116,138,34,
+64,83,138,245,0,49,45,177,226,245,0,74,55,128,11,32,84,234,55,32,
+3,120,99,101,112,83,86,0,46,68,103,0,114,179,93,224,39,1,2,80,
+97,116,64,22,0,77,64,128,0,70,203,66,234,75,0,99,118,129,5,38,
+80,132,221,32,247,64,156,233,50,0,0,49,77,202,224,15,3,35,110,32,
+4,66,13,0,55,161,92,137,110,87,158,242,169,7,79,19,32,202,228,176,
+0,74,95,98,163,32,204,161,78,0,50,130,180,64,45,142,73,64,18,226,
+205,2,71,92,225,95,1,85,92,240,212,3,96,156,140,220,0,49,42,235,
+128,15,137,208,184,138,32,104,68,216,69,5,144,201,224,39,2,161,138,225,
+46,1,6,39,92,57,50,38,39,39,165,155,193,159,169,134,224,99,0,97,
+188,138,132,224,17,3,139,121,233,59,3,224,168,1,32,169,96,35,134,68,
+64,156,206,196,132,218,64,158,130,166,96,101,224,147,3,64,146,70,53,240,
+138,2,33,21,226,190,3,73,196,227,26,3,135,115,166,172,32,77,99,108,
+161,162,33,145,68,216,129,145,212,100,65,186,165,73,32,138,151,53,41,247,
+102,24,75,152,131,4,0,90,64,28,102,26,162,64,224,163,5,224,160,0,
+0,67,89,248,128,96,136,153,138,17,120,30,225,22,7,96,0,0,79,32,
+98,0,35,32,88,224,79,5,0,97,96,79,96,27,32,108,224,27,5,0,
+98,224,27,1,76,107,224,28,5,0,102,224,28,2,33,38,224,28,5,146,
+77,128,28,241,155,4,64,28,109,129,128,28,33,143,224,27,5,0,116,224,
+56,2,250,128,4,64,28,0,118,224,56,2,224,143,8,64,3,96,31,250,
+155,2,0,58,97,241,165,201,65,76,165,24,157,236,0,49,37,249,0,35,
+35,98,138,238,32,12,1,64,35,64,4,64,53,196,109,1,54,50,64,56,
+202,193,238,159,0,225,189,0,107,6,100,82,96,17,32,43,206,54,136,20,
+203,213,207,143,0,49,39,226,39,249,203,89,248,132,1,185,68,64,30,64,
+69,131,183,64,67,226,230,2,107,54,108,35,192,64,97,121,226,96,9,64,
+69,98,0,203,113,192,40,226,52,3,224,10,1,96,50,106,47,235,244,1,
+96,250,129,28,128,74,80,215,224,74,4,32,165,132,76,2,111,114,100,65,
+36,132,78,2,99,104,114,64,12,210,176,106,11,234,13,0,64,193,135,101,
+224,175,1,65,63,134,43,33,88,225,159,10,125,176,225,159,0,64,135,96,
+43,129,203,0,60,70,240,64,24,96,108,198,68,64,60,161,243,64,16,97,
+186,32,106,32,13,129,86,131,203,177,91,238,196,3,32,33,167,96,64,16,
+32,13,177,110,103,153,41,103,64,146,76,60,99,84,199,111,64,17,32,11,
+0,61,64,11,64,35,129,253,64,196,83,182,67,205,83,222,131,248,130,46,
+231,60,0,34,56,192,15,32,59,242,106,0,0,49,149,71,69,210,32,22,
+211,114,32,16,32,156,66,72,32,20,210,110,199,219,194,70,105,86,160,10,
+168,111,218,133,224,32,2,254,38,1,196,203,242,110,1,97,20,224,65,4,
+224,64,5,64,195,196,212,195,100,181,58,247,14,1,192,169,66,95,32,30,
+240,230,6,96,30,172,44,115,244,97,33,178,248,180,245,32,19,226,67,0,
+192,53,240,10,0,240,184,0,126,228,97,68,116,254,98,163,97,166,85,1,
+64,51,181,32,80,81,0,83,63,71,1,110,103,33,164,181,29,163,52,97,
+146,84,134,176,70,138,99,135,135,103,106,112,30,0,95,105,25,32,59,161,
+141,128,40,32,56,106,114,33,228,192,31,129,152,4,110,101,119,67,65,128,
+112,2,76,101,110,64,115,129,33,224,224,4,180,219,75,216,244,212,2,35,
+49,109,89,32,20,237,82,1,239,85,8,109,223,224,49,1,171,55,180,220,
+139,75,224,51,7,32,31,180,221,107,57,32,13,229,15,0,128,2,126,120,
+100,52,64,5,98,124,180,231,239,217,13,96,35,233,220,4,32,54,32,200,
+84,58,79,136,224,27,11,128,120,245,212,3,224,188,0,180,252,2,114,101,
+109,33,16,180,232,253,67,1,247,25,0,253,90,5,224,20,1,224,17,8,
+224,14,5,247,91,14,160,200,225,76,1,225,55,13,129,87,0,79,32,152,
+180,246,34,22,86,144,32,6,66,47,224,8,0,32,6,72,88,115,62,32,
+11,68,54,160,11,39,5,224,11,1,48,164,224,11,0,100,232,85,1,32,
+91,129,144,5,94,112,111,107,101,87,133,85,181,26,4,94,112,101,101,107,
+192,18,193,117,107,182,32,59,128,120,118,108,64,90,225,90,3,162,73,180,
+103,224,50,0,115,158,224,50,0,246,116,1,32,18,201,132,113,89,116,199,
+32,33,129,140,1,116,111,42,252,64,128,129,45,3,116,111,80,116,69,235,
+179,161,225,205,6,179,55,175,245,210,250,252,135,0,97,30,141,154,101,128,
+70,240,51,217,102,89,106,143,179,108,240,79,7,96,52,130,180,100,128,32,
+69,32,241,117,105,96,66,32,7,64,68,0,95,132,230,32,46,248,95,0,
+230,136,5,178,103,111,137,114,122,72,252,32,22,129,40,2,113,117,111,64,
+232,178,34,226,132,94,177,65,242,109,3,243,216,2,0,95,112,182,175,13,
+224,21,0,244,203,13,243,200,3,32,87,129,174,81,202,69,26,71,57,32,
+20,129,180,6,94,102,114,101,101,32,58,176,98,132,6,224,94,6,85,110,
+149,173,253,94,1,245,107,1,187,71,80,141,224,118,3,0,58,176,169,227,
+254,1,230,100,1,250,144,3,212,73,68,45,244,228,11,166,100,230,129,0,
+224,119,1,32,115,180,231,202,238,48,170,250,97,6,103,43,177,40,34,1,
+0,51,227,216,5,0,58,177,38,76,97,0,83,100,252,143,188,213,179,45,
+1,135,0,110,182,224,95,10,128,94,195,112,228,56,9,0,58,177,60,58,
+76,33,98,227,101,2,72,232,162,179,215,14,226,184,7,177,21,247,214,6,
+4,117,110,100,101,102,55,212,0,100,74,231,0,58,177,37,229,237,15,208,
+222,41,139,131,206,106,122,106,177,74,164,234,161,12,78,56,234,157,2,72,
+93,64,1,0,95,48,95,224,37,2,234,126,2,64,37,96,19,96,10,0,
+95,81,55,0,58,177,74,0,85,199,97,64,114,75,206,128,130,64,45,161,
+65,32,20,32,12,97,123,230,129,1,132,14,96,175,65,112,109,8,249,119,
+1,132,192,64,30,131,32,224,35,1,224,55,11,193,10,177,206,83,163,131,
+236,129,5,192,13,71,104,225,105,6,180,78,14,58,32,117,110,115,117,112,
+112,111,114,116,101,100,32,119,69,128,2,115,105,122,158,174,32,54,0,55,
+109,159,0,35,48,56,4,55,52,56,51,54,73,193,0,58,178,47,244,29,
+2,235,192,0,81,177,248,34,2,116,11,148,16,82,2,129,20,65,146,32,
+142,161,33,129,143,0,53,148,21,98,111,178,131,4,105,110,118,32,58,178,
+129,0,115,75,114,178,68,74,133,178,36,230,205,15,178,43,227,16,0,165,
+18,178,54,0,95,44,250,151,105,80,31,0,95,80,47,0,95,80,69,0,
+95,116,58,81,48,0,95,84,55,140,134,82,154,145,232,241,231,1,251,24,
+4,87,63,89,30,240,145,0,177,223,224,29,1,224,49,1,224,39,5,229,
+254,0,227,181,7,178,8,0,62,32,232,177,190,0,62,32,9,129,9,76,
+14,176,242,0,60,32,9,129,7,3,105,99,109,112,32,12,235,202,2,78,
+19,0,95,79,218,0,58,176,245,75,199,175,234,65,64,174,51,50,118,174,
+50,230,1,93,174,116,233,108,13,174,131,1,110,101,42,193,174,99,0,42,
+32,9,128,236,0,45,32,9,128,236,0,43,32,9,233,58,9,224,156,56,
+0,58,237,208,1,192,155,193,143,173,210,171,17,68,221,66,50,116,40,64,
+12,166,113,1,64,58,173,221,117,109,173,189,53,83,173,187,64,41,66,100,
+109,191,173,190,64,29,128,232,64,9,128,232,1,94,109,61,168,1,111,99,
+32,15,229,78,1,203,79,173,172,50,218,173,157,224,206,14,0,58,173,176,
+139,253,102,184,99,184,173,187,131,54,136,197,173,146,3,114,97,105,115,39,
+37,173,137,4,65,46,114,101,97,41,136,173,131,11,73,79,46,103,101,116,
+65,114,103,82,101,102,32,20,168,87,43,219,0,95,76,229,0,95,76,197,
+228,86,1,2,115,116,100,62,197,101,189,173,20,32,62,128,20,32,59,174,
+123,96,59,70,11,224,59,8,1,111,117,113,30,0,58,173,46,131,223,160,
+170,128,243,128,78,32,39,32,78,165,255,44,238,0,58,173,6,33,72,172,
+252,96,100,76,148,0,95,76,177,224,100,4,0,105,113,187,0,58,172,233,
+225,236,2,0,58,172,220,128,99,0,105,44,214,236,213,2,205,149,208,213,
+208,146,253,135,0,111,199,246,72,0,232,160,1,136,64,118,4,64,98,216,
+111,225,215,1,173,27,205,114,44,227,101,28,162,92,77,7,32,35,129,16,
+64,223,129,7,1,65,46,162,40,173,18,78,46,0,58,172,254,32,191,7,
+112,101,114,102,111,114,109,73,43,209,173,5,93,224,128,241,119,30,232,152,
+4,0,58,172,232,64,35,202,55,32,31,69,31,96,35,98,240,91,4,225,
+210,0,0,62,36,147,172,207,0,95,64,78,65,205,111,211,42,109,169,169,
+36,135,64,65,91,64,224,9,0,160,85,32,73,191,217,155,230,112,75,176,
+66,145,154,96,35,247,231,0,107,7,85,128,64,40,192,32,0,95,189,155,
+128,132,87,77,233,228,0,224,47,4,96,150,108,132,146,250,225,14,0,172,
+122,232,94,1,195,241,172,128,121,105,48,254,228,24,5,203,96,178,192,235,
+166,0,32,172,224,12,4,96,212,98,18,46,182,224,66,1,144,14,238,248,
+3,172,79,166,157,0,51,98,24,111,164,130,0,74,8,129,96,74,213,226,
+41,0,102,167,129,4,0,58,244,1,0,236,82,1,37,249,162,103,0,58,
+226,211,0,4,114,101,116,117,114,34,212,164,115,65,196,38,11,128,199,38,
+10,236,11,7,229,65,37,0,58,229,148,3,228,146,9,229,93,2,112,235,
+64,200,39,103,203,21,224,0,255,224,0,255,224,0,243,1,32,125,
+};
unsigned char *combexpr = data;
-int combexprlen = 27645;
+int combexprlen = 30298;
#include "mhsffi.h"
static struct ffi_entry table[] = {
{ 0,0 }
--- a/generated/mhs.c
+++ b/generated/mhs.c
@@ -1,4480 +1,4765 @@
static unsigned char data[] = {
-122,2,118,55,46,2,48,10,49,2,56,57,49,2,10,65,32,2,95,48,
-32,2,95,50,51,2,32,64,95,2,50,48,52,2,32,64,66,224,15,2,
-2,49,51,32,2,64,64,66,2,32,66,32,224,18,2,2,50,32,64,2,
-64,64,83,2,39,32,66,32,42,2,39,32,67,2,32,83,32,32,33,2,
-83,32,67,2,39,32,83,2,39,32,64,64,10,2,64,95,49,2,49,49,
-32,32,42,2,53,32,64,2,95,49,53,2,52,32,95,2,49,53,54,2,
-32,64,102,2,114,111,109,2,85,84,70,2,56,32,34,2,45,45,118,2,
-101,114,115,2,105,111,110,2,34,32,64,64,0,2,67,39,66,2,32,85,
-32,2,95,50,54,32,3,2,50,52,32,32,52,2,51,54,32,224,57,12,
-2,77,105,99,2,114,111,72,2,115,44,32,160,64,2,32,34,32,32,63,
-128,47,2,50,51,51,224,58,19,2,44,32,99,2,111,109,98,2,105,110,
-97,2,116,111,114,2,32,102,105,2,108,101,32,224,67,5,2,50,51,52,
-128,141,2,64,90,32,2,75,32,64,64,0,32,208,64,154,2,64,67,32,
-224,209,25,2,110,117,109,2,101,114,105,2,99,45,118,224,217,4,2,66,
-32,80,128,211,128,157,224,91,2,129,87,65,46,64,101,32,99,64,107,65,
-60,96,23,2,83,32,95,2,50,51,53,64,41,129,87,224,23,4,32,121,
-224,23,12,2,55,32,64,129,75,33,151,33,178,33,78,65,204,2,50,52,
-48,2,32,64,85,32,118,2,65,32,64,160,119,32,56,2,95,55,55,129,
-209,64,228,224,42,1,2,50,32,95,2,50,49,32,32,69,64,12,33,15,
-2,35,48,32,96,49,225,155,1,64,12,225,99,16,2,102,108,97,2,103,
-115,32,2,61,32,34,96,106,2,95,49,50,2,51,32,95,2,50,52,57,
-160,120,2,67,32,67,98,35,2,95,49,55,2,55,50,32,96,194,32,2,
-2,80,32,64,96,180,2,95,49,56,64,76,2,95,55,54,2,57,32,95,
-2,51,53,51,2,32,102,114,192,86,33,184,2,109,97,110,2,100,45,108,
-2,105,110,101,64,90,64,149,128,153,2,64,75,50,32,97,2,48,50,32,
-64,61,96,255,160,105,32,15,2,54,53,32,130,92,65,94,32,15,2,55,
-48,32,128,149,2,56,55,49,32,9,2,85,32,90,161,139,65,28,193,149,
-128,45,128,153,32,41,2,56,55,32,226,236,0,32,149,2,49,54,32,64,
-62,32,20,2,95,49,54,64,214,64,34,2,56,32,64,97,141,128,54,2,
-32,64,83,160,60,2,51,57,32,64,32,226,56,0,64,149,2,51,48,55,
-192,13,2,79,32,35,2,52,54,32,2,64,75,32,128,148,2,53,49,32,
-96,70,2,79,32,64,64,84,2,57,32,35,65,156,224,29,4,96,0,2,
-58,49,56,2,57,48,32,2,64,10,65,129,76,129,79,64,99,2,53,50,
-32,64,9,2,53,32,95,64,232,32,67,2,51,32,35,128,241,162,11,64,
-148,129,231,96,95,130,213,33,195,97,23,2,35,49,32,64,104,32,223,2,
-51,55,51,32,62,32,8,2,53,56,53,2,32,35,49,64,195,32,12,2,
-52,56,57,32,112,128,191,2,49,51,52,64,49,2,52,55,32,64,50,96,
-47,128,0,2,73,32,64,32,158,64,91,96,158,224,1,15,34,172,34,1,
-2,48,32,35,96,167,2,51,56,32,64,162,2,79,32,79,225,16,2,129,
-8,64,161,66,237,226,9,1,2,47,108,105,2,98,34,32,65,247,96,115,
-224,24,1,2,111,117,116,2,46,99,111,2,109,98,34,164,15,64,84,224,
-6,21,97,82,224,13,0,97,4,224,6,0,224,27,3,224,99,1,2,100,
-101,102,2,97,117,108,2,116,34,32,97,133,65,247,32,230,2,66,32,89,
-97,242,98,33,32,7,130,206,66,1,34,10,2,64,80,32,225,188,0,130,
-22,131,236,227,252,0,225,192,3,228,93,19,164,78,224,69,53,2,118,34,
-32,224,69,58,2,113,34,32,224,69,58,2,114,34,32,224,69,58,2,108,
-34,32,224,69,58,2,67,82,34,224,70,60,2,87,34,32,224,70,59,224,
-69,60,2,84,34,32,224,69,58,2,88,67,80,2,80,34,32,224,72,58,
-2,122,34,32,224,69,58,2,81,34,32,197,224,70,229,231,0,4,128,66,
-64,14,64,98,131,144,192,25,64,10,231,110,0,224,10,0,232,177,9,100,
-216,2,35,52,53,231,40,0,96,38,128,51,224,170,1,232,18,4,128,50,
-2,49,48,53,230,63,2,160,34,160,49,68,16,165,116,37,48,69,67,166,
-69,101,175,166,69,165,223,232,29,2,224,197,84,192,162,224,197,15,128,49,
-64,7,231,6,8,224,190,10,129,140,133,170,38,33,136,63,37,190,224,203,
-1,224,206,109,32,10,224,206,18,224,200,0,106,53,96,200,224,170,114,105,
-211,224,170,24,107,27,224,170,9,224,176,1,192,102,160,168,224,13,0,224,
-171,24,224,41,1,160,57,224,16,0,2,66,32,90,224,16,5,169,34,224,
-192,4,2,54,56,32,224,71,0,226,50,17,99,216,226,50,9,2,52,48,
-49,226,50,11,224,219,127,232,223,1,224,219,71,226,98,99,2,56,48,32,
-226,97,18,107,128,192,202,64,183,196,152,107,42,224,180,90,229,87,13,2,
-57,55,32,229,86,40,235,156,3,229,86,124,224,196,0,229,85,27,224,189,
-1,64,43,2,95,49,48,77,40,34,69,227,243,2,129,12,106,111,64,73,
-225,18,1,224,190,5,32,2,224,190,60,66,14,226,56,30,36,4,226,56,
-12,227,87,13,160,139,206,92,96,233,238,92,19,2,85,110,107,2,110,111,
-119,2,110,32,102,46,100,2,58,32,34,141,220,195,103,224,53,6,44,75,
-2,49,48,32,131,114,238,26,5,225,70,3,64,209,174,123,64,68,227,165,
-4,226,90,11,32,217,224,223,0,197,177,224,39,10,67,106,224,39,28,33,
-34,224,39,28,232,41,3,224,39,9,33,140,192,40,230,202,1,224,61,2,
-230,52,1,160,61,224,108,21,224,46,8,224,39,14,224,107,1,224,39,19,
-2,55,55,49,224,79,30,229,64,1,224,39,21,228,157,2,2,54,50,32,
-174,236,238,246,5,226,122,1,224,64,0,46,115,224,64,9,65,58,37,184,
-143,1,48,168,32,210,224,59,0,194,237,100,103,109,239,32,69,83,44,2,
-51,49,55,36,78,80,51,230,69,1,224,1,11,106,223,224,0,3,224,44,
-35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,26,17,224,
-23,14,224,20,11,224,17,8,224,14,5,224,11,2,228,137,2,132,84,80,
-77,227,224,9,129,182,33,238,225,182,3,2,90,32,66,225,182,255,225,182,
-116,225,180,16,65,179,36,11,225,179,3,224,118,3,169,176,225,150,20,225,
-197,255,224,23,14,225,122,10,65,116,37,248,225,116,13,235,35,6,225,113,
-255,227,55,54,227,0,11,65,134,38,132,226,251,15,226,253,1,225,140,255,
-225,140,20,225,97,9,65,95,41,76,225,95,17,225,97,2,225,98,255,225,
-72,11,65,71,41,40,225,71,19,225,75,5,225,77,198,225,16,6,65,14,
-153,147,225,14,20,225,22,11,225,26,42,224,124,2,32,120,76,148,224,120,
-27,224,116,5,225,141,123,225,68,4,64,201,153,80,225,66,26,225,64,6,
-224,204,82,224,163,3,64,162,236,3,6,224,158,26,226,247,161,226,212,5,
-64,237,235,58,6,224,233,20,229,45,228,229,16,7,65,44,234,179,18,228,
-2,25,224,81,2,64,75,233,138,12,96,51,230,148,255,236,188,93,236,164,
-13,65,161,233,165,10,65,159,225,158,255,238,91,104,238,78,14,65,170,137,
-240,2,75,32,67,49,237,2,48,32,95,2,50,51,32,81,236,82,151,32,
-17,50,32,37,212,96,20,2,95,50,50,2,52,32,102,244,110,0,2,101,
-120,112,2,111,115,101,2,100,45,109,2,111,100,117,2,108,101,115,2,58,
-34,32,246,63,2,224,52,0,64,132,2,85,32,64,2,95,52,49,35,179,
-96,144,224,79,15,2,111,116,104,2,101,114,45,224,77,6,192,60,149,10,
-60,251,85,9,64,59,64,7,32,62,96,8,245,17,16,2,32,32,34,128,
-55,32,31,2,51,49,51,86,70,2,52,48,32,224,250,2,137,163,246,242,
-5,224,186,2,184,169,53,126,117,133,2,52,50,32,32,129,179,23,2,49,
-52,51,2,32,95,54,64,13,179,24,128,88,213,173,64,155,245,117,8,224,
-153,1,2,66,117,105,2,108,100,105,2,110,103,32,2,112,97,99,2,107,
-97,103,2,101,32,34,253,185,1,150,100,128,145,119,129,225,149,0,96,28,
-115,196,2,54,54,32,65,163,117,182,246,238,3,86,174,87,154,96,63,182,
-228,183,7,128,8,118,244,224,228,4,192,104,224,230,38,224,232,4,128,15,
-224,237,16,2,87,114,105,2,116,105,110,224,236,8,151,193,86,89,246,215,
-20,2,32,116,111,193,199,2,49,56,49,247,54,2,97,158,32,189,98,165,
-55,80,118,126,192,33,215,83,159,73,64,106,55,204,119,151,2,54,55,32,
-64,111,2,51,53,53,2,32,64,85,152,249,2,85,32,65,99,36,2,50,
-51,51,128,14,224,21,3,193,211,2,49,57,53,64,65,52,240,32,108,2,
-48,48,32,97,135,96,253,117,47,183,66,64,20,123,236,162,60,2,54,57,
-54,150,131,119,64,2,95,52,50,2,57,32,95,2,50,57,50,96,110,162,
-141,64,50,152,191,96,99,128,153,130,160,139,53,2,66,32,89,121,209,64,
-149,224,207,1,89,127,97,120,197,88,128,7,249,21,0,153,217,160,192,2,
-51,52,51,66,49,96,165,32,88,64,111,66,249,98,57,64,30,2,57,52,
-32,65,29,2,50,55,56,64,215,2,53,48,32,248,140,5,56,141,150,114,
-2,95,51,55,65,34,130,52,33,10,194,61,249,24,10,184,191,64,25,249,
-110,3,35,208,32,8,32,152,96,4,128,127,65,83,128,88,33,130,161,225,
-65,59,129,116,34,132,45,77,64,149,96,81,64,22,2,53,50,51,64,167,
-32,28,89,162,224,170,11,2,73,32,64,2,64,35,51,161,7,160,92,249,
-78,36,194,172,2,110,97,109,32,4,2,111,116,32,2,111,102,32,36,162,
-2,32,102,111,2,114,109,32,64,20,2,45,118,101,2,114,115,105,2,111,
-110,58,194,156,32,147,32,78,96,169,160,109,65,105,139,181,244,5,41,247,
-88,0,66,175,224,65,0,34,43,65,223,100,202,194,232,64,210,124,190,64,
-8,101,33,2,56,56,32,153,251,2,54,57,53,65,39,2,52,50,53,224,
-77,0,138,180,66,82,220,53,196,34,154,236,220,105,187,254,96,134,163,105,
-66,191,91,105,225,65,1,225,46,2,2,107,103,80,2,97,116,104,2,32,
-105,115,2,32,101,109,2,112,116,121,227,227,0,130,151,250,76,2,58,68,
-253,239,5,128,27,128,140,96,110,254,214,0,228,166,2,227,237,0,228,168,
-11,64,12,102,12,184,240,248,165,4,228,167,33,2,73,110,115,2,116,97,
-108,2,108,105,110,228,170,8,251,4,1,228,167,18,2,105,110,32,229,198,
-0,133,185,133,88,231,84,5,253,172,1,129,111,160,10,224,19,0,224,245,
-3,68,25,66,79,217,239,132,214,161,7,128,50,225,34,10,64,53,130,221,
-229,95,0,251,255,10,2,52,55,32,255,114,3,253,52,5,194,72,224,87,
-2,163,226,96,10,225,154,5,231,38,16,161,150,2,35,50,32,231,26,34,
-2,99,114,101,2,97,116,101,225,73,1,224,109,6,99,2,225,20,1,64,
-12,2,51,32,67,36,193,2,48,55,32,228,0,0,165,139,64,22,102,187,
-225,193,4,226,1,9,225,13,4,102,245,160,39,2,51,48,51,232,52,0,
-37,186,133,236,64,10,104,205,253,93,19,224,79,0,32,54,135,50,102,124,
-224,87,0,124,178,102,69,224,143,14,35,176,224,143,9,2,50,50,57,230,
-118,1,67,221,102,105,165,233,161,204,99,152,253,211,0,67,241,141,121,70,
-212,2,90,32,90,32,1,160,40,64,26,141,72,97,239,68,34,228,16,1,
-130,157,226,146,0,160,165,124,85,2,51,55,55,96,125,159,122,2,49,53,
-49,224,6,0,64,81,139,248,162,18,194,249,66,9,66,146,2,95,50,53,
-102,232,224,30,15,2,51,54,48,224,30,10,2,95,51,56,64,231,226,239,
-8,34,101,132,140,129,226,64,125,138,203,167,235,97,58,224,99,0,64,227,
-97,171,65,143,65,185,2,56,53,56,34,155,2,53,48,57,64,61,2,75,
-32,95,70,65,102,86,71,3,194,176,234,112,0,162,116,2,51,56,32,96,
-121,32,22,125,45,32,176,228,27,17,227,101,6,71,196,133,81,228,255,1,
-132,231,197,130,128,13,93,175,231,69,1,130,203,255,140,20,131,155,161,145,
-2,85,32,95,129,147,102,147,192,9,65,28,138,237,71,109,225,181,0,2,
-56,53,57,129,182,232,104,1,192,136,32,109,200,72,134,122,224,54,0,224,
-141,0,128,87,64,66,32,59,2,94,109,107,2,100,105,114,2,32,58,49,
-97,87,32,16,227,210,1,2,85,115,97,2,103,101,58,2,32,109,104,2,
-115,32,91,2,45,45,118,135,54,2,93,32,91,2,45,45,110,2,117,109,
-101,2,114,105,99,224,19,3,2,118,93,32,2,91,45,113,64,4,2,108,
-93,32,2,91,45,114,64,4,2,67,91,82,2,124,87,93,64,9,2,88,
-67,80,2,80,93,32,2,91,45,68,2,100,101,102,64,7,2,84,93,32,
-2,91,45,122,64,4,2,105,80,65,2,84,72,93,32,8,2,111,70,73,
-2,76,69,93,32,8,2,97,91,80,64,18,64,10,2,76,80,65,128,28,
-2,80,80,75,2,71,93,32,2,91,45,81,2,32,80,75,2,71,32,91,
-2,68,73,82,96,31,2,116,84,65,2,82,71,69,64,76,2,77,111,100,
-44,128,2,78,97,109,2,101,46,46,2,46,93,34,97,29,67,74,140,39,
-226,81,3,235,57,1,226,168,1,104,122,229,203,0,224,42,1,99,236,99,
-195,40,254,232,248,2,226,208,6,2,49,55,50,129,151,162,138,197,1,96,
-52,227,19,3,39,135,130,164,229,143,0,163,180,230,88,8,224,16,2,162,
-108,172,232,172,9,101,213,192,93,231,110,37,172,11,231,100,38,2,116,111,
-112,2,32,108,101,2,118,101,108,2,32,100,101,2,102,110,115,2,58,32,
-32,64,0,236,18,1,228,238,2,33,51,2,51,32,35,204,31,105,94,2,
-52,56,32,235,159,0,236,54,22,2,40,117,110,2,112,114,117,2,110,101,
-100,160,92,224,89,4,224,76,1,2,95,55,54,32,5,67,170,32,219,231,
-16,2,225,46,12,237,62,9,230,252,30,228,73,1,145,12,225,47,3,160,
-66,132,66,110,167,224,216,21,2,61,32,34,128,208,127,217,231,198,5,225,
-246,1,64,183,162,161,64,5,75,127,64,46,98,54,129,238,231,87,4,65,
-29,2,52,52,57,68,254,100,201,229,12,7,234,176,0,226,130,8,236,3,
-5,226,213,9,226,74,81,2,102,105,110,2,97,108,32,2,112,97,115,2,
-115,32,32,224,0,1,233,178,0,226,75,1,160,71,226,78,0,160,15,226,
-4,1,140,186,32,97,209,36,224,100,1,2,109,115,34,225,94,0,239,148,
-0,239,95,0,234,218,0,163,100,143,132,39,35,76,182,69,192,224,184,12,
-2,46,99,111,2,109,98,34,160,86,135,97,224,60,35,192,57,225,144,6,
-2,51,57,54,229,116,2,37,109,2,99,46,99,224,42,5,77,123,234,66,
-6,226,202,3,65,148,142,136,204,144,234,140,4,199,104,226,7,14,226,32,
-8,2,50,49,49,224,143,2,2,77,72,83,2,67,67,34,193,74,2,83,
-32,83,206,19,224,5,9,240,243,4,38,164,73,133,243,2,7,96,202,224,
-19,4,182,51,229,17,1,228,217,1,207,41,224,8,5,227,29,2,234,208,
-38,241,235,10,226,167,19,2,69,120,101,2,99,117,116,39,1,238,41,17,
-227,148,4,230,79,0,32,250,135,254,225,179,1,243,146,4,65,124,170,148,
-237,66,1,243,123,4,200,246,224,199,7,139,46,2,56,48,56,160,102,140,
-96,239,28,4,235,162,18,2,111,109,109,2,97,110,100,2,32,102,97,2,
-105,108,101,2,100,58,32,236,245,3,226,24,9,227,254,80,2,67,32,99,
-2,111,109,112,2,105,108,97,2,116,105,111,2,110,32,32,227,254,89,237,
-131,8,193,143,138,88,2,56,48,57,227,183,19,2,36,73,78,224,74,2,
-224,66,4,224,59,25,2,79,85,84,244,34,5,96,221,2,51,51,55,227,
-209,1,224,235,4,230,60,16,2,45,119,32,2,45,87,97,2,108,108,32,
-2,45,79,51,2,32,45,73,245,181,1,105,239,135,30,224,64,19,2,47,
-115,114,2,99,47,114,2,117,110,116,2,105,109,101,239,29,9,224,57,31,
-2,47,101,118,2,97,108,45,230,198,1,239,89,21,2,46,99,32,96,42,
-224,198,2,33,76,2,32,45,108,2,109,32,45,2,111,32,36,225,27,3,
-250,49,3,2,56,49,48,225,111,2,238,11,3,224,11,0,244,47,0,230,
-195,1,239,50,1,2,56,50,56,171,36,227,164,0,64,12,131,112,212,50,
-32,16,113,91,114,196,32,88,77,211,44,176,105,198,83,200,226,73,2,2,
-97,105,110,224,167,1,74,86,145,138,2,85,32,67,97,205,139,254,113,1,
-225,130,1,2,50,51,52,227,200,1,161,38,226,183,2,238,59,12,64,246,
-136,18,84,50,73,44,148,199,225,62,2,2,125,34,32,128,134,64,29,2,
-85,32,90,201,80,226,93,3,44,10,234,82,16,170,112,224,17,6,192,20,
-235,1,1,224,48,9,224,51,10,224,57,3,241,15,2,224,29,18,224,65,
-3,140,135,249,31,13,224,45,5,128,41,224,37,8,231,13,3,242,240,4,
-133,76,98,68,148,180,2,67,32,80,68,39,39,157,68,39,33,250,36,79,
-149,193,2,50,55,54,193,142,105,145,65,86,2,75,52,32,129,119,224,158,
-6,69,31,2,55,49,53,73,91,59,29,224,29,7,166,215,224,231,6,225,
-2,2,192,40,248,32,2,119,220,53,220,210,37,224,34,2,228,43,1,70,
-21,96,118,231,171,4,2,55,49,56,244,128,9,64,253,65,6,40,139,2,
-52,49,50,83,87,195,57,230,105,3,163,46,78,176,231,64,1,160,97,231,
-65,2,138,249,160,23,2,95,54,56,198,105,225,10,13,232,167,4,225,51,
-2,192,167,229,125,0,231,225,6,192,186,193,21,163,140,161,170,212,16,100,
-168,96,210,166,103,128,216,160,12,151,119,227,82,12,85,70,131,34,227,126,
-4,229,203,6,64,132,33,249,2,50,32,90,241,103,3,100,112,149,205,192,
-193,2,82,32,64,80,135,182,157,176,123,161,8,224,88,1,193,9,225,4,
-0,250,235,19,2,65,32,34,227,194,2,192,143,152,119,226,151,1,228,74,
-0,229,171,1,224,240,13,79,195,242,127,6,224,249,3,228,74,2,2,64,
-92,49,2,48,38,34,195,112,96,89,96,47,32,68,82,94,236,155,3,228,
-73,1,224,9,1,131,85,246,118,3,2,95,54,53,69,111,87,192,210,213,
-96,4,120,72,227,90,0,192,87,2,80,32,90,224,1,0,192,19,132,244,
-192,13,65,66,32,15,2,52,32,90,192,18,32,13,2,51,32,90,224,48,
-2,243,27,1,225,181,3,224,88,9,251,44,8,103,128,121,56,160,15,2,
-55,57,32,229,253,0,2,56,50,32,32,4,165,191,225,185,17,2,78,111,
-32,47,9,2,105,110,105,104,198,2,102,111,117,73,89,2,111,114,58,202,
-45,142,17,100,101,131,225,70,58,147,211,218,153,93,195,77,221,65,56,64,
-29,147,214,2,75,32,66,33,98,133,121,115,16,235,99,1,249,235,0,64,
-65,89,237,96,187,32,203,250,104,10,195,226,234,99,2,156,159,33,182,225,
-28,0,97,173,250,125,6,128,19,131,94,224,99,32,230,46,5,234,213,1,
-188,192,33,204,225,144,3,224,112,4,96,111,192,116,228,98,0,99,230,186,
-8,234,138,1,226,249,0,35,217,225,156,19,2,35,105,110,2,99,108,117,
-2,100,101,32,2,92,51,52,162,229,232,175,1,227,48,3,71,167,224,149,
-1,96,147,224,80,12,45,150,2,102,102,105,2,46,104,34,203,112,2,49,
-55,51,33,204,225,119,24,172,223,225,30,9,200,47,252,5,18,129,19,225,
-25,1,226,198,1,160,200,123,100,2,56,52,50,229,67,0,224,24,6,172,
-76,160,48,2,79,32,95,224,217,11,57,59,2,116,105,99,2,32,115,116,
-2,114,117,99,2,116,32,102,2,102,105,95,2,101,110,116,2,114,121,32,
-2,116,97,98,2,108,101,91,2,93,32,61,2,32,123,34,227,204,0,240,
-244,5,96,103,117,79,121,198,2,51,48,56,228,122,7,224,32,1,69,36,
-160,32,2,79,32,102,224,125,0,2,123,32,48,2,44,48,32,104,215,224,
-22,3,2,125,59,34,224,17,6,224,159,8,2,42,120,102,32,11,96,165,
-32,163,96,7,96,52,241,85,4,151,86,244,210,2,2,110,105,109,2,112,
-108,101,2,109,101,110,2,116,101,100,2,32,70,70,2,73,32,102,56,182,
-2,117,114,101,225,215,1,2,56,52,55,226,235,32,233,78,5,225,222,3,
-126,185,66,251,226,6,4,211,185,177,116,136,52,242,175,4,229,92,0,66,
-9,2,52,49,57,77,113,70,222,64,151,246,223,0,205,36,98,41,230,164,
-3,66,43,227,78,4,224,208,93,224,37,12,224,214,66,224,215,9,227,119,
-24,195,86,128,30,224,5,0,32,83,32,52,164,136,228,143,0,232,189,6,
-197,43,64,173,2,61,61,32,2,64,35,57,224,38,1,170,81,224,169,4,
-234,127,0,96,19,2,56,53,50,66,234,70,69,2,55,54,54,228,219,5,
-224,11,0,69,237,153,114,65,26,159,107,189,204,103,95,221,214,129,58,233,
-174,1,216,100,97,61,227,206,12,2,100,121,110,2,97,109,105,210,64,64,
-85,88,89,2,56,52,57,32,16,229,128,3,224,87,39,2,119,114,97,2,
-112,112,101,2,114,34,32,224,87,5,70,32,224,87,2,225,58,1,224,79,
-23,132,118,238,0,2,97,25,2,95,53,50,68,180,225,4,7,236,50,1,
-78,3,243,103,22,165,163,64,43,165,45,2,56,53,49,117,69,171,13,128,
-184,81,198,208,55,190,185,255,81,8,227,18,2,235,154,0,249,233,1,224,
-220,7,70,78,233,127,0,193,100,161,16,226,92,0,245,117,4,193,38,154,
-51,154,164,253,212,7,224,148,0,131,87,225,97,1,96,85,222,100,250,87,
-3,225,142,2,224,36,5,224,16,2,224,107,0,236,22,4,169,228,96,17,
-66,208,225,216,3,236,25,1,233,45,2,233,33,20,2,98,97,100,73,17,
-2,101,105,103,2,110,32,105,2,109,112,111,2,114,116,32,243,73,18,67,
-18,156,7,228,95,6,228,106,3,32,8,100,22,64,44,155,23,111,37,64,
-14,155,10,106,63,32,14,66,239,32,14,230,65,3,58,40,2,82,65,87,
-230,87,7,32,21,2,84,73,77,2,69,77,73,2,76,76,73,224,27,7,
-2,97,99,111,114,70,224,19,4,2,100,100,95,90,169,224,23,11,2,117,
-116,102,2,56,34,32,224,23,6,2,115,105,110,224,19,8,2,116,97,110,
-224,19,11,2,50,34,32,224,20,5,2,99,97,108,2,108,111,99,224,21,
-8,2,108,111,115,2,101,98,34,224,21,7,224,171,9,2,101,120,112,224,
-18,7,2,102,108,117,2,115,104,98,224,21,8,2,111,112,101,224,145,8,
-2,102,114,101,103,22,224,19,3,2,103,101,116,224,60,8,32,19,2,101,
-110,118,224,21,7,2,105,115,119,2,105,110,100,2,111,119,115,224,24,7,
-2,108,111,103,224,18,8,2,122,55,55,224,229,8,2,109,97,108,224,251,
-10,2,109,100,53,2,65,114,114,2,97,121,34,224,23,9,2,66,70,73,
-225,150,9,32,23,2,83,116,114,2,105,110,103,224,24,8,2,101,109,99,
-2,112,121,34,224,21,9,2,109,111,118,224,246,8,2,112,117,116,224,246,
-8,225,215,10,2,115,113,114,2,116,34,32,224,19,6,2,121,115,116,2,
-101,109,34,224,21,6,226,0,10,2,116,109,112,37,185,224,122,8,2,117,
-110,103,225,115,10,2,117,110,108,2,105,110,107,224,166,8,2,101,101,107,
-2,80,116,114,224,22,8,2,111,107,101,224,22,14,2,87,111,114,2,100,
-34,32,224,69,9,224,23,11,66,225,65,169,2,95,99,111,2,109,112,114,
-2,101,115,115,2,111,114,34,224,34,15,2,100,101,99,224,36,16,64,95,
-2,95,117,105,2,110,116,56,224,145,11,224,25,14,192,51,2,49,54,34,
-224,52,15,224,26,10,192,53,2,51,50,34,224,53,15,224,26,10,192,53,
-2,54,52,34,224,53,15,224,26,10,64,53,224,212,16,224,211,16,224,210,
-17,224,209,17,224,208,17,224,207,17,224,206,17,224,205,17,36,41,37,179,
-225,3,13,224,26,13,64,53,224,52,17,224,51,17,65,82,225,107,16,224,
-207,15,224,205,15,224,97,13,2,108,111,110,228,3,8,128,98,224,25,12,
-64,51,224,50,16,224,49,16,2,117,108,108,224,102,17,224,103,17,224,104,
-17,224,51,16,2,102,108,116,224,49,12,224,23,10,2,115,105,122,2,101,
-111,102,225,25,11,160,25,224,100,11,192,26,224,27,11,70,44,2,100,105,
-114,230,150,12,224,23,10,2,114,101,97,2,100,100,105,224,46,9,2,95,
-100,95,228,240,11,2,99,104,100,224,44,9,2,109,107,100,224,20,9,37,
-24,2,99,119,100,237,243,9,224,0,63,72,70,41,38,40,70,110,195,78,
-203,2,50,51,57,76,181,142,210,32,5,2,56,54,52,234,233,3,238,226,
-0,2,95,56,55,53,35,96,29,2,54,51,32,50,1,82,78,239,32,0,
-64,88,45,147,104,234,55,174,144,14,41,10,169,81,234,237,1,192,11,236,
-105,0,176,162,114,249,233,207,2,182,176,81,169,96,105,128,98,152,167,233,
-161,19,2,123,32,92,49,31,177,32,54,54,250,12,24,64,46,2,44,32,
-109,2,104,115,95,33,211,2,114,95,34,241,89,4,239,190,2,2,44,34,
-32,225,66,0,242,243,0,224,134,22,224,133,43,224,128,28,147,86,89,175,
-235,126,1,88,5,120,12,224,99,15,224,223,2,109,32,64,99,2,56,51,
-55,220,244,249,217,2,78,38,64,181,2,56,51,57,96,5,74,208,224,17,
-5,65,146,253,209,2,244,109,8,174,39,233,143,3,139,53,2,38,32,109,
-2,117,115,116,2,32,98,101,2,32,80,116,2,114,47,70,2,117,110,80,
-135,198,75,5,224,181,12,2,40,72,115,128,37,2,41,34,32,213,104,224,
-40,2,130,52,96,5,246,60,10,236,188,4,66,224,64,161,65,64,142,169,
-2,85,32,66,129,5,2,50,57,32,236,135,2,240,38,0,129,90,179,243,
-148,175,157,35,65,104,97,18,248,117,2,121,134,148,254,97,85,178,251,189,
-10,225,150,17,2,59,32,109,33,246,64,15,2,95,85,110,2,105,116,40,
-2,115,44,32,162,3,246,239,11,32,212,64,196,224,212,0,252,241,19,64,
-43,251,129,0,224,77,0,76,243,60,79,224,139,12,224,122,0,2,32,95,
-53,2,54,50,32,64,201,124,121,2,53,54,51,64,17,226,43,0,224,134,
-7,33,239,176,250,99,240,65,97,140,248,226,53,4,64,140,246,163,20,162,
-53,225,45,19,194,71,2,114,101,116,2,117,114,110,2,32,116,121,2,112,
-101,32,194,81,2,73,79,58,237,142,0,2,49,51,48,212,107,64,141,141,
-89,253,7,6,2,80,114,105,2,109,105,116,2,105,118,101,2,115,46,73,
-2,79,34,32,128,183,141,116,113,22,142,210,241,51,0,96,167,175,96,192,
-31,242,13,0,224,41,4,64,34,239,138,0,209,99,209,14,98,79,239,112,
-0,2,57,50,32,224,43,1,239,208,1,96,139,69,153,174,60,225,16,17,
-66,60,2,116,111,95,240,197,2,244,204,1,2,56,51,54,226,124,22,226,
-109,36,64,146,134,61,182,209,224,148,20,98,209,240,184,0,246,239,5,192,
-154,255,226,22,224,157,1,224,216,6,254,120,20,226,206,12,96,56,227,60,
-7,64,208,134,181,69,13,152,75,112,54,163,215,2,67,32,60,161,247,250,
-21,0,226,13,4,194,6,47,205,96,9,224,36,8,226,43,1,208,144,133,
-118,225,250,3,133,94,160,32,148,78,224,30,5,102,254,224,212,1,229,51,
-3,226,203,2,192,18,209,3,224,115,0,113,102,2,95,56,53,244,161,1,
-2,51,48,50,129,130,125,9,179,191,227,151,54,2,78,111,116,2,32,97,
-32,2,118,97,108,2,105,100,32,2,67,32,116,35,150,227,139,8,65,109,
-135,192,183,188,229,241,14,227,150,2,2,70,108,111,2,97,116,87,96,71,
-224,42,12,224,31,2,33,220,224,79,25,2,73,110,116,224,76,17,192,28,
-224,73,28,206,78,224,74,13,224,29,0,224,75,17,2,68,97,116,2,97,
-46,87,32,39,96,4,109,74,224,75,17,128,30,224,152,28,2,40,41,34,
-224,74,16,70,95,224,73,22,2,83,121,115,47,220,37,15,2,46,72,97,
-2,110,100,108,152,69,224,115,13,194,113,231,96,2,42,80,150,56,226,40,
-17,2,70,111,114,69,192,2,46,67,46,2,84,121,112,32,175,128,67,66,
-132,235,8,3,2,67,67,104,2,97,114,34,224,20,7,2,83,67,104,224,
-21,10,2,85,67,104,224,43,11,237,154,11,2,67,85,83,224,22,12,161,
-250,224,42,5,224,20,11,2,76,111,110,236,60,8,2,67,85,76,224,21,
-11,33,31,2,100,105,102,2,102,34,32,224,152,7,44,135,224,20,9,224,
-21,12,2,76,76,111,224,110,12,192,22,236,36,9,67,99,138,157,230,235,
-17,228,64,1,64,45,138,74,224,45,17,224,42,2,201,52,230,235,10,104,
-38,32,25,228,188,8,134,207,64,61,136,16,224,104,17,130,184,64,41,135,
-172,230,26,21,2,118,111,105,2,100,32,109,235,47,0,233,7,20,230,80,
-2,46,50,2,32,115,41,2,32,123,32,235,102,15,2,59,32,125,235,103,
-1,68,183,232,196,0,2,48,53,49,2,32,64,80,236,212,0,129,6,32,
-108,2,57,49,56,66,239,108,206,202,74,64,60,64,8,96,60,184,147,32,
-27,2,49,50,32,96,6,69,119,107,176,64,9,173,0,2,35,49,50,192,
-65,74,60,96,65,199,108,159,91,2,56,49,54,171,117,45,136,120,84,64,
-19,32,44,74,198,32,36,160,21,64,20,105,110,64,79,60,44,141,160,151,
-247,69,228,192,60,193,51,2,56,50,51,119,1,173,156,224,74,3,2,64,
-95,57,106,4,96,153,237,187,2,224,66,0,129,163,2,56,50,53,170,238,
-86,201,64,15,151,155,231,244,1,63,108,160,80,2,56,51,32,231,205,1,
-224,22,6,34,59,224,155,0,226,206,0,65,13,66,55,66,126,64,14,134,
-65,120,240,2,50,52,32,96,33,130,240,80,68,2,67,65,83,117,26,2,
-76,101,110,96,44,130,220,2,94,108,122,53,141,96,16,130,194,39,13,46,
-109,46,209,99,67,128,7,2,95,56,57,224,234,0,33,211,224,11,2,97,
-123,160,11,75,55,128,11,65,135,32,94,128,255,77,119,111,71,32,14,126,
-22,98,4,200,179,2,56,50,49,192,19,128,5,64,137,131,14,2,94,112,
-111,116,201,96,156,130,247,2,94,112,101,116,243,96,18,130,128,237,226,0,
-225,248,3,65,215,252,212,0,225,74,1,129,136,32,170,96,212,225,81,1,
-32,77,34,22,162,79,74,229,34,251,74,109,2,95,55,50,128,145,64,80,
-103,155,32,8,64,14,161,119,129,118,66,122,226,138,1,2,54,51,50,234,
-87,1,255,132,21,2,117,110,115,37,237,62,153,2,99,104,97,2,114,32,
-100,38,244,255,128,7,255,228,0,64,79,159,230,2,49,51,32,128,227,2,
-52,32,35,65,2,64,107,255,75,9,224,20,6,224,105,5,2,42,99,111,
-2,109,98,101,2,120,112,114,32,108,64,117,128,49,33,44,58,84,228,33,
-19,68,32,192,58,2,108,101,110,32,61,235,30,6,64,60,234,126,1,140,
-248,42,87,41,94,238,139,3,161,112,208,40,177,18,2,83,32,85,228,63,
-0,253,211,4,128,7,130,47,241,28,0,177,17,241,16,5,2,95,53,56,
-186,248,64,95,165,188,2,54,51,49,239,188,1,224,160,6,2,49,52,57,
-171,200,32,44,96,80,64,56,197,202,2,75,51,32,2,75,52,32,32,2,
-2,90,32,90,96,1,230,82,1,64,38,130,164,32,38,224,32,1,224,1,
-5,230,129,6,64,51,130,197,32,51,2,50,32,90,224,1,16,230,185,8,
-64,57,205,122,64,1,33,49,219,43,225,55,6,252,76,5,223,208,252,96,
-4,143,176,255,191,0,96,11,45,91,100,227,242,114,2,64,33,193,53,128,
-130,2,48,57,32,97,80,33,51,113,3,32,57,69,241,66,253,36,39,220,
-98,222,42,143,27,102,240,91,231,96,100,143,53,101,116,64,79,131,83,229,
-179,3,70,114,100,47,32,29,75,217,197,221,227,168,0,70,109,199,71,96,
-86,167,98,2,56,48,53,160,7,96,174,64,93,131,162,2,75,32,58,128,
-20,32,11,2,90,32,85,101,19,64,43,68,75,153,171,96,32,130,43,134,
-7,229,193,1,33,22,2,57,57,32,133,200,198,64,2,50,49,49,233,138,
-4,242,51,0,224,37,18,2,77,72,83,2,67,79,78,2,70,34,32,225,
-162,2,254,105,0,129,164,230,130,0,254,54,0,224,8,4,64,217,161,23,
-129,232,198,62,230,65,5,236,167,2,2,50,52,50,76,211,165,140,2,49,
-52,51,35,9,108,180,2,50,52,51,237,124,1,97,94,2,50,50,52,128,
-100,2,51,57,57,64,59,233,80,4,2,111,117,108,2,100,32,110,44,192,
-2,102,105,110,139,182,132,39,160,138,252,3,4,2,110,32,102,2,105,108,
-101,233,124,7,207,15,230,191,1,238,240,2,2,56,48,50,224,65,2,2,
-100,101,102,2,97,117,108,172,134,2,51,51,55,228,134,13,2,99,99,34,
-254,240,0,96,37,224,103,3,144,79,225,32,4,64,105,230,6,5,254,222,
-2,225,42,30,225,43,8,235,195,18,2,117,110,100,2,32,116,97,2,114,
-103,101,2,116,58,32,255,1,9,2,55,57,54,108,95,255,14,1,255,26,
-7,225,55,4,225,59,7,225,61,2,159,196,233,64,0,99,181,192,215,225,
-61,28,99,236,46,129,64,5,96,255,239,9,2,224,59,22,168,241,225,70,
-0,193,135,224,83,42,2,111,110,102,239,157,3,237,30,18,2,117,110,105,
-2,120,45,34,131,153,229,197,0,2,95,54,55,230,84,1,2,48,51,32,
-197,38,67,92,41,114,64,20,229,169,0,197,208,32,2,166,50,64,30,203,
-82,247,155,2,210,200,210,197,227,179,1,183,170,101,29,146,177,248,17,4,
-201,247,100,182,146,176,32,7,48,39,224,109,0,171,54,230,206,0,232,182,
-1,2,55,55,57,232,182,0,64,189,128,126,2,95,50,53,160,140,224,45,
-4,2,51,56,57,131,240,224,44,0,132,72,66,96,69,96,225,157,0,226,
-245,0,226,193,4,225,100,17,2,67,97,110,2,39,116,32,89,197,210,94,
-192,147,227,64,53,224,120,0,162,203,230,179,1,233,165,8,227,158,83,2,
-82,101,97,195,157,2,115,32,102,36,174,2,46,32,80,2,111,115,115,2,
-105,98,108,2,101,32,116,128,22,195,181,232,44,0,99,158,227,163,3,2,
-89,32,66,34,38,68,228,244,230,3,168,168,231,64,1,226,208,0,227,190,
-3,225,0,9,237,104,9,2,47,116,97,96,137,2,46,99,111,163,28,2,
-58,49,55,69,156,135,47,181,39,133,236,33,17,44,6,65,246,154,10,64,
-181,2,53,49,49,179,46,2,51,53,51,179,143,211,148,132,29,114,180,64,
-52,98,180,71,84,2,83,32,64,100,77,80,160,2,51,54,53,32,22,200,
-137,224,51,4,225,91,19,2,65,109,98,2,105,103,117,2,111,117,115,2,
-58,34,32,160,56,107,13,170,186,229,3,3,195,179,128,217,203,93,33,189,
-179,156,198,32,2,50,52,54,131,98,225,246,0,2,35,49,48,234,34,0,
-123,153,36,120,224,130,1,2,84,97,114,33,56,231,148,2,192,34,88,240,
-32,138,166,152,162,97,149,47,96,33,225,221,0,2,35,49,49,161,40,224,
-57,11,224,46,3,229,201,24,160,74,161,246,161,165,140,122,47,61,192,12,
-65,0,213,104,106,223,66,195,2,90,32,66,149,62,131,9,92,124,105,105,
-245,109,2,192,193,131,22,67,44,139,20,199,219,224,193,4,234,224,0,224,
-46,4,69,4,163,64,194,239,32,137,64,7,64,219,64,105,34,13,128,85,
-235,100,0,130,1,104,140,96,36,96,191,206,120,2,75,32,66,96,119,109,
-3,205,153,40,45,235,128,3,2,51,55,56,64,60,2,52,51,50,32,35,
-225,185,1,2,58,92,49,2,48,38,34,231,187,1,236,140,23,2,32,32,
-102,71,105,227,172,2,125,173,162,107,2,53,49,51,224,237,0,224,72,24,
-44,207,2,101,99,116,2,101,100,58,224,75,1,105,10,33,14,85,225,197,
-217,236,188,1,99,54,98,177,2,53,49,55,64,5,80,141,224,12,6,2,
-55,56,48,65,71,86,41,65,41,99,6,2,55,56,55,131,118,192,7,2,
-57,51,32,96,78,172,171,64,49,2,53,50,55,135,41,102,65,118,104,242,
-85,6,99,0,78,138,64,33,2,54,56,56,224,39,0,224,211,1,63,204,
-128,202,43,138,2,50,52,49,224,149,0,65,122,192,194,175,238,103,170,160,
-179,122,249,111,144,134,179,224,210,8,99,48,128,189,96,190,32,42,64,74,
-178,190,2,49,53,56,131,23,130,29,64,38,64,29,186,95,224,104,12,117,
-14,2,55,56,53,101,207,32,6,224,107,2,2,56,32,79,2,32,35,54,
-216,146,64,17,144,30,96,94,128,110,123,58,96,251,242,252,2,2,97,108,
-117,106,131,225,53,7,250,75,1,66,167,250,78,1,32,81,64,89,143,193,
-225,129,2,2,55,56,52,231,142,0,102,156,128,24,209,216,2,53,53,53,
-96,5,225,166,1,204,239,162,47,225,120,10,64,106,164,235,140,215,129,93,
-224,67,3,64,213,66,163,224,213,6,2,92,57,50,2,38,110,34,224,213,
-9,141,101,180,97,64,213,164,36,128,107,176,166,225,197,4,225,101,6,2,
-51,32,35,65,160,225,133,1,160,19,67,62,64,66,216,148,65,13,64,15,
-226,248,0,225,123,11,2,107,101,121,224,163,10,251,241,2,110,249,225,122,
-5,237,122,0,224,249,4,237,250,0,131,200,68,46,33,154,70,205,34,13,
-64,81,231,247,0,252,139,9,128,198,142,143,96,31,2,90,32,95,97,152,
-2,49,51,52,225,28,2,130,255,2,80,32,58,130,235,160,213,2,53,32,
-80,101,212,2,52,50,57,231,162,0,147,185,33,9,64,42,202,45,242,119,
-0,226,215,1,227,65,5,168,4,236,236,2,65,238,64,83,68,127,103,246,
-225,139,2,160,148,202,29,239,19,4,2,50,53,56,65,184,81,70,143,114,
-200,64,96,227,233,153,4,33,52,96,124,224,34,0,162,15,32,91,74,93,
-165,164,240,123,17,240,125,10,96,59,175,171,116,198,64,112,246,75,1,40,
-45,161,162,85,168,101,212,231,94,4,2,55,55,55,160,164,224,14,1,179,
-27,2,35,54,52,252,112,1,66,24,115,110,104,141,156,111,104,147,252,111,
-4,99,89,252,47,0,224,25,3,187,133,32,60,252,159,4,130,117,167,11,
-96,161,220,81,224,195,4,32,151,224,196,7,241,77,3,226,91,0,96,101,
-66,223,224,62,28,2,85,32,83,128,144,234,182,3,83,21,100,141,103,103,
-129,14,2,55,53,49,220,68,96,17,64,175,34,235,32,4,35,17,2,54,
-53,53,232,225,2,192,9,232,227,0,96,36,160,58,32,8,64,6,196,3,
-136,45,225,69,9,253,84,0,224,219,4,96,21,100,69,129,135,224,34,10,
-183,221,224,34,2,225,74,9,2,53,57,53,225,10,7,66,65,164,139,83,
-142,64,162,32,35,64,21,132,94,97,37,49,209,67,61,2,52,54,53,130,
-199,52,223,104,142,129,213,96,32,2,52,55,32,170,4,2,50,48,52,66,
-251,224,23,8,33,43,114,177,64,22,224,24,4,35,124,2,52,49,49,118,
-168,2,50,48,50,245,26,3,2,116,102,56,91,36,2,58,32,98,44,25,
-219,46,226,74,3,32,2,136,66,64,147,131,110,35,182,230,73,0,64,141,
-86,51,202,113,232,113,0,224,46,11,105,113,40,86,192,46,224,44,33,224,
-41,32,131,80,98,116,37,92,32,4,65,15,160,168,64,58,224,27,22,224,
-26,4,160,20,174,94,225,8,26,109,127,224,216,83,224,187,47,224,184,22,
-2,49,57,50,247,3,4,224,139,29,224,111,12,182,85,32,29,32,74,64,
-39,66,231,214,236,2,80,32,35,128,182,96,21,134,251,218,228,102,157,235,
-41,0,99,41,66,223,115,212,69,128,208,105,134,198,128,46,224,28,15,96,
-206,224,28,3,67,9,163,91,131,149,205,84,192,20,108,18,142,142,160,183,
-251,125,0,96,76,247,67,24,70,140,197,204,64,14,247,82,1,101,28,128,
-232,198,168,239,173,1,235,152,17,2,87,101,108,56,109,47,150,2,111,32,
-105,2,110,116,101,2,114,97,99,93,12,2,32,77,105,2,99,114,111,2,
-72,115,44,2,32,118,101,2,114,115,105,2,111,110,32,146,17,2,50,50,
-57,64,90,164,150,241,45,7,110,70,245,222,6,241,168,0,2,50,56,48,
-68,147,2,54,57,32,196,244,70,213,32,222,69,152,175,40,2,53,55,32,
-97,246,231,90,1,203,75,79,101,39,101,68,212,103,122,96,70,199,120,64,
-252,221,220,39,253,2,75,32,85,243,213,0,80,46,243,229,3,224,1,11,
-118,33,244,20,13,224,44,25,224,41,32,224,38,29,224,35,26,224,32,23,
-224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,65,150,238,225,0,
-232,209,3,255,72,1,225,128,36,225,176,255,225,176,80,224,14,5,224,11,
-2,245,212,2,225,205,9,174,18,100,94,77,98,76,99,78,192,67,236,96,
-15,2,50,56,57,165,208,192,34,244,51,0,79,234,157,105,2,55,50,49,
-67,249,107,110,2,51,53,48,100,87,224,82,1,224,44,0,100,184,242,115,
-2,2,121,112,101,2,32,39,58,2,113,117,105,2,116,39,32,36,172,64,
-8,2,44,32,39,2,58,104,101,2,108,112,39,48,165,2,114,32,104,32,
-9,184,9,224,78,6,116,219,77,3,64,124,136,157,224,101,14,2,87,65,
-82,2,78,73,78,2,71,58,32,2,67,111,109,2,112,105,108,61,203,2,
-119,105,116,2,104,32,71,2,72,67,44,2,32,115,111,2,32,108,105,2,
-109,105,116,32,20,2,102,117,110,37,38,2,111,110,97,2,108,105,116,2,
-121,46,34,227,4,0,2,54,56,32,193,44,68,160,176,109,128,137,2,51,
-48,57,96,252,108,110,165,33,225,33,9,41,80,97,35,75,64,171,79,244,
-215,0,32,22,105,2,224,174,1,2,46,109,104,2,115,105,34,64,27,224,
-19,1,2,62,32,34,96,132,119,97,64,144,156,187,128,155,252,164,1,230,
-202,4,2,35,53,56,199,246,225,185,1,69,143,120,79,160,214,224,180,4,
-64,21,37,172,32,100,225,74,15,2,66,121,101,217,151,225,23,0,129,25,
-236,230,1,60,94,141,63,226,80,0,133,208,153,113,64,183,226,24,25,2,
-85,110,114,2,101,99,111,2,103,110,105,2,122,101,100,95,56,2,109,97,
-110,155,66,224,87,10,248,109,4,198,30,141,71,153,231,157,170,110,207,146,
-157,32,0,77,175,226,211,18,247,20,32,245,184,0,192,165,243,9,9,83,
-85,2,51,48,56,246,196,4,224,191,5,236,11,0,83,134,205,239,2,51,
-56,53,200,147,160,62,65,115,199,26,65,167,33,111,2,79,32,80,224,151,
-13,67,73,167,221,32,185,128,109,224,119,0,190,112,224,60,16,2,99,108,
-101,171,203,224,61,0,228,30,3,53,17,32,19,199,225,227,152,7,2,51,
-49,53,128,196,103,218,2,51,52,57,231,217,0,231,238,1,94,98,231,238,
-0,136,32,41,110,179,27,225,31,10,224,169,16,2,114,101,108,2,111,97,
-100,224,170,5,227,156,5,100,146,65,141,224,22,7,100,163,232,216,2,98,
-4,232,217,2,130,40,32,192,73,227,226,42,12,96,233,224,213,0,224,233,
-3,225,20,4,165,79,225,247,14,224,218,16,2,100,101,108,2,101,116,101,
-222,55,224,125,5,97,131,164,74,150,49,238,74,1,98,68,128,26,154,255,
-226,73,3,97,111,172,105,224,145,10,224,140,16,2,116,121,112,224,138,11,
-66,145,116,177,224,73,33,2,107,105,110,255,12,0,224,73,6,101,203,224,
-73,33,230,26,0,79,83,228,81,14,64,86,148,82,225,126,10,241,175,0,
-67,79,143,78,255,190,3,99,206,2,115,58,92,55,92,102,161,2,32,32,
-32,32,0,96,9,171,72,96,26,130,130,64,26,160,9,2,109,111,100,2,
-117,108,101,128,28,99,73,96,55,128,9,2,97,108,108,2,32,100,101,2,
-102,105,110,2,105,116,105,2,111,110,115,96,35,129,232,2,32,100,32,32,
-25,128,9,224,32,0,2,40,115,41,2,32,100,92,64,36,65,128,2,32,
-101,32,32,0,2,115,104,111,2,119,32,116,64,14,2,111,102,32,2,101,
-92,49,32,28,65,83,2,32,116,32,224,28,7,2,116,92,49,32,28,65,
-38,128,186,2,116,104,105,2,115,32,116,2,101,120,116,64,23,55,185,128,
-152,55,196,85,248,2,97,116,101,87,205,2,114,101,115,76,25,64,33,32,
-134,2,110,32,32,96,0,2,97,100,100,39,158,2,112,32,108,2,101,118,
-101,224,192,3,184,120,65,63,205,166,227,103,7,45,61,227,103,16,36,8,
-133,108,219,199,229,106,10,45,15,82,137,218,67,2,55,54,50,167,8,227,
-167,4,67,100,80,172,34,10,227,231,11,229,219,21,121,147,64,130,2,55,
-54,51,104,190,67,46,2,55,54,49,233,45,2,64,225,142,114,159,166,2,
-55,53,56,85,28,90,107,38,109,224,4,13,192,103,67,143,64,104,255,36,
-0,2,79,32,95,76,217,220,34,230,187,4,236,222,9,38,181,224,13,0,
-96,25,241,90,0,103,244,255,78,1,183,66,143,142,253,78,12,224,204,2,
-238,86,0,230,217,16,98,69,253,206,1,96,38,129,20,250,18,20,2,61,
-32,34,253,154,4,225,191,4,96,122,141,212,234,4,5,2,95,105,116,162,
-71,204,92,226,71,87,128,79,226,71,78,86,111,194,71,79,63,225,122,4,
-214,168,226,71,4,192,1,226,59,55,226,45,72,32,177,64,205,201,219,2,
-51,49,50,65,12,103,177,116,200,2,73,32,64,64,34,137,254,37,169,2,
-52,50,50,32,92,96,5,64,23,217,71,226,47,15,133,44,176,136,96,37,
-2,51,53,54,240,218,19,2,40,109,111,224,49,12,224,33,1,2,41,32,
-119,2,104,101,114,101,25,2,105,109,112,2,111,114,116,2,32,80,114,2,
-101,108,117,2,100,101,92,224,17,1,2,83,121,115,2,116,101,109,2,46,
-73,79,2,46,80,114,49,33,2,79,114,82,2,117,110,92,132,243,2,97,
-117,108,2,116,32,40,2,73,110,116,2,101,103,101,2,114,44,32,2,68,
-111,117,2,98,108,101,2,44,32,83,2,116,114,105,2,110,103,44,2,32,
-40,41,2,41,92,49,221,110,96,226,134,57,226,177,15,193,124,97,208,43,
-182,66,17,33,120,2,54,50,50,137,75,210,109,235,132,3,66,205,65,236,
-226,154,12,126,224,168,1,72,239,238,33,0,33,238,163,30,114,143,153,101,
-160,110,2,56,52,52,128,11,168,204,227,68,63,136,236,224,169,14,66,222,
-168,106,231,148,0,32,26,218,126,224,103,0,228,42,16,76,169,97,90,237,
-90,17,75,102,43,11,63,26,64,113,33,94,2,52,52,57,249,197,2,222,
-223,224,47,0,109,64,64,157,242,207,3,224,66,3,224,32,0,242,176,11,
-216,104,33,180,131,189,32,28,32,48,131,233,226,188,16,32,215,68,4,221,
-140,115,252,224,226,0,134,85,121,23,35,149,249,159,0,2,32,73,32,129,
-151,35,249,163,206,52,59,131,160,129,191,224,24,1,2,80,32,75,239,241,
-4,99,231,64,13,44,246,183,86,110,127,163,222,128,18,64,54,192,206,2,
-53,50,32,240,253,5,116,254,138,78,2,51,51,55,181,214,32,3,96,65,
-230,52,20,2,114,97,110,2,115,108,97,2,116,101,58,2,32,110,111,2,
-116,32,102,2,111,117,110,2,100,32,34,130,3,154,236,187,190,2,57,54,
-32,193,1,198,138,32,208,128,169,57,117,164,182,80,180,128,19,186,154,141,
-216,32,185,196,208,193,142,68,135,67,26,181,125,133,8,131,123,64,78,64,
-17,251,13,9,224,32,19,134,30,165,61,224,32,11,130,250,161,93,249,233,
-3,192,24,125,94,67,148,188,237,250,150,15,2,100,121,110,2,115,121,109,
-250,148,6,2,95,56,56,161,45,250,76,11,96,156,59,34,225,166,19,225,
-164,22,65,160,2,32,112,114,2,105,109,111,2,112,32,34,160,105,33,152,
-2,56,53,57,223,134,66,24,243,255,0,224,231,10,129,66,96,231,96,226,
-251,139,0,226,162,0,65,190,225,55,8,128,34,128,79,251,94,8,226,223,
-1,224,105,3,96,21,112,239,246,163,0,224,116,0,2,56,51,56,128,19,
-224,31,3,226,176,38,2,58,32,105,38,22,42,248,37,233,207,191,151,169,
-2,54,51,52,228,141,1,182,141,32,73,101,244,143,217,77,129,97,176,78,
-125,72,0,216,196,96,50,136,205,236,194,6,93,190,196,15,67,171,224,30,
-9,94,112,96,30,56,79,224,30,11,33,122,96,30,64,4,237,31,16,2,
-67,39,34,161,77,224,67,11,80,64,185,138,224,30,12,192,98,89,186,224,
-98,16,2,83,39,34,166,227,224,67,11,95,146,96,67,68,105,224,197,10,
-34,224,96,30,67,186,224,61,10,192,30,67,125,224,30,10,192,160,67,232,
-224,30,10,193,65,69,38,224,191,16,2,66,39,34,169,19,224,67,11,2,
-57,48,32,128,67,73,72,224,98,10,201,135,2,82,32,64,224,98,17,2,
-75,50,34,97,169,66,136,224,36,17,2,51,34,32,64,36,67,242,224,36,
-17,2,52,34,32,64,36,66,145,225,244,18,2,66,34,32,165,38,224,180,
-11,58,183,128,180,2,43,32,64,224,30,11,193,85,2,45,32,64,224,30,
-11,192,242,2,42,32,64,224,131,17,2,113,117,111,146,123,64,8,224,40,
-19,2,114,101,109,96,39,32,7,224,38,19,2,117,113,117,160,80,96,9,
-224,42,20,192,82,64,8,224,40,19,2,110,101,103,96,39,32,7,224,38,
-19,212,118,32,7,224,38,19,2,111,114,34,64,37,54,175,224,36,18,2,
-120,111,114,96,37,32,7,224,38,19,2,105,110,118,96,38,32,7,224,38,
-19,2,115,104,108,96,38,32,7,224,38,21,128,116,32,7,224,231,20,192,
-39,64,8,224,79,20,2,117,98,116,92,78,128,84,160,12,224,48,19,2,
-61,61,34,64,42,69,199,224,36,17,2,47,61,34,64,36,2,47,61,32,
-228,139,12,195,135,38,33,224,67,17,2,60,61,34,96,35,224,67,14,194,
-185,2,62,32,64,224,67,17,2,62,61,34,96,35,224,172,20,2,117,60,
-34,98,97,224,141,20,2,117,60,61,160,37,224,75,21,2,62,34,32,64,
-37,224,149,20,2,117,62,61,160,37,224,75,20,2,111,114,100,162,133,226,
-171,20,2,99,104,114,96,38,32,7,224,38,19,2,102,43,34,120,130,228,
-39,10,224,36,2,2,45,34,32,64,36,228,45,10,224,36,2,2,42,34,
-32,64,36,228,51,20,2,102,47,34,96,36,2,47,32,64,224,36,18,162,
-76,32,7,224,75,21,160,38,226,79,11,224,38,2,129,199,2,102,60,32,
-224,36,20,160,75,225,199,21,2,102,62,34,96,37,225,199,20,2,102,62,
-61,160,37,224,75,21,196,155,64,8,224,40,20,83,237,128,41,115,247,224,
-42,19,2,114,101,97,130,29,96,9,228,127,20,2,116,111,102,132,128,32,
-8,228,10,20,2,101,113,34,100,5,2,101,113,32,224,38,21,2,117,97,
-108,192,41,32,10,224,44,19,224,43,1,224,42,24,2,115,99,109,149,254,
-64,8,224,208,20,192,40,64,8,230,142,20,2,110,102,34,102,142,2,110,
-102,32,224,38,18,48,52,2,62,62,61,96,41,128,10,224,44,24,224,43,
-1,224,42,22,2,114,101,116,2,117,114,110,192,46,128,13,224,50,22,43,
-194,2,110,116,34,160,49,96,12,224,48,22,2,115,101,114,2,105,97,108,
-59,88,192,52,224,16,0,224,56,22,2,100,101,115,224,58,7,224,18,2,
-224,117,23,2,116,100,105,224,216,0,96,12,224,48,25,2,111,117,116,224,
-49,2,32,13,224,50,25,2,101,114,114,224,50,2,32,13,224,50,22,2,
-103,101,116,2,65,114,103,2,82,101,102,192,53,224,16,0,225,118,23,2,
-101,114,102,2,111,114,109,2,73,79,34,193,122,192,16,224,113,23,2,99,
-34,32,160,106,2,99,32,64,226,140,18,2,97,105,115,129,103,96,9,229,
-209,20,2,97,116,99,2,104,34,32,69,211,64,9,224,42,19,238,107,2,
-128,10,233,35,21,2,119,67,65,146,247,2,76,101,110,169,46,224,18,3,
-224,60,19,2,112,101,101,2,107,67,65,128,42,96,58,224,16,3,224,56,
-31,192,118,224,19,6,224,62,19,2,116,111,73,163,15,96,9,224,42,21,
-2,80,116,114,160,42,32,9,224,42,21,2,68,98,108,160,42,32,9,224,
-42,21,2,70,117,110,224,88,1,128,12,224,48,19,2,65,46,97,2,108,
-108,111,130,22,160,11,224,46,21,2,115,105,122,130,25,128,10,224,44,21,
-229,248,0,128,10,224,44,21,2,119,114,105,188,114,160,11,224,46,21,167,
-142,64,8,119,51,248,106,9,224,0,67,79,79,215,59,180,49,183,199,216,
-157,83,89,248,154,20,101,31,117,236,246,63,3,151,163,244,125,8,79,198,
-248,168,4,56,164,99,239,64,27,150,239,249,24,1,119,229,249,24,49,64,
-82,151,42,224,110,4,160,108,150,97,32,81,2,49,55,32,32,5,2,50,
-56,32,32,185,2,53,56,48,32,12,2,54,54,54,113,170,2,54,56,57,
-128,43,251,135,0,254,161,1,84,78,223,121,77,255,222,164,145,64,182,167,
-64,59,148,139,32,42,2,55,32,75,49,97,2,75,32,66,152,43,117,172,
-126,232,244,187,4,64,75,224,151,9,2,54,56,54,128,6,160,144,145,53,
-211,197,78,149,212,167,177,234,96,204,64,168,208,210,64,53,145,56,96,161,
-64,52,115,65,152,209,128,61,2,83,32,85,96,120,128,156,2,39,32,80,
-116,60,37,124,225,94,2,95,24,241,38,0,121,101,2,83,32,67,115,205,
-48,51,64,14,2,67,32,79,225,240,0,33,27,49,235,255,38,0,178,69,
-249,137,0,95,85,49,217,2,49,57,32,128,34,2,35,51,54,242,106,0,
-224,36,0,32,66,211,20,150,179,82,33,148,162,51,158,160,91,193,154,80,
-254,2,64,95,53,49,104,32,87,89,98,243,56,2,247,128,0,192,88,82,
-105,2,51,48,50,180,147,150,13,163,0,122,34,192,7,65,74,2,55,48,
-32,227,50,2,2,52,48,32,150,96,2,75,32,90,96,136,97,193,32,24,
-64,47,178,206,160,94,120,125,2,51,52,50,97,129,64,39,162,225,2,55,
-51,54,186,47,96,24,130,167,250,147,0,83,165,82,0,87,54,246,95,4,
-49,85,115,147,160,142,128,20,224,29,0,66,126,180,34,224,35,1,96,95,
-130,237,2,89,32,66,182,216,150,7,128,100,250,168,6,64,46,194,240,251,
-34,0,162,22,224,105,0,226,40,0,193,58,149,212,119,37,244,167,3,65,
-119,2,54,50,53,87,246,152,163,192,78,128,157,226,193,3,224,54,1,129,
-22,160,35,225,2,0,224,130,1,161,8,192,178,162,203,251,106,2,64,194,
-131,119,117,10,150,42,216,152,87,41,91,90,32,5,214,85,194,90,192,34,
-64,160,216,166,128,117,248,217,5,89,50,151,208,153,25,2,55,54,32,249,
-30,3,85,51,226,241,0,225,185,0,52,225,34,175,128,65,32,32,130,212,
-225,60,0,224,93,0,163,190,129,200,130,2,67,115,131,142,130,225,193,9,
-65,200,180,240,85,186,247,189,0,224,106,3,194,217,86,210,57,146,122,66,
-2,54,51,50,128,166,249,208,2,129,52,216,54,163,127,192,69,64,175,64,
-10,224,44,0,224,33,0,160,181,64,32,163,109,64,175,64,101,64,78,132,
-166,217,113,184,126,224,2,0,128,47,251,203,0,224,8,0,160,24,224,25,
-11,152,54,247,13,3,224,29,5,224,61,2,224,33,2,224,42,3,224,69,
-6,224,37,11,224,2,4,231,127,2,224,113,16,224,85,10,131,97,224,2,
-23,224,48,4,225,31,8,224,178,5,224,143,9,224,49,30,217,228,250,139,
-3,224,1,15,224,94,5,225,27,23,224,151,16,224,57,5,225,9,24,225,
-6,5,225,249,16,224,61,15,224,125,9,224,65,42,224,68,11,225,40,2,
-225,3,43,224,134,9,156,68,224,86,2,224,145,22,224,151,25,224,1,15,
-95,19,67,222,135,87,231,126,2,225,220,44,225,103,17,224,138,40,253,21,
-5,227,169,25,225,108,34,224,138,39,200,108,225,177,16,230,157,3,224,96,
-9,225,178,36,224,153,37,219,241,226,209,24,225,32,36,224,131,37,134,159,
-226,50,47,227,82,15,224,131,37,235,24,0,224,65,30,224,114,11,225,119,
-36,38,229,224,244,29,225,129,16,224,126,52,254,157,1,224,63,14,224,115,
-28,224,112,34,234,213,1,225,226,29,226,228,19,224,118,34,228,143,9,224,
-115,31,224,118,52,227,240,9,227,75,14,195,240,224,92,8,225,121,21,229,
-3,32,227,223,8,227,220,11,228,117,28,224,129,5,225,7,30,224,126,7,
-230,156,1,166,147,225,19,5,225,13,16,227,228,9,224,124,25,205,147,232,
-38,12,231,31,7,136,183,224,14,15,224,154,1,232,194,11,225,126,18,227,
-228,1,224,73,3,64,38,141,17,32,39,32,166,76,39,47,198,46,72,95,
-183,46,156,70,186,32,20,224,19,3,228,48,4,224,129,1,64,67,235,129,
-1,224,232,0,237,169,0,174,92,160,80,236,183,1,224,183,5,235,92,10,
-234,85,8,224,255,7,78,56,46,117,239,24,0,2,35,57,49,225,189,9,
-224,88,11,226,91,2,225,101,4,231,50,6,198,21,229,109,3,224,40,12,
-163,107,224,37,0,224,34,10,129,58,209,6,224,25,3,229,247,5,2,73,
-32,64,224,252,0,65,66,64,5,233,79,2,226,26,0,224,220,5,238,24,
-1,45,55,226,230,16,130,64,226,95,3,224,248,1,225,6,3,45,95,172,
-219,161,171,225,208,3,224,74,10,233,237,12,141,195,226,120,6,226,44,6,
-2,95,50,49,48,60,226,56,0,226,55,17,243,174,0,144,244,224,106,6,
-81,212,224,16,21,77,145,227,38,6,111,151,2,57,32,102,243,45,0,2,
-92,51,52,2,38,109,104,2,115,47,83,2,121,115,116,2,101,109,47,2,
-67,111,110,2,115,111,108,2,101,47,83,2,105,109,112,2,108,101,82,52,
-249,2,108,105,110,2,101,46,104,2,115,92,51,2,52,38,44,2,49,54,
-50,2,58,53,34,227,14,10,131,91,225,121,1,224,237,17,228,64,7,238,
-128,17,224,42,9,226,211,10,225,232,0,230,72,3,172,108,227,50,19,227,
-180,3,175,232,65,123,96,8,130,209,66,75,227,225,5,226,155,1,224,2,
-0,239,240,12,235,253,6,224,34,1,242,238,0,96,40,68,103,81,133,132,
-117,226,11,8,96,135,160,5,112,61,224,139,2,64,209,129,106,32,68,2,
-55,53,32,2,95,55,48,97,106,80,164,160,71,179,251,211,214,32,109,243,
-179,1,224,42,3,64,41,64,237,226,108,12,228,178,7,241,104,0,224,245,
-11,230,188,3,224,172,2,243,229,2,128,41,96,148,80,171,224,175,4,242,
-212,2,65,15,242,122,0,196,136,224,255,4,177,63,181,4,224,48,3,224,
-55,1,100,82,164,87,224,6,3,225,151,10,241,171,3,192,88,130,15,227,
-148,26,224,169,2,227,10,1,225,2,7,36,91,225,113,2,224,182,9,224,
-175,5,231,152,7,231,178,4,224,147,2,244,209,0,82,160,2,51,55,55,
-114,184,96,6,225,142,1,231,65,0,228,35,2,226,156,12,225,201,8,227,
-157,7,2,51,48,32,226,170,2,228,219,14,182,121,226,149,2,96,247,236,
-238,0,229,94,2,2,64,64,85,244,230,4,129,59,224,242,2,244,5,0,
-226,112,3,2,85,32,35,226,24,0,227,45,8,226,65,3,231,119,6,224,
-95,12,225,13,2,226,218,9,224,105,2,224,32,2,227,244,16,225,52,31,
-97,197,243,195,9,211,223,225,56,15,224,221,8,231,164,4,224,145,4,32,
-115,228,173,1,224,172,10,226,142,5,118,169,64,23,228,143,0,167,154,164,
-67,161,131,70,213,244,176,0,133,38,226,140,0,128,27,225,108,0,163,109,
-224,63,3,128,242,71,97,224,67,15,2,67,32,80,225,179,6,160,70,246,
-11,1,229,0,4,226,189,15,227,193,8,195,104,131,174,165,1,228,202,20,
-248,153,4,161,222,164,131,100,182,195,119,225,169,5,228,205,2,160,60,2,
-50,50,54,229,230,2,250,221,12,2,92,56,38,2,32,92,56,2,38,34,
-32,162,208,150,228,151,13,248,171,0,164,104,128,150,2,82,32,64,229,141,
-20,129,252,227,27,7,234,138,12,192,20,226,179,11,174,54,231,161,19,98,
-120,64,164,246,98,0,132,160,65,199,138,8,134,120,248,74,3,250,128,4,
-32,13,35,128,96,4,215,16,132,229,128,250,36,212,65,72,92,187,196,213,
-134,207,96,112,123,161,58,7,141,104,230,221,1,230,56,3,98,65,139,236,
-32,137,32,76,151,90,249,177,0,192,40,86,199,155,56,32,87,2,56,32,
-95,96,225,64,20,154,3,232,119,3,32,57,226,119,4,67,123,65,230,64,
-169,58,1,32,63,236,65,1,119,137,2,35,48,32,105,4,33,117,225,246,
-1,2,103,101,116,2,82,97,119,2,32,102,97,2,105,108,101,158,101,96,
-242,193,72,32,81,111,62,32,130,72,232,32,130,2,94,71,69,2,84,82,
-65,2,87,32,58,128,130,124,61,2,55,50,54,96,15,154,87,2,94,102,
-108,2,117,115,104,2,98,32,58,96,23,160,203,59,117,192,203,66,199,32,
-20,225,126,2,155,201,2,95,51,57,34,150,66,173,65,104,235,164,4,240,
-60,0,32,241,92,39,193,99,32,54,33,211,130,72,249,7,4,64,102,153,
-147,59,54,2,50,32,65,152,34,64,128,96,176,59,26,64,14,152,49,226,
-188,0,225,61,8,66,255,248,214,3,225,107,24,2,50,52,52,36,181,161,
-103,99,119,32,15,254,81,17,2,83,97,118,2,105,110,103,2,32,99,97,
-2,99,104,101,222,206,32,95,32,48,64,248,2,53,51,32,64,70,233,3,
-0,65,237,250,86,0,250,13,0,32,162,99,210,218,65,2,55,56,32,231,
-231,0,32,226,64,48,192,65,64,242,162,92,32,53,2,57,32,58,96,31,
-157,219,236,204,4,100,94,100,169,2,54,48,32,196,163,224,253,2,130,156,
-78,144,99,192,250,82,5,65,143,34,185,65,176,32,255,193,70,164,173,231,
-163,8,64,27,99,3,2,50,54,49,223,71,32,154,192,164,2,55,32,58,
-128,32,32,15,2,73,79,46,2,115,101,114,2,105,97,108,2,105,122,101,
-96,22,162,110,2,97,100,100,2,95,108,122,2,55,55,95,2,99,111,109,
-2,112,114,101,2,115,115,111,2,114,32,58,128,114,160,69,2,52,32,58,
-129,38,32,15,2,114,110,102,103,77,64,17,226,33,0,2,51,32,75,2,
-52,32,90,224,1,6,234,162,1,160,150,162,61,64,232,91,147,35,189,34,
-213,159,124,193,0,64,23,124,75,32,194,2,80,32,66,165,125,2,57,57,
-32,129,5,64,226,2,75,32,95,97,172,96,66,129,173,128,94,218,191,165,
-238,98,241,36,39,32,86,2,51,55,49,130,192,64,64,224,35,1,98,93,
-226,94,18,2,69,120,99,2,101,112,116,2,105,111,110,2,58,32,34,225,
-91,0,129,240,194,204,128,199,35,132,2,95,51,51,94,210,2,53,55,32,
-164,2,224,229,6,92,195,165,132,224,25,7,131,153,233,32,6,97,8,224,
-255,5,92,15,128,172,2,51,53,54,224,167,3,45,211,237,201,0,171,180,
-225,75,0,235,180,1,128,69,224,15,1,2,51,54,55,193,25,162,72,2,
-48,54,32,64,204,128,194,97,125,225,104,0,64,125,66,130,2,85,32,67,
-204,143,101,240,227,216,3,192,178,65,14,2,64,95,56,255,169,3,224,31,
-1,64,102,160,39,224,92,4,246,192,5,33,104,66,1,225,170,1,2,51,
-49,53,131,56,2,51,49,54,96,170,32,164,2,95,49,54,96,209,64,44,
-165,73,2,51,49,55,34,118,2,85,32,66,170,17,34,93,128,135,64,35,
-130,238,238,96,0,240,122,2,64,80,32,95,70,210,70,104,192,61,224,7,
-3,72,240,166,223,236,21,9,253,181,2,228,209,13,133,87,226,118,4,168,
-19,226,120,12,35,136,2,98,105,110,2,97,116,111,2,114,115,58,2,92,
-49,48,168,84,62,9,168,150,254,11,6,96,221,131,173,224,221,11,128,155,
-2,56,48,32,199,214,226,29,2,65,247,2,54,57,53,65,76,2,52,50,
-53,128,33,232,137,2,161,210,48,125,226,185,10,32,56,128,143,208,141,227,
-149,7,193,63,192,83,228,187,0,160,123,225,53,10,2,56,52,32,230,8,
-7,227,5,5,225,67,35,2,112,105,108,70,30,2,117,115,101,2,100,32,
-98,2,111,111,116,2,32,109,111,2,100,117,108,166,41,32,196,247,193,0,
-255,215,5,225,25,14,239,114,2,226,213,12,69,202,226,211,2,128,185,34,
-54,207,225,195,224,65,12,226,62,38,225,7,5,224,250,24,2,116,111,116,
-2,97,108,32,49,246,2,111,114,116,2,32,116,105,2,109,101,32,64,0,
-128,245,238,244,0,108,44,2,48,51,32,123,88,167,54,131,44,224,72,1,
-2,109,115,34,241,193,7,226,122,3,244,222,1,196,88,138,48,138,57,35,
-123,64,183,160,181,2,54,51,49,64,4,135,218,32,120,131,17,212,44,66,
-192,134,94,72,191,2,49,57,53,67,202,102,250,67,251,2,52,51,32,38,
-223,2,57,55,32,128,40,134,117,167,11,202,153,97,82,107,157,97,78,32,
-166,33,23,235,210,2,141,186,32,111,64,65,134,136,226,208,11,100,251,177,
-72,146,77,69,35,64,21,163,58,226,191,2,64,217,115,16,162,2,2,54,
-57,57,226,10,2,226,11,2,163,15,32,65,163,72,2,80,32,75,193,49,
-130,27,238,196,3,248,87,0,114,251,130,46,209,255,2,52,49,57,67,8,
-160,95,65,38,32,109,239,118,0,246,157,5,129,114,32,31,232,23,0,64,
-27,135,175,2,52,32,65,161,76,135,16,2,85,32,90,231,180,5,64,26,
-134,233,128,139,230,80,18,162,189,2,51,48,48,32,233,2,52,48,57,226,
-156,2,2,52,50,48,226,170,12,2,79,32,35,71,245,128,107,241,134,2,
-138,134,2,54,57,56,227,63,0,130,74,192,112,96,220,226,249,19,2,67,
-97,110,2,110,111,116,2,32,102,105,2,110,100,32,2,112,97,99,2,107,
-97,103,227,237,8,163,147,227,131,2,231,106,10,201,76,2,95,52,49,198,
-63,97,221,33,15,231,118,2,2,112,107,103,32,92,64,26,166,126,2,52,
-49,54,41,41,98,69,105,57,2,54,57,50,96,15,133,155,244,250,2,98,
-21,2,50,56,57,227,70,2,223,176,208,88,65,15,72,210,128,31,130,0,
-77,80,183,24,229,72,37,128,205,229,72,45,132,71,69,72,229,55,7,226,
-26,14,96,94,77,56,70,147,232,165,10,128,54,68,42,34,32,103,118,199,
-94,241,152,8,225,154,3,136,2,35,227,215,211,97,96,72,106,197,160,167,
-27,2,54,57,52,208,62,241,157,5,225,45,101,108,149,2,100,32,34,230,
-108,7,232,249,4,207,45,69,47,2,52,50,51,134,66,176,140,44,6,37,
-158,253,244,0,66,72,173,249,226,1,42,231,74,51,224,211,1,103,69,226,
-6,56,2,45,98,111,2,111,116,34,160,144,130,10,227,225,32,231,199,3,
-99,234,2,111,117,110,2,100,58,32,227,228,8,226,82,35,33,88,160,202,
-226,83,1,2,54,49,50,230,155,0,98,80,99,192,70,13,69,242,2,54,
-51,55,234,127,1,239,66,3,67,241,128,50,134,99,37,107,197,84,64,20,
-204,162,249,7,4,132,12,33,46,33,42,251,75,0,242,23,4,96,189,225,
-95,0,193,92,35,10,252,177,5,181,17,251,98,6,252,36,0,255,169,7,
-242,93,2,252,163,8,249,32,7,164,161,96,83,181,160,226,127,37,235,1,
-5,226,127,37,2,112,97,114,41,194,235,9,3,104,174,2,54,50,50,255,
-79,8,224,183,4,231,176,7,162,168,115,203,128,175,224,168,1,234,248,1,
-210,174,2,54,50,51,114,174,106,227,154,114,167,121,231,2,2,135,110,183,
-187,224,190,14,194,173,2,97,109,101,2,32,100,111,2,101,115,32,66,183,
-2,97,103,114,2,101,101,32,2,119,105,116,2,104,32,102,50,58,96,29,
-194,198,248,13,1,103,21,98,211,231,68,12,69,10,135,68,228,95,2,225,
-213,11,225,235,14,189,9,226,133,17,251,42,13,189,210,252,33,0,232,27,
-10,97,116,65,63,2,54,50,52,193,249,2,54,50,53,227,127,6,2,54,
-50,54,163,127,237,254,4,252,43,5,253,208,1,224,28,14,189,44,224,28,
-13,227,101,21,225,44,0,255,169,2,254,25,5,158,102,254,22,5,192,35,
-224,111,7,227,62,1,100,74,252,136,0,224,5,33,149,49,229,220,40,196,
-244,227,92,43,2,116,121,112,2,101,32,99,2,104,101,99,2,107,101,100,
-227,98,2,233,149,1,2,54,50,55,65,169,71,20,224,53,1,2,45,45,
-45,2,45,45,92,224,45,0,224,0,3,225,74,2,224,2,9,193,56,225,
-171,14,230,71,4,209,201,237,82,1,226,54,0,105,164,172,77,226,55,19,
-226,59,6,226,32,50,224,2,18,233,191,0,224,186,50,224,153,15,224,192,
-8,224,40,19,224,198,23,224,200,16,225,149,0,224,81,7,224,224,3,226,
-218,1,230,112,12,227,60,12,224,109,11,228,166,18,224,143,26,226,64,1,
-224,255,9,224,93,6,224,92,13,192,32,228,215,14,254,45,3,198,240,224,
-8,9,231,2,104,2,100,101,115,2,117,103,97,2,114,101,100,242,15,4,
-99,153,210,20,227,131,6,209,113,161,160,128,177,224,5,9,226,198,4,224,
-207,3,244,147,3,225,30,1,234,98,25,253,64,6,238,40,2,224,24,10,
-248,112,0,224,24,2,234,134,26,2,100,111,110,205,215,224,166,9,231,55,
-5,224,91,2,224,89,17,2,44,32,34,255,12,8,160,69,241,24,3,241,
-3,1,231,234,16,2,115,32,40,192,74,245,28,0,224,72,10,224,69,21,
-2,32,43,32,232,8,11,224,65,3,224,62,28,224,197,12,79,123,37,203,
-247,156,4,227,51,3,227,102,0,226,52,18,226,254,12,233,91,32,57,80,
-130,251,128,159,32,11,85,215,233,95,1,54,64,2,53,32,102,224,206,0,
-2,73,110,116,2,101,114,97,2,99,116,105,2,118,101,34,254,231,0,218,
-226,226,121,5,227,91,45,2,108,111,97,2,100,101,100,237,168,9,235,89,
-24,163,93,226,97,2,227,63,4,255,31,2,64,5,228,86,0,236,124,4,
-224,18,0,2,54,52,48,250,11,0,164,167,223,74,179,16,188,228,56,105,
-32,101,2,55,50,32,206,239,249,12,8,226,241,2,244,142,3,229,162,1,
-146,120,224,96,1,2,85,32,65,242,67,2,255,12,0,36,97,32,115,160,
-11,224,89,1,224,32,2,224,45,4,205,64,243,121,0,224,16,11,224,32,
-8,66,53,2,54,52,51,64,148,2,89,32,66,179,26,211,23,193,13,178,
-215,64,188,79,41,2,54,56,49,242,229,2,64,73,212,72,2,95,56,57,
-97,190,77,119,226,209,1,225,135,4,80,46,116,90,2,56,48,53,81,78,
-87,242,250,174,7,224,137,11,248,11,1,170,114,224,10,4,224,167,4,65,
-83,225,49,1,224,76,9,140,136,194,83,34,39,2,32,61,61,34,198,247,
-77,1,142,187,243,207,5,96,211,161,167,64,12,192,177,64,207,128,57,94,
-13,104,99,174,138,129,98,78,119,220,181,2,53,49,55,64,5,94,120,64,
-6,116,243,2,56,54,32,64,45,2,56,55,32,107,138,82,148,64,50,255,
-48,1,32,40,110,237,2,53,52,54,125,85,64,40,154,7,224,185,0,155,
-107,2,49,49,56,64,33,2,54,56,56,224,39,0,227,101,1,2,101,111,
-102,131,97,62,181,2,50,52,49,224,134,0,251,193,1,96,122,149,151,32,
-73,128,168,64,67,227,49,0,32,190,236,101,0,64,36,2,53,50,48,223,
-1,228,185,0,127,212,118,24,2,53,50,50,96,148,2,53,51,49,96,189,
-143,44,254,250,0,160,114,179,185,224,230,3,44,183,64,196,66,28,196,67,
-224,175,1,129,111,36,218,228,164,5,2,77,97,105,2,110,34,32,32,29,
-2,79,32,95,128,170,80,27,224,36,6,2,109,97,105,128,36,160,128,64,
-127,180,42,68,56,224,128,0,63,93,238,61,7,158,220,225,140,4,32,213,
-170,115,225,39,0,193,211,225,230,3,2,50,56,53,225,242,2,37,148,2,
-35,52,48,129,23,37,58,32,5,78,223,192,24,135,141,192,13,243,6,1,
-224,254,2,34,228,33,64,64,34,33,31,128,198,228,249,0,224,192,13,2,
-119,104,101,2,114,101,34,231,63,1,225,107,15,229,28,4,225,113,4,193,
-115,241,143,0,66,178,147,7,128,241,134,233,224,9,66,225,74,2,224,5,
-8,64,177,161,78,98,231,68,76,110,201,32,26,82,234,225,114,7,225,12,
-4,2,100,97,116,2,97,34,32,148,166,128,209,64,8,147,247,224,88,2,
-224,99,12,32,94,121,8,224,93,17,2,110,101,119,77,206,192,96,92,241,
-224,142,8,2,54,52,32,40,2,86,223,97,189,224,107,17,98,29,131,58,
-101,46,2,49,54,49,162,56,62,33,64,13,34,45,57,158,101,208,33,172,
-2,53,50,32,244,188,9,166,177,2,56,57,49,32,21,66,104,145,77,181,
-167,154,70,224,129,17,64,6,224,237,18,224,234,41,2,54,48,52,162,225,
-225,185,6,2,53,48,56,128,226,2,55,51,32,233,57,1,226,129,0,66,
-14,224,153,4,161,8,229,77,4,62,194,66,208,67,246,227,78,4,224,119,
-1,224,68,4,117,237,224,222,19,138,238,192,224,105,50,226,37,28,148,27,
-224,88,3,224,11,15,224,112,6,2,102,111,114,2,101,105,103,132,161,224,
-140,18,224,27,8,2,99,99,97,2,108,108,34,192,26,2,56,50,32,32,
-174,2,52,57,32,192,15,102,87,225,152,8,224,62,1,2,58,58,34,225,
-157,7,224,216,13,2,54,56,48,224,245,15,72,20,227,164,4,98,188,128,
-54,2,49,55,50,225,92,10,2,110,102,105,2,120,108,34,199,64,225,219,
-2,157,242,224,45,10,2,114,34,32,196,139,224,92,3,133,62,224,46,9,
-204,6,64,28,96,151,71,15,228,8,2,2,105,103,105,97,79,231,73,6,
-132,10,105,29,71,239,86,114,114,73,171,58,2,53,56,32,54,154,96,121,
-248,37,10,35,139,192,32,224,33,8,173,130,160,91,32,6,224,36,5,224,
-0,0,226,201,0,161,8,226,201,5,226,125,13,226,136,15,65,27,226,112,
-18,2,99,108,97,2,115,115,34,193,252,167,92,131,202,161,199,227,207,11,
-2,49,50,52,227,208,0,128,170,226,17,17,34,134,194,130,224,137,7,74,
-39,224,33,6,231,7,7,232,166,3,200,102,32,160,39,211,32,5,32,201,
-226,172,19,108,202,227,222,20,2,110,115,116,2,97,110,99,228,193,1,164,
-34,160,94,170,225,224,83,6,229,17,22,2,100,101,102,2,97,117,108,196,
-51,2,53,53,52,96,219,64,196,96,94,225,205,6,227,105,19,224,188,22,
-229,122,2,2,53,56,54,229,122,13,227,225,12,135,232,224,119,17,229,19,
-22,2,112,97,116,46,12,196,162,197,245,226,43,17,229,251,1,232,116,2,
-2,54,51,53,137,58,232,179,1,135,240,97,121,2,53,53,54,234,189,0,
-96,146,65,45,232,143,8,224,237,18,2,60,45,34,160,58,64,103,230,77,
-45,225,2,32,131,0,103,153,225,221,7,194,83,229,24,0,225,147,13,161,
-41,2,56,55,53,36,33,234,151,1,156,105,2,85,32,83,188,109,36,91,
-2,60,32,64,114,195,224,18,6,65,40,100,162,224,18,1,138,40,228,213,
-2,135,93,99,50,2,85,32,85,228,241,5,128,253,160,27,2,95,53,55,
-65,26,129,117,204,233,224,20,7,224,62,4,128,226,160,62,2,75,50,32,
-36,210,200,99,224,149,6,67,81,236,181,5,224,58,3,241,106,0,103,192,
-161,246,224,115,1,69,140,224,90,1,65,33,220,19,77,220,36,148,64,24,
-36,116,64,25,155,250,160,25,98,3,160,24,155,254,232,125,8,2,55,51,
-51,232,125,1,64,39,141,174,160,64,98,114,160,64,141,148,226,79,6,226,
-94,10,227,94,11,110,85,72,119,226,20,3,230,202,1,124,240,64,131,226,
-37,3,2,83,79,85,2,82,67,69,167,38,229,14,4,255,114,0,235,132,
-6,224,135,1,229,140,5,204,178,224,158,16,208,234,128,37,144,39,128,40,
-227,144,4,224,132,4,165,131,232,119,0,227,54,18,2,97,115,34,197,21,
-197,89,136,170,232,78,22,231,235,3,231,234,10,2,104,105,100,52,144,225,
-32,11,230,31,0,165,134,109,109,2,54,55,56,227,168,11,224,100,22,2,
-113,117,97,2,108,105,102,2,105,101,100,128,103,34,8,74,13,143,208,236,
-152,22,159,93,64,120,103,205,2,54,55,54,129,100,2,54,51,32,228,115,
-21,238,40,3,2,54,56,32,238,21,7,229,193,16,169,15,128,95,231,64,
-13,224,46,4,142,6,64,157,96,215,143,142,81,142,81,2,64,17,143,32,
-241,126,3,64,7,66,43,64,29,142,8,2,90,32,66,64,21,192,50,132,
-187,66,104,225,88,1,112,102,63,190,33,90,96,20,98,78,99,18,148,238,
-228,20,0,121,159,161,189,96,31,2,90,32,95,108,224,2,50,49,53,196,
-147,64,100,131,254,230,87,4,42,104,228,128,2,2,85,32,66,37,61,82,
-152,132,133,81,241,208,189,211,136,114,40,249,100,1,240,220,1,116,59,239,
-19,1,122,2,180,114,96,56,224,16,0,178,128,249,168,3,146,125,243,235,
-3,64,17,181,148,230,198,2,179,77,241,17,3,178,83,243,12,2,192,10,
-213,194,67,228,240,114,1,182,200,2,53,52,56,224,97,0,226,69,8,70,
-87,224,41,0,65,35,246,101,7,165,116,163,242,255,101,1,179,1,238,92,
-0,238,61,3,208,42,231,150,4,184,7,64,237,64,10,147,60,245,60,5,
-225,190,0,197,163,225,192,5,132,160,98,20,240,170,7,2,54,53,54,167,
-68,232,87,3,254,62,1,214,12,246,9,2,193,36,242,176,1,232,97,9,
-150,38,32,57,192,220,224,217,23,38,45,196,56,64,199,134,82,229,132,1,
-229,53,11,228,228,19,78,175,97,169,103,97,172,9,232,176,19,116,193,129,
-188,97,104,184,98,228,235,1,224,78,8,236,42,24,224,77,2,32,7,34,
-141,226,146,2,73,70,179,199,112,118,2,53,57,50,112,118,152,1,2,95,
-56,49,206,104,128,38,65,18,244,236,0,241,192,14,224,5,8,242,144,4,
-32,79,230,210,6,224,167,0,65,163,229,41,9,162,17,236,148,1,160,246,
-225,196,6,2,95,53,57,236,49,19,165,168,96,36,117,0,2,54,54,32,
-224,51,0,229,176,1,2,54,50,52,225,220,8,2,54,54,57,198,106,96,
-46,229,97,4,2,53,57,57,133,124,229,232,28,140,217,237,248,8,229,251,
-5,241,62,5,62,103,74,44,32,5,166,90,224,105,20,76,193,224,105,26,
-151,196,230,102,16,2,56,56,48,224,199,19,2,54,53,49,161,53,224,139,
-16,141,253,129,169,224,221,18,2,55,54,55,197,207,224,110,10,2,49,50,
-54,169,183,131,54,224,57,9,102,70,224,57,10,233,240,0,96,56,66,180,
-183,110,225,62,22,91,199,136,186,130,88,226,188,5,231,146,13,133,4,195,
-232,48,177,226,64,9,137,203,226,246,17,2,57,57,48,226,246,15,243,92,
-2,66,177,226,246,9,32,23,207,92,232,230,2,2,54,54,56,237,57,9,
-2,46,46,34,228,72,0,226,19,9,2,49,50,53,131,224,66,238,33,43,
-121,12,64,14,200,51,232,3,3,64,115,97,79,2,54,54,53,2,32,58,
-49,96,155,129,95,84,138,164,69,32,22,32,97,64,29,136,49,238,72,18,
-246,237,0,232,190,5,66,0,64,70,180,200,96,8,64,79,168,28,228,124,
-22,2,54,53,50,134,89,162,13,49,187,128,7,129,170,2,54,54,48,160,
-7,32,38,64,85,134,179,225,231,15,32,141,234,182,1,224,23,2,69,15,
-64,68,131,121,225,131,2,146,27,240,65,6,2,111,34,32,235,82,1,119,
-156,99,84,64,126,204,189,242,207,12,2,81,117,97,2,108,68,111,242,208,
-10,178,109,146,208,221,51,45,211,128,18,251,87,4,192,7,64,59,233,115,
-2,253,180,12,192,168,192,71,168,72,103,193,103,252,2,55,54,57,66,179,
-33,38,224,63,2,65,201,32,6,254,252,6,64,220,198,52,242,213,23,2,
-55,53,50,241,215,22,154,230,227,15,0,241,70,20,2,104,101,110,224,45,
-18,224,57,5,108,173,233,81,2,224,76,7,2,101,108,115,185,102,192,77,
-64,215,196,87,224,204,13,71,51,224,160,19,2,108,101,116,241,230,0,98,
-12,105,168,224,212,21,186,227,224,132,2,64,175,224,132,17,2,56,49,54,
-244,38,22,2,97,115,101,225,83,33,188,102,224,177,0,40,53,129,226,67,
-93,224,133,16,141,36,113,176,233,234,0,102,132,64,56,132,75,234,249,5,
-64,37,35,229,234,35,7,134,214,97,36,233,198,9,33,111,101,104,64,83,
-132,143,250,113,4,224,212,18,251,67,2,128,216,237,92,12,64,87,132,201,
-229,202,1,139,158,160,8,224,249,15,245,102,29,100,9,238,188,7,35,169,
-224,61,2,225,162,1,234,52,6,124,53,2,80,32,95,128,168,96,86,224,
-57,15,64,197,197,63,226,48,12,2,57,56,53,224,179,14,69,213,192,178,
-117,216,231,153,0,231,253,12,226,159,0,165,88,225,201,4,106,151,253,113,
-5,106,211,136,91,252,200,9,240,126,8,248,228,21,206,6,252,239,12,50,
-184,90,147,64,230,2,57,56,54,167,19,2,53,54,48,32,20,2,57,55,
-32,196,179,68,137,224,182,8,32,239,224,153,5,231,240,12,138,49,224,196,
-7,232,27,18,253,155,18,197,177,179,107,2,95,51,55,32,57,32,42,96,
-170,66,53,96,39,79,7,192,196,138,220,224,198,0,235,175,40,230,227,8,
-106,247,208,70,224,24,11,199,160,235,32,61,107,154,235,32,31,139,29,235,
-22,29,2,54,52,51,234,143,1,235,3,22,32,44,87,210,235,4,17,224,
-243,0,252,165,3,2,54,52,53,224,40,1,224,173,0,224,96,15,229,152,
-9,224,96,3,2,52,55,32,224,96,10,64,118,225,14,18,130,15,225,111,
-31,131,196,130,130,236,132,21,2,55,55,50,47,229,142,126,101,5,247,68,
-21,2,114,105,109,2,105,116,105,2,118,101,34,163,149,156,175,66,141,235,
-136,0,232,229,11,2,115,116,114,179,238,232,229,6,129,191,251,182,0,168,
-136,128,82,64,91,112,107,86,39,66,248,42,163,64,22,198,143,191,79,65,
-153,37,19,2,51,48,55,209,2,32,207,2,53,32,79,234,124,2,96,54,
-243,16,1,64,79,96,102,150,29,65,174,227,72,3,138,227,231,248,13,105,
-28,33,80,131,228,234,20,2,233,42,4,230,1,2,226,236,2,64,106,211,
-98,128,132,101,100,160,132,243,23,10,67,47,230,145,1,224,9,21,242,66,
-12,128,120,231,107,6,100,67,132,116,160,59,224,13,20,147,33,236,214,3,
-196,211,142,185,209,99,141,48,173,55,226,132,0,224,147,14,230,238,1,224,
-94,10,66,185,64,170,230,22,18,172,241,224,70,9,225,145,0,128,70,237,
-44,19,232,103,9,224,213,2,241,80,9,241,223,0,240,214,3,69,131,232,
-5,52,224,80,6,32,37,224,81,12,224,249,21,224,246,3,64,66,140,207,
-224,245,15,224,243,4,192,240,224,232,3,66,141,211,230,34,165,65,206,163,
-121,135,56,162,189,101,38,162,188,230,138,11,237,109,14,2,57,52,32,228,
-251,8,144,207,2,54,51,54,224,218,3,253,194,5,32,78,235,113,44,224,
-125,7,128,105,200,193,65,147,224,184,2,235,103,13,88,52,224,177,8,136,
-189,244,213,8,224,188,1,126,232,32,98,64,135,225,27,8,250,200,19,228,
-123,15,2,53,48,57,224,135,8,112,157,233,51,14,255,29,4,255,108,15,
-230,83,22,255,37,19,213,1,224,123,21,65,1,229,176,6,193,237,32,130,
-64,29,208,113,253,109,11,254,19,0,221,109,101,156,97,107,64,58,197,184,
-2,54,51,52,80,172,64,88,240,172,2,2,54,50,57,128,104,144,92,85,
-254,240,172,51,2,51,48,32,245,48,1,64,79,234,253,10,70,200,234,253,
-12,139,79,165,89,246,227,3,246,224,17,152,51,2,50,55,56,202,27,193,
-52,235,69,122,96,255,132,13,39,208,254,46,9,254,234,6,34,95,254,66,
-7,128,207,167,214,71,248,160,218,254,106,12,160,38,90,81,224,38,0,81,
-11,182,197,64,140,228,129,0,182,237,32,202,232,106,6,254,240,5,255,162,
-9,67,122,224,48,4,163,139,192,48,254,197,1,255,12,17,224,37,3,225,
-39,0,228,99,5,2,53,54,50,234,215,26,182,19,109,52,224,19,3,64,
-80,66,214,229,134,1,97,208,133,134,64,64,160,24,255,66,1,172,103,251,
-250,0,66,49,233,85,0,64,60,133,219,66,228,64,165,231,176,10,160,139,
-2,56,55,32,96,40,175,41,187,52,185,56,198,201,143,55,128,21,128,55,
-137,208,98,202,102,219,128,24,169,243,64,79,227,150,18,228,126,6,2,114,
-105,118,222,52,225,77,0,137,119,117,214,98,220,236,95,7,249,127,2,245,
-210,0,167,39,163,11,240,16,13,86,48,227,221,7,42,97,233,123,12,231,
-197,6,240,25,15,245,243,2,168,18,179,165,232,50,7,168,188,191,245,227,
-156,3,127,236,254,18,0,64,166,195,132,251,62,8,241,10,18,228,60,7,
-103,47,99,145,233,20,10,148,120,32,118,65,217,167,62,2,50,48,32,233,
-17,0,122,128,96,25,64,132,36,49,32,27,33,107,2,54,57,52,107,11,
-69,163,233,64,1,64,177,131,169,123,14,156,207,165,22,137,194,189,144,160,
-49,128,213,128,1,64,37,119,151,37,17,2,95,51,56,252,151,1,224,36,
-3,253,244,0,252,97,2,92,94,106,162,224,5,13,224,114,4,195,44,221,
-105,158,78,253,108,2,253,106,5,128,38,253,107,2,156,141,253,112,2,202,
-154,254,104,3,126,175,197,225,160,2,229,242,0,224,119,1,158,201,221,3,
-2,51,48,52,235,109,2,37,161,102,19,112,30,128,32,33,129,33,119,97,
-127,111,191,2,95,54,56,229,236,2,33,55,76,157,190,27,171,170,253,225,
-8,134,115,156,152,37,242,2,50,32,67,156,181,54,97,134,45,102,1,66,
-249,96,8,96,16,34,37,64,52,141,26,2,51,56,50,64,10,64,63,98,
-210,225,253,0,96,168,251,203,0,98,226,2,51,54,54,224,159,1,64,83,
-64,45,32,82,2,51,55,57,193,224,224,79,3,225,11,3,103,39,246,220,
-9,2,66,97,100,2,32,71,65,2,68,84,32,2,114,101,115,40,169,2,
-32,116,121,2,112,101,34,226,74,4,40,243,130,237,2,56,32,67,34,184,
-2,95,56,52,68,51,2,51,49,52,133,197,100,70,189,26,225,160,0,195,
-119,226,195,2,197,210,124,85,36,111,192,53,131,135,224,160,7,72,90,32,
-49,163,6,194,51,65,100,128,142,128,126,148,105,224,217,14,201,87,225,158,
-0,128,57,96,190,96,95,255,88,3,66,44,224,146,0,32,174,64,7,197,
-178,96,179,2,64,90,32,255,173,2,99,241,64,119,198,185,98,165,97,247,
-195,34,48,41,160,123,65,163,71,137,96,108,120,164,225,90,0,64,66,40,
-187,239,0,3,224,76,5,224,70,8,2,75,32,75,224,70,1,224,67,17,
-224,49,4,58,188,224,120,0,204,209,2,49,50,55,132,159,65,215,96,113,
-222,24,224,170,0,224,108,0,224,68,1,192,60,71,160,160,58,97,45,170,
-174,229,249,3,79,169,229,93,7,234,247,12,229,90,6,91,255,233,173,8,
-2,54,48,56,227,216,2,234,43,8,236,104,5,135,44,224,108,5,2,45,
-62,34,228,252,8,224,96,5,227,248,2,225,225,0,244,124,4,224,26,0,
-196,120,224,11,0,232,46,3,226,242,2,70,30,248,5,22,113,83,64,125,
-139,216,64,185,237,91,13,250,43,23,132,235,193,62,193,48,161,134,96,7,
-163,174,224,82,23,224,93,11,101,88,162,143,96,8,192,111,129,167,132,148,
-239,254,10,224,142,11,133,69,2,54,48,57,224,15,2,64,249,204,135,73,
-25,246,24,7,224,230,1,96,106,236,33,0,96,60,224,31,6,247,175,9,
-254,204,4,226,40,3,238,81,2,36,197,74,250,2,32,89,32,96,210,2,
-80,32,75,129,215,227,134,1,133,255,228,212,3,201,67,225,221,16,238,118,
-5,104,190,206,124,233,111,1,238,13,19,74,36,254,160,19,162,102,248,193,
-19,226,102,6,158,131,64,87,224,49,31,33,191,64,49,253,144,0,98,152,
-243,196,2,163,108,64,148,111,145,234,27,6,107,228,64,64,240,238,6,182,
-169,101,182,130,12,64,36,235,246,0,140,145,95,89,64,6,131,28,64,37,
-224,66,3,225,93,4,234,217,3,130,28,207,198,234,205,19,178,244,2,53,
-57,52,250,229,16,66,184,240,238,22,129,236,109,246,224,125,1,177,151,227,
-89,22,130,97,66,83,227,62,9,192,69,161,8,224,15,0,64,148,240,0,
-5,224,226,3,232,204,9,240,119,2,97,31,250,232,14,147,106,128,41,239,
-23,29,130,130,64,142,240,84,0,33,116,64,15,163,204,229,214,7,229,114,
-7,66,47,249,234,14,249,227,6,32,159,67,126,153,217,64,97,237,1,0,
-112,182,2,53,57,53,128,81,144,102,64,88,160,143,2,49,32,58,128,22,
-236,152,8,240,118,15,64,24,251,116,125,66,158,250,173,20,250,149,112,238,
-53,11,249,49,19,154,152,96,8,117,56,227,136,4,229,151,7,250,178,17,
-97,90,250,178,5,65,38,132,53,2,83,32,85,33,102,32,87,225,148,1,
-2,101,84,117,2,112,108,101,200,101,133,187,2,90,32,90,64,134,129,101,
-2,58,49,53,64,252,249,132,17,2,108,105,116,2,101,114,97,2,108,34,
-32,73,3,240,252,11,224,18,5,64,159,241,64,10,185,171,134,71,111,220,
-64,36,122,71,97,127,204,249,224,34,18,210,68,2,83,32,67,224,112,3,
-150,104,224,53,13,2,55,55,51,241,123,16,224,145,20,2,56,56,51,235,
-185,2,98,49,240,253,0,208,252,96,145,192,21,64,46,160,21,250,23,6,
-250,29,3,230,52,1,90,107,233,154,8,191,43,250,35,5,224,41,5,2,
-61,62,34,229,176,3,64,111,244,190,0,245,9,10,224,46,1,181,9,2,
-54,53,56,245,9,0,96,66,224,58,16,224,147,1,245,68,0,203,91,64,
-58,196,95,192,58,133,59,242,158,28,182,234,242,158,4,97,32,97,76,108,
-109,229,160,0,227,70,3,143,202,141,91,65,206,66,3,171,182,252,31,7,
-130,116,244,39,2,103,132,206,80,171,220,35,130,141,66,213,78,127,59,107,
-219,224,126,11,136,246,64,170,228,148,6,224,244,16,128,30,241,79,4,2,
-102,111,114,2,97,108,108,225,89,6,2,55,48,52,230,241,1,189,133,199,
-61,214,100,239,18,0,231,163,12,102,91,232,92,4,133,178,178,231,136,129,
-102,217,232,92,8,69,153,93,134,168,101,96,39,231,240,0,228,16,11,2,
-76,73,100,2,101,110,116,253,149,10,133,31,163,87,225,166,1,177,11,35,
-182,161,219,156,119,2,49,52,53,64,117,2,50,51,57,178,176,64,14,37,
-23,2,52,50,57,32,12,75,12,101,205,141,178,160,86,161,168,99,173,144,
-58,32,0,2,75,50,32,192,30,129,159,64,251,233,104,15,136,71,64,36,
-227,166,6,72,40,64,36,105,236,96,50,225,1,17,2,85,73,100,225,1,
-46,32,255,2,52,56,56,192,246,224,213,37,131,172,98,168,115,45,116,72,
-226,123,1,102,83,75,142,226,67,0,99,96,2,53,57,32,203,169,64,81,
-224,19,3,64,84,131,198,128,75,152,248,231,22,2,128,145,226,111,4,181,
-127,64,76,160,56,224,59,1,167,28,226,161,14,64,153,70,163,64,46,236,
-225,9,239,39,8,236,178,1,64,216,232,134,0,224,39,14,105,135,238,173,
-7,224,42,11,68,167,224,81,9,233,2,4,224,148,4,114,163,249,120,1,
-65,233,148,122,109,22,225,248,0,96,127,113,28,2,90,32,67,97,247,65,
-141,83,223,2,49,51,52,32,31,87,189,228,243,0,128,12,161,149,128,92,
-92,44,224,193,10,97,55,131,217,78,100,72,90,39,225,32,46,163,208,64,
-54,32,27,112,153,64,14,198,166,65,117,147,96,161,157,64,245,128,13,43,
-91,32,168,50,195,96,67,100,83,64,32,166,76,74,104,233,111,20,233,117,
-7,32,209,238,110,9,228,241,4,2,109,111,100,2,117,108,101,196,241,136,
-238,235,129,13,145,123,64,36,135,241,2,53,51,32,130,83,238,184,9,233,
-157,18,133,181,233,138,6,240,48,13,96,97,224,96,0,226,181,9,234,37,
-7,116,171,170,97,224,26,11,225,5,18,2,112,97,116,41,70,2,110,34,
-32,165,212,136,94,224,152,21,224,78,18,244,162,0,224,142,1,224,190,10,
-65,208,228,230,6,67,210,229,11,0,2,55,52,32,128,36,232,66,6,169,
-113,73,60,64,29,232,37,0,229,11,11,136,38,229,7,19,138,30,87,40,
-117,177,163,23,101,225,244,180,12,242,167,1,128,47,195,73,224,49,7,232,
-147,5,229,76,0,245,178,0,154,66,64,48,224,23,21,129,2,232,207,0,
-167,26,70,155,231,26,10,65,26,231,26,18,2,81,73,100,230,25,26,192,
-215,231,14,56,224,211,22,133,113,2,79,32,102,224,160,0,2,99,97,115,
-98,55,224,19,4,2,108,97,115,2,115,34,32,224,20,5,2,100,97,116,
-2,97,34,32,224,19,6,255,201,1,224,22,5,251,97,1,224,23,4,2,
-111,34,32,224,17,5,2,101,108,115,224,125,8,233,16,1,224,21,6,2,
-101,105,103,99,46,224,22,3,2,105,102,34,224,17,7,2,109,112,111,2,
-114,116,34,224,21,7,224,57,9,2,110,102,105,2,120,34,32,224,20,10,
-224,123,8,96,21,2,114,34,32,224,21,7,2,115,116,97,2,110,99,101,
-224,23,7,2,108,101,116,224,18,7,228,241,1,224,21,3,2,110,101,119,
-195,181,224,22,3,2,111,102,34,224,17,6,228,42,2,224,22,4,2,114,
-105,109,2,105,116,105,2,118,101,34,224,24,6,2,116,104,101,224,44,8,
-224,105,11,251,202,0,251,88,1,224,0,8,66,53,134,111,78,36,2,90,
-32,85,164,70,68,222,242,252,13,64,46,236,58,7,2,46,46,34,229,61,
-9,164,121,111,61,244,225,11,108,22,233,166,5,239,96,6,64,135,234,153,
-20,2,83,121,109,2,79,112,101,97,186,234,154,52,99,123,103,69,77,45,
-163,147,227,148,17,233,98,0,233,205,34,64,223,224,200,17,228,70,36,103,
-225,224,168,1,228,27,29,65,108,137,141,117,221,236,242,14,181,242,237,31,
-4,32,254,230,152,2,160,77,134,64,100,198,224,59,0,104,96,69,238,2,
-53,51,52,225,231,0,186,64,224,212,10,141,161,233,67,4,225,162,0,230,
-2,4,193,78,205,210,160,130,238,203,6,71,1,226,77,1,151,98,103,118,
-229,229,8,213,93,96,37,64,29,2,54,32,67,233,188,3,41,221,97,22,
-70,13,97,96,2,51,48,50,160,78,238,8,0,225,196,12,226,142,30,230,
-13,11,226,129,53,225,250,22,131,224,2,79,32,79,42,138,188,0,96,12,
-123,227,128,13,243,213,7,224,17,3,2,60,45,34,192,49,65,116,224,48,
-7,131,252,224,17,3,135,208,96,48,2,56,55,53,32,170,224,113,0,231,
-191,1,228,147,2,32,162,64,36,172,43,2,50,55,56,113,57,103,29,109,
-59,64,31,132,6,113,176,235,200,1,146,22,235,174,3,161,66,98,173,236,
-108,3,235,104,6,64,81,131,143,50,223,131,80,2,49,49,53,224,31,0,
-180,191,139,83,195,11,43,82,201,102,130,172,136,230,64,25,153,223,2,53,
-51,49,137,183,73,234,231,5,4,2,109,112,116,2,121,34,32,224,243,0,
-245,254,0,160,96,189,234,41,48,64,17,65,217,250,124,2,86,14,224,21,
-0,250,140,0,224,147,1,99,73,208,58,217,33,97,6,2,49,49,56,131,
-17,96,29,96,17,64,47,192,17,65,3,228,19,0,107,134,32,31,142,101,
-65,43,96,15,69,160,204,122,33,84,238,57,1,238,133,2,235,154,15,235,
-147,4,64,63,206,206,2,90,32,64,64,190,32,6,224,7,0,113,105,64,
-35,131,174,70,136,96,24,198,141,76,31,227,235,3,128,159,207,187,65,148,
-247,122,7,2,52,55,32,69,231,238,170,0,224,9,1,96,192,228,240,0,
-67,90,102,134,51,85,2,95,56,32,245,218,2,236,124,28,239,118,1,246,
-19,12,96,107,229,32,0,32,206,226,20,1,2,40,41,34,139,197,224,91,
-17,236,208,2,224,72,18,2,91,93,34,224,72,14,182,66,246,58,3,198,
-160,65,53,182,66,243,125,16,166,11,166,6,32,49,32,236,240,59,7,96,
-19,239,254,13,64,52,225,149,8,227,146,1,254,107,6,102,73,2,51,50,
-32,250,12,3,64,68,213,113,227,47,3,67,246,131,105,32,47,98,39,238,
-247,15,150,254,238,242,3,128,85,130,247,162,138,192,4,194,108,78,223,240,
-233,11,2,52,51,32,224,234,15,130,218,231,91,30,224,88,5,109,32,231,
-95,4,64,106,251,155,14,96,108,131,35,231,122,11,96,85,231,123,4,193,
-54,143,80,2,52,51,48,48,84,35,100,33,17,70,146,102,150,231,162,13,
-134,103,231,162,4,231,33,3,197,183,34,90,243,54,19,232,214,39,243,42,
-10,230,218,21,67,31,166,23,37,41,162,220,133,95,33,54,238,59,5,245,
-81,1,151,248,101,54,226,110,6,209,122,229,162,8,65,92,65,220,64,5,
-226,124,1,193,204,192,2,32,33,251,5,0,64,237,224,190,2,230,63,3,
-197,201,230,67,22,224,156,3,226,226,39,65,66,233,160,83,233,158,4,233,
-157,10,64,13,162,24,2,53,32,85,99,220,64,155,50,134,32,17,33,119,
-76,105,247,193,5,139,62,153,220,156,243,128,72,132,1,2,75,32,75,100,
-131,64,59,32,14,2,80,32,58,96,89,225,173,18,129,34,112,136,160,78,
-128,40,198,115,225,188,5,97,185,192,30,97,184,225,198,77,181,197,65,196,
-224,22,0,225,184,1,194,86,64,220,132,83,129,118,160,23,33,133,224,74,
-0,64,34,132,9,88,239,96,14,217,80,74,184,82,6,96,54,135,34,64,
-143,96,42,148,55,64,21,161,57,225,55,4,116,254,225,50,1,232,134,2,
-97,5,128,7,97,255,224,27,0,168,156,129,42,232,146,1,232,138,0,185,
-122,232,196,0,32,125,68,247,66,27,118,158,66,152,229,222,8,226,233,12,
-34,231,225,45,4,2,95,49,50,234,9,2,234,24,4,128,39,148,190,136,
-163,128,27,168,202,64,7,98,156,192,20,233,145,14,129,121,96,182,190,217,
-161,229,32,152,2,89,32,66,34,133,64,104,64,39,66,62,232,212,3,2,
-89,32,64,225,61,2,67,161,129,30,134,1,242,236,1,64,76,65,169,224,
-29,1,104,137,97,167,233,201,1,91,241,163,166,192,143,180,230,2,49,48,
-57,224,244,0,231,79,4,64,229,174,113,76,181,161,144,64,21,169,243,134,
-170,228,213,2,227,32,22,227,20,0,229,8,3,96,24,32,121,39,166,2,
-95,54,49,224,51,7,64,15,224,45,2,128,21,105,113,224,47,8,234,235,
-3,163,67,138,212,196,6,64,189,170,1,129,245,149,200,131,102,141,205,66,
-21,32,34,2,35,49,48,192,0,68,36,64,40,162,234,64,144,33,138,64,
-20,166,182,2,51,32,66,227,2,12,225,248,6,194,139,97,215,64,16,129,
-248,163,15,129,58,224,225,1,239,67,1,156,64,161,171,129,168,168,49,64,
-7,196,198,64,90,99,155,35,115,32,14,64,117,96,14,64,11,130,168,35,
-225,2,52,32,75,128,57,42,150,232,157,1,193,101,224,13,5,64,186,119,
-163,96,135,160,85,200,242,224,39,1,99,201,65,145,96,20,72,30,130,70,
-32,44,64,55,161,23,2,51,54,54,160,20,221,57,110,186,160,53,76,55,
-2,51,54,53,32,25,195,231,227,75,1,128,57,161,64,33,205,245,251,12,
-2,65,109,98,2,105,103,117,2,111,117,115,110,117,192,46,2,54,51,50,
-170,19,66,250,35,232,223,156,64,201,130,9,68,245,233,112,2,32,84,89,
-48,174,59,135,155,224,121,21,2,58,92,49,2,48,38,34,224,116,2,224,
-41,16,2,32,32,102,2,111,117,110,2,100,58,32,32,0,160,48,132,31,
-224,119,0,104,177,97,250,64,16,140,76,169,117,238,8,3,2,69,79,70,
-238,6,4,224,114,7,79,146,34,12,128,31,224,145,21,2,101,120,112,2,
-101,99,116,2,101,100,58,160,145,64,252,2,57,57,32,65,43,91,246,209,
-55,225,53,1,131,28,55,156,183,158,33,254,2,60,32,64,2,35,54,32,
-72,17,224,18,4,110,106,224,18,5,64,149,130,47,224,19,2,140,136,2,
-75,32,102,224,150,0,2,84,82,97,2,119,34,32,96,114,236,161,3,160,
-246,96,21,2,75,32,66,224,215,18,2,123,45,35,160,207,81,144,65,75,
-224,243,2,2,35,45,125,216,39,224,160,8,187,170,224,18,3,67,205,224,
-158,6,2,73,110,100,170,142,160,139,224,27,2,2,66,114,97,149,235,128,
-27,165,127,225,26,6,65,208,224,121,6,67,21,224,121,6,65,122,64,93,
-67,38,242,88,6,124,141,224,23,11,66,176,231,220,1,224,151,1,2,125,
-32,108,2,97,121,111,2,117,116,34,96,143,225,41,2,224,23,4,128,111,
-99,39,2,95,53,50,33,87,2,53,57,48,193,42,224,25,2,224,20,0,
-225,222,7,224,195,9,137,135,192,57,40,49,225,52,1,160,18,40,82,224,
-23,1,193,218,235,120,44,226,163,0,229,170,1,133,146,2,52,50,56,237,
-48,3,2,52,51,56,235,221,0,96,30,140,9,135,20,32,195,74,75,108,
-222,128,209,96,4,132,186,165,58,201,32,165,197,2,83,32,85,233,203,1,
-234,49,0,233,238,2,161,36,253,215,3,132,89,224,46,32,99,56,230,85,
-2,128,119,224,39,10,129,71,160,85,224,39,17,135,250,196,247,197,133,64,
-37,172,150,224,82,2,165,52,70,162,155,139,199,105,254,169,5,78,238,161,
-69,2,52,52,56,128,29,2,52,52,51,162,3,192,236,224,111,25,224,71,
-0,192,110,255,51,1,224,38,10,236,78,0,224,77,2,102,79,32,43,108,
-30,212,250,46,19,134,120,227,147,0,159,163,32,163,243,19,1,66,15,69,
-247,64,182,64,201,60,223,2,95,55,48,96,159,224,9,0,2,56,51,32,
-160,209,64,32,32,47,107,55,167,156,2,51,57,52,227,146,7,160,168,225,
-150,1,252,208,0,193,150,116,162,96,29,64,32,224,29,1,103,77,110,202,
-225,58,31,140,180,193,58,226,5,12,180,164,192,158,2,95,51,56,32,194,
-33,228,130,96,224,50,35,101,184,226,15,5,224,41,13,2,57,56,32,131,
-64,2,52,53,52,136,87,2,52,53,54,192,8,173,237,192,223,97,204,192,
-251,2,49,53,48,128,198,224,245,21,137,224,64,23,193,90,170,120,171,108,
-32,83,98,140,129,102,224,106,0,137,95,96,25,76,199,160,71,228,5,2,
-194,191,170,96,225,162,0,254,145,1,64,9,234,237,0,138,235,234,216,0,
-233,30,0,201,28,151,163,246,154,0,226,38,6,109,226,224,19,6,2,49,
-50,54,192,177,224,51,12,100,183,224,28,15,179,181,2,52,53,57,160,190,
-195,71,136,113,179,147,96,250,224,244,20,193,126,194,174,131,71,224,21,7,
-2,49,52,54,160,140,193,193,228,241,8,97,251,224,132,1,223,207,160,29,
-96,165,240,142,2,227,143,4,107,195,231,240,19,2,85,110,114,2,101,99,
-111,2,103,110,105,2,122,101,100,2,32,105,110,2,112,117,116,200,208,230,
-120,5,99,169,194,18,138,128,64,186,129,151,176,151,65,212,215,34,107,122,
-32,33,114,67,202,154,130,50,224,127,4,2,73,108,108,2,101,103,97,2,
-108,32,67,2,104,97,114,2,32,108,105,61,134,2,97,108,34,129,65,128,
-218,225,88,6,166,46,210,111,245,33,0,163,83,224,162,13,64,135,102,144,
-97,74,224,81,38,225,253,45,140,153,100,214,229,64,0,164,197,237,235,4,
-244,147,1,96,126,96,72,81,131,199,22,252,15,6,96,148,229,114,37,167,
-132,112,143,237,12,1,36,33,153,151,129,38,2,53,48,57,2,32,64,73,
-160,248,241,124,1,160,192,227,11,0,224,193,5,224,179,2,2,53,48,56,
-224,179,8,224,178,69,224,75,0,64,63,213,1,192,98,225,140,4,64,32,
-166,58,225,160,17,72,141,142,2,68,140,99,145,240,60,1,86,136,229,157,
-4,147,33,198,36,32,30,198,184,112,142,64,237,151,62,109,43,140,252,65,
-76,64,100,244,208,3,225,79,8,197,23,229,29,0,243,2,3,128,15,224,
-16,0,231,205,14,225,35,0,224,39,2,32,57,119,75,240,80,3,240,82,
-0,224,115,4,129,205,144,89,224,123,2,209,124,231,77,7,200,52,228,165,
-0,2,51,53,56,241,104,2,80,88,98,235,41,214,232,53,1,229,74,3,
-242,211,6,233,22,0,162,129,226,39,53,65,25,177,223,224,201,1,166,196,
-65,119,192,228,244,152,1,162,200,227,252,1,98,199,130,86,2,51,55,51,
-164,44,210,51,244,130,0,132,26,160,52,224,174,6,192,194,192,179,224,191,
-32,227,161,6,224,166,2,228,46,14,196,41,128,168,227,111,24,224,95,0,
-34,149,65,107,162,149,129,254,236,124,0,96,16,254,238,6,239,65,3,2,
-108,101,116,254,108,7,2,119,104,101,2,114,101,34,224,20,6,2,100,111,
-34,224,17,6,2,111,102,34,254,117,3,225,88,1,99,23,128,11,227,139,
-2,177,214,226,166,1,235,230,8,238,101,1,161,46,253,156,0,227,177,6,
-227,211,2,154,170,137,21,232,142,0,227,246,5,227,103,1,249,137,2,224,
-67,9,169,27,235,238,9,228,24,12,134,132,228,24,0,160,149,224,106,96,
-162,42,65,249,146,208,228,139,2,235,67,3,233,160,2,201,28,34,94,38,
-40,224,14,0,204,21,234,176,7,113,128,164,141,224,27,0,130,62,2,95,
-52,49,2,57,32,35,64,143,226,12,1,2,46,46,34,228,183,3,64,49,
-224,141,2,51,56,227,74,1,115,215,234,22,1,239,57,0,130,169,76,175,
-67,80,206,76,154,179,237,47,37,234,254,8,232,196,0,234,134,1,152,160,
-234,146,6,235,223,14,2,48,49,32,167,98,166,150,72,124,159,227,163,193,
-160,35,192,13,96,137,205,13,246,122,1,225,160,4,238,6,11,128,139,224,
-214,7,196,13,224,214,121,64,137,224,214,26,230,110,0,237,15,4,224,145,
-39,161,251,224,152,19,160,139,224,138,18,187,205,232,5,3,100,135,247,13,
-1,230,54,1,229,143,2,197,142,151,19,2,48,54,32,229,142,34,241,147,
-3,161,55,192,25,224,107,19,151,121,2,52,56,49,64,12,174,40,230,1,
-35,182,197,236,77,0,99,171,236,34,2,97,41,163,83,2,57,32,102,227,
-185,0,2,92,51,52,2,38,115,114,2,99,47,77,2,105,99,114,2,111,
-72,115,2,47,76,101,2,120,46,104,2,115,92,51,2,52,38,44,2,51,
-52,52,2,58,49,52,180,62,246,229,1,226,104,8,224,11,2,205,239,166,
-116,239,254,9,129,132,178,112,51,164,44,149,54,237,35,245,2,53,56,57,
-32,175,2,53,52,53,243,127,0,198,74,225,211,3,252,32,4,224,107,2,
-195,25,241,145,14,161,39,233,179,4,162,36,228,147,3,241,67,6,241,228,
-7,226,181,20,32,0,133,158,97,207,72,33,224,217,13,69,121,122,86,224,
-29,12,130,118,106,82,69,166,226,17,7,98,14,34,53,66,213,64,9,2,
-52,32,80,224,65,6,40,136,120,94,122,12,136,159,224,105,12,168,176,129,
-3,225,142,2,133,111,232,187,4,225,21,60,224,216,22,230,177,8,171,46,
-232,46,0,244,21,21,165,35,226,2,19,162,87,131,109,2,50,53,54,225,
-63,14,224,35,0,225,163,17,224,33,28,129,169,2,49,32,67,97,169,225,
-129,14,225,169,41,193,54,2,53,48,53,196,242,200,8,154,143,64,32,67,
-85,2,52,57,53,32,5,128,97,32,12,60,30,160,51,64,42,153,240,105,
-156,65,188,2,50,51,56,120,231,90,118,253,123,1,131,106,239,47,4,65,
-253,241,211,1,96,227,2,50,54,52,197,155,133,134,244,4,0,129,33,109,
-94,64,23,64,44,86,47,244,36,2,224,33,25,173,157,130,23,235,227,0,
-241,93,1,92,247,197,254,130,135,189,216,224,79,11,129,72,163,245,96,186,
-232,91,4,96,63,128,19,91,48,105,127,224,152,15,224,32,24,224,185,2,
-97,60,128,100,65,131,34,169,96,46,224,168,18,160,17,224,33,20,97,199,
-154,130,225,134,19,64,37,152,4,227,94,1,232,117,2,225,71,0,2,50,
-52,55,128,93,135,73,225,75,20,160,130,225,78,3,254,149,3,66,110,34,
-190,2,85,32,90,192,41,226,65,1,131,19,160,118,231,209,1,2,50,53,
-56,224,48,3,224,100,1,224,145,1,225,114,19,225,116,4,224,98,50,65,
-44,152,209,230,237,1,225,44,11,225,43,54,121,46,248,238,5,225,62,2,
-224,104,3,118,89,64,86,64,70,224,241,11,224,123,40,240,44,2,224,119,
-9,129,60,32,41,224,98,3,225,0,0,200,184,99,179,225,221,7,168,3,
-196,61,205,147,224,43,6,102,10,224,221,1,66,153,224,106,1,224,203,33,
-249,70,3,224,122,111,224,50,0,224,98,0,240,2,3,108,242,2,50,32,
-102,233,101,0,2,68,97,116,2,97,46,73,2,110,116,101,2,103,114,97,
-2,108,46,94,2,58,32,110,53,37,2,116,105,118,2,101,32,101,2,120,
-112,111,2,110,101,110,156,119,66,129,242,197,0,235,50,1,226,6,3,128,
-152,192,203,32,201,235,78,0,224,191,2,160,36,224,179,4,224,36,21,98,
-31,64,126,146,223,32,107,2,50,32,75,102,46,99,205,230,89,7,102,161,
-230,89,0,135,196,64,42,206,141,64,44,64,25,124,96,134,73,188,35,2,
-80,32,75,248,145,0,209,9,199,229,193,199,234,193,13,60,248,87,202,230,
-62,2,242,122,3,32,94,234,130,2,75,244,135,234,209,236,134,61,224,37,
-5,128,39,194,225,224,160,18,234,231,3,136,132,64,72,224,73,3,97,169,
-236,106,0,192,56,106,87,189,108,245,247,1,151,74,192,152,196,17,242,30,
-0,224,90,1,224,113,4,96,92,224,241,7,192,26,129,20,212,105,147,4,
-233,43,1,225,89,26,85,130,229,71,1,224,241,16,225,115,3,224,237,7,
-225,36,86,168,254,2,57,54,32,224,11,0,104,222,227,249,0,226,69,33,
-35,252,231,105,1,224,119,0,107,82,249,237,0,224,94,0,224,119,4,224,
-107,93,96,12,67,78,205,212,75,53,35,73,67,165,64,22,137,234,2,90,
-32,83,125,182,85,201,227,211,6,64,103,32,36,237,36,0,231,247,7,253,
-57,32,235,78,15,221,38,135,238,113,175,224,128,4,254,229,34,224,112,29,
-157,252,224,111,97,253,212,1,64,112,234,165,2,224,112,79,47,148,224,111,
-100,240,98,0,64,111,106,148,224,111,9,248,164,16,192,59,2,83,32,80,
-224,98,18,2,54,54,32,224,98,24,233,181,0,2,52,57,52,224,33,10,
-66,248,97,24,66,246,140,182,85,92,124,9,70,130,96,112,99,116,237,36,
-4,178,64,2,52,53,50,131,48,139,40,224,57,18,224,109,0,2,57,50,
-32,224,57,4,235,60,0,254,119,13,102,222,224,19,6,64,175,64,58,170,
-74,224,116,17,129,69,64,108,117,86,224,116,1,136,2,224,232,19,129,89,
-64,50,175,76,192,58,250,158,3,213,67,228,104,0,250,59,8,166,34,202,
-3,40,80,2,82,32,95,224,47,1,234,164,1,166,149,229,227,0,249,115,
-2,224,91,8,250,235,2,207,145,145,98,165,232,252,110,0,224,57,4,206,
-110,253,160,5,133,97,224,162,0,81,87,130,218,86,133,130,93,108,115,2,
-53,50,55,133,84,229,71,1,255,67,2,34,164,158,239,225,68,4,203,18,
-33,54,65,97,161,54,232,185,4,149,117,69,101,148,46,231,126,81,32,17,
-231,126,8,231,123,34,231,68,19,77,54,231,67,5,129,36,64,247,137,175,
-64,84,98,109,36,79,175,77,174,63,169,21,141,71,233,199,65,2,52,48,
-32,233,199,33,235,217,2,232,95,44,224,150,34,234,94,4,161,82,161,79,
-96,86,231,172,7,246,121,1,224,22,1,64,103,226,50,1,239,177,0,65,
-109,135,206,2,80,32,79,147,190,117,241,99,108,64,35,249,8,0,229,66,
-3,87,44,224,25,14,68,108,185,66,245,155,1,249,76,1,140,59,125,235,
-2,53,50,50,149,252,224,28,10,220,25,132,188,236,176,1,2,44,59,40,
-2,41,91,93,2,123,125,95,2,96,34,32,238,56,2,219,184,227,145,0,
-107,64,224,88,5,94,69,64,182,224,35,0,65,113,69,145,196,89,248,183,
-0,227,66,23,248,224,1,193,190,228,102,0,132,142,226,58,4,225,253,1,
-227,137,9,96,27,227,33,7,235,88,5,190,49,96,26,248,30,1,192,250,
-252,97,3,255,185,20,231,20,4,164,234,193,0,246,109,2,227,69,16,235,
-69,73,248,107,0,160,162,224,220,5,248,103,1,2,52,56,51,235,115,6,
-220,111,133,70,247,55,3,162,212,228,17,23,235,218,29,224,94,2,252,166,
-1,32,142,146,210,231,120,12,72,11,224,19,7,99,43,32,0,224,155,3,
-225,106,20,236,121,31,230,72,1,184,60,224,99,2,192,25,96,54,2,67,
-32,79,164,64,212,113,132,19,227,100,15,2,33,64,35,2,36,37,38,2,
-63,43,46,2,47,60,61,2,62,63,92,2,57,50,38,2,94,124,58,2,
-45,126,34,135,6,130,111,226,69,3,225,13,15,151,108,224,20,6,2,54,
-57,32,238,247,5,231,87,3,207,31,225,29,57,194,55,163,23,189,208,229,
-119,2,199,238,99,63,233,71,15,225,206,10,215,211,232,115,3,228,2,100,
-226,1,2,224,228,0,64,165,193,227,194,184,237,203,0,246,248,0,2,89,
-32,66,161,80,247,78,3,224,119,2,96,113,131,147,96,236,128,0,64,54,
-225,245,1,228,98,10,128,43,192,117,38,176,64,16,226,111,2,225,210,23,
-239,161,75,228,75,5,160,190,96,199,236,159,14,107,97,66,37,224,229,16,
-105,121,192,229,252,169,2,35,31,2,38,34,32,224,237,1,226,209,0,236,
-217,6,166,237,104,177,224,32,0,135,4,225,155,3,212,13,252,66,28,128,
-84,239,195,6,224,155,11,252,8,3,100,214,140,193,233,220,1,66,75,250,
-38,0,224,144,19,193,165,131,64,225,148,1,167,20,225,55,9,164,255,245,
-227,1,227,119,0,68,183,62,33,136,243,72,233,64,43,226,174,0,226,154,
-9,198,48,168,126,129,229,224,54,5,224,233,3,224,210,0,72,228,144,156,
-195,20,232,187,12,97,76,229,59,21,228,182,0,226,201,4,228,191,0,160,
-172,2,85,32,35,193,152,149,248,236,238,1,172,160,225,67,1,190,146,229,
-136,12,2,97,98,102,2,110,114,116,2,118,92,57,2,50,38,92,62,249,
-2,39,34,32,237,30,1,226,200,17,131,141,229,164,11,2,49,51,57,96,
-108,89,86,33,28,91,88,37,144,105,177,85,59,224,19,1,102,199,225,11,
-8,2,66,32,79,32,216,128,46,228,109,0,225,119,0,253,16,1,253,13,
-14,240,187,1,227,217,1,78,72,241,190,8,162,26,233,156,6,231,235,16,
-231,5,0,32,82,33,121,128,68,160,41,142,136,160,43,224,42,9,96,145,
-224,42,0,96,244,231,66,29,123,69,230,119,9,66,104,188,197,232,49,1,
-106,118,128,180,64,31,219,29,229,141,9,227,32,7,32,98,165,15,111,23,
-224,10,4,227,28,4,236,4,0,225,39,15,64,119,144,50,2,80,32,58,
-119,48,218,78,132,140,136,216,65,110,248,31,5,2,114,101,97,2,100,58,
-32,2,102,97,105,2,108,101,100,130,124,35,89,64,64,176,10,224,64,2,
-244,13,4,32,78,127,177,96,215,127,139,107,212,128,3,132,76,96,46,151,
-173,2,55,49,32,32,166,87,196,159,230,224,11,4,64,109,144,61,227,70,
-2,226,64,1,229,66,0,34,71,95,60,32,82,228,254,2,35,52,2,108,
-105,98,2,47,84,101,2,120,116,47,2,82,101,97,2,100,47,76,2,101,
-120,46,2,104,115,92,32,23,2,44,54,57,2,58,49,34,217,68,128,138,
-32,107,64,7,152,104,96,232,64,208,152,100,47,226,2,95,53,55,33,188,
-64,11,36,76,64,28,245,7,1,125,160,249,106,1,64,28,196,112,64,11,
-130,19,109,150,64,14,194,2,66,0,2,35,52,32,32,129,33,193,64,24,
-129,163,199,252,176,10,134,242,129,229,64,36,129,188,160,34,99,28,160,61,
-129,148,160,24,98,145,160,24,241,125,3,103,90,251,61,8,224,10,0,247,
-213,8,252,12,0,233,159,3,33,3,69,122,64,8,32,7,238,173,2,225,
-123,1,2,85,110,109,2,97,116,99,2,104,101,100,2,32,34,32,232,160,
-7,241,203,1,194,200,226,250,0,177,125,241,180,1,229,167,15,224,62,10,
-128,59,241,214,3,223,152,233,193,3,232,89,8,162,164,32,211,73,219,187,
-42,64,15,195,213,201,179,237,250,3,97,9,127,60,2,51,55,51,209,196,
-224,64,3,230,44,0,252,215,2,224,214,0,46,154,249,254,3,238,196,0,
-234,77,1,242,186,6,229,39,5,136,138,224,36,6,227,134,0,175,87,242,
-230,1,209,167,234,161,5,249,77,2,239,66,3,224,82,4,243,48,0,225,
-102,4,226,19,1,224,165,7,240,15,10,236,175,7,224,67,42,181,63,224,
-41,3,224,60,1,224,57,21,203,172,243,34,4,230,169,1,225,145,2,226,
-102,10,244,8,6,233,127,19,132,228,226,4,10,130,35,32,20,203,79,224,
-16,0,167,98,226,124,11,227,243,1,166,124,163,111,227,93,1,2,66,97,
-100,2,32,115,116,2,114,105,110,2,103,32,103,2,97,112,34,232,251,2,
-224,80,6,226,194,6,71,225,130,60,227,3,6,83,106,96,255,96,54,226,
-255,5,100,118,77,183,165,132,2,67,32,80,54,37,102,219,41,184,2,95,
-55,48,244,186,5,232,234,3,164,100,232,10,9,176,118,224,33,16,90,99,
-224,32,21,203,142,224,99,16,128,190,224,133,20,204,184,224,33,17,245,95,
-0,224,33,16,224,135,24,136,212,224,67,20,97,47,233,212,51,233,189,2,
-233,208,19,98,84,132,189,37,187,2,50,54,52,223,164,37,191,103,111,88,
-106,98,5,2,57,32,35,96,71,101,59,225,228,4,245,182,2,175,59,130,
-56,72,108,251,217,14,234,240,1,164,81,239,59,11,116,40,192,23,2,95,
-56,53,43,15,140,23,229,210,0,201,185,32,7,230,77,2,64,227,225,165,
-2,66,156,224,179,8,228,6,0,238,107,6,244,165,0,224,111,4,224,99,
-8,224,98,27,255,54,3,224,35,15,230,25,0,96,81,2,55,32,35,67,
-6,67,53,215,244,160,22,73,69,32,43,227,79,0,128,43,32,129,224,21,
-2,99,132,66,56,224,100,16,96,33,97,205,224,32,19,69,34,224,33,22,
-32,218,224,33,21,228,10,10,224,32,5,35,204,224,99,22,96,23,224,33,
-13,68,124,137,134,102,186,232,48,4,229,195,4,230,174,0,224,16,1,229,
-226,6,150,96,99,91,172,25,241,200,18,230,99,1,250,139,1,250,46,2,
-226,64,0,45,188,45,78,2,54,49,32,249,39,9,160,70,229,149,1,74,
-69,99,104,192,221,110,53,224,21,0,96,76,35,244,170,251,187,75,229,195,
-2,163,36,66,91,99,189,161,30,138,136,183,191,233,139,9,2,78,85,76,
-102,34,98,58,224,37,16,2,83,79,72,128,37,64,154,224,37,17,2,84,
-88,34,96,37,64,149,224,37,16,2,69,84,88,128,37,67,121,224,37,17,
-2,79,84,34,96,37,64,201,224,37,17,2,78,81,34,96,37,144,36,224,
-37,14,2,65,67,75,128,37,67,168,224,37,16,2,66,69,76,128,37,65,
-252,224,37,17,2,83,34,32,64,36,69,218,224,36,16,2,72,84,34,96,
-36,72,38,224,36,16,2,76,70,34,129,82,225,121,20,2,86,84,34,128,
-37,225,121,20,2,70,70,34,128,37,225,121,20,2,67,82,34,128,37,225,
-121,20,2,83,79,34,128,37,225,121,20,2,83,73,34,128,37,225,121,20,
-2,68,76,69,160,38,225,122,20,2,68,67,49,160,38,225,123,20,2,68,
-67,50,160,38,225,125,20,2,68,67,51,160,38,225,127,20,2,68,67,52,
-162,173,225,128,20,2,78,65,75,160,38,226,251,21,2,89,78,34,128,38,
-226,252,22,2,66,34,32,96,38,225,131,20,2,67,65,78,160,38,226,254,
-21,2,77,34,32,96,37,225,132,20,2,83,85,66,160,38,225,132,20,2,
-69,83,67,160,38,225,132,20,2,70,83,34,128,37,225,131,20,2,71,83,
-34,128,37,225,130,20,2,82,83,34,132,9,225,129,20,2,85,83,34,128,
-37,225,128,21,2,80,34,32,96,37,225,127,20,2,68,69,76,195,41,64,
-229,244,25,4,224,0,14,69,68,143,176,2,95,52,56,169,116,71,119,103,
-95,2,52,54,50,96,6,102,153,2,52,54,51,128,6,64,33,72,52,169,
-98,2,95,54,48,224,11,0,64,77,143,242,2,62,61,32,64,12,143,240,
-2,62,32,58,128,62,32,11,2,60,32,58,128,87,32,11,2,105,99,109,
-2,112,32,58,128,109,144,79,244,13,12,92,249,2,44,123,125,2,96,59,
-34,160,98,177,22,250,155,2,169,131,160,15,127,71,224,30,2,64,29,250,
-156,13,32,77,82,164,103,98,186,76,231,33,0,242,146,1,244,225,2,176,
-4,158,43,2,52,53,51,32,12,103,178,183,117,128,41,2,53,49,49,249,
-207,0,38,174,236,93,1,73,112,230,243,0,2,95,55,54,236,167,1,64,
-136,135,235,224,183,6,224,14,0,234,242,1,65,144,140,39,108,215,73,70,
-171,243,224,35,6,178,138,160,35,242,87,1,64,223,224,242,7,106,0,224,
-242,35,175,138,224,241,52,130,121,224,181,6,34,135,224,181,2,96,152,64,
-43,130,87,224,179,0,250,186,16,192,61,224,19,3,174,209,224,222,35,232,
-123,2,224,222,48,130,253,64,35,2,53,54,48,248,253,1,232,250,0,115,
-86,232,251,0,160,13,76,160,2,53,50,54,64,134,66,84,233,7,0,238,
-105,1,64,90,131,76,81,78,225,61,21,130,201,224,38,9,226,62,13,188,
-18,224,39,2,99,214,226,66,6,245,43,6,2,100,105,103,2,105,116,84,
-2,111,73,110,2,116,34,32,170,86,237,88,10,192,16,173,98,109,156,208,
-223,224,49,27,96,176,224,49,22,64,39,96,255,97,34,244,46,4,109,8,
-148,21,65,233,246,168,7,254,209,14,64,45,212,67,184,251,248,211,3,185,
-1,237,78,2,241,190,12,194,63,64,78,64,168,128,124,238,47,2,241,100,
-15,2,51,53,32,171,10,43,104,243,106,0,173,14,96,77,164,50,239,62,
-1,239,106,0,224,75,1,109,220,233,12,14,2,85,82,67,136,195,251,74,
-5,96,114,192,226,66,240,2,95,49,57,34,175,32,20,188,109,96,19,2,
-53,54,53,64,169,69,64,32,49,2,52,56,57,243,130,2,113,87,224,174,
-4,186,193,218,151,64,209,161,158,223,12,160,186,172,171,225,76,0,65,200,
-241,112,13,236,160,3,188,94,110,190,242,53,8,2,85,110,99,2,108,111,
-115,53,146,2,123,45,32,2,99,111,109,2,109,101,110,130,171,135,33,228,
-22,5,252,119,2,240,145,12,2,49,50,51,236,150,3,109,121,243,39,17,
-178,237,196,59,129,15,242,165,6,237,30,11,224,149,39,192,103,224,148,28,
-2,49,50,53,224,149,28,227,97,1,224,150,7,247,27,3,244,186,20,224,
-46,30,165,160,243,253,1,224,233,0,244,213,10,224,177,10,244,62,1,160,
-26,244,121,1,224,18,4,253,232,0,195,147,66,137,134,133,2,85,32,66,
-90,99,249,180,0,2,95,51,53,32,89,225,155,9,128,5,64,55,216,220,
-193,100,160,49,35,68,238,202,0,131,81,102,83,69,204,224,77,4,100,208,
-68,173,135,74,64,81,166,48,146,61,224,86,5,224,59,4,128,45,230,3,
-16,229,220,5,148,81,250,38,19,2,68,97,116,2,97,47,67,2,104,97,
-114,218,34,2,57,55,58,218,34,243,46,3,224,127,0,229,126,17,192,108,
-229,228,0,128,170,229,139,4,97,236,133,139,68,100,128,195,229,16,6,155,
-239,64,7,92,12,240,244,1,254,60,4,2,60,32,64,111,27,116,66,226,
-233,0,2,67,32,61,2,61,32,64,224,24,0,220,78,65,219,251,176,0,
-227,206,10,224,69,13,250,137,1,224,69,3,185,115,130,174,112,231,224,91,
-6,229,115,17,2,109,111,100,2,117,108,101,246,184,0,2,90,32,75,235,
-165,2,200,148,154,104,129,84,184,72,65,230,60,131,95,224,221,54,217,147,
-224,175,3,137,149,96,173,160,88,65,101,198,195,146,145,63,166,64,21,64,
-95,198,217,250,134,5,224,13,0,187,13,180,238,33,179,76,120,75,163,81,
-133,96,10,139,126,57,151,135,19,231,25,0,2,75,32,66,128,44,44,253,
-64,5,83,191,75,245,230,80,1,96,59,224,60,4,250,60,4,225,235,5,
-114,159,246,0,1,224,25,1,250,94,6,226,25,3,242,230,2,228,133,5,
-224,46,13,218,90,248,245,7,225,88,4,192,30,66,12,96,88,246,217,2,
-146,241,245,230,4,192,171,250,113,0,229,118,3,250,249,2,249,211,5,246,
-62,0,226,79,1,211,10,229,213,5,246,61,3,243,143,10,200,157,135,25,
-129,139,194,81,161,140,225,141,6,227,5,1,224,51,12,135,233,203,4,224,
-52,0,135,112,192,63,64,11,153,73,255,30,1,96,28,64,7,218,12,227,
-216,9,248,2,3,65,70,116,60,201,92,212,120,65,141,64,70,160,229,163,
-157,193,47,224,231,13,96,35,224,179,9,189,204,105,248,253,160,1,224,190,
-2,194,36,68,135,251,70,5,230,205,3,181,148,225,132,3,224,159,1,225,
-77,0,224,158,23,160,108,225,138,5,129,190,193,61,250,151,5,224,165,0,
-224,95,50,184,0,160,95,192,69,128,101,226,47,15,234,33,0,64,22,231,
-76,0,226,186,4,229,133,11,225,77,1,99,56,228,96,1,246,119,1,65,
-239,221,242,227,133,3,233,125,8,232,186,3,249,95,2,232,232,6,234,52,
-19,192,59,68,221,225,22,8,226,202,3,247,34,18,254,213,6,224,162,12,
-227,250,2,230,117,17,129,229,224,138,12,171,65,163,60,33,117,224,208,16,
-128,169,253,49,13,2,108,97,121,2,111,117,116,2,32,101,114,2,114,111,
-114,2,32,125,34,141,192,229,188,21,224,153,24,227,241,5,161,78,96,43,
-64,23,101,120,228,88,8,229,128,1,230,183,4,102,98,226,56,1,135,101,
-192,13,130,23,98,51,227,140,2,224,10,4,229,168,3,2,95,51,48,37,
-0,101,43,231,184,2,230,179,0,228,237,12,225,58,1,130,242,138,40,66,
-242,225,66,1,2,115,121,110,2,116,97,120,129,66,225,64,30,71,95,217,
-187,186,175,199,118,236,248,1,32,24,114,55,137,11,64,122,192,47,64,158,
-160,46,138,101,104,39,64,14,138,34,2,85,32,75,2,32,65,32,128,102,
-138,6,135,108,32,102,2,90,32,85,169,79,233,35,4,224,18,6,138,33,
-231,0,8,224,18,6,65,52,135,254,163,206,64,16,160,103,32,159,133,52,
-2,85,32,73,224,7,4,105,17,224,67,1,64,225,160,42,192,49,224,140,
-7,113,134,224,18,5,138,241,224,72,4,70,59,224,72,6,192,7,224,41,
-6,224,157,2,2,85,32,90,233,97,2,65,46,138,138,107,84,32,24,2,
-95,54,50,131,81,96,52,66,53,64,35,138,149,161,162,99,205,161,162,137,
-72,187,183,32,238,32,19,66,89,32,19,2,73,32,58,130,16,203,192,98,
-218,81,81,140,76,125,71,2,90,32,90,67,74,2,51,54,53,2,32,64,
-89,96,93,64,155,201,207,234,245,1,229,236,5,192,186,85,212,236,112,0,
-208,113,106,125,197,54,224,24,13,160,8,109,76,2,52,50,50,198,254,175,
-239,66,118,232,202,0,34,115,143,68,227,41,1,161,137,96,11,116,42,68,
-222,32,54,132,149,172,0,140,149,97,104,192,205,198,80,230,15,5,149,39,
-235,79,1,224,7,1,163,209,228,38,1,231,94,1,169,90,139,104,224,33,
-13,128,27,224,26,6,171,154,128,137,127,250,232,117,0,224,38,13,132,9,
-103,75,163,203,162,61,194,68,130,225,128,232,96,11,160,16,130,140,67,145,
-226,148,2,33,93,2,54,57,54,161,86,129,8,225,7,4,161,68,192,31,
-32,4,130,31,33,7,174,138,172,76,2,57,50,32,247,180,4,34,188,2,
-53,32,102,228,158,0,2,80,114,101,2,108,117,100,172,83,66,39,132,72,
-2,75,32,58,129,172,162,202,230,183,7,232,195,1,32,8,101,134,64,47,
-132,95,228,155,0,132,132,66,4,160,69,160,44,64,20,237,212,1,65,84,
-226,82,0,201,30,234,220,5,240,206,5,163,174,224,53,5,166,104,2,56,
-57,52,129,28,96,7,162,154,224,5,16,240,39,1,2,52,48,53,70,43,
-65,67,128,1,227,247,1,65,146,224,21,12,2,50,32,90,224,20,5,32,
-19,2,51,32,90,224,17,2,32,16,2,52,32,90,192,14,64,72,32,15,
-224,13,5,129,246,230,198,4,204,93,224,226,4,224,16,1,160,13,128,8,
-97,122,230,202,0,225,59,6,192,48,236,190,2,224,27,7,244,128,4,159,
-116,138,55,2,48,54,32,67,199,2,57,49,50,33,84,47,195,226,77,3,
-39,42,162,123,2,95,50,50,96,39,228,143,11,98,137,239,138,1,224,7,
-29,228,188,10,32,110,119,46,224,112,2,229,152,3,69,18,80,34,64,55,
-101,109,224,36,1,33,96,224,55,0,192,35,2,56,53,32,224,35,6,193,
-129,140,184,2,95,57,48,68,162,2,57,48,52,234,251,7,2,54,50,52,
-234,250,4,117,228,142,245,224,5,3,169,120,114,110,128,76,192,77,2,95,
-49,50,2,56,52,32,105,142,87,236,234,219,5,65,116,87,26,224,20,6,
-225,88,11,192,128,96,45,162,0,234,112,1,236,103,2,224,36,0,237,206,
-0,162,48,64,159,33,210,2,51,56,49,96,28,230,77,13,128,9,225,171,
-12,236,218,1,226,120,0,224,107,1,226,152,1,2,95,51,51,207,71,225,
-205,2,32,123,177,231,150,22,126,100,100,19,209,207,37,23,70,146,230,214,
-5,224,7,13,235,141,6,134,15,130,214,235,128,4,224,2,11,225,57,7,
-239,84,5,224,44,17,224,45,26,224,48,6,224,49,42,237,154,0,32,5,
-64,8,228,255,1,102,210,160,5,237,6,5,196,39,134,234,226,69,2,144,
-232,244,158,1,135,18,224,5,3,231,30,4,196,136,224,66,1,2,95,54,
-32,240,63,1,100,31,2,49,56,32,230,1,0,2,95,57,57,55,190,198,
-105,232,26,2,97,226,198,210,2,95,54,51,2,49,32,85,69,54,224,22,
-4,236,47,3,192,87,224,84,8,160,49,229,128,3,2,95,49,54,225,147,
-5,140,71,224,2,23,227,47,3,225,35,4,230,229,0,225,140,9,225,183,
-14,97,33,224,68,11,242,46,3,224,33,11,224,98,8,224,28,19,241,179,
-8,198,235,224,8,5,2,95,54,52,197,54,226,5,0,225,199,1,225,30,
-3,230,20,5,2,39,32,89,228,213,2,242,117,2,239,83,1,173,101,160,
-42,192,19,129,137,200,13,192,101,225,37,7,128,92,237,107,3,226,193,6,
-96,5,193,148,224,57,3,162,138,224,25,10,225,33,5,227,75,12,195,2,
-225,90,3,192,164,227,91,5,225,39,5,96,17,32,89,233,59,8,160,68,
-96,86,225,169,2,230,172,1,224,224,7,71,66,174,203,105,203,85,48,234,
-178,4,228,189,0,252,76,1,115,133,44,18,224,120,0,128,201,224,28,13,
-67,43,241,68,4,65,144,64,3,234,85,2,224,246,2,226,20,3,129,7,
-224,210,4,160,247,224,128,7,229,224,12,224,218,0,202,194,244,82,10,226,
-93,11,232,218,1,228,91,2,226,92,255,226,92,45,226,90,1,226,2,19,
-225,67,3,246,253,2,226,8,22,34,95,226,9,4,160,27,226,13,7,250,
-108,3,160,150,70,47,64,148,254,236,2,226,44,1,227,3,17,122,132,224,
-121,9,224,138,11,254,115,2,227,89,13,234,213,2,145,216,2,52,53,54,
-158,105,226,222,5,193,229,34,74,178,176,226,26,1,226,10,1,225,250,6,
-239,115,21,225,132,6,233,92,1,224,89,8,162,129,237,221,0,32,92,198,
-225,224,82,4,224,77,16,214,220,223,189,78,33,64,12,160,69,224,74,10,
-160,70,250,93,12,2,110,111,116,2,32,101,120,2,112,111,114,2,116,101,
-100,250,99,0,240,63,0,218,6,139,15,2,53,48,32,193,77,64,29,33,
-158,128,29,2,82,32,64,171,249,100,184,140,68,2,51,55,57,202,108,32,
-6,39,255,2,51,56,52,226,142,0,136,41,160,7,224,151,12,2,58,32,
-34,136,64,2,51,49,51,250,150,0,72,39,74,44,235,127,8,224,5,6,
-111,185,171,90,200,129,96,3,237,234,11,167,236,44,245,34,198,160,45,97,
-234,239,89,3,175,94,96,21,224,23,8,224,33,3,129,209,235,92,13,244,
-130,5,193,159,162,130,248,84,5,190,112,235,72,8,224,160,6,224,140,0,
-190,1,237,126,38,229,125,23,228,234,1,139,248,234,131,2,228,15,6,250,
-191,9,165,227,33,135,2,55,48,48,236,118,0,85,114,172,31,224,240,8,
-224,0,6,225,193,12,143,106,225,190,6,210,122,141,74,224,46,3,79,136,
-253,48,8,64,43,2,57,49,48,64,188,2,56,56,32,234,164,2,96,3,
-239,188,3,226,27,60,164,241,242,119,3,97,121,251,106,0,239,71,16,160,
-62,65,165,230,10,1,140,245,243,49,0,249,21,4,65,145,99,165,232,39,
-0,226,107,30,197,90,224,85,25,101,80,226,193,51,226,192,36,247,191,4,
-238,126,1,235,48,3,160,13,104,22,229,175,0,232,107,7,232,58,1,248,
-122,3,227,165,15,248,62,0,239,2,9,248,78,7,233,5,7,225,25,6,
-77,133,64,128,128,20,33,30,103,188,2,57,51,52,33,76,2,53,57,56,
-166,52,97,22,2,55,48,49,230,232,6,239,141,22,96,241,232,36,3,227,
-113,0,192,54,231,186,1,239,166,5,223,167,198,62,143,57,224,93,1,125,
-89,130,167,226,78,5,86,72,244,146,2,117,201,2,55,50,32,247,201,1,
-96,199,227,237,1,227,230,16,224,165,26,160,145,112,82,228,65,5,224,79,
-6,228,82,2,228,63,7,228,21,9,229,55,61,99,204,33,127,229,57,2,
-225,174,6,194,41,224,220,9,243,240,3,224,220,8,97,213,224,85,32,160,
-82,225,114,8,225,27,25,103,76,218,86,32,58,81,147,98,148,135,143,2,
-51,54,55,147,91,96,82,41,75,32,102,64,49,218,111,39,220,224,49,1,
-2,50,56,48,148,30,160,36,150,63,232,237,5,236,25,0,212,209,247,236,
-2,203,47,247,170,3,235,146,6,203,81,239,100,5,241,95,7,224,21,2,
-243,15,4,224,89,0,160,124,224,52,3,241,69,3,160,11,61,155,175,86,
-236,161,28,235,91,1,198,253,227,31,0,220,50,254,202,5,243,231,3,239,
-236,11,236,191,3,192,155,241,151,5,235,132,1,96,56,147,221,66,4,225,
-226,4,237,141,5,225,103,0,229,26,7,224,38,50,242,155,4,196,231,226,
-192,18,225,38,14,244,255,4,253,186,13,224,21,8,227,1,5,129,228,95,
-84,140,139,230,120,10,225,180,32,205,87,225,180,11,230,140,14,224,13,9,
-225,233,5,224,27,0,233,59,1,193,195,115,166,224,184,1,224,0,3,237,
-56,0,224,182,28,192,239,224,129,22,224,171,77,224,170,37,194,167,224,170,
-115,227,216,53,241,39,1,224,151,11,240,22,0,235,45,7,239,222,4,228,
-167,5,235,55,6,195,205,85,17,45,59,230,215,7,216,215,152,81,248,232,
-10,224,222,53,141,167,224,222,16,241,131,0,228,184,52,101,104,33,159,133,
-36,193,191,105,26,249,129,0,137,34,228,219,10,64,18,99,168,131,249,253,
-246,12,231,104,2,127,231,251,246,2,32,58,249,158,6,224,99,0,196,58,
-252,139,8,251,107,4,237,1,3,2,49,53,50,214,236,128,67,186,0,2,
-90,32,95,160,164,98,115,60,165,33,173,71,32,157,48,230,189,16,235,126,
-0,231,20,0,246,231,6,107,107,223,183,124,209,48,219,66,9,239,125,26,
-239,114,19,2,117,110,100,2,101,102,105,2,110,101,100,2,32,109,111,2,
-100,117,108,2,101,58,32,239,130,6,188,254,233,46,8,254,14,0,248,250,
-6,247,51,5,74,68,33,254,244,109,8,231,239,9,160,41,2,95,56,32,
-33,93,248,132,2,255,100,0,229,223,0,235,87,1,226,78,3,146,60,96,
-33,97,152,65,116,222,143,244,13,4,244,98,11,217,54,249,173,20,232,100,
-10,235,86,1,224,61,12,64,163,249,77,3,163,28,228,161,1,224,24,1,
-193,195,114,228,191,229,251,70,0,34,81,233,234,0,96,220,254,219,0,147,
-192,130,9,161,32,224,122,1,32,152,162,163,128,25,65,32,196,97,161,43,
-65,37,159,160,201,155,96,136,66,227,2,56,57,49,226,85,20,185,150,131,
-11,226,80,1,146,87,98,68,64,92,155,233,89,208,236,71,11,75,166,224,
-58,1,2,116,121,81,2,73,100,101,2,110,116,34,162,120,172,94,64,70,
-146,147,245,252,8,221,156,244,88,0,98,11,2,95,52,57,227,206,3,237,
-161,0,148,236,227,186,1,227,172,6,176,185,76,63,75,63,226,111,1,193,
-96,64,137,64,47,32,137,2,80,32,58,128,107,179,41,163,13,64,20,203,
-97,251,215,17,35,12,2,52,57,32,196,82,128,12,142,150,2,95,55,56,
-255,89,17,67,68,96,55,160,0,224,50,18,224,42,7,175,132,70,48,64,
-162,139,210,226,237,26,224,29,30,242,56,7,224,41,2,224,18,9,224,82,
-13,224,21,24,216,219,96,9,130,73,34,162,32,251,105,5,86,82,65,162,
-65,171,2,50,53,32,63,194,110,5,2,56,54,32,163,65,100,204,224,29,
-16,166,13,2,57,51,32,69,201,2,54,50,32,192,124,227,100,1,33,221,
-227,70,0,224,6,3,224,14,1,2,51,55,51,129,94,141,12,98,154,111,
-85,72,150,228,105,1,132,46,228,38,9,240,164,0,197,209,130,42,135,28,
-226,153,0,2,55,50,54,231,2,1,186,53,2,55,50,55,240,110,5,96,
-99,214,75,235,23,2,224,98,0,96,95,200,101,128,155,129,25,2,57,51,
-49,196,32,2,48,49,51,246,141,0,64,75,2,95,55,55,46,113,2,57,
-49,57,255,210,2,2,51,51,54,206,193,200,114,162,212,103,245,103,220,78,
-41,68,70,2,53,53,32,230,137,10,2,79,32,35,2,57,55,32,228,167,
-0,2,50,51,32,33,143,136,30,64,130,205,77,35,168,32,25,2,53,54,
-55,121,84,32,122,32,139,32,9,2,56,51,32,235,4,0,224,34,18,96,
-230,2,35,49,48,132,240,65,237,214,80,142,29,242,88,8,152,164,129,131,
-32,11,33,84,99,106,2,57,50,48,228,174,2,2,45,62,34,193,202,32,
-32,96,30,96,123,2,51,57,55,241,227,0,135,209,134,171,224,66,10,2,
-61,62,34,226,232,3,133,180,64,65,65,100,173,75,224,127,6,33,48,2,
-49,50,54,193,49,224,123,0,32,214,145,179,114,81,201,251,224,59,2,2,
-49,50,50,103,38,224,48,0,96,15,64,48,65,29,224,48,10,160,108,2,
-56,53,57,33,47,224,109,6,224,233,10,231,149,3,224,63,4,2,54,53,
-56,241,187,0,224,230,16,241,219,2,235,54,2,101,219,249,147,4,195,62,
-228,47,7,167,105,199,79,98,207,200,68,231,96,5,98,244,242,79,3,133,
-151,130,254,2,49,50,57,67,109,69,62,2,51,53,32,249,228,0,226,250,
-5,226,103,28,105,117,243,243,3,213,83,224,133,13,118,247,32,123,64,5,
-67,118,72,215,96,139,211,98,108,20,64,104,2,57,50,50,64,145,96,84,
-99,84,66,16,70,116,200,245,68,234,100,126,128,79,99,67,160,6,64,29,
-135,237,224,29,6,224,12,6,64,129,64,43,135,188,97,201,32,29,2,52,
-53,32,96,21,135,139,160,21,2,51,57,56,64,21,97,202,32,21,226,218,
-1,2,80,114,105,2,109,105,116,2,105,118,101,2,115,46,61,66,229,64,
-35,135,47,179,161,224,114,1,224,128,7,128,20,64,48,135,75,2,95,54,
-32,2,95,52,49,72,121,32,238,224,97,12,163,138,130,84,32,166,37,225,
-193,151,228,44,14,224,79,21,163,151,224,79,25,205,166,64,172,135,85,56,
-76,128,236,134,5,133,206,2,55,55,32,2,95,55,49,66,81,2,95,50,
-49,69,197,64,11,44,50,242,113,1,2,95,48,32,192,33,2,49,51,49,
-62,53,244,28,0,224,63,17,32,40,98,164,165,192,224,65,0,102,139,98,
-95,156,36,224,65,6,32,28,69,253,32,162,103,20,32,210,224,56,0,160,
-201,229,32,0,224,120,16,104,116,64,32,224,116,0,74,187,67,66,96,13,
-2,80,32,66,65,58,2,56,57,32,226,228,2,160,16,245,164,0,2,56,
-49,53,73,89,174,189,167,46,34,239,253,37,0,138,40,103,147,118,112,139,
-23,247,125,7,117,79,32,180,206,45,64,149,235,69,1,224,76,11,32,135,
-224,77,0,233,99,0,96,146,2,54,50,51,215,35,169,243,250,144,0,248,
-55,9,239,72,20,254,166,9,249,211,11,231,44,4,104,98,97,88,224,0,
-8,164,5,160,46,226,42,1,225,113,1,91,114,193,171,65,159,65,104,65,
-21,107,175,162,245,224,230,0,225,241,3,221,151,37,0,133,48,98,1,132,
-67,236,19,5,35,242,2,54,51,32,139,67,32,64,2,57,54,52,233,45,
-6,39,73,250,78,6,235,154,1,66,135,2,67,32,60,33,31,204,249,233,
-203,0,193,56,192,24,97,149,176,12,192,234,41,234,32,233,111,77,229,180,
-2,180,17,162,12,227,0,4,2,48,50,56,234,148,6,226,231,6,166,23,
-70,102,2,50,57,57,249,25,0,240,118,5,224,165,10,143,21,96,165,245,
-52,1,224,126,6,140,102,32,207,236,219,3,2,112,101,32,2,115,105,103,
-2,110,97,116,2,117,114,101,135,245,250,120,10,224,215,4,224,209,12,240,
-133,2,224,112,5,2,50,50,50,239,58,1,224,72,3,227,251,5,141,26,
-225,94,21,225,50,0,226,44,7,241,179,1,2,53,48,56,225,51,14,206,
-181,224,54,1,66,80,134,118,224,114,8,2,49,48,51,96,58,136,162,192,
-50,163,5,163,155,162,15,229,36,6,2,48,51,56,250,54,7,135,242,64,
-14,2,95,57,53,81,238,238,174,3,241,5,20,2,67,97,110,2,110,111,
-116,2,32,115,97,2,116,105,115,2,102,121,32,2,99,111,110,2,115,116,
-114,2,97,105,110,2,116,58,32,177,14,106,153,2,56,52,52,224,231,0,
-64,212,135,31,33,124,2,55,52,48,64,4,146,92,75,110,64,29,135,39,
-227,152,11,229,56,4,227,196,2,239,34,6,132,172,32,49,224,168,1,2,
-92,51,52,2,38,115,114,2,99,47,77,2,105,99,114,2,111,72,115,2,
-47,84,121,2,112,101,67,2,104,101,99,2,107,46,104,2,115,92,51,2,
-52,38,44,44,213,2,53,58,49,2,57,34,32,143,66,2,90,32,67,66,
-225,49,84,2,55,49,51,133,44,2,95,57,55,224,197,0,204,64,226,32,
-0,166,111,108,30,34,75,32,152,164,61,69,52,193,158,187,63,224,171,58,
-2,57,49,58,192,171,208,244,187,172,226,209,1,129,231,245,8,2,226,65,
-0,32,26,184,8,225,67,2,226,48,23,241,137,1,224,29,2,139,239,78,
-15,101,141,70,61,230,183,1,101,124,131,235,225,41,3,78,64,241,25,0,
-229,90,17,67,26,252,190,5,236,95,0,106,98,96,189,134,174,221,121,128,
-10,2,51,55,55,230,33,2,2,51,56,56,35,116,158,94,224,161,8,224,
-19,12,230,54,1,162,174,71,124,130,144,32,11,138,189,130,169,32,90,243,
-39,0,128,139,163,215,2,52,50,56,137,136,64,46,70,15,168,80,224,229,
-3,163,164,32,4,197,14,227,226,6,2,57,57,50,230,189,3,229,49,3,
-225,77,4,226,95,2,67,193,32,207,64,163,171,60,238,187,3,225,211,17,
-228,233,4,2,48,51,53,196,233,224,175,5,139,124,104,111,235,85,0,64,
-102,2,95,54,56,227,222,1,241,156,0,75,244,2,95,55,54,129,120,2,
-57,57,57,180,196,64,175,96,103,2,55,53,48,233,57,1,66,65,33,39,
-136,43,239,19,3,251,71,5,244,9,0,255,191,0,228,195,1,151,46,130,
-1,79,50,136,140,189,244,239,31,4,236,139,0,32,119,32,184,111,71,46,
-27,129,109,44,160,204,165,170,244,232,107,3,192,92,226,46,4,224,76,15,
-64,215,176,210,2,53,54,52,96,33,224,39,0,36,77,32,141,224,12,0,
-2,49,52,52,110,83,106,221,50,128,224,37,1,33,37,224,12,2,33,142,
-224,12,1,224,76,1,64,105,234,123,1,112,162,64,74,74,90,101,101,171,
-122,235,213,15,32,45,67,50,64,69,173,3,228,42,1,100,70,2,75,32,
-95,226,155,5,67,176,64,7,2,51,52,49,162,51,149,31,229,159,14,194,
-112,229,211,5,2,48,57,55,244,44,0,228,5,9,46,54,68,197,2,48,
-55,50,193,180,64,159,135,14,247,226,1,65,1,152,138,2,53,54,50,131,
-148,230,92,0,75,120,149,109,64,22,173,125,107,64,65,164,95,237,75,153,
-32,154,97,123,2,54,57,32,242,202,0,32,47,70,111,231,120,11,167,235,
-210,221,249,74,4,195,159,137,193,233,190,6,99,34,224,25,12,105,191,224,
-25,12,249,181,0,233,73,4,96,21,2,85,32,66,163,188,232,218,1,237,
-20,0,64,9,71,51,251,206,0,234,51,13,56,162,115,206,247,37,2,224,
-43,11,96,185,71,98,129,82,161,160,102,104,224,58,6,229,239,0,224,141,
-1,234,198,8,235,83,2,224,105,8,224,27,2,204,3,254,71,2,255,26,
-0,246,33,0,254,97,23,244,26,3,241,30,1,229,61,2,250,173,3,120,
-203,245,116,0,133,174,2,50,56,56,236,7,6,235,218,4,252,111,0,233,
-248,4,64,20,244,60,2,224,82,0,148,36,215,41,99,57,160,12,2,50,
-51,57,65,177,88,57,98,175,227,92,3,249,67,9,212,98,106,62,232,103,
-1,244,88,3,224,119,1,244,252,3,224,69,6,73,208,224,69,7,96,130,
-68,152,181,155,96,135,188,118,145,78,232,82,3,225,166,19,230,181,0,175,
-101,225,117,4,251,204,3,226,84,3,253,71,8,193,110,250,116,10,247,54,
-4,225,174,11,225,176,4,184,76,225,182,5,253,122,3,224,30,23,201,220,
-136,125,243,73,2,254,141,1,183,36,161,232,225,191,1,225,188,39,226,8,
-19,226,106,5,193,216,224,140,4,253,203,2,214,227,111,67,254,222,2,227,
-78,6,111,104,173,59,255,122,6,231,116,4,135,118,224,186,4,177,133,230,
-98,1,96,187,113,40,159,112,67,220,137,147,99,222,122,191,254,153,3,226,
-124,33,105,149,226,48,9,237,54,6,237,3,0,107,21,64,1,128,245,224,
-33,8,99,124,224,73,1,240,213,1,170,103,238,37,1,234,164,2,46,156,
-128,174,235,174,1,2,63,63,63,171,137,65,193,138,134,145,64,226,146,11,
-230,203,1,64,133,186,240,239,180,22,227,46,4,253,117,12,229,9,4,250,
-6,1,224,52,3,224,58,4,160,59,228,251,1,224,28,4,255,179,4,250,
-198,12,229,215,0,239,116,2,227,231,11,195,157,144,253,229,77,9,228,159,
-11,96,101,160,144,249,164,0,224,236,1,118,177,224,160,0,226,143,8,130,
-117,150,124,227,97,4,229,143,0,205,172,196,87,240,141,1,227,92,2,224,
-197,8,226,44,5,225,124,3,224,157,4,225,69,0,225,138,3,212,79,2,
-90,32,75,64,27,160,6,224,198,3,209,240,168,78,225,42,6,240,147,3,
-228,160,3,172,225,119,94,170,237,132,91,99,57,32,172,150,236,35,202,226,
-73,0,226,203,1,172,32,227,204,5,192,155,125,223,229,73,7,241,249,2,
-2,51,49,55,229,200,3,232,132,3,194,37,255,245,7,228,118,1,219,104,
-160,168,105,68,255,149,2,225,43,11,64,4,192,154,239,44,39,2,51,53,
-55,2,58,50,53,163,162,174,92,151,47,145,72,225,28,2,32,246,64,241,
-225,111,20,251,238,3,225,116,9,231,128,2,141,141,116,34,224,230,31,2,
-65,32,64,224,230,50,2,54,58,50,224,230,1,245,119,2,227,220,1,226,
-163,5,227,5,2,226,163,17,245,135,3,64,7,174,99,167,32,160,38,213,
-102,70,3,226,77,2,68,228,143,0,236,24,4,246,241,4,147,159,247,181,
-1,130,155,2,50,49,32,175,156,112,201,94,32,246,72,33,79,157,232,158,
-4,238,7,0,230,46,2,2,51,55,53,108,23,68,46,139,231,236,25,0,
-236,26,1,2,51,55,52,236,26,0,96,44,173,206,66,254,2,75,32,85,
-229,187,2,224,1,3,138,123,192,105,127,107,160,62,141,163,2,79,32,95,
-111,54,2,49,50,55,64,148,224,14,2,64,184,96,14,36,125,160,19,112,
-73,192,12,141,101,186,176,97,21,166,64,138,119,110,246,161,228,230,190,7,
-242,202,0,214,175,225,133,4,65,16,58,150,237,194,7,224,55,10,225,186,
-4,2,51,51,51,224,51,41,118,254,224,51,38,97,25,249,113,10,65,64,
-113,95,34,129,232,246,1,226,9,1,181,35,224,56,2,241,252,4,103,166,
-235,209,0,224,142,13,2,49,48,56,143,58,226,167,3,246,131,4,231,98,
-13,231,179,6,231,61,2,224,47,7,192,5,245,228,10,137,66,233,250,7,
-235,88,1,229,120,2,225,240,2,231,71,5,195,225,249,152,0,221,78,117,
-236,227,121,2,245,229,16,85,226,2,97,32,99,2,108,97,115,2,115,32,
-34,133,184,2,51,49,51,165,193,225,146,4,224,165,7,235,202,3,224,28,
-12,227,43,1,227,71,20,235,200,8,224,2,3,243,26,15,165,105,192,5,
-212,45,71,24,148,46,224,32,6,38,147,137,255,50,189,2,50,57,32,146,
-175,67,111,245,77,1,224,10,13,234,126,10,150,63,222,180,225,103,1,151,
-90,2,55,54,48,64,36,225,97,1,2,115,117,112,2,101,114,102,2,108,
-111,117,2,115,32,105,55,66,2,97,110,99,2,101,32,98,2,105,110,100,
-2,105,110,103,229,209,1,225,40,16,234,62,23,231,195,6,236,182,6,37,
-244,233,207,4,224,98,1,64,25,234,85,4,239,60,8,224,140,4,67,42,
-101,41,226,227,9,201,183,234,165,12,232,57,7,224,13,4,128,10,72,46,
-232,185,7,230,109,7,97,170,226,135,18,226,170,9,242,70,1,224,2,3,
-192,168,224,30,3,226,98,2,113,231,2,66,32,79,182,130,246,168,11,224,
-253,24,238,111,6,186,19,251,117,5,144,73,99,140,233,133,2,238,205,6,
-2,49,48,48,32,125,225,23,4,168,195,227,53,2,238,123,2,104,156,190,
-51,64,7,32,48,224,60,4,65,83,70,237,70,140,245,211,1,193,63,222,
-114,228,183,0,154,56,192,31,2,51,51,55,224,13,2,128,191,219,245,237,
-66,2,174,204,224,19,2,214,171,239,105,6,2,49,53,51,237,125,5,2,
-50,56,49,164,170,225,248,2,64,212,226,233,2,103,237,2,56,53,57,227,
-190,0,233,7,25,226,109,1,229,147,3,160,75,168,91,239,20,3,64,164,
-122,15,160,221,233,51,6,233,19,5,226,151,9,147,58,2,51,55,48,102,
-210,164,15,96,193,32,242,33,117,226,208,3,70,226,180,207,225,25,2,97,
-162,229,177,1,2,51,54,55,224,14,3,2,48,50,49,242,89,1,138,121,
-2,83,32,95,2,53,50,50,2,32,64,73,79,128,135,127,97,55,131,173,
-64,100,181,29,32,49,2,52,54,55,135,166,33,147,32,25,64,35,96,25,
-118,227,181,76,64,27,32,20,228,191,1,68,180,36,168,64,26,137,240,155,
-145,55,44,32,117,153,180,59,19,99,48,240,41,0,65,198,64,205,2,52,
-57,48,224,243,0,112,34,97,57,64,74,233,154,0,83,47,106,3,101,198,
-67,49,87,88,160,19,64,41,137,151,232,6,0,245,72,8,96,92,232,32,
-11,232,31,24,228,4,3,252,15,2,192,136,98,17,201,82,162,171,233,86,
-2,236,4,0,32,51,228,35,6,224,93,59,160,89,161,196,65,216,139,107,
-168,85,90,119,32,73,131,13,137,230,2,51,48,50,129,221,66,200,195,193,
-230,162,11,189,253,253,252,26,2,100,101,114,2,105,118,101,253,239,4,2,
-51,49,52,228,60,4,67,91,111,169,226,224,3,64,177,138,193,2,79,32,
-80,224,97,13,2,68,97,116,2,97,46,66,2,111,117,110,2,100,101,100,
-192,7,96,103,74,122,66,188,224,57,21,2,69,110,117,2,109,46,69,32,
-4,192,51,100,122,224,51,21,224,4,0,224,51,0,139,163,224,103,20,2,
-113,46,69,2,113,34,32,160,47,68,203,224,47,21,2,73,120,46,2,73,
-120,34,160,47,101,221,224,47,21,2,79,114,100,64,3,224,49,0,65,92,
-224,49,21,78,30,2,97,98,108,2,101,46,84,160,8,224,59,0,68,42,
-224,59,16,2,84,101,120,2,116,46,82,2,101,97,100,96,4,224,161,29,
-96,51,2,83,104,111,2,119,46,83,32,4,192,51,2,54,49,32,228,245,
-4,65,236,171,171,184,232,142,110,223,19,137,118,33,213,2,52,32,102,224,
-90,0,224,80,0,238,136,13,163,226,234,248,3,64,65,33,127,177,87,233,
-219,2,197,211,240,129,0,230,1,11,235,190,2,245,220,9,240,216,5,243,
-61,2,243,140,3,243,80,4,243,106,7,236,14,4,249,109,4,236,15,16,
-235,93,9,224,48,10,232,103,11,231,78,2,235,48,9,69,143,202,220,224,
-83,23,224,80,2,233,185,1,224,85,2,2,95,55,51,164,129,224,71,15,
-200,55,233,147,9,101,175,224,25,12,235,250,0,224,22,14,224,104,11,138,
-186,236,43,13,251,164,4,232,184,0,140,48,105,19,64,62,32,234,128,240,
-91,23,231,179,8,225,34,17,224,194,9,205,117,244,90,2,205,7,98,239,
-67,32,247,7,2,236,250,24,224,28,16,226,166,9,128,114,224,2,0,147,
-103,225,73,26,236,14,9,224,8,18,201,248,130,200,219,94,179,49,48,73,
-34,90,2,85,32,102,236,221,1,35,199,2,80,97,114,2,101,110,34,225,
-162,0,244,29,1,224,47,0,2,79,32,35,68,34,161,118,129,39,2,56,
-51,48,96,14,175,201,236,45,1,235,63,3,96,58,2,51,50,32,225,177,
-1,224,95,3,242,174,0,225,121,6,202,208,2,85,32,35,178,48,225,230,
-9,246,20,5,141,15,235,163,6,160,172,193,1,100,101,226,110,3,162,31,
-226,17,2,239,179,1,64,9,189,195,96,156,140,79,154,101,64,165,32,214,
-71,78,224,215,3,250,142,6,96,250,2,52,52,32,224,34,7,235,171,1,
-240,165,2,253,114,3,224,119,23,69,191,192,83,33,33,226,172,1,96,113,
-2,49,50,53,224,30,1,104,98,2,48,53,32,252,45,10,2,85,32,65,
-133,50,64,95,2,52,54,32,128,209,32,76,227,91,2,245,223,0,225,212,
-1,128,137,2,52,51,32,180,17,152,1,236,30,1,83,31,226,96,8,2,
-83,116,114,239,45,1,162,61,236,126,0,160,56,130,106,238,64,1,226,98,
-3,226,137,5,64,172,224,255,1,224,105,5,2,115,80,114,2,101,99,34,
-96,28,129,13,2,49,50,32,160,44,247,116,0,152,137,125,213,2,55,55,
-50,235,233,8,167,17,139,218,69,8,139,35,41,132,41,238,176,166,233,119,
-6,64,148,225,57,0,97,80,160,20,225,169,1,69,77,137,225,64,92,139,
-210,100,236,80,147,64,94,64,6,2,52,56,56,96,31,64,107,160,31,2,
-49,51,57,64,31,32,94,2,35,57,55,191,218,64,107,33,171,64,186,64,
-44,139,240,48,213,231,174,0,240,114,18,230,196,0,230,193,7,230,88,9,
-249,127,5,194,188,166,156,216,110,97,239,239,255,26,224,91,5,165,13,134,
-160,124,133,33,223,130,90,117,40,225,212,1,2,116,121,112,2,101,82,101,
-2,112,34,32,250,151,7,79,127,53,143,2,49,49,57,33,32,226,239,2,
-249,177,2,129,63,65,39,98,152,72,124,224,106,19,2,109,107,84,2,121,
-67,111,2,110,65,112,192,109,186,131,198,151,224,74,41,224,181,0,243,214,
-0,130,112,214,209,99,3,130,21,224,39,37,224,130,12,65,224,224,130,1,
-2,91,93,34,195,200,227,198,0,236,62,4,130,231,74,116,238,46,4,106,
-163,2,76,105,115,2,116,95,84,33,122,142,56,64,90,224,36,9,2,84,
-121,101,170,190,64,34,173,230,234,65,33,203,53,234,64,52,233,140,12,226,
-202,9,251,30,2,226,191,0,226,143,8,233,47,0,169,27,2,54,51,49,
-234,141,0,240,153,14,251,67,6,252,120,18,230,159,5,138,98,253,226,7,
-242,138,12,226,19,0,233,18,3,64,65,114,229,238,183,5,234,197,1,227,
-177,1,32,214,121,233,243,52,6,206,92,133,203,143,199,195,203,128,8,242,
-124,12,225,190,1,2,60,62,34,233,132,2,225,148,0,64,61,72,42,224,
-81,11,229,126,0,230,124,0,224,100,7,226,207,4,65,167,224,111,1,2,
-69,81,34,160,111,254,31,2,65,3,225,33,1,193,30,97,21,228,27,7,
-224,105,33,2,76,84,34,228,78,4,224,100,13,74,147,160,97,225,134,4,
-224,103,33,2,71,84,34,128,50,160,57,138,218,231,152,23,160,37,224,29,
-5,232,17,2,231,179,1,224,123,5,66,217,224,123,1,2,99,111,109,2,
-112,97,114,142,122,230,255,12,78,200,227,242,9,131,179,64,30,144,29,224,
-30,9,48,112,2,110,103,95,228,58,2,142,89,55,145,246,161,5,98,122,
-55,233,224,14,3,240,203,14,2,87,97,114,2,110,105,110,2,103,58,32,
-2,99,97,110,240,212,8,178,192,117,22,48,221,2,56,52,52,224,77,22,
-2,32,121,101,2,116,44,32,128,60,83,5,103,127,224,255,6,248,51,3,
-181,226,64,202,200,18,129,123,129,248,64,41,184,88,64,34,135,216,67,11,
-2,73,79,46,88,55,2,111,114,109,2,73,79,32,195,32,97,0,74,54,
-82,57,64,169,96,104,96,16,64,62,64,83,229,68,37,176,219,229,67,140,
-132,141,182,216,197,84,138,252,239,251,30,247,36,8,229,7,10,238,21,2,
-238,34,13,229,20,83,227,97,3,98,121,225,153,1,2,38,38,34,229,31,
-85,2,52,53,32,224,111,3,2,84,114,117,195,206,228,66,23,228,59,15,
-129,62,161,92,228,221,0,229,72,6,224,145,33,2,70,97,108,2,115,101,
-34,228,226,3,228,155,14,2,52,55,32,224,55,3,2,61,61,34,228,150,
-16,83,193,228,119,9,99,5,64,29,136,204,99,48,2,90,32,90,239,237,
-0,130,101,148,229,2,48,49,51,151,108,231,193,4,162,151,149,197,234,198,
-0,133,245,165,244,121,123,233,64,4,246,10,0,228,127,1,2,49,52,56,
-231,194,0,43,2,32,17,2,53,54,55,153,48,151,90,54,73,2,51,32,
-35,139,21,43,148,67,114,152,54,248,86,2,65,154,87,215,184,66,66,88,
-224,240,1,197,91,96,40,137,116,245,148,8,2,111,108,34,129,15,133,196,
-2,66,32,89,128,229,52,38,2,50,48,50,224,47,2,2,102,111,108,2,
-100,114,49,235,92,2,132,122,110,148,240,140,2,224,10,2,241,203,0,64,
-94,134,4,242,77,1,228,104,9,247,191,5,98,95,65,249,100,64,165,90,
-98,20,64,77,244,131,0,248,35,3,203,203,224,137,9,241,202,1,95,64,
-2,53,55,56,97,43,142,48,228,251,89,241,197,0,228,251,0,102,223,68,
-252,238,147,3,64,9,246,229,0,228,247,2,196,4,218,196,109,180,173,185,
-197,196,232,214,8,96,108,130,155,227,177,0,102,83,65,76,207,43,96,233,
-2,53,54,51,162,121,176,30,229,170,9,224,174,12,2,116,111,69,224,172,
-42,227,72,4,243,189,9,192,118,224,172,8,175,151,228,245,0,224,184,11,
-228,56,1,175,179,231,172,9,231,32,21,224,207,1,98,100,135,195,38,34,
-72,44,67,126,102,7,198,13,64,33,239,155,0,231,131,31,248,252,3,235,
-188,1,163,45,239,66,10,226,146,9,236,56,8,255,118,6,236,87,33,246,
-153,11,254,241,21,230,255,1,246,120,2,142,248,244,189,5,237,40,16,192,
-80,2,82,32,64,230,72,1,237,92,22,224,27,1,32,53,61,0,228,8,
-0,230,40,2,226,152,3,2,109,97,120,97,102,209,218,224,25,2,2,105,
-110,66,224,25,1,229,169,6,194,37,115,103,134,17,240,64,0,66,158,255,
-192,1,129,8,166,30,165,248,2,52,51,53,113,62,229,164,5,226,175,3,
-130,50,81,162,254,6,0,225,139,0,241,128,14,244,164,7,2,95,50,52,
-97,174,251,149,0,246,166,5,223,111,192,115,196,177,247,75,3,245,249,6,
-209,169,2,51,51,53,198,196,230,226,1,2,95,57,50,166,218,160,17,64,
-39,160,54,46,241,32,201,230,242,0,34,233,2,52,50,57,255,172,0,42,
-177,32,45,81,121,32,171,160,20,64,60,67,56,193,71,85,206,227,151,2,
-226,90,1,160,117,238,209,11,161,114,242,50,8,224,157,5,225,107,0,136,
-0,2,85,32,66,132,129,166,121,2,57,57,57,224,168,0,225,89,0,2,
-49,48,53,170,122,172,16,161,204,149,11,124,112,128,11,94,195,64,14,160,
-20,224,126,3,192,207,64,122,223,62,2,90,32,95,130,3,64,20,135,171,
-52,37,229,20,0,96,4,32,111,2,49,57,32,65,185,33,66,192,64,135,
-174,229,219,6,253,222,8,228,218,0,161,198,253,226,34,224,234,2,244,165,
-12,247,137,1,254,12,6,64,157,136,44,255,168,75,230,40,1,214,70,255,
-79,1,173,78,102,42,239,70,2,160,200,64,176,255,156,11,224,81,42,160,
-77,192,237,136,187,129,98,192,58,223,206,131,100,255,206,7,82,14,65,175,
-54,82,2,95,56,54,65,85,109,188,131,8,183,90,2,89,32,66,41,101,
-64,113,231,46,11,32,4,249,250,1,167,64,41,154,231,64,2,64,24,224,
-57,1,248,32,0,232,22,1,205,70,116,11,250,65,1,228,142,4,137,72,
-228,142,0,160,8,228,119,3,228,154,15,237,182,1,249,99,2,224,19,5,
-253,84,5,253,87,4,241,53,0,162,225,253,84,11,224,51,6,224,2,0,
-67,178,229,8,6,233,227,4,231,70,7,250,239,1,192,22,224,223,0,201,
-178,227,103,6,2,49,51,48,39,218,226,76,4,252,138,1,229,103,6,128,
-56,2,57,51,49,228,164,0,2,51,50,49,98,79,225,114,4,250,57,9,
-122,91,160,5,251,233,1,167,111,250,34,8,2,95,53,48,229,214,1,253,
-145,5,225,252,12,192,7,224,119,2,64,143,160,57,233,121,21,101,105,65,
-1,164,187,132,223,75,52,146,195,239,49,1,251,100,7,225,73,0,253,156,
-13,224,100,25,167,48,192,95,207,235,139,184,230,98,3,192,48,250,167,3,
-226,7,1,224,2,3,172,132,226,210,1,236,151,0,253,73,3,200,231,233,
-49,6,224,41,8,232,249,2,254,157,8,231,128,7,245,239,3,245,162,0,
-248,34,2,144,56,183,159,168,139,32,22,137,141,100,154,247,219,0,119,215,
-247,214,1,162,117,225,64,10,206,145,231,94,7,225,122,6,249,77,10,178,
-100,2,51,50,55,241,31,1,232,255,2,239,219,6,160,116,233,136,2,255,
-92,17,193,91,234,44,3,225,95,14,253,155,8,225,110,89,128,61,225,110,
-68,225,10,8,227,213,2,254,244,5,225,138,22,131,109,227,244,78,130,246,
-227,212,0,228,3,47,228,4,8,224,12,3,229,119,0,196,16,247,19,23,
-249,46,8,128,69,227,254,8,71,93,2,56,53,32,232,8,8,228,86,20,
-228,51,11,226,193,3,192,39,71,193,78,83,130,77,136,36,2,48,48,53,
-251,89,1,233,90,1,62,67,2,83,101,108,2,69,114,114,2,111,114,34,
-128,98,241,247,3,252,220,9,71,116,214,28,195,93,224,33,0,2,95,51,
-53,2,53,32,102,224,91,0,2,103,101,116,206,41,224,70,3,64,66,142,
-121,254,208,2,2,101,116,70,2,105,101,108,183,114,66,55,242,21,2,66,
-78,224,42,1,2,46,83,101,224,43,0,96,44,243,39,7,32,118,224,75,
-3,138,202,42,200,99,49,64,17,242,115,5,224,93,6,2,72,97,115,224,
-93,4,242,119,12,2,82,101,99,2,111,114,100,2,115,34,32,96,34,210,
-122,97,17,148,231,98,253,159,1,67,183,193,46,128,28,128,6,64,26,136,
-190,2,85,32,67,231,40,1,226,0,7,227,168,16,64,63,255,185,1,83,
-230,246,65,3,234,178,0,98,236,234,178,15,98,163,67,132,231,175,3,230,
-90,7,233,68,19,230,112,8,233,2,5,228,211,0,195,15,230,216,3,249,
-34,2,228,93,5,244,171,3,2,51,49,55,237,49,11,195,44,160,113,252,
-165,8,240,104,1,232,202,0,2,95,57,55,2,48,32,35,145,106,97,83,
-33,34,105,201,177,252,176,255,2,90,32,75,64,34,160,6,64,4,160,10,
-2,95,49,55,2,57,32,102,226,7,0,2,92,51,52,2,38,115,114,2,
-99,47,77,2,105,99,114,2,111,72,115,2,47,84,121,2,112,101,67,2,
-104,101,99,2,107,46,104,2,115,92,51,2,52,38,44,2,49,49,54,2,
-56,58,50,2,53,34,32,225,40,1,64,206,97,195,237,111,4,225,111,10,
-109,210,240,218,5,243,153,2,224,2,0,171,27,146,24,128,239,133,234,224,
-5,4,64,3,224,98,2,189,236,229,227,6,224,17,9,234,229,0,241,113,
-2,225,39,16,226,9,11,230,246,0,226,31,6,253,252,2,224,247,4,234,
-192,21,245,181,1,231,69,1,167,66,2,57,56,50,230,231,3,229,188,5,
-235,61,1,174,167,239,154,3,239,144,14,231,27,18,224,168,3,2,95,51,
-51,99,235,101,96,2,56,53,57,229,221,0,237,26,1,206,93,178,191,213,
-140,66,117,225,71,12,225,78,0,236,254,12,119,203,225,108,6,178,91,186,
-129,96,168,248,3,1,224,171,2,139,127,100,8,79,249,96,124,166,21,229,
-242,3,230,32,8,2,110,111,77,2,101,116,104,2,111,100,69,230,34,1,
-235,204,0,224,248,22,130,65,226,78,5,227,149,2,243,216,5,238,10,1,
-224,248,10,225,36,12,193,13,163,157,2,50,56,49,224,28,2,33,208,240,
-107,0,96,30,210,253,224,162,25,247,109,4,226,238,15,252,130,9,101,184,
-162,136,224,161,6,165,173,221,49,146,34,96,5,45,120,34,119,2,57,49,
-57,230,131,3,2,80,114,105,2,109,105,116,48,234,2,115,46,61,2,62,
-34,32,160,62,64,35,128,62,105,66,101,183,252,49,3,169,41,128,29,242,
-208,6,224,25,19,96,91,135,67,228,123,0,2,56,57,55,244,206,2,2,
-51,49,54,99,60,105,220,150,153,229,109,0,2,95,52,49,120,223,2,48,
-55,54,182,85,69,176,71,94,64,8,2,75,32,85,228,216,4,246,45,0,
-228,244,10,228,6,0,237,15,3,224,32,23,224,29,20,32,198,233,40,0,
-64,152,135,247,135,109,231,31,0,147,219,255,3,0,126,222,53,117,183,5,
-64,42,230,173,9,65,12,35,44,231,26,18,164,94,146,116,230,189,11,73,
-254,225,128,3,243,47,1,224,81,6,34,83,205,80,196,196,118,92,129,120,
-96,59,200,127,225,186,2,32,95,193,181,97,158,129,181,64,44,136,141,225,
-157,6,250,112,2,225,142,81,224,26,17,224,23,14,224,20,11,224,17,8,
-224,14,5,225,242,3,225,91,0,137,101,226,220,0,2,57,53,53,250,214,
-1,248,162,2,36,66,39,225,229,75,1,225,240,2,101,69,65,79,128,15,
-77,213,104,72,252,12,8,71,94,243,74,1,70,199,190,245,225,212,5,2,
-57,48,52,241,123,1,224,61,0,64,46,35,153,96,12,234,19,0,243,236,
-1,221,131,2,57,51,52,109,101,2,49,48,32,105,247,195,138,226,210,1,
-98,102,57,248,102,224,225,15,1,32,13,121,130,224,121,0,224,225,1,32,
-145,150,220,232,116,6,65,62,202,100,51,190,133,34,197,170,169,201,247,160,
-1,245,64,2,98,163,224,33,19,69,13,230,231,1,224,190,4,192,25,36,
-224,101,86,227,41,0,224,44,10,160,104,181,41,32,42,248,122,1,224,43,
-9,224,42,1,229,56,1,171,147,229,170,0,64,241,197,168,139,27,128,182,
-232,82,6,232,135,0,33,190,192,13,97,250,235,82,2,128,125,225,198,0,
-103,124,66,2,2,50,56,54,64,109,243,95,0,224,96,33,34,32,70,57,
-96,103,233,91,2,224,56,40,234,72,2,240,134,0,131,63,2,52,50,49,
-246,56,0,34,140,193,7,85,186,242,142,1,195,111,199,39,32,201,78,98,
-78,1,2,50,55,53,240,191,1,224,252,18,2,95,51,50,254,130,4,245,
-38,5,177,86,241,51,8,192,178,150,193,225,235,0,233,247,2,224,60,0,
-241,110,9,224,52,5,245,251,7,234,88,6,224,44,4,225,103,3,245,72,
-3,224,36,3,32,17,101,242,224,234,8,32,233,130,190,161,99,193,106,130,
-114,65,102,135,124,138,42,227,97,0,203,205,245,122,4,227,73,12,103,170,
-227,140,20,131,80,237,43,1,224,33,9,195,26,227,51,9,227,52,2,248,
-65,6,37,4,217,15,228,243,2,98,8,67,82,228,123,4,163,204,237,217,
-4,247,1,0,224,87,9,97,48,64,73,2,50,48,48,128,17,131,230,228,
-159,6,225,25,0,235,98,2,128,208,174,245,131,233,231,201,0,246,176,2,
-139,41,64,89,231,93,3,249,35,7,58,80,34,219,224,127,1,227,115,11,
-167,233,247,207,2,233,149,3,224,28,7,225,3,33,131,38,32,8,176,79,
-224,249,2,225,113,5,161,155,238,1,2,148,48,224,91,14,100,118,33,91,
-249,242,3,224,16,11,231,30,7,97,216,2,53,55,32,234,168,2,2,102,
-117,110,2,100,101,112,106,161,49,95,238,176,10,226,24,4,98,157,226,132,
-3,238,80,20,253,203,1,231,0,0,44,118,141,191,226,24,1,194,98,224,
-45,11,33,58,157,137,224,46,9,224,171,9,226,251,11,131,88,193,94,225,
-184,4,224,101,0,96,102,224,149,15,226,164,4,172,94,231,8,9,227,190,
-23,130,56,224,159,10,192,24,160,159,224,255,8,111,68,224,152,14,231,119,
-11,231,30,11,227,41,7,226,211,0,252,131,2,44,191,111,38,2,51,48,
-49,161,93,246,121,1,230,221,0,224,59,1,253,102,6,231,48,0,227,169,
-60,225,122,2,242,75,6,227,137,7,224,201,9,64,183,161,211,2,51,48,
-53,128,202,227,20,5,224,172,134,134,120,234,114,8,160,172,224,187,8,226,
-248,6,229,169,2,2,50,57,52,202,43,228,236,0,70,153,141,202,128,192,
-2,80,32,35,201,152,135,253,68,72,64,36,141,86,229,108,3,248,227,6,
-76,236,2,54,51,32,128,112,32,127,2,57,54,52,106,114,2,52,50,32,
-229,84,3,225,72,3,225,78,5,2,57,56,49,232,239,13,229,123,9,247,
-124,5,225,68,27,96,27,229,103,1,253,154,4,69,1,2,56,57,49,230,
-250,8,2,51,54,54,225,122,9,227,136,15,197,112,33,95,107,190,41,33,
-231,27,6,224,91,6,236,73,10,231,127,0,202,89,228,140,13,160,123,32,
-102,64,116,138,96,224,121,18,233,232,0,238,125,1,173,72,225,227,7,246,
-226,3,34,8,227,184,1,224,36,3,142,90,48,48,2,57,57,52,130,222,
-32,117,64,24,237,128,1,32,59,97,244,32,50,64,24,248,73,1,32,24,
-97,114,160,24,235,129,1,96,26,197,137,224,111,3,101,118,96,36,46,189,
-96,4,83,10,64,23,208,204,232,150,14,130,223,64,40,226,222,3,96,103,
-186,175,225,8,14,96,51,194,237,237,2,0,255,22,6,238,81,5,2,49,
-53,57,239,90,3,122,239,160,13,111,115,234,77,2,229,112,7,194,244,197,
-51,192,95,231,149,5,161,242,161,235,224,103,5,254,221,13,238,116,6,224,
-40,3,236,71,4,232,79,0,33,200,2,54,48,32,250,24,5,80,150,100,
-13,116,2,2,50,50,53,124,233,160,26,36,251,2,85,32,65,160,91,232,
-24,11,97,72,130,115,46,205,2,49,32,58,128,59,64,14,85,113,58,70,
-64,105,37,37,243,20,13,2,67,111,110,2,115,116,114,2,97,105,110,154,
-94,64,61,249,99,1,66,157,96,153,98,73,106,74,96,25,64,23,65,80,
-33,26,64,22,130,121,251,32,0,203,123,248,49,0,247,77,12,255,158,2,
-244,44,1,231,208,14,212,94,224,39,17,226,108,2,231,139,8,224,27,2,
-131,241,98,227,244,114,1,2,83,32,66,225,209,3,147,83,230,67,5,96,
-177,249,99,5,146,248,245,2,28,254,126,0,245,0,23,228,138,3,78,37,
-224,15,1,148,144,245,22,2,2,83,32,79,97,100,32,5,181,174,215,220,
-245,47,9,232,163,25,212,71,250,79,0,227,175,0,232,101,12,254,113,7,
-225,54,1,161,154,250,249,8,160,96,250,148,7,225,87,10,193,88,242,183,
-4,224,105,77,128,29,201,77,154,40,2,50,56,50,245,207,1,249,222,0,
-231,241,8,180,219,244,181,18,251,83,0,64,83,165,53,244,185,4,246,69,
-0,244,208,8,166,160,32,201,236,56,9,227,92,0,104,2,140,217,38,140,
-104,4,228,27,2,64,116,247,179,3,82,193,2,50,32,83,120,201,2,90,
-32,67,250,12,0,226,83,1,255,14,7,67,216,230,57,3,252,183,15,241,
-112,3,64,117,111,179,189,160,248,216,0,128,227,160,86,32,152,230,42,3,
-253,16,16,253,51,16,179,241,244,214,7,179,119,128,22,226,201,0,227,219,
-1,101,136,145,172,64,168,185,221,185,246,73,87,84,11,195,70,227,138,2,
-169,63,97,175,2,50,56,55,224,211,9,224,69,17,96,238,248,15,1,222,
-29,247,240,1,146,33,58,252,88,190,41,40,32,4,222,145,96,106,224,56,
-8,32,230,224,52,21,199,83,248,125,18,2,50,56,51,248,125,18,2,50,
-56,52,166,9,66,182,119,228,34,58,2,75,52,32,2,90,32,90,160,1,
-252,71,1,64,37,166,109,248,163,9,227,138,0,247,11,154,246,236,6,64,
-215,199,7,33,94,97,24,70,242,64,23,135,5,79,228,137,154,2,50,56,
-48,128,24,135,7,43,7,65,100,2,48,50,49,231,114,3,2,100,102,108,
-103,97,64,39,131,86,228,32,1,228,149,1,64,108,104,31,227,140,4,247,
-25,22,235,43,24,2,50,55,56,202,177,2,57,50,50,227,34,0,255,25,
-7,78,217,128,29,230,212,1,246,158,5,200,213,230,66,0,237,152,1,235,
-75,2,252,110,5,161,77,88,13,147,152,150,41,236,202,25,171,125,216,98,
-64,198,66,202,64,75,243,228,0,244,61,0,237,26,20,178,111,64,65,107,
-68,96,72,168,177,225,90,7,96,37,68,105,225,24,1,64,48,131,85,231,
-213,1,224,9,1,161,196,232,212,0,245,217,5,232,221,2,226,118,0,232,
-184,4,194,116,231,121,1,224,46,20,122,167,224,47,4,201,20,224,47,14,
-243,222,2,245,165,1,224,47,18,197,124,224,198,8,233,161,16,133,3,233,
-122,13,224,28,3,239,233,11,235,159,6,235,59,8,225,153,8,64,45,130,
-230,226,183,2,251,253,1,232,179,2,245,122,6,230,84,5,104,79,224,36,
-0,193,23,96,29,240,124,7,157,139,131,168,64,19,121,24,125,251,199,67,
-66,112,2,53,54,48,98,72,121,0,32,32,193,214,124,155,254,144,4,2,
-36,120,34,224,172,4,197,218,187,40,227,228,3,240,232,5,96,144,240,161,
-7,2,57,57,55,225,97,1,251,133,10,2,48,48,50,67,142,144,221,226,
-4,4,174,208,230,230,8,224,248,6,172,143,2,48,48,57,195,132,248,40,
-0,226,178,3,226,82,19,213,238,225,154,15,224,31,5,97,154,248,64,5,
-225,23,5,143,131,97,102,239,131,6,248,247,3,237,217,6,248,214,2,161,
-24,2,54,49,32,199,199,2,49,49,52,240,64,4,224,132,8,225,35,8,
-224,141,3,171,31,64,69,126,199,78,168,237,226,0,2,55,54,54,96,89,
-203,141,139,90,248,146,2,64,58,128,5,64,3,244,226,4,241,195,11,225,
-219,2,2,57,57,53,231,95,7,142,170,224,66,20,224,72,19,231,24,4,
-160,75,228,8,5,233,10,1,201,89,225,243,3,225,112,5,33,99,2,53,
-56,32,224,66,15,242,126,3,233,234,12,228,84,4,161,179,160,79,242,152,
-7,239,146,5,97,70,224,78,0,235,241,4,64,66,243,119,1,228,69,5,
-41,206,47,41,232,1,1,243,70,8,224,225,7,226,54,0,224,141,5,228,
-187,15,160,44,224,120,28,229,214,2,227,80,11,165,84,227,124,5,237,172,
-11,237,173,9,228,243,13,228,252,3,228,242,2,128,242,228,237,7,131,143,
-157,233,221,242,203,235,228,240,21,192,133,228,116,5,192,112,229,62,1,224,
-76,0,238,143,25,242,100,4,228,58,10,86,26,2,55,48,57,248,22,3,
-236,18,3,231,61,9,130,246,250,117,4,239,209,10,137,2,65,53,235,12,
-0,192,198,173,86,97,36,166,220,82,183,225,15,1,2,98,97,100,2,32,
-102,105,2,110,97,108,2,32,100,111,2,32,115,116,2,97,116,101,2,109,
-101,110,145,125,238,200,13,224,16,6,232,38,1,232,44,2,232,15,4,229,
-140,5,144,114,224,74,5,233,134,0,226,162,0,34,145,101,17,254,70,16,
-235,62,1,128,11,224,131,0,226,65,5,224,8,36,226,110,3,247,185,2,
-228,111,10,243,77,4,243,121,1,130,133,246,141,1,160,15,238,128,10,108,
-254,2,53,48,53,229,244,0,205,188,236,19,8,226,243,11,224,32,4,34,
-226,2,56,49,54,230,86,7,227,248,3,76,1,244,51,3,78,26,162,53,
-103,118,240,110,1,2,49,52,48,180,220,2,54,50,32,32,8,168,80,103,
-158,128,56,66,195,147,201,2,54,56,52,168,1,224,58,2,97,221,129,203,
-96,252,192,246,80,109,77,224,252,96,2,2,97,105,108,162,101,110,70,2,
-55,55,50,79,80,76,230,2,64,64,102,226,158,1,2,105,110,100,160,38,
-64,140,63,125,226,22,1,224,83,8,2,62,62,61,128,43,227,246,10,2,
-98,34,32,226,77,2,32,162,226,79,0,226,13,27,245,167,5,163,79,225,
-238,61,225,108,0,224,207,11,225,33,0,231,61,9,229,25,4,64,59,2,
-51,50,32,224,78,3,242,177,15,196,150,229,213,21,169,5,228,241,11,252,
-193,10,229,25,25,232,28,4,229,251,4,232,17,9,225,118,3,96,17,32,
-2,109,69,77,78,225,29,1,2,70,114,111,2,109,84,104,2,101,110,84,
-2,111,34,32,227,174,1,176,249,32,10,84,145,227,51,4,224,125,23,224,
-119,0,160,72,224,115,18,162,102,224,101,83,160,213,224,99,13,225,151,24,
-163,37,225,151,24,162,42,224,179,16,231,14,1,98,100,224,169,11,96,167,
-224,159,4,230,255,9,229,189,1,233,81,4,228,146,0,86,94,253,40,7,
-148,30,232,208,5,234,40,9,232,191,7,135,100,2,51,55,51,227,238,1,
-238,201,6,224,17,1,225,19,2,198,149,243,193,4,243,231,0,148,209,226,
-100,3,236,12,2,233,136,6,179,154,2,49,52,51,177,65,2,50,56,32,
-123,49,227,149,0,236,121,5,236,229,1,154,200,224,184,1,196,141,100,145,
-240,203,4,128,41,224,147,0,230,130,2,224,136,0,117,234,96,132,236,3,
-13,172,2,97,215,128,99,213,120,118,5,224,85,5,64,158,34,9,141,243,
-224,51,11,2,50,49,51,235,103,0,133,161,247,41,10,250,186,5,231,67,
-14,248,213,6,235,220,3,205,30,2,54,56,32,225,89,12,226,10,9,84,
-158,246,237,0,230,57,1,247,201,14,225,239,10,254,150,9,243,33,5,224,
-163,39,241,227,12,128,248,255,210,3,173,189,129,186,243,141,2,96,204,32,
-5,232,162,1,235,166,9,241,128,20,194,50,241,79,32,247,86,6,228,71,
-16,239,247,2,238,175,9,227,33,5,141,8,208,72,2,55,55,53,240,72,
-12,238,77,6,252,246,25,249,182,7,225,149,5,226,103,0,225,158,2,162,
-48,2,48,49,51,218,206,2,55,55,48,64,146,160,244,225,125,4,33,117,
-215,206,241,40,4,180,231,227,33,7,242,57,44,167,194,238,232,17,232,127,
-1,231,89,7,236,204,1,229,67,4,239,88,10,224,41,4,164,197,235,120,
-5,215,136,232,234,2,254,149,4,226,174,8,117,213,2,50,55,32,227,132,
-11,234,156,2,225,207,9,236,73,2,249,94,18,196,90,241,81,4,236,2,
-1,224,18,4,236,132,3,236,155,4,198,77,224,69,6,242,136,5,227,60,
-11,245,74,0,227,100,6,227,109,5,247,222,8,233,77,11,237,25,8,224,
-67,35,255,100,2,248,49,4,242,192,7,224,39,14,209,64,237,209,10,242,
-222,19,241,195,1,246,70,8,237,215,8,241,255,14,225,75,4,243,106,4,
-224,245,9,224,50,6,215,239,224,70,6,242,78,1,224,75,0,237,61,1,
-224,244,21,224,79,69,225,2,6,243,69,0,247,245,1,157,187,67,30,243,
-211,6,210,73,224,40,8,2,51,48,32,199,73,2,50,51,53,229,232,7,
-229,85,16,100,191,99,226,237,115,0,199,184,237,121,7,32,9,2,83,116,
-114,2,105,110,103,245,250,0,240,110,8,224,99,2,236,244,2,228,196,5,
-2,48,53,50,233,50,6,225,189,6,223,25,227,109,6,228,162,2,212,248,
-86,178,214,58,239,4,11,226,228,8,227,80,1,224,125,10,245,41,10,226,
-210,95,226,54,0,224,50,16,193,245,225,247,6,2,51,53,53,69,68,230,
-0,2,230,67,3,162,10,69,89,2,50,51,54,102,105,2,51,55,32,32,
-5,2,54,55,32,226,27,45,239,143,9,32,9,2,82,97,116,2,105,111,
-110,2,97,108,34,226,23,159,247,191,11,228,254,23,228,237,7,226,32,16,
-226,33,13,230,118,0,228,83,3,197,191,228,123,21,226,45,17,246,234,18,
-243,92,3,210,243,230,35,4,226,73,7,34,20,254,58,1,236,253,4,224,
-67,35,73,8,249,88,9,233,116,7,225,10,8,224,73,11,229,230,8,227,
-2,14,32,42,226,253,0,228,251,1,227,6,21,33,176,32,11,157,146,160,
-238,246,77,4,64,40,32,127,32,49,2,56,51,48,192,48,160,219,82,36,
-128,20,2,50,54,57,232,74,5,224,108,5,224,58,9,227,111,62,2,73,
-110,116,2,101,103,101,2,114,34,32,227,110,148,193,139,159,132,2,95,50,
-52,105,220,44,73,2,95,49,55,248,190,1,252,27,2,2,49,55,49,173,
-10,224,171,3,32,100,2,51,56,32,96,7,199,11,227,82,5,194,65,135,
-160,233,101,13,233,27,23,233,21,25,234,128,18,160,136,226,68,0,169,252,
-193,30,148,162,226,54,1,2,57,50,52,227,191,8,228,142,17,224,119,67,
-232,21,2,216,78,79,206,248,90,0,250,229,16,237,239,2,242,1,6,132,
-157,188,11,234,184,6,96,180,67,158,135,117,255,61,9,226,148,9,2,49,
-56,52,253,182,3,229,77,13,250,39,15,238,74,19,236,217,19,227,63,13,
-252,47,12,227,66,30,236,90,9,197,62,240,24,8,240,197,0,240,206,4,
-253,247,21,228,168,4,129,235,2,57,55,48,246,167,6,248,113,16,251,208,
-12,192,96,128,249,96,248,249,62,2,229,191,2,226,161,0,2,50,49,32,
-225,111,2,183,204,224,178,2,210,207,2,48,55,32,192,75,85,97,45,76,
-179,238,97,45,2,90,32,95,224,53,4,32,146,196,74,46,42,133,56,231,
-155,3,225,171,9,228,12,0,237,129,6,37,127,35,104,66,74,240,188,2,
-253,111,4,228,60,3,47,166,128,101,226,51,4,226,45,4,37,200,99,38,
-242,1,10,243,65,5,2,32,73,32,224,107,2,225,48,6,242,104,5,32,
-69,176,8,208,216,41,210,41,162,132,246,239,0,2,255,247,12,216,206,2,
-56,52,51,2,32,64,80,64,7,69,93,223,172,226,179,9,179,120,83,121,
-115,210,2,51,56,52,163,109,129,34,225,241,0,241,20,4,226,23,1,129,
-175,164,45,64,160,64,132,240,237,5,252,244,1,209,10,66,24,2,50,48,
-50,160,41,32,211,51,233,65,151,2,53,54,32,230,214,2,2,116,99,69,
-2,120,112,114,2,58,32,99,2,97,110,110,2,111,116,32,2,104,97,110,
-2,100,108,101,2,58,32,34,193,147,154,140,135,193,64,232,138,252,244,151,
-2,224,92,9,2,79,32,35,75,22,130,109,192,55,229,122,0,224,60,3,
-2,58,49,50,82,77,2,10,65,32,160,67,2,48,50,51,102,221,65,178,
-64,28,32,53,32,28,161,169,240,243,8,230,198,6,2,57,56,51,240,220,
-1,32,99,2,49,51,56,96,116,64,72,32,25,64,101,2,57,50,48,96,
-201,32,14,64,21,32,165,224,21,3,32,14,64,21,32,123,224,21,2,64,
-105,64,21,35,15,32,21,225,56,1,2,80,114,105,2,109,105,116,2,105,
-118,101,2,115,46,87,2,111,114,100,33,48,32,37,64,44,224,81,3,32,
-191,64,21,32,135,96,227,2,50,51,56,200,254,32,6,59,128,64,12,64,
-247,2,50,54,54,129,218,2,50,53,57,236,38,0,2,95,54,32,64,50,
-32,82,236,62,1,96,38,64,82,32,32,224,82,4,149,213,2,53,55,32,
-224,68,2,150,163,233,226,1,2,56,52,55,40,48,137,167,64,31,136,66,
-224,31,17,134,197,224,31,14,68,36,32,35,2,53,32,80,32,19,91,187,
-2,95,53,52,224,57,4,130,61,224,223,3,150,216,192,174,50,46,64,219,
-224,21,9,156,211,96,199,224,59,0,160,110,128,230,224,45,1,33,253,2,
-51,32,35,131,146,2,38,48,46,224,56,11,224,45,13,224,44,31,96,36,
-192,44,65,119,32,37,33,119,2,83,32,83,192,1,32,228,67,20,208,169,
-212,96,68,142,242,140,0,71,43,151,130,192,11,64,112,34,28,146,228,2,
-85,32,65,32,47,2,85,32,75,243,55,4,249,210,0,231,183,2,64,57,
-67,49,68,18,64,51,97,59,32,125,224,59,1,86,116,107,64,224,32,15,
-220,224,224,38,23,224,34,29,224,244,95,39,46,224,245,128,224,246,11,231,
-251,8,230,206,2,224,246,19,224,184,27,224,144,27,38,33,133,13,2,50,
-54,48,128,37,67,131,224,232,21,224,51,9,34,249,225,102,20,224,53,0,
-43,8,129,231,224,60,3,69,132,224,59,16,136,147,226,186,18,227,202,3,
-233,175,0,224,94,4,226,247,19,224,94,36,67,199,134,118,2,66,32,89,
-192,201,204,179,237,197,3,128,27,130,128,71,234,160,76,224,108,18,64,13,
-192,108,202,24,234,215,2,64,97,226,217,0,224,93,2,37,88,224,92,45,
-225,133,31,128,58,224,185,42,235,52,2,194,244,226,90,14,160,98,224,32,
-25,138,61,225,119,2,236,97,0,192,199,96,52,88,70,192,52,224,15,11,
-2,50,54,51,224,85,2,65,211,136,45,195,139,193,103,33,225,235,81,1,
-225,225,19,38,226,96,181,65,134,128,179,225,48,10,160,24,225,39,5,131,
-244,65,220,32,166,237,222,0,227,81,9,192,85,224,25,17,64,198,168,171,
-97,11,134,145,2,53,55,52,230,189,4,224,125,1,64,47,168,197,224,47,
-13,96,162,224,47,5,136,223,129,5,2,115,101,113,140,120,96,8,76,36,
-96,34,136,236,43,157,103,29,225,5,1,64,15,125,31,224,138,0,32,45,
-75,157,32,45,2,85,32,90,32,1,98,195,64,20,136,243,2,102,47,32,
-64,12,136,173,65,90,224,33,2,135,74,71,61,169,12,38,217,200,5,233,
-31,0,37,247,224,19,7,80,207,224,18,2,2,53,51,32,232,29,2,224,
-18,0,97,95,224,20,8,35,29,224,19,1,233,95,2,232,128,2,96,155,
-132,30,32,176,2,52,32,90,224,177,1,130,96,165,52,104,188,99,19,43,
-124,74,121,64,33,161,187,160,211,78,32,32,6,137,155,68,64,64,6,70,
-10,137,84,73,78,32,16,64,71,168,98,112,21,224,204,3,76,196,115,120,
-34,21,224,43,6,224,39,2,2,38,49,46,232,168,3,160,14,64,28,139,
-71,64,35,96,206,171,73,128,140,2,80,32,38,96,40,128,162,128,59,192,
-73,2,64,89,32,82,62,160,80,253,53,0,224,211,0,2,53,48,32,194,
-198,32,74,128,16,2,95,54,56,227,225,0,64,116,130,103,2,105,116,111,
-2,102,32,58,128,49,97,26,42,175,2,56,53,49,65,53,33,65,192,211,
-64,7,171,21,151,46,69,17,64,6,66,109,138,206,128,39,98,227,128,11,
-32,84,64,7,66,101,2,62,61,32,64,13,162,115,2,62,32,58,128,64,
-64,12,2,60,61,32,64,13,130,108,2,102,60,32,64,12,129,221,2,102,
-110,101,2,103,32,58,129,145,64,14,2,42,32,58,129,24,64,12,2,45,
-32,58,129,185,64,12,2,43,32,58,128,249,161,253,225,255,1,237,164,0,
-226,8,3,226,15,1,74,202,32,51,2,73,32,58,128,47,224,63,0,239,
-3,0,64,8,163,117,76,174,130,116,2,50,32,65,160,18,128,196,65,138,
-113,247,39,124,64,21,128,204,210,23,242,37,0,147,137,243,133,9,243,130,
-12,193,171,243,7,14,224,30,5,239,116,0,83,1,253,245,7,2,57,55,
-52,237,234,0,199,191,224,85,14,212,171,224,85,46,175,142,160,216,192,25,
-208,84,198,161,166,87,243,59,17,225,54,6,224,32,3,128,115,247,121,1,
-244,185,14,244,176,16,175,171,70,203,2,57,50,56,110,203,69,216,246,186,
-2,2,50,57,32,233,75,3,2,90,32,67,224,27,10,224,95,10,198,56,
-224,51,7,250,129,1,244,16,12,181,217,224,53,8,187,144,224,25,10,245,
-36,1,208,113,66,114,163,50,238,254,11,55,21,142,253,64,58,224,36,4,
-2,68,97,116,2,97,46,73,151,52,2,95,84,121,2,112,101,46,247,65,
-1,64,47,163,107,224,84,11,2,70,108,111,2,97,116,87,160,39,131,134,
-241,136,1,134,187,145,141,48,79,64,227,181,116,64,45,239,191,5,65,83,
-64,21,239,191,18,2,67,104,97,160,145,64,44,224,59,1,2,48,49,48,
-128,21,131,152,194,178,243,177,3,145,103,103,191,99,243,244,5,4,242,196,
-4,2,50,49,55,240,178,0,242,137,1,67,250,96,181,2,50,55,32,232,
-188,0,242,9,6,2,95,57,54,101,109,237,18,2,224,89,2,105,110,88,
-233,96,14,100,153,2,48,49,32,161,21,128,14,33,24,133,206,70,200,227,
-29,1,244,205,0,100,37,197,227,185,233,66,65,166,249,160,6,243,11,1,
-81,160,164,182,224,29,0,104,240,242,253,4,126,202,49,169,32,155,128,140,
-96,142,241,196,1,224,181,1,65,165,162,143,64,10,32,17,65,16,168,30,
-2,54,51,49,97,198,145,74,64,28,66,10,32,1,2,80,32,90,32,5,
-52,218,160,164,52,118,32,92,192,106,37,67,50,141,96,11,224,10,1,64,
-64,170,36,32,1,2,80,32,83,161,81,242,90,4,70,109,160,69,225,241,
-1,36,161,247,56,10,242,106,8,245,145,12,2,95,55,51,222,254,224,112,
-12,121,125,224,106,1,196,198,148,160,181,15,246,80,2,244,36,5,224,149,
-0,98,134,128,127,72,125,121,240,218,52,2,95,50,55,32,159,64,7,71,
-133,2,95,51,55,101,135,224,15,7,138,237,2,57,53,57,227,83,0,243,
-170,2,227,56,1,2,101,120,105,2,115,116,101,2,110,116,105,2,97,108,
-115,2,32,110,111,2,116,32,97,2,108,108,111,2,119,101,100,2,32,105,
-110,2,32,112,97,2,116,116,101,2,114,110,32,2,98,105,110,2,100,105,
-110,2,103,34,32,255,27,3,227,21,9,114,88,71,113,225,57,15,2,56,
-55,57,226,87,0,74,93,246,179,5,224,17,8,65,223,132,83,107,246,231,
-20,2,249,165,0,247,86,1,246,68,1,229,98,0,247,202,1,163,9,229,
-252,0,68,12,212,114,248,35,4,245,218,7,2,55,53,56,65,50,96,143,
-252,60,2,2,99,110,83,161,12,252,178,3,248,23,9,225,243,0,163,62,
-2,50,49,49,227,228,9,64,22,194,111,111,142,134,205,185,246,225,15,2,
-231,91,3,231,99,2,224,34,3,228,4,0,88,35,248,83,3,2,55,51,
-52,227,65,0,240,206,5,2,55,51,53,108,18,32,49,68,84,160,36,182,
-129,132,42,196,3,118,60,65,227,205,76,160,104,131,18,164,86,240,200,2,
-227,7,1,254,255,1,249,148,6,69,245,166,162,248,5,1,225,70,5,66,
-86,97,146,225,128,4,2,68,34,32,228,162,5,161,203,193,136,131,65,96,
-59,2,57,54,32,228,72,0,225,178,11,249,211,13,248,215,2,225,98,18,
-240,13,0,136,176,200,133,227,243,0,255,246,3,226,159,0,64,112,226,150,
-4,160,19,97,141,33,13,128,92,129,130,161,78,197,181,229,189,0,226,91,
-6,224,58,18,228,165,0,225,233,25,225,210,22,227,19,9,225,227,3,225,
-187,2,162,237,186,219,187,180,67,206,135,250,234,26,5,2,56,57,53,36,
-167,2,48,53,32,224,213,5,229,22,1,102,246,67,205,2,95,49,57,2,
-53,32,85,83,119,225,1,0,227,186,3,229,77,6,32,83,140,139,228,100,
-3,64,132,168,81,2,50,49,54,192,130,2,54,50,54,64,99,100,19,64,
-33,136,93,224,166,18,162,23,128,97,200,192,2,57,55,54,97,103,2,57,
-51,52,193,130,128,113,64,87,96,79,122,167,232,108,9,2,50,49,50,199,
-192,229,85,13,136,109,232,110,8,129,242,160,99,200,213,180,7,231,179,1,
-103,123,224,94,16,228,139,9,186,7,224,106,5,32,133,98,62,192,109,204,
-201,96,109,225,245,5,160,48,233,57,15,134,33,233,57,16,64,126,168,18,
-69,169,2,85,32,95,164,181,224,102,8,96,250,224,124,15,117,200,168,217,
-128,87,168,106,159,229,160,93,251,218,8,126,203,232,224,2,234,34,1,225,
-83,3,134,233,138,33,192,107,128,18,235,109,0,252,204,7,113,114,64,249,
-148,251,103,167,251,118,2,105,111,142,116,32,69,232,11,2,225,195,4,160,
-32,2,50,49,51,171,199,65,3,32,212,71,57,64,167,64,17,135,48,236,
-60,0,147,144,73,94,32,56,129,72,229,42,9,226,108,2,102,255,48,96,
-232,51,10,237,232,7,193,19,226,204,4,225,25,3,235,90,12,130,206,129,
-150,64,26,96,30,225,168,0,128,195,172,32,160,189,81,230,145,156,224,168,
-1,227,152,3,32,30,67,105,227,173,10,52,100,136,3,225,231,8,116,129,
-79,206,100,82,2,95,51,52,255,133,2,224,40,8,252,146,0,129,133,234,
-234,5,76,84,228,17,2,230,41,5,100,203,66,218,135,58,241,77,1,72,
-7,99,63,224,177,1,2,55,49,55,130,40,231,31,4,196,214,43,247,49,
-152,227,164,0,2,48,52,32,158,58,145,207,231,100,9,41,47,231,82,2,
-133,238,192,154,232,7,1,233,1,0,245,65,0,226,21,13,96,127,242,14,
-0,231,1,0,233,134,4,224,81,3,224,1,1,32,58,178,93,230,180,4,
-128,2,226,27,2,235,4,2,64,214,240,89,1,224,49,2,229,220,4,39,
-214,160,36,192,106,226,17,8,224,140,4,226,26,15,231,136,1,233,198,5,
-231,177,4,235,83,0,224,134,8,2,55,49,56,234,101,4,224,162,10,230,
-128,5,64,0,141,93,65,83,139,15,66,16,134,114,50,45,2,51,32,75,
-2,52,32,75,2,52,32,65,192,26,64,36,175,47,214,251,64,156,224,181,
-1,248,133,2,225,191,13,65,252,2,50,48,53,200,190,225,179,0,133,116,
-227,199,7,224,55,7,130,184,226,68,9,134,40,255,182,7,2,52,50,54,
-230,86,9,69,197,192,72,224,49,35,225,51,0,131,166,73,199,66,134,117,
-234,2,48,55,57,228,165,1,227,191,3,225,233,8,2,56,53,32,233,111,
-4,129,51,2,95,50,57,138,205,224,208,0,237,245,0,219,20,160,4,236,
-202,10,224,20,0,2,51,49,48,205,124,64,78,192,21,99,44,224,163,4,
-224,0,1,128,126,139,228,159,137,2,50,57,50,208,136,235,25,3,2,50,
-48,55,234,204,2,228,90,8,33,56,32,93,128,59,2,95,51,51,86,125,
-227,215,0,225,167,9,66,72,200,34,225,33,8,72,184,192,152,225,29,15,
-2,55,48,32,32,35,151,244,64,1,224,149,9,192,17,111,1,225,177,6,
-225,10,13,64,148,136,73,2,95,51,53,2,53,32,102,242,106,5,2,83,
-116,114,46,117,2,46,73,115,128,8,75,240,64,48,176,73,224,48,10,2,
-78,117,109,64,3,192,40,220,20,147,19,165,71,194,118,66,119,32,145,151,
-151,230,14,0,240,129,1,128,66,248,34,1,69,80,229,40,2,35,58,102,
-234,87,119,129,119,237,93,4,227,77,0,163,144,64,52,33,117,224,28,6,
-164,111,192,26,231,93,2,229,39,6,209,125,224,95,1,244,25,2,187,114,
-64,50,134,106,135,75,131,176,224,15,1,224,211,0,184,212,2,57,49,48,
-49,100,113,134,64,32,96,230,169,29,169,35,130,3,231,107,4,149,198,233,
-188,13,228,145,1,234,94,4,162,21,2,57,53,53,230,74,1,103,120,2,
-48,49,56,228,64,2,224,77,6,64,149,247,161,1,2,83,32,73,247,11,
-4,175,243,239,240,14,230,14,8,228,106,0,40,154,65,72,171,202,201,172,
-232,164,2,136,110,101,182,221,139,2,49,57,56,224,242,0,32,55,85,91,
-2,56,48,32,96,38,133,189,75,241,32,10,227,197,0,73,64,91,101,226,
-74,2,179,78,247,39,14,64,7,192,117,160,250,185,93,76,67,57,135,115,
-44,96,110,178,235,228,158,2,32,141,186,230,96,168,131,223,47,84,122,165,
-2,48,49,54,128,58,219,177,145,99,104,242,167,207,64,29,131,81,67,210,
-32,80,138,72,106,132,161,125,224,167,3,152,220,106,232,138,102,96,140,177,
-86,231,61,1,193,163,225,155,0,253,91,1,225,4,2,248,87,1,130,117,
-178,192,2,56,49,57,226,80,2,179,50,243,17,2,244,133,4,238,178,1,
-106,228,193,113,128,95,236,31,2,243,162,3,2,54,55,32,224,57,0,169,
-112,245,159,9,224,156,1,244,229,12,98,27,228,76,0,75,94,216,226,224,
-57,3,245,53,10,227,38,12,65,254,137,202,100,172,242,151,8,64,31,2,
-49,32,35,224,152,3,228,39,1,224,102,0,34,128,229,98,7,245,70,5,
-65,185,131,254,2,75,32,66,230,8,11,175,213,239,133,11,239,47,3,40,
-217,128,235,239,130,23,32,40,160,190,233,2,3,64,134,196,114,37,87,249,
-225,5,177,58,250,244,5,250,241,10,143,18,200,208,224,40,19,226,77,7,
-145,171,250,72,4,165,49,143,159,165,2,233,89,6,72,169,32,216,95,111,
-232,75,9,77,218,128,26,231,50,2,85,165,173,83,177,162,245,141,9,95,
-75,244,90,3,2,116,111,111,2,32,109,97,2,110,121,32,2,97,114,103,
-2,117,109,101,2,110,116,115,244,104,1,224,62,15,224,61,5,2,102,101,
-119,224,60,7,2,95,56,54,227,127,1,250,138,8,161,31,96,253,248,26,
-5,224,37,4,171,0,224,37,7,251,122,15,142,163,224,73,12,192,25,98,
-234,224,111,16,224,36,1,238,68,4,236,40,2,100,10,35,22,112,156,67,
-151,64,228,160,56,227,48,4,128,73,95,164,131,243,68,168,252,53,18,129,
-182,224,32,18,144,122,224,33,20,198,218,224,215,9,234,100,2,249,138,7,
-224,39,4,128,99,225,111,5,229,86,8,231,65,1,211,129,250,210,5,229,
-127,6,224,77,3,253,57,30,244,221,2,224,31,3,178,143,224,78,0,224,
-114,10,224,192,2,244,181,1,224,154,29,124,170,228,181,0,112,38,109,133,
-42,44,137,177,96,52,227,106,8,248,240,28,2,66,97,100,216,216,214,66,
-68,143,180,20,103,57,32,88,2,56,57,32,96,22,212,9,36,166,251,93,
-1,228,114,5,224,23,1,230,249,0,161,46,103,16,193,102,199,28,234,17,
-0,228,169,0,255,213,25,229,12,1,224,46,20,197,18,233,40,3,175,152,
-224,47,13,192,95,242,224,2,255,38,12,228,34,0,228,60,20,145,206,233,
-253,5,180,141,241,27,8,242,27,6,64,117,105,247,33,174,192,196,246,91,
-14,243,171,14,233,92,5,235,169,2,231,104,7,242,221,2,232,143,8,234,
-9,5,235,162,2,251,169,9,107,253,2,54,56,32,231,112,2,231,216,11,
-138,66,66,77,40,31,225,19,47,2,56,56,48,237,54,4,234,72,7,224,
-239,0,252,250,16,241,10,4,169,27,192,14,133,131,241,105,1,192,129,249,
-12,3,225,40,9,236,159,3,204,165,233,99,4,251,234,0,240,95,5,129,
-87,245,123,2,252,254,6,227,39,0,195,245,139,218,99,207,228,21,4,228,
-237,3,104,146,42,59,232,253,6,226,121,39,242,225,0,227,69,0,227,233,
-5,227,69,14,222,14,250,133,2,230,20,13,253,227,4,227,69,4,192,25,
-32,207,229,148,5,128,224,234,11,5,226,247,3,227,32,3,203,167,227,48,
-3,225,65,1,112,38,225,65,13,161,205,181,160,73,210,2,49,48,48,79,
-13,32,19,2,52,51,53,74,30,72,64,236,142,2,226,139,6,252,149,5,
-255,88,8,64,78,35,116,78,6,80,11,224,70,5,47,63,224,149,5,251,
-213,4,232,59,13,224,230,4,241,55,8,2,48,49,55,160,78,99,115,238,
-105,1,248,149,5,235,246,5,208,254,95,193,226,72,2,150,207,232,70,3,
-231,133,16,227,149,9,224,10,0,230,243,14,224,198,6,239,102,7,224,174,
-24,166,74,228,138,7,74,104,2,50,56,32,97,9,215,104,228,150,10,249,
-246,4,128,227,32,73,2,54,50,52,196,158,252,246,9,227,51,2,130,234,
-76,247,183,21,186,102,82,151,83,112,32,5,246,241,1,227,83,6,224,209,
-1,235,250,1,228,161,4,227,54,4,240,189,0,245,167,2,227,146,22,239,
-217,13,144,73,225,145,0,232,204,6,225,140,4,227,112,4,69,249,208,65,
-2,55,55,53,248,2,7,146,239,237,151,7,246,79,12,247,57,2,232,3,
-2,230,89,6,225,217,2,128,183,230,106,8,129,156,2,48,49,51,195,174,
-2,55,55,48,64,155,249,165,0,225,185,2,140,198,149,236,78,41,65,165,
-80,7,201,182,192,17,2,75,32,75,224,61,0,2,52,56,55,128,18,150,
-131,105,145,98,23,250,220,3,233,236,26,224,40,11,129,205,235,215,1,239,
-5,6,36,21,228,9,4,246,216,2,255,70,6,229,89,4,227,128,12,232,
-202,2,73,140,2,85,32,67,229,16,3,138,65,117,243,32,25,65,50,245,
-137,0,244,91,6,2,110,101,103,2,97,116,101,202,44,227,210,0,240,86,
-8,162,7,228,6,8,174,209,232,150,1,231,12,13,232,165,18,249,85,5,
-240,219,1,249,30,5,254,61,15,228,191,7,224,71,7,227,37,8,232,251,
-9,148,98,224,8,3,229,59,26,224,112,8,249,9,7,228,83,4,227,20,
-8,138,184,248,157,6,251,76,3,251,84,0,38,81,234,52,3,233,35,8,
-225,118,1,226,19,1,66,229,96,166,237,4,6,38,162,138,211,241,3,1,
-232,214,9,225,254,12,233,110,3,251,146,2,224,225,3,232,236,6,244,216,
-0,225,0,3,232,245,7,39,124,80,92,96,89,39,43,2,56,52,52,99,
-234,249,76,3,233,5,18,225,116,4,83,33,246,172,7,252,245,12,224,205,
-14,229,105,0,224,199,2,227,85,6,117,131,2,95,55,50,96,25,2,75,
-32,85,224,29,19,109,104,241,44,6,225,190,6,224,149,7,185,202,227,98,
-9,224,101,9,32,44,120,158,2,56,56,32,237,253,2,2,98,105,110,2,
-100,34,32,235,70,15,132,84,227,136,6,196,218,244,184,5,221,105,229,225,
-2,224,57,4,224,35,2,242,216,0,69,179,162,63,227,12,5,97,188,193,
-155,233,154,11,226,136,8,2,48,54,52,224,150,4,234,226,7,226,236,0,
-239,184,0,67,57,245,44,12,102,65,99,65,105,153,227,65,12,237,24,11,
-224,240,8,113,94,150,7,248,151,0,231,179,3,235,234,8,226,175,7,251,
-98,8,64,192,64,35,237,102,4,224,240,10,235,200,4,224,0,6,245,255,
-11,65,132,122,193,227,27,25,250,215,1,121,38,99,80,36,118,32,36,38,
-169,2,49,53,54,226,92,3,2,116,99,80,2,97,116,58,2,32,34,32,
-166,185,132,160,127,189,35,193,2,56,52,50,240,148,6,224,76,10,2,79,
-32,35,2,51,50,32,177,8,192,55,231,121,0,128,203,168,32,174,22,65,
-88,97,189,97,197,33,191,83,13,64,225,224,151,1,2,61,61,34,231,219,
-0,224,34,14,2,84,114,117,230,225,1,224,163,4,49,5,78,190,113,28,
-2,49,56,55,195,175,97,13,64,27,152,116,2,80,32,58,96,29,152,102,
-40,55,64,14,152,87,100,227,228,221,11,102,149,225,199,3,93,244,2,48,
-51,50,192,117,248,129,1,246,169,8,2,57,48,48,251,11,0,229,218,0,
-226,142,5,131,144,234,228,2,227,83,0,255,44,21,132,251,248,170,14,239,
-45,1,230,211,14,228,10,0,130,138,232,41,1,75,41,195,94,128,19,71,
-45,124,136,32,7,237,82,4,255,227,1,195,197,65,121,64,42,96,140,114,
-226,227,45,7,65,47,153,147,253,197,1,128,67,234,115,1,234,129,5,230,
-119,4,105,32,235,219,2,224,60,8,92,254,224,245,2,96,14,235,124,4,
-226,150,0,195,253,224,61,0,133,5,129,15,245,129,2,105,189,196,34,96,
-23,34,119,120,127,202,64,160,7,234,79,2,235,64,3,224,2,2,229,207,
-1,225,218,2,224,2,3,137,127,225,157,2,253,63,14,34,128,102,156,247,
-223,1,118,54,193,27,238,230,5,128,7,105,220,251,235,3,32,0,224,9,
-0,235,239,13,161,2,96,86,224,210,6,241,138,3,96,92,65,230,132,142,
-245,67,3,236,240,1,244,85,2,224,231,0,201,62,237,32,3,227,127,1,
-107,161,235,163,4,236,158,2,148,182,102,169,254,52,1,233,196,5,128,102,
-173,178,224,26,5,224,148,4,128,221,225,180,17,129,17,224,66,9,226,145,
-0,224,127,14,224,106,0,129,151,224,35,20,227,178,3,241,214,6,224,2,
-0,238,133,1,224,14,3,240,138,8,224,1,11,33,98,224,130,4,224,234,
-16,224,246,12,236,222,6,237,239,1,224,5,12,246,55,9,128,72,242,114,
-1,102,111,100,25,227,142,0,140,212,119,49,158,131,224,227,0,2,95,50,
-55,100,139,224,42,1,119,92,36,138,100,79,64,44,99,147,128,65,192,22,
-64,8,239,213,4,243,219,11,235,202,10,227,130,1,225,60,3,239,162,14,
-225,138,0,225,32,6,224,181,12,251,146,1,96,223,225,13,0,96,186,225,
-13,23,224,225,14,194,249,199,109,227,13,6,228,68,3,227,173,8,135,100,
-2,51,54,54,96,113,69,244,231,75,2,232,52,12,2,97,109,98,2,105,
-103,117,2,111,117,115,2,32,111,112,2,101,114,97,2,116,111,114,2,32,
-101,120,2,112,114,101,2,115,115,105,2,111,110,34,228,73,10,226,70,4,
-255,34,3,193,101,224,240,1,73,56,225,29,2,224,209,10,224,172,38,2,
-98,97,100,2,32,112,114,2,101,102,105,2,120,32,101,224,164,9,228,250,
-2,2,95,49,55,2,57,32,102,224,55,0,2,92,51,52,2,38,115,114,
-2,99,47,77,2,105,99,114,2,111,72,115,2,47,70,105,2,120,105,116,
-2,121,46,104,2,115,92,51,2,52,38,44,2,54,51,58,2,55,34,32,
-192,56,100,238,233,132,1,225,210,0,173,238,173,86,2,95,54,51,32,32,
-183,76,214,53,168,5,128,220,65,202,130,210,234,212,2,2,80,32,75,2,
-50,32,85,132,253,2,75,32,95,161,235,2,89,32,66,173,138,237,135,12,
-155,139,139,57,64,79,34,86,209,62,149,176,128,113,130,76,128,115,105,154,
-103,227,116,135,233,80,3,64,19,226,78,1,64,100,135,16,132,168,132,124,
-228,91,0,230,149,3,136,70,160,179,200,125,129,199,136,236,143,6,239,13,
-2,224,61,7,193,25,224,33,1,225,3,1,161,25,113,242,224,21,0,72,
-86,40,120,105,224,163,26,73,31,157,107,2,95,49,56,2,51,32,35,234,
-36,0,223,209,234,98,15,241,70,2,64,46,155,112,2,65,32,58,129,44,
-32,11,2,90,32,85,106,55,65,95,32,14,2,75,32,58,129,187,234,4,
-0,101,200,235,235,3,64,32,138,115,114,171,64,14,138,115,2,95,52,57,
-180,88,65,95,146,40,96,193,32,30,177,244,160,6,160,24,64,11,128,30,
-224,24,12,160,49,96,31,32,7,156,35,100,49,64,115,202,168,41,21,239,
-212,2,233,106,9,248,15,7,227,194,6,253,101,9,119,180,169,245,2,55,
-50,50,248,191,9,255,46,5,236,168,32,2,103,101,116,2,65,112,112,2,
-67,111,110,204,172,236,105,7,255,156,3,2,85,32,73,202,98,74,167,161,
-141,96,105,2,51,51,55,226,24,17,250,0,1,83,87,65,57,64,65,130,
-77,104,127,64,14,130,52,56,210,211,247,253,123,1,83,78,76,62,199,147,
-106,65,238,21,3,172,253,224,2,0,239,125,6,234,203,1,142,104,65,200,
-130,213,34,222,240,120,8,64,112,130,134,32,208,2,57,57,51,254,68,0,
-235,101,1,32,34,66,209,224,147,0,239,216,1,136,6,224,155,7,224,16,
-3,34,143,128,64,130,207,2,83,32,83,105,69,255,128,17,184,233,224,33,
-19,131,195,254,126,8,253,182,8,165,65,226,93,19,2,90,32,95,236,199,
-5,253,232,14,145,207,66,90,38,89,119,17,221,177,67,28,228,118,0,245,
-157,6,181,99,224,57,8,142,192,224,57,1,224,93,13,195,122,228,212,1,
-254,167,17,209,20,203,226,251,127,10,251,124,14,2,85,32,83,221,67,224,
-125,1,102,103,132,24,64,6,248,226,1,249,59,3,2,57,57,55,234,201,
-1,225,75,11,224,214,1,34,85,2,55,49,52,163,156,192,101,2,95,57,
-56,132,118,160,226,2,95,50,52,96,62,238,19,0,226,3,18,192,239,128,
-31,224,28,6,96,77,225,9,12,201,68,250,198,10,167,81,215,158,250,180,
-8,2,85,32,66,224,187,3,36,4,249,238,4,249,25,5,255,203,3,224,
-56,6,120,99,224,46,16,248,97,23,225,99,8,225,244,17,225,4,16,173,
-232,248,159,11,225,177,23,51,199,64,19,225,178,1,224,198,1,226,195,10,
-150,179,225,12,3,224,95,23,167,200,224,94,0,224,60,2,226,98,13,229,
-251,34,2,100,115,69,2,70,105,101,2,108,100,115,229,250,12,68,162,135,
-81,136,109,163,29,32,194,64,25,135,92,241,145,14,162,175,235,208,9,243,
-247,3,64,202,169,77,241,117,3,161,14,224,40,1,32,79,161,2,224,230,
-2,64,130,199,107,2,95,50,49,32,224,251,160,0,2,54,50,54,125,55,
-66,195,64,38,230,168,2,158,203,128,137,145,129,155,51,69,203,225,38,17,
-2,101,110,117,2,109,34,32,129,91,64,80,134,183,161,20,101,11,161,19,
-134,193,79,109,236,168,0,226,132,9,101,204,224,26,13,136,107,226,186,12,
-184,135,229,137,15,209,53,32,132,230,169,5,200,168,96,38,102,236,140,4,
-100,41,229,155,6,65,101,224,36,6,255,117,14,92,53,224,37,2,239,73,
-1,229,137,12,228,152,28,224,101,4,96,21,228,37,6,2,53,55,55,228,
-37,9,248,220,2,224,170,9,228,37,8,2,54,48,32,245,209,4,227,64,
-1,224,25,6,225,63,3,105,239,65,221,136,131,105,218,230,119,5,187,212,
-240,76,1,233,228,21,199,122,231,235,19,224,206,11,192,25,233,142,1,224,
-244,21,249,52,11,129,48,128,23,96,245,156,22,238,211,2,229,239,0,161,
-170,2,95,50,53,73,198,155,9,250,27,20,160,116,32,155,234,20,0,247,
-152,5,141,159,249,158,4,141,156,139,100,205,65,126,157,96,69,96,4,203,
-121,32,244,174,153,98,9,122,50,128,56,148,32,33,199,130,34,224,0,1,
-227,6,12,225,219,8,97,220,137,239,228,204,12,129,119,179,169,64,242,89,
-30,32,6,162,23,85,129,99,245,76,36,228,52,1,2,118,97,108,151,70,
-248,19,2,2,121,112,101,100,71,224,18,1,2,107,105,110,154,131,224,18,
-1,2,115,111,114,2,116,34,32,128,90,236,241,3,229,100,20,242,168,0,
-241,51,0,161,158,65,96,100,227,118,41,142,124,2,51,56,52,226,37,5,
-249,66,10,70,168,96,22,69,10,224,54,5,129,49,65,5,246,98,0,195,
-3,232,158,24,241,195,0,234,129,19,133,255,105,96,64,128,235,197,0,232,
-7,21,38,49,194,197,224,42,10,152,35,224,94,1,133,253,64,94,129,222,
-73,107,35,5,225,134,2,2,101,116,83,2,76,111,99,2,69,120,112,2,
-114,34,32,160,242,184,196,162,162,134,58,2,50,55,32,224,71,1,161,74,
-124,39,192,19,64,56,134,169,2,79,32,58,128,27,97,211,128,180,2,51,
-53,50,160,35,230,85,1,254,45,0,164,97,228,88,0,247,165,0,75,48,
-67,121,2,50,57,50,236,26,2,228,122,1,130,0,224,55,6,82,221,39,
-222,2,49,49,50,158,75,141,136,160,6,227,179,1,114,3,192,49,231,18,
-15,2,117,110,100,49,249,2,110,101,100,168,57,130,99,250,227,0,224,54,
-15,238,99,0,2,51,49,51,246,193,2,38,136,226,17,0,114,122,247,251,
-4,240,224,0,224,157,2,226,182,0,224,105,15,243,74,1,199,185,175,91,
-178,58,224,61,21,192,167,200,140,96,51,160,180,251,168,22,130,0,35,77,
-128,45,82,78,49,78,191,149,215,162,152,53,242,159,0,2,95,57,49,233,
-189,1,228,189,1,129,6,66,27,209,79,228,96,3,2,91,93,34,241,252,
-3,224,146,8,2,57,49,32,243,130,0,203,223,192,202,32,8,176,160,124,
-233,224,53,3,32,180,160,53,250,214,1,224,91,8,74,33,248,53,2,224,
-91,5,228,34,1,135,49,64,230,137,146,2,51,48,32,201,102,2,49,52,
-57,225,112,3,2,66,111,111,2,108,34,32,160,54,133,139,224,28,1,2,
-68,97,116,2,97,46,66,32,33,2,95,84,121,2,112,101,46,32,39,32,
-37,64,63,131,140,201,107,255,171,6,138,13,251,181,0,249,35,4,246,94,
-1,252,38,6,101,217,170,255,241,180,18,2,95,51,55,134,105,251,252,2,
-229,158,0,32,64,235,161,1,182,18,181,150,224,109,2,170,143,69,70,64,
-174,246,104,1,235,50,0,181,217,224,17,5,255,57,7,167,163,131,119,2,
-50,52,50,236,67,2,135,184,192,169,224,71,4,96,48,163,179,2,48,52,
-50,244,149,6,227,194,20,2,110,111,116,2,32,112,111,2,108,121,109,2,
-111,114,112,2,104,105,99,2,32,101,110,2,111,117,103,2,104,58,32,131,
-48,86,67,2,57,57,32,32,209,70,163,227,229,1,235,189,5,149,179,32,
-38,40,123,2,52,50,57,228,199,1,224,41,8,97,233,135,5,134,246,64,
-149,64,7,32,22,104,129,130,75,98,93,135,16,64,48,222,123,137,246,96,
-137,47,71,192,78,133,197,222,153,64,70,130,71,235,117,3,77,214,136,240,
-32,9,75,215,45,26,152,238,194,80,252,96,0,64,5,225,215,1,128,48,
-32,137,225,81,5,242,157,5,226,172,5,249,59,8,227,49,0,226,146,0,
-2,48,57,54,189,51,64,237,97,84,233,99,14,48,65,32,10,182,159,102,
-228,227,167,0,64,236,254,23,1,226,140,9,128,76,153,40,131,5,201,217,
-113,16,189,1,162,80,224,126,12,98,158,69,10,64,62,129,209,254,153,7,
-64,188,32,129,229,22,11,247,177,4,165,120,100,55,2,55,51,51,135,79,
-161,196,128,72,173,108,96,233,160,139,2,55,51,52,235,198,0,64,46,71,
-244,148,92,64,57,164,138,2,55,51,53,193,32,100,252,64,45,64,136,128,
-10,64,43,202,11,233,113,6,2,49,48,51,243,202,0,227,133,1,65,156,
-87,230,172,60,238,203,5,228,24,7,202,232,233,207,10,192,93,249,199,5,
-227,237,3,164,49,112,15,66,8,197,108,233,191,7,159,94,129,37,65,205,
-67,59,224,107,12,71,116,129,206,224,208,7,143,25,235,233,3,240,213,3,
-236,5,8,2,48,51,56,232,99,1,224,135,7,224,43,4,110,168,98,102,
-107,68,249,223,3,160,6,177,15,99,85,240,3,2,160,247,249,19,0,226,
-136,2,225,38,5,240,12,2,56,238,117,109,194,198,128,139,243,210,2,193,
-68,225,153,0,228,124,6,236,46,7,129,227,65,86,132,146,244,220,0,100,
-12,64,155,231,143,1,235,79,6,216,166,230,72,0,253,179,0,254,22,7,
-223,78,254,51,12,100,115,225,205,8,2,57,48,32,254,72,5,254,200,3,
-254,227,4,252,186,7,220,192,194,113,64,202,232,25,0,100,57,238,224,2,
-224,79,0,253,208,2,135,27,160,59,32,138,171,131,64,14,253,42,5,224,
-117,7,224,150,0,229,9,3,165,7,99,159,202,16,2,95,50,51,70,41,
-2,39,32,89,224,151,24,222,106,152,32,224,131,6,65,228,148,151,236,205,
-3,120,207,186,234,225,61,11,254,171,8,162,213,253,247,3,224,9,0,128,
-147,162,221,239,89,6,224,65,1,104,142,231,215,8,253,204,11,255,14,8,
-236,24,0,192,99,228,7,3,224,26,0,96,115,128,167,224,31,4,224,131,
-2,240,64,0,192,84,224,133,1,236,100,2,224,203,2,224,92,5,64,47,
-111,137,100,41,242,93,0,137,121,59,179,227,113,0,67,43,135,141,2,79,
-32,80,103,189,2,51,49,48,121,124,131,242,2,48,57,57,32,7,64,27,
-96,107,35,52,136,10,45,23,98,217,103,228,65,186,96,118,224,39,16,36,
-129,160,39,102,42,224,39,17,38,32,160,39,64,88,96,147,36,14,219,236,
-2,49,51,50,166,12,160,186,237,240,0,238,213,2,108,170,227,198,7,162,
-209,200,15,238,166,11,226,3,11,225,142,5,224,30,12,224,85,16,228,163,
-0,224,85,22,226,103,6,98,23,65,49,64,149,237,98,1,227,35,1,33,
-2,64,250,137,22,235,132,6,75,127,2,76,105,116,2,115,46,75,2,110,
-111,119,2,110,83,121,2,109,98,111,75,182,64,47,136,89,225,42,141,244,
-37,2,225,42,75,239,185,1,229,155,10,73,142,244,255,0,189,168,220,137,
-111,122,230,96,3,92,118,224,150,1,236,183,2,241,82,2,67,153,134,111,
-166,117,228,161,7,229,25,2,224,25,8,224,131,0,241,28,10,224,45,9,
-225,40,2,230,144,11,229,27,8,166,14,224,19,8,100,76,230,212,15,224,
-49,4,230,137,3,254,43,0,229,112,17,128,6,132,166,193,228,234,151,9,
-71,142,94,65,192,45,68,185,232,115,4,180,65,238,209,2,224,107,30,132,
-37,234,137,0,230,50,2,194,243,224,243,6,160,154,2,48,54,32,207,58,
-160,82,2,50,56,32,232,108,6,162,11,225,207,5,226,226,3,167,31,130,
-15,64,5,129,102,243,255,1,238,176,10,193,95,236,180,5,69,213,211,75,
-241,107,2,233,11,5,240,14,1,65,75,225,37,6,190,87,131,51,107,3,
-122,183,198,32,128,166,43,113,96,241,187,4,45,248,229,108,0,236,208,17,
-224,112,0,161,43,225,188,1,224,55,2,145,79,128,7,234,62,1,144,116,
-246,161,2,241,245,22,2,77,117,108,2,116,105,112,2,108,101,32,2,99,
-111,110,2,115,116,114,2,97,105,110,2,116,32,115,2,111,108,117,2,116,
-105,111,2,110,115,32,2,102,111,114,242,22,0,169,226,107,69,78,42,238,
-230,0,98,15,140,107,125,15,91,64,2,95,54,48,32,204,64,24,140,88,
-2,83,32,85,155,156,246,25,2,2,117,112,108,2,101,67,111,192,117,2,
-115,34,32,194,29,65,43,78,198,78,50,128,104,107,23,33,186,2,51,53,
-52,159,20,32,5,104,197,96,124,65,84,164,140,137,50,225,184,1,169,56,
-224,16,1,228,36,0,195,123,227,217,5,192,38,96,68,251,203,9,96,5,
-234,210,1,130,115,37,241,131,235,228,62,5,241,114,4,232,70,1,229,182,
-4,97,217,143,99,234,91,3,161,206,130,87,143,205,101,147,247,233,5,227,
-101,5,66,104,233,150,4,145,215,117,170,231,222,2,67,115,97,43,229,99,
-5,245,126,1,67,33,40,68,99,136,2,89,32,67,227,88,4,163,121,230,
-224,0,225,31,0,96,255,224,15,2,241,200,0,230,32,1,192,83,64,148,
-34,237,233,137,4,128,157,159,248,32,38,164,22,98,240,113,225,224,22,1,
-227,11,7,230,201,2,224,10,8,227,90,0,50,28,246,1,0,244,61,2,
-65,85,131,148,164,153,65,30,253,252,1,161,199,193,41,192,205,176,199,224,
-206,0,224,105,4,55,208,224,25,1,228,233,3,2,51,32,80,96,25,64,
-201,143,125,64,41,35,227,227,215,5,236,43,5,224,103,2,64,67,200,39,
-230,213,10,225,100,7,163,171,96,50,130,206,240,122,7,236,60,3,209,220,
-236,190,6,2,95,56,48,238,19,1,244,115,2,225,217,3,163,54,227,67,
-3,224,190,1,78,160,225,13,4,230,17,3,225,58,2,83,193,193,246,224,
-20,0,83,200,224,13,0,165,201,210,39,2,57,57,57,37,108,223,233,2,
-48,51,57,2,32,64,89,241,92,10,187,149,182,120,237,155,8,176,91,113,
-252,225,36,48,32,14,225,38,3,99,175,101,131,2,51,55,57,197,131,228,
-243,1,2,102,114,101,2,101,32,116,42,80,2,32,118,97,2,114,105,97,
-2,98,108,101,2,32,105,110,2,32,111,117,2,116,112,117,2,116,32,102,
-88,96,2,112,34,32,230,25,2,227,16,3,240,90,0,230,205,1,164,237,
-228,234,5,228,231,5,231,15,1,225,157,2,140,240,234,14,1,228,167,17,
-228,144,9,228,135,8,226,229,2,225,7,1,67,74,140,72,130,253,240,14,
-3,64,27,139,105,65,113,135,63,230,239,1,245,177,3,228,138,4,224,42,
-8,224,228,0,169,66,239,91,2,226,117,0,168,192,228,197,0,251,139,2,
-154,77,98,69,228,18,0,135,229,162,24,238,81,5,227,187,2,161,248,224,
-8,3,243,72,0,67,114,223,49,233,220,2,81,150,192,59,233,243,3,224,
-25,5,224,26,6,224,29,7,227,237,3,227,132,10,192,196,226,229,4,64,
-146,139,171,32,196,82,208,32,170,33,152,64,22,137,194,64,217,142,78,34,
-101,137,129,90,154,180,30,2,49,49,56,229,59,0,64,7,97,91,96,13,
-64,65,135,244,2,83,32,83,254,39,0,71,172,64,6,67,83,99,10,84,
-132,64,16,107,244,96,201,64,56,136,20,47,62,2,51,32,75,128,18,64,
-49,192,75,139,231,40,179,224,58,0,210,196,96,22,135,12,174,190,128,236,
-64,15,34,148,64,71,134,223,96,90,80,224,64,18,247,26,3,202,241,64,
-23,130,160,235,198,5,241,225,3,242,194,3,64,47,130,180,97,218,231,191,
-3,32,25,132,138,97,135,161,4,128,49,130,12,32,140,2,50,32,90,128,
-120,64,21,129,143,80,60,224,143,5,129,144,66,233,136,128,227,201,7,241,
-166,0,238,97,3,254,111,9,189,3,224,39,18,199,10,226,62,1,237,22,
-0,161,233,237,148,10,234,238,0,227,71,6,69,1,227,73,1,229,212,1,
-228,186,2,241,72,6,210,79,195,67,224,132,8,158,74,236,12,2,133,122,
-101,207,252,80,1,224,50,33,196,4,137,18,32,152,2,56,53,51,224,47,
-2,224,172,6,229,203,2,164,85,160,244,225,74,11,225,73,17,225,72,16,
-227,228,0,232,170,3,224,58,18,234,87,8,233,102,13,228,247,4,233,92,
-8,224,19,0,198,197,225,69,12,136,106,225,69,8,225,64,9,178,97,225,
-64,20,66,210,172,22,224,29,0,68,207,96,51,64,15,34,52,200,222,224,
-64,3,64,55,132,32,192,232,32,218,184,211,32,51,96,80,40,49,2,50,
-57,48,198,12,64,36,224,89,0,224,12,4,237,186,2,32,8,224,98,0,
-41,252,224,11,1,132,212,192,122,64,7,227,229,5,117,148,237,111,7,244,
-254,3,177,229,245,146,0,195,121,225,184,0,227,164,11,160,67,224,46,24,
-69,43,226,141,5,253,157,12,227,216,9,193,60,227,218,5,225,215,6,250,
-112,1,2,51,51,55,181,191,227,205,3,128,47,32,45,110,223,2,57,56,
-50,233,203,4,242,197,9,96,43,240,85,1,224,179,1,239,154,5,227,59,
-3,224,75,10,192,24,32,75,255,197,2,111,93,205,246,128,29,160,103,2,
-95,55,48,248,241,3,97,198,133,244,110,119,134,119,69,107,96,137,109,175,
-134,99,32,150,249,84,0,32,126,32,103,215,22,181,218,46,200,49,142,64,
-12,134,62,153,169,227,47,6,102,138,90,34,32,130,71,74,84,23,175,113,
-2,48,54,51,120,34,129,123,2,95,51,48,234,129,4,32,132,247,224,35,
-208,255,181,229,200,186,66,188,94,37,132,53,125,249,227,136,0,234,175,6,
-239,51,1,81,141,98,230,44,151,239,151,5,2,109,105,110,2,105,109,117,
-2,109,34,32,210,88,72,52,229,4,1,249,176,1,2,95,52,55,2,32,
-64,73,193,146,64,83,199,32,241,77,13,233,100,5,243,12,5,224,13,0,
-102,26,226,153,0,97,242,160,75,145,86,33,234,194,29,128,29,32,223,2,
-55,55,50,80,113,54,237,2,79,32,35,2,55,53,32,241,96,0,242,241,
-6,64,162,135,145,245,226,20,2,78,97,116,149,223,87,96,32,44,162,54,
-97,75,143,47,132,23,209,246,195,148,96,186,239,86,3,41,71,232,204,0,
-2,50,55,56,143,195,196,252,236,222,3,245,63,7,230,52,1,225,34,1,
-228,114,3,203,112,129,10,243,64,12,163,178,252,182,6,64,137,252,213,1,
-227,97,0,255,210,9,243,29,0,243,1,1,225,202,9,199,200,88,179,244,
-179,4,242,210,19,224,199,1,242,213,12,226,56,25,224,123,1,2,95,52,
-56,254,133,0,224,73,1,241,17,5,233,196,3,243,119,0,228,160,0,228,
-56,4,65,241,244,214,3,129,107,129,205,219,229,225,143,4,161,232,168,220,
-2,57,53,54,97,187,105,252,177,186,32,40,32,9,99,209,231,226,18,225,
-173,2,231,146,9,232,11,4,229,186,1,244,151,10,132,71,225,20,3,251,
-84,9,97,20,97,181,225,35,1,32,14,247,230,5,135,85,225,95,15,224,
-28,18,65,65,135,241,229,39,6,170,85,126,112,69,76,165,51,128,49,135,
-235,131,101,226,172,18,164,18,226,162,8,226,157,7,234,94,0,247,20,23,
-142,78,32,19,64,201,165,57,196,103,229,66,0,68,219,224,251,1,2,58,
-49,48,91,188,72,129,227,179,7,2,54,54,32,96,96,255,149,0,64,19,
-77,60,128,59,255,162,2,92,1,99,91,64,77,200,109,96,170,2,56,57,
-55,156,129,2,51,49,54,101,182,32,107,45,174,77,76,96,44,134,211,2,
-75,32,66,228,54,13,2,54,53,32,253,101,7,175,217,224,149,1,238,221,
-0,96,130,174,222,71,219,225,87,0,161,103,224,49,1,64,44,128,7,247,
-27,4,64,144,198,68,224,189,12,118,7,224,189,2,134,29,71,39,225,230,
-4,224,12,4,64,244,33,52,131,145,81,156,97,133,131,104,146,84,103,172,
-241,184,0,2,67,32,79,194,189,64,113,227,204,1,192,50,202,232,199,72,
-232,99,8,227,80,1,240,77,0,250,48,13,235,233,4,235,200,0,237,159,
-6,251,139,13,235,200,17,249,249,3,254,13,19,241,104,0,68,97,242,110,
-2,128,247,2,57,51,32,232,253,1,65,106,252,152,0,211,179,227,85,2,
-129,98,198,169,236,6,1,224,35,3,130,18,43,11,71,88,184,207,247,48,
-0,226,26,5,2,56,57,32,192,133,104,101,64,126,135,55,130,167,226,165,
-8,75,182,240,173,3,2,57,49,32,241,115,11,64,71,133,141,226,233,16,
-97,72,245,246,15,130,141,247,249,4,226,152,11,232,137,8,239,245,4,192,
-136,132,212,105,74,64,122,47,206,144,91,96,204,134,48,226,195,2,228,180,
-1,66,236,233,197,3,237,185,4,160,100,65,209,234,189,2,226,68,2,143,
-199,169,109,236,116,7,251,5,4,184,128,224,33,12,128,27,226,224,4,232,
-193,3,249,25,13,226,202,24,254,86,9,254,72,6,236,162,2,253,12,0,
-251,105,22,64,62,201,255,133,164,112,51,2,56,51,32,147,130,2,48,56,
-52,252,191,17,224,12,1,224,20,0,224,160,5,237,63,4,96,2,224,136,
-12,253,149,6,230,75,0,245,30,2,32,144,41,207,168,241,249,131,9,225,
-8,3,208,57,249,209,13,2,48,50,55,192,49,224,18,6,160,193,32,245,
-2,53,54,50,171,13,105,47,2,48,50,54,65,3,2,57,55,48,99,203,
-2,53,54,54,64,34,123,113,47,19,64,21,32,207,66,126,96,9,32,169,
-164,183,224,30,0,2,35,50,32,240,16,3,255,187,14,225,165,1,2,48,
-56,54,174,23,76,8,96,19,2,54,50,54,110,48,70,221,2,48,56,56,
-227,40,2,68,12,99,40,66,50,196,220,225,136,1,99,165,240,153,1,225,
-144,2,228,0,0,97,236,99,172,224,110,10,201,181,2,51,52,50,128,212,
-2,57,49,51,96,52,214,144,64,130,135,81,169,115,113,255,32,4,224,14,
-6,46,227,58,19,238,48,1,96,56,217,250,228,109,19,2,90,32,66,228,
-100,45,244,87,15,192,124,135,73,228,97,0,244,24,0,64,27,135,56,2,
-95,51,50,2,53,32,58,131,4,220,237,128,69,64,20,133,114,239,210,1,
-70,60,229,163,1,214,186,227,59,0,166,4,64,57,234,242,4,228,165,1,
-228,119,0,226,224,3,228,136,4,229,51,1,224,17,5,140,243,228,35,5,
-243,233,0,224,32,0,224,62,3,247,193,6,224,23,0,160,38,240,59,5,
-96,8,160,5,2,95,55,50,231,150,4,237,79,15,236,157,0,205,159,130,
-151,241,66,4,244,140,2,228,253,3,32,69,2,50,57,54,247,185,9,231,
-6,3,71,96,66,164,218,204,2,55,49,52,65,120,2,56,49,57,188,193,
-70,215,255,133,19,2,101,120,112,2,97,110,100,2,68,105,99,2,116,58,
-32,143,120,2,95,49,50,71,212,96,72,229,113,6,228,176,5,228,127,14,
-225,71,4,242,54,8,226,126,0,220,141,232,160,6,229,214,2,224,19,4,
-195,194,224,22,17,233,59,1,242,221,1,255,94,1,224,55,8,232,115,3,
-224,29,10,88,125,2,55,49,51,65,131,221,164,230,105,10,255,186,4,230,
-237,0,96,64,236,63,2,255,160,11,244,97,1,99,36,246,169,1,146,107,
-176,131,176,119,33,216,228,49,2,232,193,0,91,254,37,130,33,173,133,135,
-229,126,12,232,225,0,107,73,200,236,107,47,32,109,124,65,140,128,165,224,
-225,15,11,230,172,18,249,248,5,248,209,7,232,221,19,255,70,14,225,123,
-13,227,185,3,225,90,56,100,235,115,121,2,95,55,54,165,216,225,75,22,
-232,124,0,234,162,1,35,81,110,81,244,113,3,192,21,232,29,1,179,213,
-179,212,233,113,5,64,20,147,243,64,169,32,98,69,20,218,217,45,254,226,
-109,1,238,206,1,96,136,82,13,32,50,67,228,112,141,229,97,5,108,231,
-102,156,150,135,229,254,2,200,231,251,170,3,224,46,18,192,44,64,212,230,
-47,0,138,119,131,95,159,78,159,40,117,197,85,196,2,52,51,32,33,229,
-32,7,84,140,2,55,54,54,192,225,82,135,32,64,33,0,139,163,154,110,
-65,182,243,227,1,245,169,16,240,155,27,96,33,96,57,224,223,2,235,170,
-0,210,5,250,3,0,252,21,0,96,153,166,137,201,253,64,220,2,57,56,
-53,230,134,4,241,214,0,207,185,232,73,2,255,13,13,253,43,3,192,147,
-227,82,2,172,223,234,117,1,179,93,245,98,0,2,95,54,56,229,134,1,
-69,248,52,24,226,160,19,96,61,37,228,97,24,196,0,125,79,164,75,77,
-218,229,252,1,2,36,120,34,167,233,67,13,188,25,2,75,52,32,32,2,
-252,31,1,128,31,136,37,237,88,14,225,135,2,96,231,146,26,64,8,208,
-109,78,57,242,222,4,231,213,1,231,23,0,139,170,238,28,5,148,189,243,
-4,0,224,43,0,160,23,128,35,242,255,8,224,21,9,225,245,0,224,94,
-4,208,163,237,253,2,224,31,18,192,67,249,106,1,75,60,163,27,228,222,
-3,232,105,3,224,32,8,160,69,216,76,64,7,253,117,5,226,63,3,239,
-227,3,247,150,15,193,27,251,159,7,64,81,224,15,1,214,50,227,25,1,
-128,76,179,134,226,224,1,128,159,236,220,1,65,188,137,247,235,91,1,245,
-225,1,160,107,32,229,72,112,224,138,0,224,8,0,64,61,138,32,234,248,
-2,64,20,239,96,31,218,251,234,248,53,245,250,4,224,215,1,239,92,9,
-64,247,64,25,132,228,226,238,14,164,210,226,238,0,51,108,240,71,14,64,
-139,224,230,26,108,28,235,220,63,228,224,1,128,130,132,219,32,63,2,55,
-32,75,115,3,224,1,7,233,65,0,233,4,7,235,66,6,224,34,17,224,
-32,3,32,188,205,151,64,125,132,87,225,98,1,236,93,2,65,70,132,115,
-33,119,164,116,162,119,64,29,164,49,97,83,82,12,154,209,64,25,249,73,
-7,2,97,100,105,2,99,116,34,128,27,130,108,98,170,46,170,32,67,64,
-20,130,108,227,183,3,227,201,0,234,50,1,229,169,2,234,26,2,83,237,
-100,65,232,100,2,236,177,3,242,155,11,128,54,2,53,48,32,244,185,7,
-64,195,135,230,91,50,173,74,227,249,1,253,207,0,204,127,224,177,3,234,
-199,13,232,24,6,224,59,1,240,5,1,109,57,253,177,4,168,58,228,202,
-6,201,179,192,137,64,194,166,65,224,35,5,224,75,7,160,37,235,27,8,
-225,18,9,2,52,57,32,225,18,6,233,188,5,244,24,7,225,96,0,207,
-166,225,155,8,190,44,236,59,8,64,26,227,35,5,224,99,73,225,131,0,
-237,193,4,224,15,2,224,132,3,224,47,2,131,111,238,118,2,226,121,26,
-169,37,227,104,0,224,140,16,240,232,1,224,106,63,131,141,233,245,3,225,
-60,10,237,10,6,237,93,5,241,118,1,166,175,2,53,56,32,106,130,246,
-157,7,128,174,163,37,64,118,65,62,246,78,1,32,5,180,156,246,84,5,
-40,211,225,19,12,232,86,0,207,116,237,169,12,246,127,6,224,127,1,236,
-75,4,232,13,2,250,38,3,101,242,2,53,55,32,129,100,39,63,248,22,
-2,239,17,3,228,42,18,227,47,2,235,77,1,239,204,2,160,16,100,78,
-139,105,108,186,109,8,152,136,2,95,52,50,44,84,151,188,224,119,2,97,
-99,82,175,229,41,1,2,83,117,98,2,115,117,109,2,112,116,105,2,111,
-110,32,2,99,104,101,2,99,107,32,2,102,97,105,2,108,101,100,143,249,
-249,103,10,65,169,246,101,18,217,39,240,26,4,65,17,64,200,64,62,133,
-254,115,81,2,89,32,83,64,148,129,145,233,38,1,209,219,227,59,1,97,
-103,229,158,3,228,165,1,228,162,5,236,39,3,198,115,241,101,12,228,181,
-8,128,51,194,127,245,46,1,224,32,7,217,208,159,131,224,26,4,171,203,
-34,106,97,237,224,9,1,249,169,9,195,77,233,59,0,170,21,239,119,11,
-229,145,3,224,238,18,79,29,228,114,6,250,50,5,224,31,5,250,52,2,
-175,106,195,222,224,91,0,224,63,5,193,78,239,92,9,224,13,7,224,58,
-8,250,114,15,129,137,219,247,227,22,10,128,26,160,154,247,95,4,231,17,
-7,244,15,0,227,243,2,225,184,5,229,39,1,225,80,30,205,102,235,187,
-0,226,63,13,226,3,4,233,164,4,161,98,244,110,5,225,23,3,128,97,
-181,203,224,220,0,230,68,3,224,46,4,224,194,2,248,75,9,229,132,0,
-165,118,120,231,109,63,130,83,2,51,52,49,228,130,3,231,188,8,224,198,
-4,252,94,9,229,230,3,193,164,230,226,2,239,178,5,160,145,228,136,9,
-128,31,129,118,224,27,6,227,109,0,42,235,104,138,239,178,1,109,24,224,
-4,1,223,78,244,199,23,2,102,114,101,2,101,84,121,2,86,97,114,2,
-115,58,32,244,199,3,112,133,230,132,3,64,76,36,141,241,156,2,177,155,
-32,4,176,17,128,6,68,190,206,245,2,89,32,67,222,8,97,22,228,153,
-3,240,181,11,164,89,225,214,11,192,25,107,248,165,247,230,205,5,64,176,
-96,31,176,207,230,112,4,252,119,0,233,70,8,241,170,6,230,91,5,254,
-78,14,65,201,228,222,2,251,214,1,233,214,0,234,76,1,230,247,6,200,
-38,231,28,3,231,71,3,254,223,3,246,59,11,238,63,4,224,187,3,179,
-166,241,189,2,225,7,35,242,225,0,2,57,51,49,225,9,5,224,40,2,
-211,50,198,228,140,106,193,212,230,233,13,109,125,2,53,51,32,251,9,0,
-238,0,1,225,136,6,164,228,128,179,245,107,0,245,177,0,229,246,6,128,
-13,210,9,128,143,217,103,238,53,1,2,57,55,51,245,189,0,224,110,1,
-224,177,0,2,55,54,57,90,168,57,81,32,4,98,240,160,112,134,103,2,
-51,48,50,167,164,227,62,5,2,79,32,35,2,51,53,32,166,182,131,47,
-2,49,52,56,224,136,2,173,77,249,12,5,236,25,1,248,244,7,2,57,
-55,52,253,109,5,224,25,8,231,244,2,145,63,233,10,4,230,23,9,132,
-210,172,56,129,210,225,4,7,243,206,1,224,19,0,64,186,141,243,2,85,
-32,67,244,54,14,32,25,205,252,244,87,14,195,163,234,239,4,230,230,4,
-244,129,8,205,146,242,161,0,2,95,56,50,2,52,32,102,228,165,0,2,
-45,62,34,97,243,224,21,5,2,80,114,105,2,109,105,116,2,105,118,101,
-2,115,46,45,128,32,224,89,5,244,185,8,225,160,1,238,70,1,240,169,
-10,2,57,57,50,254,227,4,197,177,228,189,0,85,159,91,133,240,202,1,
-66,14,87,22,2,57,49,32,229,53,4,193,131,96,116,236,11,0,225,63,
-0,235,24,7,187,228,239,97,3,224,36,18,64,92,64,8,32,91,64,100,
-239,23,2,231,238,5,230,187,4,138,34,226,78,6,237,135,4,246,75,14,
-255,39,9,232,25,21,219,231,233,106,15,224,31,6,233,106,0,2,83,32,
-67,224,169,0,233,38,10,160,54,229,74,4,163,99,107,185,246,4,2,226,
-216,0,33,173,249,126,4,193,153,246,35,0,233,144,12,231,223,9,252,75,
-2,224,13,5,224,56,12,232,25,6,239,228,2,245,165,0,227,197,4,231,
-183,0,247,153,5,32,44,226,13,4,234,48,6,225,8,9,204,195,64,254,
-168,55,225,10,13,233,166,0,128,121,246,80,3,209,53,241,47,9,224,220,
-5,227,59,9,55,105,234,66,8,244,75,3,254,149,14,226,72,3,97,49,
-65,159,70,1,64,155,96,159,238,81,10,102,9,173,172,195,242,232,232,15,
-2,99,97,110,2,110,111,116,2,32,117,110,2,105,102,121,168,233,229,236,
-5,2,56,49,56,229,236,12,224,66,1,2,32,97,110,2,100,32,34,132,
-103,128,45,236,182,13,226,93,6,67,158,142,14,254,165,2,231,44,2,35,
-206,238,175,0,186,82,167,131,64,69,174,17,65,11,163,224,251,143,0,128,
-8,220,240,32,56,134,206,32,44,130,81,64,54,137,137,229,51,12,2,126,
-34,32,96,34,135,197,255,69,2,224,156,5,169,25,240,20,3,133,79,64,
-104,33,236,228,234,11,64,251,229,95,0,226,95,8,243,149,2,226,95,23,
-240,179,4,101,105,2,52,48,32,240,44,5,228,120,1,229,163,3,67,1,
-107,57,196,11,2,48,51,55,243,110,7,226,70,44,2,121,99,108,2,105,
-99,32,226,64,10,72,166,66,20,39,179,167,6,226,73,18,2,61,32,34,
-226,71,15,238,52,7,240,67,5,225,143,0,228,179,1,220,153,128,224,253,
-196,2,65,142,192,141,161,151,136,152,227,185,21,225,33,16,2,57,53,57,
-233,160,2,143,137,2,48,52,49,202,131,224,233,13,2,101,114,114,2,111,
-114,58,193,48,96,132,136,98,65,242,2,80,32,102,224,41,0,2,116,121,
-112,2,101,34,32,2,64,64,102,224,17,0,2,107,105,110,145,97,224,18,
-1,2,115,111,114,86,177,224,18,3,2,114,101,97,2,108,109,34,163,37,
-184,153,241,118,38,121,132,64,62,135,161,177,118,133,71,241,91,4,239,17,
-5,239,14,17,246,131,1,241,66,24,165,111,237,13,12,198,234,231,59,15,
-98,42,238,46,11,130,244,238,28,6,233,111,4,48,206,239,114,38,251,154,
-0,246,204,9,239,15,8,237,59,26,187,12,224,133,1,242,7,1,61,134,
-255,236,1,238,85,1,65,165,98,55,110,75,225,95,1,241,228,15,161,132,
-238,103,18,235,160,6,225,123,41,228,160,6,195,157,132,22,35,150,235,111,
-3,227,201,10,66,139,191,51,232,9,2,163,202,244,84,6,111,118,196,111,
-2,56,32,95,2,55,49,51,99,147,106,135,192,76,227,189,2,242,210,6,
-90,192,99,182,224,58,1,2,50,53,52,95,171,173,77,224,64,0,178,49,
-225,21,12,248,177,0,225,88,15,194,57,233,76,8,236,224,1,226,127,0,
-226,12,2,224,78,15,238,157,1,224,78,6,192,24,98,161,225,41,6,226,
-126,16,224,46,13,225,53,14,129,52,161,112,225,181,10,224,23,13,252,138,
-0,224,99,3,239,153,9,224,132,9,226,243,3,66,235,136,48,252,217,7,
-174,71,188,211,2,51,52,32,252,211,1,229,247,0,108,131,204,195,64,74,
-200,57,101,230,150,255,204,192,160,38,64,37,136,40,224,110,4,253,61,1,
-224,105,3,64,44,136,50,253,27,12,221,21,253,18,58,224,29,20,224,26,
-17,224,23,14,253,96,2,160,197,200,164,45,49,232,169,5,245,48,3,232,
-169,17,245,176,3,243,152,2,188,36,239,110,14,253,14,5,162,247,244,156,
-0,116,138,160,11,235,200,0,2,56,53,52,249,246,3,233,166,0,234,70,
-5,159,68,64,41,112,206,2,55,54,54,238,195,4,201,76,228,103,2,234,
-105,3,210,43,96,7,130,175,241,91,2,166,62,227,189,1,243,127,11,2,
-51,50,32,225,90,1,222,78,220,237,121,123,242,40,21,36,152,241,7,5,
-242,161,8,242,21,0,242,17,13,240,204,9,64,146,97,225,229,121,7,47,
-63,198,95,227,98,21,39,76,227,98,9,175,243,64,239,201,122,129,154,64,
-114,136,129,53,27,2,51,32,75,127,156,134,212,64,26,168,93,227,53,11,
-227,61,7,227,65,30,226,211,1,32,95,64,171,194,207,129,160,176,10,237,
-103,1,254,170,6,191,25,235,248,1,249,66,36,224,89,0,240,7,22,227,
-39,1,236,64,0,232,66,15,203,253,240,48,20,230,68,8,229,112,8,98,
-217,2,48,48,32,237,160,12,234,222,5,188,21,235,201,0,231,89,7,230,
-81,16,129,5,165,205,249,53,3,228,60,4,241,87,29,241,160,3,231,86,
-196,251,104,18,241,35,9,209,77,228,91,7,228,156,2,234,208,0,237,48,
-19,236,217,8,32,51,224,149,0,229,104,1,226,134,3,165,105,2,50,57,
-54,228,18,4,226,83,17,224,121,5,255,103,5,162,93,230,40,6,103,224,
-250,152,12,192,140,243,137,3,241,26,2,251,80,2,253,18,1,226,200,6,
-227,223,4,226,131,4,230,50,9,121,142,32,205,2,54,51,32,2,95,54,
-49,128,154,165,63,225,129,1,32,2,141,244,224,104,7,193,4,129,138,175,
-82,38,49,2,56,53,32,224,66,3,128,60,224,36,3,192,211,160,25,70,
-102,110,79,247,125,4,237,213,1,2,98,97,100,2,32,115,121,2,110,111,
-110,2,121,109,32,2,117,115,101,223,104,96,169,64,69,229,255,14,233,76,
-2,204,57,101,26,177,127,33,115,37,205,32,19,2,90,32,90,229,40,3,
-247,163,1,97,109,254,76,39,217,149,237,241,29,236,117,56,173,38,236,129,
-1,135,85,65,5,196,181,198,162,153,67,200,225,2,80,32,75,230,226,1,
-226,87,4,132,194,253,193,1,232,211,1,32,11,130,212,32,96,86,193,130,
-60,252,148,3,225,133,8,97,220,227,168,4,229,68,26,66,15,140,139,192,
-43,238,109,30,229,54,26,238,224,29,228,224,21,251,208,2,139,206,253,102,
-2,233,22,1,241,45,0,2,95,51,51,134,87,34,170,34,230,253,220,0,
-98,158,93,149,240,211,2,2,117,98,115,116,152,2,109,112,108,2,101,109,
-101,2,110,116,101,144,245,199,214,139,191,125,109,64,14,139,168,32,14,2,
-52,32,90,224,1,4,255,248,2,64,39,139,163,131,130,75,234,32,6,33,
-110,64,25,138,247,224,128,1,2,100,105,99,81,84,64,26,242,31,1,251,
-67,7,201,148,229,23,7,228,52,0,160,247,116,131,194,3,179,23,146,29,
-2,48,50,49,99,148,251,46,8,64,158,32,117,91,85,32,47,160,230,137,
-71,96,110,106,136,2,95,51,53,2,53,32,102,245,206,6,2,45,104,97,
-2,112,112,101,2,110,34,32,160,72,137,97,250,188,134,2,61,62,34,250,
-188,21,160,32,250,188,31,76,94,65,26,65,22,33,21,69,61,76,33,224,
-90,12,2,84,121,112,133,59,64,55,246,132,4,110,5,34,29,2,57,54,
-51,135,88,65,212,2,57,54,52,104,250,2,54,50,32,224,135,0,33,128,
-2,57,53,53,171,228,101,60,64,75,130,148,236,137,3,65,253,224,79,15,
-149,89,244,156,3,2,50,55,54,98,147,203,170,64,88,241,220,28,134,77,
-128,20,234,178,1,229,145,4,224,26,12,133,127,229,87,9,96,22,130,49,
-133,60,192,148,241,75,21,132,172,224,43,2,241,55,20,130,236,233,191,10,
-192,24,226,73,1,128,7,224,40,8,226,114,7,159,44,230,120,0,224,12,
-1,2,95,57,50,32,84,101,128,2,49,50,32,238,13,6,224,175,0,228,
-45,4,130,244,178,136,32,33,64,228,160,76,2,55,55,48,224,67,6,135,
-130,197,243,224,253,7,243,109,13,242,53,138,128,254,229,242,21,225,34,2,
-226,55,9,242,31,4,33,8,143,163,97,15,2,89,32,66,167,106,228,72,
-1,168,252,135,21,64,53,116,29,225,63,2,198,130,220,253,230,229,1,224,
-101,0,143,150,160,52,224,60,2,224,172,4,242,72,6,64,35,165,209,2,
-80,32,35,96,181,32,121,64,24,208,253,169,209,34,55,36,87,64,24,134,
-3,99,247,142,254,2,48,49,49,128,25,215,184,250,104,0,2,49,48,32,
-96,24,165,172,101,231,2,55,50,56,228,140,3,2,91,93,34,160,137,133,
-156,131,34,224,5,1,128,237,32,238,202,96,135,93,65,44,96,9,2,83,
-32,83,69,87,70,206,132,140,250,253,8,230,34,0,96,52,128,154,130,177,
-2,53,56,32,234,89,9,2,99,111,109,2,112,111,115,2,101,83,101,152,
-72,185,169,2,48,48,55,80,242,137,102,198,230,130,227,2,48,56,32,115,
-196,2,56,55,32,128,47,65,106,71,253,225,106,6,74,115,133,19,251,152,
-6,224,149,5,128,144,224,143,1,2,104,97,115,2,70,105,101,2,108,100,
-34,131,161,2,57,56,55,97,83,64,117,224,77,42,2,115,101,116,224,77,
-12,133,175,134,164,32,14,71,215,224,63,2,2,95,51,48,66,26,249,84,
-3,2,99,67,111,2,110,69,114,57,187,161,190,2,48,54,32,230,61,3,
-225,159,0,196,41,135,252,2,55,50,32,225,62,1,2,48,48,51,250,27,
-20,32,97,2,116,114,111,2,108,46,69,2,120,99,101,2,112,116,105,2,
-111,110,46,2,73,110,116,2,101,114,110,2,97,108,46,233,0,0,234,221,
-5,32,82,64,174,157,37,119,106,251,101,19,2,44,32,97,2,116,32,34,
-164,248,72,117,2,56,52,50,241,45,0,65,2,128,207,236,148,0,133,62,
-106,132,102,14,96,205,2,95,56,56,168,254,96,212,2,52,56,53,128,117,
-2,52,56,54,97,140,60,137,226,131,5,161,158,224,230,2,2,104,97,114,
-128,133,242,10,0,64,197,99,124,35,147,64,52,35,191,64,21,201,125,243,
-40,10,2,57,57,53,249,18,1,254,112,6,171,190,224,21,8,232,186,4,
-73,100,243,30,2,232,107,0,244,146,7,238,82,1,180,129,255,158,1,224,
-29,7,238,120,1,168,2,244,92,1,132,198,32,102,2,54,51,57,67,181,
-65,175,60,124,142,112,32,133,83,245,68,116,2,49,56,51,2,32,35,49,
-129,162,68,59,107,57,131,112,197,238,105,143,122,174,36,184,2,90,32,67,
-33,173,78,56,161,12,227,5,13,2,78,101,115,43,69,2,32,102,105,35,
-9,2,115,32,110,63,247,2,97,108,108,2,111,119,101,235,88,1,225,11,
-4,73,180,254,76,7,245,41,3,141,48,78,59,224,50,6,160,162,194,65,
-174,211,224,154,10,226,168,21,2,101,120,116,2,114,97,32,96,173,2,40,
-115,41,162,178,32,48,2,51,57,57,206,228,131,160,228,175,0,2,57,57,
-57,204,83,192,31,192,195,241,4,0,235,169,8,224,26,6,106,95,167,4,
-143,180,208,224,134,211,88,45,246,154,1,195,34,236,216,19,100,113,113,67,
-128,148,2,57,49,56,32,32,125,93,238,39,2,2,48,49,32,234,205,2,
-64,215,190,13,166,11,2,85,32,80,32,32,229,100,15,166,106,2,53,54,
-48,164,128,64,20,134,90,97,23,75,127,74,123,2,64,58,57,65,61,128,
-22,64,45,99,166,119,74,2,57,49,49,64,76,96,43,150,30,106,119,32,
-109,144,22,225,53,2,2,67,32,79,231,90,1,224,25,5,99,250,193,24,
-32,120,128,97,140,171,166,71,160,56,252,35,5,227,201,2,226,220,1,201,
-129,242,59,8,157,200,226,243,11,137,143,229,178,4,2,111,114,100,2,32,
-119,105,2,108,100,99,2,97,114,100,226,245,9,106,182,224,192,1,80,254,
-200,167,232,198,0,32,110,64,173,96,205,224,251,0,248,9,2,161,222,193,
-190,2,57,57,55,97,66,64,69,2,65,32,64,2,64,65,32,64,19,166,
-41,64,70,105,21,107,235,32,23,232,138,1,238,94,10,233,35,0,225,45,
-4,164,73,64,119,97,81,242,138,4,248,126,2,2,57,57,51,249,115,16,
-32,121,133,110,2,75,32,66,244,26,7,187,38,136,142,144,240,155,25,224,
-72,4,32,163,147,195,227,78,3,32,86,133,175,215,235,239,135,8,32,33,
-216,128,33,226,69,227,96,197,161,3,69,179,192,7,64,168,32,28,226,198,
-0,230,77,0,134,75,2,58,57,56,232,91,45,2,103,101,116,232,13,9,
-2,57,56,56,161,160,203,146,209,121,133,216,220,174,96,11,231,209,0,103,
-6,228,134,0,230,242,22,2,80,114,111,2,120,121,34,163,246,224,153,2,
-32,123,220,141,102,251,141,79,74,144,96,129,252,241,3,2,57,56,51,129,
-217,64,56,32,30,176,206,98,34,34,151,33,25,208,44,96,33,199,77,64,
-52,97,105,64,62,234,248,2,97,191,128,104,129,147,238,186,18,2,50,52,
-55,64,12,116,66,238,186,0,246,89,12,2,57,48,51,243,213,3,231,49,
-3,89,123,229,90,1,101,66,109,164,64,117,56,116,224,55,0,217,213,185,
-139,242,102,1,88,157,224,5,6,247,24,7,134,151,96,59,238,48,13,228,
-86,0,128,24,143,148,166,54,2,54,56,52,129,96,187,116,241,226,5,175,
-242,177,199,99,193,69,94,2,55,53,32,96,73,2,80,32,95,105,28,2,
-57,50,50,97,37,102,19,96,18,237,50,2,246,76,0,199,82,148,33,32,
-69,219,79,160,211,64,162,246,31,0,141,34,33,247,249,191,0,181,199,98,
-62,131,63,2,80,32,58,96,31,228,78,0,225,153,10,192,213,247,71,3,
-96,42,221,99,232,176,4,96,150,100,229,96,241,225,100,0,239,7,0,228,
-11,1,75,75,228,10,5,32,152,64,210,130,159,234,81,3,64,84,253,74,
-0,32,36,131,120,68,135,224,178,19,224,210,0,128,106,247,84,1,2,57,
-55,54,131,110,2,57,51,52,224,120,0,227,80,1,208,66,74,157,204,200,
-252,169,4,64,46,131,102,2,90,32,85,96,144,191,200,250,246,0,132,233,
-133,147,32,30,131,88,224,167,1,2,55,49,55,77,145,231,170,0,130,145,
-233,41,6,98,63,2,55,49,56,128,15,231,33,0,2,52,52,57,102,187,
-93,88,2,57,55,49,253,87,2,225,76,4,68,76,170,29,234,40,14,64,
-158,64,209,32,159,229,128,0,245,10,6,245,16,8,128,251,131,249,253,128,
-0,71,235,253,98,24,224,32,23,224,29,20,224,26,17,224,23,14,224,20,
-11,224,17,8,224,14,5,224,11,2,235,152,1,70,199,254,27,0,225,3,
-4,198,128,69,20,144,93,64,21,190,154,53,149,147,179,145,90,235,251,1,
-224,9,2,68,109,164,2,2,51,50,48,66,220,2,51,56,32,72,36,224,
-6,3,105,186,64,3,100,160,192,76,32,5,43,68,2,53,51,55,160,28,
-119,66,224,106,18,108,191,192,108,96,88,128,114,224,108,31,2,82,32,95,
-224,108,24,161,51,74,0,128,34,224,110,4,160,103,224,117,4,224,106,9,
-224,63,3,224,113,2,173,5,131,39,192,147,224,40,0,224,108,16,224,115,
-4,128,67,224,61,13,160,106,43,201,2,57,32,102,231,123,0,2,92,51,
-52,2,38,115,114,2,99,47,77,2,105,99,114,2,111,72,115,2,47,84,
-67,2,77,111,110,2,97,100,46,2,104,115,92,32,25,2,44,49,55,2,
-52,58,53,237,6,2,117,238,68,125,166,239,42,85,224,11,1,231,7,2,
-2,54,56,32,192,11,74,137,160,10,75,133,128,10,2,58,57,54,203,110,
-66,124,49,122,64,18,132,240,250,241,1,224,9,1,96,33,35,224,140,45,
-64,242,32,46,176,165,224,46,10,224,56,2,71,165,224,56,0,224,63,5,
-182,68,224,53,10,224,149,1,224,52,8,165,3,36,158,226,59,3,183,209,
-193,161,96,51,128,50,224,6,6,224,33,0,97,195,224,91,3,224,33,14,
-160,26,224,40,3,224,33,13,224,40,3,69,45,41,70,151,80,32,180,234,
-209,1,232,148,16,96,242,51,62,171,45,69,149,90,120,230,22,0,238,141,
-15,2,97,115,115,2,101,114,116,66,54,2,100,101,58,2,32,101,120,2,
-112,101,99,47,76,2,61,34,32,252,235,2,249,218,1,121,205,2,51,49,
-32,32,154,139,161,94,89,34,9,2,79,32,95,120,70,64,7,73,67,96,
-7,32,152,229,148,0,241,185,21,2,103,111,116,160,113,128,98,160,93,196,
-198,66,3,102,198,133,229,32,16,165,219,2,49,50,52,32,17,225,78,0,
-2,55,32,102,224,84,0,2,84,67,69,2,120,112,114,153,139,224,25,7,
-249,39,0,224,26,9,2,75,105,110,203,63,224,26,7,2,83,111,114,212,
-68,73,35,192,165,32,39,99,22,142,101,64,6,171,186,176,35,2,50,52,
-50,65,176,153,26,84,163,175,67,231,44,1,240,72,18,225,54,19,2,77,
-117,108,2,116,105,112,2,108,121,32,2,100,101,102,2,105,110,101,2,100,
-58,32,160,184,2,51,49,51,96,246,143,139,32,147,165,239,2,51,55,57,
-41,73,95,134,175,62,2,53,55,32,239,62,0,67,44,96,22,254,61,0,
-194,173,221,116,154,238,96,197,98,163,32,51,200,141,40,129,108,107,64,24,
-128,16,226,164,12,233,6,18,233,35,14,246,243,0,203,15,233,154,8,216,
-106,160,163,224,31,1,105,81,32,235,234,192,4,2,51,53,32,106,192,141,
-109,202,192,224,94,13,2,52,48,32,233,142,3,235,137,1,233,207,23,253,
-35,1,224,173,10,224,200,12,253,68,0,224,51,6,96,130,241,214,6,96,
-23,67,129,80,221,163,32,75,190,145,39,2,52,32,67,128,239,99,134,131,
-132,64,6,98,126,254,137,7,2,99,99,32,226,214,3,32,38,69,246,96,
-87,129,47,129,52,37,43,192,21,2,57,53,48,224,11,2,224,133,0,32,
-6,67,181,96,11,32,141,132,174,237,115,1,97,11,114,97,32,76,128,199,
-187,62,107,167,237,5,2,64,68,34,253,2,53,54,55,130,105,45,155,224,
-6,7,32,95,234,8,0,2,50,32,75,2,52,32,65,162,140,237,233,9,
-224,114,4,224,101,4,2,55,48,51,224,101,14,32,72,227,194,0,224,72,
-26,2,53,54,54,224,72,17,131,119,245,223,0,224,69,3,160,60,224,133,
-8,2,58,57,52,239,252,1,114,106,64,46,189,152,2,52,54,32,171,31,
-235,41,14,192,66,131,203,112,170,235,28,4,32,26,195,178,71,32,2,49,
-49,52,67,181,32,86,225,79,0,235,77,7,32,29,130,91,32,27,113,239,
-66,73,128,14,111,141,66,95,102,154,197,154,66,118,96,76,235,155,12,32,
-31,202,146,102,162,2,56,57,55,140,227,140,40,68,176,204,40,32,42,196,
-183,171,193,235,69,5,119,5,235,179,15,235,214,93,235,116,4,2,58,57,
-51,225,185,1,2,57,49,55,213,203,117,22,2,52,57,49,170,75,2,79,
-32,80,91,106,67,70,120,210,2,79,32,66,173,225,244,79,0,64,29,100,
-165,97,255,105,245,97,64,129,96,68,187,99,235,32,43,2,95,51,53,70,
-43,67,112,241,142,3,2,105,109,105,2,116,105,118,2,101,115,46,227,219,
-0,32,54,129,248,224,38,12,166,244,32,36,197,191,224,195,21,67,2,121,
-9,224,202,0,142,128,145,172,96,20,77,241,144,46,96,186,224,48,9,102,
-16,224,48,2,110,142,224,48,19,100,237,224,48,2,117,219,224,48,19,142,
-96,224,48,1,99,124,224,48,1,217,205,96,27,188,132,192,42,129,120,64,
-162,225,120,0,215,138,225,169,10,65,56,131,36,80,169,64,32,65,159,2,
-57,51,50,64,74,134,118,224,10,1,96,128,32,37,189,119,2,57,51,49,
-64,51,212,57,159,207,96,5,32,26,64,198,2,49,57,32,225,219,13,2,
-45,62,34,177,38,32,66,244,73,1,125,197,244,73,0,32,66,226,44,0,
-2,58,57,50,130,160,115,242,32,13,162,72,161,46,117,181,65,8,226,37,
-15,96,112,32,34,130,35,224,34,12,2,78,97,116,128,35,129,14,226,147,
-13,2,121,109,98,2,111,108,34,96,38,129,42,224,38,12,60,46,2,115,
-116,114,2,97,105,110,160,81,161,47,226,245,27,233,195,0,32,54,129,88,
-224,38,12,170,5,32,36,184,101,65,51,129,112,32,19,196,123,38,108,224,
-61,1,2,98,117,105,41,115,2,110,34,32,2,64,64,35,32,32,64,3,
-2,58,57,49,201,80,119,222,149,220,81,15,108,155,241,159,0,178,214,32,
-95,97,213,41,206,2,57,49,54,167,118,224,18,7,32,63,129,135,108,166,
-134,61,123,19,224,9,0,171,150,243,224,2,2,57,49,53,224,6,1,138,
-163,108,66,96,81,32,80,197,227,108,231,140,234,2,60,32,64,102,58,214,
-26,160,18,98,161,47,185,2,55,50,50,252,132,1,252,93,4,96,200,232,
-76,5,54,123,2,73,100,101,97,172,120,124,2,90,32,95,224,138,1,2,
-85,32,73,160,214,216,20,32,28,141,215,106,123,70,134,253,10,2,189,236,
-136,34,99,108,249,208,10,64,7,131,74,64,73,234,185,7,148,66,186,204,
-96,82,205,11,129,58,167,128,108,187,173,48,71,173,197,201,64,89,179,102,
-85,217,133,247,224,87,1,245,247,1,102,11,248,166,1,161,90,213,72,128,
-115,192,251,130,101,116,45,67,31,64,126,100,104,2,51,51,56,97,79,153,
-55,34,11,231,31,17,91,246,231,31,1,74,54,231,31,7,216,103,242,231,
-194,242,218,9,32,250,204,173,225,37,12,111,188,225,37,0,163,74,232,69,
-7,136,63,225,43,173,225,18,7,32,229,233,195,0,201,242,245,25,13,32,
-41,131,131,85,70,250,198,2,224,39,6,32,38,131,147,32,38,47,98,192,
-39,234,21,1,77,208,132,79,228,24,3,176,194,255,54,5,129,114,237,46,
-6,2,56,57,54,252,7,1,2,95,50,49,118,68,199,177,125,1,126,56,
-42,228,32,55,196,132,128,121,227,155,1,225,252,2,185,29,130,1,2,56,
-57,57,246,112,2,195,158,2,95,52,49,103,129,158,245,32,72,131,144,234,
-246,4,246,78,14,32,44,234,139,8,125,199,246,80,204,246,75,10,2,58,
-56,57,198,229,224,244,26,225,24,207,158,97,225,18,1,228,132,4,2,55,
-49,50,101,123,80,107,97,62,32,32,132,122,237,11,5,248,177,16,99,18,
-224,79,7,103,174,64,119,70,69,32,34,175,232,2,55,49,48,2,32,58,
-56,190,233,168,121,207,82,224,2,3,188,103,225,22,6,186,174,100,73,2,
-54,52,50,240,211,2,64,120,107,241,2,54,57,53,253,9,4,64,24,2,
-54,57,57,225,25,0,39,58,99,159,2,56,57,50,174,90,2,56,57,51,
-250,155,6,151,126,231,21,0,136,93,96,121,149,116,224,25,6,96,92,67,
-196,232,160,5,64,102,247,90,0,160,19,136,161,35,183,231,145,0,68,206,
-224,12,0,149,13,224,50,5,67,244,224,50,5,157,47,231,52,3,189,151,
-230,31,2,239,235,3,182,98,178,107,228,170,1,232,9,2,64,47,200,8,
-200,100,189,13,168,12,232,44,2,221,230,126,40,137,208,104,15,228,242,3,
-32,12,128,172,240,68,0,96,34,2,54,56,51,193,97,192,16,130,124,69,
-57,2,54,57,51,64,17,180,156,97,204,245,78,2,224,179,3,64,202,226,
-250,6,133,124,2,53,54,50,193,18,32,152,98,246,192,211,224,130,1,233,
-80,4,2,95,54,53,224,117,1,224,206,4,128,171,224,131,4,194,84,137,
-231,254,25,1,233,107,3,131,28,192,130,224,50,1,129,70,243,98,1,225,
-50,8,64,13,234,184,2,141,182,241,239,1,241,59,13,43,251,128,45,105,
-172,43,245,2,53,32,102,234,219,0,2,36,102,34,224,140,0,2,89,32,
-66,160,156,203,131,64,144,32,7,64,50,245,174,20,2,36,120,34,246,225,
-2,2,49,52,56,225,14,5,224,162,24,244,31,0,253,47,0,96,179,224,
-185,0,32,69,235,0,0,206,224,226,171,14,96,16,225,91,0,251,118,0,
-67,45,164,149,228,156,1,227,12,2,97,112,255,180,2,231,155,6,160,51,
-97,65,224,0,0,236,110,6,137,167,227,153,4,65,7,227,203,7,224,169,
-0,47,144,226,122,1,66,135,228,142,3,181,0,227,81,2,65,25,64,20,
-64,164,2,51,51,55,129,152,64,172,208,188,64,180,132,216,160,223,228,55,
-6,161,100,228,156,9,182,191,224,206,6,96,107,224,206,5,64,93,228,154,
-8,228,117,3,132,118,224,225,17,128,77,236,162,0,101,170,96,216,66,25,
-2,55,48,56,184,22,2,56,56,54,76,59,248,43,2,240,167,1,131,215,
-224,193,6,173,17,224,174,6,229,73,9,128,159,95,45,104,225,96,11,160,
-13,224,177,1,128,9,64,174,226,5,3,97,146,32,4,2,53,32,79,2,
-32,35,55,249,254,1,230,232,4,224,94,3,253,83,1,228,116,4,134,64,
-229,154,0,195,236,130,126,161,233,224,123,7,229,91,11,44,17,2,56,57,
-48,227,36,1,250,205,3,66,240,57,17,33,84,58,171,120,233,96,165,238,
-58,1,133,58,2,51,48,56,134,230,79,193,108,87,96,21,84,197,244,5,
-0,245,198,1,80,16,227,1,3,39,20,138,173,50,24,64,66,220,175,231,
-174,1,47,124,32,99,55,242,86,190,254,181,3,225,189,2,92,200,2,95,
-54,49,96,135,182,44,2,56,56,56,96,14,2,56,57,32,98,212,32,60,
-32,96,138,163,255,92,7,198,156,129,89,230,72,11,248,150,1,226,121,8,
-68,239,65,54,64,78,128,144,198,52,201,31,142,240,195,27,231,64,0,129,
-184,230,95,1,224,29,5,230,54,5,160,7,226,62,1,248,164,2,2,101,
-113,34,172,243,230,65,1,224,87,1,225,246,7,231,17,0,228,41,0,160,
-225,230,99,0,151,133,255,163,0,100,250,145,72,97,129,65,18,218,145,229,
-146,2,97,216,96,40,32,161,101,125,197,149,231,116,26,230,78,16,230,76,
-1,200,123,232,141,1,229,103,0,230,91,54,34,36,36,241,226,163,8,34,
-46,66,59,125,85,129,247,232,75,2,196,236,224,20,1,226,7,154,96,70,
-2,56,56,55,231,154,0,117,221,134,37,2,95,56,51,96,245,213,243,128,
-39,225,167,4,164,163,225,148,117,65,149,212,57,233,220,7,226,101,8,226,
-85,6,183,232,96,217,147,76,37,69,34,171,254,88,0,224,200,3,203,162,
-225,159,0,229,134,0,68,147,175,76,228,64,2,96,139,50,181,201,246,227,
-80,2,107,22,192,57,99,128,68,151,69,36,170,194,137,229,227,20,5,96,
-13,144,60,101,202,128,29,2,55,55,52,233,198,2,2,56,50,56,233,147,
-2,234,82,2,85,81,85,116,165,213,2,95,55,51,2,57,32,102,225,8,
-1,194,40,208,31,116,207,32,36,33,107,65,50,230,140,1,33,43,141,113,
-228,64,3,166,140,2,55,49,49,233,36,1,225,9,3,74,163,224,13,0,
-234,152,1,173,165,224,40,2,180,4,2,56,56,50,97,16,125,38,2,51,
-55,51,238,79,0,224,207,4,2,55,50,48,105,247,253,232,3,113,89,134,
-0,204,60,230,158,0,224,244,8,130,107,32,209,142,32,124,61,195,82,65,
-115,32,68,120,18,224,50,1,55,96,2,116,114,111,2,108,46,69,2,120,
-99,101,2,112,116,105,2,111,110,46,2,73,110,116,2,101,114,110,2,97,
-108,46,2,112,97,116,64,9,2,77,97,116,2,99,104,70,2,97,105,108,
-196,175,131,76,193,87,139,215,98,220,2,56,52,50,196,84,206,146,2,80,
-32,35,137,10,64,20,142,25,225,53,3,2,95,56,55,231,77,0,2,56,
-56,49,110,220,65,41,111,46,196,122,33,81,86,176,32,47,239,46,3,230,
-195,6,65,99,88,29,67,146,65,94,79,109,114,220,227,110,1,161,73,130,
-193,2,56,55,55,167,224,224,46,4,126,69,195,156,47,192,68,6,213,253,
-192,111,231,81,16,130,250,224,5,3,233,136,0,229,44,1,227,75,2,139,
-128,240,201,11,233,178,5,228,50,3,226,164,9,238,123,6,224,77,8,224,
-75,5,143,187,230,178,1,238,133,5,224,5,3,96,158,232,16,1,248,22,
-3,228,59,1,106,183,238,59,9,32,83,248,38,1,224,114,0,192,34,105,
-214,170,225,230,66,2,241,121,2,166,69,224,17,0,2,83,32,73,196,111,
-224,52,1,207,149,241,197,7,160,119,247,200,0,238,37,0,241,194,7,224,
-143,5,224,190,0,227,193,2,239,161,4,224,56,0,229,255,0,238,206,4,
-225,220,1,237,104,8,192,83,225,181,3,249,79,0,202,211,32,34,67,158,
-205,215,237,239,1,237,108,2,132,75,2,55,57,32,42,110,211,157,160,9,
-230,139,17,43,133,2,49,50,54,203,134,230,135,11,204,140,228,194,1,67,
-11,216,192,2,56,56,48,64,16,227,26,1,197,244,226,134,2,227,7,4,
-236,109,6,227,59,3,106,210,241,146,5,163,135,224,128,18,2,55,54,56,
-224,128,5,225,71,1,226,104,4,225,99,1,102,214,174,167,128,144,224,82,
-5,125,186,32,120,160,84,224,91,0,102,193,192,40,224,108,3,226,235,2,
-231,76,5,64,51,90,18,239,171,10,219,235,197,172,36,218,221,162,101,24,
-131,215,32,152,32,24,217,238,182,78,199,158,64,7,98,58,2,58,56,55,
-213,121,175,222,128,211,64,124,224,97,1,226,233,0,224,246,17,98,71,224,
-246,24,32,110,244,213,0,177,210,233,145,24,32,51,200,115,224,162,1,225,
-244,1,33,65,230,217,6,249,130,13,224,13,1,205,1,164,14,244,153,1,
-224,69,2,101,204,226,26,2,228,244,2,64,122,2,39,32,85,32,47,33,
-58,224,176,1,2,92,51,52,2,38,115,114,2,99,47,77,2,105,99,114,
-2,111,72,115,2,47,68,101,2,115,117,103,2,97,114,46,2,104,115,92,
-32,25,2,44,51,56,2,53,58,49,2,48,34,32,229,112,5,243,44,5,
-229,109,5,227,248,2,224,2,9,224,71,1,228,182,3,230,13,6,230,10,
-4,229,190,10,128,201,244,78,0,132,174,224,85,9,133,10,229,246,5,224,
-96,1,224,102,8,247,158,14,230,122,17,247,174,15,227,135,8,224,52,26,
-224,195,3,224,31,11,130,5,225,95,17,246,209,13,224,23,1,247,8,2,
-233,157,0,194,68,224,8,10,166,112,224,11,0,215,26,247,42,0,105,153,
-195,41,128,83,228,144,4,226,239,3,240,163,6,166,61,209,194,224,76,0,
-226,207,12,107,222,99,112,2,56,52,53,225,172,5,229,117,5,231,169,4,
-138,154,198,90,142,162,202,43,232,51,8,245,70,3,151,222,245,70,1,105,
-72,65,200,32,36,199,94,183,29,183,21,228,98,2,225,243,11,236,83,1,
-242,40,0,114,205,224,144,5,165,68,147,22,196,184,196,154,229,123,1,235,
-134,0,2,51,57,52,238,139,0,64,163,236,186,4,252,122,4,96,135,145,
-200,224,141,4,130,81,2,95,56,53,179,35,250,95,18,226,206,7,232,71,
-0,224,48,14,226,202,2,226,197,17,226,161,3,226,32,0,97,33,128,220,
-32,213,253,68,6,114,176,128,200,148,157,82,119,224,187,6,226,226,36,106,
-250,226,214,3,226,212,0,226,96,18,173,215,247,174,4,194,52,242,38,4,
-129,149,210,213,207,49,226,67,2,240,33,0,196,166,226,73,14,192,146,244,
-1,6,248,129,2,194,4,83,215,72,241,226,84,8,228,92,3,229,191,3,
-176,111,228,79,3,233,247,3,224,11,12,228,24,55,230,53,7,239,71,0,
-223,8,228,229,4,227,164,10,224,182,0,225,197,1,2,54,50,53,224,60,
-3,226,5,8,241,202,2,224,101,0,73,199,74,12,52,59,235,24,2,229,
-82,9,230,8,4,224,164,6,236,113,1,141,4,228,112,2,74,161,79,224,
-242,244,6,194,46,246,236,1,96,225,72,11,129,171,228,34,1,213,145,32,
-160,235,83,1,194,114,229,33,2,245,245,0,2,56,54,50,240,131,2,250,
-5,1,2,56,54,51,234,57,0,96,16,2,50,51,57,236,10,7,224,45,
-0,66,185,74,8,65,30,2,54,52,32,148,2,2,56,54,53,234,147,0,
-99,196,137,72,128,178,96,16,192,100,229,96,10,163,31,66,131,228,203,0,
-253,86,3,233,2,3,99,94,43,207,160,14,228,13,5,253,1,7,68,9,
-228,235,11,100,23,183,188,164,247,224,39,5,132,73,192,38,224,37,2,252,
-254,3,133,174,224,229,0,2,90,32,89,237,118,0,231,226,11,107,180,128,
-59,235,43,3,233,250,0,237,178,1,239,29,2,164,8,237,173,5,231,201,
-5,230,94,15,128,111,224,59,5,163,230,238,196,20,106,214,236,50,2,237,
-226,2,230,147,3,228,84,18,235,17,1,146,37,233,72,1,153,69,238,86,
-1,244,206,3,228,229,0,233,190,2,226,252,1,255,246,4,235,6,21,224,
-63,0,206,121,228,74,3,174,85,251,190,0,227,144,0,179,190,150,214,2,
-54,56,57,128,39,251,213,8,176,230,34,113,32,222,242,50,0,248,118,4,
-89,145,248,119,2,131,96,184,125,88,111,64,6,35,10,32,63,209,242,128,
-177,84,116,190,26,252,57,1,229,210,5,224,21,20,224,227,5,224,46,8,
-160,35,195,205,149,18,166,138,215,218,128,84,228,228,3,99,129,228,14,0,
-243,204,7,238,212,4,187,131,250,232,1,143,158,2,52,51,53,117,138,104,
-70,254,156,2,225,252,11,229,133,0,236,8,0,240,163,2,240,224,6,225,
-252,5,232,57,0,224,66,0,224,94,1,231,208,2,253,141,1,109,91,36,
-89,2,50,57,50,248,143,3,240,56,2,194,43,96,26,32,93,232,154,0,
-249,252,1,32,208,36,67,129,181,194,243,243,178,4,245,226,5,224,5,2,
-202,180,231,41,8,246,40,0,250,115,11,192,25,160,90,225,40,1,192,18,
-232,77,0,32,77,2,56,54,56,246,243,1,128,6,136,42,130,148,101,192,
-47,127,97,123,175,70,68,210,224,14,5,2,95,54,51,162,202,160,0,247,
-229,13,225,205,0,226,56,1,164,41,225,8,1,150,175,2,56,55,49,228,
-42,7,247,144,7,2,110,34,32,224,22,11,2,116,116,34,175,215,220,26,
-239,252,0,98,165,220,170,88,25,34,114,164,158,92,172,92,38,161,231,188,
-151,225,185,3,32,80,208,100,33,25,34,233,193,177,128,56,2,51,49,57,
-128,142,2,53,51,55,128,45,208,121,165,184,80,203,144,77,241,141,0,128,
-238,35,98,96,146,228,144,0,231,243,0,235,190,3,130,54,64,119,176,231,
-67,91,239,23,17,232,109,2,238,193,1,235,72,10,230,38,1,233,41,6,
-238,249,14,224,98,12,229,29,0,183,80,163,130,229,86,4,234,110,1,249,
-5,5,192,8,224,17,9,96,8,194,37,252,64,1,252,37,4,252,38,1,
-224,93,1,237,76,6,224,89,1,224,8,0,33,208,68,200,97,92,2,54,
-54,53,241,126,12,2,61,61,34,233,105,0,250,227,4,237,91,1,230,255,
-2,228,91,4,224,16,16,123,224,101,247,66,113,98,252,84,49,64,13,153,
-108,2,35,50,32,254,222,1,240,59,4,241,110,25,2,69,110,99,2,111,
-100,101,2,68,97,116,2,97,46,104,145,113,2,49,52,49,2,58,49,51,
-241,113,2,225,253,6,228,169,0,237,118,14,224,45,28,224,22,0,193,234,
-249,179,4,234,252,10,234,90,5,170,50,65,21,225,148,16,53,102,75,90,
-233,242,0,225,143,9,245,44,5,226,160,3,226,122,4,237,113,1,234,97,
-3,234,227,4,165,109,197,187,35,113,147,174,57,108,32,11,147,134,35,201,
-68,17,88,215,128,3,2,80,32,90,32,1,164,89,229,234,8,69,69,32,
-53,2,95,52,57,106,57,66,214,2,90,32,66,133,68,134,175,160,14,230,
-105,6,234,119,4,202,72,65,158,2,75,51,32,192,24,224,55,11,32,15,
-43,192,171,107,32,126,136,126,225,158,5,66,100,32,26,200,89,100,162,156,
-165,196,18,233,141,3,242,187,7,202,163,65,205,248,195,9,2,85,32,73,
-233,251,2,234,222,24,246,111,16,169,208,214,11,49,183,33,146,33,123,2,
-56,52,52,124,155,142,47,32,197,135,74,2,80,32,58,108,184,64,235,241,
-103,0,233,113,4,96,162,176,239,224,184,13,75,195,181,241,234,253,0,224,
-149,0,96,57,172,14,192,36,224,37,9,96,24,221,121,237,120,4,2,67,
-32,79,235,211,2,246,236,3,32,184,134,90,230,171,7,2,51,51,55,32,
-8,37,254,227,246,1,2,99,111,110,2,65,114,105,2,116,121,34,225,24,
-2,2,53,57,32,226,54,4,96,132,32,84,198,129,32,33,71,227,66,38,
-32,22,32,45,232,122,6,231,123,2,96,44,127,227,235,184,0,199,11,36,
-127,67,112,129,37,135,158,32,76,214,205,230,229,2,133,153,175,144,224,95,
-0,96,64,192,53,214,207,239,7,0,32,5,64,117,175,92,54,239,205,203,
-133,175,141,145,2,53,56,53,192,164,237,237,2,158,172,96,86,190,110,252,
-50,1,129,225,227,32,3,202,98,32,7,64,83,99,7,76,150,32,55,2,
-75,32,89,231,17,0,247,36,1,226,61,9,224,25,12,2,50,49,32,241,
-124,0,226,12,0,96,20,227,171,1,79,170,137,55,224,37,22,230,239,3,
-242,67,2,226,138,4,224,48,4,2,90,32,67,224,88,10,224,38,10,175,
-135,170,83,231,166,6,227,236,12,235,138,1,239,34,4,244,13,13,130,246,
-238,115,3,224,49,13,236,155,3,241,159,13,32,42,137,80,199,14,225,64,
-18,243,209,2,225,63,3,229,17,1,132,40,70,53,229,136,0,228,31,15,
-98,82,224,25,12,96,94,129,38,224,25,6,96,168,192,25,251,131,5,99,
-10,224,184,16,96,30,224,185,11,242,26,3,251,191,0,225,133,9,64,120,
-225,133,8,237,111,6,161,72,224,88,5,162,6,2,52,54,32,252,169,6,
-224,164,10,245,248,3,224,163,13,225,21,13,202,212,225,21,9,252,152,2,
-224,111,10,64,29,225,19,27,224,58,10,100,174,224,170,21,224,59,16,64,
-34,224,59,22,227,249,14,226,23,16,99,100,225,1,12,166,133,224,138,14,
-227,183,8,128,138,2,49,51,52,225,1,24,64,114,224,58,10,2,56,52,
-55,36,79,79,98,225,7,24,101,36,224,65,10,228,141,2,226,234,13,226,
-233,21,228,226,14,224,146,1,227,221,39,224,143,2,232,242,0,100,214,35,
-232,136,17,67,232,32,249,49,100,160,193,158,60,96,17,109,179,160,17,32,
-48,136,55,160,48,35,46,32,26,32,118,32,24,135,151,2,102,47,61,40,
-93,64,18,64,12,32,149,2,58,56,52,231,69,2,103,255,32,4,62,250,
-97,127,96,6,32,34,135,27,70,208,64,45,230,90,1,197,37,246,153,15,
-196,251,135,177,224,7,1,117,202,72,227,97,207,64,184,64,6,160,184,104,
-151,116,139,161,12,99,220,32,34,179,93,32,1,158,51,226,195,11,207,19,
-228,245,17,224,25,9,2,49,50,32,233,74,18,103,132,43,8,32,184,32,
-5,32,143,136,234,107,220,224,19,6,167,109,126,113,176,189,207,171,2,50,
-51,32,64,207,246,250,2,149,55,240,94,1,255,125,3,32,7,80,12,214,
-241,41,166,86,120,72,21,44,66,2,49,50,48,201,126,2,95,49,50,75,
-66,65,159,233,141,1,32,17,2,53,54,55,98,93,88,4,32,44,45,153,
-2,51,32,35,240,135,3,233,237,9,97,3,73,238,160,24,128,141,108,202,
-188,104,224,6,5,239,102,3,229,97,4,214,46,183,206,225,109,9,233,83,
-0,234,109,10,234,48,0,160,100,128,65,2,95,55,53,92,239,2,52,56,
-53,34,32,46,100,234,182,2,128,52,129,99,65,31,161,99,253,26,5,106,
-2,229,181,5,224,53,0,65,166,241,121,7,2,102,34,32,205,161,64,34,
-2,53,54,48,221,114,96,49,97,246,224,50,14,224,127,8,139,65,2,95,
-56,50,253,177,6,177,59,229,106,21,233,178,9,242,240,2,231,234,6,161,
-118,32,105,235,142,0,32,6,77,195,172,96,129,221,237,25,2,180,58,233,
-44,11,133,159,224,32,18,199,169,225,200,8,192,24,190,19,211,143,2,55,
-54,57,236,141,21,207,13,64,193,79,15,34,213,249,147,0,227,154,8,65,
-36,48,71,2,56,52,49,192,167,226,77,12,32,73,195,25,128,92,224,154,
-2,2,95,56,56,76,209,225,33,5,225,95,1,226,178,33,224,154,0,196,
-148,238,2,13,254,141,2,212,59,212,237,252,221,12,252,220,7,224,52,21,
-234,140,9,224,10,4,224,52,13,251,129,0,224,41,2,249,42,5,64,42,
-236,115,4,226,245,5,113,163,2,76,105,115,2,116,95,84,2,121,112,101,
-2,46,43,43,241,162,0,250,206,2,194,243,227,202,3,240,186,11,195,98,
-228,101,8,33,199,252,45,0,64,23,36,223,98,222,239,65,7,38,33,140,
-254,37,21,69,46,2,52,50,32,128,32,32,52,77,118,37,74,35,199,128,
-17,32,43,139,67,2,75,32,66,192,168,78,158,248,32,0,229,117,5,224,
-242,1,2,105,109,112,2,111,115,115,2,105,98,108,2,101,58,32,160,237,
-173,234,148,232,128,61,69,149,2,56,52,50,128,78,98,99,253,242,0,224,
-94,11,37,212,2,51,50,32,242,23,2,64,64,252,27,1,96,174,168,9,
-224,218,3,166,159,241,247,0,189,94,102,18,2,51,49,32,32,91,161,106,
-224,115,14,65,2,160,98,239,229,4,230,84,3,224,56,12,79,43,230,128,
-14,193,100,150,104,64,6,168,56,97,220,161,228,97,207,226,75,11,2,82,
-97,116,2,105,111,95,98,76,2,95,109,107,96,13,2,110,97,108,229,141,
-1,99,207,32,5,100,25,224,15,1,2,52,48,32,96,109,136,227,97,105,
-32,13,136,228,97,69,2,58,56,51,136,229,72,60,129,172,73,27,90,182,
-2,53,52,53,64,9,125,120,100,17,2,56,51,49,64,88,162,180,38,112,
-74,112,130,147,224,37,4,66,218,201,244,224,215,23,2,73,110,116,2,101,
-103,101,2,114,46,95,2,105,110,116,67,47,2,84,111,73,128,17,224,218,
-1,102,189,186,154,48,173,244,26,5,32,7,188,222,224,105,30,161,67,32,
-110,224,106,10,229,103,6,200,37,130,104,65,81,97,54,40,247,64,29,35,
-20,2,95,54,50,128,33,164,49,32,36,137,173,161,105,66,52,66,155,2,
-56,51,50,64,199,168,115,2,56,51,51,64,18,84,250,2,54,32,35,64,
-95,140,96,139,65,224,29,15,32,77,131,196,2,117,113,117,2,111,116,32,
-32,14,131,167,2,73,32,58,64,50,211,31,67,46,225,220,2,216,207,2,
-80,32,35,145,217,64,20,129,255,253,12,0,117,175,250,53,1,133,179,247,
-78,1,38,15,241,147,0,2,55,53,48,132,53,202,77,50,239,132,144,98,
-245,220,64,232,227,0,252,17,13,49,252,195,96,39,148,131,33,2,58,56,
-50,130,136,70,240,178,151,136,27,64,6,139,10,64,42,145,252,235,106,3,
-244,198,1,232,2,2,64,185,248,93,1,235,189,0,133,59,221,196,192,7,
-246,69,1,225,16,1,160,19,32,10,254,5,2,229,188,10,158,40,91,100,
-106,16,2,53,57,56,227,147,1,187,171,162,160,83,198,96,200,128,237,171,
-214,221,84,2,95,55,51,247,250,3,2,36,118,34,129,244,64,67,243,125,
-3,96,252,253,31,5,151,111,198,201,241,229,2,150,137,253,58,3,193,185,
-251,160,4,65,146,160,47,223,40,64,208,2,55,51,53,253,199,5,96,29,
-65,49,234,101,0,128,25,116,18,64,248,243,120,0,2,56,49,55,160,42,
-235,250,0,225,165,1,255,230,8,248,72,3,231,236,7,224,187,0,152,178,
-250,138,1,97,151,2,56,50,52,227,230,7,2,66,111,111,2,108,46,111,
-2,116,104,101,2,114,119,105,2,115,101,34,232,189,0,245,204,3,248,50,
-4,97,22,2,55,53,50,164,213,224,116,2,64,23,67,78,224,23,0,33,
-141,131,130,243,105,4,176,62,32,28,131,144,128,230,251,147,0,227,82,0,
-251,87,0,224,17,1,192,131,227,138,0,243,196,0,230,241,0,251,195,6,
-254,11,2,154,251,232,182,4,234,23,2,249,234,6,251,151,2,255,77,14,
-128,146,253,198,0,228,22,2,238,191,0,224,27,1,100,19,235,75,12,128,
-30,135,46,130,250,196,54,193,78,44,168,38,56,236,168,2,228,70,8,225,
-165,1,226,154,1,2,39,32,80,99,103,64,41,68,62,160,124,227,192,1,
-2,95,56,32,163,99,135,219,232,34,0,227,231,0,193,85,240,219,0,234,
-159,1,163,92,157,114,250,185,2,99,15,253,202,1,227,82,0,245,14,3,
-96,240,67,166,32,240,2,57,48,32,250,175,5,236,37,2,163,185,225,208,
-5,225,95,14,253,99,1,224,16,1,32,93,66,104,96,146,227,80,9,235,
-108,0,2,95,52,50,248,43,0,33,129,225,149,2,224,167,9,224,22,8,
-225,147,0,226,129,0,192,36,229,18,5,119,192,33,112,120,11,252,178,7,
-124,153,2,48,58,48,99,124,201,70,96,210,224,46,25,138,10,207,177,229,
-18,5,2,109,34,32,233,180,1,2,56,49,53,64,229,248,64,1,104,129,
-32,15,2,83,32,73,230,123,5,64,186,65,52,225,12,0,160,48,2,54,
-57,57,198,214,106,228,97,3,96,218,2,53,54,50,66,71,141,158,224,131,
-5,2,112,34,32,224,159,1,2,54,51,49,64,39,167,158,66,119,102,157,
-2,95,55,52,70,10,98,225,32,22,186,176,230,95,0,133,48,226,223,1,
-131,117,32,161,237,122,5,2,51,56,52,226,199,1,236,166,1,177,7,98,
-163,32,51,240,14,2,32,35,66,189,130,95,145,57,247,213,1,242,119,1,
-235,203,1,2,83,32,80,226,144,1,224,72,1,203,52,102,42,198,208,230,
-6,2,128,120,199,6,101,233,192,37,227,115,1,33,22,42,237,209,252,156,
-232,131,241,224,10,1,33,27,200,158,32,184,250,172,7,231,132,2,153,232,
-230,245,3,194,249,228,199,0,238,149,5,205,72,197,89,230,121,5,252,233,
-11,225,97,3,253,17,13,232,1,1,252,88,25,252,241,12,192,64,253,23,
-1,224,116,1,245,106,9,242,48,1,225,200,1,119,250,255,112,0,255,144,
-2,230,205,3,224,181,5,175,218,230,246,11,224,40,5,235,175,0,224,186,
-11,224,28,2,132,245,220,193,67,1,228,33,1,133,164,32,175,165,167,2,
-53,50,49,237,14,0,93,11,242,151,0,225,43,3,254,3,3,232,195,2,
-241,124,45,129,204,225,19,1,241,157,16,243,160,13,240,141,4,229,223,2,
-232,152,9,150,165,128,254,224,198,1,224,16,0,254,89,29,225,191,26,225,
-23,0,225,190,21,183,40,225,189,12,224,27,2,64,210,240,241,4,206,217,
-197,18,161,206,226,106,10,128,224,246,206,1,160,55,187,186,96,28,2,82,
-32,95,224,219,2,240,59,4,240,56,19,2,112,97,116,2,86,97,114,2,
-115,32,34,130,40,112,145,102,49,160,225,118,55,70,108,32,26,75,40,2,
-52,56,49,106,131,96,88,96,127,36,72,238,210,1,176,116,128,49,2,52,
-56,56,204,35,128,17,209,181,153,104,111,175,200,179,224,31,11,113,18,224,
-129,1,241,243,0,99,17,224,194,1,2,91,93,34,100,158,224,30,14,2,
-40,41,34,209,164,107,235,64,177,64,202,171,255,2,52,54,55,66,58,2,
-48,52,32,64,23,172,227,203,128,131,74,71,56,97,90,235,126,1,32,42,
-223,98,109,222,99,163,35,126,32,23,204,50,173,142,2,80,32,85,35,176,
-42,174,2,55,55,57,216,99,2,55,56,48,2,32,64,89,230,40,0,237,
-77,1,99,219,224,7,2,64,211,134,50,250,87,2,33,137,79,131,97,61,
-32,111,203,20,2,83,32,85,226,2,0,164,35,164,40,105,62,130,237,142,
-33,165,72,97,190,249,35,5,134,148,236,217,1,197,146,64,46,136,219,139,
-171,32,194,101,230,64,204,128,215,142,161,64,216,136,110,70,173,235,71,0,
-224,141,3,192,36,167,140,237,89,0,166,99,167,0,226,232,0,160,254,120,
-188,145,201,226,229,1,33,9,100,16,146,146,210,202,32,21,134,130,33,28,
-236,20,3,235,249,0,231,120,4,65,248,236,21,2,106,130,198,215,199,199,
-236,9,13,235,228,6,224,19,2,165,80,224,16,13,202,193,233,254,0,225,
-225,0,255,212,1,96,161,224,162,0,154,156,222,118,231,165,2,32,2,224,
-175,4,171,65,230,113,3,228,187,4,231,178,5,133,236,118,210,81,185,229,
-23,3,192,2,181,220,224,174,0,135,246,224,138,2,240,197,4,203,25,232,
-242,3,231,255,2,235,111,4,104,84,128,5,173,151,139,118,241,169,1,229,
-127,0,224,100,1,237,195,4,224,71,3,129,19,132,5,101,125,36,10,36,
-235,224,70,3,42,251,251,227,0,98,188,193,252,227,135,13,246,174,2,195,
-146,161,198,225,183,6,129,170,254,193,3,80,234,224,196,0,224,43,0,84,
-143,139,2,224,157,4,251,14,8,227,237,0,32,176,96,32,134,243,96,68,
-224,53,0,45,240,230,159,1,160,0,99,205,192,220,194,215,162,227,32,97,
-2,53,54,51,251,128,14,239,236,1,34,106,123,229,193,6,163,177,196,139,
-224,20,2,162,208,163,101,139,123,227,203,0,229,47,0,233,87,0,189,140,
-200,94,166,190,96,81,246,128,1,122,144,171,95,128,25,240,195,1,44,47,
-140,62,32,109,139,210,224,109,10,226,34,1,243,70,1,229,65,3,32,59,
-138,242,36,203,2,55,57,53,156,207,2,55,51,32,130,10,129,53,198,32,
-243,165,0,32,19,115,12,2,48,49,32,64,5,37,116,2,58,56,48,134,
-62,253,38,3,254,124,3,236,40,3,163,202,100,150,63,18,64,60,254,181,
-0,224,192,0,179,190,232,144,0,239,7,1,194,231,164,178,229,169,0,226,
-124,5,197,141,128,165,32,98,198,155,101,53,187,234,2,55,57,48,225,120,
-1,37,157,247,214,1,98,43,79,188,34,39,39,181,84,253,197,100,32,75,
-181,69,77,150,102,224,64,36,64,16,158,77,124,225,110,185,32,6,127,149,
-64,76,199,67,2,57,55,32,64,148,80,119,167,54,65,102,225,129,2,224,
-177,0,129,212,32,14,2,48,32,58,96,19,167,158,118,119,2,51,48,56,
-128,96,33,119,32,29,129,155,137,32,193,253,237,34,1,139,4,233,182,3,
-228,198,5,32,70,136,227,192,32,237,159,2,160,26,231,19,3,160,19,216,
-137,64,180,71,103,227,66,12,128,161,224,44,7,131,167,192,27,224,28,7,
-167,78,224,28,13,129,213,192,28,252,189,0,181,208,228,101,2,39,156,40,
-250,132,27,224,155,6,172,132,33,203,96,71,195,58,131,142,103,218,232,117,
-5,230,25,2,203,140,224,30,3,101,167,142,19,117,230,225,60,0,2,83,
-32,66,238,20,4,230,245,2,225,79,2,64,56,245,22,4,224,56,1,231,
-85,5,228,99,2,242,17,1,230,116,3,228,53,2,128,25,66,187,50,219,
-198,200,228,78,2,228,95,10,226,5,0,229,108,0,241,25,7,2,115,114,
-99,2,47,77,105,2,99,114,111,2,72,115,47,56,171,2,77,97,112,2,
-46,104,115,113,46,2,54,53,58,2,49,34,32,224,60,1,33,88,131,211,
-240,204,0,121,43,32,84,100,179,130,195,2,55,57,54,73,175,99,18,247,
-104,6,96,19,203,83,32,33,234,65,2,64,78,2,51,52,49,164,221,243,
-40,5,231,198,3,83,158,112,145,237,217,2,199,23,237,135,2,151,148,70,
-35,130,21,232,7,4,239,237,2,128,42,32,79,197,131,241,210,3,241,3,
-2,32,72,98,168,133,194,192,7,167,203,229,191,3,226,53,0,141,53,32,
-242,169,214,164,185,163,61,125,3,100,24,67,254,2,55,56,54,64,41,68,
-85,96,26,128,19,2,57,32,58,96,19,193,34,64,37,161,209,69,162,76,
-41,64,47,164,80,100,245,69,180,96,29,96,51,165,96,233,50,5,224,224,
-3,246,46,3,193,11,196,36,99,122,64,116,142,236,224,46,5,131,189,193,
-103,140,142,139,47,162,165,147,234,243,246,4,192,181,55,192,64,219,64,10,
-224,5,6,226,191,4,192,120,233,132,9,245,187,5,224,17,13,160,153,227,
-106,4,170,25,241,218,1,233,104,2,227,165,3,206,241,224,214,2,232,58,
-0,224,61,45,232,191,0,224,61,23,241,156,0,224,61,3,233,40,0,225,
-4,1,229,201,0,97,126,65,83,216,61,239,153,1,251,89,1,224,31,3,
-235,225,2,228,86,2,96,40,224,39,5,224,40,8,227,101,4,101,148,224,
-46,4,195,5,195,27,98,59,32,248,197,150,34,151,134,206,117,243,2,58,
-55,56,197,162,234,111,2,224,10,6,224,109,1,232,1,0,32,55,196,129,
-233,179,2,64,27,32,25,132,112,60,169,99,41,156,169,99,183,245,24,6,
-32,152,103,168,93,106,39,66,33,107,132,177,68,43,224,42,6,96,197,118,
-227,80,97,253,235,9,69,44,2,33,34,32,170,150,32,66,167,245,245,128,
-0,170,220,241,46,0,128,128,225,221,1,160,31,203,180,226,231,7,224,13,
-15,226,223,0,225,206,9,241,195,18,226,209,10,249,175,3,226,191,22,205,
-147,226,166,19,225,47,0,224,10,4,224,11,15,226,50,20,33,76,132,218,
-186,233,234,243,3,173,136,228,134,5,168,82,209,66,2,50,52,55,167,35,
-172,88,224,254,10,249,243,2,237,73,10,237,163,3,96,14,98,131,236,226,
-4,32,12,48,42,128,12,32,176,133,121,2,90,32,85,98,11,130,239,98,
-162,96,16,80,63,165,152,112,78,79,231,240,149,4,224,196,0,176,195,216,
-43,133,82,153,55,107,233,165,81,186,131,237,192,0,231,148,11,108,34,202,
-54,106,220,252,120,2,249,161,5,141,17,32,152,103,165,77,121,88,125,136,
-102,237,86,2,129,59,147,146,32,212,210,73,160,193,160,221,2,54,53,51,
-236,158,0,160,146,129,244,148,1,96,84,96,107,96,101,128,76,236,102,3,
-202,31,71,129,76,189,2,53,53,32,243,222,10,2,79,32,35,2,49,50,
-48,245,253,0,2,49,50,51,32,24,2,52,56,32,249,219,1,65,171,238,
-12,12,165,147,32,192,132,54,193,0,55,118,42,99,226,58,7,64,152,99,
-206,228,6,5,2,33,33,58,2,32,101,109,2,112,116,121,250,51,0,135,
-35,226,108,11,239,176,16,145,245,224,87,8,2,60,48,34,131,6,65,34,
-131,6,104,247,236,39,2,128,11,105,53,32,38,211,31,105,60,224,206,1,
-174,146,255,25,8,247,193,12,224,40,25,161,92,246,83,25,167,208,198,97,
-201,119,248,209,6,248,169,4,248,207,22,131,54,65,204,247,210,3,219,250,
-203,30,224,104,9,153,124,224,66,3,194,33,224,112,11,202,48,249,64,5,
-225,21,21,225,61,31,250,5,9,248,62,89,96,242,68,48,99,134,32,11,
-2,53,57,55,123,113,34,227,2,55,51,49,141,120,2,51,55,32,245,121,
-3,183,153,233,203,6,67,202,2,53,54,48,160,65,227,163,0,2,55,55,
-49,220,77,191,158,132,59,183,180,248,46,13,161,49,224,202,3,242,137,0,
-248,59,4,224,49,0,250,29,2,224,41,0,226,90,0,107,118,227,182,1,
-146,54,198,112,96,36,132,120,2,52,56,53,221,141,2,52,56,54,184,50,
-75,134,236,162,0,2,55,50,32,64,5,235,172,0,237,154,3,225,176,16,
-231,32,3,226,77,5,225,135,1,248,212,2,129,63,225,31,1,226,106,2,
-218,194,35,207,136,141,119,117,65,45,134,66,236,15,1,160,22,119,140,96,
-181,151,28,125,84,112,172,254,105,0,136,205,65,189,2,55,50,55,231,64,
-0,125,101,102,210,64,123,64,140,205,83,32,254,34,63,32,84,134,206,163,
-51,32,149,97,99,120,46,228,198,8,152,195,32,51,134,244,37,176,2,50,
-32,58,96,52,224,174,1,131,135,96,175,67,129,224,24,2,99,228,128,24,
-133,141,34,78,2,51,32,85,33,217,225,102,5,64,105,224,19,7,64,84,
-224,19,6,70,18,249,217,1,160,19,134,113,253,83,11,162,187,2,53,55,
-32,252,55,0,229,142,5,2,103,101,116,2,83,76,111,2,99,32,69,2,
-85,86,97,2,114,34,32,252,96,0,70,43,107,57,226,252,3,121,3,160,
-81,76,235,2,53,57,32,226,69,1,229,76,10,224,147,6,97,11,96,131,
-224,84,3,64,18,224,86,0,192,18,224,19,2,223,198,68,92,229,217,10,
-224,119,7,67,4,224,119,7,64,84,79,172,224,80,3,218,72,224,125,14,
-224,17,6,224,101,7,144,128,224,101,5,67,87,224,76,10,186,58,224,97,
-6,224,224,13,224,225,7,105,70,229,64,9,224,141,6,64,199,224,140,7,
-66,38,224,140,12,67,191,225,216,2,97,199,177,110,224,142,7,225,5,1,
-234,223,0,224,119,4,143,179,224,119,4,66,103,226,117,1,96,91,225,228,
-9,128,23,238,119,0,225,128,11,226,246,8,224,245,9,105,132,224,125,5,
-132,75,171,120,224,108,4,165,97,224,107,12,225,58,7,225,57,15,225,173,
-9,35,211,181,89,131,211,225,91,6,2,54,52,32,99,52,224,73,6,32,
-53,177,28,128,53,225,23,6,165,158,32,37,177,46,196,47,227,144,26,250,
-0,1,32,62,133,79,228,110,13,129,60,231,232,8,225,10,6,65,53,226,
-190,13,227,178,21,225,91,3,230,76,8,228,168,7,226,49,3,160,55,227,
-146,20,226,85,4,96,232,178,38,64,232,69,245,224,59,6,224,12,11,226,
-129,3,32,64,182,170,128,64,224,66,3,161,236,224,141,7,227,185,7,224,
-15,7,32,82,198,43,225,225,4,224,31,1,69,57,148,108,64,33,143,78,
-2,51,53,52,217,156,96,46,128,40,134,77,96,38,76,62,224,122,25,69,
-235,247,219,1,34,106,32,238,100,240,2,55,53,53,70,134,76,92,119,152,
-76,106,2,54,53,53,39,45,2,35,55,53,167,166,32,30,162,155,224,30,
-4,32,173,192,30,199,186,246,126,0,202,150,217,173,233,132,10,235,83,2,
-254,150,1,224,21,7,239,243,6,242,228,1,239,10,0,243,36,61,253,87,
-9,160,141,253,52,19,200,100,2,51,50,32,253,97,9,224,2,1,72,120,
-242,247,8,72,98,2,51,51,32,244,2,3,183,9,65,63,32,50,32,30,
-2,54,32,79,64,37,33,56,233,45,0,253,51,4,32,2,160,91,239,67,
-1,211,41,96,62,232,250,3,225,131,12,236,75,0,169,170,141,201,170,238,
-224,60,2,193,212,128,85,128,20,128,72,224,77,1,32,10,35,64,2,54,
-56,52,96,59,96,89,224,75,1,160,104,224,21,6,96,50,154,170,111,201,
-103,124,32,77,247,177,3,2,36,104,34,250,207,0,64,36,128,50,224,49,
-20,2,118,115,34,225,47,0,217,255,2,53,48,32,224,13,1,139,21,138,
-191,32,26,144,102,96,23,138,46,97,128,251,75,3,238,1,15,113,49,209,
-254,253,169,0,192,25,162,23,130,98,35,37,234,203,1,138,5,128,30,243,
-240,3,32,36,202,216,128,34,234,39,0,64,164,123,27,2,95,55,52,86,
-64,155,117,96,214,120,116,234,57,93,208,161,43,88,100,94,163,200,105,190,
-177,126,72,77,141,39,32,15,176,193,143,185,248,54,0,128,194,234,31,40,
-192,53,224,96,3,160,20,224,81,1,224,28,4,152,207,224,28,1,234,43,
-54,224,228,1,224,130,13,2,48,32,67,101,142,160,17,225,44,0,2,53,
-50,49,140,102,83,59,225,52,0,134,190,192,155,234,75,36,225,9,6,109,
-2,224,137,1,206,167,225,30,11,225,31,22,234,106,71,251,10,1,224,106,
-6,224,134,4,2,53,48,53,129,89,219,213,97,75,32,4,231,230,1,2,
-83,32,73,179,211,143,41,239,247,4,32,41,170,98,160,55,236,129,1,234,
-156,32,224,57,4,225,222,6,96,25,100,49,226,103,14,226,1,2,32,4,
-243,142,0,234,174,51,35,94,226,107,0,192,88,170,99,224,122,15,225,218,
-22,234,210,13,226,43,17,95,12,253,100,0,2,58,55,52,136,156,224,49,
-6,144,124,2,52,51,32,96,34,136,150,234,87,52,226,208,39,228,12,33,
-224,28,7,234,133,32,160,49,225,241,18,234,142,2,226,129,5,33,19,181,
-109,36,24,225,56,11,224,146,2,226,104,3,32,55,137,144,138,121,225,215,
-11,226,17,1,224,87,15,74,6,161,193,224,9,0,32,88,137,202,226,226,
-11,164,165,193,205,137,212,224,40,11,227,164,4,99,24,32,46,134,221,224,
-46,11,179,35,96,148,32,40,221,192,32,15,32,13,221,188,191,2,90,65,
-96,47,179,14,128,73,128,97,216,95,39,89,40,105,118,111,2,50,57,50,
-255,66,5,151,77,224,61,1,254,213,0,96,10,119,86,148,33,166,151,247,
-65,6,247,246,3,97,14,2,58,55,51,235,149,0,84,11,104,121,74,239,
-40,233,129,169,91,85,107,90,210,131,114,117,2,79,32,80,64,14,103,170,
-247,136,5,140,96,128,31,2,51,48,32,224,31,8,131,114,96,197,192,64,
-104,161,32,105,215,185,97,2,32,131,104,190,114,159,105,145,65,59,96,42,
-64,60,224,53,1,252,27,1,64,42,192,10,203,178,156,81,224,7,7,121,
-249,32,37,243,126,4,97,136,104,141,72,217,224,243,80,128,32,192,189,173,
-134,64,105,97,189,153,18,2,55,50,56,121,13,77,9,172,132,64,54,224,
-41,15,234,28,1,2,91,93,34,128,46,64,166,32,46,252,226,6,2,76,
-105,115,2,116,95,84,2,121,112,101,2,46,34,32,64,36,243,182,1,253,
-169,2,233,173,1,84,94,212,179,169,34,64,21,173,76,2,55,50,52,33,
-105,45,113,187,5,66,52,79,229,32,19,175,197,32,159,90,38,96,175,234,
-192,2,2,102,34,32,162,140,35,63,122,89,122,65,224,38,14,64,79,129,
-167,2,75,32,80,32,3,65,15,64,3,32,22,129,166,68,68,57,66,126,
-3,189,157,106,160,99,65,2,49,51,52,69,143,110,12,128,29,67,28,85,
-10,139,28,180,244,246,97,3,32,88,245,41,2,67,226,105,52,152,7,77,
-249,32,16,150,107,224,30,2,32,5,229,203,2,77,55,224,56,0,154,42,
-219,121,171,163,65,198,64,159,160,34,108,54,2,54,56,57,163,168,75,105,
-32,134,161,242,224,99,2,33,144,109,147,76,149,96,57,67,43,74,87,52,
-226,68,215,64,220,224,85,0,211,238,2,58,55,49,227,228,0,98,210,105,
-126,2,90,32,80,93,160,160,32,227,229,3,64,30,2,83,32,80,2,32,
-64,73,96,134,64,116,229,171,0,255,95,0,103,194,127,114,224,10,4,255,
-126,1,64,6,64,82,96,142,33,127,224,246,0,128,126,215,130,96,214,161,
-151,128,8,64,184,36,124,128,53,32,11,37,67,160,11,32,84,175,169,80,
-152,74,48,224,82,4,66,180,36,242,225,26,1,224,112,21,74,105,192,112,
-33,32,224,111,0,97,110,160,110,210,142,225,180,1,160,76,216,60,224,188,
-0,100,82,2,64,95,57,160,152,64,60,198,50,32,10,204,246,67,18,187,
-237,96,56,32,26,130,107,2,85,32,73,96,13,129,242,246,178,8,2,105,
-109,112,2,111,115,115,2,105,98,108,2,101,34,32,97,176,88,85,96,54,
-2,75,52,32,32,2,82,175,224,1,1,237,214,2,64,42,253,210,1,98,
-192,220,80,254,70,0,80,11,192,207,65,229,72,34,64,66,192,72,158,1,
-145,157,166,126,131,182,96,7,97,218,35,69,69,38,99,133,192,118,228,60,
-2,171,47,64,21,130,21,2,73,32,58,2,55,48,53,229,125,3,248,51,
-1,2,48,52,32,160,218,2,50,32,75,32,221,160,240,196,3,128,141,2,
-57,52,32,254,64,10,228,61,2,2,115,117,112,2,101,114,34,254,72,10,
-32,74,196,55,128,70,224,52,2,2,67,34,32,96,32,129,147,32,107,67,
-185,2,90,32,67,250,192,1,121,9,231,99,5,254,195,8,72,17,225,130,
-2,32,79,129,213,73,127,132,27,2,54,57,56,231,225,5,162,92,2,54,
-51,57,132,204,35,223,128,25,240,113,0,254,41,3,99,152,101,177,99,166,
-64,85,32,6,65,249,127,158,142,153,2,51,55,57,205,142,243,46,4,225,
-53,19,2,100,117,112,2,108,105,99,2,97,116,101,2,32,100,101,2,102,
-105,110,2,105,116,105,2,111,110,32,161,68,2,51,49,51,224,211,1,226,
-158,6,2,99,104,101,2,99,107,68,2,117,112,34,97,171,2,54,57,57,
-226,238,2,64,211,32,7,69,144,41,68,187,208,255,189,12,156,103,64,243,
-81,63,32,70,198,158,233,60,2,154,210,243,30,1,132,56,2,54,57,54,
-219,28,233,23,6,235,228,1,32,79,130,145,139,23,100,44,64,155,96,63,
-64,7,64,172,2,50,53,48,160,194,191,165,67,150,241,23,1,243,253,2,
-128,66,33,230,195,37,199,67,243,180,5,160,49,64,5,32,15,224,52,8,
-232,153,8,244,24,1,243,170,5,243,251,14,160,236,244,37,64,224,188,1,
-244,176,3,224,64,14,224,65,2,97,18,244,35,15,224,25,0,244,4,3,
-127,219,160,75,96,23,100,122,226,35,2,169,85,255,97,3,224,60,3,96,
-2,133,116,224,137,6,131,98,105,182,2,54,56,51,244,90,4,196,249,32,
-109,96,8,224,5,16,34,81,240,199,0,244,215,5,101,10,32,85,2,85,
-32,65,243,133,6,225,111,15,34,189,192,36,226,13,3,148,227,225,219,7,
-129,70,129,24,243,143,2,243,118,0,153,16,226,60,0,224,40,0,224,72,
-14,225,132,5,225,196,10,255,127,2,105,54,149,34,195,52,162,166,160,6,
-148,222,191,57,130,121,97,48,97,107,128,181,227,126,1,102,32,111,101,131,
-178,224,9,1,224,68,21,225,101,0,161,192,96,136,224,60,3,197,89,225,
-238,4,70,203,160,216,64,134,98,202,160,18,64,14,32,63,137,126,224,208,
-10,231,46,3,225,26,0,246,132,1,226,214,17,224,28,1,224,29,41,227,
-64,10,247,254,1,227,42,1,248,64,4,160,52,227,180,5,227,84,2,114,
-140,2,49,51,57,111,233,230,93,4,246,12,0,139,18,78,3,192,25,2,
-95,52,49,202,116,224,157,0,161,138,129,135,43,166,150,78,225,60,11,118,
-17,204,205,166,151,181,48,170,211,2,53,56,54,169,46,200,109,67,14,247,
-208,1,65,36,225,49,5,229,63,5,226,245,9,225,18,0,226,242,95,226,
-214,3,241,85,0,129,74,72,11,238,12,13,133,196,108,45,224,41,22,68,
-107,39,157,140,29,97,64,96,4,227,57,13,2,90,32,85,224,13,1,230,
-119,1,227,1,27,2,75,32,35,96,112,227,2,19,225,59,15,224,13,4,
-101,116,226,161,0,161,215,129,67,226,115,2,160,221,152,158,237,46,0,2,
-53,54,53,209,1,66,28,60,198,226,168,7,76,77,128,59,224,8,1,225,
-42,1,225,8,0,165,126,194,105,2,89,32,67,234,208,38,97,52,32,202,
-160,65,137,208,66,3,229,216,1,64,24,76,243,224,118,2,110,88,2,54,
-57,51,104,89,73,144,173,213,205,222,202,83,42,5,94,202,228,89,0,128,
-8,110,182,2,54,57,53,170,13,234,84,8,170,82,96,36,172,121,239,35,
-1,32,19,204,80,139,24,96,166,32,21,138,205,134,90,32,125,113,196,165,
-128,252,209,4,78,93,192,144,165,88,32,61,176,128,78,123,32,13,202,168,
-131,100,134,96,225,217,6,202,145,230,119,1,232,169,14,224,13,3,195,243,
-163,131,231,44,0,141,143,226,2,5,227,129,12,201,118,226,208,0,201,181,
-228,234,7,32,158,65,66,250,171,0,169,146,233,244,1,64,33,42,88,242,
-26,9,119,203,102,181,198,118,239,140,0,2,58,54,56,202,210,106,141,228,
-178,9,231,133,7,228,47,0,163,160,74,71,224,247,7,229,165,9,228,107,
-2,160,138,251,115,4,234,79,5,161,163,225,62,6,232,19,0,172,165,233,
-101,3,32,112,2,52,50,57,224,43,0,161,42,237,223,4,234,78,2,96,
-68,224,23,0,227,240,0,192,252,161,71,227,1,0,240,217,0,144,116,232,
-254,5,198,180,180,191,254,119,18,232,4,4,225,85,2,230,225,0,139,162,
-224,204,11,157,214,161,101,224,58,44,224,55,11,97,167,237,145,2,196,5,
-248,61,1,109,109,83,146,237,90,9,35,118,76,117,128,244,245,142,7,245,
-141,3,234,236,2,132,37,65,91,247,33,1,221,172,169,27,142,121,128,182,
-192,189,228,193,1,192,17,81,140,148,103,96,16,224,77,24,66,12,226,19,
-6,69,173,226,93,2,192,29,224,89,3,141,40,195,24,193,230,229,50,0,
-233,82,1,227,27,5,194,149,224,183,2,162,237,32,83,177,229,65,84,65,
-65,32,14,161,20,133,21,33,125,2,50,50,53,194,155,32,22,213,199,35,
-200,160,4,245,231,3,96,38,212,143,85,82,32,56,81,123,2,54,56,49,
-173,228,102,36,67,162,225,21,2,180,152,64,41,192,6,32,7,47,84,97,
-161,32,60,215,175,32,246,228,11,1,237,191,3,129,9,199,30,96,31,225,
-77,3,64,99,87,114,195,65,32,7,97,4,228,3,3,115,159,97,21,163,
-127,137,155,160,135,82,194,96,66,64,228,64,17,229,187,3,2,95,54,52,
-32,60,32,219,197,47,64,126,2,54,52,54,231,27,0,64,99,70,175,130,
-143,250,212,0,128,35,232,232,1,2,54,52,57,128,39,2,54,56,32,193,
-162,202,147,67,186,131,181,192,70,224,40,1,129,68,96,157,164,203,133,158,
-52,187,224,236,0,32,181,130,230,245,92,2,128,162,32,39,65,12,202,12,
-224,104,9,160,32,32,6,116,110,96,86,129,203,224,239,11,192,173,96,63,
-98,194,235,89,1,228,126,1,224,242,0,144,5,228,134,0,165,180,233,95,
-0,99,51,112,49,98,228,129,34,213,196,72,225,2,54,54,52,228,230,1,
-128,117,2,55,51,32,225,1,0,87,36,96,183,98,148,96,48,2,55,52,
-32,64,19,162,248,231,182,3,68,30,147,3,96,36,128,50,81,82,192,35,
-241,134,1,2,67,39,34,146,226,96,109,225,13,35,224,233,1,160,22,161,
-1,224,191,2,196,161,192,176,131,254,65,132,224,177,7,67,142,192,177,200,
-94,224,177,14,2,83,39,34,192,177,195,78,238,61,2,216,80,64,61,224,
-206,16,234,165,5,101,176,198,193,225,168,3,96,190,237,35,2,162,71,32,
-97,129,152,224,193,4,67,75,233,42,1,65,129,32,131,226,169,5,163,207,
-128,131,175,172,199,236,227,72,3,235,70,13,240,108,0,226,72,4,229,144,
-1,226,92,9,194,83,240,105,3,224,75,15,230,15,0,224,255,6,195,59,
-128,78,32,156,32,213,198,24,227,238,4,161,227,226,133,3,244,211,2,105,
-16,64,16,161,175,233,53,0,138,166,65,178,226,18,8,32,126,162,18,64,
-198,96,30,62,59,224,25,2,32,24,130,179,225,136,5,226,74,1,68,47,
-229,228,6,32,4,109,198,32,28,194,103,138,244,32,194,32,19,185,62,224,
-79,4,166,74,32,30,64,36,128,249,163,5,149,84,97,91,129,96,226,110,
-2,226,51,6,97,146,224,36,16,225,107,3,224,36,17,225,220,2,224,73,
-23,96,6,224,73,23,96,6,224,36,17,133,44,96,73,229,108,10,72,171,
-170,91,227,58,9,136,101,160,250,96,41,227,46,3,228,126,3,2,66,34,
-32,194,94,225,252,3,32,123,227,77,1,224,55,9,2,66,39,34,224,54,
-12,193,171,224,24,7,76,165,224,24,12,66,121,224,24,2,160,176,64,6,
-33,238,186,225,194,118,163,225,32,24,230,56,11,239,61,0,238,59,7,245,
-237,3,66,123,229,76,3,2,67,32,61,2,61,32,64,2,35,55,32,224,
-32,9,235,236,2,123,201,234,33,4,226,148,0,167,89,224,126,11,192,101,
-128,76,246,71,7,160,6,192,115,205,47,224,151,19,128,35,32,69,224,44,
-6,253,54,3,64,152,231,237,1,236,202,0,224,202,4,160,185,224,35,21,
-94,202,225,180,1,251,136,0,149,241,224,38,5,34,197,160,38,238,193,6,
-226,47,1,2,75,52,34,203,45,224,35,17,2,51,34,32,224,35,24,2,
-50,34,32,251,40,1,241,19,6,224,57,0,66,34,196,235,58,167,65,69,
-90,201,64,74,64,20,155,113,164,134,91,12,228,163,1,238,96,5,170,139,
-64,81,194,135,231,185,7,32,29,199,78,130,165,199,251,32,24,196,224,160,
-24,165,142,32,24,196,229,128,24,197,48,2,58,54,52,132,223,224,24,0,
-235,68,0,67,200,191,177,221,209,125,188,253,209,13,32,191,32,220,130,30,
-226,74,4,192,32,96,31,225,197,3,96,230,32,116,254,52,4,2,54,52,
-52,132,69,98,50,82,239,96,16,76,73,128,9,32,50,129,101,2,79,32,
-58,96,37,123,128,32,10,193,82,96,133,224,1,3,65,84,245,95,22,32,
-91,107,82,32,70,204,34,245,114,5,248,62,10,245,155,9,245,120,12,224,
-11,2,192,8,216,141,32,109,241,147,0,108,168,58,217,32,4,98,235,99,
-252,243,252,0,32,41,129,215,114,12,239,219,2,224,146,5,192,233,248,135,
-4,2,39,32,85,51,89,238,131,2,224,1,3,59,173,44,236,2,52,51,
-48,64,110,73,61,225,42,9,239,118,5,99,190,128,53,2,54,51,55,224,
-53,5,249,184,7,128,38,2,51,49,56,224,38,4,225,16,6,143,101,159,
-44,91,104,168,120,113,100,177,183,239,84,5,161,57,237,85,2,251,243,7,
-242,111,2,110,58,238,57,3,32,58,64,85,225,226,0,97,50,225,152,3,
-32,31,166,1,2,51,49,55,34,89,2,85,32,90,224,176,0,146,133,2,
-50,55,52,225,192,0,65,2,206,49,2,51,50,32,211,236,2,51,53,32,
-96,29,130,169,2,85,32,67,239,64,3,157,32,253,94,19,2,32,61,32,
-254,145,3,2,54,51,52,192,186,169,50,2,49,50,52,80,32,67,30,96,
-27,64,127,2,52,54,55,71,133,2,51,51,32,99,115,84,14,96,27,32,
-53,207,13,67,99,2,95,52,56,211,249,94,73,2,52,56,51,234,4,2,
-2,52,55,54,224,67,1,128,6,173,160,224,43,14,65,166,2,52,56,50,
-104,6,64,7,32,21,100,69,65,172,176,204,96,111,32,6,128,24,254,243,
-2,224,96,2,96,29,48,231,79,193,64,176,196,251,2,51,49,32,212,236,
-32,59,2,49,48,32,201,148,65,107,225,254,13,250,46,0,213,35,64,45,
-131,60,245,16,6,66,244,96,101,2,50,56,32,2,58,54,50,130,21,2,
-114,110,102,99,115,32,16,196,254,100,80,234,76,4,224,4,8,225,221,0,
-225,206,12,2,84,109,111,2,100,117,108,2,101,32,34,242,119,2,226,15,
-8,190,140,242,22,8,224,244,0,174,87,160,214,224,25,5,227,22,0,2,
-50,55,32,128,233,32,10,241,112,5,228,52,2,80,107,68,99,246,176,2,
-248,187,4,143,69,32,106,100,123,239,90,4,160,20,208,100,64,67,255,58,
-4,68,196,32,116,82,59,193,146,160,99,160,6,100,192,228,40,1,33,124,
-98,219,254,164,8,243,236,10,252,12,5,159,152,160,122,224,130,0,227,230,
-2,64,88,96,138,32,165,98,116,166,136,32,25,162,94,227,69,2,2,50,
-50,32,71,174,131,234,225,201,17,225,200,5,227,213,38,2,40,46,46,2,
-46,41,32,2,119,104,101,2,114,101,92,2,49,48,38,163,225,2,54,50,
-49,198,132,131,180,96,138,32,164,242,139,1,163,217,2,50,48,32,64,23,
-130,203,99,51,82,120,68,112,49,147,166,23,164,249,238,93,2,2,67,32,
-60,39,136,253,51,1,233,236,6,192,24,34,228,82,36,219,228,224,41,10,
-132,131,160,41,224,43,3,133,172,2,53,49,53,64,164,64,20,99,205,162,
-153,32,176,131,102,2,85,32,83,224,146,9,224,18,6,64,80,224,18,6,
-98,97,247,204,0,160,19,129,172,228,135,8,64,8,160,16,96,130,225,122,
-1,2,112,97,116,2,116,101,114,2,110,34,32,129,114,2,48,56,32,228,
-145,1,78,18,228,145,0,2,48,52,32,154,53,224,71,13,2,100,101,102,
-2,97,117,108,2,116,34,32,196,182,69,17,96,42,32,186,64,7,69,253,
-224,50,5,2,44,32,34,162,153,102,25,2,48,53,32,227,174,0,224,214,
-7,67,89,96,121,2,53,49,54,224,201,15,2,105,110,115,2,116,97,110,
-2,99,101,34,192,202,160,79,64,55,155,57,187,53,255,99,3,97,25,229,
-183,4,224,92,13,2,99,108,97,2,115,115,34,192,89,176,78,97,44,65,
-217,246,122,0,240,4,0,128,183,73,228,224,202,6,64,50,33,160,204,48,
-100,183,224,132,14,32,61,227,52,19,2,105,110,102,2,105,120,34,190,37,
-100,82,229,27,4,32,104,97,187,224,23,6,2,49,52,32,247,75,0,224,
-24,0,197,43,230,110,0,247,102,5,225,198,35,134,211,128,0,66,136,225,
-107,10,224,243,19,225,120,8,2,102,111,114,2,101,105,103,2,110,32,105,
-2,109,112,111,2,114,116,32,2,99,99,97,2,108,108,34,128,111,2,53,
-48,53,64,45,119,174,224,184,5,38,213,32,216,212,46,231,104,4,224,89,
-1,2,58,58,34,226,219,0,226,42,0,160,178,229,105,10,135,204,234,0,
-2,234,98,1,192,26,226,89,44,128,216,193,199,237,207,1,2,54,49,49,
-104,106,99,210,128,230,224,193,7,2,123,45,35,2,32,83,79,2,85,82,
-67,2,69,32,35,2,45,125,34,160,238,72,200,97,20,224,44,5,2,113,
-117,97,2,108,105,102,2,105,101,100,240,41,0,161,170,232,99,1,65,79,
-226,20,5,65,88,233,139,17,2,97,115,32,161,138,2,51,48,50,224,125,
-6,228,132,1,201,3,64,99,122,188,224,65,2,2,104,105,100,2,105,110,
-103,160,145,228,53,2,105,83,119,160,226,115,3,73,36,226,190,2,100,53,
-66,207,224,0,4,229,37,6,66,4,227,149,6,64,49,227,149,6,65,255,
-229,54,36,2,116,121,112,196,104,226,92,24,134,72,224,94,19,227,91,6,
-224,231,10,195,86,226,195,27,102,115,2,57,54,32,160,154,229,205,10,225,
-18,8,230,74,10,230,73,40,225,18,2,230,70,19,128,166,228,26,14,224,
-108,32,2,110,101,119,224,111,29,44,169,128,7,164,203,39,108,214,126,237,
-2,1,227,161,21,2,100,97,116,2,97,34,32,224,104,2,224,78,0,240,
-160,7,224,211,53,224,103,8,224,208,10,229,138,21,2,32,124,34,227,27,
-4,221,206,224,254,1,136,120,72,138,115,176,46,255,132,89,72,183,231,216,
-15,2,114,105,118,227,164,0,227,163,44,168,58,160,123,140,60,229,104,1,
-229,71,3,97,50,225,70,23,32,108,141,133,167,135,163,27,2,80,32,66,
-160,144,192,254,98,106,87,92,168,52,224,177,1,96,33,192,130,165,190,225,
-169,12,227,66,2,227,117,12,96,99,224,248,9,224,236,0,177,195,192,100,
-238,9,4,70,171,238,10,0,192,18,247,93,1,64,180,129,40,162,170,163,
-60,238,79,6,78,17,160,68,163,92,32,58,140,107,72,22,194,237,82,97,
-129,40,237,157,1,229,161,3,224,28,0,225,223,4,2,54,49,51,193,45,
-231,217,4,224,208,3,225,31,9,43,206,2,41,34,32,230,100,2,32,145,
-216,178,193,162,226,48,13,32,40,140,129,2,65,32,58,102,249,64,51,51,
-134,193,2,204,178,211,57,64,15,64,9,128,21,64,169,56,227,167,58,32,
-64,222,156,226,230,16,97,114,224,125,0,229,139,29,229,200,22,225,44,4,
-224,66,0,246,159,1,224,39,12,226,49,2,140,19,224,179,6,224,101,3,
-97,229,32,56,116,65,225,120,5,2,61,62,34,241,127,0,67,28,98,62,
-160,171,153,37,141,150,71,173,198,183,163,162,132,42,32,54,195,158,229,38,
-1,131,160,247,164,8,221,224,215,164,252,232,0,2,52,56,49,227,151,3,
-241,38,17,66,64,226,73,21,231,70,9,32,161,210,88,33,7,32,13,222,
-3,36,100,32,13,219,56,2,48,51,32,130,25,32,19,177,227,2,39,32,
-89,248,22,0,247,106,0,254,157,5,254,208,0,212,255,174,55,96,17,148,
-155,244,32,1,2,83,32,73,248,113,0,239,156,0,192,61,138,59,245,2,
-5,161,55,206,212,255,12,3,185,53,32,5,102,147,160,81,238,178,2,129,
-133,206,189,225,136,11,160,106,119,70,229,90,3,234,207,0,64,74,160,208,
-197,114,160,96,212,109,157,143,2,52,56,52,255,186,2,239,51,2,152,236,
-240,145,10,225,26,6,225,234,3,235,46,13,197,230,158,76,128,14,138,32,
-238,105,2,218,39,224,181,47,224,166,6,96,163,224,160,10,224,133,13,224,
-125,2,226,0,0,226,21,0,225,210,3,249,236,2,42,89,198,232,245,22,
-1,192,160,249,166,5,226,225,1,2,91,93,34,193,190,186,229,114,60,32,
-41,156,111,64,149,130,50,174,51,32,184,131,255,131,15,192,24,164,16,65,
-64,2,50,51,57,133,201,107,149,36,202,226,113,2,192,4,227,183,0,160,
-254,96,159,235,196,0,226,224,5,225,254,1,97,88,241,63,6,101,107,253,
-16,1,224,26,4,96,145,64,52,224,22,4,80,246,234,128,7,113,234,234,
-129,7,138,130,32,192,96,151,176,121,239,21,22,2,95,97,34,246,31,2,
-238,194,0,234,203,7,232,67,1,208,117,129,125,224,193,7,96,62,192,26,
-240,147,5,104,124,97,68,224,31,0,138,81,231,160,16,224,26,8,2,49,
-50,54,232,49,3,249,161,2,226,162,4,244,130,3,201,15,226,179,7,225,
-1,1,2,45,62,34,128,81,196,158,96,86,229,115,23,74,102,232,190,6,
-225,211,13,98,226,225,44,13,169,111,241,188,7,64,163,97,188,224,211,1,
-192,12,2,57,52,32,166,130,225,25,6,247,12,1,231,34,4,160,202,241,
-56,5,234,47,12,233,216,2,233,111,10,237,118,32,77,70,233,160,13,225,
-176,2,232,79,4,231,234,2,225,40,16,98,207,226,85,13,182,240,226,8,
-13,224,232,17,226,8,11,238,28,10,252,3,4,229,167,5,224,21,0,2,
-53,48,50,226,117,7,102,157,2,66,32,79,162,220,240,196,10,2,102,34,
-32,224,241,2,192,163,224,48,17,2,116,104,101,180,115,198,33,224,43,17,
-2,101,108,115,173,232,226,158,3,225,35,17,227,229,3,233,94,5,228,202,
-22,97,36,226,245,12,100,6,133,255,224,25,6,100,5,192,25,244,180,9,
-225,202,26,225,188,0,192,171,228,169,0,2,53,48,52,209,150,237,147,6,
-2,111,34,32,235,133,24,2,46,100,111,249,86,1,32,69,2,54,32,35,
-65,216,247,30,4,53,19,230,28,0,69,106,2,53,49,52,225,251,0,224,
-234,8,99,10,226,181,12,165,231,160,233,224,231,3,224,15,1,106,128,162,
-185,227,113,12,128,145,225,220,4,225,7,3,160,7,224,228,6,2,108,101,
-116,238,152,0,224,226,16,226,3,0,246,56,15,226,188,0,228,97,3,195,
-103,96,125,244,182,5,246,35,14,2,97,115,101,236,246,0,224,25,4,2,
-111,102,34,228,118,0,224,165,15,103,21,226,169,5,170,5,225,136,8,99,
-159,166,110,242,233,7,225,151,4,64,184,59,218,231,56,0,188,70,199,76,
-229,143,4,252,163,14,82,72,244,79,12,230,102,0,230,99,7,32,51,2,
-54,48,32,226,13,1,2,53,57,55,129,63,128,9,32,5,240,139,2,249,
-80,1,233,47,4,242,152,4,236,100,3,206,186,34,171,219,160,225,180,2,
-235,218,8,171,96,160,3,193,73,138,44,233,39,0,193,29,162,219,37,45,
-33,9,105,209,247,119,14,2,115,116,36,128,251,201,31,129,69,234,59,0,
-225,110,0,181,22,233,138,7,245,46,2,234,147,13,235,39,0,164,93,188,
-82,97,188,233,166,2,65,218,125,177,96,9,129,176,91,169,128,9,128,17,
-44,255,143,81,110,57,124,116,67,242,32,22,143,93,230,82,5,93,36,32,
-158,150,108,2,54,48,48,96,40,143,69,118,10,66,169,2,51,55,51,182,
-25,96,9,64,8,2,53,57,57,64,237,96,24,64,49,238,195,1,2,79,
-32,95,97,167,96,146,78,199,238,126,0,96,51,32,45,96,7,96,159,2,
-80,32,35,153,231,64,20,222,98,96,22,97,53,43,192,32,23,141,252,96,
-173,98,152,254,32,2,97,30,226,42,1,230,206,6,253,35,6,70,110,96,
-141,239,188,10,2,53,48,55,230,154,8,36,70,32,31,198,127,32,136,209,
-157,234,220,6,64,131,224,18,6,66,238,227,171,6,111,140,250,227,12,97,
-29,106,51,161,204,161,48,2,35,57,52,131,167,2,53,50,49,65,61,72,
-203,194,5,130,134,224,98,6,232,28,0,229,166,5,160,45,64,104,249,42,
-10,224,22,14,224,209,7,115,46,228,125,30,160,80,160,75,100,119,128,226,
-98,106,96,28,2,53,50,52,66,67,229,0,0,224,36,2,117,6,128,36,
-97,0,252,28,11,202,94,128,49,179,34,224,12,1,192,62,192,94,224,43,
-6,236,40,8,33,219,176,69,82,26,68,183,114,112,67,159,2,53,57,50,
-98,10,140,59,2,49,50,55,192,150,158,160,128,11,32,63,144,113,2,73,
-32,58,96,41,255,80,5,224,67,0,99,139,128,54,126,215,96,6,32,43,
-2,102,115,104,2,111,119,32,32,14,163,119,96,58,2,53,51,49,91,227,
-2,53,52,53,65,252,2,56,57,32,140,226,96,128,145,198,128,73,64,11,
-32,58,131,128,32,229,2,52,32,80,64,60,96,53,2,55,52,32,64,120,
-2,55,53,32,160,65,32,11,64,212,128,11,2,49,48,55,224,11,2,2,
-56,32,95,192,35,2,56,56,32,32,17,46,116,160,17,34,63,2,58,53,
-56,195,180,142,36,165,152,67,172,2,95,50,48,2,50,32,102,229,45,0,
-2,73,110,116,2,101,103,101,2,114,58,32,2,100,105,118,2,105,115,105,
-2,111,110,32,2,98,121,32,2,48,34,32,164,250,244,138,0,137,147,64,
-79,2,85,32,80,32,185,40,208,32,4,68,40,133,231,224,17,9,197,40,
-247,128,5,102,129,240,243,5,241,149,2,128,16,138,163,241,217,0,145,170,
-239,212,1,33,22,2,56,32,67,239,133,3,209,98,228,69,4,32,38,161,
-32,228,131,0,198,99,102,236,70,99,2,85,32,65,97,169,99,180,235,192,
-5,139,83,85,214,128,71,168,238,80,166,174,223,101,213,245,112,2,2,53,
-56,54,32,45,140,242,32,12,196,163,162,180,65,166,33,145,225,128,8,2,
-105,110,105,2,116,58,32,176,102,129,95,193,64,246,9,5,197,151,192,88,
-32,82,133,108,129,39,64,152,2,95,52,49,69,36,2,53,56,53,98,3,
-133,2,228,8,2,32,25,85,125,193,49,98,14,128,107,100,199,96,55,97,
-88,34,209,2,55,48,32,32,38,193,200,130,84,182,182,239,78,0,147,179,
-210,244,239,98,4,86,219,68,10,37,155,193,36,241,240,5,242,111,1,112,
-240,236,150,3,194,7,160,98,64,70,32,252,2,57,32,95,2,49,56,54,
-194,152,113,134,102,58,96,28,68,34,241,113,1,32,203,67,69,96,194,84,
-240,34,39,96,11,2,95,54,56,169,255,2,53,52,54,135,233,135,44,97,
-4,32,224,132,24,160,198,203,71,32,7,242,224,3,236,128,3,140,167,65,
-88,32,99,66,41,146,9,98,132,32,255,33,81,96,118,128,6,194,66,96,
-26,97,110,32,21,64,59,2,53,55,32,64,59,237,232,2,160,49,96,28,
-203,115,200,102,96,46,96,26,2,54,57,32,161,87,169,82,227,55,0,33,
-149,160,170,65,82,64,5,160,33,97,109,98,172,75,216,32,116,195,57,245,
-33,2,171,77,192,253,212,244,239,214,1,2,53,56,49,224,95,3,160,163,
-128,220,160,12,98,107,130,60,32,8,103,225,167,5,224,197,15,64,39,146,
-100,128,66,225,16,3,105,124,228,96,1,96,232,131,130,107,243,69,62,147,
-150,194,183,243,150,1,98,232,136,35,131,229,236,204,0,224,78,2,224,13,
-4,34,6,198,20,224,20,0,43,115,171,114,32,29,233,152,1,97,225,34,
-82,32,24,32,23,134,15,100,82,32,13,133,226,200,238,246,118,3,130,245,
-244,239,0,32,238,101,64,2,53,53,56,132,57,96,14,2,58,53,55,197,
-194,105,193,106,186,137,67,32,26,132,75,2,95,50,50,34,229,2,49,51,
-57,217,96,32,25,250,208,0,171,177,32,191,33,232,96,146,65,19,224,27,
-10,96,188,35,46,153,203,71,1,129,126,130,149,65,157,32,11,68,217,98,
-44,85,83,117,87,2,54,51,32,134,238,194,246,32,6,135,57,192,13,65,
-190,100,55,70,216,225,79,8,161,138,32,29,225,109,5,32,23,224,29,4,
-186,100,230,94,7,32,25,193,111,2,75,32,95,225,204,3,32,25,202,223,
-100,79,230,249,1,230,162,10,229,98,1,231,42,11,224,48,20,103,18,184,
-128,248,5,0,198,208,246,217,8,230,249,0,234,229,4,96,97,225,251,1,
-98,251,36,231,164,157,246,230,2,160,62,248,239,0,247,96,3,167,52,247,
-200,9,247,249,0,224,117,21,224,115,5,224,113,5,224,51,17,197,74,230,
-227,3,66,44,203,253,2,53,54,49,64,84,240,85,1,2,53,54,50,163,
-180,98,198,69,151,67,184,99,160,32,28,66,78,2,54,55,32,249,46,2,
-130,237,224,157,5,32,99,162,251,2,53,54,52,64,67,229,231,0,35,1,
-160,10,32,170,2,51,32,35,167,208,228,21,4,224,34,12,33,244,32,2,
-2,83,32,95,102,78,96,168,192,139,64,62,224,96,0,160,46,131,201,69,
-96,215,133,237,241,0,250,8,6,224,60,3,224,137,6,206,156,168,138,2,
-54,53,32,231,157,4,225,16,4,210,242,225,251,0,128,75,2,52,51,32,
-160,44,161,234,224,70,0,2,50,52,55,224,71,0,64,72,68,62,128,72,
-224,42,8,224,113,2,224,41,6,33,104,132,74,110,186,2,52,32,90,162,
-22,32,23,132,70,2,66,32,89,227,39,1,131,28,251,21,0,65,2,2,
-82,32,95,224,22,2,225,35,0,32,63,132,106,251,121,1,232,3,0,251,
-144,5,224,20,1,224,17,8,224,14,5,224,11,2,192,8,130,246,96,109,
-132,123,32,197,64,195,224,197,2,207,117,160,197,64,164,240,180,2,241,222,
-0,2,39,32,85,240,202,2,227,16,2,227,104,1,239,241,2,64,88,132,
-176,235,106,10,2,102,111,108,2,100,108,49,184,254,81,131,64,45,132,196,
-224,134,0,2,83,32,80,228,45,2,96,79,164,204,228,83,0,81,74,136,
-116,235,0,6,233,108,1,234,64,1,213,76,136,22,128,169,233,77,5,201,
-19,190,30,103,154,35,180,233,85,5,233,56,0,211,103,226,216,1,233,95,
-3,96,176,64,61,231,31,0,167,37,128,169,2,51,50,32,102,116,172,47,
-32,13,32,45,131,206,232,58,1,134,108,32,24,170,220,69,148,243,104,0,
-242,100,5,70,135,67,15,230,58,2,231,216,7,96,144,203,7,253,206,0,
-220,51,229,182,1,253,213,2,251,233,0,234,205,2,164,255,192,86,196,215,
-169,122,133,254,128,8,32,26,136,113,178,19,121,93,231,230,0,224,64,1,
-50,184,233,236,1,128,25,188,69,224,27,0,230,53,3,224,174,13,224,124,
-7,106,136,129,149,224,127,21,224,101,3,224,130,8,224,156,5,225,91,4,
-192,247,65,102,40,159,226,219,1,2,92,51,52,2,38,108,105,2,98,47,
-68,2,97,116,97,2,47,73,110,110,83,2,46,104,115,64,22,2,44,49,
-50,2,55,58,49,98,246,33,139,168,103,2,53,53,51,165,212,32,19,131,
-162,246,211,0,196,227,176,69,156,255,97,254,226,241,1,229,202,7,197,84,
-225,228,0,108,240,227,211,3,195,250,192,7,35,158,72,91,2,75,50,32,
-224,202,35,2,54,51,58,2,54,34,32,250,60,6,160,168,226,43,0,227,
-108,3,174,97,227,93,3,36,121,174,57,228,88,0,202,76,96,218,198,235,
-246,98,1,224,80,10,235,201,2,224,80,2,132,90,100,18,65,88,196,227,
-131,61,100,51,230,27,0,97,50,142,55,227,235,11,228,36,13,160,47,235,
-107,4,224,61,11,103,43,228,39,4,224,79,11,228,85,18,231,43,3,32,
-200,203,114,208,129,233,153,21,168,171,97,10,101,101,64,33,181,34,245,19,
-0,2,52,56,57,240,68,11,174,17,32,51,177,163,2,53,52,56,226,169,
-0,66,253,226,169,2,163,136,193,68,229,147,6,161,199,229,149,8,226,33,
-15,135,152,82,231,129,204,230,117,1,99,214,107,141,202,23,226,121,45,224,
-91,1,226,121,9,224,95,4,226,121,31,224,80,2,175,85,104,60,33,40,
-246,30,1,100,155,226,100,36,132,119,226,11,2,224,10,1,32,89,134,22,
-33,172,32,11,133,216,33,202,243,67,0,45,11,236,149,0,143,146,44,209,
-64,5,65,245,174,243,224,34,1,39,91,160,10,32,76,232,150,1,2,95,
-50,53,138,148,64,65,32,25,132,159,207,229,32,16,227,87,1,160,42,192,
-27,64,28,162,171,171,174,226,40,3,96,19,241,61,4,96,100,180,31,167,
-134,199,175,132,186,101,190,229,215,2,96,97,130,205,143,170,174,88,161,255,
-134,215,2,95,50,55,161,93,234,9,3,239,225,1,142,50,138,145,194,173,
-230,108,0,2,89,32,67,224,82,2,229,133,0,229,79,3,96,170,197,71,
-208,37,144,104,232,115,3,241,49,0,65,38,96,145,224,143,4,236,96,8,
-96,148,224,146,5,65,253,233,68,5,2,108,116,87,2,46,99,109,2,112,
-34,32,128,28,177,191,184,218,179,125,96,5,33,39,131,193,224,206,1,237,
-172,3,153,102,34,48,99,163,224,34,0,239,28,2,72,153,32,31,111,119,
-2,53,51,56,132,28,92,5,2,58,53,51,132,7,97,2,32,13,130,236,
-121,235,32,13,203,54,74,109,192,1,227,34,0,32,31,194,180,66,134,88,
-71,32,5,34,96,32,24,226,128,10,64,31,32,25,194,128,238,64,0,225,
-60,21,105,103,192,13,38,178,225,79,1,32,75,175,109,32,126,201,62,75,
-192,66,103,194,131,64,15,64,9,194,125,32,66,80,21,96,85,32,64,130,
-223,44,246,2,53,50,53,96,189,129,18,162,148,128,24,32,61,134,36,32,
-33,66,51,68,56,97,115,228,70,2,173,131,197,169,2,50,57,32,64,70,
-207,186,230,172,6,96,38,114,8,67,194,196,16,230,37,1,45,15,2,57,
-32,35,76,90,223,216,224,46,12,64,36,184,73,2,58,53,50,229,205,0,
-226,169,2,194,4,234,35,0,229,90,2,229,119,1,98,28,164,249,224,232,
-31,229,185,0,131,28,201,213,198,66,128,87,68,222,224,87,37,128,236,75,
-24,224,91,1,128,206,160,198,192,197,224,93,5,82,86,110,238,224,91,13,
-224,126,38,227,164,6,2,78,117,109,2,101,114,105,2,99,46,115,57,41,
-41,65,2,65,116,66,63,122,2,58,32,110,2,101,103,97,2,116,105,118,
-2,101,32,97,2,114,103,117,2,109,101,110,2,116,34,32,193,19,224,2,
-0,89,204,237,211,0,224,213,3,64,5,224,178,22,97,189,109,143,105,17,
-224,22,1,224,75,52,34,37,224,22,1,224,236,33,2,117,110,115,2,117,
-112,112,2,111,114,116,2,101,100,32,2,98,97,115,2,101,34,32,224,140,
-2,117,159,226,120,6,194,110,35,64,2,52,52,57,233,24,4,164,146,224,
-49,6,194,60,208,136,160,11,226,72,8,224,70,4,153,77,175,64,224,61,
-0,240,181,0,225,64,12,103,166,189,165,240,237,12,225,86,3,2,53,50,
-55,98,218,39,242,128,65,206,26,225,81,16,35,137,133,65,194,191,130,119,
-160,34,96,82,249,108,1,32,44,240,151,0,2,50,32,75,2,52,32,65,
-160,21,133,86,225,33,6,237,27,0,227,100,60,193,128,237,136,0,204,160,
-185,93,241,147,1,125,221,240,168,2,156,207,104,105,161,9,128,162,226,132,
-22,224,64,8,228,217,0,224,86,11,244,0,5,224,98,30,160,66,217,231,
-33,72,134,134,100,54,124,219,255,178,2,174,85,151,144,101,95,73,130,224,
-249,5,218,246,249,208,3,99,212,64,38,64,54,127,111,192,22,38,105,2,
-55,32,102,227,75,0,2,32,37,32,163,39,224,45,5,180,15,65,250,126,
-141,160,15,70,45,160,15,32,184,217,188,251,66,2,71,123,97,158,202,193,
-65,244,98,81,226,224,2,2,95,51,57,38,69,32,139,103,117,32,27,232,
-124,0,108,36,160,16,32,96,135,58,233,96,0,201,63,2,49,51,52,64,
-248,103,31,224,28,15,233,111,3,160,18,134,166,32,86,135,80,242,46,8,
-2,108,97,115,252,24,1,137,236,33,133,64,209,252,174,0,32,60,215,4,
-136,16,32,176,106,238,62,43,71,83,60,13,34,236,225,96,3,2,45,62,
-34,200,9,72,202,97,47,32,85,144,3,103,238,32,6,65,114,2,58,53,
-49,231,30,1,170,195,231,34,0,99,244,253,182,1,246,139,3,103,38,233,
-220,0,234,232,2,192,160,73,155,96,5,96,153,132,160,43,136,144,113,239,
-164,7,128,152,2,52,55,51,162,187,150,16,2,49,55,32,96,193,64,168,
-192,193,247,115,3,128,100,154,27,64,9,160,17,225,10,6,2,32,124,34,
-164,151,32,24,32,235,64,7,32,95,96,37,56,129,75,245,160,157,64,118,
-32,117,195,35,192,174,32,128,253,128,1,97,156,253,176,5,97,82,149,103,
-192,245,224,127,3,2,119,104,101,2,114,101,34,232,170,0,2,53,48,54,
-122,100,128,143,74,23,160,118,254,219,0,32,111,210,201,32,45,96,33,153,
-244,64,100,98,4,99,180,132,140,2,60,32,64,2,35,51,32,66,116,224,
-18,4,64,183,235,211,0,128,18,68,61,2,85,32,66,170,120,86,2,68,
-33,248,198,6,130,88,207,167,192,12,224,25,1,224,21,0,129,27,225,68,
-9,193,52,225,4,6,2,46,46,34,224,30,4,104,202,224,137,7,224,117,
-81,224,110,14,224,97,21,224,189,20,225,112,7,156,210,225,112,4,64,100,
-64,117,224,115,2,224,102,30,224,173,19,66,97,226,241,0,225,15,5,101,
-197,227,80,0,226,237,39,64,116,32,15,69,224,192,228,34,114,197,108,224,
-140,5,224,15,0,96,99,195,190,224,103,12,188,204,96,76,133,88,225,4,
-1,64,5,192,49,2,57,49,32,192,153,192,17,32,46,168,11,64,117,99,
-16,2,80,32,67,225,7,12,101,9,225,78,6,2,60,45,34,226,28,5,
-128,6,99,131,38,8,224,44,5,2,108,101,116,228,38,0,227,162,23,32,
-143,205,5,64,145,134,226,69,70,64,135,111,145,224,163,22,32,220,71,68,
-226,187,5,224,53,14,2,52,56,48,224,217,8,2,58,58,34,224,58,0,
-97,91,224,56,0,224,40,6,2,100,101,102,2,97,117,108,203,127,164,170,
-142,114,73,157,96,202,198,30,253,32,1,96,6,153,91,2,58,53,48,251,
-235,1,2,80,32,35,111,126,32,25,32,23,187,159,64,188,32,13,222,143,
-64,135,116,221,2,52,54,48,96,38,132,202,2,80,32,58,2,53,48,53,
-228,213,6,78,124,32,22,226,98,1,157,153,255,68,0,234,197,5,65,108,
-2,61,61,32,252,56,0,202,69,164,54,200,135,224,46,15,33,25,64,9,
-108,30,96,5,32,121,175,35,2,53,48,49,175,26,32,19,249,214,2,2,
-52,55,50,195,213,70,218,32,39,97,138,64,216,128,86,32,46,249,215,2,
-235,195,5,235,172,0,64,58,70,26,75,235,241,254,0,243,122,2,217,191,
-253,240,8,229,208,8,224,25,1,224,27,5,137,117,228,123,4,71,57,41,
-5,35,204,232,108,5,2,115,101,112,2,49,32,65,2,98,111,118,198,145,
-224,37,17,2,66,101,115,2,105,100,101,229,64,1,231,251,4,230,86,7,
-61,227,202,16,237,134,2,238,249,0,236,142,5,66,34,251,126,2,96,189,
-232,75,3,65,186,32,34,68,217,193,47,64,51,65,119,168,35,247,152,2,
-225,56,4,224,97,0,225,31,4,201,231,203,201,171,218,255,61,1,231,74,
-5,224,195,5,224,79,0,32,193,33,196,237,19,2,160,69,171,44,114,75,
-253,249,5,224,71,19,249,121,1,224,71,6,97,1,37,75,99,158,157,82,
-254,216,1,104,239,192,90,236,164,12,230,141,1,128,22,139,208,129,116,149,
-245,225,102,39,224,195,4,227,224,1,67,14,230,59,1,121,99,67,15,196,
-77,35,15,206,230,237,68,10,98,13,225,143,3,225,192,21,192,139,225,176,
-0,98,79,227,225,0,224,30,5,225,109,0,68,196,226,96,4,224,66,18,
-193,178,226,188,4,160,135,33,140,66,219,166,227,65,40,193,197,82,29,128,
-22,100,19,252,167,0,2,52,57,52,136,140,239,222,1,97,54,87,22,97,
-105,226,206,12,132,95,2,64,58,52,65,251,233,231,11,64,84,227,250,49,
-2,111,110,101,2,76,105,110,2,101,114,32,227,254,24,224,41,0,228,2,
-6,227,249,20,85,8,161,30,99,154,227,130,9,224,62,6,64,248,140,207,
-131,86,224,60,0,224,20,0,104,218,192,81,224,61,6,66,122,77,230,228,
-120,0,64,137,152,150,97,66,176,105,215,137,239,47,1,230,25,8,164,140,
-224,63,1,32,61,166,205,232,110,15,98,8,111,49,232,244,5,32,26,233,
-92,3,103,186,232,208,2,231,243,9,224,72,38,234,48,14,32,176,135,101,
-102,181,218,125,35,129,249,149,3,218,157,163,196,64,27,99,136,176,93,152,
-70,255,77,0,64,83,189,194,91,76,121,98,104,93,86,47,2,50,50,53,
-149,181,228,58,1,167,43,64,54,182,196,237,148,21,2,102,111,114,2,97,
-108,108,237,152,5,128,235,2,54,48,55,225,52,4,225,11,0,32,90,135,
-175,2,80,32,75,98,107,129,20,224,9,0,32,31,135,187,162,63,2,51,
-53,50,98,63,57,251,2,51,56,49,160,65,135,174,2,75,32,89,176,63,
-181,35,196,44,133,79,97,9,98,118,132,191,174,224,51,176,111,215,2,50,
-49,53,124,142,37,149,2,49,53,54,225,86,1,190,105,99,236,240,3,4,
-96,195,165,34,240,110,0,32,33,2,51,48,55,240,37,0,219,241,128,166,
-229,69,2,137,120,219,199,165,184,210,234,243,164,0,2,58,52,56,239,198,
-0,152,36,49,171,2,48,32,35,119,41,113,184,32,82,2,35,57,48,97,
-39,64,219,162,45,164,45,64,20,130,243,96,20,169,40,32,20,226,87,1,
-113,160,128,20,233,199,0,2,52,50,57,192,192,225,218,1,2,64,92,57,
-2,50,38,61,2,43,45,58,2,60,62,46,2,33,35,36,2,37,94,38,
-2,42,47,124,2,126,63,92,2,50,50,54,2,38,92,49,2,51,54,38,
-2,92,49,56,2,51,38,92,160,14,2,53,38,92,2,49,52,54,224,14,
-0,2,52,38,92,224,14,8,32,4,224,59,2,2,50,56,38,66,54,32,
-134,226,104,2,236,77,8,64,238,236,77,5,66,194,162,71,51,233,192,192,
-56,50,202,136,96,68,148,112,100,34,225,236,13,76,151,32,17,195,157,130,
-252,185,64,32,66,209,166,68,152,32,119,96,19,190,96,227,71,23,145,149,
-227,71,0,67,17,100,193,43,18,239,161,1,228,187,0,96,112,74,163,157,
-76,66,243,192,35,32,19,114,15,164,96,128,116,96,113,96,95,185,22,96,
-8,161,5,125,53,100,253,32,22,196,251,193,28,107,23,99,202,235,165,93,
-64,182,235,165,2,96,133,254,99,0,34,135,254,186,2,172,165,32,35,130,
-11,225,99,6,64,8,225,99,0,122,23,228,171,6,71,124,123,36,32,250,
-32,13,218,241,225,113,13,100,150,225,113,21,186,188,193,113,99,177,192,7,
-64,110,204,44,160,201,132,232,224,201,6,195,250,225,56,0,236,87,1,225,
-60,1,233,38,0,232,192,14,140,190,255,103,3,249,24,5,128,71,129,101,
-193,103,32,194,64,121,2,65,32,58,96,56,97,23,59,86,32,4,98,0,
-2,54,55,32,160,19,2,53,32,35,2,49,48,48,188,79,251,114,0,87,
-62,104,203,224,20,7,196,160,64,70,142,9,64,66,188,68,67,188,71,22,
-32,5,142,52,64,66,93,109,64,122,131,74,93,109,96,23,163,88,64,13,
-205,164,205,65,194,139,199,226,120,241,246,153,3,138,133,107,89,126,9,235,
-5,1,33,252,130,20,105,194,170,148,121,25,32,190,157,23,33,206,203,212,
-32,123,129,196,98,37,64,87,233,123,10,192,138,40,89,67,65,192,89,226,
-84,0,227,196,5,224,47,4,69,184,224,47,0,32,108,189,38,227,68,2,
-238,38,28,224,39,24,166,109,235,124,0,237,15,15,169,80,235,89,14,224,
-7,5,224,190,7,238,10,13,227,252,2,192,13,252,202,0,166,221,133,121,
-2,52,53,54,242,202,1,224,89,4,235,193,3,174,78,119,7,96,37,231,
-36,1,224,15,0,227,101,1,238,185,20,192,171,238,178,3,238,175,5,224,
-88,7,224,104,11,225,119,1,238,135,14,237,182,18,140,11,237,182,3,202,
-126,64,224,238,125,2,224,118,7,224,50,7,133,210,219,28,197,174,227,37,
-3,229,127,14,224,225,9,128,88,140,235,204,7,238,120,39,32,189,206,125,
-224,188,10,132,134,2,58,52,53,210,105,104,245,233,122,1,165,3,225,85,
-15,193,52,238,22,14,96,137,135,174,237,245,13,236,56,3,73,90,175,158,
-39,232,89,233,171,175,32,157,204,81,2,95,55,52,68,131,65,145,101,15,
-73,202,173,247,122,88,2,64,73,32,69,4,36,163,162,194,32,43,252,180,
-0,131,198,241,239,0,225,66,11,230,21,1,225,209,1,228,79,3,225,66,
-3,188,17,227,200,3,225,221,12,163,73,225,0,0,97,189,143,251,97,4,
-195,90,227,231,26,224,67,5,97,221,109,167,243,21,1,228,1,3,64,252,
-165,236,243,26,0,243,23,19,241,4,0,224,210,2,243,18,86,2,97,98,
-111,2,118,101,78,2,101,115,116,239,24,25,224,42,1,243,28,58,225,178,
-13,243,28,10,225,238,1,224,241,2,224,24,12,226,9,4,225,54,15,172,
-133,229,250,24,243,10,49,224,151,7,243,22,7,241,100,8,242,38,5,66,
-24,32,69,196,195,164,196,97,35,228,196,0,233,10,29,160,151,224,138,2,
-242,204,5,99,3,241,128,0,243,108,16,244,53,24,179,7,225,42,8,243,
-116,1,225,179,19,229,99,2,254,145,1,74,140,35,59,215,27,246,94,1,
-227,64,22,243,83,0,253,196,8,224,23,1,226,21,11,225,237,2,243,95,
-15,192,167,169,116,2,95,55,53,225,212,2,229,91,27,96,125,225,76,0,
-248,240,0,142,174,133,59,110,170,90,130,65,82,128,67,225,70,2,193,33,
-210,29,64,253,2,51,53,32,191,147,244,135,2,97,213,254,212,4,230,68,
-30,192,48,224,28,4,101,101,224,224,8,96,21,232,63,5,230,130,19,163,
-218,117,57,225,57,4,225,58,26,239,240,0,137,25,112,216,235,101,6,210,
-105,99,149,70,129,33,3,139,37,32,116,2,48,32,58,100,84,249,199,1,
-98,124,89,199,64,28,96,37,38,213,2,58,52,52,135,130,100,197,66,114,
-245,181,1,34,119,228,49,0,122,25,194,225,135,189,128,39,201,49,226,103,
-25,227,82,11,229,220,17,253,107,6,112,211,113,100,225,138,2,229,170,6,
-2,98,101,115,2,116,32,103,219,212,229,131,4,248,161,21,160,198,99,88,
-97,84,105,61,231,144,5,229,2,5,195,15,247,252,7,250,15,14,228,54,
-10,233,80,18,229,100,1,224,124,8,156,52,168,26,228,172,0,224,42,3,
-228,125,0,226,78,5,193,186,193,188,246,234,1,247,137,32,247,184,3,151,
-91,224,46,12,196,227,229,163,1,225,200,48,2,49,34,32,225,201,9,226,
-133,12,225,208,4,227,203,0,133,6,64,61,106,119,225,213,2,229,178,0,
-72,222,225,184,5,224,220,20,216,253,250,86,26,164,158,250,14,23,236,212,
-0,64,56,70,141,228,40,0,249,249,2,230,101,19,226,138,14,229,134,4,
-32,13,47,82,151,61,32,6,64,4,35,248,138,221,147,251,33,27,32,17,
-202,223,2,52,53,32,32,13,244,8,2,151,45,64,34,182,33,71,168,32,
-13,253,199,1,32,36,96,241,100,96,71,197,128,37,2,49,32,58,99,50,
-254,78,10,64,28,202,37,111,164,33,164,64,138,32,24,132,159,241,4,4,
-225,147,2,32,42,102,248,134,73,224,246,1,181,201,98,204,49,130,166,81,
-65,245,129,249,96,227,64,101,208,135,199,77,192,42,101,81,202,228,230,63,
-0,232,169,2,233,84,10,230,63,44,254,18,2,224,35,8,192,86,230,63,
-0,96,43,252,21,17,249,36,15,180,160,96,110,160,10,227,103,7,2,102,
-105,116,2,115,34,32,128,25,181,16,64,5,130,20,32,171,129,48,130,20,
-2,75,50,32,230,34,0,231,212,2,65,151,253,146,3,129,167,249,126,7,
-65,248,227,185,8,252,10,3,234,183,21,229,45,7,231,198,12,143,5,231,
-134,4,224,238,6,2,100,105,115,2,112,108,97,2,121,32,108,2,97,121,
-34,229,57,6,232,223,12,224,29,0,65,79,174,20,225,178,0,239,11,31,
-33,88,52,152,246,76,4,2,49,48,32,206,99,239,11,1,241,16,1,64,
-5,96,53,232,235,9,228,63,2,96,32,224,184,0,228,57,15,225,113,7,
-234,42,7,240,171,24,225,106,57,2,50,34,32,225,77,5,133,114,230,222,
-10,224,210,29,225,130,82,65,231,101,39,124,217,128,31,160,7,100,26,35,
-12,133,19,145,111,2,49,57,32,68,182,112,26,65,166,203,181,153,161,32,
-19,248,173,1,58,144,2,50,51,32,102,140,2,50,53,56,106,250,70,146,
-117,78,128,26,2,95,49,55,64,98,85,29,192,44,58,44,124,129,96,195,
-55,163,160,21,2,50,54,49,147,123,192,58,64,59,166,152,32,116,184,232,
-97,227,255,142,1,208,135,101,26,89,194,2,50,57,50,255,222,2,2,51,
-49,54,66,107,106,90,86,20,250,102,1,96,124,2,50,54,32,97,224,229,
-116,0,225,80,5,225,247,1,2,114,101,99,2,117,114,115,2,105,118,101,
-2,32,109,111,2,100,117,108,2,101,58,32,161,253,235,247,0,32,46,32,
-109,64,181,224,71,19,2,44,32,105,2,109,112,111,2,114,116,32,2,99,
-104,97,2,105,110,58,160,69,64,168,95,40,156,53,128,69,219,94,2,51,
-49,32,64,253,217,207,2,90,32,90,129,184,32,19,134,102,32,47,2,55,
-32,75,118,78,237,152,7,2,50,55,52,253,3,1,65,4,97,201,33,39,
-65,169,75,126,32,22,33,51,224,22,0,121,52,64,28,128,16,65,58,33,
-33,189,185,64,26,167,71,88,136,32,92,96,69,133,94,64,38,167,10,97,
-230,91,150,33,138,88,73,2,48,56,32,235,247,4,98,214,132,21,224,42,
-0,225,142,3,65,8,129,18,87,152,32,63,179,91,232,250,1,253,238,1,
-69,125,128,73,64,128,64,51,58,106,189,34,32,6,50,182,2,51,56,52,
-227,55,0,225,150,17,2,77,111,100,33,212,2,32,110,111,2,116,32,102,
-2,111,117,110,2,100,58,32,161,222,183,65,97,221,2,49,50,51,65,108,
-96,79,224,76,19,2,92,49,48,2,38,115,101,2,97,114,99,2,104,32,
-112,2,97,116,104,2,61,34,32,160,190,128,71,64,58,64,73,2,49,51,
-49,192,4,175,183,32,241,195,1,224,91,19,2,112,97,99,2,107,97,103,
-2,101,32,112,224,92,1,224,83,18,225,63,0,229,55,14,233,225,0,225,
-140,1,225,137,4,33,65,245,45,0,241,19,1,199,25,131,190,192,33,192,
-31,80,240,2,49,56,32,234,5,3,227,36,0,167,95,132,101,193,95,231,
-255,6,128,5,104,220,193,12,2,52,50,48,98,136,228,241,8,73,219,228,
-241,2,169,73,226,131,1,94,75,241,156,3,167,216,215,161,33,208,67,254,
-228,13,37,193,129,2,100,111,101,2,115,32,110,34,52,2,99,111,110,2,
-116,97,105,2,110,32,109,130,71,226,60,1,192,244,229,172,12,245,147,1,
-227,243,3,227,67,18,160,220,101,31,161,115,215,86,99,240,35,14,33,40,
-128,73,120,122,237,196,5,204,16,196,173,58,23,64,47,98,208,35,194,133,
-233,224,229,1,2,46,116,120,78,114,32,25,133,239,91,134,2,50,50,32,
-64,50,102,6,64,104,107,12,2,50,49,32,159,211,36,19,64,88,96,5,
-32,31,235,30,1,188,19,32,19,132,179,225,74,8,73,174,32,29,171,31,
-234,195,2,38,84,234,195,2,124,11,96,106,197,224,133,205,198,181,224,244,
-4,236,212,0,128,49,2,58,52,49,171,34,226,185,8,165,196,164,67,2,
-50,52,50,64,25,65,22,100,89,158,223,94,195,69,82,76,26,248,97,1,
-227,40,2,192,12,97,79,226,59,17,2,76,111,97,2,100,105,110,2,103,
-32,112,162,67,245,119,0,227,130,18,2,50,55,49,160,140,224,180,1,228,
-244,2,224,176,2,64,68,2,51,48,55,191,235,91,238,69,67,2,50,51,
-51,163,75,226,226,1,226,223,19,2,80,97,99,96,155,2,99,111,109,2,
-112,105,108,2,101,32,118,2,101,114,115,2,105,111,110,2,32,109,105,2,
-115,109,97,2,116,99,104,2,58,32,112,128,33,164,126,226,83,1,128,111,
-230,254,18,160,82,2,114,61,34,103,140,160,153,224,156,1,2,51,49,53,
-128,183,141,226,33,180,184,171,129,180,135,207,70,185,199,207,71,250,128,22,
-2,51,49,56,224,22,3,64,148,70,168,132,108,66,183,2,51,52,48,96,
-162,157,218,2,50,57,55,161,70,192,186,119,251,96,127,204,151,65,41,32,
-18,152,249,64,146,157,183,2,50,32,65,128,17,134,245,32,17,2,52,32,
-75,128,17,131,68,119,112,231,168,0,64,88,32,20,2,90,32,85,98,133,
-163,54,2,51,51,56,2,32,95,56,96,17,178,220,199,200,216,158,231,191,
-0,32,34,131,55,96,123,232,2,0,64,23,131,49,96,23,64,132,96,2,
-192,30,64,32,69,253,99,164,34,20,32,13,129,76,2,94,71,69,2,84,
-84,73,2,77,69,77,2,73,76,76,2,73,32,58,64,27,161,99,214,101,
-238,29,11,39,92,170,199,237,4,7,233,217,0,102,195,64,179,131,168,234,
-2,5,170,141,160,81,234,58,15,167,208,71,217,227,150,5,231,218,18,226,
-112,17,2,70,105,108,231,214,10,231,44,3,247,51,1,253,186,2,234,170,
-2,2,57,48,32,252,38,1,96,2,224,237,2,234,126,1,193,55,164,237,
-101,250,100,57,64,66,100,136,199,72,199,110,234,248,7,71,170,187,18,235,
-3,3,160,14,100,1,110,108,97,213,233,110,6,65,100,2,51,57,54,229,
-87,2,2,109,104,115,2,99,112,112,2,46,104,115,230,139,0,206,16,164,
-255,249,167,2,224,138,1,96,132,132,29,224,232,3,160,186,235,177,8,2,
-52,48,52,100,235,224,171,0,128,156,251,36,0,225,227,3,2,49,50,48,
-105,205,96,14,228,187,7,64,220,32,35,100,185,118,86,133,97,237,124,6,
-2,114,101,109,58,179,97,210,2,102,97,105,2,108,101,100,128,219,32,113,
-131,96,2,94,117,110,2,108,105,110,2,107,32,58,96,101,161,31,225,33,
-2,2,50,49,49,224,77,2,2,77,72,83,2,67,80,80,2,72,83,34,
-160,184,238,165,1,232,220,5,96,216,230,33,11,160,180,134,17,205,157,230,
-3,2,226,151,19,2,82,117,110,2,32,99,112,2,112,104,115,226,146,20,
-33,211,231,248,3,231,186,2,48,188,224,87,12,96,83,230,82,0,200,47,
-224,133,15,2,32,45,45,2,110,111,108,2,105,110,101,32,8,2,115,116,
-114,2,105,112,32,192,58,233,233,0,234,179,0,108,160,233,141,0,75,154,
-65,205,250,45,2,232,224,20,165,79,139,71,224,142,17,2,79,34,32,232,
-169,1,33,198,204,245,228,221,0,68,251,128,1,233,243,2,32,40,133,30,
-2,79,32,102,224,76,0,2,39,45,68,2,77,73,78,2,95,86,69,2,
-82,83,73,2,79,78,95,2,98,97,115,2,101,40,120,2,44,121,44,2,
-122,41,61,2,40,120,60,2,61,52,124,2,124,121,60,2,61,49,52,2,
-41,39,34,32,72,224,56,3,2,45,68,95,2,95,77,72,2,83,95,95,
-64,24,133,213,64,237,140,247,2,56,32,79,224,214,1,2,58,51,57,133,
-93,228,206,6,130,234,2,51,57,55,236,157,7,226,236,20,234,131,38,2,
-99,97,108,2,108,67,111,2,109,109,97,68,214,131,14,236,180,16,2,49,
-52,56,236,180,23,2,44,32,34,229,26,19,32,234,166,58,2,115,121,115,
-2,116,101,109,2,32,58,51,64,222,99,99,227,232,3,224,236,2,97,5,
-181,152,64,34,224,21,4,112,141,33,34,96,232,240,27,4,2,50,49,48,
-240,27,10,58,22,224,39,5,65,64,70,47,32,67,143,115,229,51,4,165,
-40,64,29,78,184,69,26,193,167,2,51,57,52,69,155,97,125,2,49,51,
-52,65,126,150,112,38,96,32,59,204,35,104,86,122,161,105,73,225,51,2,
-130,120,134,224,38,146,237,155,2,2,51,52,38,2,108,105,98,2,47,83,
-121,65,33,2,47,73,79,37,125,64,19,2,44,50,56,2,53,58,56,129,
-94,2,90,32,66,64,96,75,168,96,110,97,18,33,238,128,131,160,19,180,
-254,64,36,224,118,7,32,202,229,93,0,49,145,167,75,32,41,224,84,3,
-171,33,249,11,3,165,189,252,173,4,67,222,224,136,1,241,24,0,242,167,
-0,203,92,235,65,1,65,59,181,51,33,192,32,14,133,102,2,94,116,109,
-2,112,110,97,2,109,101,32,32,17,227,177,0,227,176,8,227,178,4,64,
-60,219,196,59,244,64,106,32,137,2,54,32,89,135,73,251,155,1,213,101,
-254,20,17,208,85,82,1,97,176,97,213,2,35,49,50,254,6,3,245,137,
-1,217,78,108,42,224,45,0,87,254,255,159,1,181,212,246,194,1,224,42,
-3,83,17,243,177,3,224,129,17,143,121,96,123,224,117,13,113,130,34,215,
-64,112,224,33,14,101,104,224,33,20,139,41,224,67,20,97,57,96,33,106,
-88,130,225,224,36,7,136,131,247,193,0,224,0,3,225,132,8,226,88,4,
-225,133,19,193,44,225,132,71,2,49,50,53,224,166,2,137,125,224,133,18,
-194,216,202,223,40,208,50,193,131,254,248,69,1,250,79,0,250,78,1,231,
-89,4,140,178,147,163,2,56,54,32,132,96,80,95,34,204,249,217,0,228,
-161,9,138,215,233,79,9,228,175,2,2,58,51,56,230,73,9,37,72,32,
-6,192,219,2,83,32,67,161,1,159,119,2,54,50,32,110,230,168,121,165,
-49,192,59,71,176,2,56,55,32,234,116,4,234,83,4,172,219,2,50,54,
-52,254,196,0,234,145,7,224,47,0,196,122,64,74,131,177,69,17,77,185,
-32,19,172,58,64,1,102,116,116,198,45,104,2,35,54,53,167,13,77,117,
-2,35,57,48,129,60,77,168,229,54,13,2,68,97,116,2,97,47,67,2,
-104,97,114,197,54,2,57,51,58,189,40,137,87,32,169,96,165,215,58,242,
-57,6,2,49,52,57,96,122,2,57,32,35,96,122,160,11,103,133,96,189,
-203,51,36,240,64,250,148,255,66,8,141,124,38,98,129,247,32,19,132,230,
-2,85,32,58,64,21,128,10,90,51,76,118,160,44,2,48,32,58,108,139,
-32,13,45,65,64,15,101,24,137,112,231,196,2,246,31,5,140,16,231,132,
-16,244,118,0,32,106,80,111,96,120,241,13,0,149,56,32,68,64,209,233,
-160,6,231,182,11,232,63,21,246,193,1,241,109,2,226,95,1,156,50,224,
-26,12,226,122,6,224,102,21,106,93,247,43,11,232,152,33,2,99,111,108,
-232,156,5,128,52,32,0,224,37,1,2,101,110,100,2,45,111,102,2,45,
-102,105,2,108,101,34,96,28,224,26,1,2,110,111,32,2,108,111,99,2,
-97,116,105,2,111,110,34,224,55,8,224,28,7,33,119,220,40,132,23,38,
-234,164,245,32,26,200,241,99,139,2,51,55,53,164,66,224,183,12,237,122,
-0,174,253,173,194,40,120,83,60,111,74,194,141,96,66,130,141,32,83,254,
-33,0,218,43,130,174,135,165,128,6,32,39,130,161,2,89,32,66,165,41,
-231,180,9,199,179,64,48,217,193,218,226,253,59,2,192,18,34,76,253,192,
-7,181,183,239,233,1,131,222,226,161,0,195,12,2,48,32,80,32,5,2,
-54,56,32,32,158,113,125,35,43,128,238,32,81,2,51,55,48,129,60,240,
-193,2,113,61,96,24,64,63,2,49,50,52,142,156,99,208,138,61,133,135,
-32,68,132,158,32,22,36,155,128,92,32,132,36,229,128,11,2,58,51,54,
-176,223,34,249,94,27,35,237,32,247,2,55,32,102,225,135,0,2,67,111,
-110,2,116,114,111,2,108,46,69,2,120,99,101,2,112,116,105,2,111,110,
-46,2,73,110,116,2,101,114,110,2,97,108,34,32,64,224,39,1,2,83,
-111,109,2,101,69,120,160,35,165,233,137,70,32,100,130,19,103,234,131,131,
-68,140,2,95,55,32,136,182,2,51,54,53,96,47,66,193,250,186,0,2,
-51,54,54,128,160,194,52,39,120,81,255,96,23,242,13,0,96,58,171,69,
-65,234,35,90,217,190,159,238,2,51,54,51,116,125,160,136,196,152,77,16,
-128,94,129,221,34,194,56,110,32,14,129,147,230,13,6,235,44,1,2,54,
-48,32,240,205,0,238,222,3,74,230,148,106,112,139,32,72,129,174,2,75,
-32,90,192,104,129,173,132,16,241,2,1,145,187,138,125,68,249,102,85,227,
-204,16,2,111,112,101,2,110,70,105,91,62,2,99,97,110,81,150,64,16,
-196,30,231,15,4,64,174,170,72,211,71,2,51,53,56,161,235,2,53,53,
-32,32,4,86,100,2,51,53,55,246,80,6,97,221,2,97,99,116,59,171,
-86,83,96,38,128,52,82,50,32,147,64,19,197,243,37,42,32,91,68,235,
-64,3,32,24,129,95,240,10,0,2,115,101,113,205,195,32,16,192,13,67,
-115,128,11,168,215,204,112,32,64,129,142,224,47,2,86,246,64,123,163,237,
-244,227,1,244,184,2,134,185,148,184,2,67,32,66,65,168,2,53,48,32,
-128,80,227,54,2,129,136,64,25,244,45,5,34,89,192,135,32,75,163,192,
-2,58,51,52,219,217,192,28,224,173,4,32,31,129,78,252,83,3,2,51,
-52,55,247,129,1,33,218,118,60,64,130,241,69,3,35,247,32,4,168,71,
-243,230,3,2,50,55,55,173,206,147,68,226,95,0,241,239,12,247,91,21,
-241,71,1,247,74,25,2,115,97,118,46,252,2,99,97,99,2,104,101,32,
-163,185,231,13,6,192,175,105,177,202,102,224,184,7,32,253,223,5,254,99,
-5,218,239,55,99,166,241,96,12,65,186,248,64,0,96,18,153,233,250,128,
-13,202,246,203,126,54,127,234,3,0,96,40,104,27,235,91,3,229,117,0,
-253,37,17,110,200,33,35,230,118,10,253,48,5,237,74,1,117,132,214,97,
-128,18,253,137,4,251,252,6,84,105,242,129,3,239,151,1,248,167,11,148,
-200,235,183,1,129,246,160,182,248,165,1,240,254,0,2,49,54,54,236,109,
-6,32,23,242,242,1,38,177,224,162,18,2,51,48,57,128,12,99,82,103,
-99,155,204,252,218,3,192,131,224,126,4,242,224,3,250,10,31,243,233,14,
-249,250,9,232,204,19,2,105,110,118,2,97,108,105,2,100,97,116,57,91,
-66,174,209,178,254,91,4,237,3,1,224,154,4,70,30,112,138,2,51,51,
-54,251,250,4,160,223,226,142,2,226,39,1,180,40,192,179,64,196,81,11,
-64,68,254,22,3,35,20,101,24,67,26,168,43,66,51,68,20,237,91,0,
-144,57,129,85,66,59,225,227,1,219,131,112,76,75,237,96,0,96,35,96,
-181,2,52,51,32,217,110,32,98,133,98,103,44,109,73,2,52,49,32,96,
-128,105,22,64,42,100,127,64,128,131,126,110,54,224,105,4,133,108,192,135,
-253,204,0,168,175,75,41,64,169,206,151,254,127,2,224,61,2,101,15,233,
-37,2,64,126,101,12,112,216,64,147,229,26,0,240,190,8,32,31,244,16,
-0,2,53,32,67,105,119,186,108,129,99,121,218,157,248,32,104,2,79,32,
-64,160,58,189,25,97,123,229,153,0,66,228,134,98,128,2,96,153,224,183,
-3,64,176,2,95,51,50,109,78,169,229,132,65,2,51,50,50,69,66,32,
-24,98,148,128,10,226,252,3,129,130,217,175,224,98,1,175,184,248,244,6,
-184,227,227,5,0,163,29,225,246,0,96,8,2,95,54,51,66,67,224,104,
-0,32,235,163,114,223,97,138,133,2,51,50,54,238,88,0,250,45,0,224,
-44,1,33,3,201,83,32,222,109,91,34,169,203,93,251,207,10,137,30,80,
-78,226,73,0,65,95,202,216,255,209,2,64,64,42,119,161,12,193,6,239,
-251,1,201,93,142,62,37,126,2,51,49,57,137,190,224,217,0,32,189,184,
-127,225,81,3,160,70,225,69,10,225,94,0,225,60,8,74,45,225,60,25,
-128,73,209,150,176,197,35,64,98,54,226,126,7,224,44,4,192,120,123,92,
-224,48,20,44,179,209,29,45,65,32,135,101,171,32,233,224,6,2,64,185,
-195,116,160,45,129,200,67,8,128,78,115,217,224,9,0,117,198,65,214,168,
-13,32,54,176,8,160,54,160,34,224,63,11,96,55,229,142,1,226,37,14,
-173,15,72,103,76,111,225,198,1,68,108,161,158,2,90,32,83,225,144,4,
-226,240,0,227,74,1,227,1,1,227,31,1,103,9,224,80,4,225,115,16,
-201,67,224,177,0,230,92,0,237,37,1,251,159,1,224,192,4,132,238,224,
-192,70,226,98,0,234,129,6,224,190,14,192,46,65,151,193,170,224,191,18,
-192,14,131,41,227,226,2,128,209,251,91,3,100,188,228,186,1,195,17,251,
-75,3,115,141,163,111,43,193,130,119,247,225,0,209,204,226,136,5,167,100,
-224,89,1,252,173,2,225,33,6,192,114,224,227,1,234,234,1,224,11,0,
-254,214,4,160,207,229,68,23,225,69,8,225,52,1,224,208,0,138,29,2,
-82,32,64,229,152,29,247,8,10,225,248,5,225,55,1,64,15,185,199,227,
-172,7,243,4,4,33,67,38,172,96,11,32,30,142,121,193,73,163,92,224,
-98,14,228,14,18,224,97,38,165,236,225,244,3,162,237,81,61,64,7,230,
-148,9,224,13,19,229,97,3,193,195,233,209,4,213,236,2,95,52,55,224,
-184,5,224,171,5,70,38,160,24,163,151,59,191,96,6,232,251,1,194,83,
-224,176,10,224,177,65,208,55,64,158,224,177,38,48,235,96,6,224,18,0,
-225,111,1,35,138,206,86,128,101,224,195,17,169,175,172,155,199,155,192,8,
-32,72,217,139,224,72,28,232,170,5,227,21,1,151,122,224,5,0,39,132,
-224,61,0,229,224,4,96,49,234,76,0,234,85,1,225,57,0,224,167,5,
-247,182,3,138,234,227,162,0,96,16,224,15,0,192,224,225,151,1,224,119,
-33,192,35,225,39,19,229,25,10,192,24,129,69,216,4,196,137,227,5,16,
-225,143,2,230,249,5,160,79,224,103,17,2,58,51,50,138,60,224,101,31,
-232,174,4,225,181,1,225,46,6,160,67,228,231,6,230,135,5,225,150,67,
-224,98,10,225,129,59,67,223,33,27,2,35,50,32,32,11,184,153,231,89,
-14,230,55,0,227,156,1,224,5,1,135,102,224,225,1,231,127,6,200,61,
-171,149,231,117,14,231,141,17,224,128,3,192,208,170,44,102,59,231,29,8,
-229,144,4,132,32,135,34,228,44,0,43,66,64,255,203,18,178,18,65,110,
-145,236,64,168,65,25,88,183,69,182,64,11,2,51,32,58,101,208,227,249,
-0,228,234,21,226,4,3,242,78,8,129,126,180,125,34,78,81,198,34,145,
-128,165,83,195,192,255,32,37,212,90,32,16,32,13,173,74,50,173,234,122,
-0,97,102,100,134,118,165,182,149,214,156,128,24,64,11,182,196,224,24,11,
-160,49,150,228,44,68,83,252,107,231,2,58,51,49,246,50,0,243,64,11,
-2,50,55,52,192,206,76,127,186,6,93,100,250,6,1,64,85,243,206,1,
-2,50,56,50,247,31,0,251,97,2,67,82,143,141,32,48,180,112,86,234,
-39,110,96,140,124,123,2,51,49,51,96,173,86,209,96,17,32,43,213,227,
-110,137,64,31,161,159,127,39,2,50,57,48,66,36,158,56,109,20,111,208,
-237,20,0,81,0,120,190,129,111,128,174,129,112,193,28,87,39,97,23,32,
-25,129,124,224,200,19,97,140,65,225,66,97,32,50,81,116,181,152,64,13,
-193,34,96,172,49,210,224,78,2,2,49,57,50,146,66,32,252,32,27,129,
-51,2,94,109,100,2,53,66,70,2,73,76,69,33,84,64,24,228,201,2,
-81,209,96,220,158,138,104,251,155,54,2,48,51,32,96,122,129,25,64,158,
-45,67,76,105,254,20,4,62,64,64,213,64,167,2,35,52,55,131,29,153,
-108,64,63,224,165,2,207,234,2,75,51,32,239,223,3,239,235,12,228,90,
-0,64,148,160,172,121,61,180,58,153,220,240,132,2,253,194,4,81,111,86,
-181,190,3,239,215,9,115,8,96,65,226,63,8,64,14,122,50,235,149,0,
-64,237,112,84,242,96,7,2,79,32,35,64,240,192,180,32,172,225,215,10,
-98,44,254,31,1,225,228,6,182,192,114,207,226,111,9,2,50,57,49,226,
-111,13,116,196,246,159,4,96,24,239,150,12,66,127,196,205,238,187,0,111,
-32,171,54,239,128,2,251,51,5,161,100,239,133,6,230,52,5,230,69,7,
-98,81,224,85,5,224,80,0,98,202,64,170,184,27,55,9,32,34,69,119,
-64,174,2,90,32,67,128,6,160,58,238,163,0,224,28,5,73,201,224,28,
-16,76,232,224,28,16,107,111,224,29,16,2,50,52,55,224,29,3,2,95,
-53,57,225,21,0,57,131,160,10,32,187,164,82,96,187,116,23,2,50,57,
-51,240,23,3,246,104,2,98,168,229,42,3,160,6,224,44,24,224,51,3,
-224,44,17,224,82,3,160,51,224,44,24,224,96,4,128,226,101,16,128,226,
-101,9,96,6,32,226,2,115,99,109,2,112,32,58,96,62,198,40,225,79,
-6,98,200,121,84,129,228,69,237,97,207,64,68,197,16,144,138,36,252,104,
-232,32,24,131,208,2,95,51,32,226,154,2,227,116,0,2,64,95,57,162,
-252,64,42,211,238,195,76,227,60,3,125,127,133,28,119,235,101,231,182,53,
-247,175,1,99,130,243,35,0,251,64,4,2,56,48,32,64,120,40,80,64,
-44,96,13,128,23,39,240,150,123,32,6,246,6,0,32,100,131,114,118,158,
-32,170,32,23,84,84,64,34,249,206,7,96,25,228,234,1,192,20,162,57,
-118,218,32,131,229,253,19,100,22,38,182,246,132,1,224,208,36,66,206,224,
-208,0,39,119,224,207,0,119,203,129,229,64,6,193,135,224,92,5,246,96,
-0,225,44,14,224,171,6,184,230,96,107,96,106,102,53,96,6,135,197,96,
-86,223,93,224,85,8,70,209,224,77,3,32,46,214,5,71,69,96,35,166,
-248,2,75,52,32,230,52,26,2,58,50,55,130,14,2,82,32,95,98,232,
-32,16,188,193,72,100,150,121,160,5,118,24,182,139,122,141,128,37,2,53,
-32,58,96,25,126,47,71,112,107,83,251,212,18,104,189,253,15,4,2,46,
-109,104,2,115,99,97,56,107,93,13,123,6,139,20,230,163,15,251,210,5,
-165,121,129,226,251,207,0,185,232,166,34,127,3,165,169,2,50,55,49,161,
-60,67,101,129,107,224,105,4,94,160,160,105,224,132,3,32,24,32,244,225,
-152,7,248,123,1,231,232,6,2,49,50,50,130,152,225,174,0,254,207,4,
-32,77,119,138,224,158,1,2,50,50,49,128,23,137,145,224,122,5,64,227,
-250,217,3,224,226,2,226,16,3,96,213,164,52,2,50,54,57,65,154,130,
-18,2,73,79,46,2,100,101,115,2,101,114,105,57,219,2,122,101,32,2,
-58,50,54,129,247,2,94,97,100,2,100,95,108,2,122,55,55,2,95,100,
-101,2,99,111,109,2,112,114,101,2,115,115,111,2,114,32,58,96,133,225,
-133,6,128,178,255,152,9,122,190,98,27,93,206,255,35,4,97,50,64,102,
-2,117,110,103,2,101,116,98,64,87,252,191,0,224,87,3,70,21,233,43,
-2,94,139,37,103,78,45,94,247,188,209,224,88,1,32,49,102,123,127,203,
-226,71,1,2,104,71,101,2,116,67,104,2,97,114,58,2,32,69,79,2,
-70,34,32,129,14,64,179,100,239,57,213,32,13,130,123,2,94,103,101,128,
-141,226,107,0,227,109,6,93,146,32,18,34,176,195,239,186,64,251,56,17,
-2,111,112,101,2,110,66,105,2,110,97,114,2,121,70,105,2,108,101,58,
-59,61,2,110,110,111,2,116,32,111,32,22,251,66,4,253,243,2,161,61,
-225,8,1,2,53,55,32,224,232,6,173,59,32,170,130,172,32,140,45,31,
-97,249,64,199,2,99,108,111,2,115,101,98,64,16,129,231,195,227,2,58,
-50,53,207,131,224,218,11,227,63,9,224,36,3,64,242,2,53,53,32,190,
-120,64,229,160,154,224,155,4,198,135,224,163,0,64,116,130,53,98,85,139,
-65,96,55,192,18,2,117,116,102,2,56,32,58,96,81,166,29,33,71,2,
-64,95,48,67,246,32,112,141,152,32,10,182,144,224,186,6,252,74,3,2,
-49,50,48,250,107,0,221,9,96,19,67,135,64,221,234,120,3,2,49,49,
-52,170,121,224,23,7,33,35,133,17,224,24,5,74,31,224,23,8,225,233,
-1,2,119,43,34,197,196,2,50,53,50,172,129,226,188,0,2,50,48,55,
-134,63,189,17,225,204,1,199,182,228,186,7,32,241,130,135,2,94,102,111,
-66,45,32,15,235,255,0,42,178,229,201,11,229,199,5,32,48,237,63,1,
-238,142,1,32,22,168,21,77,212,78,71,240,205,8,224,2,25,61,5,236,
-103,5,241,46,6,224,1,13,125,59,59,46,225,52,1,2,70,108,97,2,
-103,115,123,193,56,224,0,5,242,40,1,224,2,31,96,150,224,102,11,2,
-118,101,114,2,98,111,115,2,101,61,34,195,113,64,33,42,128,2,64,35,
-48,224,122,11,224,199,31,76,190,194,68,224,189,54,224,186,16,2,114,117,
-110,2,73,116,61,224,184,3,2,50,52,53,224,184,14,224,181,56,224,180,
-35,224,177,16,39,183,2,100,105,114,225,107,5,228,221,1,224,184,11,224,
-181,53,224,180,32,224,177,16,2,112,97,116,2,104,115,61,224,176,9,229,
-147,2,224,182,10,224,179,50,224,178,29,224,175,16,2,111,117,116,2,112,
-117,116,225,97,33,224,167,47,224,166,26,224,163,16,2,108,111,97,2,100,
-105,110,2,103,61,34,226,185,24,224,155,44,224,154,23,227,79,17,2,101,
-97,100,2,67,97,99,2,104,101,61,224,153,24,224,150,41,224,149,20,224,
-146,16,2,119,114,105,2,116,101,67,224,147,28,224,144,38,224,143,17,224,
-140,16,2,117,115,101,2,84,105,99,2,107,115,61,224,138,22,224,135,35,
-224,134,14,224,131,16,2,100,111,67,2,80,80,61,224,128,21,224,125,32,
-224,124,11,224,121,16,2,99,112,112,2,65,114,103,228,11,34,224,132,29,
-224,131,8,224,128,17,171,110,224,253,20,224,114,26,224,113,5,224,110,16,
-2,98,117,105,2,108,100,80,2,107,103,61,224,110,5,76,125,224,240,12,
-224,119,23,224,118,2,228,25,17,2,105,115,116,224,114,33,224,111,20,245,
-129,1,229,217,15,2,107,103,80,37,220,225,207,29,224,104,17,170,82,224,
-100,14,2,105,110,115,2,116,97,108,2,108,80,107,228,237,17,224,88,14,
-224,77,11,2,116,97,114,44,135,231,62,35,224,0,10,192,106,2,49,50,
-53,225,45,1,32,76,77,159,173,143,87,186,128,11,2,58,50,52,140,22,
-2,83,32,83,86,187,89,102,187,91,224,154,5,2,78,111,116,2,104,105,
-110,2,103,34,32,213,215,171,105,86,190,79,35,254,35,0,43,68,244,247,
-0,224,225,9,2,74,117,115,2,116,32,34,161,89,64,111,32,62,192,49,
-139,178,43,43,98,18,160,15,92,159,160,15,32,171,245,184,0,139,4,185,
-157,64,124,140,42,57,138,145,96,45,156,2,35,52,48,139,137,51,112,160,
-16,205,58,64,180,235,5,1,224,235,8,2,70,97,108,2,115,101,34,139,
-153,224,24,4,2,84,114,117,128,23,225,80,1,149,249,129,80,148,228,64,
-6,183,241,85,51,143,146,2,50,52,51,75,126,65,254,242,239,0,224,1,
-17,232,53,9,32,58,217,84,50,70,97,112,77,105,121,172,32,27,236,29,
-0,224,64,5,32,25,255,36,1,205,55,32,58,209,130,241,82,8,226,180,
-0,129,222,156,132,239,218,2,225,248,2,161,247,76,86,224,51,0,129,120,
-32,97,2,51,57,32,227,163,2,237,177,3,248,74,1,240,49,3,224,72,
-4,240,191,7,65,199,140,202,239,221,6,39,206,97,141,114,100,64,114,32,
-37,2,65,46,119,71,82,45,50,64,80,212,71,34,45,160,2,193,24,33,
-215,160,29,192,26,225,122,6,32,34,244,136,0,224,36,5,224,34,3,129,
-235,236,109,2,2,55,46,48,2,92,49,48,2,38,34,32,64,29,180,37,
-2,50,50,57,64,208,89,214,2,50,51,51,160,19,35,215,35,164,32,218,
-78,94,142,125,142,107,92,132,224,165,0,207,227,34,96,32,13,211,219,32,
-10,211,216,65,138,62,65,249,88,6,32,6,206,174,55,115,176,102,131,84,
-32,85,191,141,129,199,126,139,32,6,33,15,32,25,213,166,111,49,147,47,
-121,64,97,215,32,12,57,31,196,30,96,30,229,245,2,160,35,153,112,160,
-11,128,110,212,26,34,95,187,29,180,52,253,250,0,96,88,160,107,122,98,
-121,15,32,32,213,246,117,124,66,19,32,19,225,85,0,66,38,83,84,32,
-19,129,85,50,212,2,115,116,100,43,34,33,33,189,215,2,73,32,58,112,
-142,241,212,1,226,118,1,55,127,33,9,66,124,93,53,2,35,49,48,128,
-115,250,135,1,33,145,209,118,64,33,2,58,50,49,241,67,0,32,17,68,
-169,114,225,32,23,176,230,43,154,81,123,189,121,192,215,186,81,64,5,32,
-220,112,22,195,187,227,18,5,128,246,131,49,127,132,97,63,189,185,88,68,
-32,117,81,31,152,44,120,60,32,30,129,35,2,115,101,113,2,117,97,108,
-64,124,161,31,227,238,0,32,109,226,160,1,2,77,72,83,2,68,73,82,
-99,54,67,80,93,122,243,159,4,189,187,224,19,0,226,77,2,32,28,245,
-31,12,113,102,35,155,64,142,240,247,20,245,119,7,97,112,240,253,11,189,
-252,32,58,84,177,189,240,2,112,101,101,2,107,67,65,2,83,116,114,38,
-134,32,21,189,211,2,95,57,51,99,50,32,16,182,167,127,148,183,102,71,
-59,83,239,64,133,130,231,128,6,129,64,96,159,32,56,129,173,2,116,111,
-73,2,110,116,32,32,14,189,244,39,137,2,101,110,118,64,16,162,132,229,
-63,3,246,34,7,197,57,222,70,225,81,0,32,101,161,89,190,9,228,198,
-8,2,116,97,105,2,108,34,32,32,34,93,232,96,45,162,125,65,238,125,
-103,32,6,99,46,190,4,66,210,189,217,61,136,99,139,92,209,32,5,135,
-221,38,113,192,56,2,49,55,53,224,11,2,116,181,130,228,189,108,255,220,
-2,192,61,35,159,224,155,1,2,101,114,114,2,111,114,58,135,176,134,229,
-128,38,2,58,49,57,161,126,36,147,88,130,51,32,35,212,231,43,3,2,
-67,111,110,2,116,114,111,2,108,46,69,64,66,64,64,224,26,1,96,18,
-2,67,97,108,128,246,196,73,32,83,182,98,157,127,157,54,253,62,6,187,
-166,33,125,69,26,249,218,1,2,49,57,52,183,243,196,123,164,249,93,46,
-64,0,189,62,64,168,199,129,98,211,96,32,221,250,228,218,5,163,143,228,
-205,2,32,45,130,11,2,83,32,85,225,198,7,2,109,100,53,2,67,111,
-109,2,98,105,110,53,233,2,101,109,112,2,116,121,34,199,48,100,209,70,
-56,160,171,70,2,119,205,180,166,58,76,32,97,64,114,2,89,32,66,123,
-244,184,188,68,59,228,30,1,197,23,229,91,2,224,255,3,250,125,2,98,
-11,98,153,32,100,40,1,119,52,36,112,101,121,91,114,232,85,0,97,54,
-66,236,32,189,2,65,114,114,2,97,121,32,32,18,226,129,0,194,240,57,
-128,128,160,32,61,100,180,35,229,229,72,4,248,20,4,2,49,57,48,224,
-46,5,248,166,8,122,228,245,8,5,159,171,96,145,226,228,0,96,20,181,
-246,65,0,133,191,67,110,94,169,138,108,137,226,148,154,224,106,0,225,58,
-3,192,25,172,76,136,209,64,67,234,176,0,32,134,34,40,65,34,32,175,
-132,76,204,97,229,153,1,133,194,236,146,0,232,208,0,64,51,104,235,224,
-44,2,96,95,32,10,101,7,33,219,97,125,152,179,96,19,193,190,232,231,
-3,224,43,10,194,134,229,31,2,96,16,33,23,251,213,0,2,50,32,90,
-232,183,6,2,58,49,56,221,207,36,74,32,157,65,244,194,3,129,253,2,
-35,56,32,89,76,71,240,97,160,32,44,72,123,32,12,167,168,2,49,48,
-52,67,6,86,115,162,58,96,69,2,49,48,53,96,5,67,234,64,16,64,
-11,69,210,160,11,37,166,224,11,0,94,6,224,11,0,71,181,96,12,135,
-131,97,36,43,168,129,155,32,8,66,62,160,2,234,35,7,65,185,128,50,
-161,252,165,213,125,77,64,242,32,13,162,248,32,9,126,23,2,85,32,65,
-224,23,2,199,123,33,235,127,2,224,29,5,224,53,16,95,33,36,49,193,
-86,192,68,224,151,0,67,139,38,232,224,147,2,109,55,224,69,5,128,161,
-139,22,71,164,224,31,6,130,109,162,247,100,39,64,73,93,43,224,142,10,
-128,16,96,52,32,105,33,78,132,135,237,9,7,96,29,100,159,130,246,109,
-213,128,163,162,246,89,125,227,53,1,219,189,64,34,2,64,95,53,32,23,
-167,56,68,82,62,9,228,222,1,2,92,51,52,2,38,108,105,2,98,47,
-68,2,97,116,97,2,47,73,110,2,116,101,103,2,101,114,95,2,84,121,
-112,2,101,46,104,2,115,92,51,2,52,38,44,2,50,56,58,2,49,34,
-32,228,149,1,2,49,56,48,64,4,96,223,44,178,128,187,192,18,234,249,
-0,128,5,32,229,235,84,0,224,60,3,161,70,32,4,2,89,32,67,196,
-5,69,226,64,169,128,197,140,196,99,83,99,91,66,162,157,48,195,131,98,
-187,189,67,227,84,0,35,19,2,52,32,35,103,11,98,160,33,51,2,75,
-32,58,96,113,76,68,64,10,217,64,32,10,234,17,1,39,147,2,49,55,
-55,135,78,74,17,65,36,196,174,223,40,167,147,126,159,2,49,53,57,231,
-147,0,224,56,0,67,28,192,11,97,104,104,135,96,6,174,56,67,238,226,
-5,1,95,31,64,31,198,169,33,17,129,37,95,25,133,243,124,151,195,18,
-96,47,224,15,8,64,65,194,53,228,49,0,32,19,219,91,66,129,97,75,
-137,53,64,147,98,186,65,58,192,73,94,36,224,21,3,128,159,96,21,201,
-190,198,144,137,227,2,49,55,50,128,187,170,86,45,148,32,12,129,101,2,
-90,32,85,97,65,129,104,65,126,222,155,32,10,190,142,2,85,32,73,64,
-35,190,124,105,219,131,138,40,19,96,4,224,14,6,192,189,250,163,1,137,
-235,128,207,32,72,164,226,75,75,160,42,69,37,106,35,224,42,0,64,60,
-32,42,235,118,2,94,37,32,24,99,122,190,63,2,47,61,32,32,11,163,
-110,71,103,32,176,159,245,67,105,219,119,37,161,155,122,239,60,2,2,39,
-32,85,224,20,1,99,124,235,254,5,134,98,2,49,51,57,165,253,254,237,
-1,103,83,94,162,209,45,68,212,160,17,32,140,129,99,231,13,3,192,9,
-192,59,64,146,220,11,96,60,101,238,94,64,66,161,194,239,190,58,177,30,
-160,141,233,219,3,2,110,111,32,2,109,97,116,2,99,104,32,2,97,116,
-32,210,172,79,80,209,22,194,245,106,48,96,11,2,58,49,53,234,48,32,
-2,120,99,101,2,112,116,105,2,111,110,46,68,102,2,114,110,97,106,38,
-224,39,1,51,212,64,22,2,77,97,116,2,99,104,70,203,59,234,68,1,
-190,113,134,90,173,242,2,49,49,55,234,44,4,78,27,224,15,4,255,133,
-10,191,217,139,17,239,94,15,170,88,98,163,190,215,32,37,2,53,32,73,
-96,16,208,63,32,10,195,120,128,24,173,161,129,95,77,50,162,139,80,48,
-2,35,51,57,131,69,115,59,2,53,32,35,130,7,189,120,161,138,100,235,
-71,159,190,196,224,39,1,242,179,8,2,39,92,57,2,50,38,39,2,39,
-34,32,242,182,2,128,230,224,99,3,100,33,138,126,224,17,3,139,114,233,
-54,3,224,168,1,32,169,96,35,134,65,126,21,226,42,0,97,144,134,187,
-244,5,11,64,146,70,52,253,252,2,33,21,226,190,3,175,54,231,112,6,
-166,169,44,176,104,2,161,162,81,64,230,65,0,205,250,65,186,165,73,176,
-249,143,171,70,23,75,145,131,4,2,90,32,95,2,49,53,48,226,64,2,
-224,163,5,224,160,0,2,67,32,79,245,183,1,67,229,138,12,72,22,71,
-67,225,22,4,96,0,2,79,32,80,2,32,35,55,2,32,64,102,224,79,
-4,2,97,34,32,192,27,32,124,224,27,5,2,98,34,32,192,27,71,245,
-224,28,5,2,102,34,32,224,28,0,32,174,224,28,5,2,110,34,32,224,
-28,0,33,67,224,28,5,109,122,128,28,32,253,224,27,5,2,116,34,32,
-224,56,0,32,252,224,28,5,2,118,34,32,224,56,0,224,143,8,64,3,
-211,122,225,193,2,132,80,69,201,65,76,165,24,100,200,33,124,2,48,32,
-35,97,135,65,45,83,210,2,35,53,55,132,24,196,109,53,56,2,58,49,
-52,202,189,238,152,1,193,189,113,111,100,82,150,14,96,6,150,186,72,19,
-246,129,1,166,134,2,49,52,54,71,249,32,66,144,87,205,201,2,35,52,
-53,128,80,133,231,182,60,64,67,226,230,2,245,186,1,192,64,146,31,226,
-96,8,183,0,235,109,1,192,40,226,52,3,224,10,1,96,50,106,44,235,
-240,1,96,250,129,28,128,74,70,156,224,74,4,32,165,132,76,2,111,114,
-100,65,36,132,78,2,99,104,114,64,12,214,83,244,158,4,32,23,131,79,
-78,118,192,175,67,254,134,43,182,49,225,159,6,111,83,225,159,0,119,156,
-64,43,129,203,2,60,61,32,32,11,204,122,198,68,181,118,65,243,181,112,
-96,106,32,13,183,147,99,203,179,215,238,190,3,32,33,215,133,32,16,32,
-13,177,101,103,153,64,136,32,5,108,57,181,69,103,111,181,61,2,61,61,
-32,32,11,160,194,248,184,1,67,205,81,137,248,72,1,69,212,248,72,3,
-128,15,32,59,215,22,32,39,105,166,85,18,32,22,128,221,248,152,0,82,
-87,96,26,96,43,199,219,194,70,110,179,160,10,231,147,0,199,189,224,32,
-0,236,62,0,228,203,0,244,234,1,97,20,224,65,4,224,64,5,65,218,
-196,212,195,100,181,162,171,189,224,169,2,119,6,96,246,240,223,4,181,99,
-73,193,73,173,32,16,216,159,141,94,32,129,32,19,226,67,0,192,53,242,
-134,1,208,177,116,244,103,16,115,239,208,116,32,14,167,121,181,113,80,75,
-211,165,96,27,170,93,32,75,105,69,85,67,176,65,64,222,216,79,64,74,
-112,24,2,95,53,32,128,78,161,140,128,39,32,55,106,113,33,227,160,31,
-181,139,2,110,101,119,212,21,2,76,101,110,32,114,181,139,224,223,4,181,
-144,75,215,181,77,173,57,109,85,32,20,237,78,1,239,80,9,181,80,216,
-7,160,49,129,32,249,201,5,248,25,1,109,185,160,52,64,13,229,14,0,
-128,2,70,206,65,248,111,213,84,201,32,34,239,212,20,180,237,233,209,3,
-84,167,84,50,79,132,224,27,11,96,120,180,219,96,85,224,188,1,180,226,
-2,114,101,109,33,16,180,222,255,84,5,113,50,254,228,7,192,20,224,17,
-8,224,14,5,224,11,2,225,132,2,192,200,225,76,1,225,55,12,180,255,
-2,79,32,58,100,39,68,17,46,235,42,49,114,183,192,7,2,95,56,57,
-211,51,2,95,57,49,224,10,1,66,148,160,10,118,108,128,10,100,223,84,
-241,32,83,129,136,2,94,112,111,2,107,101,87,133,76,181,10,2,94,112,
-101,2,101,107,87,96,18,180,219,218,189,84,50,32,69,33,38,2,58,57,
-56,225,78,4,130,61,180,82,224,46,0,111,220,128,46,248,223,1,86,167,
-100,136,69,150,2,95,57,52,67,101,180,76,182,120,179,138,2,116,111,80,
-2,116,114,32,2,58,57,51,225,184,10,179,27,175,219,210,222,251,203,0,
-64,118,134,251,101,104,134,230,109,135,106,161,179,78,240,51,7,178,77,201,
-109,2,95,56,56,140,200,128,63,32,7,64,65,2,95,55,50,96,129,178,
-92,230,108,7,178,70,79,107,114,88,72,222,2,58,56,55,96,20,2,113,
-117,111,32,221,177,255,226,101,93,177,29,252,109,4,243,178,0,2,95,56,
-49,228,128,0,252,152,2,244,163,11,243,161,3,2,58,56,52,197,18,80,
-37,2,95,51,57,64,226,129,165,2,94,102,114,2,101,101,32,2,58,56,
-50,227,229,2,224,91,5,85,67,149,129,210,247,253,87,8,65,122,151,168,
-249,142,1,176,132,227,218,1,230,63,1,206,48,71,138,212,32,186,82,244,
-186,8,166,63,230,92,0,224,120,2,32,52,172,95,202,202,80,158,244,178,
-3,137,80,2,58,56,48,253,78,1,254,100,5,241,2,1,177,1,130,180,
-66,225,176,210,76,88,2,83,32,80,96,183,79,179,213,165,44,248,144,155,
-110,173,224,122,10,96,121,176,247,229,106,3,229,24,0,176,209,58,252,32,
-125,193,160,66,251,163,7,246,255,2,226,202,7,208,146,247,198,5,2,117,
-110,100,2,101,102,105,2,110,101,100,74,222,2,58,55,50,229,229,20,176,
-186,2,95,52,50,163,215,71,176,99,55,2,95,52,54,115,125,234,152,9,
-78,47,234,148,2,72,84,64,1,2,95,54,51,224,37,3,234,117,2,64,
-37,96,19,96,10,2,95,54,57,65,18,193,140,199,88,32,114,75,197,128,
-130,64,45,161,65,32,20,32,12,97,123,230,121,1,132,29,96,175,33,112,
-147,26,249,103,1,132,197,64,30,131,56,224,35,1,224,55,11,193,10,177,
-175,83,153,132,1,113,50,224,13,0,105,208,225,105,5,180,68,2,58,32,
-117,2,110,115,117,2,112,112,111,2,114,116,101,2,100,32,119,69,128,2,
-115,105,122,2,101,34,32,64,246,2,51,50,55,96,102,2,35,50,49,2,
-52,55,52,2,56,51,54,75,36,2,58,54,56,162,85,248,25,2,171,183,
-64,117,248,20,2,116,1,148,6,81,182,129,20,65,146,32,196,161,33,129,
-143,2,54,32,35,97,98,66,111,178,35,2,105,110,118,2,32,58,54,130,
-123,2,115,104,114,32,11,130,107,74,124,177,247,230,197,15,177,137,227,43,
-0,165,37,209,112,32,196,151,92,78,242,2,95,53,52,64,4,66,51,80,
-48,117,160,2,95,53,57,236,125,0,65,65,106,180,177,160,251,8,7,87,
-51,89,16,240,136,0,177,189,224,29,1,224,49,1,224,39,4,177,144,227,
-208,10,177,66,2,62,61,32,2,58,53,55,128,10,32,9,129,9,76,5,
-176,205,2,60,32,58,176,201,2,105,99,109,2,112,32,58,175,192,107,193,
-77,212,2,95,53,49,64,102,128,244,75,190,174,20,65,64,173,244,50,109,
-173,240,230,24,93,174,49,233,100,13,174,8,2,110,101,103,32,149,128,237,
-2,42,32,58,173,107,2,45,32,58,173,104,2,43,32,58,173,90,224,156,
-68,2,58,52,50,224,155,7,193,143,173,128,171,9,35,131,77,18,2,95,
-51,55,136,80,66,57,113,251,2,58,52,48,245,100,1,173,151,37,148,173,
-150,64,54,96,42,32,217,2,58,51,55,224,29,0,128,232,64,9,128,232,
-2,94,109,97,2,108,108,111,2,99,32,58,173,119,2,73,79,46,2,112,
-101,114,2,102,111,114,2,109,73,79,32,20,224,249,1,203,92,173,135,50,
-230,237,85,0,224,227,12,2,58,51,48,229,159,1,76,166,36,16,67,205,
-173,95,131,75,136,231,172,227,2,114,97,105,2,115,101,32,2,58,50,55,
-254,246,0,128,172,2,65,46,114,2,101,97,100,32,14,128,177,32,161,63,
-171,2,65,114,103,2,82,101,102,32,20,211,92,32,100,101,15,68,120,99,
-108,64,107,128,190,32,49,2,62,62,32,2,58,50,50,166,1,74,42,128,
-33,44,205,252,147,0,71,36,141,226,95,137,96,9,44,147,128,9,2,58,
-50,49,250,207,3,111,70,174,120,151,246,159,101,224,35,2,96,32,116,140,
-192,32,2,95,56,32,123,205,128,132,2,55,32,58,172,185,224,47,7,108,
-253,96,155,143,143,225,14,0,236,202,0,226,202,6,49,83,160,24,108,31,
-228,171,0,130,87,208,31,129,10,233,246,0,70,38,224,11,2,96,210,205,
-216,224,64,1,142,66,166,246,2,51,32,66,102,223,226,135,0,74,128,129,
-75,75,106,226,180,0,68,214,68,213,65,237,240,46,0,227,137,0,70,206,
-162,24,2,58,54,32,161,158,2,114,101,116,2,117,114,110,36,39,225,175,
-1,36,53,128,201,36,52,227,127,7,227,107,37,2,58,50,32,226,167,19,
-235,38,1,194,143,64,202,93,232,254,26,0,224,0,255,224,0,255,224,0,
-255,224,0,255,224,0,255,224,0,255,224,0,255,224,0,27,1,32,125,
+122,76,90,49,161,115,1,0,26,118,55,46,48,10,49,57,52,55,10,65,
+32,95,48,32,95,50,51,32,64,95,50,48,52,32,64,66,224,15,2,6,
+49,51,32,64,64,66,32,224,18,4,16,50,32,64,64,64,83,39,32,66,
+32,64,66,39,32,67,32,83,64,50,6,83,32,67,39,32,83,39,128,10,
+9,64,95,49,49,49,32,95,50,49,53,64,10,28,53,52,32,95,49,53,
+54,32,64,102,114,111,109,85,84,70,56,32,34,45,45,118,101,114,115,105,
+111,110,34,64,75,15,64,64,67,39,66,32,85,32,95,50,54,32,95,50,
+52,56,64,52,1,51,54,64,52,224,57,9,8,77,105,99,114,111,72,115,
+44,32,160,64,0,32,96,65,128,47,0,50,64,42,224,58,17,16,44,32,
+99,111,109,98,105,110,97,116,111,114,32,102,105,108,101,224,67,6,2,50,
+53,55,128,141,3,64,90,32,75,128,9,2,83,39,32,64,154,2,64,67,
+32,224,209,25,6,110,117,109,101,114,105,99,224,217,6,2,66,32,80,128,
+211,128,157,224,91,2,129,87,65,46,64,101,2,32,64,67,64,107,65,60,
+96,23,0,83,64,48,0,56,64,41,129,87,224,23,4,0,57,224,23,13,
+1,54,48,128,23,2,66,32,66,65,157,65,78,65,204,9,50,54,51,32,
+64,85,32,75,32,65,160,120,0,66,64,56,2,95,55,55,129,209,64,228,
+224,42,0,1,49,57,64,4,1,32,64,64,241,5,50,54,53,32,64,35,
+64,12,128,69,161,155,64,12,225,99,16,6,102,108,97,103,115,32,61,129,
+81,8,64,95,49,50,51,32,95,50,55,96,151,64,154,66,45,0,39,65,
+65,1,56,48,64,195,128,242,0,80,96,9,64,85,0,57,66,91,9,95,
+52,48,52,32,95,52,48,53,32,224,86,1,11,99,111,109,109,97,110,100,
+45,108,105,110,101,64,90,2,35,48,32,96,3,9,64,64,64,75,50,32,
+95,50,48,50,96,61,64,205,192,105,3,95,49,57,50,128,33,64,101,64,
+115,2,57,50,53,160,149,0,57,64,238,2,64,85,32,193,139,65,28,193,
+149,128,45,128,153,3,95,49,57,52,161,33,66,236,3,32,95,51,54,64,
+247,1,57,51,64,166,1,49,54,64,194,64,34,0,52,128,202,0,83,128,
+54,0,32,130,53,65,36,128,32,226,56,0,64,149,1,51,51,67,72,96,
+13,6,79,32,35,52,54,32,64,128,120,2,95,49,53,97,118,2,39,32,
+79,96,171,3,52,53,32,35,64,122,224,29,4,96,0,2,58,49,57,64,
+54,1,10,65,129,76,129,79,64,99,0,53,96,149,3,49,53,32,95,65,
+112,4,95,49,56,51,32,161,35,162,11,64,148,129,231,96,95,130,213,0,
+52,128,46,161,232,5,95,54,32,95,52,50,67,129,6,54,32,95,54,51,
+50,32,96,22,64,12,3,53,52,48,32,192,191,1,49,51,64,242,1,35,
+52,99,47,128,47,128,0,1,73,32,96,158,0,53,160,158,224,1,17,1,
+83,32,66,3,0,55,96,160,2,95,49,51,130,86,1,79,32,225,18,3,
+129,10,64,163,0,51,226,98,4,3,47,108,105,98,98,94,129,26,224,24,
+1,3,111,117,116,46,67,225,196,17,64,84,224,6,21,97,84,224,6,0,
+160,20,97,13,224,6,0,224,27,3,224,106,1,6,100,101,102,97,117,108,
+116,64,105,64,239,0,52,96,239,2,66,32,89,97,251,98,42,0,83,194,
+215,66,10,4,67,32,64,64,80,100,56,97,100,130,31,131,245,228,5,0,
+225,201,3,228,102,19,164,87,224,69,53,0,118,224,69,60,0,113,224,69,
+60,0,114,224,69,60,0,108,224,69,60,1,67,82,224,70,61,0,87,224,
+70,61,224,69,60,0,84,224,69,60,3,88,67,80,80,224,72,60,0,122,
+224,69,60,0,81,224,69,3,195,112,231,11,0,128,68,64,14,64,30,128,
+33,192,25,64,10,192,108,224,10,1,128,136,232,188,3,100,227,0,35,68,
+202,96,0,160,38,128,51,224,172,1,232,29,4,128,50,1,49,48,192,51,
+163,252,64,34,160,49,68,18,165,127,0,51,96,55,166,80,1,50,55,64,
+118,166,80,165,234,232,40,2,224,197,84,192,162,224,197,15,128,49,64,7,
+231,17,8,224,190,10,104,125,165,179,1,95,51,134,211,69,199,224,203,1,
+225,148,109,0,49,199,63,193,148,64,40,97,142,96,55,0,82,224,224,7,
+224,218,0,106,141,96,218,225,146,120,224,195,0,128,49,224,177,27,224,170,
+112,106,235,224,170,24,0,57,224,170,13,224,176,1,192,102,160,168,224,13,
+0,224,171,24,224,41,1,160,57,224,16,0,2,66,32,90,224,16,5,169,
+241,224,192,4,0,54,232,210,0,226,246,18,0,51,104,188,226,246,9,0,
+52,107,184,226,246,8,224,219,127,0,55,235,38,0,224,219,71,226,98,99,
+0,56,204,84,128,48,224,204,6,108,79,192,202,0,49,229,92,2,0,55,
+235,71,0,228,134,107,0,57,206,97,230,26,33,236,107,4,230,26,124,224,
+196,0,128,48,225,121,6,226,70,6,224,189,1,64,43,2,95,49,48,80,
+61,2,95,52,54,196,31,64,0,192,102,128,114,225,18,1,224,190,5,0,
+67,224,190,62,0,55,228,154,20,226,56,4,80,239,226,56,11,227,87,13,
+160,139,207,43,96,233,239,43,19,7,85,110,107,110,111,119,110,32,79,51,
+1,58,32,136,208,204,238,224,53,7,4,79,32,35,49,48,163,114,238,233,
+5,224,0,2,193,229,65,3,97,63,129,243,111,223,0,50,65,136,0,52,
+237,188,0,224,144,12,1,46,99,128,132,224,48,33,0,111,128,48,224,39,
+24,0,97,233,174,0,164,77,175,240,64,234,228,75,4,226,74,19,96,93,
+228,145,9,2,49,56,53,111,128,228,146,5,227,73,11,106,77,161,206,198,
+160,224,39,11,96,85,224,39,26,233,180,3,224,39,19,231,144,1,224,39,
+11,0,39,224,40,1,231,14,1,224,61,1,0,52,229,136,1,160,61,224,
+108,20,224,46,9,224,148,14,224,107,1,224,39,19,1,56,48,224,188,21,
+224,119,1,229,100,3,224,39,19,228,206,2,1,54,50,208,170,240,180,5,
+227,105,1,224,64,0,0,83,224,64,11,65,58,0,55,160,57,3,64,95,
+50,54,104,121,226,72,0,131,220,137,226,79,164,0,51,111,164,6,95,51,
+54,55,32,75,32,81,241,132,36,224,1,17,108,150,224,0,4,224,47,38,
+224,44,35,224,41,32,224,38,29,224,35,26,224,32,23,224,29,20,224,26,
+17,224,23,14,224,20,11,224,17,8,224,14,5,224,11,2,192,8,96,5,
+69,35,82,59,192,113,224,0,4,65,233,0,50,225,233,5,0,90,224,145,
+4,224,1,11,225,233,255,224,29,11,224,26,17,224,23,14,224,20,11,224,
+17,8,224,14,5,224,11,2,192,8,96,5,225,231,17,65,230,0,49,225,
+230,5,224,119,3,171,5,225,198,22,225,248,255,224,29,13,224,26,17,224,
+23,14,225,173,11,65,167,0,48,225,167,15,236,171,6,224,1,15,225,164,
+255,224,29,11,224,26,17,224,23,14,224,20,11,227,102,12,0,58,136,35,
+227,97,15,227,99,1,225,191,255,224,32,15,224,29,20,224,26,17,225,148,
+10,65,146,0,56,225,146,19,225,148,2,225,149,255,224,32,15,224,29,20,
+225,123,9,65,122,0,55,225,122,21,128,1,225,128,1,225,131,214,225,35,
+6,65,32,0,54,225,32,27,192,1,225,40,4,64,0,224,46,21,225,44,
+11,224,130,2,64,126,156,117,224,126,20,224,116,3,224,31,11,224,1,3,
+227,32,214,226,227,7,65,65,156,199,225,192,26,225,188,6,224,40,17,128,
+1,225,74,100,224,216,4,64,213,237,248,6,224,75,19,226,148,7,224,43,
+19,64,1,224,216,56,224,172,3,64,171,236,186,6,224,71,15,224,167,5,
+224,37,15,192,1,226,201,141,226,128,5,64,252,235,208,18,128,1,224,246,
+2,224,28,9,224,1,5,227,189,214,224,32,23,230,193,8,65,95,235,136,
+16,224,1,13,229,161,8,224,85,2,0,58,153,188,224,78,9,96,52,224,
+87,21,225,156,248,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,
+224,14,5,239,87,14,65,212,234,95,10,65,210,224,100,3,224,1,11,225,
+209,255,224,29,11,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,
+224,11,2,241,52,15,65,221,138,194,0,75,119,100,3,48,32,95,50,157,
+140,1,48,54,152,36,1,55,55,160,18,216,194,0,52,91,235,248,194,19,
+3,110,97,109,101,216,186,121,55,121,49,0,55,81,154,184,71,224,83,41,
+6,118,101,114,115,105,111,110,224,86,2,1,50,53,117,243,1,57,49,85,
+244,224,86,47,13,99,111,109,112,105,108,101,114,58,32,109,104,115,45,216,
+183,0,54,97,41,224,81,45,6,100,101,112,101,110,100,115,224,168,2,0,
+52,64,32,118,179,2,53,32,85,122,123,160,63,88,196,160,91,249,216,9,
+90,55,152,184,128,233,96,9,1,49,55,84,198,64,0,0,67,89,5,224,
+158,0,96,151,224,131,1,15,101,120,112,111,115,101,100,45,109,111,100,117,
+108,101,115,58,185,103,153,249,224,211,1,3,64,66,32,85,89,206,122,196,
+96,149,224,79,14,4,111,116,104,101,114,224,77,7,192,60,128,144,2,95,
+50,49,65,30,64,59,193,38,64,8,225,38,16,0,32,161,31,64,36,130,
+32,1,51,56,129,200,160,0,66,152,0,54,98,152,252,203,5,224,190,2,
+161,74,64,38,64,6,1,49,57,64,4,184,1,5,49,52,51,32,95,54,
+64,13,184,2,158,24,225,198,4,224,157,17,15,66,117,105,108,100,105,110,
+103,32,112,97,99,107,97,103,101,160,172,252,149,2,128,145,123,77,227,51,
+0,96,28,98,147,64,134,2,95,51,49,97,26,252,199,3,91,131,155,141,
+156,186,0,66,224,60,0,2,95,52,54,220,180,222,36,2,66,32,66,124,
+220,224,5,4,224,255,3,192,131,225,1,38,225,3,4,128,15,225,8,16,
+3,87,114,105,116,225,7,10,68,84,130,194,227,11,20,2,32,116,111,193,
+230,2,49,56,53,228,126,3,225,1,0,157,217,228,183,0,224,221,2,161,
+223,0,39,96,2,4,32,95,49,55,53,122,116,192,71,221,109,64,73,64,
+253,0,67,93,230,124,37,92,163,67,118,68,239,89,209,5,64,64,64,85,
+32,65,64,6,1,95,50,64,159,64,14,224,21,3,194,20,67,159,1,83,
+39,95,114,164,172,228,92,1,2,95,49,55,81,99,128,44,225,180,9,192,
+168,225,137,37,225,138,38,6,67,111,109,112,114,101,115,69,5,3,32,116,
+105,109,225,139,0,129,71,225,141,0,64,66,1,50,51,64,116,96,83,126,
+140,0,52,187,13,0,64,225,155,3,1,109,115,253,126,1,98,179,227,83,
+3,1,55,52,93,131,2,39,32,95,125,138,1,95,50,64,165,0,51,76,
+135,70,25,131,168,64,50,93,98,96,9,0,53,161,111,131,183,143,115,6,
+66,32,89,32,66,32,80,97,107,225,165,1,94,123,96,166,200,64,128,7,
+64,167,127,27,64,0,138,99,70,58,0,57,69,227,1,51,52,64,89,64,
+88,142,138,0,83,197,68,2,52,53,49,97,243,158,150,2,49,53,48,255,
+124,6,1,64,35,64,198,101,210,72,194,163,48,0,80,227,189,1,98,125,
+255,175,12,64,25,129,89,67,228,66,72,64,144,0,90,64,13,0,90,158,
+167,64,218,192,88,1,95,50,126,109,128,180,162,74,2,95,49,53,127,144,
+64,15,1,53,55,126,166,1,57,53,65,0,96,235,224,163,7,0,73,64,
+9,129,96,224,174,0,160,79,98,33,97,27,226,30,19,195,161,71,124,15,
+32,110,111,116,32,111,102,32,116,104,101,32,102,111,114,109,96,20,0,45,
+199,66,195,145,98,37,0,51,64,135,0,53,163,112,65,98,143,23,195,143,
+232,88,25,192,8,253,82,0,65,139,224,65,0,2,95,49,56,65,216,65,
+196,0,57,228,127,2,1,51,49,64,249,99,40,66,88,64,50,97,134,0,
+55,159,101,1,52,55,131,118,64,77,141,254,66,75,162,233,64,108,128,116,
+69,77,229,45,3,163,189,227,143,0,4,67,32,95,52,54,64,80,225,65,
+0,225,46,2,14,107,103,80,97,116,104,32,105,115,32,101,109,112,116,121,
+228,216,0,130,144,129,224,96,6,0,79,66,33,0,79,199,140,227,34,0,
+128,140,96,110,134,160,231,90,5,228,19,20,64,19,0,53,71,32,190,234,
+254,159,4,228,17,33,6,73,110,115,116,97,108,108,229,159,10,64,124,168,
+98,229,156,17,1,105,110,192,46,96,105,230,77,0,234,2,5,196,96,70,
+182,224,13,1,229,191,0,224,245,4,69,48,0,55,66,220,191,233,64,86,
+225,7,0,128,50,225,34,10,64,53,137,85,230,84,0,233,15,11,0,55,
+225,130,2,160,134,161,246,64,86,232,126,0,225,160,2,161,192,135,164,232,
+54,26,161,150,0,35,131,133,232,42,30,4,99,114,101,97,116,232,32,2,
+224,109,6,105,247,225,20,1,4,95,49,56,50,49,64,231,2,51,51,48,
+228,0,1,167,25,66,175,100,50,225,193,4,234,29,13,225,13,0,229,251,
+0,67,86,68,133,165,159,2,95,52,56,194,85,169,225,99,97,226,19,11,
+224,79,3,2,95,52,55,128,141,103,75,224,87,0,235,193,2,234,173,22,
+224,143,3,235,162,4,67,221,233,225,1,0,90,135,130,69,58,1,48,50,
+97,35,96,248,67,241,144,144,71,163,0,90,96,1,160,40,0,58,128,71,
+1,10,65,197,253,194,167,65,183,0,57,67,78,1,50,56,231,141,1,224,
+30,10,0,52,201,143,224,30,4,1,95,52,101,241,226,157,8,1,95,50,
+71,241,2,95,50,57,133,216,64,125,143,5,168,104,96,232,224,99,0,66,
+129,97,89,64,189,65,103,0,57,68,225,2,35,53,48,96,241,0,75,65,
+254,168,50,0,55,232,71,0,235,50,2,162,34,136,99,98,118,102,68,1,
+49,54,96,235,225,181,25,2,64,64,64,71,107,132,255,228,173,1,132,149,
+197,48,128,13,0,64,230,236,4,129,235,129,18,226,115,2,228,240,3,131,
+73,167,157,0,85,64,124,162,87,224,9,1,65,28,142,68,71,20,160,23,
+64,191,1,53,32,96,27,0,54,229,195,1,160,136,0,66,64,135,135,239,
+64,17,224,54,2,224,141,0,160,87,136,75,6,94,109,107,100,105,114,32,
+64,16,136,3,227,128,1,4,85,115,97,103,101,109,191,2,32,91,45,198,
+228,0,93,64,11,6,110,117,109,101,114,105,99,224,19,3,0,118,64,4,
+0,113,64,4,0,108,64,4,0,114,64,4,5,67,91,82,124,87,93,64,
+9,3,88,67,80,80,64,7,3,68,100,101,102,64,7,4,73,80,65,84,
+72,64,8,0,84,64,4,0,122,64,4,0,105,192,18,4,111,70,73,76,
+69,64,8,1,97,91,96,18,64,10,0,76,192,28,3,80,80,75,71,64,
+7,9,81,32,80,75,71,32,91,68,73,82,96,31,5,116,84,65,82,71,
+69,64,76,0,77,109,75,8,78,97,109,101,46,46,46,93,34,129,38,135,
+122,162,137,236,84,0,229,151,10,66,206,235,66,1,224,42,1,99,163,0,
+55,64,44,0,85,232,168,4,228,255,5,3,95,49,55,54,71,139,134,92,
+162,151,67,39,135,194,129,243,96,64,96,6,231,250,0,236,170,9,229,132,
+3,162,104,230,45,1,198,48,224,17,4,224,20,0,237,64,3,173,218,172,
+224,96,81,160,116,231,80,38,235,88,45,16,116,111,112,32,108,101,118,101,
+108,32,100,101,102,110,115,58,32,96,0,236,233,1,228,208,2,5,49,55,
+52,52,32,35,204,246,235,102,1,172,80,229,28,11,231,112,2,8,40,117,
+110,112,114,117,110,101,100,160,92,224,89,4,224,76,1,1,95,55,64,96,
+67,222,0,49,230,242,4,225,52,18,238,27,9,230,228,30,228,131,1,147,
+213,225,53,3,160,66,132,124,240,169,15,224,222,2,0,61,192,214,73,245,
+67,166,224,187,5,226,3,2,99,221,160,203,173,223,75,104,64,54,130,89,
+194,114,226,184,4,101,100,86,174,97,32,229,81,9,224,54,1,239,86,15,
+160,111,232,57,5,226,98,91,9,102,105,110,97,108,32,112,97,115,115,130,
+92,226,98,4,163,197,97,103,160,71,226,102,0,160,15,237,208,17,224,100,
+2,237,208,4,235,22,4,228,45,3,227,164,1,225,3,1,99,146,161,113,
+2,32,95,52,232,154,0,224,203,12,4,46,99,111,109,98,241,15,5,102,
+90,224,67,37,233,47,2,225,177,7,1,53,51,229,221,2,3,109,104,115,
+99,224,45,10,68,151,128,13,225,179,0,233,228,6,64,8,237,68,1,128,
+1,225,238,4,231,218,0,224,130,10,194,52,192,25,224,27,2,2,50,49,
+49,224,158,2,4,77,72,83,67,67,225,118,1,131,50,226,233,1,96,24,
+240,235,2,224,20,1,224,90,2,229,224,8,65,241,0,56,72,16,114,70,
+1,49,56,72,83,175,100,2,49,56,50,225,29,3,7,47,105,110,99,108,
+117,100,101,225,248,2,224,89,3,226,207,1,224,90,42,3,99,98,105,116,
+226,81,3,227,178,7,161,115,229,188,5,230,139,1,2,95,49,56,202,215,
+224,146,3,128,1,129,190,224,25,9,250,92,0,228,232,2,230,15,2,208,
+58,224,8,23,227,234,2,235,250,38,244,37,10,227,215,19,5,69,120,101,
+99,117,116,246,236,0,239,83,11,227,21,1,247,93,3,1,49,56,168,236,
+225,164,1,97,167,226,157,1,0,52,114,48,226,228,0,228,170,6,172,244,
+224,199,10,140,88,0,56,118,50,64,7,224,209,5,105,114,224,207,17,13,
+99,111,109,109,97,110,100,32,102,97,105,108,101,100,192,214,192,133,227,31,
+7,229,46,80,1,67,32,151,151,1,97,116,82,236,229,46,91,192,0,129,
+108,225,144,0,226,233,1,171,222,1,56,53,97,224,228,215,15,2,36,73,
+78,224,84,5,224,77,12,224,70,25,2,79,85,84,224,71,3,228,82,3,
+128,253,1,51,56,207,98,130,92,128,103,161,20,227,86,4,231,176,18,14,
+45,119,32,45,87,97,108,108,32,45,79,51,32,45,73,225,236,3,227,233,
+3,224,85,0,224,84,27,7,47,115,114,99,47,114,117,110,244,161,3,225,
+87,6,160,80,162,16,121,29,196,130,224,85,15,224,156,3,224,135,1,224,
+47,7,1,79,32,115,65,232,118,0,224,114,0,192,193,224,188,35,4,47,
+101,118,97,108,186,17,160,191,224,71,4,224,69,17,1,46,99,192,248,164,
+110,192,238,96,234,65,252,102,119,233,253,3,160,25,116,31,128,20,224,159,
+13,0,42,231,10,1,225,199,2,10,36,73,78,32,45,108,109,32,45,111,
+32,226,57,7,224,0,4,64,122,99,184,161,122,97,115,0,51,87,86,128,
+27,241,181,0,131,55,240,139,1,224,11,0,247,126,0,245,64,1,193,20,
+2,95,49,56,115,181,2,95,49,57,142,244,128,113,0,57,83,252,247,129,
+2,2,49,57,49,100,215,117,61,5,67,32,95,55,53,49,72,45,96,65,
+86,65,227,159,2,2,97,105,110,224,202,2,77,32,148,89,91,67,64,2,
+142,209,108,181,225,144,1,0,50,128,159,224,153,2,228,14,4,226,52,12,
+64,162,130,52,86,172,75,203,152,23,225,98,2,0,125,192,137,64,29,0,
+85,240,148,1,234,215,3,0,89,64,18,224,13,0,243,44,2,179,47,96,
+49,224,17,4,232,12,0,232,34,7,224,48,2,224,51,10,224,57,3,233,
+129,3,224,29,17,224,65,3,143,90,227,205,3,254,79,1,224,45,5,128,
+41,224,37,8,233,113,3,245,113,4,64,53,1,95,55,108,40,142,55,0,
+67,111,214,1,49,53,133,126,4,95,49,56,51,32,134,16,1,95,51,194,
+5,172,42,65,86,1,75,52,161,119,224,158,6,70,118,1,55,54,81,140,
+0,55,197,197,224,29,2,168,74,224,231,6,225,2,2,192,40,232,82,4,
+111,70,184,28,224,34,4,224,62,0,103,108,96,118,224,33,3,1,95,55,
+147,74,160,16,96,99,132,102,65,6,74,248,1,54,57,64,168,0,48,236,
+147,0,128,42,128,143,96,7,81,131,232,151,1,160,97,232,152,2,141,146,
+160,23,2,95,55,51,131,132,160,126,225,10,8,128,23,97,4,192,163,224,
+167,4,192,158,233,74,7,192,186,193,21,195,141,167,41,182,145,102,84,96,
+210,164,50,128,216,197,186,121,241,227,82,12,80,161,131,34,227,126,4,160,
+0,226,65,0,0,67,97,249,0,50,243,232,5,100,113,240,139,1,64,97,
+0,82,99,198,193,140,179,78,161,8,224,88,1,193,9,225,4,0,64,149,
+229,165,15,1,65,32,228,92,1,224,143,1,154,241,226,151,1,161,63,96,
+21,229,201,2,224,240,9,69,69,128,191,228,120,12,228,74,2,4,64,92,
+49,48,38,192,123,0,67,96,89,96,47,2,79,32,35,92,28,239,52,3,
+163,179,142,251,160,9,131,85,237,224,3,2,95,55,48,65,178,90,65,213,
+86,96,4,64,30,129,96,67,90,192,87,0,80,161,108,225,112,3,132,244,
+192,13,65,66,0,85,64,50,224,32,0,3,85,32,75,51,224,48,4,245,
+156,1,225,181,3,224,88,9,230,39,0,202,33,104,183,123,178,166,248,1,
+51,52,229,254,1,5,51,55,32,95,52,52,98,215,231,95,19,1,78,111,
+81,168,2,105,110,105,106,29,2,102,111,117,74,176,1,111,114,235,132,0,
+144,170,96,9,131,225,70,58,218,70,134,248,0,55,139,6,0,55,90,147,
+64,29,150,114,0,75,110,187,0,67,164,0,128,166,190,76,0,50,77,40,
+96,175,1,50,32,117,106,252,214,6,195,214,130,124,197,61,133,29,225,18,
+3,97,164,97,195,252,238,1,128,19,131,85,224,102,32,162,16,164,230,224,
+116,0,96,184,147,190,225,137,6,224,115,4,96,114,192,119,195,206,0,54,
+103,191,247,247,3,72,32,225,137,19,0,35,174,126,3,32,92,51,52,162,
+210,232,191,10,2,79,32,35,74,233,192,137,64,80,119,242,224,80,10,7,
+109,104,115,102,102,105,46,104,128,75,96,122,1,52,53,76,82,72,182,225,
+118,24,174,63,225,26,5,224,13,0,100,81,192,36,224,46,2,224,10,6,
+164,122,225,162,5,129,44,129,48,225,54,0,225,41,0,207,63,112,79,161,
+47,0,79,224,224,13,31,115,116,97,116,105,99,32,115,116,114,117,99,116,
+32,102,102,105,95,101,110,116,114,121,32,116,97,98,108,101,91,93,32,2,
+61,32,123,96,251,97,44,228,73,2,64,96,65,132,0,56,120,201,169,179,
+0,79,233,45,2,4,123,32,48,44,48,136,166,224,22,3,1,125,59,224,
+17,7,224,122,8,1,42,120,64,11,96,128,1,32,61,128,136,96,52,227,
+215,1,185,164,224,67,1,23,85,110,105,109,112,108,101,109,101,110,116,101,
+100,32,70,70,73,32,102,101,97,116,117,114,176,135,234,94,0,100,151,2,
+95,54,56,66,92,65,79,1,50,50,112,121,65,204,64,29,152,37,1,56,
+57,176,38,225,223,1,65,124,226,228,1,230,181,3,233,99,1,146,189,97,
+253,168,129,193,242,163,12,167,103,121,168,64,5,185,182,64,95,163,22,227,
+29,1,128,92,242,86,3,227,196,1,64,56,4,61,61,32,64,35,202,213,
+224,42,2,198,52,97,169,248,206,1,64,144,64,224,230,154,1,130,52,1,
+67,39,89,87,0,83,100,100,2,83,32,73,128,140,72,243,229,182,2,225,
+118,0,0,58,139,72,152,17,128,198,160,245,169,108,160,23,96,9,160,246,
+0,83,224,248,4,153,233,97,111,226,140,12,5,100,121,110,97,109,105,204,
+81,64,85,89,222,0,57,96,199,225,27,5,224,87,37,6,119,114,97,112,
+112,101,114,224,87,8,69,150,224,87,1,225,95,1,224,79,23,131,52,236,
+11,2,97,77,2,95,53,55,103,160,191,125,193,248,244,136,1,234,238,1,
+76,192,244,144,22,164,114,163,249,130,124,101,1,0,48,96,50,201,77,97,
+247,123,223,160,23,170,144,224,132,12,235,147,1,192,146,203,51,225,66,14,
+69,41,232,71,0,224,64,0,194,253,224,93,0,128,66,245,112,3,225,74,
+6,155,220,244,254,0,227,70,7,102,225,225,129,4,0,66,72,38,64,212,
+145,215,251,253,1,226,6,5,225,178,33,3,118,97,108,117,244,149,1,224,
+104,10,103,152,131,15,142,253,226,22,0,224,140,6,224,17,4,164,41,192,
+139,226,252,1,104,235,133,227,226,97,3,64,40,232,106,23,232,107,20,1,
+98,97,104,91,11,101,105,103,110,32,105,109,112,111,114,116,32,168,101,243,
+234,11,67,178,158,36,110,66,64,14,157,22,105,92,64,14,0,54,96,14,
+96,162,64,14,156,220,129,196,212,253,224,13,11,231,228,1,0,32,73,193,
+192,107,157,10,224,107,0,0,51,224,107,5,143,45,229,251,3,5,71,69,
+84,82,65,87,230,17,7,10,71,69,84,84,73,77,69,77,73,76,76,113,
+102,224,27,3,2,97,99,111,115,38,224,19,4,2,100,100,95,92,252,224,
+23,11,3,117,116,102,56,224,23,8,0,115,143,200,224,19,4,1,116,97,
+224,19,12,0,50,224,20,7,4,99,97,108,108,111,99,251,224,21,4,3,
+108,111,115,101,120,132,224,21,4,224,171,9,2,101,120,112,224,18,7,4,
+102,108,117,115,104,224,59,8,3,102,111,112,101,224,145,8,2,102,114,101,
+98,196,224,19,3,2,103,101,116,224,60,8,5,103,101,116,101,110,118,224,
+21,7,7,105,115,119,105,110,100,111,119,224,148,8,2,108,111,103,224,18,
+7,0,109,224,230,12,7,109,100,53,65,114,114,97,121,224,23,10,0,66,
+225,129,11,7,109,100,53,83,116,114,105,110,224,94,9,3,101,109,99,112,
+224,70,9,4,101,109,109,111,118,224,225,8,1,112,117,224,225,9,225,194,
+10,3,115,113,114,116,224,19,8,4,121,115,116,101,109,224,21,7,225,235,
+10,5,116,109,112,110,97,109,224,122,8,1,117,110,225,94,11,5,117,110,
+108,105,110,107,224,166,8,4,101,101,107,80,116,102,101,224,22,4,2,111,
+107,101,224,22,14,3,87,111,114,100,224,69,11,224,23,11,66,204,4,108,
+122,55,55,95,86,137,4,114,101,115,115,111,224,82,8,224,34,0,1,100,
+101,224,36,21,2,114,108,101,224,70,22,64,33,224,69,23,2,98,119,116,
+224,69,22,64,33,224,69,19,64,235,4,95,117,105,110,116,227,162,8,65,
+29,224,25,14,192,51,1,49,54,224,52,16,224,26,10,192,53,0,51,227,
+208,8,224,53,0,224,26,10,192,53,1,54,52,224,53,16,224,26,10,64,
+53,224,212,16,224,211,16,224,210,17,224,209,17,224,208,17,224,207,17,224,
+206,17,224,205,17,3,117,115,104,111,227,92,9,129,3,224,26,13,64,53,
+224,52,17,224,51,17,65,82,225,107,16,224,207,15,224,205,15,224,97,13,
+1,108,111,228,143,9,128,98,224,25,12,64,51,224,50,16,224,49,16,1,
+117,108,224,102,18,224,103,17,224,104,17,224,51,16,1,102,108,224,255,13,
+224,23,10,5,115,105,122,101,111,102,225,25,11,160,25,224,100,11,192,26,
+224,27,11,70,163,1,100,105,227,215,8,103,13,224,23,10,3,114,101,97,
+100,224,46,11,2,95,100,95,229,124,11,1,99,104,224,44,10,1,109,107,
+224,20,10,4,103,101,116,99,119,229,50,8,6,103,101,116,95,98,117,102,
+224,180,11,3,98,95,114,100,224,27,17,1,119,114,192,27,234,249,0,224,
+0,74,73,18,146,5,111,73,79,81,1,50,54,114,7,143,88,3,54,32,
+95,57,92,191,234,217,1,238,156,1,3,95,57,50,53,160,30,0,54,73,
+246,1,56,57,152,234,206,187,64,91,146,67,2,95,52,56,235,23,0,2,
+56,57,56,141,182,224,5,5,160,24,2,95,49,49,153,55,107,167,160,6,
+224,45,25,224,52,3,224,45,18,224,84,3,160,52,224,45,25,224,98,4,
+0,53,65,11,160,232,0,54,126,83,96,11,0,58,128,7,7,10,65,32,
+115,99,109,112,32,64,14,138,242,89,21,81,60,0,90,175,16,140,174,117,
+185,1,56,56,64,57,141,181,147,122,96,5,96,75,139,32,111,217,74,224,
+88,48,159,26,237,192,3,192,11,175,100,141,154,64,10,84,136,65,128,172,
+35,184,63,123,81,141,177,64,98,139,116,224,155,9,79,217,77,9,236,0,
+19,0,123,114,219,178,220,0,83,246,1,16,224,48,1,64,46,10,44,32,
+109,104,115,95,97,100,100,114,95,128,56,211,21,224,38,1,1,125,44,128,
+25,128,174,224,129,25,224,128,43,224,123,25,193,154,225,2,26,224,128,77,
+226,16,4,65,171,141,17,155,226,145,123,129,161,0,90,117,77,225,189,1,
+246,89,0,206,4,148,247,96,8,150,113,2,49,56,56,122,116,224,166,15,
+225,158,2,112,214,64,166,4,56,56,53,32,64,154,162,98,114,128,184,114,
+58,96,29,100,41,0,56,66,89,224,17,5,130,148,238,106,17,1,56,49,
+97,101,224,124,1,206,83,16,38,32,109,117,115,116,32,98,101,32,80,116,
+114,47,70,117,110,170,186,77,229,224,181,12,2,40,72,115,128,37,0,41,
+193,66,224,40,4,131,13,96,5,224,249,7,0,79,240,92,6,97,252,144,
+34,210,82,225,51,0,162,21,97,1,97,19,160,43,129,26,163,127,0,56,
+87,61,97,145,79,218,243,126,0,129,128,129,169,129,69,83,38,160,90,97,
+56,242,74,0,113,8,1,56,57,98,0,128,103,181,119,97,58,226,99,19,
+0,59,98,95,64,15,8,95,85,110,105,116,40,115,44,32,162,108,249,125,
+11,4,79,32,35,52,49,224,250,2,128,191,226,199,13,64,43,254,15,0,
+224,77,0,80,70,94,169,224,139,11,224,122,0,3,32,95,54,48,133,52,
+80,16,6,95,54,49,48,32,95,54,90,69,161,54,224,134,6,1,95,55,
+133,110,193,133,229,28,5,67,12,143,223,228,30,21,65,7,1,116,111,194,
+200,193,199,129,1,1,56,56,246,145,2,226,78,13,225,56,35,64,146,144,
+99,67,159,133,63,117,25,117,230,134,68,0,85,97,191,71,66,0,51,88,
+195,97,223,229,137,1,144,146,255,232,6,11,80,114,105,109,105,116,105,118,
+101,115,46,40,98,213,64,41,135,169,99,101,0,55,64,178,230,23,1,128,
+123,5,66,32,95,57,55,51,64,173,102,17,162,141,128,59,167,137,3,54,
+32,95,51,81,154,2,95,53,52,132,92,66,212,192,84,227,186,0,71,192,
+183,220,64,34,134,203,224,161,17,1,73,79,160,161,64,56,97,156,0,85,
+130,229,225,14,2,150,215,148,26,192,31,243,197,0,225,56,10,253,202,2,
+0,85,166,221,100,215,199,164,225,77,3,128,43,244,144,1,128,139,0,54,
+226,40,0,226,42,23,99,50,196,58,96,105,67,174,226,48,5,230,144,22,
+226,51,1,226,110,6,253,232,2,224,63,19,227,47,2,96,56,227,157,7,
+64,208,134,6,69,148,155,70,101,229,164,56,2,67,32,60,161,100,134,18,
+247,163,3,168,57,97,115,0,90,64,4,0,85,166,55,224,36,3,225,152,
+1,129,97,197,253,226,181,4,101,229,201,45,224,30,10,104,192,224,212,1,
+229,186,3,226,56,2,192,18,128,0,224,115,2,102,215,3,95,57,49,52,
+234,107,0,130,171,2,49,56,56,116,77,186,101,253,42,19,166,84,225,106,
+19,17,78,111,116,32,97,32,118,97,108,105,100,32,67,32,116,121,112,101,
+253,37,0,1,49,49,132,118,65,109,132,103,96,70,0,79,137,129,224,74,
+9,227,3,2,4,70,108,111,97,116,116,70,245,252,13,224,31,2,0,64,
+224,79,27,0,73,141,32,224,76,13,192,28,224,73,28,209,201,224,74,13,
+224,29,0,224,75,17,3,68,97,116,97,96,69,96,4,112,57,224,75,17,
+128,30,224,152,28,132,216,224,74,13,70,192,224,73,22,0,83,115,87,8,
+46,73,79,46,72,97,110,100,108,151,89,224,115,13,194,113,227,78,0,108,
+234,156,255,226,40,17,0,70,136,143,8,46,67,46,84,121,112,101,115,46,
+128,67,66,132,237,174,3,3,67,67,104,97,238,12,8,1,67,83,224,21,
+12,0,85,224,43,13,240,137,11,1,67,85,224,22,13,161,250,224,42,5,
+224,20,11,0,76,239,43,10,1,67,85,224,21,12,5,80,116,114,100,105,
+102,238,136,8,3,67,83,105,122,239,16,8,1,67,83,224,21,12,0,76,
+224,110,14,224,22,12,1,84,105,143,104,238,217,10,67,121,135,78,230,110,
+17,228,86,1,64,45,231,62,23,224,42,2,135,63,229,200,21,3,118,111,
+105,100,235,167,2,233,22,20,224,53,1,8,40,105,110,116,32,115,41,32,
+123,229,198,6,224,33,1,0,59,158,135,160,226,135,141,100,239,169,240,94,
+189,3,95,49,56,54,69,97,106,72,64,9,64,8,5,48,50,32,35,49,
+50,165,97,0,55,196,158,0,55,135,182,64,18,103,178,1,55,55,103,170,
+64,31,3,10,65,32,94,245,169,10,78,149,64,37,193,1,4,50,54,32,
+95,50,153,237,96,15,3,48,32,95,50,133,108,112,0,96,248,69,105,160,
+23,198,215,64,18,0,55,94,177,160,19,69,170,64,73,64,14,64,13,70,
+244,1,50,55,65,33,1,56,54,105,241,1,49,52,158,35,224,58,6,64,
+31,137,136,223,25,2,56,54,55,96,201,75,108,0,50,190,38,167,189,224,
+31,4,0,49,103,254,2,53,32,95,96,41,3,49,56,51,32,170,74,224,
+163,3,224,166,5,97,58,64,213,235,212,0,192,213,2,95,57,50,192,116,
+235,243,3,224,30,7,136,88,188,84,225,19,2,130,75,0,56,125,116,122,
+130,224,65,0,224,232,1,134,187,224,22,8,2,49,56,55,145,78,81,89,
+128,165,224,0,1,65,171,0,54,129,202,153,214,97,189,206,7,64,59,0,
+51,129,239,134,165,83,132,1,67,65,152,230,2,76,101,110,96,44,131,69,
+0,94,178,128,96,18,163,42,5,56,53,32,75,32,95,105,228,192,7,1,
+95,56,107,163,96,231,1,95,57,75,211,192,11,130,93,128,11,0,56,224,
+11,0,65,4,0,52,98,159,80,247,1,95,51,65,226,2,66,32,95,77,
+20,171,185,201,5,82,2,128,31,0,95,103,166,64,135,178,113,224,135,18,
+106,3,160,135,128,11,128,135,128,11,128,135,64,11,224,135,1,2,49,56,
+54,67,65,224,137,3,96,11,224,136,0,1,56,54,224,169,0,128,5,64,
+137,131,135,0,94,84,172,1,80,116,99,34,64,37,96,18,153,73,96,18,
+131,84,175,68,106,26,72,126,64,82,125,177,227,22,9,143,130,0,95,147,
+8,64,65,195,119,64,51,0,53,126,43,98,198,204,212,64,71,68,15,128,
+170,95,68,99,152,110,22,64,14,253,181,0,0,50,65,96,98,62,126,7,
+64,58,130,20,0,94,155,193,96,174,130,19,0,94,90,178,96,15,162,9,
+244,87,3,96,23,130,14,163,94,0,54,68,81,196,227,0,79,228,229,13,
+30,115,116,97,116,105,99,32,117,110,115,105,103,110,101,100,32,99,104,97,
+114,32,100,97,116,97,91,93,32,61,32,123,100,223,101,211,114,149,197,51,
+84,84,2,49,56,53,180,28,4,54,48,32,35,50,164,117,230,20,3,1,
+125,59,96,62,224,20,5,224,105,5,10,42,99,111,109,98,101,120,112,114,
+32,61,96,117,128,49,159,47,229,156,19,69,155,192,58,5,108,101,110,32,
+61,32,165,164,224,165,3,235,167,1,142,130,2,79,32,35,64,178,240,59,
+2,161,111,198,68,179,155,0,83,99,143,179,88,64,16,94,162,224,7,1,
+229,52,1,243,154,3,243,153,5,2,95,54,51,163,255,64,95,205,168,1,
+55,56,241,108,1,224,160,6,133,82,76,34,0,52,160,161,0,58,129,96,
+100,29,1,75,52,160,2,0,90,160,1,231,102,1,64,38,212,152,224,32,
+2,224,1,7,231,151,7,64,54,130,193,3,95,52,55,51,66,59,65,96,
+128,69,0,50,224,69,16,224,73,11,128,75,196,199,1,75,51,224,169,6,
+224,48,4,64,41,239,236,1,97,112,129,89,225,118,8,140,146,76,206,161,
+108,81,114,224,19,4,177,121,192,63,128,11,3,95,49,50,49,172,208,167,
+104,64,74,113,151,100,170,128,130,200,141,0,57,110,161,71,173,74,143,86,
+14,0,75,64,40,134,167,64,65,64,144,214,51,3,49,32,95,53,128,78,
+2,95,49,54,102,66,96,14,64,79,131,117,230,69,3,72,44,67,18,2,
+95,49,56,97,223,198,240,230,24,0,79,156,205,108,96,71,175,35,0,56,
+98,7,64,92,207,230,65,16,3,10,65,32,75,97,163,130,73,0,90,77,
+95,0,58,128,43,68,6,158,142,64,32,64,108,132,215,230,211,4,64,87,
+0,51,129,54,232,20,0,65,40,233,192,2,0,67,168,202,129,77,224,37,
+14,6,77,72,83,67,79,78,70,160,42,129,142,96,2,64,16,129,164,128,
+122,180,166,146,251,224,8,3,64,137,69,12,2,49,56,52,100,238,239,155,
+0,101,131,229,110,0,67,93,174,15,0,50,88,141,0,50,198,161,2,49,
+52,51,82,108,65,35,0,50,69,21,206,228,168,251,161,107,0,52,66,204,
+228,119,5,12,67,111,117,108,100,32,110,111,116,32,102,105,110,141,30,132,
+102,160,138,224,43,3,4,105,110,32,102,105,140,125,226,237,3,161,26,231,
+221,2,192,188,96,214,0,54,224,65,2,4,100,101,102,97,117,155,41,2,
+64,95,51,113,130,228,197,10,1,99,99,225,73,0,0,32,96,37,224,103,
+3,145,36,225,32,4,64,105,230,149,5,198,68,225,42,33,225,43,8,237,
+43,18,9,117,110,100,32,116,97,114,103,101,116,239,78,1,100,179,0,51,
+103,198,2,52,48,32,67,55,96,12,67,83,77,119,224,11,0,224,0,2,
+192,207,225,59,5,225,61,2,150,219,235,55,0,0,52,149,21,160,168,225,
+61,27,99,236,82,43,64,5,99,64,240,113,1,224,59,22,233,224,3,104,
+2,161,135,224,83,42,1,111,110,109,111,224,0,0,225,90,17,4,117,110,
+105,120,45,130,28,230,4,1,0,95,72,82,96,0,67,200,235,214,1,67,
+92,0,80,131,239,0,54,230,15,7,1,75,52,198,113,64,30,133,132,250,
+99,4,211,157,211,154,227,179,1,186,114,101,29,147,134,164,142,145,167,160,
+53,132,182,139,44,3,95,49,56,50,160,162,64,109,133,200,231,13,1,235,
+96,0,2,49,56,50,136,224,196,26,128,126,1,95,50,200,36,224,45,4,
+0,52,97,238,184,244,96,44,132,72,66,8,235,223,4,226,245,0,226,193,
+4,225,100,17,2,67,97,110,67,238,4,112,97,114,115,101,162,190,224,255,
+0,227,66,53,224,122,0,162,205,230,181,1,187,190,227,160,93,2,82,101,
+97,195,159,0,115,100,176,9,46,32,80,111,115,115,105,98,108,101,192,22,
+195,183,232,109,0,99,160,227,165,3,0,89,98,40,68,230,245,189,3,168,
+233,231,66,1,160,0,227,192,5,225,0,9,239,36,9,0,47,160,137,0,
+46,227,30,0,66,59,135,129,180,34,129,145,98,104,1,52,56,100,89,167,
+130,64,181,0,53,67,9,116,152,1,52,48,90,180,64,103,212,254,96,51,
+1,52,49,129,139,0,56,140,27,71,86,0,83,164,79,82,10,1,52,49,
+66,178,200,133,224,51,4,225,91,19,9,65,109,98,105,103,117,111,117,115,
+58,225,64,0,107,78,170,251,229,5,3,200,176,128,217,173,144,2,49,50,
+52,133,193,230,34,1,0,50,67,223,65,32,225,246,0,1,35,49,193,241,
+64,94,64,81,240,240,3,0,84,97,56,231,150,2,192,34,2,79,32,35,
+85,158,166,154,162,97,150,153,96,33,225,221,0,0,35,137,11,224,57,14,
+224,46,3,229,203,24,160,74,96,0,2,95,49,50,111,182,96,249,2,95,
+49,51,127,52,96,12,65,0,136,174,0,83,139,32,68,8,0,90,216,60,
+163,9,64,59,127,122,246,215,1,192,193,131,22,67,44,139,85,199,221,224,
+193,4,235,33,0,224,46,4,69,6,240,52,1,98,239,0,55,139,101,64,
+219,64,105,0,80,192,85,235,165,0,130,1,169,166,64,59,64,191,137,98,
+64,41,128,119,101,251,221,109,0,79,98,174,235,193,0,0,52,75,229,66,
+181,69,49,225,185,1,3,58,92,49,48,190,72,129,157,236,205,22,2,32,
+32,102,71,107,227,172,2,0,50,77,201,162,107,0,53,177,109,168,175,224,
+72,21,6,101,120,112,101,99,116,101,224,75,3,105,12,4,95,49,51,52,
+53,229,219,1,236,253,2,67,54,98,177,1,53,53,66,212,0,53,68,137,
+224,12,6,1,56,50,109,239,175,33,185,66,216,33,224,7,0,146,174,67,
+186,64,78,66,20,0,53,78,167,3,95,49,53,56,107,46,64,62,186,213,
+248,199,1,138,245,1,50,53,64,33,1,55,50,112,41,96,39,224,211,1,
+1,101,111,167,85,65,146,2,95,50,49,80,41,128,151,147,57,160,197,172,
+204,0,49,224,182,3,96,212,0,55,128,193,96,6,224,213,5,0,51,114,
+118,128,192,96,8,0,53,128,193,0,54,160,74,1,54,48,96,183,0,51,
+160,45,155,92,64,36,224,104,16,118,123,0,56,66,81,2,64,95,51,69,
+235,225,65,1,2,56,32,35,133,234,1,49,56,110,26,64,74,216,143,1,
+53,55,225,95,0,224,247,1,3,118,97,108,117,106,130,225,50,7,96,68,
+103,215,97,17,251,34,0,64,81,172,217,99,216,0,49,96,85,0,53,146,
+238,97,84,65,1,0,55,99,173,224,106,5,4,92,57,50,38,110,224,106,
+10,167,95,64,6,128,106,163,182,128,107,196,233,225,84,3,224,244,9,125,
+21,225,20,0,160,19,193,0,178,53,3,49,56,50,57,76,189,64,35,225,
+16,17,2,107,101,121,224,163,10,128,86,193,14,98,70,225,15,1,0,50,
+130,219,100,138,224,249,2,198,6,163,90,67,192,0,51,134,95,0,75,128,
+81,231,137,0,252,244,9,147,224,134,160,96,31,0,90,169,54,0,49,65,
+206,224,120,0,131,5,0,80,64,213,66,122,160,213,2,49,32,80,101,102,
+0,52,83,7,1,52,48,122,227,135,58,84,105,0,95,65,94,64,48,130,
+128,105,8,100,117,226,108,2,226,214,5,167,156,230,99,1,97,244,64,83,
+94,130,140,86,225,145,1,160,154,130,192,238,173,6,0,50,91,28,1,95,
+50,100,200,111,12,199,216,96,233,233,49,4,1,95,50,95,176,224,34,2,
+162,21,64,91,207,220,242,45,4,2,56,50,49,71,191,0,51,102,40,97,
+37,0,35,71,212,225,134,0,0,54,96,19,224,39,18,198,3,228,247,16,
+82,58,0,47,167,41,229,159,3,224,93,1,224,135,15,163,22,2,56,50,
+50,224,122,16,96,216,131,88,134,135,0,52,65,221,96,103,69,9,1,54,
+49,69,170,128,19,64,41,240,12,1,0,50,73,233,235,5,1,74,27,192,
+15,239,13,0,148,188,0,52,165,68,191,227,98,17,128,6,64,81,131,37,
+169,35,69,45,0,48,134,133,235,112,2,72,207,235,34,2,225,191,7,240,
+110,4,1,50,48,117,150,151,143,225,217,5,0,49,125,107,225,218,9,224,
+79,8,128,234,181,106,0,99,86,206,1,100,105,117,88,64,63,212,153,192,
+18,131,11,65,193,81,239,245,115,2,0,80,105,15,69,210,234,65,1,108,
+43,72,19,171,75,96,148,97,205,66,150,131,49,202,147,64,92,131,92,109,
+18,71,213,64,18,131,62,68,177,242,195,15,242,152,8,192,0,64,62,163,
+31,3,32,67,32,80,97,116,250,39,1,86,239,129,39,89,193,134,55,233,
+126,3,1,56,49,172,247,224,14,2,96,56,2,79,32,35,67,128,192,112,
+68,166,118,39,106,173,159,249,106,179,255,249,4,103,169,130,59,224,25,6,
+97,148,127,205,224,21,3,103,75,0,85,201,43,96,161,172,130,224,195,5,
+1,49,56,167,117,224,196,1,64,0,98,152,0,66,139,107,100,233,96,101,
+69,109,224,62,28,0,85,73,242,96,44,236,214,2,85,118,102,176,99,126,
+129,14,0,55,152,76,224,17,0,66,182,1,48,48,64,4,0,49,64,4,
+0,50,235,1,2,192,9,235,3,0,96,36,160,58,135,188,0,49,204,139,
+138,77,225,69,9,193,2,224,219,5,96,21,102,211,129,135,224,34,10,98,
+142,224,34,4,225,74,9,0,54,110,161,225,10,4,66,65,167,215,85,239,
+64,162,136,56,64,169,139,24,67,137,0,53,101,197,197,79,0,56,92,15,
+165,18,160,32,1,52,55,204,36,1,50,48,110,9,224,23,8,2,54,53,
+53,116,211,64,22,224,24,4,4,49,49,49,52,49,64,117,67,228,225,79,
+3,3,117,116,102,56,94,174,5,58,32,98,97,100,32,222,184,226,74,3,
+0,83,202,98,64,147,132,28,187,149,203,145,188,95,195,168,224,46,18,107,
+145,0,49,101,23,96,46,224,44,33,224,41,32,131,80,98,116,0,56,70,
+21,113,186,160,168,134,241,224,27,20,224,26,4,160,20,97,13,225,8,28,
+112,228,224,216,83,224,187,47,224,184,22,0,49,168,27,224,139,37,224,111,
+12,72,201,128,29,0,79,132,221,66,231,218,131,1,80,32,100,66,150,170,
+67,174,187,46,99,44,197,40,163,71,1,55,56,98,247,117,246,71,65,198,
+171,167,139,96,5,224,28,15,96,206,224,28,3,67,9,163,91,131,149,207,
+116,192,20,110,50,97,143,192,183,99,210,64,152,96,76,224,152,0,64,21,
+249,164,11,71,4,197,204,64,14,249,179,2,69,28,128,232,231,140,0,241,
+205,0,232,192,17,31,87,101,108,99,111,109,101,32,116,111,32,105,110,116,
+101,114,97,99,116,105,118,101,32,77,105,99,114,111,72,115,44,32,7,118,
+101,114,115,105,111,110,32,148,51,109,46,0,50,89,115,225,243,0,232,12,
+1,1,51,57,92,141,145,83,192,20,245,77,2,84,195,1,49,56,106,122,
+198,93,2,95,51,57,65,49,0,55,107,150,64,7,97,220,107,239,160,193,
+205,105,73,34,0,54,64,194,0,56,72,60,1,95,49,93,89,232,37,0,
+3,58,49,56,48,174,75,5,51,54,55,32,75,32,70,139,128,1,82,78,
+128,132,224,1,19,120,69,224,0,4,224,47,38,224,44,35,224,41,32,224,
+38,29,224,35,26,224,32,23,224,29,20,224,26,17,224,23,14,224,20,11,
+224,17,8,65,200,234,230,0,224,0,0,65,200,233,179,1,224,1,21,225,
+179,9,225,230,255,224,32,15,224,29,20,224,26,17,224,23,14,224,20,11,
+224,17,8,224,14,5,224,11,2,192,8,78,125,224,0,5,66,3,174,183,
+68,199,0,51,69,90,2,95,49,55,84,14,68,85,128,15,0,51,68,28,
+102,57,192,34,102,79,68,102,101,41,110,5,0,55,94,254,1,95,52,69,
+23,2,95,51,57,102,46,224,82,2,224,44,0,101,33,244,252,2,10,121,
+112,101,32,39,58,113,117,105,116,39,69,21,64,8,13,44,32,39,58,104,
+101,108,112,39,32,102,111,114,32,64,9,136,190,224,78,6,119,100,0,51,
+140,84,0,55,138,135,224,101,15,31,87,65,82,78,73,78,71,58,32,67,
+111,109,112,105,108,101,100,32,119,105,116,104,32,71,72,67,44,32,115,111,
+32,108,20,105,109,105,116,101,100,32,102,117,110,99,116,105,111,110,97,108,
+105,116,121,46,170,141,67,59,165,129,65,44,0,54,129,44,225,27,1,0,
+53,79,119,0,55,83,199,97,34,192,24,225,33,5,0,67,139,49,0,55,
+74,98,171,184,247,96,0,64,22,67,156,224,174,1,4,46,109,104,115,105,
+96,126,224,19,1,1,62,32,128,143,77,29,96,144,159,70,128,155,202,212,
+65,229,231,51,2,1,35,53,142,20,225,185,4,69,248,97,228,160,214,224,
+180,4,64,21,0,52,127,38,225,74,15,1,66,121,114,172,225,23,4,129,
+25,237,79,1,2,95,53,55,208,57,162,80,134,57,155,252,64,183,226,24,
+25,17,85,110,114,101,99,111,103,110,105,122,101,100,32,99,111,109,109,97,
+189,205,224,87,10,194,224,122,231,64,10,70,135,141,176,156,114,64,119,64,
+25,0,85,66,161,71,145,0,64,88,42,0,90,97,148,226,211,14,160,12,
+249,157,25,248,65,0,192,165,245,146,9,85,222,0,51,129,139,224,191,14,
+64,0,64,140,0,54,73,118,96,8,64,169,0,52,232,252,0,160,62,65,
+115,98,51,65,111,140,125,0,79,111,47,224,151,10,67,73,168,70,2,54,
+32,95,99,37,224,119,1,175,221,224,60,16,2,99,108,101,172,52,224,61,
+0,228,30,3,89,189,76,216,136,74,227,231,8,0,54,136,153,136,67,0,
+51,74,118,168,66,232,87,0,0,55,137,38,168,87,136,137,1,95,51,108,
+203,225,31,13,224,169,16,4,114,101,108,111,97,130,25,224,170,0,227,156,
+5,100,146,65,141,224,22,5,164,163,233,65,1,130,4,98,63,226,7,2,
+68,204,202,196,226,42,9,64,233,224,213,0,224,233,3,225,20,4,165,79,
+225,247,14,224,218,16,4,100,101,108,101,116,131,109,224,125,8,97,131,164,
+74,152,186,162,53,64,18,66,68,128,26,157,138,226,73,3,97,111,112,221,
+225,105,12,224,140,16,2,116,121,112,224,138,11,65,188,116,162,224,73,33,
+1,107,105,163,201,224,73,7,0,56,79,244,224,73,35,230,26,0,79,188,
+228,81,14,64,86,226,86,16,203,219,99,79,143,183,224,93,1,0,67,131,
+206,0,115,121,229,102,161,0,32,96,0,96,9,171,177,96,26,130,130,64,
+26,160,9,5,109,111,100,117,108,101,128,28,99,73,96,55,128,9,9,97,
+108,108,32,100,101,102,105,110,105,70,105,128,35,129,232,3,32,100,32,32,
+192,9,224,32,0,4,40,115,41,32,100,96,36,65,128,1,32,101,64,72,
+4,115,104,111,119,32,96,14,3,111,102,32,101,96,28,65,83,0,32,96,
+159,224,28,4,0,116,96,28,65,38,128,186,7,116,104,105,115,32,116,101,
+120,96,23,2,101,120,112,128,152,2,32,32,101,88,132,2,97,116,101,90,
+86,2,114,101,115,76,130,64,33,3,100,101,102,110,160,33,11,97,100,100,
+32,116,111,112,32,108,101,118,101,224,192,3,187,1,65,63,206,15,227,103,
+8,97,108,227,103,13,2,49,55,53,131,156,222,80,229,106,10,1,79,32,
+114,242,129,171,66,111,131,95,0,80,227,167,5,64,74,64,87,0,75,227,
+231,13,229,219,21,0,49,82,171,110,250,0,48,104,196,0,48,141,39,197,
+177,194,33,213,160,96,184,77,126,70,67,102,109,224,4,13,192,103,104,28,
+0,64,117,22,64,20,2,80,32,79,146,108,128,210,230,187,6,198,191,224,
+13,1,0,85,224,13,2,96,25,241,195,0,149,64,149,100,77,224,103,250,
+0,51,178,161,129,84,255,215,5,160,0,64,204,238,191,0,230,217,16,98,
+69,230,203,0,128,38,129,20,224,53,19,1,32,61,160,51,193,210,225,191,
+4,1,64,58,129,192,227,105,4,74,4,0,95,102,173,64,29,204,146,226,
+71,87,89,9,226,71,79,0,55,64,172,194,71,0,56,244,187,2,96,225,
+139,112,226,71,6,192,1,226,59,55,226,45,72,64,177,0,54,233,219,1,
+2,51,54,50,90,211,97,43,117,49,0,73,129,182,137,254,0,80,81,150,
+69,123,96,5,64,23,220,252,226,47,15,133,44,130,51,128,37,0,52,144,
+116,224,48,15,0,40,224,49,14,224,33,1,5,41,32,119,104,101,114,101,
+25,12,105,109,112,111,114,116,32,80,114,101,108,117,100,224,17,3,18,83,
+121,115,116,101,109,46,73,79,46,80,114,105,110,116,79,114,82,117,196,243,
+31,97,117,108,116,32,40,73,110,116,101,103,101,114,44,32,68,111,117,98,
+108,101,44,32,83,116,114,105,110,103,44,32,40,1,41,41,255,247,1,96,
+226,250,52,0,226,177,12,193,124,97,208,1,64,83,108,6,3,56,32,95,
+54,72,39,64,11,65,73,177,217,231,83,0,66,205,65,236,226,154,12,0,
+64,66,36,168,1,0,95,228,163,1,97,238,163,30,114,248,153,129,160,110,
+0,56,66,190,64,52,64,65,227,68,66,135,73,224,169,14,66,222,153,238,
+72,140,135,148,1,49,55,250,1,0,224,103,0,228,42,17,198,84,224,174,
+4,227,132,7,0,52,78,9,0,52,109,77,0,83,77,85,69,195,237,95,
+1,224,47,6,72,75,96,157,160,82,147,77,224,66,2,224,32,0,243,25,
+11,165,11,173,199,3,49,55,57,48,109,45,131,233,226,188,16,1,79,32,
+124,129,96,215,65,52,237,55,2,97,32,122,198,147,164,250,8,0,1,32,
+73,96,220,155,76,131,206,3,95,49,50,54,205,209,1,67,39,224,24,2,
+0,80,117,241,192,13,164,16,64,13,0,39,132,53,161,239,195,222,128,18,
+64,54,192,206,0,56,135,83,224,226,1,117,103,138,70,0,51,170,78,100,
+142,96,65,230,52,20,19,114,97,110,115,108,97,116,101,58,32,110,111,116,
+32,102,111,117,110,100,32,131,43,187,85,180,95,157,146,97,1,198,138,0,
+89,194,191,0,83,252,22,0,80,181,128,19,221,77,109,216,0,80,123,75,
+174,243,129,142,68,135,67,26,97,9,197,8,131,123,64,78,64,17,250,48,
+4,129,131,224,32,18,147,48,165,61,224,32,11,129,51,161,93,250,82,3,
+192,24,0,85,168,9,97,144,250,255,18,5,100,121,110,115,121,109,164,80,
+218,253,1,95,57,221,130,193,240,224,98,3,96,156,0,85,225,166,21,225,
+164,22,65,160,6,32,112,114,105,109,111,112,161,160,97,152,2,57,49,52,
+81,91,65,30,66,24,244,54,0,224,231,10,129,66,96,231,96,226,251,244,
+0,226,162,0,65,190,225,55,8,227,254,0,252,243,11,98,161,224,105,8,
+96,21,80,239,219,163,224,116,2,0,56,142,132,224,31,5,226,176,38,1,
+58,32,70,22,5,115,115,105,98,108,101,207,191,152,18,0,54,69,101,64,
+0,0,58,131,37,123,240,1,32,95,119,2,143,217,0,54,193,176,64,22,
+67,218,217,45,96,50,136,205,236,194,6,3,79,32,35,54,196,15,67,171,
+224,30,9,70,21,96,30,0,79,224,30,13,0,53,160,30,64,4,237,31,
+16,1,67,39,96,201,112,252,224,129,10,0,55,160,67,65,164,224,30,10,
+192,98,90,35,224,98,16,0,83,128,98,99,153,224,67,9,0,56,197,204,
+68,105,224,197,10,0,51,160,30,67,186,224,61,10,192,30,67,125,224,30,
+10,192,160,67,232,224,30,10,193,65,69,38,224,191,16,0,66,128,191,69,
+40,224,67,10,68,153,96,67,73,72,224,98,10,201,135,0,82,224,98,19,
+1,75,50,96,98,0,75,66,136,224,36,17,0,51,128,36,66,202,224,36,
+17,0,52,128,36,74,184,225,244,18,0,66,161,245,226,89,13,0,52,193,
+85,0,43,224,30,13,193,85,0,45,224,30,13,192,242,0,42,224,131,19,
+2,113,117,111,146,123,64,8,224,40,19,1,114,101,132,246,2,114,101,109,
+224,38,19,0,117,224,80,0,96,9,224,42,20,192,82,64,8,224,40,19,
+2,110,101,103,96,39,2,110,101,103,224,38,19,212,118,2,97,110,100,224,
+38,19,0,111,147,45,1,111,114,224,36,19,0,120,160,37,0,120,224,38,
+21,2,105,110,118,96,38,2,105,110,118,224,38,19,2,115,104,108,96,38,
+2,115,104,108,224,38,21,128,116,1,115,104,224,116,20,0,97,192,39,64,
+8,224,79,20,2,117,98,116,92,183,128,84,160,12,224,48,19,1,61,61,
+96,42,69,199,224,36,17,0,47,128,36,0,47,224,36,10,68,139,195,135,
+0,60,224,67,19,0,60,128,67,0,60,224,67,14,194,185,0,62,224,67,
+19,0,62,128,67,0,62,224,172,20,1,117,60,130,97,224,141,20,0,117,
+160,142,0,117,224,143,11,224,38,2,0,62,128,37,224,149,20,0,117,160,
+150,0,117,224,151,21,1,111,114,130,171,1,111,114,226,171,20,0,99,161,
+233,0,99,225,232,21,1,102,43,96,37,0,102,228,39,10,224,36,2,0,
+45,128,36,228,45,10,224,36,2,0,42,128,36,228,51,20,1,102,47,128,
+36,0,47,224,36,20,162,76,0,102,226,77,21,0,102,162,78,0,102,226,
+79,11,224,38,2,129,199,0,102,225,199,20,0,102,161,199,0,102,225,199,
+21,0,102,129,199,0,102,225,199,20,0,102,161,199,0,102,225,199,21,0,
+102,196,155,64,8,224,40,20,83,237,128,41,115,247,224,42,19,1,114,101,
+183,38,96,9,224,42,19,3,105,116,111,102,96,41,64,8,224,40,19,2,
+115,101,113,96,39,2,115,101,113,224,38,22,1,117,97,164,171,96,10,224,
+44,19,224,43,1,224,42,24,2,115,99,109,149,254,64,8,224,208,20,192,
+40,64,8,224,40,19,1,114,110,128,248,1,114,110,224,247,20,3,73,79,
+46,62,161,201,128,10,224,44,24,224,43,1,224,42,22,5,114,101,116,117,
+114,110,192,46,128,13,224,50,22,0,112,80,191,192,49,96,12,224,48,22,
+7,115,101,114,105,97,108,105,122,151,207,224,16,3,224,56,22,1,100,101,
+224,58,8,224,18,2,224,117,23,2,116,100,105,224,216,0,96,12,224,48,
+25,1,111,117,224,216,0,128,13,224,50,25,1,101,114,132,220,224,13,0,
+224,50,22,7,103,101,116,65,114,103,82,101,129,248,224,16,3,225,118,23,
+7,101,114,102,111,114,109,73,79,225,122,0,192,16,224,113,23,0,99,224,
+106,0,0,99,224,42,19,3,114,97,105,115,129,103,96,9,224,42,19,4,
+99,97,116,99,104,96,42,96,9,224,42,19,238,107,2,128,10,224,44,19,
+4,110,101,119,67,65,146,247,1,76,101,129,188,224,18,5,224,60,19,3,
+112,101,101,107,192,42,96,58,224,16,3,224,56,31,192,118,224,19,6,224,
+62,19,2,116,111,73,163,15,96,9,224,42,21,1,80,116,130,46,96,9,
+224,42,21,1,68,98,132,151,96,9,224,42,21,2,70,117,110,224,88,1,
+128,12,224,48,19,5,65,46,97,108,108,111,130,22,160,11,224,46,21,0,
+115,195,129,128,10,224,44,21,229,248,0,128,10,224,44,21,2,119,114,105,
+188,114,160,11,224,46,21,167,142,64,8,224,40,19,2,98,115,43,136,76,
+64,8,224,40,23,224,41,1,224,42,22,160,124,64,8,224,40,21,168,13,
+64,8,224,40,21,136,15,1,98,115,232,16,20,1,98,115,168,17,64,8,
+224,40,21,133,247,1,98,115,229,245,20,1,98,115,166,75,64,8,224,40,
+21,198,199,96,9,224,42,21,3,112,97,99,107,160,43,64,10,224,44,21,
+1,117,110,224,46,2,128,12,224,48,21,4,108,101,110,103,116,132,113,192,
+12,224,48,21,3,115,117,98,115,163,17,192,12,224,48,19,192,9,96,48,
+224,22,0,224,48,18,1,116,111,224,46,0,128,10,224,93,20,0,112,170,
+218,0,112,234,219,21,1,112,50,129,110,64,8,224,40,21,1,110,101,169,
+134,64,9,224,42,21,0,102,167,5,96,9,122,104,146,176,224,0,98,82,
+151,218,131,183,121,187,15,179,38,118,161,243,50,17,1,32,61,84,55,0,
+110,153,52,147,45,224,56,0,0,51,109,108,247,197,5,84,153,251,240,4,
+2,95,105,116,103,55,64,27,154,55,252,96,1,123,45,252,96,49,64,82,
+154,114,224,110,4,160,108,153,169,4,95,49,53,53,51,96,87,96,242,1,
+54,49,123,166,0,48,84,234,2,95,49,55,88,62,64,43,254,207,0,120,
+59,83,14,119,150,2,95,51,54,128,167,120,101,89,196,64,137,84,136,185,
+239,64,59,151,211,9,95,51,54,55,32,75,32,85,32,75,183,151,64,65,
+87,227,90,27,245,88,0,64,47,151,1,224,151,6,2,55,50,55,96,6,
+160,144,84,18,129,178,213,30,247,239,0,181,50,64,45,0,53,89,93,97,
+10,0,75,128,53,148,128,96,161,64,52,118,137,156,25,128,61,1,83,32,
+85,55,121,147,117,146,0,80,119,132,0,79,156,199,161,94,92,35,192,83,
+83,12,2,90,32,83,183,166,0,85,156,188,0,67,64,48,161,240,90,112,
+64,197,0,51,157,95,96,0,128,106,97,73,1,54,56,85,150,0,50,121,
+47,3,52,32,64,35,122,0,224,35,6,2,49,55,55,128,60,96,222,66,
+163,92,94,121,0,89,145,128,90,160,43,1,52,50,67,235,3,95,54,49,
+50,98,46,221,107,216,242,186,199,192,88,85,176,1,51,53,128,36,129,14,
+226,255,0,0,55,64,41,192,7,65,218,98,16,128,0,65,72,131,49,65,
+204,0,90,96,161,118,253,64,24,0,54,246,21,0,160,94,96,144,0,51,
+89,216,64,30,130,224,0,89,249,166,0,152,213,0,67,118,243,253,118,6,
+64,46,130,188,253,240,2,161,156,249,181,0,225,174,0,192,193,152,162,121,
+243,247,117,3,64,254,1,54,55,65,21,0,49,154,53,192,78,0,55,91,
+229,249,85,0,64,55,224,54,1,126,20,65,5,64,35,2,95,49,55,187,
+189,224,130,0,96,113,250,74,1,162,81,254,56,2,64,194,221,15,128,149,
+157,23,123,90,3,67,32,95,50,100,102,0,50,187,2,129,243,251,137,3,
+64,160,219,116,128,117,251,167,5,84,159,186,158,123,231,65,125,251,236,2,
+2,95,49,55,218,100,225,49,1,89,82,0,55,192,65,1,49,55,67,93,
+225,60,3,224,93,0,163,68,0,67,163,99,98,12,0,49,99,14,0,80,
+94,209,66,104,193,9,65,200,98,239,152,136,250,139,0,224,106,3,194,96,
+89,160,2,95,52,49,96,125,0,54,125,238,252,158,5,129,52,196,110,128,
+1,224,69,0,64,175,67,48,0,52,194,140,224,33,0,160,181,64,32,185,
+116,64,175,65,183,64,78,132,129,64,40,86,255,187,76,224,2,0,128,47,
+254,153,0,224,8,0,160,24,224,25,11,99,238,128,0,224,71,0,224,29,
+3,224,61,2,224,33,2,224,42,3,224,69,6,224,37,11,224,2,4,224,
+40,1,224,113,17,224,23,0,224,44,2,99,97,224,2,23,224,48,4,225,
+31,8,128,34,224,17,6,224,49,41,96,17,224,53,3,225,189,0,224,1,
+9,224,94,5,225,27,23,224,2,3,224,56,5,224,57,4,225,9,24,225,
+6,5,225,249,16,224,61,15,224,125,9,224,65,42,224,68,11,225,40,2,
+224,55,12,224,2,7,224,64,9,224,134,6,159,18,224,86,2,224,145,22,
+224,86,15,225,184,9,224,1,7,0,83,68,193,198,165,0,35,231,4,2,
+224,0,1,224,195,13,224,2,17,225,103,12,224,138,40,197,162,224,0,4,
+224,108,13,224,2,21,224,138,57,199,243,224,0,4,225,177,3,192,108,161,
+182,224,96,6,224,177,19,224,89,8,224,143,13,224,1,1,224,153,5,189,
+237,224,0,4,226,209,12,224,2,19,224,131,54,135,27,224,0,5,224,116,
+25,192,2,227,82,15,224,131,37,223,199,224,65,31,224,114,11,224,47,19,
+225,119,8,74,236,224,0,7,224,223,19,224,2,9,224,126,52,231,139,0,
+224,63,15,224,115,28,224,106,13,128,1,224,112,6,105,132,224,0,4,224,
+97,13,192,2,226,228,19,224,118,34,228,143,9,224,115,31,224,118,52,227,
+240,9,227,75,14,195,240,224,92,8,224,41,7,224,80,5,224,130,11,128,
+1,229,3,6,227,223,8,227,220,11,228,117,28,224,129,5,224,124,13,225,
+7,8,224,126,7,230,156,1,96,44,225,19,7,225,13,16,227,228,9,224,
+122,9,224,124,7,106,121,224,0,0,224,202,3,231,31,10,136,183,224,14,
+15,224,154,1,224,110,3,192,142,224,19,3,225,126,6,227,228,1,224,73,
+3,64,38,141,17,3,95,49,51,57,110,122,2,50,54,56,76,231,107,35,
+110,127,64,20,0,52,78,53,160,19,228,48,4,224,129,1,64,67,235,129,
+1,64,0,193,72,128,108,173,227,108,88,237,121,2,224,69,4,235,92,12,
+234,85,8,224,255,7,0,67,77,202,2,51,51,48,160,235,1,64,35,78,
+0,224,88,27,160,152,224,83,0,192,43,231,50,6,198,21,192,46,64,14,
+224,40,12,163,107,224,37,0,224,34,10,129,58,208,140,224,25,3,229,247,
+5,0,73,192,13,173,202,64,5,233,79,2,96,126,142,198,224,220,3,97,
+116,64,16,1,64,80,225,59,1,226,230,8,130,64,160,236,98,95,224,248,
+1,224,25,2,77,95,172,219,161,79,225,208,3,224,74,10,226,205,11,65,
+10,192,139,224,18,2,226,44,5,2,95,50,49,77,105,194,56,226,55,17,
+243,52,0,144,123,224,106,6,81,90,224,16,21,77,145,224,16,4,175,151,
+0,57,242,179,2,31,92,51,52,38,109,104,115,47,83,121,115,116,101,109,
+47,67,111,110,115,111,108,101,47,83,105,109,112,108,101,82,101,97,7,100,
+108,105,110,101,46,104,115,64,39,5,44,49,54,50,58,53,147,20,224,89,
+4,163,91,225,121,1,224,237,17,224,142,5,238,128,19,224,42,9,226,211,
+10,225,232,0,228,96,0,64,5,225,149,8,227,50,8,192,62,130,186,192,
+65,128,8,130,209,66,75,227,225,5,226,155,1,224,2,0,239,240,12,224,
+121,3,224,68,4,242,117,0,96,40,68,103,85,30,132,117,224,142,1,162,
+11,96,135,160,5,64,143,224,139,3,64,209,129,106,6,67,32,95,55,53,
+32,95,145,106,112,164,160,71,64,53,177,245,114,154,243,57,3,224,42,3,
+64,41,64,237,226,108,12,224,0,1,224,205,0,145,104,224,245,11,161,106,
+97,72,224,172,2,97,185,224,246,2,128,148,80,171,224,175,4,196,68,162,
+252,242,122,0,160,65,64,231,224,255,1,128,43,128,5,224,48,5,224,55,
+1,100,82,164,87,224,6,3,225,151,10,224,196,1,224,88,1,130,15,193,
+124,227,148,18,224,169,2,128,44,225,175,9,100,91,225,113,2,224,182,9,
+224,175,5,224,127,0,166,253,160,176,162,163,224,147,1,128,107,134,202,1,
+95,52,98,70,160,6,225,142,1,231,65,0,128,15,100,35,128,10,225,4,
+16,226,190,2,227,157,4,0,57,149,160,224,235,1,228,219,10,181,255,226,
+149,2,96,247,236,238,0,229,94,2,1,64,64,84,97,130,185,225,59,1,
+224,242,2,161,76,227,102,5,1,85,32,237,58,1,227,45,8,226,65,3,
+231,119,6,224,95,12,225,13,2,226,218,9,224,105,2,224,32,2,227,244,
+16,225,52,31,97,197,243,195,9,98,35,225,56,18,224,221,8,224,22,2,
+225,198,7,100,221,227,171,17,226,142,5,66,64,96,23,228,143,0,163,254,
+164,67,161,131,70,213,244,176,0,133,38,226,140,0,128,27,225,108,0,163,
+109,224,63,3,128,242,71,97,224,67,15,0,67,135,55,224,70,9,226,5,
+0,229,0,5,226,189,15,227,193,8,195,104,131,174,165,1,228,202,20,161,
+197,228,179,3,160,162,132,182,195,119,225,169,5,228,205,2,160,60,1,50,
+52,65,136,193,86,250,99,12,6,92,56,38,32,92,56,38,199,82,153,223,
+183,13,248,50,0,164,104,128,150,0,82,224,10,1,224,194,13,166,218,227,
+27,5,234,138,12,192,20,128,204,226,179,5,174,54,224,26,8,231,161,2,
+98,120,64,164,246,98,0,132,160,65,199,138,8,134,120,248,74,3,64,23,
+248,87,1,99,128,96,4,161,181,164,229,128,250,0,57,96,7,1,50,50,
+87,125,164,213,134,207,96,112,0,49,106,166,1,95,53,86,207,230,221,3,
+230,56,3,98,65,139,236,0,54,96,76,97,73,249,56,1,207,26,86,199,
+187,25,1,50,51,64,236,64,225,0,58,129,75,64,20,232,119,2,0,55,
+232,23,6,67,123,66,20,64,169,1,49,57,64,4,236,65,1,0,54,64,
+11,0,35,135,153,2,50,48,50,233,116,2,12,103,101,116,82,97,119,32,
+102,97,105,108,101,100,129,252,225,72,3,2,95,50,57,97,241,64,130,155,
+86,7,94,71,69,84,82,65,87,32,64,17,189,81,64,43,125,61,0,55,
+75,177,64,24,0,54,128,42,5,102,108,117,115,104,98,96,42,154,18,3,
+95,50,51,56,224,212,2,153,248,225,135,2,155,88,3,95,52,53,49,122,
+92,97,113,235,173,4,240,69,0,0,83,155,182,193,108,0,90,98,98,130,
+81,64,135,131,155,160,184,0,51,218,198,2,50,32,65,152,43,0,54,152,
+122,3,95,49,51,56,96,157,152,58,226,197,0,225,70,8,3,95,49,55,
+53,163,211,226,135,4,225,116,16,0,50,64,240,193,112,98,169,121,73,253,
+224,15,12,83,97,118,105,110,103,32,99,97,99,104,101,32,97,133,2,95,
+49,50,124,81,64,248,0,53,97,137,1,51,48,201,12,64,141,1,57,32,
+192,16,64,191,221,76,1,55,53,96,207,0,53,221,55,96,172,204,162,64,
+150,92,84,2,95,52,49,162,194,226,63,5,130,114,78,102,194,225,250,134,
+3,1,51,48,91,87,1,55,53,98,236,231,108,10,64,27,126,78,1,50,
+57,132,167,64,135,189,137,250,20,2,98,41,160,46,67,147,64,37,130,70,
+11,73,79,46,115,101,114,105,97,108,105,122,101,96,196,162,68,18,97,100,
+100,95,108,122,55,55,95,99,111,109,112,114,101,115,115,111,114,96,30,130,
+81,7,85,32,75,51,32,75,52,32,66,57,224,1,5,234,97,1,192,141,
+130,110,64,210,0,51,64,226,1,95,51,97,69,126,194,160,234,96,23,97,
+95,0,48,77,201,165,61,0,51,101,61,64,21,64,29,0,75,131,30,128,
+66,94,107,192,94,130,102,229,174,0,138,4,2,52,50,50,67,236,65,36,
+64,35,255,97,4,98,20,226,21,18,9,69,120,99,101,112,116,105,111,110,
+58,130,19,96,65,218,229,97,124,128,132,1,52,48,64,186,5,56,53,32,
+95,52,48,133,115,129,245,224,229,2,0,52,131,54,194,15,224,255,4,128,
+50,166,218,224,88,3,198,61,160,255,91,207,128,172,0,52,66,121,224,167,
+1,2,46,104,115,128,159,234,48,0,225,75,1,128,114,224,69,1,224,15,
+1,0,52,67,47,129,25,162,16,68,22,224,194,0,97,125,225,104,0,64,
+125,65,44,0,85,162,76,197,176,227,143,2,224,178,0,65,14,1,64,95,
+129,152,224,31,8,64,102,64,96,224,92,7,245,138,5,65,104,131,83,192,
+188,112,139,77,186,70,119,1,49,55,131,206,134,225,0,58,128,82,66,90,
+6,51,54,55,32,75,32,85,233,209,0,2,95,51,57,128,88,64,35,131,
+12,238,32,0,240,58,2,64,80,100,68,1,83,32,70,40,192,61,224,7,
+3,72,176,166,159,64,14,235,213,5,227,96,2,228,136,13,200,57,226,118,
+2,167,211,226,120,12,14,99,111,109,98,105,110,97,116,111,114,115,58,92,
+49,48,168,20,2,95,54,56,165,86,253,203,6,96,221,131,196,224,221,11,
+96,155,0,51,117,134,128,30,226,29,2,97,247,104,90,1,49,52,126,39,
+232,73,4,193,210,0,89,104,60,226,185,7,1,49,55,68,174,160,96,191,
+68,227,149,4,193,63,192,83,196,178,192,123,225,53,9,0,51,98,100,229,
+191,5,227,5,5,225,67,35,2,112,105,108,69,213,14,117,115,101,100,32,
+98,111,111,116,32,109,111,100,117,108,165,224,2,64,95,51,230,165,0,225,
+211,1,225,25,18,239,50,2,226,213,12,101,165,226,211,1,128,185,0,85,
+99,36,111,161,195,224,65,12,226,62,38,225,7,4,224,250,25,17,116,111,
+116,97,108,32,105,109,112,111,114,116,32,116,105,109,101,32,64,0,128,245,
+64,121,201,3,4,49,55,52,52,32,123,24,166,237,96,89,224,72,2,0,
+109,228,87,1,129,205,233,227,4,244,158,2,64,14,130,5,64,7,137,249,
+2,95,51,56,225,176,2,2,54,55,56,64,4,98,48,64,120,148,90,211,
+236,66,192,0,54,131,194,64,211,1,57,53,67,202,101,191,65,248,0,57,
+98,114,106,107,64,40,134,120,167,2,202,89,97,82,107,93,97,78,3,95,
+49,49,52,235,146,4,141,122,0,73,104,247,0,52,134,136,226,208,11,97,
+0,64,64,128,213,106,188,138,113,163,58,226,191,2,97,171,64,159,226,2,
+0,96,110,162,10,226,11,2,163,15,1,83,39,195,72,0,80,135,28,98,
+116,98,27,161,92,110,132,128,216,64,2,96,24,98,46,130,69,2,95,50,
+50,64,125,139,0,129,37,2,49,55,52,170,227,139,16,246,92,1,129,113,
+2,49,55,52,128,17,64,246,233,135,0,0,52,201,135,64,28,96,18,231,
+180,6,64,26,233,147,0,65,102,230,79,17,162,188,0,51,69,175,1,95,
+52,118,9,194,155,0,52,97,238,226,169,9,2,79,32,35,65,204,128,107,
+226,144,0,1,95,51,71,193,65,132,172,183,226,73,0,194,248,96,220,226,
+248,19,17,67,97,110,110,111,116,32,102,105,110,100,32,112,97,99,107,97,
+103,227,236,8,163,146,227,130,1,196,227,231,105,3,201,66,2,95,52,55,
+130,167,65,15,134,143,231,117,2,3,112,107,103,34,98,79,64,176,226,186,
+4,108,78,3,95,52,55,51,128,30,134,120,64,217,0,51,73,57,69,53,
+98,126,97,56,226,130,1,227,85,4,64,5,193,110,128,11,1,95,51,75,
+53,128,31,130,15,77,31,182,231,229,87,37,130,50,232,164,9,0,50,96,
+237,225,27,14,0,52,110,241,225,126,19,0,91,64,10,161,112,228,103,3,
+0,50,64,184,225,231,1,163,222,64,237,1,79,32,66,11,0,53,130,11,
+130,15,4,79,32,35,57,51,244,159,1,224,124,32,132,238,69,239,229,222,
+8,226,195,13,129,235,76,237,64,40,233,77,10,128,54,68,210,3,95,52,
+56,50,130,53,136,6,242,0,7,226,67,5,104,170,2,95,52,56,178,13,
+134,72,65,100,198,72,96,0,64,20,203,203,65,177,128,148,225,198,45,225,
+33,39,108,231,0,100,225,40,8,233,147,4,207,135,69,201,1,52,56,132,
+217,0,49,176,230,4,95,49,56,51,32,166,149,131,29,65,216,228,45,1,
+231,228,49,224,197,35,103,210,224,195,6,225,234,40,0,45,64,69,128,68,
+97,215,228,110,35,232,83,3,100,119,3,111,117,110,100,204,43,228,113,2,
+226,54,35,1,49,55,111,102,226,55,4,0,54,78,79,225,105,0,134,254,
+102,153,107,12,0,54,66,104,203,11,134,251,175,133,0,51,64,128,64,50,
+134,239,2,85,32,75,197,225,64,20,205,46,192,1,228,12,2,0,52,68,
+12,96,143,96,0,128,31,224,189,3,225,95,0,193,92,2,95,52,56,224,
+46,0,243,113,0,251,38,8,200,42,224,35,2,224,44,1,160,62,224,19,
+1,64,16,224,116,2,128,21,128,76,224,8,9,101,11,245,253,1,226,130,
+37,235,158,4,234,103,10,226,2,17,6,112,97,114,115,105,110,103,193,244,
+224,0,1,250,33,7,246,158,7,224,160,69,226,165,19,64,162,1,101,100,
+236,71,3,105,236,0,54,212,30,160,0,225,226,5,234,164,3,160,165,163,
+90,163,160,224,168,5,236,54,1,211,172,0,54,100,39,1,52,51,100,163,
+155,112,168,184,160,60,227,97,0,128,15,224,190,16,195,95,7,97,109,101,
+32,100,111,101,115,99,105,12,97,103,114,101,101,32,119,105,116,104,32,102,
+105,160,29,225,131,0,161,78,168,84,99,133,232,131,12,64,142,134,102,230,
+43,2,160,65,226,154,11,226,179,10,227,12,4,227,55,8,226,6,10,161,
+90,163,25,96,167,233,90,10,65,116,79,17,1,95,54,183,224,97,80,0,
+50,228,49,6,0,54,72,95,99,231,214,109,96,0,131,106,224,1,3,158,
+206,224,28,14,190,42,224,28,13,64,1,224,223,20,129,22,236,8,1,250,
+97,4,223,100,224,88,2,224,35,2,224,111,7,195,242,128,84,160,83,136,
+140,224,5,30,150,47,230,128,40,197,166,227,92,43,9,116,121,112,101,32,
+99,104,101,99,107,227,98,4,232,236,1,2,54,55,52,67,107,64,71,224,
+53,1,0,45,64,0,224,45,1,224,0,3,225,74,2,224,2,9,193,56,
+225,171,14,230,249,4,160,194,238,144,2,226,54,0,109,241,173,139,224,0,
+1,224,81,11,226,59,4,226,32,50,224,2,18,234,238,0,224,186,50,224,
+153,15,64,1,224,192,4,224,40,19,224,198,23,224,200,16,225,149,0,224,
+81,7,224,224,3,226,218,1,224,73,3,196,4,227,24,4,224,64,7,224,
+2,4,224,70,3,224,30,10,224,69,1,224,143,12,226,64,1,224,27,7,
+227,127,6,224,92,15,192,32,228,215,14,128,37,128,93,199,145,224,8,9,
+231,2,104,6,100,101,115,117,103,97,114,231,5,5,131,153,211,82,224,0,
+3,242,175,2,161,160,128,177,224,5,9,225,25,1,228,117,6,64,0,96,
+211,225,30,4,224,223,19,235,77,0,225,154,2,96,222,139,18,224,24,6,
+235,30,26,4,100,111,110,101,32,228,96,1,224,141,5,231,30,5,224,91,
+2,224,89,17,0,44,224,76,1,128,42,237,209,2,242,61,2,192,29,231,
+209,18,2,115,32,40,192,74,130,148,224,142,0,224,72,4,224,69,21,1,
+32,43,192,143,224,65,16,224,62,28,224,197,12,78,149,0,49,238,132,1,
+224,0,5,128,111,99,76,226,26,18,226,228,12,233,65,32,2,95,51,49,
+136,183,128,158,0,57,123,134,233,69,2,4,95,52,48,55,32,224,205,1,
+10,73,110,116,101,114,97,99,116,105,118,101,161,20,64,93,187,189,226,95,
+5,227,65,45,3,108,111,97,100,238,49,10,225,17,0,228,121,1,97,253,
+195,241,227,67,0,192,14,225,16,5,66,254,164,50,135,195,228,60,0,192,
+165,165,132,160,18,0,54,115,223,128,43,164,141,81,7,111,162,241,121,2,
+64,161,0,56,73,70,195,138,250,48,10,226,240,2,245,178,3,229,136,1,
+97,227,224,96,2,0,85,115,51,128,34,255,240,2,87,149,0,56,192,11,
+224,89,1,224,32,2,224,45,4,64,0,125,80,212,157,224,16,11,224,32,
+8,66,53,0,54,64,218,87,138,0,66,180,62,212,59,193,13,179,252,64,
+188,79,179,0,55,94,224,128,0,167,48,213,108,1,95,57,131,30,78,15,
+160,128,180,240,225,135,0,80,170,110,142,0,56,110,122,121,22,251,211,7,
+224,137,11,249,47,1,170,88,224,10,4,224,167,4,65,83,192,0,224,214,
+11,140,110,194,83,7,67,32,67,32,61,61,32,64,118,173,128,86,143,83,
+244,244,5,96,211,161,167,96,13,192,178,67,215,129,174,3,49,53,53,50,
+172,253,75,58,139,95,79,15,222,146,1,53,53,68,6,0,53,95,28,64,
+6,117,100,0,50,75,140,0,49,129,82,64,53,0,48,147,216,149,34,72,
+56,1,49,53,67,18,3,95,49,53,56,93,165,0,53,107,153,155,43,224,
+185,0,124,1,2,95,49,50,64,126,2,49,55,50,86,111,128,39,227,101,
+1,2,101,111,102,131,97,64,198,3,95,50,49,56,224,136,0,226,182,0,
+64,118,251,25,0,1,49,50,160,171,132,43,201,55,0,53,159,43,194,223,
+1,53,53,96,20,128,233,164,188,0,32,205,206,1,49,53,94,36,96,233,
+96,227,0,53,176,71,223,216,128,114,0,50,180,225,224,233,2,0,54,68,
+187,1,49,55,209,175,100,70,224,176,1,97,113,0,55,124,170,228,167,3,
+3,77,97,105,110,96,225,0,79,160,170,1,54,48,69,121,224,36,5,0,
+109,192,36,160,128,64,127,181,66,68,59,225,106,0,1,55,52,224,52,3,
+110,38,96,54,225,143,4,66,249,170,92,225,39,0,193,214,225,233,3,0,
+51,96,206,193,245,3,55,56,32,35,183,205,1,53,56,64,58,0,54,69,
+142,192,24,182,28,160,13,243,133,1,224,254,2,1,67,39,65,64,64,61,
+230,70,0,132,22,224,192,16,3,119,104,101,114,229,188,1,138,142,225,107,
+11,225,215,0,225,113,8,193,115,226,40,0,66,181,147,148,128,241,134,235,
+224,9,66,225,74,2,224,5,8,227,68,2,96,163,0,53,142,207,158,194,
+119,101,225,114,6,225,12,3,3,100,97,116,97,129,203,2,49,54,54,163,
+183,1,54,54,65,105,224,88,4,224,99,12,0,49,83,21,224,93,20,5,
+110,101,119,116,121,112,162,44,1,49,54,154,139,226,1,10,224,112,9,224,
+101,4,97,202,0,49,96,45,128,40,0,54,178,44,1,53,57,64,50,1,
+54,53,70,111,0,54,100,161,70,99,64,14,245,67,8,64,56,101,145,70,
+174,64,182,225,191,0,224,241,0,224,129,18,226,184,10,224,231,3,224,228,
+35,0,54,186,39,225,173,8,0,53,160,220,0,55,126,64,201,47,192,68,
+98,2,224,147,4,144,147,229,68,4,2,54,48,49,65,15,88,93,227,66,
+5,224,119,1,224,68,4,0,52,67,180,224,216,19,138,228,160,218,0,55,
+72,230,225,38,7,225,49,15,65,146,224,88,3,224,11,27,224,124,6,5,
+102,111,114,101,105,103,132,161,224,152,18,65,234,0,55,64,247,1,53,57,
+230,18,1,224,47,7,4,99,99,97,108,108,224,73,12,3,99,97,112,105,
+164,13,67,255,96,196,224,32,4,4,117,110,115,97,102,196,48,192,34,0,
+54,93,42,128,15,122,77,224,199,5,2,54,48,48,224,64,2,1,58,58,
+226,27,0,192,52,225,53,13,0,55,94,140,224,28,13,72,104,227,245,4,
+106,57,128,54,0,50,64,129,225,32,8,3,110,102,105,120,128,241,65,232,
+224,45,1,0,52,124,63,224,45,11,0,114,224,227,0,224,92,4,134,173,
+224,46,9,160,45,96,28,96,151,65,120,228,89,2,2,105,103,105,97,160,
+231,157,6,179,74,66,74,71,124,87,94,114,131,171,142,0,53,94,189,97,
+6,249,3,11,1,67,32,224,32,0,224,33,8,181,101,160,91,67,71,224,
+36,4,224,0,0,227,38,0,154,42,227,38,6,226,218,13,226,229,14,73,
+179,226,193,19,3,99,108,97,115,154,227,65,252,100,112,196,33,161,199,228,
+38,9,1,49,50,64,139,192,164,226,11,17,0,56,65,115,130,124,226,125,
+7,72,183,224,33,6,224,232,6,232,242,4,200,177,3,95,49,54,55,64,
+70,0,54,71,74,226,166,18,1,51,53,68,95,228,53,19,5,110,115,116,
+97,110,99,229,18,1,164,121,128,94,0,55,172,2,224,83,6,228,12,22,
+5,100,101,102,97,117,108,196,138,1,53,57,104,43,0,48,67,240,96,94,
+225,199,6,224,188,17,0,55,99,44,229,203,30,128,169,225,93,6,227,219,
+15,193,103,224,119,15,224,224,22,5,112,97,116,116,101,114,196,237,198,70,
+226,37,15,131,1,232,185,3,67,125,209,27,233,128,3,0,57,229,26,7,
+96,140,98,130,232,212,7,224,231,18,1,60,45,192,152,128,67,230,158,43,
+224,252,33,131,159,71,228,225,215,7,194,77,161,24,225,141,16,1,48,48,
+94,240,1,56,55,67,161,234,220,1,0,54,187,158,0,83,68,112,83,36,
+2,67,32,60,178,241,224,18,6,77,198,224,18,6,124,217,228,201,3,105,
+91,1,49,51,72,138,1,85,32,228,229,6,132,130,160,27,0,95,71,145,
+193,117,128,0,224,44,4,64,108,224,44,17,224,42,4,132,27,160,42,0,
+75,65,212,0,49,200,199,101,69,224,174,1,66,32,237,22,5,224,58,3,
+140,157,165,115,194,15,224,116,1,109,22,224,90,0,65,58,221,12,78,61,
+1,35,49,99,23,0,80,109,155,66,215,224,25,1,96,63,160,24,156,247,
+232,231,8,1,55,56,118,91,136,231,64,39,142,15,160,64,109,126,160,64,
+141,245,226,104,6,226,119,10,227,113,11,110,182,72,225,205,116,231,52,5,
+0,54,101,186,3,49,55,49,53,226,62,2,5,83,79,85,82,67,69,98,
+66,229,33,6,1,52,55,166,93,235,226,6,224,135,1,229,159,5,98,183,
+65,214,224,158,15,144,234,192,37,112,136,96,85,224,118,5,97,172,96,141,
+136,118,227,65,18,0,97,198,103,0,53,145,186,192,50,232,77,23,231,234,
+2,65,238,224,86,7,5,104,105,100,105,110,103,225,18,11,160,155,197,139,
+141,189,1,55,49,97,86,227,179,7,224,100,22,8,113,117,97,108,105,102,
+105,101,100,128,103,65,250,143,121,192,164,236,232,17,1,83,39,113,131,1,
+49,55,128,87,0,55,91,204,96,147,131,156,238,120,28,1,54,48,167,144,
+238,101,2,229,198,16,124,45,192,95,231,69,13,224,46,4,100,195,0,54,
+99,48,0,58,129,30,2,10,65,32,81,225,81,85,64,17,143,112,209,188,
+192,7,66,29,64,29,142,88,0,90,128,21,192,50,0,54,240,150,0,225,
+88,1,98,231,0,83,64,14,0,55,97,142,101,166,99,4,149,65,228,181,
+11,128,31,0,90,173,54,1,50,49,228,158,0,64,100,131,240,230,98,3,
+2,55,49,51,228,114,3,0,85,105,187,82,235,132,119,82,68,128,84,243,
+219,1,114,123,247,183,0,224,30,0,96,142,252,177,3,122,59,64,8,210,
+137,224,16,0,178,211,224,67,1,97,240,192,17,180,62,64,17,143,170,230,
+209,3,64,30,0,80,67,106,241,97,1,178,165,243,95,2,192,10,214,21,
+67,214,240,194,1,128,85,2,49,53,56,132,106,0,66,231,138,11,115,184,
+192,41,65,35,241,251,0,192,158,133,102,148,109,0,49,255,158,1,179,84,
+238,178,0,238,147,3,128,250,231,161,6,96,86,128,255,64,10,147,143,245,
+143,5,96,0,65,190,197,149,225,192,5,64,102,162,20,96,95,232,64,3,
+99,192,232,92,1,128,112,161,216,118,89,160,51,232,96,2,224,19,0,232,
+102,11,150,115,0,66,239,106,1,224,211,23,1,95,55,164,186,128,193,134,
+62,229,112,1,237,230,13,228,222,16,111,5,101,15,67,36,1,55,49,128,
+211,232,181,19,117,14,129,182,97,98,113,64,128,144,132,229,224,78,8,224,
+126,4,230,133,13,224,77,0,1,39,66,66,135,226,140,2,73,75,160,83,
+144,198,83,251,0,95,82,107,68,253,1,95,56,118,23,224,38,1,65,18,
+245,57,0,229,21,2,224,5,20,225,223,3,65,15,230,190,6,224,167,0,
+2,64,95,56,110,123,234,104,10,134,220,160,240,225,190,6,0,95,170,166,
+224,253,14,165,156,96,36,65,105,0,50,64,8,192,51,229,164,1,1,54,
+54,97,208,225,214,4,0,55,117,196,96,29,0,51,129,199,229,85,2,1,
+54,51,133,132,229,220,29,106,75,64,86,192,24,130,120,229,239,5,224,96,
+4,3,54,32,95,53,122,168,0,53,64,104,224,105,24,0,57,64,66,224,
+105,25,0,57,163,21,230,90,14,0,57,64,231,224,199,18,0,57,96,76,
+224,139,18,173,246,129,169,224,221,18,1,56,50,66,21,101,195,224,110,10,
+0,49,116,251,227,48,1,224,57,9,102,58,224,57,10,0,51,193,185,96,
+56,66,174,183,181,225,62,22,92,13,129,63,98,0,226,182,6,231,134,13,
+132,248,195,226,0,49,144,127,226,64,4,0,54,132,160,226,240,17,1,49,
+48,91,152,224,143,10,176,92,1,55,48,187,2,226,241,5,2,49,55,48,
+200,248,232,213,2,1,55,48,104,247,236,141,5,1,46,46,136,207,226,14,
+13,0,49,96,188,65,38,136,235,121,78,0,58,128,73,231,242,8,64,115,
+97,74,3,55,48,54,32,64,15,136,23,65,2,64,155,132,58,1,49,55,
+72,200,64,29,0,54,228,39,3,237,213,8,2,79,32,35,67,130,100,133,
+227,87,5,128,35,1,55,48,162,106,96,8,64,79,168,11,228,101,15,160,
+5,1,54,57,101,165,1,54,57,139,114,0,54,163,222,1,55,48,177,143,
+0,48,193,88,0,51,128,85,134,162,248,68,4,96,71,224,145,2,81,195,
+64,49,141,242,225,112,4,129,175,240,34,4,0,111,161,111,247,211,11,1,
+54,56,167,207,239,35,29,221,213,1,95,52,167,172,230,186,9,68,207,132,
+164,64,204,204,236,243,11,12,4,81,117,97,108,68,96,157,238,38,12,179,
+12,221,195,0,85,97,231,128,133,234,21,5,104,85,232,52,0,105,176,254,
+68,12,193,9,192,71,232,156,0,200,57,0,52,65,124,2,95,50,53,96,
+247,192,63,66,23,0,54,255,139,8,64,220,230,119,5,230,243,22,1,95,
+56,66,47,227,88,7,242,31,4,155,124,227,99,0,224,43,4,226,174,5,
+128,86,67,47,137,102,224,74,7,2,116,104,101,186,194,224,77,59,2,101,
+108,115,181,232,224,77,1,227,32,4,120,57,224,245,13,1,55,56,75,234,
+224,245,27,162,144,98,132,228,49,5,1,45,62,162,193,236,91,14,65,139,
+197,84,224,132,14,225,122,22,1,108,101,211,66,195,22,130,222,224,184,20,
+209,151,129,18,64,132,205,158,225,255,13,99,156,224,80,18,1,99,97,161,
+102,225,179,13,224,45,6,189,170,224,177,0,0,57,96,49,0,58,132,95,
+64,133,229,194,9,119,156,64,18,238,54,15,69,253,128,46,117,36,201,206,
+226,45,5,167,79,226,7,11,0,57,250,248,22,224,225,2,224,181,4,128,
+183,197,204,224,153,11,138,187,198,196,157,18,64,136,96,56,133,245,107,249,
+83,5,255,203,9,255,250,6,75,173,75,83,237,2,3,160,131,0,54,229,
+124,8,104,97,229,58,5,138,236,168,122,133,1,253,11,8,6,95,54,48,
+55,32,95,54,166,220,64,90,238,57,9,0,54,72,251,224,90,5,231,179,
+11,169,244,236,153,7,231,222,18,236,83,0,253,162,9,197,43,179,20,133,
+200,0,66,160,169,64,146,97,242,78,190,192,195,138,159,225,33,0,166,158,
+230,244,22,224,5,9,226,39,1,106,233,207,253,224,24,10,139,0,98,106,
+234,227,58,98,168,192,24,234,227,24,138,224,234,217,30,179,177,234,198,27,
+1,49,54,66,112,224,171,17,104,156,96,76,252,184,4,101,60,224,173,7,
+224,96,15,233,183,13,235,40,0,98,68,224,96,6,96,118,225,14,18,130,
+15,225,111,30,185,89,130,130,224,84,18,5,54,32,95,56,50,52,71,109,
+97,63,168,198,228,54,18,7,112,114,105,109,105,116,105,118,228,59,0,156,
+101,66,141,232,95,20,2,115,116,114,179,165,232,95,6,129,191,251,108,0,
+168,2,160,82,213,119,85,208,150,21,96,22,235,181,0,142,149,65,153,0,
+67,80,180,0,48,208,185,3,95,52,48,55,234,68,4,96,54,134,18,67,
+117,246,32,5,97,174,227,72,2,170,171,225,219,12,136,150,1,49,53,105,
+171,233,239,4,0,53,232,164,3,0,52,234,188,0,226,236,3,64,106,243,
+76,1,64,132,96,235,160,132,171,48,228,86,2,99,47,236,31,1,224,9,
+21,241,249,12,128,120,241,99,6,102,46,132,116,160,59,224,13,20,197,175,
+225,4,0,228,211,0,142,124,209,32,165,209,160,6,194,132,224,147,14,230,
+181,0,224,94,11,66,185,232,37,8,236,185,12,224,70,9,225,145,0,128,
+70,99,83,236,244,14,235,48,9,224,213,2,241,13,9,160,101,224,169,3,
+1,95,56,98,14,224,227,9,253,34,5,107,217,226,10,5,224,74,9,1,
+49,54,83,194,224,243,39,224,240,3,64,66,133,206,224,239,15,224,237,4,
+192,234,224,226,3,66,135,0,54,227,116,1,65,200,131,115,64,88,226,183,
+1,100,86,162,182,230,132,11,229,22,13,1,50,54,141,18,229,86,4,144,
+140,1,54,55,237,208,0,128,201,224,54,3,88,217,228,147,19,234,49,15,
+224,125,7,173,169,64,96,64,184,228,175,0,224,178,17,1,57,51,160,164,
+179,168,64,41,225,236,9,239,142,4,229,178,5,139,141,244,184,11,190,196,
+64,136,243,51,11,229,162,2,250,145,8,228,155,15,65,88,225,95,8,79,
+195,252,132,14,96,132,222,249,225,178,13,0,51,129,52,230,115,18,238,222,
+4,255,1,4,208,251,224,123,22,65,1,251,70,1,228,167,0,97,61,0,
+56,233,147,7,223,254,96,180,227,191,9,140,226,128,83,133,237,99,34,229,
+31,14,224,186,3,3,119,104,101,114,237,88,0,66,70,236,223,12,0,58,
+96,128,64,87,229,119,4,100,233,96,157,66,1,245,177,5,0,39,67,93,
+0,80,64,14,64,64,99,102,70,171,224,137,1,227,207,1,64,93,198,30,
+235,122,17,228,108,45,224,114,13,64,113,203,177,70,142,64,27,131,239,66,
+184,231,99,3,163,166,1,54,57,128,29,241,110,5,255,136,15,190,226,75,
+23,128,249,64,58,196,47,3,54,55,50,32,64,15,195,134,178,39,0,54,
+163,56,131,27,0,55,227,27,4,229,27,8,231,226,3,227,120,5,160,35,
+0,54,98,14,182,160,64,79,168,58,231,14,3,71,132,236,84,11,173,114,
+167,12,248,83,3,144,171,248,80,11,153,157,0,50,94,48,177,151,161,52,
+236,156,30,96,163,130,185,0,85,236,25,1,255,46,1,255,240,6,98,167,
+233,78,5,146,209,117,59,137,79,160,126,224,39,7,224,38,3,91,95,224,
+38,0,81,220,183,217,0,58,128,21,226,7,3,76,6,233,193,6,164,145,
+191,240,2,32,85,32,224,164,6,65,25,224,48,4,131,221,224,48,0,255,
+197,1,224,161,10,224,37,10,193,39,65,219,229,55,3,78,180,228,170,20,
+76,26,172,38,121,198,224,19,3,96,80,195,10,99,12,97,144,134,227,72,
+69,160,24,96,26,141,131,141,190,221,8,104,177,227,72,0,129,87,96,22,
+162,239,233,7,10,128,139,0,54,86,92,64,40,186,77,65,57,92,121,154,
+76,200,38,66,161,147,76,0,49,103,42,203,39,98,110,157,194,96,24,171,
+74,64,79,227,58,17,229,181,7,2,114,105,118,223,66,225,77,1,111,215,
+118,240,101,167,228,81,5,228,225,3,169,248,164,225,230,82,0,229,63,14,
+70,80,227,129,6,110,107,234,210,11,233,34,6,228,253,13,167,125,164,252,
+0,53,229,22,7,131,254,115,76,230,45,6,0,67,159,151,242,184,0,0,
+54,72,158,99,120,170,222,227,242,1,225,50,7,230,45,2,245,201,12,0,
+53,98,33,230,159,9,149,61,0,80,129,205,182,139,0,53,151,172,162,254,
+96,146,1,57,53,96,132,2,95,49,48,79,2,3,67,32,95,55,65,118,
+2,79,32,35,64,14,241,36,4,64,215,70,229,64,86,107,134,97,62,130,
+65,224,2,0,0,83,160,49,128,214,128,1,64,37,98,52,4,51,54,32,
+95,52,220,68,224,36,6,64,1,126,230,96,0,157,106,145,195,1,66,39,
+125,160,224,5,9,224,114,4,96,15,254,108,2,98,215,165,61,126,111,254,
+109,5,128,38,254,110,2,157,150,254,115,2,203,230,255,107,3,127,178,197,
+122,160,2,160,125,224,119,3,159,204,128,211,72,215,103,113,172,185,0,83,
+65,2,1,50,32,145,106,128,32,1,57,53,118,196,97,128,113,12,2,95,
+55,51,130,40,160,32,0,49,103,44,159,31,172,247,254,229,8,134,13,157,
+162,3,95,54,48,57,129,167,119,40,0,67,65,73,133,246,66,239,96,8,
+96,16,162,246,142,103,5,52,51,55,32,95,56,101,211,0,79,186,248,129,
+254,96,169,252,219,0,64,0,1,95,52,111,33,160,159,64,83,64,45,87,
+72,0,51,79,223,128,131,224,79,2,225,12,4,66,161,247,163,9,18,66,
+97,100,32,71,65,68,84,32,114,101,115,117,108,116,32,116,121,112,162,244,
+224,59,1,0,50,102,21,2,53,54,32,67,77,1,95,56,82,46,1,95,
+51,168,99,0,51,131,145,140,171,225,161,0,195,121,160,0,66,196,197,200,
+80,137,1,49,52,100,114,96,53,131,137,224,160,7,71,244,0,48,227,7,
+0,194,52,146,44,64,142,128,126,99,98,224,217,15,202,132,225,158,0,128,
+57,96,190,96,95,0,49,227,103,2,1,95,49,80,88,160,146,64,174,134,
+38,101,168,96,179,0,64,91,9,0,85,130,254,96,140,1,50,54,68,57,
+198,175,98,166,97,247,195,35,0,95,64,25,96,123,65,163,71,127,96,108,
+121,107,225,90,0,64,186,0,51,144,197,208,77,224,76,5,224,70,8,0,
+75,224,70,3,224,67,17,224,49,4,0,65,224,120,2,96,0,97,212,0,
+55,132,161,65,215,96,113,223,40,224,170,0,224,108,0,224,68,1,192,60,
+150,147,96,58,97,45,0,54,229,239,10,134,207,229,95,3,236,36,13,229,
+92,6,125,248,96,216,224,77,4,97,103,161,53,233,197,8,237,13,5,141,
+33,248,210,16,225,194,1,224,96,4,174,78,192,28,229,213,7,224,26,2,
+196,121,224,11,0,192,8,226,240,1,129,21,203,64,71,198,246,57,7,224,
+176,2,224,10,13,234,232,2,100,200,193,26,193,12,161,98,96,240,132,154,
+224,82,24,224,93,11,101,53,162,107,96,8,192,111,129,131,132,112,64,24,
+241,39,6,224,142,10,65,119,96,15,176,167,96,15,65,7,253,97,9,0,
+54,94,244,67,90,224,19,0,109,62,0,54,70,48,64,6,64,116,225,131,
+9,97,95,64,80,204,78,225,88,11,225,55,1,96,187,248,61,0,0,53,
+181,143,224,31,3,64,5,237,106,11,128,73,226,85,4,224,54,1,77,191,
+75,29,1,32,89,129,53,152,250,166,137,128,181,134,44,229,1,3,201,102,
+237,240,15,226,194,6,136,231,143,214,233,146,2,239,103,19,169,152,233,192,
+5,160,207,166,65,65,58,202,48,224,136,16,97,154,96,7,0,50,106,178,
+64,87,224,49,30,65,182,64,49,219,150,138,101,245,62,2,69,45,160,148,
+0,51,109,75,234,62,5,97,246,0,58,128,79,224,64,2,1,54,50,144,
+159,138,173,98,93,64,36,236,25,0,140,180,181,179,90,156,64,29,181,104,
+202,233,225,93,3,234,252,3,162,28,209,32,227,22,1,161,196,234,240,1,
+104,203,96,8,96,16,234,247,12,67,9,224,117,2,225,49,17,78,59,226,
+154,1,193,220,227,170,22,130,97,66,83,227,143,9,192,69,161,8,224,15,
+0,64,148,239,199,5,224,226,5,232,250,8,241,210,1,129,32,228,145,13,
+128,55,192,42,244,206,18,162,161,64,142,143,60,64,144,240,29,0,0,52,
+112,29,64,25,228,31,7,168,215,228,50,4,64,159,132,20,239,96,8,251,
+95,6,92,152,67,65,135,157,155,92,64,104,194,252,176,134,128,42,0,54,
+72,104,64,29,194,232,65,234,64,15,162,198,224,131,3,66,161,252,155,12,
+98,186,224,157,15,252,155,8,66,75,226,157,3,224,5,8,228,109,2,251,
+188,100,238,5,12,128,13,98,29,224,130,6,86,92,98,64,246,101,0,227,
+53,4,96,60,251,217,28,99,127,192,19,226,40,0,65,84,105,132,5,85,
+32,95,50,48,50,226,86,2,4,101,84,117,112,108,237,156,0,0,67,104,
+183,64,239,65,239,0,90,80,234,0,53,129,144,96,69,242,252,2,250,95,
+1,64,42,129,130,250,201,11,6,108,105,116,101,114,97,108,64,96,240,234,
+13,224,18,5,65,41,240,215,4,131,130,186,240,134,18,111,202,64,36,123,
+140,96,173,128,232,224,34,20,200,123,0,83,173,11,160,112,65,46,224,53,
+15,0,56,197,238,224,145,4,129,104,224,145,20,0,57,161,51,193,55,240,
+235,3,225,55,1,131,188,96,21,64,191,160,21,247,103,5,197,183,103,205,
+229,255,1,91,176,233,146,8,64,229,167,154,224,41,15,0,61,224,41,1,
+64,136,64,111,247,78,5,228,115,5,224,46,1,180,155,108,124,212,155,64,
+66,224,58,16,224,147,1,244,214,0,203,83,64,58,230,216,5,0,53,82,
+84,226,225,24,169,28,0,48,168,83,224,19,0,64,80,65,32,150,191,247,
+22,5,64,48,171,159,228,125,3,67,122,229,107,29,138,204,228,142,14,3,
+83,32,95,53,138,81,0,48,174,91,64,138,214,148,108,240,224,209,0,227,
+239,3,144,78,141,222,66,89,66,142,172,57,253,239,7,128,244,244,160,2,
+194,90,101,139,172,95,2,95,49,48,245,81,0,66,143,69,74,108,14,224,
+126,13,137,76,64,170,231,219,17,225,127,5,128,30,241,212,4,4,102,111,
+114,97,108,99,215,225,228,2,0,55,71,50,199,71,191,85,233,112,3,0,
+79,147,199,160,33,231,249,12,70,175,226,85,3,74,66,232,178,0,114,163,
+64,36,231,137,0,232,178,2,65,158,0,50,155,51,72,187,96,39,251,110,
+0,228,155,11,4,76,73,100,101,110,121,127,225,117,6,133,200,163,226,225,
+166,1,177,143,0,83,129,177,145,148,97,110,96,126,0,50,84,66,64,15,
+96,132,0,67,64,7,98,48,217,214,143,216,160,86,161,168,100,56,144,189,
+3,64,64,64,75,74,215,128,30,161,159,228,12,5,233,190,5,96,52,64,
+36,227,193,6,161,2,91,2,64,29,227,164,0,225,1,11,0,85,225,1,
+48,0,39,70,25,68,149,96,246,224,213,37,131,252,111,50,76,56,154,116,
+226,123,1,102,252,75,228,226,67,0,99,235,116,148,97,74,130,54,224,19,
+2,0,58,154,131,250,192,4,231,191,4,128,145,226,111,4,213,248,76,218,
+250,161,7,244,202,5,236,200,0,64,152,228,90,1,224,39,13,100,6,238,
+240,7,224,42,11,85,62,224,81,9,233,15,4,249,42,2,147,27,249,85,
+2,65,169,148,190,109,44,225,184,0,181,74,0,85,81,102,129,183,65,77,
+84,35,0,49,70,112,0,35,98,164,224,131,0,175,170,129,85,105,126,177,
+134,239,178,8,65,41,199,254,147,182,0,85,96,46,64,111,64,27,0,54,
+96,27,112,220,64,14,198,241,65,129,0,52,175,27,96,12,177,132,155,232,
+0,64,70,252,0,95,91,197,155,235,64,112,193,150,255,40,11,224,5,9,
+225,227,2,0,53,93,23,228,183,6,228,177,4,3,109,111,100,117,168,234,
+216,211,236,31,14,145,190,64,36,174,247,141,150,138,33,230,167,23,234,6,
+0,171,252,233,243,5,236,5,13,96,97,224,96,0,229,23,9,64,57,234,
+142,3,0,48,140,52,106,202,224,26,11,225,5,18,6,112,97,116,116,101,
+114,110,193,6,138,244,224,152,22,224,78,18,0,116,212,229,224,142,1,224,
+190,10,65,208,228,203,6,0,48,129,90,132,203,124,59,64,36,232,141,7,
+144,197,0,49,140,87,64,37,228,203,17,136,113,228,199,19,138,105,87,108,
+68,167,0,83,163,23,101,161,244,247,12,242,234,1,128,47,195,73,224,49,
+7,232,222,5,229,12,0,178,216,218,123,64,176,131,92,224,23,15,129,2,
+233,26,0,102,218,137,26,230,218,10,65,26,230,218,18,0,81,229,217,28,
+192,215,230,206,56,224,211,21,65,235,3,10,65,32,79,226,55,2,2,99,
+97,115,98,55,224,19,4,3,108,97,115,115,224,20,7,3,100,97,116,97,
+224,19,8,4,101,102,97,117,108,96,221,224,22,5,251,154,1,224,23,4,
+0,111,224,17,7,1,101,108,224,125,9,232,208,1,224,21,6,2,101,105,
+103,99,46,224,22,3,1,105,102,224,17,8,3,109,112,111,114,224,146,8,
+0,105,224,57,9,3,110,102,105,120,224,20,12,224,123,8,96,21,0,114,
+224,21,9,4,115,116,97,110,99,224,191,8,1,108,101,224,125,8,228,241,
+1,224,21,3,3,110,101,119,116,163,181,224,22,3,0,111,224,210,8,228,
+42,2,224,22,4,6,114,105,109,105,116,105,118,224,65,8,2,116,104,101,
+224,44,8,224,105,11,252,15,0,181,1,224,0,11,66,53,134,111,78,133,
+0,90,155,88,64,20,0,54,228,33,4,243,18,2,66,136,235,200,7,1,
+46,46,64,102,229,34,6,66,162,136,96,228,103,1,234,100,3,136,183,197,
+185,135,0,64,121,234,115,0,227,112,11,5,83,121,109,79,112,101,97,172,
+238,231,8,67,50,227,131,4,131,67,227,131,0,64,23,231,163,3,110,206,
+233,82,1,128,177,1,67,32,137,81,0,79,147,241,225,58,1,234,185,50,
+99,218,99,242,68,189,163,242,227,243,16,0,53,93,130,227,243,2,233,236,
+25,97,54,235,130,20,228,166,36,104,65,224,169,1,228,123,30,134,119,232,
+129,0,73,226,97,254,66,5,236,129,12,74,121,138,17,118,133,237,68,14,
+182,154,237,113,4,0,67,238,85,4,160,127,134,180,64,36,226,172,1,104,
+242,70,128,1,53,55,105,241,105,228,187,21,225,6,10,211,19,0,85,233,
+213,1,225,213,0,230,148,4,193,129,240,127,5,0,48,239,109,6,72,250,
+194,237,1,53,57,150,42,104,8,230,119,8,134,110,64,29,182,35,92,185,
+226,170,2,1,64,35,127,143,3,95,56,55,52,128,38,238,80,0,225,236,
+12,227,36,49,143,28,231,180,1,227,40,2,129,10,224,23,4,123,175,227,
+65,19,254,27,2,227,97,52,231,63,11,227,84,53,226,204,18,97,96,0,
+54,231,73,8,144,172,224,17,3,1,60,45,224,17,7,133,7,224,17,3,
+136,219,0,79,143,181,77,70,64,238,128,14,232,202,0,193,1,64,119,132,
+252,127,40,78,112,200,37,110,3,64,31,131,229,115,3,236,208,1,147,105,
+236,182,3,161,24,250,108,7,236,112,7,64,81,131,183,0,83,195,248,1,
+49,55,227,134,1,65,76,126,171,76,91,195,129,0,53,96,17,97,53,131,
+34,130,94,64,25,155,221,177,170,1,53,54,158,182,225,11,1,4,101,109,
+112,116,121,230,143,2,96,80,224,96,2,191,53,0,83,96,61,92,139,140,
+193,254,164,0,224,21,1,64,38,192,24,160,147,99,191,97,194,64,122,96,
+158,161,6,0,49,65,217,129,7,224,17,0,171,20,64,17,65,3,228,137,
+0,108,142,98,34,65,12,65,43,96,15,65,130,100,75,64,44,132,104,239,
+77,8,228,146,3,198,212,98,106,192,12,132,246,68,14,132,168,0,90,128,
+190,0,90,161,90,64,7,188,47,108,13,167,146,96,24,167,149,109,39,228,
+97,3,0,55,172,60,112,131,100,111,64,29,238,220,4,0,51,99,206,229,
+146,0,224,9,1,96,192,229,102,0,67,48,97,38,3,57,53,32,95,247,
+75,4,237,132,27,240,62,2,247,132,12,96,107,229,150,0,1,64,85,226,
+20,2,1,40,41,104,58,224,91,18,237,216,3,224,72,18,1,91,93,224,
+72,15,183,179,128,11,182,194,167,73,65,53,0,54,227,114,0,230,129,20,
+166,124,64,49,131,164,241,3,3,96,19,230,230,12,96,52,225,149,8,227,
+146,1,67,2,227,146,2,102,191,64,76,251,42,2,64,68,131,165,227,47,
+5,67,246,96,78,0,54,121,228,0,90,239,255,17,0,67,123,132,239,250,
+3,128,85,130,247,162,138,192,4,226,108,0,226,232,0,231,209,4,1,53,
+55,114,142,224,234,12,130,218,231,209,30,224,88,5,102,115,231,213,4,65,
+39,98,2,238,232,12,96,134,231,240,14,96,85,231,241,4,161,54,189,247,
+2,52,56,51,70,131,0,53,85,213,70,104,102,108,64,38,232,24,9,128,
+243,232,24,4,231,151,3,96,0,64,140,227,152,0,243,254,12,233,126,39,
+243,242,10,233,125,20,100,8,166,23,1,66,39,167,95,165,95,0,53,102,
+4,239,67,2,246,25,1,153,75,101,54,226,110,5,64,90,97,91,229,162,
+8,65,92,65,220,64,5,226,124,1,193,204,192,2,0,66,224,177,0,128,
+237,224,190,2,230,63,3,197,201,230,67,22,224,156,3,226,226,39,0,55,
+243,33,1,234,22,76,234,20,4,234,19,9,81,196,194,24,0,49,92,21,
+1,49,52,115,16,0,80,96,17,0,50,64,80,248,137,7,100,172,64,26,
+2,64,85,32,158,8,128,72,132,1,0,75,66,179,64,14,131,186,1,80,
+32,64,11,202,250,225,173,12,129,34,113,144,160,78,128,40,198,115,225,188,
+5,97,185,192,30,97,184,225,198,77,133,201,97,196,224,22,0,225,184,1,
+194,86,64,220,132,83,129,118,160,23,1,90,32,224,74,1,0,58,128,93,
+2,10,65,32,89,183,96,14,218,24,81,206,99,36,64,54,135,34,64,143,
+96,42,117,63,96,21,161,57,225,55,4,118,6,225,50,1,193,25,193,19,
+128,7,97,255,224,27,0,64,59,118,213,131,83,200,146,232,138,0,186,66,
+192,39,96,125,174,233,102,12,66,152,229,222,8,226,233,12,0,80,225,45,
+6,1,95,49,143,97,138,9,234,24,4,128,39,229,83,1,1,95,50,128,
+27,166,250,64,7,98,156,192,20,225,8,8,225,217,0,192,182,130,12,193,
+229,3,54,32,64,89,125,89,64,104,64,39,66,62,194,88,64,7,0,89,
+233,196,4,67,161,129,30,134,1,128,0,162,80,107,191,224,29,1,104,137,
+97,167,192,37,96,17,195,166,192,143,96,0,91,184,234,251,1,231,79,4,
+64,229,181,17,83,30,161,144,64,21,169,243,134,170,228,213,2,227,32,22,
+227,20,0,229,8,3,96,24,72,84,2,55,32,95,193,240,224,48,5,224,
+45,2,128,21,105,113,224,47,8,234,235,4,131,67,138,212,96,0,64,182,
+245,155,0,0,53,135,80,150,208,113,106,64,5,64,34,131,49,2,35,49,
+48,192,0,68,36,64,40,162,234,64,144,0,80,96,42,64,98,64,77,0,
+51,227,2,14,225,248,6,194,139,97,215,64,16,129,248,163,15,129,58,224,
+225,1,239,185,1,157,8,128,0,0,95,98,141,66,237,96,128,131,143,100,
+198,64,90,99,155,0,73,128,155,131,29,0,85,96,26,130,168,3,85,32,
+75,52,96,113,64,18,240,111,3,193,101,224,13,5,64,103,112,125,96,135,
+160,85,200,242,224,39,1,99,201,65,145,96,20,104,30,101,131,2,49,53,
+52,65,129,161,23,0,52,76,11,96,82,199,142,110,144,160,53,76,55,0,
+52,89,184,227,231,0,227,75,1,128,57,161,64,0,51,136,135,98,136,232,
+34,3,8,65,109,98,105,103,117,111,117,115,159,18,160,46,0,54,72,228,
+226,250,0,0,95,187,30,130,9,64,218,164,245,233,112,2,0,54,96,7,
+0,52,79,88,170,72,224,121,23,4,58,92,49,48,38,224,116,3,224,41,
+16,11,32,32,102,111,117,110,100,58,32,32,32,32,160,48,132,31,224,119,
+0,104,177,97,250,64,16,140,76,169,117,238,8,3,2,69,79,70,238,6,
+4,224,114,7,80,57,0,48,198,42,224,145,21,8,101,120,112,101,99,116,
+101,100,58,160,145,64,252,64,35,73,159,0,53,241,173,1,225,53,1,131,
+28,241,22,8,66,214,224,18,6,64,181,112,114,224,18,1,64,149,130,47,
+224,19,2,66,44,65,133,224,150,1,3,84,82,97,119,161,32,224,24,5,
+160,248,192,24,224,218,19,2,123,45,35,160,210,81,115,65,78,224,246,2,
+2,35,45,125,192,71,224,163,8,141,204,224,162,4,66,127,224,161,6,1,
+73,110,202,145,224,164,8,3,84,66,114,97,150,246,128,27,165,130,225,29,
+6,102,109,224,18,5,102,180,224,121,5,65,125,64,93,67,41,242,209,6,
+102,188,224,23,11,102,7,231,223,0,224,151,1,6,125,32,108,97,121,111,
+117,160,180,225,41,2,224,23,4,128,111,99,42,0,95,107,140,1,54,51,
+153,66,224,25,4,224,20,1,225,225,7,224,195,9,137,138,192,57,0,49,
+68,120,224,76,5,1,49,51,103,64,195,155,161,218,235,123,44,96,0,0,
+58,131,50,232,152,4,1,52,56,237,51,4,0,52,112,186,224,30,2,82,
+24,131,43,1,53,52,95,235,65,85,76,225,128,209,96,4,100,189,64,8,
+64,95,201,35,0,89,105,180,135,3,167,92,136,102,64,83,0,49,192,150,
+234,70,0,234,3,2,161,54,244,39,4,167,213,224,46,30,99,77,96,32,
+160,42,224,39,15,129,89,160,85,224,39,17,157,98,224,206,4,161,200,172,
+171,244,185,3,128,83,70,183,156,168,96,176,127,225,224,39,3,0,52,132,
+62,97,87,70,69,64,29,0,52,85,125,98,21,192,236,224,111,25,224,71,
+0,192,110,96,204,224,110,15,128,230,224,77,5,102,100,72,232,74,254,65,
+246,124,167,1,53,51,128,49,227,165,0,96,52,64,172,202,13,130,33,97,
+206,66,242,2,66,32,95,67,20,153,196,0,49,224,9,0,2,56,51,32,
+160,209,64,32,0,54,80,4,226,144,0,3,95,52,53,49,227,164,7,160,
+168,160,255,144,136,225,150,5,116,183,96,29,150,83,192,29,103,98,110,223,
+225,58,31,141,79,193,58,226,5,12,96,243,224,158,1,3,95,52,52,50,
+97,228,130,96,224,50,35,101,205,226,15,5,224,41,13,119,207,99,82,93,
+117,131,91,171,142,0,53,159,160,224,223,1,151,82,160,251,0,49,104,64,
+108,92,224,245,19,137,245,64,23,193,90,170,141,64,8,128,206,65,147,161,
+102,224,106,0,137,116,98,166,82,51,160,71,228,23,2,194,191,170,117,161,
+162,224,138,19,162,98,130,76,242,39,2,128,210,226,194,1,73,90,226,83,
+7,192,101,128,176,2,95,49,50,224,86,0,230,244,12,4,108,105,110,101,
+32,230,245,0,162,119,1,51,51,76,180,130,119,129,98,173,125,224,211,0,
+76,141,100,236,165,14,0,50,98,253,160,12,0,54,96,57,5,67,32,95,
+56,50,56,224,247,0,129,211,0,52,128,170,129,30,68,101,224,37,0,96,
+102,128,43,197,59,111,202,225,51,32,228,94,29,165,48,225,188,7,97,216,
+0,49,242,238,1,1,79,32,249,41,2,225,203,10,228,139,3,128,153,130,
+233,96,9,162,59,204,203,236,184,0,195,19,133,169,137,102,172,76,139,239,
+228,98,6,160,92,205,225,245,21,0,98,103,96,78,129,14,224,227,6,1,
+64,35,102,170,64,86,103,114,226,138,28,196,69,128,123,224,21,7,1,49,
+53,107,81,250,171,0,230,9,9,96,120,131,247,164,96,224,29,4,144,141,
+96,247,114,58,229,38,4,87,123,234,116,20,17,85,110,114,101,99,111,103,
+110,105,122,101,100,32,105,110,112,117,116,202,124,232,33,5,97,174,195,169,
+140,44,4,95,49,53,50,55,103,113,178,67,65,160,175,99,108,68,64,220,
+66,128,236,70,0,131,201,0,57,224,127,3,19,73,108,108,101,103,97,108,
+32,67,104,97,114,32,108,105,116,101,114,97,108,168,251,128,218,225,89,6,
+162,68,96,102,237,149,0,161,132,96,98,224,162,11,64,6,64,75,129,74,
+224,81,38,225,120,1,226,39,10,225,254,16,97,5,131,245,226,116,0,166,
+92,239,151,4,246,63,1,96,126,227,44,7,254,49,7,96,148,231,9,37,
+163,241,252,17,1,128,0,64,76,131,106,161,40,71,5,82,32,243,8,0,
+224,194,3,2,49,53,52,232,183,3,192,195,224,181,3,89,43,224,181,6,
+224,180,69,224,75,0,64,63,212,151,192,98,143,201,224,32,2,137,63,225,
+162,18,74,56,143,176,68,90,99,147,241,234,1,88,54,231,54,4,148,207,
+199,189,0,85,234,226,1,114,60,64,237,64,105,0,52,90,211,206,170,65,
+76,64,100,0,54,234,253,0,225,79,10,196,229,228,235,0,194,24,195,80,
+224,16,2,233,102,14,225,35,0,224,39,2,0,83,184,249,224,20,1,64,
+1,178,0,224,115,4,129,205,146,7,224,123,2,211,42,232,230,7,201,205,
+228,167,0,0,52,106,208,230,17,2,130,237,0,85,226,246,1,86,40,224,
+238,0,64,0,192,44,96,171,193,104,162,129,226,39,53,65,25,179,141,224,
+201,1,167,214,65,119,192,228,133,46,230,3,1,227,254,2,98,199,130,86,
+0,52,100,188,224,83,2,160,84,228,28,0,160,52,224,174,6,192,194,192,
+179,224,191,32,227,163,6,224,166,2,228,48,14,196,43,128,168,160,181,227,
+111,17,224,95,0,66,149,216,74,232,248,0,134,237,193,21,231,199,2,127,
+187,0,67,64,7,72,141,103,79,240,255,3,1,108,101,110,172,224,18,3,
+3,119,104,101,114,111,115,224,20,3,1,100,111,224,17,7,1,111,102,241,
+56,2,224,177,0,103,184,194,226,128,110,224,50,1,0,105,96,50,152,114,
+88,155,248,113,8,64,46,184,182,143,170,227,44,5,1,49,50,106,245,128,
+32,140,128,224,0,0,225,232,1,99,167,230,8,0,192,36,161,109,65,60,
+147,193,67,250,97,28,170,185,224,15,1,99,43,224,30,4,232,72,8,135,
+183,96,77,0,51,192,77,129,134,205,45,104,200,74,12,132,48,243,169,0,
+228,45,4,130,20,112,206,160,108,0,52,73,135,224,14,0,200,249,235,247,
+7,114,220,164,59,224,27,0,129,109,3,95,52,55,54,141,64,225,119,1,
+1,46,46,241,162,1,227,87,0,224,153,3,170,166,227,220,4,105,136,149,
+161,236,181,3,240,164,0,65,114,128,78,68,171,129,254,246,35,3,130,226,
+147,124,1,48,50,144,111,224,25,1,202,175,175,150,64,18,173,82,233,216,
+9,163,44,75,85,64,6,87,94,99,125,239,179,0,227,55,29,224,171,18,
+66,144,67,214,64,132,68,240,99,248,227,67,0,239,78,29,237,29,8,224,
+230,0,234,218,1,97,91,234,230,7,237,254,14,0,48,200,223,204,22,91,
+91,0,83,105,154,161,25,160,35,192,13,96,137,207,44,248,174,1,226,129,
+5,224,214,10,128,139,224,214,7,204,53,224,214,121,64,137,224,214,26,160,
+151,131,132,239,46,0,224,145,39,161,251,224,152,19,160,139,224,138,18,226,
+198,20,0,51,102,62,1,53,52,96,117,226,187,30,68,103,152,45,137,238,
+227,238,0,64,59,64,64,211,203,162,190,0,57,229,167,2,21,92,51,52,
+38,115,114,99,47,77,105,99,114,111,72,115,47,76,101,120,46,104,115,64,
+21,6,44,51,57,52,58,49,52,174,228,227,227,0,225,211,9,224,11,2,
+205,174,67,11,229,19,6,131,9,137,123,206,240,126,133,1,50,56,82,47,
+0,54,100,10,0,53,109,130,64,0,104,225,233,83,3,97,62,225,197,0,
+133,34,224,107,0,194,132,225,220,1,233,69,11,128,59,225,143,5,96,81,
+65,140,229,159,5,224,84,1,226,47,4,226,32,17,0,64,138,19,161,199,
+72,18,224,217,13,112,1,96,67,224,29,11,130,2,96,158,128,99,228,208,
+9,128,34,2,56,32,67,115,101,2,53,52,48,224,69,8,2,95,49,56,
+64,240,155,175,136,148,224,109,12,224,86,7,193,146,132,222,232,176,4,225,
+25,60,224,220,26,240,25,8,171,39,234,206,0,245,167,21,202,136,226,10,
+18,176,34,131,109,0,51,158,113,225,67,10,224,35,0,225,171,17,224,33,
+28,128,243,0,55,161,173,225,133,12,96,13,192,14,225,174,31,225,59,13,
+2,95,55,50,136,195,155,113,108,251,65,154,0,51,65,137,128,85,99,83,
+132,122,131,76,239,4,4,65,219,241,116,1,133,26,176,7,1,80,32,164,
+211,245,112,0,128,251,109,49,64,23,64,44,84,79,245,144,2,224,33,25,
+64,20,0,85,195,206,234,160,5,98,112,94,120,197,75,130,101,191,89,224,
+79,11,129,14,163,215,96,186,98,15,224,209,2,192,19,92,177,105,64,224,
+152,15,224,32,24,224,185,2,97,60,128,100,65,236,0,57,129,55,224,168,
+19,160,17,224,33,20,97,199,156,3,225,134,19,0,58,128,113,138,99,163,
+56,231,194,2,225,71,0,2,50,54,56,128,93,134,150,225,75,20,160,130,
+225,78,3,192,83,109,16,0,49,109,253,1,85,32,254,65,0,226,65,1,
+130,237,160,118,231,30,1,2,51,50,49,224,48,3,224,100,1,224,145,1,
+225,114,19,225,116,4,224,98,50,65,44,154,79,230,207,1,225,44,11,130,
+116,225,43,48,218,172,224,100,1,225,62,3,224,104,3,68,153,96,86,64,
+70,224,241,11,224,123,40,64,91,236,66,2,224,119,5,129,60,185,52,192,
+98,225,0,0,200,146,99,179,225,221,7,167,229,196,61,142,81,224,43,8,
+101,232,224,221,1,76,54,224,106,1,224,203,33,229,62,0,224,122,114,224,
+50,0,224,98,0,239,213,3,109,20,0,50,233,71,2,24,68,97,116,97,
+46,73,110,116,101,103,114,97,108,46,94,58,32,110,101,103,97,116,105,118,
+101,95,248,1,111,110,222,194,66,129,242,152,0,96,220,226,6,8,128,152,
+192,203,2,95,49,48,234,155,0,224,191,2,160,36,224,179,4,224,36,21,
+98,31,64,126,0,54,96,126,3,85,32,75,50,96,110,64,18,144,47,66,
+27,0,50,67,132,102,44,0,53,87,200,64,28,143,15,229,79,0,225,5,
+1,64,28,142,222,1,80,32,64,11,138,130,96,122,64,14,134,131,70,98,
+1,80,32,127,113,1,64,80,128,24,196,212,96,24,97,78,128,24,85,198,
+224,24,1,96,212,160,24,222,3,64,1,0,89,161,27,226,179,5,224,10,
+0,168,28,86,161,234,158,0,232,53,1,64,22,135,250,118,170,100,55,247,
+60,16,7,109,97,116,99,104,101,100,32,217,230,254,251,1,245,70,0,237,
+34,0,227,117,0,179,108,128,133,232,166,14,232,30,3,224,62,3,128,59,
+202,145,99,179,167,14,233,93,3,192,216,231,177,0,99,22,245,2,7,242,
+217,9,96,93,135,243,183,194,96,56,210,96,245,67,8,131,105,228,77,4,
+224,214,0,185,176,224,34,5,193,110,97,134,225,3,4,248,215,8,213,225,
+224,36,3,129,167,84,100,0,55,244,79,0,160,23,97,243,224,41,1,96,
+14,225,60,1,176,42,192,163,224,82,3,192,18,162,10,224,167,4,224,165,
+11,225,171,9,186,248,224,67,52,233,160,1,224,41,0,224,60,1,224,57,
+21,225,9,0,225,242,2,192,127,225,145,5,224,60,9,183,37,193,254,160,
+64,235,15,5,226,138,0,107,196,226,4,10,130,35,247,148,2,224,16,0,
+128,94,226,124,12,161,184,99,153,0,80,160,30,250,26,5,13,66,97,100,
+32,115,116,114,105,110,103,32,103,97,112,242,127,1,224,80,8,226,194,6,
+89,237,140,151,227,3,6,155,211,245,167,2,226,255,2,100,170,73,63,101,
+118,0,85,107,140,0,35,151,205,245,177,5,235,91,0,96,198,129,99,225,
+151,13,129,210,224,33,18,214,45,224,32,17,131,117,224,99,18,214,11,224,
+133,18,100,15,224,33,20,212,4,224,33,17,224,135,24,84,98,224,67,22,
+176,173,0,83,163,32,242,48,9,0,57,128,169,235,229,1,103,201,64,8,
+189,204,1,53,56,97,219,4,51,32,64,35,54,64,43,68,7,224,18,0,
+2,64,35,57,211,71,143,166,0,80,101,187,0,50,65,67,134,245,223,32,
+65,255,130,5,0,32,128,71,101,59,225,228,4,227,208,1,96,78,167,133,
+0,95,112,16,64,220,64,90,132,56,230,101,2,238,143,6,163,254,162,130,
+226,238,1,224,23,0,1,95,57,64,146,149,115,64,22,98,165,221,194,0,
+79,66,224,230,77,0,64,227,225,199,2,66,156,224,179,8,249,96,1,224,
+118,3,240,180,0,224,111,6,224,99,8,224,98,27,225,22,1,128,86,224,
+35,11,230,25,0,96,81,0,53,142,122,67,53,202,125,160,22,0,56,132,
+9,227,79,1,96,43,0,54,224,21,4,99,132,66,56,224,100,16,96,33,
+97,205,224,32,19,69,34,224,33,22,0,50,224,33,23,228,10,10,224,32,
+5,124,119,224,99,20,249,255,16,132,124,0,54,168,193,0,89,193,176,131,
+70,231,85,5,252,20,8,229,226,8,245,140,2,0,53,131,116,226,140,14,
+96,61,230,99,0,236,5,1,168,87,167,44,161,233,76,239,146,45,128,0,
+230,44,1,160,70,229,149,1,250,247,0,192,221,64,33,224,21,1,96,76,
+0,49,192,12,64,0,67,87,243,126,4,96,175,66,91,99,189,161,30,138,
+128,0,79,178,210,233,139,8,2,78,85,76,102,34,98,58,224,37,16,2,
+83,79,72,128,37,64,154,224,37,17,1,84,88,128,37,66,240,224,37,16,
+0,69,192,37,67,121,224,37,17,1,79,84,128,37,67,92,224,37,17,1,
+78,81,128,37,155,93,224,37,14,2,65,67,75,128,37,65,45,224,37,16,
+1,66,69,161,9,70,94,224,37,17,0,83,128,36,65,96,224,36,16,0,
+72,160,187,71,199,224,36,16,1,76,70,161,82,225,121,20,0,86,160,74,
+98,146,224,37,16,0,70,192,75,225,121,20,1,67,82,160,37,225,121,20,
+1,83,79,160,37,225,121,20,1,83,73,160,37,225,121,20,2,68,76,69,
+160,38,225,122,20,2,68,67,49,160,38,225,123,20,2,68,67,50,160,38,
+225,125,20,2,68,67,51,160,38,225,127,20,1,68,67,151,128,0,35,103,
+132,224,38,16,1,78,65,162,60,77,187,225,15,18,1,89,78,160,38,226,
+252,22,0,66,160,38,225,131,20,1,67,65,192,77,226,254,21,0,77,160,
+37,225,132,20,1,83,85,192,115,225,132,20,2,69,83,67,160,38,225,132,
+20,0,70,163,0,108,218,224,37,16,0,71,192,37,225,130,20,0,82,160,
+37,78,183,224,37,17,0,85,192,37,225,128,21,0,80,160,37,225,127,20,
+0,68,195,228,0,49,96,229,209,168,224,0,19,69,68,143,168,2,95,52,
+56,169,116,70,35,103,62,0,53,66,60,1,95,49,84,77,64,12,143,222,
+158,203,118,255,97,230,2,95,54,48,224,11,0,64,77,143,217,1,62,61,
+79,218,64,43,64,12,96,11,143,215,0,60,96,11,143,202,3,105,99,109,
+112,64,14,64,109,250,132,4,137,251,64,119,105,250,224,20,4,65,39,224,
+20,7,0,57,224,20,12,64,145,224,20,7,0,49,96,167,224,21,9,66,
+99,224,106,8,138,79,224,20,5,0,53,65,243,0,67,108,81,224,106,2,
+119,137,0,49,110,158,0,95,171,59,224,7,53,65,21,144,189,79,50,1,
+73,32,114,166,71,193,183,120,211,156,173,154,3,67,32,61,61,233,77,1,
+135,198,187,9,157,95,238,122,5,200,37,103,162,234,102,0,199,213,96,216,
+252,7,7,226,101,1,3,99,97,115,101,98,102,192,58,141,48,66,53,135,
+176,244,0,0,98,16,68,245,216,83,168,24,145,112,136,201,207,126,232,170,
+0,76,6,3,67,32,60,32,134,133,168,85,136,79,224,234,3,224,28,0,
+128,232,96,229,128,75,201,15,192,250,224,34,1,96,110,224,68,3,204,28,
+224,67,5,225,5,2,226,52,3,192,0,108,123,64,241,114,14,66,101,78,
+165,64,74,154,174,96,81,224,106,91,65,92,0,54,227,57,12,0,54,227,
+15,11,0,49,101,110,227,37,8,68,81,224,63,8,224,41,11,83,179,226,
+249,8,0,49,101,118,226,250,44,64,190,137,191,129,251,0,80,207,71,130,
+35,115,196,96,36,164,159,83,111,203,40,106,30,250,199,5,64,41,132,123,
+64,61,221,172,138,236,130,86,211,241,255,56,5,0,48,130,231,224,77,1,
+130,196,160,41,255,67,16,77,59,234,190,0,124,243,205,9,64,136,132,247,
+65,190,0,50,101,47,206,36,128,14,238,189,1,69,91,143,242,112,185,77,
+17,175,190,224,35,6,0,54,132,160,160,35,171,38,64,105,213,45,254,159,
+2,113,96,224,242,35,227,75,2,224,241,48,133,209,224,181,6,0,52,64,
+89,224,181,0,0,53,64,195,0,58,128,160,224,179,3,225,23,0,226,90,
+4,0,64,224,61,1,224,19,3,178,156,224,222,35,160,165,224,222,51,0,
+48,249,253,0,3,95,54,48,55,173,139,172,231,96,53,118,252,96,173,76,
+198,160,13,67,182,1,53,55,96,134,131,37,172,210,242,52,1,64,90,229,
+31,2,225,61,20,114,24,224,38,10,226,62,13,144,161,226,66,23,248,140,
+6,7,100,105,103,105,116,84,111,73,184,116,97,19,241,35,9,192,16,177,
+45,64,86,244,170,0,224,49,27,96,176,224,49,22,64,39,96,255,97,34,
+0,54,228,38,0,0,80,176,211,151,224,65,233,227,103,5,0,52,68,3,
+226,51,6,114,3,64,45,132,72,111,76,64,75,83,210,247,145,0,230,101,
+0,207,104,64,182,228,230,1,160,172,194,63,96,78,132,109,241,250,5,245,
+47,15,89,42,128,63,95,82,129,135,1,53,48,97,176,160,156,164,50,175,
+227,143,98,210,66,231,148,25,4,83,79,85,82,67,140,142,160,204,195,20,
+65,75,198,124,66,240,3,95,49,57,53,102,77,98,138,160,19,2,54,49,
+50,64,19,148,23,0,95,94,63,247,77,1,64,205,224,174,5,96,89,160,
+210,64,186,249,177,1,87,97,219,75,240,118,1,225,76,0,0,53,97,163,
+245,59,11,232,212,4,85,250,114,245,98,173,246,0,5,15,85,110,99,108,
+111,115,101,100,32,123,45,32,99,111,109,109,219,32,136,114,228,22,5,243,
+124,0,244,92,14,231,108,0,129,248,232,135,0,225,194,13,0,52,129,69,
+196,59,129,15,96,161,246,112,1,240,233,11,224,149,39,192,103,224,148,28,
+138,185,224,149,25,227,97,1,224,150,7,234,19,5,169,128,226,251,11,224,
+46,30,165,160,163,75,224,233,3,224,84,4,129,121,224,177,10,192,158,224,
+26,0,64,24,134,161,224,18,4,216,165,227,147,0,66,137,134,133,0,85,
+137,249,129,18,3,83,32,95,50,109,130,128,185,1,95,52,68,52,128,101,
+225,173,10,0,58,128,89,96,68,193,113,128,50,67,81,242,162,0,131,94,
+0,51,197,217,224,72,4,100,221,64,176,135,87,64,81,166,61,150,21,230,
+59,3,224,156,0,160,100,224,74,5,128,60,230,31,16,229,248,5,152,56,
+105,90,3,95,49,55,57,229,213,2,19,92,51,52,38,108,105,98,47,68,
+97,116,97,47,67,104,97,114,46,104,115,64,19,4,44,49,48,53,58,144,
+155,132,8,215,22,224,128,0,229,155,17,192,109,230,1,0,128,171,0,54,
+229,168,3,97,161,101,168,100,129,222,187,235,162,18,130,78,192,25,236,12,
+4,196,194,235,88,59,224,69,10,129,110,224,69,7,132,202,162,203,141,44,
+224,91,5,229,144,17,4,109,111,100,117,108,237,39,1,237,19,2,162,200,
+235,214,12,135,224,237,238,0,141,41,166,152,236,254,10,96,173,160,88,65,
+101,198,224,150,121,1,64,85,129,123,203,21,0,89,152,167,224,214,0,224,
+13,1,190,245,110,5,1,85,32,232,20,6,6,108,97,121,111,117,116,76,
+144,167,97,0,225,163,9,109,208,246,157,1,224,34,0,228,40,0,225,207,
+8,170,115,228,86,1,197,30,249,54,0,224,58,1,224,56,4,253,20,0,
+128,27,229,22,1,161,25,224,31,6,111,5,206,253,216,252,192,7,64,247,
+199,21,1,52,56,69,43,232,17,2,130,5,200,23,252,142,0,122,105,138,
+25,224,58,5,192,0,224,151,14,192,240,224,150,2,206,175,225,68,0,66,
+98,250,39,4,225,20,1,160,17,193,131,161,22,192,39,192,24,225,47,0,
+154,127,226,168,1,71,121,224,127,1,228,130,3,218,126,96,43,247,208,5,
+224,251,3,68,9,96,252,162,170,225,3,18,96,128,224,51,12,113,60,96,
+117,224,52,4,133,252,192,63,64,22,104,155,227,106,1,128,28,64,24,100,
+118,64,0,251,99,2,231,88,14,130,46,128,48,193,114,226,153,1,252,114,
+3,65,117,120,172,202,1,128,67,129,188,3,95,49,52,51,161,20,164,37,
+192,122,225,22,13,96,35,224,226,9,108,154,96,199,251,194,2,224,237,3,
+129,186,133,15,162,0,249,72,1,231,114,0,129,237,64,192,225,29,2,192,
+159,128,233,224,158,26,160,108,225,185,5,129,237,193,108,64,88,255,7,1,
+224,165,0,224,95,50,128,186,192,95,192,69,128,101,226,94,15,234,198,0,
+64,22,228,50,0,224,97,1,230,13,14,225,77,1,99,103,228,232,1,250,
+231,1,65,239,160,67,225,125,1,129,90,233,95,17,228,247,1,227,222,1,
+234,217,25,192,59,132,109,225,22,6,226,249,3,227,247,1,163,250,224,198,
+0,251,208,6,234,2,13,224,196,1,230,253,18,129,229,224,138,12,139,230,
+195,107,0,48,76,17,224,208,14,128,169,229,18,0,235,160,4,134,46,7,
+32,101,114,114,111,114,32,125,102,52,224,101,2,128,95,133,99,229,105,1,
+224,154,24,228,33,5,161,79,96,43,64,23,163,114,228,136,6,234,172,1,
+194,107,161,177,102,237,97,71,161,103,245,41,0,192,16,130,31,130,59,193,
+116,131,151,224,13,9,226,9,1,5,67,32,95,51,51,48,165,107,193,44,
+224,171,3,131,93,96,249,199,238,230,66,13,161,92,131,20,137,115,64,47,
+225,100,1,5,115,121,110,116,97,120,129,100,225,98,30,72,9,142,99,64,
+139,135,38,168,32,205,191,191,88,192,22,139,76,64,227,1,80,32,124,93,
+169,204,64,145,192,47,67,147,128,46,67,158,2,10,65,32,104,232,64,14,
+138,182,4,85,32,75,32,65,107,156,0,52,68,64,1,10,65,120,187,7,
+52,56,52,32,64,90,32,85,170,16,233,228,4,224,18,6,145,3,224,18,
+4,151,129,232,20,9,65,106,232,6,5,160,105,1,64,85,73,82,0,64,
+64,7,133,119,192,15,224,69,6,139,202,230,62,8,160,45,224,60,1,165,
+188,224,169,6,65,192,224,80,6,181,49,224,18,3,128,142,96,65,224,80,
+7,224,41,6,129,137,160,41,234,63,3,65,75,139,79,108,52,5,75,32,
+64,95,54,50,131,167,96,52,66,122,64,35,202,13,97,168,98,110,161,191,
+138,16,1,73,32,64,11,130,18,191,166,0,80,72,126,138,233,1,95,52,
+124,135,2,90,32,90,67,139,0,52,87,197,0,89,96,73,64,135,233,67,
+1,203,191,230,46,5,224,166,0,130,89,173,74,232,106,0,224,12,0,230,
+230,4,202,149,164,191,192,39,227,101,0,227,162,0,96,8,110,79,0,52,
+83,166,231,45,9,2,95,49,51,200,64,167,237,229,84,3,64,36,67,218,
+99,153,71,139,227,131,0,0,55,141,80,100,108,0,55,91,13,1,52,55,
+99,124,182,220,173,4,173,154,231,198,2,193,14,228,103,6,162,137,199,55,
+204,90,224,7,1,164,70,228,168,1,228,79,0,168,130,64,183,64,60,224,
+33,12,128,27,224,26,6,129,40,160,137,100,114,232,248,0,224,38,13,132,
+106,103,206,164,44,162,106,194,113,184,212,96,12,96,11,248,229,0,134,36,
+98,158,67,226,226,200,2,5,39,32,95,55,52,54,64,125,0,85,193,15,
+225,14,4,161,82,192,31,0,85,68,12,66,103,107,111,77,122,166,188,0,
+51,124,239,224,0,2,225,168,2,225,163,6,87,182,4,95,52,48,55,32,
+229,36,1,10,77,104,115,46,66,117,105,108,116,105,110,133,35,2,49,55,
+49,67,50,85,144,0,50,87,162,225,205,2,224,58,6,5,80,114,101,108,
+117,100,173,190,66,200,133,11,0,75,67,50,64,111,248,180,0,231,154,5,
+233,166,1,0,32,152,190,64,59,0,55,133,24,229,69,0,133,46,64,194,
+160,69,160,44,64,20,0,54,224,20,0,226,161,1,227,46,7,224,13,0,
+232,210,1,160,38,99,27,224,53,4,128,26,1,95,57,119,54,2,95,49,
+52,151,62,170,220,224,5,15,192,74,2,95,49,52,73,206,68,124,192,1,
+228,132,1,65,235,224,21,12,0,50,224,20,7,3,85,32,75,51,224,17,
+4,3,85,32,75,52,224,14,1,64,72,1,75,52,224,13,6,130,79,97,
+76,231,147,2,195,205,224,226,1,224,16,1,160,13,128,8,97,122,99,151,
+225,59,10,192,48,227,18,1,224,27,8,161,149,224,22,0,128,19,65,15,
+0,49,100,46,6,57,54,55,32,95,57,49,95,4,226,166,1,2,95,51,
+53,162,212,1,95,50,65,103,79,112,229,48,9,98,226,240,245,1,224,7,
+29,229,93,10,2,64,95,51,201,15,192,112,230,37,3,3,66,32,95,51,
+136,105,0,48,103,1,224,36,2,0,75,192,36,224,35,1,76,66,224,35,
+6,193,129,141,202,1,95,57,66,9,1,95,57,141,192,162,237,99,140,1,
+54,55,136,96,129,40,118,92,132,87,109,83,224,5,0,170,91,0,54,101,
+73,96,76,192,77,74,161,69,119,1,95,49,151,174,160,154,192,1,2,95,
+49,50,96,52,224,20,4,225,88,11,192,128,97,39,162,0,96,0,96,24,
+237,74,2,224,36,0,128,53,235,154,0,98,239,3,57,32,95,52,134,60,
+230,238,14,190,188,225,171,11,192,11,224,141,1,224,107,2,226,152,1,1,
+95,51,173,74,224,0,3,68,199,164,145,151,158,0,55,97,11,68,19,211,
+58,0,73,64,194,0,83,231,119,6,224,7,13,224,213,2,64,18,134,111,
+130,214,228,68,3,224,2,12,225,57,7,227,85,1,224,44,21,224,45,26,
+224,48,6,224,49,42,238,125,0,0,39,139,84,228,255,1,103,50,160,5,
+192,22,161,149,164,39,135,74,226,69,2,178,160,100,239,231,114,1,224,5,
+3,231,126,4,196,136,224,66,1,0,95,231,218,1,164,31,153,51,96,16,
+65,249,1,53,56,230,195,1,96,81,136,153,97,227,199,44,3,95,54,55,
+56,64,12,75,178,224,22,2,192,239,224,88,3,224,85,9,160,50,229,130,
+3,0,95,222,192,128,0,162,10,224,2,24,227,49,3,225,37,4,192,1,
+225,142,10,225,185,3,224,11,2,97,35,224,68,11,229,113,2,224,33,12,
+224,98,8,224,28,19,224,19,0,227,218,1,224,20,0,224,8,2,1,95,
+54,76,174,96,0,226,7,0,225,201,1,225,30,3,64,15,224,200,3,90,
+203,227,45,1,195,118,240,56,2,174,71,160,42,192,19,129,137,160,179,128,
+85,227,114,10,128,92,160,62,192,195,226,195,3,96,5,193,148,224,57,3,
+162,140,224,25,10,160,2,224,25,17,227,4,1,225,90,3,192,164,64,19,
+227,93,1,225,39,5,96,17,89,61,233,150,7,160,68,96,86,224,80,0,
+229,97,2,224,224,8,69,100,96,26,128,39,0,54,101,11,64,53,203,20,
+228,191,0,64,126,157,214,74,15,0,50,70,108,192,120,128,201,224,28,13,
+67,44,240,168,3,106,185,64,3,234,183,1,130,29,225,241,3,233,74,1,
+224,210,6,160,247,224,128,7,224,215,0,224,236,3,224,218,0,203,36,224,
+249,2,97,150,226,93,14,232,220,1,228,93,2,226,92,255,226,92,45,226,
+90,1,96,0,226,2,14,225,67,3,64,13,226,8,31,0,55,224,165,5,
+96,26,193,4,232,91,4,128,155,192,149,70,48,64,147,248,99,3,64,0,
+96,149,64,106,227,2,13,123,241,224,120,8,224,136,10,96,0,238,131,1,
+160,60,182,92,227,108,17,128,215,128,188,146,191,0,48,155,220,226,241,6,
+231,41,2,160,3,0,89,130,184,162,150,225,79,2,224,90,1,233,29,3,
+98,150,225,178,3,243,136,1,226,249,3,201,68,128,193,197,119,138,70,227,
+145,19,64,84,235,38,10,225,106,2,128,178,64,39,80,232,130,179,233,16,
+1,233,26,3,130,202,192,207,225,41,3,224,97,1,226,84,6,234,46,1,
+224,89,8,163,81,64,250,64,66,65,61,199,177,224,82,4,224,77,16,225,
+208,1,161,173,93,63,224,69,1,224,74,10,160,70,252,154,12,11,110,111,
+116,32,101,120,112,111,114,116,101,100,252,160,0,96,0,74,110,210,53,0,
+82,64,107,108,173,101,106,111,205,3,95,52,51,52,203,32,6,95,52,51,
+55,32,95,52,94,123,225,124,0,64,24,160,7,224,121,12,1,58,32,128,
+111,2,95,51,54,182,143,64,113,0,51,138,224,236,51,8,224,5,6,181,
+64,108,14,201,52,96,3,238,158,11,64,0,64,183,0,57,75,85,160,45,
+97,204,240,102,3,96,4,160,21,224,23,8,224,33,3,129,179,236,16,13,
+162,174,196,2,161,129,162,100,249,235,5,226,142,6,224,21,2,224,160,4,
+224,140,0,96,15,160,135,227,80,9,224,7,15,230,47,23,128,13,224,184,
+0,96,16,171,55,228,194,6,194,190,224,234,1,227,177,0,2,95,55,53,
+81,75,179,103,0,32,236,211,0,224,240,8,224,0,6,225,193,12,144,30,
+225,190,6,211,149,141,254,224,46,3,80,60,255,79,8,64,43,1,57,54,
+77,58,0,49,82,121,224,49,5,240,112,4,96,0,226,27,55,129,60,229,
+16,4,97,121,133,182,0,80,226,44,13,224,62,3,65,165,229,9,5,192,
+39,230,133,5,133,185,1,50,50,121,132,168,217,226,107,30,96,0,224,85,
+28,98,146,226,193,51,226,192,36,162,120,226,133,5,226,126,1,69,136,160,
+13,102,49,229,145,0,230,35,2,98,135,128,24,129,72,139,197,225,120,15,
+64,1,249,228,0,230,152,9,224,142,2,96,10,225,151,1,101,109,225,25,
+7,70,175,64,128,128,20,0,79,128,9,1,95,57,121,168,1,54,52,80,
+255,193,47,1,95,55,255,119,1,96,0,128,81,231,35,44,192,54,232,109,
+1,240,90,5,133,33,128,245,98,152,64,52,224,93,2,126,240,130,167,226,
+78,5,87,157,102,150,149,159,113,154,112,139,217,37,96,199,227,237,1,64,
+0,226,107,12,224,165,26,160,145,113,6,228,65,5,224,79,6,228,82,2,
+224,0,4,228,21,12,229,55,61,99,204,232,210,20,194,41,224,220,9,202,
+204,224,220,12,97,213,224,85,32,160,82,225,114,8,224,0,1,225,27,15,
+103,76,219,226,2,95,52,52,221,253,167,143,0,52,77,45,84,15,100,67,
+3,95,51,53,51,150,115,219,253,1,95,52,73,252,192,49,116,17,224,36,
+1,150,255,163,160,168,207,236,203,0,213,133,234,124,6,201,178,224,40,1,
+160,2,128,186,204,3,160,5,160,21,224,81,0,224,43,4,226,60,3,224,
+24,3,164,213,237,91,6,225,88,0,224,11,1,0,83,74,253,112,8,228,
+88,0,128,34,231,35,17,236,163,3,227,31,2,180,140,160,48,164,87,224,
+13,0,163,193,161,228,224,181,1,237,113,3,192,155,226,1,2,234,185,2,
+160,56,96,43,98,4,128,110,160,0,224,227,0,197,26,229,212,4,64,1,
+96,56,224,38,50,165,49,168,17,164,231,226,192,18,225,38,14,128,204,160,
+108,229,123,0,229,107,4,224,21,8,227,1,5,129,228,0,83,118,54,99,
+17,230,120,9,128,60,225,180,26,210,2,128,48,225,180,5,224,145,2,160,
+12,224,13,14,225,233,5,224,27,0,233,59,1,193,195,116,90,224,184,1,
+224,0,3,237,235,0,224,182,28,192,239,224,129,22,224,171,77,224,170,37,
+209,114,224,128,22,224,170,84,227,216,53,192,83,224,151,13,192,64,224,154,
+5,128,2,227,187,0,228,167,6,163,74,195,109,195,205,109,166,101,157,245,
+170,5,96,92,249,146,0,153,12,249,163,10,224,229,53,217,98,224,229,14,
+242,60,0,224,224,0,228,191,43,101,111,1,49,52,173,228,160,74,137,33,
+192,32,169,41,228,226,10,2,64,95,55,241,196,0,206,249,247,146,7,192,
+217,128,153,252,177,4,70,190,250,89,5,224,99,0,196,65,225,184,0,102,
+68,230,107,5,64,86,192,114,94,38,0,53,161,96,160,67,186,187,1,90,
+32,192,164,98,122,1,95,57,64,28,0,58,122,63,231,39,1,230,196,10,
+235,133,0,64,27,192,21,138,187,182,132,75,114,96,27,135,101,71,235,108,
+207,239,132,26,239,121,19,15,117,110,100,101,102,105,110,101,100,32,109,111,
+100,117,108,101,239,137,8,189,185,99,128,65,1,233,21,1,251,77,5,225,
+61,3,194,94,148,250,0,55,241,148,10,224,43,4,224,41,3,0,95,95,
+186,162,254,128,102,0,80,179,21,229,230,0,128,53,75,94,226,78,3,156,
+70,96,56,97,152,65,116,223,96,224,106,0,225,93,0,224,171,5,249,241,
+0,224,21,5,224,158,3,232,107,13,96,81,193,5,224,58,9,64,163,224,
+200,0,162,63,243,247,2,224,24,3,193,195,0,54,73,192,99,125,132,240,
+129,24,225,215,0,160,220,162,3,130,15,194,9,161,32,224,122,1,0,80,
+203,58,160,25,64,73,99,91,225,43,1,65,37,0,55,209,102,96,219,96,
+136,99,149,64,84,226,85,18,186,79,131,11,226,80,1,146,64,98,68,64,
+92,0,54,96,92,90,137,236,78,11,2,50,48,50,224,58,2,6,116,121,
+81,73,100,101,110,128,60,236,101,1,64,70,156,235,225,129,2,165,106,190,
+87,100,89,67,151,98,11,2,95,53,52,228,39,0,129,191,129,176,97,43,
+227,186,2,227,172,6,128,70,108,70,75,70,226,111,1,193,96,96,137,147,
+6,1,80,32,64,11,0,51,162,95,227,13,0,64,20,203,104,96,145,64,
+172,252,146,8,3,32,95,50,51,64,254,193,249,64,12,142,157,1,95,55,
+74,69,197,175,227,115,6,67,68,96,55,160,0,224,50,18,224,42,7,96,
+0,138,232,64,162,139,217,226,175,9,161,45,96,0,224,29,35,230,92,1,
+128,1,224,41,2,224,18,9,224,82,13,224,21,24,96,99,192,9,130,73,
+1,95,57,76,133,105,12,2,95,49,52,130,252,68,104,5,49,32,95,54,
+55,51,108,178,102,88,64,28,107,157,224,29,16,128,8,0,56,102,21,3,
+95,49,48,49,102,29,195,95,162,57,0,80,228,130,0,224,6,5,227,93,
+2,1,50,56,129,95,141,20,98,155,111,93,72,158,192,201,0,83,164,47,
+224,237,3,132,39,197,240,98,201,67,133,130,43,135,29,226,154,0,1,55,
+55,96,172,224,155,0,64,44,0,55,109,186,224,75,1,96,172,99,251,66,
+216,235,31,2,224,98,0,96,95,232,109,6,224,98,0,224,22,2,224,59,
+0,128,191,129,62,0,57,142,100,104,174,112,16,163,62,64,112,3,95,56,
+50,50,83,65,104,78,97,1,88,167,97,125,77,2,200,152,162,250,104,27,
+137,40,182,34,0,52,88,99,230,176,9,4,79,32,35,57,55,228,206,1,
+0,50,65,191,0,52,141,113,64,132,129,175,103,140,4,52,32,95,54,49,
+110,170,3,49,53,32,95,78,159,4,95,49,56,51,32,235,50,0,224,34,
+18,100,10,1,35,49,65,75,0,58,130,20,214,126,142,75,226,154,1,162,
+209,249,72,1,97,180,0,79,64,185,0,80,64,253,229,16,3,1,45,62,
+132,207,129,155,64,30,1,56,50,102,3,114,2,128,209,135,248,134,210,224,
+66,10,0,61,160,66,225,226,2,71,21,1,52,53,65,101,173,121,224,127,
+6,3,79,32,35,49,65,227,128,95,224,123,0,3,49,52,53,53,128,124,
+64,181,202,34,224,59,2,1,49,50,74,85,224,48,2,96,15,64,48,65,
+99,224,48,10,160,108,3,56,53,57,52,224,109,8,224,233,10,224,193,1,
+224,233,2,64,63,0,54,67,162,128,35,224,230,17,160,31,224,35,1,98,
+59,102,2,224,16,1,97,172,167,148,227,101,3,231,144,1,129,190,138,124,
+99,104,101,64,231,135,4,227,26,3,242,132,3,133,197,131,7,1,49,51,
+97,20,4,67,32,95,52,56,162,129,227,2,9,226,110,28,64,127,244,40,
+4,134,177,224,140,22,99,38,1,53,55,96,5,64,26,73,12,96,146,211,
+158,99,161,66,159,1,95,57,99,34,128,92,99,99,66,31,67,106,96,73,
+66,237,137,43,192,80,99,82,160,6,64,29,136,35,224,29,6,224,12,6,
+168,79,64,7,64,43,65,216,4,95,49,49,48,52,128,65,135,193,160,21,
+0,52,178,62,65,217,1,10,65,226,233,2,10,80,114,105,109,105,116,105,
+118,101,115,46,98,244,64,35,135,101,132,153,224,114,2,224,128,7,128,20,
+64,48,135,129,3,95,54,32,95,75,119,96,238,224,97,12,163,153,130,99,
+65,150,1,54,50,193,159,228,59,14,224,79,21,163,166,224,79,25,97,249,
+161,119,135,139,0,75,69,21,64,14,134,58,134,3,1,55,55,72,160,116,
+207,1,50,49,69,250,121,31,0,57,98,116,162,32,0,48,224,33,0,2,
+49,51,55,234,37,1,224,63,19,1,49,51,104,49,197,209,224,65,0,102,
+192,107,171,156,67,224,65,6,2,49,52,51,132,8,133,118,0,95,95,146,
+160,56,128,201,71,77,133,47,224,120,15,1,52,51,75,168,64,32,224,116,
+0,74,241,0,55,65,37,64,13,0,80,102,18,2,52,52,52,248,93,3,
+160,16,96,42,66,2,0,56,65,130,0,51,195,36,167,99,0,73,104,244,
+234,94,3,116,165,102,156,139,77,99,255,247,186,2,117,140,1,49,52,128,
+71,129,13,235,123,2,224,76,11,1,49,51,166,197,96,31,169,153,96,146,
+0,54,249,125,0,202,41,250,205,0,248,116,9,239,126,20,64,82,255,130,
+5,250,16,11,231,60,4,104,151,129,209,224,0,7,164,6,160,46,226,42,
+1,225,113,1,91,175,193,171,65,159,64,133,65,21,75,229,214,97,224,230,
+0,225,241,3,167,161,2,64,95,50,137,68,130,1,132,67,236,73,5,64,
+167,1,49,56,128,8,64,65,2,49,48,49,143,131,233,101,2,0,83,97,
+113,225,30,2,77,143,64,119,128,13,6,64,67,32,60,32,64,35,128,46,
+173,123,74,4,193,59,192,24,97,152,128,1,224,237,0,3,95,57,53,48,
+74,40,195,194,235,147,1,226,15,1,227,3,4,0,48,165,202,192,73,64,
+233,226,234,4,166,41,135,250,162,96,0,67,65,131,224,99,0,224,165,13,
+208,243,0,85,99,90,236,13,3,224,126,1,108,159,89,131,237,20,3,11,
+112,101,32,115,105,103,110,97,116,117,114,101,136,7,128,151,250,184,4,224,
+215,4,224,209,12,64,41,167,49,224,112,6,0,56,101,168,161,238,224,72,
+2,227,254,5,141,2,225,94,21,225,50,0,226,47,7,224,126,0,1,95,
+53,128,43,225,51,10,128,0,224,54,3,66,83,134,121,224,114,8,1,49,
+48,210,52,69,110,192,50,163,8,163,158,162,15,229,39,6,0,48,74,72,
+227,82,3,162,169,99,39,66,150,71,170,238,232,3,234,142,10,225,158,1,
+24,67,97,110,110,111,116,32,115,97,116,105,115,102,121,32,99,111,110,115,
+116,114,97,105,110,116,241,72,0,106,172,1,56,57,214,105,128,213,0,54,
+141,129,4,32,95,55,57,51,64,4,68,134,139,107,64,29,135,43,227,156,
+11,229,60,4,227,200,2,239,92,6,132,176,1,55,57,230,167,2,27,92,
+51,52,38,115,114,99,47,77,105,99,114,111,72,115,47,84,121,112,101,67,
+104,101,99,107,46,104,115,64,27,7,44,49,51,48,50,58,49,57,207,124,
+0,90,97,55,1,49,56,64,96,65,29,108,254,0,48,238,84,1,204,122,
+226,34,0,166,116,140,88,1,50,52,230,140,1,64,187,198,4,187,129,224,
+172,59,0,56,224,172,0,209,47,96,92,64,6,194,211,133,177,192,0,226,
+67,3,0,49,65,224,96,196,225,68,2,226,50,23,202,35,224,29,4,144,
+118,1,52,49,100,241,1,49,48,76,234,230,188,1,101,129,131,237,225,41,
+3,72,185,0,50,193,31,227,47,12,130,114,0,51,224,75,3,225,116,2,
+1,49,51,96,144,96,189,134,179,64,66,68,55,128,10,0,52,115,102,198,
+38,4,52,52,51,32,95,107,130,224,161,10,224,19,12,230,59,1,64,0,
+66,145,137,167,128,77,0,50,104,208,162,170,209,2,224,139,0,163,217,1,
+50,50,66,210,64,33,137,141,0,83,168,85,224,229,3,163,166,0,90,229,
+16,1,227,228,8,196,31,128,203,229,52,3,225,78,4,226,96,2,131,196,
+0,57,66,133,171,74,160,61,224,95,4,225,212,9,228,236,4,0,48,76,
+204,160,104,224,176,4,203,138,98,89,104,124,235,99,1,64,110,1,95,55,
+73,37,192,0,160,89,1,52,55,64,30,64,4,128,65,1,53,56,181,9,
+65,77,115,7,1,56,48,134,29,129,49,138,18,136,58,239,50,3,165,190,
+187,147,130,137,232,20,0,160,200,160,179,119,115,128,124,75,229,136,155,190,
+64,239,61,4,236,162,0,3,49,52,51,57,91,16,0,55,81,81,94,17,
+64,25,2,54,49,48,172,188,171,3,194,83,64,73,192,92,226,56,4,224,
+76,15,64,215,177,22,0,54,104,6,1,52,51,85,233,96,39,65,112,0,
+48,96,147,160,13,66,110,75,67,100,114,0,48,224,79,0,96,13,108,62,
+224,13,0,126,191,224,13,0,224,81,1,0,58,128,7,170,143,144,235,1,
+48,48,96,179,0,54,101,118,171,143,235,234,15,64,46,160,182,65,234,64,
+182,228,59,1,0,49,144,138,226,172,6,64,138,80,238,1,51,57,128,87,
+166,160,228,74,5,228,108,1,194,128,229,229,5,1,49,53,64,223,199,34,
+228,22,7,2,95,57,54,76,240,0,49,229,133,1,64,159,135,33,194,227,
+100,142,0,51,153,66,1,54,48,147,240,66,158,134,110,75,142,149,185,64,
+22,173,147,64,101,0,57,68,32,74,191,0,54,114,0,0,57,85,70,0,
+49,88,181,211,22,64,47,228,5,0,231,254,12,66,157,104,239,98,165,137,
+2,0,64,195,175,137,212,233,209,6,99,100,224,25,12,99,154,224,25,12,
+242,253,0,233,92,4,96,21,0,85,247,77,0,128,115,128,144,131,25,96,
+9,65,25,205,123,224,67,9,96,115,2,85,32,75,110,102,229,158,0,224,
+43,13,96,185,71,116,129,82,161,160,67,99,224,58,7,230,0,0,224,141,
+1,193,15,224,211,0,233,61,2,224,105,8,224,27,2,204,25,189,12,96,
+46,96,236,193,97,99,254,224,98,0,253,93,13,229,11,0,250,133,1,230,
+156,5,250,249,3,121,23,128,61,134,122,102,186,0,49,236,29,6,235,240,
+4,252,194,7,192,125,130,203,244,89,10,224,96,2,148,89,160,43,131,71,
+160,12,0,50,159,233,88,147,98,189,227,106,3,128,0,233,207,4,180,151,
+106,95,232,134,1,244,140,3,224,119,1,96,95,181,85,224,69,6,0,50,
+108,162,224,69,5,96,130,68,104,181,244,96,135,150,94,128,135,224,9,0,
+225,180,23,130,170,226,28,0,225,131,5,129,110,161,157,226,98,2,225,81,
+2,157,161,193,124,225,203,0,193,182,224,40,1,225,188,16,225,190,4,184,
+166,225,196,12,225,163,1,246,63,18,224,37,5,192,34,0,51,135,102,230,
+191,1,195,157,104,178,87,140,161,246,225,205,1,225,202,39,226,22,19,226,
+127,5,193,230,224,140,4,254,51,2,215,74,111,117,64,15,191,70,96,213,
+227,106,1,111,154,173,106,161,162,222,229,128,251,224,79,0,112,102,224,186,
+3,129,169,230,127,2,96,187,232,32,1,99,248,137,192,99,250,123,39,224,
+0,0,226,138,36,105,194,226,62,9,128,72,237,50,9,107,66,64,1,128,
+245,224,33,8,99,138,224,73,1,241,7,1,170,148,238,84,1,225,110,0,
+110,203,128,174,235,219,1,2,63,63,63,171,182,65,193,136,167,145,114,226,
+160,11,160,0,70,125,202,106,225,209,0,238,132,14,227,60,5,227,14,1,
+227,33,2,229,37,4,64,17,128,33,224,52,3,224,58,4,160,59,229,23,
+1,224,28,4,225,244,0,224,2,8,192,32,128,104,239,163,5,227,245,11,
+160,70,159,223,229,105,10,228,173,11,96,101,160,144,250,11,0,224,236,1,
+118,242,224,160,0,226,143,8,130,117,118,182,227,97,5,240,205,5,228,101,
+2,240,188,1,227,92,2,224,197,8,226,44,5,225,124,3,224,157,4,225,
+69,0,225,138,3,212,129,0,90,131,124,160,6,224,198,3,210,31,128,65,
+226,54,7,240,194,3,250,231,15,2,49,51,56,130,122,250,197,1,131,64,
+83,207,170,121,0,56,212,28,226,210,2,172,83,227,211,5,192,162,126,78,
+229,94,7,229,53,0,64,115,228,225,1,236,203,2,226,44,3,96,11,164,
+60,192,20,96,11,251,214,0,160,168,105,103,186,148,225,50,15,64,4,192,
+154,239,96,40,4,55,52,58,50,53,163,169,64,131,64,190,118,1,101,123,
+225,28,3,1,95,55,110,93,225,118,27,252,63,3,225,123,9,231,156,2,
+65,4,180,98,224,237,31,0,65,224,237,52,0,51,224,237,3,245,183,2,
+227,234,1,226,177,5,227,19,2,226,177,17,64,243,213,199,64,7,128,213,
+166,42,192,38,213,166,70,21,226,84,2,68,242,143,59,236,66,4,247,49,
+4,147,220,192,50,162,162,0,53,97,81,160,104,190,149,246,136,33,79,216,
+160,185,136,186,238,56,0,224,0,0,75,70,0,48,140,65,142,170,160,120,
+108,67,236,68,1,1,52,50,90,207,140,68,96,44,173,255,5,51,54,55,
+32,75,32,75,172,224,1,11,138,165,192,105,127,225,128,62,64,77,3,10,
+65,32,79,131,131,2,95,49,51,108,228,224,14,2,75,147,96,14,91,112,
+96,19,156,203,224,12,0,96,74,97,114,64,78,141,214,130,149,106,154,155,
+137,129,226,230,205,7,243,7,0,214,240,225,134,4,120,28,96,93,225,170,
+7,224,55,7,225,187,4,0,51,252,184,0,224,51,33,0,52,119,61,224,
+51,38,156,227,249,178,9,89,238,113,155,0,73,113,130,164,120,226,10,1,
+97,16,64,93,224,56,0,242,56,4,103,181,235,252,0,224,142,13,0,49,
+209,42,226,168,3,129,84,170,193,230,11,3,231,172,4,231,141,7,160,183,
+224,47,7,192,5,242,61,9,0,49,98,18,224,0,0,226,101,3,247,129,
+5,225,240,5,231,86,5,195,226,249,217,0,105,81,132,222,0,49,251,113,
+3,246,35,17,86,32,7,97,32,99,108,97,115,115,32,182,20,115,219,225,
+147,9,224,166,7,225,38,2,224,28,13,227,45,1,224,54,9,227,73,2,
+64,14,235,230,4,224,2,3,225,9,3,231,200,3,129,3,224,5,0,1,
+95,54,173,156,77,142,116,107,224,32,6,0,80,202,15,64,31,77,192,175,
+107,0,75,68,133,149,138,224,10,13,234,142,10,150,125,254,254,0,225,104,
+1,151,153,1,56,49,97,62,225,98,1,26,115,117,112,101,114,102,108,111,
+117,115,32,105,110,115,116,97,110,99,101,32,98,105,110,100,105,110,103,229,
+212,1,225,12,2,224,1,11,234,79,17,224,56,4,194,121,236,199,0,0,
+39,192,8,233,23,8,64,25,224,110,0,128,55,239,105,6,224,140,4,2,
+95,49,49,113,106,64,0,226,229,6,201,200,224,79,6,128,18,224,93,1,
+128,16,224,13,4,128,10,72,56,96,98,232,195,2,230,112,7,64,0,166,
+183,224,104,4,224,158,2,226,171,6,168,216,224,2,6,192,168,224,30,3,
+226,99,2,114,20,0,66,96,37,109,56,246,230,10,224,253,24,192,89,163,
+137,186,83,224,179,4,165,212,86,251,234,203,2,227,6,6,64,33,1,53,
+57,98,100,225,24,1,168,206,192,78,238,30,4,104,145,98,147,69,187,0,
+66,77,126,224,60,5,77,188,0,48,116,190,0,51,120,97,224,150,3,128,
+52,225,159,1,217,46,224,31,0,0,51,201,24,224,192,3,128,139,224,19,
+3,0,50,84,201,224,19,5,214,234,161,26,196,161,115,238,225,249,2,1,
+49,51,255,75,0,225,250,2,70,33,235,237,4,3,67,32,95,57,67,114,
+163,193,233,12,25,226,111,1,224,23,1,162,252,136,108,226,254,0,136,74,
+64,164,154,80,160,222,233,57,6,233,25,5,128,0,226,154,3,147,106,0,
+52,120,99,228,18,0,103,24,78,115,0,53,226,211,4,70,231,0,54,245,
+34,1,161,26,97,164,229,181,1,0,52,118,164,224,14,0,0,48,176,5,
+129,52,106,127,0,83,73,88,1,51,32,96,147,1,35,54,134,88,64,55,
+128,9,64,100,181,77,73,129,94,240,64,28,0,51,105,37,64,35,96,25,
+134,149,149,124,64,27,1,10,65,234,164,2,68,183,0,34,128,26,137,246,
+187,211,74,50,1,52,48,154,95,64,142,0,52,120,43,154,118,69,134,240,
+78,4,65,216,99,17,75,121,161,4,112,71,129,74,0,95,84,157,128,173,
+233,185,0,64,82,106,34,101,227,88,199,120,154,128,19,64,41,137,182,232,
+36,0,167,244,65,223,244,189,2,232,62,11,130,0,232,61,18,228,32,3,
+252,106,2,192,136,98,43,201,112,162,197,233,116,2,171,77,0,52,65,108,
+228,63,6,224,93,59,160,89,161,221,66,93,139,138,168,115,90,209,84,177,
+67,39,1,50,49,100,55,0,51,74,172,64,54,67,248,195,220,230,191,12,
+190,89,232,52,19,190,88,6,100,101,114,105,118,101,32,254,75,3,0,51,
+162,125,192,181,67,118,111,215,226,250,3,64,178,138,225,0,79,127,33,224,
+97,10,11,68,97,116,97,46,66,111,117,110,100,101,100,192,7,96,103,1,
+95,49,98,111,0,64,224,57,21,3,69,110,117,109,96,4,224,51,0,66,
+151,224,51,21,224,4,0,224,51,0,139,180,224,103,20,3,113,46,69,113,
+224,47,0,65,90,224,47,21,4,73,120,46,73,120,192,47,106,194,224,47,
+21,2,79,114,100,64,3,224,49,0,224,249,25,78,62,3,97,98,108,101,
+224,8,0,224,59,0,67,92,224,59,16,17,84,101,120,116,46,82,101,97,
+100,46,73,110,116,101,114,110,97,108,96,13,224,170,29,96,60,3,83,104,
+111,119,96,4,224,51,0,65,234,229,24,2,65,245,171,211,101,153,66,28,
+101,136,191,119,137,157,3,49,51,57,54,228,120,2,224,80,0,194,80,238,
+177,5,163,236,235,32,3,65,136,132,121,229,245,0,98,136,230,2,7,64,
+44,230,16,3,240,226,2,224,20,7,224,21,7,224,24,1,224,25,11,224,
+28,1,224,29,4,224,83,1,204,17,235,94,9,224,48,10,224,2,3,232,
+188,0,231,76,1,235,49,9,104,182,0,53,241,0,1,224,83,19,224,80,
+2,129,35,224,81,9,83,180,0,54,97,153,99,15,234,213,2,7,104,111,
+119,115,80,114,101,99,234,195,4,224,102,12,200,91,192,103,224,1,1,101,
+184,224,25,12,236,32,0,224,22,14,224,104,11,138,223,241,236,3,224,201,
+4,251,248,3,232,222,0,64,84,1,95,55,125,14,64,64,0,79,98,57,
+1,79,32,123,107,231,215,8,224,220,11,128,2,192,34,224,169,1,205,158,
+244,146,2,64,22,77,47,98,240,67,33,225,165,2,224,230,5,224,234,4,
+224,28,22,224,253,3,128,28,128,114,224,2,0,147,152,224,71,9,225,75,
+8,236,53,9,224,8,18,202,30,64,57,160,231,97,90,130,218,106,45,0,
+85,227,200,2,66,46,4,80,97,114,101,110,194,46,192,113,128,83,139,109,
+128,52,2,79,32,35,91,81,161,123,129,44,0,56,179,210,175,247,192,204,
+194,177,128,140,96,58,72,32,225,182,0,169,218,235,33,0,137,224,225,126,
+5,202,251,1,85,32,210,95,96,118,225,223,4,246,81,5,141,59,225,77,
+2,161,10,64,90,193,6,64,8,226,109,0,64,5,162,36,226,22,2,239,
+225,1,64,9,132,166,128,156,172,123,224,165,0,2,79,32,35,71,93,224,
+215,3,224,253,0,224,250,2,75,63,224,34,6,235,214,1,64,1,176,211,
+128,59,224,119,29,1,54,49,224,83,1,1,85,32,249,241,2,96,113,0,
+49,74,88,192,30,64,61,0,56,76,177,252,120,9,1,85,32,85,0,171,
+25,1,48,54,160,209,0,48,233,22,3,128,10,64,4,225,212,1,128,137,
+0,48,160,193,2,95,50,53,128,126,224,32,2,64,242,226,102,7,2,83,
+116,114,239,90,1,129,236,0,57,175,204,224,57,1,226,161,13,228,208,3,
+226,120,5,224,50,2,65,105,0,54,224,186,0,1,95,56,107,102,138,172,
+173,164,2,49,50,52,130,73,235,254,5,237,12,0,0,95,72,43,65,2,
+71,148,225,2,1,71,33,0,54,170,250,0,83,100,162,2,49,52,49,77,
+175,126,97,233,144,9,64,136,225,67,0,103,59,160,20,225,179,1,69,94,
+137,251,64,92,140,5,100,251,75,199,64,94,74,21,2,53,51,57,128,31,
+140,11,96,120,64,18,65,123,1,32,35,125,35,129,184,75,56,108,140,64,
+44,140,35,0,90,141,68,100,77,98,112,240,168,13,230,250,0,230,247,7,
+227,103,3,134,142,231,73,0,229,51,0,96,249,134,210,161,192,129,248,128,
+112,240,53,20,224,91,5,64,47,154,135,230,210,12,6,116,121,112,101,82,
+101,112,161,255,160,121,239,170,0,0,79,78,221,0,54,226,239,5,132,252,
+224,87,0,130,33,98,151,0,53,136,205,98,8,224,97,1,8,109,107,84,
+121,67,111,110,65,112,192,100,132,28,105,13,224,64,35,224,162,0,210,137,
+226,133,1,64,175,130,238,129,247,224,39,35,1,95,53,66,96,0,53,66,
+179,240,151,1,227,151,0,236,30,4,162,174,142,13,233,208,34,202,205,128,
+150,233,207,35,164,181,226,64,6,225,224,7,64,39,194,45,224,24,1,225,
+246,20,5,99,111,109,112,97,114,139,40,100,196,0,54,83,231,129,150,128,
+66,144,84,197,54,234,70,1,234,80,4,243,80,2,106,0,233,234,0,128,
+5,169,107,128,68,160,74,232,130,8,64,58,114,124,238,50,4,234,85,1,
+98,104,66,223,112,153,232,231,1,237,206,1,101,45,196,140,196,152,64,8,
+227,41,4,226,89,10,1,60,62,233,200,2,160,161,128,73,0,48,146,132,
+224,81,40,225,87,4,64,0,198,5,224,57,24,1,69,81,192,52,246,228,
+0,193,199,193,53,193,50,97,41,227,154,7,224,95,23,1,76,84,232,133,
+4,224,90,14,74,13,160,87,225,144,4,224,93,23,0,71,192,93,160,47,
+138,74,231,3,23,160,37,224,29,5,231,124,2,96,7,96,4,230,84,4,
+163,135,145,49,1,75,50,96,196,245,198,1,130,17,0,57,224,14,3,239,
+211,15,9,87,97,114,110,105,110,103,58,32,99,239,220,10,132,155,147,182,
+4,51,32,95,56,57,130,172,224,77,17,4,32,121,101,116,44,160,60,82,
+35,0,51,70,103,224,183,6,247,89,3,164,110,64,202,145,210,155,219,1,
+52,48,145,154,64,41,183,126,0,58,96,208,128,34,4,66,32,73,79,46,
+87,92,3,111,114,109,73,149,180,131,76,2,55,32,95,73,47,81,66,100,
+225,64,104,96,16,96,62,144,123,228,180,34,175,227,128,204,228,179,124,1,
+61,61,228,174,0,225,155,0,100,187,105,239,158,145,138,122,228,195,3,171,
+165,203,14,228,125,10,236,251,2,64,55,237,8,8,228,138,92,1,38,38,
+228,138,71,193,46,64,0,228,133,32,2,84,114,117,228,188,0,227,188,22,
+227,181,15,129,66,161,96,228,77,0,228,174,6,224,135,23,3,70,97,108,
+115,192,136,128,49,96,5,96,4,228,11,10,82,134,84,13,65,144,2,90,
+32,90,238,138,0,130,18,147,140,0,48,95,134,111,122,98,28,237,31,0,
+108,44,96,10,224,144,0,165,24,129,211,152,62,232,7,4,160,28,228,30,
+3,0,49,99,116,160,218,0,55,68,29,0,54,106,198,1,49,49,182,10,
+4,95,49,56,51,32,149,131,4,64,95,57,52,54,67,26,67,223,247,23,
+3,65,77,99,228,0,89,128,156,5,80,32,95,50,48,50,227,148,2,5,
+102,111,108,100,114,49,233,9,0,142,246,66,175,231,134,0,110,224,224,10,
+2,96,232,192,94,139,11,227,138,0,227,190,10,227,181,4,129,201,100,26,
+67,167,164,176,97,131,64,77,235,57,0,246,130,3,131,114,224,137,11,240,
+30,1,93,189,0,54,85,26,1,49,52,110,156,228,81,73,128,76,228,81,
+24,64,9,245,49,0,96,80,142,15,163,115,98,78,203,230,171,235,197,7,
+231,147,8,96,110,130,63,227,8,0,90,143,74,123,237,81,0,96,214,2,
+54,49,48,162,29,174,90,228,255,30,1,116,111,224,171,42,226,235,4,241,
+253,9,192,120,224,171,8,128,195,195,15,224,183,13,227,152,2,230,231,8,
+230,91,21,224,199,0,130,73,0,51,98,73,4,85,32,75,51,32,131,26,
+101,97,197,103,64,33,235,115,40,247,63,3,64,0,227,18,4,162,108,237,
+108,3,226,119,9,226,96,1,189,183,161,246,224,16,1,224,13,13,203,22,
+160,89,226,186,11,224,47,6,225,134,1,192,54,96,108,244,216,7,96,73,
+198,204,160,93,237,226,1,162,54,227,23,7,0,82,229,151,3,224,23,2,
+224,51,19,2,66,32,82,79,33,69,47,229,118,2,128,5,226,150,9,2,
+109,97,120,97,108,162,152,224,31,9,1,105,110,224,31,2,226,41,5,113,
+158,133,176,194,160,98,154,237,138,1,195,215,101,189,165,151,2,52,56,55,
+79,107,229,67,6,226,171,3,162,53,138,33,129,185,225,142,0,239,173,14,
+225,175,1,160,135,0,50,154,162,254,52,0,128,26,196,195,99,75,78,187,
+185,251,129,154,193,152,226,92,6,147,42,160,12,1,49,51,112,93,160,217,
+198,129,2,95,57,56,105,171,224,17,0,64,39,98,45,70,152,100,16,198,
+145,0,67,80,202,0,54,254,13,0,3,95,50,50,49,102,187,2,57,54,
+57,192,20,64,60,65,96,193,71,93,65,225,28,1,226,93,2,160,117,226,
+220,0,228,34,2,161,114,240,95,8,224,157,5,96,0,65,107,138,194,0,
+85,131,100,195,40,95,206,0,56,224,169,0,225,90,0,1,49,49,68,69,
+164,117,135,68,97,205,147,67,0,57,67,124,128,11,64,229,64,14,160,20,
+224,127,3,192,208,0,58,128,234,96,123,0,90,199,192,64,20,170,241,132,
+49,229,22,1,65,179,0,50,103,152,66,69,160,64,136,62,225,3,3,97,
+0,252,38,7,228,223,0,161,200,252,42,34,224,235,2,224,58,9,245,194,
+4,252,84,6,64,158,0,54,160,202,253,241,73,64,200,134,38,244,36,0,
+253,152,0,140,142,139,101,224,54,1,192,200,1,57,52,174,136,160,22,224,
+81,50,160,77,192,237,136,165,129,98,192,58,222,23,171,251,254,23,5,2,
+51,57,51,97,85,6,57,54,55,32,95,57,49,68,62,64,241,163,10,181,
+147,0,89,105,79,64,113,231,44,11,0,90,97,89,170,43,167,62,0,89,
+231,62,4,64,24,224,57,1,64,1,233,117,0,136,19,226,241,0,64,117,
+248,127,1,224,0,0,64,218,137,50,228,144,0,160,8,228,121,3,228,156,
+15,229,162,1,251,137,0,198,13,224,2,1,96,40,224,76,1,251,201,1,
+224,39,6,251,201,11,224,37,0,124,37,128,29,96,68,224,61,16,160,62,
+224,29,7,96,2,67,232,229,63,6,64,0,229,63,1,229,44,15,249,107,
+1,192,22,224,208,0,135,32,160,218,227,166,2,2,51,54,51,226,138,6,
+237,153,7,229,167,0,128,56,0,57,102,244,97,110,1,49,51,100,70,0,
+67,250,48,2,224,64,2,224,165,2,110,88,224,5,4,163,130,242,230,5,
+229,212,0,96,118,0,53,193,190,225,23,0,248,155,10,64,8,239,93,3,
+225,35,4,64,150,160,57,233,188,21,100,175,120,136,133,1,133,37,0,56,
+241,204,0,238,206,1,225,166,2,230,163,2,163,88,224,100,43,167,119,192,
+95,96,77,163,44,70,156,230,169,1,192,48,249,37,3,192,51,224,243,2,
+224,2,0,172,185,128,160,193,91,224,18,6,194,22,226,204,5,224,60,11,
+233,73,2,226,31,1,221,240,231,205,6,195,205,98,234,193,211,197,119,64,
+39,0,55,98,122,96,249,200,241,64,22,128,215,100,230,150,116,0,95,217,
+133,162,122,225,62,11,160,71,231,163,7,225,120,6,236,20,4,64,107,197,
+15,143,108,201,57,239,103,6,160,105,96,12,229,168,0,225,41,3,224,2,
+6,193,76,224,246,3,225,84,18,252,20,8,225,99,89,168,8,225,99,59,
+225,10,9,227,201,2,230,191,1,237,230,0,225,128,5,0,57,229,154,9,
+227,221,66,64,10,245,138,1,227,236,48,227,237,8,224,12,3,128,166,175,
+120,238,204,3,246,5,15,192,63,171,77,192,69,227,231,8,96,159,82,163,
+232,55,7,228,64,20,228,29,11,226,184,3,192,39,65,123,106,153,143,3,
+64,82,105,44,233,128,1,10,114,101,99,83,101,108,69,114,114,111,114,137,
+125,241,190,6,234,210,6,250,12,0,71,162,0,51,232,125,1,99,83,224,
+40,0,124,192,224,99,1,2,103,101,116,206,92,224,77,3,64,66,142,172,
+224,42,1,6,115,101,116,70,105,101,108,77,1,64,30,140,149,224,30,1,
+13,68,97,116,97,46,82,101,99,111,114,100,115,46,83,224,43,5,139,85,
+224,117,4,224,30,2,65,171,224,74,17,2,72,97,115,224,43,3,139,15,
+163,167,148,74,99,142,0,54,128,30,235,2,1,160,28,128,6,64,26,0,
+54,171,94,230,218,2,225,200,7,227,103,16,64,63,137,208,66,80,74,240,
+93,238,64,21,137,11,78,133,83,148,98,135,162,89,234,191,0,174,35,234,
+191,13,98,130,67,99,128,210,128,156,192,23,224,1,1,233,81,17,230,50,
+8,160,11,192,31,128,85,226,238,1,230,154,3,248,111,2,224,43,2,192,
+5,131,200,2,49,51,56,112,70,253,160,8,163,10,246,87,1,227,85,5,
+228,20,0,96,9,212,189,2,50,54,32,177,118,97,106,150,238,150,232,118,
+252,64,78,1,64,90,150,197,160,6,64,4,160,10,3,95,49,55,57,226,
+39,2,27,92,51,52,38,115,114,99,47,77,105,99,114,111,72,115,47,84,
+121,112,101,67,104,101,99,107,46,104,115,64,27,7,44,49,49,56,53,58,
+50,53,241,62,0,100,220,1,51,56,88,145,237,126,5,192,252,225,112,2,
+141,225,225,30,4,100,37,165,80,192,2,171,41,96,93,161,122,133,192,224,
+5,4,170,213,224,92,0,124,167,229,184,7,224,17,9,234,198,0,192,56,
+225,39,19,224,61,7,235,97,0,215,250,224,21,0,233,238,3,224,247,5,
+234,144,21,160,44,231,19,4,199,16,2,48,52,49,163,21,192,40,192,114,
+229,163,0,235,20,1,174,189,194,66,134,238,239,167,12,230,248,18,224,175,
+3,0,95,99,222,96,117,77,59,0,52,229,196,0,237,47,1,206,114,128,
+253,133,239,162,124,225,78,12,225,85,0,192,201,237,19,4,119,129,128,0,
+225,90,0,178,117,129,97,135,10,128,108,173,116,192,171,139,79,65,5,0,
+50,118,25,99,137,133,253,229,225,3,165,207,226,238,1,7,110,111,77,101,
+116,104,111,100,230,17,2,235,156,0,224,248,22,130,72,226,85,5,160,13,
+224,23,4,191,9,206,31,224,248,10,225,36,12,193,13,163,164,0,51,133,
+150,195,180,2,55,54,50,241,120,4,196,187,224,162,25,232,102,1,226,245,
+18,66,7,251,215,5,101,214,163,149,224,161,6,165,203,199,30,146,57,96,
+5,7,95,57,56,53,32,95,57,55,243,245,4,11,80,114,105,109,105,116,
+105,118,101,115,46,61,191,101,64,62,135,26,64,102,73,41,101,191,229,247,
+1,143,100,233,71,0,242,231,6,224,25,19,96,91,135,87,99,37,64,28,
+1,57,53,96,28,99,119,81,79,68,149,1,51,55,70,178,1,49,54,145,
+198,195,100,1,95,52,64,16,3,95,49,49,51,97,125,64,75,135,119,5,
+95,51,54,55,32,75,114,212,224,1,5,118,71,96,0,224,25,7,128,1,
+230,67,0,224,34,15,224,32,3,224,29,20,1,95,57,168,155,128,152,64,
+191,231,139,0,231,39,0,64,232,254,88,2,133,34,0,85,130,140,133,120,
+230,181,9,65,12,107,97,231,34,16,164,94,96,38,230,197,12,105,229,228,
+188,5,64,162,232,104,1,224,88,6,1,49,48,171,251,128,229,64,90,96,
+56,129,127,96,59,200,133,225,193,2,0,67,225,188,1,100,200,129,188,64,
+44,0,54,225,164,11,250,118,2,225,86,18,225,149,54,224,26,17,224,23,
+14,224,20,11,224,17,8,224,14,5,225,249,3,96,0,64,242,243,27,2,
+103,102,1,48,49,104,19,251,60,8,68,74,0,50,65,221,165,83,225,248,
+2,101,77,0,49,119,59,64,15,77,178,182,3,96,41,224,67,1,103,109,
+243,103,0,65,127,64,107,226,46,10,169,166,224,61,4,64,46,192,59,234,
+57,0,244,9,1,64,43,117,246,74,194,64,43,0,51,138,7,195,146,226,
+218,1,96,155,95,144,70,232,242,76,1,2,95,49,48,151,70,192,121,224,
+225,1,2,95,57,54,227,16,5,225,63,2,202,116,0,89,198,194,197,178,
+169,217,165,13,245,93,5,135,56,224,33,18,0,50,132,134,165,246,224,190,
+4,192,25,0,85,224,219,1,131,53,224,186,1,224,49,5,160,109,181,75,
+64,43,199,183,224,44,11,224,43,1,229,70,1,171,191,229,184,0,64,247,
+197,182,139,49,128,188,232,96,6,232,156,0,0,95,65,230,128,13,98,0,
+96,34,139,104,128,125,225,204,0,96,160,67,148,1,51,50,98,134,243,68,
+0,224,96,33,2,49,51,55,74,84,96,103,233,112,2,224,56,40,96,148,
+233,88,5,129,28,1,95,52,170,49,97,7,198,127,149,221,242,102,1,195,
+118,199,53,0,80,142,88,64,97,0,51,131,98,224,252,24,0,95,98,93,
+128,139,168,18,231,147,0,128,208,160,224,241,22,4,192,178,0,49,71,77,
+160,73,64,0,234,5,1,224,60,0,241,81,9,224,52,5,224,112,2,96,
+48,234,109,6,224,44,4,225,103,3,224,39,1,224,36,5,0,66,96,35,
+224,234,10,0,95,97,122,99,132,186,93,162,206,98,114,65,102,135,138,138,
+56,227,103,0,96,78,0,64,224,113,2,227,79,16,131,216,227,146,19,224,
+197,4,224,33,12,230,195,2,227,51,6,227,52,2,228,149,5,69,10,182,
+38,228,249,3,66,8,0,50,75,210,228,129,4,227,210,4,128,71,0,51,
+64,49,187,219,224,87,7,145,197,96,73,160,17,203,166,228,165,4,225,25,
+0,161,49,224,208,1,253,47,1,233,217,0,160,121,182,142,139,55,64,89,
+128,76,99,62,134,42,249,70,2,1,55,52,66,219,224,127,1,227,115,11,
+129,246,224,205,1,160,34,160,231,224,28,7,225,3,33,96,194,77,30,131,
+47,224,249,3,225,113,5,161,155,238,22,2,148,18,224,91,14,100,118,0,
+67,250,21,5,224,16,11,231,36,7,97,142,66,209,234,182,1,5,102,117,
+110,100,101,112,106,175,0,90,238,197,12,226,24,4,98,157,226,132,3,128,
+8,235,111,14,129,177,224,184,3,76,132,135,123,226,24,1,194,98,224,45,
+11,2,49,51,54,98,188,224,46,10,224,171,9,226,251,11,192,90,129,94,
+225,184,4,224,101,0,96,102,101,84,224,102,10,96,0,226,128,1,231,14,
+14,96,42,227,190,18,202,5,224,159,8,192,24,160,159,224,255,10,225,46,
+15,224,78,12,231,124,2,226,193,3,227,41,5,226,211,0,252,166,2,1,
+95,57,71,49,64,111,128,145,64,9,240,239,1,166,221,224,59,1,228,118,
+2,160,113,231,103,0,227,169,57,225,122,2,129,17,227,137,16,224,201,9,
+64,183,225,211,0,128,108,227,20,6,224,172,134,211,241,224,164,2,224,186,
+1,224,187,9,226,248,6,229,169,2,2,51,53,55,202,49,228,236,0,70,
+153,141,216,128,192,0,80,211,81,96,139,0,32,136,191,0,58,128,133,96,
+36,229,108,1,248,198,6,108,250,71,24,104,36,77,2,1,48,49,64,186,
+1,95,57,202,148,229,51,4,252,54,4,193,80,0,48,182,141,229,126,26,
+227,169,3,225,71,29,96,27,229,106,1,253,139,4,69,4,1,57,52,114,
+171,225,196,4,0,52,64,208,225,125,7,227,139,15,197,115,1,49,48,141,
+149,1,48,51,97,5,231,31,3,224,92,6,165,184,224,92,10,234,93,1,
+228,144,13,160,124,165,233,138,100,224,122,19,96,0,65,199,246,242,3,109,
+84,225,232,7,246,244,1,98,13,227,189,1,224,36,3,0,54,136,204,64,
+99,69,173,160,119,64,25,237,141,1,1,80,32,132,108,0,80,128,24,204,
+102,96,24,100,66,160,24,235,135,1,96,26,225,194,2,224,112,2,202,164,
+0,90,65,10,2,90,32,64,83,30,64,23,208,224,232,156,14,130,229,64,
+40,226,228,3,96,103,144,239,194,94,225,9,7,64,51,71,156,96,51,237,
+14,0,97,136,235,30,2,238,93,4,0,50,140,216,192,98,122,234,160,13,
+111,128,234,83,2,229,118,8,194,248,197,58,192,96,231,156,5,161,245,161,
+238,224,104,5,136,22,227,53,0,224,29,0,238,191,5,224,40,2,236,78,
+4,232,86,0,67,186,78,198,250,28,3,65,221,206,207,82,101,66,90,68,
+75,96,26,5,57,53,32,85,32,65,160,91,232,31,11,97,73,130,117,4,
+95,57,56,54,32,64,14,130,99,117,134,250,66,6,243,35,2,8,67,111,
+110,115,116,114,97,105,110,154,84,64,55,0,54,226,67,3,138,240,130,68,
+74,75,96,25,64,23,66,178,0,85,128,22,130,116,136,130,131,76,170,160,
+97,232,247,99,14,96,233,205,174,212,59,161,141,231,209,7,164,170,167,213,
+224,39,11,226,103,2,231,140,8,224,27,2,131,238,98,222,244,129,1,0,
+83,98,8,225,203,0,147,98,230,68,5,96,177,249,122,5,64,26,1,67,
+32,245,17,28,160,75,233,159,16,224,141,0,228,135,3,78,38,224,15,1,
+148,159,68,157,181,37,0,83,86,187,150,193,181,189,160,75,245,62,10,128,
+98,225,23,8,232,164,2,212,86,169,58,184,134,129,15,232,102,10,160,25,
+254,103,0,225,54,1,128,11,161,81,224,27,0,244,183,0,225,11,0,225,
+87,17,193,88,160,0,224,105,83,128,29,201,78,146,215,0,51,67,45,213,
+222,249,244,0,160,0,244,234,8,96,55,244,196,13,128,126,140,62,0,52,
+165,48,244,200,4,103,59,86,84,244,223,8,166,157,0,90,142,194,236,57,
+5,227,92,0,104,2,0,51,71,77,102,137,111,30,228,22,2,68,60,247,
+195,3,82,201,0,50,64,76,0,80,65,237,250,35,1,226,84,1,255,4,
+7,67,217,230,53,3,252,207,15,195,195,65,136,64,117,0,49,130,191,114,
+14,106,186,97,98,96,228,192,86,241,12,1,224,88,19,225,212,2,243,249,
+13,224,35,5,75,60,140,62,96,22,226,202,0,227,220,1,101,131,145,174,
+65,148,64,67,131,167,70,231,89,140,84,19,195,71,227,139,2,169,63,137,
+0,0,53,209,148,224,211,2,224,69,17,96,238,248,31,1,222,53,192,92,
+210,35,0,95,95,6,3,95,57,54,57,76,0,225,39,1,231,78,1,224,
+56,1,1,66,32,224,52,21,64,214,160,52,248,141,17,66,54,248,141,16,
+1,51,52,102,117,64,75,134,81,98,58,3,75,52,32,90,224,1,0,192,
+221,128,37,166,104,248,179,9,227,139,0,224,1,11,227,227,1,224,34,14,
+224,32,3,224,29,20,224,26,17,224,23,14,224,20,11,246,245,6,64,215,
+0,54,200,246,0,57,73,175,107,111,96,23,135,6,67,207,69,119,65,48,
+0,51,128,24,135,8,74,253,120,115,239,224,4,2,100,102,108,103,98,64,
+39,131,86,228,33,1,228,150,1,99,140,114,241,227,141,4,130,96,247,34,
+16,235,43,24,0,51,85,247,170,176,0,57,238,184,2,132,243,228,53,3,
+0,50,165,29,230,215,1,233,153,2,227,231,0,64,19,166,69,214,53,235,
+75,4,198,167,245,151,0,96,246,131,246,201,225,75,86,236,206,24,96,208,
+248,111,2,64,202,64,8,64,78,243,235,0,201,240,237,33,23,164,217,4,
+95,49,51,51,57,129,176,131,96,231,175,0,233,195,3,64,37,68,112,225,
+29,1,0,58,128,55,224,48,0,231,234,1,240,107,2,232,220,0,228,124,
+1,224,25,1,104,15,226,125,0,232,192,11,231,129,2,224,46,20,0,49,
+181,241,224,47,1,201,28,224,47,14,193,243,224,92,0,134,67,224,47,16,
+198,5,224,198,8,233,169,16,165,122,64,24,232,106,9,224,28,2,239,242,
+2,235,165,20,229,128,2,226,117,0,96,39,225,164,6,171,52,96,26,235,
+23,3,248,237,2,224,32,0,224,152,8,224,231,0,128,31,104,103,224,36,
+0,193,39,96,29,240,149,7,192,119,67,191,64,19,99,185,68,1,231,91,
+1,66,130,2,54,48,55,98,89,121,26,64,33,193,136,98,167,69,96,228,
+34,1,1,36,120,158,175,192,143,197,244,129,176,227,253,4,241,4,5,102,
+202,240,189,8,0,48,213,105,160,67,251,168,7,1,48,54,99,29,178,95,
+226,24,3,174,233,225,128,1,224,252,13,172,165,0,48,232,113,0,128,22,
+224,77,7,226,102,19,250,98,1,225,158,13,224,31,5,97,158,241,24,4,
+225,24,6,143,156,147,159,239,156,6,224,142,1,225,9,7,96,94,224,170,
+2,68,54,64,200,135,227,2,49,50,48,240,90,4,64,131,226,154,3,225,
+19,5,8,66,32,95,56,55,48,32,95,53,70,2,0,53,77,222,0,49,
+232,35,1,0,79,78,84,237,143,1,2,79,32,35,73,254,167,75,231,82,
+1,227,207,5,225,53,11,233,121,6,128,182,224,40,11,237,62,1,224,40,
+8,235,214,5,166,250,225,102,12,226,5,8,225,111,3,160,70,65,38,0,
+51,131,4,1,50,48,72,69,110,218,0,56,97,71,236,139,1,140,88,193,
+108,131,60,160,5,64,3,224,117,1,224,114,6,224,120,9,66,221,165,2,
+128,179,224,183,0,224,67,21,224,73,20,224,74,2,224,76,0,229,0,5,
+234,9,1,202,88,224,51,0,226,83,8,66,70,131,128,224,66,11,194,142,
+236,190,7,226,151,7,129,44,128,168,192,79,229,26,6,192,69,160,66,97,
+72,224,78,0,236,241,4,2,95,49,49,65,156,224,31,0,229,47,5,1,
+56,48,246,105,1,163,47,225,247,4,224,225,6,227,25,0,224,141,5,229,
+168,15,160,44,224,120,23,64,29,235,37,4,225,171,5,0,50,140,207,228,
+107,2,224,48,24,212,145,192,48,227,94,0,227,12,16,134,127,160,26,228,
+115,10,86,112,0,55,172,106,224,77,0,225,130,2,195,186,225,133,0,130,
+75,225,81,2,96,123,228,142,1,192,58,68,247,67,24,235,96,0,192,182,
+173,170,96,221,199,38,72,2,230,59,1,19,98,97,100,32,102,105,110,97,
+108,32,100,111,32,115,116,97,116,101,109,101,177,211,226,95,4,235,146,8,
+160,16,228,34,0,232,122,3,228,138,2,229,198,7,144,200,224,74,5,233,
+217,0,225,128,0,65,127,230,19,0,160,236,192,245,160,2,224,29,3,218,
+211,96,90,96,101,224,8,43,100,142,230,139,2,239,138,1,227,197,7,226,
+171,0,192,66,96,68,135,171,227,125,1,192,15,128,32,238,213,4,109,83,
+0,53,118,222,238,17,5,160,0,128,50,160,125,232,31,9,224,33,4,0,
+67,134,58,192,22,193,33,227,79,2,76,87,225,71,0,174,112,128,164,135,
+177,96,36,139,209,0,57,135,160,1,49,50,137,76,168,142,103,217,128,56,
+66,197,134,138,1,55,51,96,178,224,58,5,97,222,129,204,96,253,192,247,
+117,245,73,86,252,185,2,2,97,105,108,162,103,64,173,2,95,56,50,72,
+233,0,57,75,60,0,64,226,160,3,2,105,110,100,160,38,64,141,231,23,
+0,167,181,224,84,6,2,62,62,61,128,44,233,38,11,0,98,194,214,193,
+32,226,83,0,226,8,5,226,17,13,229,188,1,160,34,225,242,65,225,111,
+0,224,209,12,225,36,0,230,153,9,234,199,4,78,88,0,56,96,112,224,
+79,0,160,0,128,142,243,12,2,196,156,160,2,224,24,1,232,6,4,167,
+220,228,248,11,224,39,4,167,6,229,32,24,165,173,224,130,2,224,211,11,
+225,119,9,96,17,0,66,64,87,64,216,0,50,225,29,3,9,70,114,111,
+109,84,104,101,110,84,111,226,74,2,0,66,177,83,1,39,66,116,236,227,
+55,4,224,125,23,224,119,0,160,72,224,115,18,162,104,224,101,83,160,213,
+224,99,13,225,151,24,233,238,4,225,151,18,237,100,2,224,179,12,192,173,
+64,18,224,169,14,96,167,224,159,4,224,77,2,196,18,227,110,0,232,172,
+4,228,150,0,86,185,165,115,192,124,64,50,144,140,224,144,1,233,132,11,
+96,22,232,27,2,135,107,1,52,50,201,15,128,238,230,162,3,224,17,1,
+225,20,2,97,19,224,14,0,128,1,224,109,0,213,45,160,80,194,148,204,
+77,232,229,6,132,14,1,49,50,112,206,82,10,0,56,187,137,227,244,0,
+160,115,224,216,3,103,162,97,97,244,168,0,193,15,101,127,193,44,177,37,
+96,41,157,48,224,81,5,224,136,1,102,62,96,132,235,98,13,171,97,97,
+217,128,99,213,212,0,50,91,189,224,85,5,64,158,2,95,49,50,116,167,
+224,51,13,154,137,97,152,132,221,128,60,228,121,2,200,212,193,245,231,74,
+14,249,50,6,161,96,169,43,141,94,111,17,225,89,10,97,73,226,11,4,
+0,66,141,87,97,48,1,56,48,203,180,224,44,0,224,159,6,225,240,11,
+194,185,231,84,1,243,126,5,224,164,39,226,243,0,226,50,9,239,138,2,
+205,29,97,187,224,208,0,192,205,110,38,224,202,2,96,0,229,211,1,234,
+75,7,229,177,11,160,46,192,213,192,51,224,48,10,172,64,227,68,0,228,
+114,15,160,145,224,87,5,64,44,96,7,224,41,3,192,243,129,125,229,238,
+1,128,84,235,61,6,97,110,225,42,1,97,166,97,124,65,7,1,56,50,
+172,33,240,198,7,237,232,6,226,120,5,161,205,224,29,0,226,117,8,225,
+209,8,226,164,0,225,218,2,128,138,2,49,48,55,99,143,136,198,67,10,
+80,75,128,123,225,185,2,1,95,53,136,220,224,149,0,236,127,1,96,70,
+227,95,7,226,115,7,237,24,5,208,56,226,237,5,200,2,96,0,225,134,
+4,202,189,225,140,11,245,140,5,229,131,6,229,111,10,224,42,5,165,4,
+235,190,4,122,186,228,190,2,226,235,6,160,17,226,236,3,100,205,0,57,
+223,105,224,213,6,234,225,1,192,30,192,129,192,13,108,143,192,24,249,249,
+10,225,121,0,236,72,13,224,18,4,129,248,160,48,230,56,1,96,2,182,
+154,224,69,4,96,18,224,39,4,224,152,2,198,247,149,222,227,162,6,224,
+2,0,192,157,224,193,1,160,57,225,164,1,248,102,2,224,58,3,224,153,
+0,224,67,27,239,169,2,224,35,3,194,104,247,157,6,224,39,8,129,112,
+224,19,3,238,23,0,238,234,5,225,238,5,160,54,128,137,228,109,2,225,
+59,0,224,135,0,192,196,224,114,8,192,14,96,53,243,234,4,224,245,9,
+224,50,6,64,86,161,123,224,70,3,98,221,224,75,5,231,74,7,224,78,
+4,224,79,80,225,2,6,194,44,0,83,64,72,152,138,158,87,67,30,224,
+237,8,129,66,224,40,9,194,44,64,11,228,116,1,160,0,229,88,16,100,
+193,131,227,237,185,19,8,114,111,109,83,116,114,105,110,103,246,119,0,224,
+219,5,224,95,5,237,50,2,228,193,5,0,49,177,49,192,60,225,185,8,
+223,177,227,105,6,228,159,2,213,115,87,49,173,138,224,0,2,224,88,1,
+226,224,8,227,76,1,224,125,10,224,191,2,229,5,11,226,206,83,226,50,
+0,224,50,16,193,241,225,243,6,86,25,65,236,227,185,1,193,53,64,161,
+162,6,106,4,79,168,4,95,49,51,48,48,80,25,234,210,1,226,23,61,
+6,82,97,116,105,111,110,97,207,217,226,25,153,226,27,10,241,138,2,224,
+39,3,227,183,1,228,235,7,226,34,16,226,35,13,230,116,0,224,131,2,
+229,189,0,224,113,13,192,1,226,47,17,224,56,12,230,36,6,224,121,1,
+224,45,4,0,83,226,75,7,1,49,51,145,219,96,0,237,59,4,224,67,
+36,227,99,1,224,135,2,233,116,7,225,10,8,224,73,11,225,191,0,224,
+56,5,227,4,8,2,49,51,51,226,255,0,228,249,1,227,8,21,1,49,
+53,67,7,251,208,0,135,249,226,87,0,128,49,130,247,0,56,73,90,128,
+48,168,142,0,67,75,217,96,20,128,128,224,108,16,224,58,9,128,0,227,
+113,58,6,73,110,116,101,103,101,114,227,112,150,193,141,79,153,3,75,32,
+95,50,156,133,0,55,64,54,161,16,64,72,252,156,2,0,49,141,42,224,
+171,6,2,95,49,48,127,225,3,95,49,48,56,236,107,1,224,145,2,128,
+173,0,83,167,160,233,39,3,233,33,1,224,228,1,233,27,13,192,29,193,
+199,233,21,9,192,33,129,36,225,33,2,226,210,0,226,70,0,169,252,193,
+30,148,230,226,56,1,0,57,239,50,0,224,119,18,231,245,8,224,119,58,
+0,56,226,134,2,216,149,80,13,248,161,0,64,0,228,190,4,217,206,228,
+204,1,225,59,1,128,50,132,159,137,7,224,28,2,100,7,96,180,67,39,
+141,25,192,197,233,56,1,226,148,9,0,50,99,204,247,147,4,229,79,9,
+128,91,161,54,224,115,1,240,188,4,97,46,231,212,22,238,48,1,225,100,
+5,192,160,225,7,8,227,67,33,227,51,1,227,60,5,226,187,1,192,208,
+241,5,1,241,14,4,254,119,21,224,85,0,225,236,1,1,49,48,114,74,
+224,124,0,160,238,224,104,11,225,115,7,190,181,226,133,1,195,77,128,99,
+229,195,7,226,163,0,0,50,254,10,4,184,19,224,179,2,129,48,2,49,
+49,54,65,211,128,75,85,164,0,80,244,49,0,97,46,0,90,224,53,6,
+1,64,64,228,76,0,1,95,54,78,43,0,48,231,159,5,225,172,9,228,
+14,0,237,131,6,3,32,95,55,53,101,233,241,53,0,192,202,161,100,228,
+62,4,1,95,53,165,207,226,53,4,226,47,5,0,50,79,233,192,50,96,
+127,192,108,224,41,4,2,83,32,73,184,105,130,232,225,48,5,242,169,5,
+0,85,67,186,97,63,208,221,3,64,95,51,56,187,184,233,218,2,226,0,
+5,197,121,96,0,82,227,69,105,0,80,64,7,99,248,192,27,224,153,8,
+97,144,2,48,56,49,212,19,0,52,120,52,225,34,1,225,241,0,241,24,
+4,226,23,1,129,175,164,47,64,160,64,62,240,241,5,185,1,224,182,1,
+98,24,245,21,0,90,153,3,95,49,53,52,64,4,0,54,230,216,3,22,
+116,99,69,120,112,114,58,32,99,97,110,110,111,116,32,104,97,110,100,108,
+101,58,32,134,228,116,212,68,71,103,197,0,51,64,232,102,19,244,216,3,
+224,92,9,2,79,32,35,65,211,130,109,192,55,225,54,0,224,60,3,2,
+58,49,51,81,168,1,10,65,192,67,2,48,56,50,99,84,69,51,64,28,
+0,55,96,28,161,169,230,155,2,144,245,96,21,230,200,2,0,48,87,46,
+176,223,0,56,98,130,129,72,64,73,0,54,128,102,1,57,55,64,23,2,
+50,57,54,128,95,0,53,224,21,5,0,53,128,21,0,52,224,21,3,104,
+111,64,21,0,51,96,21,225,57,1,13,80,114,105,109,105,116,105,118,101,
+115,46,87,111,114,91,58,64,37,0,50,224,81,5,0,55,128,21,0,49,
+192,228,1,48,49,201,3,64,12,0,51,96,12,0,57,64,5,0,50,97,
+32,64,8,0,50,236,45,0,0,95,65,18,0,51,149,241,172,69,128,38,
+64,82,0,48,224,82,6,137,28,1,50,48,128,6,96,68,96,44,74,240,
+201,188,5,57,48,50,32,95,53,98,230,96,37,134,168,224,31,17,100,65,
+224,31,15,68,37,3,49,51,50,56,124,167,149,39,0,57,162,160,128,57,
+162,62,224,223,2,98,178,138,5,102,112,0,56,73,239,224,21,10,130,202,
+224,59,4,160,110,128,230,224,45,1,4,95,49,56,51,32,164,167,2,38,
+48,46,134,23,224,56,5,224,45,13,224,44,31,96,36,192,44,0,58,128,
+37,3,10,65,32,83,224,1,1,2,39,32,95,66,119,208,172,133,252,64,
+9,96,27,176,98,96,5,224,11,3,64,112,0,55,100,174,6,80,32,64,
+85,32,65,32,76,202,250,114,0,229,49,2,0,39,96,36,199,186,64,57,
+1,55,53,132,19,64,51,97,59,0,50,64,65,250,14,1,0,95,74,186,
+224,32,17,96,169,224,38,26,224,34,29,224,244,95,1,49,49,107,160,224,
+245,124,224,246,11,230,226,4,160,17,198,207,224,246,19,224,184,27,224,144,
+27,0,85,128,123,64,106,184,200,70,45,224,232,21,224,51,9,3,49,51,
+49,55,224,53,28,0,90,223,211,224,60,3,1,49,51,224,59,18,136,148,
+226,186,18,227,202,3,233,177,0,224,94,4,226,247,19,224,94,36,67,199,
+134,119,0,66,93,12,128,106,204,182,237,200,3,128,27,98,55,2,49,52,
+51,224,76,0,224,108,18,64,13,192,108,203,248,234,217,2,64,97,226,217,
+0,224,93,2,88,227,224,92,44,225,133,31,128,58,224,185,42,235,54,2,
+194,244,226,90,14,160,98,224,32,25,138,62,225,119,2,64,36,143,151,160,
+199,96,52,91,145,192,52,224,15,11,0,51,75,122,224,85,0,65,211,136,
+46,195,139,193,103,0,89,208,101,129,109,225,225,17,0,49,163,102,65,134,
+128,179,225,48,10,160,24,225,39,5,131,244,65,220,73,157,64,20,125,239,
+96,165,227,81,3,192,85,224,25,17,64,198,0,54,199,218,73,58,102,145,
+1,54,50,74,59,226,193,1,224,125,1,64,47,168,197,224,47,13,96,162,
+224,47,5,136,223,129,5,2,115,101,113,98,154,0,32,96,8,76,37,96,
+34,136,236,0,83,96,165,0,57,190,122,200,98,224,138,5,64,45,136,244,
+4,85,32,90,32,90,130,195,64,20,136,243,2,102,47,32,64,12,136,173,
+65,90,224,33,1,64,88,64,183,0,52,103,217,73,12,137,112,104,5,233,
+31,0,0,49,74,86,224,19,5,0,52,232,241,0,96,18,1,49,54,98,
+112,224,18,7,97,95,224,20,8,0,49,137,115,128,19,233,95,2,232,128,
+2,96,155,132,30,3,85,32,75,52,224,177,3,130,96,165,52,107,91,99,
+19,1,95,54,107,208,64,33,161,187,160,211,0,52,137,186,129,56,0,48,
+106,164,0,51,77,247,72,56,0,67,99,245,64,116,64,71,168,98,112,24,
+224,204,3,76,197,115,125,0,54,128,184,224,43,2,224,39,2,1,38,49,
+136,160,160,25,160,14,64,28,0,52,106,128,64,35,96,206,171,74,128,140,
+1,80,32,128,40,128,162,128,59,192,73,5,64,89,32,66,32,80,160,20,
+230,232,0,224,211,1,68,101,162,198,0,48,129,108,2,51,32,95,238,76,
+1,96,116,130,103,3,105,116,111,102,66,3,64,49,97,26,0,56,74,72,
+65,11,75,223,192,211,64,71,0,56,128,138,151,53,79,227,64,6,66,109,
+0,53,105,160,128,39,0,54,107,7,96,11,64,84,130,122,2,102,62,61,
+96,98,162,115,0,62,96,12,130,115,1,102,60,96,26,64,85,96,13,96,
+12,129,221,3,102,110,101,103,96,14,129,214,1,102,42,96,12,129,193,1,
+102,45,96,12,129,55,1,102,43,96,12,128,207,65,7,225,255,1,237,165,
+0,226,8,3,226,15,1,68,179,3,10,65,32,73,96,63,128,171,128,63,
+239,4,0,64,8,163,117,0,48,128,190,3,85,32,75,50,100,19,64,18,
+128,196,65,138,113,250,0,85,65,206,117,79,96,21,243,109,1,101,64,101,
+159,101,92,224,2,0,97,144,128,114,242,73,6,240,226,1,96,134,224,198,
+0,175,53,224,30,5,239,117,0,83,4,161,1,205,143,69,153,130,51,181,
+193,224,86,19,208,19,224,86,47,130,139,192,218,192,25,128,104,135,84,233,
+142,0,243,64,19,225,56,6,224,32,3,128,105,166,249,224,32,11,140,157,
+224,219,10,192,24,111,174,70,205,2,57,56,51,96,199,85,97,246,193,1,
+0,50,141,38,224,43,2,224,27,11,224,95,10,198,58,224,51,8,239,250,
+0,198,203,243,161,9,224,53,10,178,184,224,25,10,193,164,244,164,1,66,
+116,163,52,239,0,11,2,73,110,116,110,255,96,58,224,36,4,3,68,97,
+116,97,64,30,87,57,4,95,84,121,112,101,192,12,160,47,0,54,224,84,
+17,5,70,108,111,97,116,87,160,39,131,136,241,139,1,134,189,145,144,1,
+95,52,116,235,181,121,64,45,239,193,4,97,83,64,21,239,193,18,2,67,
+104,97,192,145,239,193,4,2,48,54,57,128,21,131,154,194,179,225,156,1,
+98,178,116,3,3,95,49,50,53,103,250,224,26,4,242,199,4,66,14,128,
+22,242,140,2,67,252,128,181,131,235,233,21,0,242,12,2,2,95,49,48,
+134,14,237,21,2,224,90,2,73,113,0,55,83,180,96,14,64,94,1,50,
+54,82,102,97,22,128,14,1,56,32,165,209,70,203,227,30,1,161,80,164,
+40,197,230,185,241,66,66,166,252,160,6,224,249,0,65,26,66,24,128,188,
+160,29,104,243,160,37,128,162,65,24,81,173,0,52,192,140,96,142,241,200,
+1,224,181,1,65,29,162,144,64,10,0,56,97,117,0,56,168,33,2,54,
+55,56,113,211,113,77,96,28,66,11,4,32,67,32,80,32,66,184,0,79,
+178,108,5,90,32,95,56,55,54,224,106,1,0,75,71,31,0,53,98,254,
+224,10,1,64,64,170,39,3,32,83,32,80,64,228,97,81,242,94,4,81,
+63,160,69,225,242,1,0,90,161,120,225,123,5,242,109,8,194,17,245,95,
+4,1,95,55,192,221,225,194,0,224,112,4,0,53,135,101,192,106,196,199,
+148,164,64,48,194,84,197,37,244,40,3,224,149,0,98,135,128,127,67,22,
+121,246,160,67,1,32,95,117,69,96,7,71,89,0,52,149,118,224,15,7,
+212,171,73,117,163,85,243,175,2,227,58,1,12,101,120,105,115,116,101,110,
+116,105,97,108,115,32,84,56,25,97,108,108,111,119,101,100,32,105,110,32,
+112,97,116,116,101,114,110,32,98,105,110,100,105,110,103,251,47,0,227,23,
+14,97,64,135,75,225,58,13,0,57,252,149,1,0,64,74,97,246,184,5,
+224,17,8,65,224,0,54,163,173,0,89,128,109,167,24,172,2,160,5,96,
+18,161,78,65,111,197,100,197,128,227,10,0,229,254,0,69,201,131,96,140,
+172,245,223,16,0,56,64,143,0,56,156,233,252,67,2,2,99,110,83,161,
+12,195,118,225,208,2,225,16,1,225,244,1,195,63,0,55,97,199,227,229,
+5,66,117,217,70,111,146,134,207,96,12,225,15,4,64,93,199,94,231,102,
+2,224,34,3,228,5,0,88,40,192,32,65,135,1,55,56,73,161,131,66,
+237,55,4,1,95,55,67,133,128,49,68,85,160,36,182,134,132,43,97,62,
+109,211,128,197,72,222,192,107,64,104,131,19,164,87,160,6,128,0,64,57,
+67,8,225,176,0,165,16,227,49,2,0,49,193,167,225,192,0,246,36,6,
+66,86,97,146,225,128,4,0,68,226,141,0,160,158,161,203,193,136,131,66,
+116,239,86,207,196,73,225,178,11,249,216,13,248,220,2,225,98,18,240,17,
+0,136,178,200,135,227,244,0,192,246,224,76,1,0,67,64,15,128,72,128,
+14,96,56,96,19,97,141,0,55,193,141,129,130,161,78,197,182,229,190,0,
+226,91,6,224,58,18,228,166,0,225,233,25,225,210,22,227,19,9,64,0,
+64,197,188,151,227,142,0,128,217,67,106,129,72,225,215,2,131,9,0,48,
+188,160,219,214,67,235,136,25,96,76,228,97,4,199,148,99,178,228,123,19,
+103,149,128,25,225,177,2,129,24,160,99,203,249,179,49,230,218,2,70,162,
+224,94,16,227,177,9,228,230,1,224,106,2,0,67,161,100,192,109,136,167,
+160,109,224,255,4,0,50,66,208,224,110,16,197,71,224,95,7,232,97,0,
+64,126,167,57,65,100,0,85,227,219,0,224,102,8,107,120,224,124,15,64,
+19,124,250,224,87,0,137,29,136,70,192,93,193,40,227,180,2,93,248,232,
+8,2,233,75,1,225,84,3,129,148,137,74,192,108,96,18,0,54,140,13,
+160,152,224,88,2,114,56,96,250,104,235,110,64,250,162,3,104,151,141,159,
+2,49,50,54,132,204,225,196,9,192,32,0,55,185,98,97,4,1,10,65,
+112,212,64,167,0,58,128,26,169,161,163,184,66,170,72,134,0,64,193,73,
+228,81,9,226,109,2,113,69,1,49,48,231,90,11,227,232,0,173,18,193,
+19,226,205,4,225,25,3,234,131,12,96,32,98,240,128,137,96,30,225,169,
+0,128,195,233,61,1,134,211,0,49,75,216,64,57,224,168,0,237,132,4,
+0,49,108,13,224,201,4,2,95,57,53,79,132,0,48,130,251,225,232,9,
+65,133,0,48,125,18,5,49,57,53,32,95,51,124,174,224,40,15,251,190,
+0,1,50,52,64,78,234,18,5,0,55,165,126,129,26,229,80,6,100,200,
+66,219,134,97,160,0,64,226,209,166,224,177,1,0,55,94,207,164,107,225,
+145,4,128,87,1,50,54,105,46,163,165,96,43,192,223,193,147,230,139,3,
+0,89,224,247,0,128,1,69,21,192,154,231,46,1,128,33,244,108,3,226,
+21,13,97,179,232,226,0,230,40,0,232,173,4,224,81,3,224,1,1,0,
+67,169,189,224,58,0,133,219,128,2,226,27,2,234,44,2,65,153,193,44,
+162,101,160,46,236,110,4,1,49,53,174,83,192,106,226,17,8,224,140,4,
+226,26,15,225,98,0,231,58,5,230,216,5,234,123,0,224,134,8,0,55,
+79,56,224,69,2,224,162,10,234,12,5,64,0,140,133,65,83,128,194,66,
+16,0,54,98,16,3,85,32,75,51,83,208,1,75,52,182,52,64,26,238,
+88,1,214,38,64,156,224,181,1,247,176,2,225,191,13,65,252,0,50,160,
+168,225,179,3,133,117,227,199,7,224,55,7,160,249,226,68,8,84,72,160,
+24,227,35,3,247,29,0,230,87,2,69,198,192,72,224,49,35,226,166,0,
+131,166,4,54,32,95,51,53,64,123,149,38,238,63,0,227,191,5,225,233,
+7,121,22,224,231,1,129,67,83,219,0,52,101,90,224,208,1,237,29,0,
+218,63,160,4,235,241,10,224,20,0,0,51,133,242,1,66,32,128,78,192,
+21,64,165,64,91,224,163,1,224,0,1,128,126,139,11,158,180,127,147,230,
+50,7,64,255,239,140,0,224,127,7,64,203,1,95,50,96,106,96,59,2,
+95,51,56,64,33,227,215,0,225,167,9,66,72,200,35,225,33,8,140,190,
+226,97,1,225,29,11,100,114,122,1,70,110,0,90,224,149,10,192,17,97,
+182,225,177,6,225,10,13,64,148,136,74,3,95,52,48,55,241,147,7,8,
+83,116,114,105,110,103,46,73,115,128,8,75,23,64,48,176,253,224,48,10,
+2,78,117,109,64,3,192,40,209,16,146,60,165,71,194,118,66,119,3,54,
+32,95,53,168,238,166,14,239,169,1,128,66,212,219,109,167,236,93,3,0,
+80,135,241,0,49,86,162,129,119,236,132,4,227,77,0,163,144,64,52,0,
+95,97,64,224,28,3,164,111,192,26,64,18,167,93,229,39,6,168,5,224,
+95,2,137,119,103,31,103,225,128,76,134,106,238,169,1,224,15,3,192,211,
+82,46,114,61,3,54,53,32,95,144,196,65,190,96,230,169,30,169,36,130,
+3,231,107,5,148,240,129,74,233,190,7,228,146,1,228,67,2,226,190,1,
+0,48,86,238,166,76,99,248,1,49,48,142,53,224,78,13,64,151,248,204,
+1,1,83,32,101,52,246,53,0,129,58,161,50,239,25,8,128,22,224,182,
+2,228,108,0,1,49,50,84,45,130,247,0,57,200,167,234,173,3,104,112,
+1,50,54,67,121,133,39,64,13,121,224,224,206,1,66,218,109,188,174,54,
+0,54,213,86,74,63,0,56,227,207,1,67,221,0,52,226,84,5,178,128,
+225,234,2,64,8,238,252,7,64,7,192,133,193,182,0,54,129,182,76,212,
+3,95,55,51,49,129,184,204,89,82,40,224,66,11,0,48,95,151,128,63,
+227,252,0,1,49,49,113,78,1,49,48,70,88,64,25,131,129,155,27,169,
+15,100,191,128,55,131,110,67,239,0,90,75,143,128,20,244,107,1,224,111,
+3,152,36,107,5,138,131,110,60,176,154,231,90,1,193,190,225,182,0,200,
+31,128,30,161,23,193,219,194,146,178,5,0,56,167,51,227,34,0,97,163,
+242,86,1,243,202,4,135,45,77,246,107,1,193,132,128,95,64,48,164,21,
+229,116,3,98,243,160,57,169,141,244,229,10,224,157,1,224,60,2,230,191,
+1,98,55,228,106,0,107,124,216,42,224,58,3,171,220,244,124,3,227,68,
+12,75,83,128,225,100,203,161,68,224,182,4,1,53,55,221,235,225,67,2,
+160,222,160,102,66,154,229,129,6,244,141,5,0,58,139,186,3,10,65,32,
+75,227,64,6,166,39,135,169,225,122,1,225,25,3,0,50,92,188,163,110,
+0,49,133,86,134,166,224,165,0,160,141,233,33,5,64,81,233,33,6,64,
+134,196,145,0,89,255,131,0,161,224,176,128,228,8,0,182,21,161,18,66,
+104,184,82,163,219,225,197,0,224,40,15,94,5,224,212,4,144,241,224,34,
+4,103,30,207,191,165,33,233,120,6,77,208,2,55,32,95,141,187,161,195,
+231,76,0,72,130,128,26,231,81,2,237,4,0,129,160,100,61,244,212,9,
+97,211,230,231,1,17,116,111,111,32,109,97,110,121,32,97,114,103,117,109,
+101,110,116,115,243,175,1,224,63,16,224,62,5,2,102,101,119,224,61,7,
+1,95,57,162,213,131,19,227,158,6,161,33,96,255,163,65,224,37,10,161,
+112,224,37,8,161,122,225,160,9,250,164,16,224,25,0,98,236,224,111,16,
+224,36,1,229,190,2,236,73,4,100,14,0,53,82,60,159,184,104,194,160,
+56,227,50,4,128,73,94,240,131,247,68,172,226,53,1,224,186,8,128,233,
+224,32,18,171,26,224,33,18,173,19,225,109,11,192,25,96,253,225,111,18,
+128,99,225,111,5,229,90,8,238,255,1,215,182,250,28,5,229,131,6,224,
+77,3,224,192,21,252,131,0,224,32,15,199,218,224,105,8,192,24,224,105,
+0,224,35,10,246,54,2,244,24,1,224,181,29,124,15,228,210,0,64,46,
+64,45,3,95,51,51,48,169,237,96,52,227,135,8,227,63,15,65,64,227,
+63,1,2,66,97,100,216,60,213,166,68,173,136,167,135,89,66,88,135,88,
+69,178,196,196,166,79,239,165,0,161,53,224,23,2,161,64,130,125,162,131,
+225,97,0,199,60,234,78,0,228,199,0,161,0,224,16,1,226,165,6,229,
+42,3,224,46,20,197,48,233,99,3,175,213,224,47,12,239,213,0,64,173,
+64,29,160,46,224,40,9,195,169,228,88,20,97,168,234,57,6,180,203,64,
+1,230,34,5,224,75,1,96,120,168,122,93,94,227,207,1,128,137,250,172,
+0,231,232,8,243,233,4,160,103,169,144,235,231,2,231,135,7,243,27,2,
+225,24,2,136,80,224,147,2,244,92,0,232,245,1,251,15,4,107,4,70,
+47,231,143,1,225,68,0,224,111,2,138,126,66,78,72,63,97,45,225,21,
+42,1,57,51,255,125,0,128,0,224,236,4,64,1,251,240,12,252,97,2,
+224,234,2,192,236,224,16,0,133,161,161,97,129,50,224,75,6,224,45,3,
+193,41,236,222,3,204,228,233,133,4,192,56,225,23,0,225,88,3,245,187,
+2,252,101,6,227,41,0,195,248,130,104,104,101,228,24,4,96,36,165,11,
+104,178,0,48,255,165,0,192,0,192,179,226,123,31,240,173,0,128,0,241,
+102,0,227,119,22,231,121,3,192,29,230,84,12,229,81,16,224,25,0,0,
+85,230,182,7,128,224,234,43,6,226,249,3,224,36,1,235,202,1,227,51,
+3,225,66,1,69,146,225,66,14,161,206,181,224,73,243,1,49,48,74,72,
+65,159,0,52,88,163,136,95,236,187,2,224,0,2,224,121,3,128,7,133,
+19,227,118,4,2,48,54,49,142,69,113,253,224,70,4,0,80,64,38,226,
+170,4,224,87,1,225,41,9,244,51,2,192,230,227,116,6,77,24,203,19,
+131,117,238,168,1,227,227,4,97,86,227,212,4,169,236,86,38,224,142,0,
+151,16,224,154,1,160,56,224,150,5,247,94,11,224,10,4,230,248,14,224,
+199,6,235,175,1,236,109,0,224,175,22,166,79,228,142,7,3,66,32,95,
+57,89,227,64,249,129,102,225,147,8,64,13,0,54,250,57,4,96,228,0,
+67,64,21,0,49,196,161,242,179,6,227,54,5,130,237,77,27,183,87,128,
+6,64,124,0,53,97,124,1,53,51,193,117,224,0,3,130,224,231,16,2,
+227,97,3,160,119,224,25,1,232,173,4,224,199,0,96,135,128,43,253,35,
+1,236,32,15,246,74,0,128,176,241,122,3,128,32,96,222,132,216,64,32,
+193,143,227,117,4,69,255,64,11,64,215,1,56,50,64,82,248,70,5,0,
+53,225,208,2,161,247,224,170,8,135,141,192,22,160,25,224,241,0,225,218,
+4,225,219,2,128,227,230,112,8,96,50,1,49,48,117,148,99,178,0,56,
+81,60,0,95,248,206,1,225,187,2,140,235,150,48,78,78,65,167,80,46,
+201,190,192,17,0,75,234,174,1,1,95,53,81,47,64,18,150,199,64,0,
+130,25,192,0,226,212,10,233,245,12,133,71,226,194,1,160,252,225,46,3,
+225,178,8,224,102,0,230,150,4,232,158,14,160,116,224,141,8,192,24,204,
+96,228,145,5,2,50,51,53,228,115,6,225,186,2,193,172,224,178,1,1,
+64,85,229,78,5,138,131,114,83,0,85,114,75,246,7,1,244,217,6,5,
+110,101,103,97,116,101,202,109,192,92,232,206,8,194,65,224,133,6,239,48,
+0,232,214,1,225,77,0,231,75,4,232,229,18,225,102,3,160,90,224,134,
+3,249,203,8,228,36,2,228,252,10,224,71,7,228,22,2,231,220,6,227,
+163,9,227,172,1,229,120,25,224,112,8,240,101,6,228,143,5,227,78,8,
+130,96,129,103,224,38,0,251,202,3,251,210,0,2,95,54,52,228,94,0,
+224,0,1,128,69,96,228,225,119,1,226,20,1,67,32,98,96,231,175,5,
+2,83,32,95,178,224,226,183,0,233,22,10,225,255,12,233,174,3,192,122,
+224,226,6,233,44,6,245,85,0,225,1,3,233,53,7,4,64,95,56,57,
+56,160,89,3,80,32,95,56,125,52,254,16,0,224,105,0,233,69,14,225,
+117,4,83,131,247,43,7,224,137,0,242,206,6,224,205,7,231,11,4,192,
+48,239,234,4,64,182,143,182,96,199,224,197,1,183,13,100,84,83,59,240,
+48,2,224,36,6,123,125,241,161,9,192,0,225,9,5,0,51,85,81,2,
+95,52,52,236,113,0,128,166,232,75,6,0,50,160,232,224,195,6,128,197,
+224,126,5,64,44,0,50,99,48,1,52,32,238,114,2,3,98,105,110,100,
+227,253,0,224,70,6,201,55,96,118,254,55,5,67,196,196,193,224,53,2,
+208,35,227,94,3,228,219,6,224,35,2,160,33,118,235,129,12,64,14,249,
+243,5,0,67,249,2,1,224,162,0,130,123,228,27,1,225,17,3,0,49,
+183,164,192,150,235,93,7,227,39,0,231,102,0,67,117,133,129,245,201,6,
+64,98,131,125,106,19,161,35,225,38,5,228,94,8,128,252,224,240,5,113,
+247,70,18,96,249,66,67,227,250,1,227,56,10,226,234,9,224,196,4,129,
+50,129,130,245,93,2,192,150,224,43,12,185,65,224,0,5,227,229,10,100,
+0,123,124,227,87,25,96,94,107,53,0,50,122,2,64,52,0,51,124,38,
+88,207,69,150,244,24,2,5,99,80,97,116,58,32,130,104,66,73,100,221,
+115,64,0,51,67,245,104,177,241,18,2,224,76,10,2,79,32,35,68,210,
+135,183,192,55,255,100,6,168,151,174,146,106,67,65,190,97,198,0,53,104,
+165,1,52,48,226,253,4,1,61,61,162,251,224,34,17,2,84,114,117,231,
+30,1,224,163,4,81,131,153,33,67,85,0,51,195,214,97,13,64,27,153,
+18,1,80,32,64,11,0,51,185,4,0,65,128,26,152,245,101,31,229,25,
+11,98,194,225,200,3,72,233,92,67,129,126,64,65,153,34,77,9,0,51,
+236,77,0,242,25,0,249,33,1,226,225,0,226,54,3,0,48,64,190,130,
+122,226,173,10,192,40,131,39,130,101,1,64,95,159,94,64,133,228,191,7,
+0,58,103,24,128,234,64,143,229,90,0,224,192,2,64,35,151,115,128,145,
+227,250,1,99,12,224,156,8,224,16,4,192,64,147,6,90,139,245,63,21,
+173,133,224,33,19,130,55,128,252,245,64,13,204,151,96,25,167,94,224,30,
+2,247,178,1,90,212,231,249,4,229,253,9,96,75,137,161,66,215,254,35,
+1,146,80,250,21,0,228,42,3,243,5,2,224,57,11,130,225,224,57,1,
+224,93,13,64,120,224,93,4,229,119,4,225,18,5,199,12,128,32,224,29,
+7,108,165,224,217,8,128,22,0,85,64,40,98,193,224,125,2,99,124,137,
+53,79,155,237,124,1,0,54,237,213,3,0,48,233,189,1,225,76,13,224,
+215,1,99,95,64,111,224,102,3,92,130,225,8,4,1,95,50,128,27,237,
+218,0,226,5,18,204,15,128,31,224,28,6,96,128,225,11,12,96,200,239,
+99,13,96,195,232,2,13,103,199,0,85,225,161,4,1,95,54,238,138,6,
+237,179,5,225,181,0,96,56,224,16,2,130,146,226,39,4,64,62,224,92,
+6,109,33,224,82,16,233,145,1,237,30,13,225,136,8,226,27,18,225,41,
+16,100,50,227,14,9,129,9,225,215,23,0,55,155,186,193,215,224,199,1,
+226,234,10,139,56,225,49,3,224,95,23,139,84,224,94,1,224,60,2,226,
+136,13,96,63,230,236,29,9,100,115,69,70,105,101,108,100,115,32,186,254,
+230,172,4,68,201,0,54,254,223,0,1,80,32,163,68,0,80,101,185,66,
+204,160,25,253,31,8,0,57,82,243,64,0,193,81,237,93,2,232,64,2,
+64,202,107,89,64,35,229,216,1,161,14,253,29,2,0,57,95,123,232,90,
+5,96,130,255,201,0,253,114,1,131,183,145,177,0,51,65,56,64,39,134,
+210,129,100,115,143,128,138,137,42,96,124,2,49,50,52,104,53,225,40,15,
+3,101,110,117,109,248,231,2,0,52,135,21,96,58,103,132,160,57,96,4,
+0,50,74,110,2,79,32,35,65,59,136,3,64,49,135,5,193,72,99,99,
+161,72,135,2,0,67,134,44,227,227,14,134,40,224,26,12,151,233,226,213,
+13,226,240,0,229,229,13,155,230,97,245,114,119,231,48,1,103,73,96,0,
+135,207,128,32,132,131,227,207,5,102,160,224,36,6,229,125,9,96,190,81,
+41,224,37,2,228,209,17,229,194,0,228,235,17,224,94,4,96,21,100,120,
+160,91,228,189,7,149,179,228,96,4,224,133,1,235,226,5,228,48,9,228,
+129,11,192,24,228,129,0,2,50,51,56,235,251,3,227,154,1,224,24,7,
+225,101,4,100,248,0,58,128,140,251,32,5,232,118,1,223,229,224,23,1,
+96,24,224,169,12,231,252,0,232,109,19,224,206,11,254,104,39,96,154,237,
+224,6,129,81,128,23,96,246,144,246,100,132,128,0,230,111,0,161,215,1,
+95,50,66,188,0,95,143,232,224,80,9,238,250,2,160,116,0,90,164,68,
+68,221,236,60,5,96,30,64,174,226,229,1,133,54,96,135,128,32,211,183,
+96,69,96,4,74,6,96,32,0,90,64,124,85,129,98,42,0,75,78,125,
+128,56,64,0,97,225,130,67,224,0,1,227,44,12,225,219,8,97,220,170,
+78,235,245,1,97,86,161,222,230,106,3,128,220,224,216,2,236,23,0,237,
+214,0,192,200,162,10,226,20,1,160,9,129,239,226,34,2,235,48,6,101,
+92,129,160,243,182,2,128,23,177,200,128,70,78,97,0,80,255,80,2,193,
+182,218,88,232,86,8,194,29,142,110,194,60,128,228,96,64,64,43,1,95,
+57,241,23,4,230,185,7,98,47,254,122,1,254,110,5,13,115,101,99,116,
+105,111,110,32,102,105,120,105,116,121,165,141,96,49,75,176,224,43,1,1,
+36,120,166,204,109,1,240,151,0,65,137,139,151,209,238,239,255,7,225,140,
+6,128,30,225,144,5,195,84,64,116,0,52,64,208,0,79,255,187,4,167,
+172,239,140,8,99,18,96,166,224,148,3,224,178,9,225,222,56,128,198,245,
+148,7,130,86,99,136,143,94,233,31,2,248,64,3,225,208,11,160,84,241,
+176,2,100,32,224,21,6,224,60,30,64,58,244,4,8,77,186,226,22,4,
+128,174,225,116,1,96,188,225,110,6,224,0,1,226,51,87,0,54,232,231,
+19,177,107,224,211,3,225,147,5,162,22,236,73,1,227,33,0,192,51,249,
+195,2,242,181,4,68,254,225,65,0,161,67,224,13,0,222,107,192,1,227,
+72,6,128,20,132,210,160,14,99,248,132,226,228,74,0,131,244,0,50,165,
+41,1,50,50,242,57,3,230,135,4,128,8,66,86,130,222,0,85,105,95,
+0,49,101,17,224,122,4,65,48,138,24,128,50,226,192,10,102,193,224,13,
+5,160,172,128,2,160,14,226,253,13,0,89,225,18,3,103,46,225,7,3,
+129,74,242,193,5,224,61,0,131,85,129,16,104,247,64,107,128,36,96,117,
+166,60,73,15,0,52,106,232,217,121,160,7,249,136,2,224,190,2,224,2,
+3,192,30,192,136,96,7,224,2,3,152,127,225,158,2,251,66,3,99,216,
+129,147,1,85,32,176,196,129,180,163,168,225,27,0,254,36,5,128,7,101,
+150,227,31,6,224,9,0,224,165,2,247,218,2,161,2,96,86,224,210,6,
+96,17,194,51,64,92,65,230,136,195,225,6,1,225,115,0,252,133,8,217,
+103,128,188,255,242,3,192,131,168,105,225,83,2,192,45,160,245,96,153,232,
+61,5,225,248,3,193,98,188,236,224,26,5,224,148,4,128,221,64,0,225,
+177,10,225,17,0,224,66,9,226,145,0,224,127,14,224,106,0,96,170,224,
+35,21,128,1,169,88,192,0,233,210,1,96,2,128,178,226,167,0,160,14,
+224,50,4,224,88,15,210,154,224,0,1,224,234,14,224,2,3,224,246,0,
+64,0,228,139,9,250,129,3,250,141,4,193,222,128,122,225,236,0,130,42,
+128,181,1,95,49,138,10,227,142,0,155,212,84,74,1,64,64,121,103,224,
+227,0,0,95,164,229,224,42,1,2,51,51,48,100,147,102,10,64,44,99,
+147,128,65,192,22,64,8,255,17,4,163,39,168,112,246,222,3,224,171,2,
+224,173,2,225,74,2,161,98,192,44,224,62,4,128,166,225,32,6,224,181,
+12,94,80,0,54,99,31,96,223,225,13,0,96,186,225,13,23,224,225,14,
+111,26,224,76,0,227,13,8,160,190,227,173,13,96,16,3,95,52,49,56,
+96,113,69,245,246,14,2,238,225,12,28,97,109,98,105,103,117,111,117,115,
+32,111,112,101,114,97,116,111,114,32,101,120,112,114,101,115,115,105,111,110,
+246,85,0,226,70,15,96,123,64,224,129,53,96,21,224,240,1,1,53,56,
+225,29,4,224,209,10,224,172,38,9,98,97,100,32,112,114,101,102,105,120,
+224,164,11,228,250,2,3,95,49,55,57,254,66,2,16,92,51,52,38,115,
+114,99,47,77,105,99,114,111,72,115,47,70,104,22,2,46,104,115,64,24,
+4,44,54,52,58,55,192,68,164,238,237,185,1,225,210,0,171,37,170,228,
+1,95,54,86,91,204,127,163,61,129,28,160,220,65,202,78,2,1,50,50,
+238,247,1,5,64,80,32,75,50,32,79,53,150,169,133,237,1,64,89,100,
+79,65,35,229,41,3,233,83,1,98,26,139,155,71,139,0,48,234,123,1,
+138,53,128,113,96,122,160,115,0,51,64,189,103,228,88,145,248,19,4,64,
+19,194,98,98,131,98,235,64,228,169,165,171,238,100,91,64,138,198,149,64,
+34,0,80,192,179,130,133,193,199,96,182,210,177,254,13,1,224,61,7,193,
+25,224,33,1,225,3,1,161,25,0,65,225,25,4,72,86,216,163,163,26,
+6,95,49,49,53,32,95,55,78,63,4,49,56,51,32,35,97,27,64,39,
+209,236,249,37,15,4,110,101,103,97,116,153,39,64,46,145,201,0,65,88,
+250,65,44,3,10,65,32,90,65,77,64,14,145,152,0,75,64,26,65,187,
+234,5,0,235,0,0,67,105,72,80,64,32,141,228,0,75,185,54,68,158,
+88,244,1,52,57,99,17,139,24,143,137,64,193,120,167,142,33,206,40,128,
+24,64,11,174,79,224,24,11,160,49,130,8,2,95,49,54,125,37,100,49,
+64,115,0,54,240,68,1,98,171,158,211,227,172,1,225,175,1,240,58,11,
+227,194,0,248,67,20,1,95,55,159,149,226,162,15,128,40,244,126,30,8,
+103,101,116,65,112,112,67,111,110,219,111,66,147,251,44,3,168,38,96,11,
+0,85,128,206,96,233,244,123,1,96,105,2,51,56,54,226,24,17,227,117,
+0,3,67,32,95,51,117,58,64,65,130,77,104,127,64,14,194,52,235,226,
+10,138,216,129,66,99,204,96,89,0,50,115,68,64,58,180,10,0,32,65,
+167,224,218,1,2,118,97,108,155,140,252,89,2,1,121,112,130,118,224,18,
+1,0,107,222,210,224,18,1,3,115,111,114,116,64,18,64,90,244,51,1,
+245,98,22,102,106,129,122,224,12,1,84,137,244,224,1,107,173,236,222,5,
+164,181,131,145,238,227,6,66,214,100,55,68,44,237,21,6,128,156,180,182,
+228,39,0,68,250,170,233,234,12,4,162,67,131,233,231,71,0,226,99,19,
+96,144,1,55,55,133,253,89,37,96,115,226,111,1,226,109,0,248,7,4,
+1,95,56,241,161,0,224,42,10,224,241,6,173,4,64,94,175,35,157,13,
+225,135,2,9,101,116,83,76,111,99,69,120,112,114,196,43,65,10,156,23,
+114,70,97,87,1,55,56,187,23,96,71,129,74,0,50,108,62,192,19,64,
+56,132,28,0,79,68,73,64,27,97,212,128,180,1,52,48,162,71,64,43,
+161,236,241,63,0,97,198,200,71,237,26,1,64,8,1,95,57,78,242,0,
+51,68,190,182,24,227,227,3,224,12,1,224,25,0,3,95,49,49,55,72,
+96,71,16,160,50,163,188,97,253,224,27,3,163,38,160,6,0,66,163,54,
+64,207,134,47,227,119,0,103,178,192,245,227,228,15,9,117,110,100,101,102,
+105,110,101,100,32,207,126,242,106,0,224,54,19,228,18,0,1,51,54,198,
+165,98,83,140,80,97,5,104,41,237,170,4,128,35,224,157,5,226,225,0,
+224,105,15,232,249,1,199,252,165,10,167,233,224,61,21,192,167,168,32,128,
+51,160,180,224,55,9,2,79,32,35,65,178,199,182,65,83,65,198,96,45,
+71,253,0,80,96,200,232,73,1,205,228,232,78,0,1,95,57,68,217,224,
+0,7,161,6,66,70,197,26,228,140,3,1,91,93,96,163,225,8,13,2,
+79,32,35,95,172,193,64,226,23,1,224,254,0,166,79,69,97,224,53,4,
+0,51,244,30,2,224,91,16,71,226,237,228,2,224,91,5,128,0,64,182,
+133,143,0,83,164,62,129,25,66,146,71,246,185,82,3,64,95,51,53,129,
+85,0,83,164,158,227,229,1,171,61,64,45,121,119,129,93,153,154,0,52,
+215,234,0,73,101,235,66,196,1,10,65,225,29,2,2,66,64,34,128,24,
+133,201,128,123,101,228,1,49,49,128,24,197,135,161,8,199,203,0,95,67,
+53,192,254,162,51,88,133,193,161,224,237,0,160,8,176,118,100,27,225,197,
+0,64,95,229,74,0,66,183,3,64,95,57,56,94,135,129,74,1,50,48,
+242,167,4,3,66,111,111,108,196,142,0,48,132,142,224,28,1,4,68,97,
+116,97,46,64,33,5,95,84,121,112,101,46,128,213,64,63,132,180,204,192,
+242,101,4,0,49,99,211,129,189,114,98,239,207,4,237,10,1,242,211,6,
+97,148,0,48,131,152,232,96,18,1,95,52,164,160,194,32,230,199,3,2,
+49,50,48,194,3,225,64,2,224,109,7,130,86,71,211,64,174,237,0,0,
+232,123,1,225,92,0,224,17,4,252,104,4,96,19,109,183,132,116,69,201,
+253,106,1,135,209,192,169,224,71,4,96,48,164,176,0,49,69,169,235,65,
+4,228,191,20,21,110,111,116,32,112,111,108,121,109,111,114,112,104,105,99,
+32,101,110,111,117,103,104,196,45,66,156,64,47,3,95,49,57,53,195,255,
+96,0,231,136,4,107,76,1,56,54,98,224,73,222,229,239,0,224,41,8,
+97,233,170,115,104,31,64,149,64,90,1,49,50,67,3,127,192,2,49,50,
+48,66,87,168,57,64,48,0,54,96,48,91,150,90,169,96,137,0,57,130,
+151,64,29,132,73,107,138,64,14,163,161,167,239,193,224,1,49,48,76,255,
+97,9,0,49,137,25,0,51,218,7,130,80,207,117,97,218,225,215,1,128,
+48,68,208,225,81,4,226,77,3,143,106,246,223,3,239,231,6,227,49,0,
+226,146,0,65,136,96,39,96,237,172,146,250,47,12,214,81,141,76,104,13,
+228,165,0,64,237,132,36,128,134,226,141,7,128,77,0,57,163,65,64,43,
+0,95,182,186,0,85,225,31,1,64,19,236,239,0,224,127,7,98,159,131,
+229,0,50,104,0,225,206,6,64,129,132,141,230,20,11,160,149,131,12,166,
+118,100,56,0,55,66,43,96,83,228,93,2,64,95,128,202,0,79,130,252,
+95,42,1,56,55,66,176,96,121,64,202,65,124,139,9,64,57,164,139,1,
+55,56,143,144,2,79,32,64,101,250,64,45,64,136,128,10,0,58,128,54,
+133,48,234,155,5,2,49,48,56,226,2,0,227,134,1,65,157,66,144,175,
+80,99,84,226,14,2,228,25,4,1,49,57,113,222,64,21,224,93,16,231,
+166,0,227,238,8,96,52,96,109,130,9,249,6,5,225,102,1,150,11,97,
+37,97,205,67,60,224,107,12,72,114,129,206,224,208,7,132,30,224,200,2,
+247,234,2,94,132,224,27,5,1,49,48,96,215,224,135,14,224,43,4,111,
+143,98,102,100,37,240,140,3,160,6,0,85,229,49,1,224,252,2,192,247,
+239,192,0,226,136,2,225,38,5,0,95,74,114,192,169,68,222,0,56,250,
+49,2,98,95,223,63,225,68,1,225,153,0,228,125,6,224,17,5,193,227,
+65,86,132,147,102,248,68,47,100,13,64,155,225,220,0,236,120,7,207,83,
+192,32,154,160,228,23,5,164,29,160,123,224,25,9,210,132,225,205,7,0,
+49,89,244,224,0,1,172,173,192,47,235,102,0,64,2,224,39,1,128,134,
+128,1,226,113,1,64,202,233,23,0,100,57,128,188,96,172,224,79,0,244,
+125,2,135,28,160,59,2,95,49,49,80,93,164,184,246,229,6,224,117,6,
+224,150,0,229,10,3,165,8,152,236,64,134,133,10,145,253,224,151,25,135,
+49,64,142,169,72,224,131,3,65,228,98,66,237,246,4,111,124,177,151,96,
+0,225,61,6,245,88,8,162,213,129,54,200,27,160,9,128,147,162,221,130,
+95,224,126,0,224,65,1,154,242,231,216,7,192,2,244,121,3,224,32,0,
+200,176,237,65,0,192,99,228,7,3,224,26,0,96,115,218,17,234,146,3,
+224,131,1,176,124,224,84,1,224,133,1,224,219,0,128,61,160,203,224,92,
+5,64,47,251,115,3,97,67,97,150,66,2,65,93,160,116,67,43,0,54,
+99,43,0,79,75,104,71,235,0,54,71,78,1,55,55,155,156,1,49,53,
+67,119,64,27,202,236,136,11,2,95,52,48,69,202,0,49,103,229,64,39,
+64,53,224,39,18,149,134,64,173,64,21,224,39,17,75,220,128,39,64,88,
+96,147,84,80,178,153,0,49,76,49,199,48,64,186,136,43,239,254,5,185,
+249,129,71,195,198,96,11,232,16,1,97,183,239,207,6,226,3,11,225,142,
+5,224,30,12,224,85,16,225,121,0,224,85,22,226,103,6,98,23,64,241,
+65,22,251,252,3,64,0,161,2,64,250,137,23,235,133,6,75,128,13,76,
+105,116,115,46,75,110,111,119,110,83,121,109,98,107,183,64,47,136,89,225,
+42,141,180,10,225,42,79,205,96,64,1,229,155,9,171,3,224,158,0,164,
+222,69,46,176,128,230,96,1,237,98,1,224,163,0,225,81,5,170,159,134,
+111,166,117,224,201,5,128,1,165,25,224,25,8,224,131,0,225,31,4,239,
+122,3,224,71,5,225,40,0,230,144,11,229,27,8,166,14,224,19,8,252,
+74,1,224,67,8,224,49,6,225,194,3,108,31,145,172,224,33,0,224,51,
+3,224,13,4,224,10,1,96,57,103,129,72,228,65,166,224,222,0,234,178,
+9,64,39,78,237,128,59,84,235,249,34,9,225,251,4,224,132,57,132,89,
+170,189,247,54,0,0,75,86,243,151,25,2,75,32,75,77,119,128,12,64,
+43,244,146,1,96,2,230,149,0,193,96,130,1,224,31,0,128,2,160,233,
+0,54,244,60,1,129,157,96,5,64,151,97,87,226,124,10,193,180,128,99,
+225,144,5,230,35,0,134,32,129,215,128,146,198,255,239,34,6,102,89,0,
+39,169,207,234,50,3,0,56,243,116,1,64,1,236,75,8,224,26,2,240,
+143,5,193,106,160,108,67,164,64,12,153,117,198,145,128,166,0,79,160,239,
+64,35,64,242,70,107,227,197,1,224,118,12,224,112,2,162,130,226,18,1,
+224,55,2,146,190,128,7,192,226,172,173,118,146,231,0,0,128,79,239,77,
+15,31,77,117,108,116,105,112,108,101,32,99,111,110,115,116,114,97,105,110,
+116,32,115,111,108,117,116,105,111,110,115,32,102,111,0,114,243,134,0,128,
+71,0,49,76,187,110,157,233,89,1,0,58,130,99,75,229,3,54,32,95,
+53,84,29,1,95,54,93,134,64,24,177,37,81,191,246,7,5,5,116,117,
+112,108,101,67,224,117,0,0,115,207,191,129,44,79,57,155,120,64,104,0,
+66,86,132,0,50,82,119,103,38,0,55,64,5,152,180,96,99,171,11,225,
+232,2,154,24,130,41,66,12,212,219,98,83,228,130,13,190,22,64,230,143,
+94,0,90,64,35,237,160,0,229,125,4,160,123,162,14,0,89,64,13,194,
+43,170,28,224,16,1,229,8,0,160,14,227,33,1,234,196,2,106,243,229,
+255,5,137,113,96,5,235,182,1,130,230,188,59,224,60,1,133,34,242,87,
+4,233,42,1,224,57,0,96,87,66,76,97,63,224,144,0,64,11,161,59,
+130,202,144,178,102,119,231,226,0,160,0,227,223,3,66,219,97,176,228,112,
+2,66,32,96,51,193,44,65,158,0,54,166,157,230,72,5,247,140,1,67,
+149,1,49,49,130,254,0,89,64,16,227,204,2,193,195,193,42,225,32,0,
+97,0,224,15,2,96,27,65,81,128,213,224,83,3,96,201,210,88,128,240,
+165,243,0,95,88,65,64,29,164,138,97,233,67,70,224,22,2,227,127,7,
+128,95,252,170,0,224,10,4,227,206,0,78,171,248,17,0,224,147,0,203,
+254,2,49,49,56,165,20,65,30,251,115,1,161,200,193,41,192,205,177,173,
+224,206,0,224,105,4,0,56,224,25,3,196,49,64,23,0,49,165,217,0,
+57,240,98,0,64,147,120,142,228,75,3,224,185,0,224,103,7,64,67,195,
+227,224,31,0,227,55,1,96,130,224,123,2,128,224,128,50,64,11,241,95,
+9,237,33,3,195,99,237,163,6,1,95,56,219,125,250,210,3,224,52,1,
+64,1,163,55,227,68,3,224,190,1,79,133,225,13,4,194,172,242,206,0,
+129,58,84,167,193,246,224,20,0,83,102,224,13,0,166,61,128,113,64,165,
+3,53,56,32,95,68,212,146,227,80,214,242,66,11,100,52,248,92,0,224,
+221,5,225,37,0,96,61,225,37,49,1,67,32,225,39,4,99,177,101,248,
+1,52,51,229,247,0,229,103,1,4,102,114,101,101,32,93,34,20,32,118,
+97,114,105,97,98,108,101,32,105,110,32,111,117,116,112,117,116,32,102,90,
+68,0,112,229,225,3,227,17,4,241,64,0,229,89,1,164,239,129,37,196,
+236,128,13,196,233,161,140,225,183,5,141,214,234,244,1,228,169,17,228,146,
+9,228,137,8,226,230,2,245,224,0,99,75,140,51,130,254,192,73,64,65,
+64,27,140,31,65,113,135,180,231,100,1,228,67,2,228,139,5,224,42,8,
+224,228,0,130,135,224,191,0,227,132,3,133,15,228,198,1,226,199,0,75,
+146,71,153,98,69,194,103,168,90,128,11,239,55,6,227,188,2,96,0,164,
+181,160,8,244,46,0,67,115,249,70,4,129,57,82,124,192,59,224,22,2,
+224,25,6,224,26,6,224,29,7,227,238,3,227,133,10,192,196,226,229,4,
+64,146,202,93,115,182,1,64,95,74,96,64,22,138,72,69,26,0,51,194,
+101,137,246,92,126,181,4,1,49,55,133,66,158,166,1,49,55,98,143,96,
+13,0,58,128,7,218,207,70,24,157,97,96,6,73,91,99,10,104,128,1,
+49,49,79,224,160,201,64,56,136,136,3,85,32,75,51,98,180,64,18,136,
+55,155,27,98,143,0,95,89,180,160,58,135,8,0,56,128,22,135,14,176,
+50,128,236,64,15,0,53,96,213,71,78,192,90,81,198,64,18,215,227,72,
+199,200,58,64,23,130,160,129,54,162,232,226,244,3,192,8,98,3,64,47,
+130,180,97,218,231,193,3,0,49,139,43,161,135,161,4,128,49,130,12,3,
+85,32,75,50,192,120,64,21,129,143,81,34,224,143,5,129,144,66,233,136,
+130,192,139,195,201,167,179,180,20,128,29,161,46,2,67,32,60,239,47,1,
+243,236,1,224,39,14,169,94,226,62,2,233,121,5,238,122,12,131,99,227,
+71,9,1,67,32,227,73,3,194,133,228,186,4,200,91,178,46,169,67,227,
+67,0,224,132,8,129,218,236,129,2,234,4,2,254,52,1,224,50,33,196,
+4,137,20,3,49,32,95,57,92,48,224,47,0,224,172,6,224,0,0,228,
+85,0,160,244,225,74,11,227,211,2,224,145,6,64,25,225,72,12,192,41,
+227,180,2,224,58,20,224,35,0,202,89,233,103,13,228,247,4,160,101,233,
+93,1,224,19,0,198,197,225,69,12,64,113,225,69,10,225,64,9,179,71,
+225,64,20,0,58,137,233,100,99,192,29,254,57,0,64,15,232,31,1,224,
+64,4,64,55,132,32,192,232,1,95,48,100,143,64,24,187,254,4,50,32,
+95,51,50,100,83,143,175,64,169,160,89,224,12,4,238,47,2,1,95,49,
+128,111,108,181,232,115,2,1,95,50,129,56,192,122,0,54,227,229,7,108,
+173,237,228,7,161,19,96,17,178,203,246,120,0,195,121,225,184,0,227,164,
+11,160,67,224,46,24,92,62,160,47,129,174,192,121,160,46,227,216,16,193,
+60,237,84,7,225,215,4,64,11,136,175,0,51,144,2,227,205,6,128,47,
+0,85,129,252,132,222,1,48,52,226,243,0,224,98,8,128,219,96,48,237,
+163,1,224,184,1,193,47,227,64,9,224,75,10,192,24,0,85,97,135,162,
+240,143,215,205,243,128,29,160,103,2,95,55,54,78,149,246,223,0,65,203,
+181,177,231,70,1,69,112,96,137,109,182,134,104,0,67,65,226,240,161,0,
+65,203,216,1,182,197,4,64,95,55,52,54,101,175,134,67,154,148,227,52,
+6,118,52,91,13,2,95,52,52,66,238,0,51,98,157,111,234,1,49,50,
+103,21,0,48,71,113,4,64,64,95,51,53,233,39,1,133,173,248,203,35,
+96,175,64,4,131,136,200,191,64,128,2,51,32,95,118,249,190,229,0,53,
+228,10,1,234,180,4,239,172,1,82,14,98,235,0,80,240,16,7,6,109,
+105,110,105,109,117,109,255,199,0,0,50,64,194,229,9,1,162,187,64,107,
+2,52,55,32,96,81,96,85,64,83,199,37,194,90,241,199,5,160,23,163,
+148,162,205,162,208,224,13,0,102,31,226,158,0,97,242,160,75,145,208,1,
+95,55,230,108,0,128,29,75,133,100,14,6,55,48,50,32,79,32,35,71,
+242,194,126,243,193,6,64,162,135,150,246,205,20,3,78,97,116,34,132,113,
+135,173,162,54,97,75,143,53,132,28,210,112,195,153,96,186,227,212,1,68,
+28,129,54,129,69,0,50,101,64,97,153,192,7,193,18,246,42,7,0,50,
+237,56,7,228,119,6,203,117,140,125,243,186,12,99,183,160,155,251,88,2,
+65,53,253,192,0,227,97,0,211,216,243,151,10,128,161,98,100,225,202,8,
+199,205,89,158,248,132,4,243,76,19,224,199,1,243,79,12,226,56,25,224,
+123,1,2,95,53,51,70,58,225,227,4,226,74,2,113,24,128,43,137,201,
+194,22,228,160,1,228,56,4,65,241,245,97,4,193,235,76,49,188,208,225,
+143,4,161,232,128,19,83,238,102,235,0,51,96,135,177,194,0,67,98,38,
+99,210,231,232,18,225,174,2,165,191,232,17,15,64,29,133,192,225,20,5,
+224,16,0,225,21,5,129,15,192,82,96,36,65,21,97,182,225,36,1,0,
+80,227,49,1,160,0,96,86,225,96,15,224,28,18,0,58,130,147,106,226,
+224,196,4,170,91,118,202,69,77,165,52,128,49,135,241,131,102,226,173,18,
+164,19,226,163,8,129,7,226,48,1,234,100,0,226,75,9,193,48,129,153,
+142,84,0,66,128,201,165,58,196,104,229,67,0,68,220,224,251,1,64,174,
+168,135,227,180,8,70,157,0,66,144,251,163,141,0,49,96,126,128,59,3,
+95,50,49,54,224,24,1,132,196,64,77,0,54,165,51,96,170,0,57,96,
+23,88,237,0,54,64,57,0,48,85,182,0,95,179,52,64,44,134,212,0,
+75,193,252,224,130,8,166,93,97,72,129,239,175,223,224,149,1,225,47,0,
+96,106,174,228,87,54,225,87,0,161,103,224,49,1,64,44,129,191,247,150,
+4,64,144,198,69,224,189,11,1,49,50,109,174,224,189,1,134,30,71,40,
+225,230,4,224,12,4,64,244,254,54,0,81,162,78,78,101,85,64,200,82,
+91,103,173,241,190,0,0,67,66,193,167,170,2,49,49,50,254,113,1,192,
+50,202,238,199,73,232,100,8,227,80,1,240,83,0,246,153,13,162,2,129,
+123,235,206,0,224,54,0,224,55,1,145,159,251,87,11,128,48,235,206,3,
+184,49,101,209,254,249,19,160,47,132,137,232,68,4,97,158,0,49,232,254,
+2,65,106,134,230,243,186,2,227,85,2,129,98,198,170,236,12,1,224,35,
+3,130,18,2,49,49,52,95,163,185,74,160,237,179,222,226,26,0,72,5,
+160,133,96,230,64,126,135,56,130,167,226,165,8,0,52,128,97,128,78,64,
+15,98,32,128,12,241,121,2,64,71,133,142,226,233,16,97,72,128,71,245,
+253,9,130,141,224,21,2,226,152,13,232,138,8,128,42,243,116,0,96,136,
+64,162,145,71,128,122,1,75,50,208,97,64,204,134,49,226,195,2,228,180,
+1,66,236,233,198,3,227,153,2,224,100,0,65,209,226,183,1,231,143,3,
+143,205,169,110,230,124,3,161,136,251,128,1,72,101,224,33,15,128,27,128,
+113,238,120,0,232,194,1,225,31,2,130,199,224,31,2,226,202,18,224,54,
+0,194,205,224,219,5,225,76,2,102,6,249,40,5,231,227,9,160,53,70,
+192,194,233,166,14,1,49,49,108,117,97,123,0,52,99,24,232,52,2,250,
+14,4,192,12,224,20,0,224,160,5,132,215,225,236,1,104,241,224,136,9,
+224,180,0,131,155,230,75,0,192,58,128,144,2,95,51,49,232,111,7,249,
+139,0,225,8,3,208,63,224,77,2,96,67,153,217,0,48,141,121,224,18,
+10,160,193,83,185,1,48,57,128,139,146,113,0,48,121,216,67,41,96,39,
+2,95,54,49,107,251,124,242,66,117,67,176,2,49,49,53,192,9,2,56,
+51,32,164,184,224,30,0,0,35,204,13,128,215,227,159,9,233,248,0,161,
+29,109,119,64,138,76,10,139,139,83,16,1,95,51,69,169,1,49,49,255,
+152,1,67,15,188,4,66,61,228,221,0,225,137,1,99,166,162,139,225,145,
+5,160,113,161,237,99,173,224,110,10,201,183,0,51,95,55,64,8,1,57,
+54,112,61,132,161,160,130,0,54,224,130,1,178,6,0,90,233,131,0,192,
+14,3,95,57,48,57,238,50,3,96,56,218,2,228,110,19,0,90,226,246,
+0,228,101,38,192,30,224,255,2,228,98,4,135,74,228,98,0,244,31,0,
+64,27,135,57,4,95,51,55,52,32,64,14,214,104,224,69,0,64,20,133,
+115,162,183,3,32,95,50,55,66,3,197,164,0,51,214,193,227,60,0,166,
+5,64,57,234,244,4,228,166,1,64,2,100,120,226,225,3,228,137,4,128,
+2,224,17,9,140,245,225,21,3,160,248,97,216,192,32,224,62,3,237,242,
+0,224,86,6,160,38,162,29,239,183,0,224,5,1,1,95,55,118,13,224,
+106,4,225,192,10,79,146,160,0,173,161,130,151,160,53,165,162,224,72,1,
+228,254,3,66,122,194,227,128,162,162,214,231,7,2,71,97,67,144,65,120,
+82,96,0,55,82,173,2,64,95,56,78,141,96,20,70,216,66,222,112,21,
+1,53,52,64,4,1,54,32,250,30,2,9,101,120,112,97,110,100,68,105,
+99,116,223,233,0,95,66,6,1,95,51,79,168,192,0,224,222,0,228,177,
+4,225,119,3,228,128,2,225,71,4,225,88,0,192,243,226,126,0,162,16,
+197,70,225,69,3,165,215,224,19,4,195,194,224,22,17,233,60,1,161,231,
+193,234,166,93,224,55,6,232,116,3,224,29,10,84,28,0,55,120,159,0,
+50,136,39,96,0,192,79,64,34,224,91,1,160,52,230,238,0,96,64,231,
+139,1,224,93,3,201,128,224,62,1,131,36,225,60,0,178,109,128,66,208,
+121,0,51,228,49,4,192,77,124,5,3,95,54,49,48,197,135,229,126,12,
+160,46,190,124,128,10,133,235,64,109,124,72,140,129,165,225,224,99,5,160,
+105,230,173,17,160,80,228,140,8,128,13,225,252,15,224,0,1,128,47,233,
+69,5,225,123,10,227,185,3,225,90,56,100,235,0,51,129,91,161,85,225,
+75,23,232,125,0,128,140,163,81,110,82,194,193,224,21,3,232,30,1,179,
+215,179,214,233,114,5,64,20,147,245,64,23,0,56,101,20,64,176,116,63,
+0,73,245,0,1,104,200,174,207,97,104,82,15,2,95,49,48,90,211,112,
+143,229,97,5,108,232,96,226,65,33,225,144,2,232,232,1,251,177,3,64,
+133,224,48,16,192,46,230,175,4,64,38,139,229,196,126,130,87,149,207,83,
+24,77,33,0,80,64,7,66,93,1,56,49,129,196,64,96,156,7,0,51,
+135,172,0,75,186,120,65,185,243,232,1,64,17,165,112,245,174,5,128,190,
+240,159,21,96,33,96,57,224,226,2,235,174,0,210,10,250,13,0,161,51,
+64,146,0,54,230,140,0,202,1,64,220,1,49,48,168,132,194,124,241,220,
+0,207,190,128,115,96,117,255,24,13,132,36,160,50,160,148,160,13,244,94,
+1,130,150,96,102,179,99,245,104,0,1,95,55,145,217,160,202,1,95,55,
+69,197,226,164,18,138,176,128,23,238,60,0,64,142,196,79,77,223,230,0,
+1,1,36,120,101,246,65,2,220,180,3,75,32,75,52,64,2,252,42,1,
+128,31,136,41,237,93,14,180,59,192,231,1,49,50,212,35,150,228,64,63,
+136,77,228,19,1,161,102,238,18,0,131,225,231,42,0,193,54,148,195,96,
+74,64,210,224,43,0,160,23,161,217,243,5,8,224,22,10,225,248,0,224,
+96,4,208,170,238,4,2,224,31,18,192,67,224,134,0,98,38,163,31,97,
+239,160,68,226,68,0,107,100,224,32,6,160,69,216,84,64,7,64,26,226,
+65,13,64,50,207,234,230,218,2,134,123,200,42,161,29,160,35,230,165,0,
+64,81,224,15,1,128,151,229,177,3,128,76,179,141,226,226,1,128,159,193,
+252,129,190,137,253,235,97,1,245,233,1,160,107,0,95,133,110,224,138,0,
+224,8,0,64,61,138,38,234,254,2,64,20,239,103,31,219,8,96,101,234,
+254,48,226,121,1,235,0,3,66,168,239,99,6,64,247,64,25,132,231,226,
+240,15,218,121,128,250,83,115,226,140,1,226,73,0,96,71,132,238,224,230,
+23,108,34,224,227,55,192,8,228,227,1,128,130,0,54,129,126,1,51,54,
+76,203,70,33,224,1,7,233,71,0,224,111,1,224,1,5,135,211,224,34,
+18,224,32,3,1,95,57,250,113,0,64,125,132,89,225,98,1,236,99,2,
+65,70,132,117,0,50,228,118,0,162,119,64,29,164,51,104,158,102,228,122,
+217,64,25,249,81,7,3,97,100,105,99,185,64,64,34,194,170,2,95,49,
+48,66,123,64,21,130,109,227,184,3,227,202,0,234,57,1,229,172,2,234,
+33,2,83,245,229,185,2,104,107,198,19,224,49,1,242,163,5,131,1,0,
+48,163,18,224,21,5,0,49,135,237,71,25,173,81,227,250,1,253,221,0,
+204,134,224,177,3,163,246,225,130,6,232,31,6,224,59,1,240,13,1,109,
+64,160,94,96,73,64,211,72,65,228,203,6,201,186,192,137,1,95,55,76,
+48,224,37,4,226,104,0,224,74,1,192,36,228,122,3,129,31,225,16,9,
+174,26,224,21,1,192,108,137,193,128,82,193,84,225,94,2,207,171,225,153,
+7,1,49,49,232,3,1,224,72,3,96,26,148,36,224,99,81,192,14,164,
+88,227,140,1,192,15,224,132,3,224,47,2,131,110,232,58,0,226,119,28,
+169,39,227,103,0,224,140,16,240,237,1,224,13,15,224,120,53,131,155,66,
+195,227,79,0,225,75,10,230,162,0,160,121,237,113,4,96,31,224,86,0,
+65,36,75,239,2,49,48,55,228,211,5,192,175,163,50,96,118,133,77,239,
+41,1,64,8,246,105,7,1,49,49,132,126,192,69,225,34,0,195,69,192,
+179,224,34,0,237,189,4,246,148,6,224,127,1,160,227,226,228,0,200,27,
+224,44,1,96,14,0,49,73,153,129,101,0,79,248,43,4,64,0,228,55,
+26,224,101,0,235,94,3,239,224,2,160,16,68,209,128,10,120,156,64,89,
+1,95,54,75,132,114,196,0,54,215,209,224,119,2,97,106,1,48,49,240,
+1,3,23,83,117,98,115,117,109,112,116,105,111,110,32,99,104,101,99,107,
+32,102,97,105,108,101,100,144,13,228,186,6,97,128,0,54,133,93,246,122,
+14,217,60,97,6,224,31,0,0,49,74,147,128,62,134,12,115,101,0,89,
+132,78,129,145,233,52,1,209,239,225,29,0,150,112,64,127,197,171,228,178,
+1,225,231,4,164,143,140,56,192,179,224,43,0,226,142,2,229,14,9,128,
+51,197,64,160,24,127,126,224,32,5,98,88,192,26,178,114,160,26,104,17,
+98,106,97,237,224,9,1,224,107,0,98,133,64,8,200,209,195,86,131,144,
+97,193,106,43,239,147,12,229,129,1,229,167,8,224,135,3,195,66,225,35,
+1,225,38,20,98,170,224,29,1,194,155,237,104,1,224,31,5,224,194,0,
+239,182,0,196,23,224,91,0,224,63,5,227,209,7,239,168,1,224,13,7,
+224,58,8,250,191,15,96,44,167,189,227,78,12,128,26,160,154,247,172,4,
+224,198,6,228,211,0,231,106,3,194,127,224,120,1,226,4,7,192,53,226,
+136,3,225,100,20,211,77,162,221,226,139,15,226,79,4,166,54,224,175,11,
+225,166,10,202,142,118,43,224,240,0,192,140,224,46,8,224,194,2,224,96,
+2,162,135,229,208,0,165,194,121,72,109,155,130,151,1,51,57,241,16,1,
+225,53,1,224,198,14,174,130,224,101,2,128,47,224,97,3,224,216,2,230,
+110,0,160,82,160,145,228,212,9,128,31,129,118,224,27,6,227,185,0,1,
+32,95,149,10,240,15,1,109,114,224,4,1,128,115,245,39,25,9,102,114,
+101,101,84,121,86,97,114,115,245,39,5,112,226,192,184,64,174,101,151,160,
+242,145,252,177,251,0,75,241,162,0,128,6,69,10,207,81,0,89,162,114,
+201,250,228,229,3,162,214,226,127,5,129,1,225,214,11,192,25,184,50,166,
+69,231,27,5,64,35,96,33,64,59,224,30,5,96,22,129,170,233,163,8,
+67,84,242,10,3,224,247,1,228,50,8,225,19,1,65,204,229,45,2,252,
+58,1,202,51,195,244,231,69,8,200,117,231,106,3,231,149,3,192,35,128,
+173,224,175,6,238,155,7,224,187,3,180,8,192,191,225,7,38,64,43,96,
+77,0,57,187,68,224,72,0,224,40,2,211,148,64,0,65,232,140,198,193,
+214,231,55,13,109,217,91,221,229,246,1,225,136,14,164,250,128,179,245,205,
+0,96,42,245,208,10,128,13,210,103,128,143,217,201,224,137,0,67,30,66,
+201,224,111,7,224,178,0,1,52,48,82,113,0,52,116,190,89,185,224,113,
+0,134,174,0,51,109,239,227,65,9,2,79,32,35,82,87,132,143,131,50,
+223,136,128,137,173,170,133,196,194,235,236,117,0,161,0,224,165,2,240,229,
+0,224,26,16,232,68,2,96,2,233,90,5,230,47,9,132,214,172,151,129,
+212,225,5,7,207,75,224,19,2,64,187,208,190,224,138,7,143,221,0,48,
+254,46,0,64,29,228,208,1,227,220,0,85,27,118,134,160,63,2,49,48,
+57,98,151,1,95,56,193,171,96,56,224,158,2,64,117,78,80,226,75,2,
+226,225,0,227,227,4,123,99,224,106,1,224,36,20,64,92,64,8,64,91,
+139,210,64,41,78,143,231,13,5,128,165,165,218,137,141,225,105,6,229,195,
+2,128,1,232,103,5,161,13,227,212,3,160,33,231,56,18,137,111,224,126,
+3,228,240,6,224,31,5,232,157,0,0,83,224,169,2,232,89,10,160,54,
+192,50,226,127,3,172,143,245,127,0,225,243,0,0,95,175,46,192,56,193,
+153,192,129,192,208,229,11,16,231,197,1,254,161,1,224,13,3,224,56,12,
+224,57,3,229,43,1,160,44,129,212,226,224,4,230,214,0,224,221,3,64,
+9,226,13,5,233,99,6,225,8,9,128,6,129,9,167,86,225,10,13,160,
+160,120,178,234,164,7,96,163,225,217,1,225,181,15,227,60,8,1,57,53,
+192,95,233,97,2,98,94,226,114,0,233,164,0,224,17,9,225,49,2,65,
+159,67,209,64,155,96,159,226,124,2,205,188,109,98,173,23,161,81,232,7,
+16,12,99,97,110,110,111,116,32,117,110,105,102,121,32,173,34,129,94,165,
+8,1,56,55,135,93,224,66,17,3,32,97,110,100,160,58,160,45,225,10,
+3,226,192,0,226,93,7,67,158,238,250,7,230,73,3,2,49,48,56,180,
+77,128,61,68,78,129,219,64,69,68,80,64,65,0,54,227,224,0,251,14,
+0,128,8,220,111,0,67,197,234,1,49,49,64,6,160,120,141,179,224,195,
+1,12,80,114,105,109,105,116,105,118,101,115,46,126,34,104,203,64,44,160,
+89,230,230,10,1,49,48,124,126,228,82,3,203,164,64,104,105,124,228,234,
+10,135,54,128,209,226,95,8,195,12,226,95,26,240,30,4,133,105,0,57,
+64,234,239,151,2,160,38,229,163,6,67,1,106,88,196,11,1,48,57,242,
+232,8,226,70,44,4,121,99,108,105,99,226,64,11,71,195,66,20,71,144,
+167,2,226,74,18,0,61,226,72,17,162,74,225,27,1,239,175,4,225,144,
+0,192,248,173,52,224,225,0,192,224,161,143,224,142,0,161,153,200,64,96,
+184,227,187,14,225,35,17,0,48,112,12,200,192,142,239,1,49,48,66,173,
+224,235,18,4,101,114,114,111,114,203,125,128,133,213,231,86,237,224,41,1,
+3,116,121,112,101,64,37,224,17,1,2,107,105,110,144,207,224,18,1,2,
+115,111,114,86,45,224,18,3,4,114,101,97,108,109,64,19,64,90,135,219,
+240,228,38,0,48,92,248,1,64,58,130,94,240,228,1,133,74,166,188,102,
+145,226,197,2,194,44,238,48,13,231,91,0,240,176,25,165,114,236,47,12,
+198,237,193,146,231,7,9,0,85,102,31,237,80,8,130,247,237,62,6,160,
+137,139,124,120,182,0,90,64,49,192,25,224,100,8,238,154,12,169,16,238,
+55,4,224,180,4,231,56,2,224,81,8,236,96,9,113,60,96,34,160,25,
+0,85,227,219,0,3,95,55,54,50,255,116,0,237,125,0,97,171,98,61,
+109,115,225,101,1,224,136,9,131,41,161,138,225,95,12,129,132,166,134,225,
+129,49,228,169,6,195,165,132,31,0,80,99,37,231,233,0,227,209,10,66,
+145,128,165,232,18,3,163,210,243,200,6,110,158,227,161,2,3,32,95,49,
+56,64,31,141,33,2,49,48,52,142,169,128,84,227,204,2,225,130,1,97,
+21,90,74,99,196,224,60,0,2,95,50,55,67,188,0,48,138,195,224,65,
+2,136,189,225,30,13,129,207,225,97,18,194,66,233,94,8,251,133,1,226,
+142,2,226,21,0,224,78,15,205,94,224,213,8,192,24,98,170,225,50,6,
+226,135,16,224,46,13,96,0,224,49,13,65,121,97,115,225,190,10,224,23,
+13,96,21,67,144,224,99,3,238,200,9,224,132,9,226,252,3,66,244,220,
+139,252,100,5,97,32,220,94,2,48,57,51,66,46,188,94,192,193,140,149,
+236,214,0,64,75,0,54,206,69,69,247,64,40,0,95,105,1,76,211,192,
+39,64,38,136,60,224,112,4,252,202,0,224,107,4,64,44,136,70,252,168,
+12,220,162,224,19,3,224,1,1,196,127,224,34,16,224,32,3,224,29,20,
+224,26,17,224,23,14,252,237,2,160,197,200,184,0,89,130,141,232,189,1,
+237,43,1,161,86,224,85,2,228,18,1,199,203,96,57,242,203,1,187,176,
+64,21,238,157,10,128,68,103,244,227,72,1,130,79,128,111,224,79,0,129,
+212,71,175,78,76,249,117,1,96,28,234,90,9,105,48,74,92,143,254,0,
+56,92,181,224,113,0,224,96,0,228,114,3,234,125,3,209,92,96,7,130,
+177,240,140,2,166,79,192,185,163,191,133,72,238,172,5,0,57,238,63,0,
+65,96,136,127,120,58,64,208,153,0,241,95,21,0,56,64,148,240,62,4,
+241,217,8,241,77,0,241,73,13,64,0,240,2,4,96,148,97,232,229,139,
+7,0,56,81,39,134,113,96,105,227,107,16,0,56,104,77,227,107,6,128,
+156,103,113,169,148,0,56,128,32,64,114,136,153,3,85,32,75,51,191,48,
+134,230,0,58,128,36,255,229,21,255,231,4,227,37,12,227,72,6,226,218,
+1,64,95,208,30,0,89,99,237,1,67,39,208,37,166,248,208,1,192,73,
+254,199,0,226,88,0,161,175,162,156,224,41,2,231,111,10,224,89,2,224,
+47,21,227,46,2,236,91,0,232,84,15,204,24,96,232,229,155,7,224,28,
+3,230,77,4,229,121,8,98,224,66,32,160,0,128,105,239,221,0,225,197,
+0,138,247,226,160,0,225,226,8,231,114,9,160,78,230,55,9,230,153,4,
+224,39,0,224,240,0,233,75,2,225,216,3,225,88,5,224,55,1,160,255,
+231,31,15,231,110,175,224,219,3,224,58,11,192,30,165,37,145,119,97,57,
+228,108,2,228,178,2,234,247,0,224,60,3,160,62,225,101,2,237,1,6,
+2,49,48,56,231,151,0,161,11,226,149,6,165,127,1,51,52,228,33,5,
+226,98,17,224,121,5,229,166,1,242,54,0,230,62,8,103,248,224,181,16,
+98,66,227,92,0,224,157,2,192,21,193,64,224,62,1,226,94,3,226,197,
+3,160,44,192,152,226,142,1,160,110,230,83,2,120,226,7,67,32,95,54,
+51,32,95,54,97,145,1,95,55,174,85,225,140,1,0,66,222,245,224,104,
+7,193,15,97,25,183,124,96,76,160,231,160,66,128,60,224,36,3,192,211,
+160,25,70,135,142,130,246,207,4,238,8,1,13,98,97,100,32,115,121,110,
+111,110,121,109,32,117,115,110,75,224,170,0,64,70,230,26,14,160,0,161,
+120,184,0,69,54,177,182,3,32,85,32,95,95,60,2,64,90,32,89,154,
+229,68,0,235,17,0,133,46,229,34,1,229,37,29,96,246,193,118,225,176,
+1,229,34,12,225,173,3,224,36,9,236,163,28,173,84,96,11,192,118,244,
+137,0,207,223,132,202,161,180,184,159,201,12,0,80,134,176,224,241,2,192,
+223,132,215,224,82,5,227,53,0,130,233,78,150,65,173,98,70,251,242,3,
+225,142,8,161,230,227,189,2,128,182,224,220,8,229,89,3,96,50,232,156,
+0,192,222,194,222,225,133,11,225,87,2,229,76,23,224,121,8,239,23,12,
+224,161,11,224,39,1,197,144,243,191,0,252,197,2,197,147,130,16,97,139,
+1,95,51,131,2,5,67,32,95,57,49,52,253,59,1,64,0,124,244,241,
+16,2,2,117,98,115,116,216,8,109,112,108,101,109,101,110,116,101,145,50,
+64,0,66,196,0,54,200,118,111,60,65,102,128,14,1,52,32,66,206,224,
+1,1,255,107,2,64,39,139,207,131,141,186,219,0,50,128,65,139,35,224,
+128,1,2,100,105,99,81,145,64,26,242,93,1,229,89,1,186,160,161,132,
+229,46,8,228,64,0,160,248,116,196,194,5,179,88,146,91,1,48,56,146,
+104,250,139,7,96,159,2,10,65,32,90,178,0,54,98,231,64,19,137,109,
+96,110,106,181,3,95,52,48,55,224,180,2,150,15,6,45,104,97,112,112,
+101,110,97,47,0,58,139,78,97,28,64,125,225,197,4,2,95,49,55,64,
+124,2,85,32,67,247,138,1,224,32,11,227,94,0,227,7,0,224,41,4,
+128,192,128,41,225,248,2,128,33,75,139,0,50,67,240,3,95,55,53,53,
+224,170,2,1,61,62,96,159,224,21,6,245,201,2,160,32,224,89,5,2,
+95,49,55,64,151,83,97,225,215,0,160,229,138,13,97,22,225,21,6,224,
+84,2,0,84,179,140,96,49,246,191,4,110,45,98,24,1,49,56,128,8,
+65,207,1,49,48,108,94,64,7,144,55,96,132,97,183,91,111,96,25,127,
+210,64,79,130,147,236,180,3,65,251,224,83,16,0,57,240,204,7,3,95,
+49,51,51,173,1,66,45,64,82,130,215,242,20,25,128,73,166,239,224,32,
+11,237,82,2,159,217,229,188,9,224,26,12,133,170,229,130,9,96,22,241,
+178,1,165,100,192,186,224,50,11,241,161,1,164,212,224,44,2,160,153,224,
+48,5,192,178,226,79,1,128,7,224,40,8,226,120,7,0,83,98,29,132,
+119,182,72,164,132,0,57,67,230,96,128,66,70,238,64,5,224,142,0,228,
+52,4,64,79,0,67,165,78,161,18,67,163,71,59,192,189,96,118,128,33,
+64,20,65,25,160,110,0,56,98,247,224,101,3,135,181,198,29,224,254,1,
+225,185,18,235,168,0,229,208,23,235,29,98,129,32,230,27,21,225,68,2,
+226,62,9,64,27,242,118,0,2,49,48,55,113,118,129,15,0,89,231,148,
+0,228,112,1,136,38,167,63,64,53,116,125,225,63,2,96,0,225,169,8,
+64,141,224,101,0,143,235,160,52,224,60,2,224,172,4,242,159,6,64,35,
+165,250,1,80,32,128,181,0,80,101,136,64,176,146,69,138,5,1,95,57,
+70,90,64,24,134,44,68,34,96,18,64,104,0,48,128,25,216,30,218,209,
+0,48,79,102,64,24,165,212,102,15,0,55,69,246,228,186,1,1,91,93,
+152,1,96,43,152,1,0,67,137,168,201,174,64,237,0,64,165,191,231,134,
+0,114,252,64,9,0,83,98,149,87,247,132,225,251,102,9,230,74,0,96,
+52,128,154,162,177,0,49,234,140,10,8,99,111,109,112,111,115,101,83,101,
+152,174,97,63,64,202,70,228,0,53,153,245,199,14,130,227,0,54,159,213,
+1,54,51,193,171,65,106,72,38,225,106,6,71,56,133,61,252,1,6,224,
+149,5,128,144,224,143,1,6,104,97,115,70,105,101,108,168,28,68,89,0,
+54,97,84,64,118,224,78,42,2,115,101,116,224,78,13,0,54,197,136,98,
+134,0,54,224,64,6,1,95,51,112,151,249,188,3,4,99,67,111,110,69,
+90,35,193,192,133,202,254,245,1,225,171,1,97,184,104,38,1,56,50,161,
+157,97,64,0,48,171,185,250,131,15,26,67,111,110,116,114,111,108,46,69,
+120,99,101,112,116,105,111,110,46,73,110,116,101,114,110,97,108,46,233,43,
+0,230,221,0,96,95,2,49,48,54,64,167,106,174,104,134,232,135,1,224,
+95,10,4,44,32,97,116,32,193,9,72,159,0,56,198,177,64,207,131,26,
+132,184,139,105,163,204,162,76,100,255,65,39,1,57,51,104,213,160,213,0,
+53,192,118,2,53,51,55,97,142,0,79,226,134,7,161,160,224,231,2,1,
+104,97,97,69,130,59,128,125,195,127,1,80,32,165,143,96,21,201,169,253,
+243,12,64,225,217,118,64,170,133,9,160,10,107,236,224,21,8,64,197,228,
+180,1,132,56,201,229,232,151,0,224,55,4,196,234,96,61,131,84,163,167,
+224,29,11,128,99,64,2,168,48,244,181,1,132,202,84,157,0,56,65,26,
+97,177,0,52,206,168,5,95,49,49,53,32,95,64,127,4,95,49,56,51,
+32,165,118,67,223,70,95,1,95,51,188,243,165,242,105,187,123,19,0,80,
+75,218,133,73,75,127,129,13,227,9,13,7,78,101,115,116,101,100,32,102,
+67,13,10,115,32,110,111,116,32,97,108,108,111,119,235,134,2,225,12,4,
+118,10,225,12,0,134,80,245,131,3,96,21,110,114,224,50,6,245,99,1,
+98,68,207,12,224,155,10,226,172,21,4,101,120,116,114,97,128,174,2,40,
+115,41,162,182,3,66,32,95,52,64,38,132,140,131,164,192,165,66,17,0,
+56,204,131,192,32,241,237,1,128,1,235,216,9,224,26,6,106,142,96,21,
+99,199,97,90,145,38,96,35,64,86,195,226,101,137,162,252,237,8,18,132,
+119,0,53,64,55,128,149,2,57,55,51,64,56,160,33,229,87,0,194,124,
+131,15,254,123,1,166,19,0,85,104,247,229,108,15,166,114,2,54,48,55,
+164,134,0,58,128,182,230,211,0,0,55,65,52,0,49,156,154,65,21,128,
+24,64,47,99,173,71,24,1,95,57,116,43,64,32,217,198,107,240,88,91,
+144,83,225,57,2,0,67,67,231,199,101,224,25,5,100,2,193,28,68,63,
+0,57,229,174,1,198,83,160,57,252,143,7,227,210,1,226,229,1,201,142,
+163,104,227,190,5,101,255,226,96,9,137,157,229,190,4,11,111,114,100,32,
+119,105,108,100,99,97,114,100,226,254,9,138,198,224,195,0,81,62,200,181,
+232,212,0,152,2,160,208,224,255,0,248,109,2,193,230,225,198,1,66,171,
+1,10,65,96,72,4,65,32,64,64,65,129,126,166,57,97,151,105,40,108,
+38,64,25,232,158,1,238,155,11,233,56,0,225,54,4,164,90,96,125,98,
+67,228,148,3,248,228,5,120,33,128,205,227,2,1,141,121,64,125,133,131,
+0,75,224,123,4,180,113,155,149,136,167,145,51,0,95,123,136,224,74,4,
+64,168,99,6,227,97,4,64,89,133,199,216,84,239,203,8,64,34,216,234,
+0,90,66,234,96,17,130,211,64,174,69,204,192,7,64,174,0,58,129,131,
+162,195,198,104,134,102,64,27,232,122,45,0,103,232,43,14,0,52,211,96,
+203,179,241,196,0,64,147,84,34,157,39,96,11,231,241,0,103,37,228,162,
+0,231,17,22,4,80,114,111,120,121,165,136,224,156,3,64,125,130,66,64,
+106,1,80,32,173,116,138,179,64,75,208,199,136,95,0,52,99,91,64,8,
+0,51,128,33,177,30,98,52,0,79,100,54,89,196,0,75,128,28,231,114,
+2,64,164,129,117,64,66,226,130,0,75,35,132,166,128,233,225,125,1,129,
+173,239,26,19,1,50,54,123,17,135,100,239,26,0,226,218,7,98,94,0,
+57,197,166,130,223,231,101,3,90,1,229,139,1,101,115,109,254,64,119,2,
+95,52,50,224,55,0,128,1,140,94,246,40,6,237,26,1,128,42,246,221,
+4,235,114,0,102,138,99,215,239,212,12,64,201,195,218,243,36,1,249,128,
+1,224,5,0,102,248,227,155,2,64,18,0,83,128,152,238,231,13,228,222,
+0,128,24,128,125,166,196,1,55,51,150,197,252,88,0,225,65,1,129,240,
+144,179,210,134,64,191,100,169,64,54,64,76,2,80,32,95,69,110,1,95,
+57,81,26,64,203,128,85,230,155,3,193,89,161,92,230,211,0,96,116,128,
+241,133,0,157,99,225,155,0,173,187,64,37,137,129,224,74,4,213,77,225,
+8,1,224,180,8,224,16,8,106,194,177,47,2,51,49,32,160,173,224,166,
+0,130,16,210,175,65,109,161,10,192,178,128,249,229,154,3,192,148,249,107,
+7,224,180,3,183,71,130,213,228,113,1,226,161,7,167,157,226,135,0,233,
+10,2,128,119,101,167,2,57,53,32,135,166,192,43,225,0,1,166,69,224,
+54,1,1,95,57,75,113,229,42,5,64,132,64,193,116,18,0,49,105,253,
+64,87,0,54,72,48,1,49,48,75,95,96,33,199,190,224,166,16,162,35,
+128,97,172,50,64,64,0,50,97,37,0,57,68,3,230,182,0,64,80,132,
+224,1,80,32,64,11,0,54,227,255,2,227,169,10,134,136,225,144,20,234,
+38,3,96,118,167,168,225,14,23,130,79,225,14,7,179,49,98,154,236,153,
+0,96,86,71,58,96,197,64,38,132,233,70,187,224,182,19,224,214,0,128,
+109,225,208,0,161,28,105,191,191,11,96,85,197,34,242,178,1,74,129,202,
+232,200,21,135,66,64,47,133,60,0,90,64,45,64,14,133,37,253,135,1,
+167,32,167,208,64,33,169,183,224,174,0,0,55,76,3,68,47,228,150,0,
+64,243,235,119,6,99,54,0,55,138,169,226,255,1,1,95,50,100,36,223,
+249,0,50,105,241,191,249,225,87,4,3,67,32,95,55,172,109,236,120,14,
+96,161,64,43,0,58,128,169,183,153,247,137,5,247,143,8,129,3,64,55,
+64,210,6,51,54,55,32,75,32,85,106,55,224,1,11,187,236,128,0,224,
+32,23,224,29,20,224,26,17,224,23,14,224,20,11,224,17,8,224,14,5,
+224,11,2,192,8,96,5,1,95,57,236,131,2,160,0,65,4,203,64,71,
+65,231,92,1,65,166,104,73,0,73,234,209,12,165,6,97,159,98,38,111,
+104,242,240,0,151,117,166,136,230,144,2,87,238,230,54,4,247,45,5,2,
+75,105,110,237,227,0,64,131,131,80,1,95,52,103,158,70,228,135,29,170,
+89,229,224,0,96,9,68,56,166,72,0,51,68,25,1,95,51,102,19,224,
+6,5,108,144,64,3,102,233,192,76,0,83,73,199,1,95,51,99,252,192,
+32,224,106,19,111,153,224,108,1,76,43,96,114,224,108,31,0,82,224,108,
+26,161,186,76,211,128,34,224,110,6,160,103,224,117,2,224,106,9,224,63,
+3,224,113,2,175,223,131,178,192,147,224,40,0,224,108,18,224,115,2,128,
+67,224,61,13,160,106,3,95,49,55,57,225,219,2,25,92,51,52,38,115,
+114,99,47,77,105,99,114,111,72,115,47,84,67,77,111,110,97,100,46,104,
+115,64,25,5,44,49,56,51,58,53,239,223,2,130,54,0,48,233,151,1,
+2,49,48,50,104,235,224,13,0,0,50,224,13,4,102,118,128,13,1,53,
+57,224,11,1,0,54,224,65,1,66,80,204,180,67,14,73,201,64,19,133,
+56,166,36,233,208,1,96,73,103,42,126,169,130,225,64,47,133,56,224,47,
+11,224,57,2,82,36,224,57,0,224,64,6,175,47,224,54,10,224,152,1,
+224,53,9,165,126,1,52,57,226,74,4,110,245,104,51,97,176,96,52,163,
+140,224,6,5,224,33,0,135,254,224,92,2,224,33,14,160,26,224,40,3,
+224,33,13,224,40,3,69,198,97,151,106,145,0,58,128,7,230,236,0,235,
+75,14,96,245,0,83,64,205,132,59,1,54,32,125,144,230,183,0,241,118,
+15,5,97,115,115,101,114,116,66,71,12,100,101,58,32,101,120,112,101,99,
+116,101,100,61,162,68,164,137,252,241,0,98,33,73,172,1,49,48,128,170,
+77,13,81,10,0,79,96,18,0,55,96,8,107,66,96,7,0,56,248,69,
+2,224,132,19,4,44,32,103,111,116,160,115,160,100,160,95,128,0,65,3,
+134,102,198,130,64,17,133,115,5,95,49,50,52,32,75,101,84,97,85,229,
+10,3,4,84,67,69,120,112,148,122,224,25,8,252,73,0,224,26,9,229,
+65,1,224,26,8,2,83,111,114,215,56,3,95,49,50,55,224,168,0,2,
+95,49,51,99,36,96,12,64,156,0,54,133,249,234,171,1,2,50,49,57,
+65,184,107,152,3,49,48,49,51,242,52,0,234,209,6,243,59,14,225,62,
+19,17,77,117,108,116,105,112,108,121,32,100,101,102,105,110,101,100,58,32,
+160,189,0,51,118,45,0,64,178,124,64,150,198,12,1,51,52,73,252,0,
+49,195,202,64,119,102,108,178,49,0,49,131,207,81,22,98,63,194,175,98,
+103,172,53,142,41,64,57,104,68,64,53,206,75,1,95,50,68,36,64,17,
+207,229,226,181,13,226,207,12,252,54,1,234,239,16,199,158,233,42,4,233,
+227,2,170,59,244,194,5,203,32,237,40,4,0,57,105,20,1,57,57,65,
+39,237,40,1,224,94,13,116,10,234,66,1,236,235,5,234,131,19,236,69,
+11,224,173,0,224,200,12,235,65,0,224,51,6,96,130,244,207,6,96,23,
+106,2,0,48,203,172,65,121,212,33,1,49,49,195,27,99,151,131,149,64,
+6,110,238,68,35,226,72,1,4,115,117,99,99,32,226,228,3,64,84,99,
+141,96,90,129,51,96,4,2,49,48,48,66,135,160,23,2,49,48,48,116,
+211,224,13,0,224,142,1,64,7,104,121,96,13,0,58,128,7,240,74,4,
+97,24,117,103,64,37,129,224,129,191,140,109,239,126,2,96,71,84,241,66,
+184,128,91,140,68,224,7,5,64,101,132,46,3,85,32,75,50,82,129,83,
+140,96,22,250,85,0,240,199,0,224,121,5,224,108,4,0,55,67,107,224,
+107,14,64,76,0,54,224,76,35,0,54,67,242,224,76,18,250,94,5,224,
+73,5,160,64,0,48,224,64,8,64,56,249,199,0,0,95,140,106,64,49,
+147,38,2,49,48,48,66,41,107,236,235,246,15,224,70,0,131,241,115,178,
+235,233,4,64,27,195,215,71,88,0,49,64,129,64,20,131,218,97,97,236,
+28,7,64,30,130,127,1,75,50,65,123,0,58,98,109,128,14,82,140,98,
+131,102,209,165,205,98,154,96,77,236,107,12,0,58,66,224,128,130,102,217,
+0,57,116,216,0,67,76,116,64,13,0,57,125,142,140,250,0,58,99,35,
+236,144,3,131,157,192,1,122,39,64,0,224,22,5,192,1,236,132,3,224,
+34,12,224,32,3,224,29,20,224,26,17,236,67,4,0,58,96,189,161,192,
+0,57,131,91,88,32,120,52,0,53,147,224,0,73,71,78,67,192,77,198,
+1,57,57,65,188,0,79,65,10,110,186,247,105,0,64,29,99,216,0,49,
+99,229,64,57,97,64,161,96,129,223,96,43,236,48,6,10,80,114,105,109,
+105,116,105,118,101,115,46,227,249,0,0,58,96,64,1,10,65,224,38,13,
+167,32,0,58,96,107,97,150,224,189,21,67,9,124,38,224,196,0,90,230,
+101,169,2,79,32,64,96,20,66,187,146,182,96,180,224,48,9,137,59,224,
+48,1,101,104,224,48,19,98,14,224,48,2,127,229,224,48,18,0,56,141,
+142,224,48,0,64,15,224,48,3,220,234,96,27,98,127,224,42,1,97,114,
+0,56,64,162,225,114,0,130,3,225,163,12,65,56,131,30,2,80,32,58,
+96,32,65,153,2,57,56,55,64,138,101,163,224,10,2,96,128,0,58,96,
+92,128,37,0,54,64,51,206,111,2,95,57,56,75,36,64,5,2,95,57,
+56,96,247,246,104,6,225,180,0,1,45,62,133,211,0,58,64,66,160,61,
+67,61,0,56,107,227,151,75,64,66,226,38,0,0,58,96,26,128,13,0,
+52,64,13,162,66,161,46,72,41,97,8,226,37,15,96,112,0,58,96,40,
+224,34,15,1,78,97,66,110,0,58,97,107,224,35,15,5,83,121,109,98,
+111,108,96,38,65,195,224,38,15,8,67,111,110,115,116,114,97,105,110,128,
+81,66,31,226,239,25,233,233,0,0,58,97,103,224,91,15,170,43,0,58,
+98,166,105,63,70,253,97,106,0,58,97,210,128,19,0,53,224,61,2,6,
+98,117,105,108,116,105,110,64,92,79,231,64,3,0,58,96,48,97,120,122,
+235,119,91,67,41,64,19,167,236,82,107,180,162,2,95,57,54,65,103,1,
+54,57,64,105,190,32,224,18,8,0,58,99,116,204,211,134,59,126,41,224,
+9,0,171,193,240,46,2,0,57,146,9,128,6,96,86,108,111,128,81,0,
+58,96,6,101,138,109,20,141,23,2,60,32,64,102,51,217,19,160,18,110,
+18,0,85,72,162,65,100,181,99,143,217,176,226,96,200,232,100,5,5,103,
+101,116,73,100,101,97,166,112,204,0,90,64,122,192,138,0,85,81,42,96,
+133,213,155,1,95,57,105,83,138,153,64,250,128,22,212,228,96,116,136,46,
+99,102,252,224,10,64,7,131,68,64,73,96,61,234,214,2,150,14,64,13,
+245,55,0,100,182,169,182,231,125,0,125,240,96,10,0,50,78,70,128,0,
+0,58,96,89,96,82,96,84,165,245,224,87,1,206,151,142,154,128,13,97,
+154,161,90,129,46,192,115,160,251,64,181,142,220,1,95,50,78,232,64,126,
+66,38,1,95,51,67,247,2,64,95,51,161,11,218,15,231,19,11,143,59,
+199,19,74,80,231,19,7,219,100,224,1,9,231,4,91,224,23,14,224,20,
+11,224,17,8,224,14,5,224,11,2,243,157,9,0,58,97,8,225,37,17,
+69,184,225,37,1,163,74,232,57,7,136,51,224,134,1,224,1,3,225,43,
+151,225,18,7,0,58,96,243,233,233,5,233,113,10,128,41,131,131,86,10,
+253,197,2,224,39,6,0,58,108,232,128,38,0,52,224,39,1,234,10,0,
+109,234,132,79,228,24,3,108,132,236,200,0,0,95,135,222,129,114,237,72,
+8,131,73,141,38,249,38,1,195,91,1,95,57,79,13,4,64,95,55,53,
+49,228,132,1,128,121,227,155,1,225,252,2,97,35,0,83,194,1,95,130,
+247,54,0,195,158,1,95,52,64,16,1,95,57,159,221,0,58,96,96,234,
+235,7,225,52,13,64,44,234,127,8,0,90,132,109,224,1,9,227,104,176,
+192,8,247,14,10,0,58,97,82,161,118,224,1,11,224,244,4,225,24,207,
+220,20,96,0,0,58,97,37,228,132,1,0,55,69,185,138,73,130,247,0,
+58,98,153,236,255,8,226,98,14,64,46,241,87,0,224,79,1,103,174,64,
+119,70,69,0,58,67,58,98,134,6,55,54,51,32,58,57,52,199,55,104,
+121,207,94,224,2,3,191,73,225,22,6,187,126,64,0,1,95,54,155,41,
+224,24,1,139,235,0,55,188,88,224,24,3,0,55,64,111,160,18,1,95,
+54,96,228,2,95,57,52,127,89,64,155,0,52,252,209,1,155,103,151,186,
+231,21,0,136,93,204,34,224,25,9,160,135,0,83,232,160,6,68,39,247,
+150,0,160,19,67,241,99,183,231,145,0,68,206,224,12,0,64,70,224,50,
+7,71,221,224,50,5,159,180,64,174,199,52,105,96,192,242,102,31,239,236,
+3,66,1,242,133,1,160,198,232,9,5,189,165,200,117,96,54,191,143,222,
+183,232,44,1,93,108,64,32,65,221,169,208,124,1,228,242,3,1,95,55,
+132,221,224,88,0,160,34,124,36,244,99,1,1,95,55,91,224,220,103,84,
+91,1,95,55,81,44,173,184,128,11,128,0,224,179,3,64,202,225,229,3,
+96,63,64,66,0,54,113,215,128,16,128,160,224,211,0,224,130,0,96,113,
+233,80,0,1,95,55,80,27,192,105,224,206,4,156,208,224,131,3,194,84,
+137,231,217,210,0,39,233,107,4,131,28,192,130,224,50,1,129,70,96,50,
+113,156,225,50,8,64,13,0,51,230,51,4,241,244,4,241,52,13,0,95,
+142,186,169,172,236,90,6,1,36,102,138,213,64,128,0,89,224,156,0,160,
+227,96,144,75,227,170,163,245,207,16,1,36,120,247,10,4,67,45,192,0,
+129,64,224,162,22,244,57,0,253,245,0,96,179,224,185,0,0,64,235,0,
+2,206,218,226,171,14,96,16,225,91,0,98,217,217,45,164,149,228,156,1,
+129,119,99,12,97,112,66,30,129,132,231,155,7,160,51,97,65,224,0,0,
+236,110,6,68,44,227,153,6,65,7,227,203,7,196,59,224,177,0,0,79,
+128,194,97,244,99,47,192,67,65,143,91,98,157,108,232,142,6,108,167,150,
+226,69,131,224,29,6,97,67,192,29,253,124,20,238,52,2,1,73,79,184,
+40,192,0,100,68,129,44,99,3,133,41,83,71,1,95,55,237,33,4,9,
+73,79,46,112,101,114,102,111,114,109,224,67,1,97,43,96,60,162,222,224,
+60,0,228,41,5,64,222,97,58,3,39,32,95,51,76,179,3,66,32,95,
+51,70,126,209,142,65,140,226,80,0,229,11,6,162,56,229,112,9,103,228,
+97,62,224,21,3,77,253,225,162,6,70,10,229,110,8,229,73,3,129,5,
+225,173,5,196,48,132,222,160,12,128,204,102,126,64,212,74,139,1,95,55,
+74,187,96,15,1,57,52,65,54,249,32,3,241,117,1,132,171,224,193,6,
+160,56,224,174,6,230,29,9,128,159,0,90,201,181,96,11,160,13,224,177,
+1,128,9,64,174,226,217,3,97,142,97,202,2,79,32,35,77,175,160,144,
+231,188,4,224,94,3,131,95,229,72,8,135,20,96,10,67,76,196,192,131,
+82,161,229,224,123,7,64,0,230,47,7,0,67,65,38,116,19,211,109,97,
+82,101,74,66,218,1,95,52,66,193,91,185,66,217,96,165,239,14,1,134,
+14,0,51,157,70,1,57,52,68,169,118,94,96,21,121,53,160,0,246,151,
+2,99,39,227,213,2,0,58,103,242,178,230,1,52,54,96,10,64,164,161,
+156,79,178,75,135,91,57,102,187,96,57,232,10,8,93,202,0,95,97,248,
+1,95,57,186,115,1,57,52,121,175,1,57,52,151,12,81,2,0,58,96,
+234,254,18,0,68,183,228,199,1,193,78,230,153,8,102,112,228,224,0,226,
+121,9,100,51,0,39,99,17,96,152,231,8,1,128,78,133,9,227,27,1,
+232,20,0,129,184,231,51,1,224,29,5,231,10,5,160,7,226,62,1,249,
+144,2,1,101,113,220,109,231,21,1,224,87,1,224,14,0,194,22,199,229,
+192,102,192,225,165,188,69,144,122,66,133,200,96,71,196,206,136,61,2,95,
+55,51,131,7,230,102,4,97,216,96,40,0,52,166,81,198,105,232,72,26,
+231,34,16,231,32,1,201,79,193,57,230,59,2,231,47,54,4,64,95,56,
+53,57,249,59,3,130,163,66,46,140,165,0,90,161,247,233,31,1,129,49,
+194,15,226,7,159,96,70,0,57,101,226,128,83,118,171,166,94,0,56,85,
+214,96,48,128,21,96,39,225,167,4,164,163,225,148,117,65,149,0,51,195,
+196,234,176,6,226,101,8,226,85,6,216,182,64,217,148,32,0,32,84,152,
+84,216,197,33,224,200,1,204,118,225,159,0,232,64,3,128,24,228,64,4,
+96,139,0,50,65,149,138,202,227,80,2,107,234,192,57,99,128,68,151,0,
+48,235,150,1,138,185,227,20,5,96,13,136,99,101,202,128,29,0,56,71,
+210,234,154,0,0,56,87,110,64,0,101,21,162,39,65,16,118,37,97,24,
+128,96,1,55,57,226,41,3,0,36,194,40,168,34,0,56,141,124,1,55,
+56,64,91,0,48,80,145,161,131,65,43,142,69,228,64,3,128,200,1,95,
+55,158,129,128,18,225,9,3,75,119,224,13,0,235,108,1,174,121,224,40,
+2,128,178,2,95,57,51,120,196,0,51,126,10,1,52,50,96,254,226,247,
+2,160,207,0,55,116,221,254,214,5,64,33,64,71,68,118,173,16,230,158,
+0,224,244,8,130,107,0,58,65,120,64,209,65,175,227,82,1,0,56,96,
+68,120,224,224,50,1,29,67,111,110,116,114,111,108,46,69,120,99,101,112,
+116,105,111,110,46,73,110,116,101,114,110,97,108,46,112,97,116,64,9,7,
+77,97,116,99,104,70,97,105,88,122,165,16,67,76,161,87,0,57,106,13,
+130,220,0,56,92,189,96,127,64,231,98,125,1,80,32,169,10,64,20,142,
+237,225,53,3,1,95,57,69,102,187,43,97,241,0,58,97,41,112,2,196,
+122,0,80,106,165,67,131,240,2,3,230,195,6,0,66,65,226,154,98,97,
+94,138,189,0,75,225,231,2,193,73,130,193,0,57,106,181,224,46,8,127,
+32,128,0,3,95,57,51,51,100,6,214,209,192,111,225,221,2,231,81,5,
+130,250,224,5,3,128,73,229,41,0,240,111,3,135,223,160,0,128,66,224,
+1,1,233,178,4,247,102,1,230,229,6,224,134,1,224,140,1,224,77,9,
+224,75,5,234,226,0,164,200,192,76,143,89,224,5,3,96,158,160,102,224,
+64,2,227,16,1,68,59,106,183,224,116,4,192,83,236,52,0,224,114,1,
+192,34,105,214,100,110,230,66,4,224,66,1,96,111,224,17,3,0,83,153,
+14,224,52,5,208,105,224,40,3,236,172,6,160,51,174,249,160,206,242,150,
+0,224,143,5,160,62,227,193,4,240,117,4,224,56,0,229,255,0,239,162,
+4,225,220,1,160,35,225,234,3,179,7,160,97,225,172,0,192,154,64,157,
+0,80,99,158,238,171,0,238,195,1,64,46,163,251,164,75,78,241,125,72,
+64,0,160,9,230,139,17,3,79,32,35,49,67,34,173,114,230,135,10,204,
+140,97,106,163,112,96,45,160,111,0,53,64,16,227,26,1,128,40,226,134,
+4,64,27,129,64,226,110,4,236,75,0,241,229,0,163,27,224,34,2,177,
+20,224,128,18,0,56,66,66,224,128,3,225,71,1,226,104,3,224,108,0,
+166,214,140,40,160,144,224,82,5,126,136,0,52,224,84,0,224,91,0,102,
+193,192,40,224,108,3,226,235,2,231,76,5,64,51,90,230,240,127,10,220,
+191,197,172,0,58,100,225,179,239,1,80,32,163,215,0,80,101,26,218,194,
+183,34,199,158,64,7,98,58,0,58,97,244,251,179,3,128,211,64,124,224,
+97,1,226,233,0,224,246,17,98,71,224,246,24,0,58,68,251,128,110,242,
+166,0,233,145,23,0,58,101,82,224,162,6,225,244,1,0,85,230,217,8,
+130,47,177,41,224,13,10,133,33,228,14,0,96,190,70,114,224,69,3,101,
+204,226,26,2,192,69,160,122,0,39,72,252,2,49,55,57,224,176,2,25,
+92,51,52,38,115,114,99,47,77,105,99,114,111,72,115,47,68,101,115,117,
+103,97,114,46,104,115,64,25,6,44,51,57,50,58,49,48,240,177,2,227,
+200,3,129,86,227,192,3,64,0,246,69,11,224,36,8,230,4,4,228,191,
+2,160,83,230,10,1,224,195,1,224,201,6,192,10,71,76,224,85,12,133,
+10,224,55,2,224,96,4,224,102,8,224,103,6,224,55,5,230,122,11,224,
+50,14,96,98,229,240,4,224,52,26,224,195,3,224,31,11,130,5,128,0,
+225,95,11,199,90,224,53,5,224,23,1,239,89,0,128,18,96,30,194,68,
+224,8,10,96,242,224,11,2,174,60,224,94,0,137,153,195,41,128,83,228,
+144,4,194,176,161,170,131,131,230,61,4,209,194,224,76,0,192,20,226,207,
+4,106,116,99,112,0,57,64,5,224,95,3,229,117,5,231,169,4,138,154,
+198,90,142,162,202,43,194,194,229,172,0,234,173,1,175,4,228,54,1,0,
+95,105,72,65,200,1,66,32,247,200,0,183,241,183,233,228,98,2,225,243,
+11,64,41,140,83,242,40,0,148,124,224,144,4,165,68,64,8,200,11,228,
+154,1,229,123,1,192,208,1,95,52,209,141,114,32,160,191,204,186,96,248,
+224,135,4,180,162,224,38,5,66,81,1,95,57,114,92,224,0,2,129,8,
+224,1,3,226,206,8,226,205,5,224,48,9,226,202,2,224,26,7,226,197,
+1,192,17,193,62,97,65,97,33,128,220,1,95,54,245,107,20,84,157,82,
+119,224,0,4,226,226,38,106,250,226,214,3,226,212,0,160,77,226,96,11,
+173,215,160,33,96,53,226,52,0,196,115,96,21,129,149,64,141,130,66,128,
+24,226,67,2,192,133,228,166,0,226,73,14,193,110,128,46,244,1,0,64,
+36,185,85,194,4,83,215,122,164,192,0,194,84,228,92,3,229,191,3,96,
+121,225,53,1,131,43,225,29,1,224,11,12,228,24,55,128,102,228,194,6,
+64,72,223,220,192,0,193,42,192,236,224,140,1,160,182,224,155,0,3,95,
+54,55,50,224,60,3,226,5,8,160,98,224,101,4,73,199,92,24,2,95,
+57,49,170,55,230,218,7,230,62,5,128,237,224,164,5,163,28,160,43,98,
+173,161,68,106,161,72,221,242,244,6,194,46,169,222,192,225,72,11,129,171,
+128,64,65,216,213,145,1,95,57,226,232,2,161,100,229,33,3,64,16,117,
+245,1,57,49,189,71,226,72,0,145,39,1,57,49,96,40,64,21,128,16,
+0,50,164,106,224,42,2,224,45,0,65,193,85,156,97,30,0,57,180,2,
+0,57,132,205,96,167,99,196,137,72,128,178,96,16,192,100,224,86,0,225,
+187,1,163,31,66,131,228,203,0,160,198,229,236,7,99,40,78,103,162,196,
+228,13,5,253,213,6,96,147,97,115,228,235,6,97,46,183,188,164,247,224,
+39,5,224,38,5,224,37,2,160,131,192,229,129,136,128,229,0,90,110,249,
+141,118,161,230,235,106,4,222,214,0,85,247,221,0,160,76,169,250,237,178,
+1,226,76,0,96,65,237,106,3,64,1,196,14,192,19,225,203,0,224,111,
+12,224,59,5,163,230,225,124,2,238,196,9,106,214,224,55,0,96,93,194,
+112,230,147,3,228,84,18,160,0,0,58,112,169,145,83,169,72,97,98,227,
+117,0,255,9,4,228,229,1,233,190,2,226,252,1,240,199,3,224,208,0,
+235,6,13,224,63,0,206,121,228,74,3,174,85,160,214,101,120,131,144,99,
+148,134,97,86,251,163,80,252,169,8,64,0,3,95,57,50,57,108,130,242,
+50,0,248,118,4,0,39,248,119,5,100,65,216,125,0,50,67,128,1,95,
+57,81,63,0,58,96,69,148,112,96,177,84,116,177,97,224,206,0,225,182,
+2,224,21,24,224,227,5,224,46,8,160,35,195,205,149,18,128,28,247,218,
+0,128,84,228,225,2,131,129,228,14,0,224,22,0,179,204,64,49,227,198,
+0,98,33,96,29,186,232,143,158,1,52,56,83,199,184,28,129,70,96,54,
+225,252,11,229,133,0,64,71,224,42,0,128,33,134,98,225,238,9,224,15,
+5,224,66,1,224,94,1,231,208,2,96,19,168,73,253,139,3,128,74,160,
+242,176,56,194,43,96,26,0,90,66,130,160,13,249,252,1,1,64,64,68,
+67,129,181,96,0,0,58,97,218,243,178,1,96,71,162,97,96,95,192,5,
+202,180,224,194,0,246,180,6,128,22,243,175,4,224,25,2,160,90,225,40,
+1,192,18,128,5,131,155,1,57,50,85,26,182,243,128,6,136,42,130,148,
+101,192,1,50,53,129,123,96,224,132,210,224,14,5,2,95,54,51,162,202,
+160,0,247,229,13,225,205,0,226,56,1,164,41,225,8,1,98,33,1,95,
+57,168,14,224,0,2,247,144,7,0,110,183,254,247,167,7,215,168,67,68,
+124,26,160,166,166,39,220,170,64,175,0,50,131,135,124,174,156,38,161,231,
+188,151,225,185,3,0,58,96,146,143,185,0,57,83,172,193,177,160,56,0,
+54,129,117,1,95,51,80,79,64,45,208,121,165,184,80,203,139,109,131,16,
+65,149,129,94,0,55,92,185,97,166,132,144,231,243,0,128,42,229,76,1,
+0,58,96,119,176,231,67,91,225,70,0,224,2,1,161,53,226,240,1,102,
+237,198,11,224,23,2,128,1,230,38,1,233,41,6,238,249,14,224,98,12,
+229,29,0,130,181,195,130,229,86,4,64,18,224,41,1,165,70,170,5,160,
+23,224,17,6,96,8,194,37,252,64,1,252,37,4,252,38,1,224,93,1,
+225,98,0,134,26,224,89,1,224,8,0,1,95,55,120,179,97,92,1,55,
+49,65,224,241,126,9,1,61,61,248,230,1,250,227,4,64,0,134,249,230,
+255,2,128,1,163,250,224,16,16,64,112,67,192,0,54,82,3,130,252,84,
+49,0,56,65,234,98,151,0,35,64,225,222,222,224,70,1,186,107,241,110,
+21,9,69,110,99,111,100,101,68,97,116,97,209,113,5,49,53,50,58,49,
+51,241,113,2,225,253,6,228,169,0,224,22,5,235,228,0,224,45,28,224,
+22,0,193,234,235,44,1,224,14,0,224,51,3,177,40,230,97,1,97,166,
+121,79,225,148,15,4,79,32,35,54,48,233,14,0,225,143,11,64,88,226,
+100,1,226,160,3,226,122,4,101,102,160,50,192,0,226,41,0,165,60,133,
+109,197,187,0,58,101,29,1,10,65,89,108,0,58,103,158,100,81,100,17,
+88,215,128,3,1,80,32,72,119,164,89,229,234,9,136,222,2,95,52,57,
+106,57,66,214,0,90,129,56,64,14,66,148,160,14,230,105,6,234,119,4,
+202,72,65,158,0,75,66,52,128,24,224,55,11,2,64,95,49,85,71,139,
+107,0,58,96,6,252,240,0,193,158,66,100,0,58,75,151,228,162,2,64,
+33,96,7,99,245,233,141,3,232,180,1,246,88,2,128,23,160,87,248,195,
+3,0,85,216,82,163,125,234,222,22,224,37,11,224,36,1,194,94,0,67,
+91,4,3,56,32,64,80,64,7,0,57,65,253,160,74,0,58,108,48,97,
+149,0,58,108,184,64,235,241,103,0,233,113,4,96,162,121,101,224,184,15,
+75,195,181,241,132,121,224,149,3,96,57,172,14,192,36,224,37,9,96,24,
+221,121,237,120,4,0,67,72,240,234,32,0,246,236,3,0,58,96,32,230,
+171,10,0,51,93,84,0,50,228,151,4,7,99,111,110,65,114,105,116,121,
+195,214,107,86,0,52,226,54,5,96,132,0,58,110,143,166,175,0,49,156,
+254,0,49,97,245,134,67,230,47,1,224,9,1,96,120,0,57,71,22,134,
+221,107,184,199,11,1,95,49,101,114,129,37,0,55,96,231,0,58,96,88,
+230,229,7,133,153,128,85,254,229,1,96,64,192,53,214,207,239,7,0,1,
+95,55,96,53,175,92,1,55,55,237,203,0,96,146,0,55,96,56,1,95,
+54,96,227,129,88,237,237,1,158,172,96,86,190,110,130,233,161,250,134,48,
+227,32,0,202,98,1,95,55,88,26,163,7,131,34,0,75,109,154,241,97,
+2,226,61,14,224,25,12,68,39,130,204,106,133,174,72,64,20,227,171,1,
+79,170,137,55,224,37,22,230,239,3,96,0,224,49,6,64,134,224,48,4,
+0,90,201,159,224,38,23,175,135,251,93,2,98,68,132,28,227,236,12,96,
+40,133,74,224,90,2,97,143,244,13,9,130,246,128,17,224,49,19,160,32,
+102,106,241,159,13,1,95,49,127,210,231,14,1,225,64,18,143,135,225,63,
+8,229,17,1,64,0,0,58,116,162,229,136,0,228,31,15,102,83,224,25,
+12,96,94,129,38,224,25,6,96,168,192,25,228,87,4,142,240,224,184,16,
+96,30,224,185,10,0,50,242,74,1,128,59,129,86,225,83,8,64,120,225,
+133,8,128,44,225,82,0,161,72,224,88,5,194,6,233,61,1,224,164,17,
+64,93,224,163,21,225,21,13,202,212,225,21,9,114,94,224,111,16,110,251,
+225,19,26,224,58,10,100,174,224,170,21,224,59,16,64,34,224,59,22,227,
+249,14,224,231,3,224,25,4,100,18,225,1,12,166,133,224,138,14,227,183,
+8,128,138,0,49,108,89,224,197,21,228,74,14,2,57,48,50,80,110,237,
+83,2,224,65,16,101,36,224,65,11,180,20,226,234,16,224,210,20,227,253,
+3,224,85,2,224,146,2,224,58,16,227,35,14,229,29,2,64,31,104,242,
+100,214,0,58,96,6,163,232,1,95,57,107,98,128,193,96,107,128,17,109,
+179,160,17,0,58,96,219,224,48,1,0,52,122,36,0,53,70,25,64,32,
+7,10,65,32,102,47,61,32,58,96,18,64,12,0,61,96,12,231,69,2,
+103,255,0,66,79,5,113,44,128,6,0,58,64,103,64,34,70,208,1,52,
+57,96,214,165,27,163,206,228,249,14,228,251,1,96,183,224,7,2,117,202,
+81,100,97,207,96,184,135,72,64,95,104,151,104,104,193,12,136,5,64,6,
+64,133,1,32,83,129,91,226,195,12,195,171,224,25,9,196,219,224,25,9,
+71,250,64,146,233,74,13,103,132,2,95,55,55,65,76,2,55,55,53,200,
+234,107,189,135,239,224,19,0,96,68,80,215,0,50,71,212,112,189,207,171,
+103,217,246,250,4,149,55,240,94,1,129,75,143,35,1,66,32,112,12,214,
+241,3,95,49,53,52,64,4,6,54,32,64,79,32,35,49,75,8,137,126,
+2,95,49,50,66,20,0,52,133,55,96,17,0,55,64,42,0,54,73,26,
+2,95,49,49,96,109,64,9,1,56,51,137,75,192,0,233,237,9,97,3,
+73,238,160,24,128,141,108,202,188,104,224,6,5,64,0,193,246,229,198,4,
+130,218,131,4,228,75,11,96,134,234,109,15,96,116,65,48,160,100,128,65,
+1,95,56,66,190,1,95,53,65,10,2,53,51,55,234,182,3,128,52,96,
+50,0,56,123,185,129,99,253,26,5,224,135,12,100,5,224,135,8,96,21,
+224,82,0,65,195,241,150,7,0,102,239,78,1,64,34,1,54,48,73,226,
+125,143,96,49,98,19,224,50,14,224,156,9,139,95,2,95,56,55,76,9,
+224,23,2,129,126,226,170,9,229,136,4,224,25,4,101,81,192,232,226,199,
+4,101,246,161,148,3,95,56,56,52,194,173,1,95,52,65,74,204,126,129,
+251,237,55,2,128,67,237,55,12,133,189,224,32,18,199,199,225,94,8,192,
+24,190,49,211,173,0,52,68,132,160,83,224,48,5,172,171,207,43,96,193,
+0,53,66,209,68,136,128,0,227,184,8,65,36,0,85,77,94,131,147,226,
+107,15,2,95,56,57,220,220,128,92,224,154,2,2,95,57,52,79,153,225,
+33,5,226,72,14,226,208,20,224,154,0,196,178,224,37,10,234,118,2,193,
+124,128,43,230,66,0,224,48,1,162,33,133,94,252,250,1,224,52,21,160,
+191,224,52,6,224,10,0,224,52,13,225,16,0,224,41,2,192,229,150,100,
+64,42,234,160,3,226,246,6,0,68,81,193,11,76,105,115,116,95,84,121,
+112,101,46,43,43,241,192,0,128,83,227,231,3,227,232,4,224,0,6,196,
+138,99,99,228,131,8,88,69,236,4,0,111,90,130,222,239,95,7,0,58,
+96,50,70,98,1,49,50,69,76,1,52,50,160,32,2,64,95,56,80,229,
+1,95,49,71,72,128,17,0,58,96,6,109,72,224,168,0,78,188,160,186,
+229,147,7,224,242,1,11,105,109,112,111,115,115,105,98,108,101,58,32,160,
+237,130,42,181,6,128,61,69,179,1,56,57,170,59,98,99,254,16,0,224,
+94,11,2,79,32,35,65,94,242,53,1,64,64,252,57,1,96,174,168,39,
+224,218,3,64,95,175,190,114,21,189,124,102,48,0,51,73,132,0,53,162,
+253,224,115,14,1,52,52,224,115,0,161,129,224,65,3,134,114,224,56,12,
+79,100,230,158,14,193,100,64,155,0,58,96,6,168,86,97,220,161,228,97,
+207,226,75,11,4,82,97,116,105,111,130,76,2,95,109,107,96,13,2,110,
+97,108,229,142,1,99,207,2,95,56,57,170,147,224,15,0,69,0,0,58,
+100,13,2,10,65,32,97,105,0,58,96,20,96,13,0,75,96,13,137,3,
+72,90,129,172,66,56,90,212,1,53,57,66,26,0,53,79,198,116,221,1,
+95,56,80,200,1,56,57,162,180,3,32,95,52,55,160,36,224,37,5,1,
+57,49,224,37,1,224,215,24,11,73,110,116,101,103,101,114,46,95,105,110,
+116,67,47,1,84,111,160,17,224,218,2,70,219,65,109,70,63,102,102,244,
+56,2,1,95,56,96,128,224,105,33,161,67,1,105,110,224,106,11,229,103,
+6,200,67,64,0,0,58,97,81,97,54,0,67,69,248,104,172,0,95,73,
+163,64,33,164,49,0,58,96,141,225,105,2,180,53,1,56,56,71,40,200,
+145,2,56,56,56,64,18,5,57,32,95,54,54,32,100,213,140,126,139,95,
+224,29,15,0,58,97,83,9,10,65,32,117,113,117,111,116,32,58,64,34,
+64,14,0,73,64,10,243,61,0,64,105,225,220,2,65,145,113,163,0,80,
+128,74,0,85,96,20,129,255,145,95,177,222,164,132,160,16,247,108,4,1,
+95,57,107,16,99,6,0,56,75,14,68,53,200,161,0,79,196,151,98,245,
+161,165,233,1,1,203,24,252,47,5,1,95,56,85,166,96,49,2,95,56,
+56,131,138,0,58,71,157,128,185,96,119,0,95,98,75,72,27,64,35,107,
+40,96,42,146,26,231,170,1,198,144,210,163,133,204,96,185,96,198,230,156,
+1,75,219,133,59,221,226,192,7,160,234,224,255,1,224,254,1,0,83,64,
+57,254,35,0,229,188,10,64,135,64,54,2,95,56,56,65,219,1,54,52,
+174,105,98,69,66,168,0,55,205,240,84,253,96,200,128,237,171,244,221,114,
+2,95,55,57,244,33,3,1,36,118,155,0,96,67,243,155,3,96,252,232,
+128,0,225,191,1,64,237,231,103,0,231,79,0,97,2,160,182,64,15,193,
+185,96,183,193,255,65,146,160,47,223,70,64,208,0,55,66,85,225,181,2,
+128,29,65,49,234,131,0,128,25,65,222,96,248,243,150,0,0,56,115,234,
+197,164,225,162,0,160,170,192,140,248,85,3,232,29,8,198,227,192,187,152,
+208,160,58,129,171,67,82,0,53,227,230,7,13,66,111,111,108,46,111,116,
+104,101,114,119,105,115,101,231,118,0,216,50,224,244,0,248,80,0,129,22,
+78,22,224,38,1,224,23,0,0,55,184,158,128,23,0,58,97,227,131,58,
+2,83,32,64,251,148,0,227,53,0,192,87,224,17,2,192,102,227,109,0,
+64,14,115,197,230,212,0,225,15,5,192,45,65,204,154,252,225,22,3,125,
+205,224,55,4,193,26,194,177,224,131,0,224,88,1,219,203,128,146,206,162,
+227,249,3,195,167,226,57,0,94,83,1,52,48,235,46,13,128,30,135,17,
+130,221,196,25,193,49,3,95,53,51,56,236,169,4,228,41,8,225,136,1,
+226,125,1,0,39,66,96,160,41,0,56,67,99,128,124,227,163,1,0,95,
+98,144,172,50,0,64,226,96,1,227,202,1,193,85,240,220,0,161,134,110,
+109,161,17,93,115,250,186,2,98,242,161,115,160,51,228,255,0,213,15,96,
+240,126,204,1,95,55,72,178,128,0,193,68,228,48,2,226,224,11,225,95,
+14,253,100,1,224,16,1,1,95,55,100,62,96,146,227,51,9,235,79,0,
+1,95,50,65,29,247,10,0,133,64,224,167,14,224,22,8,232,144,0,226,
+129,0,192,36,228,245,5,68,210,91,63,120,12,252,179,7,124,154,2,48,
+58,48,99,95,160,70,130,103,224,46,25,137,237,128,0,228,245,7,0,109,
+231,139,0,65,237,4,54,57,32,95,51,133,80,96,16,64,245,70,95,0,
+83,90,156,225,86,7,65,52,225,12,0,160,48,0,55,109,41,224,59,0,
+0,50,141,56,102,93,1,48,57,66,71,116,166,224,131,6,0,112,253,108,
+2,2,95,54,55,71,141,124,212,1,64,58,98,119,102,128,1,95,55,73,
+82,130,225,0,58,96,30,178,70,239,248,1,0,80,161,120,66,223,131,117,
+0,80,104,91,237,93,2,0,52,103,88,161,64,236,137,1,177,8,98,163,
+0,80,239,27,1,129,252,66,189,130,95,145,58,193,179,242,120,3,235,174,
+1,0,83,226,222,1,64,122,192,72,203,23,102,13,198,179,224,174,1,160,
+120,208,91,185,183,128,37,227,115,1,2,95,56,55,227,163,0,64,24,251,
+82,1,224,10,1,0,58,97,98,198,191,163,243,229,49,1,227,13,5,99,
+46,230,216,0,194,249,160,188,238,120,7,213,208,197,89,230,92,5,224,43,
+5,174,3,225,97,2,239,185,12,165,91,129,55,163,106,243,14,4,252,89,
+3,238,17,2,229,156,7,100,55,193,39,224,116,0,192,121,224,84,1,97,
+140,224,44,2,64,120,119,251,161,206,96,0,230,88,5,224,221,11,161,127,
+161,92,224,40,18,164,184,225,113,0,238,241,4,224,28,2,132,245,220,194,
+67,1,192,237,97,194,0,80,96,175,165,167,0,53,78,63,128,190,125,12,
+160,181,225,43,5,166,240,96,11,232,166,2,241,95,18,225,255,1,224,32,
+8,132,191,225,19,1,224,32,8,198,164,243,161,13,224,225,2,229,223,4,
+232,123,9,96,30,160,254,160,212,195,60,64,153,225,205,6,249,14,1,224,
+50,0,224,87,8,177,208,254,124,5,225,226,27,225,58,0,225,225,21,237,
+9,0,226,155,11,224,27,1,64,199,240,247,4,206,223,128,30,225,241,0,
+226,141,10,128,225,193,89,224,55,0,187,222,96,28,0,82,224,220,4,240,
+65,4,240,62,19,7,112,97,116,86,97,114,115,32,133,124,144,151,102,84,
+160,225,150,91,0,50,108,20,136,97,102,253,132,235,96,127,0,58,68,143,
+105,157,70,30,0,90,231,156,0,160,54,0,53,119,142,97,49,128,17,209,
+192,153,145,111,186,162,13,224,31,12,80,19,97,55,224,29,5,0,51,106,
+242,3,95,52,48,51,230,67,2,1,91,93,128,198,224,45,29,1,40,41,
+128,45,224,36,20,1,45,62,230,150,3,0,56,87,146,96,242,239,203,1,
+2,95,56,55,70,252,0,58,96,27,6,10,65,32,104,101,97,100,96,59,
+0,58,96,24,172,108,1,53,49,85,164,0,54,166,184,140,132,235,237,0,
+131,212,71,194,97,193,67,215,230,227,0,204,135,70,26,149,87,0,80,96,
+23,139,17,98,56,71,155,6,80,32,85,32,90,32,90,72,60,197,13,1,
+95,56,65,171,247,237,1,201,26,64,51,68,21,224,7,1,65,1,134,188,
+224,0,0,104,7,64,178,97,159,0,58,72,19,128,111,2,83,32,85,226,
+105,0,164,173,164,178,105,200,161,251,110,142,128,21,66,21,163,68,200,54,
+169,253,166,65,196,12,150,122,65,185,65,47,96,142,1,95,56,195,31,192,
+215,96,240,96,216,136,248,71,55,165,243,224,141,5,192,36,168,22,237,198,
+0,166,237,167,138,227,79,0,160,254,121,71,96,8,227,76,2,2,95,56,
+54,196,66,102,143,137,73,2,95,56,54,133,188,0,58,97,40,236,158,0,
+132,43,0,83,234,225,2,64,140,130,230,224,27,0,107,12,128,27,193,158,
+224,16,2,236,147,4,192,1,172,110,224,19,2,165,218,224,16,13,203,75,
+199,230,225,225,1,192,21,64,120,224,15,1,2,95,56,54,168,142,192,51,
+232,47,0,0,67,224,175,6,171,203,230,251,3,229,34,4,224,42,2,230,
+118,0,119,63,0,51,90,38,160,33,224,60,3,182,73,224,174,0,136,128,
+224,138,2,192,2,160,24,132,155,128,55,224,52,1,224,55,2,226,107,0,
+104,222,128,5,128,154,139,45,110,195,178,100,197,230,224,100,1,192,198,224,
+71,8,129,19,97,37,64,214,100,56,0,52,224,70,5,1,95,49,105,182,
+64,151,130,188,193,252,227,135,13,161,214,64,8,195,146,161,198,225,183,6,
+129,170,224,0,0,129,87,224,196,1,224,43,0,84,252,158,23,224,157,4,
+251,153,8,227,237,0,1,95,49,128,32,135,125,96,68,224,53,0,0,95,
+69,217,251,196,4,165,243,192,220,194,215,64,181,2,95,56,53,83,60,1,
+49,48,252,11,14,240,89,1,2,95,56,54,97,24,193,6,163,177,196,139,
+224,20,2,162,208,64,0,0,58,99,110,241,146,3,229,47,0,232,19,0,
+64,57,232,232,2,167,37,96,81,246,237,1,65,210,203,233,128,25,202,51,
+108,185,137,214,0,58,96,162,224,109,13,226,34,1,168,137,229,65,6,0,
+58,99,73,103,16,1,95,56,158,188,3,95,52,50,56,162,10,0,55,65,
+53,0,54,109,46,0,58,100,87,182,142,1,56,54,116,163,0,53,71,100,
+0,56,73,209,0,58,96,37,160,130,226,59,9,226,29,4,178,65,64,0,
+1,95,56,67,98,0,58,96,66,128,90,224,192,0,96,231,193,43,195,212,
+195,100,97,52,164,178,229,169,0,226,124,5,197,141,128,165,0,58,96,104,
+96,159,101,53,220,87,0,52,72,100,161,120,0,79,248,67,3,98,43,80,
+70,0,53,86,234,0,52,86,213,197,100,0,58,96,253,103,42,1,48,57,
+64,133,0,58,96,36,64,16,126,216,1,54,55,88,191,109,9,3,95,56,
+52,55,96,31,237,252,0,1,95,56,64,69,1,95,56,72,216,199,54,65,
+102,225,129,2,192,177,64,34,118,24,3,53,52,32,58,96,19,167,158,118,
+228,0,51,98,204,1,95,56,88,165,0,58,64,34,96,96,165,41,128,89,
+129,117,70,116,139,142,234,29,3,228,198,5,1,95,56,134,194,224,32,0,
+238,41,2,160,26,231,19,3,160,19,129,141,135,62,71,103,227,66,12,128,
+161,224,44,7,131,167,192,27,224,28,7,96,112,224,28,15,96,20,224,28,
+0,100,147,130,49,132,16,228,101,1,3,32,95,52,49,196,27,224,155,6,
+181,109,65,203,64,71,195,58,131,142,103,218,232,117,5,230,25,2,204,22,
+224,30,3,101,167,142,157,64,5,204,146,64,47,135,27,128,13,192,46,96,
+16,225,79,2,64,56,245,131,4,224,56,1,224,19,3,224,62,2,161,20,
+114,155,230,116,3,160,108,192,28,64,16,121,129,198,200,228,78,2,224,41,
+1,227,150,0,226,5,0,128,0,241,163,10,20,115,114,99,47,77,105,99,
+114,111,72,115,47,73,110,116,77,97,112,46,104,115,113,184,3,55,51,58,
+49,234,124,2,65,88,131,211,203,220,99,25,65,127,131,149,98,195,1,56,
+53,65,156,0,58,99,18,247,213,7,99,108,160,154,0,58,96,40,202,65,
+114,215,154,59,132,23,129,26,231,245,0,193,172,84,40,113,27,238,99,2,
+64,1,237,25,0,174,64,120,1,70,35,211,12,225,237,2,193,92,246,159,
+0,0,80,229,131,1,231,113,2,241,141,3,1,95,56,83,62,197,194,192,
+7,167,203,229,191,3,226,53,0,141,156,1,95,56,165,206,196,185,128,11,
+124,28,0,58,100,24,100,12,0,51,82,147,132,85,64,26,96,19,3,52,
+50,32,58,96,19,193,34,64,37,128,212,68,134,0,95,109,171,0,58,96,
+95,128,47,0,52,117,38,0,58,96,29,96,51,165,96,194,102,137,50,224,
+224,3,238,124,2,225,11,0,196,36,99,122,64,86,207,19,224,46,3,131,
+189,193,103,140,188,130,102,162,165,180,116,1,56,52,253,110,0,129,69,160,
+77,230,194,0,226,228,5,233,111,10,160,24,225,213,0,169,120,192,85,192,
+1,160,138,224,137,1,231,251,15,224,75,59,232,142,2,224,75,23,167,159,
+224,75,17,227,155,2,224,248,1,229,168,0,97,93,0,56,84,55,169,245,
+160,35,236,198,1,224,31,6,224,122,0,228,53,4,96,40,224,39,5,224,
+40,8,224,11,0,160,47,224,46,6,66,192,156,1,186,213,0,58,66,112,
+102,225,161,167,239,176,0,225,132,23,224,40,26,129,97,247,195,0,225,62,
+23,96,171,99,49,64,10,224,5,0,162,192,224,26,5,224,27,0,113,33,
+224,30,2,224,31,12,160,33,224,27,6,224,34,0,104,84,66,211,225,29,
+4,0,58,98,246,2,10,65,32,119,104,0,58,96,44,163,196,235,90,0,
+224,10,6,225,121,1,232,236,0,0,58,96,120,96,55,234,158,2,64,27,
+0,58,96,114,190,1,68,20,190,1,68,162,246,141,6,2,95,56,51,126,
+208,119,252,83,153,101,169,0,58,101,22,224,42,6,101,45,104,223,81,179,
+255,67,9,70,23,0,33,134,13,0,73,64,213,68,207,161,254,133,152,171,
+199,194,160,160,128,228,27,1,160,31,204,159,227,254,9,227,249,11,231,8,
+7,129,46,227,238,33,224,63,0,163,82,227,220,32,128,56,166,44,227,195,
+28,225,64,0,224,10,4,224,11,15,227,79,5,0,58,96,22,152,97,0,
+49,88,161,141,66,72,211,0,58,96,33,192,26,237,93,0,160,26,194,104,
+127,223,80,111,194,48,128,16,194,65,133,125,0,50,71,12,233,243,3,65,
+21,228,33,0,114,179,141,184,165,196,0,55,98,54,108,91,186,68,77,142,
+213,16,64,54,232,6,11,101,219,202,168,107,78,226,229,1,250,157,6,97,
+94,64,152,127,237,128,92,2,95,55,48,109,209,237,200,2,129,206,148,107,
+0,58,122,155,98,187,160,193,160,221,0,55,120,227,192,199,64,146,0,55,
+96,86,128,167,128,84,96,107,96,93,128,76,236,216,3,128,79,135,243,77,
+47,1,48,55,96,7,244,183,6,3,79,32,35,49,87,191,182,249,1,49,
+50,65,144,103,206,128,0,1,95,55,64,42,238,126,12,162,89,0,58,96,
+237,227,124,0,120,114,0,32,233,208,1,175,5,96,152,99,85,227,141,5,
+8,33,33,58,32,101,109,112,116,121,251,47,0,131,71,143,108,195,106,192,
+68,240,34,14,96,168,224,87,9,0,60,155,166,0,58,97,34,131,218,105,
+105,236,153,2,128,11,105,167,0,58,98,78,238,160,1,224,206,1,175,4,
+160,2,193,130,227,123,0,248,189,5,224,40,24,153,45,232,49,3,224,40,
+15,234,16,0,168,158,227,188,2,249,205,2,249,165,4,164,30,249,203,15,
+163,54,196,77,184,206,160,59,163,37,224,104,11,154,120,224,66,3,228,86,
+5,224,112,4,161,9,224,150,3,225,21,25,172,236,224,39,24,185,221,249,
+124,23,249,58,68,96,242,68,48,99,134,88,87,72,42,96,5,2,95,55,
+56,96,185,1,95,55,139,235,160,0,64,87,224,81,8,250,152,6,196,148,
+100,137,163,230,1,54,48,67,54,151,160,163,191,2,56,50,51,221,101,0,
+56,129,134,132,87,184,169,224,107,14,161,78,224,231,3,243,24,0,249,49,
+4,224,49,0,165,209,224,41,4,226,119,0,104,185,227,211,1,146,197,198,
+38,96,36,132,149,0,53,108,20,160,10,64,239,207,18,237,49,0,66,178,
+2,95,56,50,220,244,192,0,128,68,230,215,9,250,54,3,226,106,11,225,
+164,1,230,6,1,161,64,193,32,226,135,4,219,219,1,58,56,65,118,99,
+236,0,80,143,105,102,95,64,151,168,217,160,22,152,27,64,181,96,23,97,
+59,102,36,0,55,95,66,136,29,96,222,65,190,1,55,56,232,48,0,158,
+126,108,117,64,123,64,140,205,226,1,95,56,89,72,0,58,97,216,165,247,
+3,95,52,48,52,129,36,2,52,56,55,64,223,228,227,7,153,180,0,58,
+96,57,224,160,1,130,15,128,161,248,213,4,131,158,128,24,178,6,6,52,
+51,56,32,85,32,83,225,88,6,65,11,224,19,7,69,24,224,19,6,96,
+79,224,19,7,71,238,234,210,0,228,144,2,0,85,64,108,98,174,131,18,
+121,210,229,157,5,12,103,101,116,83,76,111,99,32,69,85,86,97,114,239,
+145,0,224,76,7,64,156,64,60,70,80,107,241,227,5,3,121,154,160,16,
+74,242,96,202,160,0,96,113,224,44,3,128,93,224,230,5,142,124,224,113,
+5,64,176,89,245,224,60,6,224,18,1,0,52,237,240,0,0,85,66,8,
+224,19,2,1,95,50,254,52,0,225,80,7,66,236,224,125,7,99,244,229,
+100,6,67,48,224,125,12,224,142,16,224,222,1,224,95,7,225,156,10,71,
+195,224,76,2,200,249,225,72,3,225,44,0,224,241,11,224,216,8,64,65,
+224,18,6,129,84,224,138,5,99,19,224,138,6,66,79,224,234,12,108,164,
+225,235,2,97,218,132,205,225,129,9,192,36,165,89,224,120,6,64,21,224,
+119,6,66,218,225,78,7,224,15,1,96,107,193,2,224,157,3,96,24,175,
+249,225,6,9,129,106,224,18,4,64,176,224,122,6,66,4,224,241,12,132,
+154,224,133,6,201,128,225,75,7,226,179,10,226,178,23,224,210,3,225,210,
+9,0,58,96,30,228,32,1,225,127,7,98,37,224,74,8,0,58,96,161,
+228,86,16,225,17,37,224,168,11,224,19,29,225,29,31,225,240,7,225,26,
+17,226,4,6,64,232,138,20,160,232,226,19,6,166,198,0,58,97,39,225,
+14,3,228,176,27,167,163,96,62,183,55,64,62,70,52,224,160,6,224,12,
+12,226,148,2,0,58,96,76,224,64,1,224,66,3,161,236,224,242,7,227,
+222,7,224,15,7,0,58,96,91,224,248,9,224,31,2,245,58,0,64,33,
+143,49,1,52,48,135,255,0,90,160,251,128,40,134,154,96,38,76,154,224,
+122,26,166,179,140,245,4,49,50,32,95,56,76,189,2,64,95,56,76,245,
+1,58,56,77,130,64,31,1,55,48,119,59,6,50,32,79,32,35,55,53,
+167,229,0,58,96,36,224,30,8,0,57,224,30,1,235,230,2,245,69,5,
+98,56,232,65,0,233,224,4,235,175,2,160,5,224,21,10,96,18,137,65,
+224,77,0,233,72,3,139,238,192,40,160,11,224,17,15,130,198,224,81,3,
+210,220,224,39,7,224,141,1,224,25,3,254,2,7,128,80,2,95,55,56,
+233,123,0,224,70,9,168,183,224,117,7,110,142,157,3,224,206,1,151,215,
+65,63,0,79,117,189,3,57,32,79,32,139,6,233,108,0,224,97,1,131,
+167,160,91,160,144,245,156,2,96,62,233,57,3,225,131,12,236,167,0,169,
+233,99,229,203,46,224,60,2,193,212,128,85,128,20,128,72,224,77,1,2,
+95,54,52,78,204,80,80,192,89,224,75,1,160,104,224,21,6,96,50,96,
+190,144,37,103,239,2,95,55,57,232,216,3,1,36,104,238,199,0,96,36,
+128,50,224,49,20,1,118,115,248,146,1,129,111,2,95,56,48,99,215,160,
+13,139,84,138,254,1,95,56,74,40,203,97,112,2,0,39,97,128,252,25,
+3,161,13,238,93,8,80,45,0,48,209,208,171,32,224,25,0,194,23,130,
+98,1,58,56,67,201,243,228,0,74,107,132,106,128,45,211,183,64,77,234,
+142,2,64,33,106,116,64,164,145,225,0,56,80,126,220,67,64,214,121,66,
+234,134,93,208,253,1,95,55,91,111,0,52,216,176,106,29,207,174,234,115,
+15,173,125,127,85,157,124,108,200,249,26,0,128,216,224,78,0,224,13,0,
+234,102,34,224,98,1,160,62,224,69,0,224,27,4,153,180,224,111,6,192,
+190,234,107,54,224,130,9,2,55,57,51,102,62,224,211,0,225,68,0,1,
+53,55,96,128,109,64,225,76,1,103,58,224,183,1,0,90,225,10,2,234,
+146,34,1,55,57,102,149,160,144,109,99,224,147,1,207,9,225,40,10,225,
+42,22,234,177,73,131,132,224,107,10,224,135,4,2,53,54,55,129,162,220,
+198,97,86,2,95,55,57,170,168,0,64,67,1,0,73,180,82,143,139,240,
+118,4,1,95,56,115,251,97,24,95,166,224,207,1,234,227,33,160,52,224,
+67,8,224,168,4,160,150,97,203,224,102,2,233,206,50,226,81,13,2,95,
+56,48,178,48,3,85,32,75,50,226,190,1,192,157,0,55,80,35,224,222,
+10,233,209,16,224,102,13,226,12,22,227,114,19,64,138,254,115,1,0,58,
+96,22,100,170,225,45,4,64,246,162,172,0,58,96,210,228,205,11,225,46,
+40,226,239,34,224,194,22,224,28,18,235,43,32,226,56,0,225,202,14,226,
+197,3,226,91,6,0,58,98,183,225,54,9,96,53,151,4,226,113,3,0,
+58,97,73,224,46,14,96,100,160,90,0,58,96,61,102,80,0,80,225,144,
+10,224,234,4,224,97,3,0,58,96,70,96,55,224,57,6,162,28,226,124,
+3,224,87,15,74,159,162,25,224,9,0,0,58,96,95,224,185,14,136,44,
+162,37,96,92,126,207,3,48,50,32,58,96,28,246,98,1,0,66,122,101,
+231,221,0,178,189,97,75,0,58,64,76,128,42,3,95,55,57,49,183,12,
+0,51,89,17,103,220,224,63,0,102,143,224,61,0,255,228,0,96,10,119,
+243,148,190,166,194,247,222,6,248,147,3,99,160,0,58,72,156,160,118,84,
+140,104,186,0,55,73,47,0,55,96,122,0,58,64,139,96,207,243,3,0,
+114,245,0,79,64,201,1,55,56,103,235,250,185,11,160,31,84,202,250,108,
+12,96,197,192,64,115,38,0,58,106,74,211,31,0,55,115,22,106,190,0,
+56,201,210,65,59,96,42,64,60,224,53,0,73,242,156,63,96,42,192,10,
+203,243,156,117,224,7,7,124,161,0,58,106,226,232,206,1,97,136,72,206,
+105,26,224,243,81,96,32,192,189,173,199,64,105,97,189,153,175,2,55,56,
+49,121,170,88,180,96,54,0,58,96,54,224,41,15,234,93,1,1,91,93,
+153,2,96,166,1,10,65,253,6,7,10,76,105,115,116,95,84,121,112,101,
+46,34,96,231,244,68,1,253,205,2,233,238,0,64,244,128,31,84,98,135,
+186,1,64,58,97,16,109,110,5,55,55,32,58,55,55,129,116,96,54,109,
+187,64,33,175,67,64,159,1,50,57,128,175,235,1,2,0,102,139,0,150,
+253,122,246,122,222,224,38,14,64,79,129,167,0,75,98,254,65,15,64,3,
+0,58,73,229,98,48,74,119,1,51,53,97,86,189,193,106,225,99,65,0,
+49,92,124,149,77,160,29,67,28,93,193,98,93,161,166,246,225,4,1,58,
+55,67,0,194,137,4,48,32,95,55,54,106,155,0,39,142,53,0,83,64,
+16,67,235,99,114,192,30,1,95,55,137,46,132,30,77,120,224,56,0,154,
+199,220,22,129,108,97,198,64,159,160,34,64,36,1,95,55,233,100,0,75,
+170,2,58,55,55,161,242,224,99,2,0,48,110,194,1,95,55,65,56,96,
+57,67,43,64,205,1,95,50,108,67,64,220,224,85,0,212,162,0,58,96,
+155,131,228,98,210,0,54,69,0,0,90,130,174,160,32,227,229,3,64,30,
+0,83,86,202,160,134,163,151,202,39,159,131,103,214,108,145,224,10,4,255,
+162,0,97,35,64,82,96,142,100,89,224,126,4,216,2,64,214,0,54,160,
+186,128,8,5,64,64,95,51,49,57,160,53,4,64,95,50,49,56,192,11,
+0,58,96,215,96,167,64,18,139,172,224,82,1,66,180,0,95,80,61,193,
+26,224,112,21,0,90,224,112,2,224,111,3,97,110,160,110,162,200,0,51,
+225,180,1,160,76,216,188,224,188,0,100,82,1,64,95,96,71,161,0,0,
+54,96,60,2,85,32,58,96,51,165,100,252,138,0,96,56,2,58,55,54,
+130,107,0,85,74,31,0,58,96,19,98,233,247,64,6,9,105,109,112,111,
+115,115,105,98,108,101,163,223,65,217,96,54,1,75,52,64,2,82,108,224,
+1,3,238,25,2,96,45,129,222,65,1,98,195,220,240,254,230,0,155,84,
+128,210,65,232,72,37,64,67,192,73,133,148,158,143,166,129,131,185,96,7,
+0,49,128,7,0,53,69,41,99,136,192,118,228,63,2,107,100,100,63,64,
+38,6,10,65,32,73,32,58,55,65,9,229,128,1,96,93,101,128,0,53,
+129,119,135,109,249,253,4,163,196,84,184,250,212,0,224,32,11,154,6,64,
+27,208,115,224,41,4,99,243,160,41,96,29,219,53,160,252,1,95,50,78,
+25,3,95,55,53,53,225,132,2,1,45,62,97,124,224,21,6,10,80,114,
+105,109,105,116,105,118,101,115,46,160,32,224,89,5,132,109,186,27,224,0,
+1,1,58,55,95,142,96,252,125,148,99,185,103,242,96,197,0,52,144,18,
+0,58,64,107,161,232,0,50,97,235,160,21,130,53,142,183,1,95,55,68,
+223,255,235,9,229,75,2,3,115,117,112,101,185,120,232,20,5,1,58,55,
+65,175,143,187,96,70,224,52,2,0,67,64,48,1,58,55,95,145,128,107,
+65,75,0,90,225,121,3,1,95,52,107,231,2,95,55,53,128,239,64,45,
+130,106,4,98,115,43,43,46,65,225,228,60,0,66,123,68,186,1,52,56,
+232,220,5,209,57,1,56,54,101,199,1,51,48,192,25,241,173,0,255,193,
+3,100,147,102,172,100,161,64,85,0,80,64,148,0,90,129,181,132,18,2,
+52,51,52,206,178,244,106,4,225,34,19,20,100,117,112,108,105,99,97,116,
+101,32,100,101,102,105,110,105,116,105,111,110,32,161,49,0,51,164,38,96,
+0,227,153,6,7,99,104,101,99,107,68,117,112,163,151,0,52,130,220,131,
+233,64,211,0,95,96,214,2,49,52,51,221,75,232,27,6,160,226,125,227,
+64,7,1,52,55,67,0,65,157,234,55,7,156,77,230,96,0,157,57,2,
+95,55,52,96,57,238,90,1,234,18,0,236,223,1,0,58,96,85,1,10,
+65,172,18,101,39,64,155,106,126,64,7,64,172,0,50,112,166,64,43,0,
+54,128,43,68,145,242,83,1,245,57,2,128,66,0,75,65,118,132,29,64,
+116,72,62,244,240,5,160,49,64,5,0,67,224,52,10,233,148,8,140,156,
+64,58,244,70,1,224,218,0,224,88,3,224,236,4,224,23,8,224,17,17,
+140,252,192,122,128,1,245,97,1,224,188,1,160,119,224,61,8,224,64,2,
+224,65,2,97,18,224,46,14,160,93,223,251,224,2,1,205,156,64,71,109,
+144,226,35,4,170,80,96,0,225,69,1,224,2,5,228,77,0,224,137,3,
+131,98,67,5,2,95,55,51,224,68,1,128,137,213,132,128,8,224,5,16,
+1,95,55,135,202,224,91,5,130,118,128,85,2,85,32,65,224,90,0,192,
+29,225,111,13,0,89,225,110,1,226,13,3,96,134,225,219,8,129,70,129,
+24,244,203,2,192,98,185,99,226,60,0,224,40,0,224,72,14,225,132,5,
+224,31,4,129,196,128,87,69,248,138,49,97,135,227,52,0,162,166,160,6,
+96,4,168,64,162,121,97,48,97,107,128,181,227,126,1,103,24,112,96,131,
+178,224,9,1,224,68,21,225,101,0,129,192,135,109,224,60,3,160,251,225,
+150,2,128,254,97,25,64,191,64,217,167,214,192,232,79,180,106,121,224,208,
+10,232,39,3,225,26,0,224,8,0,226,214,18,224,28,1,224,29,41,224,
+195,8,65,219,227,87,0,227,42,0,160,138,226,8,3,224,51,0,194,107,
+227,84,0,64,35,2,95,49,51,147,219,230,93,4,161,86,204,13,1,54,
+51,224,25,1,1,95,52,165,116,224,166,2,161,138,129,135,2,64,95,54,
+192,68,225,60,9,119,77,205,200,166,151,146,239,128,156,3,32,95,54,51,
+102,53,96,174,128,93,67,14,129,253,193,95,225,49,5,229,63,5,128,233,
+226,245,3,225,18,0,226,242,95,226,214,3,242,80,0,129,74,72,21,239,
+7,13,133,196,109,40,224,41,22,68,107,0,57,164,243,129,64,96,4,227,
+57,13,1,90,32,224,13,2,129,15,227,1,31,0,75,160,112,227,2,19,
+225,59,15,224,13,4,101,116,226,161,0,161,215,129,67,226,115,2,160,221,
+64,157,135,215,96,9,0,54,76,153,145,252,66,28,1,48,57,226,168,8,
+77,72,128,59,224,8,1,225,42,1,225,8,0,165,126,194,105,0,89,161,
+255,161,232,235,200,26,97,52,0,80,129,24,160,18,130,3,229,216,1,64,
+24,106,177,224,118,1,64,239,1,95,55,105,72,137,144,174,208,206,217,202,
+64,2,79,32,35,76,211,161,86,193,170,64,5,1,58,55,91,29,106,13,
+234,65,7,160,92,67,48,234,250,1,64,77,172,29,1,95,52,179,192,0,
+52,112,96,64,40,112,130,3,52,49,32,58,96,19,170,114,64,13,174,202,
+240,93,1,0,58,96,181,235,68,2,96,229,0,58,66,123,64,21,134,153,
+1,95,55,94,191,129,179,0,48,78,2,254,76,2,82,99,192,207,165,151,
+1,58,55,71,37,96,131,3,51,54,32,58,96,60,96,217,131,163,134,159,
+226,24,6,202,208,230,182,1,227,159,1,129,136,224,13,10,236,151,0,131,
+194,231,107,0,98,126,226,65,6,227,192,12,201,181,227,15,0,201,244,229,
+41,7,1,95,55,100,176,252,38,0,169,209,128,2,98,249,3,95,55,51,
+53,129,35,243,84,5,113,74,102,244,198,181,128,0,110,210,75,134,161,197,
+68,255,224,228,5,231,196,10,228,110,0,163,223,74,134,224,247,7,229,228,
+9,228,170,2,160,138,252,238,4,234,142,5,161,163,225,62,6,232,82,0,
+178,66,233,164,3,0,67,75,31,79,187,128,43,161,42,239,22,4,197,217,
+197,161,224,23,0,228,47,0,192,252,161,71,227,64,0,160,165,209,174,225,
+33,0,105,61,128,27,0,66,213,249,228,154,3,255,242,6,160,132,224,186,
+3,97,85,231,32,0,139,225,224,204,11,159,81,161,101,224,58,44,224,55,
+11,97,167,237,208,2,196,68,249,119,1,109,172,182,118,237,153,6,2,79,
+32,35,87,204,128,244,246,200,7,246,199,3,235,43,2,132,100,65,91,248,
+3,1,223,39,129,22,183,23,128,182,192,189,229,0,1,192,17,82,198,181,
+161,64,16,224,77,24,100,183,226,19,4,0,51,69,236,226,93,2,192,29,
+224,89,3,132,196,64,72,200,24,65,230,229,113,0,226,75,0,230,131,1,
+131,203,162,149,224,183,2,162,237,0,58,119,180,68,148,65,84,65,65,0,
+53,128,174,0,58,100,121,143,229,1,50,50,68,216,196,196,209,161,0,90,
+64,89,96,4,247,33,4,64,38,213,201,95,252,2,95,55,50,110,159,0,
+50,132,252,0,83,145,47,67,162,225,21,2,181,210,64,41,192,6,64,7,
+116,53,96,60,215,156,0,89,230,181,3,224,235,1,128,70,111,221,167,99,
+0,83,228,234,5,96,99,87,2,163,65,2,95,55,48,99,106,228,3,3,
+0,50,83,166,97,21,163,127,137,218,160,135,115,252,121,45,64,143,0,54,
+229,187,5,1,95,54,65,55,0,83,161,125,133,61,1,95,54,89,159,164,
+134,64,99,71,195,154,72,252,14,0,128,35,233,39,1,0,54,90,52,70,
+215,127,165,192,140,128,101,242,149,0,224,70,0,224,40,1,161,68,129,62,
+100,203,98,243,0,55,119,130,160,236,0,58,96,224,175,210,128,163,160,162,
+2,95,55,49,65,12,202,75,224,104,9,160,32,2,95,55,50,64,46,0,
+58,96,86,129,203,224,239,11,192,173,96,63,98,194,235,152,1,192,172,226,
+147,0,1,95,54,188,44,196,134,165,180,233,158,0,99,51,84,38,0,54,
+124,31,129,34,98,236,64,253,85,186,127,120,162,239,129,61,144,151,129,1,
+103,253,64,183,103,121,96,48,1,50,49,96,19,162,248,231,182,3,85,189,
+100,63,0,58,96,36,128,50,98,201,160,35,241,197,1,1,67,39,145,234,
+0,58,96,109,225,13,35,224,233,1,192,22,129,1,224,191,1,0,49,221,
+63,192,225,64,249,0,58,97,132,224,177,7,89,228,160,177,64,37,224,177,
+19,0,83,224,177,0,64,95,249,197,0,194,48,217,138,74,112,224,206,15,
+230,73,1,160,200,64,30,225,168,9,96,190,134,6,192,18,66,71,1,95,
+55,117,210,98,144,224,193,1,90,28,166,168,64,33,0,52,96,131,226,169,
+5,163,207,128,131,130,56,231,236,0,227,72,3,224,160,7,224,153,0,226,
+72,10,229,144,1,226,92,9,194,83,226,143,2,224,75,14,1,55,48,230,
+15,0,224,255,6,195,59,128,78,119,184,64,219,196,53,227,238,1,161,227,
+226,133,3,0,54,225,17,1,105,16,64,62,202,214,201,53,138,166,65,178,
+226,18,8,0,48,226,18,1,202,217,1,57,52,224,25,3,0,58,97,136,
+224,55,7,90,60,160,55,68,47,229,228,6,0,90,75,236,128,28,194,103,
+138,244,0,54,64,135,68,122,224,79,8,166,74,64,30,0,54,192,249,163,
+5,149,147,97,91,129,96,226,110,2,226,51,5,129,146,224,36,17,225,107,
+2,224,36,17,225,220,2,224,73,24,159,16,224,73,22,108,190,224,36,16,
+101,44,128,73,229,108,10,108,172,138,91,227,58,7,130,78,227,46,0,140,
+214,227,46,2,228,126,3,0,66,131,205,227,77,6,1,56,50,227,77,3,
+224,55,9,0,66,164,4,224,54,7,193,171,224,24,7,95,98,224,24,12,
+0,54,224,49,5,160,176,64,6,0,58,96,6,226,118,3,163,225,0,58,
+96,222,228,91,8,131,221,238,122,10,206,129,66,247,153,109,229,76,1,185,
+149,198,59,224,32,3,235,236,1,0,50,68,71,234,33,5,226,148,0,167,
+89,224,126,11,192,101,128,76,246,134,7,160,6,192,115,205,47,224,151,19,
+128,35,0,80,96,75,224,44,3,178,98,126,112,64,152,231,237,1,236,202,
+0,224,202,4,160,185,224,35,21,2,79,32,35,89,66,160,228,166,106,128,
+154,224,38,7,0,49,224,38,0,238,193,6,226,47,1,1,75,52,194,47,
+224,35,18,0,51,224,35,26,0,50,224,35,0,128,0,241,82,3,224,57,
+0,66,34,196,235,1,80,32,97,69,124,0,74,177,1,10,65,188,169,196,
+134,132,219,234,131,4,192,7,170,139,64,81,194,135,231,185,7,0,58,99,
+166,226,165,2,199,251,0,58,99,221,224,24,3,165,142,0,58,99,209,224,
+24,2,197,48,0,58,100,89,224,24,3,203,68,99,200,96,164,140,13,75,
+203,119,43,255,11,13,252,130,0,252,120,3,100,150,160,32,96,31,225,197,
+3,64,230,64,116,133,93,160,98,1,54,57,70,189,2,95,54,57,74,249,
+64,94,128,16,76,73,128,9,0,58,100,138,5,10,65,32,79,32,58,96,
+37,123,172,0,58,96,28,220,95,136,28,192,1,65,84,96,0,231,96,1,
+231,105,4,65,192,0,54,67,231,96,92,204,34,224,1,3,192,38,224,88,
+4,192,20,224,17,8,224,14,5,224,11,2,192,8,216,204,0,58,96,117,
+136,43,108,168,1,64,95,65,125,98,235,99,252,244,59,0,2,58,54,56,
+129,215,114,75,239,219,2,224,146,5,192,233,224,129,0,140,11,87,20,238,
+131,2,224,1,3,6,95,51,54,54,32,95,52,73,137,2,95,49,54,240,
+204,1,225,36,2,239,118,5,99,190,128,53,2,54,56,52,224,53,5,160,
+110,224,2,0,128,38,2,51,54,56,224,38,4,160,72,224,85,1,3,67,
+32,95,52,160,29,1,95,54,69,204,160,128,1,95,54,177,183,239,84,5,
+64,0,2,58,54,56,237,85,2,64,68,252,50,3,64,162,237,99,1,128,
+151,239,134,0,0,58,96,85,225,226,0,97,50,192,144,65,152,0,58,96,
+130,67,16,7,51,54,55,32,75,32,85,32,94,173,128,31,96,5,1,95,
+51,141,126,128,75,130,190,124,254,74,12,148,43,0,54,70,201,64,29,130,
+169,159,216,239,64,0,157,95,160,14,253,157,12,2,32,61,32,254,189,3,
+1,54,56,140,37,0,58,96,87,64,110,1,49,50,64,52,0,52,67,30,
+96,27,64,127,0,53,75,67,1,95,54,73,39,67,115,80,49,96,27,0,
+58,96,6,227,99,0,1,95,53,79,28,96,142,80,218,0,53,240,20,1,
+0,66,86,188,78,103,160,67,128,6,129,29,224,43,15,65,166,0,53,79,
+218,64,16,1,51,51,64,21,0,56,103,122,231,202,0,128,111,0,64,192,
+24,93,110,197,183,224,96,1,96,29,2,64,95,54,84,219,64,176,196,251,
+1,55,56,101,249,65,54,2,79,32,35,73,248,96,59,0,58,97,107,225,
+254,13,166,160,193,109,128,45,131,60,245,16,5,1,54,55,197,17,4,55,
+53,32,58,54,86,186,5,10,65,32,114,110,102,99,115,0,58,64,21,128,
+98,100,80,234,76,4,224,4,8,225,221,0,225,206,12,6,84,109,111,100,
+117,108,101,161,211,192,162,226,15,6,129,102,242,22,9,224,244,0,174,87,
+160,214,224,25,5,160,0,2,58,54,55,130,143,0,85,64,208,198,140,145,
+112,228,52,2,80,107,68,99,246,239,2,240,75,1,161,63,64,41,0,95,
+97,158,239,90,4,160,20,163,233,96,67,255,121,3,0,54,68,103,1,10,
+65,114,59,193,146,160,99,160,6,100,192,228,40,1,2,95,54,55,195,180,
+224,127,2,228,117,8,96,94,129,52,224,38,0,127,215,160,122,224,130,0,
+227,230,2,64,88,96,138,1,95,49,78,22,230,190,0,1,58,54,89,152,
+227,69,6,100,127,195,234,225,201,17,225,200,5,227,213,38,14,40,46,46,
+46,41,32,119,104,101,114,101,92,49,48,38,163,225,0,54,69,30,96,0,
+163,180,96,138,0,58,96,6,164,89,163,217,71,228,0,58,96,46,97,214,
+1,95,53,80,202,100,112,2,83,32,83,166,23,164,249,64,151,173,168,5,
+67,32,60,32,64,35,253,114,1,233,236,6,192,24,0,85,74,35,1,95,
+54,72,47,224,41,14,148,250,160,41,224,43,3,133,172,1,53,52,108,63,
+64,20,99,205,162,153,0,58,96,182,98,146,242,57,0,224,146,1,224,18,
+6,113,201,224,18,5,98,97,247,204,0,160,19,65,226,229,84,0,228,135,
+1,64,8,160,16,96,130,225,122,1,6,112,97,116,116,101,114,110,193,114,
+0,53,107,241,164,145,91,143,228,145,0,163,14,0,85,192,88,224,71,6,
+6,100,101,102,97,117,108,116,128,71,100,242,0,52,164,250,0,48,128,7,
+0,52,65,174,224,50,4,0,44,229,202,0,102,25,92,30,192,0,224,214,
+7,67,89,128,121,64,160,224,129,13,7,105,110,115,116,97,110,99,101,224,
+202,0,160,79,64,55,129,14,96,220,227,80,4,129,25,229,183,4,224,92,
+13,4,99,108,97,115,115,224,89,0,144,78,129,44,64,7,209,216,243,243,
+1,128,183,96,91,224,202,5,66,210,0,85,250,248,1,100,183,224,132,14,
+0,56,96,7,227,52,16,4,105,110,102,105,120,128,146,164,82,229,27,4,
+0,56,161,187,224,23,6,80,173,166,126,224,24,1,197,43,230,110,0,247,
+102,5,225,198,35,134,211,128,0,66,136,225,107,10,224,243,19,225,120,8,
+19,102,111,114,101,105,103,110,32,105,109,112,111,114,116,32,99,99,97,108,
+108,160,111,1,53,54,96,45,73,160,160,148,192,184,0,51,77,127,0,53,
+143,102,96,41,231,104,1,224,89,1,1,58,58,164,172,226,42,3,160,178,
+229,105,10,135,204,234,0,2,234,98,1,192,26,226,89,44,128,216,193,199,
+237,207,1,1,54,53,144,148,0,53,112,118,96,230,224,193,7,13,123,45,
+35,32,83,79,85,82,67,69,32,35,45,125,199,67,72,200,97,20,224,44,
+5,8,113,117,97,108,105,102,105,101,100,192,39,193,170,225,244,0,97,79,
+226,20,5,65,88,233,139,17,1,97,115,193,250,0,51,225,108,0,192,125,
+228,132,1,201,3,64,99,122,188,224,65,2,5,104,105,100,105,110,103,160,
+145,96,44,132,53,137,83,154,106,226,115,1,73,36,226,190,2,100,53,68,
+163,224,0,4,229,37,6,64,151,227,149,6,69,174,227,149,6,67,200,229,
+54,36,2,116,121,112,196,104,226,92,24,129,26,224,94,18,227,91,7,224,
+231,10,195,86,226,195,27,108,32,95,25,128,53,192,82,229,205,2,225,18,
+8,230,74,10,230,73,40,225,18,2,0,54,230,70,18,128,166,228,26,14,
+224,108,32,2,110,101,119,224,111,29,0,54,153,43,0,54,82,216,128,120,
+246,126,0,96,236,227,161,26,3,100,97,116,97,224,104,4,224,78,0,64,
+57,240,160,3,224,211,53,224,103,8,224,208,10,226,46,11,227,79,2,0,
+124,160,63,163,27,221,206,224,254,1,64,0,0,58,104,138,115,176,0,85,
+64,65,66,159,72,183,224,149,14,3,101,114,105,118,227,164,0,96,127,227,
+163,39,168,58,160,123,140,60,229,104,1,229,71,3,97,50,225,70,23,1,
+95,53,64,97,231,135,1,163,27,0,80,132,109,92,114,160,254,98,106,0,
+66,64,9,132,130,224,177,1,96,33,192,130,165,190,225,169,12,227,66,2,
+227,117,12,96,99,224,248,9,224,236,0,177,195,192,100,238,9,4,70,171,
+193,40,224,18,0,247,93,0,96,180,129,40,162,170,163,60,96,229,224,69,
+1,64,86,160,68,163,92,0,58,96,149,110,214,0,80,226,237,0,0,85,
+192,203,237,157,2,229,161,3,224,28,0,225,223,4,1,54,54,225,45,0,
+231,217,4,224,208,3,225,31,9,3,40,46,46,41,193,33,96,31,0,58,
+101,166,203,179,97,162,226,48,13,0,58,96,112,5,10,65,32,65,32,58,
+102,249,64,51,1,52,57,225,2,0,204,178,211,57,64,15,64,9,128,21,
+64,169,0,54,76,179,103,58,0,58,96,6,226,230,21,97,114,224,125,0,
+227,92,11,226,207,9,229,200,22,225,44,4,224,66,0,246,159,1,224,39,
+12,192,0,0,58,106,75,224,179,9,224,101,3,97,229,1,95,53,97,0,
+225,120,6,1,61,62,161,118,64,72,0,54,162,62,161,227,238,156,0,177,
+240,198,183,163,162,132,42,1,58,54,68,120,140,147,229,38,0,131,160,247,
+164,8,241,2,1,151,164,67,76,64,30,1,95,53,146,143,224,219,1,96,
+116,131,124,241,38,4,66,64,226,73,21,231,70,9,0,58,96,170,98,74,
+1,53,50,66,36,131,37,100,100,0,58,97,26,128,13,0,48,162,25,0,
+58,100,125,131,131,0,89,248,22,0,102,232,79,59,128,138,128,186,169,217,
+175,213,96,109,174,55,96,17,148,155,132,169,64,1,1,83,32,127,200,239,
+126,2,224,61,2,138,59,224,46,3,225,55,0,225,240,0,255,12,2,66,
+219,128,5,102,147,160,81,238,178,2,129,133,96,10,225,136,14,160,106,119,
+70,229,90,3,192,11,96,74,160,208,197,114,160,96,160,58,128,35,2,95,
+53,51,134,43,144,80,239,51,2,152,236,229,158,5,128,90,225,26,5,225,
+234,3,224,139,5,160,31,229,230,0,96,63,160,14,97,249,129,233,129,33,
+218,39,224,181,47,224,166,6,96,163,224,160,10,224,133,13,224,125,2,226,
+0,0,226,21,0,193,13,218,152,192,98,155,238,250,0,4,0,64,100,61,
+160,151,160,24,101,165,64,13,1,55,53,89,79,64,117,83,98,130,24,96,
+10,128,48,213,89,192,227,249,233,5,227,36,1,1,91,93,163,36,251,40,
+0,224,105,4,224,92,2,174,118,1,95,53,113,151,1,53,51,238,183,2,
+0,66,228,83,0,64,132,0,50,102,215,87,4,67,95,1,95,53,116,125,
+160,41,192,4,96,153,66,110,161,65,96,159,210,239,161,105,195,35,161,182,
+129,51,161,56,66,233,240,181,2,97,103,224,26,9,96,145,224,26,12,88,
+21,96,243,224,22,6,139,241,234,203,5,65,131,69,80,75,21,240,195,0,
+239,95,22,0,95,201,140,239,12,5,129,203,224,95,6,139,44,0,75,230,
+25,4,232,166,1,225,19,1,0,85,220,126,234,126,0,165,7,231,205,9,
+224,26,8,1,49,50,239,169,2,64,0,130,143,225,48,7,119,129,224,100,
+0,224,165,4,100,40,250,6,2,227,7,4,244,231,3,201,116,227,24,7,
+225,28,1,0,45,198,105,165,3,96,85,192,253,229,215,15,74,202,233,34,
+5,97,137,224,133,1,192,12,71,46,134,153,225,3,6,247,35,1,231,57,
+5,226,59,13,100,17,193,10,224,26,5,99,100,225,37,12,0,49,99,20,
+160,207,163,246,234,152,19,128,31,106,65,225,169,1,225,197,1,199,123,64,
+7,237,223,19,0,52,163,139,224,67,1,254,210,2,161,179,232,183,4,232,
+82,2,225,213,18,224,177,17,225,213,11,238,78,10,225,63,14,99,71,227,
+7,8,82,92,244,33,16,1,105,102,163,79,2,53,54,48,224,27,7,226,
+78,0,224,202,5,230,75,7,224,21,0,0,53,181,97,226,180,2,103,65,
+2,66,32,79,163,83,224,127,17,226,235,6,224,48,17,2,116,104,101,181,
+23,198,197,224,43,17,3,101,108,115,101,160,43,226,222,2,225,149,17,225,
+143,1,234,2,7,229,43,22,194,184,224,25,9,99,248,228,19,13,99,248,
+192,26,225,177,5,165,68,226,61,23,226,47,0,192,172,235,5,1,69,53,
+211,139,238,56,4,0,111,97,16,233,224,21,0,46,160,37,163,41,2,53,
+48,32,112,120,96,112,215,195,2,95,53,53,230,168,0,101,197,103,51,226,
+153,14,96,41,227,216,12,255,106,1,99,147,199,150,160,249,224,247,3,224,
+15,2,165,50,227,189,16,128,161,160,155,160,76,225,24,3,160,7,224,245,
+6,1,108,101,247,40,2,224,243,15,162,243,226,206,16,226,155,0,224,38,
+0,226,55,19,244,160,0,224,25,8,96,103,226,28,12,176,227,197,9,228,
+70,0,111,119,229,25,4,224,162,13,1,99,97,227,20,0,224,25,6,0,
+111,195,139,225,0,18,154,254,64,0,71,89,96,28,253,9,1,128,22,230,
+60,7,230,42,3,253,103,2,83,12,245,19,12,228,118,3,64,0,202,207,
+201,233,131,18,227,75,5,192,183,129,229,231,101,10,225,52,2,64,33,4,
+64,95,54,48,55,221,43,77,190,104,21,65,58,96,9,1,95,54,102,236,
+224,129,1,137,83,239,164,1,0,85,72,152,228,33,1,128,89,192,114,96,
+128,229,132,1,128,3,193,252,139,19,233,203,0,193,65,163,29,3,95,54,
+52,57,170,164,232,254,12,89,78,0,36,129,30,201,195,129,104,160,69,235,
+43,1,234,38,7,246,13,2,225,67,0,228,86,4,160,18,163,93,97,38,
+74,177,99,72,234,66,2,65,246,126,144,96,9,129,203,92,136,128,9,128,
+17,0,58,77,233,77,222,97,89,144,9,112,112,91,115,141,245,226,184,1,
+0,50,106,7,1,95,52,132,202,0,54,71,114,0,58,96,52,176,153,98,
+119,0,52,96,212,64,14,96,9,64,8,0,54,72,118,160,24,64,49,239,
+162,1,0,79,161,156,96,146,79,166,239,93,0,96,51,96,45,0,54,160,
+159,0,80,127,61,1,64,85,96,116,223,65,96,22,97,221,0,80,96,23,
+142,219,130,40,163,14,161,187,129,30,226,31,1,193,68,167,9,162,142,230,
+213,3,96,141,99,159,193,108,196,90,193,97,230,213,1,103,148,230,186,0,
+0,58,118,62,252,154,11,64,131,224,18,6,65,21,246,78,6,70,138,251,
+194,13,97,29,106,229,161,204,161,48,1,35,57,195,194,95,39,1,95,53,
+95,173,194,5,130,126,224,98,6,100,130,224,98,5,65,213,160,45,64,104,
+250,9,10,224,22,14,224,209,7,65,30,224,110,6,236,84,10,136,235,160,
+80,247,228,0,192,207,109,91,128,28,0,53,77,231,0,54,237,108,1,224,
+36,2,98,106,96,36,1,54,52,195,227,225,56,7,201,82,128,49,130,4,
+224,12,2,160,62,224,94,0,224,43,6,236,189,8,0,58,101,64,223,228,
+100,135,123,55,66,231,78,190,66,186,147,244,69,208,128,150,191,127,96,11,
+0,58,96,6,5,10,65,32,73,32,58,96,41,192,74,2,95,49,52,83,
+123,160,67,147,149,96,54,96,17,0,58,96,6,9,10,65,32,102,115,104,
+111,119,32,58,96,32,224,58,0,2,53,56,50,92,194,0,53,69,180,1,
+95,54,78,157,224,128,0,161,72,128,73,64,11,0,58,96,6,96,58,1,
+48,52,96,53,0,56,64,193,0,54,110,15,2,95,54,50,96,132,64,65,
+1,95,54,129,25,96,11,1,49,48,96,76,160,11,0,56,224,35,1,101,
+35,1,49,56,97,162,64,17,0,73,67,135,64,9,99,135,142,192,165,141,
+67,172,3,95,50,48,50,230,65,2,21,73,110,116,101,103,101,114,58,32,
+100,105,118,105,115,105,111,110,32,98,121,32,48,230,220,0,245,105,0,135,
+150,64,79,0,85,125,171,0,56,82,159,0,56,64,237,133,220,224,17,9,
+128,64,248,95,7,64,9,236,151,1,113,6,130,45,224,16,2,138,222,162,
+191,100,17,229,115,0,70,47,3,95,54,50,53,252,101,0,100,10,210,65,
+228,69,4,1,95,54,78,111,65,32,233,3,0,198,91,98,52,73,204,0,
+85,133,159,131,180,236,109,5,139,142,118,181,96,71,167,49,81,133,175,116,
+101,213,224,119,0,64,81,70,67,144,254,1,95,54,203,242,128,0,0,58,
+97,166,1,10,65,225,128,9,5,105,110,105,116,58,32,177,2,129,95,193,
+64,246,232,5,197,151,192,88,0,58,96,9,69,199,97,39,64,152,1,95,
+52,64,125,1,95,54,84,191,0,58,96,142,119,68,228,8,0,1,95,53,
+66,55,64,91,97,49,98,14,128,107,100,199,96,55,97,88,0,52,177,215,
+243,235,0,130,84,183,149,240,0,0,148,146,98,22,240,20,7,87,186,68,
+10,0,79,229,148,1,230,202,3,129,213,193,209,236,209,6,194,7,160,98,
+64,70,2,95,49,48,71,236,67,40,64,0,129,194,135,105,96,28,68,34,
+192,28,97,160,242,154,0,4,67,32,95,52,49,210,166,0,54,210,31,1,
+53,57,100,239,199,44,97,4,0,58,98,18,99,53,96,198,201,26,0,67,
+112,243,243,191,0,64,11,64,25,224,7,0,66,139,1,53,56,103,106,145,
+237,130,132,0,80,98,58,135,169,143,125,233,116,0,0,80,102,209,96,21,
+66,206,0,48,105,70,144,221,129,20,160,49,96,28,230,235,1,136,102,96,
+46,96,26,144,4,195,63,169,24,96,12,0,89,162,76,139,77,64,5,160,
+33,137,111,73,90,0,57,76,203,0,54,144,44,227,30,1,161,122,235,77,
+2,65,128,97,211,227,180,0,1,95,54,201,54,128,95,160,163,128,220,160,
+12,99,165,169,101,1,54,50,109,217,167,5,224,197,15,64,39,135,137,128,
+66,225,16,3,105,124,228,96,1,96,232,131,130,64,142,1,52,56,184,198,
+226,183,1,244,50,1,98,232,136,35,131,229,236,246,0,224,78,2,224,13,
+4,0,58,100,48,101,158,224,20,0,0,79,107,224,137,175,64,205,227,5,
+0,133,126,0,75,66,60,64,189,104,113,0,65,96,13,133,226,65,86,72,
+238,196,224,226,245,1,245,206,0,2,95,53,57,137,176,0,48,107,71,160,
+14,0,58,100,117,170,23,65,76,105,249,105,67,0,58,68,255,96,160,1,
+50,50,117,166,0,57,218,63,0,58,96,38,202,53,97,240,5,95,49,56,
+52,32,64,128,146,164,15,224,27,6,128,188,167,82,103,1,129,126,130,149,
+122,172,1,54,48,68,217,98,44,87,180,64,1,1,95,54,72,24,70,238,
+194,246,1,95,54,115,186,224,13,0,97,190,100,55,70,216,225,79,8,170,
+116,0,58,96,39,224,29,2,0,49,224,29,5,64,83,224,59,5,195,172,
+64,102,97,111,0,75,226,27,5,0,58,96,167,106,223,100,79,230,249,1,
+230,162,10,229,98,1,231,42,11,224,48,20,103,18,132,24,248,228,1,198,
+208,228,203,3,184,115,64,13,234,229,7,96,97,225,251,1,98,251,75,54,
+132,157,247,197,2,160,62,160,110,229,31,0,224,116,2,227,159,0,229,88,
+2,216,216,224,117,21,224,115,5,224,113,5,224,51,17,148,156,224,0,3,
+0,58,98,44,235,253,0,72,163,1,53,57,167,58,96,16,109,174,105,172,
+0,57,103,192,99,184,99,160,2,95,54,49,73,30,83,126,250,13,1,130,
+237,224,157,5,0,58,96,119,108,238,1,49,49,64,67,248,130,1,1,49,
+49,160,10,3,95,49,56,51,172,147,230,205,5,224,34,13,1,73,32,64,
+2,0,83,166,78,64,168,224,139,0,64,62,224,96,0,160,46,131,201,69,
+96,129,100,192,56,197,67,102,37,160,10,224,60,1,224,137,6,160,119,200,
+138,88,63,231,157,3,225,16,4,211,45,225,251,0,128,75,80,18,128,44,
+161,234,224,70,0,1,50,54,224,71,1,64,72,96,40,238,184,1,224,113,
+14,224,41,6,0,58,96,8,163,95,1,75,52,238,181,0,0,58,64,37,
+129,228,167,250,232,67,0,162,50,167,40,0,82,224,22,4,225,35,0,0,
+58,96,122,162,36,224,1,1,153,144,226,211,0,224,20,5,224,17,8,224,
+14,5,224,11,2,192,8,130,246,96,109,132,123,0,85,128,195,224,197,2,
+207,117,160,197,64,164,240,169,2,192,18,1,66,39,224,21,3,166,227,224,
+29,0,162,217,239,241,1,1,64,58,66,229,128,88,233,233,8,5,102,111,
+108,100,108,49,182,67,81,83,64,45,132,196,224,134,0,0,83,228,45,4,
+96,79,164,204,228,83,0,113,62,104,116,235,0,6,233,108,1,234,64,1,
+211,79,136,22,128,169,233,77,5,201,19,134,19,98,28,0,48,71,88,64,
+36,233,85,0,233,56,0,164,101,226,216,2,233,95,3,128,176,0,54,96,
+176,224,79,0,71,37,128,169,0,56,120,99,101,226,64,6,106,164,68,78,
+96,45,200,58,134,108,0,58,102,126,101,196,0,73,197,53,0,83,75,113,
+64,212,229,129,1,138,110,230,58,2,231,216,7,96,144,203,7,168,205,229,
+71,0,252,157,0,131,85,193,117,234,205,10,164,255,192,86,196,215,169,122,
+133,254,128,8,1,95,53,68,212,232,230,0,103,150,128,64,71,215,224,64,
+0,1,54,48,226,103,1,192,25,131,44,65,6,162,109,230,53,2,224,174,
+13,224,124,7,99,209,105,209,224,127,22,224,101,3,224,130,8,224,156,5,
+225,91,4,192,247,65,102,1,55,57,226,219,2,12,92,51,52,38,108,105,
+98,47,68,97,116,97,47,174,83,2,46,104,115,64,22,4,44,49,50,56,
+58,130,246,0,58,97,225,101,189,0,48,89,66,69,212,0,58,96,109,162,
+225,97,124,128,222,244,34,3,96,5,65,92,226,241,0,229,202,7,197,84,
+225,228,0,64,57,227,211,4,195,250,192,7,2,80,32,95,106,14,1,50,
+32,224,202,35,3,54,52,58,54,249,133,4,227,92,1,139,37,132,26,227,
+108,1,174,97,227,93,3,0,48,238,57,0,228,88,0,163,38,1,53,57,
+73,202,198,235,196,101,224,80,12,235,201,1,224,80,3,64,0,128,69,97,
+108,196,227,131,61,100,51,0,52,80,69,64,116,97,50,142,55,227,235,11,
+228,36,13,160,47,235,107,4,224,61,11,103,43,228,39,4,224,79,11,228,
+85,18,231,43,3,0,58,96,208,164,36,207,33,233,153,19,168,171,97,10,
+69,101,107,81,181,34,245,19,0,2,53,52,48,240,68,11,174,17,0,58,
+96,57,64,51,0,53,116,113,98,169,98,253,226,169,2,163,136,193,68,229,
+147,6,161,199,229,149,8,226,33,15,97,1,64,109,161,204,230,117,1,67,
+214,84,94,160,81,226,121,47,224,91,2,226,121,10,224,95,3,226,121,30,
+224,80,3,161,110,104,60,0,58,96,24,226,121,1,226,100,38,132,119,226,
+11,2,224,10,1,0,58,96,97,1,10,65,67,240,0,58,96,173,108,180,
+74,105,115,67,1,51,51,89,195,140,149,143,146,1,53,56,131,82,68,41,
+142,243,1,53,57,224,34,0,125,199,96,10,0,58,96,6,202,187,0,50,
+108,187,128,65,0,58,96,53,102,63,224,16,0,227,87,1,160,42,192,27,
+1,64,58,96,111,96,45,134,102,226,40,3,96,19,129,112,64,19,112,218,
+165,176,1,95,49,117,74,160,35,232,142,1,143,28,229,215,1,96,97,130,
+205,65,154,128,98,230,26,1,134,215,1,95,50,77,206,103,153,195,237,225,
+212,0,98,101,110,50,97,125,226,173,0,230,108,0,0,89,160,36,208,45,
+226,98,2,192,148,96,170,197,71,208,37,144,104,64,14,251,195,0,209,49,
+97,38,97,112,224,143,3,194,96,236,96,0,149,120,224,146,4,65,253,233,
+68,5,6,108,116,87,46,99,109,112,219,149,177,191,184,218,179,125,96,5,
+0,58,97,49,98,30,65,240,78,233,2,95,53,56,79,62,98,42,225,234,
+8,0,52,96,25,168,141,237,170,1,224,166,21,104,209,192,13,0,49,111,
+18,160,185,0,58,96,81,160,126,200,168,75,42,111,80,161,237,64,15,150,
+103,129,231,3,95,49,54,50,192,85,0,58,96,6,105,1,1,95,53,115,
+214,0,53,71,132,0,58,86,105,128,163,96,24,0,57,197,142,0,53,64,
+159,131,162,64,165,75,101,195,176,172,237,197,19,69,28,0,58,96,76,96,
+93,230,22,6,96,38,65,24,69,52,227,122,0,229,143,1,6,95,49,52,
+57,32,35,54,77,253,192,82,224,46,11,64,36,183,179,0,58,96,113,244,
+168,0,194,19,66,96,130,103,169,141,228,196,2,228,225,1,76,162,196,99,
+224,232,31,128,148,254,74,2,169,41,224,87,4,91,4,224,87,37,128,236,
+74,130,224,91,1,128,206,160,198,192,197,224,93,5,115,205,224,91,17,224,
+126,38,227,14,6,7,78,117,109,101,114,105,99,46,88,147,26,73,110,116,
+65,116,66,97,115,101,58,32,110,101,103,97,116,105,118,101,32,97,114,103,
+117,109,101,110,191,173,161,105,164,37,137,202,65,113,146,163,192,213,64,5,
+224,178,22,97,189,108,249,0,51,224,22,5,224,75,52,0,57,224,22,3,
+64,0,224,236,29,12,117,110,115,117,112,112,111,114,116,101,100,32,98,255,
+177,1,128,140,117,9,226,120,6,194,110,3,83,32,95,50,152,28,232,130,
+0,164,248,224,49,6,194,60,160,83,192,11,226,72,8,224,70,4,110,31,
+160,49,101,25,162,245,160,22,225,64,12,103,16,132,65,224,10,2,224,55,
+2,225,86,3,2,53,55,56,98,218,0,80,192,65,205,132,225,81,16,0,
+58,100,47,131,137,98,191,130,119,160,34,96,82,224,204,1,0,58,96,95,
+143,59,0,50,79,62,96,36,0,58,96,34,227,204,8,236,133,1,227,100,
+60,193,128,236,242,0,128,88,129,122,240,253,4,125,71,225,103,1,129,52,
+0,35,94,158,193,9,128,162,226,132,22,224,64,8,228,217,0,224,86,11,
+225,225,3,224,98,32,160,66,164,157,65,72,0,54,197,129,65,26,85,185,
+64,105,142,226,173,191,150,250,64,76,1,50,54,152,44,224,249,2,215,186,
+98,204,198,158,65,14,64,38,64,54,126,217,192,22,3,95,49,51,55,227,
+75,2,2,32,37,32,163,39,224,45,5,130,7,92,185,87,47,96,239,64,
+15,127,124,128,15,0,58,96,6,188,92,237,94,2,90,66,234,43,2,65,
+244,98,81,0,52,225,226,2,2,52,53,49,96,139,103,117,2,95,53,55,
+254,192,0,107,142,160,16,0,58,96,51,130,98,136,56,200,169,0,49,122,
+251,0,35,90,135,64,245,224,28,12,232,217,3,160,18,134,166,0,58,96,
+93,251,130,11,2,108,97,115,251,130,1,137,86,1,85,32,96,209,252,24,
+0,0,58,96,8,99,12,136,16,1,95,53,123,237,0,53,171,234,106,73,
+1,50,56,224,84,2,1,45,62,161,95,2,58,53,55,210,131,255,166,6,
+140,30,224,18,4,148,116,162,238,128,18,65,115,95,19,96,117,89,8,0,
+53,241,177,2,225,247,0,96,142,162,152,224,12,0,224,25,1,224,21,0,
+1,95,54,65,174,96,171,3,79,32,35,52,151,255,97,129,96,24,128,25,
+224,197,1,1,46,46,201,105,128,30,191,159,224,137,5,224,117,81,224,110,
+14,224,97,21,224,189,20,225,112,7,64,22,225,112,6,65,209,64,117,224,
+115,2,224,102,30,224,173,19,123,236,64,70,99,90,225,15,4,99,251,235,
+77,0,1,95,53,67,108,64,7,0,52,64,69,225,50,7,119,21,2,95,
+53,53,195,253,96,116,4,95,53,54,57,32,224,228,1,1,58,53,70,9,
+234,226,0,224,140,1,224,15,1,255,20,1,224,103,14,186,108,64,76,0,
+54,250,241,0,194,245,0,51,106,233,96,49,77,29,160,153,192,17,0,51,
+160,17,0,58,96,117,99,113,1,58,53,68,191,111,79,1,54,53,67,157,
+107,161,1,54,54,160,165,0,80,64,78,131,14,130,76,67,82,107,177,85,
+191,143,154,0,58,64,57,128,46,0,89,141,70,231,174,1,131,29,169,126,
+87,2,100,175,205,83,166,66,64,5,96,12,233,5,1,224,59,4,227,133,
+5,224,25,1,224,27,5,133,96,226,48,4,65,138,3,85,32,75,51,228,
+87,7,8,115,101,112,49,32,65,98,111,118,200,146,224,37,17,4,66,101,
+115,105,100,224,38,0,224,124,1,228,11,12,1,95,52,78,100,224,37,2,
+105,113,234,228,0,232,121,5,2,32,95,53,232,70,4,64,189,226,150,0,
+79,200,110,216,85,134,225,47,0,64,51,65,119,1,95,53,124,117,160,0,
+169,51,225,56,1,224,97,0,225,31,4,205,185,199,180,167,197,192,207,224,
+42,3,165,253,224,195,2,224,79,0,94,86,0,52,144,77,161,189,128,69,
+167,23,64,11,249,78,6,224,71,19,234,233,1,224,71,6,97,1,2,95,
+53,54,96,137,64,19,254,67,7,224,90,0,232,143,12,228,66,1,128,22,
+135,187,64,1,1,95,52,125,197,225,102,40,224,195,4,96,144,0,53,74,
+33,64,163,251,111,1,116,184,67,15,135,38,99,15,202,209,224,159,4,137,
+47,98,13,225,143,3,225,192,21,199,147,128,26,198,100,64,191,1,61,61,
+224,30,8,225,109,0,0,90,192,121,194,96,224,66,18,193,178,224,66,2,
+129,39,71,211,0,53,104,220,64,13,1,95,53,73,80,170,242,1,95,53,
+74,204,128,22,100,19,247,252,0,0,53,105,149,196,209,193,199,2,53,48,
+52,208,169,226,206,12,132,95,65,68,136,20,231,156,8,64,29,227,250,49,
+7,111,110,101,76,105,110,101,114,227,254,25,224,41,0,228,2,6,227,249,
+20,0,85,104,155,97,30,64,0,224,167,6,64,22,224,62,6,65,181,136,
+186,131,86,224,60,0,224,20,0,112,97,192,81,224,61,6,65,111,73,209,
+228,120,0,64,137,150,101,97,66,137,26,127,111,235,26,5,100,192,225,244,
+3,164,140,224,63,1,0,58,97,239,98,197,0,85,193,223,0,53,129,208,
+0,53,64,32,0,58,73,90,170,12,0,83,64,32,158,238,128,90,98,217,
+128,169,230,9,5,179,92,227,127,2,224,19,0,128,17,167,134,64,5,102,
+182,166,193,199,65,248,44,7,160,152,98,63,68,36,126,152,0,53,80,154,
+64,161,64,168,192,193,233,148,5,64,100,231,245,1,160,17,232,61,6,1,
+32,124,129,243,64,29,231,249,37,160,174,0,58,96,136,114,18,0,80,234,
+157,0,232,110,5,106,166,224,119,6,1,60,45,233,28,5,160,6,97,128,
+160,126,235,34,2,0,101,176,66,96,30,1,48,32,98,99,193,18,192,152,
+163,93,0,58,96,162,181,49,82,3,131,135,0,58,64,86,225,201,1,97,
+237,251,201,0,160,181,0,52,82,206,225,156,1,224,129,3,3,119,104,101,
+114,195,29,224,132,26,96,134,211,205,65,24,96,96,0,54,72,113,65,14,
+100,65,225,42,22,2,79,32,35,66,155,234,169,5,224,53,15,0,51,234,
+22,9,1,58,58,225,96,1,99,87,224,56,0,224,40,6,5,100,101,102,
+97,117,108,209,163,163,3,64,199,2,95,53,53,101,110,0,58,96,14,98,
+98,193,49,64,37,69,115,126,46,0,58,96,39,120,225,3,53,49,32,58,
+96,194,169,253,1,80,32,133,177,0,80,97,128,182,201,230,87,0,133,24,
+0,58,65,76,225,176,5,137,159,65,142,160,71,125,135,200,4,227,225,0,
+227,110,1,229,217,4,208,94,164,13,232,147,7,224,46,7,2,95,53,50,
+132,97,64,12,64,5,0,58,96,133,226,209,19,98,44,112,76,227,44,5,
+0,54,227,44,6,65,150,234,154,2,225,207,9,224,72,38,235,250,14,1,
+58,53,80,233,202,202,217,231,223,211,184,255,218,7,167,217,64,27,103,157,
+176,93,110,182,141,67,96,0,0,58,64,143,129,212,2,32,95,51,120,192,
+96,159,88,207,2,50,50,49,97,172,0,50,68,135,134,229,171,64,64,54,
+223,82,225,43,2,226,116,9,5,102,111,114,97,108,108,228,122,5,128,235,
+0,54,163,67,225,11,8,1,58,53,68,140,107,207,0,75,102,128,129,20,
+224,9,0,2,58,53,52,199,76,134,84,93,217,172,112,0,52,104,198,204,
+125,5,52,49,32,95,52,51,150,243,0,51,183,50,2,58,53,52,130,182,
+2,75,32,89,176,91,96,117,194,233,139,223,132,31,119,131,101,249,64,96,
+101,222,0,83,175,243,0,50,82,99,2,95,49,53,71,254,68,112,193,114,
+189,239,99,191,240,31,4,96,223,169,83,128,246,156,25,2,51,51,48,240,
+65,0,96,34,225,150,0,198,176,161,223,225,241,0,128,138,238,96,0,145,
+241,160,51,230,196,0,152,64,3,95,49,52,48,183,69,113,212,3,48,32,
+64,35,65,226,1,64,58,96,219,162,73,168,94,64,20,131,15,96,20,64,
+38,128,20,226,115,1,112,246,128,20,130,52,120,30,224,228,2,104,237,224,
+20,7,122,250,224,41,8,101,27,224,20,6,65,216,224,20,9,128,190,224,
+20,5,103,20,224,83,8,64,179,224,20,8,224,125,11,97,105,224,20,7,
+144,88,224,20,7,224,125,11,98,83,224,20,8,103,133,224,251,7,225,16,
+11,99,73,224,146,8,224,167,12,224,83,11,111,200,224,21,10,224,148,11,
+108,115,224,20,7,1,56,55,104,244,224,22,8,0,54,225,85,12,0,56,
+157,111,224,22,10,128,177,226,230,5,2,56,55,48,102,83,164,46,250,114,
+0,224,7,179,1,58,53,66,5,240,155,16,67,86,240,155,5,67,187,164,
+203,65,20,166,243,65,160,200,164,64,68,150,244,225,63,0,0,51,100,221,
+100,194,80,222,0,53,230,67,0,1,58,53,84,138,160,45,196,219,156,145,
+164,213,0,58,101,25,229,196,27,96,214,229,196,1,69,142,107,83,0,73,
+234,83,3,231,57,0,97,3,81,53,0,49,172,15,224,35,1,2,95,53,
+50,116,140,67,30,0,66,192,116,96,113,96,95,139,181,0,58,96,8,128,
+254,0,52,106,205,107,143,0,58,96,189,225,21,4,129,102,70,71,232,9,
+93,140,232,64,12,136,9,64,133,160,121,100,232,96,249,171,255,136,254,0,
+58,96,52,225,99,9,73,199,225,99,0,73,158,231,40,7,67,173,157,161,
+2,57,32,58,96,21,225,113,18,107,117,225,113,21,168,79,193,113,98,0,
+192,7,64,110,233,149,1,229,220,0,224,201,8,198,91,225,56,0,242,233,
+1,225,60,1,161,61,225,63,9,224,24,0,224,168,1,192,19,252,183,4,
+96,71,129,101,225,103,0,130,112,2,65,32,58,96,56,115,170,0,49,72,
+249,1,49,55,66,0,0,49,130,23,3,95,53,49,54,94,74,0,48,190,
+204,253,239,0,89,187,97,86,224,20,7,192,253,64,70,180,10,66,82,134,
+162,67,181,89,37,2,95,53,49,138,141,68,161,0,75,96,111,129,210,120,
+57,0,58,96,23,163,102,64,13,129,169,243,211,1,194,139,206,116,123,110,
+249,22,3,142,50,81,235,1,52,56,241,151,5,1,95,53,64,203,212,104,
+96,37,120,195,4,51,32,95,49,56,132,105,72,172,178,102,0,58,96,173,
+194,37,64,87,240,13,10,192,138,2,95,53,48,111,84,160,89,226,84,0,
+227,196,5,224,47,3,88,168,224,47,1,0,58,96,9,251,173,2,243,226,
+1,244,184,22,224,39,24,131,68,187,100,243,161,18,174,106,226,65,2,64,
+8,209,235,224,7,5,224,190,7,224,54,4,224,145,0,227,252,2,192,13,
+255,71,0,169,62,133,116,1,53,48,224,124,0,224,89,6,160,165,225,220,
+0,2,95,53,48,131,215,153,231,224,70,0,192,15,224,51,0,224,219,5,
+245,75,7,192,171,161,17,226,76,1,245,65,0,224,88,7,224,104,11,225,
+119,1,160,226,241,150,5,252,216,14,243,121,3,192,135,128,30,224,224,1,
+245,15,2,224,118,7,224,50,7,133,210,160,130,229,174,0,227,37,3,160,
+217,228,63,7,224,225,9,128,88,147,125,160,0,164,138,224,193,11,225,160,
+1,192,142,160,189,213,15,224,188,10,132,134,0,58,96,16,235,86,1,64,
+86,130,17,165,3,225,85,15,193,52,227,93,8,192,24,0,85,199,174,224,
+33,8,96,129,242,202,3,105,74,150,48,1,79,32,124,102,231,232,0,64,
+255,99,247,0,95,92,156,0,58,97,145,134,59,97,68,64,143,156,213,0,
+64,65,110,3,95,49,54,50,194,194,0,58,96,6,227,198,3,192,193,245,
+173,6,227,114,3,225,209,5,228,79,3,225,66,2,128,14,64,0,227,200,
+1,225,221,12,160,39,225,0,0,97,189,150,141,97,4,195,90,128,54,227,
+231,20,224,67,5,97,221,72,61,128,64,224,76,4,193,56,0,54,133,236,
+130,124,225,193,1,249,169,12,98,239,132,22,224,210,0,249,164,86,0,97,
+85,160,3,78,101,115,116,245,170,25,224,42,1,249,174,58,225,178,13,228,
+108,1,129,250,97,47,193,238,184,1,224,24,16,64,0,225,54,24,128,92,
+229,250,25,176,135,224,177,2,224,76,0,249,156,22,224,151,7,249,168,7,
+224,82,2,132,223,131,235,224,74,0,81,20,0,39,228,195,0,130,47,134,
+41,193,48,225,54,2,225,55,0,233,10,10,160,151,224,138,2,224,205,4,
+131,3,244,47,0,101,56,249,254,11,230,187,0,225,42,15,162,238,224,92,
+4,128,1,228,246,2,225,179,16,192,52,185,233,96,0,112,141,0,58,96,
+36,197,18,227,64,29,192,153,247,35,9,224,23,1,225,200,1,225,237,12,
+229,72,14,224,167,0,129,179,2,64,95,55,169,230,96,0,229,91,27,96,
+125,225,76,0,192,72,177,15,133,59,113,11,2,51,32,95,112,131,128,67,
+225,70,2,193,33,216,175,76,187,1,56,55,64,161,162,212,251,25,0,65,
+213,248,51,4,230,68,30,192,48,224,28,4,97,169,224,224,8,96,21,232,
+63,5,225,57,14,97,54,96,198,187,203,225,57,4,225,58,26,242,81,0,
+169,25,0,50,96,9,235,101,4,128,77,163,149,70,129,0,58,96,107,107,
+177,0,48,86,18,68,84,246,18,1,98,244,118,18,83,162,151,35,0,39,
+98,101,194,217,98,168,228,36,0,118,101,130,54,162,225,161,77,201,36,226,
+90,25,227,69,11,224,39,4,229,207,4,224,242,0,225,130,1,65,36,225,
+125,4,229,157,6,0,98,69,152,0,103,216,167,229,118,4,160,84,164,114,
+192,135,197,119,160,198,111,9,98,72,105,48,226,240,1,160,169,228,245,2,
+195,2,254,129,7,163,163,224,227,17,228,41,0,164,195,232,0,11,229,253,
+1,224,124,8,100,145,65,162,99,127,196,159,224,42,3,228,112,0,226,65,
+5,128,138,225,3,0,192,193,225,223,0,254,14,26,225,55,0,193,194,224,
+46,13,197,78,192,28,225,200,50,0,49,225,201,11,224,88,0,226,133,3,
+225,208,4,227,190,0,132,249,65,5,97,118,225,213,2,229,165,0,72,209,
+160,70,225,187,5,224,220,13,200,215,229,101,0,230,19,17,164,145,224,109,
+4,160,79,225,203,2,227,252,0,78,177,102,128,228,27,0,225,223,1,224,
+68,9,225,231,2,226,138,14,229,121,4,0,64,111,69,104,211,64,6,64,
+4,0,58,110,246,111,143,68,59,3,73,32,64,58,96,47,138,210,2,55,
+32,58,96,95,214,92,64,247,86,92,64,25,160,34,0,53,64,34,0,54,
+228,83,3,96,241,68,83,103,184,128,37,0,51,64,37,218,186,96,37,98,
+78,128,37,132,159,129,113,129,164,64,138,0,58,99,132,234,49,1,226,112,
+8,1,95,52,119,40,130,238,224,246,2,128,38,134,101,2,95,52,55,166,
+68,65,245,129,249,128,227,196,238,231,64,1,224,42,0,101,68,128,142,230,
+50,2,128,80,96,109,226,11,4,195,166,131,61,230,50,36,199,172,230,50,
+11,192,86,198,50,128,236,98,26,232,155,11,255,169,16,181,38,96,110,160,
+10,227,103,7,3,102,105,116,115,220,161,148,252,96,108,130,20,0,53,162,
+20,67,121,89,147,0,50,230,34,1,96,240,225,151,1,233,145,0,225,167,
+0,193,185,239,65,1,230,63,10,227,67,2,234,170,22,229,45,7,224,35,
+4,239,51,1,228,86,4,103,103,224,238,5,10,100,105,115,112,108,97,121,
+32,108,97,121,203,184,192,141,195,68,231,152,5,192,29,65,79,174,7,225,
+178,0,229,186,13,238,254,9,3,95,49,51,54,90,30,218,141,0,79,83,
+60,238,86,0,64,0,165,144,196,25,0,66,64,5,96,53,232,222,9,160,
+252,99,238,155,60,160,184,228,57,15,225,113,7,234,29,7,225,109,10,225,
+199,1,225,106,61,0,50,225,107,7,133,114,225,35,3,224,210,36,225,130,
+82,65,231,101,39,3,64,85,32,90,161,241,160,7,100,26,1,58,52,84,
+59,223,63,0,52,64,146,1,95,52,84,35,0,58,97,166,203,168,155,245,
+0,58,96,25,184,153,0,48,75,166,136,98,2,50,56,52,74,237,0,56,
+68,11,117,65,128,26,1,95,49,96,231,85,16,192,44,2,95,51,53,126,
+241,96,195,1,55,55,192,21,0,50,104,130,100,14,192,18,1,49,55,166,
+152,1,58,52,64,87,128,116,0,83,105,190,164,189,208,122,69,26,0,50,
+88,165,0,51,130,83,129,202,2,95,51,54,93,161,0,56,96,135,0,54,
+152,40,188,186,96,124,64,48,65,224,192,15,225,80,6,225,247,1,17,114,
+101,99,117,114,115,105,118,101,32,109,111,100,117,108,101,58,32,161,253,160,
+197,97,226,1,95,51,122,250,224,71,19,13,44,32,105,109,112,111,114,116,
+32,99,104,97,105,110,192,69,65,116,64,39,158,165,128,69,128,0,1,95,
+52,87,202,1,58,52,65,91,70,120,4,51,54,55,32,75,185,148,237,119,
+5,0,51,242,199,1,0,58,96,240,166,153,65,117,0,51,120,49,5,51,
+52,57,32,95,52,125,153,235,121,2,98,101,131,164,224,42,0,225,29,2,
+64,52,128,161,1,51,53,75,147,1,52,54,162,175,232,137,1,255,237,1,
+69,12,128,73,88,219,64,213,1,51,52,223,14,6,95,52,51,55,32,95,
+52,90,184,225,109,24,0,77,97,99,9,32,110,111,116,32,102,111,117,110,
+100,225,109,0,96,172,161,108,2,49,50,51,65,15,105,150,224,76,19,15,
+92,49,48,38,115,101,97,114,99,104,32,112,97,116,104,61,128,74,158,175,
+128,165,96,73,1,49,51,124,79,64,4,0,53,129,127,1,95,51,126,251,
+224,91,23,6,112,97,99,107,97,103,101,224,92,3,224,83,18,225,63,0,
+160,207,128,1,228,198,1,128,1,163,90,129,140,225,137,4,1,95,52,126,
+155,96,0,98,123,112,149,198,168,99,77,161,194,224,31,1,80,114,0,55,
+231,184,4,226,179,1,166,238,131,244,193,95,231,142,6,128,5,104,107,193,
+12,1,52,55,82,117,228,128,10,94,61,228,128,2,128,206,226,131,2,154,
+161,163,54,164,234,247,35,2,1,95,51,127,59,226,126,0,227,156,28,193,
+129,3,100,111,101,115,98,52,6,99,111,110,116,97,105,110,163,171,226,60,
+2,192,244,229,59,12,245,21,1,227,130,3,224,191,6,227,67,3,160,220,
+125,72,161,115,132,118,163,147,0,80,101,70,130,240,119,252,237,83,5,96,
+0,226,207,1,1,51,53,69,63,1,52,56,100,241,2,58,52,56,138,43,
+224,229,1,2,46,116,120,78,1,0,58,96,33,104,202,2,95,52,55,80,
+96,96,5,0,58,96,104,106,155,1,55,56,64,211,92,22,0,51,84,175,
+128,5,0,58,96,37,164,19,65,116,106,169,0,55,133,246,225,74,8,73,
+61,0,58,97,227,234,82,6,1,53,56,234,82,3,67,241,128,106,197,111,
+133,92,198,68,224,244,4,236,99,0,128,49,0,58,96,33,165,209,226,185,
+5,165,83,164,67,5,50,49,57,32,95,51,91,165,99,180,0,50,129,135,
+91,41,70,116,65,138,247,227,1,227,40,2,194,64,0,52,113,95,226,59,
+16,7,76,111,97,100,105,110,103,32,194,67,244,249,0,229,15,4,227,130,
+5,0,51,118,158,132,232,224,182,1,228,246,2,224,178,2,65,223,1,51,
+51,70,249,91,247,67,255,0,55,70,169,64,132,224,163,1,193,52,224,165,
+16,0,80,160,157,24,99,111,109,112,105,108,101,32,118,101,114,115,105,111,
+110,32,109,105,115,109,97,116,99,104,58,192,191,164,128,226,85,1,128,111,
+230,143,18,160,82,0,114,128,57,192,153,129,78,192,246,130,239,1,95,52,
+88,32,98,156,68,77,221,204,64,247,135,102,0,54,89,203,167,102,71,145,
+128,22,0,51,224,22,5,64,154,94,187,100,116,64,20,1,95,51,75,137,
+1,95,52,131,25,1,95,51,68,65,229,158,1,1,95,52,72,2,1,95,
+52,114,254,228,193,8,97,56,70,117,2,95,52,55,67,177,0,58,96,162,
+157,79,0,50,104,242,0,58,96,24,128,17,0,52,104,242,0,58,96,75,
+128,17,0,51,201,14,0,58,96,102,3,10,65,32,90,69,139,0,58,96,
+140,103,111,3,56,55,32,95,108,64,64,170,231,129,3,64,128,73,241,231,
+120,0,0,58,96,255,192,123,0,90,233,104,0,0,58,97,130,192,111,64,
+132,96,2,192,30,96,32,0,54,163,186,3,54,52,32,58,100,93,15,10,
+65,32,94,71,69,84,84,73,77,69,77,73,76,76,73,64,22,243,249,0,
+165,54,237,194,12,2,95,52,51,99,103,172,127,176,43,164,169,201,128,102,
+219,144,176,134,59,236,207,6,192,22,224,49,3,137,78,64,53,197,69,2,
+79,32,35,79,88,128,198,233,241,9,97,6,148,182,64,0,230,226,1,234,
+10,3,234,55,6,163,85,64,132,228,4,5,232,72,18,226,220,17,0,70,
+67,42,232,68,8,231,154,3,167,149,224,120,0,98,88,234,167,1,0,52,
+98,139,206,17,225,17,7,234,123,1,193,143,165,91,102,104,100,167,64,66,
+111,17,199,182,96,33,164,54,234,245,3,67,168,230,233,2,203,0,160,14,
+107,5,97,153,98,45,233,220,5,97,114,2,52,53,51,229,197,2,7,109,
+104,115,99,112,112,46,104,207,4,64,42,142,13,165,109,226,20,3,224,138,
+0,64,132,0,53,133,58,224,232,3,160,186,235,174,8,0,52,102,7,224,
+171,2,128,156,240,226,0,225,227,3,0,49,87,3,2,95,52,54,65,179,
+100,0,229,39,2,0,50,64,70,74,192,69,37,86,1,165,207,237,121,6,
+5,114,101,109,111,118,101,97,210,5,102,97,105,108,101,100,128,219,0,58,
+96,134,67,46,7,117,110,108,105,110,107,32,58,96,101,161,31,225,33,2,
+2,50,49,49,224,77,2,7,77,72,83,67,80,80,72,83,237,195,3,224,
+46,6,225,228,5,105,70,0,66,233,103,4,128,245,230,172,10,192,209,134,
+156,205,183,230,142,2,226,180,19,8,82,117,110,32,99,112,112,104,115,226,
+175,20,1,95,52,99,191,224,185,0,236,134,5,0,56,224,91,14,96,87,
+230,225,0,224,244,1,224,140,16,7,32,45,45,115,116,114,105,112,160,138,
+234,115,6,233,76,0,204,191,162,174,106,32,77,226,194,74,96,39,3,67,
+39,32,79,139,110,224,109,15,1,45,73,166,189,160,49,224,25,1,10,47,
+115,114,99,47,114,117,110,116,105,109,188,155,100,117,64,76,1,57,53,224,
+193,10,2,79,32,35,89,123,132,154,228,175,2,224,20,1,65,65,214,79,
+224,182,2,234,16,14,132,253,129,93,225,44,18,0,79,225,91,1,98,154,
+67,77,198,16,197,245,224,1,1,235,38,2,64,43,134,60,0,79,226,164,
+2,8,45,68,95,95,77,72,83,95,95,64,86,0,75,70,132,65,84,70,
+40,2,50,53,49,255,199,3,0,58,97,125,134,28,227,118,10,74,88,237,
+151,5,227,120,20,129,14,235,125,32,8,99,97,108,108,67,111,109,109,97,
+69,98,131,154,194,46,237,174,8,0,49,133,13,224,78,19,0,44,226,246,
+19,96,234,167,30,7,115,121,115,116,101,109,32,58,96,222,99,239,228,116,
+3,224,236,2,97,5,182,33,64,34,224,21,4,113,22,1,95,52,142,229,
+225,62,3,1,95,50,81,75,228,245,8,79,89,224,39,4,82,203,107,102,
+0,52,79,31,229,191,7,165,180,64,29,113,58,64,201,161,167,2,52,53,
+49,70,39,97,125,1,49,51,65,162,1,35,52,105,123,3,95,52,50,56,
+102,68,181,176,0,83,64,80,64,81,74,65,225,51,2,130,63,139,131,1,
+55,57,226,55,2,8,92,51,52,38,108,105,98,47,83,97,33,5,47,73,
+79,46,104,115,64,19,5,44,50,56,52,58,56,129,94,0,90,129,47,108,
+162,64,110,97,18,2,48,50,32,128,131,160,19,96,0,0,67,96,36,224,
+118,7,0,58,96,208,133,233,0,89,137,142,135,184,224,84,3,172,27,197,
+36,179,159,64,12,168,173,228,78,1,224,136,1,241,161,0,160,53,98,200,
+160,17,236,59,0,64,5,149,188,0,65,96,14,133,242,9,94,116,109,112,
+110,97,109,101,32,58,97,208,131,122,227,121,10,227,123,5,1,64,58,103,
+164,98,66,2,95,49,56,64,109,5,32,64,95,54,32,89,135,216,128,170,
+144,218,64,1,65,110,254,147,15,209,82,82,141,97,179,97,216,0,35,66,
+202,96,105,96,36,246,21,1,217,218,109,39,224,45,0,207,224,96,33,214,
+96,201,166,224,42,5,0,51,240,11,0,128,36,224,129,17,138,164,96,123,
+224,117,13,64,10,67,2,64,112,224,33,14,89,88,224,33,21,0,49,101,
+244,224,67,20,97,57,96,33,107,63,130,228,224,36,7,96,138,248,77,1,
+224,0,3,225,132,8,226,91,4,225,133,19,193,44,225,132,71,1,49,50,
+225,133,3,138,12,224,133,18,194,219,163,223,68,124,192,28,64,40,242,30,
+1,132,156,250,218,1,231,199,4,141,173,116,47,1,52,52,128,82,1,95,
+52,67,187,0,58,106,180,233,130,9,132,164,139,102,233,222,9,228,178,2,
+0,58,96,70,164,164,69,66,1,95,50,91,14,234,20,6,0,50,91,48,
+224,236,0,0,83,113,90,64,67,102,71,1,95,54,75,249,0,48,232,252,
+0,165,69,192,60,72,46,0,52,106,181,235,20,1,234,243,4,131,239,1,
+95,50,221,241,233,113,4,139,49,235,68,4,73,107,91,91,2,95,52,52,
+161,69,128,24,237,97,1,64,104,68,47,0,51,65,77,0,58,96,38,131,
+239,64,251,1,51,51,96,19,165,154,64,1,102,181,78,149,4,49,52,48,
+32,35,110,254,64,224,76,115,0,35,155,163,97,169,229,119,14,8,68,97,
+116,97,47,67,104,97,114,197,119,3,49,48,49,58,189,243,103,125,64,215,
+96,192,216,5,103,38,0,49,243,117,0,0,49,68,189,96,5,128,123,160,
+11,97,114,96,205,133,122,65,71,0,50,111,222,145,225,0,52,133,20,3,
+95,52,51,56,64,4,114,21,64,178,165,7,1,64,58,96,19,96,13,0,
+58,64,35,128,10,123,12,0,51,220,254,0,51,92,254,71,176,2,10,65,
+32,78,117,67,52,65,56,138,40,232,20,2,161,211,135,220,0,52,65,66,
+233,26,18,245,192,0,64,106,207,161,242,87,0,98,90,64,68,64,88,230,
+17,0,232,55,4,232,6,4,224,120,0,224,107,21,242,183,3,226,155,1,
+157,11,224,26,12,226,182,6,224,102,21,2,108,105,110,242,45,0,225,11,
+4,232,232,33,2,99,111,108,160,65,224,52,4,1,64,64,224,37,2,9,
+101,110,100,45,111,102,45,102,105,108,170,248,224,26,1,10,110,111,32,108,
+111,99,97,116,105,111,110,193,93,224,28,17,0,58,97,162,148,54,100,100,
+79,156,133,66,0,58,97,120,145,206,67,199,0,52,232,145,0,224,183,12,
+238,86,0,175,231,174,158,1,95,51,65,158,0,58,112,126,194,155,98,197,
+130,155,0,51,130,135,229,65,0,122,104,98,188,135,245,128,6,0,58,96,
+51,3,10,65,32,89,229,118,0,232,4,9,200,3,64,48,218,154,133,247,
+78,229,229,66,0,192,18,1,66,39,96,21,254,153,3,178,63,96,8,193,
+230,249,61,2,64,150,128,194,245,247,1,0,53,85,247,133,232,227,9,0,
+249,27,0,237,220,4,131,204,130,10,69,158,0,56,139,167,192,91,0,54,
+163,104,0,50,81,234,64,80,99,11,232,147,0,0,58,121,240,114,104,0,
+48,117,226,139,194,107,171,0,73,64,82,65,108,0,85,64,23,64,83,1,
+58,52,68,230,242,239,5,64,24,64,63,2,49,50,52,143,246,96,143,139,
+11,134,82,1,95,49,179,200,2,95,49,50,81,74,96,92,1,95,49,65,
+246,128,11,0,58,96,6,96,132,0,49,127,114,1,57,55,66,6,0,55,
+228,235,2,12,67,111,110,116,114,111,108,46,69,120,99,101,112,66,101,8,
+46,73,110,116,101,114,110,97,108,66,28,224,39,1,3,83,111,109,101,224,
+35,0,98,55,192,230,162,16,130,18,64,227,65,183,0,95,64,104,96,241,
+136,74,0,95,67,60,252,14,0,0,52,117,82,2,58,52,49,214,202,0,
+90,65,11,64,16,130,10,179,188,64,58,172,16,66,101,0,49,140,254,72,
+102,104,36,1,95,52,107,72,65,229,96,76,129,145,141,164,128,94,129,149,
+0,99,85,89,1,32,58,96,63,189,27,230,196,2,235,247,1,0,49,165,
+15,102,54,240,24,2,64,8,98,218,145,226,1,58,52,80,82,101,75,129,
+235,0,58,96,57,243,210,0,242,89,1,147,18,139,72,66,90,103,12,228,
+71,16,3,111,112,101,110,81,22,4,58,32,99,97,110,82,237,64,16,196,
+153,231,215,4,64,174,166,11,226,109,0,65,108,98,143,0,48,66,9,73,
+157,1,58,52,74,43,248,21,4,97,218,4,97,99,116,105,118,68,132,0,
+58,96,38,128,52,83,149,87,13,0,58,64,63,160,19,0,53,64,91,69,
+102,64,3,0,58,96,30,248,119,7,0,48,253,204,0,77,141,1,95,52,
+73,240,2,95,52,48,100,64,0,48,231,155,0,0,52,64,248,1,116,111,
+96,131,64,24,129,62,70,149,64,24,100,203,0,58,96,58,128,46,246,170,
+1,246,124,2,71,106,214,124,0,67,127,141,0,51,84,180,64,250,74,206,
+225,248,4,96,25,245,227,5,0,90,164,41,100,224,167,127,64,40,196,122,
+192,28,224,37,0,68,178,0,58,96,41,227,215,6,0,51,73,68,217,77,
+1,95,50,99,214,0,50,67,204,242,116,2,0,51,65,132,0,51,139,34,
+138,227,213,82,0,51,130,100,244,162,0,232,250,1,239,212,11,128,97,100,
+183,249,39,10,228,171,1,226,84,17,217,22,9,115,97,118,101,100,32,99,
+97,99,104,166,236,231,143,8,192,175,64,27,0,51,148,203,226,118,2,160,
+184,2,58,51,57,255,190,13,171,83,68,104,165,91,96,208,73,91,250,12,
+0,194,38,171,250,229,148,2,130,216,235,197,0,204,77,1,95,51,128,220,
+219,151,0,95,90,230,64,0,236,42,0,229,247,0,254,241,17,79,154,80,
+106,230,248,10,215,93,128,69,238,25,1,118,226,64,8,88,23,128,18,176,
+41,250,69,12,81,204,192,190,166,170,250,79,3,224,45,5,182,38,193,34,
+193,246,160,182,250,111,1,96,183,103,192,254,104,4,64,0,1,95,51,178,
+241,64,51,0,89,224,162,21,182,7,69,126,0,51,117,181,189,152,192,62,
+128,177,204,31,224,126,2,193,101,65,29,197,15,251,214,23,245,42,13,251,
+198,10,233,78,19,9,105,110,118,97,108,105,100,97,116,101,130,174,210,132,
+130,176,0,51,89,61,160,0,192,244,225,106,4,100,56,1,95,51,248,133,
+0,224,172,2,226,142,4,226,39,2,149,101,192,179,65,119,145,59,1,51,
+56,193,9,96,127,1,51,57,68,214,99,26,168,173,66,51,68,20,238,42,
+0,110,41,161,87,66,59,225,227,1,221,79,81,30,123,39,96,0,96,35,
+96,181,108,245,155,50,0,58,96,104,68,190,64,151,72,121,0,51,108,170,
+2,95,51,57,73,46,96,42,100,127,64,128,131,126,111,5,224,105,4,146,
+175,192,135,255,152,0,169,49,75,171,64,169,96,32,201,202,97,16,224,61,
+3,101,15,233,167,1,96,126,101,12,81,170,96,147,229,26,0,241,142,8,
+0,58,96,228,116,226,0,50,83,30,106,42,128,12,161,99,91,144,105,93,
+64,104,0,79,245,206,1,158,229,97,123,229,153,0,66,228,148,248,128,2,
+96,153,224,183,3,124,58,0,51,105,13,202,103,164,65,0,55,68,60,71,
+28,98,148,128,10,193,26,225,166,0,161,59,135,250,224,2,1,192,204,250,
+82,1,128,33,160,126,227,29,1,225,246,0,96,8,1,95,54,66,168,240,
+120,1,1,95,51,95,233,128,102,129,112,139,7,0,51,93,125,224,125,3,
+68,135,224,44,1,0,58,65,34,129,233,1,80,32,74,51,0,58,66,169,
+129,20,253,147,12,105,37,0,51,123,133,194,73,67,6,203,90,224,195,0,
+64,4,0,83,75,75,161,12,193,6,160,134,96,202,165,131,110,206,65,65,
+128,97,224,217,2,1,95,51,129,187,225,81,5,160,70,225,69,10,225,94,
+0,225,60,8,74,52,225,60,25,128,73,128,159,243,30,0,0,64,162,113,
+226,126,7,224,44,4,192,120,124,186,224,48,20,0,83,192,41,67,8,4,
+52,51,32,95,54,130,51,141,30,128,6,64,185,195,116,160,45,129,200,67,
+8,128,78,116,171,224,9,0,118,152,65,214,166,157,0,67,114,179,68,183,
+160,54,160,34,224,63,11,96,55,175,44,226,37,17,170,214,72,103,93,165,
+225,198,1,100,108,129,158,0,90,225,144,6,226,240,0,227,74,1,160,2,
+97,41,195,31,103,9,224,80,4,225,115,16,128,48,99,217,231,205,1,228,
+93,5,224,66,0,224,192,6,132,238,224,192,70,226,98,0,164,229,224,190,
+22,192,46,65,151,193,170,224,191,18,192,14,131,41,227,226,2,128,209,207,
+135,64,1,100,188,224,188,0,169,47,229,147,0,156,143,229,191,2,1,53,
+56,162,119,199,103,242,92,0,226,136,5,167,100,224,89,1,254,11,2,225,
+33,6,192,114,224,227,1,234,234,1,224,11,0,160,9,160,133,128,207,128,
+19,229,68,17,225,69,8,225,52,1,224,208,0,138,29,0,82,144,42,229,
+152,25,224,81,8,224,225,2,96,197,225,55,1,64,15,136,189,227,172,8,
+64,20,225,55,0,110,59,128,11,1,95,51,66,96,225,73,2,163,92,224,
+98,14,228,14,18,224,97,38,165,236,225,244,3,162,237,81,191,96,50,230,
+148,8,224,13,19,224,176,1,227,4,1,224,35,1,128,17,129,27,1,52,
+55,224,184,5,224,171,5,136,232,96,24,96,0,2,95,51,55,70,57,1,
+95,51,203,106,226,83,2,224,176,10,224,177,65,162,168,96,158,224,177,39,
+139,134,0,56,224,18,0,225,111,1,0,58,98,199,237,225,2,224,195,17,
+169,175,128,1,231,155,0,192,8,0,58,96,94,224,72,33,224,234,1,224,
+86,1,226,77,0,224,5,1,0,85,224,61,2,229,224,4,96,49,234,76,
+0,234,85,1,225,57,0,224,167,5,160,58,129,26,107,0,227,162,0,96,
+16,224,15,0,192,224,224,168,0,224,119,34,192,35,225,39,19,128,26,229,
+25,4,192,24,97,69,65,171,209,131,227,5,21,225,143,2,224,124,3,224,
+79,0,224,103,17,0,58,98,188,224,101,34,226,154,3,225,181,2,225,46,
+6,160,67,224,24,3,192,152,225,150,76,224,98,10,225,129,60,138,84,3,
+35,50,32,58,99,76,146,183,228,253,2,224,110,3,166,55,160,13,132,81,
+160,5,135,102,224,225,1,224,51,1,236,89,0,72,61,171,149,231,117,14,
+231,141,17,224,128,3,192,208,170,44,102,59,231,29,8,229,144,4,132,32,
+135,34,228,44,0,0,73,100,16,65,12,212,115,193,110,145,236,64,168,65,
+25,0,48,65,25,136,147,1,35,51,64,11,231,205,3,228,234,21,226,4,
+3,227,249,0,64,8,168,54,0,58,96,186,168,236,81,198,2,75,50,32,
+128,165,83,202,192,255,0,58,96,177,115,132,0,57,161,4,106,53,120,231,
+215,247,183,9,215,16,128,24,64,11,183,56,224,24,11,160,49,151,88,1,
+95,49,89,38,139,217,0,58,96,6,243,50,18,158,118,96,40,218,111,0,
+58,64,42,128,10,108,156,80,167,243,192,2,96,100,97,162,252,17,3,67,
+68,134,89,0,58,111,169,214,224,2,95,49,52,96,140,123,246,1,51,54,
+82,113,118,199,128,17,0,58,96,6,180,242,1,95,51,121,228,0,58,96,
+37,161,151,127,238,0,51,87,113,1,95,51,233,60,1,143,200,237,12,0,
+80,248,116,108,129,103,128,180,129,142,193,34,87,35,96,184,0,58,113,45,
+224,206,22,97,146,65,217,66,89,1,64,58,113,108,160,164,64,13,196,132,
+208,125,84,56,143,211,0,50,64,149,80,246,64,38,129,68,10,94,109,100,
+53,66,70,73,76,69,32,58,96,25,228,190,2,64,241,102,251,144,163,104,
+240,120,150,1,51,53,129,28,82,222,128,170,80,46,76,94,254,216,4,1,
+64,35,112,207,64,164,0,35,97,10,217,227,96,63,225,85,7,64,25,246,
+52,3,0,58,96,24,128,37,0,51,163,166,224,1,11,233,176,2,128,0,
+0,58,96,175,160,199,121,207,180,74,154,110,201,11,164,50,247,143,3,119,
+54,190,226,164,11,239,231,2,115,208,96,65,226,93,8,64,14,122,196,235,
+165,0,65,8,110,168,242,112,7,1,79,32,97,11,192,181,0,58,96,82,
+225,239,7,98,68,192,152,225,252,8,128,100,0,58,114,223,226,135,10,154,
+100,226,135,10,83,2,246,175,5,191,233,239,166,9,66,151,196,221,97,4,
+133,108,175,148,122,142,251,189,5,128,166,239,134,1,230,53,5,229,218,2,
+140,45,64,107,64,79,239,116,3,160,73,98,211,64,155,0,54,96,155,1,
+95,52,64,217,64,113,113,204,0,90,145,211,1,90,32,160,58,211,149,224,
+28,6,73,202,224,28,16,76,233,224,28,16,107,112,224,29,16,1,50,54,
+224,59,4,0,95,91,213,176,151,0,54,68,53,96,10,0,58,96,6,224,
+187,1,88,155,1,51,51,224,145,0,1,95,51,65,232,128,161,97,209,128,
+16,128,149,224,16,2,160,137,224,17,2,160,125,128,17,128,122,96,80,128,
+122,131,147,64,6,224,122,0,93,12,1,95,51,101,131,0,51,92,160,1,
+95,51,95,206,1,95,51,95,232,2,95,51,52,68,14,128,70,64,82,160,
+70,64,10,0,58,96,6,8,10,65,32,98,115,62,61,32,58,96,41,128,
+13,64,12,131,93,2,98,115,60,96,26,130,190,4,98,115,60,32,58,96,
+99,96,12,2,99,109,112,64,14,228,137,0,167,171,231,237,1,98,210,129,
+24,99,124,224,34,0,224,9,1,65,17,64,31,129,51,0,51,98,36,145,
+253,0,58,65,77,64,89,112,175,0,58,96,19,123,189,128,13,129,124,112,
+222,0,58,96,62,244,46,19,190,213,102,241,226,9,6,130,235,130,221,230,
+182,0,98,251,0,58,96,6,160,54,161,173,152,45,146,174,96,17,119,69,
+160,17,0,58,96,71,244,196,1,190,205,160,62,94,197,0,51,126,190,96,
+46,97,65,0,47,65,92,190,161,2,98,115,61,96,13,128,244,0,73,64,
+10,128,241,86,6,81,196,0,75,170,34,0,58,99,252,103,78,138,56,131,
+163,228,158,0,1,64,95,96,111,130,41,222,39,228,118,0,228,102,3,0,
+83,179,251,96,40,161,34,111,56,0,56,133,16,228,172,2,244,93,0,252,
+129,3,0,51,189,52,0,85,96,86,128,13,128,23,247,181,0,2,95,51,
+50,97,50,160,184,200,236,1,95,50,64,29,1,95,51,90,224,0,58,64,
+34,225,190,1,97,182,0,58,96,25,230,23,1,160,20,189,210,0,95,65,
+163,93,191,231,63,19,101,64,1,95,49,64,42,183,190,224,208,36,0,90,
+224,208,3,224,207,2,0,50,65,239,158,97,96,6,193,135,224,92,5,203,
+90,225,44,15,224,171,6,186,32,96,107,96,106,133,203,190,162,73,13,190,
+127,224,85,13,103,98,224,77,2,0,58,123,39,233,60,1,190,155,115,250,
+0,52,231,97,30,0,58,124,20,96,221,1,48,57,184,194,160,5,119,68,
+215,183,190,157,108,108,0,58,96,25,227,164,1,190,54,128,238,234,177,8,
+0,58,105,247,254,66,4,3,46,109,104,115,121,151,94,64,124,50,140,64,
+231,191,15,130,254,231,250,6,129,212,252,251,0,187,20,167,62,64,146,163,
+39,1,95,51,94,116,96,234,190,150,225,90,3,64,105,92,142,160,105,224,
+132,3,1,95,51,94,78,225,138,7,249,167,1,233,31,6,0,49,154,19,
+225,160,2,218,87,192,159,101,180,0,48,66,169,94,189,160,32,224,109,2,
+0,53,236,144,1,224,213,6,225,245,3,96,200,162,38,64,188,104,21,95,
+39,0,58,96,65,68,84,14,79,46,100,101,115,101,114,105,97,108,105,122,
+101,32,58,96,29,74,30,20,97,100,100,95,108,122,55,55,95,100,101,99,
+111,109,112,114,101,115,115,111,114,64,31,203,4,0,83,66,72,0,64,171,
+182,243,36,2,170,124,165,63,239,18,1,225,25,4,129,146,202,110,224,215,
+0,0,50,98,229,224,53,3,224,224,5,187,32,2,95,50,56,197,157,0,
+58,65,36,194,18,234,246,1,161,27,224,88,1,127,187,169,249,224,80,0,
+106,218,0,51,95,206,1,95,49,157,45,227,49,4,65,210,65,10,5,117,
+110,103,101,116,98,64,251,130,188,235,97,5,224,215,3,1,95,50,95,192,
+235,16,3,106,228,0,95,70,65,238,32,1,227,231,3,2,95,50,57,96,
+211,3,95,50,48,50,226,245,2,12,104,71,101,116,67,104,97,114,58,32,
+69,79,70,190,60,0,58,96,196,101,144,3,52,52,32,58,96,56,64,158,
+128,156,96,121,101,8,3,51,50,32,79,67,19,0,50,74,116,1,95,50,
+66,113,133,43,96,174,239,126,0,228,49,2,0,50,78,125,202,7,0,80,
+229,67,0,64,146,128,173,253,59,15,22,111,112,101,110,66,105,110,97,114,
+121,70,105,108,101,58,32,99,97,110,110,111,116,32,64,22,0,32,253,69,
+3,255,246,2,129,251,229,101,5,1,95,50,116,4,197,127,99,97,99,142,
+0,50,183,218,0,58,99,119,227,248,6,1,95,50,90,158,138,115,225,211,
+2,99,110,99,120,224,5,0,220,177,66,176,64,3,228,31,1,142,27,225,
+124,6,20,72,97,110,100,108,101,32,97,108,114,101,97,100,121,32,99,108,
+111,115,101,100,161,132,227,167,6,66,144,100,128,67,175,0,50,125,54,164,
+39,73,99,0,50,93,88,96,189,131,84,1,75,51,104,5,96,22,99,146,
+104,112,99,66,96,51,130,212,0,58,96,60,163,178,78,47,79,183,0,58,
+96,29,65,238,96,142,97,240,168,75,67,106,0,58,96,129,231,48,0,3,
+95,50,55,57,64,149,0,55,111,243,128,84,188,224,7,116,111,70,117,110,
+80,116,114,64,50,198,75,80,11,195,123,0,58,97,85,101,176,134,1,0,
+58,100,237,226,54,16,65,177,229,113,10,225,227,8,66,83,81,46,96,36,
+0,50,149,85,161,246,230,252,0,229,140,5,226,15,18,64,148,218,133,0,
+67,64,126,98,237,1,95,50,106,83,224,6,1,68,232,96,50,160,206,200,
+52,96,45,100,196,228,39,8,130,16,64,20,225,233,6,129,80,192,219,224,
+55,8,139,156,192,200,228,69,1,130,131,1,95,50,204,58,0,58,96,201,
+133,120,11,112,101,114,102,111,114,109,73,79,32,94,38,161,213,64,31,129,
+214,6,102,112,102,105,110,32,58,64,119,128,14,2,110,101,119,64,14,163,
+244,69,158,143,189,97,68,192,18,3,117,116,102,56,64,18,129,194,97,115,
+71,26,98,64,178,136,0,67,64,31,161,60,229,149,6,160,213,100,219,0,
+49,73,109,224,17,3,64,215,64,19,161,113,238,217,4,0,49,72,78,97,
+91,224,23,7,0,57,206,242,224,24,5,68,172,224,23,8,227,129,1,1,
+119,43,163,110,65,120,103,42,229,83,3,0,50,71,155,67,180,65,171,229,
+76,4,202,237,226,141,7,0,58,98,170,65,36,0,102,100,155,0,58,96,
+85,239,19,0,233,0,13,232,254,6,1,58,50,179,74,114,63,82,178,238,
+221,2,224,2,34,0,95,136,97,224,0,5,130,56,224,1,21,113,202,1,
+51,55,228,168,2,5,70,108,97,103,115,123,193,42,224,0,6,231,67,2,
+224,2,33,96,157,224,106,11,7,118,101,114,98,111,115,101,61,229,213,0,
+110,168,0,56,132,156,224,0,10,224,206,33,81,24,194,61,224,0,8,224,
+196,41,224,193,16,4,114,117,110,73,116,224,191,4,0,50,84,65,224,191,
+13,224,188,59,224,187,38,224,184,16,5,109,104,115,100,105,114,225,121,5,
+231,79,1,224,191,12,224,188,56,224,187,35,224,184,16,4,112,97,116,104,
+115,224,183,10,232,12,2,224,189,11,224,186,53,224,185,32,224,182,16,4,
+111,117,116,112,117,226,41,5,225,111,21,224,174,50,224,173,29,224,170,16,
+6,108,111,97,100,105,110,103,226,213,27,224,162,47,224,161,26,227,114,17,
+6,101,97,100,67,97,99,104,228,54,5,224,160,13,224,157,44,224,156,23,
+224,153,16,4,119,114,105,116,101,224,154,30,224,151,41,224,150,20,224,147,
+16,6,117,115,101,84,105,99,107,227,49,5,224,145,11,224,142,38,224,141,
+17,224,138,16,4,100,111,67,80,80,224,135,23,224,132,35,224,131,14,224,
+128,16,5,99,112,112,65,114,103,228,60,35,224,139,32,224,138,11,224,135,
+17,224,133,37,224,130,29,224,129,8,224,126,17,175,121,225,138,20,224,114,
+26,224,113,5,224,110,16,6,98,117,105,108,100,80,107,228,79,7,81,235,
+224,240,12,224,119,23,224,118,2,224,115,16,3,108,105,115,116,224,114,33,
+224,111,20,192,110,224,107,16,6,112,107,103,80,97,116,104,225,207,29,224,
+104,17,96,103,224,100,16,6,105,110,115,116,97,108,108,224,211,9,225,181,
+1,224,88,14,224,77,11,4,116,97,114,103,101,230,140,35,224,0,13,192,
+108,0,49,86,39,193,47,2,95,49,50,76,223,185,206,86,181,128,11,0,
+58,96,6,77,241,109,4,74,238,97,13,124,180,224,156,3,6,78,111,116,
+104,105,110,103,128,156,237,21,1,0,50,93,167,110,188,2,56,32,95,125,
+29,0,35,84,4,225,83,6,224,70,1,4,74,117,115,116,32,160,68,75,
+227,76,109,192,49,65,20,64,166,0,64,98,20,160,15,87,69,160,15,0,
+58,96,6,244,201,3,128,221,0,58,64,124,64,23,111,248,96,119,4,49,
+48,50,32,35,88,182,185,221,160,16,207,116,190,92,171,221,224,235,8,3,
+70,97,108,115,84,131,161,75,224,24,1,2,84,114,117,128,23,225,80,0,
+65,233,193,80,96,11,0,58,96,6,189,49,89,221,97,20,1,95,50,94,
+100,1,58,50,190,150,248,169,5,236,144,26,160,182,141,202,96,225,173,200,
+0,95,119,232,96,244,245,40,7,0,53,226,131,0,129,171,175,211,241,61,
+1,225,197,3,161,196,176,129,96,51,129,69,64,186,109,149,195,114,238,66,
+3,253,60,1,243,104,3,224,72,4,244,162,6,0,50,191,88,79,199,243,
+5,5,1,101,97,145,119,0,75,97,39,141,178,1,65,46,103,188,1,32,
+58,96,80,129,249,0,52,224,2,2,128,85,1,58,50,191,79,162,23,128,
+2,225,71,7,1,58,50,255,66,1,110,7,224,38,1,224,36,0,1,58,
+50,191,88,224,151,1,7,118,55,46,48,92,49,48,38,86,146,0,50,191,
+79,3,95,50,53,50,64,4,0,53,96,19,129,238,3,95,50,53,52,67,
+117,0,48,143,12,128,6,0,51,96,5,0,48,227,134,0,0,58,96,51,
+128,45,2,51,32,58,64,50,128,145,0,58,64,15,128,10,65,142,0,53,
+99,245,254,78,3,0,54,192,67,127,134,179,105,77,147,128,85,208,227,64,
+60,148,221,0,50,94,115,0,58,64,73,128,25,111,198,66,138,129,244,129,
+219,0,64,126,21,195,239,96,30,229,200,2,160,35,96,17,192,11,128,110,
+210,141,89,220,127,2,184,14,96,123,146,167,81,66,94,122,1,58,50,190,
+146,2,95,50,52,82,18,126,173,113,181,225,99,1,5,115,116,100,111,117,
+116,65,253,0,58,96,51,145,50,128,21,1,32,58,96,50,248,71,0,148,
+173,131,218,241,156,35,178,91,69,129,96,195,189,190,64,38,184,145,0,58,
+96,28,181,243,120,100,2,52,49,32,117,197,2,66,32,95,120,10,93,34,
+64,38,129,170,0,73,64,154,194,167,4,97,108,108,111,99,64,16,176,55,
+0,51,65,222,189,55,244,182,8,1,95,50,93,53,67,39,92,227,98,44,
+1,64,58,65,50,128,145,2,95,50,49,64,227,128,207,64,33,0,58,96,
+47,96,153,227,174,0,1,95,50,125,45,64,13,129,128,97,246,0,58,96,
+47,80,252,1,112,117,118,41,189,54,246,41,0,65,120,246,41,6,221,75,
+0,50,244,4,0,189,79,84,42,243,70,0,189,67,88,11,95,222,64,135,
+0,90,160,7,128,9,160,10,245,235,5,247,227,6,225,7,6,177,36,0,
+50,91,95,92,4,132,59,101,87,93,21,113,247,228,35,3,3,66,97,100,
+32,181,176,2,109,111,100,197,137,248,128,1,64,166,213,78,100,151,120,175,
+85,113,244,206,6,134,19,1,50,50,152,40,97,67,116,139,228,170,5,189,
+206,1,95,55,87,129,189,205,5,102,112,50,112,32,58,96,57,64,26,94,
+81,150,115,224,5,3,70,136,0,39,128,7,0,67,149,48,97,161,65,196,
+224,6,13,224,42,2,127,200,96,48,224,42,30,160,28,224,49,10,224,42,
+15,224,49,10,224,42,22,224,49,3,191,36,129,161,0,58,96,6,227,156,
+2,116,73,65,90,95,194,65,202,194,210,70,142,115,210,64,22,0,54,224,
+22,1,103,22,190,209,136,48,0,50,179,223,88,6,0,58,96,32,228,107,
+0,0,50,91,75,128,142,0,58,96,38,3,10,65,32,82,161,95,0,58,
+96,28,160,138,0,89,228,232,0,92,106,102,165,64,32,129,208,225,145,5,
+0,58,96,179,96,55,0,85,131,148,126,155,118,28,0,58,66,154,64,27,
+151,55,230,43,2,0,58,96,37,183,184,167,105,0,58,98,238,224,129,2,
+251,41,2,0,80,96,90,125,57,150,118,231,61,4,128,160,135,92,2,64,
+64,64,99,78,0,58,68,5,194,100,1,95,50,85,117,161,121,93,221,64,
+30,129,52,7,115,101,113,117,97,108,32,58,96,33,64,46,232,25,0,1,
+49,49,227,59,2,5,77,72,83,68,73,82,99,50,71,123,93,183,226,239,
+2,1,58,50,221,238,192,19,230,116,2,0,58,96,45,253,32,9,118,34,
+1,95,50,92,93,245,179,21,253,120,6,0,50,100,240,245,185,11,190,63,
+3,95,50,48,57,64,208,129,151,13,112,101,101,107,67,65,83,116,114,105,
+110,103,32,58,64,26,96,35,1,57,51,103,89,0,58,96,102,227,139,0,
+165,246,70,151,73,107,64,133,152,126,128,6,129,64,96,159,0,58,96,6,
+121,37,1,73,110,70,102,189,60,91,99,2,101,110,118,64,16,167,171,233,
+106,3,225,2,6,233,100,0,166,152,225,81,1,1,95,50,157,204,1,58,
+50,189,101,232,241,8,3,116,97,105,108,97,143,122,39,253,107,0,1,95,
+50,65,238,92,126,64,67,99,47,188,246,70,112,188,167,2,95,51,48,98,
+198,92,23,2,95,49,57,156,207,0,54,97,123,139,225,121,126,192,11,67,
+84,96,11,0,58,96,6,97,230,0,50,72,93,1,52,50,64,67,128,61,
+1,51,54,224,155,2,6,101,114,114,111,114,58,32,203,3,0,48,192,38,
+0,58,96,6,96,128,2,49,32,75,64,21,0,55,72,56,235,35,3,8,
+67,111,110,116,114,111,108,46,69,64,66,64,64,224,26,1,96,18,2,67,
+97,108,128,246,134,88,96,194,108,127,163,11,198,85,64,7,133,183,71,159,
+166,42,69,222,138,111,97,109,127,4,103,218,168,159,169,29,92,252,64,0,
+92,0,96,99,218,253,166,225,96,32,97,109,232,254,8,163,140,232,241,2,
+0,58,100,137,96,162,0,85,225,195,7,16,109,100,53,67,111,109,98,105,
+110,101,58,32,101,109,112,116,121,134,147,64,145,68,120,68,48,160,171,122,
+167,222,184,3,66,32,95,56,65,127,65,205,1,64,89,96,127,64,151,103,
+31,68,56,228,27,1,196,190,233,127,2,224,255,3,96,19,96,54,72,221,
+0,49,124,131,104,190,0,49,158,132,1,64,95,90,30,1,95,49,91,254,
+192,0,0,58,97,54,66,233,9,109,100,53,65,114,114,97,121,32,58,96,
+57,130,126,194,237,0,55,74,97,64,160,1,95,49,159,138,102,212,231,189,
+2,253,159,4,1,49,57,66,35,224,46,2,163,138,251,85,1,123,206,249,
+193,5,189,4,64,145,226,225,0,96,20,186,175,65,0,137,60,67,107,0,
+53,238,97,0,141,215,153,100,224,106,0,225,58,3,192,25,168,147,140,249,
+64,67,1,52,55,205,144,2,49,49,53,129,34,2,95,49,56,132,73,128,
+0,229,150,3,133,191,192,69,232,62,1,64,51,110,160,224,44,2,96,95,
+0,66,165,229,0,52,161,125,106,61,133,43,193,190,232,100,3,224,43,10,
+194,134,229,28,2,96,16,0,58,65,96,130,195,105,168,236,221,5,0,58,
+96,143,99,215,0,48,65,182,93,214,226,3,0,129,253,0,35,103,194,78,
+248,0,58,97,160,7,10,65,32,35,49,54,32,58,96,28,128,57,0,52,
+67,6,76,74,162,58,96,69,0,49,69,5,2,95,49,48,67,231,64,16,
+64,11,69,207,160,11,0,49,65,246,160,11,0,56,67,122,192,11,0,51,
+96,104,0,54,131,56,135,7,169,33,137,36,66,62,160,2,225,73,6,97,
+185,128,50,161,252,165,210,0,64,71,161,64,242,1,95,49,70,144,162,77,
+126,151,0,85,95,108,224,23,0,199,120,1,32,95,78,71,224,29,7,224,
+53,16,4,64,64,83,32,73,95,165,129,86,192,68,224,151,0,67,139,0,
+83,162,93,128,69,113,44,224,69,5,128,161,99,132,66,98,224,31,7,130,
+109,162,247,140,148,67,37,224,40,9,64,0,128,16,96,52,73,38,65,96,
+162,2,240,254,4,96,29,100,159,130,246,113,202,128,163,162,246,78,183,227,
+53,1,203,15,64,34,1,64,95,77,204,167,53,68,82,1,55,57,228,222,
+2,27,92,51,52,38,108,105,98,47,68,97,116,97,47,73,110,116,101,103,
+101,114,95,84,121,112,101,46,104,115,64,27,4,44,50,56,58,49,242,18,
+0,103,234,98,15,96,223,0,85,192,187,192,18,239,29,0,128,5,0,50,
+244,61,2,224,60,3,161,70,0,64,69,25,228,5,0,69,226,64,169,128,
+197,144,236,99,83,99,91,66,162,82,3,171,217,1,67,32,130,187,128,18,
+227,84,1,3,64,95,52,52,131,234,0,58,98,160,108,227,0,58,96,113,
+77,196,64,10,202,33,0,58,64,140,165,17,71,144,0,49,95,121,71,75,
+74,49,65,36,196,174,191,164,199,144,80,63,1,95,49,80,105,167,144,224,
+56,0,67,28,192,11,97,104,104,132,96,6,128,102,79,211,226,5,2,95,
+183,64,31,0,54,160,31,0,85,193,166,94,222,133,243,0,80,128,47,131,
+18,96,47,224,15,8,64,65,242,115,3,167,116,64,28,174,79,133,214,169,
+50,64,147,98,186,65,58,192,73,115,124,224,21,2,128,159,147,162,169,187,
+198,144,137,224,0,49,127,199,0,58,96,169,97,27,0,56,65,40,129,101,
+0,90,64,200,0,58,96,40,161,126,180,128,65,76,243,223,0,0,73,64,
+35,179,213,105,216,237,207,6,224,14,5,192,189,255,109,1,137,232,128,207,
+0,58,96,6,203,72,160,42,69,37,106,32,224,42,0,115,188,96,6,192,
+42,83,110,1,95,49,115,184,96,43,4,10,65,32,47,61,64,165,163,110,
+71,103,0,57,64,130,205,240,204,88,0,75,64,80,141,87,129,169,102,31,
+0,85,224,20,1,99,124,235,251,5,176,176,80,4,64,147,149,18,196,248,
+96,176,160,77,96,175,192,17,0,58,96,6,167,46,233,41,3,64,9,192,
+59,237,232,2,0,58,96,60,101,238,1,54,48,64,202,226,239,1,179,67,
+181,19,160,141,233,216,3,9,110,111,32,109,97,116,99,104,32,97,213,193,
+96,32,96,7,79,179,194,245,106,45,96,11,0,58,96,6,234,45,29,8,
+120,99,101,112,116,105,111,110,46,68,102,2,114,110,97,106,35,224,39,1,
+2,80,97,116,64,22,0,77,64,128,0,70,203,56,162,204,179,179,134,87,
+177,108,0,49,112,121,96,197,98,152,78,27,224,15,4,66,0,248,9,2,
+201,101,145,75,0,51,64,34,243,127,13,170,85,98,160,69,86,97,50,1,
+53,53,130,177,180,11,2,85,32,58,64,18,226,202,2,179,232,161,92,77,
+44,162,136,81,106,0,35,97,244,215,45,1,53,32,128,15,99,113,138,43,
+97,102,68,232,71,156,96,134,224,39,3,161,135,225,43,1,6,39,92,57,
+50,38,39,39,165,151,193,156,169,126,224,99,0,100,30,138,123,224,17,3,
+139,111,233,51,3,224,168,1,0,64,160,35,134,62,64,156,164,146,98,6,
+128,158,130,163,247,247,8,64,146,70,49,160,148,64,0,0,58,96,147,226,
+187,0,175,48,231,109,6,166,166,1,95,49,83,88,160,108,0,54,85,103,
+74,49,129,145,205,244,65,186,165,70,181,26,179,20,112,220,208,218,0,90,
+65,11,102,68,166,21,224,163,5,224,160,0,2,67,32,79,249,171,1,67,
+226,138,9,114,196,225,22,7,96,0,5,79,32,80,32,35,55,244,214,3,
+64,79,0,97,96,79,96,27,0,56,224,27,7,0,98,224,27,1,71,242,
+224,28,5,0,102,224,28,2,0,48,224,28,7,0,110,224,28,2,245,73,
+4,64,28,109,116,128,28,0,57,224,27,7,117,100,160,56,0,49,224,28,
+7,0,118,224,56,2,224,143,8,64,3,227,116,1,225,193,0,132,77,69,
+198,182,105,102,76,66,152,5,95,49,52,48,32,35,97,135,65,45,85,11,
+0,35,67,48,64,53,196,106,3,52,53,32,58,97,163,195,27,174,146,193,
+189,90,11,132,79,96,17,0,58,96,6,154,172,72,16,235,205,0,207,130,
+0,49,118,93,69,207,144,81,96,19,121,249,112,11,96,30,64,69,131,183,
+64,67,226,230,2,249,172,1,192,64,149,153,226,96,8,64,69,104,118,203,
+106,192,40,226,52,3,224,10,1,96,50,106,41,235,237,1,96,250,129,28,
+128,74,70,153,224,74,4,0,58,96,102,5,10,65,32,111,114,100,65,36,
+132,78,2,99,104,114,64,12,216,54,248,191,4,0,58,64,193,64,23,78,
+115,192,175,67,254,134,40,182,170,225,159,6,111,80,225,159,0,123,142,64,
+43,129,203,0,60,70,237,182,196,198,189,0,58,96,60,161,243,64,16,97,
+186,0,51,76,73,182,122,131,203,65,52,82,244,238,187,2,0,58,96,145,
+140,107,0,50,64,47,177,95,103,150,64,136,1,95,49,79,37,0,58,99,
+84,199,108,182,119,0,61,96,11,160,194,128,196,81,142,67,205,81,131,131,
+248,130,46,231,57,0,149,211,96,15,0,58,96,6,201,103,105,163,85,194,
+0,58,96,35,147,197,156,138,82,81,96,26,96,43,199,216,194,70,110,176,
+160,10,231,144,0,199,186,224,32,0,236,59,0,228,203,0,244,142,1,97,
+20,224,65,4,224,64,5,184,159,180,178,129,214,181,98,171,186,224,169,2,
+123,43,96,246,240,220,4,181,94,73,190,73,170,0,58,97,33,180,150,216,
+235,97,61,204,75,128,36,240,1,0,240,174,0,119,156,103,16,115,233,208,
+113,1,95,49,151,172,0,58,103,85,176,72,211,159,96,27,248,170,1,105,
+66,85,68,176,62,64,222,160,26,117,203,112,21,89,93,96,78,161,140,128,
+39,1,95,49,85,98,64,214,192,31,181,140,2,110,101,119,212,15,4,76,
+101,110,32,58,96,39,224,223,7,181,138,75,212,181,71,173,54,109,82,0,
+58,109,155,245,216,4,239,77,3,181,74,220,79,160,49,129,32,253,187,5,
+229,13,0,0,58,109,182,160,52,64,13,229,14,0,128,2,70,206,65,248,
+111,210,84,195,0,58,79,59,160,48,239,209,11,180,231,233,206,3,84,161,
+84,44,79,129,224,27,11,96,120,180,213,252,229,0,128,188,180,220,4,114,
+101,109,32,58,109,47,161,47,224,1,1,113,47,64,0,224,20,11,224,17,
+8,224,14,5,224,11,2,192,8,96,239,128,122,225,76,1,225,55,12,180,
+249,0,79,64,152,170,156,1,56,53,74,46,114,180,192,7,1,95,56,68,
+37,115,48,1,95,57,71,121,160,10,66,148,160,10,118,102,128,10,100,223,
+84,235,0,58,96,17,123,16,3,111,107,101,87,133,76,181,4,0,94,86,
+89,128,18,180,213,171,169,0,95,84,47,1,64,95,120,128,180,158,193,78,
+130,61,180,79,224,46,0,111,217,128,46,129,103,65,5,86,161,100,136,69,
+150,0,95,116,170,0,58,180,73,182,114,179,135,6,116,111,80,116,114,32,
+58,179,130,225,184,5,179,24,175,216,129,239,79,182,64,96,68,153,1,64,
+95,82,23,221,212,134,230,109,132,106,161,179,75,240,48,7,178,74,201,109,
+0,95,82,15,65,181,128,63,1,67,32,96,65,0,95,109,196,1,64,58,
+178,89,230,108,7,178,67,79,104,114,85,72,222,0,58,178,75,5,113,117,
+111,116,32,58,177,252,226,58,1,226,62,2,226,101,72,177,26,97,30,165,
+116,243,175,1,0,95,112,144,132,128,224,20,0,164,133,244,160,6,243,158,
+3,0,58,177,87,85,173,68,171,70,248,0,58,176,55,6,94,102,114,101,
+101,32,58,64,23,227,229,0,224,91,5,85,64,149,126,210,244,245,61,4,
+190,144,80,101,224,116,3,0,58,176,129,227,218,1,64,165,134,63,96,244,
+0,39,79,225,244,29,1,186,76,160,99,244,183,1,166,63,193,64,224,120,
+3,1,64,95,80,190,128,164,134,80,80,155,244,175,3,137,80,0,58,177,
+1,3,85,32,75,51,227,181,5,0,58,240,255,1,176,254,130,180,66,225,
+176,207,76,88,0,83,100,244,189,128,128,188,76,248,144,152,64,218,224,122,
+11,96,121,176,244,229,106,3,229,24,0,176,206,4,115,101,113,32,58,176,
+198,96,225,72,167,162,197,214,252,226,202,7,208,143,247,195,5,8,117,110,
+100,101,102,105,110,101,100,74,222,0,58,176,166,229,229,15,176,183,0,95,
+74,166,99,215,71,176,99,55,0,95,73,175,234,152,12,78,47,234,148,2,
+157,106,2,67,32,95,80,132,224,37,1,234,117,2,64,37,96,19,96,10,
+0,95,81,21,0,58,177,37,0,85,231,88,0,0,53,80,111,64,32,210,
+212,161,65,0,80,96,12,97,123,230,121,1,132,29,96,175,1,53,32,179,
+23,64,70,153,100,132,197,64,30,131,56,224,35,1,224,55,11,193,10,177,
+172,83,150,132,1,113,47,224,13,0,105,208,225,105,5,180,65,14,58,32,
+117,110,115,117,112,112,111,114,116,101,100,32,119,69,128,2,115,105,122,159,
+206,3,35,51,50,55,96,102,8,35,50,49,52,55,52,56,51,54,75,36,
+0,58,178,10,244,16,2,235,183,0,64,117,244,219,1,66,246,212,3,81,
+179,129,20,65,146,0,51,225,33,0,129,143,0,54,148,9,98,111,178,32,
+0,105,91,246,178,1,0,115,75,105,177,245,74,124,177,244,230,197,15,177,
+134,227,43,0,165,37,209,109,1,52,56,183,89,78,242,0,95,80,13,0,
+95,80,32,0,95,80,48,117,157,1,95,53,82,112,129,238,65,65,64,9,
+0,58,64,5,176,216,241,219,3,87,48,89,13,240,136,0,177,186,224,29,
+1,224,49,1,224,39,4,177,141,227,208,10,177,66,3,62,61,32,58,176,
+212,2,62,32,58,176,205,76,5,176,205,2,60,32,58,176,201,5,105,99,
+109,112,32,58,175,192,107,193,77,212,0,95,78,4,0,58,174,20,75,190,
+174,20,65,64,173,244,2,80,32,58,173,240,196,155,164,216,193,74,224,20,
+11,224,17,8,224,14,5,224,11,2,192,8,230,24,0,174,49,233,100,13,
+174,8,4,110,101,103,32,58,173,110,2,42,32,58,173,107,2,45,32,58,
+173,104,2,43,32,58,173,90,224,156,68,0,58,173,146,224,155,2,193,143,
+173,128,171,9,2,66,32,95,77,18,0,95,113,102,0,66,107,14,102,140,
+1,64,58,173,156,117,97,173,151,2,73,32,58,173,150,64,54,96,42,3,
+54,32,64,58,173,156,64,29,128,232,64,9,128,232,8,94,109,97,108,108,
+111,99,32,58,173,119,13,73,79,46,112,101,114,102,111,114,109,73,79,32,
+58,173,128,224,187,2,0,58,173,135,2,85,32,58,237,85,0,224,227,12,
+0,58,173,93,64,19,0,95,76,166,1,64,95,76,203,0,58,173,95,131,
+75,136,231,172,227,6,114,97,105,115,101,32,58,172,210,94,240,128,172,7,
+65,46,114,101,97,100,32,58,172,201,13,73,79,46,103,101,116,65,114,103,
+82,101,102,32,58,172,202,0,95,71,19,101,15,68,120,99,108,64,107,128,
+190,6,73,79,46,62,62,32,58,172,176,0,95,80,100,98,175,108,205,252,
+144,0,71,36,99,131,0,49,95,131,96,9,0,50,71,212,99,141,172,216,
+186,22,111,70,174,120,151,243,96,35,233,89,0,73,87,64,32,116,140,192,
+32,0,95,144,197,165,56,0,55,88,101,224,47,12,108,253,96,155,143,143,
+225,14,0,236,202,0,226,202,6,0,58,236,206,0,108,31,228,171,0,130,
+87,164,140,172,192,233,246,0,70,38,224,11,2,96,210,101,33,0,58,236,
+202,1,0,50,174,66,166,246,0,51,97,221,109,197,130,135,74,128,129,75,
+75,106,96,36,180,183,0,95,68,213,65,237,240,46,0,227,137,0,70,206,
+96,11,2,66,32,58,162,140,9,79,46,114,101,116,117,114,110,32,58,225,
+225,0,0,62,68,141,128,201,2,80,32,58,227,127,7,227,107,37,0,58,
+128,208,226,167,15,235,38,1,194,143,64,202,2,95,49,57,114,48,224,0,
+255,224,0,255,224,0,255,224,0,255,224,0,255,224,0,255,224,0,255,224,
+0,88,1,32,125,
};
unsigned char *combexpr = data;
-int combexprlen = 89459;
+int combexprlen = 95145;
#include "mhsffi.h"
static struct ffi_entry table[] = {
{ 0,0 }
--- a/ghc/Compat.hs
+++ b/ghc/Compat.hs
@@ -5,11 +5,17 @@
-- Functions for GHC that are defined in the UHS libs.
module Compat(module Compat, Type) where
import Data.Maybe
+import Data.Text(Text, append, pack)
import Control.Exception
import GHC.Types
import System.Environment
import System.IO
+------- List --------
+
+takeWhileEnd :: forall a . (a -> Bool) -> [a] -> [a]
+takeWhileEnd p = reverse . takeWhile p . reverse
+
------- IO --------
openFileM :: FilePath -> IOMode -> IO (Maybe Handle)
@@ -46,3 +52,6 @@
-- This cannot be implemented with GHC.
rnfErr :: forall a . a -> ()
rnfErr _ = ()
+
+appendDot :: Text -> Text -> Text
+appendDot x y = x `append` pack "." `append` y
--- /dev/null
+++ b/ghc/MHSPrelude.hs
@@ -1,0 +1,2 @@
+module MHSPrelude(module Prelude) where
+import Prelude
--- a/ghc/MicroHs/Instances.hs
+++ b/ghc/MicroHs/Instances.hs
@@ -13,7 +13,9 @@
instance NFData Lit where rnf (LInt i) = rnf i; rnf (LInteger i) = rnf i; rnf (LDouble d) = rnf d; rnf (LRat r) = rnf r; rnf (LChar c) = rnf c; rnf (LStr s) = rnf s; rnf (LPrim s) = rnf s; rnf (LExn s) = rnf s; rnf (LForImp s _) = rnf s; rnf (LTick s) = rnf s; rnf (LUStr s) = rnf s
-instance NFData Ident where rnf (Ident _ s) = rnf s
+instance NFData SLoc where rnf (SLoc f l c) = rnf f `seq` rnf l `seq` rnf c
+
+instance NFData Ident where rnf i = rnf (slocIdent i)
compiledWithGHC :: Bool
compiledWithGHC = True
--- a/ghc/System/IO/Serialize.hs
+++ b/ghc/System/IO/Serialize.hs
@@ -5,6 +5,7 @@
hSerialize, hDeserialize,
writeSerialized,
-}
+ writeSerialized,
writeSerializedCompressed,
readSerialized,
) where
@@ -22,6 +23,10 @@
writeSerializedCompressed :: forall a . HasCallStack => FilePath -> a -> IO ()
writeSerializedCompressed = errghc
+
+writeSerialized :: forall a . HasCallStack => FilePath -> a -> IO ()
+writeSerialized = errghc
+
readSerialized :: forall a . HasCallStack => FilePath -> IO a
readSerialized = errghc
--- a/lib/AllOfLib.hs
+++ b/lib/AllOfLib.hs
@@ -3,6 +3,7 @@
module AllOfLib(main) where
-- Only used to save the compilation cache.
import Control.Applicative
+import Control.Category
import Control.DeepSeq
import Control.Error
import Control.Exception
@@ -9,12 +10,17 @@
import Control.Exception.Internal
import Control.Monad
import Control.Monad.Fail
+import Control.Monad.IO.Class
import Control.Monad.ST
import Control.Monad.ST_Type
import Data.Bits
import Data.Bool
import Data.Bool_Type
+import Data.Bifoldable
+import Data.Bifunctor
+import Data.Bitraversable
import Data.Bounded
+import Data.ByteString
import Data.Char
import Data.Char_Type
import Data.Complex
@@ -23,14 +29,22 @@
import Data.Either
import Data.Enum
import Data.Eq
+import Data.Fixed
import Data.FloatW
import Data.Floating
import Data.Foldable
+import Data.Foldable1
import Data.Fractional
import Data.Function
import Data.Functor
+import Data.Functor.Classes
+import Data.Functor.Compose
import Data.Functor.Const
+import Data.Functor.Contravariant
import Data.Functor.Identity
+import Data.Functor.Product
+import Data.Functor.Sum
+import Data.Hashable
import Data.IOArray
import Data.IORef
import Data.Int
@@ -40,13 +54,16 @@
import Data.Integer_Type
import Data.Integral
import Data.Ix
+import Data.Kind
import Data.List
import Data.List_Type
import Data.Maybe
import Data.Maybe_Type
import Data.Monoid
+import Data.Monoid.Internal
import Data.Num
import Data.Ord
+import Data.Orphans
import Data.Ordering_Type
import Data.Proxy
import Data.Ratio
@@ -58,8 +75,10 @@
import Data.Semigroup
import Data.STRef
import Data.String
+import Data.Text
import Data.Traversable
import Data.Tuple
+import Data.Tuple.Instances
import Data.Typeable
import Data.TypeLits
import Data.Version
@@ -67,11 +86,16 @@
import Data.Word
import Data.ZipList
import Debug.Trace
+import Foreign
+import Foreign.C
+import Foreign.C.Error
import Foreign.C.String
import Foreign.C.Types
import Foreign.ForeignPtr
+import Foreign.Marshal
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
+import Foreign.Marshal.Error
import Foreign.Marshal.Utils
import Foreign.Ptr
import Foreign.Storable
@@ -82,6 +106,8 @@
import Numeric.Natural
import Prelude
import Primitives
+import System.Compress
+import System.Console.GetOpt
--import System.Console.SimpleReadline
import System.Directory
import System.Environment
@@ -88,6 +114,7 @@
import System.Exit
import System.IO
import System.IO_Handle
+import System.IO.Error
import System.IO.MD5
import System.IO.PrintOrRun
import System.IO.Serialize
--- a/lib/Control/Applicative.hs
+++ b/lib/Control/Applicative.hs
@@ -4,6 +4,7 @@
liftA, liftA3,
Alternative(..),
guard, asum, optional,
+ module Data.Functor.Const_Type,
) where
import Prelude() -- do not import Prelude
import Primitives -- for fixity
@@ -12,6 +13,7 @@
import Data.Function
import Data.List_Type
import Data.Maybe_Type
+import Data.Functor.Const_Type
infixl 4 <*>, *>, <*, <**>
--- /dev/null
+++ b/lib/Control/Category.hs
@@ -1,0 +1,21 @@
+module Control.Category(module Control.Category) where
+import Prelude()
+import Primitives
+import qualified Data.Function as F
+
+infixr 9 .
+infixr 1 >>>, <<<
+
+class Category cat where
+ id :: cat a a
+ (.) :: cat b c -> cat a b -> cat a c
+
+instance Category (->) where
+ id = F.id
+ (.) = (F..)
+
+(<<<) :: Category cat => cat b c -> cat a b -> cat a c
+(<<<) = (.)
+
+(>>>) :: Category cat => cat a b -> cat b c -> cat a c
+f >>> g = g . f
--- a/lib/Control/DeepSeq.hs
+++ b/lib/Control/DeepSeq.hs
@@ -8,12 +8,29 @@
rnfNoErr,
rnfErr,
) where
+import Prelude()
import Primitives(primRnfErr, primRnfNoErr)
+import Control.Applicative
+import Control.Monad
+import Data.Bool
+import Data.Char
import Data.Complex
+import Data.Double
+import Data.Either
+import Data.Fixed
+import Data.Float
+import Data.Function
import Data.Int
-import Data.Word
+import Data.Integer
+import Data.List
+import Data.List.NonEmpty
+import Data.Maybe
+import Data.Ord
+import Data.Proxy
import Data.Ratio
+import Data.Real
import Data.Tuple
+import Data.Word
rnfNoErr :: forall a . a -> ()
rnfNoErr = primRnfNoErr
@@ -65,14 +82,14 @@
instance NFData Word64
instance NFData (Proxy a) where rnf Proxy = ()
+
instance NFData a => NFData (Ratio a) where
rnf x = rnf (numerator x, denominator x)
-instance (NFData a) => NFData (Complex a) where
- rnf (x :+ y) = rnf x `seq` rnf y `seq` ()
instance NFData a => NFData (Maybe a) where
rnf Nothing = ()
rnf (Just a) = rnf a
+
instance NFData a => NFData [a] where
rnf = foldr (\ x r -> rnf x `seq` r) ()
@@ -79,6 +96,15 @@
instance (NFData a, NFData b) => NFData (Either a b) where
rnf (Left a) = rnf a
rnf (Right b) = rnf b
+
+instance (NFData a) => NFData (Complex a) where
+ rnf (x :+ y) = rnf x `seq` rnf y
+
+instance NFData a => NFData (NonEmpty a) where
+ rnf = rnf . toList
+
+instance NFData (Fixed a)
+-- rnf = rnf
{-
-- | @since 1.4.3.0
--- a/lib/Control/Error.hs
+++ b/lib/Control/Error.hs
@@ -1,6 +1,6 @@
-- Copyright 2023 Lennart Augustsson
-- See LICENSE file for full license.
-module Control.Error(error, undefined, ErrorCall(..)) where
+module Control.Error(error, errorWithoutStackTrace, undefined, ErrorCall(..)) where
import Prelude() -- do not import Prelude
import Data.Char_Type
import Data.List_Type
@@ -21,3 +21,7 @@
undefined :: forall a . a
undefined = error "undefined"
+
+-- GHC compatibility
+errorWithoutStackTrace :: forall a . String -> a
+errorWithoutStackTrace s = throw (ErrorCall s)
\ No newline at end of file
--- a/lib/Control/Exception.hs
+++ b/lib/Control/Exception.hs
@@ -20,6 +20,7 @@
--
ArithException(..),
) where
+import Prelude(); import MiniPrelude
import Control.Exception.Internal
import {-# SOURCE #-} Data.Typeable
import System.IO.Unsafe
--- a/lib/Control/Monad.hs
+++ b/lib/Control/Monad.hs
@@ -41,9 +41,9 @@
import Data.Bool
import Data.Char_Type
import Data.Function
-import Data.Functor
+import Data.Functor hiding(unzip)
import Data.List
-import Data.Monoid
+import Data.Monoid.Internal
import Data.Ord
--import Data.Maybe
@@ -211,9 +211,11 @@
Just a >>= f = f a
-}
-class (Monad m) => MonadPlus m where
+class (Alternative m, Monad m) => MonadPlus m where
mzero :: forall a . m a
+ mzero = empty
mplus :: forall a . m a -> m a -> m a
+ mplus = (<|>)
instance MonadPlus [] where
mzero = []
--- /dev/null
+++ b/lib/Control/Monad/Fix.hs
@@ -1,0 +1,74 @@
+module Control.Monad.Fix(
+ MonadFix(..),
+ fix,
+ ) where
+import Control.Monad
+import Data.Function(fix)
+import Data.List.NonEmpty(NonEmpty(..))
+import Data.Monoid.Internal
+import Data.Tuple
+
+class (Monad m) => MonadFix m where
+ mfix :: (a -> m a) -> m a
+
+{-
+instance MonadFix Solo where
+ mfix f = let a = f (unSolo a) in a
+ where unSolo (MkSolo x) = x
+-}
+instance MonadFix Maybe where
+ mfix f = let a = f (unJust a) in a
+ where unJust (Just x) = x
+ unJust Nothing = error "mfix Maybe: Nothing"
+
+instance MonadFix [] where
+ mfix f = case fix (f . head) of
+ [] -> []
+ (x:_) -> x : mfix (drop 1 . f)
+
+instance MonadFix NonEmpty where
+ mfix f = case fix (f . neHead) of
+ ~(x :| _) -> x :| mfix (neTail . f)
+ where
+ neHead ~(a :| _) = a
+ neTail ~(_ :| as) = as
+
+--instance MonadFix IO where
+-- mfix = fixIO
+
+instance MonadFix ((->) r) where
+ mfix f = \ r -> let a = f a r in a
+
+{-
+instance MonadFix (Either e) where
+ mfix f = let a = f (unRight a) in a
+ where unRight (Right x) = x
+ unRight (Left _) = error "mfix Either: Left"
+
+instance MonadFix (ST s) where
+ mfix = fixST
+
+instance MonadFix Dual where
+ mfix f = Dual (fix (getDual . f))
+
+instance MonadFix Sum where
+ mfix f = Sum (fix (getSum . f))
+
+instance MonadFix Product where
+ mfix f = Product (fix (getProduct . f))
+
+instance MonadFix First where
+ mfix f = First (mfix (getFirst . f))
+
+instance MonadFix Last where
+ mfix f = Last (mfix (getLast . f))
+
+instance MonadFix f => MonadFix (Alt f) where
+ mfix f = Alt (mfix (getAlt . f))
+
+instance MonadFix f => MonadFix (Ap f) where
+ mfix f = Ap (mfix (getAp . f))
+
+instance MonadFix Down where
+ mfix f = Down (fix (getDown . f))
+-}
--- /dev/null
+++ b/lib/Control/Monad/IO/Class.hs
@@ -1,0 +1,12 @@
+module Control.Monad.IO.Class (MonadIO(..)) where
+import Prelude()
+import Data.Char
+import Control.Applicative
+import Control.Monad
+import System.IO
+
+class (Monad m) => MonadIO m where
+ liftIO :: IO a -> m a
+
+instance MonadIO IO where
+ liftIO io = io
--- a/lib/Control/Monad/ST.hs
+++ b/lib/Control/Monad/ST.hs
@@ -2,7 +2,7 @@
ST,
runST,
) where
-import Prelude
+import Prelude(); import MiniPrelude
import Primitives(primPerformIO)
import Control.Monad.ST_Type
--- /dev/null
+++ b/lib/Control/Monad/Zip.hs
@@ -1,0 +1,136 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE TypeOperators #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module : Control.Monad.Zip
+-- Copyright : (c) Nils Schweinsberg 2011,
+-- (c) George Giorgidze 2011
+-- (c) University Tuebingen 2011
+-- License : BSD-style (see the file libraries/base/LICENSE)
+-- Maintainer : libraries@haskell.org
+-- Stability : stable
+-- Portability : portable
+--
+-- Monadic zipping (used for monad comprehensions)
+--
+-----------------------------------------------------------------------------
+
+module Control.Monad.Zip where
+import Control.Monad
+import Data.Functor.Identity
+import Data.Monoid.Internal
+import qualified Data.List.NonEmpty as NE
+--import Data.Tuple
+
+-- | Instances should satisfy the laws:
+--
+-- [Naturality]
+--
+-- @'liftM' (f 'Control.Arrow.***' g) ('mzip' ma mb)
+-- = 'mzip' ('liftM' f ma) ('liftM' g mb)@
+--
+-- [Information Preservation]
+--
+-- @'liftM' ('Prelude.const' ()) ma = 'liftM' ('Prelude.const' ()) mb@
+-- implies
+-- @'munzip' ('mzip' ma mb) = (ma, mb)@
+--
+class Monad m => MonadZip m where
+ {-# MINIMAL mzip | mzipWith #-}
+
+ mzip :: m a -> m b -> m (a,b)
+ mzip = mzipWith (,)
+
+ mzipWith :: (a -> b -> c) -> m a -> m b -> m c
+ mzipWith f ma mb = liftM (uncurry f) (mzip ma mb)
+
+ munzip :: m (a,b) -> (m a, m b)
+ munzip mab = (liftM fst mab, liftM snd mab)
+ -- munzip is a member of the class because sometimes
+ -- you can implement it more efficiently than the
+ -- above default code. See #4370 comment by giorgidze
+
+-- | @since 4.3.1.0
+instance MonadZip [] where
+ mzip = zip
+ mzipWith = zipWith
+ munzip = unzip
+
+-- | @since 4.9.0.0
+instance MonadZip NE.NonEmpty where
+ mzip = NE.zip
+ mzipWith = NE.zipWith
+-- munzip = GHC.Internal.Data.Functor.unzip
+
+-- | @since 4.8.0.0
+instance MonadZip Identity where
+ mzipWith = liftM2
+ munzip (Identity (a, b)) = (Identity a, Identity b)
+
+{-
+-- | @since 4.15.0.0
+instance MonadZip Solo where
+ mzipWith = liftM2
+ munzip (MkSolo (a, b)) = (MkSolo a, MkSolo b)
+
+-- | @since 4.8.0.0
+instance MonadZip Dual where
+ -- Cannot use coerce, it's unsafe
+ mzipWith = liftM2
+
+-- | @since 4.8.0.0
+instance MonadZip Sum where
+ mzipWith = liftM2
+
+-- | @since 4.8.0.0
+instance MonadZip Product where
+ mzipWith = liftM2
+
+-- | @since 4.8.0.0
+instance MonadZip Maybe where
+ mzipWith = liftM2
+
+-- | @since 4.8.0.0
+instance MonadZip First where
+ mzipWith = liftM2
+
+-- | @since 4.8.0.0
+instance MonadZip Last where
+ mzipWith = liftM2
+
+-- | @since 4.8.0.0
+instance MonadZip f => MonadZip (Alt f) where
+ mzipWith f (Alt ma) (Alt mb) = Alt (mzipWith f ma mb)
+
+-- | @since 4.9.0.0
+instance MonadZip Proxy where
+ mzipWith _ _ _ = Proxy
+
+-- Instances for GHC.Generics
+-- | @since 4.9.0.0
+instance MonadZip U1 where
+ mzipWith _ _ _ = U1
+
+-- | @since 4.9.0.0
+instance MonadZip Par1 where
+ mzipWith = liftM2
+
+-- | @since 4.9.0.0
+instance MonadZip f => MonadZip (Rec1 f) where
+ mzipWith f (Rec1 fa) (Rec1 fb) = Rec1 (mzipWith f fa fb)
+
+-- | @since 4.9.0.0
+instance MonadZip f => MonadZip (M1 i c f) where
+ mzipWith f (M1 fa) (M1 fb) = M1 (mzipWith f fa fb)
+
+-- | @since 4.9.0.0
+instance (MonadZip f, MonadZip g) => MonadZip (f :*: g) where
+ mzipWith f (x1 :*: y1) (x2 :*: y2) = mzipWith f x1 x2 :*: mzipWith f y1 y2
+
+-- instances for GHC.Internal.Data.Ord
+
+-- | @since 4.12.0.0
+instance MonadZip Down where
+ mzipWith = liftM2
+-}
--- a/lib/Data/Array.hs
+++ b/lib/Data/Array.hs
@@ -13,9 +13,23 @@
accum,
ixmap,
) where
+import Prelude()
import Primitives(primPerformIO, primArrCopy, primArrEQ)
+import Control.Error
+import Control.Monad
+import Data.Bool
+import Data.Char
+import Data.Enum
+import Data.Eq
+import Data.Function
+import Data.Functor
+import Data.Int
import Data.Ix
import Data.IOArray
+import Data.List
+import Data.Num
+import Data.Ord
+import System.IO
import Text.Show
data Array i a
@@ -111,7 +125,7 @@
where i' = index (l,u) i
badSafeIndex :: Int -> Int -> a
-badSafeIndex i n = error $ "Error in array index; " ++ show i ++ " not in range [0.." ++ show n ++ ")"
+badSafeIndex i n = error $ ("Error in array index; "::String) ++ show i ++ (" not in range [0.."::String) ++ show n ++ (")"::String)
safeRangeSize :: Ix i => (i, i) -> Int
safeRangeSize b =
--- /dev/null
+++ b/lib/Data/Bifoldable.hs
@@ -1,0 +1,1039 @@
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module : Data.Bifoldable
+-- Copyright : (C) 2011-2016 Edward Kmett
+-- License : BSD-style (see the file LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : provisional
+-- Portability : portable
+--
+-- @since 4.10.0.0
+----------------------------------------------------------------------------
+module Data.Bifoldable
+ ( Bifoldable(..)
+ , bifoldr'
+ , bifoldr1
+ , bifoldrM
+ , bifoldl'
+ , bifoldl1
+ , bifoldlM
+ , bitraverse_
+ , bifor_
+ , bimapM_
+ , biforM_
+ , bimsum
+ , bisequenceA_
+ , bisequence_
+ , biasum
+ , biList
+ , binull
+ , bilength
+ , bielem
+ , bimaximum
+ , biminimum
+ , bisum
+ , biproduct
+ , biconcat
+ , biconcatMap
+ , biand
+ , bior
+ , biany
+ , biall
+ , bimaximumBy
+ , biminimumBy
+ , binotElem
+ , bifind
+ ) where
+import Control.Applicative
+import Data.Foldable.Internal
+import Data.Functor.Const
+import Data.Maybe(fromMaybe)
+import Data.Monoid
+import Data.Monoid.Internal hiding (Max(..), Min(..))
+
+-- $setup
+-- >>> import Prelude
+-- >>> import Data.Char
+-- >>> import GHC.Internal.Data.Monoid (Product (..), Sum (..))
+-- >>> data BiList a b = BiList [a] [b]
+-- >>> instance Bifoldable BiList where bifoldr f g z (BiList as bs) = foldr f (foldr g z bs) as
+
+-- | 'Bifoldable' identifies foldable structures with two different varieties
+-- of elements (as opposed to 'Foldable', which has one variety of element).
+-- Common examples are 'Either' and @(,)@:
+--
+-- > instance Bifoldable Either where
+-- > bifoldMap f _ (Left a) = f a
+-- > bifoldMap _ g (Right b) = g b
+-- >
+-- > instance Bifoldable (,) where
+-- > bifoldr f g z (a, b) = f a (g b z)
+--
+-- Some examples below also use the following BiList to showcase empty
+-- Bifoldable behaviors when relevant ('Either' and '(,)' containing always exactly
+-- resp. 1 and 2 elements):
+--
+-- > data BiList a b = BiList [a] [b]
+-- >
+-- > instance Bifoldable BiList where
+-- > bifoldr f g z (BiList as bs) = foldr f (foldr g z bs) as
+--
+-- A minimal 'Bifoldable' definition consists of either 'bifoldMap' or
+-- 'bifoldr'. When defining more than this minimal set, one should ensure
+-- that the following identities hold:
+--
+-- @
+-- 'bifold' ≡ 'bifoldMap' 'id' 'id'
+-- 'bifoldMap' f g ≡ 'bifoldr' ('mappend' . f) ('mappend' . g) 'mempty'
+-- 'bifoldr' f g z t ≡ 'appEndo' ('bifoldMap' (Endo . f) (Endo . g) t) z
+-- @
+--
+-- If the type is also an instance of 'Foldable', then
+-- it must satisfy (up to laziness):
+--
+-- @
+-- 'bifoldl' 'const' ≡ 'foldl'
+-- 'bifoldr' ('flip' 'const') ≡ 'foldr'
+-- 'bifoldMap' ('const' 'mempty') ≡ 'foldMap'
+-- @
+--
+-- If the type is also a 'Data.Bifunctor.Bifunctor' instance, it should satisfy:
+--
+-- @
+-- 'bifoldMap' f g ≡ 'bifold' . 'Data.Bifunctor.bimap' f g
+-- @
+--
+-- which implies that
+--
+-- @
+-- 'bifoldMap' f g . 'Data.Bifunctor.bimap' h i ≡ 'bifoldMap' (f . h) (g . i)
+-- @
+--
+-- @since 4.10.0.0
+class Bifoldable p where
+ {-# MINIMAL bifoldr | bifoldMap #-}
+
+ -- | Combines the elements of a structure using a monoid.
+ --
+ -- @'bifold' ≡ 'bifoldMap' 'id' 'id'@
+ --
+ -- ==== __Examples__
+ --
+ -- Basic usage:
+ --
+ -- >>> bifold (Right [1, 2, 3])
+ -- [1,2,3]
+ --
+ -- >>> bifold (Left [5, 6])
+ -- [5,6]
+ --
+ -- >>> bifold ([1, 2, 3], [4, 5])
+ -- [1,2,3,4,5]
+ --
+ -- >>> bifold (Product 6, Product 7)
+ -- Product {getProduct = 42}
+ --
+ -- >>> bifold (Sum 6, Sum 7)
+ -- Sum {getSum = 13}
+ --
+ -- @since 4.10.0.0
+ bifold :: Monoid m => p m m -> m
+ bifold = bifoldMap id id
+
+ -- | Combines the elements of a structure, given ways of mapping them to a
+ -- common monoid.
+ --
+ -- @'bifoldMap' f g ≡ 'bifoldr' ('mappend' . f) ('mappend' . g) 'mempty'@
+ --
+ -- ==== __Examples__
+ --
+ -- Basic usage:
+ --
+ -- >>> bifoldMap (take 3) (fmap digitToInt) ([1..], "89")
+ -- [1,2,3,8,9]
+ --
+ -- >>> bifoldMap (take 3) (fmap digitToInt) (Left [1..])
+ -- [1,2,3]
+ --
+ -- >>> bifoldMap (take 3) (fmap digitToInt) (Right "89")
+ -- [8,9]
+ --
+ -- @since 4.10.0.0
+ bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> p a b -> m
+ bifoldMap f g = bifoldr (mappend . f) (mappend . g) mempty
+
+ -- | Combines the elements of a structure in a right associative manner.
+ -- Given a hypothetical function @toEitherList :: p a b -> [Either a b]@
+ -- yielding a list of all elements of a structure in order, the following
+ -- would hold:
+ --
+ -- @'bifoldr' f g z ≡ 'foldr' ('either' f g) z . toEitherList@
+ --
+ -- ==== __Examples__
+ --
+ -- Basic usage:
+ --
+ -- @
+ -- > bifoldr (+) (*) 3 (5, 7)
+ -- 26 -- 5 + (7 * 3)
+ --
+ -- > bifoldr (+) (*) 3 (7, 5)
+ -- 22 -- 7 + (5 * 3)
+ --
+ -- > bifoldr (+) (*) 3 (Right 5)
+ -- 15 -- 5 * 3
+ --
+ -- > bifoldr (+) (*) 3 (Left 5)
+ -- 8 -- 5 + 3
+ -- @
+ --
+ -- @since 4.10.0.0
+ bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> p a b -> c
+ bifoldr f g z t = appEndo (bifoldMap (Endo . f) (Endo . g) t) z
+
+ -- | Combines the elements of a structure in a left associative manner. Given
+ -- a hypothetical function @toEitherList :: p a b -> [Either a b]@ yielding a
+ -- list of all elements of a structure in order, the following would hold:
+ --
+ -- @'bifoldl' f g z
+ -- ≡ 'foldl' (\acc -> 'either' (f acc) (g acc)) z . toEitherList@
+ --
+ -- Note that if you want an efficient left-fold, you probably want to use
+ -- 'bifoldl'' instead of 'bifoldl'. The reason is that the latter does not
+ -- force the "inner" results, resulting in a thunk chain which then must be
+ -- evaluated from the outside-in.
+ --
+ -- ==== __Examples__
+ --
+ -- Basic usage:
+ --
+ -- @
+ -- > bifoldl (+) (*) 3 (5, 7)
+ -- 56 -- (5 + 3) * 7
+ --
+ -- > bifoldl (+) (*) 3 (7, 5)
+ -- 50 -- (7 + 3) * 5
+ --
+ -- > bifoldl (+) (*) 3 (Right 5)
+ -- 15 -- 5 * 3
+ --
+ -- > bifoldl (+) (*) 3 (Left 5)
+ -- 8 -- 5 + 3
+ -- @
+ --
+ -- @since 4.10.0.0
+ bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> p a b -> c
+ bifoldl f g z t = appEndo (getDual (bifoldMap (Dual . Endo . flip f)
+ (Dual . Endo . flip g) t)) z
+
+-- | Class laws for tuples hold only up to laziness. The
+-- Bifoldable methods are lazier than their Foldable counterparts.
+-- For example the law @'bifoldr' ('flip' 'const') ≡ 'foldr'@ does
+-- not hold for tuples if laziness is exploited:
+--
+-- >>> bifoldr (flip const) (:) [] (undefined :: (Int, Word)) `seq` ()
+-- ()
+-- >>> foldr (:) [] (undefined :: (Int, Word)) `seq` ()
+-- *** Exception: Prelude.undefined
+--
+-- @since 4.10.0.0
+instance Bifoldable (,) where
+ bifoldMap f g ~(a, b) = f a `mappend` g b
+
+-- | @since 4.10.0.0
+instance Bifoldable Const where
+ bifoldMap f _ (Const a) = f a
+
+{-
+-- | @since 4.10.0.0
+instance Bifoldable (K1 i) where
+ bifoldMap f _ (K1 c) = f c
+-}
+
+-- | @since 4.10.0.0
+instance Bifoldable ((,,) x) where
+ bifoldMap f g ~(_,a,b) = f a `mappend` g b
+
+-- | @since 4.10.0.0
+instance Bifoldable ((,,,) x y) where
+ bifoldMap f g ~(_,_,a,b) = f a `mappend` g b
+
+-- | @since 4.10.0.0
+instance Bifoldable ((,,,,) x y z) where
+ bifoldMap f g ~(_,_,_,a,b) = f a `mappend` g b
+
+-- | @since 4.10.0.0
+instance Bifoldable ((,,,,,) x y z w) where
+ bifoldMap f g ~(_,_,_,_,a,b) = f a `mappend` g b
+
+-- | @since 4.10.0.0
+instance Bifoldable ((,,,,,,) x y z w v) where
+ bifoldMap f g ~(_,_,_,_,_,a,b) = f a `mappend` g b
+
+-- | @since 4.10.0.0
+instance Bifoldable Either where
+ bifoldMap f _ (Left a) = f a
+ bifoldMap _ g (Right b) = g b
+
+-- | As 'bifoldr', but strict in the result of the reduction functions at each
+-- step.
+--
+-- @since 4.10.0.0
+bifoldr' :: Bifoldable t => (a -> c -> c) -> (b -> c -> c) -> c -> t a b -> c
+bifoldr' f g z0 xs = bifoldl f' g' id xs z0 where
+ f' k x z = k $! f x z
+ g' k x z = k $! g x z
+
+-- | A variant of 'bifoldr' that has no base case,
+-- and thus may only be applied to non-empty structures.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bifoldr1 (+) (5, 7)
+-- 12
+--
+-- >>> bifoldr1 (+) (Right 7)
+-- 7
+--
+-- >>> bifoldr1 (+) (Left 5)
+-- 5
+--
+-- @
+-- > bifoldr1 (+) (BiList [1, 2] [3, 4])
+-- 10 -- 1 + (2 + (3 + 4))
+-- @
+--
+-- >>> bifoldr1 (+) (BiList [1, 2] [])
+-- 3
+--
+-- On empty structures, this function throws an exception:
+--
+-- >>> bifoldr1 (+) (BiList [] [])
+-- *** Exception: bifoldr1: empty structure
+-- ...
+--
+-- @since 4.10.0.0
+bifoldr1 :: Bifoldable t => (a -> a -> a) -> t a a -> a
+bifoldr1 f xs = fromMaybe (error "bifoldr1: empty structure")
+ (bifoldr mbf mbf Nothing xs)
+ where
+ mbf x m = Just (case m of
+ Nothing -> x
+ Just y -> f x y)
+
+-- | Right associative monadic bifold over a structure.
+--
+-- @since 4.10.0.0
+bifoldrM :: (Bifoldable t, Monad m)
+ => (a -> c -> m c) -> (b -> c -> m c) -> c -> t a b -> m c
+bifoldrM f g z0 xs = bifoldl f' g' return xs z0 where
+ f' k x z = f x z >>= k
+ g' k x z = g x z >>= k
+
+-- | As 'bifoldl', but strict in the result of the reduction functions at each
+-- step.
+--
+-- This ensures that each step of the bifold is forced to weak head normal form
+-- before being applied, avoiding the collection of thunks that would otherwise
+-- occur. This is often what you want to strictly reduce a finite structure to
+-- a single, monolithic result (e.g., 'bilength').
+--
+-- @since 4.10.0.0
+bifoldl':: Bifoldable t => (a -> b -> a) -> (a -> c -> a) -> a -> t b c -> a
+bifoldl' f g z0 xs = bifoldr f' g' id xs z0 where
+ f' x k z = k $! f z x
+ g' x k z = k $! g z x
+
+-- | A variant of 'bifoldl' that has no base case,
+-- and thus may only be applied to non-empty structures.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bifoldl1 (+) (5, 7)
+-- 12
+--
+-- >>> bifoldl1 (+) (Right 7)
+-- 7
+--
+-- >>> bifoldl1 (+) (Left 5)
+-- 5
+--
+-- @
+-- > bifoldl1 (+) (BiList [1, 2] [3, 4])
+-- 10 -- ((1 + 2) + 3) + 4
+-- @
+--
+-- >>> bifoldl1 (+) (BiList [1, 2] [])
+-- 3
+--
+-- On empty structures, this function throws an exception:
+--
+-- >>> bifoldl1 (+) (BiList [] [])
+-- *** Exception: bifoldl1: empty structure
+-- ...
+--
+-- @since 4.10.0.0
+bifoldl1 :: Bifoldable t => (a -> a -> a) -> t a a -> a
+bifoldl1 f xs = fromMaybe (error "bifoldl1: empty structure")
+ (bifoldl mbf mbf Nothing xs)
+ where
+ mbf m y = Just (case m of
+ Nothing -> y
+ Just x -> f x y)
+
+-- | Left associative monadic bifold over a structure.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bifoldlM (\a b -> print b >> pure a) (\a c -> print (show c) >> pure a) 42 ("Hello", True)
+-- "Hello"
+-- "True"
+-- 42
+--
+-- >>> bifoldlM (\a b -> print b >> pure a) (\a c -> print (show c) >> pure a) 42 (Right True)
+-- "True"
+-- 42
+--
+-- >>> bifoldlM (\a b -> print b >> pure a) (\a c -> print (show c) >> pure a) 42 (Left "Hello")
+-- "Hello"
+-- 42
+--
+-- @since 4.10.0.0
+bifoldlM :: (Bifoldable t, Monad m)
+ => (a -> b -> m a) -> (a -> c -> m a) -> a -> t b c -> m a
+bifoldlM f g z0 xs = bifoldr f' g' return xs z0 where
+ f' x k z = f z x >>= k
+ g' x k z = g z x >>= k
+
+-- | Map each element of a structure using one of two actions, evaluate these
+-- actions from left to right, and ignore the results. For a version that
+-- doesn't ignore the results, see 'Data.Bitraversable.bitraverse'.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bitraverse_ print (print . show) ("Hello", True)
+-- "Hello"
+-- "True"
+--
+-- >>> bitraverse_ print (print . show) (Right True)
+-- "True"
+--
+-- >>> bitraverse_ print (print . show) (Left "Hello")
+-- "Hello"
+--
+-- @since 4.10.0.0
+bitraverse_ :: (Bifoldable t, Applicative f)
+ => (a -> f c) -> (b -> f d) -> t a b -> f ()
+bitraverse_ f g = bifoldr ((*>) . f) ((*>) . g) (pure ())
+
+-- | As 'bitraverse_', but with the structure as the primary argument. For a
+-- version that doesn't ignore the results, see 'Data.Bitraversable.bifor'.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bifor_ ("Hello", True) print (print . show)
+-- "Hello"
+-- "True"
+--
+-- >>> bifor_ (Right True) print (print . show)
+-- "True"
+--
+-- >>> bifor_ (Left "Hello") print (print . show)
+-- "Hello"
+--
+-- @since 4.10.0.0
+bifor_ :: (Bifoldable t, Applicative f)
+ => t a b -> (a -> f c) -> (b -> f d) -> f ()
+bifor_ t f g = bitraverse_ f g t
+
+-- | Alias for 'bitraverse_'.
+--
+-- @since 4.10.0.0
+bimapM_ :: (Bifoldable t, Applicative f)
+ => (a -> f c) -> (b -> f d) -> t a b -> f ()
+bimapM_ = bitraverse_
+
+-- | Alias for 'bifor_'.
+--
+-- @since 4.10.0.0
+biforM_ :: (Bifoldable t, Applicative f)
+ => t a b -> (a -> f c) -> (b -> f d) -> f ()
+biforM_ = bifor_
+
+-- | Alias for 'bisequence_'.
+--
+-- @since 4.10.0.0
+bisequenceA_ :: (Bifoldable t, Applicative f) => t (f a) (f b) -> f ()
+bisequenceA_ = bisequence_
+
+-- | Evaluate each action in the structure from left to right, and ignore the
+-- results. For a version that doesn't ignore the results, see
+-- 'Data.Bitraversable.bisequence'.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bisequence_ (print "Hello", print "World")
+-- "Hello"
+-- "World"
+--
+-- >>> bisequence_ (Left (print "Hello"))
+-- "Hello"
+--
+-- >>> bisequence_ (Right (print "World"))
+-- "World"
+--
+-- @since 4.10.0.0
+bisequence_ :: (Bifoldable t, Applicative f) => t (f a) (f b) -> f ()
+bisequence_ = bifoldr (*>) (*>) (pure ())
+
+-- | The sum of a collection of actions, generalizing 'biconcat'.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biasum (Nothing, Nothing)
+-- Nothing
+--
+-- >>> biasum (Nothing, Just 42)
+-- Just 42
+--
+-- >>> biasum (Just 18, Nothing)
+-- Just 18
+--
+-- >>> biasum (Just 18, Just 42)
+-- Just 18
+--
+-- @since 4.10.0.0
+biasum :: (Bifoldable t, Alternative f) => t (f a) (f a) -> f a
+biasum = bifoldr (<|>) (<|>) empty
+
+-- | Alias for 'biasum'.
+--
+-- @since 4.10.0.0
+bimsum :: (Bifoldable t, Alternative f) => t (f a) (f a) -> f a
+bimsum = biasum
+
+-- | Collects the list of elements of a structure, from left to right.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biList (18, 42)
+-- [18,42]
+--
+-- >>> biList (Left 18)
+-- [18]
+--
+-- @since 4.10.0.0
+biList :: Bifoldable t => t a a -> [a]
+biList = bifoldr (:) (:) []
+
+-- | Test whether the structure is empty.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> binull (18, 42)
+-- False
+--
+-- >>> binull (Right 42)
+-- False
+--
+-- >>> binull (BiList [] [])
+-- True
+--
+-- @since 4.10.0.0
+binull :: Bifoldable t => t a b -> Bool
+binull = bifoldr (\_ _ -> False) (\_ _ -> False) True
+
+-- | Returns the size/length of a finite structure as an 'Int'.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bilength (True, 42)
+-- 2
+--
+-- >>> bilength (Right 42)
+-- 1
+--
+-- >>> bilength (BiList [1,2,3] [4,5])
+-- 5
+--
+-- >>> bilength (BiList [] [])
+-- 0
+--
+-- On infinite structures, this function hangs:
+--
+-- @
+-- > bilength (BiList [1..] [])
+-- * Hangs forever *
+-- @
+--
+-- @since 4.10.0.0
+bilength :: Bifoldable t => t a b -> Int
+bilength = bifoldl' (\c _ -> c+1) (\c _ -> c+1) 0
+
+-- | Does the element occur in the structure?
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bielem 42 (17, 42)
+-- True
+--
+-- >>> bielem 42 (17, 43)
+-- False
+--
+-- >>> bielem 42 (Left 42)
+-- True
+--
+-- >>> bielem 42 (Right 13)
+-- False
+--
+-- >>> bielem 42 (BiList [1..5] [1..100])
+-- True
+--
+-- >>> bielem 42 (BiList [1..5] [1..41])
+-- False
+--
+-- @since 4.10.0.0
+bielem :: (Bifoldable t, Eq a) => a -> t a a -> Bool
+bielem x = biany (== x) (== x)
+
+-- | Reduces a structure of lists to the concatenation of those lists.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biconcat ([1, 2, 3], [4, 5])
+-- [1,2,3,4,5]
+--
+-- >>> biconcat (Left [1, 2, 3])
+-- [1,2,3]
+--
+-- >>> biconcat (BiList [[1, 2, 3, 4, 5], [6, 7, 8]] [[9]])
+-- [1,2,3,4,5,6,7,8,9]
+--
+-- @since 4.10.0.0
+biconcat :: Bifoldable t => t [a] [a] -> [a]
+biconcat = bifold
+
+-- | The largest element of a non-empty structure.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bimaximum (42, 17)
+-- 42
+--
+-- >>> bimaximum (Right 42)
+-- 42
+--
+-- >>> bimaximum (BiList [13, 29, 4] [18, 1, 7])
+-- 29
+--
+-- >>> bimaximum (BiList [13, 29, 4] [])
+-- 29
+--
+-- On empty structures, this function throws an exception:
+--
+-- >>> bimaximum (BiList [] [])
+-- *** Exception: bimaximum: empty structure
+-- ...
+--
+-- @since 4.10.0.0
+bimaximum :: forall t a. (Bifoldable t, Ord a) => t a a -> a
+bimaximum = fromMaybe (error "bimaximum: empty structure") .
+ getMax . bifoldMap (Max . Just) (Max . Just)
+
+-- | The least element of a non-empty structure.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biminimum (42, 17)
+-- 17
+--
+-- >>> biminimum (Right 42)
+-- 42
+--
+-- >>> biminimum (BiList [13, 29, 4] [18, 1, 7])
+-- 1
+--
+-- >>> biminimum (BiList [13, 29, 4] [])
+-- 4
+--
+-- On empty structures, this function throws an exception:
+--
+-- >>> biminimum (BiList [] [])
+-- *** Exception: biminimum: empty structure
+-- ...
+--
+-- @since 4.10.0.0
+biminimum :: forall t a. (Bifoldable t, Ord a) => t a a -> a
+biminimum = fromMaybe (error "biminimum: empty structure") .
+ getMin . bifoldMap (Min . Just) (Min . Just)
+
+-- | The 'bisum' function computes the sum of the numbers of a structure.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bisum (42, 17)
+-- 59
+--
+-- >>> bisum (Right 42)
+-- 42
+--
+-- >>> bisum (BiList [13, 29, 4] [18, 1, 7])
+-- 72
+--
+-- >>> bisum (BiList [13, 29, 4] [])
+-- 46
+--
+-- >>> bisum (BiList [] [])
+-- 0
+--
+-- @since 4.10.0.0
+bisum :: (Bifoldable t, Num a) => t a a -> a
+bisum = getSum . bifoldMap Sum Sum
+
+-- | The 'biproduct' function computes the product of the numbers of a
+-- structure.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biproduct (42, 17)
+-- 714
+--
+-- >>> biproduct (Right 42)
+-- 42
+--
+-- >>> biproduct (BiList [13, 29, 4] [18, 1, 7])
+-- 190008
+--
+-- >>> biproduct (BiList [13, 29, 4] [])
+-- 1508
+--
+-- >>> biproduct (BiList [] [])
+-- 1
+--
+-- @since 4.10.0.0
+biproduct :: (Bifoldable t, Num a) => t a a -> a
+biproduct = getProduct . bifoldMap Product Product
+
+-- | Given a means of mapping the elements of a structure to lists, computes the
+-- concatenation of all such lists in order.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biconcatMap (take 3) (fmap digitToInt) ([1..], "89")
+-- [1,2,3,8,9]
+--
+-- >>> biconcatMap (take 3) (fmap digitToInt) (Left [1..])
+-- [1,2,3]
+--
+-- >>> biconcatMap (take 3) (fmap digitToInt) (Right "89")
+-- [8,9]
+--
+-- @since 4.10.0.0
+biconcatMap :: Bifoldable t => (a -> [c]) -> (b -> [c]) -> t a b -> [c]
+biconcatMap = bifoldMap
+
+-- | 'biand' returns the conjunction of a container of Bools. For the
+-- result to be 'True', the container must be finite; 'False', however,
+-- results from a 'False' value finitely far from the left end.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biand (True, False)
+-- False
+--
+-- >>> biand (True, True)
+-- True
+--
+-- >>> biand (Left True)
+-- True
+--
+-- Empty structures yield 'True':
+--
+-- >>> biand (BiList [] [])
+-- True
+--
+-- A 'False' value finitely far from the left end yields 'False' (short circuit):
+--
+-- >>> biand (BiList [True, True, False, True] (repeat True))
+-- False
+--
+-- A 'False' value infinitely far from the left end hangs:
+--
+-- @
+-- > biand (BiList (repeat True) [False])
+-- * Hangs forever *
+-- @
+--
+-- An infinitely 'True' value hangs:
+--
+-- @
+-- > biand (BiList (repeat True) [])
+-- * Hangs forever *
+-- @
+--
+-- @since 4.10.0.0
+biand :: Bifoldable t => t Bool Bool -> Bool
+biand = getAll . bifoldMap All All
+
+-- | 'bior' returns the disjunction of a container of Bools. For the
+-- result to be 'False', the container must be finite; 'True', however,
+-- results from a 'True' value finitely far from the left end.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bior (True, False)
+-- True
+--
+-- >>> bior (False, False)
+-- False
+--
+-- >>> bior (Left True)
+-- True
+--
+-- Empty structures yield 'False':
+--
+-- >>> bior (BiList [] [])
+-- False
+--
+-- A 'True' value finitely far from the left end yields 'True' (short circuit):
+--
+-- >>> bior (BiList [False, False, True, False] (repeat False))
+-- True
+--
+-- A 'True' value infinitely far from the left end hangs:
+--
+-- @
+-- > bior (BiList (repeat False) [True])
+-- * Hangs forever *
+-- @
+--
+-- An infinitely 'False' value hangs:
+--
+-- @
+-- > bior (BiList (repeat False) [])
+-- * Hangs forever *
+-- @
+--
+-- @since 4.10.0.0
+bior :: Bifoldable t => t Bool Bool -> Bool
+bior = getAny . bifoldMap Any Any
+
+-- | Determines whether any element of the structure satisfies its appropriate
+-- predicate argument. Empty structures yield 'False'.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biany even isDigit (27, 't')
+-- False
+--
+-- >>> biany even isDigit (27, '8')
+-- True
+--
+-- >>> biany even isDigit (26, 't')
+-- True
+--
+-- >>> biany even isDigit (Left 27)
+-- False
+--
+-- >>> biany even isDigit (Left 26)
+-- True
+--
+-- >>> biany even isDigit (BiList [27, 53] ['t', '8'])
+-- True
+--
+-- Empty structures yield 'False':
+--
+-- >>> biany even isDigit (BiList [] [])
+-- False
+--
+-- @since 4.10.0.0
+biany :: Bifoldable t => (a -> Bool) -> (b -> Bool) -> t a b -> Bool
+biany p q = getAny . bifoldMap (Any . p) (Any . q)
+
+-- | Determines whether all elements of the structure satisfy their appropriate
+-- predicate argument. Empty structures yield 'True'.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biall even isDigit (27, 't')
+-- False
+--
+-- >>> biall even isDigit (26, '8')
+-- True
+--
+-- >>> biall even isDigit (Left 27)
+-- False
+--
+-- >>> biall even isDigit (Left 26)
+-- True
+--
+-- >>> biall even isDigit (BiList [26, 52] ['3', '8'])
+-- True
+--
+-- Empty structures yield 'True':
+--
+-- >>> biall even isDigit (BiList [] [])
+-- True
+--
+-- @since 4.10.0.0
+biall :: Bifoldable t => (a -> Bool) -> (b -> Bool) -> t a b -> Bool
+biall p q = getAll . bifoldMap (All . p) (All . q)
+
+-- | The largest element of a non-empty structure with respect to the
+-- given comparison function.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bimaximumBy compare (42, 17)
+-- 42
+--
+-- >>> bimaximumBy compare (Left 17)
+-- 17
+--
+-- >>> bimaximumBy compare (BiList [42, 17, 23] [-5, 18])
+-- 42
+--
+-- On empty structures, this function throws an exception:
+--
+-- >>> bimaximumBy compare (BiList [] [])
+-- *** Exception: bifoldr1: empty structure
+-- ...
+--
+-- @since 4.10.0.0
+bimaximumBy :: Bifoldable t => (a -> a -> Ordering) -> t a a -> a
+bimaximumBy cmp = bifoldr1 max'
+ where max' x y = case cmp x y of
+ GT -> x
+ _ -> y
+
+-- | The least element of a non-empty structure with respect to the
+-- given comparison function.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> biminimumBy compare (42, 17)
+-- 17
+--
+-- >>> biminimumBy compare (Left 17)
+-- 17
+--
+-- >>> biminimumBy compare (BiList [42, 17, 23] [-5, 18])
+-- -5
+--
+-- On empty structures, this function throws an exception:
+--
+-- >>> biminimumBy compare (BiList [] [])
+-- *** Exception: bifoldr1: empty structure
+-- ...
+--
+-- @since 4.10.0.0
+biminimumBy :: Bifoldable t => (a -> a -> Ordering) -> t a a -> a
+biminimumBy cmp = bifoldr1 min'
+ where min' x y = case cmp x y of
+ GT -> y
+ _ -> x
+
+-- | 'binotElem' is the negation of 'bielem'.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> binotElem 42 (17, 42)
+-- False
+--
+-- >>> binotElem 42 (17, 43)
+-- True
+--
+-- >>> binotElem 42 (Left 42)
+-- False
+--
+-- >>> binotElem 42 (Right 13)
+-- True
+--
+-- >>> binotElem 42 (BiList [1..5] [1..100])
+-- False
+--
+-- >>> binotElem 42 (BiList [1..5] [1..41])
+-- True
+--
+-- @since 4.10.0.0
+binotElem :: (Bifoldable t, Eq a) => a -> t a a-> Bool
+binotElem x = not . bielem x
+
+-- | The 'bifind' function takes a predicate and a structure and returns
+-- the leftmost element of the structure matching the predicate, or
+-- 'Nothing' if there is no such element.
+--
+-- ==== __Examples__
+--
+-- Basic usage:
+--
+-- >>> bifind even (27, 53)
+-- Nothing
+--
+-- >>> bifind even (27, 52)
+-- Just 52
+--
+-- >>> bifind even (26, 52)
+-- Just 26
+--
+-- Empty structures always yield 'Nothing':
+--
+-- >>> bifind even (BiList [] [])
+-- Nothing
+--
+-- @since 4.10.0.0
+bifind :: Bifoldable t => (a -> Bool) -> t a a -> Maybe a
+bifind p = getFirst . bifoldMap finder finder
+ where finder x = First (if p x then Just x else Nothing)
--- /dev/null
+++ b/lib/Data/Bifunctor.hs
@@ -1,0 +1,176 @@
+{-# LANGUAGE QuantifiedConstraints #-}
+{-# LANGUAGE Safe #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module : Data.Bifunctor
+-- Copyright : (C) 2008-2014 Edward Kmett,
+-- License : BSD-style (see the file LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : provisional
+-- Portability : portable
+--
+-- @since 4.8.0.0
+----------------------------------------------------------------------------
+module Data.Bifunctor
+ ( Bifunctor(..)
+ ) where
+import Control.Applicative ( Const(..) )
+
+-- $setup
+-- >>> import Prelude
+-- >>> import Data.Char (toUpper)
+
+-- | A bifunctor is a type constructor that takes
+-- two type arguments and is a functor in /both/ arguments. That
+-- is, unlike with 'Functor', a type constructor such as 'Either'
+-- does not need to be partially applied for a 'Bifunctor'
+-- instance, and the methods in this class permit mapping
+-- functions over the 'Left' value or the 'Right' value,
+-- or both at the same time.
+--
+-- Formally, the class 'Bifunctor' represents a bifunctor
+-- from @Hask@ -> @Hask@.
+--
+-- Intuitively it is a bifunctor where both the first and second
+-- arguments are covariant.
+--
+-- The class definition of a 'Bifunctor' @p@ uses the
+-- [QuantifiedConstraints](https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/quantified_constraints.html)
+-- language extension to quantify over the first type
+-- argument @a@ in its context. The context requires that @p a@
+-- must be a 'Functor' for all @a@. In other words a partially
+-- applied 'Bifunctor' must be a 'Functor'. This makes 'Functor' a
+-- superclass of 'Bifunctor' such that a function with a
+-- 'Bifunctor' constraint may use 'fmap' in its implementation.
+-- 'Functor' has been a quantified superclass of
+-- 'Bifunctor' since base-4.18.0.0.
+--
+-- You can define a 'Bifunctor' by either defining 'bimap' or by
+-- defining both 'first' and 'second'. The 'second' method must
+-- agree with 'fmap':
+--
+-- @'second' ≡ 'fmap'@
+--
+-- From this it follows that:
+--
+-- @'second' 'id' ≡ 'id'@
+--
+-- If you supply 'bimap', you should ensure that:
+--
+-- @'bimap' 'id' 'id' ≡ 'id'@
+--
+-- If you supply 'first' and 'second', ensure:
+--
+-- @
+-- 'first' 'id' ≡ 'id'
+-- 'second' 'id' ≡ 'id'
+-- @
+--
+-- If you supply both, you should also ensure:
+--
+-- @'bimap' f g ≡ 'first' f '.' 'second' g@
+--
+-- These ensure by parametricity:
+--
+-- @
+-- 'bimap' (f '.' g) (h '.' i) ≡ 'bimap' f h '.' 'bimap' g i
+-- 'first' (f '.' g) ≡ 'first' f '.' 'first' g
+-- 'second' (f '.' g) ≡ 'second' f '.' 'second' g
+-- @
+--
+-- @since 4.8.0.0
+class (forall a. Functor (p a)) => Bifunctor p where
+ {-# MINIMAL bimap | first, second #-}
+
+ -- | Map over both arguments at the same time.
+ --
+ -- @'bimap' f g ≡ 'first' f '.' 'second' g@
+ --
+ -- ==== __Examples__
+ -- >>> bimap toUpper (+1) ('j', 3)
+ -- ('J',4)
+ --
+ -- >>> bimap toUpper (+1) (Left 'j')
+ -- Left 'J'
+ --
+ -- >>> bimap toUpper (+1) (Right 3)
+ -- Right 4
+ bimap :: (a -> b) -> (c -> d) -> p a c -> p b d
+ bimap f g = first f . second g
+
+
+ -- | Map covariantly over the first argument.
+ --
+ -- @'first' f ≡ 'bimap' f 'id'@
+ --
+ -- ==== __Examples__
+ -- >>> first toUpper ('j', 3)
+ -- ('J',3)
+ --
+ -- >>> first toUpper (Left 'j')
+ -- Left 'J'
+ first :: (a -> b) -> p a c -> p b c
+ first f = bimap f id
+
+
+ -- | Map covariantly over the second argument.
+ --
+ -- @'second' ≡ 'bimap' 'id'@
+ --
+ -- ==== __Examples__
+ -- >>> second (+1) ('j', 3)
+ -- ('j',4)
+ --
+ -- >>> second (+1) (Right 3)
+ -- Right 4
+ second :: (b -> c) -> p a b -> p a c
+ second = bimap id
+
+
+-- | Class laws for tuples hold only up to laziness. Both
+-- 'first' 'id' and 'second' 'id' are lazier than 'id' (and 'fmap' 'id'):
+--
+-- >>> first id (undefined :: (Int, Word)) `seq` ()
+-- ()
+-- >>> second id (undefined :: (Int, Word)) `seq` ()
+-- ()
+-- >>> id (undefined :: (Int, Word)) `seq` ()
+-- *** Exception: Prelude.undefined
+--
+-- @since 4.8.0.0
+
+{-
+instance Bifunctor (,) where
+ bimap f g ~(a, b) = (f a, g b)
+
+-- | @since 4.8.0.0
+instance Bifunctor ((,,) x1) where
+ bimap f g ~(x1, a, b) = (x1, f a, g b)
+
+-- | @since 4.8.0.0
+instance Bifunctor ((,,,) x1 x2) where
+ bimap f g ~(x1, x2, a, b) = (x1, x2, f a, g b)
+
+-- | @since 4.8.0.0
+instance Bifunctor ((,,,,) x1 x2 x3) where
+ bimap f g ~(x1, x2, x3, a, b) = (x1, x2, x3, f a, g b)
+
+-- | @since 4.8.0.0
+instance Bifunctor ((,,,,,) x1 x2 x3 x4) where
+ bimap f g ~(x1, x2, x3, x4, a, b) = (x1, x2, x3, x4, f a, g b)
+
+-- | @since 4.8.0.0
+instance Bifunctor ((,,,,,,) x1 x2 x3 x4 x5) where
+ bimap f g ~(x1, x2, x3, x4, x5, a, b) = (x1, x2, x3, x4, x5, f a, g b)
+-}
+
+-- | @since 4.8.0.0
+instance Bifunctor Either where
+ bimap f _ (Left a) = Left (f a)
+ bimap _ g (Right b) = Right (g b)
+
+-- | @since 4.8.0.0
+instance Bifunctor Const where
+ bimap f _ (Const a) = Const (f a)
--- /dev/null
+++ b/lib/Data/Bitraversable.hs
@@ -1,0 +1,105 @@
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module : Data.Bitraversable
+-- Copyright : (C) 2011-2016 Edward Kmett
+-- License : BSD-style (see the file LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : provisional
+-- Portability : portable
+--
+-- @since 4.10.0.0
+----------------------------------------------------------------------------
+module Data.Bitraversable
+ ( Bitraversable(..)
+ , bisequenceA
+ , bisequence
+ , bimapM
+ , bifor
+ , biforM
+ , bimapAccumL
+ , bimapAccumR
+-- , bimapDefault
+-- , bifoldMapDefault
+ ) where
+
+import Control.Applicative
+import Data.Bifunctor
+import Data.Bifoldable
+-- Data.Coerce
+import Data.Functor.Identity(Identity(..))
+import Data.Foldable.Internal(StateL(..), runStateL, StateR(..), runStateR)
+
+class (Bifunctor t, Bifoldable t) => Bitraversable t where
+ bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)
+
+bisequenceA :: (Bitraversable t, Applicative f) => t (f a) (f b) -> f (t a b)
+bisequenceA = bisequence
+
+bimapM :: (Bitraversable t, Applicative f)
+ => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)
+bimapM = bitraverse
+
+bisequence :: (Bitraversable t, Applicative f) => t (f a) (f b) -> f (t a b)
+bisequence = bitraverse id id
+
+{-
+instance Bitraversable (,) where
+ bitraverse f g ~(a, b) = liftA2 (,) (f a) (g b)
+
+instance Bitraversable ((,,) x) where
+ bitraverse f g ~(x, a, b) = liftA2 ((,,) x) (f a) (g b)
+
+instance Bitraversable ((,,,) x y) where
+ bitraverse f g ~(x, y, a, b) = liftA2 ((,,,) x y) (f a) (g b)
+
+instance Bitraversable ((,,,,) x y z) where
+ bitraverse f g ~(x, y, z, a, b) = liftA2 ((,,,,) x y z) (f a) (g b)
+
+instance Bitraversable ((,,,,,) x y z w) where
+ bitraverse f g ~(x, y, z, w, a, b) = liftA2 ((,,,,,) x y z w) (f a) (g b)
+
+instance Bitraversable ((,,,,,,) x y z w v) where
+ bitraverse f g ~(x, y, z, w, v, a, b) =
+ liftA2 ((,,,,,,) x y z w v) (f a) (g b)
+-}
+
+instance Bitraversable Either where
+ bitraverse f _ (Left a) = Left <$> f a
+ bitraverse _ g (Right b) = Right <$> g b
+
+instance Bitraversable Const where
+ bitraverse f _ (Const a) = Const <$> f a
+
+bifor :: (Bitraversable t, Applicative f)
+ => t a b -> (a -> f c) -> (b -> f d) -> f (t c d)
+bifor t f g = bitraverse f g t
+
+biforM :: (Bitraversable t, Applicative f)
+ => t a b -> (a -> f c) -> (b -> f d) -> f (t c d)
+biforM = bifor
+
+bimapAccumL :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e))
+ -> a -> t b d -> (a, t c e)
+bimapAccumL f g s t
+ = runStateL (bitraverse (StateL . flip f) (StateL . flip g) t) s
+
+bimapAccumR :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e))
+ -> a -> t b d -> (a, t c e)
+bimapAccumR f g s t
+ = runStateR (bitraverse (StateR . flip f) (StateR . flip g) t) s
+
+{-
+bimapDefault = coerce
+ (bitraverse :: (a -> Identity b)
+ -> (c -> Identity d) -> t a c -> Identity (t b d))
+
+bifoldMapDefault :: forall t m a b . (Bitraversable t, Monoid m)
+ => (a -> m) -> (b -> m) -> t a b -> m
+bifoldMapDefault = coerce
+ (bitraverse :: (a -> Const m ())
+ -> (b -> Const m ()) -> t a b -> Const m (t () ()))
+-}
--- a/lib/Data/Bits.hs
+++ b/lib/Data/Bits.hs
@@ -4,7 +4,7 @@
import Control.Error
import Data.Bool
import Data.Eq
-import Data.Int()
+import Data.Int
import Data.Maybe
import Data.Ord
import Data.Num
@@ -92,3 +92,18 @@
| otherwise = go (i + 1)
w = finiteBitSize x
+
+instance Bits Int where
+ (.&.) = primIntAnd
+ (.|.) = primIntOr
+ xor = primIntXor
+ complement = primIntInv
+ shiftL = primIntShl
+ shiftR = primIntShr
+ bitSizeMaybe _ = Just _wordSize
+ bitSize _ = _wordSize
+ bit n = primIntShl 1 n
+ zeroBits = 0
+
+instance FiniteBits Int where
+ finiteBitSize _ = _wordSize
--- /dev/null
+++ b/lib/Data/ByteString.hs
@@ -1,0 +1,568 @@
+module Data.ByteString(
+
+ ByteString,
+ StrictByteString,
+
+ -- * Introducing and eliminating 'ByteString's
+ empty, singleton, pack, unpack,
+ fromStrict, toStrict,
+ fromFilePath, toFilePath,
+
+ -- * Basic interface
+ cons, snoc, append, head, uncons, unsnoc,
+ last, tail, init,
+ null, length,
+
+ -- * Transforming ByteStrings
+ map,
+ reverse,
+ intersperse,
+ intercalate,
+ transpose,
+
+ -- * Reducing 'ByteString's (folds)
+ foldl, foldl', foldl1, foldl1',
+
+ foldr, foldr', foldr1, foldr1',
+
+ -- ** Special folds
+ concat,
+ concatMap,
+ any,
+ all,
+ maximum,
+ minimum,
+
+ -- * Building ByteStrings
+ -- ** Scans
+ scanl, scanl1, scanr, scanr1,
+
+ -- ** Accumulating maps
+ mapAccumL, mapAccumR,
+
+ -- ** Generating and unfolding ByteStrings
+ replicate,
+ unfoldr,
+ unfoldrN,
+
+ -- * Substrings
+
+ -- ** Breaking strings
+ take,
+ takeEnd,
+ drop,
+ dropEnd,
+ splitAt,
+ takeWhile,
+ takeWhileEnd,
+ dropWhile,
+ dropWhileEnd,
+ span,
+ spanEnd,
+ break,
+ breakEnd,
+ group,
+ groupBy,
+ inits,
+ tails,
+ initsNE,
+ tailsNE,
+ stripPrefix,
+ stripSuffix,
+
+ -- ** Breaking into many substrings
+ split,
+ splitWith,
+
+ -- * Predicates
+ isPrefixOf,
+ isSuffixOf,
+ isInfixOf,
+
+ -- ** Encoding validation
+ isValidUtf8,
+
+ -- ** Search for arbitrary substrings
+ breakSubstring,
+
+ -- * Searching ByteStrings
+
+ -- ** Searching by equality
+ elem,
+ notElem,
+
+ -- ** Searching with a predicate
+ find,
+ filter,
+ partition,
+
+ -- * Indexing ByteStrings
+ index,
+ indexMaybe,
+ (!?),
+ elemIndex,
+ elemIndices,
+ elemIndexEnd,
+ findIndex,
+ findIndices,
+ findIndexEnd,
+ count,
+
+ -- * Zipping and unzipping ByteStrings
+ zip,
+ zipWith,
+ packZipWith,
+ unzip,
+
+ -- * Ordered ByteStrings
+ sort,
+
+ -- * Low level conversions
+ -- ** Copying ByteStrings
+ copy,
+
+ -- ** Packing 'CString's and pointers
+ packCString,
+ packCStringLen,
+
+ -- ** Using ByteStrings as 'CString's
+ useAsCString,
+ useAsCStringLen,
+
+ -- * I\/O with 'ByteString's
+
+ -- ** Standard input and output
+ getLine,
+ getContents,
+ putStr,
+ interact,
+
+ -- ** Files
+ readFile,
+ writeFile,
+ appendFile,
+
+ -- ** I\/O with Handles
+ hGetLine,
+ hGetContents,
+ hGet,
+ hGetSome,
+ hGetNonBlocking,
+ hPut,
+ hPutNonBlocking,
+ hPutStr,
+ ) where
+import Prelude(Bool(..), Int, Char, Ordering, FilePath, IO, Maybe(..), (), [](..), String,
+ Eq(..), Ord(..), Show(..), Num(..), Monad(..), Functor(..),
+ (.), ($), Enum(..), (||), (&&), not, otherwise, (!!), fst, snd)
+import qualified Prelude as P
+import qualified Data.List as P
+import Data.List.NonEmpty(NonEmpty, fromList)
+import Data.Bits
+import Data.Monoid.Internal
+import Data.Semigroup
+import Data.String
+import Data.Word(Word8)
+import Foreign.C.String(CString, CStringLen)
+import System.IO(Handle, IOMode(..), stdin, stdout)
+import qualified System.IO as P
+import Foreign.ForeignPtr
+import Data.ByteString.Internal
+
+type StrictByteString = ByteString
+
+primBS2FPtr :: ByteString -> ForeignPtr Char
+primBS2FPtr = primitive "I" -- same representation
+
+bsUnimp :: String -> a
+bsUnimp s = P.error $ "Data.ByteString." P.++ s P.++ " unimplemented"
+
+-----------------------------------------
+
+fromStrict = bsUnimp "fromStrict"
+toStrict = bsUnimp "toStrict"
+
+fromFilePath :: FilePath -> IO ByteString
+fromFilePath = return . fromString
+
+toFilePath :: ByteString -> IO FilePath
+toFilePath = return . toString
+
+infixr 5 `cons` --same as list (:)
+infixl 5 `snoc`
+
+cons :: Word8 -> ByteString -> ByteString
+cons c bs = append (pack [c]) bs
+
+snoc :: ByteString -> Word8 -> ByteString
+snoc bs c = append bs (pack [c])
+
+head :: ByteString -> Word8
+head = P.head . unpack
+
+tail :: ByteString -> ByteString
+tail bs | sz == 0 = bsError "tail: empty"
+ | otherwise = substr bs 1 (sz - 1)
+ where sz = length bs
+
+uncons :: ByteString -> Maybe (Word8, ByteString)
+uncons bs | null bs = Nothing
+ | otherwise = Just (head bs, tail bs)
+
+last :: ByteString -> Word8
+last = P.last . unpack
+
+init :: ByteString -> ByteString
+init bs | sz == 0 = bsError "init: empty"
+ | otherwise = substr bs 0 (sz - 1)
+ where sz = length bs
+
+unsnoc :: ByteString -> Maybe (ByteString, Word8)
+unsnoc bs | null bs = Nothing
+ | otherwise = Just (init bs, last bs)
+
+null :: ByteString -> Bool
+null bs = length bs == 0
+
+map :: (Word8 -> Word8) -> ByteString -> ByteString
+map f = pack . P.map f . unpack
+
+reverse :: ByteString -> ByteString
+reverse = pack . P.reverse . unpack
+
+intersperse :: Word8 -> ByteString -> ByteString
+intersperse x = pack . P.intersperse x . unpack
+
+transpose :: [ByteString] -> [ByteString]
+transpose = P.map pack . P.transpose . P.map unpack
+
+foldl :: (a -> Word8 -> a) -> a -> ByteString -> a
+foldl f z = P.foldl f z . unpack
+
+foldl' :: (a -> Word8 -> a) -> a -> ByteString -> a
+foldl' f z = P.foldl' f z . unpack
+
+foldr :: (Word8 -> a -> a) -> a -> ByteString -> a
+foldr k z = P.foldr k z . unpack
+
+foldr' :: (Word8 -> a -> a) -> a -> ByteString -> a
+foldr' k z = P.foldr' k z . unpack
+
+foldl1 :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8
+foldl1 f = P.foldl1 f . unpack
+
+foldl1' :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8
+foldl1' f = P.foldl1' f . unpack
+
+foldr1 :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8
+foldr1 f = P.foldr1 f . unpack
+
+foldr1' :: (Word8 -> Word8 -> Word8) -> ByteString -> Word8
+foldr1' f = P.foldr1' f . unpack
+
+concat :: [ByteString] -> ByteString
+concat = P.foldr append empty
+
+concatMap :: (Word8 -> ByteString) -> ByteString -> ByteString
+concatMap f = concat . P.map f . unpack
+
+any :: (Word8 -> Bool) -> ByteString -> Bool
+any f = P.any f . unpack
+
+all :: (Word8 -> Bool) -> ByteString -> Bool
+all f = P.all f . unpack
+
+maximum :: ByteString -> Word8
+maximum = P.maximum . unpack
+
+minimum :: ByteString -> Word8
+minimum = P.minimum . unpack
+
+mapAccumL :: (acc -> Word8 -> (acc, Word8)) -> acc -> ByteString -> (acc, ByteString)
+mapAccumL f acc bs = (acc', pack ws)
+ where (acc', ws) = P.mapAccumL f acc (unpack bs)
+
+mapAccumR :: (acc -> Word8 -> (acc, Word8)) -> acc -> ByteString -> (acc, ByteString)
+mapAccumR f acc bs = (acc', pack ws)
+ where (acc', ws) = P.mapAccumR f acc (unpack bs)
+
+scanl
+ :: (Word8 -> Word8 -> Word8)
+ -- ^ accumulator -> element -> new accumulator
+ -> Word8
+ -- ^ starting value of accumulator
+ -> ByteString
+ -- ^ input of length n
+ -> ByteString
+ -- ^ output of length n+1
+scanl f v = pack . P.scanl f v . unpack
+
+scanl1 :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString
+scanl1 f = pack . P.scanl1 f . unpack
+
+scanr
+ :: (Word8 -> Word8 -> Word8)
+ -- ^ element -> accumulator -> new accumulator
+ -> Word8
+ -- ^ starting value of accumulator
+ -> ByteString
+ -- ^ input of length n
+ -> ByteString
+ -- ^ output of length n+1
+scanr f v = pack . P.scanr f v . unpack
+
+scanr1 :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString
+scanr1 f = pack . P.scanr1 f . unpack
+
+replicate :: Int -> Word8 -> ByteString
+replicate w = pack . P.replicate w
+
+unfoldr :: (a -> Maybe (Word8, a)) -> a -> ByteString
+unfoldr f = pack . P.unfoldr f
+
+unfoldrN :: Int -> (a -> Maybe (Word8, a)) -> a -> (ByteString, Maybe a)
+unfoldrN i f = loop [] i
+ where loop ws i x | i <= 0 = (pack (P.reverse ws), Just x)
+ | Just (w, x') <- f x = loop (w:ws) (i-1) x'
+ | otherwise = (pack (P.reverse ws), Nothing)
+
+take :: Int -> ByteString -> ByteString
+take n bs
+ | n <= 0 = empty
+ | n >= l = bs
+ | otherwise = substr bs 0 n
+ where l = length bs
+
+takeEnd :: Int -> ByteString -> ByteString
+takeEnd n bs
+ | n <= 0 = empty
+ | n >= l = bs
+ | otherwise = substr bs (l - n) n
+ where l = length bs
+
+drop :: Int -> ByteString -> ByteString
+drop n bs
+ | n <= 0 = bs
+ | n >= l = empty
+ | otherwise = substr bs n (l - n)
+ where l = length bs
+
+dropEnd :: Int -> ByteString -> ByteString
+dropEnd n bs
+ | n <= 0 = bs
+ | n >= l = empty
+ | otherwise = substr bs 0 (l - n)
+ where l = length bs
+
+splitAt :: Int -> ByteString -> (ByteString, ByteString)
+splitAt n bs = (take n bs, drop n bs)
+
+takeWhile :: (Word8 -> Bool) -> ByteString -> ByteString
+takeWhile f = pack . P.takeWhile f . unpack
+
+takeWhileEnd :: (Word8 -> Bool) -> ByteString -> ByteString
+takeWhileEnd f = pack . P.takeWhileEnd f . unpack
+
+dropWhile :: (Word8 -> Bool) -> ByteString -> ByteString
+dropWhile f = pack . P.dropWhile f . unpack
+
+dropWhileEnd :: (Word8 -> Bool) -> ByteString -> ByteString
+dropWhileEnd f = pack . P.dropWhileEnd f . unpack
+
+break :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
+break p bs = (takeWhile p bs, dropWhile p bs)
+
+breakEnd :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
+breakEnd p bs = (takeWhileEnd p bs, dropWhileEnd p bs)
+
+span :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
+span p = break (not . p)
+
+spanEnd :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
+spanEnd p = breakEnd (not . p)
+
+splitWith :: (Word8 -> Bool) -> ByteString -> [ByteString]
+splitWith w = P.map pack . P.splitWith w . unpack
+
+split :: Word8 -> ByteString -> [ByteString]
+split w = splitWith (w ==)
+
+group :: ByteString -> [ByteString]
+group = P.map pack . P.group . unpack
+
+groupBy :: (Word8 -> Word8 -> Bool) -> ByteString -> [ByteString]
+groupBy q = P.map pack . P.groupBy q . unpack
+
+intercalate :: ByteString -> [ByteString] -> ByteString
+intercalate s = pack . P.intercalate (unpack s) . P.map unpack
+
+index :: ByteString -> Int -> Word8
+index bs n = unpack bs !! n
+
+indexMaybe :: ByteString -> Int -> Maybe Word8
+indexMaybe bs n = unpack bs P.!? n
+
+(!?) :: ByteString -> Int -> Maybe Word8
+(!?) = indexMaybe
+
+elemIndex :: Word8 -> ByteString -> Maybe Int
+elemIndex c = P.elemIndex c . unpack
+
+elemIndexEnd :: Word8 -> ByteString -> Maybe Int
+elemIndexEnd c bs = fmap (l -) . P.elemIndex c . P.reverse . unpack $ bs
+ where l = length bs - 1
+
+elemIndices :: Word8 -> ByteString -> [Int]
+elemIndices w = P.elemIndices w . unpack
+
+count :: Word8 -> ByteString -> Int
+count w = P.length . elemIndices w
+
+findIndex :: (Word8 -> Bool) -> ByteString -> Maybe Int
+findIndex k = P.findIndex k . unpack
+
+findIndexEnd :: (Word8 -> Bool) -> ByteString -> Maybe Int
+findIndexEnd c bs = fmap (l -) . P.findIndex c . P.reverse . unpack $ bs
+ where l = length bs - 1
+
+findIndices :: (Word8 -> Bool) -> ByteString -> [Int]
+findIndices p = P.findIndices p . unpack
+
+elem :: Word8 -> ByteString -> Bool
+elem c ps = case elemIndex c ps of Nothing -> False ; _ -> True
+
+notElem :: Word8 -> ByteString -> Bool
+notElem c ps = not (c `elem` ps)
+
+filter :: (Word8 -> Bool) -> ByteString -> ByteString
+filter p = pack . P.filter p . unpack
+
+find :: (Word8 -> Bool) -> ByteString -> Maybe Word8
+find p = P.find p . unpack
+
+partition :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
+partition f bs = (pack a, pack b) where (a, b) = P.partition f (unpack bs)
+
+isPrefixOf :: ByteString -> ByteString -> Bool
+isPrefixOf s = P.isPrefixOf (unpack s) . unpack
+
+stripPrefix :: ByteString -> ByteString -> Maybe ByteString
+stripPrefix s = fmap pack . P.stripPrefix (unpack s) . unpack
+
+isSuffixOf :: ByteString -> ByteString -> Bool
+isSuffixOf a = P.isSuffixOf (unpack a) . unpack
+
+stripSuffix :: ByteString -> ByteString -> Maybe ByteString
+stripSuffix s = fmap pack . P.stripSuffix (unpack s) . unpack
+
+isInfixOf :: ByteString -> ByteString -> Bool
+isInfixOf a = P.isInfixOf (unpack a) . unpack
+
+isValidUtf8 :: ByteString -> Bool
+isValidUtf8 = validUtf8 . unpack
+ where
+ validUtf8 :: [Word8] -> Bool
+ validUtf8 [] = True
+ validUtf8 (x1 : xs) | mask x1 0x80 0x00 = validUtf8 xs
+ validUtf8 (x1 : x2 : xs) | mask x1 0xe0 0xc0 && mask80 x2 = validUtf8 xs
+ validUtf8 (x1 : x2 : x3 : xs) | mask x1 0xf0 0xe0 && mask80 x2 && mask80 x3 = validUtf8 xs
+ validUtf8 (x1 : x2 : x3 : x4 : xs) | mask x1 0xf8 0xf0 && mask80 x2 && mask80 x3 && mask80 x4 = validUtf8 xs
+ validUtf8 _ = False
+ mask :: Word8 -> Word8 -> Word8 -> Bool
+ mask x m b = x .&. m == b
+ mask80 :: Word8 -> Bool
+ mask80 x = mask x 0xc0 0x80
+
+breakSubstring :: ByteString -- ^ String to search for
+ -> ByteString -- ^ String to search in
+ -> (ByteString,ByteString) -- ^ Head and tail of string broken at substring
+breakSubstring pat = bsUnimp "breakSubstring"
+
+zip :: ByteString -> ByteString -> [(Word8,Word8)]
+zip ps qs = P.zip (unpack ps) (unpack qs)
+
+zipWith :: (Word8 -> Word8 -> a) -> ByteString -> ByteString -> [a]
+zipWith f ps qs = P.zipWith f (unpack ps) (unpack qs)
+
+packZipWith :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString -> ByteString
+packZipWith f ps qs = pack $ zipWith f ps qs
+
+unzip :: [(Word8,Word8)] -> (ByteString,ByteString)
+unzip ls = (pack (P.map fst ls), pack (P.map snd ls))
+
+inits :: ByteString -> [ByteString]
+inits = P.map pack . P.inits . unpack
+
+initsNE :: ByteString -> NonEmpty ByteString
+initsNE = fromList . inits
+
+tails :: ByteString -> [ByteString]
+tails = P.map pack . P.tails . unpack
+
+tailsNE :: ByteString -> NonEmpty ByteString
+tailsNE = fromList . tails
+
+sort :: ByteString -> ByteString
+sort = pack . P.sort . unpack
+
+useAsCString :: ByteString -> (CString -> IO a) -> IO a
+useAsCString bs act =
+ withForeignPtr (primBS2FPtr bs) act
+
+useAsCStringLen :: ByteString -> (CStringLen -> IO a) -> IO a
+useAsCStringLen bs act =
+ withForeignPtr (primBS2FPtr bs) $ \ p -> act (p, length bs)
+
+packCString :: CString -> IO ByteString
+packCString cstr = bsUnimp "packCString"
+
+packCStringLen :: CStringLen -> IO ByteString
+packCStringLen = bsUnimp "packCStringLen"
+
+copy :: ByteString -> ByteString
+copy = append empty
+
+getLine :: IO ByteString
+getLine = hGetLine stdin
+
+hGetLine :: Handle -> IO ByteString
+hGetLine = fmap fromString . P.hGetLine
+
+hPut :: Handle -> ByteString -> IO ()
+hPut h = P.hPutStr h . toString
+
+hPutNonBlocking :: Handle -> ByteString -> IO ByteString
+hPutNonBlocking = bsUnimp "hPutNonBlocking"
+
+hPutStr :: Handle -> ByteString -> IO ()
+hPutStr = hPut
+
+putStr :: ByteString -> IO ()
+putStr = hPut stdout
+
+hGet :: Handle -> Int -> IO ByteString
+hGet h i = bsUnimp "hGet"
+
+hGetNonBlocking :: Handle -> Int -> IO ByteString
+hGetNonBlocking h i = bsUnimp "hGetNonBlocking"
+
+hGetSome :: Handle -> Int -> IO ByteString
+hGetSome h i = bsUnimp "hGetSome"
+
+hGetContents :: Handle -> IO ByteString
+hGetContents = fmap fromString . P.hGetContents
+
+getContents :: IO ByteString
+getContents = hGetContents stdin
+
+interact :: (ByteString -> ByteString) -> IO ()
+interact transformer = getContents >>= putStr . transformer
+
+readFile :: FilePath -> IO ByteString
+readFile = fmap fromString . P.readFile
+
+writeFile :: FilePath -> ByteString -> IO ()
+writeFile f = P.writeFile f . toString
+
+appendFile :: FilePath -> ByteString -> IO ()
+appendFile f = P.appendFile f . toString
--- /dev/null
+++ b/lib/Data/ByteString/Internal.hs
@@ -1,0 +1,89 @@
+module Data.ByteString.Internal(module Data.ByteString.Internal) where
+import Prelude(); import MiniPrelude hiding(length)
+import Data.Word(Word8)
+
+data ByteString -- primitive type
+
+primBSappend :: ByteString -> ByteString -> ByteString
+primBSappend = primitive "bs++"
+primBSappend3 :: ByteString -> ByteString -> ByteString -> ByteString
+primBSappend3 = primitive "bs+++"
+primBSEQ :: ByteString -> ByteString -> Bool
+primBSEQ = primitive "bs=="
+primBSNE :: ByteString -> ByteString -> Bool
+primBSNE = primitive "bs/="
+primBSLT :: ByteString -> ByteString -> Bool
+primBSLT = primitive "bs<"
+primBSLE :: ByteString -> ByteString -> Bool
+primBSLE = primitive "bs<="
+primBSGT :: ByteString -> ByteString -> Bool
+primBSGT = primitive "bs>"
+primBSGE :: ByteString -> ByteString -> Bool
+primBSGE = primitive "bs>="
+primBScmp :: ByteString -> ByteString -> Ordering
+primBScmp = primitive "bscmp"
+primBSpack :: [Word8] -> ByteString
+primBSpack = primitive "bspack"
+primBSunpack :: ByteString -> [Word8]
+primBSunpack = primitive "bsunpack"
+primBSlength :: ByteString -> Int
+primBSlength = primitive "bslength"
+primBSsubstr :: ByteString -> Int -> Int -> ByteString
+primBSsubstr = primitive "bssubstr"
+
+-----------------------------------------
+
+instance Eq ByteString where
+ (==) = primBSEQ
+ (/=) = primBSNE
+
+instance Ord ByteString where
+ compare = primBScmp
+ (<) = primBSLT
+ (<=) = primBSLE
+ (>) = primBSGT
+ (>=) = primBSGE
+
+instance Show ByteString where
+ showsPrec p bs = showsPrec p (toString bs)
+
+instance IsString ByteString where
+ fromString = pack . map (toEnum . fromEnum)
+
+instance Semigroup ByteString where
+ (<>) = append
+
+instance Monoid ByteString where
+ mempty = empty
+
+toString :: ByteString -> String
+toString = map (toEnum . fromEnum) . unpack
+
+empty :: ByteString
+empty = pack []
+
+singleton :: Word8 -> ByteString
+singleton c = pack [c]
+
+length :: ByteString -> Int
+length = primBSlength
+
+append :: ByteString -> ByteString -> ByteString
+append = primBSappend
+
+substr :: ByteString -> Int -> Int -> ByteString
+substr bs offs len
+ | offs < 0 || offs > sz = bsError "substr bad offset"
+ | len < 0 || len > sz-offs = bsError "substr bad length"
+ | otherwise = primBSsubstr bs offs len
+ where sz = length bs
+
+bsError :: String -> a
+bsError s = error $ "Data.ByteString." ++ s
+
+pack :: [Word8] -> ByteString
+pack = primBSpack
+
+unpack :: ByteString -> [Word8]
+unpack = primBSunpack
+
--- a/lib/Data/Char.hs
+++ b/lib/Data/Char.hs
@@ -2,7 +2,7 @@
-- See LICENSE file for full license.
module Data.Char(
module Data.Char,
- module Data.Char_Type -- exports Char and String
+ module Data.Char_Type -- exports Char and String
) where
import Prelude() -- do not import Prelude
import Primitives
@@ -29,6 +29,7 @@
(>) = primCharGT
(>=) = primCharGE
+-- Using primitive comparison is still a small speedup, even using mostly bytestrings
instance Eq String where
(==) = primStringEQ
@@ -39,6 +40,7 @@
x > y = case primStringCompare x y of { GT -> True; _ -> False }
x >= y = case primStringCompare x y of { LT -> False; _ -> True }
+
instance Bounded Char where
minBound = chr 0
maxBound = chr 0x10ffff
@@ -52,9 +54,15 @@
isLower :: Char -> Bool
isLower c = (primCharLE 'a' c) && (primCharLE c 'z')
+isAsciiLower :: Char -> Bool
+isAsciiLower = isLower
+
isUpper :: Char -> Bool
isUpper c = (primCharLE 'A' c) && (primCharLE c 'Z')
+isAsciiUpper :: Char -> Bool
+isAsciiUpper = isUpper
+
isAlpha :: Char -> Bool
isAlpha c = isLower c || isUpper c
@@ -65,7 +73,7 @@
isOctDigit c = (primCharLE '0' c) && (primCharLE c '7')
isHexDigit :: Char -> Bool
-isHexDigit c = isDigit c || (primCharLE 'a' c && primCharLE c 'f') || (primCharLE 'F' c && primCharLE c 'F')
+isHexDigit c = isDigit c || (primCharLE 'a' c && primCharLE c 'f') || (primCharLE 'A' c && primCharLE c 'F')
isAlphaNum :: Char -> Bool
isAlphaNum c = isAlpha c || isDigit c
--- a/lib/Data/Double.hs
+++ b/lib/Data/Double.hs
@@ -13,7 +13,6 @@
import Data.Real
import Data.RealFloat
import Data.RealFrac
-import Text.Read
import Text.Show
-- XXX I should really implement newtype deriving...
@@ -57,8 +56,10 @@
instance Show Double where
showsPrec p = showsPrec p . unD
+{- in Text.Read.Internal
instance Read Double where
readsPrec p = map (\ (x, s) -> (D x, s)) . readsPrec p
+-}
instance Real Double where
toRational = toRational . unD
--- a/lib/Data/Either.hs
+++ b/lib/Data/Either.hs
@@ -3,6 +3,8 @@
module Data.Either(module Data.Either) where
import Prelude() -- do not import Prelude
import Primitives
+import Control.Applicative
+import Control.Monad
import Data.Bool
import Data.Eq
import Data.Function
@@ -33,3 +35,13 @@
instance forall a . Functor (Either a) where
fmap _ (Left a) = Left a
fmap f (Right b) = Right (f b)
+
+instance forall a . Applicative (Either a) where
+ pure b = Right b
+ Right f <*> Right x = Right (f x)
+ Right _ <*> Left a = Left a
+ Left a <*> _ = Left a
+
+instance forall a . Monad (Either a) where
+ Right b >>= k = k b
+ Left a >>= _ = Left a
--- /dev/null
+++ b/lib/Data/Fixed.hs
@@ -1,0 +1,225 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : Data.Fixed
+-- Copyright : (c) Ashley Yakeley 2005, 2006, 2009
+-- License : BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer : Ashley Yakeley <ashley@semantic.org>
+-- Stability : stable
+-- Portability : portable
+-----------------------------------------------------------------------------
+
+module Data.Fixed
+( -- * The Fixed Type
+ Fixed(..), HasResolution(..),
+ showFixed,
+ -- ** 1\/1
+ E0,Uni,
+ -- ** 1\/10
+ E1,Deci,
+ -- ** 1\/100
+ E2,Centi,
+ -- ** 1\/1 000
+ E3,Milli,
+ -- ** 1\/1 000 000
+ E6,Micro,
+ -- ** 1\/1 000 000 000
+ E9,Nano,
+ -- ** 1\/1 000 000 000 000
+ E12,Pico,
+ -- * Generalized Functions on Real's
+ div',
+ mod',
+ divMod'
+) where
+import Prelude()
+import MiniPrelude
+import Data.TypeLits (KnownNat, natVal)
+import Text.Read.Internal
+import Text.ParserCombinators.ReadPrec
+import Text.Read.Lex
+import Data.Double
+import Data.Floating
+import Data.Fractional
+import Data.Integer
+import Data.Real
+import Data.RealFrac
+import Data.Typeable
+
+default () -- avoid any defaulting shenanigans
+
+div' :: (Real a,Integral b) => a -> a -> b
+div' n d = floor ((toRational n) / (toRational d))
+
+divMod' :: (Real a,Integral b) => a -> a -> (b,a)
+divMod' n d = (f,n - (fromIntegral f) * d) where
+ f = div' n d
+
+mod' :: (Real a) => a -> a -> a
+mod' n d = n - (fromInteger f) * d where
+ f = div' n d
+
+type Fixed :: forall k . k -> Type
+newtype Fixed a = MkFixed Integer
+ deriving ( Eq -- ^ @since 2.01
+ , Ord -- ^ @since 2.01
+ )
+
+{-
+tyFixed :: DataType
+tyFixed = mkDataType "Data.Fixed.Fixed" [conMkFixed]
+
+conMkFixed :: Constr
+conMkFixed = mkConstr tyFixed "MkFixed" [] Prefix
+
+-- | @since 4.1.0.0
+instance (Typeable k,Typeable a) => Data (Fixed (a :: k)) where
+ gfoldl k z (MkFixed a) = k (z MkFixed) a
+ gunfold k z _ = k (z MkFixed)
+ dataTypeOf _ = tyFixed
+ toConstr _ = conMkFixed
+-}
+
+type HasResolution :: forall k . k -> Constraint
+class HasResolution a where
+ resolution :: p a -> Integer
+
+instance forall n . KnownNat n => HasResolution n where
+ resolution _ = natVal (Proxy :: Proxy n)
+
+withType :: (Proxy a -> f a) -> f a
+withType foo = foo Proxy
+
+withResolution :: (HasResolution a) => (Integer -> f a) -> f a
+withResolution foo = withType (foo . resolution)
+
+instance Enum (Fixed a) where
+ succ (MkFixed a) = MkFixed (succ a)
+ pred (MkFixed a) = MkFixed (pred a)
+ toEnum = MkFixed . toEnum
+ fromEnum (MkFixed a) = fromEnum a
+ enumFrom (MkFixed a) = fmap MkFixed (enumFrom a)
+ enumFromThen (MkFixed a) (MkFixed b) = fmap MkFixed (enumFromThen a b)
+ enumFromTo (MkFixed a) (MkFixed b) = fmap MkFixed (enumFromTo a b)
+ enumFromThenTo (MkFixed a) (MkFixed b) (MkFixed c) = fmap MkFixed (enumFromThenTo a b c)
+
+instance (HasResolution a) => Num (Fixed a) where
+ (MkFixed a) + (MkFixed b) = MkFixed (a + b)
+ (MkFixed a) - (MkFixed b) = MkFixed (a - b)
+ fa@(MkFixed a) * (MkFixed b) = MkFixed (div (a * b) (resolution fa))
+ negate (MkFixed a) = MkFixed (negate a)
+ abs (MkFixed a) = MkFixed (abs a)
+ signum (MkFixed a) = fromInteger (signum a)
+ fromInteger i = withResolution (\res -> MkFixed (i * res))
+
+instance (HasResolution a) => Real (Fixed a) where
+ toRational fa@(MkFixed a) = (toRational a) / (toRational (resolution fa))
+
+instance (HasResolution a) => Fractional (Fixed a) where
+ fa@(MkFixed a) / (MkFixed b) = MkFixed (div (a * (resolution fa)) b)
+ recip fa@(MkFixed a) = MkFixed (div (res * res) a) where
+ res = resolution fa
+ fromRational r = withResolution (\res -> MkFixed (floor (r * (toRational res))))
+
+instance (HasResolution a) => RealFrac (Fixed a) where
+ properFraction a = (i,a - (fromIntegral i)) where
+ i = truncate a
+ truncate f = truncate (toRational f)
+ round f = round (toRational f)
+ ceiling f = ceiling (toRational f)
+ floor f = floor (toRational f)
+
+chopZeros :: Integer -> String
+chopZeros 0 = ""
+chopZeros a | mod a 10 == 0 = chopZeros (div a 10)
+chopZeros a = show a
+
+showIntegerZeros :: Bool -> Int -> Integer -> String
+showIntegerZeros True _ 0 = ""
+showIntegerZeros chopTrailingZeros digits a = replicate (digits - length s) '0' ++ s' where
+ s = show a
+ s' = if chopTrailingZeros then chopZeros a else s
+
+withDot :: String -> String
+withDot "" = ""
+withDot s = '.':s
+
+showFixed :: (HasResolution a) => Bool -> Fixed a -> String
+showFixed chopTrailingZeros fa@(MkFixed a) | a < 0 = "-" ++ (showFixed chopTrailingZeros (asTypeOf (MkFixed (negate a)) fa))
+showFixed chopTrailingZeros fa@(MkFixed a) = (show i) ++ (withDot (showIntegerZeros chopTrailingZeros digits fracNum)) where
+ res = resolution fa
+ (i,d) = divMod a res
+ -- enough digits to be unambiguous
+ digits = ceiling (logBase 10 (fromInteger res) :: Double)
+ maxnum = 10 ^ digits
+ -- read floors, so show must ceil for `read . show = id` to hold. See #9240
+ fracNum = divCeil (d * maxnum) res
+ divCeil x y = (x + y - 1) `div` y
+
+instance (HasResolution a) => Show (Fixed a) where
+ showsPrec p n = showParen (p > 6 && n < 0) $ showString $ showFixed False n
+
+instance (HasResolution a) => Read (Fixed a) where
+ readPrec = readNumber convertFixed
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+convertFixed :: forall a . HasResolution a => Lexeme -> ReadPrec (Fixed a)
+convertFixed (Number n)
+ | Just (i, f) <- numberToFixed e n =
+ return (fromInteger i + (fromInteger f / (10 ^ e)))
+ where r = resolution (Proxy :: Proxy a)
+ -- round 'e' up to help make the 'read . show == id' property
+ -- possible also for cases where 'resolution' is not a
+ -- power-of-10, such as e.g. when 'resolution = 128'
+ e = ceiling (logBase 10 (fromInteger r) :: Double)
+convertFixed _ = pfail
+
+data E0
+
+instance HasResolution E0 where
+ resolution _ = 1
+
+type Uni = Fixed E0
+
+data E1
+
+instance HasResolution E1 where
+ resolution _ = 10
+
+type Deci = Fixed E1
+
+data E2
+
+instance HasResolution E2 where
+ resolution _ = 100
+
+type Centi = Fixed E2
+
+data E3
+
+instance HasResolution E3 where
+ resolution _ = 1000
+
+type Milli = Fixed E3
+
+data E6
+
+instance HasResolution E6 where
+ resolution _ = 1000000
+
+type Micro = Fixed E6
+
+data E9
+
+instance HasResolution E9 where
+ resolution _ = 1000000000
+
+type Nano = Fixed E9
+
+data E12
+
+instance HasResolution E12 where
+ resolution _ = 1000000000000
+
+type Pico = Fixed E12
--- a/lib/Data/Float.hs
+++ b/lib/Data/Float.hs
@@ -13,7 +13,6 @@
import Data.Real
import Data.RealFloat
import Data.RealFrac
-import Text.Read
import Text.Show
-- XXX I should really implement newtype deriving...
@@ -57,8 +56,10 @@
instance Show Float where
showsPrec p = showsPrec p . unD
+{- in Text.Read.Internal
instance Read Float where
readsPrec p = map (\ (x, s) -> (D x, s)) . readsPrec p
+-}
instance Real Float where
toRational = toRational . unD
--- a/lib/Data/FloatW.hs
+++ b/lib/Data/FloatW.hs
@@ -12,6 +12,7 @@
import Data.Fractional
import Data.Function
import Data.Integer
+import Data.Integral
import Data.List
import Data.Ord
import Data.Ratio
@@ -20,8 +21,6 @@
import Data.RealFrac
import Data.Num
import Data.Word
-import Text.Read
-import Text.Read.Numeric
import Text.Show
--
@@ -66,8 +65,10 @@
instance Show FloatW where
show = primFloatWShow
+{- in Text.Read.Internal
instance Read FloatW where
readsPrec _ = readSigned $ \ r -> [ (primFloatWRead s, t) | (s@(c:_), t) <- lex r, isDigit c ]
+-}
instance Real FloatW where
toRational x | isNaN x = rationalNaN
@@ -77,7 +78,12 @@
(m, e) -> toRational m * 2^^e
instance RealFrac FloatW where
- properFraction _ = error "FloatW.properFraction not implemented"
+ properFraction x =
+ case decodeFloat x of
+ (m, e) -> -- x = m * 2^e
+ let m' | e < 0 = m `quot` 2^(-e)
+ | otherwise = m * 2^e
+ in (fromInteger m', x - fromInteger m')
instance Floating FloatW where
pi = 3.141592653589793
--- a/lib/Data/Foldable.hs
+++ b/lib/Data/Foldable.hs
@@ -49,6 +49,7 @@
import Data.Bool
import Data.Either
import Data.Eq
+import Data.Foldable.Internal
import Data.Function
import Data.Functor.Const
import Data.Functor.Identity
@@ -56,43 +57,11 @@
import qualified Data.List as List
import Data.Maybe
import Data.Monoid
+import Data.Monoid.Internal hiding (Max(..), Min(..))
import Data.Num
import Data.Ord
import Data.Proxy
-import Data.Semigroup
-newtype MMax a = MMax (Maybe a)
-getMMax :: forall a . MMax a -> Maybe a
-getMMax (MMax ma) = ma
-
-newtype MMin a = MMin (Maybe a)
-getMMin :: forall a . MMin a -> Maybe a
-getMMin (MMin ma) = ma
-
-instance forall a . Ord a => Semigroup (MMax a) where
- m <> MMax Nothing = m
- MMax Nothing <> n = n
- (MMax m@(Just x)) <> (MMax n@(Just y))
- | x >= y = MMax m
- | otherwise = MMax n
-
-instance forall a . Ord a => Monoid (MMax a) where
- mempty = MMax Nothing
- mconcat = List.foldl' (<>) mempty
-
-instance forall a . Ord a => Semigroup (MMin a) where
- m <> MMin Nothing = m
- MMin Nothing <> n = n
- (MMin m@(Just x)) <> (MMin n@(Just y))
- | x <= y = MMin m
- | otherwise = MMin n
-
-instance forall a . Ord a => Monoid (MMin a) where
- mempty = MMin Nothing
- mconcat = List.foldl' (<>) mempty
-
--------------------------------
-
infix 4 `elem`, `notElem`
class Foldable (t :: Type -> Type) where
@@ -155,11 +124,11 @@
maximum :: forall a . Ord a => t a -> a
maximum = fromMaybe (error "maximum: empty structure") .
- getMMax . foldMap' (MMax . Just)
+ getMax . foldMap' (Max . Just)
minimum :: forall a . Ord a => t a -> a
minimum = fromMaybe (error "minimum: empty structure") .
- getMMin . foldMap' (MMin . Just)
+ getMin . foldMap' (Min . Just)
sum :: forall a . Num a => t a -> a
sum = getSum . foldMap' Sum
@@ -329,6 +298,9 @@
-- | @since 4.12.0.0
instance (Foldable f) => Foldable (Ap f) where
foldMap f = foldMap f . getAp
+
+instance Foldable (Arg a) where
+ foldMap f (Arg _ a) = f a
-- Instances for GHC.Generics
-- | @since 4.9.0.0
--- /dev/null
+++ b/lib/Data/Foldable/Internal.hs
@@ -1,0 +1,88 @@
+module Data.Foldable.Internal(module Data.Foldable.Internal) where
+import Prelude()
+import Control.Applicative
+import Control.Monad
+import Data.Bool
+import Data.Function
+import Data.Functor
+import Data.Maybe_Type
+import Data.Monoid.Internal hiding (Max(..), Min(..))
+import Data.List
+import Data.Ord
+
+newtype Max a = Max (Maybe a)
+getMax :: forall a . Max a -> Maybe a
+getMax (Max ma) = ma
+
+newtype Min a = Min (Maybe a)
+getMin :: forall a . Min a -> Maybe a
+getMin (Min ma) = ma
+
+instance forall a . Ord a => Semigroup (Max a) where
+ m <> Max Nothing = m
+ Max Nothing <> n = n
+ (Max m@(Just x)) <> (Max n@(Just y))
+ | x >= y = Max m
+ | otherwise = Max n
+
+instance forall a . Ord a => Monoid (Max a) where
+ mempty = Max Nothing
+ mconcat = foldl' (<>) mempty
+
+instance forall a . Ord a => Semigroup (Min a) where
+ m <> Min Nothing = m
+ Min Nothing <> n = n
+ (Min m@(Just x)) <> (Min n@(Just y))
+ | x <= y = Min m
+ | otherwise = Min n
+
+instance forall a . Ord a => Monoid (Min a) where
+ mempty = Min Nothing
+ mconcat = foldl' (<>) mempty
+
+newtype StateL s a = StateL (s -> (s, a))
+runStateL :: StateL s a -> s -> (s, a)
+runStateL (StateL f) = f
+
+instance Functor (StateL s) where
+ fmap f (StateL k) = StateL $ \ s -> let (s', v) = k s in (s', f v)
+
+instance Applicative (StateL s) where
+ pure x = StateL (\ s -> (s, x))
+ StateL kf <*> StateL kv = StateL $ \ s ->
+ let (s', f) = kf s
+ (s'', v) = kv s'
+ in (s'', f v)
+
+newtype StateR s a = StateR (s -> (s, a))
+runStateR :: StateR s a -> s -> (s, a)
+runStateR (StateR f) = f
+
+instance Functor (StateR s) where
+ fmap f (StateR k) = StateR $ \ s -> let (s', v) = k s in (s', f v)
+
+instance Applicative (StateR s) where
+ pure x = StateR (\ s -> (s, x))
+ StateR kf <*> StateR kv = StateR $ \ s ->
+ let (s', v) = kv s
+ (s'', f) = kf s'
+ in (s'', f v)
+
+newtype StateT s m a = StateT (s -> m (s, a))
+runStateT :: StateT s m a -> s -> m (s, a)
+runStateT (StateT f) = f
+
+instance Monad m => Functor (StateT s m) where
+ fmap = liftM
+
+instance Monad m => Applicative (StateT s m) where
+ pure a = StateT $ \ s -> return (s, a)
+ StateT mf <*> StateT mx = StateT $ \ s -> do
+ (s', f) <- mf s
+ (s'', x) <- mx s'
+ return (s'', f x)
+
+instance (Monad m) => Monad (StateT s m) where
+ m >>= k = StateT $ \ s -> do
+ (s', a) <- runStateT m s
+ runStateT (k a) s'
--- /dev/null
+++ b/lib/Data/Foldable1.hs
@@ -1,0 +1,571 @@
+-- |
+-- Copyright: Edward Kmett, Oleg Grenrus
+-- License: BSD-3-Clause
+--
+-- A class of non-empty data structures that can be folded to a summary value.
+--
+-- @since 4.18.0.0
+
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE TypeOperators #-}
+
+module Data.Foldable1 (
+ Foldable1(..),
+ foldr1, foldr1',
+ foldl1, foldl1',
+ intercalate1,
+ foldrM1,
+ foldlM1,
+ foldrMapM1,
+ foldlMapM1,
+ maximumBy,
+ minimumBy,
+ ) where
+import Data.Foldable (Foldable, foldlM, foldr)
+import Data.List ([](..), foldl, foldl')
+import Data.List.NonEmpty (NonEmpty (..))
+import Data.Maybe
+import Data.Semigroup
+import Data.Tuple (Solo (..))
+import Prelude
+ (Maybe (..), Monad (..), Ord, Ordering (..), id, seq, ($!), ($), (.),
+ (=<<), flip, const, error)
+
+import qualified Data.List.NonEmpty as NE
+
+import Data.Complex (Complex (..))
+
+import Data.Ord (Down (..))
+
+import qualified Data.Monoid as Mon
+
+-- Instances
+import Data.Functor.Compose (Compose (..))
+import Data.Functor.Identity (Identity (..))
+
+import qualified Data.Functor.Product as Functor
+import qualified Data.Functor.Sum as Functor
+
+-- coerce
+--import GHC.Internal.Data.Coerce (Coercible, coerce)
+
+-- $setup
+-- >>> import Prelude hiding (foldr1, foldl1, head, last, minimum, maximum)
+
+-------------------------------------------------------------------------------
+-- Foldable1 type class
+-------------------------------------------------------------------------------
+
+-- | Non-empty data structures that can be folded.
+--
+-- @since 4.18.0.0
+class Foldable t => Foldable1 t where
+ {-# MINIMAL foldMap1 | foldrMap1 #-}
+
+ -- At some point during design it was possible to define this class using
+ -- only 'toNonEmpty'. But it seems a bad idea in general.
+ --
+ -- So currently we require either foldMap1 or foldrMap1
+ --
+ -- * foldMap1 defined using foldrMap1
+ -- * foldrMap1 defined using foldMap1
+ --
+ -- One can always define an instance using the following pattern:
+ --
+ -- toNonEmpty = ...
+ -- foldMap f = foldMap f . toNonEmpty
+ -- foldrMap1 f g = foldrMap1 f g . toNonEmpty
+
+ -- | Given a structure with elements whose type is a 'Semigroup', combine
+ -- them via the semigroup's @('<>')@ operator. This fold is
+ -- right-associative and lazy in the accumulator. When you need a strict
+ -- left-associative fold, use 'foldMap1'' instead, with 'id' as the map.
+ --
+ -- @since 4.18.0.0
+ fold1 :: Semigroup m => t m -> m
+ fold1 = foldMap1 id
+
+ -- | Map each element of the structure to a semigroup, and combine the
+ -- results with @('<>')@. This fold is right-associative and lazy in the
+ -- accumulator. For strict left-associative folds consider 'foldMap1''
+ -- instead.
+ --
+ -- >>> foldMap1 (:[]) (1 :| [2, 3, 4])
+ -- [1,2,3,4]
+ --
+ -- @since 4.18.0.0
+ foldMap1 :: Semigroup m => (a -> m) -> t a -> m
+ foldMap1 f = foldrMap1 f (\a m -> f a <> m)
+
+ -- | A left-associative variant of 'foldMap1' that is strict in the
+ -- accumulator. Use this for strict reduction when partial results are
+ -- merged via @('<>')@.
+ --
+ -- >>> foldMap1' Sum (1 :| [2, 3, 4])
+ -- Sum {getSum = 10}
+ --
+ -- @since 4.18.0.0
+ foldMap1' :: Semigroup m => (a -> m) -> t a -> m
+ foldMap1' f = foldlMap1' f (\m a -> m <> f a)
+
+ -- | 'NonEmpty' list of elements of a structure, from left to right.
+ --
+ -- >>> toNonEmpty (Identity 2)
+ -- 2 :| []
+ --
+ -- @since 4.18.0.0
+ toNonEmpty :: t a -> NonEmpty a
+ toNonEmpty = runNonEmptyDList . foldMap1 singleton
+
+ -- | The largest element of a non-empty structure.
+ --
+ -- >>> maximum (32 :| [64, 8, 128, 16])
+ -- 128
+ --
+ -- @since 4.18.0.0
+ maximum :: Ord a => t a -> a
+ maximum = getMax . foldMap1' Max
+
+ -- | The least element of a non-empty structure.
+ --
+ -- >>> minimum (32 :| [64, 8, 128, 16])
+ -- 8
+ --
+ -- @since 4.18.0.0
+ minimum :: Ord a => t a -> a
+ minimum = getMin . foldMap1' Min
+
+ -- | The first element of a non-empty structure.
+ --
+ -- >>> head (1 :| [2, 3, 4])
+ -- 1
+ --
+ -- @since 4.18.0.0
+ head :: t a -> a
+ head = getFirst . foldMap1 First
+
+ -- | The last element of a non-empty structure.
+ --
+ -- >>> last (1 :| [2, 3, 4])
+ -- 4
+ --
+ -- @since 4.18.0.0
+ last :: t a -> a
+ last = getLast . foldMap1 Last
+
+ -- | Right-associative fold of a structure, lazy in the accumulator.
+ --
+ -- In case of 'NonEmpty' lists, 'foldrMap1', when given a function @f@, a
+ -- binary operator @g@, and a list, reduces the list using @g@ from right to
+ -- left applying @f@ to the rightmost element:
+ --
+ -- > foldrMap1 f g (x1 :| [x2, ..., xn1, xn]) == x1 `g` (x2 `g` ... (xn1 `g` (f xn))...)
+ --
+ -- Note that since the head of the resulting expression is produced by
+ -- an application of @g@ to the first element of the list, if @g@ is lazy
+ -- in its right argument, 'foldrMap1' can produce a terminating expression
+ -- from an unbounded list.
+ --
+ -- For a general 'Foldable1' structure this should be semantically identical
+ -- to:
+ --
+ -- @foldrMap1 f g = foldrMap1 f g . 'toNonEmpty'@
+ --
+ -- @since 4.18.0.0
+ foldrMap1 :: (a -> b) -> (a -> b -> b) -> t a -> b
+ foldrMap1 f g xs =
+ appFromMaybe (foldMap1 (FromMaybe . h) xs) Nothing
+ where
+ h a Nothing = f a
+ h a (Just b) = g a b
+
+ -- | Left-associative fold of a structure but with strict application of the
+ -- operator.
+ --
+ -- This ensures that each step of the fold is forced to Weak Head Normal
+ -- Form before being applied, avoiding the collection of thunks that would
+ -- otherwise occur. This is often what you want to strictly reduce a
+ -- finite structure to a single strict result.
+ --
+ -- For a general 'Foldable1' structure this should be semantically identical
+ -- to:
+ --
+ -- @foldlMap1' f z = foldlMap1' f z . 'toNonEmpty'@
+ --
+ -- @since 4.18.0.0
+ foldlMap1' :: (a -> b) -> (b -> a -> b) -> t a -> b
+ foldlMap1' f g xs =
+ foldrMap1 f' g' xs SNothing
+ where
+ -- f' :: a -> SMaybe b -> b
+ f' a SNothing = f a
+ f' a (SJust b) = g b a
+
+ -- g' :: a -> (SMaybe b -> b) -> SMaybe b -> b
+ g' a x SNothing = x $! SJust (f a)
+ g' a x (SJust b) = x $! SJust (g b a)
+
+ -- | Left-associative fold of a structure, lazy in the accumulator. This is
+ -- rarely what you want, but can work well for structures with efficient
+ -- right-to-left sequencing and an operator that is lazy in its left
+ -- argument.
+ --
+ -- In case of 'NonEmpty' lists, 'foldlMap1', when given a function @f@, a
+ -- binary operator @g@, and a list, reduces the list using @g@ from left to
+ -- right applying @f@ to the leftmost element:
+ --
+ -- > foldlMap1 f g (x1 :| [x2, ..., xn]) == (...(((f x1) `g` x2) `g`...) `g` xn
+ --
+ -- Note that to produce the outermost application of the operator the entire
+ -- input list must be traversed. This means that 'foldlMap1' will diverge if
+ -- given an infinite list.
+ --
+ -- If you want an efficient strict left-fold, you probably want to use
+ -- 'foldlMap1'' instead of 'foldlMap1'. The reason for this is that the
+ -- latter does not force the /inner/ results (e.g. @(f x1) \`g\` x2@ in the
+ -- above example) before applying them to the operator (e.g. to
+ -- @(\`g\` x3)@). This results in a thunk chain \(O(n)\) elements long,
+ -- which then must be evaluated from the outside-in.
+ --
+ -- For a general 'Foldable1' structure this should be semantically identical
+ -- to:
+ --
+ -- @foldlMap1 f g = foldlMap1 f g . 'toNonEmpty'@
+ --
+ -- @since 4.18.0.0
+ foldlMap1 :: (a -> b) -> (b -> a -> b) -> t a -> b
+ foldlMap1 f g xs =
+ appFromMaybe (getDual (foldMap1 ((Dual . FromMaybe) . h) xs)) Nothing
+ where
+ h a Nothing = f a
+ h a (Just b) = g b a
+
+ -- | 'foldrMap1'' is a variant of 'foldrMap1' that performs strict reduction
+ -- from right to left, i.e. starting with the right-most element. The input
+ -- structure /must/ be finite, otherwise 'foldrMap1'' runs out of space
+ -- (/diverges/).
+ --
+ -- If you want a strict right fold in constant space, you need a structure
+ -- that supports faster than \(O(n)\) access to the right-most element.
+ --
+ -- This method does not run in constant space for structures such as
+ -- 'NonEmpty' lists that don't support efficient right-to-left iteration and
+ -- so require \(O(n)\) space to perform right-to-left reduction. Use of this
+ -- method with such a structure is a hint that the chosen structure may be a
+ -- poor fit for the task at hand. If the order in which the elements are
+ -- combined is not important, use 'foldlMap1'' instead.
+ --
+ -- @since 4.18.0.0
+ foldrMap1' :: (a -> b) -> (a -> b -> b) -> t a -> b
+ foldrMap1' f g xs =
+ foldlMap1 f' g' xs SNothing
+ where
+ f' a SNothing = f a
+ f' a (SJust b) = g a b
+
+ g' bb a SNothing = bb $! SJust (f a)
+ g' bb a (SJust b) = bb $! SJust (g a b)
+
+-------------------------------------------------------------------------------
+-- Combinators
+-------------------------------------------------------------------------------
+
+-- | A variant of 'foldrMap1' where the rightmost element maps to itself.
+--
+-- @since 4.18.0.0
+foldr1 :: Foldable1 t => (a -> a -> a) -> t a -> a
+foldr1 = foldrMap1 id
+{-# INLINE foldr1 #-}
+
+-- | A variant of 'foldrMap1'' where the rightmost element maps to itself.
+--
+-- @since 4.18.0.0
+foldr1' :: Foldable1 t => (a -> a -> a) -> t a -> a
+foldr1' = foldrMap1' id
+{-# INLINE foldr1' #-}
+
+-- | A variant of 'foldlMap1' where the leftmost element maps to itself.
+--
+-- @since 4.18.0.0
+foldl1 :: Foldable1 t => (a -> a -> a) -> t a -> a
+foldl1 = foldlMap1 id
+{-# INLINE foldl1 #-}
+
+-- | A variant of 'foldlMap1'' where the leftmost element maps to itself.
+--
+-- @since 4.18.0.0
+foldl1' :: Foldable1 t => (a -> a -> a) -> t a -> a
+foldl1' = foldlMap1' id
+{-# INLINE foldl1' #-}
+
+-- | Insert an @m@ between each pair of @t m@.
+--
+-- >>> intercalate1 ", " $ "hello" :| ["how", "are", "you"]
+-- "hello, how, are, you"
+--
+-- >>> intercalate1 ", " $ "hello" :| []
+-- "hello"
+--
+-- >>> intercalate1 mempty $ "I" :| ["Am", "Fine", "You?"]
+-- "IAmFineYou?"
+--
+-- @since 4.18.0.0
+intercalate1 :: (Foldable1 t, Semigroup m) => m -> t m -> m
+intercalate1 = flip intercalateMap1 id
+
+intercalateMap1 :: (Foldable1 t, Semigroup m) => m -> (a -> m) -> t a -> m
+intercalateMap1 j f = flip joinee j . foldMap1 (JoinWith . const . f)
+
+-- | Monadic fold over the elements of a non-empty structure,
+-- associating to the right, i.e. from right to left.
+--
+-- @since 4.18.0.0
+foldrM1 :: (Foldable1 t, Monad m) => (a -> a -> m a) -> t a -> m a
+foldrM1 = foldrMapM1 return
+
+-- | Map variant of 'foldrM1'.
+--
+-- @since 4.18.0.0
+foldrMapM1 :: (Foldable1 t, Monad m) => (a -> m b) -> (a -> b -> m b) -> t a -> m b
+foldrMapM1 g f = go . toNonEmpty
+ where
+ go (e:|es) =
+ case es of
+ [] -> g e
+ x:xs -> f e =<< go (x:|xs)
+
+-- | Monadic fold over the elements of a non-empty structure,
+-- associating to the left, i.e. from left to right.
+--
+-- @since 4.18.0.0
+foldlM1 :: (Foldable1 t, Monad m) => (a -> a -> m a) -> t a -> m a
+foldlM1 = foldlMapM1 return
+
+-- | Map variant of 'foldlM1'.
+--
+-- @since 4.18.0.0
+foldlMapM1 :: (Foldable1 t, Monad m) => (a -> m b) -> (b -> a -> m b) -> t a -> m b
+foldlMapM1 g f t = g x >>= \y -> foldlM f y xs
+ where x:|xs = toNonEmpty t
+
+-- | The largest element of a non-empty structure with respect to the
+-- given comparison function.
+--
+-- @since 4.18.0.0
+maximumBy :: Foldable1 t => (a -> a -> Ordering) -> t a -> a
+maximumBy cmp = foldl1' max'
+ where max' x y = case cmp x y of
+ GT -> x
+ _ -> y
+
+-- | The least element of a non-empty structure with respect to the
+-- given comparison function.
+--
+-- @since 4.18.0.0
+minimumBy :: Foldable1 t => (a -> a -> Ordering) -> t a -> a
+minimumBy cmp = foldl1' min'
+ where min' x y = case cmp x y of
+ GT -> y
+ _ -> x
+
+-------------------------------------------------------------------------------
+-- Auxiliary types
+-------------------------------------------------------------------------------
+
+-- | Used for default toNonEmpty implementation.
+newtype NonEmptyDList a = NEDL { unNEDL :: [a] -> NonEmpty a }
+
+instance Semigroup (NonEmptyDList a) where
+ xs <> ys = NEDL (unNEDL xs . NE.toList . unNEDL ys)
+ {-# INLINE (<>) #-}
+
+-- | Create dlist with a single element
+singleton :: a -> NonEmptyDList a
+singleton = NEDL . (:|)
+
+-- | Convert a dlist to a non-empty list
+runNonEmptyDList :: NonEmptyDList a -> NonEmpty a
+runNonEmptyDList = ($ []) . unNEDL
+{-# INLINE runNonEmptyDList #-}
+
+-- | Used for foldrMap1 and foldlMap1 definitions
+newtype FromMaybe b = FromMaybe { appFromMaybe :: Maybe b -> b }
+
+instance Semigroup (FromMaybe b) where
+ FromMaybe f <> FromMaybe g = FromMaybe (f . Just . g)
+
+-- | Strict maybe, used to implement default foldlMap1' etc.
+data SMaybe a = SNothing | SJust !a
+
+-- | Used to implement intercalate1/Map
+newtype JoinWith a = JoinWith {joinee :: (a -> a)}
+
+instance Semigroup a => Semigroup (JoinWith a) where
+ JoinWith a <> JoinWith b = JoinWith $ \j -> a j <> j <> b j
+
+-------------------------------------------------------------------------------
+-- Instances for misc base types
+-------------------------------------------------------------------------------
+
+-- | @since 4.18.0.0
+instance Foldable1 NonEmpty where
+ foldMap1 f (x :| xs) = go (f x) xs where
+ go y [] = y
+ go y (z : zs) = y <> go (f z) zs
+
+ foldMap1' f (x :| xs) = foldl' (\m y -> m <> f y) (f x) xs
+
+ toNonEmpty = id
+
+ foldrMap1 g f (x :| xs) = go x xs where
+ go y [] = g y
+ go y (z : zs) = f y (go z zs)
+
+ foldlMap1 g f (x :| xs) = foldl f (g x) xs
+ foldlMap1' g f (x :| xs) = let gx = g x in gx `seq` foldl' f gx xs
+
+ head = NE.head
+ last = NE.last
+
+{-
+-- | @since 4.18.0.0
+instance Foldable1 Down where
+ foldMap1 = coerce
+
+-- | @since 4.18.0.0
+instance Foldable1 Complex where
+ foldMap1 f (x :+ y) = f x <> f y
+
+ toNonEmpty (x :+ y) = x :| y : []
+
+-------------------------------------------------------------------------------
+-- Instances for tuples
+-------------------------------------------------------------------------------
+
+-- 3+ tuples are not Foldable/Traversable
+
+-- | @since 4.18.0.0
+instance Foldable1 Solo where
+ foldMap1 f (MkSolo y) = f y
+ toNonEmpty (MkSolo x) = x :| []
+ minimum (MkSolo x) = x
+ maximum (MkSolo x) = x
+ head (MkSolo x) = x
+ last (MkSolo x) = x
+
+-- | @since 4.18.0.0
+instance Foldable1 ((,) a) where
+ foldMap1 f (_, y) = f y
+ toNonEmpty (_, x) = x :| []
+ minimum (_, x) = x
+ maximum (_, x) = x
+ head (_, x) = x
+ last (_, x) = x
+-}
+
+-------------------------------------------------------------------------------
+-- Monoid / Semigroup instances
+-------------------------------------------------------------------------------
+
+{-
+-- | @since 4.18.0.0
+instance Foldable1 Dual where
+ foldMap1 = coerce
+
+-- | @since 4.18.0.0
+instance Foldable1 Sum where
+ foldMap1 = coerce
+
+-- | @since 4.18.0.0
+instance Foldable1 Product where
+ foldMap1 = coerce
+
+-- | @since 4.18.0.0
+instance Foldable1 Min where
+ foldMap1 = coerce
+
+-- | @since 4.18.0.0
+instance Foldable1 Max where
+ foldMap1 = coerce
+
+-- | @since 4.18.0.0
+instance Foldable1 First where
+ foldMap1 = coerce
+
+-- | @since 4.18.0.0
+instance Foldable1 Last where
+ foldMap1 = coerce
+
+-- | @since 4.18.0.0
+deriving instance (Foldable1 f) => Foldable1 (Mon.Alt f)
+
+-- | @since 4.18.0.0
+deriving instance (Foldable1 f) => Foldable1 (Mon.Ap f)
+-}
+
+-------------------------------------------------------------------------------
+-- Extra instances
+-------------------------------------------------------------------------------
+
+{-
+-- | @since 4.18.0.0
+instance Foldable1 Identity where
+ foldMap1 = coerce
+
+ foldrMap1 g _ = coerce g
+ foldrMap1' g _ = coerce g
+ foldlMap1 g _ = coerce g
+ foldlMap1' g _ = coerce g
+
+ toNonEmpty (Identity x) = x :| []
+
+ last = coerce
+ head = coerce
+ minimum = coerce
+ maximum = coerce
+-}
+
+-- | It would be enough for either half of a product to be 'Foldable1'.
+-- Other could be 'Foldable'.
+instance (Foldable1 f, Foldable1 g) => Foldable1 (Functor.Product f g) where
+ foldMap1 f (Functor.Pair x y) = foldMap1 f x <> foldMap1 f y
+ foldrMap1 g f (Functor.Pair x y) = foldr f (foldrMap1 g f y) x
+
+ head (Functor.Pair x _) = head x
+ last (Functor.Pair _ y) = last y
+
+-- | @since 4.18.0.0
+instance (Foldable1 f, Foldable1 g) => Foldable1 (Functor.Sum f g) where
+ foldMap1 f (Functor.InL x) = foldMap1 f x
+ foldMap1 f (Functor.InR y) = foldMap1 f y
+
+ foldrMap1 g f (Functor.InL x) = foldrMap1 g f x
+ foldrMap1 g f (Functor.InR y) = foldrMap1 g f y
+
+ toNonEmpty (Functor.InL x) = toNonEmpty x
+ toNonEmpty (Functor.InR y) = toNonEmpty y
+
+ head (Functor.InL x) = head x
+ head (Functor.InR y) = head y
+ last (Functor.InL x) = last x
+ last (Functor.InR y) = last y
+
+ minimum (Functor.InL x) = minimum x
+ minimum (Functor.InR y) = minimum y
+ maximum (Functor.InL x) = maximum x
+ maximum (Functor.InR y) = maximum y
+
+-- | @since 4.18.0.0
+instance (Foldable1 f, Foldable1 g) => Foldable1 (Compose f g) where
+ foldMap1 f = foldMap1 (foldMap1 f) . getCompose
+
+ foldrMap1 f g = foldrMap1 (foldrMap1 f g) (\xs x -> foldr g x xs) . getCompose
+
+ head = head . head . getCompose
+ last = last . last . getCompose
--- a/lib/Data/Functor.hs
+++ b/lib/Data/Functor.hs
@@ -1,4 +1,11 @@
-module Data.Functor(module Data.Functor) where
+module Data.Functor(
+ Functor(..),
+ ($>),
+ (<$>),
+ (<&>),
+ unzip,
+ void,
+ ) where
import Prelude() -- do not import Prelude
import Primitives -- for fixity
import Data.Function
@@ -11,6 +18,18 @@
infixl 4 <$>
(<$>) :: forall f a b . Functor f => (a -> b) -> f a -> f b
(<$>) = fmap
+
+infixl 1 <&>
+(<&>) :: Functor f => f a -> (a -> b) -> f b
+(<&>) = flip (<$>)
+
+infixl 4 $>
+($>) :: Functor f => f a -> b -> f b
+($>) = flip (<$)
+
+unzip :: Functor f => f (a, b) -> (f a, f b)
+unzip xs = ( (\(a,_)->a) <$> xs,
+ (\(_,b)->b) <$> xs )
void :: forall f a . Functor f => f a -> f ()
void = fmap (const ())
--- /dev/null
+++ b/lib/Data/Functor/Classes.hs
@@ -1,0 +1,559 @@
+module Data.Functor.Classes (
+ -- * Liftings of Prelude classes
+ -- ** For unary constructors
+ Eq1(..), eq1,
+ Ord1(..), compare1,
+ Read1(..), readsPrec1, readPrec1,
+ liftReadListDefault, liftReadListPrecDefault,
+ Show1(..), showsPrec1,
+ -- ** For binary constructors
+ Eq2(..), eq2,
+ Ord2(..), compare2,
+ Read2(..), readsPrec2, readPrec2,
+ liftReadList2Default, liftReadListPrec2Default,
+ Show2(..), showsPrec2,
+ -- * Helper functions
+ readsData, readData,
+ readsUnaryWith, readUnaryWith,
+ readsBinaryWith, readBinaryWith,
+ showsUnaryWith,
+ showsBinaryWith,
+ ) where
+
+import Control.Applicative (Alternative((<|>)), Const(Const))
+import Data.Functor.Identity (Identity(Identity))
+import Data.Proxy (Proxy(Proxy))
+import Data.List.NonEmpty (NonEmpty(..))
+--import Data.Ord (Down(Down))
+import Data.Complex (Complex((:+)))
+import Data.Tuple (Solo (..))
+
+import Text.Read
+import Text.Read.Internal
+import Text.Show (showListWith)
+
+class Eq1 f where
+ liftEq :: (a -> b -> Bool) -> f a -> f b -> Bool
+
+eq1 :: (Eq1 f, Eq a) => f a -> f a -> Bool
+eq1 = liftEq (==)
+
+class (Eq1 f) => Ord1 f where
+ liftCompare :: (a -> b -> Ordering) -> f a -> f b -> Ordering
+
+compare1 :: (Ord1 f, Ord a) => f a -> f a -> Ordering
+compare1 = liftCompare compare
+
+class Read1 f where
+ liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (f a)
+ liftReadsPrec rp rl = readPrec_to_S $
+ liftReadPrec (readS_to_Prec rp) (readS_to_Prec (const rl))
+
+ liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [f a]
+ liftReadList rp rl = readPrec_to_S
+ (list $ liftReadPrec (readS_to_Prec rp) (readS_to_Prec (const rl))) 0
+
+ liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec (f a)
+ liftReadPrec rp rl = readS_to_Prec $
+ liftReadsPrec (readPrec_to_S rp) (readPrec_to_S rl 0)
+
+ liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [f a]
+ liftReadListPrec rp rl = readS_to_Prec $ \_ ->
+ liftReadList (readPrec_to_S rp) (readPrec_to_S rl 0)
+
+readsPrec1 :: (Read1 f, Read a) => Int -> ReadS (f a)
+readsPrec1 = liftReadsPrec readsPrec readList
+
+readPrec1 :: (Read1 f, Read a) => ReadPrec (f a)
+readPrec1 = liftReadPrec readPrec readListPrec
+
+liftReadListDefault :: Read1 f => (Int -> ReadS a) -> ReadS [a] -> ReadS [f a]
+liftReadListDefault rp rl = readPrec_to_S
+ (liftReadListPrec (readS_to_Prec rp) (readS_to_Prec (const rl))) 0
+
+liftReadListPrecDefault :: Read1 f => ReadPrec a -> ReadPrec [a]
+ -> ReadPrec [f a]
+liftReadListPrecDefault rp rl = list (liftReadPrec rp rl)
+
+class Show1 f where
+ liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) ->
+ Int -> f a -> ShowS
+ liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) ->
+ [f a] -> ShowS
+ liftShowList sp sl = showListWith (liftShowsPrec sp sl 0)
+
+showsPrec1 :: (Show1 f, Show a) => Int -> f a -> ShowS
+showsPrec1 = liftShowsPrec showsPrec showList
+
+class Eq2 f where
+ liftEq2 :: (a -> b -> Bool) -> (c -> d -> Bool) -> f a c -> f b d -> Bool
+
+eq2 :: (Eq2 f, Eq a, Eq b) => f a b -> f a b -> Bool
+eq2 = liftEq2 (==) (==)
+
+class (Eq2 f) => Ord2 f where
+ liftCompare2 :: (a -> b -> Ordering) -> (c -> d -> Ordering) ->
+ f a c -> f b d -> Ordering
+
+compare2 :: (Ord2 f, Ord a, Ord b) => f a b -> f a b -> Ordering
+compare2 = liftCompare2 compare compare
+
+class Read2 f where
+ liftReadsPrec2 :: (Int -> ReadS a) -> ReadS [a] ->
+ (Int -> ReadS b) -> ReadS [b] -> Int -> ReadS (f a b)
+ liftReadsPrec2 rp1 rl1 rp2 rl2 = readPrec_to_S $
+ liftReadPrec2 (readS_to_Prec rp1) (readS_to_Prec (const rl1))
+ (readS_to_Prec rp2) (readS_to_Prec (const rl2))
+
+ liftReadList2 :: (Int -> ReadS a) -> ReadS [a] ->
+ (Int -> ReadS b) -> ReadS [b] -> ReadS [f a b]
+ liftReadList2 rp1 rl1 rp2 rl2 = readPrec_to_S
+ (list $ liftReadPrec2 (readS_to_Prec rp1) (readS_to_Prec (const rl1))
+ (readS_to_Prec rp2) (readS_to_Prec (const rl2))) 0
+
+ liftReadPrec2 :: ReadPrec a -> ReadPrec [a] ->
+ ReadPrec b -> ReadPrec [b] -> ReadPrec (f a b)
+ liftReadPrec2 rp1 rl1 rp2 rl2 = readS_to_Prec $
+ liftReadsPrec2 (readPrec_to_S rp1) (readPrec_to_S rl1 0)
+ (readPrec_to_S rp2) (readPrec_to_S rl2 0)
+
+ liftReadListPrec2 :: ReadPrec a -> ReadPrec [a] ->
+ ReadPrec b -> ReadPrec [b] -> ReadPrec [f a b]
+ liftReadListPrec2 rp1 rl1 rp2 rl2 = readS_to_Prec $ \_ ->
+ liftReadList2 (readPrec_to_S rp1) (readPrec_to_S rl1 0)
+ (readPrec_to_S rp2) (readPrec_to_S rl2 0)
+
+readsPrec2 :: (Read2 f, Read a, Read b) => Int -> ReadS (f a b)
+readsPrec2 = liftReadsPrec2 readsPrec readList readsPrec readList
+
+readPrec2 :: (Read2 f, Read a, Read b) => ReadPrec (f a b)
+readPrec2 = liftReadPrec2 readPrec readListPrec readPrec readListPrec
+
+liftReadList2Default :: Read2 f => (Int -> ReadS a) -> ReadS [a] ->
+ (Int -> ReadS b) -> ReadS [b] ->ReadS [f a b]
+liftReadList2Default rp1 rl1 rp2 rl2 = readPrec_to_S
+ (liftReadListPrec2 (readS_to_Prec rp1) (readS_to_Prec (const rl1))
+ (readS_to_Prec rp2) (readS_to_Prec (const rl2))) 0
+
+liftReadListPrec2Default :: Read2 f => ReadPrec a -> ReadPrec [a] ->
+ ReadPrec b -> ReadPrec [b] -> ReadPrec [f a b]
+liftReadListPrec2Default rp1 rl1 rp2 rl2 = list (liftReadPrec2 rp1 rl1 rp2 rl2)
+
+class Show2 f where
+ liftShowsPrec2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) ->
+ (Int -> b -> ShowS) -> ([b] -> ShowS) -> Int -> f a b -> ShowS
+
+ liftShowList2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) ->
+ (Int -> b -> ShowS) -> ([b] -> ShowS) -> [f a b] -> ShowS
+ liftShowList2 sp1 sl1 sp2 sl2 =
+ showListWith (liftShowsPrec2 sp1 sl1 sp2 sl2 0)
+
+showsPrec2 :: (Show2 f, Show a, Show b) => Int -> f a b -> ShowS
+showsPrec2 = liftShowsPrec2 showsPrec showList showsPrec showList
+
+instance Eq1 Maybe where
+ liftEq _ Nothing Nothing = True
+ liftEq _ Nothing (Just _) = False
+ liftEq _ (Just _) Nothing = False
+ liftEq eq (Just x) (Just y) = eq x y
+
+instance Ord1 Maybe where
+ liftCompare _ Nothing Nothing = EQ
+ liftCompare _ Nothing (Just _) = LT
+ liftCompare _ (Just _) Nothing = GT
+ liftCompare comp (Just x) (Just y) = comp x y
+
+instance Read1 Maybe where
+ liftReadPrec rp _ =
+ parens (expectP (Ident "Nothing") *> pure Nothing)
+ <|>
+ readData (readUnaryWith rp "Just" Just)
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+
+instance Show1 Maybe where
+ liftShowsPrec _ _ _ Nothing = showString "Nothing"
+ liftShowsPrec sp _ d (Just x) = showsUnaryWith sp "Just" d x
+
+instance Eq1 [] where
+ liftEq _ [] [] = True
+ liftEq _ [] (_:_) = False
+ liftEq _ (_:_) [] = False
+ liftEq eq (x:xs) (y:ys) = eq x y && liftEq eq xs ys
+
+instance Ord1 [] where
+ liftCompare _ [] [] = EQ
+ liftCompare _ [] (_:_) = LT
+ liftCompare _ (_:_) [] = GT
+ liftCompare comp (x:xs) (y:ys) = comp x y `mappend` liftCompare comp xs ys
+
+instance Read1 [] where
+ liftReadPrec _ rl = rl
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+
+instance Show1 [] where
+ liftShowsPrec _ sl _ = sl
+
+instance Eq1 NonEmpty where
+ liftEq eq (a :| as) (b :| bs) = eq a b && liftEq eq as bs
+
+instance Ord1 NonEmpty where
+ liftCompare cmp (a :| as) (b :| bs) = cmp a b `mappend` liftCompare cmp as bs
+
+instance Read1 NonEmpty where
+ liftReadsPrec rdP rdL p s = readParen (p > 5) (\s' -> do
+ (a, s'') <- rdP 6 s'
+ (":|", s''') <- lex s''
+ (as, s'''') <- rdL s'''
+ return (a :| as, s'''')) s
+
+instance Show1 NonEmpty where
+ liftShowsPrec shwP shwL p (a :| as) = showParen (p > 5) $
+ shwP 6 a . showString " :| " . shwL as
+
+instance Eq2 (,) where
+ liftEq2 e1 e2 (x1, y1) (x2, y2) = e1 x1 x2 && e2 y1 y2
+
+instance Ord2 (,) where
+ liftCompare2 comp1 comp2 (x1, y1) (x2, y2) =
+ comp1 x1 x2 `mappend` comp2 y1 y2
+
+instance Read2 (,) where
+ liftReadPrec2 rp1 _ rp2 _ = parens $ paren $ do
+ x <- rp1
+ expectP (Punc ",")
+ y <- rp2
+ return (x,y)
+
+ liftReadListPrec2 = liftReadListPrec2Default
+ liftReadList2 = liftReadList2Default
+
+instance Show2 (,) where
+ liftShowsPrec2 sp1 _ sp2 _ _ (x, y) =
+ showChar '(' . sp1 0 x . showChar ',' . sp2 0 y . showChar ')'
+
+instance Eq1 Solo where
+ liftEq eq (MkSolo a) (MkSolo b) = a `eq` b
+
+instance (Eq a) => Eq1 ((,) a) where
+ liftEq = liftEq2 (==)
+
+instance Ord1 Solo where
+ liftCompare cmp (MkSolo a) (MkSolo b) = cmp a b
+
+instance (Ord a) => Ord1 ((,) a) where
+ liftCompare = liftCompare2 compare
+
+instance Read1 Solo where
+ liftReadPrec rp _ = readData (readUnaryWith rp "Solo" MkSolo)
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+
+instance (Read a) => Read1 ((,) a) where
+ liftReadPrec = liftReadPrec2 readPrec readListPrec
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+
+instance Show1 Solo where
+ liftShowsPrec sp _ d (MkSolo x) = showsUnaryWith sp "MkSolo" d x
+
+instance (Show a) => Show1 ((,) a) where
+ liftShowsPrec = liftShowsPrec2 showsPrec showList
+
+instance Eq a => Eq2 ((,,) a) where
+ liftEq2 e1 e2 (u1, x1, y1) (v1, x2, y2) =
+ u1 == v1 &&
+ e1 x1 x2 && e2 y1 y2
+
+instance Ord a => Ord2 ((,,) a) where
+ liftCompare2 comp1 comp2 (u1, x1, y1) (v1, x2, y2) =
+ compare u1 v1 `mappend`
+ comp1 x1 x2 `mappend` comp2 y1 y2
+
+instance Read a => Read2 ((,,) a) where
+ liftReadPrec2 rp1 _ rp2 _ = parens $ paren $ do
+ x1 <- readPrec
+ expectP (Punc ",")
+ y1 <- rp1
+ expectP (Punc ",")
+ y2 <- rp2
+ return (x1,y1,y2)
+
+ liftReadListPrec2 = liftReadListPrec2Default
+ liftReadList2 = liftReadList2Default
+
+instance Show a => Show2 ((,,) a) where
+ liftShowsPrec2 sp1 _ sp2 _ _ (x1,y1,y2)
+ = showChar '(' . showsPrec 0 x1
+ . showChar ',' . sp1 0 y1
+ . showChar ',' . sp2 0 y2
+ . showChar ')'
+
+instance (Eq a, Eq b) => Eq1 ((,,) a b) where
+ liftEq = liftEq2 (==)
+
+instance (Ord a, Ord b) => Ord1 ((,,) a b) where
+ liftCompare = liftCompare2 compare
+
+instance (Read a, Read b) => Read1 ((,,) a b) where
+ liftReadPrec = liftReadPrec2 readPrec readListPrec
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+
+instance (Show a, Show b) => Show1 ((,,) a b) where
+ liftShowsPrec = liftShowsPrec2 showsPrec showList
+
+instance (Eq a, Eq b) => Eq2 ((,,,) a b) where
+ liftEq2 e1 e2 (u1, u2, x1, y1) (v1, v2, x2, y2) =
+ u1 == v1 &&
+ u2 == v2 &&
+ e1 x1 x2 && e2 y1 y2
+
+instance (Ord a, Ord b) => Ord2 ((,,,) a b) where
+ liftCompare2 comp1 comp2 (u1, u2, x1, y1) (v1, v2, x2, y2) =
+ compare u1 v1 `mappend`
+ compare u2 v2 `mappend`
+ comp1 x1 x2 `mappend` comp2 y1 y2
+
+instance (Read a, Read b) => Read2 ((,,,) a b) where
+ liftReadPrec2 rp1 _ rp2 _ = parens $ paren $ do
+ x1 <- readPrec
+ expectP (Punc ",")
+ x2 <- readPrec
+ expectP (Punc ",")
+ y1 <- rp1
+ expectP (Punc ",")
+ y2 <- rp2
+ return (x1,x2,y1,y2)
+
+ liftReadListPrec2 = liftReadListPrec2Default
+ liftReadList2 = liftReadList2Default
+
+instance (Show a, Show b) => Show2 ((,,,) a b) where
+ liftShowsPrec2 sp1 _ sp2 _ _ (x1,x2,y1,y2)
+ = showChar '(' . showsPrec 0 x1
+ . showChar ',' . showsPrec 0 x2
+ . showChar ',' . sp1 0 y1
+ . showChar ',' . sp2 0 y2
+ . showChar ')'
+
+instance (Eq a, Eq b, Eq c) => Eq1 ((,,,) a b c) where
+ liftEq = liftEq2 (==)
+
+instance (Ord a, Ord b, Ord c) => Ord1 ((,,,) a b c) where
+ liftCompare = liftCompare2 compare
+
+instance (Read a, Read b, Read c) => Read1 ((,,,) a b c) where
+ liftReadPrec = liftReadPrec2 readPrec readListPrec
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+
+instance (Show a, Show b, Show c) => Show1 ((,,,) a b c) where
+ liftShowsPrec = liftShowsPrec2 showsPrec showList
+
+{-
+instance (Generic1 f, Eq1 (Rep1 f)) => Eq1 (Generically1 f) where
+ liftEq :: (a1 -> a2 -> Bool) -> (Generically1 f a1 -> Generically1 f a2 -> Bool)
+ liftEq (===) (Generically1 as1) (Generically1 as2) = liftEq (===) (from1 as1) (from1 as2)
+
+instance (Generic1 f, Ord1 (Rep1 f)) => Ord1 (Generically1 f) where
+ liftCompare :: (a1 -> a2 -> Ordering) -> (Generically1 f a1 -> Generically1 f a2 -> Ordering)
+ liftCompare cmp (Generically1 as1) (Generically1 as2) = liftCompare cmp (from1 as1) (from1 as2)
+-}
+
+instance Eq2 Either where
+ liftEq2 e1 _ (Left x) (Left y) = e1 x y
+ liftEq2 _ _ (Left _) (Right _) = False
+ liftEq2 _ _ (Right _) (Left _) = False
+ liftEq2 _ e2 (Right x) (Right y) = e2 x y
+
+instance Ord2 Either where
+ liftCompare2 comp1 _ (Left x) (Left y) = comp1 x y
+ liftCompare2 _ _ (Left _) (Right _) = LT
+ liftCompare2 _ _ (Right _) (Left _) = GT
+ liftCompare2 _ comp2 (Right x) (Right y) = comp2 x y
+
+instance Read2 Either where
+ liftReadPrec2 rp1 _ rp2 _ = readData $
+ readUnaryWith rp1 "Left" Left <|>
+ readUnaryWith rp2 "Right" Right
+
+ liftReadListPrec2 = liftReadListPrec2Default
+ liftReadList2 = liftReadList2Default
+
+instance Show2 Either where
+ liftShowsPrec2 sp1 _ _ _ d (Left x) = showsUnaryWith sp1 "Left" d x
+ liftShowsPrec2 _ _ sp2 _ d (Right x) = showsUnaryWith sp2 "Right" d x
+
+instance (Eq a) => Eq1 (Either a) where
+ liftEq = liftEq2 (==)
+
+instance (Ord a) => Ord1 (Either a) where
+ liftCompare = liftCompare2 compare
+
+instance (Read a) => Read1 (Either a) where
+ liftReadPrec = liftReadPrec2 readPrec readListPrec
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+
+instance (Show a) => Show1 (Either a) where
+ liftShowsPrec = liftShowsPrec2 showsPrec showList
+
+instance Eq1 Identity where
+ liftEq eq (Identity x) (Identity y) = eq x y
+
+instance Ord1 Identity where
+ liftCompare comp (Identity x) (Identity y) = comp x y
+
+{-
+instance Read1 Identity where
+ liftReadPrec rp _ = readData $
+ readUnaryWith rp "Identity" Identity
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+-}
+
+instance Show1 Identity where
+ liftShowsPrec sp _ d (Identity x) = showsUnaryWith sp "Identity" d x
+
+instance Eq2 Const where
+ liftEq2 eq _ (Const x) (Const y) = eq x y
+
+instance Ord2 Const where
+ liftCompare2 comp _ (Const x) (Const y) = comp x y
+
+{-
+instance Read2 Const where
+ liftReadPrec2 rp _ _ _ = readData $
+ readUnaryWith rp "Const" Const
+
+ liftReadListPrec2 = liftReadListPrec2Default
+ liftReadList2 = liftReadList2Default
+-}
+
+instance Show2 Const where
+ liftShowsPrec2 sp _ _ _ d (Const x) = showsUnaryWith sp "Const" d x
+
+instance (Eq a) => Eq1 (Const a) where
+ liftEq = liftEq2 (==)
+
+instance (Ord a) => Ord1 (Const a) where
+ liftCompare = liftCompare2 compare
+
+{-
+instance (Read a) => Read1 (Const a) where
+ liftReadPrec = liftReadPrec2 readPrec readListPrec
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+-}
+
+instance (Show a) => Show1 (Const a) where
+ liftShowsPrec = liftShowsPrec2 showsPrec showList
+
+instance Eq1 Proxy where
+ liftEq _ _ _ = True
+
+instance Ord1 Proxy where
+ liftCompare _ _ _ = EQ
+
+instance Show1 Proxy where
+ liftShowsPrec _ _ _ _ = showString "Proxy"
+
+{-
+instance Read1 Proxy where
+ liftReadPrec _ _ = parens (expectP (Ident "Proxy") *> pure Proxy)
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+-}
+
+{-
+instance Eq1 Down where
+ liftEq eq (Down x) (Down y) = eq x y
+
+instance Ord1 Down where
+ liftCompare comp (Down x) (Down y) = case comp x y of
+ LT -> GT
+ EQ -> EQ
+ GT -> LT
+
+{-
+instance Read1 Down where
+ liftReadsPrec rp _ = readsData $
+ readsUnaryWith rp "Down" Down
+-}
+
+instance Show1 Down where
+ liftShowsPrec sp _ d (Down x) = showsUnaryWith sp "Down" d x
+-}
+
+instance Eq1 Complex where
+ liftEq eq (x :+ y) (u :+ v) = eq x u && eq y v
+
+{-
+instance Read1 Complex where
+ liftReadPrec rp _ = parens $ prec complexPrec $ do
+ x <- step rp
+ expectP (Symbol ":+")
+ y <- step rp
+ return (x :+ y)
+ where
+ complexPrec = 6
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+-}
+
+instance Show1 Complex where
+ liftShowsPrec sp _ d (x :+ y) = showParen (d > complexPrec) $
+ sp (complexPrec+1) x . showString " :+ " . sp (complexPrec+1) y
+ where
+ complexPrec = 6
+
+readsData :: (String -> ReadS a) -> Int -> ReadS a
+readsData reader d =
+ readParen (d > 10) $ \ r -> [res | (kw,s) <- lex r, res <- reader kw s]
+
+readData :: ReadPrec a -> ReadPrec a
+readData reader = parens $ prec 10 reader
+
+readsUnaryWith :: (Int -> ReadS a) -> String -> (a -> t) -> String -> ReadS t
+readsUnaryWith rp name cons kw s =
+ [(cons x,t) | kw == name, (x,t) <- rp 11 s]
+
+readUnaryWith :: ReadPrec a -> String -> (a -> t) -> ReadPrec t
+readUnaryWith rp name cons = do
+ expectP $ Ident name
+ x <- step rp
+ return $ cons x
+
+readsBinaryWith :: (Int -> ReadS a) -> (Int -> ReadS b) ->
+ String -> (a -> b -> t) -> String -> ReadS t
+readsBinaryWith rp1 rp2 name cons kw s =
+ [(cons x y,u) | kw == name, (x,t) <- rp1 11 s, (y,u) <- rp2 11 t]
+
+readBinaryWith :: ReadPrec a -> ReadPrec b ->
+ String -> (a -> b -> t) -> ReadPrec t
+readBinaryWith rp1 rp2 name cons = do
+ expectP $ Ident name
+ x <- step rp1
+ y <- step rp2
+ return $ cons x y
+
+showsUnaryWith :: (Int -> a -> ShowS) -> String -> Int -> a -> ShowS
+showsUnaryWith sp name d x = showParen (d > 10) $
+ showString name . showChar ' ' . sp 11 x
+
+showsBinaryWith :: (Int -> a -> ShowS) -> (Int -> b -> ShowS) ->
+ String -> Int -> a -> b -> ShowS
+showsBinaryWith sp1 sp2 name d x y = showParen (d > 10) $
+ showString name . showChar ' ' . sp1 11 x . showChar ' ' . sp2 11 y
--- /dev/null
+++ b/lib/Data/Functor/Compose.hs
@@ -1,0 +1,170 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE StandaloneDeriving #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module : Data.Functor.Compose
+-- Copyright : (c) Ross Paterson 2010
+-- License : BSD-style (see the file LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : stable
+-- Portability : portable
+--
+-- Composition of functors.
+--
+-- @since 4.9.0.0
+-----------------------------------------------------------------------------
+
+module Data.Functor.Compose (
+ Compose(..),
+ ) where
+import Prelude hiding(foldr, foldl, null, length, elem, maximum, minimum, sum, product)
+import Control.Applicative
+--import Data.Coerce (coerce)
+import Data.Data (Data)
+import Data.Foldable (Foldable(..))
+import Data.Functor.Classes
+import Data.Monoid.Internal
+import Data.Traversable
+--import Data.Type.Equality (TestEquality(..), (:~:)(..))
+--import GHC.Generics (Generic, Generic1)
+import Text.Read.Internal(Read(..), ReadPrec, readListDefault, readListPrecDefault)
+
+infixr 9 `Compose`
+
+newtype Compose f g a = Compose { getCompose :: f (g a) }
+{-
+ deriving ( Data -- ^ @since 4.9.0.0
+ , Generic -- ^ @since 4.9.0.0
+ , Generic1 -- ^ @since 4.9.0.0
+ , Semigroup -- ^ @since 4.16.0.0
+ , Monoid -- ^ @since 4.16.0.0
+ )
+
+deriving instance Eq (f (g a)) => Eq (Compose f g a)
+deriving instance Ord (f (g a)) => Ord (Compose f g a)
+
+instance Read (f (g a)) => Read (Compose f g a) where
+ readPrec = liftReadPrecCompose readPrec
+
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+-}
+instance Eq (f (g a)) => Eq (Compose f g a) where
+ Compose x == Compose y = x == y
+
+instance Ord (f (g a)) => Ord (Compose f g a) where
+ Compose x `compare` Compose y = x `compare` y
+
+instance Show (f (g a)) => Show (Compose f g a) where
+ showsPrec = liftShowsPrecCompose showsPrec
+
+instance (Eq1 f, Eq1 g) => Eq1 (Compose f g) where
+ liftEq eq (Compose x) (Compose y) = liftEq (liftEq eq) x y
+
+instance (Ord1 f, Ord1 g) => Ord1 (Compose f g) where
+ liftCompare comp (Compose x) (Compose y) =
+ liftCompare (liftCompare comp) x y
+
+{-
+instance (Read1 f, Read1 g) => Read1 (Compose f g) where
+ liftReadPrec rp rl =
+ liftReadPrecCompose (liftReadPrec rp' rl')
+ where
+ rp' = liftReadPrec rp rl
+ rl' = liftReadListPrec rp rl
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+-}
+
+instance (Show1 f, Show1 g) => Show1 (Compose f g) where
+ liftShowsPrec sp sl =
+ liftShowsPrecCompose (liftShowsPrec sp' sl')
+ where
+ sp' = liftShowsPrec sp sl
+ sl' = liftShowList sp sl
+
+{-
+-- The workhorse for Compose's Read and Read1 instances.
+liftReadPrecCompose :: ReadPrec (f (g a)) -> ReadPrec (Compose f g a)
+liftReadPrecCompose rp = readData $ readUnaryWith rp "Compose" Compose
+-}
+
+-- The workhorse for Compose's Show and Show1 instances.
+liftShowsPrecCompose :: (Int -> f (g a) -> ShowS) -> Int -> Compose f g a -> ShowS
+liftShowsPrecCompose sp d (Compose x) = showsUnaryWith sp "Compose" d x
+
+instance (Functor f, Functor g) => Functor (Compose f g) where
+ fmap f (Compose x) = Compose (fmap (fmap f) x)
+ a <$ (Compose x) = Compose (fmap (a <$) x)
+
+instance (Foldable f, Foldable g) => Foldable (Compose f g) where
+ fold (Compose t) = foldMap fold t
+ foldMap f (Compose t) = foldMap (foldMap f) t
+ foldMap' f (Compose t) = foldMap' (foldMap' f) t
+ foldr f b (Compose fga) = foldr (\ga acc -> foldr f acc ga) b fga
+ foldr' f b (Compose fga) = foldr' (\ga acc -> foldr' f acc ga) b fga
+ foldl f b (Compose fga) = foldl (\acc ga -> foldl f acc ga) b fga
+ foldl' f b (Compose fga) = foldl' (\acc ga -> foldl' f acc ga) b fga
+
+ null (Compose t) = null t || getAll (foldMap (All . null) t)
+ length (Compose t) = getSum (foldMap' (Sum . length) t)
+ elem x (Compose t) = getAny (foldMap (Any . elem x) t)
+
+ minimum (Compose fga) = minimum $ map minimum $ filter (not . null) $ toList fga
+ maximum (Compose fga) = maximum $ map maximum $ filter (not . null) $ toList fga
+
+ sum (Compose t) = getSum (foldMap' (Sum . sum) t)
+ product (Compose t) = getProduct (foldMap' (Product . product) t)
+
+instance (Traversable f, Traversable g) => Traversable (Compose f g) where
+ traverse f (Compose t) = Compose <$> traverse (traverse f) t
+
+instance (Applicative f, Applicative g) => Applicative (Compose f g) where
+ pure x = Compose (pure (pure x))
+ Compose f <*> Compose x = Compose (liftA2 (<*>) f x)
+ liftA2 f (Compose x) (Compose y) =
+ Compose (liftA2 (liftA2 f) x y)
+
+-- | @since 4.9.0.0
+instance (Alternative f, Applicative g) => Alternative (Compose f g) where
+ empty = Compose empty
+ Compose x <|> Compose y = Compose (x <|> y)
+
+{-
+-- | The deduction (via generativity) that if @g x :~: g y@ then @x :~: y@.
+--
+-- @since 4.14.0.0
+instance (TestEquality f) => TestEquality (Compose f g) where
+ testEquality (Compose x) (Compose y) =
+ case testEquality x y of -- :: Maybe (g x :~: g y)
+ Just Refl -> Just Refl -- :: Maybe (x :~: y)
+ Nothing -> Nothing
+
+-- | @since 4.19.0.0
+deriving instance Enum (f (g a)) => Enum (Compose f g a)
+-- | @since 4.19.0.0
+deriving instance Bounded (f (g a)) => Bounded (Compose f g a)
+-- | @since 4.19.0.0
+deriving instance Num (f (g a)) => Num (Compose f g a)
+-- | @since 4.19.0.0
+deriving instance Real (f (g a)) => Real (Compose f g a)
+-- | @since 4.19.0.0
+deriving instance Integral (f (g a)) => Integral (Compose f g a)
+-- | @since 4.20.0.0
+deriving instance Fractional (f (g a)) => Fractional (Compose f g a)
+-- | @since 4.20.0.0
+deriving instance RealFrac (f (g a)) => RealFrac (Compose f g a)
+-- | @since 4.20.0.0
+deriving instance Floating (f (g a)) => Floating (Compose f g a)
+-- | @since 4.20.0.0
+deriving instance RealFloat (f (g a)) => RealFloat (Compose f g a)
+-}
--- a/lib/Data/Functor/Const.hs
+++ b/lib/Data/Functor/Const.hs
@@ -9,17 +9,11 @@
import Data.Eq
import Data.Function
import Data.Functor
+import Data.Functor.Const_Type
import Data.Int
-import Data.Monoid
+import Data.Monoid.Internal
import Data.Ord
import Text.Show
-
-type Const :: forall k . Type -> k -> Type
-newtype Const a b = Const a
- deriving (Eq, Ord, Show)
-
-getConst :: forall a b . Const a b -> a
-getConst (Const a) = a
instance forall a . Functor (Const a) where
fmap _ (Const a) = Const a
--- /dev/null
+++ b/lib/Data/Functor/Const_Type.hs
@@ -1,0 +1,19 @@
+-- Copyright 2023 Lennart Augustsson
+-- See LICENSE file for full license.
+module Data.Functor.Const_Type(Const(..), getConst) where
+import Prelude() -- do not import Prelude
+import Primitives
+import Data.Bool
+import Data.Eq
+import Data.Function
+import Data.Functor
+import Data.Int
+import Data.Ord
+import Text.Show
+
+type Const :: forall k . Type -> k -> Type
+newtype Const a b = Const a
+ deriving (Eq, Ord, Show)
+
+getConst :: forall a b . Const a b -> a
+getConst (Const a) = a
--- /dev/null
+++ b/lib/Data/Functor/Contravariant.hs
@@ -1,0 +1,383 @@
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE EmptyCase #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE InstanceSigs #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE TypeOperators #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module : Data.Functor.Contravariant
+-- Copyright : (C) 2007-2015 Edward Kmett
+-- License : BSD-style (see the file LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : provisional
+-- Portability : portable
+--
+-- 'Contravariant' functors, sometimes referred to colloquially as @Cofunctor@,
+-- even though the dual of a 'Functor' is just a 'Functor'. As with 'Functor'
+-- the definition of 'Contravariant' for a given ADT is unambiguous.
+--
+-- @since 4.12.0.0
+----------------------------------------------------------------------------
+
+module Data.Functor.Contravariant (
+ -- * Contravariant Functors
+ Contravariant(..)
+ , phantom
+
+ -- * Operators
+ , (>$<), (>$$<), ($<)
+
+{-
+ -- * Predicates
+ , Predicate(..)
+
+ -- * Comparisons
+ , Comparison(..)
+ , defaultComparison
+
+ -- * Equivalence Relations
+ , Equivalence(..)
+ , defaultEquivalence
+ , comparisonEquivalence
+
+ -- * Dual arrows
+ , Op(..)
+-}
+ ) where
+
+import Control.Applicative
+import Control.Category
+import Data.Function (on)
+
+import Data.Functor.Product
+import Data.Functor.Sum
+import Data.Functor.Compose
+
+import Data.Monoid.Internal (Alt(..), All(..))
+import Data.Proxy
+
+import Prelude hiding ((.), id)
+
+-- | The class of contravariant functors.
+--
+-- Whereas in Haskell, one can think of a 'Functor' as containing or producing
+-- values, a contravariant functor is a functor that can be thought of as
+-- /consuming/ values.
+--
+-- As an example, consider the type of predicate functions @a -> Bool@. One
+-- such predicate might be @negative x = x < 0@, which
+-- classifies integers as to whether they are negative. However, given this
+-- predicate, we can re-use it in other situations, providing we have a way to
+-- map values /to/ integers. For instance, we can use the @negative@ predicate
+-- on a person's bank balance to work out if they are currently overdrawn:
+--
+-- @
+-- newtype Predicate a = Predicate { getPredicate :: a -> Bool }
+--
+-- instance Contravariant Predicate where
+-- contramap :: (a' -> a) -> (Predicate a -> Predicate a')
+-- contramap f (Predicate p) = Predicate (p . f)
+-- | `- First, map the input...
+-- `----- then apply the predicate.
+--
+-- overdrawn :: Predicate Person
+-- overdrawn = contramap personBankBalance negative
+-- @
+--
+-- Any instance should be subject to the following laws:
+--
+-- [Identity] @'contramap' 'id' = 'id'@
+-- [Composition] @'contramap' (g . f) = 'contramap' f . 'contramap' g@
+--
+-- Note, that the second law follows from the free theorem of the type of
+-- 'contramap' and the first law, so you need only check that the former
+-- condition holds.
+
+class Contravariant f where
+ contramap :: (a' -> a) -> (f a -> f a')
+
+ -- | Replace all locations in the output with the same value.
+ -- The default definition is @'contramap' . 'const'@, but this may be
+ -- overridden with a more efficient version.
+ (>$) :: b -> f b -> f a
+ (>$) = contramap . const
+
+-- | If @f@ is both 'Functor' and 'Contravariant' then by the time you factor
+-- in the laws of each of those classes, it can't actually use its argument in
+-- any meaningful capacity.
+--
+-- This method is surprisingly useful. Where both instances exist and are
+-- lawful we have the following laws:
+--
+-- @
+-- 'fmap' f ≡ 'phantom'
+-- 'contramap' f ≡ 'phantom'
+-- @
+phantom :: (Functor f, Contravariant f) => f a -> f b
+phantom x = () <$ x $< ()
+
+infixl 4 >$, $<, >$<, >$$<
+
+-- | This is '>$' with its arguments flipped.
+($<) :: Contravariant f => f b -> b -> f a
+($<) = flip (>$)
+
+-- | This is an infix alias for 'contramap'.
+(>$<) :: Contravariant f => (a -> b) -> (f b -> f a)
+(>$<) = contramap
+
+-- | This is an infix version of 'contramap' with the arguments flipped.
+(>$$<) :: Contravariant f => f b -> (a -> b) -> f a
+(>$$<) = flip contramap
+
+{-
+deriving newtype instance Contravariant f => Contravariant (Alt f)
+deriving newtype instance Contravariant f => Contravariant (Rec1 f)
+deriving newtype instance Contravariant f => Contravariant (M1 i c f)
+
+instance Contravariant V1 where
+ contramap :: (a' -> a) -> (V1 a -> V1 a')
+ contramap _ x = case x of
+
+instance Contravariant U1 where
+ contramap :: (a' -> a) -> (U1 a -> U1 a')
+ contramap _ _ = U1
+
+instance Contravariant (K1 i c) where
+ contramap :: (a' -> a) -> (K1 i c a -> K1 i c a')
+ contramap _ (K1 c) = K1 c
+
+instance (Contravariant f, Contravariant g) => Contravariant (f :*: g) where
+ contramap :: (a' -> a) -> ((f :*: g) a -> (f :*: g) a')
+ contramap f (xs :*: ys) = contramap f xs :*: contramap f ys
+
+instance (Functor f, Contravariant g) => Contravariant (f :.: g) where
+ contramap :: (a' -> a) -> ((f :.: g) a -> (f :.: g) a')
+ contramap f (Comp1 fg) = Comp1 (fmap (contramap f) fg)
+
+instance (Contravariant f, Contravariant g) => Contravariant (f :+: g) where
+ contramap :: (a' -> a) -> ((f :+: g) a -> (f :+: g) a')
+ contramap f (L1 xs) = L1 (contramap f xs)
+ contramap f (R1 ys) = R1 (contramap f ys)
+-}
+
+instance (Contravariant f, Contravariant g) => Contravariant (Sum f g) where
+-- contramap :: (a' -> a) -> (Sum f g a -> Sum f g a')
+ contramap f (InL xs) = InL (contramap f xs)
+ contramap f (InR ys) = InR (contramap f ys)
+
+instance (Contravariant f, Contravariant g)
+ => Contravariant (Product f g) where
+-- contramap :: (a' -> a) -> (Product f g a -> Product f g a')
+ contramap f (Pair a b) = Pair (contramap f a) (contramap f b)
+
+instance Contravariant (Const a) where
+-- contramap :: (b' -> b) -> (Const a b -> Const a b')
+ contramap _ (Const a) = Const a
+
+instance (Functor f, Contravariant g) => Contravariant (Compose f g) where
+-- contramap :: (a' -> a) -> (Compose f g a -> Compose f g a')
+ contramap f (Compose fga) = Compose (fmap (contramap f) fga)
+
+instance Contravariant Proxy where
+-- contramap :: (a' -> a) -> (Proxy a -> Proxy a')
+ contramap _ _ = Proxy
+
+{-
+newtype Predicate a = Predicate { getPredicate :: a -> Bool }
+ deriving
+ ( -- | @('<>')@ on predicates uses logical conjunction @('&&')@ on
+ -- the results. Without newtypes this equals @'liftA2' (&&)@.
+ --
+ -- @
+ -- (<>) :: Predicate a -> Predicate a -> Predicate a
+ -- Predicate pred <> Predicate pred' = Predicate \a ->
+ -- pred a && pred' a
+ -- @
+ Semigroup
+ , -- | @'mempty'@ on predicates always returns @True@. Without
+ -- newtypes this equals @'pure' True@.
+ --
+ -- @
+ -- mempty :: Predicate a
+ -- mempty = \_ -> True
+ -- @
+ Monoid
+ )
+ via a -> All
+
+ deriving
+ ( -- | A 'Predicate' is a 'Contravariant' 'Functor', because
+ -- 'contramap' can apply its function argument to the input of
+ -- the predicate.
+ --
+ -- Without newtypes @'contramap' f@ equals precomposing with @f@
+ -- (= @(. f)@).
+ --
+ -- @
+ -- contramap :: (a' -> a) -> (Predicate a -> Predicate a')
+ -- contramap f (Predicate g) = Predicate (g . f)
+ -- @
+ Contravariant
+ )
+ via Op Bool
+
+-- | Defines a total ordering on a type as per 'compare'.
+--
+-- This condition is not checked by the types. You must ensure that the
+-- supplied values are valid total orderings yourself.
+newtype Comparison a = Comparison { getComparison :: a -> a -> Ordering }
+ deriving
+ newtype
+ ( -- | @('<>')@ on comparisons combines results with @('<>')
+ -- \@Ordering@. Without newtypes this equals @'liftA2' ('liftA2'
+ -- ('<>'))@.
+ --
+ -- @
+ -- (<>) :: Comparison a -> Comparison a -> Comparison a
+ -- Comparison cmp <> Comparison cmp' = Comparison \a a' ->
+ -- cmp a a' <> cmp a a'
+ -- @
+ Semigroup
+ , -- | @'mempty'@ on comparisons always returns @EQ@. Without
+ -- newtypes this equals @'pure' ('pure' EQ)@.
+ --
+ -- @
+ -- mempty :: Comparison a
+ -- mempty = Comparison \_ _ -> EQ
+ -- @
+ Monoid
+ )
+
+-- | A 'Comparison' is a 'Contravariant' 'Functor', because 'contramap' can
+-- apply its function argument to each input of the comparison function.
+instance Contravariant Comparison where
+ contramap :: (a' -> a) -> (Comparison a -> Comparison a')
+ contramap f (Comparison g) = Comparison (on g f)
+
+-- | Compare using 'compare'.
+defaultComparison :: Ord a => Comparison a
+defaultComparison = Comparison compare
+
+-- | This data type represents an equivalence relation.
+--
+-- Equivalence relations are expected to satisfy three laws:
+--
+-- [Reflexivity]: @'getEquivalence' f a a = True@
+-- [Symmetry]: @'getEquivalence' f a b = 'getEquivalence' f b a@
+-- [Transitivity]:
+-- If @'getEquivalence' f a b@ and @'getEquivalence' f b c@ are both 'True'
+-- then so is @'getEquivalence' f a c@.
+--
+-- The types alone do not enforce these laws, so you'll have to check them
+-- yourself.
+newtype Equivalence a = Equivalence { getEquivalence :: a -> a -> Bool }
+ deriving
+ ( -- | @('<>')@ on equivalences uses logical conjunction @('&&')@
+ -- on the results. Without newtypes this equals @'liftA2'
+ -- ('liftA2' (&&))@.
+ --
+ -- @
+ -- (<>) :: Equivalence a -> Equivalence a -> Equivalence a
+ -- Equivalence equiv <> Equivalence equiv' = Equivalence \a b ->
+ -- equiv a b && equiv' a b
+ -- @
+ Semigroup
+ , -- | @'mempty'@ on equivalences always returns @True@. Without
+ -- newtypes this equals @'pure' ('pure' True)@.
+ --
+ -- @
+ -- mempty :: Equivalence a
+ -- mempty = Equivalence \_ _ -> True
+ -- @
+ Monoid
+ )
+ via a -> a -> All
+
+-- | Equivalence relations are 'Contravariant', because you can
+-- apply the contramapped function to each input to the equivalence
+-- relation.
+instance Contravariant Equivalence where
+ contramap :: (a' -> a) -> (Equivalence a -> Equivalence a')
+ contramap f (Equivalence g) = Equivalence (on g f)
+
+-- | Check for equivalence with '=='.
+--
+-- Note: The instances for 'Double' and 'Float' violate reflexivity for @NaN@.
+defaultEquivalence :: Eq a => Equivalence a
+defaultEquivalence = Equivalence (==)
+
+comparisonEquivalence :: Comparison a -> Equivalence a
+comparisonEquivalence (Comparison p) = Equivalence $ \a b -> p a b == EQ
+
+-- | Dual function arrows.
+newtype Op a b = Op { getOp :: b -> a }
+ deriving
+ newtype
+ ( -- | @('<>') \@(Op a b)@ without newtypes is @('<>') \@(b->a)@ =
+ -- @liftA2 ('<>')@. This lifts the 'Semigroup' operation
+ -- @('<>')@ over the output of @a@.
+ --
+ -- @
+ -- (<>) :: Op a b -> Op a b -> Op a b
+ -- Op f <> Op g = Op \a -> f a <> g a
+ -- @
+ Semigroup
+ , -- | @'mempty' \@(Op a b)@ without newtypes is @mempty \@(b->a)@
+ -- = @\_ -> mempty@.
+ --
+ -- @
+ -- mempty :: Op a b
+ -- mempty = Op \_ -> mempty
+ -- @
+ Monoid
+ )
+
+instance Category Op where
+ id :: Op a a
+ id = Op id
+
+ (.) :: Op b c -> Op a b -> Op a c
+ Op f . Op g = Op (g . f)
+
+instance Contravariant (Op a) where
+ contramap :: (b' -> b) -> (Op a b -> Op a b')
+ contramap f g = Op (getOp g . f)
+
+instance Num a => Num (Op a b) where
+ Op f + Op g = Op $ \a -> f a + g a
+ Op f * Op g = Op $ \a -> f a * g a
+ Op f - Op g = Op $ \a -> f a - g a
+ abs (Op f) = Op $ abs . f
+ signum (Op f) = Op $ signum . f
+ fromInteger = Op . const . fromInteger
+
+instance Fractional a => Fractional (Op a b) where
+ Op f / Op g = Op $ \a -> f a / g a
+ recip (Op f) = Op $ recip . f
+ fromRational = Op . const . fromRational
+
+instance Floating a => Floating (Op a b) where
+ pi = Op $ const pi
+ exp (Op f) = Op $ exp . f
+ sqrt (Op f) = Op $ sqrt . f
+ log (Op f) = Op $ log . f
+ sin (Op f) = Op $ sin . f
+ tan (Op f) = Op $ tan . f
+ cos (Op f) = Op $ cos . f
+ asin (Op f) = Op $ asin . f
+ atan (Op f) = Op $ atan . f
+ acos (Op f) = Op $ acos . f
+ sinh (Op f) = Op $ sinh . f
+ tanh (Op f) = Op $ tanh . f
+ cosh (Op f) = Op $ cosh . f
+ asinh (Op f) = Op $ asinh . f
+ atanh (Op f) = Op $ atanh . f
+ acosh (Op f) = Op $ acosh . f
+ Op f ** Op g = Op $ \a -> f a ** g a
+ logBase (Op f) (Op g) = Op $ \a -> logBase (f a) (g a)
+-}
--- a/lib/Data/Functor/Identity.hs
+++ b/lib/Data/Functor/Identity.hs
@@ -1,6 +1,6 @@
-- Copyright 2023 Lennart Augustsson
-- See LICENSE file for full license.
-module Data.Functor.Identity(Identity(..), runIdentity) where
+module Data.Functor.Identity(Identity(..)) where
import Prelude() -- do not import Prelude
import Primitives
import Control.Applicative
@@ -11,13 +11,11 @@
import Data.Functor
import Data.Int
import Data.Ord
+import Data.Records
import Text.Show
-newtype Identity a = Identity a
+newtype Identity a = Identity { runIdentity :: a }
deriving (Eq, Ord, Show)
-
-runIdentity :: forall a . Identity a -> a
-runIdentity (Identity a) = a
instance Functor Identity where
fmap f (Identity a) = Identity (f a)
--- /dev/null
+++ b/lib/Data/Functor/Product.hs
@@ -1,0 +1,115 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE StandaloneDeriving #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module : Data.Functor.Product
+-- Copyright : (c) Ross Paterson 2010
+-- License : BSD-style (see the file LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : stable
+-- Portability : portable
+--
+-- Products, lifted to functors.
+--
+-- @since 4.9.0.0
+-----------------------------------------------------------------------------
+
+module Data.Functor.Product (
+ Product(..),
+ ) where
+
+import Control.Applicative
+import Control.Monad
+import Control.Monad.Fix
+import Control.Monad.Zip
+--import Data.Data (Data)
+import Data.Foldable
+import Data.Functor.Classes
+import Data.Monoid(Monoid(..))
+import Data.Traversable
+--import GHC.Generics (Generic, Generic1)
+
+data Product f g a = Pair (f a) (g a)
+{-
+ deriving ( Data -- ^ @since 4.9.0.0
+ , Generic -- ^ @since 4.9.0.0
+ , Generic1 -- ^ @since 4.9.0.0
+ )
+
+-- | @since 4.18.0.0
+deriving instance (Eq (f a), Eq (g a)) => Eq (Product f g a)
+-- | @since 4.18.0.0
+deriving instance (Ord (f a), Ord (g a)) => Ord (Product f g a)
+-- | @since 4.18.0.0
+deriving instance (Read (f a), Read (g a)) => Read (Product f g a)
+-- | @since 4.18.0.0
+deriving instance (Show (f a), Show (g a)) => Show (Product f g a)
+-}
+
+instance (Eq1 f, Eq1 g) => Eq1 (Product f g) where
+ liftEq eq (Pair x1 y1) (Pair x2 y2) = liftEq eq x1 x2 && liftEq eq y1 y2
+
+instance (Ord1 f, Ord1 g) => Ord1 (Product f g) where
+ liftCompare comp (Pair x1 y1) (Pair x2 y2) =
+ liftCompare comp x1 x2 `mappend` liftCompare comp y1 y2
+
+{-
+instance (Read1 f, Read1 g) => Read1 (Product f g) where
+ liftReadPrec rp rl = readData $
+ readBinaryWith (liftReadPrec rp rl) (liftReadPrec rp rl) "Pair" Pair
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+-}
+
+instance (Show1 f, Show1 g) => Show1 (Product f g) where
+ liftShowsPrec sp sl d (Pair x y) =
+ showsBinaryWith (liftShowsPrec sp sl) (liftShowsPrec sp sl) "Pair" d x y
+
+instance (Functor f, Functor g) => Functor (Product f g) where
+ fmap f (Pair x y) = Pair (fmap f x) (fmap f y)
+ a <$ (Pair x y) = Pair (a <$ x) (a <$ y)
+
+instance (Foldable f, Foldable g) => Foldable (Product f g) where
+ foldMap f (Pair x y) = foldMap f x `mappend` foldMap f y
+
+instance (Traversable f, Traversable g) => Traversable (Product f g) where
+ traverse f (Pair x y) = liftA2 Pair (traverse f x) (traverse f y)
+
+instance (Applicative f, Applicative g) => Applicative (Product f g) where
+ pure x = Pair (pure x) (pure x)
+ Pair f g <*> Pair x y = Pair (f <*> x) (g <*> y)
+ liftA2 f (Pair a b) (Pair x y) = Pair (liftA2 f a x) (liftA2 f b y)
+
+instance (Alternative f, Alternative g) => Alternative (Product f g) where
+ empty = Pair empty empty
+ Pair x1 y1 <|> Pair x2 y2 = Pair (x1 <|> x2) (y1 <|> y2)
+
+instance (Monad f, Monad g) => Monad (Product f g) where
+ Pair m n >>= f = Pair (m >>= fstP . f) (n >>= sndP . f)
+ where
+ fstP (Pair a _) = a
+ sndP (Pair _ b) = b
+
+instance (MonadPlus f, MonadPlus g) => MonadPlus (Product f g) where
+ mzero = Pair mzero mzero
+ Pair x1 y1 `mplus` Pair x2 y2 = Pair (x1 `mplus` x2) (y1 `mplus` y2)
+
+instance (MonadFix f, MonadFix g) => MonadFix (Product f g) where
+ mfix f = Pair (mfix (fstP . f)) (mfix (sndP . f))
+ where
+ fstP (Pair a _) = a
+ sndP (Pair _ b) = b
+
+instance (MonadZip f, MonadZip g) => MonadZip (Product f g) where
+ mzipWith f (Pair x1 y1) (Pair x2 y2) = Pair (mzipWith f x1 x2) (mzipWith f y1 y2)
+
+instance (Semigroup (f a), Semigroup (g a)) => Semigroup (Product f g a) where
+ Pair x1 y1 <> Pair x2 y2 = Pair (x1 <> x2) (y1 <> y2)
+
+instance (Monoid (f a), Monoid (g a)) => Monoid (Product f g a) where
+ mempty = Pair mempty mempty
--- /dev/null
+++ b/lib/Data/Functor/Sum.hs
@@ -1,0 +1,103 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE StandaloneDeriving #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module : Data.Functor.Sum
+-- Copyright : (c) Ross Paterson 2014
+-- License : BSD-style (see the file LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : stable
+-- Portability : portable
+--
+-- Sums, lifted to functors.
+--
+-- @since 4.9.0.0
+-----------------------------------------------------------------------------
+
+module Data.Functor.Sum (
+ Sum(..),
+ ) where
+import Control.Applicative ((<|>))
+--import Data.Data (Data)
+import Data.Foldable
+import Data.Functor.Classes
+import Data.Traversable
+--import GHC.Generics (Generic, Generic1)
+
+-- | Lifted sum of functors.
+--
+-- ==== __Examples__
+--
+-- >>> fmap (+1) (InL (Just 1)) :: Sum Maybe [] Int
+-- InL (Just 2)
+--
+-- >>> fmap (+1) (InR [1, 2, 3]) :: Sum Maybe [] Int
+-- InR [2,3,4]
+data Sum f g a = InL (f a) | InR (g a)
+{-
+ deriving ( Data -- ^ @since 4.9.0.0
+ , Generic -- ^ @since 4.9.0.0
+ , Generic1 -- ^ @since 4.9.0.0
+ )
+
+-- | @since 4.18.0.0
+deriving instance (Eq (f a), Eq (g a)) => Eq (Sum f g a)
+-- | @since 4.18.0.0
+deriving instance (Ord (f a), Ord (g a)) => Ord (Sum f g a)
+-- | @since 4.18.0.0
+deriving instance (Read (f a), Read (g a)) => Read (Sum f g a)
+-- | @since 4.18.0.0
+deriving instance (Show (f a), Show (g a)) => Show (Sum f g a)
+-}
+
+-- | @since 4.9.0.0
+instance (Eq1 f, Eq1 g) => Eq1 (Sum f g) where
+ liftEq eq (InL x1) (InL x2) = liftEq eq x1 x2
+ liftEq _ (InL _) (InR _) = False
+ liftEq _ (InR _) (InL _) = False
+ liftEq eq (InR y1) (InR y2) = liftEq eq y1 y2
+
+-- | @since 4.9.0.0
+instance (Ord1 f, Ord1 g) => Ord1 (Sum f g) where
+ liftCompare comp (InL x1) (InL x2) = liftCompare comp x1 x2
+ liftCompare _ (InL _) (InR _) = LT
+ liftCompare _ (InR _) (InL _) = GT
+ liftCompare comp (InR y1) (InR y2) = liftCompare comp y1 y2
+
+-- | @since 4.9.0.0
+instance (Read1 f, Read1 g) => Read1 (Sum f g) where
+ liftReadPrec rp rl = readData $
+ readUnaryWith (liftReadPrec rp rl) "InL" InL <|>
+ readUnaryWith (liftReadPrec rp rl) "InR" InR
+
+ liftReadListPrec = liftReadListPrecDefault
+ liftReadList = liftReadListDefault
+
+-- | @since 4.9.0.0
+instance (Show1 f, Show1 g) => Show1 (Sum f g) where
+ liftShowsPrec sp sl d (InL x) =
+ showsUnaryWith (liftShowsPrec sp sl) "InL" d x
+ liftShowsPrec sp sl d (InR y) =
+ showsUnaryWith (liftShowsPrec sp sl) "InR" d y
+
+-- | @since 4.9.0.0
+instance (Functor f, Functor g) => Functor (Sum f g) where
+ fmap f (InL x) = InL (fmap f x)
+ fmap f (InR y) = InR (fmap f y)
+
+ a <$ (InL x) = InL (a <$ x)
+ a <$ (InR y) = InR (a <$ y)
+
+-- | @since 4.9.0.0
+instance (Foldable f, Foldable g) => Foldable (Sum f g) where
+ foldMap f (InL x) = foldMap f x
+ foldMap f (InR y) = foldMap f y
+
+-- | @since 4.9.0.0
+instance (Traversable f, Traversable g) => Traversable (Sum f g) where
+ traverse f (InL x) = InL <$> traverse f x
+ traverse f (InR y) = InR <$> traverse f y
--- /dev/null
+++ b/lib/Data/Hashable.hs
@@ -1,0 +1,190 @@
+-- Simplified Hashable, just to have something
+
+module Data.Hashable(
+ Hashable(..),
+ ) where
+
+--import Data.Bits
+import qualified Data.ByteString as B
+import Data.Complex
+import Data.Fixed
+import Data.Int
+import Data.Integer(_integerToIntList)
+import Data.List(foldl')
+import Data.Ratio
+import qualified Data.Text as T
+import Data.Word
+
+type Salt = Int
+
+infixl 0 `hashWithSalt`
+
+class Hashable a where
+ hashWithSalt :: Salt -> a -> Int
+
+ hash :: a -> Int
+ hash = hashWithSalt defaultSalt
+
+defaultSalt :: Salt
+defaultSalt = 0x087fc72c
+
+hashUsing :: (Hashable b) => (a -> b) -> Salt -> a -> Int
+hashUsing f salt x = hashWithSalt salt (f x)
+
+defaultHashWithSalt :: Hashable a => Int -> a -> Int
+defaultHashWithSalt salt x = salt `hashInt` hash x
+
+-----------------
+
+instance Hashable Int where
+ hash = id
+ hashWithSalt = hashInt
+
+instance Hashable Int8 where
+ hash = fromIntegral
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Int16 where
+ hash = fromIntegral
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Int32 where
+ hash = fromIntegral
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Int64 where
+ hash = fromIntegral
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Word where
+ hash = fromIntegral
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Word8 where
+ hash = fromIntegral
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Word16 where
+ hash = fromIntegral
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Word32 where
+ hash = fromIntegral
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Word64 where
+ hash = fromIntegral
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable () where
+ hash _ = 0
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Bool where
+ hash = fromEnum
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Ordering where
+ hash = fromEnum
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Char where
+ hash = fromEnum
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Float where
+ hash = hash . show
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Double where
+ hash = hash . show
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable Integer where
+ hashWithSalt s = hashWithSalt s . _integerToIntList
+
+instance Hashable B.ByteString where
+ hashWithSalt s = hashWithSalt s . B.unpack
+
+instance Hashable T.Text where
+ hashWithSalt s = hashWithSalt s . T.unpack
+
+distinguisher :: Int
+distinguisher = fromIntegral $ (maxBound :: Word) `quot` 3
+
+instance Hashable a => Hashable (Maybe a) where
+ hash Nothing = 0
+ hash (Just a) = distinguisher `hashWithSalt` a
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable a => Hashable [a] where
+ hashWithSalt = foldl' hashWithSalt
+
+instance (Hashable a, Hashable b) => Hashable (Either a b) where
+ hash (Left a) = 0 `hashWithSalt` a
+ hash (Right b) = distinguisher `hashWithSalt` b
+ hashWithSalt = defaultHashWithSalt
+
+instance Hashable a => Hashable (Complex a) where
+ hashWithSalt s (r :+ i) = s `hashWithSalt` r `hashWithSalt` i
+
+instance Hashable a => Hashable (Ratio a) where
+ hashWithSalt s r = s `hashWithSalt` numerator r `hashWithSalt` denominator r
+
+instance HasResolution a => Hashable (Fixed a) where
+ hashWithSalt s = hashWithSalt s . toRational
+
+instance (Hashable a1, Hashable a2) => Hashable (a1, a2) where
+ hashWithSalt s (a1, a2) = s `hashWithSalt` a1 `hashWithSalt` a2
+
+instance (Hashable a1, Hashable a2, Hashable a3) => Hashable (a1, a2, a3) where
+ hashWithSalt s (a1, a2, a3) = s `hashWithSalt` a1 `hashWithSalt` a2 `hashWithSalt` a3
+
+instance (Hashable a1, Hashable a2, Hashable a3, Hashable a4) => Hashable (a1, a2, a3, a4) where
+ hashWithSalt s (a1, a2, a3, a4) = s `hashWithSalt` a1 `hashWithSalt` a2 `hashWithSalt` a3 `hashWithSalt` a4
+
+------------
+
+-- XXX This needs work
+hashInt :: Salt -> Int -> Salt
+hashInt s x = s * 33 + x
+
+{-
+-- This is what we'd like, but it uses primitives byteSwap# and timesWord2#
+
+hashInt :: Salt -> Int -> Salt
+hashInt s x = fromIntegral (mixHash (fromIntegral s) (fromIntegral x))
+
+mulFold :: Word -> Word -> Word
+mulFold (W# x) (W# y) = case timesWord2# x y of
+ (# hi, lo #) -> W# (xor# hi lo)
+
+byteSwap :: Word -> Word
+byteSwap (W# w) = W# (byteSwap# w)
+
+avalanche :: Word -> Word
+avalanche z0 =
+#if WORD_SIZE_IN_BITS == 64
+ -- MurmurHash3Mixer
+ let z1 = shiftXorMultiply 33 0xff51afd7ed558ccd z0
+ z2 = shiftXorMultiply 33 0xc4ceb9fe1a85ec53 z1
+ z3 = shiftXor 33 z2
+ in z3
+#else
+ -- MurmurHash3Mixer 32bit
+ let z1 = shiftXorMultiply 16 0x85ebca6b z0
+ z2 = shiftXorMultiply 13 0xc2b2ae35 z1
+ z3 = shiftXor 16 z2
+ in z3
+#endif
+
+shiftXor :: Int -> Word -> Word
+shiftXor n w = w `xor` (w `unsafeShiftR` n)
+
+shiftXorMultiply :: Int -> Word -> Word -> Word
+shiftXorMultiply n k w = shiftXor n w * k
+
+-- | Mix hash is inspired by how xxh3 works on small (<=16byte) inputs.
+mixHash :: Word -> Word -> Word
+mixHash hi lo = avalanche (byteSwap lo + hi + mulFold hi lo)
+-}
--- a/lib/Data/Int/Instances.hs
+++ b/lib/Data/Int/Instances.hs
@@ -16,8 +16,7 @@
import Data.Ord
import Data.Ratio_Type
import Data.Real
-import Numeric
-import Text.Read
+import Numeric.Show
import Text.Show
--------------------------------------------------------------------------------
@@ -34,7 +33,7 @@
bini8 :: (Int -> Int -> Int) -> (Int8 -> Int -> Int8)
bini8 op (I8 x) y = i8 (x `op` y)
-cmp8 :: (Int -> Int -> Bool) -> (Int8 -> Int8 -> Bool)
+cmp8 :: (Int -> Int -> a) -> (Int8 -> Int8 -> a)
cmp8 op (I8 x) (I8 y) = x `op` y
una8 :: (Int -> Int) -> (Int8 -> Int8)
@@ -63,8 +62,10 @@
instance Show Int8 where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Int8 where
readsPrec = readIntegral
+-}
instance Enum Int8 where
succ x = x + 1
@@ -87,6 +88,7 @@
(/=) = cmp8 primIntNE
instance Ord Int8 where
+ compare = cmp8 primIntCompare
(<) = cmp8 primIntLT
(<=) = cmp8 primIntLE
(>) = cmp8 primIntGT
@@ -121,7 +123,7 @@
bini16 :: (Int -> Int -> Int) -> (Int16 -> Int -> Int16)
bini16 op (I16 x) y = i16 (x `op` y)
-cmp16 :: (Int -> Int -> Bool) -> (Int16 -> Int16 -> Bool)
+cmp16 :: (Int -> Int -> a) -> (Int16 -> Int16 -> a)
cmp16 op (I16 x) (I16 y) = x `op` y
una16 :: (Int -> Int) -> (Int16 -> Int16)
@@ -150,8 +152,10 @@
instance Show Int16 where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Int16 where
readsPrec = readIntegral
+-}
instance Enum Int16 where
succ x = x + 1
@@ -174,6 +178,7 @@
(/=) = cmp16 primIntNE
instance Ord Int16 where
+ compare = cmp16 primIntCompare
(<) = cmp16 primIntLT
(<=) = cmp16 primIntLE
(>) = cmp16 primIntGT
@@ -208,7 +213,7 @@
bini32 :: (Int -> Int -> Int) -> (Int32 -> Int -> Int32)
bini32 op (I32 x) y = i32 (x `op` y)
-cmp32 :: (Int -> Int -> Bool) -> (Int32 -> Int32 -> Bool)
+cmp32 :: (Int -> Int -> a) -> (Int32 -> Int32 -> a)
cmp32 op (I32 x) (I32 y) = x `op` y
una32 :: (Int -> Int) -> (Int32 -> Int32)
@@ -237,8 +242,10 @@
instance Show Int32 where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Int32 where
readsPrec = readIntegral
+-}
instance Enum Int32 where
succ x = x + 1
@@ -261,6 +268,7 @@
(/=) = cmp32 primIntNE
instance Ord Int32 where
+ compare = cmp32 primIntCompare
(<) = cmp32 primIntLT
(<=) = cmp32 primIntLE
(>) = cmp32 primIntGT
@@ -293,7 +301,7 @@
bini64 :: (Int -> Int -> Int) -> (Int64 -> Int -> Int64)
bini64 op (I64 x) y = i64 (x `op` y)
-cmp64 :: (Int -> Int -> Bool) -> (Int64 -> Int64 -> Bool)
+cmp64 :: (Int -> Int -> a) -> (Int64 -> Int64 -> a)
cmp64 op (I64 x) (I64 y) = x `op` y
una64 :: (Int -> Int) -> (Int64 -> Int64)
@@ -322,8 +330,10 @@
instance Show Int64 where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Int64 where
readsPrec = readIntegral
+-}
instance Enum Int64 where
succ x = x + 1
@@ -346,6 +356,7 @@
(/=) = cmp64 primIntNE
instance Ord Int64 where
+ compare = cmp64 primIntCompare
(<) = cmp64 primIntLT
(<=) = cmp64 primIntLE
(>) = cmp64 primIntGT
--- a/lib/Data/Integer.hs
+++ b/lib/Data/Integer.hs
@@ -27,8 +27,7 @@
import Data.Ord
import Data.Ratio_Type
import Data.Real
-import Numeric
-import Text.Read
+import Numeric.Show
import Text.Show
--
@@ -64,8 +63,10 @@
instance Show Integer where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Integer where
readsPrec = readIntegral
+-}
instance Num Integer where
(+) = addI
--- /dev/null
+++ b/lib/Data/Kind.hs
@@ -1,0 +1,3 @@
+module Data.Kind(Type, Constraint) where
+import Prelude()
+import Primitives
--- a/lib/Data/List.hs
+++ b/lib/Data/List.hs
@@ -4,14 +4,14 @@
module Data.List_Type,
(++), head, last, tail, init, uncons, unsnoc, singleton, null, length,
map, reverse, intersperse, intercalate, transpose, subsequences, permutations,
- foldl, foldl', foldl1, foldl1', foldr, foldr1,
+ foldl, foldl', foldl1, foldl1', foldr, foldr', foldr1, foldr1',
concat, concatMap, and, or, any, all, sum, product, maximum, minimum,
scanl, scanl', scanl1, scanr, scanr1,
mapAccumL, mapAccumR,
iterate, iterate', repeat, replicate, cycle,
unfoldr,
- take, drop, splitAt, takeWhile, dropWhile, dropWhileEnd, span, break,
- stripPrefix, group, inits, tails,
+ take, drop, splitAt, takeWhile, takeWhileEnd, dropWhile, dropWhileEnd, span, spanUntil, break, splitWith,
+ stripPrefix, stripSuffix, group, inits, tails,
isPrefixOf, isSuffixOf, isInfixOf, isSubsequenceOf,
elem, notElem, lookup,
find, filter, partition,
@@ -34,15 +34,14 @@
import Data.Char
import Data.Eq
import Data.Function
-import Data.Functor
+import Data.Functor hiding(unzip)
import Data.Int
import Data.Integral
import Data.List_Type
import Data.Maybe_Type
-import Data.Monoid
+import Data.Monoid.Internal
import Data.Num
import Data.Ord
-import Data.Semigroup
import Data.Tuple
--import Text.Read
import Text.Show
@@ -106,13 +105,11 @@
rec (x : xs) = f x (rec xs)
in rec
-{-
foldr' :: forall a b . (a -> b -> b) -> b -> [a] -> b
foldr' f z [] = z
foldr' f z (x:xs) =
let y = foldr f z xs
in y `seq` f x y
--}
foldr1 :: forall a . (a -> a -> a) -> [a] -> a
foldr1 f =
@@ -122,6 +119,16 @@
rec (x : xs) = f x (rec xs)
in rec
+foldr1' :: forall a . (a -> a -> a) -> [a] -> a
+foldr1' f =
+ let
+ rec [] = error "foldr1"
+ rec [x] = x
+ rec (x : xs) =
+ let y = rec xs
+ in y `seq` f x y
+ in rec
+
foldl :: forall a b . (b -> a -> b) -> b -> [a] -> b
foldl _ z [] = z
foldl f z (x : xs) = foldl f (f z x) xs
@@ -304,6 +311,12 @@
stripPrefixBy eq (c:cs) (d:ds) | eq c d = stripPrefixBy eq cs ds
| otherwise = Nothing
+stripSuffix :: forall a . Eq a => [a] -> [a] -> Maybe [a]
+stripSuffix s t =
+ case stripPrefix (reverse s) (reverse t) of
+ Nothing -> Nothing
+ Just x -> Just (reverse x)
+
isPrefixOf :: forall a . Eq a => [a] -> [a] -> Bool
isPrefixOf = isPrefixOfBy (==)
@@ -342,6 +355,9 @@
else
[]
+takeWhileEnd :: forall a . (a -> Bool) -> [a] -> [a]
+takeWhileEnd p = reverse . takeWhile p . reverse
+
dropWhile :: forall a . (a -> Bool) -> [a] -> [a]
dropWhile _ [] = []
dropWhile p (x:xs) =
@@ -369,6 +385,14 @@
rec r [] = (reverse r, [])
rec r (x:xs) = if p x then rec (x:r) xs else (reverse (x:r), xs)
in rec []
+
+splitWith :: forall a . (a -> Bool) -> [a] -> [[a]]
+splitWith p =
+ let
+ rec r s [] = reverse (reverse s : r)
+ rec r s (x:xs) | p x = rec (reverse s : r) [] xs
+ | otherwise = rec r (x : s) xs
+ in rec [] []
head :: forall a . [a] -> a
head [] = error "head"
--- a/lib/Data/List/NonEmpty.hs
+++ b/lib/Data/List/NonEmpty.hs
@@ -98,39 +98,43 @@
, nonEmpty -- :: [a] -> Maybe (NonEmpty a)
, xor -- :: NonEmpty Bool -> Bool
) where
+import Prelude()
-
-import Prelude hiding (break, cycle, drop, dropWhile,
- filter, foldl, foldr, head, init, iterate,
- last, length, map, repeat, reverse,
- scanl, scanl1, scanr, scanr1, span,
- splitAt, tail, take, takeWhile,
- unzip, zip, zipWith, (!!), Applicative(..))
-import qualified Prelude
-
-import Control.Applicative (Applicative (..), Alternative (many))
-
-{- Original from base-4.20.0.1
-import GHC.Internal.Data.Foldable hiding (length, toList)
-import qualified GHC.Internal.Data.Foldable as Foldable
-import GHC.Internal.Data.Function (on)
-import qualified GHC.Internal.Data.List as List
-import GHC.Internal.Data.Ord (comparing)
-import GHC.Internal.Base (NonEmpty(..))
-import GHC.Internal.Stack.Types (HasCallStack)
--}
------ MHS replacement
-import Control.Monad(ap, liftM2)
-import Data.Ord(comparing)
-import Data.Function(on)
+import Control.Applicative
+import Control.Error
+import Control.Monad
+import Data.Bool
+import Data.Eq
+import Data.Foldable hiding (length, toList)
+import qualified Data.Foldable as Foldable
+import Data.Function
+import Data.Functor hiding(unzip)
+import Data.Int
import qualified Data.List as List
+import Data.List_Type
+import Data.List.NonEmpty_Type
+import Data.Num
+import Data.Maybe
+import Data.Monoid.Internal
+import Data.Ord
+import Data.Traversable
+import Data.Tuple
import GHC.Stack(HasCallStack)
+import Text.Show
+{- In Data.List.NonEmpty_Type
infixr 5 :|
data NonEmpty a = a :| [a]
deriving (Eq, Ord)
+-}
+instance (Eq a) => Eq (NonEmpty a) where
+ (x :| xs) == (y :| ys) = x == y && xs == ys
+
+instance (Ord a) => Ord (NonEmpty a) where
+ compare (x :| xs) (y :| ys) = compare x y <> compare xs ys
+
instance Semigroup (NonEmpty a) where
(a :| as) <> ~(b :| bs) = a :| (as ++ b : bs)
@@ -152,6 +156,14 @@
--instance Traversable NonEmpty -- Defined in Data.Traversable
--instance Read a => Read (NonEmpty a) -- Defined in GHC.Read
--instance Show a => Show (NonEmpty a) -- Defined in GHC.Show
+
+instance Show a => Show (NonEmpty a) where
+ showsPrec p = showsPrec p . toList
+instance Foldable NonEmpty where
+ foldr f z = foldr f z . toList
+--instance Traversable NonEmpty where
+-- traverse f = fromList . traverse f . toList
+
----- End MHS replacement
infixr 5 <|
@@ -161,7 +173,7 @@
-- | Number of elements in 'NonEmpty' list.
length :: NonEmpty a -> Int
-length (_ :| xs) = 1 + Prelude.length xs
+length (_ :| xs) = 1 + List.length xs
-- | Compute n-ary logic exclusive OR operation on 'NonEmpty' list.
xor :: NonEmpty Bool -> Bool
@@ -283,10 +295,10 @@
-- /Beware/: If the provided function returns an empty list,
-- this will raise an error.
-- XXX not yet
---lift :: Foldable f => ([a] -> [b]) -> f a -> NonEmpty b
---lift f = fromList . f . Foldable.toList
-lift :: ([a] -> [b]) -> [a] -> NonEmpty b
-lift f = fromList . f
+lift :: Foldable f => ([a] -> [b]) -> f a -> NonEmpty b
+lift f = fromList . f . Foldable.toList
+--lift :: ([a] -> [b]) -> [a] -> NonEmpty b
+--lift f = fromList . f
-- | Map a function over a 'NonEmpty' stream.
map :: (a -> b) -> NonEmpty a -> NonEmpty b
@@ -301,10 +313,10 @@
-- > inits [1] == [] :| [[1]]
-- > inits [] == [] :| []
-- XXX
---inits :: Foldable f => f a -> NonEmpty [a]
---inits = fromList . List.inits . Foldable.toList
-inits :: [a] -> NonEmpty [a]
-inits = fromList . List.inits
+inits :: Foldable f => f a -> NonEmpty [a]
+inits = fromList . List.inits . Foldable.toList
+--inits :: [a] -> NonEmpty [a]
+--inits = fromList . List.inits
-- | The 'inits1' function takes a 'NonEmpty' stream @xs@ and returns all the
-- 'NonEmpty' finite prefixes of @xs@, starting with the shortest.
@@ -322,8 +334,8 @@
-- * The only empty element of `inits xs` is the first one (by the definition of `inits`)
-- * Therefore, if we take all but the first element of `inits xs` i.e.
-- `tail (inits xs)`, we have a nonempty list of nonempty lists
--- fromList . Prelude.map fromList . List.drop 1 . List.inits . Foldable.toList
- fromList . Prelude.map fromList . List.drop 1 . List.inits . toList
+ fromList . List.map fromList . List.drop 1 . List.inits . Foldable.toList
+-- fromList . List.map fromList . List.drop 1 . List.inits . toList
-- | The 'tails' function takes a stream @xs@ and returns all the
-- suffixes of @xs@, starting with the longest. The result is 'NonEmpty'
@@ -333,10 +345,10 @@
-- > tails [1] == [1] :| [[]]
-- > tails [] == [] :| []
-- XXX
---tails :: Foldable f => f a -> NonEmpty [a]
---tails = fromList . List.tails . Foldable.toList
-tails :: [a] -> NonEmpty [a]
-tails = fromList . List.tails
+tails :: Foldable f => f a -> NonEmpty [a]
+tails = fromList . List.tails . Foldable.toList
+--tails :: [a] -> NonEmpty [a]
+--tails = fromList . List.tails
-- | The 'tails1' function takes a 'NonEmpty' stream @xs@ and returns all the
-- non-empty suffixes of @xs@, starting with the longest.
@@ -354,16 +366,16 @@
-- * The only empty element of `tails xs` is the last one (by the definition of `tails`)
-- * Therefore, if we take all but the last element of `tails xs` i.e.
-- `init (tails xs)`, we have a nonempty list of nonempty lists
--- fromList . Prelude.map fromList . List.init . List.tails . Foldable.toList
- fromList . Prelude.map fromList . List.init . List.tails . toList
+-- fromList . List.map fromList . List.init . List.tails . Foldable.toList
+ fromList . List.map fromList . List.init . List.tails . toList
-- | @'insert' x xs@ inserts @x@ into the last position in @xs@ where it
-- is still less than or equal to the next element. In particular, if the
-- list is sorted beforehand, the result will also be sorted.
---insert :: (Foldable f, Ord a) => a -> f a -> NonEmpty a
---insert a = fromList . List.insert a . Foldable.toList
-insert :: (Ord a) => a -> [a] -> NonEmpty a
-insert a = fromList . List.insert a
+insert :: (Foldable f, Ord a) => a -> f a -> NonEmpty a
+insert a = fromList . List.insert a . Foldable.toList
+--insert :: (Ord a) => a -> [a] -> NonEmpty a
+--insert a = fromList . List.insert a
-- | @'some1' x@ sequences @x@ one or more times.
some1 :: Alternative f => f a -> f (NonEmpty a)
@@ -377,19 +389,19 @@
-- Note that
--
-- > last (scanl f z xs) == foldl f z xs.
---scanl :: Foldable f => (b -> a -> b) -> b -> f a -> NonEmpty b
---scanl f z = fromList . List.scanl f z . Foldable.toList
-scanl :: (b -> a -> b) -> b -> [a] -> NonEmpty b
-scanl f z = fromList . List.scanl f z
+scanl :: Foldable f => (b -> a -> b) -> b -> f a -> NonEmpty b
+scanl f z = fromList . List.scanl f z . Foldable.toList
+--scanl :: (b -> a -> b) -> b -> [a] -> NonEmpty b
+--scanl f z = fromList . List.scanl f z
-- | 'scanr' is the right-to-left dual of 'scanl'.
-- Note that
--
-- > head (scanr f z xs) == foldr f z xs.
---scanr :: Foldable f => (a -> b -> b) -> b -> f a -> NonEmpty b
---scanr f z = fromList . List.scanr f z . Foldable.toList
-scanr :: (a -> b -> b) -> b -> [a] -> NonEmpty b
-scanr f z = fromList . List.scanr f z
+scanr :: Foldable f => (a -> b -> b) -> b -> f a -> NonEmpty b
+scanr f z = fromList . List.scanr f z . Foldable.toList
+--scanr :: (a -> b -> b) -> b -> [a] -> NonEmpty b
+--scanr f z = fromList . List.scanr f z
-- | 'scanl1' is a variant of 'scanl' that has no starting value argument:
--
@@ -492,16 +504,16 @@
--
-- >>> group "Mississippi"
-- ["M", "i", "ss", "i", "ss", "i", "pp", "i"]
---group :: (Foldable f, Eq a) => f a -> [NonEmpty a]
-group :: (Eq a) => [a] -> [NonEmpty a]
+group :: (Foldable f, Eq a) => f a -> [NonEmpty a]
+--group :: (Eq a) => [a] -> [NonEmpty a]
group = groupBy (==)
-- | 'groupBy' operates like 'group', but uses the provided equality
-- predicate instead of `==`.
---groupBy :: Foldable f => (a -> a -> Bool) -> f a -> [NonEmpty a]
---groupBy eq0 = go eq0 . Foldable.toList
-groupBy :: (a -> a -> Bool) -> [a] -> [NonEmpty a]
-groupBy eq0 = go eq0
+groupBy :: Foldable f => (a -> a -> Bool) -> f a -> [NonEmpty a]
+groupBy eq0 = go eq0 . Foldable.toList
+--groupBy :: (a -> a -> Bool) -> [a] -> [NonEmpty a]
+--groupBy eq0 = go eq0
where
go _ [] = []
go eq (x : xs) = (x :| ys) : groupBy eq zs
@@ -509,8 +521,8 @@
-- | 'groupWith' operates like 'group', but uses the provided projection when
-- comparing for equality
---groupWith :: (Foldable f, Eq b) => (a -> b) -> f a -> [NonEmpty a]
-groupWith :: (Eq b) => (a -> b) -> [a] -> [NonEmpty a]
+groupWith :: (Foldable f, Eq b) => (a -> b) -> f a -> [NonEmpty a]
+--groupWith :: (Eq b) => (a -> b) -> [a] -> [NonEmpty a]
groupWith f = groupBy ((==) `on` f)
-- | 'groupAllWith' operates like 'groupWith', but sorts the list
--- /dev/null
+++ b/lib/Data/List/NonEmpty_Type.hs
@@ -1,0 +1,6 @@
+module Data.List.NonEmpty_Type(module Data.List.NonEmpty_Type) where
+import Prelude()
+
+infixr 5 :|
+
+data NonEmpty a = a :| [a]
--- a/lib/Data/Maybe.hs
+++ b/lib/Data/Maybe.hs
@@ -15,9 +15,8 @@
import Data.Int
import Data.List
import Data.Maybe_Type
-import Data.Monoid
+import Data.Monoid.Internal
import Data.Ord
-import Data.Semigroup
import Text.Show
instance forall a . Eq a => Eq (Maybe a) where
--- a/lib/Data/Monoid.hs
+++ b/lib/Data/Monoid.hs
@@ -1,134 +1,26 @@
-module Data.Monoid(module Data.Monoid, module Data.Semigroup) where
-import Prelude() -- do not import Prelude
-import Primitives
-import Control.Applicative
-import Data.Bool
-import Data.Bounded
-import Data.Function
-import Data.Functor
-import Data.List_Type
-import Data.Ord
+module Data.Monoid(
+ Monoid(..),
+ Endo(..),
+ Dual(..),
+ Sum(..),
+ Product(..),
+ All(..),
+ Any(..),
+ Arg(..),
+ Alt(..),
+ First(..),
+ Last(..),
+ ) where
+import Prelude()
import Data.Maybe_Type
-import Data.Num
-import Data.Semigroup
+import Data.Monoid.Internal
+import Data.Records
-class Semigroup a => Monoid a where
- mempty :: a
- mappend :: a -> a -> a
- mappend = (<>)
- mconcat :: [a] -> a
- mconcat [] = mempty
- mconcat (a:as) = a <> mconcat as
+-- First and Last are different in Monoid and Semigroup,
+-- so put them here.
----------------------
+newtype First a = First { getFirst :: Maybe a }
-newtype Endo a = Endo (a -> a)
-appEndo :: forall a . Endo a -> (a -> a)
-appEndo (Endo f) = f
-
-instance forall a . Semigroup (Endo a) where
- Endo f <> Endo g = Endo (f . g)
-
-instance forall a . Monoid (Endo a) where
- mempty = Endo id
-
----------------------
-
-newtype Dual a = Dual a
-getDual :: forall a . Dual a -> a
-getDual (Dual a) = a
-
-instance forall a . Semigroup a => Semigroup (Dual a) where
- Dual a <> Dual b = Dual (b <> a)
-
-instance forall a . Monoid a => Monoid (Dual a) where
- mempty = Dual mempty
-
-instance Functor Dual where
- fmap f (Dual a) = Dual (f a)
-
-instance Applicative Dual where
- pure = Dual
- Dual f <*> Dual b = Dual (f b)
-
----------------------
-
-newtype Max a = Max a
-getMax :: forall a . Max a -> a
-getMax (Max a) = a
-
-instance forall a . Ord a => Semigroup (Max a) where
- Max a <> Max b = Max (a `max` b)
-
-instance forall a . (Ord a, Bounded a) => Monoid (Max a) where
- mempty = Max minBound
-
----------------------
-
-newtype Min a = Min a
-getMin :: forall a . Min a -> a
-getMin (Min a) = a
-
-instance forall a . Ord a => Semigroup (Min a) where
- Min a <> Min b = Min (a `min` b)
-
-instance forall a . (Ord a, Bounded a) => Monoid (Min a) where
- mempty = Min maxBound
-
----------------------
-
-newtype Sum a = Sum a
-getSum :: forall a . Sum a -> a
-getSum (Sum a) = a
-
-instance forall a . Num a => Semigroup (Sum a) where
- Sum a <> Sum b = Sum (a + b)
-
-instance forall a . (Num a) => Monoid (Sum a) where
- mempty = Sum 0
-
----------------------
-
-newtype Product a = Product a
-getProduct :: forall a . Product a -> a
-getProduct (Product a) = a
-
-instance forall a . Num a => Semigroup (Product a) where
- Product a <> Product b = Product (a * b)
-
-instance forall a . (Num a) => Monoid (Product a) where
- mempty = Product 1
-
----------------------
-
-newtype All = All Bool
-getAll :: All -> Bool
-getAll (All a) = a
-
-instance Semigroup All where
- All a <> All b = All (a && b)
-
-instance Monoid All where
- mempty = All True
-
----------------------
-
-newtype Any = Any Bool
-getAny :: Any -> Bool
-getAny (Any a) = a
-
-instance Semigroup Any where
- Any a <> Any b = Any (a || b)
-
-instance Monoid Any where
- mempty = Any False
-
----------------------
-
-newtype First a = First (Maybe a)
-getFirst :: forall a . First a -> Maybe a
-getFirst (First a) = a
-
instance forall a . Semigroup (First a) where
a@(First (Just _)) <> _ = a
First Nothing <> a = a
@@ -136,11 +28,8 @@
instance forall a . Monoid (First a) where
mempty = First Nothing
----------------------
-newtype Last a = Last (Maybe a)
-getLast :: forall a . Last a -> Maybe a
-getLast (Last a) = a
+newtype Last a = Last { getLast :: Maybe a }
instance forall a . Semigroup (Last a) where
_ <> a@(Last (Just _)) = a
@@ -148,13 +37,3 @@
instance forall a . Monoid (Last a) where
mempty = Last Nothing
-
----------------------
-
-instance Semigroup Ordering where
- LT <> _ = LT
- EQ <> o = o
- GT <> _ = GT
-
-instance Monoid Ordering where
- mempty = EQ
--- /dev/null
+++ b/lib/Data/Monoid/Internal.hs
@@ -1,0 +1,251 @@
+module Data.Monoid.Internal(module Data.Monoid.Internal) where
+import Prelude() -- do not import Prelude
+import Primitives
+import Control.Applicative
+import Control.Error
+import Data.Bool
+import Data.Bounded
+import Data.Eq
+import Data.Function
+import Data.Functor
+import Data.Int
+import Data.Integral
+import Data.List_Type
+import Data.List.NonEmpty_Type
+import Data.Ord
+import Data.Maybe_Type
+import Data.Num
+import Data.Records
+import Text.Show
+
+class Semigroup a => Monoid a where
+ mempty :: a
+ mappend :: a -> a -> a
+ mappend = (<>)
+ mconcat :: [a] -> a
+ mconcat [] = mempty
+ mconcat (a:as) = a <> mconcat as
+
+---------------------
+
+instance (Monoid b) => Monoid (a -> b) where
+ mempty _ = mempty
+
+instance (Semigroup b) => Semigroup (a -> b) where
+ f <> g = \ x -> f x <> g x
+
+---------------------
+
+newtype Endo a = Endo { appEndo :: a -> a }
+
+instance forall a . Semigroup (Endo a) where
+ Endo f <> Endo g = Endo (f . g)
+
+instance forall a . Monoid (Endo a) where
+ mempty = Endo id
+
+---------------------
+
+newtype Dual a = Dual { getDual :: a }
+ deriving (Bounded, Eq, Ord, Show)
+
+instance forall a . Semigroup a => Semigroup (Dual a) where
+ Dual a <> Dual b = Dual (b <> a)
+
+instance forall a . Monoid a => Monoid (Dual a) where
+ mempty = Dual mempty
+
+instance Functor Dual where
+ fmap f (Dual a) = Dual (f a)
+
+instance Applicative Dual where
+ pure = Dual
+ Dual f <*> Dual b = Dual (f b)
+
+---------------------
+
+newtype Max a = Max { getMax :: a }
+ deriving (Bounded, Eq, Ord, Show)
+
+instance forall a . Ord a => Semigroup (Max a) where
+ Max a <> Max b = Max (a `max` b)
+ stimes = stimesIdempotent
+
+instance forall a . (Ord a, Bounded a) => Monoid (Max a) where
+ mempty = Max minBound
+
+---------------------
+
+newtype Min a = Min { getMin :: a }
+ deriving (Bounded, Eq, Ord, Show)
+
+instance forall a . Ord a => Semigroup (Min a) where
+ Min a <> Min b = Min (a `min` b)
+ stimes = stimesIdempotent
+
+instance forall a . (Ord a, Bounded a) => Monoid (Min a) where
+ mempty = Min maxBound
+
+---------------------
+
+newtype Sum a = Sum { getSum :: a }
+ deriving (Bounded, Eq, Ord, Show)
+
+instance forall a . Num a => Semigroup (Sum a) where
+ Sum a <> Sum b = Sum (a + b)
+
+instance forall a . (Num a) => Monoid (Sum a) where
+ mempty = Sum 0
+
+---------------------
+
+newtype Product a = Product { getProduct :: a }
+ deriving (Bounded, Eq, Ord, Show)
+
+instance forall a . Num a => Semigroup (Product a) where
+ Product a <> Product b = Product (a * b)
+
+instance forall a . (Num a) => Monoid (Product a) where
+ mempty = Product 1
+
+---------------------
+
+newtype All = All { getAll :: Bool }
+ deriving (Bounded, Eq, Ord, Show)
+
+instance Semigroup All where
+ All a <> All b = All (a && b)
+
+instance Monoid All where
+ mempty = All True
+
+---------------------
+
+newtype Any = Any { getAny :: Bool }
+ deriving (Bounded, Eq, Ord, Show)
+
+instance Semigroup Any where
+ Any a <> Any b = Any (a || b)
+
+instance Monoid Any where
+ mempty = Any False
+
+---------------------
+
+instance Semigroup Ordering where
+ LT <> _ = LT
+ EQ <> o = o
+ GT <> _ = GT
+
+instance Monoid Ordering where
+ mempty = EQ
+
+----------------------
+
+data Arg a b = Arg a b
+ deriving(Show)
+
+type ArgMin a b = Min (Arg a b)
+
+type ArgMax a b = Max (Arg a b)
+
+instance Functor (Arg a) where
+ fmap f (Arg x a) = Arg x (f a)
+
+instance Eq a => Eq (Arg a b) where
+ Arg a _ == Arg b _ = a == b
+
+instance Ord a => Ord (Arg a b) where
+ Arg a _ `compare` Arg b _ = compare a b
+ min x@(Arg a _) y@(Arg b _)
+ | a <= b = x
+ | otherwise = y
+ max x@(Arg a _) y@(Arg b _)
+ | a >= b = x
+ | otherwise = y
+
+----------------------
+
+newtype Alt f a = Alt (f a)
+-- deriving (Show)
+getAlt :: Alt f a -> f a
+getAlt (Alt x) = x
+{-
+ deriving ( Generic -- ^ @since base-4.8.0.0
+ , Generic1 -- ^ @since base-4.8.0.0
+ , Read -- ^ @since base-4.8.0.0
+ , Show -- ^ @since base-4.8.0.0
+ , Eq -- ^ @since base-4.8.0.0
+ , Ord -- ^ @since base-4.8.0.0
+ , Num -- ^ @since base-4.8.0.0
+ , Enum -- ^ @since base-4.8.0.0
+ , Monad -- ^ @since base-4.8.0.0
+ , MonadPlus -- ^ @since base-4.8.0.0
+ , Applicative -- ^ @since base-4.8.0.0
+ , Alternative -- ^ @since base-4.8.0.0
+ , Functor -- ^ @since base-4.8.0.0
+ )
+-}
+
+instance Alternative f => Semigroup (Alt f a) where
+ Alt x <> Alt y = Alt (x <|> y)
+ stimes = stimesMonoid
+
+instance Alternative f => Monoid (Alt f a) where
+ mempty = Alt empty
+
+----------------------
+
+-- This really belongs in Data.Semigroup,
+-- but some functions have Monoid as in the context.
+
+infixr 6 <>
+class Semigroup a where
+ (<>) :: a -> a -> a
+ sconcat :: NonEmpty a -> a
+ stimes :: (Integral b, Ord b) => b -> a -> a
+
+ sconcat (a :| as) = go a as
+ where go b (c:cs) = b <> go c cs
+ go b [] = b
+
+ stimes y0 x0
+ | y0 <= 0 = error "stimes: positive multiplier expected"
+ | otherwise = f x0 y0
+ where
+ f x y
+ | y `rem` 2 == 0 = f (x <> x) (y `quot` 2)
+ | y == 1 = x
+ | otherwise = g (x <> x) (y `quot` 2) x
+ g x y z
+ | y `rem` 2 == 0 = g (x <> x) (y `quot` 2) z
+ | y == 1 = x <> z
+ | otherwise = g (x <> x) (y `quot` 2) (x <> z)
+
+stimesIdempotent :: (Integral b, Ord b) => b -> a -> a
+stimesIdempotent n x =
+ if n <= 0 then error "stimesIdempotent: positive multiplier expected"
+ else x
+
+stimesIdempotentMonoid :: (Ord b, Integral b, Monoid a) => b -> a -> a
+stimesIdempotentMonoid n x = case compare n 0 of
+ LT -> error "stimesIdempotentMonoid: negative multiplier"
+ EQ -> mempty
+ GT -> x
+
+stimesMonoid :: (Ord b, Integral b, Monoid a) => b -> a -> a
+stimesMonoid n x0 = case compare n 0 of
+ LT -> error "stimesMonoid: negative multiplier"
+ EQ -> mempty
+ GT -> f x0 n
+ where
+ f x y
+ | even y = f (x `mappend` x) (y `quot` 2)
+ | y == 1 = x
+ | otherwise = g (x `mappend` x) (y `quot` 2) x
+ g x y z
+ | even y = g (x `mappend` x) (y `quot` 2) z
+ | y == 1 = x `mappend` z
+ | otherwise = g (x `mappend` x) (y `quot` 2) (x `mappend` z)
+
+---------------------
--- a/lib/Data/Ord.hs
+++ b/lib/Data/Ord.hs
@@ -6,6 +6,7 @@
import Primitives
import Data.Bool_Type
import Data.Bounded
+import Data.Functor
import Data.Ordering_Type
import Data.Eq
import Text.Show
@@ -50,3 +51,62 @@
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering
comparing f x y = compare (f x) (f y)
+
+{-
+newtype Down a = Down
+ { getDown :: a -- ^ @since 4.14.0.0
+ }
+ deriving
+ ( Eq -- ^ @since 4.6.0.0
+ , Num -- ^ @since 4.11.0.0
+ , Semigroup -- ^ @since 4.11.0.0
+ , Monoid -- ^ @since 4.11.0.0
+ , Bits -- ^ @since 4.14.0.0
+ , FiniteBits -- ^ @since 4.14.0.0
+ , Floating -- ^ @since 4.14.0.0
+ , Fractional -- ^ @since 4.14.0.0
+ , Ix -- ^ @since 4.14.0.0
+ , Real -- ^ @since 4.14.0.0
+ , RealFrac -- ^ @since 4.14.0.0
+ , RealFloat -- ^ @since 4.14.0.0
+ , Storable -- ^ @since 4.14.0.0
+ )
+-}
+
+newtype Down a = Down a
+
+getDown :: Down a -> a
+getDown (Down a) = a
+
+{-
+instance (Read a) => Read (Down a) where
+ readsPrec d = readParen (d > 10) $ \ r ->
+ [(Down x,t) | ("Down",s) <- lex r, (x,t) <- readsPrec 11 s]
+-}
+{- In Data.Orphans
+instance (Show a) => Show (Down a) where
+-}
+
+instance Eq a => Eq (Down a) where
+ Down x == Down y = x == y
+
+instance Ord a => Ord (Down a) where
+ compare (Down x) (Down y) = y `compare` x
+
+instance Bounded a => Bounded (Down a) where
+ minBound = Down maxBound
+ maxBound = Down minBound
+
+instance Functor Down where
+ fmap f (Down a) = Down (f a)
+
+{-
+-- | @since 4.11.0.0
+instance Applicative Down where
+ pure = Down
+ (<*>) = coerce
+
+-- | @since 4.11.0.0
+instance Monad Down where
+ Down a >>= k = k a
+-}
--- /dev/null
+++ b/lib/Data/Orphans.hs
@@ -1,0 +1,8 @@
+-- Instance declarations that can't be put where
+-- due to import cycles.
+module Data.Orphans where
+import Prelude(); import MiniPrelude
+
+instance (Show a) => Show (Down a) where
+ showsPrec d (Down x) = showParen (d > 10) $
+ showString "Down " . showsPrec 11 x
--- a/lib/Data/Ratio.hs
+++ b/lib/Data/Ratio.hs
@@ -2,6 +2,7 @@
Ratio, Rational,
(%),
numerator, denominator,
+ approxRational,
rationalInfinity,
rationalNaN,
rationalMinusZero,
@@ -17,6 +18,7 @@
import Data.Ord
import Data.Ratio_Type
import Data.Real
+import Data.RealFrac
import Text.Show
{- in Data.Ratio_Type
@@ -98,3 +100,43 @@
denominator :: forall a . Ratio a -> a
denominator (_ :% y) = y
+
+instance (Ord a, Integral a) => RealFrac (Ratio a) where
+ properFraction (x:%y) = (fromInteger (toInteger q), r:%y)
+ where (q, r) = quotRem x y
+ round r =
+ let
+ (n, f) = properFraction r
+ x = if r < 0 then -1 else 1
+ in case (compare (abs f) 0.5, odd n) of
+ (LT, _) -> n
+ (EQ, False) -> n
+ (EQ, True) -> n + x
+ (GT, _) -> n + x
+
+approxRational :: (RealFrac a) => a -> a -> Rational
+approxRational rat eps =
+ simplest (toRational rat - toRational eps) (toRational rat + toRational eps)
+ where
+ simplest x y
+ | y < x = simplest y x
+ | x == y = xr
+ | x > 0 = simplest' n d n' d'
+ | y < 0 = - simplest' (-n') d' (-n) d
+ | otherwise = 0 :% 1
+ where xr = toRational x
+ n = numerator xr
+ d = denominator xr
+ nd' = toRational y
+ n' = numerator nd'
+ d' = denominator nd'
+
+ simplest' n d n' d' -- assumes 0 < n%d < n'%d'
+ | r == 0 = q :% 1
+ | q /= q' = (q+1) :% 1
+ | otherwise = (q*n''+d'') :% n''
+ where (q,r) = quotRem n d
+ (q',r') = quotRem n' d'
+ nd'' = simplest' d' r' d r
+ n'' = numerator nd''
+ d'' = denominator nd''
--- a/lib/Data/Records.hs
+++ b/lib/Data/Records.hs
@@ -9,7 +9,6 @@
import Primitives
import Data.Function
import Data.Proxy
-import Data.Tuple
type Get r a = r -> a
type Set r a = r -> a -> r
@@ -30,27 +29,3 @@
composeSet gs1 b_to_c_to_b a c =
case gs1 a of
(b, b_to_a) -> b_to_a (b_to_c_to_b b c)
-
------------------------------------
--- Virtual fields for tuples.
-
-instance forall a b . HasField "_1" (a, b) a where getField _ (a, b) = a
-instance forall a b . SetField "_1" (a, b) a where setField _ (a, b) = \ a -> (a, b)
-instance forall a b . HasField "_2" (a, b) b where getField _ (a, b) = b
-instance forall a b . SetField "_2" (a, b) b where setField _ (a, b) = \ b -> (a, b)
-
-instance forall a b c . HasField "_1" (a, b, c) a where getField _ (a, b, c) = a
-instance forall a b c . SetField "_1" (a, b, c) a where setField _ (a, b, c) = \ a -> (a, b, c)
-instance forall a b c . HasField "_2" (a, b, c) b where getField _ (a, b, c) = b
-instance forall a b c . SetField "_2" (a, b, c) b where setField _ (a, b, c) = \ b -> (a, b, c)
-instance forall a b c . HasField "_3" (a, b, c) c where getField _ (a, b, c) = c
-instance forall a b c . SetField "_3" (a, b, c) c where setField _ (a, b, c) = \ c -> (a, b, c)
-
-instance forall a b c d . HasField "_1" (a, b, c, d) a where getField _ (a, b, c, d) = a
-instance forall a b c d . SetField "_1" (a, b, c, d) a where setField _ (a, b, c, d) = \ a -> (a, b, c, d)
-instance forall a b c d . HasField "_2" (a, b, c, d) b where getField _ (a, b, c, d) = b
-instance forall a b c d . SetField "_2" (a, b, c, d) b where setField _ (a, b, c, d) = \ b -> (a, b, c, d)
-instance forall a b c d . HasField "_3" (a, b, c, d) c where getField _ (a, b, c, d) = c
-instance forall a b c d . SetField "_3" (a, b, c, d) c where setField _ (a, b, c, d) = \ c -> (a, b, c, d)
-instance forall a b c d . HasField "_4" (a, b, c, d) d where getField _ (a, b, c, d) = d
-instance forall a b c d . SetField "_4" (a, b, c, d) d where setField _ (a, b, c, d) = \ d -> (a, b, c, d)
--- a/lib/Data/STRef.hs
+++ b/lib/Data/STRef.hs
@@ -2,7 +2,7 @@
STRef,
newSTRef, readSTRef, writeSTRef, modifySTRef,
) where
-import Prelude
+import Prelude(); import MiniPrelude
import Control.Monad.ST_Type
import Data.IORef
--- a/lib/Data/Semigroup.hs
+++ b/lib/Data/Semigroup.hs
@@ -1,7 +1,158 @@
-module Data.Semigroup(module Data.Semigroup) where
+module Data.Semigroup(
+ Semigroup(..),
+ Endo(..),
+ Dual(..),
+ Max(..),
+ Min(..),
+ Sum(..),
+ Product(..),
+ All(..),
+ Any(..),
+ Arg(..), ArgMin, ArgMax,
+ Alt(..),
+ First(..),
+ Last(..),
+ stimesIdempotent, stimesIdempotentMonoid, stimesMonoid,
+ diff, cycle1,
+ ) where
import Prelude() -- do not import Prelude
-import Primitives
+import Data.Bool
+import Data.Bounded
+import Data.Eq
+import Data.Function
+import Data.List.NonEmpty_Type
+import Data.Ord
+import Data.Monoid.Internal
+import Data.Records
+import Text.Show
-infixr 6 <>
-class Semigroup a where
- (<>) :: a -> a -> a
+{-
+newtype First a = First { getFirst :: a }
+ deriving ( Bounded -- ^ @since 4.9.0.0
+ , Eq -- ^ @since 4.9.0.0
+ , Ord -- ^ @since 4.9.0.0
+ , Show -- ^ @since 4.9.0.0
+ , Read -- ^ @since 4.9.0.0
+ , Data -- ^ @since 4.9.0.0
+ , Generic -- ^ @since 4.9.0.0
+ , Generic1 -- ^ @since 4.9.0.0
+ )
+
+instance Enum a => Enum (First a) where
+ succ (First a) = First (succ a)
+ pred (First a) = First (pred a)
+ toEnum = First . toEnum
+ fromEnum = fromEnum . getFirst
+ enumFrom (First a) = First `fmap` enumFrom a
+ enumFromThen (First a) (First b) = First `fmap` enumFromThen a b
+ enumFromTo (First a) (First b) = First `fmap` enumFromTo a b
+ enumFromThenTo (First a) (First b) (First c) = First `fmap` enumFromThenTo a b c
+-}
+
+newtype First a = First { getFirst :: a }
+ deriving(Eq, Ord, Show, Bounded)
+
+instance Semigroup (First a) where
+ a <> _ = a
+ stimes = stimesIdempotent
+ sconcat (x :| _) = x
+
+{-
+-- | @since 4.9.0.0
+instance Functor First where
+ fmap f (First x) = First (f x)
+
+-- | @since 4.9.0.0
+instance Foldable First where
+ foldMap f (First a) = f a
+
+-- | @since 4.9.0.0
+instance Traversable First where
+ traverse f (First a) = First `fmap` f a
+
+-- | @since 4.9.0.0
+instance Applicative First where
+ pure x = First x
+ a <* _ = a
+ _ *> a = a
+ (<*>) = coerce
+ liftA2 = coerce
+
+-- | @since 4.9.0.0
+instance Monad First where
+ (>>) = (*>)
+ First a >>= f = f a
+
+-- | @since 4.9.0.0
+instance MonadFix First where
+ mfix f = fix (f . getFirst)
+-}
+
+{-
+newtype Last a = Last { getLast :: a }
+ deriving ( Bounded -- ^ @since 4.9.0.0
+ , Eq -- ^ @since 4.9.0.0
+ , Ord -- ^ @since 4.9.0.0
+ , Show -- ^ @since 4.9.0.0
+ , Read -- ^ @since 4.9.0.0
+ , Data -- ^ @since 4.9.0.0
+ , Generic -- ^ @since 4.9.0.0
+ , Generic1 -- ^ @since 4.9.0.0
+ )
+
+-- | @since 4.9.0.0
+instance Enum a => Enum (Last a) where
+ succ (Last a) = Last (succ a)
+ pred (Last a) = Last (pred a)
+ toEnum = Last . toEnum
+ fromEnum = fromEnum . getLast
+ enumFrom (Last a) = Last `fmap` enumFrom a
+ enumFromThen (Last a) (Last b) = Last `fmap` enumFromThen a b
+ enumFromTo (Last a) (Last b) = Last `fmap` enumFromTo a b
+ enumFromThenTo (Last a) (Last b) (Last c) = Last `fmap` enumFromThenTo a b c
+-}
+
+newtype Last a = Last { getLast :: a }
+ deriving(Eq, Ord, Show, Bounded)
+
+instance Semigroup (Last a) where
+ _ <> b = b
+ stimes = stimesIdempotent
+
+{-
+-- | @since 4.9.0.0
+instance Functor Last where
+ fmap f (Last x) = Last (f x)
+ a <$ _ = Last a
+
+-- | @since 4.9.0.0
+instance Foldable Last where
+ foldMap f (Last a) = f a
+
+-- | @since 4.9.0.0
+instance Traversable Last where
+ traverse f (Last a) = Last `fmap` f a
+
+-- | @since 4.9.0.0
+instance Applicative Last where
+ pure = Last
+ a <* _ = a
+ _ *> a = a
+ (<*>) = coerce
+ liftA2 = coerce
+
+-- | @since 4.9.0.0
+instance Monad Last where
+ (>>) = (*>)
+ Last a >>= f = f a
+
+-- | @since 4.9.0.0
+instance MonadFix Last where
+ mfix f = fix (f . getLast)
+-}
+
+diff :: Semigroup m => m -> Endo m
+diff = Endo . (<>)
+
+cycle1 :: Semigroup m => m -> m
+cycle1 xs = xs' where xs' = xs <> xs'
--- /dev/null
+++ b/lib/Data/Text.hs
@@ -1,0 +1,53 @@
+module Data.Text(
+ Text,
+ pack, unpack,
+ empty,
+ append,
+ head,
+ ) where
+import Prelude(); import MiniPrelude hiding(head)
+import Data.Monoid.Internal
+import Data.String
+import qualified Data.ByteString.Internal as BS
+
+newtype Text = T BS.ByteString
+
+instance Eq Text where
+ (==) = cmp (==)
+ (/=) = cmp (/=)
+
+instance Ord Text where
+ (<) = cmp (<)
+ (<=) = cmp (<=)
+ (>) = cmp (>)
+ (>=) = cmp (>=)
+
+cmp :: (BS.ByteString -> BS.ByteString -> Bool) -> (Text -> Text -> Bool)
+cmp op (T x) (T y) = op x y
+
+instance Show Text where
+ showsPrec p = showsPrec p . unpack
+
+instance IsString Text where
+ fromString = pack
+
+instance Semigroup Text where
+ (<>) = append
+
+instance Monoid Text where
+ mempty = empty
+
+empty :: Text
+empty = pack []
+
+pack :: String -> Text
+pack s = T (primitive "toUTF8" s)
+
+unpack :: Text -> String
+unpack (T t) = primitive "fromUTF8" t
+
+append :: Text -> Text -> Text
+append (T x) (T y) = T (BS.append x y)
+
+head :: Text -> Char
+head (T t) = primitive "headUTF8" t
--- a/lib/Data/Traversable.hs
+++ b/lib/Data/Traversable.hs
@@ -19,7 +19,6 @@
-- * Utility functions
for,
forM,
-{-
forAccumM,
mapAccumL,
mapAccumR,
@@ -27,24 +26,24 @@
-- * General definitions for superclass methods
fmapDefault,
foldMapDefault,
--}
) where
import Prelude() -- do not import Prelude
import Primitives
import Control.Applicative
-import Control.Monad(Monad(..), MonadPlus(..))
+import Control.Error
+import Control.Monad(Monad(..), MonadPlus(..), liftM)
--import Data.Coerce
import Data.Either
import Data.Foldable
+import Data.Foldable.Internal(StateL(..), runStateL, StateR(..), runStateR, StateT(..), runStateT)
import Data.Function
import Data.Functor
import Data.Functor.Const
import Data.Functor.Identity
---import Data.Functor.Utils ( StateL(..), StateR(..), StateT(..), (#.) )
import Data.List_Type
import qualified Data.List as List
import Data.Maybe
-import Data.Monoid
+import Data.Monoid.Internal
import Data.Proxy
--import Data.Ord ( Down(..) )
--import Data.Proxy ( Proxy(..) )
@@ -143,6 +142,8 @@
instance Traversable ZipList where
traverse f (ZipList x) = ZipList <$> traverse f x
+instance Traversable (Arg a) where
+ traverse f (Arg x a) = Arg x `fmap` f a
-- Instances for GHC.Generics
-- | @since 4.9.0.0
@@ -212,20 +213,25 @@
forM :: forall (t :: Type -> Type) (m :: Type -> Type) a b . (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b)
forM = flip mapM
-{-
mapAccumL :: forall t s a b. Traversable t
=> (s -> a -> (s, b)) -> s -> t a -> (s, t b)
-mapAccumL f s t = coerce (traverse @t @(StateL s) @a @b) (flip f) t s
+mapAccumL f s t =
+ runStateL (traverse (StateL . flip f) t) s
+ --coerce (traverse @t @(StateL s) @a @b) (flip f) t s
mapAccumR :: forall t s a b. Traversable t
=> (s -> a -> (s, b)) -> s -> t a -> (s, t b)
-mapAccumR f s t = coerce (traverse @t @(StateR s) @a @b) (flip f) t s
+mapAccumR f s t =
+ runStateR (traverse (StateR . flip f) t) s
+ --coerce (traverse @t @(StateR s) @a @b) (flip f) t s
mapAccumM
:: forall m t s a b. (Monad m, Traversable t)
=> (s -> a -> m (s, b))
-> s -> t a -> m (s, t b)
-mapAccumM f s t = coerce (mapM @t @(StateT s m) @a @b) (StateT #. flip f) t s
+mapAccumM f s t =
+ runStateT (traverse (StateT . flip f) t) s
+ -- coerce (mapM @t @(StateT s m) @a @b) (StateT #. flip f) t s
forAccumM
:: (Monad m, Traversable t)
@@ -232,8 +238,6 @@
=> s -> t a -> (s -> a -> m (s, b)) -> m (s, t b)
forAccumM s t f = mapAccumM f s t
--}
-
fmapDefault :: forall t a b . Traversable t
=> (a -> b) -> t a -> t b
fmapDefault f = runIdentity . traverse (Identity . f)
@@ -241,3 +245,6 @@
foldMapDefault :: forall t m a . (Traversable t, Monoid m)
=> (a -> m) -> t a -> m
foldMapDefault f = getConst . traverse (Const . f)
+
+-----------------------
+
--- a/lib/Data/Tuple.hs
+++ b/lib/Data/Tuple.hs
@@ -11,9 +11,9 @@
import Data.Eq
import Data.Function
import Data.Int
-import Data.Monoid
+import Data.Monoid.Internal
+import Data.Records
import Data.Ord
-import Data.Semigroup
import Text.Show
--data (a,b) = (a,b) -- all tuples are built in
@@ -142,3 +142,28 @@
instance forall a b c d . (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a, b, c, d) where
mempty = (mempty, mempty, mempty, mempty)
+
+
+-----------------------------------
+-- Virtual fields for tuples.
+
+instance forall a b . HasField "_1" (a, b) a where getField _ (a, b) = a
+instance forall a b . SetField "_1" (a, b) a where setField _ (a, b) = \ a -> (a, b)
+instance forall a b . HasField "_2" (a, b) b where getField _ (a, b) = b
+instance forall a b . SetField "_2" (a, b) b where setField _ (a, b) = \ b -> (a, b)
+
+instance forall a b c . HasField "_1" (a, b, c) a where getField _ (a, b, c) = a
+instance forall a b c . SetField "_1" (a, b, c) a where setField _ (a, b, c) = \ a -> (a, b, c)
+instance forall a b c . HasField "_2" (a, b, c) b where getField _ (a, b, c) = b
+instance forall a b c . SetField "_2" (a, b, c) b where setField _ (a, b, c) = \ b -> (a, b, c)
+instance forall a b c . HasField "_3" (a, b, c) c where getField _ (a, b, c) = c
+instance forall a b c . SetField "_3" (a, b, c) c where setField _ (a, b, c) = \ c -> (a, b, c)
+
+instance forall a b c d . HasField "_1" (a, b, c, d) a where getField _ (a, b, c, d) = a
+instance forall a b c d . SetField "_1" (a, b, c, d) a where setField _ (a, b, c, d) = \ a -> (a, b, c, d)
+instance forall a b c d . HasField "_2" (a, b, c, d) b where getField _ (a, b, c, d) = b
+instance forall a b c d . SetField "_2" (a, b, c, d) b where setField _ (a, b, c, d) = \ b -> (a, b, c, d)
+instance forall a b c d . HasField "_3" (a, b, c, d) c where getField _ (a, b, c, d) = c
+instance forall a b c d . SetField "_3" (a, b, c, d) c where setField _ (a, b, c, d) = \ c -> (a, b, c, d)
+instance forall a b c d . HasField "_4" (a, b, c, d) d where getField _ (a, b, c, d) = d
+instance forall a b c d . SetField "_4" (a, b, c, d) d where setField _ (a, b, c, d) = \ d -> (a, b, c, d)
--- /dev/null
+++ b/lib/Data/Tuple/Instances.hs
@@ -1,0 +1,33 @@
+module Data.Tuple.Instances where
+
+-- Dubious instances for tuples
+
+instance Functor ((,) a1) where
+ fmap f (a1, a) = (a1, f a)
+
+instance Functor ((,,) a1 a2) where
+ fmap f (a1, a2, a) = (a1, a2, f a)
+
+instance Functor ((,,,) a1 a2 a3) where
+ fmap f (a1, a2, a3, a) = (a1, a2, a3, f a)
+
+instance (Monoid a1) => Applicative ((,) a1) where
+ pure a = (mempty, a)
+ (a1, f) <*> (a1', a) = (a1 <> a1', f a)
+
+instance (Monoid a1, Monoid a2) => Applicative ((,,) a1 a2) where
+ pure a = (mempty, mempty, a)
+ (a1, a2, f) <*> (a1', a2', a) = (a1 <> a1', a2 <> a2', f a)
+
+instance (Monoid a1, Monoid a2, Monoid a3) => Applicative ((,,,) a1 a2 a3) where
+ pure a = (mempty, mempty, mempty, a)
+ (a1, a2, a3, f) <*> (a1', a2', a3', a) = (a1 <> a1', a2 <> a2', a3 <> a3', f a)
+
+instance Monoid a1 => Monad ((,) a1) where
+ (a1, a) >>= k = case k a of (a1', b) -> (a1 <> a1', b)
+
+instance (Monoid a1, Monoid a2) => Monad ((,,) a1 a2) where
+ (a1, a2, a) >>= k = case k a of (a1', a2', b) -> (a1 <> a1', a2 <> a2', b)
+
+instance (Monoid a1, Monoid a2, Monoid a3) => Monad ((,,,) a1 a2 a3) where
+ (a1, a2, a3, a) >>= k = case k a of (a1', a2', a3', b) -> (a1 <> a1', a2 <> a2', a3 <> a3', b)
--- a/lib/Data/Type/Equality.hs
+++ b/lib/Data/Type/Equality.hs
@@ -1,5 +1,5 @@
module Data.Type.Equality(module Data.Type.Equality) where
-import Prelude
+import Prelude(); import MiniPrelude
type (:~:) :: forall k . k -> k -> Type
data a :~: b = (a ~ b) => Refl
--- a/lib/Data/TypeLits.hs
+++ b/lib/Data/TypeLits.hs
@@ -4,8 +4,10 @@
KnownNat(..),
KnownSymbol(..),
) where
+import Prelude()
import Primitives
-import Prelude
+import Data.Char_Type
+import Data.Integer
class KnownNat (n :: Nat) where
natVal :: forall (proxy :: Nat -> Type) . proxy n -> Integer
--- a/lib/Data/Typeable.hs
+++ b/lib/Data/Typeable.hs
@@ -17,8 +17,11 @@
typeRepTyCon,
typeRepArgs,
) where
+import Prelude(); import MiniPrelude
import Primitives
import Control.Monad.ST
+import Data.Double
+import Data.Integer
import Data.IORef
import Data.Proxy
import Data.Ratio
--- a/lib/Data/Version.hs
+++ b/lib/Data/Version.hs
@@ -3,6 +3,7 @@
showVersion,
makeVersion
) where
+import Prelude(); import MiniPrelude
import Data.List(intercalate)
data Version = Version { versionBranch :: [Int] }
--- a/lib/Data/Void.hs
+++ b/lib/Data/Void.hs
@@ -1,5 +1,5 @@
module Data.Void(module Data.Void) where
-import Prelude
+import Prelude(); import MiniPrelude
data Void
--- a/lib/Data/Word.hs
+++ b/lib/Data/Word.hs
@@ -19,8 +19,7 @@
import Data.Num
import Data.Ord
import Data.Real
-import Numeric
-import Text.Read
+import Numeric.Show
import Text.Show
instance Num Word where
@@ -46,8 +45,10 @@
instance Show Word where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Word where
readsPrec = readIntegral
+-}
--------------------------------
@@ -74,6 +75,7 @@
(/=) = primWordNE
instance Ord Word where
+ compare = primWordCompare
(<) = primWordLT
(<=) = primWordLE
(>) = primWordGT
@@ -93,7 +95,11 @@
bit n = primWordShl 1 n
zeroBits = 0
---------------------------------------------------------------------------------
+
+instance FiniteBits Word where
+ finiteBitSize _ = _wordSize
+
+--------------------------------------------------------------------------------
---- Word8
newtype Word8 = W8 Word
@@ -109,7 +115,7 @@
bini8 :: (Word -> Int -> Word) -> (Word8 -> Int -> Word8)
bini8 op (W8 x) y = w8 (x `op` y)
-cmp8 :: (Word -> Word -> Bool) -> (Word8 -> Word8 -> Bool)
+cmp8 :: (Word -> Word -> a) -> (Word8 -> Word8 -> a)
cmp8 op (W8 x) (W8 y) = x `op` y
una8 :: (Word -> Word) -> (Word8 -> Word8)
@@ -138,8 +144,10 @@
instance Show Word8 where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Word8 where
readsPrec = readIntegral
+-}
instance Enum Word8 where
succ x = x + 1
@@ -162,6 +170,7 @@
(/=) = cmp8 primWordNE
instance Ord Word8 where
+ compare = cmp8 primWordCompare
(<) = cmp8 primWordLT
(<=) = cmp8 primWordLE
(>) = cmp8 primWordGT
@@ -179,7 +188,10 @@
bit n = w8 (primWordShl 1 n)
zeroBits = 0
---------------------------------------------------------------------------------
+instance FiniteBits Word8 where
+ finiteBitSize _ = 8
+
+--------------------------------------------------------------------------------
---- Word16
newtype Word16 = W16 Word
@@ -195,7 +207,7 @@
bini16 :: (Word -> Int -> Word) -> (Word16 -> Int -> Word16)
bini16 op (W16 x) y = w16 (x `op` y)
-cmp16 :: (Word -> Word -> Bool) -> (Word16 -> Word16 -> Bool)
+cmp16 :: (Word -> Word -> a) -> (Word16 -> Word16 -> a)
cmp16 op (W16 x) (W16 y) = x `op` y
una16 :: (Word -> Word) -> (Word16 -> Word16)
@@ -224,8 +236,10 @@
instance Show Word16 where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Word16 where
readsPrec = readIntegral
+-}
instance Enum Word16 where
succ x = x + 1
@@ -248,6 +262,7 @@
(/=) = cmp16 primWordNE
instance Ord Word16 where
+ compare = cmp16 primWordCompare
(<) = cmp16 primWordLT
(<=) = cmp16 primWordLE
(>) = cmp16 primWordGT
@@ -265,7 +280,10 @@
bit n = w16 (primWordShl 1 n)
zeroBits = 0
---------------------------------------------------------------------------------
+instance FiniteBits Word16 where
+ finiteBitSize _ = 16
+
+--------------------------------------------------------------------------------
---- Word32
newtype Word32 = W32 Word
@@ -281,7 +299,7 @@
bini32 :: (Word -> Int -> Word) -> (Word32 -> Int -> Word32)
bini32 op (W32 x) y = w32 (x `op` y)
-cmp32 :: (Word -> Word -> Bool) -> (Word32 -> Word32 -> Bool)
+cmp32 :: (Word -> Word -> a) -> (Word32 -> Word32 -> a)
cmp32 op (W32 x) (W32 y) = x `op` y
una32 :: (Word -> Word) -> (Word32 -> Word32)
@@ -310,8 +328,10 @@
instance Show Word32 where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Word32 where
readsPrec = readIntegral
+-}
instance Enum Word32 where
succ x = x + 1
@@ -334,6 +354,7 @@
(/=) = cmp32 primWordNE
instance Ord Word32 where
+ compare = cmp32 primWordCompare
(<) = cmp32 primWordLT
(<=) = cmp32 primWordLE
(>) = cmp32 primWordGT
@@ -351,7 +372,10 @@
bit n = w32 (primWordShl 1 n)
zeroBits = 0
---------------------------------------------------------------------------------
+instance FiniteBits Word32 where
+ finiteBitSize _ = 32
+
+--------------------------------------------------------------------------------
---- Word64
newtype Word64 = W64 Word
@@ -367,7 +391,7 @@
bini64 :: (Word -> Int -> Word) -> (Word64 -> Int -> Word64)
bini64 op (W64 x) y = w64 (x `op` y)
-cmp64 :: (Word -> Word -> Bool) -> (Word64 -> Word64 -> Bool)
+cmp64 :: (Word -> Word -> a) -> (Word64 -> Word64 -> a)
cmp64 op (W64 x) (W64 y) = x `op` y
una64 :: (Word -> Word) -> (Word64 -> Word64)
@@ -396,8 +420,10 @@
instance Show Word64 where
showsPrec = showIntegral
+{- in Text.Read.Internal
instance Read Word64 where
readsPrec = readIntegral
+-}
instance Enum Word64 where
succ x = x + 1
@@ -420,6 +446,7 @@
(/=) = cmp64 primWordNE
instance Ord Word64 where
+ compare = cmp64 primWordCompare
(<) = cmp64 primWordLT
(<=) = cmp64 primWordLE
(>) = cmp64 primWordGT
@@ -436,3 +463,6 @@
bitSize _ = 64
bit n = w64 (primWordShl 1 n)
zeroBits = 0
+
+instance FiniteBits Word64 where
+ finiteBitSize _ = 64
--- a/lib/Debug/Trace.hs
+++ b/lib/Debug/Trace.hs
@@ -1,5 +1,5 @@
module Debug.Trace(module Debug.Trace) where
-import Prelude
+import Prelude(); import MiniPrelude
import Primitives
trace :: forall a . String -> a -> a
--- /dev/null
+++ b/lib/Foreign.hs
@@ -1,0 +1,19 @@
+module Foreign
+ ( module Data.Bits
+ , module Data.Int
+ , module Data.Word
+ , module Foreign.Ptr
+ , module Foreign.ForeignPtr
+-- , module Foreign.StablePtr
+ , module Foreign.Storable
+ , module Foreign.Marshal
+ ) where
+
+import Data.Bits
+import Data.Int
+import Data.Word
+import Foreign.Ptr
+import Foreign.ForeignPtr
+--import Foreign.StablePtr
+import Foreign.Storable
+import Foreign.Marshal
--- /dev/null
+++ b/lib/Foreign/C.hs
@@ -1,0 +1,9 @@
+module Foreign.C(
+ module Foreign.C.Types,
+ module Foreign.C.String,
+ module Foreign.C.Error
+ ) where
+
+import Foreign.C.Types
+import Foreign.C.String
+import Foreign.C.Error
--- /dev/null
+++ b/lib/Foreign/C/Error.hs
@@ -1,0 +1,490 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : GHC.Internal.Foreign.C.Error
+-- Copyright : (c) The FFI task force 2001
+-- License : BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer : ffi@haskell.org
+-- Stability : provisional
+-- Portability : portable
+--
+-- C-specific Marshalling support: Handling of C \"errno\" error codes.
+--
+-----------------------------------------------------------------------------
+
+module Foreign.C.Error (
+ -- * Haskell representations of @errno@ values
+
+ Errno(..),
+
+ eAGAIN, eINTR, eWOULDBLOCK,
+{-
+ -- ** Common @errno@ symbols
+ -- | Different operating systems and\/or C libraries often support
+ -- different values of @errno@. This module defines the common values,
+ -- but due to the open definition of 'Errno' users may add definitions
+ -- which are not predefined.
+ eOK, e2BIG, eACCES, eADDRINUSE, eADDRNOTAVAIL, eADV, eAFNOSUPPORT, eAGAIN,
+ eALREADY, eBADF, eBADMSG, eBADRPC, eBUSY, eCHILD, eCOMM, eCONNABORTED,
+ eCONNREFUSED, eCONNRESET, eDEADLK, eDESTADDRREQ, eDIRTY, eDOM, eDQUOT,
+ eEXIST, eFAULT, eFBIG, eFTYPE, eHOSTDOWN, eHOSTUNREACH, eIDRM, eILSEQ,
+ eINPROGRESS, eINTR, eINVAL, eIO, eISCONN, eISDIR, eLOOP, eMFILE, eMLINK,
+ eMSGSIZE, eMULTIHOP, eNAMETOOLONG, eNETDOWN, eNETRESET, eNETUNREACH,
+ eNFILE, eNOBUFS, eNODATA, eNODEV, eNOENT, eNOEXEC, eNOLCK, eNOLINK,
+ eNOMEM, eNOMSG, eNONET, eNOPROTOOPT, eNOSPC, eNOSR, eNOSTR, eNOSYS,
+ eNOTBLK, eNOTCONN, eNOTDIR, eNOTEMPTY, eNOTSOCK, eNOTSUP, eNOTTY, eNXIO,
+ eOPNOTSUPP, ePERM, ePFNOSUPPORT, ePIPE, ePROCLIM, ePROCUNAVAIL,
+ ePROGMISMATCH, ePROGUNAVAIL, ePROTO, ePROTONOSUPPORT, ePROTOTYPE,
+ eRANGE, eREMCHG, eREMOTE, eROFS, eRPCMISMATCH, eRREMOTE, eSHUTDOWN,
+ eSOCKTNOSUPPORT, eSPIPE, eSRCH, eSRMNT, eSTALE, eTIME, eTIMEDOUT,
+ eTOOMANYREFS, eTXTBSY, eUSERS, eWOULDBLOCK, eXDEV,
+-}
+ -- ** 'Errno' functions
+ isValidErrno,
+
+ -- access to the current thread's "errno" value
+ --
+ getErrno,
+ resetErrno,
+
+ -- conversion of an "errno" value into IO error
+ --
+ errnoToIOError,
+
+ -- throw current "errno" value
+ --
+ throwErrno,
+
+ -- ** Guards for IO operations that may fail
+
+ throwErrnoIf,
+ throwErrnoIf_,
+ throwErrnoIfRetry,
+ throwErrnoIfRetry_,
+ throwErrnoIfMinus1,
+ throwErrnoIfMinus1_,
+ throwErrnoIfMinus1Retry,
+ throwErrnoIfMinus1Retry_,
+ throwErrnoIfNull,
+ throwErrnoIfNullRetry,
+
+ throwErrnoIfRetryMayBlock,
+ throwErrnoIfRetryMayBlock_,
+ throwErrnoIfMinus1RetryMayBlock,
+ throwErrnoIfMinus1RetryMayBlock_,
+ throwErrnoIfNullRetryMayBlock,
+
+ throwErrnoPath,
+ throwErrnoPathIf,
+ throwErrnoPathIf_,
+ throwErrnoPathIfNull,
+ throwErrnoPathIfMinus1,
+ throwErrnoPathIfMinus1_,
+) where
+import Prelude(); import MiniPrelude
+
+import Foreign.Ptr
+import Foreign.Marshal.Alloc
+import Foreign.C.Types
+import Foreign.C.String
+import Foreign.Storable
+import Data.Functor(void)
+import Data.Maybe
+import System.IO(Handle)
+import System.IO.Error
+import System.IO.Unsafe(unsafePerformIO)
+
+{-
+import GHC.Internal.IO
+import GHC.Internal.IO.Exception
+import GHC.Internal.IO.Handle.Types
+import GHC.Internal.Num
+import GHC.Internal.Base
+-}
+
+newtype Errno = Errno Int
+
+instance Eq Errno where
+ errno1@(Errno no1) == errno2@(Errno no2)
+ | isValidErrno errno1 && isValidErrno errno2 = no1 == no2
+ | otherwise = False
+
+{-
+eOK, e2BIG, eACCES, eADDRINUSE, eADDRNOTAVAIL, eADV, eAFNOSUPPORT, eAGAIN,
+ eALREADY, eBADF, eBADMSG, eBADRPC, eBUSY, eCHILD, eCOMM, eCONNABORTED,
+ eCONNREFUSED, eCONNRESET, eDEADLK, eDESTADDRREQ, eDIRTY, eDOM, eDQUOT,
+ eEXIST, eFAULT, eFBIG, eFTYPE, eHOSTDOWN, eHOSTUNREACH, eIDRM, eILSEQ,
+ eINPROGRESS, eINTR, eINVAL, eIO, eISCONN, eISDIR, eLOOP, eMFILE, eMLINK,
+ eMSGSIZE, eMULTIHOP, eNAMETOOLONG, eNETDOWN, eNETRESET, eNETUNREACH,
+ eNFILE, eNOBUFS, eNODATA, eNODEV, eNOENT, eNOEXEC, eNOLCK, eNOLINK,
+ eNOMEM, eNOMSG, eNONET, eNOPROTOOPT, eNOSPC, eNOSR, eNOSTR, eNOSYS,
+ eNOTBLK, eNOTCONN, eNOTDIR, eNOTEMPTY, eNOTSOCK, eNOTSUP, eNOTTY, eNXIO,
+ eOPNOTSUPP, ePERM, ePFNOSUPPORT, ePIPE, ePROCLIM, ePROCUNAVAIL,
+ ePROGMISMATCH, ePROGUNAVAIL, ePROTO, ePROTONOSUPPORT, ePROTOTYPE,
+ eRANGE, eREMCHG, eREMOTE, eROFS, eRPCMISMATCH, eRREMOTE, eSHUTDOWN,
+ eSOCKTNOSUPPORT, eSPIPE, eSRCH, eSRMNT, eSTALE, eTIME, eTIMEDOUT,
+ eTOOMANYREFS, eTXTBSY, eUSERS, eWOULDBLOCK, eXDEV :: Errno
+
+eOK = Errno 0
+e2BIG = Errno (CONST_E2BIG)
+eACCES = Errno (CONST_EACCES)
+eADDRINUSE = Errno (CONST_EADDRINUSE)
+eADDRNOTAVAIL = Errno (CONST_EADDRNOTAVAIL)
+eADV = Errno (CONST_EADV)
+eAFNOSUPPORT = Errno (CONST_EAFNOSUPPORT)
+eAGAIN = Errno (CONST_EAGAIN)
+eALREADY = Errno (CONST_EALREADY)
+eBADF = Errno (CONST_EBADF)
+eBADMSG = Errno (CONST_EBADMSG)
+eBADRPC = Errno (CONST_EBADRPC)
+eBUSY = Errno (CONST_EBUSY)
+eCHILD = Errno (CONST_ECHILD)
+eCOMM = Errno (CONST_ECOMM)
+eCONNABORTED = Errno (CONST_ECONNABORTED)
+eCONNREFUSED = Errno (CONST_ECONNREFUSED)
+eCONNRESET = Errno (CONST_ECONNRESET)
+eDEADLK = Errno (CONST_EDEADLK)
+eDESTADDRREQ = Errno (CONST_EDESTADDRREQ)
+eDIRTY = Errno (CONST_EDIRTY)
+eDOM = Errno (CONST_EDOM)
+eDQUOT = Errno (CONST_EDQUOT)
+eEXIST = Errno (CONST_EEXIST)
+eFAULT = Errno (CONST_EFAULT)
+eFBIG = Errno (CONST_EFBIG)
+eFTYPE = Errno (CONST_EFTYPE)
+eHOSTDOWN = Errno (CONST_EHOSTDOWN)
+eHOSTUNREACH = Errno (CONST_EHOSTUNREACH)
+eIDRM = Errno (CONST_EIDRM)
+eILSEQ = Errno (CONST_EILSEQ)
+eINPROGRESS = Errno (CONST_EINPROGRESS)
+eINTR = Errno (CONST_EINTR)
+eINVAL = Errno (CONST_EINVAL)
+eIO = Errno (CONST_EIO)
+eISCONN = Errno (CONST_EISCONN)
+eISDIR = Errno (CONST_EISDIR)
+eLOOP = Errno (CONST_ELOOP)
+eMFILE = Errno (CONST_EMFILE)
+eMLINK = Errno (CONST_EMLINK)
+eMSGSIZE = Errno (CONST_EMSGSIZE)
+eMULTIHOP = Errno (CONST_EMULTIHOP)
+eNAMETOOLONG = Errno (CONST_ENAMETOOLONG)
+eNETDOWN = Errno (CONST_ENETDOWN)
+eNETRESET = Errno (CONST_ENETRESET)
+eNETUNREACH = Errno (CONST_ENETUNREACH)
+eNFILE = Errno (CONST_ENFILE)
+eNOBUFS = Errno (CONST_ENOBUFS)
+eNODATA = Errno (CONST_ENODATA)
+eNODEV = Errno (CONST_ENODEV)
+eNOENT = Errno (CONST_ENOENT)
+eNOEXEC = Errno (CONST_ENOEXEC)
+eNOLCK = Errno (CONST_ENOLCK)
+eNOLINK = Errno (CONST_ENOLINK)
+eNOMEM = Errno (CONST_ENOMEM)
+eNOMSG = Errno (CONST_ENOMSG)
+eNONET = Errno (CONST_ENONET)
+eNOPROTOOPT = Errno (CONST_ENOPROTOOPT)
+eNOSPC = Errno (CONST_ENOSPC)
+eNOSR = Errno (CONST_ENOSR)
+eNOSTR = Errno (CONST_ENOSTR)
+eNOSYS = Errno (CONST_ENOSYS)
+eNOTBLK = Errno (CONST_ENOTBLK)
+eNOTCONN = Errno (CONST_ENOTCONN)
+eNOTDIR = Errno (CONST_ENOTDIR)
+eNOTEMPTY = Errno (CONST_ENOTEMPTY)
+eNOTSOCK = Errno (CONST_ENOTSOCK)
+eNOTSUP = Errno (CONST_ENOTSUP)
+-- ^ @since base-4.7.0.0
+eNOTTY = Errno (CONST_ENOTTY)
+eNXIO = Errno (CONST_ENXIO)
+eOPNOTSUPP = Errno (CONST_EOPNOTSUPP)
+ePERM = Errno (CONST_EPERM)
+ePFNOSUPPORT = Errno (CONST_EPFNOSUPPORT)
+ePIPE = Errno (CONST_EPIPE)
+ePROCLIM = Errno (CONST_EPROCLIM)
+ePROCUNAVAIL = Errno (CONST_EPROCUNAVAIL)
+ePROGMISMATCH = Errno (CONST_EPROGMISMATCH)
+ePROGUNAVAIL = Errno (CONST_EPROGUNAVAIL)
+ePROTO = Errno (CONST_EPROTO)
+ePROTONOSUPPORT = Errno (CONST_EPROTONOSUPPORT)
+ePROTOTYPE = Errno (CONST_EPROTOTYPE)
+eRANGE = Errno (CONST_ERANGE)
+eREMCHG = Errno (CONST_EREMCHG)
+eREMOTE = Errno (CONST_EREMOTE)
+eROFS = Errno (CONST_EROFS)
+eRPCMISMATCH = Errno (CONST_ERPCMISMATCH)
+eRREMOTE = Errno (CONST_ERREMOTE)
+eSHUTDOWN = Errno (CONST_ESHUTDOWN)
+eSOCKTNOSUPPORT = Errno (CONST_ESOCKTNOSUPPORT)
+eSPIPE = Errno (CONST_ESPIPE)
+eSRCH = Errno (CONST_ESRCH)
+eSRMNT = Errno (CONST_ESRMNT)
+eSTALE = Errno (CONST_ESTALE)
+eTIME = Errno (CONST_ETIME)
+eTIMEDOUT = Errno (CONST_ETIMEDOUT)
+eTOOMANYREFS = Errno (CONST_ETOOMANYREFS)
+eTXTBSY = Errno (CONST_ETXTBSY)
+eUSERS = Errno (CONST_EUSERS)
+eWOULDBLOCK = Errno (CONST_EWOULDBLOCK)
+eXDEV = Errno (CONST_EXDEV)
+-}
+
+eINTR :: Errno
+eAGAIN = Errno cAGAIN; foreign import capi "value EAGAIN" cAGAIN :: Int
+eINTR = Errno cINTR; foreign import capi "value EINTR" cINTR :: Int
+eWOULDBLOCK = Errno cWOULDBLOCK; foreign import capi "value EWOULDBLOCK" cWOULDBLOCK :: Int
+
+isValidErrno :: Errno -> Bool
+isValidErrno (Errno errno) = errno /= -1
+
+foreign import ccall unsafe "sys/errno.h &errno" c_errno_ptr :: IO (Ptr Int)
+
+getErrno :: IO Errno
+getErrno = do
+ p <- c_errno_ptr
+ e <- peek p
+ return (Errno e)
+
+resetErrno :: IO ()
+resetErrno = do
+ p <- c_errno_ptr
+ poke p 0
+ return ()
+
+throwErrno :: String -> IO a
+throwErrno loc = do
+ errno <- getErrno
+ ioError (errnoToIOError loc errno Nothing Nothing)
+
+throwErrnoIf :: (a -> Bool) -- ^ predicate to apply to the result value
+ -- of the 'IO' operation
+ -> String -- ^ textual description of the location
+ -> IO a -- ^ the 'IO' operation to be executed
+ -> IO a
+throwErrnoIf pred loc f =
+ do
+ res <- f
+ if pred res then throwErrno loc else return res
+
+throwErrnoIf_ :: (a -> Bool) -> String -> IO a -> IO ()
+throwErrnoIf_ pred loc f = void $ throwErrnoIf pred loc f
+
+throwErrnoIfRetry :: (a -> Bool) -> String -> IO a -> IO a
+throwErrnoIfRetry pred loc f =
+ do
+ res <- f
+ if pred res
+ then do
+ err <- getErrno
+ if err == eINTR
+ then throwErrnoIfRetry pred loc f
+ else throwErrno loc
+ else return res
+
+throwErrnoIfRetryMayBlock
+ :: (a -> Bool) -- ^ predicate to apply to the result value
+ -- of the 'IO' operation
+ -> String -- ^ textual description of the location
+ -> IO a -- ^ the 'IO' operation to be executed
+ -> IO b -- ^ action to execute before retrying if
+ -- an immediate retry would block
+ -> IO a
+throwErrnoIfRetryMayBlock pred loc f on_block =
+ do
+ res <- f
+ if pred res
+ then do
+ err <- getErrno
+ if err == eINTR
+ then throwErrnoIfRetryMayBlock pred loc f on_block
+ else if err == eWOULDBLOCK || err == eAGAIN
+ then do _ <- on_block
+ throwErrnoIfRetryMayBlock pred loc f on_block
+ else throwErrno loc
+ else return res
+
+throwErrnoIfRetry_ :: (a -> Bool) -> String -> IO a -> IO ()
+throwErrnoIfRetry_ pred loc f = void $ throwErrnoIfRetry pred loc f
+
+throwErrnoIfRetryMayBlock_ :: (a -> Bool) -> String -> IO a -> IO b -> IO ()
+throwErrnoIfRetryMayBlock_ pred loc f on_block
+ = void $ throwErrnoIfRetryMayBlock pred loc f on_block
+
+throwErrnoIfMinus1 :: (Eq a, Num a) => String -> IO a -> IO a
+throwErrnoIfMinus1 = throwErrnoIf (== (-1))
+
+throwErrnoIfMinus1_ :: (Eq a, Num a) => String -> IO a -> IO ()
+throwErrnoIfMinus1_ = throwErrnoIf_ (== (-1))
+
+throwErrnoIfMinus1Retry :: (Eq a, Num a) => String -> IO a -> IO a
+throwErrnoIfMinus1Retry = throwErrnoIfRetry (== (-1))
+
+throwErrnoIfMinus1Retry_ :: (Eq a, Num a) => String -> IO a -> IO ()
+throwErrnoIfMinus1Retry_ = throwErrnoIfRetry_ (== (-1))
+
+throwErrnoIfMinus1RetryMayBlock :: (Eq a, Num a)
+ => String -> IO a -> IO b -> IO a
+throwErrnoIfMinus1RetryMayBlock = throwErrnoIfRetryMayBlock (== (-1))
+
+throwErrnoIfMinus1RetryMayBlock_ :: (Eq a, Num a)
+ => String -> IO a -> IO b -> IO ()
+throwErrnoIfMinus1RetryMayBlock_ = throwErrnoIfRetryMayBlock_ (== (-1))
+
+throwErrnoIfNull :: String -> IO (Ptr a) -> IO (Ptr a)
+throwErrnoIfNull = throwErrnoIf (== nullPtr)
+
+throwErrnoIfNullRetry :: String -> IO (Ptr a) -> IO (Ptr a)
+throwErrnoIfNullRetry = throwErrnoIfRetry (== nullPtr)
+
+throwErrnoIfNullRetryMayBlock :: String -> IO (Ptr a) -> IO b -> IO (Ptr a)
+throwErrnoIfNullRetryMayBlock = throwErrnoIfRetryMayBlock (== nullPtr)
+
+throwErrnoPath :: String -> FilePath -> IO a
+throwErrnoPath loc path =
+ do
+ errno <- getErrno
+ ioError (errnoToIOError loc errno Nothing (Just path))
+
+throwErrnoPathIf :: (a -> Bool) -> String -> FilePath -> IO a -> IO a
+throwErrnoPathIf pred loc path f =
+ do
+ res <- f
+ if pred res then throwErrnoPath loc path else return res
+
+throwErrnoPathIf_ :: (a -> Bool) -> String -> FilePath -> IO a -> IO ()
+throwErrnoPathIf_ pred loc path f = void $ throwErrnoPathIf pred loc path f
+
+throwErrnoPathIfNull :: String -> FilePath -> IO (Ptr a) -> IO (Ptr a)
+throwErrnoPathIfNull = throwErrnoPathIf (== nullPtr)
+
+throwErrnoPathIfMinus1 :: (Eq a, Num a) => String -> FilePath -> IO a -> IO a
+throwErrnoPathIfMinus1 = throwErrnoPathIf (== (-1))
+
+throwErrnoPathIfMinus1_ :: (Eq a, Num a) => String -> FilePath -> IO a -> IO ()
+throwErrnoPathIfMinus1_ = throwErrnoPathIf_ (== (-1))
+
+
+foreign import ccall "string.h strerror_r"
+ c_strerror_r :: Int -> Ptr Char -> CSize -> IO Int
+
+errnoToString :: Errno -> IO String
+errnoToString (Errno errno) =
+ allocaBytes 512 $ \ ptr -> do
+ ret <- c_strerror_r errno ptr (CSize 512)
+ if ret /= 0
+ then return "errnoToString failed"
+ else peekCString ptr
+ where len = 512::Int
+
+errnoToIOError :: String -- ^ the location where the error occurred
+ -> Errno -- ^ the error number
+ -> Maybe Handle -- ^ optional handle associated with the error
+ -> Maybe String -- ^ optional filename associated with the error
+ -> IOError
+errnoToIOError loc errno@(Errno errno') maybeHdl maybeName = unsafePerformIO $ do
+ str <- errnoToString errno
+ return (IOError maybeHdl errType loc str (Just errno') maybeName)
+ where
+ errType = OtherError
+{-
+ errType =
+ | errno == eOK = OtherError
+ | errno == e2BIG = ResourceExhausted
+ | errno == eACCES = PermissionDenied
+ | errno == eADDRINUSE = ResourceBusy
+ | errno == eADDRNOTAVAIL = UnsupportedOperation
+ | errno == eADV = OtherError
+ | errno == eAFNOSUPPORT = UnsupportedOperation
+ | errno == eAGAIN = ResourceExhausted
+ | errno == eALREADY = AlreadyExists
+ | errno == eBADF = InvalidArgument
+ | errno == eBADMSG = InappropriateType
+ | errno == eBADRPC = OtherError
+ | errno == eBUSY = ResourceBusy
+ | errno == eCHILD = NoSuchThing
+ | errno == eCOMM = ResourceVanished
+ | errno == eCONNABORTED = OtherError
+ | errno == eCONNREFUSED = NoSuchThing
+ | errno == eCONNRESET = ResourceVanished
+ | errno == eDEADLK = ResourceBusy
+ | errno == eDESTADDRREQ = InvalidArgument
+ | errno == eDIRTY = UnsatisfiedConstraints
+ | errno == eDOM = InvalidArgument
+ | errno == eDQUOT = PermissionDenied
+ | errno == eEXIST = AlreadyExists
+ | errno == eFAULT = OtherError
+ | errno == eFBIG = PermissionDenied
+ | errno == eFTYPE = InappropriateType
+ | errno == eHOSTDOWN = NoSuchThing
+ | errno == eHOSTUNREACH = NoSuchThing
+ | errno == eIDRM = ResourceVanished
+ | errno == eILSEQ = InvalidArgument
+ | errno == eINPROGRESS = AlreadyExists
+ | errno == eINTR = Interrupted
+ | errno == eINVAL = InvalidArgument
+ | errno == eIO = HardwareFault
+ | errno == eISCONN = AlreadyExists
+ | errno == eISDIR = InappropriateType
+ | errno == eLOOP = InvalidArgument
+ | errno == eMFILE = ResourceExhausted
+ | errno == eMLINK = ResourceExhausted
+ | errno == eMSGSIZE = ResourceExhausted
+ | errno == eMULTIHOP = UnsupportedOperation
+ | errno == eNAMETOOLONG = InvalidArgument
+ | errno == eNETDOWN = ResourceVanished
+ | errno == eNETRESET = ResourceVanished
+ | errno == eNETUNREACH = NoSuchThing
+ | errno == eNFILE = ResourceExhausted
+ | errno == eNOBUFS = ResourceExhausted
+ | errno == eNODATA = NoSuchThing
+ | errno == eNODEV = UnsupportedOperation
+ | errno == eNOENT = NoSuchThing
+ | errno == eNOEXEC = InvalidArgument
+ | errno == eNOLCK = ResourceExhausted
+ | errno == eNOLINK = ResourceVanished
+ | errno == eNOMEM = ResourceExhausted
+ | errno == eNOMSG = NoSuchThing
+ | errno == eNONET = NoSuchThing
+ | errno == eNOPROTOOPT = UnsupportedOperation
+ | errno == eNOSPC = ResourceExhausted
+ | errno == eNOSR = ResourceExhausted
+ | errno == eNOSTR = InvalidArgument
+ | errno == eNOSYS = UnsupportedOperation
+ | errno == eNOTBLK = InvalidArgument
+ | errno == eNOTCONN = InvalidArgument
+ | errno == eNOTDIR = InappropriateType
+ | errno == eNOTEMPTY = UnsatisfiedConstraints
+ | errno == eNOTSOCK = InvalidArgument
+ | errno == eNOTTY = IllegalOperation
+ | errno == eNXIO = NoSuchThing
+ | errno == eOPNOTSUPP = UnsupportedOperation
+ | errno == ePERM = PermissionDenied
+ | errno == ePFNOSUPPORT = UnsupportedOperation
+ | errno == ePIPE = ResourceVanished
+ | errno == ePROCLIM = PermissionDenied
+ | errno == ePROCUNAVAIL = UnsupportedOperation
+ | errno == ePROGMISMATCH = ProtocolError
+ | errno == ePROGUNAVAIL = UnsupportedOperation
+ | errno == ePROTO = ProtocolError
+ | errno == ePROTONOSUPPORT = ProtocolError
+ | errno == ePROTOTYPE = ProtocolError
+ | errno == eRANGE = UnsupportedOperation
+ | errno == eREMCHG = ResourceVanished
+ | errno == eREMOTE = IllegalOperation
+ | errno == eROFS = PermissionDenied
+ | errno == eRPCMISMATCH = ProtocolError
+ | errno == eRREMOTE = IllegalOperation
+ | errno == eSHUTDOWN = IllegalOperation
+ | errno == eSOCKTNOSUPPORT = UnsupportedOperation
+ | errno == eSPIPE = UnsupportedOperation
+ | errno == eSRCH = NoSuchThing
+ | errno == eSRMNT = UnsatisfiedConstraints
+ | errno == eSTALE = ResourceVanished
+ | errno == eTIME = TimeExpired
+ | errno == eTIMEDOUT = TimeExpired
+ | errno == eTOOMANYREFS = ResourceExhausted
+ | errno == eTXTBSY = ResourceBusy
+ | errno == eUSERS = ResourceExhausted
+ | errno == eWOULDBLOCK = OtherError
+ | errno == eXDEV = UnsupportedOperation
+ | otherwise = OtherError
+-}
--- a/lib/Foreign/C/String.hs
+++ b/lib/Foreign/C/String.hs
@@ -1,8 +1,9 @@
module Foreign.C.String(
- CChar, CString,
+ CString, CStringLen,
newCAString, newCAStringLen,
peekCAString, peekCAStringLen,
withCAString,
+ peekCString,
) where
import Prelude() -- do not import Prelude
import Primitives
@@ -31,3 +32,8 @@
peekCAStringLen :: CStringLen -> IO String
peekCAStringLen (p, i) = primPeekCAStringLen p i
+
+-- Not quite right
+peekCString :: CString -> IO String
+peekCString = primPeekCAString
+
--- a/lib/Foreign/C/Types.hs
+++ b/lib/Foreign/C/Types.hs
@@ -9,34 +9,80 @@
CLLong(..), CULLong(..),
CIntPtr(..), CUIntPtr(..),
CFloat(..), CDouble(..),
+ CTime(..),
intToCSize, cSizeToInt,
) where
import Prelude()
import Primitives
+import Data.Bool
+import Data.Eq
+import Data.Int
+import Data.Integral
+import Data.Num
+import Data.Ord
import Data.Word
+import Data.FloatW
-- The MicroHs Word type is the "natural" architecture word size;
-- it is the same as the pointer difference type.
-- And Int is the natural signed word size.
newtype CChar = CChar Char
+ deriving (Eq, Ord)
newtype CSChar = CSChar Int
+ deriving (Eq, Ord)
newtype CUChar = CUChar Word
+ deriving (Eq, Ord)
newtype CShort = CShort Int
+ deriving (Eq, Ord)
newtype CUShort = CUShort Word
+ deriving (Eq, Ord)
newtype CInt = CInt Int
+ deriving (Eq, Ord)
newtype CUInt = CUInt Word
+ deriving (Eq, Ord)
newtype CLong = CLong Int
+ deriving (Eq, Ord)
newtype CULong = CULong Word
+ deriving (Eq, Ord)
newtype CPtrdiff = CPtrdiff Word
+ deriving (Eq, Ord)
newtype CSize = CSize Word
+ deriving (Eq, Ord)
newtype CSSize = CSSize Int
+ deriving (Eq, Ord)
newtype CLLong = CLLong Int
+ deriving (Eq, Ord)
newtype CULLong = CULLong Word
+ deriving (Eq, Ord)
newtype CIntPtr = CIntPtr Int
+ deriving (Eq, Ord)
newtype CUIntPtr = CUIntPtr Word
+ deriving (Eq, Ord)
+-- XXX This is really platform specific
+newtype CTime = CTime Int
+ deriving (Eq, Ord)
+
+-- XXX We really need GND
+instance Num CInt where
+ CInt x + CInt y = CInt (x + y)
+ CInt x - CInt y = CInt (x - y)
+ CInt x * CInt y = CInt (x * y)
+ fromInteger x = CInt (fromInteger x)
+instance Num CLong where
+ CLong x + CLong y = CLong (x + y)
+ CLong x - CLong y = CLong (x - y)
+ CLong x * CLong y = CLong (x * y)
+ fromInteger x = CLong (fromInteger x)
+instance Integral CLong where
+ quotRem (CLong x) (CLong y) = (CLong q, CLong r) where (q, r) = quotRem q r
+ toInteger (CLong x) = toInteger x
+
+-- XXX only one of these is actually correct
newtype CFloat = CFloat FloatW
+ deriving (Eq, Ord)
newtype CDouble = CDouble FloatW
+ deriving (Eq, Ord)
-- Temporary conversion functions.
intToCSize :: Int -> CSize
--- a/lib/Foreign/ForeignPtr.hs
+++ b/lib/Foreign/ForeignPtr.hs
@@ -14,6 +14,7 @@
mallocForeignPtrArray,
mallocForeignPtrArray0,
) where
+import Prelude(); import MiniPrelude
import Primitives
import Foreign.Ptr
import Foreign.Storable
@@ -30,7 +31,7 @@
showsPrec p f = showsPrec p (unsafeForeignPtrToPtr f)
unsafeForeignPtrToPtr :: ForeignPtr a -> Ptr a
-unsafeForeignPtrToPtr = primitive "fp2p"
+unsafeForeignPtrToPtr = primForeignPtrToPtr
type FinalizerPtr a = FunPtr (Ptr a -> IO ())
@@ -60,7 +61,7 @@
newForeignPtr c_freefun ptr
addForeignPtrFinalizer :: FinalizerPtr a -> ForeignPtr a -> IO ()
-addForeignPtrFinalizer = primitive "fpfin"
+addForeignPtrFinalizer = primAddFinalizer
newForeignPtr :: FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr f p = do
@@ -69,7 +70,7 @@
return fp
newForeignPtr_ :: Ptr a -> IO (ForeignPtr a)
-newForeignPtr_ = primitive "fpnew"
+newForeignPtr_ = primNewForeignPtr
withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr fp io = do
--- /dev/null
+++ b/lib/Foreign/Marshal.hs
@@ -1,0 +1,13 @@
+module Foreign.Marshal(
+ module Foreign.Marshal.Alloc,
+ module Foreign.Marshal.Array,
+ module Foreign.Marshal.Error,
+-- module Foreign.Marshal.Pool,
+ module Foreign.Marshal.Utils
+ ) where
+
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Array
+import Foreign.Marshal.Error
+--import Foreign.Marshal.Pool
+import Foreign.Marshal.Utils
--- a/lib/Foreign/Marshal/Array.hs
+++ b/lib/Foreign/Marshal/Array.hs
@@ -1,5 +1,5 @@
module Foreign.Marshal.Array(module Foreign.Marshal.Array) where
-import Prelude
+import Prelude(); import MiniPrelude
import Foreign.Ptr
import Foreign.Storable
import Foreign.Marshal.Alloc
--- /dev/null
+++ b/lib/Foreign/Marshal/Error.hs
@@ -1,0 +1,28 @@
+module Foreign.Marshal.Error (
+ throwIf,
+ throwIf_,
+ throwIfNeg,
+ throwIfNeg_,
+ throwIfNull,
+) where
+import Prelude(); import MiniPrelude
+import Data.Functor(void)
+import Foreign.Ptr
+import System.IO.Error(ioError, userError)
+
+throwIf :: (a -> Bool) -> (a -> String) -> IO a -> IO a
+throwIf pred msgfct act = do
+ res <- act
+ (if pred res then ioError . userError . msgfct else return) res
+
+throwIf_ :: (a -> Bool) -> (a -> String) -> IO a -> IO ()
+throwIf_ pred msgfct act = void $ throwIf pred msgfct act
+
+throwIfNeg :: (Ord a, Num a) => (a -> String) -> IO a -> IO a
+throwIfNeg = throwIf (< 0)
+
+throwIfNeg_ :: (Ord a, Num a) => (a -> String) -> IO a -> IO ()
+throwIfNeg_ = throwIf_ (< 0)
+
+throwIfNull :: String -> IO (Ptr a) -> IO (Ptr a)
+throwIfNull = throwIf (== nullPtr) . const
--- a/lib/Foreign/Marshal/Utils.hs
+++ b/lib/Foreign/Marshal/Utils.hs
@@ -1,5 +1,5 @@
module Foreign.Marshal.Utils(module Foreign.Marshal.Utils) where
-import Prelude
+import Prelude(); import MiniPrelude
import Foreign.Marshal.Alloc
import Foreign.C.Types
import Foreign.Ptr
--- a/lib/Foreign/Ptr.hs
+++ b/lib/Foreign/Ptr.hs
@@ -9,7 +9,7 @@
import Data.Eq
import Data.Function
import Data.Ord
-import Numeric(showHex)
+import Numeric.Show(showHex)
import Text.Show
instance forall a . Eq (Ptr a) where
--- /dev/null
+++ b/lib/MiniPrelude.hs
@@ -1,0 +1,62 @@
+module MiniPrelude(
+ module Control.Applicative,
+ module Control.Error,
+ module Control.Monad,
+ module Data.Bool,
+ module Data.Char,
+ module Data.Enum,
+ module Data.Eq,
+ module Data.Either,
+ module Data.Function,
+ module Data.Functor,
+ module Data.Ord,
+ module Data.Int,
+ module Data.Integral,
+ module Data.List,
+ module Data.Maybe,
+ module Data.Monoid.Internal,
+ module Data.Num,
+ module Data.Records,
+ module Data.String,
+ module Data.Tuple,
+ module System.IO,
+ module Text.Show,
+ usingMhs, _wordSize, _isWindows,
+ ) where
+import Prelude()
+import Control.Applicative(Applicative(..))
+import Control.Error
+import Control.Monad
+import Data.Bool
+import Data.Char
+import Data.Enum
+import Data.Eq
+import Data.Either
+import Data.Function
+import Data.Functor
+import Data.Ord
+import Data.Int
+import Data.Integral
+import Data.List([](..), map, (++), filter, head, last, tail, init, null, length, (!!),
+ reverse, foldl, foldl1, foldr, foldr1, and, or, any, all,
+ sum, product, concat, concatMap, maximum, minimum,
+ scanl, scanl1, scanr, scanr1, iterate, repeat, replicate, cycle,
+ take, drop, splitAt, takeWhile, dropWhile, span, break,
+ elem, notElem, lookup, zip, zip3, zipWith, zipWith3, unzip, unzip3,
+ lines, words, unlines, unwords)
+import Data.Maybe
+import Data.Monoid.Internal
+import Data.Num
+import Data.Records
+import Data.String
+import Data.Tuple
+import System.IO(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,
+ FilePath, readFile, writeFile, appendFile,
+ cprint, cuprint)
+import Text.Show(Show(..), ShowS, shows, showChar, showString, showParen)
+import Text.Show
+import Primitives(_wordSize, _isWindows)
+
+-- So we can detect mhs vs ghc
+usingMhs :: Bool
+usingMhs = True
--- a/lib/Numeric.hs
+++ b/lib/Numeric.hs
@@ -1,11 +1,5 @@
module Numeric(
- showSigned,
- showIntAtBase,
- showInt,
- showBin,
- showHex,
- showOct,
- showIntegral,
+ module Numeric.Show,
readSigned,
readInt,
@@ -16,63 +10,5 @@
readIntegral,
) where
import Prelude() -- do not import Prelude
-import Primitives
-import Control.Error
-import Data.Bool
-import Data.Char
-import Data.Eq
-import Data.Function
-import Data.Integral
-import Data.List
-import Data.Num
-import Data.Ord
-import Text.Read.Numeric
-import Text.Show(ShowS, showChar)
-
-showSigned :: forall a . (Ord a, Integral a) => (a -> ShowS) -> Int -> a -> ShowS
-showSigned showPos p n r
- | n < 0 =
- if p > (6::Int) then
- '(' : '-' : showPos (-n) (')' : r)
- else
- '-' : showPos (-n) r
- | otherwise = showPos n r
-
--- | Shows a /non-negative/ 'Integral' number using the base specified by the
--- first argument, and the character representation specified by the second.
--- If the argument, n, is <0 and -n == n (i.e., n == minBound) it will
--- return the string for (abs n).
-showIntAtBase :: forall a . (Ord a, Integral a) => a -> (Int -> Char) -> a -> ShowS
-showIntAtBase base toChr an
- | base <= 1 = error "Numeric.showIntAtBase: unsupported base"
- | an < 0 =
- if -an < 0 then
- -- We are at minBound
- showPos (- quot an base) . showPos (- rem an base)
- else
- error "Numeric.showIntAtBase: negative argument"
- | otherwise = showPos an
- where
- showPos n r =
- let
- c = toChr (fromIntegral (rem n base))
- in c `seq`
- if n < base then
- c : r
- else
- showPos (quot n base) (c : r)
-
-showInt :: forall a . (Ord a, Integral a) => a -> ShowS
-showInt = showIntAtBase 10 intToDigit
-
-showHex :: forall a . (Ord a, Integral a) => a -> ShowS
-showHex = showIntAtBase 16 intToDigit
-
-showOct :: forall a . (Ord a, Integral a) => a -> ShowS
-showOct = showIntAtBase 8 intToDigit
-
-showBin :: forall a . (Ord a, Integral a) => a -> ShowS
-showBin = showIntAtBase 2 intToDigit
-
-showIntegral :: forall a . (Ord a, Integral a) => Int -> a -> ShowS
-showIntegral = showSigned showInt
+import Numeric.Read
+import Numeric.Show
--- a/lib/Numeric/FormatFloat.hs
+++ b/lib/Numeric/FormatFloat.hs
@@ -10,7 +10,7 @@
) where
import Data.Char
-import Numeric
+import Numeric.Show
--showFloat :: (RealFloat a) => a -> ShowS
--showFloat x = showString (formatRealFloat FFGeneric Nothing x)
--- a/lib/Numeric/Natural.hs
+++ b/lib/Numeric/Natural.hs
@@ -2,6 +2,9 @@
( Natural
, minusNaturalMaybe
) where
+import Prelude(); import MiniPrelude
+import Data.Integer
+import Data.Real
import Control.Exception
newtype Natural = N Integer
--- /dev/null
+++ b/lib/Numeric/Read.hs
@@ -1,0 +1,83 @@
+module Numeric.Read(
+ readParen,
+ readSigned,
+ readInt,
+ readBin,
+ readDec,
+ readOct,
+ readHex,
+ readIntegral,
+ readBoundedEnum,
+ ) where
+import Prelude() -- do not import Prelude
+import Primitives
+import Data.Bool
+import Data.Bounded
+import Data.Char
+import Data.Eq
+import Data.Enum
+import Data.Function
+import Data.Integral
+import Data.List
+import Data.Maybe_Type
+import Data.Num
+import Data.Ord
+import Data.String
+import {-# SOURCE #-} Text.Read.Internal(lex)
+import Text.Show
+
+type ReadS a = String -> [(a, String)]
+
+readParen :: forall a . Bool -> ReadS a -> ReadS a
+readParen b g = if b then mandatory else optional
+ where optional r = g r ++ mandatory r
+ mandatory r = [(x,u) | ("(",s) <- lex r,
+ (x,t) <- optional s,
+ (")",u) <- lex t ]
+
+--------------------------------------------------------
+
+readInt :: forall a . Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadS a
+readInt base isDig valDig cs@(c:_) | isDig c = loop 0 cs
+ where loop r (c:cs) | isDig c = loop (r * base + fromIntegral (valDig c)) cs
+ loop r ds = [(r, ds)]
+readInt _ _ _ _ = []
+
+readBin :: forall a . (Num a) => ReadS a
+readBin = readInt 2 isBinDigit digitToInt
+
+isBinDigit :: Char -> Bool
+isBinDigit c = c == '0' || c == '1'
+
+readOct :: forall a . (Num a) => ReadS a
+readOct = readInt 8 isOctDigit digitToInt
+
+readDec :: forall a . (Num a) => ReadS a
+readDec = readInt 10 isDigit digitToInt
+
+readHex :: forall a . (Num a) => ReadS a
+readHex = readInt 16 isHexDigit digitToInt
+
+readSigned :: forall a . (Num a) => ReadS a -> ReadS a
+readSigned readPos = readParen False read'
+ where
+ read' :: ReadS a
+ read' r = readPos r ++
+ [ (- x, t) | ("-", s) <- lex r, (x, t) <- readPos s ]
+
+readIntegral :: forall a . (Integral a) => Int -> ReadS a
+readIntegral _ = readSigned (readAny . dropSpace)
+ where readAny ('0':'x':cs) = readHex cs
+ readAny ('0':'X':cs) = readHex cs
+ readAny ('0':'o':cs) = readOct cs
+ readAny ('0':'O':cs) = readOct cs
+ readAny ('0':'b':cs) = readBin cs
+ readAny ('0':'B':cs) = readBin cs
+ readAny cs = readDec cs
+
+readBoundedEnum :: forall a . (Enum a, Bounded a, Show a) => ReadS a
+readBoundedEnum = \ r -> [ (e, t) | (s, t) <- lex r, Just e <- [lookup s table] ]
+ where table = [ (show e, e) | e <- [ minBound .. maxBound ] ]
+
+dropSpace :: String -> String
+dropSpace = dropWhile isSpace
--- /dev/null
+++ b/lib/Numeric/Show.hs
@@ -1,0 +1,69 @@
+module Numeric.Show(
+ showSigned,
+ showIntAtBase,
+ showInt,
+ showBin,
+ showHex,
+ showOct,
+ showIntegral,
+ ) where
+import Prelude() -- do not import Prelude
+import Primitives
+import Control.Error
+import Data.Bool
+import Data.Char
+import Data.Eq
+import Data.Function
+import Data.Integral
+import Data.List
+import Data.Num
+import Data.Ord
+import Text.Show(ShowS, showChar)
+
+showSigned :: forall a . (Ord a, Integral a) => (a -> ShowS) -> Int -> a -> ShowS
+showSigned showPos p n r
+ | n < 0 =
+ if p > (6::Int) then
+ '(' : '-' : showPos (-n) (')' : r)
+ else
+ '-' : showPos (-n) r
+ | otherwise = showPos n r
+
+-- | Shows a /non-negative/ 'Integral' number using the base specified by the
+-- first argument, and the character representation specified by the second.
+-- If the argument, n, is <0 and -n == n (i.e., n == minBound) it will
+-- return the string for (abs n).
+showIntAtBase :: forall a . (Ord a, Integral a) => a -> (Int -> Char) -> a -> ShowS
+showIntAtBase base toChr an
+ | base <= 1 = error "Numeric.showIntAtBase: unsupported base"
+ | an < 0 =
+ if -an < 0 then
+ -- We are at minBound
+ showPos (- quot an base) . showPos (- rem an base)
+ else
+ error "Numeric.showIntAtBase: negative argument"
+ | otherwise = showPos an
+ where
+ showPos n r =
+ let
+ c = toChr (fromIntegral (rem n base))
+ in c `seq`
+ if n < base then
+ c : r
+ else
+ showPos (quot n base) (c : r)
+
+showInt :: forall a . (Ord a, Integral a) => a -> ShowS
+showInt = showIntAtBase 10 intToDigit
+
+showHex :: forall a . (Ord a, Integral a) => a -> ShowS
+showHex = showIntAtBase 16 intToDigit
+
+showOct :: forall a . (Ord a, Integral a) => a -> ShowS
+showOct = showIntAtBase 8 intToDigit
+
+showBin :: forall a . (Ord a, Integral a) => a -> ShowS
+showBin = showIntAtBase 2 intToDigit
+
+showIntegral :: forall a . (Ord a, Integral a) => Int -> a -> ShowS
+showIntegral = showSigned showInt
--- a/lib/Prelude.hs
+++ b/lib/Prelude.hs
@@ -87,6 +87,8 @@
import Text.Show(Show(..), ShowS, shows, showChar, showString, showParen)
import Primitives(_wordSize, _isWindows)
+import Data.Orphans() -- Extra instances
+
-- So we can detect mhs vs ghc
usingMhs :: Bool
usingMhs = True
--- a/lib/Primitives.hs
+++ b/lib/Primitives.hs
@@ -123,10 +123,19 @@
primWordToFloatWRaw = primitive "toDbl"
primWordFromFloatWRaw :: FloatW -> Word
primWordFromFloatWRaw = primitive "toInt"
+
+primIntAnd :: Int -> Int -> Int
+primIntAnd = primitive "and"
+primIntOr :: Int -> Int -> Int
+primIntOr = primitive "or"
+primIntXor :: Int -> Int -> Int
+primIntXor = primitive "xor"
primIntShl :: Int -> Int -> Int
primIntShl = primitive "shl"
primIntShr :: Int -> Int -> Int
primIntShr = primitive "ashr"
+primIntInv :: Int -> Int
+primIntInv = primitive "inv"
primWordEQ :: Word -> Word -> Bool
primWordEQ = primitive "=="
@@ -176,6 +185,8 @@
primIntCompare = primitive "icmp"
primCharCompare :: forall a . Char -> Char -> Ordering
primCharCompare = primitive "icmp"
+primWordCompare :: forall a . Word -> Word -> Ordering
+primWordCompare = primitive "ucmp"
primStringEQ :: [Char] -> [Char] -> Bool
primStringEQ = primitive "sequal"
@@ -272,3 +283,13 @@
primGC :: IO ()
primGC = primitive "IO.gc"
+
+primForeignPtrToPtr :: ForeignPtr a -> Ptr a
+primForeignPtrToPtr = primitive "fp2p"
+
+primNewForeignPtr :: Ptr a -> IO (ForeignPtr a)
+primNewForeignPtr = primitive "fpnew"
+
+primAddFinalizer :: FunPtr (Ptr a -> IO ()) -> ForeignPtr a -> IO ()
+primAddFinalizer = primitive "fpfin"
+
--- a/lib/System/Cmd.hs
+++ b/lib/System/Cmd.hs
@@ -1,4 +1,5 @@
module System.Cmd(system) where
+import Prelude(); import MiniPrelude
import Foreign.C.String
import System.Exit
--- a/lib/System/Compress.hs
+++ b/lib/System/Compress.hs
@@ -1,4 +1,7 @@
-module System.Compress(compress) where
+module System.Compress(compress, decompress) where
+import Prelude(); import MiniPrelude
+import Data.Function
+import Foreign.Ptr
import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Alloc
@@ -5,18 +8,94 @@
import Foreign.Marshal.Utils
import Foreign.Ptr
import Foreign.Storable
+import System.IO
+import System.IO.Internal
import System.IO.Unsafe
-foreign import ccall "lz77c" c_lz77c :: CString -> CSize -> Ptr CString -> IO CSize
+type PBFILE = Ptr BFILE
+type Transducer = PBFILE -> IO PBFILE
+foreign import ccall "openb_wr_buf" c_openb_wr_buf :: IO PBFILE
+foreign import ccall "openb_rd_buf" c_openb_rd_buf :: Ptr Char -> Int -> IO PBFILE
+foreign import ccall "add_lz77_compressor" c_add_lz77_compressor :: Transducer
+foreign import ccall "add_lz77_decompressor" c_add_lz77_decompressor :: Transducer
+foreign import ccall "add_rle_compressor" c_add_rle_compressor :: Transducer
+foreign import ccall "add_rle_decompressor" c_add_rle_decompressor :: Transducer
+foreign import ccall "add_bwt_compressor" c_add_bwt_compressor :: Transducer
+foreign import ccall "add_bwt_decompressor" c_add_bwt_decompressor :: Transducer
+foreign import ccall "putb" c_putb :: Int -> PBFILE -> IO ()
+foreign import ccall "getb" c_getb :: PBFILE -> IO Int
+foreign import ccall "get_buf" c_get_buf :: PBFILE -> Ptr (Ptr Char) -> Ptr Int -> IO ()
+foreign import ccall "closeb" c_close :: PBFILE -> IO ()
+foreign import ccall "flushb" c_flush :: PBFILE -> IO ()
--- This really ought to be [Word8] -> [Word8]
-compress :: String -> String
-compress file = unsafePerformIO $ do
- (iptr, ilen) <- newCAStringLen file
- pptr <- new nullPtr
- olen <- c_lz77c iptr (intToCSize ilen) pptr
- optr <- peek pptr
- res <- peekCAStringLen (optr, cSizeToInt olen)
- free iptr
- free optr
- return res
+withPutTransducer :: Transducer -> [Char] -> [Char]
+withPutTransducer trans file = unsafePerformIO $ do
+ bf <- c_openb_wr_buf -- create a buffer
+ cbf <- trans bf -- and add transducer (e.g., a compressor)
+ mapM_ (flip c_putb cbf . ord) file -- copy all the bytes
+ c_flush cbf -- do compression and write to buffer
+ with nullPtr $ \ bufp ->
+ with 0 $ \ lenp -> do
+ c_get_buf bf bufp lenp -- get buffer and length
+ buf <- peek bufp
+ len <- peek lenp
+ res <- peekCAStringLen (buf, len) -- encode as a string
+ free buf -- free owned memory
+ c_close cbf -- and close everything
+ return res
+
+withGetTransducer :: Transducer -> [Char] -> [Char]
+withGetTransducer trans file = unsafePerformIO $ do
+ (ptr, len) <- newCAStringLen file -- make memory buffer
+ bf <- c_openb_rd_buf ptr len -- open it for reading
+ cbf <- trans bf -- and add transducer (e.g., decompressor)
+ h <- mkHandle "withGetTransducer" cbf HRead
+ cs <- hGetContents h -- get contents
+ seq (length cs) (return ()) -- force it all so ptr is no longer in use
+ hClose h
+ return cs
+
+compress :: [Char] -> [Char]
+compress = withPutTransducer c_add_lz77_compressor
+
+decompress :: [Char] -> [Char]
+decompress = withGetTransducer c_add_lz77_decompressor
+
+compressRLE :: [Char] -> [Char]
+compressRLE = withPutTransducer c_add_rle_compressor
+
+decompressRLE :: [Char] -> [Char]
+decompressRLE = withGetTransducer c_add_rle_decompressor
+
+compressBWT :: [Char] -> [Char]
+compressBWT = withPutTransducer c_add_bwt_compressor
+
+decompressBWT :: [Char] -> [Char]
+decompressBWT = withGetTransducer c_add_bwt_decompressor
+
+compressBWTRLE :: [Char] -> [Char]
+compressBWTRLE = withPutTransducer (c_add_bwt_compressor <=< c_add_rle_compressor <=< c_add_lz77_compressor)
+
+decompressBWTRLE :: [Char] -> [Char]
+decompressBWTRLE = withGetTransducer (c_add_bwt_decompressor <=< c_add_rle_decompressor <=< c_add_lz77_decompressor)
+
+{-
+main :: IO ()
+main = do
+ putStrLn "compress"
+ haa <- openBinaryFile "aa" ReadMode
+ aa <- hGetContents haa
+ let bb = compressBWTRLE aa
+ hbb <- openBinaryFile "bb" WriteMode
+ hPutStr hbb bb
+ hClose hbb
+ hClose haa
+ putStrLn "decompress"
+ hbb' <- openBinaryFile "bb" ReadMode
+ bb' <- hGetContents hbb'
+ let aa' = decompressBWTRLE bb'
+ hcc <- openBinaryFile "cc" WriteMode
+ hPutStr hcc aa'
+ hClose hbb'
+ hClose hcc
+-}
--- /dev/null
+++ b/lib/System/Console/GetOpt.hs
@@ -1,0 +1,409 @@
+{-# LANGUAGE Safe #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module : System.Console.GetOpt
+-- Copyright : (c) Sven Panne 2002-2005
+-- License : BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : stable
+-- Portability : portable
+--
+-- This module provides facilities for parsing the command-line options
+-- in a standalone program. It is essentially a Haskell port of the GNU
+-- @getopt@ library.
+--
+-----------------------------------------------------------------------------
+
+{-
+Sven Panne <Sven.Panne@informatik.uni-muenchen.de> Oct. 1996 (small
+changes Dec. 1997)
+
+Two rather obscure features are missing: The Bash 2.0 non-option hack
+(if you don't already know it, you probably don't want to hear about
+it...) and the recognition of long options with a single dash
+(e.g. '-help' is recognised as '--help', as long as there is no short
+option 'h').
+
+Other differences between GNU's getopt and this implementation:
+
+* To enforce a coherent description of options and arguments, there
+ are explanation fields in the option/argument descriptor.
+
+* Error messages are now more informative, but no longer POSIX
+ compliant... :-(
+
+And a final Haskell advertisement: The GNU C implementation uses well
+over 1100 lines, we need only 195 here, including a 46 line example!
+:-)
+-}
+
+module System.Console.GetOpt (
+ -- * GetOpt
+ getOpt, getOpt',
+ usageInfo,
+ ArgOrder(..),
+ OptDescr(..),
+ ArgDescr(..),
+
+ -- * Examples
+
+ -- |To hopefully illuminate the role of the different data structures,
+ -- here are the command-line options for a (very simple) compiler,
+ -- done in two different ways.
+ -- The difference arises because the type of 'getOpt' is
+ -- parameterized by the type of values derived from flags.
+
+ -- ** Interpreting flags as concrete values
+ -- $example1
+
+ -- ** Interpreting flags as transformations of an options record
+ -- $example2
+) where
+
+import Data.List ( isPrefixOf, find )
+
+-- |What to do with options following non-options
+data ArgOrder a
+ = RequireOrder -- ^ no option processing after first non-option
+ | Permute -- ^ freely intersperse options and non-options
+ | ReturnInOrder (String -> a) -- ^ wrap non-options into options
+
+{-|
+Each 'OptDescr' describes a single option.
+
+The arguments to 'Option' are:
+
+* list of short option characters
+
+* list of long option strings (without \"--\")
+
+* argument descriptor
+
+* explanation of option for user
+-}
+data OptDescr a = -- description of a single options:
+ Option [Char] -- list of short option characters
+ [String] -- list of long option strings (without "--")
+ (ArgDescr a) -- argument descriptor
+ String -- explanation of option for user
+
+-- |Describes whether an option takes an argument or not, and if so
+-- how the argument is injected into a value of type @a@.
+data ArgDescr a
+ = NoArg a -- ^ no argument expected
+ | ReqArg (String -> a) String -- ^ option requires argument
+ | OptArg (Maybe String -> a) String -- ^ optional argument
+
+-- | @since 4.7.0.0
+instance Functor ArgOrder where
+ fmap _ RequireOrder = RequireOrder
+ fmap _ Permute = Permute
+ fmap f (ReturnInOrder g) = ReturnInOrder (f . g)
+
+-- | @since 4.7.0.0
+instance Functor OptDescr where
+ fmap f (Option a b argDescr c) = Option a b (fmap f argDescr) c
+
+-- | @since 4.7.0.0
+instance Functor ArgDescr where
+ fmap f (NoArg a) = NoArg (f a)
+ fmap f (ReqArg g s) = ReqArg (f . g) s
+ fmap f (OptArg g s) = OptArg (f . g) s
+
+data OptKind a -- kind of cmd line arg (internal use only):
+ = Opt a -- an option
+ | UnreqOpt String -- an un-recognized option
+ | NonOpt String -- a non-option
+ | EndOfOpts -- end-of-options marker (i.e. "--")
+ | OptErr String -- something went wrong...
+
+-- | Return a string describing the usage of a command, derived from
+-- the header (first argument) and the options described by the
+-- second argument.
+usageInfo :: String -- header
+ -> [OptDescr a] -- option descriptors
+ -> String -- nicely formatted description of options
+usageInfo header optDescr = unlines (header:table)
+ where (ss,ls,ds) = (unzip3 . concatMap fmtOpt) optDescr
+ table = zipWith3 paste (sameLen ss) (sameLen ls) ds
+ paste x y z = " " ++ x ++ " " ++ y ++ " " ++ z
+ sameLen xs = flushLeft ((maximum . map length) xs) xs
+ flushLeft n xs = [ take n (x ++ repeat ' ') | x <- xs ]
+
+fmtOpt :: OptDescr a -> [(String,String,String)]
+fmtOpt (Option sos los ad descr) =
+ case lines descr of
+ [] -> [(sosFmt,losFmt,"")]
+ (d:ds) -> (sosFmt,losFmt,d) : [ ("","",d') | d' <- ds ]
+ where sepBy _ [] = ""
+ sepBy _ [x] = x
+ sepBy ch (x:xs) = x ++ ch:' ':sepBy ch xs
+ sosFmt = sepBy ',' (map (fmtShort ad) sos)
+ losFmt = sepBy ',' (map (fmtLong ad) los)
+
+fmtShort :: ArgDescr a -> Char -> String
+fmtShort (NoArg _ ) so = "-" ++ [so]
+fmtShort (ReqArg _ ad) so = "-" ++ [so] ++ " " ++ ad
+fmtShort (OptArg _ ad) so = "-" ++ [so] ++ "[" ++ ad ++ "]"
+
+fmtLong :: ArgDescr a -> String -> String
+fmtLong (NoArg _ ) lo = "--" ++ lo
+fmtLong (ReqArg _ ad) lo = "--" ++ lo ++ "=" ++ ad
+fmtLong (OptArg _ ad) lo = "--" ++ lo ++ "[=" ++ ad ++ "]"
+
+{-|
+Process the command-line, and return the list of values that matched
+(and those that didn\'t). The arguments are:
+
+* The order requirements (see 'ArgOrder')
+
+* The option descriptions (see 'OptDescr')
+
+* The actual command line arguments (presumably got from
+ 'GHC.Internal.System.Environment.getArgs').
+
+'getOpt' returns a triple consisting of the option arguments, a list
+of non-options, and a list of error messages.
+-}
+getOpt :: ArgOrder a -- non-option handling
+ -> [OptDescr a] -- option descriptors
+ -> [String] -- the command-line arguments
+ -> ([a],[String],[String]) -- (options,non-options,error messages)
+getOpt ordering optDescr args = (os,xs,es ++ map errUnrec us)
+ where (os,xs,us,es) = getOpt' ordering optDescr args
+
+{-|
+This is almost the same as 'getOpt', but returns a quadruple
+consisting of the option arguments, a list of non-options, a list of
+unrecognized options, and a list of error messages.
+-}
+getOpt' :: ArgOrder a -- non-option handling
+ -> [OptDescr a] -- option descriptors
+ -> [String] -- the command-line arguments
+ -> ([a],[String], [String] ,[String]) -- (options,non-options,unrecognized,error messages)
+getOpt' _ _ [] = ([],[],[],[])
+getOpt' ordering optDescr (arg:args) = procNextOpt opt ordering
+ where procNextOpt (Opt o) _ = (o:os,xs,us,es)
+ procNextOpt (UnreqOpt u) _ = (os,xs,u:us,es)
+ procNextOpt (NonOpt x) RequireOrder = ([],x:rest,[],[])
+ procNextOpt (NonOpt x) Permute = (os,x:xs,us,es)
+ procNextOpt (NonOpt x) (ReturnInOrder f) = (f x :os, xs,us,es)
+ procNextOpt EndOfOpts RequireOrder = ([],rest,[],[])
+ procNextOpt EndOfOpts Permute = ([],rest,[],[])
+ procNextOpt EndOfOpts (ReturnInOrder f) = (map f rest,[],[],[])
+ procNextOpt (OptErr e) _ = (os,xs,us,e:es)
+
+ (opt,rest) = getNext arg args optDescr
+ (os,xs,us,es) = getOpt' ordering optDescr rest
+
+-- take a look at the next cmd line arg and decide what to do with it
+getNext :: String -> [String] -> [OptDescr a] -> (OptKind a,[String])
+getNext ('-':'-':[]) rest _ = (EndOfOpts,rest)
+getNext ('-':'-':xs) rest optDescr = longOpt xs rest optDescr
+getNext ('-': x :xs) rest optDescr = shortOpt x xs rest optDescr
+getNext a rest _ = (NonOpt a,rest)
+
+-- handle long option
+longOpt :: String -> [String] -> [OptDescr a] -> (OptKind a,[String])
+longOpt ls rs optDescr = long ads arg rs
+ where (opt,arg) = break (=='=') ls
+ getWith p = [ o | o@(Option _ xs _ _) <- optDescr
+ , find (p opt) xs /= Nothing ]
+ exact = getWith (==)
+ options = if null exact then getWith isPrefixOf else exact
+ ads = [ ad | Option _ _ ad _ <- options ]
+ optStr = ("--"++opt)
+
+ long (_:_:_) _ rest = (errAmbig options optStr,rest)
+ long [NoArg a ] [] rest = (Opt a,rest)
+ long [NoArg _ ] ('=':_) rest = (errNoArg optStr,rest)
+ long [ReqArg _ d] [] [] = (errReq d optStr,[])
+ long [ReqArg f _] [] (r:rest) = (Opt (f r),rest)
+ long [ReqArg f _] ('=':xs) rest = (Opt (f xs),rest)
+ long [OptArg f _] [] rest = (Opt (f Nothing),rest)
+ long [OptArg f _] ('=':xs) rest = (Opt (f (Just xs)),rest)
+ long _ _ rest = (UnreqOpt ("--"++ls),rest)
+
+-- handle short option
+shortOpt :: Char -> String -> [String] -> [OptDescr a] -> (OptKind a,[String])
+shortOpt y ys rs optDescr = short ads ys rs
+ where options = [ o | o@(Option ss _ _ _) <- optDescr, s <- ss, y == s ]
+ ads = [ ad | Option _ _ ad _ <- options ]
+ optStr = '-':[y]
+
+ short (_:_:_) _ rest = (errAmbig options optStr,rest)
+ short (NoArg a :_) [] rest = (Opt a,rest)
+ short (NoArg a :_) xs rest = (Opt a,('-':xs):rest)
+ short (ReqArg _ d:_) [] [] = (errReq d optStr,[])
+ short (ReqArg f _:_) [] (r:rest) = (Opt (f r),rest)
+ short (ReqArg f _:_) xs rest = (Opt (f xs),rest)
+ short (OptArg f _:_) [] rest = (Opt (f Nothing),rest)
+ short (OptArg f _:_) xs rest = (Opt (f (Just xs)),rest)
+ short [] [] rest = (UnreqOpt optStr,rest)
+ short [] xs rest = (UnreqOpt optStr,('-':xs):rest)
+
+-- miscellaneous error formatting
+
+errAmbig :: [OptDescr a] -> String -> OptKind a
+errAmbig ods optStr = OptErr (usageInfo header ods)
+ where header = "option `" ++ optStr ++ "' is ambiguous; could be one of:"
+
+errReq :: String -> String -> OptKind a
+errReq d optStr = OptErr ("option `" ++ optStr ++ "' requires an argument " ++ d ++ "\n")
+
+errUnrec :: String -> String
+errUnrec optStr = "unrecognized option `" ++ optStr ++ "'\n"
+
+errNoArg :: String -> OptKind a
+errNoArg optStr = OptErr ("option `" ++ optStr ++ "' doesn't allow an argument\n")
+
+{-
+-----------------------------------------------------------------------------------------
+-- and here a small and hopefully enlightening example:
+
+data Flag = Verbose | Version | Name String | Output String | Arg String deriving Show
+
+options :: [OptDescr Flag]
+options =
+ [Option ['v'] ["verbose"] (NoArg Verbose) "verbosely list files",
+ Option ['V','?'] ["version","release"] (NoArg Version) "show version info",
+ Option ['o'] ["output"] (OptArg out "FILE") "use FILE for dump",
+ Option ['n'] ["name"] (ReqArg Name "USER") "only dump USER's files"]
+
+out :: Maybe String -> Flag
+out Nothing = Output "stdout"
+out (Just o) = Output o
+
+test :: ArgOrder Flag -> [String] -> String
+test order cmdline = case getOpt order options cmdline of
+ (o,n,[] ) -> "options=" ++ show o ++ " args=" ++ show n ++ "\n"
+ (_,_,errs) -> concat errs ++ usageInfo header options
+ where header = "Usage: foobar [OPTION...] files..."
+
+-- example runs:
+-- putStr (test RequireOrder ["foo","-v"])
+-- ==> options=[] args=["foo", "-v"]
+-- putStr (test Permute ["foo","-v"])
+-- ==> options=[Verbose] args=["foo"]
+-- putStr (test (ReturnInOrder Arg) ["foo","-v"])
+-- ==> options=[Arg "foo", Verbose] args=[]
+-- putStr (test Permute ["foo","--","-v"])
+-- ==> options=[] args=["foo", "-v"]
+-- putStr (test Permute ["-?o","--name","bar","--na=baz"])
+-- ==> options=[Version, Output "stdout", Name "bar", Name "baz"] args=[]
+-- putStr (test Permute ["--ver","foo"])
+-- ==> option `--ver' is ambiguous; could be one of:
+-- -v --verbose verbosely list files
+-- -V, -? --version, --release show version info
+-- Usage: foobar [OPTION...] files...
+-- -v --verbose verbosely list files
+-- -V, -? --version, --release show version info
+-- -o[FILE] --output[=FILE] use FILE for dump
+-- -n USER --name=USER only dump USER's files
+-----------------------------------------------------------------------------------------
+-}
+
+{- $example1
+
+A simple choice for the type associated with flags is to define a type
+@Flag@ as an algebraic type representing the possible flags and their
+arguments:
+
+> module Opts1 where
+>
+> import System.Console.GetOpt
+> import GHC.Internal.Data.Maybe ( fromMaybe )
+>
+> data Flag
+> = Verbose | Version
+> | Input String | Output String | LibDir String
+> deriving Show
+>
+> options :: [OptDescr Flag]
+> options =
+> [ Option ['v'] ["verbose"] (NoArg Verbose) "chatty output on stderr"
+> , Option ['V','?'] ["version"] (NoArg Version) "show version number"
+> , Option ['o'] ["output"] (OptArg outp "FILE") "output FILE"
+> , Option ['c'] [] (OptArg inp "FILE") "input FILE"
+> , Option ['L'] ["libdir"] (ReqArg LibDir "DIR") "library directory"
+> ]
+>
+> inp,outp :: Maybe String -> Flag
+> outp = Output . fromMaybe "stdout"
+> inp = Input . fromMaybe "stdin"
+>
+> compilerOpts :: [String] -> IO ([Flag], [String])
+> compilerOpts argv =
+> case getOpt Permute options argv of
+> (o,n,[] ) -> return (o,n)
+> (_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))
+> where header = "Usage: ic [OPTION...] files..."
+
+Then the rest of the program will use the constructed list of flags
+to determine it\'s behaviour.
+
+-}
+
+{- $example2
+
+A different approach is to group the option values in a record of type
+@Options@, and have each flag yield a function of type
+@Options -> Options@ transforming this record.
+
+> module Opts2 where
+>
+> import System.Console.GetOpt
+> import GHC.Internal.Data.Maybe ( fromMaybe )
+>
+> data Options = Options
+> { optVerbose :: Bool
+> , optShowVersion :: Bool
+> , optOutput :: Maybe FilePath
+> , optInput :: Maybe FilePath
+> , optLibDirs :: [FilePath]
+> } deriving Show
+>
+> defaultOptions = Options
+> { optVerbose = False
+> , optShowVersion = False
+> , optOutput = Nothing
+> , optInput = Nothing
+> , optLibDirs = []
+> }
+>
+> options :: [OptDescr (Options -> Options)]
+> options =
+> [ Option ['v'] ["verbose"]
+> (NoArg (\ opts -> opts { optVerbose = True }))
+> "chatty output on stderr"
+> , Option ['V','?'] ["version"]
+> (NoArg (\ opts -> opts { optShowVersion = True }))
+> "show version number"
+> , Option ['o'] ["output"]
+> (OptArg ((\ f opts -> opts { optOutput = Just f }) . fromMaybe "output")
+> "FILE")
+> "output FILE"
+> , Option ['c'] []
+> (OptArg ((\ f opts -> opts { optInput = Just f }) . fromMaybe "input")
+> "FILE")
+> "input FILE"
+> , Option ['L'] ["libdir"]
+> (ReqArg (\ d opts -> opts { optLibDirs = optLibDirs opts ++ [d] }) "DIR")
+> "library directory"
+> ]
+>
+> compilerOpts :: [String] -> IO (Options, [String])
+> compilerOpts argv =
+> case getOpt Permute options argv of
+> (o,n,[] ) -> return (foldl (flip id) defaultOptions o, n)
+> (_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))
+> where header = "Usage: ic [OPTION...] files..."
+
+Similarly, each flag could yield a monadic function transforming a record,
+of type @Options -> IO Options@ (or any other monad), allowing option
+processing to perform actions of the chosen monad, e.g. printing help or
+version messages, checking that file arguments exist, etc.
+
+-}
--- a/lib/System/Directory.hs
+++ b/lib/System/Directory.hs
@@ -12,7 +12,7 @@
copyFile,
getHomeDirectory,
) where
-import Prelude
+import Prelude(); import MiniPrelude
import Control.Exception(bracket)
import Control.Monad(when)
import Foreign.C.String
--- a/lib/System/Environment.hs
+++ b/lib/System/Environment.hs
@@ -7,10 +7,11 @@
lookupEnv,
getEnv,
) where
-import Prelude
+import Prelude(); import MiniPrelude
import Primitives
import Foreign.C.String
import Foreign.Ptr
+import System.IO
-- primArgRef returns an array containing a list of strings.
-- The first element is the program name, the rest are the arguments.
--- a/lib/System/Exit.hs
+++ b/lib/System/Exit.hs
@@ -5,6 +5,7 @@
exitSuccess,
die,
) where
+import Prelude(); import MiniPrelude
import Control.Exception
import Data.Typeable
import System.IO
--- a/lib/System/IO.hs
+++ b/lib/System/IO.hs
@@ -21,7 +21,7 @@
mkTextEncoding, hSetEncoding, utf8,
- openTmpFile, openTempFile,
+ openTmpFile, openTempFile, openBinaryTempFile,
withFile,
) where
@@ -47,17 +47,17 @@
import Foreign.Marshal.Alloc
import Foreign.Ptr
import System.IO.Unsafe
-import System.IO_Handle
+import System.IO.Internal
data FILE
primHPrint :: forall a . Ptr BFILE -> a -> IO ()
primHPrint = primitive "IO.print"
-primStdin :: Ptr BFILE
+primStdin :: ForeignPtr BFILE
primStdin = primitive "IO.stdin"
-primStdout :: Ptr BFILE
+primStdout :: ForeignPtr BFILE
primStdout = primitive "IO.stdout"
-primStderr :: Ptr BFILE
+primStderr :: ForeignPtr BFILE
primStderr = primitive "IO.stderr"
foreign import ccall "fopen" c_fopen :: CString -> CString -> IO (Ptr FILE)
@@ -72,45 +72,45 @@
----------------------------------------------------------
instance Eq Handle where
- Handle p == Handle q = p == q
+ h == h' =
+ unsafePerformIO $
+ withHandleAny h $ \ p ->
+ withHandleAny h' $ \ p' ->
+ pure (p == p')
instance Show Handle where
- show (Handle p) = "Handle-" ++ show p
+ show h = unsafePerformIO $
+ withHandleAny h $ \ p ->
+ return $ "Handle-" ++ show p
type FilePath = String
-data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode
-
-instance Functor IO where
- fmap f ioa = ioa `primBind` \ a -> primReturn (f a)
-instance Applicative IO where
- pure = primReturn
- (<*>) = ap
-instance Monad IO where
- (>>=) = primBind
- (>>) = primThen
- return = primReturn
-instance MonadFail IO where
- fail = error
-
stdin :: Handle
-stdin = Handle primStdin
+stdin = unsafeHandle primStdin HRead "stdin"
stdout :: Handle
-stdout = Handle primStdout
+stdout = unsafeHandle primStdout HWrite "stdout"
stderr :: Handle
-stderr = Handle primStderr
+stderr = unsafeHandle primStderr HWrite "stderr"
--bFILE :: Ptr FILE -> Handle
--bFILE = Handle . primPerformIO . (c_add_utf8 <=< c_add_FILE)
hClose :: Handle -> IO ()
-hClose (Handle p) = c_closeb p
+hClose h = do
+ m <- getHandleState h
+ case m of
+ HClosed -> error "Handle already closed"
+ HSemiClosed -> return ()
+ _ -> do
+ killHandle h
+ withHandleAny h c_closeb
+ setHandleState h HClosed
hFlush :: Handle -> IO ()
-hFlush (Handle p) = c_flushb p
+hFlush h = withHandleWr h c_flushb
hGetChar :: Handle -> IO Char
-hGetChar (Handle p) = do
+hGetChar h = withHandleRd h $ \ p -> do
c <- c_getb p
if c == (-1::Int) then
error "hGetChar: EOF"
@@ -118,13 +118,13 @@
return (chr c)
hLookAhead :: Handle -> IO Char
-hLookAhead h@(Handle p) = do
+hLookAhead h = withHandleRd h $ \ p -> do
c <- hGetChar h
c_ungetb (ord c) p
return c
hPutChar :: Handle -> Char -> IO ()
-hPutChar (Handle p) c = c_putb (ord c) p
+hPutChar h c = withHandleWr h $ c_putb (ord c)
openFILEM :: FilePath -> IOMode -> IO (Maybe (Ptr FILE))
openFILEM p m = do
@@ -141,11 +141,11 @@
return (Just h)
openFileM :: FilePath -> IOMode -> IO (Maybe Handle)
-openFileM p m = do
- mf <- openFILEM p m
+openFileM fn m = do
+ mf <- openFILEM fn m
case mf of
Nothing -> return Nothing
- Just p -> do { q <- c_add_utf8 =<< c_add_FILE p; return (Just (Handle q)) }
+ Just p -> do { q <- c_add_utf8 =<< c_add_FILE p; Just <$> mkHandle fn q (ioModeToHMode m) }
openFile :: String -> IOMode -> IO Handle
openFile p m = do
@@ -161,12 +161,10 @@
getChar = hGetChar stdin
cprint :: forall a . a -> IO ()
-cprint a = primRnfNoErr a `seq` primHPrint p a
- where Handle p = stdout
+cprint a = withHandleWr stdout $ \ p -> primRnfNoErr a `seq` primHPrint p a
cuprint :: forall a . a -> IO ()
-cuprint = primHPrint p
- where Handle p = stdout
+cuprint a = withHandleWr stdout $ \ p -> primHPrint p a
print :: forall a . (Show a) => a -> IO ()
print a = putStrLn (show a)
@@ -230,10 +228,11 @@
-- Lazy hGetContents
hGetContents :: Handle -> IO String
-hGetContents h@(Handle p) = do
+hGetContents h = withHandleRd h $ \ p -> do
c <- c_getb p
if c == (-1::Int) then do
- hClose h -- EOF, so close the handle
+ hClose h -- EOF, so close the handle
+ setHandleState h HSemiClosed -- but still allow a regular close
return ""
else do
cs <- unsafeInterleaveIO (hGetContents h)
@@ -246,11 +245,11 @@
interact f = getContents >>= putStr . f
openBinaryFile :: String -> IOMode -> IO Handle
-openBinaryFile p m = do
- mf <- openFILEM p m
+openBinaryFile fn m = do
+ mf <- openFILEM fn m
case mf of
- Nothing -> error $ "openBinaryFile: cannot open " ++ show p
- Just p -> do { q <- c_add_FILE p; return (Handle q) }
+ Nothing -> error $ "openBinaryFile: cannot open " ++ show fn
+ Just p -> do { q <- c_add_FILE p; mkHandle fn q (ioModeToHMode m) }
--------
-- For compatibility
@@ -301,8 +300,8 @@
return (tmp, h)
-- Sloppy implementation of openTempFile
-openTempFile :: FilePath -> String -> IO (String, Handle)
-openTempFile tmp tmplt = do
+openTempFile' :: (FilePath -> IOMode -> IO Handle) -> FilePath -> String -> IO (String, Handle)
+openTempFile' open tmp tmplt = do
let (pre, suf) = splitTmp tmplt
loop n = do
let fn = tmp ++ "/" ++ pre ++ show n ++ suf
@@ -312,6 +311,12 @@
hClose h
loop (n+1 :: Int)
Nothing -> do
- h <- openFile fn ReadWriteMode
+ h <- open fn ReadWriteMode
return (fn, h)
loop 0
+
+openTempFile :: FilePath -> String -> IO (String, Handle)
+openTempFile = openTempFile' openFile
+
+openBinaryTempFile :: FilePath -> String -> IO (String, Handle)
+openBinaryTempFile = openTempFile' openBinaryFile
--- /dev/null
+++ b/lib/System/IO/Error.hs
@@ -1,0 +1,335 @@
+module System.IO.Error (
+ IOException(..),
+
+ -- * I\/O errors
+ IOError,
+ IOErrorType(..),
+
+ userError,
+
+ mkIOError,
+
+ annotateIOError,
+
+ -- ** Classifying I\/O errors
+ isAlreadyExistsError,
+ isDoesNotExistError,
+ isAlreadyInUseError,
+ isFullError,
+ isEOFError,
+ isIllegalOperation,
+ isPermissionError,
+ isUserError,
+ isResourceVanishedError,
+
+ -- ** Attributes of I\/O errors
+ ioeGetErrorType,
+ ioeGetLocation,
+ ioeGetErrorString,
+ ioeGetHandle,
+ ioeGetFileName,
+
+ ioeSetErrorType,
+ ioeSetErrorString,
+ ioeSetLocation,
+ ioeSetHandle,
+ ioeSetFileName,
+
+ -- * Types of I\/O error
+ IOErrorType, -- abstract
+
+ alreadyExistsErrorType,
+ doesNotExistErrorType,
+ alreadyInUseErrorType,
+ fullErrorType,
+ eofErrorType,
+ illegalOperationErrorType,
+ permissionErrorType,
+ userErrorType,
+ resourceVanishedErrorType,
+
+ -- ** 'IOErrorType' predicates
+ isAlreadyExistsErrorType,
+ isDoesNotExistErrorType,
+ isAlreadyInUseErrorType,
+ isFullErrorType,
+ isEOFErrorType,
+ isIllegalOperationErrorType,
+ isPermissionErrorType,
+ isUserErrorType,
+ isResourceVanishedErrorType,
+
+ -- * Throwing and catching I\/O errors
+
+ ioError,
+
+ catchIOError,
+ tryIOError,
+
+ modifyIOError,
+ ) where
+import Prelude()
+import Control.Exception.Internal
+import Control.Monad
+import Data.Bool
+import Data.Char_Type
+import Data.Either
+import Data.Eq
+import Data.Function
+import Data.Int
+import Data.List
+import Data.Maybe
+import Data.Records
+import Data.String
+import Data.Typeable
+import System.IO
+import Text.Show
+
+
+ioException :: IOException -> IO a
+ioException err = throw err
+
+ioError :: IOError -> IO a
+ioError = ioException
+
+type IOError = IOException
+
+data IOException
+ = IOError {
+ ioe_handle :: Maybe Handle, -- ^ the handle used by the action flagging
+ -- the error.
+ ioe_type :: IOErrorType, -- ^ what it was.
+ ioe_location :: String, -- ^ location.
+ ioe_description :: String, -- ^ error type specific information.
+ ioe_errno :: Maybe Int, -- ^ errno leading to this error, if any.
+ ioe_filename :: Maybe FilePath -- ^ filename the error is related to
+ -- (some libraries may assume different encodings
+ -- when constructing this field from e.g. 'ByteString'
+ -- or other types)
+ }
+ deriving (Typeable)
+
+instance Exception IOException
+
+instance Eq IOException where
+ (IOError h1 e1 loc1 str1 en1 fn1) == (IOError h2 e2 loc2 str2 en2 fn2) =
+ e1==e2 && str1==str2 && h1==h2 && loc1==loc2 && en1==en2 && fn1==fn2
+
+-- | An abstract type that contains a value for each variant of 'IOError'.
+data IOErrorType
+ -- Haskell 2010:
+ = AlreadyExists
+ | NoSuchThing
+ | ResourceBusy
+ | ResourceExhausted
+ | EOF
+ | IllegalOperation
+ | PermissionDenied
+ | UserError
+ -- GHC only:
+ | UnsatisfiedConstraints
+ | SystemError
+ | ProtocolError
+ | OtherError
+ | InvalidArgument
+ | InappropriateType
+ | HardwareFault
+ | UnsupportedOperation
+ | TimeExpired
+ | ResourceVanished
+ | Interrupted
+ deriving (Eq)
+
+instance Show IOErrorType where
+ showsPrec _ e =
+ showString $
+ case e of
+ AlreadyExists -> "already exists"
+ NoSuchThing -> "does not exist"
+ ResourceBusy -> "resource busy"
+ ResourceExhausted -> "resource exhausted"
+ EOF -> "end of file"
+ IllegalOperation -> "illegal operation"
+ PermissionDenied -> "permission denied"
+ UserError -> "user error"
+ HardwareFault -> "hardware fault"
+ InappropriateType -> "inappropriate type"
+ Interrupted -> "interrupted"
+ InvalidArgument -> "invalid argument"
+ OtherError -> "failed"
+ ProtocolError -> "protocol error"
+ ResourceVanished -> "resource vanished"
+ SystemError -> "system error"
+ TimeExpired -> "timeout"
+ UnsatisfiedConstraints -> "unsatisfied constraints" -- ultra-precise!
+ UnsupportedOperation -> "unsupported operation"
+
+userError :: String -> IOError
+userError str = IOError Nothing UserError "" str Nothing Nothing
+
+instance Show IOException where
+ showsPrec p (IOError hdl iot loc s _ fn) =
+ (case fn of
+ Nothing -> case hdl of
+ Nothing -> id
+ Just h -> showsPrec p h . showString ": "
+ Just name -> showString name . showString ": ") .
+ (case loc of
+ "" -> id
+ _ -> showString loc . showString ": ") .
+ showsPrec p iot .
+ (case s of
+ "" -> id
+ _ -> showString " (" . showString s . showString ")")
+
+-----------
+
+tryIOError :: IO a -> IO (Either IOError a)
+tryIOError f = catch (do r <- f
+ return (Right r))
+ (return . Left)
+
+mkIOError :: IOErrorType -> String -> Maybe Handle -> Maybe FilePath -> IOError
+mkIOError t location maybe_hdl maybe_filename =
+ IOError{ ioe_type = t,
+ ioe_location = location,
+ ioe_description = "",
+ ioe_errno = Nothing,
+ ioe_handle = maybe_hdl,
+ ioe_filename = maybe_filename
+ }
+
+isAlreadyExistsError :: IOError -> Bool
+isAlreadyExistsError = isAlreadyExistsErrorType . ioeGetErrorType
+
+isDoesNotExistError :: IOError -> Bool
+isDoesNotExistError = isDoesNotExistErrorType . ioeGetErrorType
+
+isAlreadyInUseError :: IOError -> Bool
+isAlreadyInUseError = isAlreadyInUseErrorType . ioeGetErrorType
+
+isFullError :: IOError -> Bool
+isFullError = isFullErrorType . ioeGetErrorType
+
+isEOFError :: IOError -> Bool
+isEOFError = isEOFErrorType . ioeGetErrorType
+
+isIllegalOperation :: IOError -> Bool
+isIllegalOperation = isIllegalOperationErrorType . ioeGetErrorType
+
+isPermissionError :: IOError -> Bool
+isPermissionError = isPermissionErrorType . ioeGetErrorType
+
+isUserError :: IOError -> Bool
+isUserError = isUserErrorType . ioeGetErrorType
+
+isResourceVanishedError :: IOError -> Bool
+isResourceVanishedError = isResourceVanishedErrorType . ioeGetErrorType
+
+alreadyExistsErrorType :: IOErrorType
+alreadyExistsErrorType = AlreadyExists
+
+doesNotExistErrorType :: IOErrorType
+doesNotExistErrorType = NoSuchThing
+
+alreadyInUseErrorType :: IOErrorType
+alreadyInUseErrorType = ResourceBusy
+
+fullErrorType :: IOErrorType
+fullErrorType = ResourceExhausted
+
+eofErrorType :: IOErrorType
+eofErrorType = EOF
+
+illegalOperationErrorType :: IOErrorType
+illegalOperationErrorType = IllegalOperation
+
+permissionErrorType :: IOErrorType
+permissionErrorType = PermissionDenied
+
+userErrorType :: IOErrorType
+userErrorType = UserError
+
+resourceVanishedErrorType :: IOErrorType
+resourceVanishedErrorType = ResourceVanished
+
+isAlreadyExistsErrorType :: IOErrorType -> Bool
+isAlreadyExistsErrorType AlreadyExists = True
+isAlreadyExistsErrorType _ = False
+
+isDoesNotExistErrorType :: IOErrorType -> Bool
+isDoesNotExistErrorType NoSuchThing = True
+isDoesNotExistErrorType _ = False
+
+isAlreadyInUseErrorType :: IOErrorType -> Bool
+isAlreadyInUseErrorType ResourceBusy = True
+isAlreadyInUseErrorType _ = False
+
+isFullErrorType :: IOErrorType -> Bool
+isFullErrorType ResourceExhausted = True
+isFullErrorType _ = False
+
+isEOFErrorType :: IOErrorType -> Bool
+isEOFErrorType EOF = True
+isEOFErrorType _ = False
+
+isIllegalOperationErrorType :: IOErrorType -> Bool
+isIllegalOperationErrorType IllegalOperation = True
+isIllegalOperationErrorType _ = False
+
+isPermissionErrorType :: IOErrorType -> Bool
+isPermissionErrorType PermissionDenied = True
+isPermissionErrorType _ = False
+
+isUserErrorType :: IOErrorType -> Bool
+isUserErrorType UserError = True
+isUserErrorType _ = False
+
+isResourceVanishedErrorType :: IOErrorType -> Bool
+isResourceVanishedErrorType ResourceVanished = True
+isResourceVanishedErrorType _ = False
+
+ioeGetErrorType :: IOError -> IOErrorType
+ioeGetErrorString :: IOError -> String
+ioeGetLocation :: IOError -> String
+ioeGetHandle :: IOError -> Maybe Handle
+ioeGetFileName :: IOError -> Maybe FilePath
+
+ioeGetErrorType ioe = ioe_type ioe
+
+ioeGetErrorString ioe
+ | isUserErrorType (ioe_type ioe) = ioe_description ioe
+ | otherwise = show (ioe_type ioe)
+
+ioeGetLocation ioe = ioe_location ioe
+
+ioeGetHandle ioe = ioe_handle ioe
+
+ioeGetFileName ioe = ioe_filename ioe
+
+ioeSetErrorType :: IOError -> IOErrorType -> IOError
+ioeSetErrorString :: IOError -> String -> IOError
+ioeSetLocation :: IOError -> String -> IOError
+ioeSetHandle :: IOError -> Handle -> IOError
+ioeSetFileName :: IOError -> FilePath -> IOError
+
+ioeSetErrorType ioe errtype = ioe{ ioe_type = errtype }
+ioeSetErrorString ioe str = ioe{ ioe_description = str }
+ioeSetLocation ioe str = ioe{ ioe_location = str }
+ioeSetHandle ioe hdl = ioe{ ioe_handle = Just hdl }
+ioeSetFileName ioe filename = ioe{ ioe_filename = Just filename }
+
+modifyIOError :: (IOError -> IOError) -> IO a -> IO a
+modifyIOError f io = catch io (\e -> ioError (f e))
+
+annotateIOError :: IOError
+ -> String
+ -> Maybe Handle
+ -> Maybe FilePath
+ -> IOError
+annotateIOError ioe loc hdl path =
+ ioe{ ioe_handle = hdl `mplus` ioe_handle ioe,
+ ioe_location = loc, ioe_filename = path `mplus` ioe_filename ioe }
+
+catchIOError :: IO a -> (IOError -> IO a) -> IO a
+catchIOError = catch
--- /dev/null
+++ b/lib/System/IO/Internal.hs
@@ -1,0 +1,113 @@
+module System.IO.Internal(
+ BFILE,
+ Handle, HandleState(..),
+ IOMode(..), ioModeToHMode,
+ mkHandle, unsafeHandle,
+ withHandleRd, withHandleWr, withHandleAny,
+ getHandleState, setHandleState,
+ killHandle,
+ addTransducer) where
+import Prelude()
+import Primitives
+import Control.Applicative
+import Control.Error
+import Control.Monad
+import Control.Monad.Fail
+import Data.Bool
+import Data.Char
+import Data.Eq
+import Data.Function
+import Data.IORef
+import Data.List
+--import Foreign.ForeignPtr causes import cycle
+import System.IO_Handle
+import System.IO.Unsafe
+
+data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode
+ deriving (Eq)
+
+ioModeToHMode :: IOMode -> HandleState
+ioModeToHMode ReadMode = HRead
+ioModeToHMode WriteMode = HWrite
+ioModeToHMode AppendMode = HWrite
+ioModeToHMode ReadWriteMode = HReadWrite
+
+unsafeHandle :: ForeignPtr BFILE -> HandleState -> String -> Handle
+unsafeHandle fp m desc = unsafePerformIO $ do
+ st <- newIORef m
+ return (Handle fp st desc)
+
+withHandle :: Handle -> (Ptr BFILE -> IO a) -> IO a
+withHandle (Handle fp _ _) io = do
+ a <- io (primForeignPtrToPtr fp)
+ seq fp (return a) -- hold on to fp so it's not gc():ed
+
+withHandleM :: [HandleState] -> Handle -> (Ptr BFILE -> IO a) -> IO a
+withHandleM ms h@(Handle _ st _) io = do
+ m <- readIORef st
+ when (m `notElem` ms) (error "Bad Handle mode")
+ withHandle h io
+
+withHandleRd :: Handle -> (Ptr BFILE -> IO a) -> IO a
+withHandleRd = withHandleM [HRead, HReadWrite]
+
+withHandleWr :: Handle -> (Ptr BFILE -> IO a) -> IO a
+withHandleWr = withHandleM [HWrite, HReadWrite]
+
+withHandleAny :: Handle -> (Ptr BFILE -> IO a) -> IO a
+withHandleAny = withHandle
+
+getHandleState :: Handle -> IO HandleState
+getHandleState (Handle _ st _) = readIORef st
+
+setHandleState :: Handle -> HandleState -> IO ()
+setHandleState (Handle _ st _) m = writeIORef st m
+
+foreign import ccall "&closeb" c_close :: FunPtr (Ptr BFILE -> IO ())
+
+{-
+primSetDesc :: [Char] -> ForeignPtr BFILE -> IO ()
+primSetDesc = primitive "fpstr"
+-}
+
+-- Create a Handle with the appropriate finalizer.
+mkHandle :: [Char] -> Ptr BFILE -> HandleState -> IO Handle
+mkHandle desc p mode = do
+ fp <- primNewForeignPtr p
+ primAddFinalizer c_close fp
+{-
+ primSetDesc desc fp
+-}
+ rmode <- newIORef mode
+ return (Handle fp rmode desc)
+
+-- When a handle is closed, we must remove the c_close finalizer.
+killHandle :: Handle -> IO ()
+killHandle (Handle fp _ _) =
+ primAddFinalizer (primIntToFunPtr (0::Int)) fp
+
+addTransducer :: (Ptr BFILE -> IO (Ptr BFILE)) -> Handle -> IO Handle
+addTransducer trans h@(Handle _ st desc) =
+ withHandle h $ \ p -> do -- unwrap handle
+ p' <- trans p -- add transducer
+ mode <- readIORef st
+ killHandle h -- old handle should not be finalized,
+ mkHandle desc p' mode -- because the new handle will do that
+
+----------------------------------------
+
+instance Functor IO where
+ fmap f ioa = ioa `primBind` \ a -> primReturn (f a)
+
+instance Applicative IO where
+ pure = primReturn
+ (<*>) = ap
+
+instance Monad IO where
+ (>>=) = primBind
+ (>>) = primThen
+ return = primReturn
+
+instance MonadFail IO where
+ fail = error
+
--- a/lib/System/IO/MD5.hs
+++ b/lib/System/IO/MD5.hs
@@ -1,8 +1,8 @@
-- Copyright 2023 Lennart Augustsson
-- See LICENSE file for full license.
module System.IO.MD5(MD5CheckSum, md5File, md5Handle, md5String, md5Combine) where
+import Prelude(); import MiniPrelude
import Primitives(primPerformIO)
-import Prelude
import Data.Word
import Foreign.C.String
import Foreign.Marshal.Alloc
@@ -9,8 +9,9 @@
import Foreign.Marshal.Array
import Foreign.Ptr
import System.IO
+import System.IO.Internal
-foreign import ccall "md5BFILE" c_md5BFILE :: Handle -> Ptr Word -> IO ()
+foreign import ccall "md5BFILE" c_md5BFILE :: Ptr BFILE -> Ptr Word -> IO ()
foreign import ccall "md5String" c_md5String :: CString -> Ptr Word -> IO ()
foreign import ccall "md5Array" c_md5Array :: Ptr Word -> Ptr Word -> Int -> IO ()
@@ -43,7 +44,7 @@
md5String s = primPerformIO $ withCAString s $ chksum . c_md5String
md5Handle :: Handle -> IO MD5CheckSum
-md5Handle h = chksum $ c_md5BFILE h
+md5Handle h = withHandleRd h $ chksum . c_md5BFILE
md5File :: FilePath -> IO (Maybe MD5CheckSum)
md5File fn = do
--- a/lib/System/IO/Serialize.hs
+++ b/lib/System/IO/Serialize.hs
@@ -5,9 +5,10 @@
writeSerialized, writeSerializedCompressed,
readSerialized,
) where
+import Prelude(); import MiniPrelude
import Primitives(Ptr)
-import System.IO_Handle
import System.IO
+import System.IO.Internal
primHSerialize :: forall a . Ptr BFILE -> a -> IO ()
primHSerialize = primitive "IO.serialize"
@@ -15,10 +16,10 @@
primHDeserialize = primitive "IO.deserialize"
hSerialize :: forall a . Handle -> a -> IO ()
-hSerialize (Handle p) = primHSerialize p
+hSerialize h a = withHandleWr h $ \ p -> primHSerialize p a
hDeserialize :: forall a . Handle -> IO a
-hDeserialize (Handle p) = primHDeserialize p
+hDeserialize h = withHandleRd h primHDeserialize
writeSerialized :: forall a . FilePath -> a -> IO ()
writeSerialized p s = do
@@ -31,9 +32,9 @@
writeSerializedCompressed :: forall a . FilePath -> a -> IO ()
writeSerializedCompressed p s = do
- h@(Handle p) <- openBinaryFile p WriteMode
+ h <- openBinaryFile p WriteMode
hPutChar h 'z' -- indicate compressed
- h' <- Handle <$> c_add_lz77_compressor p
+ h' <- addTransducer c_add_lz77_compressor h
hSerialize h' s
hClose h'
@@ -40,11 +41,11 @@
-- Read compressed or uncompressed
readSerialized :: forall a . FilePath -> IO a
readSerialized p = do
- h@(Handle p) <- openBinaryFile p ReadMode
+ h <- openBinaryFile p ReadMode
c <- hLookAhead h
h' <- if c == 'z' then do -- compressed?
hGetChar h -- get rid of the 'z'
- Handle <$> c_add_lz77_decompressor p
+ addTransducer c_add_lz77_decompressor h
else
return h
a <- hDeserialize h'
--- a/lib/System/IO/TimeMilli.hs
+++ b/lib/System/IO/TimeMilli.hs
@@ -1,4 +1,5 @@
module System.IO.TimeMilli(getTimeMilli) where
+import Prelude(); import MiniPrelude
foreign import ccall "GETTIMEMILLI" c_getTimeMilli :: IO Int
--- a/lib/System/IO_Handle.hs
+++ b/lib/System/IO_Handle.hs
@@ -1,6 +1,17 @@
-module System.IO_Handle(BFILE, Handle(..)) where
+module System.IO_Handle(BFILE, Handle(..), HandleState(..)) where
import Prelude()
import Primitives
+import Data.Bool
+import Data.Eq
+import Data.IORef
-data BFILE
-newtype Handle = Handle (Ptr BFILE)
+-- A handle is a ForeignPtr to a C BFILE transducer.
+-- It needs to be a ForeignPtr so it can have a finalizer
+-- that closes the underlying BFILE when the Handle is gc():ed.
+
+data BFILE -- tag used for C pointers to BFILE structs
+
+data Handle = Handle (ForeignPtr BFILE) (IORef HandleState) [Char]
+
+data HandleState = HRead | HWrite | HReadWrite | HSemiClosed | HClosed
+ deriving (Eq)
--- a/lib/System/Process.hs
+++ b/lib/System/Process.hs
@@ -1,5 +1,5 @@
module System.Process(callCommand) where
-import Prelude
+import Prelude(); import MiniPrelude
import Control.Monad(when)
import Foreign.C.String
--- a/lib/Text/ParserCombinators/ReadP.hs
+++ b/lib/Text/ParserCombinators/ReadP.hs
@@ -1,6 +1,12 @@
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE DeriveFunctor #-}
+
-----------------------------------------------------------------------------
-- |
--- Module : Text.ParserCombinators.ReadP
+-- Module : GHC.Internal.Text.ParserCombinators.ReadP
-- Copyright : (c) The University of Glasgow 2002
-- License : BSD-style (see the file libraries/base/LICENSE)
--
@@ -65,20 +71,25 @@
-- $properties
)
where
-
-import Control.Applicative
-import Control.Alternative
+import Prelude()
+import Primitives
+import Control.Applicative hiding (optional, many)
import Control.Error
import Control.Monad
+import Control.Monad.Fail
import Data.Bool
import Data.Char
import Data.Eq
import Data.Function
+import Data.Functor
import Data.Int
-import Data.List
import Data.Num
-import Data.Tuple
+import Data.List
+import Data.List.NonEmpty
+import Data.Monoid.Internal
+default (Int)
+
infixr 5 +++, <++
------------------------------------------------------------------------
@@ -100,34 +111,39 @@
| Look (String -> P a)
| Fail
| Result a (P a)
- | Final [(a,String)]
--- deriving Functor -- ^ @since 4.8.0.0
+ | Final (NonEmpty (a,String))
+-- deriving Functor -- ^ @since base-4.8.0.0
+
instance Functor P where
- fmap f (Get p) = Get (\ c -> fmap f (p c))
+ fmap f (Get g) = Get (fmap f . g)
+ fmap f (Look g) = Look (fmap f . g)
+ fmap _ Fail = Fail
+ fmap f (Result a pa) = Result (f a) (fmap f pa)
+ fmap f (Final xs) = Final (fmap (\ (a, s) -> (f a, s)) xs)
-- Monad, MonadPlus
--- | @since 4.5.0.0
+-- | @since base-4.5.0.0
instance Applicative P where
pure x = Result x Fail
(<*>) = ap
--- | @since 2.01
+-- | @since base-2.01
instance MonadPlus P
--- | @since 2.01
+-- | @since base-2.01
instance Monad P where
(Get f) >>= k = Get (\c -> f c >>= k)
(Look f) >>= k = Look (\s -> f s >>= k)
Fail >>= _ = Fail
(Result x p) >>= k = k x <|> (p >>= k)
- (Final (r:rs)) >>= k = final [ys' | (x,s) <- (r:rs), ys' <- run (k x) s]
+ (Final (r:|rs)) >>= k = final [ys' | (x,s) <- (r:rs), ys' <- run (k x) s]
--- | @since 4.9.0.0
+-- | @since base-4.9.0.0
instance MonadFail P where
fail _ = Fail
--- | @since 4.5.0.0
+-- | @since base-4.5.0.0
instance Alternative P where
empty = Fail
@@ -145,11 +161,15 @@
-- two finals are combined
-- final + look becomes one look and one final (=optimization)
-- final + sthg else becomes one look and one final
- Final r <|> Final t = Final (r ++ t)
- Final (r:rs) <|> Look f = Look (\s -> Final (r:(rs ++ run (f s) s)))
- Final (r:rs) <|> p = Look (\s -> Final (r:(rs ++ run p s)))
- Look f <|> Final r = Look (\s -> Final (run (f s) s ++ r))
- p <|> Final r = Look (\s -> Final (run p s ++ r))
+ Final r <|> Final t = Final (r <> t)
+ Final (r:|rs) <|> Look f = Look (\s -> Final (r:|(rs ++ run (f s) s)))
+ Final (r:|rs) <|> p = Look (\s -> Final (r:|(rs ++ run p s)))
+ Look f <|> Final r = Look (\s -> Final (case run (f s) s of
+ [] -> r
+ (x:xs) -> (x:|xs) <> r))
+ p <|> Final r = Look (\s -> Final (case run p s of
+ [] -> r
+ (x:xs) -> (x:|xs) <> r))
-- two looks are combined (=optimization)
-- look + sthg else floats upwards
@@ -162,44 +182,44 @@
newtype ReadP a = R (forall b . (a -> P b) -> P b)
--- | @since 2.01
+-- | @since base-2.01
instance Functor ReadP where
fmap h (R f) = R (\k -> f (k . h))
--- | @since 4.6.0.0
+-- | @since base-4.6.0.0
instance Applicative ReadP where
pure x = R (\k -> k x)
(<*>) = ap
-- liftA2 = liftM2
--- | @since 2.01
+-- | @since base-2.01
instance Monad ReadP where
- R m >>= f = R (\k -> m (\a -> let { R m' = f a } in m' k))
+ R m >>= f = R (\k -> m (\a -> let R m' = f a in m' k))
--- | @since 4.9.0.0
+-- | @since base-4.9.0.0
instance MonadFail ReadP where
fail _ = R (\_ -> Fail)
--- | @since 4.6.0.0
+-- | @since base-4.6.0.0
instance Alternative ReadP where
empty = pfail
(<|>) = (+++)
--- | @since 2.01
+-- | @since base-2.01
instance MonadPlus ReadP
-- ---------------------------------------------------------------------------
-- Operations over P
-final :: forall a . [(a,String)] -> P a
-final [] = Fail
-final rs = Final rs
+final :: [(a,String)] -> P a
+final [] = Fail
+final (r:rs) = Final (r:|rs)
-run :: forall a . P a -> ReadS a
+run :: P a -> ReadS a
run (Get f) (c:s) = run (f c) s
run (Look f) s = run (f s) s
run (Result x p) s = (x,s) : run p s
-run (Final rs) _ = rs
+run (Final (r:|rs)) _ = (r:rs)
run _ _ = []
-- ---------------------------------------------------------------------------
@@ -215,11 +235,11 @@
-- consuming it.
look = R Look
-pfail :: forall a . ReadP a
+pfail :: ReadP a
-- ^ Always fails.
pfail = R (\_ -> Fail)
-(+++) :: forall a . ReadP a -> ReadP a -> ReadP a
+(+++) :: ReadP a -> ReadP a -> ReadP a
-- ^ Symmetric choice.
R f1 +++ R f2 = R (\k -> f1 k <|> f2 k)
@@ -227,19 +247,21 @@
-- ^ Local, exclusive, left-biased choice: If left parser
-- locally produces any result at all, then right parser is
-- not used.
-R f0 <++ q =
+(<++) (R f0) q =
do s <- look
- probe (f0 return) s (0::Int)
+ probe (f0 return) s 0
where
- probe (Get f) (c:s) n = probe (f c) s (n + (1::Int))
+ probe :: P a -> [Char] -> Int -> ReadP a
+ probe (Get f) (c:s) n = probe (f c) s (n + 1)
probe (Look f) s n = probe (f s) s n
probe p@(Result _ _) _ n = discard n >> R (p >>=)
probe (Final r) _ _ = R (Final r >>=)
probe _ _ _ = q
- discard n = if n == 0::Int then return () else get >> discard (n - (1::Int))
+ discard 0 = return ()
+ discard n = get >> discard (n - 1)
-gather :: forall a . ReadP a -> ReadP (String, a)
+gather :: ReadP a -> ReadP (String, a)
-- ^ Transforms a parser into one that does the same, but
-- in addition returns the exact characters read.
-- IMPORTANT NOTE: 'gather' gives a runtime error if its first argument
@@ -246,13 +268,14 @@
-- is built using any occurrences of readS_to_P.
gather (R m)
= R (\k -> gath id (m (\a -> return (\s -> k (s,a)))))
+
where
- gath :: forall b . (String -> String) -> P (String -> P b) -> P b
+ gath :: (String -> String) -> P (String -> P b) -> P b
gath l (Get f) = Get (\c -> gath (l.(c:)) (f c))
gath _ Fail = Fail
gath l (Look f) = Look (\s -> gath l (f s))
gath l (Result k p) = k (l []) <|> gath l p
- gath _ (Final _) = error "do not use readS_to_P in gather!"
+ gath _ (Final _) = errorWithoutStackTrace "do not use readS_to_P in gather!"
-- ---------------------------------------------------------------------------
-- Derived operations
@@ -300,7 +323,7 @@
if p c then do s <- munch p; return (c:s)
else pfail
-choice :: forall a . [ReadP a] -> ReadP a
+choice :: [ReadP a] -> ReadP a
-- ^ Combines all parsers in the specified list.
choice [] = pfail
choice [p] = p
@@ -315,12 +338,12 @@
skip (c:s) | isSpace c = do _ <- get; skip s
skip _ = return ()
-count :: forall a . Int -> ReadP a -> ReadP [a]
+count :: Int -> ReadP a -> ReadP [a]
-- ^ @count n p@ parses @n@ occurrences of @p@ in sequence. A list of
-- results is returned.
count n p = sequence (replicate n p)
-between :: forall a open close . ReadP open -> ReadP close -> ReadP a -> ReadP a
+between :: ReadP open -> ReadP close -> ReadP a -> ReadP a
-- ^ @between open close p@ parses @open@, followed by @p@ and finally
-- @close@. Only the value of @p@ is returned.
between open close p = do _ <- open
@@ -328,52 +351,52 @@
_ <- close
return x
-option :: forall a . a -> ReadP a -> ReadP a
+option :: a -> ReadP a -> ReadP a
-- ^ @option x p@ will either parse @p@ or return @x@ without consuming
-- any input.
option x p = p +++ return x
-optional :: forall a . ReadP a -> ReadP ()
+optional :: ReadP a -> ReadP ()
-- ^ @optional p@ optionally parses @p@ and always returns @()@.
optional p = (p >> return ()) +++ return ()
-many :: forall a . ReadP a -> ReadP [a]
+many :: ReadP a -> ReadP [a]
-- ^ Parses zero or more occurrences of the given parser.
many p = return [] +++ many1 p
-many1 :: forall a . ReadP a -> ReadP [a]
+many1 :: ReadP a -> ReadP [a]
-- ^ Parses one or more occurrences of the given parser.
many1 p = liftM2 (:) p (many p)
-skipMany :: forall a . ReadP a -> ReadP ()
+skipMany :: ReadP a -> ReadP ()
-- ^ Like 'many', but discards the result.
skipMany p = many p >> return ()
-skipMany1 :: forall a . ReadP a -> ReadP ()
+skipMany1 :: ReadP a -> ReadP ()
-- ^ Like 'many1', but discards the result.
skipMany1 p = p >> skipMany p
-sepBy :: forall a sep . ReadP a -> ReadP sep -> ReadP [a]
+sepBy :: ReadP a -> ReadP sep -> ReadP [a]
-- ^ @sepBy p sep@ parses zero or more occurrences of @p@, separated by @sep@.
-- Returns a list of values returned by @p@.
sepBy p sep = sepBy1 p sep +++ return []
-sepBy1 :: forall a sep . ReadP a -> ReadP sep -> ReadP [a]
+sepBy1 :: ReadP a -> ReadP sep -> ReadP [a]
-- ^ @sepBy1 p sep@ parses one or more occurrences of @p@, separated by @sep@.
-- Returns a list of values returned by @p@.
sepBy1 p sep = liftM2 (:) p (many (sep >> p))
-endBy :: forall a sep . ReadP a -> ReadP sep -> ReadP [a]
+endBy :: ReadP a -> ReadP sep -> ReadP [a]
-- ^ @endBy p sep@ parses zero or more occurrences of @p@, separated and ended
-- by @sep@.
-endBy p sep = many (do { x <- p ; _ <- sep ; return x})
+endBy p sep = many (do x <- p ; _ <- sep ; return x)
-endBy1 :: forall a sep . ReadP a -> ReadP sep -> ReadP [a]
+endBy1 :: ReadP a -> ReadP sep -> ReadP [a]
-- ^ @endBy p sep@ parses one or more occurrences of @p@, separated and ended
-- by @sep@.
-endBy1 p sep = many1 (do { x <- p ; _ <- sep ; return x})
+endBy1 p sep = many1 (do x <- p ; _ <- sep ; return x)
-chainr :: forall a . ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a
+chainr :: ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a
-- ^ @chainr p op x@ parses zero or more occurrences of @p@, separated by @op@.
-- Returns a value produced by a /right/ associative application of all
-- functions returned by @op@. If there are no occurrences of @p@, @x@ is
@@ -380,7 +403,7 @@
-- returned.
chainr p op x = chainr1 p op +++ return x
-chainl :: forall a . ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a
+chainl :: ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a
-- ^ @chainl p op x@ parses zero or more occurrences of @p@, separated by @op@.
-- Returns a value produced by a /left/ associative application of all
-- functions returned by @op@. If there are no occurrences of @p@, @x@ is
@@ -387,7 +410,7 @@
-- returned.
chainl p op x = chainl1 p op +++ return x
-chainr1 :: forall a . ReadP a -> ReadP (a -> a -> a) -> ReadP a
+chainr1 :: ReadP a -> ReadP (a -> a -> a) -> ReadP a
-- ^ Like 'chainr', but parses one or more occurrences of @p@.
chainr1 p op = scan
where scan = p >>= rest
@@ -396,7 +419,7 @@
return (f x y)
+++ return x
-chainl1 :: forall a . ReadP a -> ReadP (a -> a -> a) -> ReadP a
+chainl1 :: ReadP a -> ReadP (a -> a -> a) -> ReadP a
-- ^ Like 'chainl', but parses one or more occurrences of @p@.
chainl1 p op = p >>= rest
where rest x = do f <- op
@@ -404,7 +427,7 @@
rest (f x y)
+++ return x
-manyTill :: forall a end . ReadP a -> ReadP end -> ReadP [a]
+manyTill :: ReadP a -> ReadP end -> ReadP [a]
-- ^ @manyTill p end@ parses zero or more occurrences of @p@, until @end@
-- succeeds. Returns a list of values returned by @p@.
manyTill p end = scan
@@ -413,7 +436,7 @@
-- ---------------------------------------------------------------------------
-- Converting between ReadP and Read
-readP_to_S :: forall a . ReadP a -> ReadS a
+readP_to_S :: ReadP a -> ReadS a
-- ^ Converts a parser into a Haskell ReadS-style function.
-- This is the main way in which you can \"run\" a 'ReadP' parser:
-- the expanded type is
@@ -420,9 +443,10 @@
-- @ readP_to_S :: ReadP a -> String -> [(a,String)] @
readP_to_S (R f) = run (f return)
-readS_to_P :: forall a . ReadS a -> ReadP a
+readS_to_P :: ReadS a -> ReadP a
-- ^ Converts a Haskell ReadS-style function into a parser.
-- Warning: This introduces local backtracking in the resulting
-- parser, and therefore a possible inefficiency.
readS_to_P r =
R (\k -> Look (\s -> final [bs'' | (a,s') <- r s, bs'' <- run (k a) s']))
+
--- a/lib/Text/ParserCombinators/ReadPrec.hs
+++ b/lib/Text/ParserCombinators/ReadPrec.hs
@@ -1,6 +1,9 @@
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
-----------------------------------------------------------------------------
-- |
--- Module : Text.ParserCombinators.ReadPrec
+-- Module : GHC.Internal.Text.ParserCombinators.ReadPrec
-- Copyright : (c) The University of Glasgow 2002
-- License : BSD-style (see the file libraries/base/LICENSE)
--
@@ -42,31 +45,20 @@
readS_to_Prec,
)
where
-
-
-import Text.ParserCombinators.ReadP
- ( ReadP
- , ReadS
- , readP_to_S
- , readS_to_P
- )
-
-import qualified Text.ParserCombinators.ReadP as ReadP
- ( get
- , look
- , (+++), (<++)
- , pfail
- )
-
+import Prelude()
import Control.Applicative
-import Control.Alternative
import Control.Monad
+import Control.Monad.Fail
import Data.Char
import Data.Int
-import Data.List
import Data.Num
+import Data.List
import Data.Ord
+import Text.ParserCombinators.ReadP(ReadP, ReadS, readP_to_S, readS_to_P)
+import qualified Text.ParserCombinators.ReadP as ReadP(get, look, (+++), (<++), pfail)
+default (Int)
+
-- ---------------------------------------------------------------------------
-- The readPrec type
@@ -74,28 +66,22 @@
-- Functor, Monad, MonadPlus
--- | @since 2.01
instance Functor ReadPrec where
fmap h (P f) = P (\n -> fmap h (f n))
--- | @since 4.6.0.0
instance Applicative ReadPrec where
pure x = P (\_ -> pure x)
(<*>) = ap
liftA2 = liftM2
--- | @since 2.01
instance Monad ReadPrec where
- P f >>= k = P (\n -> do {a <- f n; let {P f' = k a}; f' n})
+ P f >>= k = P (\n -> do a <- f n; let {P f' = k a}; f' n)
--- | @since 4.9.0.0
instance MonadFail ReadPrec where
fail s = P (\_ -> fail s)
--- | @since 2.01
instance MonadPlus ReadPrec
--- | @since 4.6.0.0
instance Alternative ReadPrec where
empty = pfail
(<|>) = (+++)
@@ -109,19 +95,19 @@
-- ---------------------------------------------------------------------------
-- Operations over ReadPrec
-lift :: forall a . ReadP a -> ReadPrec a
+lift :: ReadP a -> ReadPrec a
-- ^ Lift a precedence-insensitive 'ReadP' to a 'ReadPrec'.
lift m = P (\_ -> m)
-step :: forall a . ReadPrec a -> ReadPrec a
+step :: ReadPrec a -> ReadPrec a
-- ^ Increases the precedence context by one.
step (P f) = P (\n -> f (n+1))
-reset :: forall a . ReadPrec a -> ReadPrec a
+reset :: ReadPrec a -> ReadPrec a
-- ^ Resets the precedence context to zero.
reset (P f) = P (\_ -> f minPrec)
-prec :: forall a . Prec -> ReadPrec a -> ReadPrec a
+prec :: Prec -> ReadPrec a -> ReadPrec a
-- ^ @(prec n p)@ checks whether the precedence context is
-- less than or equal to @n@, and
--
@@ -143,21 +129,21 @@
-- consuming it.
look = lift ReadP.look
-(+++) :: forall a . ReadPrec a -> ReadPrec a -> ReadPrec a
+(+++) :: ReadPrec a -> ReadPrec a -> ReadPrec a
-- ^ Symmetric choice.
P f1 +++ P f2 = P (\n -> f1 n ReadP.+++ f2 n)
-(<++) :: forall a . ReadPrec a -> ReadPrec a -> ReadPrec a
+(<++) :: ReadPrec a -> ReadPrec a -> ReadPrec a
-- ^ Local, exclusive, left-biased choice: If left parser
-- locally produces any result at all, then right parser is
-- not used.
P f1 <++ P f2 = P (\n -> f1 n ReadP.<++ f2 n)
-pfail :: forall a . ReadPrec a
+pfail :: ReadPrec a
-- ^ Always fails.
pfail = lift ReadP.pfail
-choice :: forall a . [ReadPrec a] -> ReadPrec a
+choice :: [ReadPrec a] -> ReadPrec a
-- ^ Combines all parsers in the specified list.
choice ps = foldr (+++) pfail ps
@@ -164,14 +150,14 @@
-- ---------------------------------------------------------------------------
-- Converting between ReadPrec and Read
-readPrec_to_P :: forall a . ReadPrec a -> (Int -> ReadP a)
+readPrec_to_P :: ReadPrec a -> (Int -> ReadP a)
readPrec_to_P (P f) = f
-readP_to_Prec :: forall a . (Int -> ReadP a) -> ReadPrec a
+readP_to_Prec :: (Int -> ReadP a) -> ReadPrec a
readP_to_Prec f = P f
-readPrec_to_S :: forall a . ReadPrec a -> (Int -> ReadS a)
+readPrec_to_S :: ReadPrec a -> (Int -> ReadS a)
readPrec_to_S (P f) n = readP_to_S (f n)
-readS_to_Prec :: forall a . (Int -> ReadS a) -> ReadPrec a
+readS_to_Prec :: (Int -> ReadS a) -> ReadPrec a
readS_to_Prec f = P (\n -> readS_to_P (f n))
--- a/lib/Text/Printf.hs
+++ b/lib/Text/Printf.hs
@@ -96,7 +96,7 @@
import Data.Int
import Data.List (stripPrefix)
import Data.Word
-import Numeric
+import Numeric.Show
import Numeric.FormatFloat(showEFloat, showFFloat, showGFloat, showFFloatAlt, showGFloatAlt)
import Numeric.Natural
import System.IO
--- a/lib/Text/Read.hs
+++ b/lib/Text/Read.hs
@@ -1,132 +1,113 @@
--- Copyright 2023,2024 Lennart Augustsson
--- See LICENSE file for full license.
--- Temporary Read class
-module Text.Read(
- ReadS,
- Read(..),
- read,
- reads,
- readMaybe,
- readParen,
- lex,
- ) where
-import Prelude() -- do not import Prelude
-import Primitives
+{-# LANGUAGE Safe #-}
+
+-- |
+--
+-- Module : Text.Read
+-- Copyright : (c) The University of Glasgow 2001
+-- License : BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : provisional
+-- Portability : non-portable (uses Text.ParserCombinators.ReadP)
+--
+-- Converting strings to values.
+--
+-- The "Text.Read" module is the canonical place to import for
+-- 'Read'-class facilities. For GHC only, it offers an extended and much
+-- improved 'Read' class, which constitutes a proposed alternative to the
+-- Haskell 2010 'Read'. In particular, writing parsers is easier, and
+-- the parsers are much more efficient.
+--
+
+module Text.Read
+ (-- * The 'Read' class
+ Read(..),
+ ReadS,
+ -- * Haskell 2010 functions
+ reads,
+ read,
+ readParen,
+ lex,
+ -- * New parsing functions
+ module Text.ParserCombinators.ReadPrec,
+ Lexeme(..),
+ lexP,
+ parens,
+ readListDefault,
+ readListPrecDefault,
+ readEither,
+ readMaybe
+ ) where
+import Prelude()
import Control.Error
-import Data.Char
+import Control.Monad
import Data.Bool
+import Data.Char
import Data.Either
import Data.Eq
import Data.Function
-import Data.Int
import Data.List
-import Data.Maybe_Type
-import Data.Num
-import Data.Ord
+import Data.Maybe
import Data.String
-import Text.Read.Numeric
-import Text.Read.Lex
+import Text.Read.Internal
+import Text.Read.Lex(Lexeme(..))
+import Text.ParserCombinators.ReadPrec
+import qualified Text.ParserCombinators.ReadP as P
-type ReadS a = String -> [(a, String)]
+------------------------------------------------------------------------
+-- utility functions
-class Read a where
- readsPrec :: Int -> ReadS a
- readList :: ReadS [a]
+-- | equivalent to 'readsPrec' with a precedence of 0.
+reads :: Read a => ReadS a
+reads = readsPrec minPrec
- readList = readParen False (\r -> [ pr
- | ("[",s) <- lex r
- , pr <- readl s])
- where readl s = [([],t) | ("]",t) <- lex s] ++
- [(x:xs,u) | (x,t) <- reads s,
- (xs,u) <- readl' t]
- readl' s = [([],t) | ("]",t) <- lex s] ++
- [(x:xs,v) | (",",t) <- lex s,
- (x,u) <- reads t,
- (xs,v) <- readl' u]
+-- | Parse a string using the 'Read' instance.
+-- Succeeds if there is exactly one valid result.
+-- A 'Left' value indicates a parse error.
+--
+-- >>> readEither "123" :: Either String Int
+-- Right 123
+--
+-- >>> readEither "hello" :: Either String Int
+-- Left "Prelude.read: no parse"
+--
+-- @since base-4.6.0.0
+readEither :: Read a => String -> Either String a
+readEither s =
+ case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of
+ [x] -> Right x
+ [] -> Left "Prelude.read: no parse"
+ _ -> Left "Prelude.read: ambiguous parse"
+ where
+ read' =
+ do x <- readPrec
+ lift P.skipSpaces
+ return x
-reads :: forall a . Read a => ReadS a
-reads = readsPrec 0
+-- | Parse a string using the 'Read' instance.
+-- Succeeds if there is exactly one valid result.
+--
+-- >>> readMaybe "123" :: Maybe Int
+-- Just 123
+--
+-- >>> readMaybe "hello" :: Maybe Int
+-- Nothing
+--
+-- @since base-4.6.0.0
+readMaybe :: Read a => String -> Maybe a
+readMaybe s = case readEither s of
+ Left _ -> Nothing
+ Right a -> Just a
-read :: forall a . Read a => String -> a
-read s =
- case readMaybe s of
- Just a -> a
- Nothing -> error "read: failed"
-
-readMaybe :: forall a . Read a => String -> Maybe a
-readMaybe s =
- case readsPrec 0 s of
- [(a, ss)] | [] <- dropSpace ss -> Just a
- _ -> Nothing
-
--------------------------------------------------------
--- To avoid circular imports, some instances go here.
-
-instance Read Int where
- readsPrec = readIntegral
-
-instance forall a . Read a => Read [a] where
- readsPrec _ = readList
-
-instance Read Bool where
- readsPrec _ = readBoundedEnum
-
-instance Read Ordering where
- readsPrec _ = readBoundedEnum
-
-instance forall a . Read a => Read (Maybe a) where
- readsPrec p u = [ (Nothing :: Maybe a, t) | ("Nothing", t) <- lex u ] ++
- readParen (p > 10) ( \ r ->
- [ (Just a, t) | ("Just", s) <- lex r, (a, t) <- readsPrec 11 s ]
- ) u
-
-instance forall a b . (Read a, Read b) => Read (Either a b) where
- readsPrec p = readParen (p > 10) $ \ r ->
- [ (Left a, t) | ("Left", s) <- lex r, (a, t) <- readsPrec 11 s ] ++
- [ (Right b, t) | ("Right", s) <- lex r, (b, t) <- readsPrec 11 s ]
-
-instance Read () where
- readsPrec p = readParen False $
- \ r -> [((),t) | ("(",s) <- lex r,
- (")",t) <- lex s ]
-
-instance forall a b . (Read a, Read b) => Read (a,b) where
- readsPrec p = readParen True $
- \ r -> [((a, b), u) | (a, s) <- reads r,
- (",", t) <- lex s,
- (b, u) <- reads t ]
-
-instance Read Char where
- readsPrec p = readParen False $
- \ r -> [(c,t) | ('\'':s,t)<- lex r,
- (c,"\'") <- readLitChar s]
-
- readList = readParen False $ \ r -> [(l,t) | ('"':s, t) <- lex r,
- (l,_) <- readl s ]
- where readl ('"':s) = [("",s)]
- readl ('\\':'&':s) = readl s
- readl s = [(c:cs,u) | (c ,t) <- readLitChar s,
- (cs,u) <- readl t ]
-
-readLitChar :: ReadS Char
-readLitChar ('\\':s) = readEsc s
-readLitChar (c:s) = [(c, s)]
-
-readEsc :: ReadS Char
-readEsc ('a':s) = [('\a',s)]
-readEsc ('b':s) = [('\b',s)]
-readEsc ('f':s) = [('\f',s)]
-readEsc ('n':s) = [('\n',s)]
-readEsc ('r':s) = [('\r',s)]
-readEsc ('t':s) = [('\t',s)]
-readEsc ('v':s) = [('\v',s)]
-readEsc ('\\':s) = [('\\',s)]
-readEsc ('"':s) = [('"',s)]
-readEsc ('\'':s) = [('\'',s)]
-readEsc ('^':c:s) | c >= '@' && c <= '_'
- = [(chr (ord c - ord '@'), s)]
-readEsc s@(d:_) | isDigit d
- = [(chr n, t) | (n,t) <- readDec s]
-readEsc ('o':s) = [(chr n, t) | (n,t) <- readOct s]
-readEsc ('x':s) = [(chr n, t) | (n,t) <- readHex s]
-readEsc _ = []
+-- | The 'read' function reads input from a string, which must be
+-- completely consumed by the input process. 'read' fails with an 'error' if the
+-- parse is unsuccessful, and it is therefore discouraged from being used in
+-- real applications. Use 'readMaybe' or 'readEither' for safe alternatives.
+--
+-- >>> read "123" :: Int
+-- 123
+--
+-- >>> read "hello" :: Int
+-- *** Exception: Prelude.read: no parse
+read :: Read a => String -> a
+read s = either errorWithoutStackTrace id (readEither s)
--- /dev/null
+++ b/lib/Text/Read/Internal.hs
@@ -1,0 +1,800 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : GHC.Internal.Read
+-- Copyright : (c) The University of Glasgow, 1994-2002
+-- License : see libraries/base/LICENSE
+--
+-- Maintainer : ghc-devs@haskell.org
+-- Stability : internal
+-- Portability : non-portable (GHC Extensions)
+--
+-- The 'Read' class and instances for basic data types.
+--
+-----------------------------------------------------------------------------
+
+module Text.Read.Internal
+ ( Read(..) -- class
+
+ -- ReadS type
+ , ReadS
+ , ReadPrec
+
+ -- H2010 compatibility
+ , lex
+ , lexLitChar
+ , readLitChar
+ , lexDigits
+
+ -- defining readers
+ , lexP, expectP
+ , paren
+ , parens
+ , list
+ , choose
+ , readListDefault, readListPrecDefault
+ , readNumber
+ , readField
+ , readFieldHash
+ , readSymField
+
+ -- Temporary
+ , readParen
+ )
+ where
+import Prelude()
+
+import Control.Applicative
+import Control.Error
+import Control.Monad
+import Control.Monad.Fail
+import Data.Array
+import Data.Bool
+import Data.Char
+import Data.Double
+import Data.Either
+import Data.Eq
+import Data.Float
+import Data.Floating
+import Data.Fractional
+import Data.Function
+import Data.Maybe
+import Data.Int
+import Data.Integer
+import Data.Integral
+import Data.Ix
+import Data.List
+import Data.Num
+import Data.Ord
+import Data.Ratio
+import Data.Real
+import Data.RealFloat
+import Data.String
+import Data.Tuple
+import Data.Word
+import Numeric.Natural
+import qualified Text.ParserCombinators.ReadP as P
+import Text.ParserCombinators.ReadP(ReadS, readP_to_S)
+import Text.ParserCombinators.ReadPrec
+import qualified Text.Read.Lex as L
+import Text.Show(appPrec)
+
+ratioPrec :: Int
+ratioPrec = 7
+
+-- | @'readParen' 'True' p@ parses what @p@ parses, but surrounded with
+-- parentheses.
+--
+-- @'readParen' 'False' p@ parses what @p@ parses, but optionally
+-- surrounded with parentheses.
+readParen :: Bool -> ReadS a -> ReadS a
+-- A Haskell 2010 function
+readParen b g = if b then mandatory else optional
+ where optional r = g r ++ mandatory r
+ mandatory r = do
+ ("(",s) <- lex r
+ (x,t) <- optional s
+ (")",u) <- lex t
+ return (x,u)
+
+-- | Parsing of 'String's, producing values.
+--
+-- Derived instances of 'Read' make the following assumptions, which
+-- derived instances of 'Text.Show.Show' obey:
+--
+-- * If the constructor is defined to be an infix operator, then the
+-- derived 'Read' instance will parse only infix applications of
+-- the constructor (not the prefix form).
+--
+-- * Associativity is not used to reduce the occurrence of parentheses,
+-- although precedence may be.
+--
+-- * If the constructor is defined using record syntax, the derived 'Read'
+-- will parse only the record-syntax form, and furthermore, the fields
+-- must be given in the same order as the original declaration.
+--
+-- * The derived 'Read' instance allows arbitrary Haskell whitespace
+-- between tokens of the input string. Extra parentheses are also
+-- allowed.
+--
+-- For example, given the declarations
+--
+-- > infixr 5 :^:
+-- > data Tree a = Leaf a | Tree a :^: Tree a
+--
+-- the derived instance of 'Read' in Haskell 2010 is equivalent to
+--
+-- > instance (Read a) => Read (Tree a) where
+-- >
+-- > readsPrec d r = readParen (d > app_prec)
+-- > (\r -> [(Leaf m,t) |
+-- > ("Leaf",s) <- lex r,
+-- > (m,t) <- readsPrec (app_prec+1) s]) r
+-- >
+-- > ++ readParen (d > up_prec)
+-- > (\r -> [(u:^:v,w) |
+-- > (u,s) <- readsPrec (up_prec+1) r,
+-- > (":^:",t) <- lex s,
+-- > (v,w) <- readsPrec (up_prec+1) t]) r
+-- >
+-- > where app_prec = 10
+-- > up_prec = 5
+--
+-- Note that right-associativity of @:^:@ is unused.
+--
+-- The derived instance in GHC is equivalent to
+--
+-- > instance (Read a) => Read (Tree a) where
+-- >
+-- > readPrec = parens $ (prec app_prec $ do
+-- > Ident "Leaf" <- lexP
+-- > m <- step readPrec
+-- > return (Leaf m))
+-- >
+-- > +++ (prec up_prec $ do
+-- > u <- step readPrec
+-- > Symbol ":^:" <- lexP
+-- > v <- step readPrec
+-- > return (u :^: v))
+-- >
+-- > where app_prec = 10
+-- > up_prec = 5
+-- >
+-- > readListPrec = readListPrecDefault
+--
+-- Why do both 'readsPrec' and 'readPrec' exist, and why does GHC opt to
+-- implement 'readPrec' in derived 'Read' instances instead of 'readsPrec'?
+-- The reason is that 'readsPrec' is based on the 'ReadS' type, and although
+-- 'ReadS' is mentioned in the Haskell 2010 Report, it is not a very efficient
+-- parser data structure.
+--
+-- 'readPrec', on the other hand, is based on a much more efficient 'ReadPrec'
+-- datatype (a.k.a \"new-style parsers\"), but its definition relies on the use
+-- of the @RankNTypes@ language extension. Therefore, 'readPrec' (and its
+-- cousin, 'readListPrec') are marked as GHC-only. Nevertheless, it is
+-- recommended to use 'readPrec' instead of 'readsPrec' whenever possible
+-- for the efficiency improvements it brings.
+--
+-- As mentioned above, derived 'Read' instances in GHC will implement
+-- 'readPrec' instead of 'readsPrec'. The default implementations of
+-- 'readsPrec' (and its cousin, 'readList') will simply use 'readPrec' under
+-- the hood. If you are writing a 'Read' instance by hand, it is recommended
+-- to write it like so:
+--
+-- @
+-- instance 'Read' T where
+-- 'readPrec' = ...
+-- 'readListPrec' = 'readListPrecDefault'
+-- @
+
+class Read a where
+ {-# MINIMAL readsPrec | readPrec #-}
+
+ -- | attempts to parse a value from the front of the string, returning
+ -- a list of (parsed value, remaining string) pairs. If there is no
+ -- successful parse, the returned list is empty.
+ --
+ -- Derived instances of 'Read' and 'Text.Show.Show' satisfy the following:
+ --
+ -- * @(x,\"\")@ is an element of
+ -- @('readsPrec' d ('GHC.Internal.Text.Show.showsPrec' d x \"\"))@.
+ --
+ -- That is, 'readsPrec' parses the string produced by
+ -- 'GHC.Internal.Text.Show.showsPrec', and delivers the value that
+ -- 'GHC.Internal.Text.Show.showsPrec' started with.
+
+ readsPrec :: Int -- ^ the operator precedence of the enclosing
+ -- context (a number from @0@ to @11@).
+ -- Function application has precedence @10@.
+ -> ReadS a
+
+ -- | The method 'readList' is provided to allow the programmer to
+ -- give a specialised way of parsing lists of values.
+ -- For example, this is used by the predefined 'Read' instance of
+ -- the 'Char' type, where values of type 'String' are expected to
+ -- use double quotes, rather than square brackets.
+ readList :: ReadS [a]
+
+ -- | Proposed replacement for 'readsPrec' using new-style parsers (GHC only).
+ readPrec :: ReadPrec a
+
+ -- | Proposed replacement for 'readList' using new-style parsers (GHC only).
+ -- The default definition uses 'readList'. Instances that define 'readPrec'
+ -- should also define 'readListPrec' as 'readListPrecDefault'.
+ readListPrec :: ReadPrec [a]
+
+ -- default definitions
+ readsPrec = readPrec_to_S readPrec
+ readList = readPrec_to_S (list readPrec) 0
+ readPrec = readS_to_Prec readsPrec
+ readListPrec = readS_to_Prec (\_ -> readList)
+
+readListDefault :: Read a => ReadS [a]
+-- ^ A possible replacement definition for the 'readList' method (GHC only).
+-- This is only needed for GHC, and even then only for 'Read' instances
+-- where 'readListPrec' isn't defined as 'readListPrecDefault'.
+readListDefault = readPrec_to_S readListPrec 0
+
+readListPrecDefault :: Read a => ReadPrec [a]
+-- ^ A possible replacement definition for the 'readListPrec' method,
+-- defined using 'readPrec' (GHC only).
+readListPrecDefault = list readPrec
+
+------------------------------------------------------------------------
+-- H2010 compatibility
+
+-- | The 'lex' function reads a single lexeme from the input, discarding
+-- initial white space, and returning the characters that constitute the
+-- lexeme. If the input string contains only white space, 'lex' returns a
+-- single successful \`lexeme\' consisting of the empty string. (Thus
+-- @'lex' \"\" = [(\"\",\"\")]@.) If there is no legal lexeme at the
+-- beginning of the input string, 'lex' fails (i.e. returns @[]@).
+--
+-- This lexer is not completely faithful to the Haskell lexical syntax
+-- in the following respects:
+--
+-- * Qualified names are not handled properly
+--
+-- * Octal and hexadecimal numerics are not recognized as a single token
+--
+-- * Comments are not treated properly
+lex :: ReadS String -- As defined by H2010
+lex s = readP_to_S L.hsLex s
+
+-- | Read a string representation of a character, using Haskell
+-- source-language escape conventions. For example:
+--
+-- > lexLitChar "\\nHello" = [("\\n", "Hello")]
+--
+lexLitChar :: ReadS String -- As defined by H2010
+lexLitChar = readP_to_S (do { (s, _) <- P.gather L.lexChar ;
+ let { s' = removeNulls s } ;
+ return s' })
+ where
+ -- remove nulls from end of the character if they exist
+ removeNulls [] = []
+ removeNulls ('\\':'&':xs) = removeNulls xs
+ removeNulls (first:rest) = first : removeNulls rest
+ -- There was a skipSpaces before the P.gather L.lexChar,
+ -- but that seems inconsistent with readLitChar
+
+-- | Read a string representation of a character, using Haskell
+-- source-language escape conventions, and convert it to the character
+-- that it encodes. For example:
+--
+-- > readLitChar "\\nHello" = [('\n', "Hello")]
+--
+readLitChar :: ReadS Char -- As defined by H2010
+readLitChar = readP_to_S L.lexChar
+
+-- | Reads a non-empty string of decimal digits.
+lexDigits :: ReadS String
+lexDigits = readP_to_S (P.munch1 isDigit)
+
+------------------------------------------------------------------------
+-- utility parsers
+
+lexP :: ReadPrec L.Lexeme
+-- ^ Parse a single lexeme
+lexP = lift L.lex
+
+expectP :: L.Lexeme -> ReadPrec ()
+expectP lexeme = lift (L.expect lexeme)
+
+expectCharP :: Char -> ReadPrec a -> ReadPrec a
+expectCharP c a = do
+ q <- get
+ if q == c
+ then a
+ else pfail
+{-# INLINE expectCharP #-}
+
+skipSpacesThenP :: ReadPrec a -> ReadPrec a
+skipSpacesThenP m =
+ do s <- look
+ skip s
+ where
+ skip (c:s) | isSpace c = get *> skip s
+ skip _ = m
+
+paren :: ReadPrec a -> ReadPrec a
+-- ^ @(paren p)@ parses \"(P0)\"
+-- where @p@ parses \"P0\" in precedence context zero
+paren p = skipSpacesThenP (paren' p)
+
+paren' :: ReadPrec a -> ReadPrec a
+paren' p = expectCharP '(' $ reset p >>= \x ->
+ skipSpacesThenP (expectCharP ')' (pure x))
+
+parens :: ReadPrec a -> ReadPrec a
+-- ^ @(parens p)@ parses \"P\", \"(P0)\", \"((P0))\", etc,
+-- where @p@ parses \"P\" in the current precedence context
+-- and parses \"P0\" in precedence context zero
+parens p = optional
+ where
+ optional = skipSpacesThenP (p +++ mandatory)
+ mandatory = paren' optional
+
+list :: ReadPrec a -> ReadPrec [a]
+-- ^ @(list p)@ parses a list of things parsed by @p@,
+-- using the usual square-bracket syntax.
+list readx =
+ parens
+ ( do expectP (L.Punc "[")
+ (listRest False +++ listNext)
+ )
+ where
+ listRest started =
+ do L.Punc c <- lexP
+ case c of
+ "]" -> return []
+ "," | started -> listNext
+ _ -> pfail
+
+ listNext =
+ do x <- reset readx
+ xs <- listRest True
+ return (x:xs)
+
+choose :: [(String, ReadPrec a)] -> ReadPrec a
+-- ^ Parse the specified lexeme and continue as specified.
+-- Esp useful for nullary constructors; e.g.
+-- @choose [(\"A\", return A), (\"B\", return B)]@
+-- We match both Ident and Symbol because the constructor
+-- might be an operator eg @(:~:)@
+choose sps = foldr ((+++) . try_one) pfail sps
+ where
+ try_one (s,p) = do { token <- lexP ;
+ case token of
+ L.Ident s' | s==s' -> p
+ L.Symbol s' | s==s' -> p
+ _other -> pfail }
+
+-- See Note [Why readField]
+
+-- | 'Read' parser for a record field, of the form @fieldName=value@. The
+-- @fieldName@ must be an alphanumeric identifier; for symbols (operator-style)
+-- field names, e.g. @(#)@, use 'readSymField'). The second argument is a
+-- parser for the field value.
+readField :: String -> ReadPrec a -> ReadPrec a
+readField fieldName readVal = do
+ expectP (L.Ident fieldName)
+ expectP (L.Punc "=")
+ readVal
+{-# NOINLINE readField #-}
+
+-- See Note [Why readField]
+
+-- | 'Read' parser for a record field, of the form @fieldName#=value@. That is,
+-- an alphanumeric identifier @fieldName@ followed by the symbol @#@. The
+-- second argument is a parser for the field value.
+--
+-- Note that 'readField' does not suffice for this purpose due to
+-- <https://gitlab.haskell.org/ghc/ghc/issues/5041 #5041>.
+readFieldHash :: String -> ReadPrec a -> ReadPrec a
+readFieldHash fieldName readVal = do
+ expectP (L.Ident fieldName)
+ expectP (L.Symbol "#")
+ expectP (L.Punc "=")
+ readVal
+{-# NOINLINE readFieldHash #-}
+
+-- See Note [Why readField]
+
+-- | 'Read' parser for a symbol record field, of the form @(###)=value@ (where
+-- @###@ is the field name). The field name must be a symbol (operator-style),
+-- e.g. @(#)@. For regular (alphanumeric) field names, use 'readField'. The
+-- second argument is a parser for the field value.
+readSymField :: String -> ReadPrec a -> ReadPrec a
+readSymField fieldName readVal = do
+ expectP (L.Punc "(")
+ expectP (L.Symbol fieldName)
+ expectP (L.Punc ")")
+ expectP (L.Punc "=")
+ readVal
+{-# NOINLINE readSymField #-}
+
+
+-- Note [Why readField]
+-- ~~~~~~~~~~~~~~~~~~~~
+-- Previously, the code for automatically deriving Read instance (in
+-- typecheck/GHC.Tc.Deriv.Generate.hs) would generate inline code for parsing fields;
+-- this, however, turned out to produce massive amounts of intermediate code,
+-- and produced a considerable performance hit in the code generator.
+-- Since Read instances are not generally supposed to be performance critical,
+-- the readField and readSymField functions have been factored out, and the
+-- code generator now just generates calls rather than manually inlining the
+-- parsers. For large record types (e.g. 500 fields), this produces a
+-- significant performance boost.
+--
+-- See also #14364.
+
+
+--------------------------------------------------------------
+-- Simple instances of Read
+--------------------------------------------------------------
+
+-- | @since base-2.01
+instance Read Char where
+ readPrec =
+ parens
+ ( do L.Char c <- lexP
+ return c
+ )
+
+ readListPrec =
+ parens
+ ( do L.String s <- lexP -- Looks for "foo"
+ return s
+ +++
+ readListPrecDefault -- Looks for ['f','o','o']
+ ) -- (more generous than H2010 spec)
+
+ readList = readListDefault
+
+-- | @since base-2.01
+instance Read Bool where
+ readPrec =
+ parens
+ ( do L.Ident s <- lexP
+ case s of
+ "True" -> return True
+ "False" -> return False
+ _ -> pfail
+ )
+
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance Read Ordering where
+ readPrec =
+ parens
+ ( do L.Ident s <- lexP
+ case s of
+ "LT" -> return LT
+ "EQ" -> return EQ
+ "GT" -> return GT
+ _ -> pfail
+ )
+
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-4.11.0.0
+-- deriving instance Read a => Read (NonEmpty a)
+-- XXX
+
+--------------------------------------------------------------
+-- Structure instances of Read: Maybe, List etc
+--------------------------------------------------------------
+
+{-
+For structured instances of Read we start using the precedences. The
+idea is then that 'parens (prec k p)' will fail immediately when trying
+to parse it in a context with a higher precedence level than k. But if
+there is one parenthesis parsed, then the required precedence level
+drops to 0 again, and parsing inside p may succeed.
+
+'appPrec' is just the precedence level of function application. So,
+if we are parsing function application, we'd better require the
+precedence level to be at least 'appPrec'. Otherwise, we have to put
+parentheses around it.
+
+'step' is used to increase the precedence levels inside a
+parser, and can be used to express left- or right- associativity. For
+example, % is defined to be left associative, so we only increase
+precedence on the right hand side.
+
+Note how step is used in for example the Maybe parser to increase the
+precedence beyond appPrec, so that basically only literals and
+parenthesis-like objects such as (...) and [...] can be an argument to
+'Just'.
+-}
+
+-- | @since base-2.01
+instance Read a => Read (Maybe a) where
+ readPrec =
+ parens
+ (do expectP (L.Ident "Nothing")
+ return Nothing
+ +++
+ prec appPrec (
+ do expectP (L.Ident "Just")
+ x <- step readPrec
+ return (Just x))
+ )
+
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+instance (Read a, Read b) => Read (Either a b) where
+ readPrec =
+ parens
+ (prec appPrec (
+ do expectP (L.Ident "Left")
+ x <- step readPrec
+ return (Left x))
+ +++
+ prec appPrec (
+ do expectP (L.Ident "Right")
+ x <- step readPrec
+ return (Right x))
+ )
+
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance Read a => Read [a] where
+ {-# SPECIALISE instance Read [String] #-}
+ {-# SPECIALISE instance Read [Char] #-}
+ {-# SPECIALISE instance Read [Int] #-}
+ readPrec = readListPrec
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance (Ix a, Read a, Read b) => Read (Array a b) where
+ readPrec = parens $ prec appPrec $
+ do expectP (L.Ident "array")
+ theBounds <- step readPrec
+ vals <- step readPrec
+ return (array theBounds vals)
+
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance Read L.Lexeme where
+ readPrec = lexP
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+--------------------------------------------------------------
+-- GHC.Internal.Numeric instances of Read
+--------------------------------------------------------------
+
+readNumber :: Num a => (L.Lexeme -> ReadPrec a) -> ReadPrec a
+-- Read a signed number
+readNumber convert =
+ parens
+ ( do x <- lexP
+ case x of
+ L.Symbol "-" -> do y <- lexP
+ n <- convert y
+ return (negate n)
+
+ _ -> convert x
+ )
+
+
+convertInt :: Num a => L.Lexeme -> ReadPrec a
+convertInt (L.Number n)
+ | Just i <- L.numberToInteger n = return (fromInteger i)
+convertInt _ = pfail
+
+convertFrac :: forall a . RealFloat a => L.Lexeme -> ReadPrec a
+convertFrac (L.Ident "NaN") = return (0 / 0)
+convertFrac (L.Ident "Infinity") = return (1 / 0)
+convertFrac (L.Number n) = let resRange = floatRange (undefined :: a)
+ in case L.numberToRangedRational resRange n of
+ Nothing -> return (1 / 0)
+ Just rat -> return $ fromRational rat
+convertFrac _ = pfail
+
+-- | @since base-2.01
+instance Read Int where
+ readPrec = readNumber convertInt
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-4.5.0.0
+instance Read Word where
+ readsPrec p s = [(fromInteger x, r) | (x, r) <- readsPrec p s]
+
+-- | @since base-2.01
+instance Read Word8 where
+ readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s]
+
+-- | @since base-2.01
+instance Read Word16 where
+ readsPrec p s = [(fromIntegral (x::Int), r) | (x, r) <- readsPrec p s]
+
+-- | @since base-2.01
+instance Read Word32 where
+ readsPrec p s = [(fromInteger x, r) | (x, r) <- readsPrec p s]
+
+-- | @since base-2.01
+instance Read Word64 where
+ readsPrec p s = [(fromInteger x, r) | (x, r) <- readsPrec p s]
+
+-- | @since base-2.01
+instance Read Integer where
+ readPrec = readNumber convertInt
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-4.8.0.0
+instance Read Natural where
+ readsPrec d = map (\(n, s) -> (fromInteger n, s))
+ . filter ((>= 0) . (\(x,_)->x)) . readsPrec d
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance Read Float where
+ readPrec = readNumber convertFrac
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance Read Double where
+ readPrec = readNumber convertFrac
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance (Integral a, Ord a, Read a) => Read (Ratio a) where
+ readPrec =
+ parens
+ ( prec ratioPrec
+ ( do x <- step readPrec
+ expectP (L.Symbol "%")
+ y <- step readPrec
+ return (x % y)
+ )
+ )
+
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+
+------------------------------------------------------------------------
+-- Tuple instances of Read, up to size 15
+------------------------------------------------------------------------
+
+-- | Reading a 'Void' value is always a parse error, considering
+-- 'Void' as a data type with no constructors.
+--
+-- @since base-4.8.0.0
+-- deriving instance Read Void
+-- XXX
+
+-- | @since base-2.01
+instance Read () where
+ readPrec =
+ parens
+ ( paren
+ ( return ()
+ )
+ )
+
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-4.15
+-- deriving instance Read a => Read (Solo a)
+-- XXX
+
+-- | @since base-2.01
+instance (Read a, Read b) => Read (a,b) where
+ readPrec = wrap_tup read_tup2
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+wrap_tup :: ReadPrec a -> ReadPrec a
+wrap_tup p = parens (paren p)
+
+read_comma :: ReadPrec ()
+read_comma = expectP (L.Punc ",")
+
+read_tup2 :: (Read a, Read b) => ReadPrec (a,b)
+-- Reads "a , b" no parens!
+read_tup2 = do x <- readPrec
+ read_comma
+ y <- readPrec
+ return (x,y)
+
+read_tup4 :: (Read a, Read b, Read c, Read d) => ReadPrec (a,b,c,d)
+read_tup4 = do (a,b) <- read_tup2
+ read_comma
+ (c,d) <- read_tup2
+ return (a,b,c,d)
+
+
+read_tup8 :: (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h)
+ => ReadPrec (a,b,c,d,e,f,g,h)
+read_tup8 = do (a,b,c,d) <- read_tup4
+ read_comma
+ (e,f,g,h) <- read_tup4
+ return (a,b,c,d,e,f,g,h)
+
+
+-- | @since base-2.01
+instance (Read a, Read b, Read c) => Read (a, b, c) where
+ readPrec = wrap_tup (do { (a,b) <- read_tup2; read_comma
+ ; c <- readPrec
+ ; return (a,b,c) })
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance (Read a, Read b, Read c, Read d) => Read (a, b, c, d) where
+ readPrec = wrap_tup read_tup4
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance (Read a, Read b, Read c, Read d, Read e) => Read (a, b, c, d, e) where
+ readPrec = wrap_tup (do { (a,b,c,d) <- read_tup4; read_comma
+ ; e <- readPrec
+ ; return (a,b,c,d,e) })
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance (Read a, Read b, Read c, Read d, Read e, Read f)
+ => Read (a, b, c, d, e, f) where
+ readPrec = wrap_tup (do { (a,b,c,d) <- read_tup4; read_comma
+ ; (e,f) <- read_tup2
+ ; return (a,b,c,d,e,f) })
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g)
+ => Read (a, b, c, d, e, f, g) where
+ readPrec = wrap_tup (do { (a,b,c,d) <- read_tup4; read_comma
+ ; (e,f) <- read_tup2; read_comma
+ ; g <- readPrec
+ ; return (a,b,c,d,e,f,g) })
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h)
+ => Read (a, b, c, d, e, f, g, h) where
+ readPrec = wrap_tup read_tup8
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h,
+ Read i)
+ => Read (a, b, c, d, e, f, g, h, i) where
+ readPrec = wrap_tup (do { (a,b,c,d,e,f,g,h) <- read_tup8; read_comma
+ ; i <- readPrec
+ ; return (a,b,c,d,e,f,g,h,i) })
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
+-- | @since base-2.01
+instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h,
+ Read i, Read j)
+ => Read (a, b, c, d, e, f, g, h, i, j) where
+ readPrec = wrap_tup (do { (a,b,c,d,e,f,g,h) <- read_tup8; read_comma
+ ; (i,j) <- read_tup2
+ ; return (a,b,c,d,e,f,g,h,i,j) })
+ readListPrec = readListPrecDefault
+ readList = readListDefault
+
--- /dev/null
+++ b/lib/Text/Read/Internal.hs-boot
@@ -1,0 +1,5 @@
+module Text.Read.Internal where
+import Prelude()
+import Data.Char_Type
+
+lex :: String -> [(String, String)]
--- a/lib/Text/Read/Lex.hs
+++ b/lib/Text/Read/Lex.hs
@@ -1,71 +1,602 @@
-module Text.Read.Lex(lex, dropSpace) where
-import Prelude() -- do not import Prelude
-import Primitives
-import Data.Bool
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module : GHC.Internal.Text.Read.Lex
+-- Copyright : (c) The University of Glasgow 2002
+-- License : BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer : libraries@haskell.org
+-- Stability : provisional
+-- Portability : non-portable (uses Text.ParserCombinators.ReadP)
+--
+-- The cut-down Haskell lexer, used by GHC.Internal.Text.Read
+--
+-----------------------------------------------------------------------------
+
+module Text.Read.Lex
+ -- lexing types
+ ( Lexeme(..), Number
+
+ , numberToInteger, numberToFixed, numberToRational, numberToRangedRational
+
+ -- lexer
+ , lex, expect
+ , hsLex
+ , lexChar
+
+ , readBinP
+ , readIntP
+ , readOctP
+ , readDecP
+ , readHexP
+
+ , isSymbolChar
+ )
+ where
+import Prelude()
+import Control.Error
+import Control.Monad
import Data.Char
+import Data.Bool
+import Data.Bounded
import Data.Eq
+import Data.Function
+import Data.Int
+import Data.Integer
+import Data.Integral
import Data.List
+import Data.Maybe
+import Data.Num
import Data.Ord
+import Data.Ratio
+import Data.Tuple
+import Text.Show
+import Text.ParserCombinators.ReadP
+{-
+import Control.Monad
+import Data.Enum
+import Data.List
+import Data.Maybe
+import Data.Real
+-}
+-- -----------------------------------------------------------------------------
+-- Lexing types
-type ReadS a = String -> [(a, String)]
+-- ^ Haskell lexemes.
+data Lexeme
+ = Char Char -- ^ Character literal
+ | String String -- ^ String literal, with escapes interpreted
+ | Punc String -- ^ Punctuation or reserved symbol, e.g. @(@, @::@
+ | Ident String -- ^ Haskell identifier, e.g. @foo@, @Baz@
+ | Symbol String -- ^ Haskell symbol, e.g. @>>@, @:%@
+ | Number Number -- ^ @since base-4.6.0.0
+ | EOF
+ deriving ( Eq -- ^ @since base-2.01
+ , Show -- ^ @since base-2.01
+ )
-lex :: ReadS String
-lex [] = [([],[])]
-lex ('\'':s) = [('\'':ch++"'", t) | (ch,'\'':t) <- lexLitChar s,
- ch /= "'" ]
-lex ('"':s) = [('"':str, t) | (str,t) <- lexString s]
+-- | @since base-4.6.0.0
+data Number = MkNumber Int -- Base
+ Digits -- Integral part
+ | MkDecimal Digits -- Integral part
+ (Maybe Digits) -- Fractional part
+ (Maybe Integer) -- Exponent
+ deriving ( Eq -- ^ @since base-4.6.0.0
+ , Show -- ^ @since base-4.6.0.0
+ )
+
+-- | @since base-4.5.1.0
+numberToInteger :: Number -> Maybe Integer
+numberToInteger (MkNumber base iPart) = Just (val (fromIntegral base) iPart)
+numberToInteger (MkDecimal iPart Nothing Nothing) = Just (val 10 iPart)
+numberToInteger _ = Nothing
+
+-- | @since base-4.7.0.0
+numberToFixed :: Integer -> Number -> Maybe (Integer, Integer)
+numberToFixed _ (MkNumber base iPart) = Just (val (fromIntegral base) iPart, 0)
+numberToFixed _ (MkDecimal iPart Nothing Nothing) = Just (val 10 iPart, 0)
+numberToFixed p (MkDecimal iPart (Just fPart) Nothing)
+ = let i = val 10 iPart
+ f = val 10 (integerTake p (fPart ++ repeat 0))
+ -- Sigh, we really want genericTake, but that's above us in
+ -- the hierarchy, so we define our own version here (actually
+ -- specialised to Integer)
+ integerTake :: Integer -> [a] -> [a]
+ integerTake n _ | n <= 0 = []
+ integerTake _ [] = []
+ integerTake n (x:xs) = x : integerTake (n-1) xs
+ in Just (i, f)
+numberToFixed _ _ = Nothing
+
+-- This takes a floatRange, and if the Rational would be outside of
+-- the floatRange then it may return Nothing. Not that it will not
+-- /necessarily/ return Nothing, but it is good enough to fix the
+-- space problems in #5688
+-- Ways this is conservative:
+-- * the floatRange is in base 2, but we pretend it is in base 10
+-- * we pad the floatRange a bit, just in case it is very small
+-- and we would otherwise hit an edge case
+-- * We only worry about numbers that have an exponent. If they don't
+-- have an exponent then the Rational won't be much larger than the
+-- Number, so there is no problem
+-- | @since base-4.5.1.0
+numberToRangedRational :: (Int, Int) -> Number
+ -> Maybe Rational -- Nothing = Inf
+numberToRangedRational (neg, pos) n@(MkDecimal iPart mFPart (Just exp))
+ -- Calculate amount to increase/decrease the exponent, based on (non
+ -- leading zero) places in the iPart, or leading zeros in the fPart.
+ -- If iPart and fPart are all zeros, return Nothing.
+ = let mFirstDigit = case dropWhile (0 ==) iPart of
+ iPart'@(_ : _) -> Just (length iPart')
+ [] -> case mFPart of
+ Nothing -> Nothing
+ Just fPart ->
+ case span (0 ==) fPart of
+ (_, []) -> Nothing
+ (zeroes, _) ->
+ Just (negate (length zeroes))
+ in case mFirstDigit of
+ Nothing -> Just 0
+ Just firstDigit ->
+ -- compare exp to bounds as Integer to avoid over/underflow
+ let firstDigit' = toInteger firstDigit + exp
+ in if firstDigit' > toInteger (pos + 3)
+ then Nothing
+ else if firstDigit' < toInteger (neg - 3)
+ then Just 0
+ else Just (numberToRational n)
+numberToRangedRational _ n = Just (numberToRational n)
+
+-- | @since base-4.6.0.0
+numberToRational :: Number -> Rational
+numberToRational (MkNumber base iPart) = val (fromIntegral base) iPart % 1
+numberToRational (MkDecimal iPart mFPart mExp)
+ = let i = val 10 iPart
+ in case (mFPart, mExp) of
+ (Nothing, Nothing) -> i % 1
+ (Nothing, Just exp)
+ | exp >= 0 -> (i * (10 ^ exp)) % 1
+ | otherwise -> i % (10 ^ (- exp))
+ (Just fPart, Nothing) -> fracExp 0 i fPart
+ (Just fPart, Just exp) -> fracExp exp i fPart
+ -- fracExp is a bit more efficient in calculating the Rational.
+ -- Instead of calculating the fractional part alone, then
+ -- adding the integral part and finally multiplying with
+ -- 10 ^ exp if an exponent was given, do it all at once.
+
+-- -----------------------------------------------------------------------------
+-- Lexing
+
+lex :: ReadP Lexeme
+lex = skipSpaces >> lexToken
+
+-- | @since base-4.7.0.0
+expect :: Lexeme -> ReadP ()
+expect lexeme = do { skipSpaces
+ ; thing <- lexToken
+ ; if thing == lexeme then return () else pfail }
+
+hsLex :: ReadP String
+-- ^ Haskell lexer: returns the lexed string, rather than the lexeme
+hsLex = do skipSpaces
+ (s,_) <- gather lexToken
+ return s
+
+lexToken :: ReadP Lexeme
+lexToken = lexEOF +++
+ lexLitChar +++
+ lexString +++
+ lexPunc +++
+ lexSymbol +++
+ lexId +++
+ lexNumber
+
+
+-- ----------------------------------------------------------------------
+-- End of file
+lexEOF :: ReadP Lexeme
+lexEOF = do s <- look
+ guard (null s)
+ return EOF
+
+-- ---------------------------------------------------------------------------
+-- Single character lexemes
+
+lexPunc :: ReadP Lexeme
+lexPunc =
+ do c <- satisfy isPuncChar
+ return (Punc [c])
+
+-- | The @special@ character class as defined in the Haskell Report.
+isPuncChar :: Char -> Bool
+isPuncChar c = c `elem` ",;()[]{}`"
+
+-- ----------------------------------------------------------------------
+-- Symbols
+
+lexSymbol :: ReadP Lexeme
+lexSymbol =
+ do s <- munch1 isSymbolChar
+ if s `elem` reserved_ops then
+ return (Punc s) -- Reserved-ops count as punctuation
+ else
+ return (Symbol s)
where
- lexString ('"':s) = [("\""::String, s)]
- lexString s = [(ch++str, u)
- | (ch,t) <- lexStrItem s,
- (str,u) <- lexString t ]
+ reserved_ops = ["..", "::", "=", "\\", "|", "<-", "->", "@", "~", "=>"] :: [String]
- lexStrItem ('\\':'&':s) = [("\\&"::String,s)]
- lexStrItem ('\\':c:s) | isSpace c = [("\\&"::String,t) |
- '\\':t <- [dropSpace s]]
- lexStrItem s = lexLitChar s
+{-
+isSymbolChar :: Char -> Bool
+isSymbolChar c = not (isPuncChar c) && case generalCategory c of
+ MathSymbol -> True
+ CurrencySymbol -> True
+ ModifierSymbol -> True
+ OtherSymbol -> True
+ DashPunctuation -> True
+ OtherPunctuation -> not (c `elem` "'\"")
+ ConnectorPunctuation -> c /= '_'
+ _ -> False
+-}
+isSymbolChar :: Char -> Bool
+isSymbolChar c = c `elem` ("!@#$%&?+./<=>?\\^|:-~"::String)
-lex (c:s) | isSpace c = lex s
- | isSingle c = [([c],s)]
- | isSym c = [(c:sym,t) | (sym,t) <- [span isSym s]]
- | isAlpha c = [(c:nam,t) | (nam,t) <- [span isIdChar s]]
- | isDigit c = [(c:ds++fe,t) | (ds,s) <- [span isDigit s],
- (fe,t) <- lexFracExp s ]
- | otherwise = [] -- bad character
- where
- isSingle c = c `elem` (",;()[]{}_`"::String)
- isSym c = c `elem` ("!@#$%&?+./<=>?\\^|:-~"::String)
- isIdChar c = isAlphaNum c || c == '_' || c == '\''
+-- ----------------------------------------------------------------------
+-- identifiers
- lexFracExp ('.':c:cs) | isDigit c
- = [('.':ds++e,u) | (ds,t) <- lexDigits (c:cs),
- (e,u) <- lexExp t]
- lexFracExp s = lexExp s
-
- lexExp (e:s) | e == 'e' || e == 'E'
- = [(e:c:ds,u) | (c:t) <- [s], c == '-' || c == '+',
- (ds,u) <- lexDigits t] ++
- [(e:ds,t) | (ds,t) <- lexDigits s]
- lexExp s = [([],s)]
+lexId :: ReadP Lexeme
+lexId = do c <- satisfy isIdsChar
+ s <- munch isIdfChar
+ return (Ident (c:s))
+ where
+ -- Identifiers can start with a '_'
+ isIdsChar c = isAlpha c || c == '_'
+ isIdfChar c = isAlphaNum c || c `elem` "_'"
-lexDigits :: ReadS String
-lexDigits s = [(cs, t) | (cs@(_:_), t) <- [span isDigit s]]
+-- ---------------------------------------------------------------------------
+-- Lexing character literals
-lexLitChar :: ReadS String
-lexLitChar ('\\':s) = [ prefix '\\' c | c <- lexEsc s ]
+lexLitChar :: ReadP Lexeme
+lexLitChar =
+ do _ <- char '\''
+ (c,esc) <- lexCharE
+ guard (esc || c /= '\'') -- Eliminate '' possibility
+ _ <- char '\''
+ return (Char c)
+
+lexChar :: ReadP Char
+lexChar = do { (c,_) <- lexCharE; consumeEmpties; return c }
+ where
+ -- Consumes the string "\&" repeatedly and greedily (will only produce one match)
+ consumeEmpties :: ReadP ()
+ consumeEmpties = do
+ rest <- look
+ case rest of
+ ('\\':'&':_) -> string "\\&" >> consumeEmpties
+ _ -> return ()
+
+
+lexCharE :: ReadP (Char, Bool) -- "escaped or not"?
+lexCharE =
+ do c1 <- get
+ if c1 == '\\'
+ then do c2 <- lexEsc; return (c2, True)
+ else return (c1, False)
+ where
+ lexEsc =
+ lexEscChar
+ +++ lexNumeric
+ +++ lexCntrlChar
+ +++ lexAscii
+
+ lexEscChar =
+ do c <- get
+ case c of
+ 'a' -> return '\a'
+ 'b' -> return '\b'
+ 'f' -> return '\f'
+ 'n' -> return '\n'
+ 'r' -> return '\r'
+ 't' -> return '\t'
+ 'v' -> return '\v'
+ '\\' -> return '\\'
+ '\"' -> return '\"'
+ '\'' -> return '\''
+ _ -> pfail
+
+ lexNumeric =
+ do base <- lexBaseChar <++ return 10
+ n <- lexInteger base
+ guard (n <= toInteger (ord maxBound))
+ return (chr (fromInteger n))
+
+ lexCntrlChar =
+ do _ <- char '^'
+ c <- get
+ case c of
+ '@' -> return '\^@'
+ 'A' -> return '\^A'
+ 'B' -> return '\^B'
+ 'C' -> return '\^C'
+ 'D' -> return '\^D'
+ 'E' -> return '\^E'
+ 'F' -> return '\^F'
+ 'G' -> return '\^G'
+ 'H' -> return '\^H'
+ 'I' -> return '\^I'
+ 'J' -> return '\^J'
+ 'K' -> return '\^K'
+ 'L' -> return '\^L'
+ 'M' -> return '\^M'
+ 'N' -> return '\^N'
+ 'O' -> return '\^O'
+ 'P' -> return '\^P'
+ 'Q' -> return '\^Q'
+ 'R' -> return '\^R'
+ 'S' -> return '\^S'
+ 'T' -> return '\^T'
+ 'U' -> return '\^U'
+ 'V' -> return '\^V'
+ 'W' -> return '\^W'
+ 'X' -> return '\^X'
+ 'Y' -> return '\^Y'
+ 'Z' -> return '\^Z'
+ '[' -> return '\^['
+ '\\' -> return '\^\'
+ ']' -> return '\^]'
+ '^' -> return '\^^'
+ '_' -> return '\^_'
+ _ -> pfail
+
+ lexAscii =
+ choice
+ [ (string "SOH" >> return '\SOH') <++
+ (string "SO" >> return '\SO')
+ -- \SO and \SOH need maximal-munch treatment
+ -- See the Haskell report Sect 2.6
+
+ , string "NUL" >> return '\NUL'
+ , string "STX" >> return '\STX'
+ , string "ETX" >> return '\ETX'
+ , string "EOT" >> return '\EOT'
+ , string "ENQ" >> return '\ENQ'
+ , string "ACK" >> return '\ACK'
+ , string "BEL" >> return '\BEL'
+ , string "BS" >> return '\BS'
+ , string "HT" >> return '\HT'
+ , string "LF" >> return '\LF'
+ , string "VT" >> return '\VT'
+ , string "FF" >> return '\FF'
+ , string "CR" >> return '\CR'
+ , string "SI" >> return '\SI'
+ , string "DLE" >> return '\DLE'
+ , string "DC1" >> return '\DC1'
+ , string "DC2" >> return '\DC2'
+ , string "DC3" >> return '\DC3'
+ , string "DC4" >> return '\DC4'
+ , string "NAK" >> return '\NAK'
+ , string "SYN" >> return '\SYN'
+ , string "ETB" >> return '\ETB'
+ , string "CAN" >> return '\CAN'
+ , string "EM" >> return '\EM'
+ , string "SUB" >> return '\SUB'
+ , string "ESC" >> return '\ESC'
+ , string "FS" >> return '\FS'
+ , string "GS" >> return '\GS'
+ , string "RS" >> return '\RS'
+ , string "US" >> return '\US'
+ , string "SP" >> return '\SP'
+ , string "DEL" >> return '\DEL'
+ ]
+
+
+-- ---------------------------------------------------------------------------
+-- string literal
+
+lexString :: ReadP Lexeme
+lexString =
+ do _ <- char '"'
+ body id
+ where
+ body f =
+ do (c,esc) <- lexStrItem
+ if c /= '"' || esc
+ then body (f.(c:))
+ else let s = f "" in
+ return (String s)
+
+ lexStrItem = (lexEmpty >> lexStrItem)
+ +++ lexCharE
+
+ lexEmpty =
+ do _ <- char '\\'
+ c <- get
+ case c of
+ '&' -> return ()
+ _ | isSpace c -> do skipSpaces; _ <- char '\\'; return ()
+ _ -> pfail
+
+-- ---------------------------------------------------------------------------
+-- Lexing numbers
+
+type Base = Int
+type Digits = [Int]
+
+lexNumber :: ReadP Lexeme
+lexNumber
+ = lexHexOct <++ -- First try for hex or octal 0x, 0o etc
+ -- If that fails, try for a decimal number
+ lexDecNumber -- Start with ordinary digits
+
+lexHexOct :: ReadP Lexeme
+lexHexOct
+ = do _ <- char '0'
+ base <- lexBaseChar
+ digits <- lexDigits base
+ return (Number (MkNumber base digits))
+
+lexBaseChar :: ReadP Int
+-- Lex a single character indicating the base; fail if not there
+lexBaseChar = do
+ c <- get
+ case c of
+ 'b' -> return 2
+ 'B' -> return 2
+ 'o' -> return 8
+ 'O' -> return 8
+ 'x' -> return 16
+ 'X' -> return 16
+ _ -> pfail
+
+lexDecNumber :: ReadP Lexeme
+lexDecNumber =
+ do xs <- lexDigits 10
+ mFrac <- lexFrac <++ return Nothing
+ mExp <- lexExp <++ return Nothing
+ return (Number (MkDecimal xs mFrac mExp))
+
+lexFrac :: ReadP (Maybe Digits)
+-- Read the fractional part; fail if it doesn't
+-- start ".d" where d is a digit
+lexFrac = do _ <- char '.'
+ fraction <- lexDigits 10
+ return (Just fraction)
+
+lexExp :: ReadP (Maybe Integer)
+lexExp = do _ <- char 'e' +++ char 'E'
+ exp <- signedExp +++ lexInteger 10
+ return (Just exp)
+ where
+ signedExp
+ = do c <- char '-' +++ char '+'
+ n <- lexInteger 10
+ return (if c == '-' then -n else n)
+
+lexDigits :: Int -> ReadP Digits
+-- Lex a non-empty sequence of digits in specified base
+lexDigits base =
+ do s <- look
+ xs <- scan s id
+ guard (not (null xs))
+ return xs
+ where
+ scan (c:cs) f = case valDig base c of
+ Just n -> do _ <- get; scan cs (f.(n:))
+ Nothing -> return (f [])
+ scan [] f = return (f [])
+
+lexInteger :: Base -> ReadP Integer
+lexInteger base =
+ do xs <- lexDigits base
+ return (val (fromIntegral base) xs)
+
+val :: Num a => a -> Digits -> a
+val = valSimple
+{-# RULES
+"val/Integer" val = valInteger
+ #-}
+{-# INLINE [1] val #-}
+
+-- The following algorithm is only linear for types whose Num operations
+-- are in constant time.
+valSimple :: (Num a, Integral d) => a -> [d] -> a
+valSimple base = go 0
where
- lexEsc (c:s) | c `elem` ("abfnrtv\\\"'"::String) = [([c],s)]
- lexEsc ('^':c:s) | c >= '@' && c <= '_' = [(['^',c],s)]
- lexEsc ('o':s) = [prefix 'o' (span isOctDigit s)]
- lexEsc ('x':s) = [prefix 'x' (span isHexDigit s)]
- lexEsc s@(d:_) | isDigit d = [span isDigit s]
- lexEsc _ = []
+ go r [] = r
+ go r (d : ds) = r' `seq` go r' ds
+ where
+ r' = r * base + fromIntegral d
+{-# INLINE valSimple #-}
- prefix c (t,s) = (c:t, s)
-lexLitChar (c:cs) = [([c], cs)]
-lexLitChar [] = []
+-- A sub-quadratic algorithm for Integer. Pairs of adjacent radix b
+-- digits are combined into a single radix b^2 digit. This process is
+-- repeated until we are left with a single digit. This algorithm
+-- performs well only on large inputs, so we use the simple algorithm
+-- for smaller inputs.
+valInteger :: Integer -> Digits -> Integer
+valInteger b0 ds0 = go b0 (length ds0) $ map fromIntegral ds0
+ where
+ go _ _ [] = 0
+ go _ _ [d] = d
+ go b l ds
+ | l > 40 = b' `seq` go b' l' (combine b ds')
+ | otherwise = valSimple b ds
+ where
+ -- ensure that we have an even number of digits
+ -- before we call combine:
+ ds' = if even l then ds else 0 : ds
+ b' = b * b
+ l' = (l + 1) `quot` 2
+ combine b (d1 : d2 : ds) = d `seq` (d : combine b ds)
+ where
+ d = d1 * b + d2
+ combine _ [] = []
+ combine _ [_] = errorWithoutStackTrace "this should not happen"
-dropSpace :: String -> String
-dropSpace [] = []
-dropSpace ccs@(c:cs) | isSpace c = dropSpace cs
- | True = ccs
+-- Calculate a Rational from the exponent [of 10 to multiply with],
+-- the integral part of the mantissa and the digits of the fractional
+-- part. Leaving the calculation of the power of 10 until the end,
+-- when we know the effective exponent, saves multiplications.
+-- More importantly, this way we need at most one gcd instead of three.
+--
+-- frac was never used with anything but Integer and base 10, so
+-- those are hardcoded now (trivial to change if necessary).
+fracExp :: Integer -> Integer -> Digits -> Rational
+fracExp exp mant []
+ | exp < 0 = mant % (10 ^ (-exp))
+ | otherwise = fromInteger (mant * 10 ^ exp)
+fracExp exp mant (d:ds) = exp' `seq` mant' `seq` fracExp exp' mant' ds
+ where
+ exp' = exp - 1
+ mant' = mant * 10 + fromIntegral d
+
+valDig :: (Eq a, Num a) => a -> Char -> Maybe Int
+valDig 2 c
+ | '0' <= c && c <= '1' = Just (ord c - ord '0')
+ | otherwise = Nothing
+
+valDig 8 c
+ | '0' <= c && c <= '7' = Just (ord c - ord '0')
+ | otherwise = Nothing
+
+valDig 10 c = valDecDig c
+
+valDig 16 c
+ | '0' <= c && c <= '9' = Just (ord c - ord '0')
+ | 'a' <= c && c <= 'f' = Just (ord c - ord 'a' + 10)
+ | 'A' <= c && c <= 'F' = Just (ord c - ord 'A' + 10)
+ | otherwise = Nothing
+
+valDig _ _ = errorWithoutStackTrace "valDig: Bad base"
+
+valDecDig :: Char -> Maybe Int
+valDecDig c
+ | '0' <= c && c <= '9' = Just (ord c - ord '0')
+ | otherwise = Nothing
+
+-- ----------------------------------------------------------------------
+-- other numeric lexing functions
+
+readIntP :: Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadP a
+readIntP base isDigit valDigit =
+ do s <- munch1 isDigit
+ return (val base (map valDigit s))
+{-# SPECIALISE readIntP
+ :: Integer -> (Char -> Bool) -> (Char -> Int) -> ReadP Integer #-}
+
+readIntP' :: (Eq a, Num a) => a -> ReadP a
+readIntP' base = readIntP base isDigit valDigit
+ where
+ isDigit c = maybe False (const True) (valDig base c)
+ valDigit c = maybe 0 id (valDig base c)
+{-# SPECIALISE readIntP' :: Integer -> ReadP Integer #-}
+
+readBinP, readOctP, readDecP, readHexP :: (Eq a, Num a) => ReadP a
+readBinP = readIntP' 2
+readOctP = readIntP' 8
+readDecP = readIntP' 10
+readHexP = readIntP' 16
+{-# SPECIALISE readBinP :: ReadP Integer #-}
+{-# SPECIALISE readOctP :: ReadP Integer #-}
+{-# SPECIALISE readDecP :: ReadP Integer #-}
+{-# SPECIALISE readHexP :: ReadP Integer #-}
--- a/lib/Text/Read/Numeric.hs
+++ /dev/null
@@ -1,81 +1,0 @@
-module Text.Read.Numeric(
- readParen,
- --
- readSigned,
- readInt,
- readBin,
- readDec,
- readOct,
- readHex,
- readIntegral,
- readBoundedEnum,
- ) where
-import Prelude() -- do not import Prelude
-import Primitives
-import Data.Bool
-import Data.Bounded
-import Data.Char
-import Data.Eq
-import Data.Enum
-import Data.Function
-import Data.Integral
-import Data.List
-import Data.Maybe_Type
-import Data.Num
-import Data.Ord
-import Data.String
-import Text.Read.Lex(lex, dropSpace)
-import Text.Show
-
-type ReadS a = String -> [(a, String)]
-
-readParen :: forall a . Bool -> ReadS a -> ReadS a
-readParen b g = if b then mandatory else optional
- where optional r = g r ++ mandatory r
- mandatory r = [(x,u) | ("(",s) <- lex r,
- (x,t) <- optional s,
- (")",u) <- lex t ]
-
---------------------------------------------------------
-
-readInt :: forall a . Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadS a
-readInt base isDig valDig cs@(c:_) | isDig c = loop 0 cs
- where loop r (c:cs) | isDig c = loop (r * base + fromIntegral (valDig c)) cs
- loop r ds = [(r, ds)]
-readInt _ _ _ _ = []
-
-readBin :: forall a . (Num a) => ReadS a
-readBin = readInt 2 isBinDigit digitToInt
-
-isBinDigit :: Char -> Bool
-isBinDigit c = c == '0' || c == '1'
-
-readOct :: forall a . (Num a) => ReadS a
-readOct = readInt 8 isOctDigit digitToInt
-
-readDec :: forall a . (Num a) => ReadS a
-readDec = readInt 10 isDigit digitToInt
-
-readHex :: forall a . (Num a) => ReadS a
-readHex = readInt 16 isHexDigit digitToInt
-
-readSigned :: forall a . (Num a) => ReadS a -> ReadS a
-readSigned readPos = readParen False read'
- where
- read' :: ReadS a
- read' r = readPos r ++
- [ (- x, t) | ("-", s) <- lex r, (x, t) <- readPos s ]
-
-readIntegral :: forall a . (Integral a) => Int -> ReadS a
-readIntegral _ = readSigned (readAny . dropSpace)
- where readAny ('0':'x':cs) = readHex cs
- readAny ('0':'X':cs) = readHex cs
- readAny ('0':'o':cs) = readOct cs
- readAny ('0':'O':cs) = readOct cs
- readAny ('0':'b':cs) = readBin cs
- readAny ('0':'B':cs) = readBin cs
- readAny cs = readDec cs
-
-readBoundedEnum :: forall a . (Enum a, Bounded a, Show a) => ReadS a
-readBoundedEnum = \ r -> [ (e, t) | (s, t) <- lex r, Just e <- [lookup s table] ]
- where table = [ (show e, e) | e <- [ minBound .. maxBound ] ]
--- a/lib/libs.cabal
+++ b/lib/libs.cabal
@@ -24,6 +24,7 @@
Data.Bits
Data.Bool
Data.Bounded
+ Data.ByteString
Data.Char
Data.Complex
Data.Constraint
@@ -64,6 +65,7 @@
Data.String
Data.Time.Clock -- XXX remove
Data.Time.Format -- XXX remove
+ Data.Text
Data.Traversable
Data.Tuple
Data.Type.Equality
--- a/mhs/Compat.hs
+++ b/mhs/Compat.hs
@@ -1,8 +1,9 @@
-- Copyright 2023 Lennart Augustsson
-- See LICENSE file for full license.
-module Compat(rnfNoErr, rnfErr, NFData) where
+module Compat(rnfNoErr, rnfErr, NFData, appendDot) where
import Prelude() -- do not import Prelude
import Primitives
+import Data.Text
-- So we can import Compat, which is full of stuff for GHC.
-- Define these here to avoid dragging in Control.DeepSeq
@@ -13,4 +14,9 @@
rnfErr = primRnfErr
class NFData a
+
+appendDot :: Text -> Text -> Text
+appendDot x y =
+ primitive "bs++." x y
+ --x `append` pack "." `append` y
--- /dev/null
+++ b/mhs/MHSPrelude.hs
@@ -1,0 +1,77 @@
+module MHSPrelude(
+ module Control.Applicative,
+ module Control.Error,
+ module Control.Monad,
+ module Control.Monad.Fail,
+ module Data.Bool,
+ module Data.Bounded,
+ module Data.Char,
+ module Data.Double,
+ module Data.Either,
+ module Data.Enum,
+ module Data.Eq,
+ module Data.Fractional,
+ module Data.Function,
+ module Data.Functor,
+ module Data.Int,
+ module Data.Integer,
+ module Data.Integral,
+ module Data.List,
+ module Data.Maybe,
+ module Data.Monoid,
+ module Data.Num,
+ module Data.Ord,
+ module Data.Ratio,
+ module Data.Real,
+ module Data.Records,
+ module Data.String,
+ module Data.Tuple,
+ module System.IO,
+ module Text.Show,
+ usingMhs, _wordSize, _isWindows,
+ ) where
+import Prelude()
+import Control.Applicative(Applicative(..))
+import Control.Error(error, undefined)
+import Control.Monad(Monad(..), mapM, mapM_, sequence, sequence_, (=<<))
+import Control.Monad.Fail(MonadFail(..))
+import Data.Bool(Bool(..), (&&), (||), not, otherwise)
+import Data.Bounded(Bounded(..))
+import Data.Char(Char, String)
+import Data.Double(Double)
+import Data.Either(Either(..), either)
+import Data.Enum(Enum(..))
+import Data.Eq(Eq(..))
+import Data.Fractional(Fractional(..), (^^))
+import Data.Function(id, const, (.), flip, ($), seq, ($!), until, asTypeOf)
+import Data.Functor(Functor(..), (<$>))
+import Data.Int(Int)
+import Data.Int.Instances
+import Data.Integer(Integer)
+import Data.Integral(Integral(..), fromIntegral, gcd, lcm, even, odd, (^))
+import Data.List([](..), map, (++), filter, head, last, tail, init, null, length, (!!),
+ reverse, foldl, foldl1, foldr, foldr1, and, or, any, all,
+ sum, product, concat, concatMap, maximum, minimum,
+ scanl, scanl1, scanr, scanr1, iterate, repeat, replicate, cycle,
+ take, drop, splitAt, takeWhile, dropWhile, span, break,
+ elem, notElem, lookup, zip, zip3, zipWith, zipWith3, unzip, unzip3,
+ lines, words, unlines, unwords)
+import Data.Maybe(Maybe(..), maybe)
+import Data.Monoid(Monoid(..))
+import Data.Num(Num(..), subtract)
+import Data.Ord(Ord(..), Ordering(..))
+import Data.Ratio(Rational)
+import Data.Real(Real(..), realToFrac)
+import Data.Records -- XXX redo this somehow
+import Data.String(IsString(..), lines, unlines, words, unwords)
+import Data.Tuple(()(..), fst, snd, curry, uncurry)
+import Data.Word(Word)
+import System.IO(IO, putChar, putStr, putStrLn, print, getLine, getContents, interact,
+ FilePath, readFile, writeFile, appendFile,
+ cprint, cuprint)
+import Text.Show(Show(..), ShowS, shows, showChar, showString, showParen)
+import Primitives(_wordSize, _isWindows)
+
+-- So we can detect mhs vs ghc
+usingMhs :: Bool
+usingMhs = True
--- a/mhs/System/Console/SimpleReadline.hs
+++ b/mhs/System/Console/SimpleReadline.hs
@@ -8,7 +8,7 @@
getInputLineHist,
getInputLineHistComp,
) where
-import Prelude
+import Prelude(); import MiniPrelude
import Control.Monad
import Data.Char
import System.IO
--- a/paths/Paths_MicroHs.hs
+++ b/paths/Paths_MicroHs.hs
@@ -3,6 +3,7 @@
version,
getDataDir,
) where
+import Prelude(); import MHSPrelude
import Data.Version
getDataDir :: IO FilePath
@@ -9,4 +10,4 @@
getDataDir = return "."
version :: Version
-version = makeVersion [0,9,16,0]
+version = makeVersion [0,10,3,0]
--- a/src/MicroHs/Abstract.hs
+++ b/src/MicroHs/Abstract.hs
@@ -2,6 +2,7 @@
compileOpt,
-- reduce,
) where
+import Prelude(); import MHSPrelude
import MicroHs.Ident
import MicroHs.Exp
import MicroHs.Expr(Lit(..))
--- a/src/MicroHs/Builtin.hs
+++ b/src/MicroHs/Builtin.hs
@@ -6,7 +6,7 @@
-- The compiler needs a number of identifiers from libraries.
-- These are make available by (programatically) adding
--- 'import Mhs.Builtin qualified as @B"
+-- 'import Mhs.Builtin qualified as B@"
-- The name 'B@' is not a valid identifier, so these name
-- cannot be used accidentally in user code.
builtinMdl :: String
--- a/src/MicroHs/Compile.hs
+++ b/src/MicroHs/Compile.hs
@@ -10,7 +10,9 @@
moduleToFile,
packageDir, packageSuffix, packageTxtSuffix,
mhsVersion,
+ getMhsDir,
) where
+import Prelude(); import MHSPrelude
import Data.Char
import Data.List
import Data.Maybe
@@ -39,7 +41,7 @@
import MicroHs.TypeCheck
import Compat
import MicroHs.Instances() -- for ghc
-import Paths_MicroHs(version)
+import Paths_MicroHs(version, getDataDir)
mhsVersion :: String
mhsVersion = showVersion version
@@ -80,7 +82,9 @@
when (writeCache flags) $ do
when (verbosityGT flags 0) $
putStrLn $ "Saving cache " ++ show mhsCacheName
- () <- seq (rnfNoErr cash) (return ())
+ -- This causes all kinds of chaos, probably because there
+ -- will be equality tests of unevaluated thunks.
+ -- () <- seq (rnfNoErr cash) (return ())
saveCache mhsCacheName cash
compile :: Flags -> IdentModule -> Cache -> IO ((IdentModule, [LDef]), Symbols, Cache)
@@ -117,8 +121,10 @@
case impt of
ImpBoot -> compileBootModule flags mn
ImpNormal -> do
- when (verbosityGT flags 1) $
- liftIO $ putStrLn $ "importing " ++ showIdent mn
+ when (verbosityGT flags 1) $ do
+ ms <- gets getWorking
+ putStrLnInd $ "[from " ++ head (map showIdent ms ++ ["-"]) ++ "]"
+ putStrLnInd $ "importing " ++ showIdent mn
mres <- liftIO (readModulePath flags ".hs" mn)
case mres of
Nothing -> findPkgModule flags mn
@@ -127,9 +133,14 @@
compileModule flags ImpNormal mn pathfn file
Just tm -> do
when (verbosityGT flags 1) $
- liftIO $ putStrLn $ "importing cached " ++ showIdent mn
+ putStrLnInd $ "importing cached " ++ showIdent mn
return (tm, noSymbols, 0)
+putStrLnInd :: String -> StateIO Cache ()
+putStrLnInd msg = do
+ ms <- gets getWorking
+ liftIO $ putStrLn $ map (const ' ') ms ++ msg
+
noSymbols :: Symbols
noSymbols = (stEmpty, stEmpty)
@@ -136,7 +147,7 @@
compileBootModule :: Flags -> IdentModule -> StateIO Cache (TModule [LDef], Symbols, Time)
compileBootModule flags mn = do
when (verbosityGT flags 0) $
- liftIO $ putStrLn $ "importing boot " ++ showIdent mn
+ putStrLnInd $ "importing boot " ++ showIdent mn
mres <- liftIO (readModulePath flags ".hs-boot" mn)
case mres of
Nothing -> error $ "boot module not found: " ++ showIdent mn
@@ -153,6 +164,8 @@
let pmdl = parseDie pTop pathfn file
mdl@(EModule mnn _ defs) = addPreludeImport pmdl
when (verbosityGT flags 4) $
+ liftIO $ putStrLn $ "parsing: " ++ pathfn
+ when (verbosityGT flags 4) $
liftIO $ putStrLn $ "parsed:\n" ++ show pmdl
-- liftIO $ putStrLn $ showEModule mdl
@@ -178,7 +191,8 @@
let
cmdl = setBindings [ (i, compileOpt e) | (i, e) <- bindingsOf dmdl ] dmdl
- () <- return $ rnfErr $ bindingsOf cmdl
+ () <- return $ rnfErr $ bindingsOf cmdl -- This makes execution slower, but speeds up GC
+-- () <- return $ rnfErr syms same for this, but worse total time
t5 <- liftIO getTimeMilli
let tParse = t2 - t1
@@ -190,7 +204,7 @@
when (verbosityGT flags 4) $
(liftIO $ putStrLn $ "desugared:\n" ++ showTModule showLDefs dmdl)
when (verbosityGT flags 0) $
- liftIO $ putStrLn $ "importing done " ++ showIdent mn ++ ", " ++ show tThis ++
+ putStrLnInd $ "importing done " ++ showIdent mn ++ ", " ++ show tThis ++
"ms (" ++ show tParse ++ " + " ++ show tTCDesug ++ " + " ++ show tAbstract ++ ")"
when (loading flags && mn /= mkIdent "Interactive" && not (verbosityGT flags 0)) $
liftIO $ putStrLn $ "loaded " ++ showIdent mn
@@ -266,7 +280,7 @@
-- Is the module name actually a file name?
getFileName :: IdentModule -> Maybe String
getFileName m | ".hs" `isSuffixOf` s = Just s
- | otherwise = Nothing
+ | otherwise = Nothing
where s = unIdent m
readModulePath :: Flags -> String -> IdentModule -> IO (Maybe (FilePath, String))
@@ -276,10 +290,14 @@
Nothing -> errorMessage (getSLoc mn) $ "File not found: " ++ show fn
Just h -> readRest fn h
- | otherwise = do
+ | otherwise = do
mh <- findModulePath flags suf mn
case mh of
- Nothing -> return Nothing
+ Nothing -> do
+ mhc <- findModulePath flags (suf ++ "c") mn -- look for hsc file
+ case mhc of
+ Nothing -> return Nothing
+ Just (_fn, _h) -> undefined
Just (fn, h) -> readRest fn h
where readRest fn h = do
hasCPP <- hasLangCPP fn
@@ -336,16 +354,18 @@
mhsDefines :: [String]
mhsDefines =
- [ "'-DMIN_VERSION_base(x,y,z)=(x<=4||y<=14)'" -- Pretend we have base version 4.14
- , "-D__MHS__" -- We are MHS
+ [ "-D__MHS__" -- We are MHS
]
runCPP :: Flags -> FilePath -> FilePath -> IO ()
runCPP flags infile outfile = do
mcpphs <- lookupEnv "MHSCPPHS"
+ datadir <- getMhsDir
let cpphs = fromMaybe "cpphs" mcpphs
- args = mhsDefines ++ cppArgs flags
- cmd = cpphs ++ " --noline --strip " ++ unwords args ++ " " ++ infile ++ " -O" ++ outfile
+ mhsIncludes = ["-I" ++ datadir ++ "/src/runtime"]
+ args = mhsDefines ++ mhsIncludes ++ map quote (cppArgs flags)
+ cmd = cpphs ++ " --strip " ++ unwords args ++ " " ++ infile ++ " -O" ++ outfile
+ quote s = "'" ++ s ++ "'"
when (verbosityGT flags 1) $
putStrLn $ "Run cpphs: " ++ show cmd
callCommand cmd
@@ -388,7 +408,7 @@
pkg <- liftIO $ readSerialized fn
when (pkgCompiler pkg /= mhsVersion) $
error $ "Package compile version mismatch: package=" ++ pkgCompiler pkg ++ ", compiler=" ++ mhsVersion
- modify $ addPackage pkg
+ modify $ addPackage fn pkg
-- XXX add function to find&load package from package name
@@ -413,3 +433,10 @@
Just (pfn, hdl) -> do
liftIO $ hClose hdl
loadPkg flags pfn
+
+getMhsDir :: IO FilePath
+getMhsDir = do
+ md <- lookupEnv "MHSDIR"
+ case md of
+ Just d -> return d
+ Nothing -> getDataDir
--- a/src/MicroHs/CompileCache.hs
+++ b/src/MicroHs/CompileCache.hs
@@ -1,10 +1,11 @@
module MicroHs.CompileCache(
CModule,
- Cache, addWorking, emptyCache, deleteFromCache, workToDone, addBoot, getBoots,
+ Cache, addWorking, getWorking, emptyCache, deleteFromCache, workToDone, addBoot, getBoots,
cachedModules, lookupCache, lookupCacheChksum, getImportDeps,
- addPackage, getCompMdls, getPkgs,
+ addPackage, getCompMdls, getPathPkgs, getPkgs,
saveCache, loadCached,
) where
+import Prelude(); import MHSPrelude
import MicroHs.Desugar(LDef)
import MicroHs.Expr(IdentModule)
import MicroHs.Ident(showIdent)
@@ -39,7 +40,7 @@
working :: [IdentModule], -- modules currently being processed (used to detected circular imports)
boots :: [IdentModule], -- modules where only the boot version has been compiled
cache :: M.Map CacheEntry, -- cached compiled modules
- pkgs :: [Package] -- loaded packages
+ pkgs :: [(FilePath, Package)] -- loaded packages
}
-- deriving (Show)
@@ -55,6 +56,9 @@
getBoots :: Cache -> [IdentModule]
getBoots = boots
+getWorking :: Cache -> [IdentModule]
+getWorking = working
+
addWorking :: IdentModule -> Cache -> Cache
addWorking mn c =
let ws = working c
@@ -83,11 +87,14 @@
getCompMdls :: Cache -> [TModule [LDef]]
getCompMdls cash = [ tm | CompMdl tm _ _ <- M.elems (cache cash) ]
+getPathPkgs :: Cache -> [(FilePath, Package)]
+getPathPkgs = pkgs
+
getPkgs :: Cache -> [Package]
-getPkgs = pkgs
+getPkgs = map snd . pkgs
-addPackage :: Package -> Cache -> Cache
-addPackage p c = c{ pkgs = p : pkgs c, cache = foldr ins (cache c) (pkgExported p ++ pkgOther p) }
+addPackage :: FilePath -> Package -> Cache -> Cache
+addPackage f p c = c{ pkgs = (f, p) : pkgs c, cache = foldr ins (cache c) (pkgExported p ++ pkgOther p) }
where ins t = M.insert (tModuleName t) (PkgMdl t)
saveCache :: FilePath -> Cache -> IO ()
--- a/src/MicroHs/Deriving.hs
+++ b/src/MicroHs/Deriving.hs
@@ -1,4 +1,5 @@
module MicroHs.Deriving(expandField, doDeriving, mkGetName) where
+import Prelude(); import MHSPrelude
--import Control.Monad
import Data.Char
import Data.Function
@@ -34,7 +35,7 @@
,("Data.Ix.Ix", derNotYet)
,("Data.Ord.Ord", derOrd)
,("Data.Typeable.Typeable", derTypeable)
- ,("Text.Read.Read", derNotYet)
+ ,("Text.Read.Internal.Read",derNotYet)
,("Text.Show.Show", derShow)
]
@@ -69,17 +70,18 @@
let loc = getSLoc tycon
qtycon = qualIdent mn tycon
eFld = EVar fld
- undef = mkExn loc (unIdent fld) "recSelError"
+ ufld = unIdent fld
+ undef = mkExn loc ufld "recSelError"
iHasField = mkIdentSLoc loc nameHasField
iSetField = mkIdentSLoc loc nameSetField
igetField = mkIdentSLoc loc namegetField
isetField = mkIdentSLoc loc namesetField
hdrGet = eForall iks $ eApp3 (EVar iHasField)
- (ELit loc (LStr (unIdent fld)))
+ (ELit loc (LStr ufld))
(eApps (EVar qtycon) (map (EVar . idKindIdent) iks))
fldty
hdrSet = eForall iks $ eApp3 (EVar iSetField)
- (ELit loc (LStr (unIdent fld)))
+ (ELit loc (LStr ufld))
(eApps (EVar qtycon) (map (EVar . idKindIdent) iks))
fldty
conEqnGet (Constr _ _ c (Left ts)) = eEqn [eApps (EVar c) (map (const eDummy) ts)] $ undef
--- a/src/MicroHs/Desugar.hs
+++ b/src/MicroHs/Desugar.hs
@@ -6,6 +6,7 @@
LDef, showLDefs,
encodeInteger,
) where
+import Prelude(); import MHSPrelude
import Data.Char
import Data.Function
import Data.Integer(_integerToIntList)
@@ -51,7 +52,13 @@
Sign _ _ -> []
KindSign _ _ -> []
Import _ -> []
- ForImp ie i t -> [(i, Lit $ LForImp (fromMaybe (unIdent (unQualIdent i)) ie) (CType t))]
+ ForImp ie i t -> [(i, if isIO t then frgn else App perf frgn)]
+ where frgn = Lit $ LForImp (fromMaybe (unIdent (unQualIdent i)) ie) cty
+ cty = CType t
+ perf = Lit $ LPrim "IO.performIO"
+ isIO x | Just (_, r) <- getArrow x = isIO r
+ isIO (EApp (EVar io) _) = io == mkIdent "Primitives.IO"
+ isIO _ = False
Infix _ _ -> []
Class ctx (c, _) _ bs ->
let f = mkIdent "$f"
--- a/src/MicroHs/EncodeData.hs
+++ b/src/MicroHs/EncodeData.hs
@@ -6,6 +6,7 @@
encIf,
encList,
) where
+import Prelude(); import MHSPrelude
import Data.List
import MicroHs.Exp
import MicroHs.Expr(Con(..), Lit(..))
@@ -137,6 +138,16 @@
[] -> dflt
[(i, xs, e)] | hi - lo == 1 -> match tup xs e
| otherwise -> encIf (eqInt n i) (match tup xs e) dflt
+{-
+ -- Strangely, this slows things down.
+ -- Why? A 3-way branch should be better than a 2-way.
+ [(i, xs, e), (_, xs', e')]
+ | hi - lo == 2 -> encIf (eqInt n i) (match tup xs e) (match tup xs' e')
+ let !(pesl, (i, xs, e) : pesh) = splitAt (length pes `quot` 2) pes
+ in encTri (cmpInt n i) (caseTree n tup lo i pesl dflt)
+ (match tup xs e)
+ (caseTree n tup (i+1) hi pesh dflt)
+-}
_ ->
let !(pesl, pesh@((i, _, _):_)) = splitAt (length pes `quot` 2) pes
in encIf (ltInt n i) (caseTree n tup lo i pesl dflt) (caseTree n tup i hi pesh dflt)
@@ -147,6 +158,11 @@
ltInt x i = app2 (Lit (LPrim "<")) x (Lit (LInt i))
match :: Exp -> [Ident] -> Exp -> Exp
match e is rhs = App e $ lams is rhs
+{-
+ cmpInt :: Exp -> Int -> Exp
+ cmpInt x i = app2 (Lit (LPrim "icmp")) x (Lit (LInt i))
+ encTri o l e h = app3 o l e h
+-}
conNo :: Con -> Int
conNo (ConData cks i _) = length $ takeWhile ((/= i) . fst) cks
--- a/src/MicroHs/Exp.hs
+++ b/src/MicroHs/Exp.hs
@@ -10,7 +10,7 @@
allVarsExp, freeVars,
lams, apps,
) where
-import Prelude hiding((<>))
+import Prelude(); import MHSPrelude hiding((<>))
import Data.Char
import Data.List
import MicroHs.Ident
--- a/src/MicroHs/ExpPrint.hs
+++ b/src/MicroHs/ExpPrint.hs
@@ -1,4 +1,5 @@
module MicroHs.ExpPrint(toStringCMdl, toStringP, encodeString, combVersion) where
+import Prelude(); import MHSPrelude
import Data.Char(ord, chr)
import qualified MicroHs.IdentMap as M
import Data.Maybe
--- a/src/MicroHs/Expr.hs
+++ b/src/MicroHs/Expr.hs
@@ -39,7 +39,7 @@
Assoc(..), Fixity,
getBindsVars,
HasLoc(..),
- eForall,
+ eForall, eForall',
eDummy,
impossible, impossibleShow,
getArrow, getArrows,
@@ -48,7 +48,7 @@
getAppM,
TyVar, freeTyVars,
) where
-import Prelude hiding ((<>))
+import Prelude(); import MHSPrelude hiding ((<>))
import Control.Arrow(first)
import Data.List
import Data.Maybe
@@ -109,11 +109,13 @@
| ECase Expr [ECaseArm]
| ELet [EBind] Expr
| ETuple [Expr]
+ | EParen Expr
| EListish Listish
| EDo (Maybe Ident) [EStmt]
| ESectL Expr Ident
| ESectR Ident Expr
| EIf Expr Expr Expr
+ | EMultiIf EAlts
| ESign Expr EType
| ENegApp Expr
| EUpdate Expr [EField]
@@ -123,7 +125,7 @@
| EViewPat Expr EPat
| ELazy Bool EPat -- True indicates ~p, False indicates !p
-- only in types
- | EForall [IdKind] EType
+ | EForall Bool [IdKind] EType -- True indicates explicit forall in the code
-- only while type checking
| EUVar Int
-- only after type checking
@@ -246,6 +248,7 @@
EOper p1 ips -> patVars p1 ++ concatMap (\ (i, p2) -> i `add` patVars p2) ips
ELit _ _ -> []
ETuple ps -> concatMap patVars ps
+ EParen p -> patVars p
EListish (LList ps) -> concatMap patVars ps
ESign p _ -> patVars p
EAt i p -> i `add` patVars p
@@ -292,18 +295,18 @@
type ESort = EType
sKind :: ESort
-sKind = EVar (Ident noSLoc "Primitives.Kind")
+sKind = EVar (mkIdent "Primitives.Kind")
kType :: EKind
-kType = EVar (Ident noSLoc "Primitives.Type")
+kType = EVar (mkIdent "Primitives.Type")
kConstraint :: EKind
-kConstraint = EVar (Ident noSLoc "Primitives.Constraint")
+kConstraint = EVar (mkIdent "Primitives.Constraint")
tupleConstr :: SLoc -> Int -> Ident
tupleConstr loc n = mkIdentSLoc loc (replicate (n - 1) ',')
--- Check if it is a suple constructor
+-- Check if it is a tuple constructor
getTupleConstr :: Ident -> Maybe Int
getTupleConstr i =
case unIdent i of
@@ -334,7 +337,7 @@
getSLoc :: a -> SLoc
instance HasLoc Ident where
- getSLoc (Ident l _) = l
+ getSLoc = slocIdent
-- Approximate location; only identifiers and literals carry a location
instance HasLoc Expr where
@@ -346,6 +349,7 @@
getSLoc (ECase e _) = getSLoc e
getSLoc (ELet bs _) = getSLoc bs
getSLoc (ETuple es) = getSLoc es
+ getSLoc (EParen e) = getSLoc e
getSLoc (EListish l) = getSLoc l
getSLoc (EDo (Just i) _) = getSLoc i
getSLoc (EDo _ ss) = getSLoc ss
@@ -352,6 +356,7 @@
getSLoc (ESectL e _) = getSLoc e
getSLoc (ESectR i _) = getSLoc i
getSLoc (EIf e _ _) = getSLoc e
+ getSLoc (EMultiIf e) = getSLoc e
getSLoc (ESign e _) = getSLoc e
getSLoc (ENegApp e) = getSLoc e
getSLoc (EUpdate e _) = getSLoc e
@@ -361,8 +366,8 @@
getSLoc (ELazy _ e) = getSLoc e
getSLoc (EUVar _) = error "getSLoc EUVar"
getSLoc (ECon c) = getSLoc c
- getSLoc (EForall [] e) = getSLoc e
- getSLoc (EForall iks _) = getSLoc iks
+ getSLoc (EForall _ [] e) = getSLoc e
+ getSLoc (EForall _ iks _) = getSLoc iks
instance forall a . HasLoc a => HasLoc [a] where
getSLoc [] = noSLoc -- XXX shouldn't happen
@@ -426,7 +431,7 @@
EApp f a -> EApp (sub f) (sub a)
ESign e t -> ESign (sub e) t
EUVar _ -> ae
- EForall iks t -> EForall iks $ subst [ x | x@(i, _) <- s, not (elem i is) ] t
+ EForall b iks t -> EForall b iks $ subst [ x | x@(i, _) <- s, not (elem i is) ] t
where is = map idKindIdent iks
ELit _ _ -> ae
_ -> error "subst unimplemented"
@@ -499,11 +504,13 @@
ECase e as -> allVarsExpr' e . composeMap allVarsCaseArm as
ELet bs e -> composeMap allVarsBind' bs . allVarsExpr' e
ETuple es -> composeMap allVarsExpr' es
+ EParen e -> allVarsExpr' e
EListish (LList es) -> composeMap allVarsExpr' es
EDo mi ss -> maybe id (:) mi . composeMap allVarsStmt ss
ESectL e i -> (i :) . allVarsExpr' e
ESectR i e -> (i :) . allVarsExpr' e
EIf e1 e2 e3 -> allVarsExpr' e1 . allVarsExpr' e2 . allVarsExpr' e3
+ EMultiIf e -> allVarsAlts e
EListish l -> allVarsListish l
ESign e _ -> allVarsExpr' e
ENegApp e -> allVarsExpr' e
@@ -514,7 +521,7 @@
ELazy _ p -> allVarsExpr' p
EUVar _ -> id
ECon c -> (conIdent c :)
- EForall iks e -> (map (\ (IdKind i _) -> i) iks ++) . allVarsExpr' e
+ EForall _ iks e -> (map (\ (IdKind i _) -> i) iks ++) . allVarsExpr' e
where field (EField _ e) = allVarsExpr' e
field (EFieldPun is) = (last is :)
field EFieldWild = impossible
@@ -686,7 +693,7 @@
ppE :: Expr -> Doc
ppE ae =
case ae of
- EVar i | raw -> text (unIdent i)
+ EVar i | raw -> text si
| isOperChar cop -> parens (text op)
| otherwise -> text s
where op = unIdent (unQualIdent i)
@@ -700,10 +707,12 @@
ECase e as -> text "case" <+> ppE e <+> text "of" $$ nest 2 (vcat (map ppCaseArm as))
ELet bs e -> text "let" $$ nest 2 (vcat (map ppEBind bs)) $$ text "in" <+> ppE e
ETuple es -> parens $ hsep $ punctuate (text ",") (map ppE es)
+ EParen e -> parens (ppE e)
EDo mn ss -> maybe (text "do") (\ n -> ppIdent n <> text ".do") mn $$ nest 2 (vcat (map ppEStmt ss))
ESectL e i -> parens $ ppE e <+> ppIdent i
ESectR i e -> parens $ ppIdent i <+> ppE e
EIf e1 e2 e3 -> parens $ sep [text "if" <+> ppE e1, text "then" <+> ppE e2, text "else" <+> ppE e3]
+ EMultiIf e -> text "if" <+> ppAlts (text "->") e
EListish l -> ppListish l
ESign e t -> parens $ ppE e <+> text "::" <+> ppEType t
ENegApp e -> text "-" <+> ppE e
@@ -715,7 +724,7 @@
ELazy False p -> text "!" <> ppE p
EUVar i -> text ("_a" ++ show i)
ECon c -> ppCon c
- EForall iks e -> ppForall iks <+> ppEType e
+ EForall _ iks e -> ppForall iks <+> ppEType e
ppApp :: [Expr] -> Expr -> Doc
ppApp as (EApp f a) = ppApp (a:as) f
@@ -722,7 +731,8 @@
ppApp as f | raw = ppApply f as
ppApp as (EVar i) | isOperChar cop, [a, b] <- as = parens $ ppE a <+> text op <+> ppExpr b
| isOperChar cop, [a] <- as = parens $ ppE a <+> text op
- | cop == ',' = ppE (ETuple as)
+ | cop == ',' && length op + 1 == length as
+ = ppE (ETuple as)
| op == "[]", length as == 1 = ppE (EListish (LList as))
where op = unIdent (unQualIdent i)
cop = head op
@@ -816,9 +826,12 @@
getBindsVars = concatMap getBindVars
eForall :: [IdKind] -> EType -> EType
-eForall [] t = t
-eForall vs t = EForall vs t
+eForall = eForall' True
+eForall' :: Bool -> [IdKind] -> EType -> EType
+eForall' _ [] t = t
+eForall' b vs t = EForall b vs t
+
eDummy :: Expr
eDummy = EVar dummyIdent
@@ -877,7 +890,7 @@
| elem tv acc = acc
| isConIdent tv = acc
| otherwise = tv : acc
- go bound (EForall tvs ty) acc = go (map idKindIdent tvs ++ bound) ty acc
+ go bound (EForall _ tvs ty) acc = go (map idKindIdent tvs ++ bound) ty acc
go bound (EApp fun arg) acc = go bound fun (go bound arg acc)
go _bound (EUVar _) acc = acc
go _bound (ECon _) acc = acc
@@ -886,6 +899,7 @@
go bound (ESign e _) acc = go bound e acc
go bound (EListish (LList [e])) acc = go bound e acc
go bound (ETuple es) acc = goList bound es acc
+ go bound (EParen e) acc = go bound e acc
go _ x _ = error ("freeTyVars: " ++ show x) -- impossibleShow x
goList bound es acc = foldr (go bound) acc es
--- a/src/MicroHs/FFI.hs
+++ b/src/MicroHs/FFI.hs
@@ -1,7 +1,7 @@
module MicroHs.FFI(makeFFI) where
+import Prelude(); import MHSPrelude
import Data.Function
import Data.List
-import Data.Maybe
import MicroHs.Desugar(LDef)
import MicroHs.Exp
import MicroHs.Expr
@@ -10,57 +10,65 @@
makeFFI :: Flags -> [LDef] -> String
makeFFI _ ds =
- let ffiImports = [ (parseImpEnt (getSLoc t) f, t) | (_, Lit (LForImp f (CType t))) <- ds ]
+ let ffiImports = [ (parseImpEnt i f, t) | (i, d) <- ds, Lit (LForImp f (CType t)) <- [get d] ]
+ where get (App _ a) = a -- if there is no IO type, we have (App primPerform (LForImp ...))
+ get a = a
wrappers = [ t | (ImpWrapper, t) <- ffiImports]
dynamics = [ t | (ImpDynamic, t) <- ffiImports]
- includes = "mhsffi.h" : catMaybes [ inc | (ImpStatic inc _addr _name, _) <- ffiImports ]
- addrs = [ (name, t) | (ImpStatic _inc True name, t) <- ffiImports, name `notElem` runtimeFFI ]
- funcs = [ (name, t) | (ImpStatic _inc False name, t) <- ffiImports, name `notElem` runtimeFFI ]
- funcs' = uniqFst funcs
- addrs' = uniqFst addrs
+ imps = uniqName $ filter ((`notElem` runtimeFFI) . impName) ffiImports
+ includes = "mhsffi.h" : nub [ inc | (ImpStatic _ (Just inc) _ _, _) <- imps ]
in
if not (null wrappers) || not (null dynamics) then error "Unimplemented FFI feature" else
unlines $
map (\ fn -> "#include \"" ++ fn ++ "\"") includes ++
- map mkStatic funcs' ++
- map mkAddr addrs' ++
+ map mkHdr imps ++
["static struct ffi_entry table[] = {"] ++
- map (mkFuncEntry . fst) funcs' ++
- map (mkAddrEntry . fst) addrs' ++
+ map (mkEntry . fst) imps ++
["{ 0,0 }",
"};",
"struct ffi_entry *xffi_table = table;"
]
-uniqFst :: [(String, EType)] -> [(String, EType)]
-uniqFst = map head . groupBy ((==) `on` fst) . sortBy (compare `on` fst)
+uniqName :: [(ImpEnt, EType)] -> [(ImpEnt, EType)]
+uniqName = map head . groupBy ((==) `on` impName) . sortBy (compare `on` impName)
-data ImpEnt = ImpStatic (Maybe String) Bool String | ImpDynamic | ImpWrapper
+data ImpEnt = ImpStatic Ident (Maybe String) Imp String | ImpDynamic | ImpWrapper
+-- deriving (Show)
+impName :: (ImpEnt, EType) -> String
+impName (ImpStatic i _ Value _, _) = unIdent' i
+impName (ImpStatic _ _ _ s, _) = s
+impName _ = undefined
+
+data Imp = Ptr | Value | Func
+-- deriving (Show)
+
-- "[static] [name.h] [&] [name]"
-- "dynamic"
-- "wrapper"
-parseImpEnt :: SLoc -> String -> ImpEnt
-parseImpEnt loc s =
+parseImpEnt :: Ident -> String -> ImpEnt
+parseImpEnt i s =
case words s of
["dynamic"] -> ImpDynamic
["wrapper"] -> ImpWrapper
"static" : r -> rest r
r -> rest r
- where rest (inc : r) | isSuffixOf ".h" inc = rest' (ImpStatic (Just inc)) r
- rest r = rest' (ImpStatic Nothing) r
- rest' c ("&" : r) = rest'' (c True) r
- rest' c ['&' : r] = rest'' (c True) [r]
- rest' c r = rest'' (c False) r
+ where rest (inc : r) | isSuffixOf ".h" inc = rest' (ImpStatic i (Just inc)) r
+ rest r = rest' (ImpStatic i Nothing) r
+ rest' c ("&" : r) = rest'' (c Ptr) r
+ rest' c ['&' : r] = rest'' (c Ptr) [r]
+ rest' c ("value" : r) = rest'' (c Value) [unwords r]
+ rest' c r = rest'' (c Func) r
rest'' c [n] = c n
rest'' _ _ = errorMessage loc $ "bad foreign import " ++ show s
+ loc = getSLoc i
-mkFuncEntry :: String -> String
-mkFuncEntry f = "{ \"" ++ f ++ "\", mhs_" ++ f ++ "},"
+mkEntry :: ImpEnt -> String
+mkEntry (ImpStatic _ _ Func f) = "{ \"" ++ f ++ "\", mhs_" ++ f ++ "},"
+mkEntry (ImpStatic _ _ Ptr f) = "{ \"&" ++ f ++ "\", mhs_addr_" ++ f ++ "},"
+mkEntry (ImpStatic i _ Value _) = "{ \"" ++ f ++ "\", mhs_" ++ f ++ "}," where f = unIdent' i
+mkEntry _ = undefined
-mkAddrEntry :: String -> String
-mkAddrEntry f = "{ \"&" ++ f ++ "\", mhs_addr_" ++ f ++ "},"
-
iIO :: Ident
iIO = mkIdent "Primitives.IO"
@@ -73,19 +81,6 @@
iFunPtr :: Ident
iFunPtr = mkIdent "Primitives.FunPtr"
-mkStatic :: (String, EType) -> String
-mkStatic (fn, t) =
- let !(as, ior) = getArrows t
- r = checkIO ior
- n = length as
- call = fn ++ "(" ++ intercalate ", " (zipWith mkArg as [0..]) ++ ")"
- fcall =
- if isUnit r then
- call ++ "; mhs_from_Unit(s, " ++ show n ++ ")"
- else
- mkRet r n call
- in mkMhsFun fn fcall
-
mkMhsFun :: String -> String -> String
mkMhsFun fn body = "void mhs_" ++ fn ++ "(int s) { " ++ body ++ "; }"
@@ -92,7 +87,7 @@
checkIO :: EType -> EType
checkIO iot =
case getApp iIO iot of
- Nothing -> errorMessage (getSLoc iot) $ "foreign return type must be IO: " ++ showEType iot
+ Nothing -> iot -- errorMessage (getSLoc iot) $ "foreign return type must be IO: " ++ showEType iot
Just t -> t
getApp :: Ident -> EType -> Maybe EType
@@ -109,8 +104,8 @@
mkArg :: EType -> Int -> String
mkArg t i = "mhs_to_" ++ cTypeName t ++ "(s, " ++ show i ++ ")"
-mkAddr :: (String, EType) -> String
-mkAddr (fn, iot) =
+mkHdr :: (ImpEnt, EType) -> String
+mkHdr (ImpStatic _ _ Ptr fn, iot) =
let r = checkIO iot
(s, _) =
case getApp iPtr r of
@@ -121,7 +116,26 @@
Nothing -> errorMessage (getSLoc r) $ "foreign & must be Ptr/FunPtr"
body = mkRet r 0 (s ++ "&" ++ fn)
in mkMhsFun ("addr_" ++ fn) body
+mkHdr (ImpStatic _ _ Func fn, t) =
+ let !(as, ior) = getArrows t
+ r = checkIO ior
+ n = length as
+ call = fn ++ "(" ++ intercalate ", " (zipWith mkArg as [0..]) ++ ")"
+ fcall =
+ if isUnit r then
+ call ++ "; mhs_from_Unit(s, " ++ show n ++ ")"
+ else
+ mkRet r n call
+ in mkMhsFun fn fcall
+mkHdr (ImpStatic i _ Value val, iot) =
+ let r = checkIO iot
+ body = mkRet r 0 val
+ in mkMhsFun (unIdent' i) body
+mkHdr _ = undefined
+unIdent' :: Ident -> String
+unIdent' = unIdent . unQualIdent
+
cTypeName :: EType -> String
cTypeName (EApp (EVar ptr) _t) | ptr == iPtr = "Ptr"
| ptr == iFunPtr = "FunPtr"
@@ -151,7 +165,8 @@
"CSize",
"CSSize",
"CLLong",
- "CULLong"
+ "CULLong",
+ "CTime"
]
-- These are already in the runtime
@@ -158,11 +173,13 @@
runtimeFFI :: [String]
runtimeFFI = [
"GETRAW", "GETTIMEMILLI", "acos", "add_FILE", "add_utf8", "asin", "atan", "atan2", "calloc", "closeb",
- "cos", "exp", "flushb", "fopen", "free", "getb", "getenv", "iswindows", "log", "lz77c", "malloc",
+ "cos", "exp", "flushb", "fopen", "free", "getb", "getenv", "iswindows", "log", "malloc",
"md5Array", "md5BFILE", "md5String", "memcpy", "memmove",
"putb", "sin", "sqrt", "system", "tan", "tmpname", "ungetb", "unlink",
"peekPtr", "pokePtr", "pokeWord", "peekWord",
"add_lz77_compressor", "add_lz77_decompressor",
+ "add_rle_compressor", "add_rle_decompressor",
+ "add_bwt_compressor", "add_bwt_decompressor",
"peek_uint8", "poke_uint8", "peek_uint16", "poke_uint16", "peek_uint32", "poke_uint32", "peek_uint64", "poke_uint64",
"peek_int8", "poke_int8", "peek_int16", "poke_int16", "peek_int32", "poke_int32", "peek_int64", "poke_int64",
"peek_ushort", "poke_ushort", "peek_short", "poke_short",
@@ -171,5 +188,6 @@
"peek_ullong", "poke_ullong", "peek_llong", "poke_llong",
"peek_flt", "poke_flt",
"sizeof_int", "sizeof_long", "sizeof_llong",
- "opendir", "closedir", "readdir", "c_d_name", "chdir", "mkdir", "getcwd"
+ "opendir", "closedir", "readdir", "c_d_name", "chdir", "mkdir", "getcwd",
+ "get_buf", "openb_rd_buf", "openb_wr_buf"
]
--- a/src/MicroHs/Fixity.hs
+++ b/src/MicroHs/Fixity.hs
@@ -1,4 +1,5 @@
module MicroHs.Fixity(resolveFixity) where
+import Prelude(); import MHSPrelude
import MicroHs.Expr
import MicroHs.Ident
--- a/src/MicroHs/Flags.hs
+++ b/src/MicroHs/Flags.hs
@@ -1,4 +1,5 @@
module MicroHs.Flags(Flags(..), verbosityGT, defaultFlags) where
+import Prelude(); import MHSPrelude
data Flags = Flags {
verbose :: Int, -- verbosity level
@@ -12,6 +13,7 @@
useTicks :: Bool, -- emit ticks
doCPP :: Bool, -- run ccphs on input files
cppArgs :: [String], -- flags for CPP
+ cArgs :: [String], -- arguments for C compiler
compress :: Bool, -- compress generated combinators
buildPkg :: Maybe FilePath, -- build a package
listPkg :: Maybe FilePath, -- list package contents
@@ -37,6 +39,7 @@
useTicks = False,
doCPP = False,
cppArgs = [],
+ cArgs = [],
compress = False,
buildPkg = Nothing,
listPkg = Nothing,
--- a/src/MicroHs/Graph.hs
+++ b/src/MicroHs/Graph.hs
@@ -12,6 +12,7 @@
stronglyConnComp,
SCC(..)
) where
+import Prelude(); import MHSPrelude
import Data.List
import Data.Maybe
import qualified MicroHs.IntSet as IS
--- a/src/MicroHs/Ident.hs
+++ b/src/MicroHs/Ident.hs
@@ -2,7 +2,7 @@
-- See LICENSE file for full license.
module MicroHs.Ident(
Line, Col,
- Ident(..),
+ Ident,
mkIdent, unIdent, isIdent,
qualIdent, showIdent, setSLocIdent,
ppIdent,
@@ -9,6 +9,8 @@
mkIdentSLoc,
isLower_, isIdentChar, isOperChar, isConIdent,
dummyIdent, isDummyIdent,
+ slocIdent,
+ headIdent,
unQualIdent,
unQualString,
qualOf,
@@ -16,21 +18,42 @@
SLoc(..), noSLoc,
showSLoc,
) where
+import Prelude(); import MHSPrelude hiding(head)
import Data.Char
import Text.PrettyPrint.HughesPJLite
import GHC.Stack
import MicroHs.List(dropEnd)
+import Data.Text(Text, pack, unpack, append, head)
+import Compat
+
+{-
+-- Uncomment this section, and comment out the two lines above
+-- to use String instead of Text.
+type Text = String
+pack :: String -> Text
+pack x = x
+unpack :: Text -> String
+unpack x = x
+append :: Text -> Text -> Text
+append = (++)
+head :: Text -> Char
+head (c:_) = c
+head _ = undefined
+appendDot :: Text -> Text -> Text
+appendDot x y = x ++ ('.':y)
+-}
+
type Line = Int
type Col = Int
-data SLoc = SLoc !FilePath !Line !Col
+data SLoc = SLoc FilePath Line Col
-- deriving (Eq)
instance Show SLoc where
show (SLoc f l c) = show f ++ "," ++ show l ++ ":" ++ show c
-data Ident = Ident !SLoc String
+data Ident = Ident SLoc Text
--deriving (Show)
instance Eq Ident where
@@ -46,36 +69,41 @@
instance Show Ident where
show = showIdent
+slocIdent :: Ident -> SLoc
+slocIdent (Ident l _) = l
+
noSLoc :: SLoc
noSLoc = SLoc "" 0 0
mkIdent :: String -> Ident
-mkIdent = Ident noSLoc
+mkIdent = mkIdentSLoc noSLoc
mkIdentSLoc :: SLoc -> String -> Ident
-mkIdentSLoc = Ident
+mkIdentSLoc l = Ident l . pack
unIdent :: Ident -> String
-unIdent (Ident _ s) = s
+unIdent (Ident _ s) = unpack s
setSLocIdent :: SLoc -> Ident -> Ident
setSLocIdent l (Ident _ s) = Ident l s
showIdent :: Ident -> String
-showIdent (Ident _ i) = i
+showIdent (Ident _ i) = unpack i
ppIdent :: Ident -> Doc
-ppIdent (Ident _ i) = text i
+ppIdent (Ident _ i) = text $ unpack i
isIdent :: String -> Ident -> Bool
-isIdent s (Ident _ i) = s == i
+isIdent s (Ident _ i) = pack s == i
qualIdent :: HasCallStack =>
Ident -> Ident -> Ident
-qualIdent (Ident _ qi) (Ident loc i) = Ident loc (qi ++ "." ++ i)
+qualIdent (Ident _ qi) (Ident loc i) =
+ -- Ident loc (qi `append` "." `append` i)
+ Ident loc (qi `appendDot` i)
addIdentSuffix :: Ident -> String -> Ident
-addIdentSuffix (Ident loc i) s = Ident loc (i ++ s)
+addIdentSuffix (Ident loc i) s = Ident loc (i `append` pack s)
unQualString :: HasCallStack =>
String -> String
@@ -90,22 +118,47 @@
s
unQualIdent :: Ident -> Ident
-unQualIdent (Ident l s) = Ident l (unQualString s)
+unQualIdent (Ident l s) = Ident l (pack $ unQualString $ unpack s)
qualOf :: Ident -> Ident
-qualOf (Ident loc s) = Ident loc (dropEnd (length (unQualString s) + 1) s)
+qualOf (Ident loc s) = Ident loc (pack $ dropEnd (length (unQualString s') + 1) s')
+ where s' = unpack s
+headIdent :: Ident -> Char
+headIdent (Ident _ i) = head i
+
isConIdent :: Ident -> Bool
-isConIdent (Ident _ i) =
- let
- c = head i
- in isUpper c || c == ':' || c == ',' || i == "[]" || i == "()"
+isConIdent i@(Ident _ t) =
+ let c = headIdent i
+ in isUpper c || c == ':' || c == ',' || t == pack "[]" || t == pack "()" || t == pack "->"
isOperChar :: Char -> Bool
-isOperChar c = elem c operChars
- where operChars :: String
- operChars = "@\\=+-:<>.!#$%^&*/|~?\x2237\x21d2\x2192\x2190\x2200"
--- :: => -> <- forall
+isOperChar '@' = True
+isOperChar '\\' = True
+isOperChar '=' = True
+isOperChar '+' = True
+isOperChar '-' = True
+isOperChar ':' = True
+isOperChar '<' = True
+isOperChar '>' = True
+isOperChar '.' = True
+isOperChar '!' = True
+isOperChar '#' = True
+isOperChar '$' = True
+isOperChar '%' = True
+isOperChar '^' = True
+isOperChar '&' = True
+isOperChar '*' = True
+isOperChar '/' = True
+isOperChar '|' = True
+isOperChar '~' = True
+isOperChar '?' = True
+isOperChar '\x2237' = True -- ::
+isOperChar '\x21d2' = True -- =>
+isOperChar '\x2192' = True -- ->
+isOperChar '\x2190' = True -- <-
+isOperChar '\x2200' = True -- forall
+isOperChar _ = False
isIdentChar :: Char -> Bool
isIdentChar c = isLower_ c || isUpper c || isDigit c || c == '\''
@@ -117,8 +170,7 @@
dummyIdent = mkIdent "_"
isDummyIdent :: Ident -> Bool
-isDummyIdent (Ident _ "_") = True
-isDummyIdent _ = False
+isDummyIdent (Ident _ s) = s == pack "_"
showSLoc :: SLoc -> String
showSLoc (SLoc fn l c) =
--- a/src/MicroHs/IdentMap.hs
+++ b/src/MicroHs/IdentMap.hs
@@ -11,11 +11,12 @@
fromListWith, fromList,
delete,
lookup,
+ null,
size,
toList, elems, keys,
mapM,
) where
-import Prelude hiding(lookup, mapM)
+import Prelude(); import MHSPrelude hiding(lookup, mapM, null)
import MicroHs.Ident
data Map a
@@ -69,6 +70,10 @@
size (One _ _) = 1
size (Node _ s _ _ _) = s
+null :: forall a . Map a -> Bool
+null Nil = True
+null _ = False
+
node :: forall a . Map a -> Ident -> a -> Map a -> Map a
node Nil key val Nil = One key val
node left key val right = Node left (size left + 1 + size right) key val right
@@ -78,9 +83,10 @@
where
look Nil = Nothing
look (One key val) =
- case compare k key of
- EQ -> Just val
- _ -> Nothing
+ if k == key then
+ Just val
+ else
+ Nothing
look (Node left _ key val right) =
case k `compare` key of
LT -> look left
--- a/src/MicroHs/Instances.hs
+++ b/src/MicroHs/Instances.hs
@@ -2,6 +2,7 @@
-- See LICENSE file for full license.
module MicroHs.Instances(compiledWithGHC) where
-- For GHC compatibility
+import Prelude(); import MHSPrelude
import MicroHs.CompileCache
import MicroHs.Ident
import MicroHs.Exp
--- a/src/MicroHs/IntMap.hs
+++ b/src/MicroHs/IntMap.hs
@@ -4,7 +4,7 @@
IntMap,
empty, lookup, insert, fromList, toList, insertWith, (!), keys
) where
-import Prelude hiding(lookup)
+import Prelude(); import MHSPrelude hiding(lookup)
data IntMap a
= Empty
@@ -12,6 +12,7 @@
| Node (IntMap a) (IntMap a) (IntMap a) (IntMap a)
--Xderiving (Show)
+{-
-- This works for y>0
divModX :: Int -> Int -> (Int, Int)
divModX x y =
@@ -23,7 +24,13 @@
(q, r)
else
(q - 1, r + y)
+-}
+div4 :: Int -> Int
+div4 i = {-if i < 0 then error "div4" else-} i `quot` 4
+mod4 :: Int -> Int
+mod4 i = {-if i < 0 then error "mod4" else-} i `rem` 4
+
empty :: forall a . IntMap a
empty = Empty
@@ -34,10 +41,11 @@
Leaf i a -> if k == i then Just a else Nothing
Node m0 m1 m2 m3 ->
let
- (d, m) = divModX k 4
- in if m == 0 then lookup d m0
- else if m == 1 then lookup d m1
- else if m == 2 then lookup d m2
+ d = div4 k
+ m = mod4 k
+ in if 0 == m then lookup d m0
+ else if 1 == m then lookup d m1
+ else if 2 == m then lookup d m2
else lookup d m3
insert :: forall a . Int -> a -> IntMap a -> IntMap a
@@ -85,12 +93,24 @@
if k == i then
Leaf k (comb a b)
else
- ins k $ insert i b $ Node Empty Empty Empty Empty
+ ins k $ single i b
Node m0 m1 m2 m3 ->
let
- (d, m) = divModX k 4
- in if m == 0 then Node (ins d m0) m1 m2 m3
- else if m == 1 then Node m0 (ins d m1) m2 m3
- else if m == 2 then Node m0 m1 (ins d m2) m3
+ d = div4 k
+ m = mod4 k
+ in if 0 == m then Node (ins d m0) m1 m2 m3
+ else if 1 == m then Node m0 (ins d m1) m2 m3
+ else if 2 == m then Node m0 m1 (ins d m2) m3
else Node m0 m1 m2 (ins d m3)
in ins ak
+
+single :: Int -> a -> IntMap a
+single k a = --insert k a $ Node Empty Empty Empty Empty
+ let
+ m = mod4 k
+ d = div4 k
+ l = Leaf d a
+ in if 0 == m then Node l Empty Empty Empty
+ else if 1 == m then Node Empty l Empty Empty
+ else if 2 == m then Node Empty Empty l Empty
+ else Node Empty Empty Empty l
--- a/src/MicroHs/IntSet.hs
+++ b/src/MicroHs/IntSet.hs
@@ -4,6 +4,7 @@
IntSet,
empty, member, insert, fromList, toList
) where
+import Prelude(); import MHSPrelude
import qualified MicroHs.IntMap as M
newtype IntSet = I (M.IntMap ())
--- a/src/MicroHs/Interactive.hs
+++ b/src/MicroHs/Interactive.hs
@@ -1,4 +1,5 @@
module MicroHs.Interactive(module MicroHs.Interactive) where
+import Prelude(); import MHSPrelude
import Data.List
import Data.Maybe
import Data.Version
--- a/src/MicroHs/Lex.hs
+++ b/src/MicroHs/Lex.hs
@@ -2,9 +2,10 @@
Token(..), showToken,
tokensLoc,
LexState, lexTopLS,
- popLayout, lex
+ popLayout, lex,
+ readInt,
) where
-import Prelude hiding(lex)
+import Prelude(); import MHSPrelude hiding(lex)
import Data.Char
import Data.List
import MicroHs.Ident
@@ -26,7 +27,7 @@
| TBrace SLoc -- {n} in the Haskell report
| TIndent SLoc -- <n> in the Haskell report
| TPragma SLoc String -- a {-# PRAGMA #-}
- | TEnd
+ | TEnd SLoc
| TRaw [Token]
deriving (Show)
@@ -43,14 +44,14 @@
showToken (TBrace _) = "TBrace"
showToken (TIndent _) = "TIndent"
showToken (TPragma _ s) = "{-# " ++ s ++ " #-}"
-showToken TEnd = "EOF"
+showToken (TEnd _) = "EOF"
showToken (TRaw _) = "TRaw"
incrLine :: SLoc -> SLoc
-incrLine (SLoc f l _) = SLoc f (l+1) 1
+incrLine (SLoc f l _) = let l' = l+1 in seq l' (SLoc f l' 1)
addCol :: SLoc -> Int -> SLoc
-addCol (SLoc f l c) i = SLoc f l (c + i)
+addCol (SLoc f l c) i = let c' = c+i in seq c' (SLoc f l c')
tabCol :: SLoc -> SLoc
tabCol (SLoc f l c) = SLoc f l (((c + 7) `quot` 8) * 8)
@@ -85,8 +86,20 @@
lex loc cs@(d:_) | isDigit d = number loc cs
lex loc ('.':cs@(d:_)) | isLower_ d =
TSpec loc '.' : lex (addCol loc 1) cs
-lex loc (c:cs@(d:_)) | (c == '!' || c == '~') && (d == '(' || d == '[' || isIdentChar d) = -- XXX hacky way to make ~ a TSpec
- TSpec loc c : lex (addCol loc 1) cs
+-- Recognize #line 123 "file/name.hs"
+lex loc ('#':xcs) | (SLoc _ _ 1) <- loc, Just cs <- stripPrefix "line " xcs =
+ case span (/= '\n') cs of
+ (line, rs) -> -- rs will contain the '\n', so subtract 1 below
+ let ws = words line
+ file = tail $ init $ ws!!1 -- strip the initial and final '"'
+ loc' = SLoc file (readInt (ws!!0) - 1) 1
+ in lex loc' rs
+lex loc ('!':' ':cs) = -- ! followed by a space is always an operator
+ TIdent loc [] "!" : lex (addCol loc 2) cs
+lex loc (c:cs@(d:_)) | isSpecSing c && not (isOperChar d) = -- handle reserved
+ TSpec loc c :
+ let ts = lex (addCol loc 1) cs
+ in if c == '\\' then tLam ts else ts
lex loc (d:cs) | isOperChar d =
case span isOperChar cs of
(ds, rs) -> TIdent loc [] (d:ds) : lex (addCol loc $ 1 + length ds) rs
@@ -100,7 +113,7 @@
in case takeChars loc tchar '\'' (addCol loc 1) [] cs of -- XXX head of
(t, loc', rs) -> t : lex loc' rs
lex loc (d:_) = [TError loc $ "Unrecognized input: " ++ show d]
-lex _ [] = []
+lex loc [] = [TEnd loc]
nested :: SLoc -> [Char] -> [Token]
nested loc ('#':cs) = pragma loc cs
@@ -126,13 +139,13 @@
number loc cs =
case span isDigit cs of
(ds, rs) | null rs || not (head rs == '.') || (take 2 rs) == ".." ->
- let i = read ds
- in TInt loc i : lex (addCol loc $ length ds) rs
+ case expo rs of
+ Nothing -> TInt loc (readBase 10 ds) : lex (addCol loc $ length ds) rs
+ Just (es, rs') -> mkD (ds ++ es) rs'
| otherwise ->
case span isDigit (tail rs) of
(ns, rs') ->
let s = ds ++ '.':ns
- mkD x r = TRat loc (readRational x) : lex (addCol loc $ length x) r
in case expo rs' of
Nothing -> mkD s rs'
Just (es, rs'') -> mkD (s ++ es) rs''
@@ -141,6 +154,7 @@
expo (e:'+':xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e':'+':as, bs) where (as, bs) = span isDigit xs
expo (e: xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e': as, bs) where (as, bs) = span isDigit xs
expo _ = Nothing
+ mkD x r = TRat loc (readRational x) : lex (addCol loc $ length x) r
-- Skip a {- -} style comment
skipNest :: SLoc -> Int -> String -> [Token]
@@ -219,11 +233,30 @@
conv b k r (c:ds) | isHexDigit c, let { n = digitToInt c }, n < b = conv b (k+1) (r * b + n) ds
conv _ k r ds = (chr r, k, ds)
+-- These characters are single characters token, no matter what.
isSpec :: Char -> Bool
-isSpec c = elem c specChars
- where specChars :: String
- specChars = "()[],{}`;"
+isSpec '(' = True
+isSpec ')' = True
+isSpec '[' = True
+isSpec ']' = True
+isSpec '{' = True
+isSpec '}' = True
+isSpec ',' = True
+isSpec ';' = True
+isSpec '`' = True
+isSpec _ = False
+-- These characters are single characters token,
+-- if not part of an operator.
+isSpecSing :: Char -> Bool
+isSpecSing '=' = True
+isSpecSing '|' = True
+isSpecSing '\\' = True
+isSpecSing '@' = True
+isSpecSing '!' = True
+isSpecSing '~' = True
+isSpecSing _ = False
+
upperIdent :: SLoc -> SLoc -> [String] -> String -> [Token]
--upperIdent l c qs acs | trace (show (l, c, qs, acs)) False = undefined
upperIdent loc sloc qs acs =
@@ -240,17 +273,27 @@
}
_ -> TIdent sloc (reverse qs) ds : lex (addCol loc $ length ds) rs
+-- For LambdaCase
+tLam :: [Token] -> [Token]
+tLam (t@(TIdent _ [] "case") : ts) = t : tBrace ts
+tLam ts = ts
+
tIdent :: SLoc -> [String] -> String -> [Token] -> [Token]
tIdent loc qs kw ats | elem kw ["let", "where", "do", "of"]
+ || kw == "if" && isBar ats -- For MultiWayIf
= ti : tBrace ats
| otherwise = ti : ats
where
+ isBar (TSpec _ '|' : _) = True
+ isBar _ = False
+
ti = TIdent loc qs kw
- tBrace ts@(TSpec _ '{' : _) = ts
- tBrace ts@(TIndent _ : TSpec _ '{' : _) = ts
- tBrace (TIndent _ : ts) = TBrace (tokensLoc ts) : ts
- tBrace ts = TBrace (tokensLoc ts) : ts
+tBrace :: [Token] -> [Token]
+tBrace ts@(TSpec _ '{' : _) = ts
+tBrace ts@(TIndent _ : TSpec _ '{' : _) = ts
+tBrace (TIndent _ : ts) = TBrace (tokensLoc ts) : ts
+tBrace ts = TBrace (tokensLoc ts) : ts
tokensLoc :: [Token] -> SLoc
tokensLoc (TIdent loc _ _:_) = loc
@@ -263,11 +306,15 @@
tokensLoc (TBrace loc :_) = loc
tokensLoc (TIndent loc :_) = loc
tokensLoc (TPragma loc _ :_) = loc
+tokensLoc (TEnd loc :_) = loc
tokensLoc _ = mkLocEOF
readBase :: Integer -> String -> Integer
readBase b = foldl (\ r c -> r * b + toInteger (digitToInt c)) 0
+readInt :: String -> Int
+readInt = fromInteger . readBase 10
+
-- XXX This is a pretty hacky recognition of pragmas.
pragma :: SLoc -> [Char] -> [Token]
pragma loc cs =
@@ -298,8 +345,9 @@
layoutLS ts ms Raw = (TRaw ts, LS $ layoutLS ts ms )
layoutLS ts mms Pop =
case (mms, ts) of
- (m:ms,_:_) | m/=0 -> ( TEnd, LS $ layoutLS ts ms )
+ (m:ms,_:_) | m/=0 -> (TEnd (tokensLoc ts), LS $ layoutLS ts ms )
_ -> (TError l "syntax error", LS $ layoutLS [] [] ) where l = tokensLoc ts
+-- The rest are the Next commands
layoutLS tts@(TIndent x : ts) mms@(m : ms) _ | n == m = (TSpec (tokensLoc ts) ';', LS $ layoutLS ts mms )
| n < m = (TSpec (tokensLoc ts) '>', LS $ layoutLS tts ms ) where {n = getCol x}
layoutLS (TIndent _ : ts) ms _ = layoutLS ts ms Next
@@ -309,9 +357,10 @@
layoutLS (t@(TSpec _ '}') : ts) (0 : ms) _ = ( t, LS $ layoutLS ts ms )
layoutLS ( (TSpec l '}') : _) _ _ = (TError l "layout error }",LS $ layoutLS [] [] )
layoutLS (t@(TSpec _ '{') : ts) ms _ = ( t, LS $ layoutLS ts (0:ms))
+layoutLS ts@(t@(TEnd _) : _) [] _ = ( t, LS $ layoutLS ts [] ) -- repeat the TEnd token
+layoutLS ts@(TEnd l : _) (_ : ms) _ = (TSpec l '>' , LS $ layoutLS ts ms ) -- insert '>' and try again
layoutLS (t : ts) ms _ = ( t, LS $ layoutLS ts ms )
-layoutLS [] (_ : ms) _ = (TSpec mkLocEOF '>' , LS $ layoutLS [] ms )
-layoutLS [] [] _ = (TEnd , LS $ layoutLS [] [] )
+layoutLS [] _ _ = error "layoutLS"
instance TokenMachine LexState Token where
tmNextToken (LS f) = f Next
@@ -336,6 +385,7 @@
lexTopLS :: FilePath -> String -> LexState
lexTopLS f s = LS $ layoutLS (lexStart $ lex (SLoc f 1 1) s) []
+ -- error $ show $ map showToken $ lex (SLoc f 1 1) s
-----------
@@ -350,16 +400,16 @@
(ds1, cr1) | ('.':r1) <- cr1 -> rat2 f1 r1
| (c:r1) <- cr1, toLower c == 'e' -> rat3 f1 r1
| otherwise -> f1
- where f1 = toRational (read ds1 :: Integer)
+ where f1 = toRational (readBase 10 ds1)
rat2 f1 s2 =
case span isDigit s2 of
(ds2, cr2) | (c:r2) <- cr2, toLower c == 'e' -> rat3 f2 r2
| otherwise -> f2
- where f2 = f1 + toRational (read ds2 :: Integer) * 10 ^^ (negate $ length ds2)
+ where f2 = f1 + toRational (readBase 10 ds2) * 10 ^^ (negate $ length ds2)
rat3 f2 ('+':s) = f2 * expo s
rat3 f2 ('-':s) = f2 / expo s
rat3 f2 s = f2 * expo s
- expo s = 10 ^ (read s :: Int)
+ expo s = 10 ^ (readBase 10 s)
--- a/src/MicroHs/List.hs
+++ b/src/MicroHs/List.hs
@@ -1,6 +1,7 @@
-- Copyright 2023 Lennart Augustsson
-- See LICENSE file for full license.
module MicroHs.List where
+import Prelude(); import MHSPrelude
import Data.List
-- Various useful list functions.
--- a/src/MicroHs/Main.hs
+++ b/src/MicroHs/Main.hs
@@ -2,6 +2,7 @@
-- See LICENSE file for full license.
{-# OPTIONS_GHC -Wno-unused-do-bind -Wno-unused-imports #-}
module MicroHs.Main(main) where
+import Prelude(); import MHSPrelude
import Data.Char
import Data.List
import Data.Version
@@ -15,6 +16,7 @@
import MicroHs.FFI
import MicroHs.Flags
import MicroHs.Ident
+import MicroHs.Lex(readInt)
import MicroHs.List
import MicroHs.Package
import MicroHs.Translate
@@ -53,7 +55,7 @@
Nothing ->
if installPkg flags then mainInstallPackage flags mdls else
withArgs rargs $ do
- when (verbosityGT flags 0) $
+ when (verbosityGT flags 1) $
putStrLn $ "flags = " ++ show flags
case mdls of
[] -> mainInteractive flags
@@ -61,7 +63,7 @@
_ -> error usage
usage :: String
-usage = "Usage: mhs [--version] [--numeric-version] [-v] [-q] [-l] [-r] [-C[R|W]] [-XCPP] [-Ddef] [-T] [-z] [-iPATH] [-oFILE] [-a[PATH]] [-LPATH] [-PPKG] [-Q PKG [DIR]] [-tTARGET] [ModuleName...]"
+usage = "Usage: mhs [--version] [--numeric-version] [-v] [-q] [-l] [-r] [-C[R|W]] [-XCPP] [-Ddef] [-IPATH] [-T] [-z] [-iPATH] [-oFILE] [-a[PATH]] [-LPATH] [-PPKG] [-Q PKG [DIR]] [-tTARGET] [ModuleName...]"
-- Drop trailing '/foo'
dropTrailing :: Int -> FilePath -> FilePath
@@ -86,6 +88,8 @@
"-Q" -> decodeArgs f{installPkg = True} mdls args
'-':'i':[] -> decodeArgs f{paths = []} mdls args
'-':'i':s -> decodeArgs f{paths = paths f ++ [s]} mdls args
+ '-':'o':[] | s : args' <- args
+ -> decodeArgs f{output = s} mdls args'
'-':'o':s -> decodeArgs f{output = s} mdls args
'-':'t':s -> decodeArgs f{target = s} mdls args
'-':'D':_ -> decodeArgs f{cppArgs = cppArgs f ++ [arg]} mdls args
@@ -95,7 +99,10 @@
'-':'a':s -> decodeArgs f{pkgPath = s : pkgPath f} mdls args
'-':'L':s -> decodeArgs f{listPkg = Just s} mdls args
'-':_ -> error $ "Unknown flag: " ++ arg ++ "\n" ++ usage
- _ -> decodeArgs f (mdls ++ [arg]) args
+ _ | ".c" `isSuffixOf` arg || ".o" `isSuffixOf` arg || ".a" `isSuffixOf` arg
+ -> decodeArgs f{cArgs = cArgs f ++ [arg]} mdls args
+ | otherwise
+ -> decodeArgs f (mdls ++ [arg]) args
readTargets :: Flags -> FilePath -> IO [Target]
@@ -108,7 +115,7 @@
tgFile <- readFile tgFilePath
case parseTargets tgFilePath tgFile of
Left e -> do
- putStrLn $ "Can't read " ++ tgFilePath
+ putStrLn $ "Cannot parse " ++ tgFilePath
when (verbose flags > 0) $
putStrLn e
return []
@@ -156,9 +163,13 @@
, pkgExported = exported, pkgOther = other
, pkgDepends = pkgDeps }
--print (map tModuleName $ pkgOther pkg)
+ t1 <- getTimeMilli
when (verbose flags > 0) $
putStrLn $ "Writing package " ++ namever ++ " to " ++ output flags
writeSerializedCompressed (output flags) pkg
+ t2 <- getTimeMilli
+ when (verbose flags > 0) $
+ putStrLn $ "Compression time " ++ show (t2 - t1) ++ " ms"
splitNameVer :: String -> (String, Version)
splitNameVer s =
@@ -165,11 +176,16 @@
case span (\ c -> isDigit c || c == '.') (reverse s) of
(rver, '-':rname) | is@(_:_) <- readVersion (reverse rver) -> (reverse rname, makeVersion is)
_ -> error $ "package name not of the form name-version:" ++ show s
- where readVersion = map read . words . map (\ c -> if c == '.' then ' ' else c)
+ where readVersion = map readInt . words . map (\ c -> if c == '.' then ' ' else c)
mainListPkg :: Flags -> FilePath -> IO ()
mainListPkg _flags pkgfn = do
pkg <- readSerialized pkgfn
+ putStrLn $ "name: " ++ showIdent (pkgName pkg)
+ putStrLn $ "version: " ++ showVersion (pkgVersion pkg)
+ putStrLn $ "compiler: mhs-" ++ pkgCompiler pkg
+ putStrLn $ "depends: " ++ unwords (map (\ (i, v) -> showIdent i ++ "-" ++ showVersion v) (pkgDepends pkg))
+
let list = mapM_ (putStrLn . (" " ++) . showIdent . tModuleName)
putStrLn "exposed-modules:"
list (pkgExported pkg)
@@ -178,11 +194,11 @@
mainCompile :: Flags -> Ident -> IO ()
mainCompile flags mn = do
- (rmn, allDefs) <- do
+ (cash, (rmn, allDefs)) <- do
cash <- getCached flags
(rds, _, cash') <- compileCacheTop flags mn cash
maybeSaveCache flags cash'
- return rds
+ return (cash', rds)
t1 <- getTimeMilli
let
@@ -225,8 +241,20 @@
ct1 <- getTimeMilli
mcc <- lookupEnv "MHSCC"
let dir = mhsdir flags
+ ppkgs = map fst $ getPathPkgs cash
+ incDirs = map (convertToInclude "/include") ppkgs
+ cDirs = map (convertToInclude "/cbits") ppkgs
+ incDirs' <- filterM doesDirectoryExist incDirs
+ cDirs' <- filterM doesDirectoryExist cDirs
+ --print (map fst $ getPathPkgs cash, incDirs, incDirs')
+ let incs = unwords $ map ("-I" ++) incDirs'
TTarget _ compiler conf <- readTarget flags dir
- let cc = fromMaybe (compiler ++ " -w -Wall -O3 -I" ++ dir ++ "/src/runtime " ++ dir ++ "/src/runtime/eval-" ++ conf ++ ".c " ++ " $IN -lm -o $OUT") mcc
+ let dcc = compiler ++ " -w -Wall -O3 -I" ++ dir ++ "/src/runtime " ++
+ incs ++ " " ++ dir ++ "/src/runtime/eval-" ++ conf ++ ".c " ++
+ unwords (cArgs flags) ++
+ unwords (map (++ "/*.c") cDirs') ++
+ " $IN -lm -o $OUT"
+ cc = fromMaybe dcc mcc
cmd = substString "$IN" fn $ substString "$OUT" outFile cc
when (verbosityGT flags 0) $
putStrLn $ "Execute: " ++ show cmd
@@ -261,11 +289,14 @@
first:_ -> mainInstallPackage flags [pkgfn, first]
mainInstallPackage _ _ = error usage
------------------
-
-getMhsDir :: IO FilePath
-getMhsDir = do
- md <- lookupEnv "MHSDIR"
- case md of
- Just d -> return d
- Nothing -> getDataDir
+-- Convert something like
+-- .../.mcabal/mhs-0.10.3.0/packages/base-0.10.3.0.pkg
+-- into
+-- .../.mcabal/mhs-0.10.3.0/data/base-0.10.3.0/include
+convertToInclude :: String -> FilePath -> FilePath
+convertToInclude inc pkgPath =
+ let path1 = init $ dropWhileEnd (/= '/') pkgPath -- .../.mcabal/mhs-0.10.3.0/packages
+ base1 = takeWhileEnd (/= '/') pkgPath -- base-0.10.3.0.pkg
+ base2 = init $ dropWhileEnd (/= '.') base1 -- base-0.10.3.0
+ path2 = dropWhileEnd (/= '/') path1 -- .../.mcabal/mhs-0.10.3.0/
+ in path2 ++ "data/" ++ base2 ++ inc -- .../.mcabal/mhs-0.10.3.0/data/base-0.10.3.0/include
--- a/src/MicroHs/MakeCArray.hs
+++ b/src/MicroHs/MakeCArray.hs
@@ -1,6 +1,7 @@
-- Copyright 2023 Lennart Augustsson
-- See LICENSE file for full license.
module MicroHs.MakeCArray(makeCArray) where
+import Prelude(); import MHSPrelude
import Data.Char
import MicroHs.Flags
import qualified System.Compress as C
--- a/src/MicroHs/Package.hs
+++ b/src/MicroHs/Package.hs
@@ -2,6 +2,7 @@
IdentPackage,
Package(..),
) where
+import Prelude(); import MHSPrelude
import Data.Version
import MicroHs.Desugar(LDef)
import MicroHs.Ident(Ident)
--- a/src/MicroHs/Parse.hs
+++ b/src/MicroHs/Parse.hs
@@ -2,6 +2,7 @@
-- See LICENSE file for full license.
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns -Wno-unused-do-bind #-}
module MicroHs.Parse(P, pTop, pTopModule, parseDie, parse, pExprTop, keywords) where
+import Prelude(); import MHSPrelude
import Control.Applicative
import Control.Monad
import Data.Char
@@ -43,8 +44,8 @@
eof = do
t <- nextToken
case t of
- TEnd -> pure ()
- _ -> fail "eof"
+ TEnd _ -> pure ()
+ _ -> fail "eof"
pTop :: P EModule
pTop = (pModule <|< pModuleEmpty) <* eof
@@ -170,6 +171,8 @@
pQSymOper = do
let
is (TIdent loc qs s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (qualName loc qs s)
+ is (TSpec loc '!') = Just (mkIdentSLoc loc "!")
+ is (TSpec loc '~') = Just (mkIdentSLoc loc "~")
is _ = Nothing
satisfyM "QSymOper" is
@@ -177,6 +180,7 @@
pSymOper = do
let
is (TIdent loc [] s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (mkIdentSLoc loc s)
+ is (TSpec loc '!') = Just (mkIdentSLoc loc "!")
is _ = Nothing
satisfyM "SymOper" is
@@ -184,7 +188,7 @@
pUQSymOper = guardM pQSymOper isUOper
isUOper :: Ident -> Bool
-isUOper = (== ':') . head . unIdent
+isUOper = (== ':') . headIdent
pUSymOper :: P Ident
pUSymOper = guardM pSymOper isUOper
@@ -209,7 +213,7 @@
pLSymOper = guardM pSymOper (not . isUOper)
reservedOps :: [String]
-reservedOps = ["=", "|", "::", "<-", "@", "..", "->",
+reservedOps = ["::", "<-", "..", "->",
"\x2237", "\x2192"] -- :: and ->
pUQIdentSym :: P Ident
@@ -278,9 +282,9 @@
as <- p
pSpec '}'
pure as
- <|>
+ <|<
do
- pSpec '<'
+ pSpec '<' -- synthetic '{' (i.e., layout)
as <- p
-- If we are at a '>' token (i.e., synthetic '}') then
-- all is well, if not then there is a parse error and we try
@@ -301,12 +305,13 @@
pDef :: P EDef
pDef =
uncurry Data <$> (pKeyword "data" *> pData) <*> pDeriving
- <|< Newtype <$> (pKeyword "newtype" *> pLHS) <*> (pSymbol "=" *> (Constr [] [] <$> pUIdentSym <*> pField)) <*> pDeriving
- <|< Type <$> (pKeyword "type" *> pLHS) <*> (pSymbol "=" *> pType)
+ <|< Newtype <$> (pKeyword "newtype" *> pLHS) <*> (pSpec '=' *> (Constr [] [] <$> pUIdentSym <*> pField)) <*> pDeriving
+ <|< Type <$> (pKeyword "type" *> pLHS) <*> (pSpec '=' *> pType)
<|< uncurry Fcn <$> pEqns
<|< Sign <$> ((esepBy1 pLIdentSym (pSpec ',')) <* dcolon) <*> pType
<|< Import <$> (pKeyword "import" *> pImportSpec)
- <|< ForImp <$> (pKeyword "foreign" *> pKeyword "import" *> pKeyword "ccall" *> eoptional pString) <*> pLIdent <*> (pSymbol "::" *> pType)
+ <|< ForImp <$> (pKeyword "foreign" *> pKeyword "import" *> (pKeyword "ccall" <|> pKeyword "capi")
+ *> eoptional (pKeyword "unsafe") *> eoptional pString) <*> pLIdent <*> (pSymbol "::" *> pType)
<|< Infix <$> ((,) <$> pAssoc <*> pPrec) <*> esepBy1 pTypeOper (pSpec ',')
<|< Class <$> (pKeyword "class" *> pContext) <*> pLHS <*> pFunDeps <*> pWhere pClsBind
<|< Instance <$> (pKeyword "instance" *> pType) <*> pWhere pInstBind
@@ -320,12 +325,12 @@
dig _ = Nothing
pPrec = satisfyM "digit" dig
- pFunDeps = (pSymbol "|" *> esepBy1 pFunDep (pSpec ',')) <|< pure []
+ pFunDeps = (pSpec '|' *> esepBy1 pFunDep (pSpec ',')) <|< pure []
pFunDep = (,) <$> esome pLIdent <*> (pSRArrow *> esome pLIdent)
pField = guardM pFields ((== 1) . either length length)
dcolon = pSymbol "::" <|< pSymbol "\x2237"
- pPatternDef = (pSymbol "=" *> pPatAndExp) <|< (pSymbol "<-" *> pPat)
+ pPatternDef = (pSpec '=' *> pPatAndExp) <|< (pSymbol "<-" *> pPat)
pPatAndExp = do p <- pPat; guard (isExp p); pure p
-- Is a pattern also an expression?
@@ -340,7 +345,7 @@
pData :: P (LHS, [Constr])
pData = do
lhs <- pLHS
- let pConstrs = pSymbol "=" *> esepBy1 pConstr (pSymbol "|")
+ let pConstrs = pSpec '=' *> esepBy1 pConstr (pSpec '|')
((,) lhs <$> pConstrs)
<|< pGADT lhs
<|< pure (lhs, [])
@@ -393,20 +398,26 @@
pConstr :: P Constr
pConstr = (Constr <$> pForall <*> pContext <*> pUIdentSym <*> pFields)
- <|< ((\ vs ct t1 c t2 -> Constr vs ct c (Left [t1, t2])) <$>
- pForall <*> pContext <*> pSAType <*> pUSymOper <*> pSAType)
+ <|> ((\ vs ct t1 c t2 -> Constr vs ct c (Left [t1, t2])) <$> -- <|> needed
+ pForall <*> pContext <*> pSTypeApp <*> pUSymOper <*> pSTypeApp)
+
pFields :: P (Either [SType] [(Ident, SType)])
pFields = Left <$> emany pSAType
+ -- The <|> is needed because 'emany' can be empty.
<|> Right <$> (pSpec '{' *> (concatMap flat <$> esepBy ((,) <$> (esepBy1 pLIdentSym (pSpec ',') <* pSymbol "::") <*> pSType) (pSpec ',') <* pSpec '}'))
where flat (is, t) = [ (i, t) | i <- is ]
+-- XXX This is a mess.
pSAType :: P (Bool, EType)
pSAType = (,) <$> pStrict <*> pAType
pSType :: P (Bool, EType)
pSType = (,) <$> pStrict <*> pType
pSTypeApp :: P (Bool, EType)
-pSTypeApp = (,) <$> pStrict <*> pTypeApp
+pSTypeApp = do
+ s <- pStrict
+ t <- if s then pAType else pTypeApp
+ pure (s, t)
pStrict :: P Bool
pStrict = (True <$ pSpec '!') <|< pure False
@@ -421,7 +432,7 @@
pQual = True <$ pKeyword "qualified"
-- the 'qualified' can occur before or after the module name
pQId = ((,) <$> pQual <*> pUQIdentA)
- <|< ((\ a b -> (b,a)) <$> pUQIdentA <*> (pQual <|> pure False))
+ <|< ((\ a b -> (b,a)) <$> pUQIdentA <*> (pQual <|< pure False))
imp a (b, c) = ImportSpec a b c
in imp <$> pSource <*> pQId <*> eoptional (pKeyword "as" *> pUQIdent) <*>
eoptional ((,) <$> ((True <$ pKeyword "hiding") <|< pure False) <*> pParens (esepEndBy pImportItem (pSpec ',')))
@@ -437,7 +448,7 @@
pConList :: P (Maybe [Ident])
pConList =
(Nothing <$ pSymbol "..")
- <|< (Just <$> esepBy1 (pQIdent <|> pParens pSymOper) (pSpec ','))
+ <|< (Just <$> esepBy (pQIdent <|< pParens pSymOper) (pSpec ','))
--------
-- Types
@@ -458,7 +469,7 @@
pType = do
vs <- pForall
t <- pTypeOp
- pure $ if null vs then t else EForall vs t
+ pure $ if null vs then t else EForall True vs t
pForall :: P [IdKind]
pForall = (forallKW *> esome pIdKind <* pSymbol ".") <|< pure []
@@ -477,10 +488,7 @@
pTypeApp = do
f <- pAType
as <- emany pAType
- mt <- eoptional (pSymbol "::" *> pType)
- let
- r = foldl EApp f as
- pure $ maybe r (ESign r) mt
+ pure $ foldl EApp f as
pAType :: P Expr
pAType =
@@ -502,7 +510,7 @@
pAPat =
(do
i <- pLIdentSym
- (EAt i <$> (pSymbol "@" *> pAPat)) <|< pure (EVar i)
+ (EAt i <$> (pSpec '@' *> pAPat)) <|< pure (EVar i)
)
<|< (evar <$> pUQIdentSym <*> optional pUpdate)
<|< pLit
@@ -528,10 +536,7 @@
f <- pAPat
as <- emany pAPat
guard (null as || isPConApp f)
- mt <- eoptional (pSymbol "::" *> pType)
- let
- r = foldl EApp f as
- pure $ maybe r (ESign r) mt
+ pure $ foldl EApp f as
pPatNotVar :: P EPat
pPatNotVar = guardM pPat isPConApp
@@ -552,7 +557,7 @@
pEqn :: (Ident -> Int -> Bool) -> P (Ident, Eqn)
pEqn test = do
(name, pats) <- pEqnLHS
- alts <- pAlts (pSymbol "=")
+ alts <- pAlts (pSpec '=')
guard (test name (length pats))
pure (name, Eqn pats alts)
@@ -575,9 +580,12 @@
pAltsL :: P () -> P [EAlt]
pAltsL sep =
- esome ((,) <$> (pSymbol "|" *> esepBy1 pStmt (pSpec ',')) <*> (sep *> pExpr))
+ esome (pAlt sep)
<|< ((\ e -> [([], e)]) <$> (sep *> pExpr))
+pAlt :: P () -> P EAlt
+pAlt sep = (,) <$> (pSpec '|' *> esepBy1 pStmt (pSpec ',')) <*> (sep *> pExpr)
+
pWhere :: P EBind -> P [EBind]
pWhere pb =
(pKeyword "where" *> pBlock pb)
@@ -605,14 +613,18 @@
pExprApp = do
f <- pAExpr
as <- emany pAExpr
- mt <- eoptional (pSymbol "::" *> pType)
- let
- r = foldl EApp f as
- pure $ maybe r (ESign r) mt
+ pure $ foldl EApp f as
pLam :: P Expr
-pLam = eLam <$> (pSymbol "\\" *> esome pAPat) <*> (pSRArrow *> pExpr)
+pLam =
+ pSpec '\\' *>
+ ( eLam <$> esome pAPat <*> (pSRArrow *> pExpr)
+ <|< eLamCase <$> (pKeyword "case" *> pBlock pCaseArm)
+ )
+eLamCase :: [ECaseArm] -> Expr
+eLamCase as = ELam [ Eqn [p] a | (p, a) <- as ]
+
pCase :: P Expr
pCase = ECase <$> (pKeyword "case" *> pExpr) <*> (pKeyword "of" *> pBlock pCaseArm)
@@ -623,10 +635,17 @@
pLet = ELet <$> (pKeyword "let" *> pBlock pBind) <*> (pKeyword "in" *> pExpr)
pDo :: P Expr
-pDo = EDo <$> ((Just <$> pQualDo) <|< (Nothing <$ pKeyword "do")) <*> pBlock pStmt
+pDo = do
+ q <- (Just <$> pQualDo) <|< (Nothing <$ pKeyword "do")
+ ss <- pBlock pStmt
+ guard (not (null ss))
+ pure (EDo q ss)
pIf :: P Expr
-pIf = EIf <$> (pKeyword "if" *> pExpr) <*> (pKeyword "then" *> pExpr) <*> (eoptional (pSpec ';') *> pKeyword "else" *> pExpr)
+pIf = EIf <$> (pKeyword "if" *> pExpr) <*>
+ (eoptional (pSpec ';') *> pKeyword "then" *> pExpr) <*>
+ (eoptional (pSpec ';') *> pKeyword "else" *> pExpr)
+ <|< EMultiIf <$> (EAlts <$> (pKeyword "if" *> pBlock (pAlt (pSymbol "->"))) <*> pure [])
pQualDo :: P Ident
pQualDo = do
@@ -659,7 +678,7 @@
where
pEField = do
fs <- (:) <$> pLIdentSym <*> many pSelect
- EField fs <$> (pSymbol "=" *> pExpr) <|< pure (EFieldPun fs)
+ EField fs <$> (pSpec '=' *> pExpr) <|< pure (EFieldPun fs)
<|<
(EFieldWild <$ pSymbol "..")
@@ -673,8 +692,8 @@
<|< pLit
<|< (eTuple <$> (pSpec '(' *> esepBy1 pExpr (pSpec ',') <* pSpec ')'))
<|< EListish <$> (pSpec '[' *> pListish <* pSpec ']')
- <|< (ESectL <$> (pSpec '(' *> pExprArg) <*> (pOperComma <* pSpec ')'))
- <|< (ESectR <$> (pSpec '(' *> pOperCommaNoMinus) <*> (pExprArg <* pSpec ')'))
+ <|< (ESectL <$> (pSpec '(' *> pExprOp) <*> (pOperComma <* pSpec ')'))
+ <|< (ESectR <$> (pSpec '(' *> pOperCommaNoMinus) <*> (pExprOp <* pSpec ')'))
<|< (ESelect <$> (pSpec '(' *> esome pSelect <* pSpec ')'))
<|< (ELit noSLoc . LPrim <$> (pKeyword "primitive" *> pString))
)
@@ -692,7 +711,7 @@
<|< (LFromThen e1 e2 <$ pSymbol "..")
<|< pure (LList [e1,e2])
(pSpec ',' *> pMore)
- <|< (LCompr e1 <$> (pSymbol "|" *> esepBy1 pStmt (pSpec ',')))
+ <|< (LCompr e1 <$> (pSpec '|' *> esepBy1 pStmt (pSpec ',')))
<|< (LFromTo e1 <$> (pSymbol ".." *> pExpr))
<|< (LFrom e1 <$ pSymbol "..")
<|< pure (LList [e1])
@@ -704,7 +723,13 @@
pExprArgNeg = (pSymbol "-" *> (ENegApp <$> pExprArg)) <|< pExprArg
pOperators :: P Ident -> P Expr -> P Expr
-pOperators oper one = eOper <$> one <*> emany ((,) <$> oper <*> one)
+pOperators oper one = do
+ r <- pOperators' oper one
+ mt <- eoptional (pSymbol "::" *> pType)
+ pure $ maybe r (ESign r) mt
+
+pOperators' :: P Ident -> P Expr -> P Expr
+pOperators' oper one = eOper <$> one <*> emany ((,) <$> oper <*> one)
where eOper e [] | notNeg e = e
eOper e ies = EOper e ies
notNeg (ENegApp _) = False
@@ -715,7 +740,8 @@
pBind :: P EBind
pBind =
- BPat <$> (pPatNotVar <* pSymbol "=") <*> pExpr
+ BPat <$> pPatNotVar <*> ((pSpec '=' *> pExpr)
+ <|< (EMultiIf <$> pAlts (pSpec '=')))
<|< pClsBind
pClsBind :: P EBind
@@ -733,7 +759,7 @@
eTuple :: [Expr] -> Expr
eTuple [] = error "eTuple"
-eTuple [e] = e
+eTuple [e] = EParen e
eTuple es = ETuple es
isAlpha_ :: Char -> Bool
--- a/src/MicroHs/State.hs
+++ b/src/MicroHs/State.hs
@@ -1,6 +1,7 @@
module MicroHs.State(
module MicroHs.State,
) where
+import Prelude(); import MHSPrelude
import Control.Monad
--import Control.Monad.Fail
--- a/src/MicroHs/StateIO.hs
+++ b/src/MicroHs/StateIO.hs
@@ -8,6 +8,7 @@
module Control.Monad,
module Data.Functor,
) where
+import Prelude(); import MHSPrelude
import Control.Applicative
import Control.Monad
import Data.Functor hiding(unzip)
--- a/src/MicroHs/SymTab.hs
+++ b/src/MicroHs/SymTab.hs
@@ -12,11 +12,12 @@
stInsertLcl,
mapMSymTab,
) where
+import Prelude(); import MHSPrelude
import Control.Applicative
import Data.List
import MicroHs.Builtin(builtinMdl)
import MicroHs.Expr(Expr(..), EType, conIdent)
-import MicroHs.Ident(Ident(..), showIdent)
+import MicroHs.Ident(Ident(..), showIdent, unIdent, mkIdentSLoc, slocIdent)
import MicroHs.List
import qualified MicroHs.IdentMap as M
@@ -90,8 +91,9 @@
Nothing -> Left $ "undefined " ++ msg ++ ": " ++ showIdent i
-- ++ "\n" ++ show lenv ++ "\n" ++ show genv
+-- XXX why?
hackBuiltin :: Ident -> Ident
-hackBuiltin (Ident l qs) | Just ('.':s) <- stripPrefix builtinMdl qs = Ident l s
+hackBuiltin i | Just ('.':s) <- stripPrefix builtinMdl (unIdent i) = mkIdentSLoc (slocIdent i) s
hackBuiltin i = i
stFromList :: [(Ident, [Entry])] -> [(Ident, [Entry])] -> SymTab
--- a/src/MicroHs/TCMonad.hs
+++ b/src/MicroHs/TCMonad.hs
@@ -3,6 +3,7 @@
module MicroHs.TCMonad,
get, put, gets, modify,
) where
+import Prelude(); import MHSPrelude
import Data.Functor.Identity
import GHC.Stack
import Control.Applicative
@@ -14,6 +15,7 @@
import qualified MicroHs.IntMap as IM
import MicroHs.State
import MicroHs.SymTab
+import Debug.Trace
-----------------------------------------------
-- TC
@@ -29,6 +31,13 @@
tcError = errorMessage
instance MonadFail Identity where fail = error
+
+tcTrace :: String -> TC s ()
+--tcTrace _ = return ()
+tcTrace msg = do
+ s <- get
+ let s' = trace msg s
+ seq s' (put s')
-----------------------------------------------
-- Tables
--- a/src/MicroHs/TargetConfig.hs
+++ b/src/MicroHs/TargetConfig.hs
@@ -5,10 +5,8 @@
, parseTargets
, findTarget
) where
-
-import Prelude hiding(lex)
+import Prelude(); import MHSPrelude hiding(lex)
import Control.Applicative
-import Control.Monad
import Data.List
import Text.ParserComb
import MicroHs.Ident
@@ -43,7 +41,7 @@
type Parser = Prsr [Token] Token
instance TokenMachine [Token] Token where
- tmNextToken [] = (TEnd, [])
+ tmNextToken [] = (TEnd noSLoc, [])
tmNextToken (x:xs) = (x,xs)
tmRawTokens = id
@@ -53,8 +51,8 @@
eof = do
t <- nextToken
case t of
- TEnd -> pure ()
- _ -> fail "eof"
+ TEnd _ -> pure ()
+ _ -> fail "eof"
nl :: Parser [Token]
nl = many $ satisfy "\\n" isWhite
@@ -71,12 +69,6 @@
where is (TIdent _ _ x) = Just x
is _ = Nothing
-keyword :: String -> Parser ()
-keyword s = do
- s' <- ident
- guard (s == s')
- pure ()
-
key :: Parser String
key = ident
@@ -89,7 +81,7 @@
targetName = spec '[' *> key <* spec ']'
keyValue :: Parser (String, String)
-keyValue = (,) <$> key <*> (keyword "=" *> value)
+keyValue = (,) <$> key <*> (spec '=' *> value)
keyValues :: Parser [(String,String)]
keyValues = keyValue `esepBy` nl
--- a/src/MicroHs/Translate.hs
+++ b/src/MicroHs/Translate.hs
@@ -3,6 +3,7 @@
module MicroHs.Translate(
translate, translateAndRun
) where
+import Prelude(); import MHSPrelude
import Data.Maybe
import qualified MicroHs.IdentMap as M
import Unsafe.Coerce
@@ -136,5 +137,24 @@
("A.size", primitive "A.size"),
("A.read", primitive "A.read"),
("A.write", primitive "A.write"),
- ("A.==", primitive "A.==")
+ ("A.==", primitive "A.=="),
+ ("bs++", primitive "bs++"),
+ ("bs+++", primitive "bs+++"),
+ ("bs==", primitive "bs=="),
+ ("bs/=", primitive "bs/="),
+ ("bs<", primitive "bs<"),
+ ("bs<=", primitive "bs<="),
+ ("bs>", primitive "bs>"),
+ ("bs>=", primitive "bs>="),
+ ("bscmp", primitive "bscmp"),
+ ("bspack", primitive "bspack"),
+ ("bsunpack", primitive "bsunpack"),
+ ("bslength", primitive "bslength"),
+ ("bssubstr", primitive "bssubstr"),
+ ("fromUTF8", primitive "fromUTF8"),
+ ("toUTF8", primitive "toUTF8"),
+ ("fp+", primitive "fp+"),
+ ("fp2p", primitive "fp2p"),
+ ("fpnew", primitive "fpnew"),
+ ("fpfin", primitive "fpfin")
]
--- a/src/MicroHs/TypeCheck.hs
+++ b/src/MicroHs/TypeCheck.hs
@@ -15,6 +15,7 @@
ValueExport(..), TypeExport(..),
Symbols,
) where
+import Prelude(); import MHSPrelude
import Control.Applicative
import Control.Arrow(first)
import Control.Monad
@@ -198,12 +199,12 @@
filterImports (imp@(ImportSpec _ _ _ _ (Just (hide, is))), TModule mn fx ts ss cs ins vs a) =
let
keep x xs = elem x xs /= hide
- ivs = [ i | ImpValue i <- is ]
- vs' = filter (\ (ValueExport i _) -> keep i ivs) vs
--- cts = [ i | ImpTypeAll i <- is ] ++ [ i | ImpTypeSome i (_:_) <- is ] -- XXX
--- its = [ i | ImpTypeSome i [] <- is ] ++ cts
+ ivs = [ i | ImpValue i <- is ]
+ vs' = filter (\ (ValueExport i _) -> keep i ivs) vs ++
+ if hide then []
+ else [ ve | TypeExport _ _ ves <- ts, ve@(ValueExport i _) <- ves, i `elem` ivs ]
aits = [ i | ImpTypeAll i <- is ] -- all T(..) imports
- its = [ i | ImpTypeSome i _ <- is ] ++ aits
+ its = [ i | ImpTypeSome i _ <- is ] ++ aits
-- XXX This isn't quite right, hiding T() should hide T, but not the constructors
ts' =
if hide then
@@ -306,7 +307,7 @@
[ TypeExport i (tentry i) [] | Type (i, _) _ <- tds ]
-- All type synonym definitions.
- ses = [ (qualIdent mn i, EForall vs t) | Type (i, vs) t <- tds ]
+ ses = [ (qualIdent mn i, EForall True vs t) | Type (i, vs) t <- tds ]
-- All fixity declaration.
fes = [ (qualIdent mn i, fx) | Infix fx is <- tds, i <- is ]
@@ -442,6 +443,7 @@
addInstTable :: [InstDictC] -> T ()
addInstTable ics = do
+-- tcTrace $ "addInstTable: " ++ show ics
let
-- Change type variable to unique unification variables.
-- These unification variables will never leak, but as an extra caution
@@ -463,7 +465,7 @@
addConstraint :: Ident -> EConstraint -> T ()
addConstraint d ctx = do
--- traceM $ "addConstraint: " ++ showIdent d ++ " :: " ++ showEType ctx
+-- tcTrace $ "addConstraint: " ++ showIdent d ++ " :: " ++ showEType ctx
ctx' <- expandSyn ctx
modify $ \ ts -> ts{ constraints = (d, ctx') : constraints ts }
@@ -477,12 +479,12 @@
withDict :: forall a . HasCallStack => Ident -> EConstraint -> T a -> T a
withDict i c ta = do
--- traceM $ "+++ withDict enter " ++ show (i, c)
+-- tcTrace $ "+++ withDict enter " ++ show (i, c)
ct <- gets ctxTables
addDict (i, c)
a <- ta
putCtxTables ct
--- traceM $ "--- withDict leave " ++ show (i, c)
+-- tcTrace $ "--- withDict leave " ++ show (i, c)
return a
addDict :: (Ident, EConstraint) -> T ()
@@ -507,7 +509,7 @@
addEqDict :: Ident -> EType -> EType -> T ()
addEqDict _i t1 t2 = do
is <- gets typeEqTable
--- traceM ("withEqDict: " ++ show (is, (t1,t2), (addTypeEq t1 t2 is)))
+-- tcTrace ("withEqDict: " ++ show (is, (t1,t2), (addTypeEq t1 t2 is)))
putTypeEqTable (addTypeEq t1 t2 is)
addMetaDict :: HasCallStack => Ident -> EConstraint -> T ()
@@ -541,7 +543,7 @@
-- r for 'realm', suggested by ChatGPT
rSort :: ESort
-rSort = EVar (Ident noSLoc "Primitives.Sort")
+rSort = EVar (mkIdent "Primitives.Sort")
sKindKindKind :: EKind
sKindKindKind = sArrow sKind (sArrow sKind sKind)
@@ -610,8 +612,8 @@
tuple n =
let
i = tupleConstr builtinLoc n
- in (i, [entry i $ EForall [kk] $ foldr kArrow kv (replicate n kv)])
- kImplies = EForall [kk] $ kConstraint `kArrow` (kv `kArrow` kv)
+ in (i, [entry i $ EForall True [kk] $ foldr kArrow kv (replicate n kv)])
+ kImplies = EForall True [kk] $ kConstraint `kArrow` (kv `kArrow` kv)
in
[
-- The function arrow et al are bothersome to define in Primitives, so keep them here.
@@ -641,7 +643,7 @@
vks = [IdKind (mkIdent ("a" ++ show i)) kType | i <- enumFromTo 1 n]
ts = map tVarK vks
r = tApps c ts
- in (c, [Entry (ECon $ ConData [(c, n)] c []) $ EForall vks $ foldr tArrow r ts ])
+ in (c, [Entry (ECon $ ConData [(c, n)] c []) $ EForall True vks $ EForall True [] $ foldr tArrow r ts ])
in map tuple (enumFromTo 2 10)
kArrow :: EKind -> EKind -> EKind
@@ -687,7 +689,7 @@
syns <- gets synTable
case M.lookup i syns of
Nothing -> return $ eApps t ts
- Just (EForall vks tt) ->
+ Just (EForall _ vks tt) ->
-- if length vks /= length ts then tcError (getSLoc i) $ "bad synonym use"
-- else expandSyn $ subst (zip (map idKindIdent vks) ts) tt
let s = zip (map idKindIdent vks) ts
@@ -701,7 +703,7 @@
Just _ -> impossible
EUVar _ -> return $ eApps t ts
ESign a _ -> expandSyn a -- Throw away signatures, they don't affect unification
- EForall iks tt | null ts -> EForall iks <$> expandSyn tt
+ EForall b iks tt | null ts -> EForall b iks <$> expandSyn tt
ELit _ (LStr _) -> return t
ELit _ (LInteger _) -> return t
_ -> impossible
@@ -712,7 +714,7 @@
where
rec (EApp f a) = EApp (rec f) (rec a)
rec (ESign t k) = ESign (rec t) k
- rec (EForall iks t) = EForall iks (rec t)
+ rec (EForall b iks t) = EForall b iks (rec t)
rec t = fn t
derefUVar :: EType -> T EType
@@ -732,7 +734,7 @@
return t'
EVar _ -> return at
ESign t k -> flip ESign k <$> derefUVar t
- EForall iks t -> EForall iks <$> derefUVar t
+ EForall b iks t -> EForall b iks <$> derefUVar t
ELit _ (LStr _) -> return at
ELit _ (LInteger _) -> return at
_ -> impossible
@@ -782,7 +784,7 @@
SLoc -> TRef -> EType -> T ()
unifyVar loc r t = do
mt <- getUVar r
--- traceM $ "unifyVar: " ++ show (r,t)
+-- tcTrace $ "unifyVar: " ++ show (r,t)
case mt of
Nothing -> unifyUnboundVar loc r t
Just t' -> unify loc t' t
@@ -826,10 +828,10 @@
Left e -> do
{-
tcm <- gets tcMode
- traceM ("TCMode=" ++ show tcm)
- traceM ("Value table:\n" ++ show env)
+ tcTrace ("TCMode=" ++ show tcm)
+ tcTrace ("Value table:\n" ++ show env)
tenv <- gets typeTable
- traceM ("Type table:\n" ++ show tenv)
+ tcTrace ("Type table:\n" ++ show tenv)
-}
tcError (getSLoc i) e
@@ -840,11 +842,11 @@
tLookup (msgTCMode tcm) i
tInst :: HasCallStack => Expr -> EType -> T (Expr, EType)
-tInst ae (EForall vks t) = do
+tInst ae (EForall _ vks t) = do
t' <- tInstForall vks t
tInst ae t'
tInst ae at | Just (ctx, t) <- getImplies at = do
- --traceM $ "tInst: addConstraint: " ++ show ae ++ ", " ++ show d ++ " :: " ++ show ctx
+ --tcTrace $ "tInst: addConstraint: " ++ show ae ++ ", " ++ show d ++ " :: " ++ show ctx
if eqExpr ae eCannotHappen then
-- XXX Gruesome hack. This avoid adding constraints in cases like
-- (C a => a) -> T `subsCheck` b
@@ -865,7 +867,7 @@
return (subst (zip vs us) t)
tInst' :: EType -> T EType
-tInst' (EForall vks t) = tInstForall vks t
+tInst' (EForall _ vks t) = tInstForall vks t
tInst' t = return t
extValE :: HasCallStack =>
@@ -948,13 +950,13 @@
tcDefs :: ImpType -> [EDef] -> T [EDef]
tcDefs impt ds = do
--- traceM ("tcDefs 1:\n" ++ showEDefs ds)
+-- tcTrace ("tcDefs 1:\n" ++ showEDefs ds)
mapM_ tcAddInfix ds
dst <- tcDefsType ds
--- traceM ("tcDefs 2:\n" ++ showEDefs dst)
+-- tcTrace ("tcDefs 2:\n" ++ showEDefs dst)
mapM_ addTypeSyn dst
dst' <- tcExpand impt dst
--- traceM ("tcDefs 3:\n" ++ showEDefs dst')
+-- tcTrace ("tcDefs 3:\n" ++ showEDefs dst')
case impt of
ImpNormal -> do
setDefault dst'
@@ -981,7 +983,7 @@
mapM_ (addTypeKind kindSigs) ds -- Add the kind of each type to the environment
dst <- mapM tcDefType ds -- Kind check all top level type expressions
-- vars <- gets uvarSubst
--- traceM $ show vars
+-- tcTrace $ show vars
vt <- gets valueTable
let ent (Entry i t) = Entry i . mapEType def <$> derefUVar t
def (EUVar _) = kType -- default kind variables to Type
@@ -988,7 +990,7 @@
def t = t
vt' <- mapMSymTab ent vt
putValueTable vt'
--- traceM $ "tcDefType value table:\n" ++ show vt'
+-- tcTrace $ "tcDefType value table:\n" ++ show vt'
return dst
-- Get all kind signatures, and do sort checking of them.
@@ -1005,9 +1007,9 @@
tcExpand impt dst = withTypeTable $ do
dsc <- concat <$> mapM (expandClass impt) dst -- Expand all class definitions
dsf <- concat <$> mapM expandField dsc -- Add HasField instances
--- traceM $ showEDefs dsf
+-- tcTrace $ showEDefs dsf
dsd <- concat <$> mapM doDeriving dsf -- Add derived instances
--- traceM $ showEDefs dsd
+-- tcTrace $ showEDefs dsd
dsi <- concat <$> mapM expandInst dsd -- Expand all instance definitions
return dsi
@@ -1019,13 +1021,27 @@
expect = case tcm of { TCType -> sKind; TCKind -> rSort; _ -> undefined }
loop r [] = fun (reverse r)
loop r (IdKind i mk : iks) = do
- k' <-
- case mk of
- EVar d | d == dummyIdent -> newUVar
- _ -> withTypeTable $ tcExpr (Check expect) mk -- bump to next level
- withExtVal i k' $ loop (IdKind i k' : r) iks
+ -- When we have 'forall k (a :: k) . t' the k is a kind.
+ -- Instead we have have to write 'forall (k :: Kind) (a :: k) . t' and then
+ -- we have to guess that k needs sort checking.
+ -- This doesn't work if there is not exactly 'Kind' (e.g., 'Primitives.Kind')
+ -- This sucks.
+ if tcm == TCType && guessIsKind mk then do
+ s <- withTypeTable $ withTypeTable $ tcExpr (Check rSort) mk
+ let ik = IdKind i s
+ withExtTyps [ik] $ loop (ik : r) iks
+ else do
+ k' <- case mk of
+ EVar d | d == dummyIdent -> newUVar
+ _ -> withTypeTable $ tcExpr (Check expect) mk -- bump to next level
+ withExtVal i k' $ loop (IdKind i k' : r) iks
loop [] vks
+guessIsKind :: EType -> Bool
+guessIsKind (EVar i) = i == mkIdent "Kind"
+guessIsKind t | Just (f, a) <- getArrow t = guessIsKind f || guessIsKind a
+guessIsKind _ = False
+
-- Add symbol a table entry (with kind) for each top level typeish definition.
-- If there is a kind signature, use it. If not, use a kind variable.
addTypeKind :: M.Map EKind -> EDef -> T ()
@@ -1064,7 +1080,7 @@
addTypeSyn adef =
case adef of
Type (i, vs) t -> do
- let t' = EForall vs t
+ let t' = EForall True vs t
extSyn i t'
mn <- gets moduleName
extSyn (qualIdent mn i) t'
@@ -1170,7 +1186,7 @@
mdflts = [ (i, eqns) | BFcn i eqns <- ms ]
dflttys = [ (i, t) | BDfltSign i t <- ms ]
tCtx = tApps (qualIdent mn iCls) (map (EVar . idKindIdent) vks)
- mkDflt (BSign methId t) = [ Sign [iDflt] $ EForall vks $ tCtx `tImplies` ty, def $ lookup methId mdflts ]
+ mkDflt (BSign methId t) = [ Sign [iDflt] $ EForall True vks $ tCtx `tImplies` ty, def $ lookup methId mdflts ]
where ty = fromMaybe t $ lookup methId dflttys
def Nothing = Fcn iDflt $ simpleEqn noDflt
def (Just eqns) = Fcn iDflt eqns
@@ -1210,7 +1226,7 @@
defaultSuffix = uniqIdentSep ++ "dflt"
splitInst :: EConstraint -> ([IdKind], [EConstraint], EConstraint)
-splitInst (EForall iks t) =
+splitInst (EForall _ iks t) =
case splitInst t of
(iks', ctx, ct) -> (iks ++ iks', ctx, ct)
splitInst act | Just (ctx, ct) <- getImplies act =
@@ -1225,7 +1241,7 @@
qiCls = getAppCon cc
let iInst = mkInstId loc cc
sign = Sign [iInst] act
--- traceM ("expandInst " ++ show iInst)
+-- tcTrace ("expandInst " ++ show iInst)
-- (e, _) <- tLookupV iCls
ct <- gets classTable
-- let qiCls = getAppCon e
@@ -1256,7 +1272,7 @@
tcDefsValue :: [EDef] -> T [EDef]
tcDefsValue defs = do
--- traceM $ "tcDefsValue: ------------ start"
+-- tcTrace $ "tcDefsValue: ------------ start"
-- Gather up all type signatures, and put them in the environment.
mapM_ addValueType defs
let smap = M.fromList [ (i, ()) | Sign is _ <- defs, i <- is ]
@@ -1274,7 +1290,7 @@
-- return inferred Sign
signDefs <- mapM tcSCC sccs
-- type check all definitions (the inferred ones will be rechecked)
--- traceM $ "tcDefsValue: ------------ check"
+-- tcTrace $ "tcDefsValue: ------------ check"
defs' <- mapM (\ d -> do { tcReset; tcDefValue d}) defs
return $ concat signDefs ++ defs'
@@ -1284,7 +1300,7 @@
tcReset
-- Invent type variables for the definitions
xts <- mapM (\ (Fcn i _) -> (,) i <$> newUVar) fcns
- --traceM $ "tInferDefs: " ++ show (map fst xts)
+ --tcTrace $ "tInferDefs: " ++ show (map fst xts)
-- Temporarily extend the local environment with the type variables
withExtVals xts $ do
-- Infer types for all the Fcns, ignore the new bodies.
@@ -1302,7 +1318,7 @@
t'' = addConstraints ctx' t'
vs' = metaTvs [t'']
t''' <- quantify vs' t''
- --traceM $ "tInferDefs: " ++ showIdent i ++ " :: " ++ showEType t'''
+ --tcTrace $ "tInferDefs: " ++ showIdent i ++ " :: " ++ showEType t'''
extValQTop i t'''
return $ Sign [i] t'''
mapM genTop xts
@@ -1318,7 +1334,7 @@
addValueType :: EDef -> T ()
addValueType adef = do
mn <- gets moduleName
- -- traceM ("addValueType: " ++ showEDefs [adef])
+ -- tcTrace ("addValueType: " ++ showEDefs [adef])
let addConFields _ (Constr _ _ _ (Left _)) = return ()
addConFields tycon (Constr _ _ _ (Right fs)) = mapM_ addField fs
where addField (fld, _) = do
@@ -1332,7 +1348,7 @@
tret = tApps (qualIdent mn tycon) (map tVarK vks)
addCon (Constr evks ectx c ets) = do
let ts = either id (map snd) ets
- cty = EForall vks $ EForall evks $ addConstraints ectx $ foldr (tArrow . snd) tret ts
+ cty = EForall True vks $ EForall True evks $ addConstraints ectx $ foldr (tArrow . snd) tret ts
fs = either (const []) (map fst) ets
extValETop c cty (ECon $ ConData cti (qualIdent mn c) fs)
mapM_ addCon cs
@@ -1342,7 +1358,7 @@
t = snd $ head $ either id (map snd) ets
tret = tApps (qualIdent mn tycon) (map tVarK vks)
fs = either (const []) (map fst) ets
- extValETop c (EForall vks $ EForall [] $ tArrow t tret) (ECon $ ConNew (qualIdent mn c) fs)
+ extValETop c (EForall True vks $ EForall True [] $ tArrow t tret) (ECon $ ConNew (qualIdent mn c) fs)
addConFields tycon con
ForImp _ i t -> extValQTop i t
Class ctx (i, vks) fds ms -> addValueClass ctx i vks fds ms
@@ -1362,11 +1378,11 @@
tret = tApps qiCls (map tVarK vks)
cti = [ (qualIdent mn iCon, length targs) ]
iCon = mkClassConstructor iCls
- iConTy = EForall vks $ foldr tArrow tret targs
+ iConTy = EForall True vks $ foldr tArrow tret targs
extValETop iCon iConTy (ECon $ ConData cti (qualIdent mn iCon) [])
- let addMethod (BSign i t) = extValETop i (EForall vks $ tApps qiCls (map (EVar . idKindIdent) vks) `tImplies` t) (EVar $ qualIdent mn i)
+ let addMethod (BSign i t) = extValETop i (EForall True vks $ tApps qiCls (map (EVar . idKindIdent) vks) `tImplies` t) (EVar $ qualIdent mn i)
addMethod _ = impossible
--- traceM ("addValueClass " ++ showEType (ETuple ctx))
+-- tcTrace ("addValueClass " ++ showEType (ETuple ctx))
mapM_ addMethod meths
-- Update class table, now with actual constructor type.
addClassTable qiCls (vks, ctx, iConTy, methIds, mkIFunDeps (map idKindIdent vks) fds)
@@ -1382,15 +1398,16 @@
Fcn i eqns -> do
(_, t) <- tLookup "type signature" i
t' <- expandSyn t
--- traceM $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr t'
--- traceM $ "tcDefValue: " ++ showEDefs [adef]
+-- tcTrace $ "tcDefValue: ------- start " ++ showIdent i
+-- tcTrace $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr t'
+-- tcTrace $ "tcDefValue: " ++ showEDefs [adef]
teqns <- tcEqns True t' eqns
--- traceM ("tcDefValue: after\n" ++ showEDefs [adef, Fcn i teqns])
+-- tcTrace ("tcDefValue: after\n" ++ showEDefs [adef, Fcn i teqns])
-- cs <- gets constraints
--- traceM $ "tcDefValue: constraints: " ++ show cs
+-- tcTrace $ "tcDefValue: constraints: " ++ show cs
checkConstraints
mn <- gets moduleName
--- traceM $ "tcDefValue: " ++ showIdent i ++ " done"
+-- tcTrace $ "tcDefValue: " ++ showIdent i ++ " done"
return $ Fcn (qualIdent mn i) teqns
ForImp ie i t -> do
mn <- gets moduleName
@@ -1400,14 +1417,14 @@
-- Add implicit forall and type check.
tCheckTypeTImpl :: HasCallStack => EType -> EType -> T EType
-tCheckTypeTImpl tchk t@(EForall _ _) = tCheckTypeT tchk t
+tCheckTypeTImpl tchk t@(EForall _ _ _) = tCheckTypeT tchk t
tCheckTypeTImpl tchk t = do
bvs <- stKeysLcl <$> gets valueTable -- bound outside
let fvs = freeTyVars [t] -- free variables in t
-- these are free, and need quantification. eDummy indicates missing kind
iks = map (\ i -> IdKind i eDummy) (fvs \\ bvs)
- --when (not (null iks)) $ traceM ("tCheckTypeTImpl: " ++ show (t, eForall iks t))
- tCheckTypeT tchk (eForall iks t)
+ --when (not (null iks)) $ tcTrace ("tCheckTypeTImpl: " ++ show (t, eForall iks t))
+ tCheckTypeT tchk (eForall' False iks t)
tCheckTypeT :: HasCallStack => EType -> EType -> T EType
tCheckTypeT = tCheck tcTypeT
@@ -1466,7 +1483,7 @@
tCheckExpr :: HasCallStack =>
EType -> Expr -> T Expr
tCheckExpr t e | Just (ctx, t') <- getImplies t = do
--- traceM $ "tCheckExpr: " ++ show (e, ctx, t')
+-- tcTrace $ "tCheckExpr: " ++ show (e, ctx, t')
d <- newADictIdent (getSLoc e)
e' <- withDict d ctx $ tCheckExprAndSolve t' e
return $ eLam [EVar d] e'
@@ -1498,9 +1515,9 @@
tcExpr :: HasCallStack =>
Expected -> Expr -> T Expr
tcExpr mt ae = do
--- traceM ("tcExpr enter: " ++ showExpr ae)
+-- tcTrace ("tcExpr enter: " ++ showExpr ae)
r <- tcExprR mt ae
--- traceM ("tcExpr exit: " ++ showExpr r)
+-- tcTrace ("tcExpr exit: " ++ showExpr r)
return r
tcExprR :: HasCallStack =>
Expected -> Expr -> T Expr
@@ -1527,15 +1544,15 @@
case t of
EUVar r -> fmap (fromMaybe t) (getUVar r)
_ -> return t
- --traceM $ "EVar: " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t' ++ " mt=" ++ show mt
+ --tcTrace $ "EVar: " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t' ++ " mt=" ++ show mt
instSigma loc e t' mt
EApp f a -> do
--- traceM $ "txExpr(0) EApp: expr=" ++ show ae ++ ":: " ++ show mt
+-- tcTrace $ "txExpr(0) EApp: expr=" ++ show ae ++ ":: " ++ show mt
(f', ft) <- tInferExpr f
--- traceM $ "tcExpr(1) EApp: f=" ++ show f ++ "; f'=" ++ show f' ++ " :: " ++ show ft
+-- tcTrace $ "tcExpr(1) EApp: f=" ++ show f ++ "; f'=" ++ show f' ++ " :: " ++ show ft
(at, rt) <- unArrow loc ft
--- traceM $ "tcExpr(2) EApp: f=" ++ show f ++ " :: " ++ show ft ++ ", arg=" ++ show a ++ " :: " ++ show at ++ " retty=" ++ show rt
+-- tcTrace $ "tcExpr(2) EApp: f=" ++ show f ++ " :: " ++ show ft ++ ", arg=" ++ show a ++ " :: " ++ show at ++ " retty=" ++ show rt
-- We want to do the unification of rt ant mt before checking the argument to
-- have more type information. See tests/Eq1.hs.
-- But instSigma may transform the input expression, so we have to be careful.
@@ -1543,13 +1560,13 @@
ugly = -1::Int
etmp' <- instSigma loc etmp rt mt
a' <- checkSigma a at
--- traceM $ "tcExpr(3) EApp: f = " ++ show f ++ " :: " ++ show ft ++ ", arg=" ++ show a' ++ " :: " ++ show at ++ " retty=" ++ show rt ++ " mt = " ++ show mt
+-- tcTrace $ "tcExpr(3) EApp: f = " ++ show f ++ " :: " ++ show ft ++ ", arg=" ++ show a' ++ " :: " ++ show at ++ " retty=" ++ show rt ++ " mt = " ++ show mt
let res = EApp f' a'
case etmp' of
EUVar _ -> return res -- instSigma did nothing, this is the common case
_ -> return $ substEUVar [(ugly, res)] etmp'
- EOper e ies -> do e' <- tcOper e ies; tcExpr mt e'
+ EOper e ies -> tcOper e ies >>= tcExpr mt
ELam qs -> tcExprLam mt qs
ELit _ lit -> do
tcm <- gets tcMode
@@ -1596,7 +1613,7 @@
(f, ft) <- tInferExpr (EVar (mkBuiltin loc "fromString"))
(_at, rt) <- unArrow loc ft
-- We don't need to check that _at is String, it's part of the fromString type.
- --traceM ("LStr " ++ show (loc, r))
+ --tcTrace ("LStr " ++ show (loc, r))
instSigma loc (EApp f ae) rt mt
-- Not LInteger, LRat, LStr
_ -> tcLit mt loc lit
@@ -1617,6 +1634,7 @@
ttup = tApps (tupleConstr loc n) tes
munify loc mt ttup
return (ETuple ees)
+ EParen e -> tcExpr mt e
EDo mmn ass -> do
case ass of
[] -> impossible
@@ -1648,10 +1666,8 @@
SLet bs ->
tcExpr mt (ELet bs (EDo mmn ss))
- ESectL e i -> tcExpr mt (EApp (EVar i) e)
- ESectR i e -> do
- let x = eVarI loc "$x"
- tcExpr mt (eLam [x] (EApp (EApp (EVar i) x) e))
+ ESectL e i -> tcLSect e i >>= tcExpr mt
+ ESectR i e -> tcRSect i e >>= tcExpr mt
EIf e1 e2 e3 -> do
e1' <- tCheckExpr (tBool (getSLoc e1)) e1
case mt of
@@ -1667,6 +1683,11 @@
tSetRefType loc ref t2
return (EIf e1' e2'' e3'')
+ -- Translate (if | a1; | a2 ...) into
+ -- (case [] of _ | a1; | a2 ...)
+ EMultiIf a ->
+ tcExpr mt $ ECase (EListish (LList [])) [(EVar (mkIdent "_"), a)]
+
EListish (LList es) -> do
te <- newUVar
munify loc mt (tApp (tList loc) te)
@@ -1706,11 +1727,11 @@
e' <- instSigma loc e t' mt
checkSigma e' t'
-- Only happens in type&kind checking mode.
- EForall vks t ->
+ EForall b vks t ->
-- assertTCMode (==TCType) $
withVks vks $ \ vks' -> do
tt <- tcExpr mt t
- return (EForall vks' tt)
+ return (EForall b vks' tt)
EUpdate e flds -> do
ises <- concat <$> mapM (dsEField e) flds
me <- dsUpdate unsetField e ises
@@ -1734,6 +1755,7 @@
failureFree (ELazy True _) = return True
failureFree (ELazy False p) = failureFree p
failureFree (EViewPat _ p) = failureFree p
+failureFree (EParen p) = failureFree p
failureFree _ = return False
failureFreeAp :: [Bool] -> EPat -> T Bool
@@ -1802,6 +1824,7 @@
ELazy z p -> ELazy z <$> dsEFields p
ECon _ -> return apat
EUpdate c fs -> EUpdate c . concat <$> mapM (dsEField c) fs
+ EParen p -> dsEFields p
ENegApp _ -> return apat
_ -> error $ "dsEFields " ++ show apat
@@ -1866,6 +1889,29 @@
Left (loc, err) -> tcError loc err
Right e -> return e
+tcLSect :: Expr -> Ident -> T Expr
+tcLSect (EOper e ies) op = do
+ let x = eVarI loc "$x"
+ loc = getSLoc op
+ e' <- tcOper e (ies ++ [(op, x)])
+ case e' of
+ EApp f x' | x' `eqExpr` x -> return f
+ _ -> tcError loc "Bad section fixity"
+tcLSect e op =
+ return (EApp (EVar op) e)
+
+tcRSect :: Ident -> Expr -> T Expr
+tcRSect op (EOper e ies) = do
+ let x = eVarI loc "$x"
+ loc = getSLoc op
+ e' <- tcOper x ((op, e):ies)
+ case e' of
+ EApp (EApp _ x') _ | x `eqExpr` x' -> return (eLam [x] e')
+ _ -> tcError loc "Bad section fixity"
+tcRSect op e = do
+ let x = eVarI (getSLoc op) "$x"
+ return (eLam [x] (EApp (EApp (EVar op) x) e))
+
unArrow :: HasCallStack =>
SLoc -> EType -> T (EType, EType)
unArrow loc t = do
@@ -1904,7 +1950,8 @@
tcEqns :: Bool -> EType -> [Eqn] -> T [Eqn]
--tcEqns _ t eqns | trace ("tcEqns: " ++ showEBind (BFcn dummyIdent eqns) ++ " :: " ++ show t) False = undefined
-tcEqns top (EForall iks t) eqns = withExtTyps iks $ tcEqns top t eqns
+tcEqns top (EForall expl iks t) eqns | expl = withExtTyps iks $ tcEqns top t eqns
+ | otherwise = tcEqns top t eqns
tcEqns top t eqns | Just (ctx, t') <- getImplies t = do
let loc = getSLoc eqns
d <- newADictIdent loc
@@ -1920,7 +1967,7 @@
let loc = getSLoc eqns
f <- newIdent loc "fcnS"
(eqns', ds) <- solveAndDefault top $ mapM (tcEqn t) eqns
--- traceM $ "tcEqns done: " ++ showEBind (BFcn dummyIdent eqns')
+-- tcTrace $ "tcEqns done: " ++ showEBind (BFcn dummyIdent eqns')
case ds of
[] -> return eqns'
_ -> do
@@ -1934,7 +1981,7 @@
tcEqn t eqn =
case eqn of
Eqn ps alts -> tcPats t ps $ \ t' ps' -> do
--- traceM $ "tcEqn " ++ show ps ++ " ---> " ++ show ps'
+-- tcTrace $ "tcEqn " ++ show ps ++ " ---> " ++ show ps'
alts' <- tcAlts t' alts
return (Eqn ps' alts')
@@ -1950,7 +1997,7 @@
tcAlts t (EAlts alts bs) =
-- trace ("tcAlts: bs in " ++ showEBinds bs) $
tcBinds bs $ \ bs' -> do
--- traceM ("tcAlts: bs out " ++ showEBinds bbs)
+-- tcTrace ("tcAlts: bs out " ++ showEBinds bbs)
alts' <- mapM (tcAlt t) alts
return (EAlts alts' bs')
@@ -2017,7 +2064,7 @@
tCheckPatC t p@(EVar v) ta | not (isConIdent v) = do -- simple special case
withExtVals [(v, t)] $ ta p
tCheckPatC t app ta = do
--- traceM $ "tCheckPatC: " ++ show app ++ " :: " ++ show t
+-- tcTrace $ "tCheckPatC: " ++ show app ++ " :: " ++ show t
app' <- dsEFields app
let vs = patVars app'
multCheck vs
@@ -2024,10 +2071,10 @@
env <- mapM (\ v -> (,) v <$> newUVar) vs
withExtVals env $ do
(_sks, ds, pp) <- tCheckPat t app'
--- traceM ("tCheckPatC: " ++ show pp)
+-- tcTrace ("tCheckPatC: " ++ show pp)
() <- checkArity 0 pp
-- xt <- derefUVar t
--- traceM ("tCheckPatC ds=" ++ show ds ++ "t=" ++ show xt)
+-- tcTrace ("tCheckPatC ds=" ++ show ds ++ "t=" ++ show xt)
-- XXX must check for leaking skolems
withDicts ds $
ta pp
@@ -2055,12 +2102,12 @@
| isConIdent i -> do
(con, xpt) <- tLookupV i
--- traceM (show ipt)
+-- tcTrace (show ipt)
case xpt of
-- Sanity check
- EForall _ (EForall _ _) -> return ()
- _ -> undefined
- EForall avs apt <- tInst' xpt
+ EForall _ _ (EForall _ _ _) -> return ()
+ _ -> impossibleShow i
+ EForall _ avs apt <- tInst' xpt
(sks, spt) <- shallowSkolemise avs apt
(d, p, pt) <-
case getImplies spt of
@@ -2091,9 +2138,9 @@
| isNeg f -> lit -- if it's (negate e) it must have been a negative literal
| otherwise -> do
((skf, df, f'), ft) <- tInferPat f
--- traceM $ "tcPat: EApp f=" ++ showExpr f ++ "; e'=" ++ showExpr f' ++ " :: " ++ showEType ft
+-- tcTrace $ "tcPat: EApp f=" ++ showExpr f ++ "; e'=" ++ showExpr f' ++ " :: " ++ showEType ft
(at, rt) <- unArrow loc ft
--- traceM ("tcPat EApp: " ++ showExpr f ++ " :: " ++ showEType ft)
+-- tcTrace ("tcPat EApp: " ++ showExpr f ++ " :: " ++ showEType ft)
(ska, da, a') <- tCheckPat at a
instPatSigma loc rt mt
return (skf ++ ska, df ++ da, EApp f' a')
@@ -2108,6 +2155,8 @@
munify loc mt ttup
return (concat sks, concat ds, ETuple ees)
+ EParen e -> tcPat mt e
+
EListish (LList es) -> do
te <- newUVar
munify loc mt (tApp (tList loc) te)
@@ -2236,8 +2285,9 @@
EOper t ies -> EOper (dsType t) [(i, dsType e) | (i, e) <- ies]
EListish (LList [t]) -> tApp (tList (getSLoc at)) (dsType t)
ETuple ts -> tApps (tupleConstr (getSLoc at) (length ts)) (map dsType ts)
+ EParen t -> dsType t
ESign t k -> ESign (dsType t) k
- EForall iks t -> EForall iks (dsType t)
+ EForall b iks t -> EForall b iks (dsType t)
ELit _ (LStr _) -> at
ELit _ (LInteger _) -> at
_ -> impossible
@@ -2284,7 +2334,7 @@
zipWithM_ (\ tv n -> setUVar tv (EVar n)) tvs newVars
ty' <- derefUVar ty
putUvarSubst osubst -- reset the setUVar we did above
- return (EForall newVarsK ty')
+ return (EForall False newVarsK ty')
allBinders :: [Ident] -- a,b,..z, a1, b1,... z1, a2, b2,...
allBinders = [ mkIdent [x] | x <- ['a' .. 'z'] ] ++
@@ -2300,7 +2350,7 @@
Sigma -> T ([TyVar], Rho)
-- Performs deep skolemisation, returning the
-- skolem constants and the skolemised type.
-skolemise (EForall tvs ty) = do -- Rule PRPOLY
+skolemise (EForall _ tvs ty) = do -- Rule PRPOLY
(sks1, ty') <- shallowSkolemise tvs ty
(sks2, ty'') <- skolemise ty'
return (sks1 ++ sks2, ty'')
@@ -2328,7 +2378,7 @@
| elem tv acc = acc
| otherwise = tv : acc
go (EVar _) acc = acc
- go (EForall _ ty) acc = go ty acc
+ go (EForall _ _ ty) acc = go ty acc
go (EApp fun arg) acc = go fun (go arg acc)
go (ELit _ _) acc = acc
go _ _ = impossible
@@ -2349,7 +2399,7 @@
checkSigma expr sigma = do
(skol_tvs, rho) <- skolemise sigma
-- sigma' <- derefUVar sigma
--- traceM $ "**** checkSigma: " ++ show expr ++ " :: " ++ show sigma ++ " = " ++ show sigma' ++ " " ++ show skol_tvs
+-- tcTrace $ "**** checkSigma: " ++ show expr ++ " :: " ++ show sigma ++ " = " ++ show sigma' ++ " " ++ show skol_tvs
expr' <- tCheckExpr rho expr
if null skol_tvs then
-- Fast special case
@@ -2365,7 +2415,7 @@
subsCheckRho :: HasCallStack =>
SLoc -> Expr -> Sigma -> Rho -> T Expr
--subsCheckRho _ e1 t1 t2 | trace ("subsCheckRho: " ++ show e1 ++ " :: " ++ show t1 ++ " = " ++ show t2) False = undefined
-subsCheckRho loc exp1 sigma1@(EForall _ _) rho2 = do -- Rule SPEC
+subsCheckRho loc exp1 sigma1@(EForall _ _ _) rho2 = do -- Rule SPEC
(exp1', rho1) <- tInst exp1 sigma1
subsCheckRho loc exp1' rho1 rho2
subsCheckRho loc exp1 arho1 rho2 | Just _ <- getImplies arho1 = do
@@ -2378,7 +2428,7 @@
(a2,r2) <- unArrow loc rho2
subsCheckFun loc exp1 a1 r1 a2 r2
subsCheckRho loc exp1 tau1 tau2 = do -- Rule MONO
--- traceM $ "subsCheckRho: MONO " ++ show (tau1, tau2)
+-- tcTrace $ "subsCheckRho: MONO " ++ show (tau1, tau2)
unify loc tau1 tau2 -- Revert to ordinary unification
return exp1
@@ -2391,11 +2441,11 @@
instSigma :: HasCallStack =>
SLoc -> Expr -> Sigma -> Expected -> T Expr
instSigma loc e1 t1 (Check t2) = do
--- traceM ("instSigma: Check " ++ showEType t1 ++ " = " ++ showEType t2)
+-- tcTrace ("instSigma: Check " ++ showEType t1 ++ " = " ++ showEType t2)
subsCheckRho loc e1 t1 t2
instSigma loc e1 t1 (Infer r) = do
(e1', t1') <- tInst e1 t1
- --traceM ("instSigma: Infer " ++ showEType t1 ++ " ==> " ++ showEType t1')
+ --tcTrace ("instSigma: Infer " ++ showEType t1 ++ " ==> " ++ showEType t1')
tSetRefType loc r t1'
return e1'
@@ -2466,7 +2516,7 @@
ds <- solveConstraints
cs <- gets constraints
vs <- getMetaTyVars (map snd cs) -- These are the type variables that need defaulting
--- traceM $ "solveAndDefault: meta=" ++ show vs
+-- tcTrace $ "solveAndDefault: meta=" ++ show vs
-- XXX may have to iterate this with fundeps
ds' <- concat <$> mapM defaultOneTyVar vs
return (a, ds ++ ds')
@@ -2485,10 +2535,11 @@
let tryDefaults [] = return []
tryDefaults (ty:tys) = do
ok <- checkDefaultTypes ty ourcs
- --traceM ("checkDefaultTypes: " ++ show (tv, ty, ourcs, ok))
+-- tcTrace ("checkDefaultTypes: " ++ show (EUVar tv, ty, ourcs, ok))
if not ok then
tryDefaults tys -- don't default
else do
+-- tcTrace $ "defaultOneTyVar: " ++ show (EUVar tv) ++ ":=" ++ showEType ty
setUVar tv ty
putConstraints ourcs
ds <- solveConstraints
@@ -2495,10 +2546,12 @@
rcs <- gets constraints
if null rcs then do
-- Success, the type variable is gone
+-- tcTrace $ "defaultOneTyVar success: " ++ show (EUVar tv)
putConstraints othercs -- put back the other constraints
return ds
else do
-- Not solved, try with the nest type
+-- tcTrace $ "defaultOneTyVar failed: " ++ show rcs
put old -- restore solver state
tryDefaults tys -- and try with next type
tryDefaults (defaults old)
@@ -2576,13 +2629,13 @@
return []
else do
addMetaDicts
- --traceM "------------------------------------------\nsolveConstraints"
+-- tcTrace "------------------------------------------\nsolveConstraints"
cs' <- mapM (\ (i,t) -> do { t' <- derefUVar t; return (i,t') }) cs
- --traceM ("constraints:\n" ++ unlines (map showConstraint cs'))
+-- tcTrace ("constraints:\n" ++ unlines (map showConstraint cs'))
(unsolved, solved, improves) <- solveMany cs' [] [] []
putConstraints unsolved
- --traceM ("solved:\n" ++ unlines [ showIdent i ++ " = " ++ showExpr e | (i, e) <- solved ])
- --traceM ("unsolved:\n" ++ unlines [ showIdent i ++ " :: " ++ showEType t | (i, t) <- unsolved ])
+-- tcTrace ("solved:\n" ++ unlines [ showIdent i ++ " = " ++ showExpr e | (i, e) <- solved ])
+-- tcTrace ("unsolved:\n" ++ unlines [ showIdent i ++ " :: " ++ showEType t | (i, t) <- unsolved ])
if null improves then
return solved
else do
@@ -2612,16 +2665,16 @@
solveMany [] uns sol imp = return (uns, sol, imp)
-- Need to handle ct of the form C => T, and forall a . T
solveMany (cns@(di, ct) : cnss) uns sol imp = do
--- traceM ("trying " ++ showEType ct)
+-- tcTrace ("trying " ++ showEType ct)
let loc = getSLoc di
!(iCls, cts) = getApp ct
solver = head [ s | (p, s) <- solvers, p iCls ]
ads <- gets argDicts
-- Check if we have an exact match among the arguments dictionaries.
- -- This is importand to find tupled dictionaries in recursive calls.
+ -- This is important to find tupled dictionaries in recursive calls.
case [ ai | (ai, act) <- ads, ct `eqEType` act ] of
ai : _ -> do
- --traceM $ "solve with arg " ++ show ct
+ --tcTrace $ "solve with arg " ++ show ct
solveMany cnss uns ((di, EVar ai) : sol) imp
[] -> do
msol <- solver loc iCls cts
@@ -2632,10 +2685,11 @@
solveInst :: SolveOne
solveInst loc iCls cts = do
it <- gets instTable
--- traceM ("instances:\n" ++ unlines (map showInstDef (M.toList it)))
+-- tcTrace ("instances:\n" ++ unlines (map showInstDef (M.toList it)))
case M.lookup iCls it of
Nothing -> return Nothing -- no instances, so no chance
- Just (InstInfo atomMap insts fds) ->
+ Just (InstInfo atomMap insts fds) -> do
+ -- tcTrace $ "solveInst: " ++ showIdent iCls ++ " atomMap size=" ++ show (M.size atomMap)
case cts of
[EVar i] -> do
case M.lookup i atomMap of
@@ -2642,15 +2696,20 @@
-- If the goal is just (C T) and there is an instance, the solution is simple
Just e -> return $ Just (e, [], [])
-- Not found, but there might be a generic instance
- Nothing -> solveGen fds insts loc iCls cts
- _ -> solveGen fds insts loc iCls cts
+ Nothing -> solveGen (M.null atomMap) fds insts loc iCls cts
+ _ -> solveGen (M.null atomMap) fds insts loc iCls cts
-solveGen :: [IFunDep] -> [InstDict] -> SolveOne
-solveGen fds insts loc iCls cts = do
--- traceM ("solveGen " ++ show (iCls, cts))
- let matches = getBestMatches $ findMatches loc fds insts cts
--- traceM ("matches " ++ showListS show (findMatches loc fds insts cts))
--- traceM ("matches " ++ showListS showMatch matches)
+-- When matching constraint (C _a) against an instance of the form
+-- instance (C b) then we don't want to match if the
+-- _a is later instantiated and it turns out we should
+-- have matched a (C T) instead.
+solveGen :: Bool -> [IFunDep] -> [InstDict] -> SolveOne
+solveGen noAtoms fds insts loc iCls cts = do
+-- tcTrace ("solveGen: " ++ show (iCls, cts))
+-- tcTrace ("solveGen: insts=" ++ show insts)
+ let matches = getBestMatches $ findMatches noAtoms loc fds insts cts
+-- tcTrace ("solveGen: matches allMatches =" ++ showListS show (findMatches noAtoms loc fds insts cts))
+-- tcTrace ("solveGen: matches bestMatches=" ++ showListS showMatch matches)
case matches of
[] -> return Nothing
[(de, ctx, is)] ->
@@ -2658,7 +2717,7 @@
return $ Just (de, [], is)
else do
d <- newDictIdent loc
--- traceM ("constraint " ++ showIdent di ++ " :: " ++ showEType ct ++ "\n" ++
+-- tcTrace ("constraint " ++ showIdent di ++ " :: " ++ showEType ct ++ "\n" ++
-- " turns into " ++ showIdent d ++ " :: " ++ showEType (tupleConstraints ctx) ++ ", " ++
-- showIdent di ++ " = " ++ showExpr (EApp de (EVar d)))
return $ Just (EApp de (EVar d), [(d, tupleConstraints ctx)], is)
@@ -2677,7 +2736,7 @@
solveTypeEq loc _iCls [t1, t2] | isEUVar t1 || isEUVar t2 = return $ Just (ETuple [], [], [(loc, t1, t2)])
| otherwise = do
eqs <- gets typeEqTable
- --traceM ("solveTypeEq eqs=" ++ show eqs)
+ --tcTrace ("solveTypeEq eqs=" ++ show eqs)
case solveEq eqs t1 t2 of
Nothing -> return Nothing
Just (de, tts) -> do
@@ -2712,8 +2771,9 @@
-- For each matching instance return: (subst-size, (dict-expression, new-constraints))
-- The subst-size is the size of the substitution that made the input instance match.
-- It is a measure of how exact the match is.
-findMatches :: SLoc -> [IFunDep] -> [InstDict] -> [EType] -> [(Int, (Expr, [EConstraint], [Improve]))]
-findMatches loc fds ds its =
+findMatches :: Bool -> SLoc -> [IFunDep] -> [InstDict] -> [EType] -> [(Int, (Expr, [EConstraint], [Improve]))]
+findMatches False _ _ _ [EUVar _] = []
+findMatches _ loc fds ds its =
let rrr =
[ (length s, (de, map (substEUVar s) ctx, imp))
| (de, ctx, ts) <- ds, Just (s, imp) <- [matchTypes loc ts its fds] ]
@@ -2728,7 +2788,7 @@
substEUVar _ t@(ELit _ _) = t
substEUVar s (EApp f a) = EApp (substEUVar s f) (substEUVar s a)
substEUVar s t@(EUVar i) = fromMaybe t $ lookup i s
-substEUVar s (EForall iks t) = EForall iks (substEUVar s t)
+substEUVar s (EForall b iks t) = EForall b iks (substEUVar s t)
substEUVar _ _ = impossible
-- Length of lists match, because of kind correctness.
@@ -2755,7 +2815,7 @@
-- We don't allow output FDs to have tyvars that are not instantiated
let outImpTvs = metaTvs [ t | (_,t,_) <- imp ]
outTvs = metaTvs [ t | (True, t) <- zip ins ts' ] -- these tyvars were present in input positions in ts
--- traceM $ "matchTypesFD: " ++ show (ts, ts') ++ show (ins, outs) ++ show (tm, imp) ++ show (outTvs, outImpTvs)
+-- tcTrace $ "matchTypesFD: " ++ show (ts, ts') ++ show (ins, outs) ++ show (tm, imp) ++ show (outTvs, outImpTvs)
when (not (null (outImpTvs \\ outTvs))) $
errorMessage loc $ "free type variable in output fundep"
pure (tm, imp)
@@ -2769,6 +2829,7 @@
match r (EApp f a) (EApp f' a') = do
r' <- match r f f'
match r' a a'
+-- match _ _ (EUVar _) = Nothing
match r (EUVar i) t' =
-- For a variable, check that any previous match is the same.
case lookup i r of
@@ -2812,7 +2873,7 @@
(i, t) : _ -> do
t' <- derefUVar t
-- is <- gets instTable
--- traceM $ "Cannot satisfy constraint: " ++ unlines (map (\ (i, ii) -> show i ++ ":\n" ++ showInstInfo ii) (M.toList is))
+-- tcTrace $ "Cannot satisfy constraint: " ++ unlines (map (\ (i, ii) -> show i ++ ":\n" ++ showInstInfo ii) (M.toList is))
tcError (getSLoc i) $ "Cannot satisfy constraint: " ++ show t'
-- Add a type equality constraint.
--- a/src/Text/ParserComb.hs
+++ b/src/Text/ParserComb.hs
@@ -19,8 +19,7 @@
TokenMachine(..),
mapTokenState,
) where
---Ximport Prelude()
-import Prelude
+import Prelude(); import MHSPrelude
import Control.Applicative
import Control.Monad
--- a/src/Text/PrettyPrint/HughesPJLite.hs
+++ b/src/Text/PrettyPrint/HughesPJLite.hs
@@ -17,7 +17,7 @@
Style,
render, renderStyle,
) where
-import Prelude hiding ((<>))
+import Prelude(); import MHSPrelude hiding ((<>))
infixl 6 <>, <+>
infixl 5 $$, $+$
--- a/src/Text/PrettyPrint/HughesPJLiteClass.hs
+++ b/src/Text/PrettyPrint/HughesPJLiteClass.hs
@@ -25,6 +25,7 @@
-- re-export HughesPJ
module Text.PrettyPrint.HughesPJ
) where
+import Prelude(); import MHSPrelude hiding ((<>))
import Text.PrettyPrint.HughesPJ
--- /dev/null
+++ b/src/runtime/MachDeps.h
@@ -1,0 +1,2 @@
+#define WORD_SIZE_IN_BITS 64
+#undef WORDS_BIGENDIAN
--- a/src/runtime/bfile.c
+++ b/src/runtime/bfile.c
@@ -1,13 +1,67 @@
/***************** BFILE *******************/
/*
- * BFILE is used to access files.
- * It allows various "transducers" to be added
- * to the processing.
+ * BFILE is a family of stream objects.
+ * There are two kinds: endpoints (source/sink) and transducers.
+ * The streams are typically bytes.
+ *
+ * FILE source/sink for stdio FILE handles, handles
+ * buf source/sink where the read/write uses a memory buffer.
+ *
+ * lz77 transducer for LZ77 compression
+ * put - compresses a byte
+ * get - returns an decompressed byte
+ * rle transducer for Run Length Encoding
+ * put - compresses an ASCII character
+ * get - returns a decompressed ASCII
+ * bwt transducer for Burrows-Wheeler Transform
+ * put - transforms a byte
+ * get - untransforms a byte
+ * utf8 transducer for UTF8 encoding
+ * put - encodes a Unicode code point (int) to bytes
+ * get - decodes a Unicode code point
*/
+/**** Buffers for collecting data. */
+
+struct bfbuffer {
+ size_t size; /* total size of buffer */
+ size_t pos; /* current index into buffer */
+ uint8_t *buf; /* actual data */
+};
+
+void
+bfbuffer_init(struct bfbuffer *bf, size_t size)
+{
+ bf->size = size;
+ bf->pos = 0;
+ bf->buf = MALLOC(size);
+ if (!bf->buf)
+ ERR("bfbuffer_init");
+}
+
+void
+bfbuffer_snoc(struct bfbuffer *bf, int byte)
+{
+ if (bf->pos >= bf->size) {
+ bf->size *= 2;
+ bf->buf = REALLOC(bf->buf, bf->size);
+ if (!bf->buf)
+ ERR("bfbuffer_snoc");
+ }
+ bf->buf[bf->pos++] = byte;
+}
+
+void
+bfbuffer_free(struct bfbuffer *bf)
+{
+ FREE(bf->buf);
+}
+
+/*********************************/
+
/* Sanity checking */
-#define CHECKBFILE(p, f) do { if (p->getb != f) ERR("CHECKBFILE"); } while(0)
+#define CHECKBFILE(p, f) do { if (p->getb != f) { ERR("CHECKBFILE"); } } while(0)
/* BFILE will have different implementations, they all have these methods */
typedef struct BFILE {
@@ -92,7 +146,26 @@
}
}
-/***************** BFILE from static buffer *******************/
+void
+putint32(value_t n, BFILE *p)
+{
+ putb(n % 256, p); n /= 256;
+ putb(n % 256, p); n /= 256;
+ putb(n % 256, p); n /= 256;
+ putb(n % 256, p);
+}
+
+value_t
+getint32(BFILE *p)
+{
+ value_t b0 = getb(p);
+ value_t b1 = getb(p);
+ value_t b2 = getb(p);
+ value_t b3 = getb(p);
+ return ((((b3 * 256) + b2) * 256) + b1) * 256 + b0;
+}
+
+/***************** BFILE from/to memory buffer *******************/
struct BFILE_buffer {
BFILE mets;
size_t b_size;
@@ -111,6 +184,20 @@
}
void
+putb_buf(int c, BFILE *bp)
+{
+ struct BFILE_buffer *p = (struct BFILE_buffer *)bp;
+ CHECKBFILE(bp, getb_buf);
+ if (p->b_pos >= p->b_size) {
+ p->b_size *= 2;
+ p->b_buffer = realloc(p->b_buffer, p->b_size);
+ if (!p->b_buffer)
+ ERR("putb_buf");
+ }
+ p->b_buffer[p->b_pos++] = c;
+}
+
+void
ungetb_buf(int c, BFILE *bp)
{
struct BFILE_buffer *p = (struct BFILE_buffer *)bp;
@@ -121,17 +208,29 @@
}
void
-closeb_buf(BFILE *bp)
+closeb_rd_buf(BFILE *bp)
{
CHECKBFILE(bp, getb_buf);
FREE(bp);
}
-/* There is no open(). Only used with statically allocated buffers. */
+void
+closeb_wr_buf(BFILE *bp)
+{
+ CHECKBFILE(bp, getb_buf);
+ FREE(bp);
+}
+
+void
+flushb_buf(BFILE *bp)
+{
+ CHECKBFILE(bp, getb_buf);
+}
+
struct BFILE*
-openb_buf(uint8_t *buf, size_t len)
+openb_rd_buf(uint8_t *buf, size_t len)
{
- struct BFILE_buffer *p = MALLOC(sizeof(struct BFILE_buffer));;
+ struct BFILE_buffer *p = MALLOC(sizeof(struct BFILE_buffer));
if (!p)
memerr();
p->mets.getb = getb_buf;
@@ -138,7 +237,7 @@
p->mets.ungetb = ungetb_buf;
p->mets.putb = 0;
p->mets.flushb = 0;
- p->mets.closeb = closeb_buf;
+ p->mets.closeb = closeb_rd_buf;
p->b_size = len;
p->b_pos = 0;
p->b_buffer = buf;
@@ -145,6 +244,41 @@
return (struct BFILE*)p;
}
+struct BFILE*
+openb_wr_buf(void)
+{
+ struct BFILE_buffer *p = MALLOC(sizeof(struct BFILE_buffer));
+ if (!p)
+ memerr();
+ p->mets.getb = getb_buf; /* Just to make CHECKFILE happy */
+ p->mets.ungetb = 0;
+ p->mets.putb = putb_buf;
+ p->mets.flushb = flushb_buf;
+ p->mets.closeb = closeb_wr_buf;
+ p->b_size = 1000;
+ p->b_pos = 0;
+ p->b_buffer = malloc(p->b_size);
+ if (!p->b_buffer)
+ ERR("openb_wr_buf");
+ return (struct BFILE*)p;
+}
+
+/*
+ * Get the buffer used by writing.
+ * This should be the last operation before closing,
+ * since the buffer can move when writing.
+ * The caller of openb_wr_buf() and get_buf() owns
+ * the memory and must free it.
+ */
+void
+get_buf(struct BFILE *bp, uint8_t **bufp, size_t *lenp)
+{
+ struct BFILE_buffer *p = (struct BFILE_buffer *)bp;
+ CHECKBFILE(bp, getb_buf);
+ *bufp = p->b_buffer;
+ *lenp = p->b_pos;
+}
+
#if WANT_STDIO
/***************** BFILE via FILE *******************/
struct BFILE_file {
@@ -223,10 +357,9 @@
struct BFILE_lz77 {
BFILE mets;
BFILE *bfile; /* underlying BFILE */
- uint8_t *buf;
- size_t len;
- size_t pos;
+ struct bfbuffer bf;
int read;
+ int numflush;
};
int
@@ -234,9 +367,9 @@
{
struct BFILE_lz77 *p = (struct BFILE_lz77*)bp;
CHECKBFILE(bp, getb_lz77);
- if (p->pos >= p->len)
+ if (p->bf.pos >= p->bf.size)
return -1;
- return p->buf[p->pos++];
+ return p->bf.buf[p->bf.pos++];
}
void
@@ -244,7 +377,7 @@
{
struct BFILE_lz77 *p = (struct BFILE_lz77*)bp;
CHECKBFILE(bp, getb_lz77);
- p->pos--;
+ p->bf.pos--;
}
void
@@ -253,13 +386,29 @@
struct BFILE_lz77 *p = (struct BFILE_lz77*)bp;
CHECKBFILE(bp, getb_lz77);
- if (p->pos >= p->len) {
- p->len *= 2;
- p->buf = realloc(p->buf, p->len);
- if (!p->buf)
- memerr();
+ bfbuffer_snoc(&p->bf, b);
+}
+
+/* Compress and write to output BFILE */
+void
+flushb_lz77(BFILE *bp)
+{
+ struct BFILE_lz77 *p = (struct BFILE_lz77*)bp;
+ CHECKBFILE(bp, getb_lz77);
+
+ /* If we have had a flush, and there is no new data then do nothing */
+ if (p->numflush++ && !p->bf.pos)
+ return;
+ uint8_t *obuf;
+ size_t olen = lz77c(p->bf.buf, p->bf.pos, &obuf);
+ putsb("LZ1", p->bfile); /* Version no */
+ putint32(olen, p->bfile); /* 32 bit length */
+ for (size_t i = 0; i < olen; i++) {
+ putb(obuf[i], p->bfile); /* and the data */
}
- p->buf[p->pos++] = b;
+ free(obuf);
+ p->bf.pos = 0;
+ flushb(p->bfile);
}
void
@@ -270,13 +419,8 @@
if (!p->read) {
/* We are in write mode, so compress and push it down */
- uint8_t *obuf;
- size_t olen = lz77c(p->buf, p->pos, &obuf);
- FREE(p->buf);
- for (size_t i = 0; i < olen; i++) {
- putb(obuf[i], p->bfile);
- }
- FREE(obuf);
+ flushb_lz77(bp);
+ bfbuffer_free(&p->bf);
}
closeb(p->bfile);
@@ -283,12 +427,6 @@
FREE(p);
}
-void
-flushb_lz77(BFILE *bp)
-{
- /* There is nothing we can do */
-}
-
BFILE *
add_lz77_decompressor(BFILE *file)
{
@@ -304,27 +442,22 @@
p->mets.closeb = closeb_lz77;
p->read = 1;
p->bfile = file;
+ p->numflush = 0;
- size_t size = 25000;
- uint8_t *buf = MALLOC(size);
- size_t i;
+ /* First check version */
+ if (getb(file) != 'L' || getb(file) != 'Z' || getb(file) != '1')
+ ERR("Bad LZ77 signature");
+
+ size_t size = getint32(file); /* then read size */
+ uint8_t *buf = MALLOC(size); /* temporary buffer for input */
if (!buf)
memerr();
- for(i = 0;;) {
- int b = getb(file);
- if (b < 0)
- break;
- if (i >= size) {
- size *= 2;
- buf = realloc(buf, size);
- if (!buf)
- memerr();
- }
- buf[i++] = b;
+ for(size_t i = 0; i < size; i++) {
+ buf[i] = getb(file); /* and read data */
}
- p->len = lz77d(buf, i, &p->buf);
+ p->bf.size = lz77d(buf, size, &p->bf.buf); /* decompress */
FREE(buf);
- p->pos = 0;
+ p->bf.pos = 0;
return (BFILE*)p;
}
@@ -343,16 +476,431 @@
p->mets.closeb = closeb_lz77;
p->read = 0;
p->bfile = file;
+ p->numflush = 0;
- p->len = 25000;
- p->buf = MALLOC(p->len);
- if (!p->buf)
- memerr();
- p->pos = 0;
+ bfbuffer_init(&p->bf, 25000);
return (BFILE*)p;
}
#endif /* WANT_LZ77 */
+
+#if WANT_RLE
+/***************** BFILE via RLE decompression *******************/
+/*
+ * Run Length Encoding for ASCII
+ * Format
+ * c - c one ASCII character
+ * 0x80+n c - n repetitions of ASCII character c
+ * 0x80+n 0x80+m c - n*128+m repetitions of ASCII character c
+ * ... for longer run lengths
+ * Non-ASCII (i.e., >= 128) have very poor encoding:
+ * 0x81 c-0x80
+ */
+
+struct BFILE_rle {
+ BFILE mets;
+ BFILE *bfile; /* underlying BFILE */
+ size_t count;
+ int byte;
+ int unget;
+ int read;
+};
+
+int
+get_rep(BFILE *in)
+{
+ size_t n = 0;
+ for(;;) {
+ int c = getb(in);
+ //fprintf(stderr,"get_rep %02x\n", c);
+ if (c < 0)
+ return -1;
+ if (c < 128) {
+ ungetb(c, in);
+ return n;
+ }
+ n = n * 128 + c - 128;
+ }
+}
+
+int
+getb_rle(BFILE *bp)
+{
+ struct BFILE_rle *p = (struct BFILE_rle*)bp;
+ CHECKBFILE(bp, getb_rle);
+ if (p->unget >= 0) {
+ int c = p->unget;
+ p->unget = -1;
+ return c;
+ }
+ if (p->count) {
+ p->count--;
+ return p->byte;
+ } else {
+ int n = get_rep(p->bfile);
+ if (n < 0) {
+ return -1;
+ } else if (n == 1) {
+ /* repetition count == 1 means a non-ASCII byte */
+ return getb(p->bfile) | 0x80;
+ } else {
+ p->count = n;
+ p->byte = getb(p->bfile);
+ return p->byte;
+ }
+ }
+}
+
+void
+ungetb_rle(int c, BFILE *bp)
+{
+ struct BFILE_rle *p = (struct BFILE_rle*)bp;
+ CHECKBFILE(bp, getb_rle);
+ p->unget = c;
+}
+
+void
+put_rep(BFILE *out, size_t n)
+{
+ if (n > 127)
+ put_rep(out, n / 128);
+ putb(n % 128 + 128, out);
+}
+
+void
+out_rle(struct BFILE_rle *p)
+{
+ if (p->count > 2) {
+ /* More than 2 repeating chars, it's worth compressing */
+ put_rep(p->bfile, p->count - 1);
+ putb(p->byte, p->bfile);
+ } else {
+ while(p->count-- > 0)
+ putb(p->byte, p->bfile);
+ }
+}
+
+void
+putb_rle(int b, BFILE *bp)
+{
+ struct BFILE_rle *p = (struct BFILE_rle*)bp;
+ CHECKBFILE(bp, getb_rle);
+
+ if (b & 0x80) {
+ /* Encode non-ASCII as repetition count 1, followed by the byte with MSB removed */
+ out_rle(p);
+ put_rep(p->bfile, 1);
+ putb(b & 0x7f, p->bfile);
+ p->count = 0;
+ p->byte = -1;
+ } else if (b == p->byte) {
+ p->count++;
+ } else {
+ out_rle(p);
+ p->count = 1;
+ p->byte = b;
+ }
+}
+
+void
+closeb_rle(BFILE *bp)
+{
+ struct BFILE_rle *p = (struct BFILE_rle*)bp;
+ CHECKBFILE(bp, getb_rle);
+
+ if (!p->read)
+ flushb(bp);
+
+ closeb(p->bfile);
+}
+
+void
+flushb_rle(BFILE *bp)
+{
+ struct BFILE_rle *p = (struct BFILE_rle*)bp;
+ CHECKBFILE(bp, getb_rle);
+
+ /* output last byte(s) */
+ out_rle(p);
+ p->count = 0;
+ flushb(p->bfile);
+}
+
+BFILE *
+add_rle_decompressor(BFILE *file)
+{
+ struct BFILE_rle *p = MALLOC(sizeof(struct BFILE_rle));
+
+ if (!p)
+ memerr();
+ p->mets.getb = getb_rle;
+ p->mets.ungetb = ungetb_rle;
+ p->mets.putb = 0;
+ p->mets.flushb = 0;
+ p->mets.closeb = closeb_rle;
+ p->count = 0;
+ p->unget = -1;
+ p->bfile = file;
+ p->read = 1;
+
+ return (BFILE*)p;
+}
+
+BFILE *
+add_rle_compressor(BFILE *file)
+{
+ struct BFILE_rle *p = MALLOC(sizeof(struct BFILE_rle));
+
+ if (!p)
+ memerr();
+ p->mets.getb = getb_rle;
+ p->mets.ungetb = 0;
+ p->mets.putb = putb_rle;
+ p->mets.flushb = flushb_rle;
+ p->mets.closeb = closeb_rle;
+ p->count = 0;
+ p->byte = -1;
+ p->bfile = file;
+ p->read = 0;
+
+ return (BFILE*)p;
+}
+
+#endif /* WANT_RLE */
+
+#if WANT_BWT
+/***************** BFILE via Burrows-Wheeler Transform *******************/
+/*
+ */
+
+struct BFILE_bwt {
+ BFILE mets;
+ BFILE *bfile; /* underlying BFILE */
+ size_t count;
+ struct bfbuffer bf;
+ int read;
+ int numflush;
+};
+
+int
+getb_bwt(BFILE *bp)
+{
+ struct BFILE_bwt *p = (struct BFILE_bwt*)bp;
+ CHECKBFILE(bp, getb_bwt);
+ if (p->bf.pos >= p->bf.size)
+ return -1;
+ return p->bf.buf[p->bf.pos++];
+}
+
+void
+ungetb_bwt(int c, BFILE *bp)
+{
+ struct BFILE_bwt *p = (struct BFILE_bwt*)bp;
+ CHECKBFILE(bp, getb_bwt);
+ p->bf.pos--;
+}
+
+void
+putb_bwt(int b, BFILE *bp)
+{
+ struct BFILE_bwt *p = (struct BFILE_bwt*)bp;
+ CHECKBFILE(bp, getb_bwt);
+
+ bfbuffer_snoc(&p->bf, b);
+}
+
+void
+closeb_bwt(BFILE *bp)
+{
+ struct BFILE_bwt *p = (struct BFILE_bwt*)bp;
+ CHECKBFILE(bp, getb_bwt);
+
+ if (!p->read)
+ flushb(bp);
+
+ closeb(p->bfile);
+}
+
+/* Sort all rotations of buf, and the indices of the sorted strings in res. */
+/*
+ * |.......................................|
+ * ^ ^
+ * a b
+ * <- n ->
+ * <- m ->
+ * <- o ->
+ */
+static uint8_t *compar_arg;
+static size_t compar_len;
+int compar(const void *pa, const void *pb)
+{
+ uint32_t a = *(uint32_t*)pa;
+ uint32_t b = *(uint32_t*)pb;
+ int r;
+ if (a == b)
+ return 0;
+ if (a < b) {
+ size_t n = compar_len - b; /* bytes until end of buffer */
+ r = memcmp(compar_arg + a, compar_arg + b, n);
+ if (r)
+ return r;
+ size_t m = b - a;
+ r = memcmp(compar_arg + a + n, compar_arg, m);
+ if (r)
+ return r;
+ size_t o = a;
+ return memcmp(compar_arg, compar_arg + m, o);
+ } else {
+ size_t n = compar_len - a; /* bytes until end of buffer */
+ r = memcmp(compar_arg + a, compar_arg + b, n);
+ if (r)
+ return r;
+ size_t m = a - b;
+ r = memcmp(compar_arg, compar_arg + b + n, m);
+ if (r)
+ return r;
+ size_t o = a;
+ return memcmp(compar_arg + m, compar_arg, o);
+
+ }
+ return 0;
+}
+
+void
+sort_buffer(uint8_t *buf, size_t buflen, uint32_t *res)
+{
+ for(size_t i = 0; i < buflen; i++)
+ res[i] = i;
+ compar_arg = buf;
+ compar_len = buflen;
+ qsort(res, buflen, sizeof(uint32_t), compar);
+}
+
+uint32_t
+encode_bwt(uint8_t *data, size_t len, uint8_t *last)
+{
+ uint32_t *res = malloc(len * sizeof(uint32_t));
+ if (!res)
+ ERR("encode_bwt");
+ sort_buffer(data, len, res);
+ uint32_t zero = 0;
+ for(size_t i = 0; i < len; i++) {
+ uint32_t offs = res[i];
+ last[i] = data[(offs + len - 1) % len];
+ if (offs == 0)
+ zero = i;
+ }
+ return zero;
+}
+
+void
+flushb_bwt(BFILE *bp)
+{
+ struct BFILE_bwt *p = (struct BFILE_bwt*)bp;
+ CHECKBFILE(bp, getb_bwt);
+
+ /* If we have had a flush, and there is no new data then do nothing */
+ if (p->numflush++ && !p->bf.pos)
+ return;
+ putsb("BW1", p->bfile); /* version no */
+ putint32(p->bf.pos, p->bfile); /* 32 bit length */
+ uint8_t *last = malloc(p->bf.pos);
+ if (!last)
+ ERR("flushb_bwt");
+ size_t zero = encode_bwt(p->bf.buf, p->bf.pos, last);
+ putint32(zero, p->bfile);
+ for(size_t i = 0; i < p->bf.pos; i++)
+ putb(last[i], p->bfile);
+ FREE(last);
+ p->bf.pos = 0;
+ flushb(p->bfile);
+}
+
+#define MAXBYTE 256
+
+void
+decode_bwt(uint8_t *data, size_t len, uint8_t *odata, size_t zero)
+{
+ size_t count[MAXBYTE];
+ uint32_t *pred = malloc(len * sizeof(uint32_t));
+ for(size_t i = 0; i < MAXBYTE; i++) {
+ count[i] = 0;
+ }
+ for(size_t i = 0; i < len; i++) {
+ pred[i] = count[data[i]]++;
+ }
+ size_t sum = 0;
+ for(size_t i = 0; i < MAXBYTE; i++) {
+ size_t s = count[i];
+ count[i] = sum;
+ sum += s;
+ }
+ size_t i = zero;
+ for(size_t j = len; j > 0; j--) {
+ odata[j - 1] = data[i];
+ i = pred[i] + count[data[i]];
+ }
+}
+
+BFILE *
+add_bwt_decompressor(BFILE *file)
+{
+ struct BFILE_bwt *p = MALLOC(sizeof(struct BFILE_bwt));
+
+ if (!p)
+ memerr();
+ memset(p, 0, sizeof(struct BFILE_bwt));
+ p->mets.getb = getb_bwt;
+ p->mets.ungetb = ungetb_bwt;
+ p->mets.putb = 0;
+ p->mets.flushb = 0;
+ p->mets.closeb = closeb_bwt;
+ p->read = 1;
+ p->bfile = file;
+ p->numflush = 0;
+
+ /* First check version */
+ if (getb(file) != 'B' || getb(file) != 'W' || getb(file) != '1')
+ ERR("Bad BWT signature");
+
+ size_t size = getint32(file); /* then read size */
+ uint32_t zero = getint32(file);
+
+ uint8_t *buf = MALLOC(size); /* temporary buffer for input */
+ if (!buf)
+ memerr();
+ for(size_t i = 0; i < size; i++) {
+ buf[i] = getb(file); /* and read data */
+ }
+ bfbuffer_init(&p->bf, size);
+ decode_bwt(buf, size, p->bf.buf, zero); /* decode */
+ FREE(buf);
+
+ return (BFILE*)p;
+}
+
+BFILE *
+add_bwt_compressor(BFILE *file)
+{
+ struct BFILE_bwt *p = MALLOC(sizeof(struct BFILE_bwt));
+
+ if (!p)
+ memerr();
+ p->mets.getb = getb_bwt;
+ p->mets.ungetb = 0;
+ p->mets.putb = putb_bwt;
+ p->mets.flushb = flushb_bwt;
+ p->mets.closeb = closeb_bwt;
+ p->read = 0;
+ p->bfile = file;
+ p->numflush = 0;
+
+ bfbuffer_init(&p->bf, 25000);
+ return (BFILE*)p;
+}
+
+#endif /* WANT_BWT */
+
/***************** BFILE with UTF8 encode/decode *******************/
struct BFILE_utf8 {
--- /dev/null
+++ b/src/runtime/config-esp32.h
@@ -1,0 +1,89 @@
+/*
+ * Various platform specific configuration.
+ */
+
+/*
+ * Include stdio functions.
+ * Without this none of the file I/O in System.IO is available.
+ */
+#define WANT_STDIO 0
+
+/*
+ * Include ops for floating point arithmetic.
+ * Without this +,-,* etc will not be available for the Double type.
+ */
+#define WANT_FLOAT 1
+
+/*
+ * Include <math.h>
+ * Without this, exp,sin, etc are not available.
+ */
+#define WANT_MATH 0
+
+/*
+ * Include MD5 checksumming code
+ */
+#define WANT_MD5 0
+
+/*
+ * Include profiling code
+ */
+#define WANT_TICK 0
+
+/*
+ * Process argc, argv
+ */
+#define WANT_ARGS 0
+
+/*
+ * Number of bits in a word. Only 32 and 64 are supported.
+ */
+//#define WORD_SIZE 32
+
+/*
+ * Find First Set
+ * This macro must be defined.
+ * It return the number of the least significant bit that is set.
+ * Numberings starts from 1. If no bit is set, it should return 0.
+ */
+// #define FFS
+
+/*
+ * This is the character used for comma-separation in printf.
+ * Defaults to "'".
+ */
+/* #define PCOMMA "'" */
+
+
+/*
+ * Get a raw input character.
+ * If undefined, the default always returns -1
+ */
+/* #define GETRAW */
+
+
+/*
+ * Get time since some epoch in milliseconds.
+ */
+/* #define GETTIMEMILLI */
+
+
+/*
+ * The ERR macro should report an error and exit.
+ * If not defined, a generic one will be used.
+ */
+/* #define ERR(s) */
+/* #define ERR1(s,a) */
+
+#define GCRED 0 /* do some reductions during GC */
+#define FASTTAGS 1 /* compute tag by pointer subtraction */
+#define INTTABLE 1 /* use fixed table of small INT nodes */
+#define SANITY 1 /* do some sanity checks */
+#define STACKOVL 1 /* check for stack overflow */
+
+#define HEAP_CELLS 4000
+#define STACK_SIZE 500
+
+#define MAIN void app_main(void)
+
+#define INITIALIZATION
--- a/src/runtime/config-unix-32.h
+++ b/src/runtime/config-unix-32.h
@@ -4,4 +4,7 @@
//#define WORD_SIZE 32
#undef FFS
+#if _POSIX_VERSION >= 200112L
#define FFS ffs
+#endif
+
--- a/src/runtime/config-unix-64.h
+++ b/src/runtime/config-unix-64.h
@@ -39,6 +39,11 @@
#define WANT_DIR 1
/*
+ * Include time_t type
+ */
+#define WANT_TIME 1
+
+/*
* Number of bits in a word. Only 32 and 64 are supported.
*/
//#define WORD_SIZE 64
@@ -45,11 +50,21 @@
/*
* Find First Set
- * This macro must be defined.
+ * This macro should be defined.
* It returns the number of the least significant bit that is set.
* Numberings starts from 1. If no bit is set, it should return 0.
*/
+#if defined(__gnu_linux__) || defined(__APPLE__) || defined(__FreeBSD__)
+/* Only some platforms have 64 bit ffsl function directly. */
#define FFS ffsl
+#elif defined(__GNUC__)
+/* GCC has ffsl as a builtin. */
+#define FFS __builtin_ffsl
+/* CLANG has ffsl as a builtin. */
+#elif defined(__clang__) && __has_builtin(__builtin__ffsl)
+#define FFS __builtin_ffsl
+#endif
+
/*
* This is the character used for comma-separation in printf.
--- /dev/null
+++ b/src/runtime/eval-esp32.c
@@ -1,0 +1,6 @@
+/* Copyright 2023 Lennart Augustsson
+ * See LICENSE file for full license.
+ */
+#include "config-esp32.h"
+
+#include "eval.c"
--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -19,6 +19,9 @@
#include <sys/stat.h>
#include <sys/types.h>
#endif /* WANT_DIR */
+#if WANT_TIME
+#include <time.h>
+#endif
#if WANT_MD5
#include "md5.h"
@@ -28,6 +31,14 @@
#define WANT_LZ77 1
#endif
+#if !defined(WANT_RLE)
+#define WANT_RLE 1
+#endif
+
+#if !defined(WANT_BWT)
+#define WANT_BWT 1
+#endif
+
#if WANT_LZ77
size_t lz77d(uint8_t *src, size_t srclen, uint8_t **bufp);
size_t lz77c(uint8_t *src, size_t srclen, uint8_t **bufp);
@@ -59,6 +70,10 @@
#define MALLOC malloc
#endif
+#if !defined(REALLOC)
+#define REALLOC realloc
+#endif
+
#if !defined(FREE)
#define FREE free
#endif
@@ -162,17 +177,18 @@
#endif /* WANT_STDIO */
#endif /* !define(ERR) */
-enum node_tag { T_FREE, T_IND, T_AP, T_INT, T_DBL, T_PTR, T_FUNPTR, T_FORPTR, T_BADDYN, T_ARR,
+enum node_tag { T_FREE, T_IND, T_AP, T_INT, T_DBL, T_PTR, T_FUNPTR, T_FORPTR, T_BADDYN, T_ARR, T_BSTR,
T_S, T_K, T_I, T_B, T_C,
T_A, T_Y, T_SS, T_BB, T_CC, T_P, T_R, T_O, T_U, T_Z,
T_K2, T_K3, T_K4, T_CCB,
T_ADD, T_SUB, T_MUL, T_QUOT, T_REM, T_SUBR, T_UQUOT, T_UREM, T_NEG,
T_AND, T_OR, T_XOR, T_INV, T_SHL, T_SHR, T_ASHR,
- T_EQ, T_NE, T_LT, T_LE, T_GT, T_GE, T_ULT, T_ULE, T_UGT, T_UGE,
- T_FPADD, T_FP2P, T_FPNEW, T_FPFIN,
+ T_EQ, T_NE, T_LT, T_LE, T_GT, T_GE, T_ULT, T_ULE, T_UGT, T_UGE, T_ICMP, T_UCMP,
+ T_FPADD, T_FP2P, T_FPNEW, T_FPFIN, // T_FPSTR,
T_TOPTR, T_TOINT, T_TODBL, T_TOFUNPTR,
T_BININT2, T_BININT1, T_UNINT1,
T_BINDBL2, T_BINDBL1, T_UNDBL1,
+ T_BINBS2, T_BINBS1,
#if WANT_FLOAT
T_FADD, T_FSUB, T_FMUL, T_FDIV, T_FNEG, T_ITOF,
T_FEQ, T_FNE, T_FLT, T_FLE, T_FGT, T_FGE, T_FSHOW, T_FREAD,
@@ -187,8 +203,10 @@
T_IO_PERFORMIO, T_IO_GETTIMEMILLI, T_IO_PRINT, T_CATCH,
T_IO_CCALL, T_IO_GC, T_DYNSYM,
T_NEWCASTRINGLEN, T_PEEKCASTRING, T_PEEKCASTRINGLEN,
- T_FROMUTF8,
- T_STR,
+ T_BSAPPEND, T_BSAPPEND3, T_BSEQ, T_BSNE, T_BSLT, T_BSLE, T_BSGT, T_BSGE, T_BSCMP,
+ T_BSPACK, T_BSUNPACK, T_BSLENGTH, T_BSSUBSTR,
+ T_BSFROMUTF8, T_BSTOUTF8, T_BSHEADUTF8,
+ T_BSAPPENDDOT,
T_LAST_TAG,
};
#if 0
@@ -218,7 +236,7 @@
"IO_PERFORMIO", "IO_GETTIMEMILLI", "IO_PRINT", "CATCH",
"IO_CCALL", "IO_GC", "DYNSYM",
"NEWCASTRINGLEN", "PEEKCASTRING", "PEEKCASTRINGLEN",
- "FROMUTF8",
+ "BSFROMUTF8",
"STR",
"LAST_TAG",
};
@@ -225,7 +243,7 @@
#endif
struct ioarray;
-struct ustring;
+struct bytestring;
struct forptr;
typedef struct node {
@@ -237,12 +255,11 @@
struct node *uuarg;
value_t uuvalue;
flt_t uufloatvalue;
- struct ustring *uustring;
const char *uucstring;
void *uuptr;
HsFunPtr uufunptr;
struct ioarray *uuarray;
- struct forptr *uuforptr;
+ struct forptr *uuforptr; /* foreign pointers and byte arrays */
} uarg;
} node;
typedef struct node* NODEPTR;
@@ -256,11 +273,11 @@
#define SETDBLVALUE(p,v) (p)->uarg.uufloatvalue = v
#define FUN(p) (p)->ufun.uufun
#define ARG(p) (p)->uarg.uuarg
-#define STR(p) (p)->uarg.uustring
#define CSTR(p) (p)->uarg.uucstring
#define PTR(p) (p)->uarg.uuptr
#define FUNPTR(p) (p)->uarg.uufunptr
#define FORPTR(p) (p)->uarg.uuforptr
+#define BSTR(p) (p)->uarg.uuforptr->payload
#define ARR(p) (p)->uarg.uuarray
#define INDIR(p) ARG(p)
#define NODE_SIZE sizeof(node)
@@ -269,11 +286,11 @@
node *cells; /* All cells */
/*
- * UTF-8 encoded strings
+ * byte arrays
*/
-struct ustring {
+struct bytestring {
size_t size;
- unsigned char string[1];
+ void *string;
};
/*
@@ -309,14 +326,23 @@
struct final *next; /* the next finalizer */
HsFunPtr final; /* function to call to release resource */
void *arg; /* argument to final when called */
+ size_t size; /* size of memory, if known, otherwise NOSIZE */
+#define NOSIZE ~0 /* used as the size in payload for actual foreign pointers */
struct forptr *back; /* back pointer to the first forptr */
int marked; /* mark bit for GC */
};
+/*
+ * Foreign pointers are also used to represent bytestrings.
+ * The difference between a foreign pointer and a bytestring
+ * is that we can serialize the latter.
+ * The size field is non-zero only for bytestrings.
+ */
struct forptr {
- struct forptr *next; /* the next ForeignPtr that shares the same finilizer */
- void *payload; /* the actual pointer to allocated data */
- struct final *finalizer; /* the finalizer for this ForeignPtr */
+ struct forptr *next; /* the next ForeignPtr that shares the same finalizer */
+ struct final *finalizer; /* the finalizer for this ForeignPtr */
+ struct bytestring payload; /* the actual pointer to allocated data, and maybe a size */
+ // char *desc;
};
struct final *final_root = 0; /* root of all allocated foreign pointers, linked by next */
@@ -324,6 +350,7 @@
counter_t num_alloc = 0;
counter_t num_gc = 0;
uintptr_t gc_mark_time = 0;
+uintptr_t gc_scan_time = 0;
uintptr_t run_time = 0;
#define MAXSTACKDEPTH 0
@@ -360,7 +387,14 @@
counter_t num_free;
counter_t num_arr_alloc;
counter_t num_arr_free;
+counter_t num_fin_alloc;
counter_t num_fin_free;
+counter_t num_bs_alloc;
+counter_t num_bs_alloc_max;
+counter_t num_bs_free;
+counter_t num_bs_bytes;
+counter_t num_bs_inuse;
+counter_t num_bs_inuse_max;
#define BITS_PER_WORD (sizeof(bits_t) * 8)
bits_t *free_map; /* 1 bit per node, 0=free, 1=used */
@@ -425,7 +459,7 @@
#if WANT_TICK
struct tick_entry {
- struct ustring *tick_name;
+ struct bytestring tick_name;
counter_t tick_count;
} *tick_table = 0;
size_t tick_table_size;
@@ -433,7 +467,7 @@
/* Allocate a new tick table entry and return the index. */
size_t
-add_tick_table(struct ustring *name)
+add_tick_table(struct bytestring name)
{
if (!tick_table) {
tick_table_size = 100;
@@ -444,7 +478,7 @@
}
if (tick_index >= tick_table_size) {
tick_table_size *= 2;
- tick_table = realloc(tick_table, tick_table_size * sizeof(struct tick_entry));
+ tick_table = REALLOC(tick_table, tick_table_size * sizeof(struct tick_entry));
if (!tick_table)
memerr();
}
@@ -470,7 +504,7 @@
for (size_t i = 0; i < tick_index; i++) {
counter_t n = tick_table[i].tick_count;
if (n)
- fprintf(f, "%-60s %10"PRIcounter"\n", tick_table[i].tick_name->string, n);
+ fprintf(f, "%-60s %10"PRIcounter"\n", (char *)tick_table[i].tick_name.string, n);
}
}
#endif
@@ -542,11 +576,9 @@
heapoffs_t pos;
NODEPTR n;
-#if 1
/* This can happen if we run out of memory when parsing. */
if (num_free <= 0)
ERR("alloc_node");
-#endif
for(;;) {
heapoffs_t word = free_map[i];
@@ -592,6 +624,7 @@
NODEPTR combShowExn, combU, combK2;
NODEPTR combBININT1, combBININT2, combUNINT1;
NODEPTR combBINDBL1, combBINDBL2, combUNDBL1;
+NODEPTR combBINBS1, combBINBS2;
NODEPTR comb_stdin, comb_stdout, comb_stderr;
/* One node of each kind for primitives, these are never GCd. */
@@ -658,6 +691,22 @@
{ "fshow", T_FSHOW},
{ "fread", T_FREAD},
#endif /* WANT_FLOAT */
+
+ { "bs++", T_BSAPPEND},
+ { "bs++.", T_BSAPPENDDOT},
+ { "bs+++", T_BSAPPEND3},
+ { "bs==", T_BSEQ, T_BSEQ},
+ { "bs/=", T_BSNE, T_BSNE},
+ { "bs<", T_BSLT},
+ { "bs<=", T_BSLE},
+ { "bs>", T_BSGT},
+ { "bs>=", T_BSGE},
+ { "bscmp", T_BSCMP},
+ { "bspack", T_BSPACK},
+ { "bsunpack", T_BSUNPACK},
+ { "bslength", T_BSLENGTH},
+ { "bssubstr", T_BSSUBSTR},
+
{ "ord", T_I },
{ "chr", T_I },
{ "==", T_EQ, T_EQ },
@@ -674,14 +723,18 @@
{ "fp2p", T_FP2P },
{ "fpnew", T_FPNEW },
{ "fpfin", T_FPFIN },
+ // { "fpstr", T_FPSTR },
{ "seq", T_SEQ },
{ "equal", T_EQUAL, T_EQUAL },
{ "sequal", T_EQUAL, T_EQUAL },
{ "compare", T_COMPARE },
{ "scmp", T_COMPARE },
- { "icmp", T_COMPARE },
+ { "icmp", T_ICMP },
+ { "ucmp", T_UCMP },
{ "rnf", T_RNF },
- { "fromUTF8", T_FROMUTF8 },
+ { "fromUTF8", T_BSFROMUTF8 },
+ { "toUTF8", T_BSTOUTF8 },
+ { "headUTF8", T_BSHEADUTF8 },
/* IO primops */
{ "IO.>>=", T_IO_BIND },
{ "IO.>>", T_IO_THEN },
@@ -719,7 +772,26 @@
enum node_tag flip_ops[T_LAST_TAG];
#endif
+#if WANT_STDIO
+/* Create a dummy foreign pointer for the standard stdio handles. */
+/* These handles are never gc():d. */
void
+mk_std(NODEPTR n, FILE *f)
+{
+ struct final *fin = calloc(1, sizeof(struct final));
+ struct forptr *fp = calloc(1, sizeof(struct forptr));
+ if (!fin || !fp)
+ memerr();
+ BFILE *bf = add_utf8(add_FILE(f));
+ SETTAG(n, T_FORPTR);
+ FORPTR(n) = fp;
+ fin->arg = bf;
+ fin->back = fp;
+ fp->payload.string = bf;
+}
+#endif
+
+void
init_nodes(void)
{
enum node_tag t;
@@ -759,10 +831,12 @@
case T_BINDBL1: combBINDBL1 = n; break;
case T_BINDBL2: combBINDBL2 = n; break;
case T_UNDBL1: combUNDBL1 = n; break;
+ case T_BINBS1: combBINBS1 = n; break;
+ case T_BINBS2: combBINBS2 = n; break;
#if WANT_STDIO
- case T_IO_STDIN: comb_stdin = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stdin)); break;
- case T_IO_STDOUT: comb_stdout = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stdout)); break;
- case T_IO_STDERR: comb_stderr = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stderr)); break;
+ case T_IO_STDIN: comb_stdin = n; mk_std(n, stdin); break;
+ case T_IO_STDOUT: comb_stdout = n; mk_std(n, stdout); break;
+ case T_IO_STDERR: comb_stderr = n; mk_std(n, stderr); break;
#endif /* WANT_STDIO */
default:
break;
@@ -791,10 +865,12 @@
case T_BINDBL1: combBINDBL1 = n; break;
case T_BINDBL2: combBINDBL2 = n; break;
case T_UNDBL1: combUNDBL1 = n; break;
+ case T_BINBS1: combBINBS1 = n; break;
+ case T_BINBS2: combBINBS2 = n; break;
#if WANT_STDIO
- case T_IO_STDIN: comb_stdin = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stdin)); break;
- case T_IO_STDOUT: comb_stdout = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stdout)); break;
- case T_IO_STDERR: comb_stderr = n; SETTAG(n, T_PTR); PTR(n) = add_utf8(add_FILE(stderr)); break;
+ case T_IO_STDIN: comb_stdin = n; mk_std(n, stdin); break;
+ case T_IO_STDOUT: comb_stdout = n; mk_std(n, stdout); break;
+ case T_IO_STDERR: comb_stderr = n; mk_std(n, stderr); break;
#endif
default:
break;
@@ -987,6 +1063,7 @@
break;
}
case T_FORPTR:
+ case T_BSTR:
FORPTR(n)->finalizer->marked = 1;
goto fin;
@@ -1045,6 +1122,7 @@
if (num_free < heap_size / 50)
ERR("heap exhausted");
+ gc_scan_time -= GETTIMEMILLI();
/* Free unused arrays */
for (struct ioarray **arrp = &array_root; *arrp; ) {
struct ioarray *arr = *arrp;
@@ -1066,7 +1144,17 @@
finp = &fin->next;
} else {
/* Unused, run finalizer and free all associated memory */
+ if (fin->size == NOSIZE) {
+ num_fin_free++;
+ } else {
+ num_bs_free++;
+ num_bs_inuse -= fin->size;
+ if (num_bs_alloc - num_bs_free > num_bs_alloc_max)
+ num_bs_alloc_max = num_bs_alloc - num_bs_free;
+ }
void (*f)(void *) = (void (*)(void *))fin->final;
+ //printf("forptr free fin=%p, f=%p", fin, f);
+ //fflush(stdout);
if (f) {
//printf("finalizer fin=%p final=%p\n", fin, f);
(*f)(fin->arg);
@@ -1074,15 +1162,20 @@
for (struct forptr *p = fin->back; p; ) {
struct forptr *q = p->next;
//printf("free fp=%p\n", p);
+ //printf(" p=%p desc=%s", p, p->desc ? p->desc : "NONE");
+ //fflush(stdout);
FREE(p);
+ //memset(p, 0x55, sizeof *p);
p = q;
}
+ //printf("\n");
*finp = fin->next;
- num_fin_free++;
//printf("free fin=%p\n", fin);
FREE(fin);
+ //memset(fin, 0x77, sizeof *fin);
}
}
+ gc_scan_time += GETTIMEMILLI();
#if WANT_STDIO
if (verbose > 1) {
@@ -1090,6 +1183,16 @@
//PRINT(" GC reductions A=%d, K=%d, I=%d, int=%d flip=%d\n", red_a, red_k, red_i, red_int, red_flip);
}
#endif /* !WANT_STDIO */
+
+#if 0
+ /* For debugging only: mark all free cells */
+ for(int n = 0; n < heap_size; n++) {
+ NODEPTR p = HEAPREF(n);
+ if (!is_marked_used(p)) {
+ SETTAG(p, T_FREE);
+ }
+ }
+#endif
}
/* Check that there are k nodes available, if not then GC. */
@@ -1483,11 +1586,16 @@
}
#endif
+struct forptr *mkForPtr(struct bytestring bs);
+
NODEPTR
-mkStrNode(struct ustring *str)
+mkStrNode(struct bytestring str)
{
- NODEPTR n = alloc_node(T_STR);
- STR(n) = str;
+ NODEPTR n = alloc_node(T_BSTR);
+ struct forptr *fp = mkForPtr(str); /* Create a foreign pointer */
+ fp->finalizer->final = (HsFunPtr)FREE; /* and set the finalizer to just free it */
+ FORPTR(n) = fp;
+ //printf("mkForPtr n=%p fp=%p %d %s payload.string=%p\n", n, fp, (int)FORPTR(n)->payload.size, (char*)FORPTR(n)->payload.string, FORPTR(n)->payload.string);
return n;
}
@@ -1530,11 +1638,12 @@
* finalizer for read UTF-8 strings.
* Fix this if there is a lot of deserialization.
*/
-struct ustring *
+struct bytestring
parse_string(BFILE *f)
{
+ struct bytestring bs;
size_t sz = 20;
- struct ustring *buffer = MALLOC(sizeof(struct ustring) + sz);
+ uint8_t *buffer = MALLOC(sz);
size_t i;
int c;
@@ -1544,23 +1653,27 @@
c = getb(f);
if (c == '"')
break;
- if (i >= sz) {
+ if (i >= sz - 1) {
sz *= 2;
- buffer = realloc(buffer, sizeof(struct ustring) + sz);
+ buffer = REALLOC(buffer, sz);
if (!buffer)
memerr();
}
if (c == '\\') {
- buffer->string[i++] = (char)parse_int(f);
+ buffer[i++] = (uint8_t)parse_int(f);
if (!gobble(f, '&'))
ERR("parse string");
} else {
- buffer->string[i++] = c;
+ buffer[i++] = c;
}
}
- buffer->size = i;
- buffer->string[i++] = 0;
- return realloc(buffer, sizeof(struct ustring) + i);
+ buffer[i] = 0; /* add a trailing 0 in case we need a C string */
+ buffer = REALLOC(buffer, i + 1);
+
+ bs.size = i;
+ bs.string = buffer;
+ //printf("parse_string %d %s\n", (int)bs.size, (char*)bs.string);
+ return bs;
}
NODEPTR
@@ -1782,7 +1895,7 @@
}
size_t strNodes(size_t len);
-NODEPTR mkStringC(const char *str);
+NODEPTR mkStringC(char *str);
#if WANT_STDIO
void
@@ -1831,7 +1944,7 @@
if (n < cells || n >= cells + heap_size) abort();
//PRINT("find_sharing %p %llu ", n, LABEL(n));
tag_t tag = GETTAG(n);
- if (tag == T_AP || tag == T_ARR) {
+ if (tag == T_AP || tag == T_ARR || tag == T_BSTR) {
if (test_bit(pb->shared_bits, n)) {
/* Alread marked as shared */
//PRINT("shared\n");
@@ -1845,18 +1958,22 @@
/* Mark as visited, and recurse */
//PRINT("unmarked\n");
set_bit(pb->marked_bits, n);
- if (tag == T_AP) {
+ switch(tag) {
+ case T_AP:
find_sharing(pb, FUN(n));
n = ARG(n);
goto top;
- } else {
+ case T_ARR:
for(size_t i = 0; i < ARR(n)->size; i++) {
find_sharing(pb, ARR(n)->array[i]);
}
+ break;
+ default:
+ break;
}
}
} else {
- /* Not an application, so do nothing */
+ /* Not an sharable node, so do nothing */
//PRINT("not T_AP\n");
;
}
@@ -1863,11 +1980,12 @@
}
void
-print_string(BFILE *f, struct ustring *p)
+print_string(BFILE *f, struct bytestring bs)
{
+ uint8_t *str = bs.string;
putb('"', f);
- for (size_t i = 0; i < p->size; i++) {
- int c = p->string[i];
+ for (size_t i = 0; i < bs.size; i++) {
+ int c = str[i];
if (c == '"' || c == '\\' || c < ' ' || c > '~') {
putb('\\', f);
putdecb(c, f);
@@ -1954,6 +2072,16 @@
}
break;
case T_PTR:
+ if (prefix) {
+ char b[200]; sprintf(b,"PTR<%p>",PTR(n));
+ putsb(b, f);
+ } else {
+ ERR("Cannot serialize pointers");
+ }
+ break;
+ case T_FUNPTR:
+ ERR("Cannot serialize function pointers");
+ case T_FORPTR:
if (n == comb_stdin)
putsb("IO.stdin", f);
else if (n == comb_stdout)
@@ -1961,22 +2089,12 @@
else if (n == comb_stderr)
putsb("IO.stderr", f);
else {
- if (prefix) {
- char b[200]; sprintf(b,"PTR<%p>",PTR(n));
- putsb(b, f);
- } else {
- ERR("Cannot serialize pointers");
- }
+ ERR("Cannot serialize foreign pointers");
}
break;
- case T_FUNPTR:
- ERR("Cannot serialize function pointers");
- case T_FORPTR:
- ERR("Cannot serialize foreign pointers");
+ case T_BSTR:
+ print_string(f, FORPTR(n)->payload);
break;
- case T_STR:
- print_string(f, STR(n));
- break;
case T_IO_CCALL: putb('^', f); putsb(FFI_IX(GETVALUE(n)).ffi_name, f); break;
case T_BADDYN: putb('^', f); putsb(CSTR(n), f); break;
case T_S: putsb("S", f); break;
@@ -2030,6 +2148,20 @@
case T_FSHOW: putsb("fshow", f); break;
case T_FREAD: putsb("fread", f); break;
#endif
+ case T_BSAPPEND: putsb("bs++", f); break;
+ case T_BSAPPENDDOT: putsb("bs++.", f); break;
+ case T_BSAPPEND3: putsb("bs+++", f); break;
+ case T_BSEQ: putsb("bs==", f); break;
+ case T_BSNE: putsb("bs/=", f); break;
+ case T_BSLT: putsb("bs<", f); break;
+ case T_BSLE: putsb("bs<=", f); break;
+ case T_BSGT: putsb("bs>", f); break;
+ case T_BSGE: putsb("bs>=", f); break;
+ case T_BSCMP: putsb("bscmp", f); break;
+ case T_BSPACK: putsb("bspack", f); break;
+ case T_BSUNPACK: putsb("bsunpack", f); break;
+ case T_BSLENGTH: putsb("bslength", f); break;
+ case T_BSSUBSTR: putsb("bssubstr", f); break;
case T_EQ: putsb("==", f); break;
case T_NE: putsb("/=", f); break;
case T_LT: putsb("<", f); break;
@@ -2040,10 +2172,13 @@
case T_ULE: putsb("u<=", f); break;
case T_UGT: putsb("u>", f); break;
case T_UGE: putsb("u>=", f); break;
+ case T_ICMP: putsb("icmp", f); break;
+ case T_UCMP: putsb("ucmp", f); break;
case T_FPADD: putsb("fp+", f); break;
case T_FP2P: putsb("fp2p", f); break;
case T_FPNEW: putsb("fpnew", f); break;
case T_FPFIN: putsb("fpfin", f); break;
+ // case T_FPSTR: putsb("fpstr", f); break;
case T_EQUAL: putsb("equal", f); break;
case T_COMPARE: putsb("compare", f); break;
case T_RNF: putsb("rnf", f); break;
@@ -2075,7 +2210,9 @@
case T_TOPTR: putsb("toPtr", f); break;
case T_TODBL: putsb("toDbl", f); break;
case T_TOFUNPTR: putsb("toFunPtr", f); break;
- case T_FROMUTF8: putsb("fromUTF8", f); break;
+ case T_BSFROMUTF8: putsb("fromUTF8", f); break;
+ case T_BSTOUTF8: putsb("toUTF8", f); break;
+ case T_BSHEADUTF8: putsb("headUTF8", f); break;
case T_TICK:
putb('!', f);
print_string(f, tick_table[GETVALUE(n)].tick_name);
@@ -2083,7 +2220,8 @@
default: ERR("print tag");
}
if (!prefix) {
- putb(' ', f);
+ if (GETTAG(n) != T_AP)
+ putb(' ', f);
if (share) {
putb(':', f);
putdecb((value_t)LABEL(n), f);
@@ -2128,15 +2266,15 @@
freeb_file(bf);
}
+#if 0
void
ppmsg(const char *msg, NODEPTR n)
{
-#if 0
printf("%s", msg);
pp(stdout, n);
printf("\n");
-#endif
}
+#endif
void
dump(const char *msg, NODEPTR at)
@@ -2200,26 +2338,44 @@
}
struct forptr*
-mkForPtr(void *p)
+mkForPtr(struct bytestring bs)
{
struct final *fin = malloc(sizeof(struct final));
struct forptr *fp = malloc(sizeof(struct forptr));
if (!fin || !fp)
memerr();
+ if (bs.size == NOSIZE) {
+ num_fin_alloc++;
+ } else {
+ num_bs_alloc++;
+ num_bs_inuse += bs.size;
+ num_bs_bytes += bs.size;
+ if (num_bs_inuse > num_bs_inuse_max)
+ num_bs_inuse_max = num_bs_inuse;
+ }
//printf("mkForPtr p=%p fin=%p fp=%p\n", p, fin, fp);
fin->next = final_root;
final_root = fin;
fin->final = 0;
- fin->arg = p;
+ fin->arg = bs.string;
+ fin->size = bs.size;
fin->back = fp;
fin->marked = 0;
fp->next = 0;
- fp->payload = p;
+ fp->payload = bs;
fp->finalizer = fin;
+ // fp->desc = 0;
return fp;
}
struct forptr*
+mkForPtrP(void *p)
+{
+ struct bytestring bs = { NOSIZE, p };
+ return mkForPtr(bs);
+}
+
+struct forptr*
addForPtr(struct forptr *ofp, int s)
{
struct forptr *fp = malloc(sizeof(struct forptr));
@@ -2228,11 +2384,21 @@
memerr();
fp->next = ofp;
fin->back = fp;
- fp->payload = (char*)ofp->payload + s;
+ if (ofp->payload.size != NOSIZE)
+ fp->payload.size = ofp->payload.size - s;
+ fp->payload.string = (uint8_t*)ofp->payload.string + s;
fp->finalizer = fin;
return fp;
}
+struct forptr*
+bssubstr(struct forptr *fp, value_t offs, value_t len)
+{
+ struct forptr *res = addForPtr(fp, offs);
+ res->payload.size = len;
+ return res;
+}
+
static INLINE NODEPTR
mkNil(void)
{
@@ -2255,16 +2421,18 @@
return len;
}
-/* Turn a C string into a combinator string */
+/* Turn a C string into a combinator string.
+ * Does NOT do UTF decoding.
+ */
NODEPTR
-mkString(const char *astr, size_t len)
+mkString(struct bytestring bs)
{
NODEPTR n, nc;
size_t i;
- const unsigned char *str = (unsigned char*)astr; /* no sign bits, please */
+ const unsigned char *str = bs.string; /* no sign bits, please */
n = mkNil();
- for(i = len; i > 0; i--) {
+ for(i = bs.size; i > 0; i--) {
nc = mkInt(str[i-1]);
n = mkCons(nc, n);
}
@@ -2272,17 +2440,20 @@
}
NODEPTR
-mkStringC(const char *str)
+mkStringC(char *str)
{
- return mkString(str, strlen(str));
+ struct bytestring bs = { strlen(str), str };
+ return mkString(bs);
}
NODEPTR
-mkStringU(struct ustring *str)
+mkStringU(struct bytestring bs)
{
- BFILE *ubuf = add_utf8(openb_buf(str->string, str->size));
+ BFILE *ubuf = add_utf8(openb_rd_buf(bs.string, bs.size));
NODEPTR n, *np, nc;
+ //printf("mkStringU %d %s\n", (int)bs.size, (char*)bs.string);
+
n = mkNil();
np = &n;
for(;;) {
@@ -2297,6 +2468,62 @@
return n;
}
+NODEPTR
+bsunpack(struct bytestring bs)
+{
+ NODEPTR n, *np, nc;
+ size_t i;
+
+ n = mkNil();
+ np = &n;
+ for(i = 0; i < bs.size; i++) {
+ nc = mkInt(((uint8_t *)bs.string)[i]);
+ *np = mkCons(nc, *np);
+ np = &ARG(*np);
+ }
+ return n;
+}
+
+/* XXX This should somehow be merged with other utf8 decoders */
+value_t
+headutf8(struct bytestring bs, void **ret)
+{
+ uint8_t *p = bs.string;
+ if (bs.size == 0)
+ ERR("headUTF8 0");
+ int c1 = *p++;
+ if ((c1 & 0x80) == 0) {
+ if (ret)
+ *ret = p;
+ return c1;
+ }
+ if (bs.size == 1)
+ ERR("headUTF8 1");
+ int c2 = *p++;
+ if ((c1 & 0xe0) == 0xc0) {
+ if (ret)
+ *ret = p;
+ return ((c1 & 0x1f) << 6) | (c2 & 0x3f);
+ }
+ if (bs.size == 2)
+ ERR("headUTF8 2");
+ int c3 = *p++;
+ if ((c1 & 0xf0) == 0xe0) {
+ if (ret)
+ *ret = p;
+ return ((c1 & 0x0f) << 12) | ((c2 & 0x3f) << 6) | (c3 & 0x3f);
+ }
+ if (bs.size == 3)
+ ERR("headUTF8 3");
+ int c4 = *p++;
+ if ((c1 & 0xf8) == 0xf0) {
+ if (ret)
+ *ret = p;
+ return ((c1 & 0x07) << 18) | ((c2 & 0x3f) << 12) | ((c3 & 0x3f) << 6) | (c4 & 0x3f);
+ }
+ ERR("headUTF8 4");
+}
+
NODEPTR evali(NODEPTR n);
/* Follow indirections */
@@ -2375,25 +2602,40 @@
return FORPTR(n);
}
+/* Evaluate to a T_BSTR */
+struct forptr *
+evalbstr(NODEPTR n)
+{
+ n = evali(n);
+#if SANITY
+ if (GETTAG(n) != T_BSTR) {
+ ERR1("evalbstr, bad tag %d", GETTAG(n));
+ }
+#endif
+ return FORPTR(n);
+}
+
/* Evaluate a string, returns a newly allocated buffer. */
/* XXX this is cheating, should use continuations */
/* XXX the malloc()ed string is leaked if we yield in here. */
-char *
-evalstring(NODEPTR n, value_t *lenp)
+/* Does UTF-8 encoding */
+struct bytestring
+evalstring(NODEPTR n)
{
size_t sz = 100;
- char *name = MALLOC(sz);
+ char *buf = MALLOC(sz);
size_t offs;
uvalue_t c;
NODEPTR x;
+ struct bytestring bs;
- if (!name)
+ if (!buf)
memerr();
for (offs = 0;;) {
if (offs >= sz - 4) {
sz *= 2;
- name = realloc(name, sz);
- if (!name)
+ buf = REALLOC(buf, sz);
+ if (!buf)
memerr();
}
n = evali(n);
@@ -2401,23 +2643,23 @@
break;
else if (GETTAG(n) == T_AP && GETTAG(x = indir(&FUN(n))) == T_AP && GETTAG(indir(&FUN(x))) == T_O) { /* Cons */
PUSH(n); /* protect from GC */
- c = (uvalue_t)evalint(ARG(x));
+ c = evalint(ARG(x));
n = POPTOP();
/* XXX Encode as UTF8 */
if (c < 0x80) {
- name[offs++] = (char)c;
+ buf[offs++] = (char)c;
} else if (c < 0x800) {
- name[offs++] = ((c >> 6 ) ) | 0xc0;
- name[offs++] = ((c ) & 0x3f) | 0x80;
+ buf[offs++] = ((c >> 6 ) ) | 0xc0;
+ buf[offs++] = ((c ) & 0x3f) | 0x80;
} else if (c < 0x10000) {
- name[offs++] = ((c >> 12) ) | 0xe0;
- name[offs++] = ((c >> 6 ) & 0x3f) | 0x80;
- name[offs++] = ((c ) & 0x3f) | 0x80;
+ buf[offs++] = ((c >> 12) ) | 0xe0;
+ buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;
+ buf[offs++] = ((c ) & 0x3f) | 0x80;
} else if (c < 0x110000) {
- name[offs++] = ((c >> 18) ) | 0xf0;
- name[offs++] = ((c >> 12) & 0x3f) | 0x80;
- name[offs++] = ((c >> 6 ) & 0x3f) | 0x80;
- name[offs++] = ((c ) & 0x3f) | 0x80;
+ buf[offs++] = ((c >> 18) ) | 0xf0;
+ buf[offs++] = ((c >> 12) & 0x3f) | 0x80;
+ buf[offs++] = ((c >> 6 ) & 0x3f) | 0x80;
+ buf[offs++] = ((c ) & 0x3f) | 0x80;
} else {
ERR("invalid char");
}
@@ -2426,12 +2668,114 @@
ERR("evalstring not Nil/Cons");
}
}
- name[offs] = 0;
- if (lenp)
- *lenp = (value_t)offs;
- return name;
+ buf[offs] = 0; /* in case we use it as a C string */
+ bs.size = offs;
+ bs.string = buf;
+ return bs;
}
+/* Does not do UTF-8 encoding */
+struct bytestring
+evalbytestring(NODEPTR n)
+{
+ size_t sz = 100;
+ uint8_t *buf = MALLOC(sz);
+ size_t offs;
+ uvalue_t c;
+ NODEPTR x;
+ struct bytestring bs;
+
+ if (!buf)
+ memerr();
+ for (offs = 0;;) {
+ if (offs >= sz - 1) {
+ sz *= 2;
+ buf = REALLOC(buf, sz);
+ if (!buf)
+ memerr();
+ }
+ n = evali(n);
+ if (GETTAG(n) == T_K) /* Nil */
+ break;
+ else if (GETTAG(n) == T_AP && GETTAG(x = indir(&FUN(n))) == T_AP && GETTAG(indir(&FUN(x))) == T_O) { /* Cons */
+ PUSH(n); /* protect from GC */
+ c = evalint(ARG(x));
+ n = POPTOP();
+ buf[offs++] = c;
+ n = ARG(n);
+ } else {
+ ERR("evalbytestring not Nil/Cons");
+ }
+ }
+ buf[offs] = 0; /* in case we use it as a C string */
+ bs.size = offs;
+ bs.string = buf;
+ return bs;
+}
+
+struct bytestring
+bsappend(struct bytestring p, struct bytestring q)
+{
+ if (p.size == 0)
+ return q;
+ if (q.size == 0)
+ return p;
+ struct bytestring r;
+ r.size = p.size + q.size;
+ r.string = MALLOC(r.size);
+ if (!r.string)
+ memerr();
+ memcpy(r.string, p.string, p.size);
+ memcpy((uint8_t *)r.string + p.size, q.string, q.size);
+ return r;
+}
+
+struct bytestring
+bsappenddot(struct bytestring p, struct bytestring q)
+{
+ struct bytestring r;
+ r.size = p.size + q.size + 1;
+ r.string = MALLOC(r.size);
+ if (!r.string)
+ memerr();
+ memcpy(r.string, p.string, p.size);
+ memcpy((uint8_t *)r.string + p.size, ".", 1);
+ memcpy((uint8_t *)r.string + p.size + 1, q.string, q.size);
+ return r;
+}
+
+/*
+ * Compare bytestrings.
+ * We can't use memcmp() directly for two reasons:
+ * - the two strings can have different lengths
+ * - the return value is only guaranteed to be ==0 or !=0
+ */
+int
+bscompare(struct bytestring bsp, struct bytestring bsq)
+{
+ uint8_t *p = bsp.string;
+ uint8_t *q = bsq.string;
+ size_t len = bsp.size < bsq.size ? bsp.size : bsq.size;
+ while (len--) {
+ int r = (int)*p++ - (int)*q++;
+ if (r) {
+ /* Unequal bytes found. */
+ if (r < 0)
+ return -1;
+ if (r > 0)
+ return 1;
+ return 0;
+ }
+ }
+ /* Got to the end of the shorter string. */
+ /* The shorter string is considered smaller. */
+ if (bsp.size < bsq.size)
+ return -1;
+ if (bsp.size > bsq.size)
+ return 1;
+ return 0;
+}
+
/* Compares anything, but really only works well on strings.
* if p < q return -1
* if p > q return 1
@@ -2457,6 +2801,7 @@
NODEPTR p, q;
NODEPTR *ap, *aq;
enum node_tag ptag, qtag;
+ int r;
/* Since FUN(cmp) can be shared, allocate a copy for it. */
GCCHECK(1);
@@ -2528,6 +2873,19 @@
if ((intptr_t)ff > (intptr_t)fg)
CRET(1);
break;
+ case T_FORPTR:
+ f = FORPTR(p)->payload.string;
+ g = FORPTR(q)->payload.string;
+ if (f < g)
+ CRET(-1);
+ if (f > g)
+ CRET(1);
+ break;
+ case T_BSTR:
+ r = bscompare(BSTR(p), BSTR(q));
+ if (r)
+ CRET(r);
+ break;
case T_ARR:
if (ARR(p) < ARR(q))
CRET(-1);
@@ -2598,6 +2956,7 @@
#endif
enum node_tag tag;
struct ioarray *arr;
+ struct bytestring xbs, ybs, rbs;
#if MAXSTACKDEPTH
counter_t old_cur_c_stack = cur_c_stack;
@@ -2653,7 +3012,7 @@
ap:
case T_AP: PUSH(n); n = FUN(n); goto top;
- case T_STR: RET;
+ case T_BSTR: RET;
case T_INT: RET;
case T_DBL: RET;
case T_PTR: RET;
@@ -2699,6 +3058,59 @@
* If so, we know that both arguments are now evaluated, and we perform the strict operation.
*
* On my desktop machine this is about 3% slower, on my laptop (Apple M1) it is about 3% faster.
+ *
+ * Pictorially for BININT
+ * Before the code below:
+ * ----
+ * | --------> @
+ * ---- / \
+ * | ------> @ y
+ * ---- / \
+ * n ----> ADD x
+ *
+ * After
+ * ----
+ * | --------> @
+ * ---- / \
+ * | ------> @ y
+ * ---- / \
+ * | ->BI2 ADD x
+ * ---- ^
+ * n ----------|
+ *
+ * x becomes an INT, stack is not empty, BININT2 found on top
+ * ----
+ * | --------> @
+ * ---- / \
+ * | ------> @ y
+ * ---- / \
+ * | ->BI2 ADD INT
+ * ---- ^
+ * n ----------|
+ *
+ * After
+ * ----
+ * | --------> @
+ * ---- / \
+ * | ------> @ y
+ * ---- / \ \
+ * | ->BI1 ADD INT |
+ * ---- |
+ * n ---------------|
+ *
+ * y becomes an INT, stack is not empty, BININT1 found on top
+ * do arithmetic
+ * ----
+ * | --------> @
+ * ---- / \
+ * | ------> @ INT
+ * ---- / \ \
+ * | ->BI1 ADD INT |
+ * ---- |
+ * n ---------------|
+ *
+ * ----
+ * n -------> INT(x+y)
*/
case T_ADD:
case T_SUB:
@@ -2720,10 +3132,12 @@
case T_LE:
case T_GT:
case T_GE:
+ case T_ICMP:
case T_ULT:
case T_ULE:
case T_UGT:
case T_UGE:
+ case T_UCMP:
CHECK(2);
n = ARG(TOP(1));
if (GETTAG(n) == T_INT) {
@@ -2766,7 +3180,7 @@
case T_ITOF: OPINT1(rd = (flt_t)xi); SETDBL(n, rd); RET;
case T_FREAD:
CHECK(1);
- msg = evalstring(ARG(TOP(0)), 0);
+ msg = evalstring(ARG(TOP(0))).string;
#if WORD_SIZE == 64
xd = strtod(msg, NULL);
#elif WORD_SIZE == 32
@@ -2788,6 +3202,20 @@
GOIND(dblToString(xd));
#endif /* WANT_FLOAT */
+ case T_BSAPPEND:
+ case T_BSAPPENDDOT:
+ case T_BSEQ:
+ case T_BSNE:
+ case T_BSLT:
+ case T_BSLE:
+ case T_BSGT:
+ case T_BSGE:
+ case T_BSCMP:
+ CHECK(2);
+ n = ARG(TOP(1));
+ PUSH(combBINBS2);
+ goto top;
+
/* Retag a word sized value, keeping the value bits */
#define CONV(t) do { CHECK(1); x = evali(ARG(TOP(0))); n = POPTOP(); SETTAG(n, t); SETVALUE(n, GETVALUE(x)); RET; } while(0)
case T_TODBL: CONV(T_DBL);
@@ -2801,7 +3229,7 @@
//printf("T_FP2P\n");
xfp = evalforptr(ARG(TOP(0))); POP(1); n = TOP(-1);
//printf("T_FP2P xfp=%p, payload=%p\n", xfp, xfp->payload);
- SETPTR(n, xfp->payload); RET;
+ SETPTR(n, xfp->payload.string); RET;
case T_ARR_EQ:
{
@@ -2814,16 +3242,77 @@
GOIND(arr == ARR(y) ? combTrue : combFalse);
}
- case T_FROMUTF8:
+ case T_BSTOUTF8:
+ {
+ CHECK(1);
+ struct bytestring bs = evalstring(ARG(TOP(0)));
+ POP(1);
+ n = TOP(-1);
+ SETTAG(n, T_BSTR);
+ FORPTR(n) = mkForPtr(bs);
+ RET;
+ }
+
+ case T_BSHEADUTF8:
+ CHECK(1);
+ x = evali(ARG(TOP(0)));
+ if (GETTAG(x) != T_BSTR) ERR("HEADUTF8");
+ POP(1);
+ n = TOP(-1);
+ SETINT(n, headutf8(BSTR(x), (void**)0));
+ RET;
+
+ case T_BSFROMUTF8:
if (doing_rnf) RET;
CHECK(1);
x = evali(ARG(TOP(0)));
- if (GETTAG(x) != T_STR) ERR("FROMUTF8");
+ if (GETTAG(x) != T_BSTR) ERR("FROMUTF8");
POP(1);
n = TOP(-1);
- GCCHECK(strNodes(STR(x)->size));
- GOIND(mkStringU(STR(x)));
+ GCCHECK(strNodes(BSTR(x).size));
+ //printf("T_FROMUTF8 x = %p fp=%p payload.string=%p\n", x, x->uarg.uuforptr, x->uarg.uuforptr->payload.string);
+ GOIND(mkStringU(BSTR(x)));
+ case T_BSUNPACK:
+ if (doing_rnf) RET;
+ CHECK(1);
+ x = evali(ARG(TOP(0)));
+ if (GETTAG(x) != T_BSTR) ERR("BSUNPACK");
+ POP(1);
+ n = TOP(-1);
+ GCCHECK(strNodes(BSTR(x).size));
+ GOIND(bsunpack(BSTR(x)));
+
+ case T_BSPACK:
+ {
+ CHECK(1);
+ struct bytestring bs = evalbytestring(ARG(TOP(0)));
+ POP(1);
+ n = TOP(-1);
+ SETTAG(n, T_BSTR);
+ FORPTR(n) = mkForPtr(bs);
+ RET;
+ }
+
+ case T_BSSUBSTR:
+ CHECK(3);
+ xfp = evalbstr(ARG(TOP(0)));
+ xi = evalint(ARG(TOP(1)));
+ yi = evalint(ARG(TOP(2)));
+ POP(3);
+ n = TOP(-1);
+ SETTAG(n, T_BSTR);
+ FORPTR(n) = bssubstr(xfp, xi, yi);
+ RET;
+
+ case T_BSLENGTH:
+ CHECK(1);
+ xfp = evalbstr(ARG(TOP(0)));
+ POP(1);
+ n = TOP(-1);
+ SETINT(n, xfp->payload.size);
+ RET;
+
case T_RAISE:
if (doing_rnf) RET;
if (cur_handler) {
@@ -2847,7 +3336,7 @@
//TOP(0) = new_ap(combShowExn, TOP(0));
FUN(TOP(0)) = combShowExn; /* TOP(0) = (combShowExn exn) */
x = evali(TOP(0)); /* evaluate it */
- msg = evalstring(x, 0); /* and convert to a C string */
+ msg = evalstring(x).string; /* and convert to a C string */
POP(1);
#if WANT_STDIO
/* A horrible hack until we get proper exceptions */
@@ -2908,6 +3397,7 @@
case T_ARR_WRITE:
case T_FPNEW:
case T_FPFIN:
+ // case T_FPSTR:
case T_IO_GC:
RET;
@@ -2914,7 +3404,7 @@
case T_DYNSYM:
/* A dynamic FFI lookup */
CHECK(1);
- msg = evalstring(ARG(TOP(0)), 0);
+ msg = evalstring(ARG(TOP(0))).string;
GCCHECK(1);
x = ffiNode(msg);
FREE(msg);
@@ -2996,10 +3486,12 @@
case T_ULE: GOIND(xu <= yu ? combTrue : combFalse);
case T_UGT: GOIND(xu > yu ? combTrue : combFalse);
case T_UGE: GOIND(xu >= yu ? combTrue : combFalse);
+ case T_UCMP: GOIND(xu < yu ? combLT : xu > yu ? combGT : combEQ);
case T_LT: GOIND((value_t)xu < (value_t)yu ? combTrue : combFalse);
case T_LE: GOIND((value_t)xu <= (value_t)yu ? combTrue : combFalse);
case T_GT: GOIND((value_t)xu > (value_t)yu ? combTrue : combFalse);
case T_GE: GOIND((value_t)xu >= (value_t)yu ? combTrue : combFalse);
+ case T_ICMP: GOIND((value_t)xu < (value_t)yu ? combLT : (value_t)xu > (value_t)yu ? combGT : combEQ);
default:
//fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
@@ -3099,6 +3591,52 @@
goto ret;
#endif /* WANT_FLOAT */
+ case T_BINBS2:
+ n = ARG(TOP(1));
+ TOP(0) = combBINBS1;
+ goto top;
+
+ case T_BINBS1:
+ /* First argument */
+#if SANITY
+ if (GETTAG(n) != T_BSTR)
+ ERR("BINBS 0");
+#endif /* SANITY */
+ xbs = BSTR(n);
+ /* Second argument */
+ y = ARG(TOP(2));
+ while (GETTAG(y) == T_IND)
+ y = INDIR(y);
+#if SANITY
+ if (GETTAG(y) != T_BSTR)
+ ERR("BINBS 1");
+#endif /* SANITY */
+ ybs = BSTR(y);
+ p = FUN(TOP(1));
+ POP(3);
+ n = TOP(-1);
+ binbs:
+ switch (GETTAG(p)) {
+ case T_IND: p = INDIR(p); goto binbs;
+
+ case T_BSAPPEND: rbs = bsappend(xbs, ybs); break;
+ case T_BSAPPENDDOT: rbs = bsappenddot(xbs, ybs); break;
+ case T_BSEQ: GOIND(bscompare(xbs, ybs) == 0 ? combTrue : combFalse);
+ case T_BSNE: GOIND(bscompare(xbs, ybs) != 0 ? combTrue : combFalse);
+ case T_BSLT: GOIND(bscompare(xbs, ybs) < 0 ? combTrue : combFalse);
+ case T_BSLE: GOIND(bscompare(xbs, ybs) <= 0 ? combTrue : combFalse);
+ case T_BSGT: GOIND(bscompare(xbs, ybs) > 0 ? combTrue : combFalse);
+ case T_BSGE: GOIND(bscompare(xbs, ybs) >= 0 ? combTrue : combFalse);
+ case T_BSCMP: r = bscompare(xbs, ybs); GOIND(r < 0 ? combLT : r > 0 ? combGT : combEQ);
+
+ default:
+ //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
+ ERR("BINBS");
+ }
+ SETTAG((n), T_BSTR);
+ FORPTR(n) = mkForPtr(rbs);
+ goto ret;
+
default:
stack_ptr = stk;
n = TOP(-1);
@@ -3143,7 +3681,6 @@
stackptr_t stk = stack_ptr;
NODEPTR f, x, n, q, r, s, res, top1;
char *name;
- value_t len;
struct handler *h;
#if WANT_STDIO
void *ptr;
@@ -3201,7 +3738,7 @@
return;
}
/* not done, it must be a C'BIND */
- GCCHECK(1);
+ GCCHECKSAVE(res, 1);
IOASSERT(GETTAG(q) == T_AP && GETTAG(FUN(q)) == T_AP && GETTAG(FUN(FUN(q))) == T_IO_CCBIND, "rest-AP");
r = ARG(FUN(q));
s = ARG(q);
@@ -3306,12 +3843,14 @@
}
case T_NEWCASTRINGLEN:
+ {
CHECKIO(1);
- name = evalstring(ARG(TOP(1)), &len);
+ struct bytestring bs = evalbytestring(ARG(TOP(1)));
GCCHECK(4);
- n = new_ap(new_ap(combPair, x = alloc_node(T_PTR)), mkInt(len));
- PTR(x) = name;
+ n = new_ap(new_ap(combPair, x = alloc_node(T_PTR)), mkInt(bs.size));
+ PTR(x) = bs.string;
RETIO(n);
+ }
case T_PEEKCASTRING:
{
@@ -3320,7 +3859,8 @@
name = evalptr(ARG(TOP(1)));
size = strlen(name);
GCCHECK(strNodes(size));
- RETIO(mkString(name, size));
+ struct bytestring bs = { size, name };
+ RETIO(mkString(bs));
}
case T_PEEKCASTRINGLEN:
@@ -3330,7 +3870,8 @@
size = evalint(ARG(TOP(2)));
name = evalptr(ARG(TOP(1)));
GCCHECK(strNodes(size));
- RETIO(mkString(name, size));
+ struct bytestring bs = { size, name };
+ RETIO(mkString(bs));
}
case T_ARR_ALLOC:
@@ -3401,7 +3942,7 @@
void *xp = evalptr(ARG(TOP(1)));
//printf("T_FPNEW xp=%p\n", xp);
n = alloc_node(T_FORPTR);
- SETFORPTR(n, mkForPtr(xp));
+ SETFORPTR(n, mkForPtrP(xp));
RETIO(n);
}
case T_FPFIN:
@@ -3416,6 +3957,20 @@
RETIO(combUnit);
}
+#if 0
+ case T_FPSTR:
+ {
+ CHECKIO(2);
+ //printf("T_FPFIN\n");
+ struct forptr *xfp = evalforptr(ARG(TOP(2)));
+ //printf("T_FPFIN xfp=%p\n", xfp);
+ struct bytestring bs = evalstring(ARG(TOP(1)));
+ //printf("T_FPFIN yp=%p\n", yp);
+ xfp->desc = bs.string;
+ RETIO(combUnit);
+ }
+#endif
+
case T_IO_GC:
CHECKIO(0);
//printf("gc()\n");
@@ -3537,9 +4092,9 @@
/* No GC checks, the heap is empty. */
n = mkNil();
for(int i = gargc-1; i >= 0; i--) {
- n = mkCons(mkString(gargv[i], strlen(gargv[i])), n);
+ n = mkCons(mkStringC(gargv[i]), n);
}
- n = mkCons(mkString(progname, strlen(progname)), n);
+ n = mkCons(mkStringC(progname), n);
argarray = arr_alloc(1, n); /* An IORef contains a single element array */
argarray->permanent = 1; /* never GC the arguments, because a T_IO_GETARGREF can reach argarray */
}
@@ -3547,7 +4102,7 @@
if (combexpr) {
int c;
- BFILE *bf = openb_buf(combexpr, combexprlen);
+ BFILE *bf = openb_rd_buf(combexpr, combexprlen);
c = getb(bf);
/* Compressed combinators start with a 'Z' or 'z', otherwise 'v' (for version) */
if (c == 'z') {
@@ -3599,18 +4154,19 @@
#if SANITY
if (GETTAG(prog) != T_AP || GETTAG(FUN(prog)) != T_IO_RETURN)
ERR("main execio");
-#endif
-#if WANT_STDIO
NODEPTR res = evali(ARG(prog));
-#else
- (void)evali(ARG(prog));
+ if (GETTAG(res) != T_I)
+ ERR("main execio I");
#endif
+ /* Flush standard handles in case there is some BFILE buffering */
+ flushb((BFILE*)FORPTR(comb_stdout)->payload.string);
+ flushb((BFILE*)FORPTR(comb_stderr)->payload.string);
+ gc(); /* Run finalizers */
run_time += GETTIMEMILLI();
+
#if WANT_STDIO
if (verbose) {
if (verbose > 1) {
- PRINT("\nmain returns ");
- pp(stdout, res);
PRINT("node size=%"PRIheap", heap size bytes=%"PRIheap"\n", (heapoffs_t)NODE_SIZE, heap_size * NODE_SIZE);
}
setlocale(LC_NUMERIC, ""); /* Make %' work on platforms that support it */
@@ -3623,7 +4179,11 @@
PRINT("%"PCOMMA"15"PRIcounter" reductions (%"PCOMMA".1f Mred/s)\n", num_reductions, num_reductions / ((double)run_time / 1000) / 1000000);
PRINT("%"PCOMMA"15"PRIcounter" array alloc\n", num_arr_alloc);
PRINT("%"PCOMMA"15"PRIcounter" array free\n", num_arr_free);
+ PRINT("%"PCOMMA"15"PRIcounter" foreign alloc\n", num_fin_alloc);
PRINT("%"PCOMMA"15"PRIcounter" foreign free\n", num_fin_free);
+ PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc (max %"PCOMMA""PRIcounter")\n", num_bs_alloc, num_bs_alloc_max);
+ PRINT("%"PCOMMA"15"PRIcounter" bytestring alloc bytes (max %"PCOMMA""PRIcounter")\n", num_bs_bytes, num_bs_inuse_max);
+ PRINT("%"PCOMMA"15"PRIcounter" bytestring free\n", num_bs_free);
#if MAXSTACKDEPTH
PRINT("%"PCOMMA"15d max stack depth\n", (int)max_stack_depth);
PRINT("%"PCOMMA"15d max C stack depth\n", (int)max_c_stack);
@@ -3630,7 +4190,10 @@
#endif
// PRINT("%"PCOMMA"15"PRIcounter" max mark depth\n", max_mark_depth);
PRINT("%15.2fs total expired time\n", (double)run_time / 1000);
- PRINT("%15.2fs total gc time\n", (double)gc_mark_time / 1000);
+ PRINT("%15.2fs total gc time (%.2f + %.2f)\n",
+ (double)(gc_mark_time + gc_scan_time) / 1000,
+ (double)gc_mark_time / 1000,
+ (double)gc_scan_time / 1000);
#if GCRED
PRINT(" GC reductions A=%d, K=%d, I=%d, int=%d flip=%d\n", red_a, red_k, red_i, red_int, red_flip);
#endif
@@ -3686,6 +4249,9 @@
MHS_FROM(mhs_from_CLLong, SETINT, long long);
MHS_FROM(mhs_from_CULLong, SETINT, unsigned long long);
MHS_FROM(mhs_from_CSize, SETINT, size_t);
+#if WANT_TIME
+MHS_FROM(mhs_from_CTime, SETINT, time_t);
+#endif
// MHS_FROM(mhs_from_CSSize, SETINT, ssize_t);
MHS_FROM(mhs_from_CIntPtr, SETINT, intptr_t);
MHS_FROM(mhs_from_CUIntPtr, SETINT, uintptr_t);
@@ -3719,6 +4285,9 @@
MHS_TO(mhs_to_CLLong, evalint, long long);
MHS_TO(mhs_to_CULLong, evalint, unsigned long long);
MHS_TO(mhs_to_CSize, evalint, size_t);
+#if WANT_TIME
+MHS_TO(mhs_to_CTime, evalint, time_t);
+#endif
// MHS_TO(mhs_to_CSSize, evalint, ssize_t);
MHS_TO(mhs_to_CIntPtr, evalint, intptr_t);
MHS_TO(mhs_to_CUIntPtr, evalint, uintptr_t);
@@ -3759,11 +4328,15 @@
void mhs_add_FILE(int s) { mhs_from_Ptr(s, 1, add_FILE(mhs_to_Ptr(s, 0))); }
void mhs_add_utf8(int s) { mhs_from_Ptr(s, 1, add_utf8(mhs_to_Ptr(s, 0))); }
void mhs_closeb(int s) { closeb(mhs_to_Ptr(s, 0)); mhs_from_Unit(s, 1); }
+void mhs_addr_closeb(int s) { mhs_from_FunPtr(s, 0, (HsFunPtr)&closeb); }
void mhs_flushb(int s) { flushb(mhs_to_Ptr(s, 0)); mhs_from_Unit(s, 1); }
void mhs_fopen(int s) { mhs_from_Ptr(s, 2, fopen(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }
void mhs_getb(int s) { mhs_from_Int(s, 1, getb(mhs_to_Ptr(s, 0))); }
void mhs_putb(int s) { putb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
void mhs_ungetb(int s) { ungetb(mhs_to_Int(s, 0), mhs_to_Ptr(s, 1)); mhs_from_Unit(s, 2); }
+void mhs_openwrbuf(int s) { mhs_from_Ptr(s, 0, openb_wr_buf()); }
+void mhs_openrdbuf(int s) { mhs_from_Ptr(s, 2, openb_rd_buf(mhs_to_Ptr(s, 0), mhs_to_Int(s, 1))); }
+void mhs_getbuf(int s) { get_buf(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1), mhs_to_Ptr(s, 2)); mhs_from_Unit(s, 3); }
void mhs_system(int s) { mhs_from_Int(s, 1, system(mhs_to_Ptr(s, 0))); }
void mhs_tmpname(int s) { mhs_from_Ptr(s, 2, TMPNAME(mhs_to_Ptr(s, 0), mhs_to_Ptr(s, 1))); }
void mhs_unlink(int s) { mhs_from_Int(s, 1, unlink(mhs_to_Ptr(s, 0))); }
@@ -3781,6 +4354,16 @@
void mhs_lz77c(int s) { mhs_from_CSize(s, 3, lz77c(mhs_to_Ptr(s, 0), mhs_to_CSize(s, 1), mhs_to_Ptr(s, 2))); }
#endif /* WANT_LZ77 */
+#if WANT_RLE
+void mhs_add_rle_compressor(int s) { mhs_from_Ptr(s, 1, add_rle_compressor(mhs_to_Ptr(s, 0))); }
+void mhs_add_rle_decompressor(int s) { mhs_from_Ptr(s, 1, add_rle_decompressor(mhs_to_Ptr(s, 0))); }
+#endif /* WANT_RLE */
+
+#if WANT_BWT
+void mhs_add_bwt_compressor(int s) { mhs_from_Ptr(s, 1, add_bwt_compressor(mhs_to_Ptr(s, 0))); }
+void mhs_add_bwt_decompressor(int s) { mhs_from_Ptr(s, 1, add_bwt_decompressor(mhs_to_Ptr(s, 0))); }
+#endif /* WANT_BWT */
+
void mhs_calloc(int s) { mhs_from_Ptr(s, 2, calloc(mhs_to_CSize(s, 0), mhs_to_CSize(s, 1))); }
void mhs_free(int s) { free(mhs_to_Ptr(s, 0)); mhs_from_Unit(s, 1); }
void mhs_addr_free(int s) { mhs_from_FunPtr(s, 0, (HsFunPtr)&FREE); }
@@ -3868,11 +4451,15 @@
{ "add_FILE", mhs_add_FILE},
{ "add_utf8", mhs_add_utf8},
{ "closeb", mhs_closeb},
+{ "&closeb", mhs_addr_closeb},
{ "flushb", mhs_flushb},
{ "fopen", mhs_fopen},
{ "getb", mhs_getb},
{ "putb", mhs_putb},
{ "ungetb", mhs_ungetb},
+{ "openb_wr_buf", mhs_openwrbuf},
+{ "openb_rd_buf", mhs_openrdbuf},
+{ "get_buf", mhs_getbuf},
{ "system", mhs_system},
{ "tmpname", mhs_tmpname},
{ "unlink", mhs_unlink},
@@ -3889,6 +4476,16 @@
{ "add_lz77_decompressor", mhs_add_lz77_decompressor},
{ "lz77c", mhs_lz77c},
#endif /* WANT_LZ77 */
+
+#if WANT_RLE
+{ "add_rle_compressor", mhs_add_rle_compressor},
+{ "add_rle_decompressor", mhs_add_rle_decompressor},
+#endif /* WANT_RLE */
+
+#if WANT_BWT
+{ "add_bwt_compressor", mhs_add_bwt_compressor},
+{ "add_bwt_decompressor", mhs_add_bwt_decompressor},
+#endif /* WANT_RLE */
{ "calloc", mhs_calloc},
{ "free", mhs_free},
--- a/src/runtime/lz77.c
+++ b/src/runtime/lz77.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#if 0
#include <stdio.h>
+#define INLINE
#endif
#define MAX(x,y) ((x) > (y) ? (x) : (y))
@@ -11,6 +12,7 @@
#define MAXLEN (9 + 255)
#define MINMATCH 3
#define MINOFFS 1
+#define MAXLIT 32
/*
* Encoding inspired by FastLZ
@@ -31,7 +33,6 @@
}
#define PUT(x) put(&outbuf, &outsize, &outoffs, (x))
-/* dst must be big enough to hold the decompressed result */
size_t
lz77d(uint8_t *src, size_t srclen, uint8_t **bufp)
{
@@ -71,6 +72,27 @@
return outoffs;
}
+#define HASHBITS 11
+#define HASHSIZE (1 << HASHBITS)
+typedef size_t lzhash_t;
+static INLINE lzhash_t
+lz77hash(uint8_t *b, size_t n)
+{
+#if 0
+ n = MIN(n, MINMATCH);
+ size_t h = 0;
+ for (size_t i = 0; i < n; i++)
+ h = h * 256 + b[i];
+ return ((h * 99999989) >> 15) & (HASHSIZE - 1);
+#else
+ n = MIN(n, 4);
+ size_t h = 5381;
+ for (size_t i = 0; i < n; i++)
+ h = h * 33 + b[i];
+ return h & (HASHSIZE - 1);
+#endif
+}
+
static INLINE size_t
match(uint8_t *src, uint8_t *win, uint8_t *end)
{
@@ -81,7 +103,60 @@
return n;
}
-/* XXX finding the match really needs some clever speedup */
+typedef size_t lzoffs_t;
+#define NUMPREV 16
+
+/* Find the longest match within the match window */
+static INLINE size_t
+find_longest_match(uint8_t *src, uint8_t *cur, uint8_t *end, size_t *match_offs_p, lzoffs_t lzhashes[][NUMPREV])
+{
+ size_t win_end = cur - src + 1;
+ size_t win_len = MIN(win_end, MAXWIN);
+
+ lzhash_t h = lz77hash(cur, end - cur);
+ lzoffs_t *offsets = lzhashes[h];
+
+ size_t m_len = 0;
+ size_t m_offs = 0;
+#if 0
+ for (size_t offs = MINOFFS; offs < win_len; offs++) {
+ size_t n = match(cur, cur - offs, end);
+ if (n > m_len) {
+ m_len = n;
+ m_offs = offs;
+ }
+ }
+#else
+ for (size_t i = 0; i < NUMPREV; i++) {
+ lzoffs_t o = offsets[i];
+ if (o == ~0)
+ break; /* unused slot */
+ size_t offs = (cur - src) - o;
+ if (offs >= win_len || offs < MINOFFS)
+ break; /* offset is not in range */
+ size_t n = match(cur, cur - offs, end);
+ if (n > m_len) {
+ m_len = n;
+ m_offs = offs;
+ }
+ }
+#endif
+ *match_offs_p = m_offs;
+ return m_len;
+}
+
+static INLINE void
+lzupdatehash(uint8_t *src, uint8_t *cur, uint8_t *end, lzoffs_t lzhashes[][NUMPREV])
+{
+ lzhash_t h = lz77hash(cur, end - cur);
+ lzoffs_t offs = cur - src;
+
+ for(size_t k = NUMPREV-1; k > 0; k--)
+ lzhashes[h][k] = lzhashes[h][k-1];
+ lzhashes[h][0] = offs;
+}
+
+
size_t
lz77c(uint8_t *src, size_t srclen, uint8_t **bufp)
{
@@ -91,31 +166,47 @@
uint8_t *outbuf = malloc(outsize);
size_t outoffs = 0;
+ lzoffs_t lzhashes[HASHSIZE][NUMPREV];
+
+ for(size_t i = 0; i < HASHSIZE; i++) {
+ for(size_t k = 0; k < NUMPREV; k++)
+ lzhashes[i][k] = ~0;
+ }
+
for (cur = src; cur < end; ) {
- size_t win_end = cur - src;
- size_t win_len = MIN(win_end, MAXWIN);
- //size_t max_len = MIN(MAXLEN, end - cur);
- /* Inefficient match loop */
- size_t match_len = MINMATCH-1;
size_t match_offs = 0;
- /* Compression is slow, since we use brute force to find a match. */
- for (size_t offs = MINOFFS; offs < win_len; offs++) {
- size_t n = match(cur, cur - offs, end);
- if (n > match_len) {
- match_len = n;
- match_offs = offs;
+ size_t match_len = 0;
+ size_t len;
+ /* Start from the current position and look for a match in the window. */
+ /* If the is no match, try the next position, and so on. */
+ for (len = 0; len < end - cur; len++) {
+ match_len = find_longest_match(src, cur + len, end, &match_offs, lzhashes);
+ if (match_len >= MINMATCH) /* Stop when we find a match. */
+ break;
+ lzupdatehash(src, cur + len, end, lzhashes);
+ }
+ /* As we exit the loop, we have len bytes that did not match anywhere
+ * in the window, so they need to be emitted as a literal. */
+ while (len) {
+ /* Chunk up the literal into maximum sized pieces. */
+ size_t n = MIN(len, MAXLIT);
+ PUT(n - 1); /* Chunk length - 1 */
+ for (size_t i = 0; i < n; i++) {
+ PUT(*cur++); /* and spit out the chunk. */
}
+ len -= n;
}
if (match_len >= MINMATCH) {
- //printf("match cur=%d offs=%d len=%d str=%.*s\n", (int)(cur-src), (int)match_offs, (int)match_len, (int)match_len, cur);
- //printf("match cur=%d offs=%d len=%d\n", (int)(cur-src), (int)match_offs, (int)match_len);
- /* found a match */
- cur += match_len;
+ /* If we actually had a match, output it. */
+ //cur += match_len; /* skip over the matched positions */
+ for(size_t i = 0; i < match_len; i++) {
+ lzupdatehash(src, cur++, end, lzhashes);
+ }
match_offs -= MINOFFS;
match_len -= 2;
int hi = match_offs >> 8;
int lo = match_offs & 0xff;
- if (match_len < 7) {
+ if (match_len < 7) { /* encode as 2 or 3 bytes */
PUT((match_len << 5) + hi);
PUT(lo);
} else {
@@ -122,14 +213,6 @@
PUT((7 << 5) + hi);
PUT(lo);
PUT(match_len - 7);
- }
- } else {
- /* generate a literal */
- /* how long should it be? 3 seems to be a sweet spot */
- size_t len = MIN(3, end - cur);
- PUT(len - 1);
- for (size_t i = 0; i < len; i++) {
- PUT(*cur++);
}
}
}
--- a/src/runtime/mhsffi.h
+++ b/src/runtime/mhsffi.h
@@ -39,15 +39,16 @@
void mhs_from_CChar(intptr_t, int, char);
void mhs_from_CSChar(intptr_t, int, signed char);
void mhs_from_CUChar(intptr_t, int, unsigned char);
-void mhs_from_CSHORT(intptr_t, int, short);
-void mhs_from_CUSHORT(intptr_t, int, unsigned short);
-void mhs_from_CINT(intptr_t, int, int);
-void mhs_from_CUINT(intptr_t, int, unsigned int);
-void mhs_from_CLONG(intptr_t, int, long);
-void mhs_from_CULONG(intptr_t, int, unsigned long);
-void mhs_from_CLLONG(intptr_t, int, long long);
-void mhs_from_CULLONG(intptr_t, int, unsigned long long);
+void mhs_from_CShort(intptr_t, int, short);
+void mhs_from_CUShort(intptr_t, int, unsigned short);
+void mhs_from_CInt(intptr_t, int, int);
+void mhs_from_CUInt(intptr_t, int, unsigned int);
+void mhs_from_CLong(intptr_t, int, long);
+void mhs_from_CULong(intptr_t, int, unsigned long);
+void mhs_from_CLLong(intptr_t, int, long long);
+void mhs_from_CULLong(intptr_t, int, unsigned long long);
void mhs_from_CSize(intptr_t, int, size_t);
+// void mhs_from_CTime(intptr_t, int, long); /* XXX wrong */
// not on MacOS void mhs_from_CSSize(intptr_t, int, ssize_t);
void mhs_from_CIntPtr(intptr_t, int, intptr_t);
void mhs_from_CUIntPtr(intptr_t, int, uintptr_t);
@@ -62,15 +63,16 @@
char mhs_to_CChar(intptr_t, int);
signed char mhs_to_CSChar(intptr_t, int);
unsigned char mhs_to_CUChar(intptr_t, int);
-short mhs_to_CSHORT(intptr_t, int);
-unsigned short mhs_to_CUSHORT(intptr_t, int);
-int mhs_to_CINT(intptr_t, int);
-unsigned int mhs_to_CUINT(intptr_t, int);
-long mhs_to_CLONG(intptr_t, int);
-unsigned long mhs_to_CULONG(intptr_t, int);
-long long mhs_to_CLLONG(intptr_t, int);
-unsigned long long mhs_to_CULLONG(intptr_t, int);
+short mhs_to_CShort(intptr_t, int);
+unsigned short mhs_to_CUShort(intptr_t, int);
+int mhs_to_CInt(intptr_t, int);
+unsigned int mhs_to_CUInt(intptr_t, int);
+long mhs_to_CLong(intptr_t, int);
+unsigned long mhs_to_CULong(intptr_t, int);
+long long mhs_to_CLLong(intptr_t, int);
+unsigned long long mhs_to_CULLong(intptr_t, int);
size_t mhs_to_CSize(intptr_t, int);
+// long mhs_to_CTime(intptr_t, int); /* XXX wrong */
// ssize_t mhs_to_CSSize(intptr_t, int);
intptr_t mhs_to_CIntPtr(intptr_t, int);
uintptr_t mhs_to_CUIntPtr(intptr_t, int);
--- a/tests/Arith.hs
+++ b/tests/Arith.hs
@@ -1,8 +1,12 @@
module Arith(module Arith) where
import Prelude
+vals :: [Int]
+vals = [-5, -2, -1, 0, 1, 2, 5]
+
main :: IO ()
main = do
- putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,0,1,2,5::Int], op <- [(+),( - ),(*)] ]
- putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,1,2,5::Int], op <- [quot, rem] ]
- putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,0,1,2,5::Int], op <- [(==),(/=),(<),(<=),(>),(>=)] ]
+ putStrLn $ show [ op x y | x <- vals, y <- vals, op <- [(+),( - ),(*)] ]
+ putStrLn $ show [ op x y | x <- vals, y <- vals, y /= 0, op <- [quot, rem] ]
+ putStrLn $ show [ op x y | x <- vals, y <- vals, op <- [(==),(/=),(<),(<=),(>),(>=)] ]
+ putStrLn $ show [ op x y | x <- vals, y <- vals, let op = compare ]
--- a/tests/Arith.ref
+++ b/tests/Arith.ref
@@ -1,3 +1,4 @@
[-10,0,25,-7,-3,10,-6,-4,5,-5,-5,0,-4,-6,-5,-3,-7,-10,0,-10,-25,-7,3,10,-4,0,4,-3,-1,2,-2,-2,0,-1,-3,-2,0,-4,-4,3,-7,-10,-6,4,5,-3,1,2,-2,0,1,-1,-1,0,0,-2,-1,1,-3,-2,4,-6,-5,-5,5,0,-2,2,0,-1,1,0,0,0,0,1,-1,0,2,-2,0,5,-5,0,-4,6,-5,-1,3,-2,0,2,-1,1,1,0,2,0,1,3,-1,2,6,-4,5,-3,7,-10,0,4,-4,1,3,-2,2,2,0,3,1,2,4,0,4,7,-3,10,0,10,-25,3,7,-10,4,6,-5,5,5,0,6,4,5,7,3,10,10,0,25]
[1,0,2,-1,5,0,-5,0,-2,-1,-1,0,0,-2,1,0,2,0,-2,0,-1,0,0,-2,0,-1,0,-1,1,0,-1,0,0,-1,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,-1,0,1,0,0,1,0,1,0,2,-1,0,-2,0,2,0,1,0,0,2,-1,0,-2,1,-5,0,5,0,2,1,1,0]
[True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True]
+[EQ,LT,LT,LT,LT,LT,LT,GT,EQ,LT,LT,LT,LT,LT,GT,GT,EQ,LT,LT,LT,LT,GT,GT,GT,EQ,LT,LT,LT,GT,GT,GT,GT,EQ,LT,LT,GT,GT,GT,GT,GT,EQ,LT,GT,GT,GT,GT,GT,GT,EQ]
--- /dev/null
+++ b/tests/Bang.hs
@@ -1,0 +1,17 @@
+module Bang where
+
+(!) :: Int -> Int -> Int
+x ! y = x - y
+
+f :: Int -> Int
+f !x = x+1
+
+main = do
+ let !a = 1+2
+ print a
+ print (2 ! 3)
+ print (2! 3)
+ print (2 !3)
+ print (2!3)
+ print (f 1)
+
\ No newline at end of file
--- /dev/null
+++ b/tests/Bang.ref
@@ -1,0 +1,6 @@
+3
+-1
+-1
+-1
+-1
+2
--- /dev/null
+++ b/tests/Bytestring.hs
@@ -1,0 +1,27 @@
+module Bytestring where
+import Data.Word
+import Data.ByteString
+
+bs1 :: ByteString
+bs1 = pack [1,2,3]
+
+bs2 :: ByteString
+bs2 = pack [1,2,4]
+
+bs3 :: ByteString
+bs3 = pack [1,2]
+
+bs4 :: ByteString
+bs4 = pack [1,3,4]
+
+main :: IO ()
+main = do
+ print (unpack bs1)
+ print bs1
+ print $ bs1 `append` bs2
+ print [ op x y | op <- [(==), (/=), (<), (<=), (>), (>=)]
+ , x <- [bs1, bs2, bs3, bs4]
+ , y <- [bs1, bs2, bs3, bs4]
+ ]
+ print [ compare x y | x <- [bs1, bs2, bs3, bs4], y <- [bs1, bs2, bs3, bs4] ]
+ print $ unpack "abc"
--- /dev/null
+++ b/tests/Bytestring.ref
@@ -1,0 +1,6 @@
+[1,2,3]
+"\1\2\3"
+"\1\2\3\1\2\4"
+[True,False,False,False,False,True,False,False,False,False,True,False,False,False,False,True,False,True,True,True,True,False,True,True,True,True,False,True,True,True,True,False,False,True,False,True,False,False,False,True,True,True,False,True,False,False,False,False,True,True,False,True,False,True,False,True,True,True,True,True,False,False,False,True,False,False,True,False,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,False,False,False,True,False,True,True,True,True]
+[EQ,LT,GT,LT,GT,EQ,GT,LT,LT,LT,EQ,LT,GT,GT,GT,EQ]
+[97,98,99]
--- a/tests/Foreign.hs
+++ /dev/null
@@ -1,19 +1,0 @@
-module Foreign(main) where
-import Prelude
-import Foreign.C.Types
-import Foreign.Ptr
-import Foreign.Storable
-
-foreign import ccall "llabs" iabs :: Int -> IO Int
-foreign import ccall "sys/errno.h &errno" cerrno :: IO (Ptr CInt)
-foreign import ccall "&llabs" pabs :: IO (FunPtr (Int -> IO Int))
-
-main :: IO ()
-main = do
- x1 <- iabs (3 - 8)
- putStrLn $ show x1
- x2 <- iabs (10 - 8)
- putStrLn $ show x2
- p <- cerrno
- CInt e <- peek p
- print e
--- a/tests/Foreign.ref
+++ /dev/null
@@ -1,2 +1,0 @@
-5
-2
--- /dev/null
+++ b/tests/ForeignC.hs
@@ -1,0 +1,19 @@
+module ForeignC(main) where
+import Prelude
+import Foreign.C.Types
+import Foreign.Ptr
+import Foreign.Storable
+
+foreign import ccall "llabs" iabs :: Int -> IO Int
+foreign import ccall "sys/errno.h &errno" cerrno :: IO (Ptr CInt)
+foreign import ccall "&llabs" pabs :: IO (FunPtr (Int -> IO Int))
+
+main :: IO ()
+main = do
+ x1 <- iabs (3 - 8)
+ putStrLn $ show x1
+ x2 <- iabs (10 - 8)
+ putStrLn $ show x2
+ p <- cerrno
+ CInt e <- peek p
+ print e
--- /dev/null
+++ b/tests/ForeignC.ref
@@ -1,0 +1,2 @@
+5
+2
--- /dev/null
+++ b/tests/ImpMet.hs
@@ -1,0 +1,5 @@
+module ImpMet where
+import Prelude(pure, IO, (), putStrLn)
+
+main :: IO ()
+main = putStrLn "ok"
--- /dev/null
+++ b/tests/ImpMet.ref
@@ -1,0 +1,1 @@
+ok
--- /dev/null
+++ b/tests/LameCase.hs
@@ -1,0 +1,10 @@
+module LameCase where
+
+f :: Int -> Int
+f = \case
+ 1 -> 2
+ 2 -> 3
+ n -> n
+
+main :: IO ()
+main = mapM_ (print . f) [1,2,3,4]
--- /dev/null
+++ b/tests/LameCase.ref
@@ -1,0 +1,4 @@
+2
+3
+3
+4
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -29,7 +29,7 @@
$(TMHS) Word && $(EVAL) > Word.out && diff Word.ref Word.out
$(TMHS) Integer && $(EVAL) > Integer.out && diff Integer.ref Integer.out
$(TMHS) Enum && $(EVAL) > Enum.out && diff Enum.ref Enum.out
-# $(TMHS) Foreign && $(EVAL) > Foreign.out && diff Foreign.ref Foreign.out
+# $(TMHS) ForeignC && $(EVAL) > ForeignC.out && diff ForeignC.ref ForeignC.out
$(TMHS) MutRec && $(EVAL) > MutRec.out && diff MutRec.ref MutRec.out
$(TMHS) LocalPoly && $(EVAL) > LocalPoly.out && diff LocalPoly.ref LocalPoly.out
$(TMHS) Rank2 && $(EVAL) > Rank2.out && diff Rank2.ref Rank2.out
@@ -68,6 +68,13 @@
$(TMHS) Eq1 && $(EVAL) > Eq1.out && diff Eq1.ref Eq1.out
$(TMHS) Irref && $(EVAL) > Irref.out && diff Irref.ref Irref.out
$(TMHS) DfltSig && $(EVAL) > DfltSig.out && diff DfltSig.ref DfltSig.out
+ $(TMHS) Bytestring && $(EVAL) > Bytestring.out && diff Bytestring.ref Bytestring.out
+ $(TMHS) Text && $(EVAL) > Text.out && diff Text.ref Text.out
+ $(TMHS) ImpMet && $(EVAL) > ImpMet.out && diff ImpMet.ref ImpMet.out
+ $(TMHS) MultiIf && $(EVAL) > MultiIf.out && diff MultiIf.ref MultiIf.out
+ $(TMHS) LameCase && $(EVAL) > LameCase.out && diff LameCase.ref LameCase.out
+ $(TMHS) NoForall && $(EVAL) > NoForall.out && diff NoForall.ref NoForall.out
+ $(TMHS) Bang && $(EVAL) > Bang.out && diff Bang.ref Bang.out
errtest:
sh errtester.sh $(MHS) < errmsg.test
--- /dev/null
+++ b/tests/MultiIf.hs
@@ -1,0 +1,33 @@
+module MultiIf where
+
+f :: Int -> Int
+f x =
+ let (a, b) | x == 0 = (2,3)
+ | otherwise = (3, 4)
+ (c, d) = (10, 11)
+ in a*c + b*d
+
+g :: Int -> Int
+g x =
+ if { | x < 0 -> -1
+ ; | x == 0 -> 0
+ ; | x > 0 -> 1 }
+
+h :: Int -> Int
+h x =
+ if | x < 0 -> if | x < -10 -> -2
+ | otherwise -> -1
+ | x == 0 -> 0
+ | x > 0 -> 1
+
+main :: IO ()
+main = do
+ print (f 0)
+ print (f 1)
+ print (g 100)
+ print (g 0)
+ print (g (-5))
+ print (h (-100))
+ print (h (-2))
+ print (h 0)
+ print (h 100)
--- /dev/null
+++ b/tests/MultiIf.ref
@@ -1,0 +1,9 @@
+53
+74
+1
+0
+-1
+-2
+-1
+0
+1
--- /dev/null
+++ b/tests/NoForall.hs
@@ -1,0 +1,11 @@
+module NoForall where
+
+-- Without an explicit forall the 'a' is not bound in the body.
+f :: a -> ((a,a),(a,a))
+f x =
+ let g :: a -> (a,a)
+ g a = (a,a)
+ in g (x,x)
+
+main :: IO ()
+main = print (f True)
--- /dev/null
+++ b/tests/NoForall.ref
@@ -1,0 +1,1 @@
+((True,True),(True,True))
--- /dev/null
+++ b/tests/Text.hs
@@ -1,0 +1,26 @@
+module Text where
+import Data.Text
+
+bs1 :: Text
+bs1 = pack "abc"
+
+bs2 :: Text
+bs2 = pack "abd"
+
+bs3 :: Text
+bs3 = pack "ab"
+
+bs4 :: Text
+bs4 = pack "acd"
+
+main :: IO ()
+main = do
+ print (unpack bs1)
+ print bs1
+ print $ bs1 `append` bs2
+ print [ op x y | op <- [(==), (/=), (<), (<=), (>), (>=)]
+ , x <- [bs1, bs2, bs3, bs4]
+ , y <- [bs1, bs2, bs3, bs4]
+ ]
+ print [ compare x y | x <- [bs1, bs2, bs3, bs4], y <- [bs1, bs2, bs3, bs4] ]
+ print ("abc" :: Text)
--- /dev/null
+++ b/tests/Text.ref
@@ -1,0 +1,6 @@
+"abc"
+"abc"
+"abcabd"
+[True,False,False,False,False,True,False,False,False,False,True,False,False,False,False,True,False,True,True,True,True,False,True,True,True,True,False,True,True,True,True,False,False,True,False,True,False,False,False,True,True,True,False,True,False,False,False,False,True,True,False,True,False,True,False,True,True,True,True,True,False,False,False,True,False,False,True,False,True,False,True,False,False,False,False,False,True,True,True,False,True,False,True,False,True,True,True,False,False,False,True,False,True,True,True,True]
+[EQ,LT,GT,LT,GT,EQ,GT,LT,LT,LT,EQ,LT,GT,GT,GT,EQ]
+"abc"
--- a/tests/Word.hs
+++ b/tests/Word.hs
@@ -2,10 +2,17 @@
import Prelude
import Data.Word
+vals :: [Word16]
+vals = [0xfff0, 0xfffe, 0xffff, 0, 1, 2, 5]
+
+maxw :: Word
+maxw = if _wordSize == 32 then 0x7fff::Word else 0x7fffffff::Word
+
main :: IO ()
main = do
putStrLn $ show (1000::Word)
putStrLn $ show $ maxw*maxw > 0
-
-maxw :: Word
-maxw = if _wordSize == 32 then 0x7fff::Word else 0x7fffffff::Word
+ putStrLn $ show [ op x y | x <- vals, y <- vals, op <- [(+),( - ),(*)] ]
+ putStrLn $ show [ op x y | x <- vals, y <- vals, y /= 0, op <- [quot, rem] ]
+ putStrLn $ show [ op x y | x <- vals, y <- vals, op <- [(==),(/=),(<),(<=),(>),(>=)] ]
+ putStrLn $ show [ op x y | x <- vals, y <- vals, let op = compare ]
--- a/tests/Word.ref
+++ b/tests/Word.ref
@@ -1,2 +1,6 @@
1000
True
+[65504,0,256,65518,65522,32,65519,65521,16,65520,65520,0,65521,65519,65520,65522,65518,65504,65525,65515,65456,65518,14,32,65532,0,4,65533,65535,2,65534,65534,0,65535,65533,65534,0,65532,65532,3,65529,65526,65519,15,16,65533,1,2,65534,0,1,65535,65535,0,0,65534,65535,1,65533,65534,4,65530,65531,65520,16,0,65534,2,0,65535,1,0,0,0,0,1,65535,0,2,65534,0,5,65531,0,65521,17,65520,65535,3,65534,0,2,65535,1,1,0,2,0,1,3,65535,2,6,65532,5,65522,18,65504,0,4,65532,1,3,65534,2,2,0,3,1,2,4,0,4,7,65533,10,65525,21,65456,3,7,65526,4,6,65531,5,5,0,6,4,5,7,3,10,10,0,25]
+[1,0,0,65520,0,65520,65520,0,32760,0,13104,0,1,14,1,0,0,65534,65534,0,32767,0,13106,4,1,15,1,1,1,0,65535,0,32767,1,13107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,2,0,2,0,2,2,0,1,0,0,2,0,5,0,5,0,5,5,0,2,1,1,0]
+[True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True]
+[EQ,LT,LT,GT,GT,GT,GT,GT,EQ,LT,GT,GT,GT,GT,GT,GT,EQ,GT,GT,GT,GT,LT,LT,LT,EQ,LT,LT,LT,LT,LT,LT,GT,EQ,LT,LT,LT,LT,LT,GT,GT,EQ,LT,LT,LT,LT,GT,GT,GT,EQ]
--
⑨