sksl enum support

Bug: skia:
Change-Id: I4d505b31cf8b59de12bcdbca410aafc085977ba9
Reviewed-on: https://skia-review.googlesource.com/68621
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 485bce3..ba10fdc 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -973,8 +973,7 @@
         // ...and it should have succeeded
         SkASSERT(this->validPMUPMConversionExists());
 
-        return GrConfigConversionEffect::Make(std::move(fp),
-                                              GrConfigConversionEffect::kToUnpremul_PMConversion);
+        return GrConfigConversionEffect::Make(std::move(fp), PMConversion::kToUnpremul);
     } else {
         // For everything else (sRGB, half-float, etc...), it doesn't make sense to try and
         // explicitly round the results. Just do the obvious, naive thing in the shader.
@@ -992,8 +991,7 @@
         // ...and it should have succeeded
         SkASSERT(this->validPMUPMConversionExists());
 
-        return GrConfigConversionEffect::Make(std::move(fp),
-                                              GrConfigConversionEffect::kToPremul_PMConversion);
+        return GrConfigConversionEffect::Make(std::move(fp), PMConversion::kToPremul);
     } else {
         // For everything else (sRGB, half-float, etc...), it doesn't make sense to try and
         // explicitly round the results. Just do the obvious, naive thing in the shader.
diff --git a/src/gpu/effects/GrArithmeticFP.cpp b/src/gpu/effects/GrArithmeticFP.cpp
index 1c47732..41de643 100644
--- a/src/gpu/effects/GrArithmeticFP.cpp
+++ b/src/gpu/effects/GrArithmeticFP.cpp
@@ -76,7 +76,7 @@
 }
 void GrArithmeticFP::onGetGLSLProcessorKey(const GrShaderCaps& caps,
                                            GrProcessorKeyBuilder* b) const {
-    b->add32(fEnforcePMColor);
+    b->add32((int32_t)fEnforcePMColor);
 }
 bool GrArithmeticFP::onIsEqual(const GrFragmentProcessor& other) const {
     const GrArithmeticFP& that = other.cast<GrArithmeticFP>();
diff --git a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp
index 80e2d37..6dfb6c5 100644
--- a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp
+++ b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.cpp
@@ -31,7 +31,8 @@
                 "0.017999999999999999);\n        break;\n    case 1:\n        factor = "
                 "half(smoothstep(1.0, 0.0, float(factor)));\n        break;\n}\n%s = "
                 "half4(factor);\n",
-                args.fInputColor ? args.fInputColor : "half4(1)", _outer.mode(), args.fOutputColor);
+                args.fInputColor ? args.fInputColor : "half4(1)", (int)_outer.mode(),
+                args.fOutputColor);
     }
 
 private:
@@ -43,7 +44,7 @@
 }
 void GrBlurredEdgeFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps,
                                                            GrProcessorKeyBuilder* b) const {
-    b->add32(fMode);
+    b->add32((int32_t)fMode);
 }
 bool GrBlurredEdgeFragmentProcessor::onIsEqual(const GrFragmentProcessor& other) const {
     const GrBlurredEdgeFragmentProcessor& that = other.cast<GrBlurredEdgeFragmentProcessor>();
diff --git a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.fp b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.fp
index fe5ffd5..14b29e6 100644
--- a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.fp
+++ b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.fp
@@ -5,22 +5,20 @@
  * found in the LICENSE file.
  */
 
-@class {
-    enum Mode {
-        kGaussian_Mode = 0,
-        kSmoothStep_Mode = 1
-    };
-}
+enum class Mode {
+    kGaussian   = 0,
+    kSmoothStep = 1
+};
 
-layout(key) in int mode;
+layout(key) in Mode mode;
 
 void main() {
     half factor = 1.0 - sk_InColor.a;
     @switch (mode) {
-        case 0: // kGaussian_Mode
+        case Mode::kGaussian:
             factor = exp(-factor * factor * 4.0) - 0.018;
             break;
-        case 1: // kSmoothstep_Mode
+        case Mode::kSmoothStep:
             factor = smoothstep(1.0, 0.0, factor);
             break;
     }
diff --git a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.h b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.h
index 0cd9a8e..ff9f047 100644
--- a/src/gpu/effects/GrBlurredEdgeFragmentProcessor.h
+++ b/src/gpu/effects/GrBlurredEdgeFragmentProcessor.h
@@ -16,9 +16,9 @@
 #include "GrCoordTransform.h"
 class GrBlurredEdgeFragmentProcessor : public GrFragmentProcessor {
 public:
-    enum Mode { kGaussian_Mode = 0, kSmoothStep_Mode = 1 };
-    int mode() const { return fMode; }
-    static std::unique_ptr<GrFragmentProcessor> Make(int mode) {
+    enum class Mode { kSmoothStep = 1, kGaussian = 0 };
+    Mode mode() const { return fMode; }
+    static std::unique_ptr<GrFragmentProcessor> Make(Mode mode) {
         return std::unique_ptr<GrFragmentProcessor>(new GrBlurredEdgeFragmentProcessor(mode));
     }
     GrBlurredEdgeFragmentProcessor(const GrBlurredEdgeFragmentProcessor& src);
@@ -26,14 +26,14 @@
     const char* name() const override { return "BlurredEdgeFragmentProcessor"; }
 
 private:
-    GrBlurredEdgeFragmentProcessor(int mode)
+    GrBlurredEdgeFragmentProcessor(Mode mode)
             : INHERITED(kGrBlurredEdgeFragmentProcessor_ClassID, kNone_OptimizationFlags)
             , fMode(mode) {}
     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
     bool onIsEqual(const GrFragmentProcessor&) const override;
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
-    int fMode;
+    Mode fMode;
     typedef GrFragmentProcessor INHERITED;
 };
 #endif
diff --git a/src/gpu/effects/GrCircleEffect.cpp b/src/gpu/effects/GrCircleEffect.cpp
index eccf8bf..d3eecb7 100644
--- a/src/gpu/effects/GrCircleEffect.cpp
+++ b/src/gpu/effects/GrCircleEffect.cpp
@@ -38,14 +38,14 @@
                 "%s.w))) * float(%s.z));\n}\n@if ((%d == 1 || %d == 3) || %d == 4) {\n    d = "
                 "half(clamp(float(d), 0.0, 1.0));\n} else {\n    d = half(float(d) > 0.5 ? 1.0 : "
                 "0.0);\n}\n%s = %s * d;\n",
-                prevRadius, _outer.edgeType(), _outer.edgeType(),
+                prevRadius, (int)_outer.edgeType(), (int)_outer.edgeType(),
                 args.fUniformHandler->getUniformCStr(fCircleVar),
                 args.fUniformHandler->getUniformCStr(fCircleVar),
                 args.fUniformHandler->getUniformCStr(fCircleVar),
                 args.fUniformHandler->getUniformCStr(fCircleVar),
                 args.fUniformHandler->getUniformCStr(fCircleVar),
-                args.fUniformHandler->getUniformCStr(fCircleVar), _outer.edgeType(),
-                _outer.edgeType(), _outer.edgeType(), args.fOutputColor,
+                args.fUniformHandler->getUniformCStr(fCircleVar), (int)_outer.edgeType(),
+                (int)_outer.edgeType(), (int)_outer.edgeType(), args.fOutputColor,
                 args.fInputColor ? args.fInputColor : "half4(1)");
     }
 
@@ -84,7 +84,7 @@
 }
 void GrCircleEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
                                            GrProcessorKeyBuilder* b) const {
-    b->add32(fEdgeType);
+    b->add32((int32_t)fEdgeType);
 }
 bool GrCircleEffect::onIsEqual(const GrFragmentProcessor& other) const {
     const GrCircleEffect& that = other.cast<GrCircleEffect>();
@@ -113,7 +113,7 @@
     do {
         et = (GrClipEdgeType)testData->fRandom->nextULessThan(kGrClipEdgeTypeCnt);
     } while (GrClipEdgeType::kHairlineAA == et);
-    return GrCircleEffect::Make((int)et, center, radius);
+    return GrCircleEffect::Make(et, center, radius);
 }
 #endif
 #endif
diff --git a/src/gpu/effects/GrCircleEffect.fp b/src/gpu/effects/GrCircleEffect.fp
index 95cbeb0..fe959f8 100644
--- a/src/gpu/effects/GrCircleEffect.fp
+++ b/src/gpu/effects/GrCircleEffect.fp
@@ -5,7 +5,7 @@
  * found in the LICENSE file.
  */
 
-layout(key) in int edgeType;
+layout(key) in GrClipEdgeType edgeType;
 in half2 center;
 in half radius;
 
@@ -37,15 +37,15 @@
     // radius and then denormalized. This is to prevent overflow on devices that have a "real"
     // mediump. It'd be nice to only do this on mediump devices.
     half d;
-    @if (edgeType == 2 /* GrClipEdgeType::kInverseFillBW */ ||
-         edgeType == 3 /* GrClipEdgeType::kInverseFillAA */) {
+    @if (edgeType == GrClipEdgeType::kInverseFillBW ||
+         edgeType == GrClipEdgeType::kInverseFillAA) {
         d = (length((circle.xy - sk_FragCoord.xy) * circle.w) - 1.0) * circle.z;
     } else {
         d = (1.0 - length((circle.xy - sk_FragCoord.xy) *  circle.w)) * circle.z;
     }
-    @if (edgeType == 1 /* GrClipEdgeType::kFillAA */ ||
-         edgeType == 3 /* GrClipEdgeType::kInverseFillAA */ ||
-         edgeType == 4 /* GrClipEdgeType::kHairlineAA */) {
+    @if (edgeType == GrClipEdgeType::kFillAA ||
+         edgeType == GrClipEdgeType::kInverseFillAA ||
+         edgeType == GrClipEdgeType::kHairlineAA) {
         d = clamp(d, 0.0, 1.0);
     } else {
         d = d > 0.5 ? 1.0 : 0.0;
@@ -63,5 +63,5 @@
     do {
         et = (GrClipEdgeType) testData->fRandom->nextULessThan(kGrClipEdgeTypeCnt);
     } while (GrClipEdgeType::kHairlineAA == et);
-    return GrCircleEffect::Make((int) et, center, radius);
+    return GrCircleEffect::Make(et, center, radius);
 }
\ No newline at end of file
diff --git a/src/gpu/effects/GrCircleEffect.h b/src/gpu/effects/GrCircleEffect.h
index c088fd5..bf6bd0e 100644
--- a/src/gpu/effects/GrCircleEffect.h
+++ b/src/gpu/effects/GrCircleEffect.h
@@ -16,10 +16,11 @@
 #include "GrCoordTransform.h"
 class GrCircleEffect : public GrFragmentProcessor {
 public:
-    int edgeType() const { return fEdgeType; }
+    GrClipEdgeType edgeType() const { return fEdgeType; }
     SkPoint center() const { return fCenter; }
     float radius() const { return fRadius; }
-    static std::unique_ptr<GrFragmentProcessor> Make(int edgeType, SkPoint center, float radius) {
+    static std::unique_ptr<GrFragmentProcessor> Make(GrClipEdgeType edgeType, SkPoint center,
+                                                     float radius) {
         return std::unique_ptr<GrFragmentProcessor>(new GrCircleEffect(edgeType, center, radius));
     }
     GrCircleEffect(const GrCircleEffect& src);
@@ -27,7 +28,7 @@
     const char* name() const override { return "CircleEffect"; }
 
 private:
-    GrCircleEffect(int edgeType, SkPoint center, float radius)
+    GrCircleEffect(GrClipEdgeType edgeType, SkPoint center, float radius)
             : INHERITED(kGrCircleEffect_ClassID,
                         (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
             , fEdgeType(edgeType)
@@ -37,7 +38,7 @@
     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
     bool onIsEqual(const GrFragmentProcessor&) const override;
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
-    int fEdgeType;
+    GrClipEdgeType fEdgeType;
     SkPoint fCenter;
     float fRadius;
     typedef GrFragmentProcessor INHERITED;
diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp
index d32cb1d..9887cac 100644
--- a/src/gpu/effects/GrConfigConversionEffect.cpp
+++ b/src/gpu/effects/GrConfigConversionEffect.cpp
@@ -33,7 +33,7 @@
                 "? half3(0.0) : half3(floor(float3(float3((%s.xyz / %s.w) * 255.0) + 0.5)) / "
                 "255.0);\n        break;\n}\n",
                 args.fOutputColor, args.fInputColor ? args.fInputColor : "half4(1)",
-                _outer.pmConversion(), args.fOutputColor, args.fOutputColor, args.fOutputColor,
+                (int)_outer.pmConversion(), args.fOutputColor, args.fOutputColor, args.fOutputColor,
                 args.fOutputColor, args.fOutputColor, args.fOutputColor, args.fOutputColor);
     }
 
@@ -46,7 +46,7 @@
 }
 void GrConfigConversionEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
                                                      GrProcessorKeyBuilder* b) const {
-    b->add32(fPmConversion);
+    b->add32((int32_t)fPmConversion);
 }
 bool GrConfigConversionEffect::onIsEqual(const GrFragmentProcessor& other) const {
     const GrConfigConversionEffect& that = other.cast<GrConfigConversionEffect>();
@@ -64,7 +64,8 @@
 #if GR_TEST_UTILS
 std::unique_ptr<GrFragmentProcessor> GrConfigConversionEffect::TestCreate(
         GrProcessorTestData* data) {
-    PMConversion pmConv = static_cast<PMConversion>(data->fRandom->nextULessThan(kPMConversionCnt));
+    PMConversion pmConv = static_cast<PMConversion>(
+            data->fRandom->nextULessThan((int)PMConversion::kPMConversionCnt));
     return std::unique_ptr<GrFragmentProcessor>(new GrConfigConversionEffect(pmConv));
 }
 #endif
diff --git a/src/gpu/effects/GrConfigConversionEffect.fp b/src/gpu/effects/GrConfigConversionEffect.fp
index 4c09bf4..62b998d 100644
--- a/src/gpu/effects/GrConfigConversionEffect.fp
+++ b/src/gpu/effects/GrConfigConversionEffect.fp
@@ -5,12 +5,6 @@
 }
 
 @class {
-    enum PMConversion {
-        kToPremul_PMConversion   = 0,
-        kToUnpremul_PMConversion = 1,
-        kPMConversionCnt         = 2
-    };
-
     static bool TestForPreservingPMConversions(GrContext* context) {
         static constexpr int kSize = 256;
         static constexpr GrPixelConfig kConfig = kRGBA_8888_GrPixelConfig;
@@ -69,9 +63,9 @@
         GrPaint paint2;
         GrPaint paint3;
         std::unique_ptr<GrFragmentProcessor> pmToUPM(
-                new GrConfigConversionEffect(kToUnpremul_PMConversion));
+                new GrConfigConversionEffect(PMConversion::kToUnpremul));
         std::unique_ptr<GrFragmentProcessor> upmToPM(
-                new GrConfigConversionEffect(kToPremul_PMConversion));
+                new GrConfigConversionEffect(PMConversion::kToPremul));
 
         paint1.addColorTextureProcessor(dataProxy, SkMatrix::I());
         paint1.addColorFragmentProcessor(pmToUPM->clone());
@@ -125,7 +119,7 @@
     }
 }
 
-layout(key) in int pmConversion;
+layout(key) in PMConversion pmConversion;
 
 @emitCode {
     fragBuilder->forceHighPrecision();
@@ -137,11 +131,11 @@
     sk_OutColor = floor(sk_InColor * 255 + 0.5) / 255;
 
     @switch (pmConversion) {
-        case 0 /* kToPremul_PMConversion */:
+        case PMConversion::kToPremul:
             sk_OutColor.rgb = floor(sk_OutColor.rgb * sk_OutColor.a * 255 + 0.5) / 255;
             break;
 
-        case 1 /* kToUnpremul_PMConversion */:
+        case PMConversion::kToUnpremul:
             sk_OutColor.rgb = sk_OutColor.a <= 0.0 ?
                                           half3(0) :
                                           floor(sk_OutColor.rgb / sk_OutColor.a * 255 + 0.5) / 255;
@@ -150,6 +144,7 @@
 }
 
 @test(data) {
-    PMConversion pmConv = static_cast<PMConversion>(data->fRandom->nextULessThan(kPMConversionCnt));
+    PMConversion pmConv = static_cast<PMConversion>(data->fRandom->nextULessThan(
+                                                             (int) PMConversion::kPMConversionCnt));
     return std::unique_ptr<GrFragmentProcessor>(new GrConfigConversionEffect(pmConv));
 }
diff --git a/src/gpu/effects/GrConfigConversionEffect.h b/src/gpu/effects/GrConfigConversionEffect.h
index cffd5a6..cc02473 100644
--- a/src/gpu/effects/GrConfigConversionEffect.h
+++ b/src/gpu/effects/GrConfigConversionEffect.h
@@ -20,12 +20,6 @@
 #include "GrCoordTransform.h"
 class GrConfigConversionEffect : public GrFragmentProcessor {
 public:
-    enum PMConversion {
-        kToPremul_PMConversion = 0,
-        kToUnpremul_PMConversion = 1,
-        kPMConversionCnt = 2
-    };
-
     static bool TestForPreservingPMConversions(GrContext* context) {
         static constexpr int kSize = 256;
         static constexpr GrPixelConfig kConfig = kRGBA_8888_GrPixelConfig;
@@ -79,9 +73,9 @@
         GrPaint paint2;
         GrPaint paint3;
         std::unique_ptr<GrFragmentProcessor> pmToUPM(
-                new GrConfigConversionEffect(kToUnpremul_PMConversion));
+                new GrConfigConversionEffect(PMConversion::kToUnpremul));
         std::unique_ptr<GrFragmentProcessor> upmToPM(
-                new GrConfigConversionEffect(kToPremul_PMConversion));
+                new GrConfigConversionEffect(PMConversion::kToPremul));
 
         paint1.addColorTextureProcessor(dataProxy, SkMatrix::I());
         paint1.addColorFragmentProcessor(pmToUPM->clone());
@@ -121,7 +115,7 @@
 
         return true;
     }
-    int pmConversion() const { return fPmConversion; }
+    PMConversion pmConversion() const { return fPmConversion; }
 
     static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> fp,
                                                      PMConversion pmConversion) {
@@ -137,14 +131,14 @@
     const char* name() const override { return "ConfigConversionEffect"; }
 
 private:
-    GrConfigConversionEffect(int pmConversion)
+    GrConfigConversionEffect(PMConversion pmConversion)
             : INHERITED(kGrConfigConversionEffect_ClassID, kNone_OptimizationFlags)
             , fPmConversion(pmConversion) {}
     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
     bool onIsEqual(const GrFragmentProcessor&) const override;
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
-    int fPmConversion;
+    PMConversion fPmConversion;
     typedef GrFragmentProcessor INHERITED;
 };
 #endif
diff --git a/src/gpu/effects/GrDitherEffect.cpp b/src/gpu/effects/GrDitherEffect.cpp
index 78d5591..d3fdc4f 100644
--- a/src/gpu/effects/GrDitherEffect.cpp
+++ b/src/gpu/effects/GrDitherEffect.cpp
@@ -53,7 +53,7 @@
 }
 void GrDitherEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
                                            GrProcessorKeyBuilder* b) const {
-    b->add32(fRangeType);
+    b->add32((int32_t)fRangeType);
 }
 bool GrDitherEffect::onIsEqual(const GrFragmentProcessor& other) const {
     const GrDitherEffect& that = other.cast<GrDitherEffect>();
diff --git a/src/gpu/effects/GrEllipseEffect.cpp b/src/gpu/effects/GrEllipseEffect.cpp
index 20afa93..4a0f376 100644
--- a/src/gpu/effects/GrEllipseEffect.cpp
+++ b/src/gpu/effects/GrEllipseEffect.cpp
@@ -49,7 +49,7 @@
                 fScaleVar.isValid() ? args.fUniformHandler->getUniformCStr(fScaleVar) : "half2(0)",
                 args.fUniformHandler->getUniformCStr(fEllipseVar),
                 fScaleVar.isValid() ? args.fUniformHandler->getUniformCStr(fScaleVar) : "half2(0)",
-                _outer.edgeType());
+                (int)_outer.edgeType());
         fragBuilder->codeAppendf(
                 "0);\n        break;\n    case 1:\n        alpha = half(clamp(0.5 - "
                 "float(approx_dist), 0.0, 1.0));\n        break;\n    case 2:\n        alpha = "
@@ -110,7 +110,7 @@
 }
 void GrEllipseEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
                                             GrProcessorKeyBuilder* b) const {
-    b->add32(fEdgeType);
+    b->add32((int32_t)fEdgeType);
 }
 bool GrEllipseEffect::onIsEqual(const GrFragmentProcessor& other) const {
     const GrEllipseEffect& that = other.cast<GrEllipseEffect>();
@@ -140,7 +140,7 @@
     do {
         et = (GrClipEdgeType)testData->fRandom->nextULessThan(kGrClipEdgeTypeCnt);
     } while (GrClipEdgeType::kHairlineAA == et);
-    return GrEllipseEffect::Make((int)et, center, SkPoint::Make(rx, ry));
+    return GrEllipseEffect::Make(et, center, SkPoint::Make(rx, ry));
 }
 #endif
 #endif
diff --git a/src/gpu/effects/GrEllipseEffect.fp b/src/gpu/effects/GrEllipseEffect.fp
index f3feae1..54641b7 100644
--- a/src/gpu/effects/GrEllipseEffect.fp
+++ b/src/gpu/effects/GrEllipseEffect.fp
@@ -5,7 +5,7 @@
  * found in the LICENSE file.
  */
 
-layout(key) in int edgeType;
+layout(key) in GrClipEdgeType edgeType;
 in half2 center;
 in half2 radii;
 
@@ -72,16 +72,16 @@
 
     half alpha;
     @switch (edgeType) {
-        case 0 /* GrClipEdgeType::kFillBW */:
+        case GrClipEdgeType::kFillBW:
             alpha = approx_dist > 0.0 ? 0.0 : 1.0;
             break;
-        case 1 /* GrClipEdgeType::kFillAA */:
+        case GrClipEdgeType::kFillAA:
             alpha = clamp(0.5 - approx_dist, 0.0, 1.0);
             break;
-        case 2 /* GrClipEdgeType::kInverseFillBW */:
+        case GrClipEdgeType::kInverseFillBW:
             alpha = approx_dist > 0.0 ? 1.0 : 0.0;
             break;
-        case 3 /* GrClipEdgeType::kInverseFillAA */:
+        case GrClipEdgeType::kInverseFillAA:
             alpha = clamp(0.5 + approx_dist, 0.0, 1.0);
             break;
         default:
@@ -101,5 +101,5 @@
     do {
         et = (GrClipEdgeType) testData->fRandom->nextULessThan(kGrClipEdgeTypeCnt);
     } while (GrClipEdgeType::kHairlineAA == et);
-    return GrEllipseEffect::Make((int) et, center, SkPoint::Make(rx, ry));
+    return GrEllipseEffect::Make(et, center, SkPoint::Make(rx, ry));
 }
\ No newline at end of file
diff --git a/src/gpu/effects/GrEllipseEffect.h b/src/gpu/effects/GrEllipseEffect.h
index 97d7607..8769295 100644
--- a/src/gpu/effects/GrEllipseEffect.h
+++ b/src/gpu/effects/GrEllipseEffect.h
@@ -16,10 +16,11 @@
 #include "GrCoordTransform.h"
 class GrEllipseEffect : public GrFragmentProcessor {
 public:
-    int edgeType() const { return fEdgeType; }
+    GrClipEdgeType edgeType() const { return fEdgeType; }
     SkPoint center() const { return fCenter; }
     SkPoint radii() const { return fRadii; }
-    static std::unique_ptr<GrFragmentProcessor> Make(int edgeType, SkPoint center, SkPoint radii) {
+    static std::unique_ptr<GrFragmentProcessor> Make(GrClipEdgeType edgeType, SkPoint center,
+                                                     SkPoint radii) {
         return std::unique_ptr<GrFragmentProcessor>(new GrEllipseEffect(edgeType, center, radii));
     }
     GrEllipseEffect(const GrEllipseEffect& src);
@@ -27,7 +28,7 @@
     const char* name() const override { return "EllipseEffect"; }
 
 private:
-    GrEllipseEffect(int edgeType, SkPoint center, SkPoint radii)
+    GrEllipseEffect(GrClipEdgeType edgeType, SkPoint center, SkPoint radii)
             : INHERITED(kGrEllipseEffect_ClassID,
                         (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
             , fEdgeType(edgeType)
@@ -37,7 +38,7 @@
     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
     bool onIsEqual(const GrFragmentProcessor&) const override;
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
-    int fEdgeType;
+    GrClipEdgeType fEdgeType;
     SkPoint fCenter;
     SkPoint fRadii;
     typedef GrFragmentProcessor INHERITED;
diff --git a/src/gpu/effects/GrOvalEffect.cpp b/src/gpu/effects/GrOvalEffect.cpp
index 60ea9df..0c0f3bd 100644
--- a/src/gpu/effects/GrOvalEffect.cpp
+++ b/src/gpu/effects/GrOvalEffect.cpp
@@ -20,12 +20,12 @@
     SkScalar h = oval.height();
     if (SkScalarNearlyEqual(w, h)) {
         w /= 2;
-        return GrCircleEffect::Make((int) edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + w),
+        return GrCircleEffect::Make(edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + w),
                                     w);
     } else {
         w /= 2;
         h /= 2;
-        return GrEllipseEffect::Make((int) edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + h),
+        return GrEllipseEffect::Make(edgeType, SkPoint::Make(oval.fLeft + w, oval.fTop + h),
                                      SkPoint::Make(w, h));
     }
 
diff --git a/src/sksl/SkSLCPPCodeGenerator.cpp b/src/sksl/SkSLCPPCodeGenerator.cpp
index 506daa8..fc2a6e3 100644
--- a/src/sksl/SkSLCPPCodeGenerator.cpp
+++ b/src/sksl/SkSLCPPCodeGenerator.cpp
@@ -158,6 +158,9 @@
             fFormatArgs.push_back(cppCode + ".right()");
             fFormatArgs.push_back(cppCode + ".bottom()");
         }
+    } else if (type.kind() == Type::kEnum_Kind) {
+        this->write("%d");
+        fFormatArgs.push_back("(int) " + cppCode);
     } else {
         printf("unsupported runtime value type '%s'\n", String(type.fName).c_str());
         ASSERT(false);
@@ -694,7 +697,7 @@
                     this->writef("    b->add32(%s.height());\n",
                                  HCodeGenerator::FieldName(name).c_str());
                 } else {
-                    this->writef("    b->add32(%s);\n",
+                    this->writef("    b->add32((int32_t) %s);\n",
                                  HCodeGenerator::FieldName(name).c_str());
                 }
                 break;
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index 0b51824..3b91511 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -14,6 +14,7 @@
 #include "SkSLIRGenerator.h"
 #include "SkSLMetalCodeGenerator.h"
 #include "SkSLSPIRVCodeGenerator.h"
+#include "ir/SkSLEnum.h"
 #include "ir/SkSLExpression.h"
 #include "ir/SkSLExpressionStatement.h"
 #include "ir/SkSLIntLiteral.h"
@@ -28,8 +29,6 @@
 #include "spirv-tools/libspirv.hpp"
 #endif
 
-#define STRINGIFY(x) #x
-
 // include the built-in shader symbols as static strings
 
 static const char* SKSL_INCLUDE =
@@ -49,6 +48,7 @@
 ;
 
 static const char* SKSL_FP_INCLUDE =
+#include "sksl_enums.include"
 #include "sksl_fp.include"
 ;
 
@@ -1153,6 +1153,11 @@
             break;
     }
     fIRGenerator->fSymbolTable->markAllFunctionsBuiltin();
+    for (auto& element : elements) {
+        if (element->fKind == ProgramElement::kEnum_Kind) {
+            ((Enum&) *element).fBuiltin = true;
+        }
+    }
     std::unique_ptr<String> textPtr(new String(std::move(text)));
     fSource = textPtr.get();
     fIRGenerator->convertProgram(textPtr->c_str(), textPtr->size(), *fTypes, &elements);
diff --git a/src/sksl/SkSLGLSLCodeGenerator.cpp b/src/sksl/SkSLGLSLCodeGenerator.cpp
index 2cbc023..f7d6a84 100644
--- a/src/sksl/SkSLGLSLCodeGenerator.cpp
+++ b/src/sksl/SkSLGLSLCodeGenerator.cpp
@@ -1022,6 +1022,8 @@
             this->writeLine(";");
             break;
         }
+        case ProgramElement::kEnum_Kind:
+            break;
         default:
             printf("%s\n", e.description().c_str());
             ABORT("unsupported program element");
diff --git a/src/sksl/SkSLHCodeGenerator.cpp b/src/sksl/SkSLHCodeGenerator.cpp
index 474f3e3..37eef60 100644
--- a/src/sksl/SkSLHCodeGenerator.cpp
+++ b/src/sksl/SkSLHCodeGenerator.cpp
@@ -8,6 +8,7 @@
 #include "SkSLHCodeGenerator.h"
 
 #include "SkSLUtil.h"
+#include "ir/SkSLEnum.h"
 #include "ir/SkSLFunctionDeclaration.h"
 #include "ir/SkSLFunctionDefinition.h"
 #include "ir/SkSLSection.h"
@@ -266,6 +267,11 @@
                  "public:\n",
                  fFullName.c_str());
     this->writeSection(CLASS_SECTION);
+    for (const auto& p : fProgram.fElements) {
+        if (ProgramElement::kEnum_Kind == p->fKind && !((Enum&) *p).fBuiltin) {
+            this->writef("%s\n", p->description().c_str());
+        }
+    }
     for (const auto& param : fSectionAndParameterHelper.getParameters()) {
         if (param->fType.kind() == Type::kSampler_Kind ||
             param->fType.kind() == Type::kOther_Kind) {
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index 2fb27fc..18b36a4 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -24,6 +24,7 @@
 #include "ir/SkSLContinueStatement.h"
 #include "ir/SkSLDiscardStatement.h"
 #include "ir/SkSLDoStatement.h"
+#include "ir/SkSLEnum.h"
 #include "ir/SkSLExpressionStatement.h"
 #include "ir/SkSLField.h"
 #include "ir/SkSLFieldAccess.h"
@@ -411,7 +412,7 @@
     if (!value) {
         return nullptr;
     }
-    if (value->fType != *fContext.fUInt_Type) {
+    if (value->fType != *fContext.fUInt_Type && value->fType.kind() != Type::kEnum_Kind) {
         value = this->coerce(std::move(value), *fContext.fInt_Type);
         if (!value) {
             return nullptr;
@@ -427,18 +428,16 @@
             if (!caseValue) {
                 return nullptr;
             }
-            if (caseValue->fType != *fContext.fUInt_Type) {
-                caseValue = this->coerce(std::move(caseValue), *fContext.fInt_Type);
-                if (!caseValue) {
-                    return nullptr;
-                }
+            caseValue = this->coerce(std::move(caseValue), value->fType);
+            if (!caseValue) {
+                return nullptr;
             }
             if (!caseValue->isConstant()) {
                 fErrors.error(caseValue->fOffset, "case value must be a constant");
                 return nullptr;
             }
-            ASSERT(caseValue->fKind == Expression::kIntLiteral_Kind);
-            int64_t v = ((IntLiteral&) *caseValue).fValue;
+            int64_t v;
+            this->getConstantInt(*caseValue, &v);
             if (caseValues.find(v) != caseValues.end()) {
                 fErrors.error(caseValue->fOffset, "duplicate case value");
             }
@@ -517,8 +516,7 @@
     return std::unique_ptr<Statement>(new DiscardStatement(d.fOffset));
 }
 
-std::unique_ptr<Block> IRGenerator::applyInvocationIDWorkaround(std::unique_ptr<Block> main,
-        std::vector<std::unique_ptr<ProgramElement>>* out) {
+std::unique_ptr<Block> IRGenerator::applyInvocationIDWorkaround(std::unique_ptr<Block> main) {
     Layout invokeLayout;
     Modifiers invokeModifiers(invokeLayout, Modifiers::kHasSideEffects_Flag);
     FunctionDeclaration* invokeDecl = new FunctionDeclaration(-1,
@@ -526,9 +524,8 @@
                                                               "_invoke",
                                                               std::vector<const Variable*>(),
                                                               *fContext.fVoid_Type);
-    out->push_back(std::unique_ptr<ProgramElement>(new FunctionDefinition(-1,
-                                                                          *invokeDecl,
-                                                                          std::move(main))));
+    fProgramElements->push_back(std::unique_ptr<ProgramElement>(
+                                         new FunctionDefinition(-1, *invokeDecl, std::move(main))));
     fSymbolTable->add(invokeDecl->fName, std::unique_ptr<FunctionDeclaration>(invokeDecl));
 
     std::vector<std::unique_ptr<VarDeclaration>> variables;
@@ -577,8 +574,7 @@
     return std::unique_ptr<Block>(new Block(-1, std::move(children)));
 }
 
-void IRGenerator::convertFunction(const ASTFunction& f,
-                                  std::vector<std::unique_ptr<ProgramElement>>* out) {
+void IRGenerator::convertFunction(const ASTFunction& f) {
     const Type* returnType = this->convertType(*f.fReturnType);
     if (!returnType) {
         return;
@@ -690,13 +686,13 @@
             return;
         }
         if (needInvocationIDWorkaround) {
-            body = this->applyInvocationIDWorkaround(std::move(body), out);
+            body = this->applyInvocationIDWorkaround(std::move(body));
         }
         // conservatively assume all user-defined functions have side effects
         ((Modifiers&) decl->fModifiers).fFlags |= Modifiers::kHasSideEffects_Flag;
 
-        out->push_back(std::unique_ptr<FunctionDefinition>(
-                                      new FunctionDefinition(f.fOffset, *decl, std::move(body))));
+        fProgramElements->push_back(std::unique_ptr<FunctionDefinition>(
+                                        new FunctionDefinition(f.fOffset, *decl, std::move(body))));
     }
 }
 
@@ -789,6 +785,57 @@
                                                               fSymbolTable));
 }
 
+void IRGenerator::getConstantInt(const Expression& value, int64_t* out) {
+    switch (value.fKind) {
+        case Expression::kIntLiteral_Kind:
+            *out = ((const IntLiteral&) value).fValue;
+            break;
+        case Expression::kVariableReference_Kind: {
+            const Variable& var = ((VariableReference&) value).fVariable;
+            if ((var.fModifiers.fFlags & Modifiers::kConst_Flag) &&
+                var.fInitialValue) {
+                this->getConstantInt(*var.fInitialValue, out);
+            }
+            break;
+        }
+        default:
+            fErrors.error(value.fOffset, "expected a constant int");
+    }
+}
+
+void IRGenerator::convertEnum(const ASTEnum& e) {
+    std::vector<Variable*> variables;
+    int64_t currentValue = 0;
+    Layout layout;
+    ASTType enumType(e.fOffset, e.fTypeName, ASTType::kIdentifier_Kind, {});
+    const Type* type = this->convertType(enumType);
+    Modifiers modifiers(layout, Modifiers::kConst_Flag);
+    std::shared_ptr<SymbolTable> symbols(new SymbolTable(fSymbolTable, &fErrors));
+    fSymbolTable = symbols;
+    for (size_t i = 0; i < e.fNames.size(); i++) {
+        std::unique_ptr<Expression> value;
+        if (e.fValues[i]) {
+            value = this->convertExpression(*e.fValues[i]);
+            if (!value) {
+                fSymbolTable = symbols->fParent;
+                return;
+            }
+            this->getConstantInt(*value, &currentValue);
+        }
+        value = std::unique_ptr<Expression>(new IntLiteral(fContext, e.fOffset, currentValue));
+        ++currentValue;
+        auto var = std::unique_ptr<Variable>(new Variable(e.fOffset, modifiers, e.fNames[i],
+                                                          *type, Variable::kGlobal_Storage,
+                                                          value.get()));
+        variables.push_back(var.get());
+        symbols->add(e.fNames[i], std::move(var));
+        symbols->takeOwnership(value.release());
+    }
+    fProgramElements->push_back(std::unique_ptr<ProgramElement>(new Enum(e.fOffset, e.fTypeName,
+                                                                         symbols)));
+    fSymbolTable = symbols->fParent;
+}
+
 const Type* IRGenerator::convertType(const ASTType& type) {
     const Symbol* result = (*fSymbolTable)[type.fName];
     if (result && result->fKind == Symbol::kType_Kind) {
@@ -956,6 +1003,12 @@
             return right.canCoerceTo(left);
         case Token::EQEQ: // fall through
         case Token::NEQ:
+            if (left == right) {
+                *outLeftType = &left;
+                *outRightType = &right;
+                *outResultType = context.fBool_Type.get();
+                return true;
+            }
             isLogical = true;
             validMatrixOrVectorOp = true;
             break;
@@ -1808,6 +1861,24 @@
                                                    found->second.literal(fContext, offset)));
 }
 
+std::unique_ptr<Expression> IRGenerator::convertTypeField(int offset, const Type& type,
+                                                          StringFragment field) {
+    std::unique_ptr<Expression> result;
+    for (const auto& e : *fProgramElements) {
+        if (e->fKind == ProgramElement::kEnum_Kind && type.name() == ((Enum&) *e).fTypeName) {
+            std::shared_ptr<SymbolTable> old = fSymbolTable;
+            fSymbolTable = ((Enum&) *e).fSymbols;
+            result = convertIdentifier(ASTIdentifier(offset, field));
+            fSymbolTable = old;
+        }
+    }
+    if (!result) {
+        fErrors.error(offset, "type '" + type.fName + "' does not have a field named '" + field +
+                              "'");
+    }
+    return result;
+}
+
 std::unique_ptr<Expression> IRGenerator::convertSuffixExpression(
                                                             const ASTSuffixExpression& expression) {
     std::unique_ptr<Expression> base = this->convertExpression(*expression.fBase);
@@ -1845,21 +1916,22 @@
             return this->call(expression.fOffset, std::move(base), std::move(arguments));
         }
         case ASTSuffix::kField_Kind: {
+            StringFragment field = ((ASTFieldSuffix&) *expression.fSuffix).fField;
             if (base->fType == *fContext.fSkCaps_Type) {
-                return this->getCap(expression.fOffset,
-                                    ((ASTFieldSuffix&) *expression.fSuffix).fField);
+                return this->getCap(expression.fOffset, field);
             }
             if (base->fType == *fContext.fSkArgs_Type) {
-                return this->getArg(expression.fOffset,
-                                    ((ASTFieldSuffix&) *expression.fSuffix).fField);
+                return this->getArg(expression.fOffset, field);
+            }
+            if (base->fKind == Expression::kTypeReference_Kind) {
+                return this->convertTypeField(base->fOffset, ((TypeReference&) *base).fValue,
+                                              field);
             }
             switch (base->fType.kind()) {
                 case Type::kVector_Kind:
-                    return this->convertSwizzle(std::move(base),
-                                                ((ASTFieldSuffix&) *expression.fSuffix).fField);
+                    return this->convertSwizzle(std::move(base), field);
                 case Type::kStruct_Kind:
-                    return this->convertField(std::move(base),
-                                              ((ASTFieldSuffix&) *expression.fSuffix).fField);
+                    return this->convertField(std::move(base), field);
                 default:
                     fErrors.error(base->fOffset, "cannot swizzle value of type '" +
                                                  base->fType.description() + "'");
@@ -1952,6 +2024,7 @@
                                  size_t length,
                                  SymbolTable& types,
                                  std::vector<std::unique_ptr<ProgramElement>>* out) {
+    fProgramElements = out;
     Parser parser(text, length, types, fErrors);
     std::vector<std::unique_ptr<ASTDeclaration>> parsed = parser.file();
     if (fErrors.errorCount()) {
@@ -1965,19 +2038,23 @@
                                                                          (ASTVarDeclarations&) decl,
                                                                          Variable::kGlobal_Storage);
                 if (s) {
-                    out->push_back(std::move(s));
+                    fProgramElements->push_back(std::move(s));
                 }
                 break;
             }
+            case ASTDeclaration::kEnum_Kind: {
+                this->convertEnum((ASTEnum&) decl);
+                break;
+            }
             case ASTDeclaration::kFunction_Kind: {
-                this->convertFunction((ASTFunction&) decl, out);
+                this->convertFunction((ASTFunction&) decl);
                 break;
             }
             case ASTDeclaration::kModifiers_Kind: {
                 std::unique_ptr<ModifiersDeclaration> f = this->convertModifiersDeclaration(
                                                                    (ASTModifiersDeclaration&) decl);
                 if (f) {
-                    out->push_back(std::move(f));
+                    fProgramElements->push_back(std::move(f));
                 }
                 break;
             }
@@ -1985,21 +2062,21 @@
                 std::unique_ptr<InterfaceBlock> i = this->convertInterfaceBlock(
                                                                          (ASTInterfaceBlock&) decl);
                 if (i) {
-                    out->push_back(std::move(i));
+                    fProgramElements->push_back(std::move(i));
                 }
                 break;
             }
             case ASTDeclaration::kExtension_Kind: {
                 std::unique_ptr<Extension> e = this->convertExtension((ASTExtension&) decl);
                 if (e) {
-                    out->push_back(std::move(e));
+                    fProgramElements->push_back(std::move(e));
                 }
                 break;
             }
             case ASTDeclaration::kSection_Kind: {
                 std::unique_ptr<Section> s = this->convertSection((ASTSection&) decl);
                 if (s) {
-                    out->push_back(std::move(s));
+                    fProgramElements->push_back(std::move(s));
                 }
                 break;
             }
diff --git a/src/sksl/SkSLIRGenerator.h b/src/sksl/SkSLIRGenerator.h
index a1d23ee..1df9b65 100644
--- a/src/sksl/SkSLIRGenerator.h
+++ b/src/sksl/SkSLIRGenerator.h
@@ -16,6 +16,7 @@
 #include "ast/SkSLASTContinueStatement.h"
 #include "ast/SkSLASTDiscardStatement.h"
 #include "ast/SkSLASTDoStatement.h"
+#include "ast/SkSLASTEnum.h"
 #include "ast/SkSLASTExpression.h"
 #include "ast/SkSLASTExpressionStatement.h"
 #include "ast/SkSLASTExtension.h"
@@ -95,8 +96,7 @@
 
     std::unique_ptr<VarDeclarations> convertVarDeclarations(const ASTVarDeclarations& decl,
                                                             Variable::Storage storage);
-    void convertFunction(const ASTFunction& f,
-                         std::vector<std::unique_ptr<ProgramElement>>* out);
+    void convertFunction(const ASTFunction& f);
     std::unique_ptr<Statement> convertStatement(const ASTStatement& statement);
     std::unique_ptr<Expression> convertExpression(const ASTExpression& expression);
     std::unique_ptr<ModifiersDeclaration> convertModifiersDeclaration(
@@ -145,6 +145,8 @@
     std::unique_ptr<Expression> getCap(int offset, String name);
     std::unique_ptr<Expression> getArg(int offset, String name);
     std::unique_ptr<Expression> convertSuffixExpression(const ASTSuffixExpression& expression);
+    std::unique_ptr<Expression> convertTypeField(int offset, const Type& type,
+                                                 StringFragment field);
     std::unique_ptr<Expression> convertField(std::unique_ptr<Expression> base,
                                              StringFragment field);
     std::unique_ptr<Expression> convertSwizzle(std::unique_ptr<Expression> base,
@@ -152,13 +154,13 @@
     std::unique_ptr<Expression> convertTernaryExpression(const ASTTernaryExpression& expression);
     std::unique_ptr<Statement> convertVarDeclarationStatement(const ASTVarDeclarationStatement& s);
     std::unique_ptr<Statement> convertWhile(const ASTWhileStatement& w);
-    std::unique_ptr<Block> applyInvocationIDWorkaround(
-                                                 std::unique_ptr<Block> main,
-                                                 std::vector<std::unique_ptr<ProgramElement>>* out);
+    void convertEnum(const ASTEnum& e);
+    std::unique_ptr<Block> applyInvocationIDWorkaround(std::unique_ptr<Block> main);
 
     void fixRectSampling(std::vector<std::unique_ptr<Expression>>& arguments);
     void checkValid(const Expression& expr);
     void markWrittenTo(const Expression& expr, bool readWrite);
+    void getConstantInt(const Expression& value, int64_t* out);
 
     const FunctionDeclaration* fCurrentFunction;
     std::unordered_map<String, Program::Settings::Value> fCapsMap;
@@ -172,6 +174,7 @@
     int fTmpCount;
     ErrorReporter& fErrors;
     int fInvocations;
+    std::vector<std::unique_ptr<ProgramElement>>* fProgramElements;
 
     friend class AutoSymbolTable;
     friend class AutoLoopLevel;
diff --git a/src/sksl/SkSLLexer.cpp b/src/sksl/SkSLLexer.cpp
index ac9cb2b..44ebdca 100644
--- a/src/sksl/SkSLLexer.cpp
+++ b/src/sksl/SkSLLexer.cpp
@@ -18,84 +18,84 @@
         26, 26, 26, 27, 26, 6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
         6,  6,  6,  28, 3,  29, 30, 31, 3,  32, 33, 34, 35, 36, 37, 38, 39, 40, 6,  41, 42, 43,
         44, 45, 46, 6,  47, 48, 49, 50, 51, 52, 53, 54, 6,  55, 56, 57, 58};
-static int16_t transitions[59][281] = {
+static int16_t transitions[59][288] = {
         {
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 2, 3, 3, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 2, 3, 3, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 3, 3, 3, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 3, 3, 3, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 4, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 4, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 5, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 5, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 7, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 7, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
                 0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -111,72 +111,74 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 0,  0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
         },
         {
-                0, 11, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 11, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 13, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
+                0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  14, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0,  38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 17, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 17, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 18, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 18, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 19, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 35, 36, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 35, 36, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
                 0, 21, 0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 22, 0,  0,
@@ -190,20 +192,20 @@
                 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0,
                 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0,
                 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0,
-                0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
+                0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0,  0,  0,
         },
         {
-                0, 24, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 24, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
                 0, 25, 0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,
@@ -217,33 +219,35 @@
                 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,
                 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,
                 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,
-                0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
+                0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,
         },
         {
-                0, 29, 0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
-                0, 0,  0, 0,  0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0,
-                0, 0,  0, 41, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
-                0, 0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
-                0, 0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
-                0, 0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
-                0, 0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
-                0, 0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
-                0, 0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
-                0, 0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
-                0, 0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0,
+                0, 29, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 35, 35, 0, 38, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+                0, 41, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 34, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 38, 35, 37, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 38, 35, 37, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
                 0,  40, 0,  0,  0,  0,  0,  0,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -259,7 +263,7 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 0,  0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
         },
         {
                 0,  55, 0,  0,  0,  0,  0,  0,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -275,99 +279,103 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 0,  0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
         },
         {
-                0, 56, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 57, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 56, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 57, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 58, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 58, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 59, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 60, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 63, 0, 0, 0, 6, 0, 0, 0, 0, 0,  12,  0,  16,  15, 0,  0, 0,  0, 20, 0, 23, 0, 0,
-                0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 39, 35,  35, 0,   38, 0,  0, 0,  0, 0,  0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  62,  61, 0,   0,  64, 0, 66, 0, 68, 0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 83, 0,   85, 0,   0,  0,  0, 0,  0, 0,  0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,  0,   0,  0,  0, 0,  0, 0,  0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,  0,   0,  0,  0, 0,  0, 0,  0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,  0,   0,  0,  0, 0,  0, 0,  0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,  0,   0,  0,  0, 0,  0, 0,  0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,  0,   0,  0,  0, 0,  0, 0,  0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,  0,   0,  0,  0, 0,  0, 0,  0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,  0,   0,  0,  0, 0,  0, 0,  0, 0,  0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  276, 0,  278, 0,  0,  0,
+                0, 63, 0,  0, 0, 6, 0,   0, 0,   0, 0, 12, 0,  16, 15, 0,  0, 0,  0, 20, 0, 23, 0,
+                0, 0,  27, 0, 0, 0, 0,   0, 0,   0, 0, 39, 35, 35, 0,  38, 0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  62, 61, 0,  0, 64, 0, 66, 0, 68, 0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  83, 0,  85, 0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 0,   0, 0,   0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,  0, 0,  0,
+                0, 0,  0,  0, 0, 0, 283, 0, 285, 0, 0, 0,
         },
         {
-                0, 65, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
+                0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 67, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 69, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 69, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 70, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 70, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
                 0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -383,7 +391,7 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 0,  0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
         },
         {
                 0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -399,80 +407,81 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 0,  0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
         },
         {
-                0, 80, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 80, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 81, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 81, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0, 82, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 84, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 82, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 84, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,
         },
         {
-                0,  9,  0,  0,  0,  0,   0,  8,  8,  10,  10, 0,  0,  0,  0,   0,  0,  0,  0,
-                0,  0,  0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  35, 35, 0,
-                38, 0,  0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,
-                0,  0,  0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  0,  71, 71,  71, 71, 71, 71,
-                71, 71, 71, 71, 0,  0,   0,  0,  0,  0,   10, 10, 10, 10, 10,  10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,
-                10, 10, 10, 10, 10, 215, 10, 10, 10, 219, 10, 10, 10, 10, 224, 10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,
-                10, 10, 10, 10, 10, 10,  10, 10, 0,  0,   0,  0,  0,  0,  0,
+                0,  9,   0,  0,  0,  0,   0,  8,  8,  10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,   0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  35, 35, 0,  38, 0,
+                0,  0,   0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,   0,  0,  0,  0,   0,  0,  0,  0,  71,  71, 71, 71, 71, 71, 71, 71, 71, 71,
+                0,  0,   0,  0,  0,  0,   10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 222, 10, 10, 10, 226, 10, 10, 10, 10, 231, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 0,   0,  0,  0,  0,   0,  0,
         },
         {
-                0,   9,  0,   0,   0,  0,   0,   8,   8,   10, 10,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,   0,  0,   0,   0,  0,   0,   0,   0,   0,  0,   0,  0,  0,  0,  0,  35, 35, 0,
-                38,  0,  0,   0,   0,  0,   0,   0,   0,   0,  0,   0,  0,  0,  0,  54, 54, 0,  0,
-                0,   0,  0,   0,   0,  0,   0,   0,   0,   0,  0,   0,  0,  71, 71, 71, 71, 71, 71,
-                71,  71, 71,  71,  0,  0,   0,   0,   0,   0,  10,  10, 89, 10, 10, 10, 10, 10, 10,
-                10,  97, 10,  10,  10, 10,  10,  10,  10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
-                10,  10, 10,  118, 10, 10,  10,  10,  10,  10, 125, 10, 10, 10, 10, 10, 10, 10, 10,
-                134, 10, 10,  10,  10, 139, 10,  10,  10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
-                10,  10, 155, 10,  10, 10,  10,  10,  10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
-                10,  10, 10,  10,  10, 10,  10,  10,  10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
-                10,  10, 10,  10,  10, 10,  197, 10,  10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
-                10,  10, 10,  10,  10, 10,  10,  217, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
-                10,  10, 10,  10,  10, 10,  10,  10,  10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
-                10,  10, 10,  10,  10, 10,  10,  10,  256, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10,
-                10,  10, 10,  10,  10, 10,  10,  10,  0,   0,  0,   0,  0,  0,  0,
+                0,  9,   0,   0,  0,  0,   0,  8,   8,  10, 10,  0,  0,  0,   0,   0,  0,  0,
+                0,  0,   0,   0,  0,  0,   0,  0,   0,  0,  0,   0,  0,  0,   0,   0,  0,  35,
+                35, 0,   38,  0,  0,  0,   0,  0,   0,  0,  0,   0,  0,  0,   0,   0,  0,  54,
+                54, 0,   0,   0,  0,  0,   0,  0,   0,  0,  0,   0,  0,  0,   0,   0,  71, 71,
+                71, 71,  71,  71, 71, 71,  71, 71,  0,  0,  0,   0,  0,  0,   10,  10, 89, 10,
+                10, 10,  10,  10, 10, 10,  97, 10,  10, 10, 101, 10, 10, 10,  10,  10, 10, 10,
+                10, 10,  10,  10, 10, 10,  10, 10,  10, 10, 10,  10, 10, 122, 10,  10, 10, 10,
+                10, 10,  129, 10, 10, 10,  10, 10,  10, 10, 10,  10, 10, 10,  141, 10, 10, 10,
+                10, 146, 10,  10, 10, 10,  10, 10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 162,
+                10, 10,  10,  10, 10, 10,  10, 10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,
+                10, 10,  10,  10, 10, 10,  10, 10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,
+                10, 10,  10,  10, 10, 204, 10, 10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,
+                10, 10,  10,  10, 10, 10,  10, 224, 10, 10, 10,  10, 10, 10,  10,  10, 10, 10,
+                10, 10,  10,  10, 10, 10,  10, 10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,
+                10, 10,  10,  10, 10, 10,  10, 10,  10, 10, 263, 10, 10, 10,  10,  10, 10, 10,
+                10, 10,  10,  10, 10, 10,  10, 10,  10, 10, 10,  0,  0,  0,   0,   0,  0,  0,
         },
         {
                 0,  86, 0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -488,330 +497,340 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 0,  0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
         },
         {
-                0,   96, 0,  0,  0,  0,  0,   8,  8,  10,  10, 0,   0,  0,  0,  0,  0,   0,   0,
-                0,   0,  0,  0,  0,  0,  0,   0,  0,  0,   0,  0,   0,  0,  0,  0,  35,  35,  0,
-                38,  0,  0,  0,  0,  0,  0,   0,  0,  0,   0,  0,   0,  0,  0,  54, 54,  0,   0,
-                0,   0,  0,  0,  0,  0,  0,   0,  0,  0,   0,  0,   0,  71, 71, 71, 71,  71,  71,
-                71,  78, 71, 71, 0,  0,  0,   0,  0,  0,   10, 10,  10, 10, 10, 10, 10,  10,  10,
-                10,  10, 10, 10, 10, 10, 10,  10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10,
-                10,  10, 10, 10, 10, 10, 10,  10, 10, 124, 10, 10,  10, 10, 10, 10, 10,  10,  10,
-                10,  10, 10, 10, 10, 10, 10,  10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10,
-                10,  10, 10, 10, 10, 10, 10,  10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10,
-                10,  10, 10, 10, 10, 10, 178, 10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  189, 10,
-                10,  10, 10, 10, 10, 10, 10,  10, 10, 10,  10, 10,  10, 10, 10, 10, 207, 10,  10,
-                10,  10, 10, 10, 10, 10, 10,  10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10,
-                229, 10, 10, 10, 10, 10, 235, 10, 10, 10,  10, 240, 10, 10, 10, 10, 10,  10,  10,
-                10,  10, 10, 10, 10, 10, 10,  10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10,
-                10,  10, 10, 10, 10, 10, 10,  10, 0,  0,   0,  0,   0,  0,  0,
+                0,  96,  0,  0,  0,   0,  0,  8,   8,  10, 10, 0,  0,   0,  0,  0,   0,  0,
+                0,  0,   0,  0,  0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,   0,  35,
+                35, 0,   38, 0,  0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,   0,  54,
+                54, 0,   0,  0,  0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,   71, 71,
+                71, 71,  71, 71, 71,  78, 71, 71,  0,  0,  0,  0,  0,   0,  10, 10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10,  10, 10,
+                10, 128, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10,  10, 10,
+                10, 10,  10, 10, 185, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 196, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 214, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10,  10, 10,
+                10, 236, 10, 10, 10,  10, 10, 242, 10, 10, 10, 10, 247, 10, 10, 10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10, 0,  0,   0,  0,  0,   0,  0,
         },
         {
-                0,  115, 0,  0,  0,  0,  0,  8,   8,  10, 10, 0,  0,   0,  0,  0,  0,  0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  35, 35, 0,
-                38, 0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  54, 54, 0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,   71, 71, 71, 71, 71, 71,
-                71, 71,  71, 71, 0,  0,  0,  0,   0,  0,  10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 127, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 165, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 198, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 222, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10,  0,  0,  0,  0,  0,   0,  0,
+                0,  119, 0,  0,  0,   0,  0,  8,  8,   10, 10,  0,   0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,   0,   0,  0,  0,  35, 35, 0,  38, 0,
+                0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,   0,   0,  54, 54, 0,  0,  0,  0,  0,
+                0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  71,  71,  71, 71, 71, 71, 71, 71, 71, 71,
+                0,  0,   0,  0,  0,   0,  10, 10, 10,  10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 131, 10,  10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10,  172, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 205, 10, 10, 10, 10,  10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10, 229, 10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,
+                10, 0,   0,  0,  0,   0,  0,  0,
         },
         {
-                0,  129, 0,  0,  0,  0,   0,   8,   8,   10, 10,  0,   0,   0,   0,   0,   0,   0,
-                0,  0,   0,  0,  0,  0,   0,   0,   0,   0,  0,   0,   31,  0,   0,   0,   0,   35,
-                35, 0,   38, 0,  50, 46,  43,  0,   0,   0,  0,   0,   0,   50,  0,   0,   0,   54,
-                54, 50,  0,  0,  0,  0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   71,  71,
-                71, 71,  71, 71, 71, 71,  71,  71,  0,   0,  0,   0,   0,   0,   10,  88,  10,  10,
-                10, 10,  10, 94, 10, 10,  10,  10,  99,  10, 10,  102, 10,  104, 10,  10,  10,  10,
-                10, 10,  10, 10, 10, 114, 10,  116, 10,  10, 10,  10,  10,  10,  10,  10,  10,  10,
-                10, 10,  10, 10, 10, 132, 10,  10,  10,  10, 137, 10,  10,  10,  10,  10,  10,  10,
-                10, 10,  10, 10, 10, 10,  10,  10,  10,  10, 10,  10,  10,  10,  10,  10,  10,  10,
-                10, 164, 10, 10, 10, 10,  10,  10,  10,  10, 173, 10,  10,  10,  177, 10,  10,  10,
-                10, 182, 10, 10, 10, 10,  10,  188, 10,  10, 10,  10,  10,  10,  10,  196, 10,  10,
-                10, 10,  10, 10, 10, 10,  10,  10,  10,  10, 10,  10,  10,  10,  10,  10,  10,  10,
-                10, 10,  10, 10, 10, 10,  223, 10,  225, 10, 10,  228, 10,  10,  10,  10,  10,  10,
-                10, 10,  10, 10, 10, 10,  10,  10,  10,  10, 245, 10,  10,  10,  10,  10,  10,  10,
-                10, 10,  10, 10, 10, 10,  10,  260, 10,  10, 10,  10,  265, 10,  10,  10,  269, 10,
-                10, 10,  10, 10, 0,  0,   0,   0,   0,   0,  0,
+                0,   133, 0,  0,   0,   0,   0,  8,  8,   10,  10, 0,   0,  0,   0,   0,   0,  0,
+                0,   0,   0,  0,   0,   0,   0,  0,  0,   0,   0,  0,   31, 0,   0,   0,   0,  35,
+                35,  0,   38, 0,   50,  46,  43, 0,  0,   0,   0,  0,   0,  50,  0,   0,   0,  54,
+                54,  50,  0,  0,   0,   0,   0,  0,  0,   0,   0,  0,   0,  0,   0,   0,   71, 71,
+                71,  71,  71, 71,  71,  71,  71, 71, 0,   0,   0,  0,   0,  0,   10,  88,  10, 10,
+                10,  10,  10, 94,  10,  10,  10, 10, 99,  10,  10, 10,  10, 10,  10,  106, 10, 108,
+                10,  10,  10, 10,  10,  10,  10, 10, 10,  118, 10, 120, 10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10,  10,  10,  10, 10, 10,  136, 10, 10,  10, 10,  10,  10,  10, 144,
+                10,  10,  10, 10,  10,  10,  10, 10, 10,  10,  10, 10,  10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10,  10,  10,  10, 10, 171, 10,  10, 10,  10, 10,  10,  10,  10, 180,
+                10,  10,  10, 184, 10,  10,  10, 10, 189, 10,  10, 10,  10, 10,  195, 10,  10, 10,
+                10,  10,  10, 10,  203, 10,  10, 10, 10,  10,  10, 10,  10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10,  10,  10,  10, 10, 10,  10,  10, 10,  10, 230, 10,  232, 10, 10,
+                235, 10,  10, 10,  10,  10,  10, 10, 10,  10,  10, 10,  10, 10,  10,  10,  10, 252,
+                10,  10,  10, 10,  10,  10,  10, 10, 10,  10,  10, 10,  10, 10,  267, 10,  10, 10,
+                10,  272, 10, 10,  10,  276, 10, 10, 10,  10,  10, 0,   0,  0,   0,   0,   0,  0,
         },
         {
-                0,  133, 0,   0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,   0,   0,   0,
-                0,  0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   35,  35,  0,
-                38, 0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  54,  54,  0,   0,
-                0,  0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  71, 71, 73,  71,  71,  71,
-                71, 71,  71,  71, 0,  0,  0,  0,  0,  0,  10, 10, 10, 10, 10, 92,  93,  10,  10,
-                10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10,
-                10, 10,  117, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10,
-                10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 149, 10,  10,  10,
-                10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10,
-                10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10,
-                10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10,
-                10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  226, 227, 10,
-                10, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10,
-                10, 249, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10,
-                10, 10,  10,  10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
+                0,   140, 0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,   0,   0,  0,   0,  0,  0,  0,
+                0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,   0,  35,  35, 0,  38, 0,
+                0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   54,  54, 0,   0,  0,  0,  0,
+                0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  71, 71, 73,  71,  71, 71,  71, 71, 71, 71,
+                0,   0,   0,  0,  0,  0,  10, 10, 10, 10, 10, 92, 93,  10,  10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 10,  10, 10, 10, 10,
+                121, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 156, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 233, 234, 10, 10,  10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 256, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,  10, 10,  10, 10, 10, 10,
+                10,  0,   0,  0,  0,  0,  0,  0,
         },
         {
-                0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,   0,  0,
-                0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  35, 35, 0,  38, 0,   0,  0,
-                0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,
-                0,  0,  0,  0,  0,  0,  0,  71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0,  0,   0,  0,
-                0,  0,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 145, 10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,
-                10, 0,  0,  0,  0,  0,  0,  0,
+                0,  9,  0,  0,  0,   0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  35, 35, 0,  38, 0,  0,  0,
+                0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,  0,  0,   0,  0,  71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0,  0,  0,  0,
+                0,  0,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 152, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10,  10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
         },
         {
-                0,  143, 0,  0,  0,  0,   0,   8,  8,  10, 10, 0,  0,   0,  0,   0,  0,  0,  0,
-                0,  0,   0,  0,  0,  0,   0,   0,  0,  0,  0,  0,  0,   0,  0,   0,  35, 35, 0,
-                38, 0,   0,  0,  0,  0,   0,   0,  0,  0,  0,  0,  0,   0,  0,   0,  0,  0,  0,
-                0,  0,   0,  0,  0,  0,   0,   0,  0,  0,  0,  0,  0,   71, 71,  71, 71, 71, 71,
-                71, 71,  79, 71, 0,  0,   0,   0,  0,  0,  10, 10, 10,  10, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 101, 10,  10, 10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10,  10,  10, 10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10,  10,  10, 10, 10, 10, 10, 146, 10, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10,  10,  10, 10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10,  10,  10, 10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10,  10,  10, 10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10,  216, 10, 10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10,  10,  10, 10, 10, 10, 10, 241, 10, 10,  10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10,  10,  10, 10, 10, 10, 10, 10,  10, 262, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10,  10,  10, 0,  0,  0,  0,  0,   0,  0,
+                0,  150, 0,  0,  0,  0,  0,   8,  8,   10, 10, 0,  0,  0,   0,   0,  0,   0,
+                0,  0,   0,  0,  0,  0,  0,   0,  0,   0,  0,  0,  0,  0,   0,   0,  0,   35,
+                35, 0,   38, 0,  0,  0,  0,   0,  0,   0,  0,  0,  0,  0,   0,   0,  0,   0,
+                0,  0,   0,  0,  0,  0,  0,   0,  0,   0,  0,  0,  0,  0,   0,   0,  71,  71,
+                71, 71,  71, 71, 71, 71, 79,  71, 0,   0,  0,  0,  0,  0,   10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  105, 10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10, 153, 10, 10, 10, 10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 223, 10, 10,  10, 10, 10, 10, 10,  10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10, 248, 10,  10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 10, 10, 10,  10,  10, 269, 10,
+                10, 10,  10, 10, 10, 10, 10,  10, 10,  10, 10, 0,  0,  0,   0,   0,  0,   0,
         },
         {
-                0,   148, 0,  0,  0,  0,  0,  8,  8,   10,  10,  0,   0,  0,   0,  0,   0,  0,  0,
-                0,   0,   0,  0,  0,  0,  0,  0,  0,   0,   0,   0,   0,  0,   0,  0,   35, 35, 0,
-                38,  0,   0,  0,  0,  0,  0,  0,  0,   0,   0,   0,   0,  0,   0,  0,   0,  0,  0,
-                0,   0,   0,  0,  0,  0,  0,  0,  0,   0,   0,   0,   0,  72,  71, 71,  71, 71, 76,
-                71,  71,  71, 71, 0,  0,  0,  0,  0,   0,   10,  10,  10, 10,  10, 10,  10, 10, 10,
-                10,  10,  10, 10, 10, 10, 10, 10, 10,  10,  10,  10,  10, 10,  10, 111, 10, 10, 10,
-                10,  122, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10,  10, 10,  10, 10,  10, 10, 10,
-                10,  10,  10, 10, 10, 10, 10, 10, 10,  10,  144, 10,  10, 10,  10, 10,  10, 10, 10,
-                10,  10,  10, 10, 10, 10, 10, 10, 10,  10,  10,  10,  10, 166, 10, 10,  10, 10, 10,
-                10,  10,  10, 10, 10, 10, 10, 10, 180, 10,  10,  10,  10, 10,  10, 10,  10, 10, 190,
-                10,  192, 10, 10, 10, 10, 10, 10, 10,  10,  10,  10,  10, 10,  10, 206, 10, 10, 10,
-                10,  10,  10, 10, 10, 10, 10, 10, 10,  10,  10,  221, 10, 10,  10, 10,  10, 10, 10,
-                10,  10,  10, 10, 10, 10, 10, 10, 10,  238, 10,  10,  10, 10,  10, 10,  10, 10, 10,
-                248, 10,  10, 10, 10, 10, 10, 10, 10,  10,  258, 10,  10, 10,  10, 263, 10, 10, 10,
-                267, 10,  10, 10, 10, 10, 10, 10, 0,   0,   0,   0,   0,  0,   0,
+                0,   155, 0,   0,   0,  0,  0,   8,  8,  10, 10,  0,   0,   0,  0,   0,  0,   0,
+                0,   0,   0,   0,   0,  0,  0,   0,  0,  0,  0,   0,   0,   0,  0,   0,  0,   35,
+                35,  0,   38,  0,   0,  0,  0,   0,  0,  0,  0,   0,   0,   0,  0,   0,  0,   0,
+                0,   0,   0,   0,   0,  0,  0,   0,  0,  0,  0,   0,   0,   0,  0,   0,  72,  71,
+                71,  71,  71,  76,  71, 71, 71,  71, 0,  0,  0,   0,   0,   0,  10,  10, 10,  10,
+                10,  10,  10,  10,  10, 10, 10,  10, 10, 10, 10,  10,  10,  10, 10,  10, 10,  10,
+                10,  10,  10,  10,  10, 10, 115, 10, 10, 10, 10,  126, 10,  10, 10,  10, 10,  10,
+                10,  10,  10,  10,  10, 10, 10,  10, 10, 10, 10,  10,  10,  10, 10,  10, 10,  10,
+                10,  10,  10,  10,  10, 10, 151, 10, 10, 10, 10,  10,  10,  10, 10,  10, 10,  10,
+                10,  10,  10,  10,  10, 10, 10,  10, 10, 10, 173, 10,  10,  10, 10,  10, 10,  10,
+                10,  10,  10,  10,  10, 10, 187, 10, 10, 10, 10,  10,  10,  10, 10,  10, 197, 10,
+                199, 10,  10,  10,  10, 10, 10,  10, 10, 10, 10,  10,  10,  10, 213, 10, 10,  10,
+                10,  10,  10,  10,  10, 10, 10,  10, 10, 10, 10,  228, 10,  10, 10,  10, 10,  10,
+                10,  10,  10,  10,  10, 10, 10,  10, 10, 10, 245, 10,  10,  10, 10,  10, 10,  10,
+                10,  10,  255, 10,  10, 10, 10,  10, 10, 10, 10,  10,  265, 10, 10,  10, 10,  270,
+                10,  10,  10,  274, 10, 10, 10,  10, 10, 10, 10,  0,   0,   0,  0,   0,  0,   0,
         },
         {
-                0,  9,  0,  0,   0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  35, 35, 0,  38, 0,  0,  0,
-                0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,   0,  0,  0,  71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0,  0,  0,  0,
-                0,  0,  10, 10,  10, 90, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 214, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 0,  0,  0,   0,  0,  0,  0,
+                0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  35, 35, 0,  38, 0,  0,  0,
+                0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,  0,  0,  0,  0,  71, 71, 71, 71,  71, 71, 71, 71, 71, 71, 0,  0,  0,  0,
+                0,  0,  10, 10, 10, 90, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 221, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,   0,  0,  0,  0,
         },
         {
-                0,   154, 0,  0,  0,  0,   0,  8,   8,  10, 10,  0,   0,  0,  0,  0,   0,   0,  0,
-                0,   0,   0,  0,  0,  0,   0,  0,   0,  0,  0,   0,   0,  0,  0,  0,   35,  35, 0,
-                38,  0,   0,  0,  0,  0,   0,  0,   0,  0,  0,   0,   0,  0,  0,  0,   0,   0,  0,
-                0,   0,   0,  0,  0,  0,   0,  0,   0,  0,  0,   0,   0,  71, 71, 71,  71,  71, 71,
-                71,  71,  71, 71, 0,  0,   0,  0,   0,  0,  10,  10,  10, 10, 10, 10,  10,  10, 10,
-                10,  10,  10, 10, 10, 10,  10, 10,  10, 10, 10,  10,  10, 10, 10, 10,  10,  10, 10,
-                10,  10,  10, 10, 10, 120, 10, 10,  10, 10, 10,  10,  10, 10, 10, 130, 10,  10, 10,
-                138, 135, 10, 10, 10, 10,  10, 10,  10, 10, 10,  10,  10, 10, 10, 10,  10,  10, 10,
-                10,  10,  10, 10, 10, 10,  10, 10,  10, 10, 10,  10,  10, 10, 10, 10,  10,  10, 10,
-                10,  10,  10, 10, 10, 10,  10, 10,  10, 10, 10,  10,  10, 10, 10, 10,  10,  10, 10,
-                10,  10,  10, 10, 10, 10,  10, 10,  10, 10, 201, 10,  10, 10, 10, 10,  10,  10, 10,
-                10,  10,  10, 10, 10, 10,  10, 10,  10, 10, 10,  10,  10, 10, 10, 10,  10,  10, 10,
-                10,  10,  10, 10, 10, 10,  10, 10,  10, 10, 10,  10,  10, 10, 10, 10,  10,  10, 10,
-                10,  10,  10, 10, 10, 10,  10, 255, 10, 10, 10,  259, 10, 10, 10, 10,  264, 10, 10,
-                10,  10,  10, 10, 10, 272, 10, 10,  0,  0,  0,   0,   0,  0,  0,
+                0,   161, 0,  0,  0,  0,  0,   8,   8,   10,  10, 0,  0,  0,   0,   0,   0,  0,
+                0,   0,   0,  0,  0,  0,  0,   0,   0,   0,   0,  0,  0,  0,   0,   0,   0,  35,
+                35,  0,   38, 0,  0,  0,  0,   0,   0,   0,   0,  0,  0,  0,   0,   0,   0,  0,
+                0,   0,   0,  0,  0,  0,  0,   0,   0,   0,   0,  0,  0,  0,   0,   0,   71, 71,
+                71,  71,  71, 71, 71, 71, 71,  71,  0,   0,   0,  0,  0,  0,   10,  10,  10, 10,
+                10,  10,  10, 10, 10, 10, 100, 10,  10,  10,  10, 10, 10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10, 10, 10, 10,  10,  10,  10,  10, 10, 10, 10,  10,  124, 10, 10,
+                10,  10,  10, 10, 10, 10, 10,  134, 10,  10,  10, 10, 10, 10,  145, 142, 10, 10,
+                10,  10,  10, 10, 10, 10, 10,  10,  10,  10,  10, 10, 10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10, 10, 10, 10,  10,  10,  10,  10, 10, 10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10, 10, 10, 10,  10,  10,  10,  10, 10, 10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10, 10, 10, 10,  10,  10,  208, 10, 10, 10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10, 10, 10, 10,  10,  10,  10,  10, 10, 10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10, 10, 10, 10,  10,  10,  10,  10, 10, 10, 10,  10,  10,  10, 10,
+                10,  10,  10, 10, 10, 10, 10,  10,  10,  262, 10, 10, 10, 266, 10,  10,  10, 10,
+                271, 10,  10, 10, 10, 10, 10,  10,  279, 10,  10, 0,  0,  0,   0,   0,   0,  0,
         },
         {
-                0,  163, 0,  0,  0,   0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,   0,  0,  0,
-                0,  0,   0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   35, 35, 0,
-                38, 0,   0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,
-                0,  0,   0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  71, 71, 71,  71, 71, 71,
-                71, 71,  71, 71, 0,   0,  0,  0,  0,  0,  10, 10, 10, 10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 168, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10, 252, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
+                0,  170, 0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,   0,  0,  0,  0,   0,
+                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   35, 35, 0,  38,  0,
+                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,   0,
+                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  71, 71, 71, 71, 71,  71, 71, 71, 71,  71,
+                0,  0,   0,  0,  0,  0,  10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 139, 10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 175, 10, 10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 259, 10,
+                10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10,
+                10, 0,   0,  0,  0,  0,  0,  0,
         },
         {
-                0,  170, 0,   0,   0,   0,   0,  8,  8,  10,  10, 0,  0,  0,  0,  0,   0,   0,  0,
-                0,  0,   0,   0,   0,   0,   0,  0,  0,  0,   0,  0,  0,  0,  0,  0,   35,  35, 0,
-                38, 0,   0,   0,   0,   0,   0,  0,  0,  0,   0,  0,  0,  0,  0,  0,   0,   0,  0,
-                0,  0,   0,   0,   0,   0,   0,  0,  0,  0,   0,  0,  0,  71, 71, 71,  71,  71, 71,
-                71, 71,  71,  71,  0,   0,   0,  0,  0,  0,   10, 10, 10, 10, 10, 10,  10,  10, 10,
-                10, 10,  10,  10,  10,  107, 10, 10, 10, 105, 10, 10, 10, 10, 10, 10,  112, 10, 10,
-                10, 10,  10,  10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 10,
-                10, 10,  10,  10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 150, 10,  10, 10,
-                10, 10,  10,  10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 10,
-                10, 10,  10,  10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 10,
-                10, 10,  10,  194, 10,  10,  10, 10, 10, 200, 10, 10, 10, 10, 10, 10,  10,  10, 10,
-                10, 10,  212, 10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 10,
-                10, 10,  10,  10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 247,
-                10, 10,  10,  10,  10,  10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10,  10,  10, 10,
-                10, 10,  10,  10,  271, 10,  10, 10, 0,  0,   0,  0,  0,  0,  0,
+                0,   177, 0,   0,  0,  0,  0,  8,   8,   10, 10, 0,   0,  0,  0,   0,  0,  0,
+                0,   0,   0,   0,  0,  0,  0,  0,   0,   0,  0,  0,   0,  0,  0,   0,  0,  35,
+                35,  0,   38,  0,  0,  0,  0,  0,   0,   0,  0,  0,   0,  0,  0,   0,  0,  0,
+                0,   0,   0,   0,  0,  0,  0,  0,   0,   0,  0,  0,   0,  0,  0,   0,  71, 71,
+                71,  71,  71,  71, 71, 71, 71, 71,  0,   0,  0,  0,   0,  0,  10,  10, 10, 10,
+                10,  10,  10,  10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 111, 10, 10, 10,
+                109, 10,  10,  10, 10, 10, 10, 116, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10,
+                10,  10,  10,  10, 10, 10, 10, 137, 10,  10, 10, 10,  10, 10, 10,  10, 10, 10,
+                10,  10,  10,  10, 10, 10, 10, 10,  10,  10, 10, 157, 10, 10, 10,  10, 10, 10,
+                10,  10,  10,  10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10, 10, 10,
+                10,  10,  10,  10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10, 10, 10,
+                10,  10,  201, 10, 10, 10, 10, 10,  207, 10, 10, 10,  10, 10, 10,  10, 10, 10,
+                10,  10,  219, 10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10, 10, 10,
+                10,  10,  10,  10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10, 10, 10,
+                10,  254, 10,  10, 10, 10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10, 10, 10,
+                10,  10,  10,  10, 10, 10, 10, 278, 10,  10, 10, 0,   0,  0,  0,   0,  0,  0,
         },
         {
-                0,   183, 0,   0,   0,   0,  0,   8,  8,   10, 10, 0,  0,  0,  0,  0,  0,  0,   0,
-                0,   0,   0,   0,   0,   0,  0,   0,  0,   0,  0,  0,  0,  0,  0,  0,  35, 35,  0,
-                38,  0,   0,   0,   0,   0,  0,   0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,   0,
-                0,   0,   0,   0,   0,   0,  0,   0,  0,   0,  0,  0,  0,  71, 71, 71, 71, 71,  71,
-                71,  71,  71,  71,  0,   0,  0,   0,  0,   0,  10, 10, 10, 10, 10, 10, 10, 10,  10,
-                10,  100, 10,  10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,  10,
-                10,  128, 10,  10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,  10,
-                141, 10,  10,  10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 151, 10,
-                10,  10,  160, 10,  157, 10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,  171,
-                10,  10,  10,  10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,  10,
-                10,  10,  193, 10,  10,  10, 10,  10, 199, 10, 10, 10, 10, 10, 10, 10, 10, 10,  10,
-                10,  10,  10,  10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,  10,
-                10,  10,  10,  10,  10,  10, 10,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,  10,
-                10,  10,  250, 10,  10,  10, 254, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,  10,
-                10,  10,  10,  270, 10,  10, 10,  10, 0,   0,  0,  0,  0,  0,  0,
+                0,  190, 0,  0,  0,   0,  0,   8,   8,   10, 10, 0,   0,  0,   0,   0,   0,  0,
+                0,  0,   0,  0,  0,   0,  0,   0,   0,   0,  0,  0,   0,  0,   0,   0,   0,  35,
+                35, 0,   38, 0,  0,   0,  0,   0,   0,   0,  0,  0,   0,  0,   0,   0,   0,  0,
+                0,  0,   0,  0,  0,   0,  0,   0,   0,   0,  0,  0,   0,  0,   0,   0,   71, 71,
+                71, 71,  71, 71, 71,  71, 71,  71,  0,   0,  0,  0,   0,  0,   10,  10,  10, 10,
+                10, 10,  10, 10, 10,  10, 104, 10,  10,  10, 10, 10,  10, 10,  10,  10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 132, 10, 10,  10,  10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10,  10, 10,  148, 10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10,  10, 158, 10,  10,  10, 167,
+                10, 164, 10, 10, 10,  10, 10,  10,  10,  10, 10, 10,  10, 10,  10,  178, 10, 10,
+                10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10,  10, 10,  10,  10,  10, 10,
+                10, 200, 10, 10, 10,  10, 10,  206, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10,  10, 10,  10,  10,  10, 10,
+                10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10,  10, 10,  10,  10,  10, 10,
+                10, 10,  10, 10, 257, 10, 10,  10,  261, 10, 10, 10,  10, 10,  10,  10,  10, 10,
+                10, 10,  10, 10, 10,  10, 277, 10,  10,  10, 10, 0,   0,  0,   0,   0,   0,  0,
         },
         {
-                0,   186, 0,  0,  0,   0,  0,  8,  8,  10,  10, 0,  0,  0,   0,  0,  0,   0,  0,
-                0,   0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  35,  35, 0,
-                38,  0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,   0,  0,  0,   0,  0,
-                0,   0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  71,  71, 71, 71,  71, 71,
-                71,  71,  71, 71, 0,   0,  0,  0,  0,  0,   10, 10, 10, 10,  10, 10, 10,  10, 10,
-                10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,
-                10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,
-                10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 147, 10, 10, 10,  10, 10,
-                10,  10,  10, 10, 10,  10, 10, 10, 10, 162, 10, 10, 10, 10,  10, 10, 169, 10, 10,
-                172, 10,  10, 10, 176, 10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,
-                10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,
-                10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,
-                10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,
-                10,  10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10, 10,
-                10,  10,  10, 10, 10,  10, 10, 10, 0,  0,   0,  0,  0,  0,   0,
+                0,  193, 0,   0,  0,  0,  0,   8,  8,  10,  10, 0,  0,  0,   0,  0,  0,   0,
+                0,  0,   0,   0,  0,  0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,  0,   35,
+                35, 0,   38,  0,  0,  0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,  0,   0,
+                0,  0,   0,   0,  0,  0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,  71,  71,
+                71, 71,  71,  71, 71, 71, 71,  71, 0,  0,   0,  0,  0,  0,   10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 10,  10, 10, 154, 10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 169, 10, 10, 10,  10, 10, 10, 176, 10, 10, 179, 10,
+                10, 10,  183, 10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10,  10,
+                10, 10,  10,  10, 10, 10, 10,  10, 10, 10,  10, 0,  0,  0,   0,  0,  0,   0,
         },
         {
-                0,  195, 0,   0,   0,   0,  0,  8,   8,   10, 10, 0,   0,  0,  0,   0,   0,  0,  0,
-                0,  0,   0,   0,   0,   0,  0,  0,   0,   0,  0,  0,   0,  0,  0,   0,   35, 35, 0,
-                38, 0,   0,   0,   0,   0,  0,  0,   0,   0,  0,  0,   0,  0,  0,   0,   0,  0,  0,
-                0,  0,   0,   0,   0,   0,  0,  0,   0,   0,  0,  0,   0,  71, 71,  71,  71, 71, 71,
-                71, 71,  71,  71,  0,   0,  0,  0,   0,   0,  87, 10,  10, 10, 10,  10,  10, 10, 95,
-                10, 10,  10,  10,  10,  10, 10, 103, 10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,
-                10, 10,  10,  10,  10,  10, 10, 10,  10,  10, 10, 126, 10, 10, 10,  10,  10, 10, 10,
-                10, 10,  10,  10,  10,  10, 10, 10,  142, 10, 10, 10,  10, 10, 10,  10,  10, 10, 10,
-                10, 10,  10,  10,  10,  10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,
-                10, 10,  174, 10,  10,  10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  187, 10, 10, 10,
-                10, 10,  10,  10,  10,  10, 10, 10,  10,  10, 10, 10,  10, 10, 205, 10,  10, 10, 10,
-                10, 211, 10,  10,  10,  10, 10, 10,  10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,
-                10, 10,  10,  10,  233, 10, 10, 10,  10,  10, 10, 10,  10, 10, 243, 10,  10, 10, 10,
-                10, 10,  10,  251, 10,  10, 10, 10,  10,  10, 10, 10,  10, 10, 266, 10,  10, 10, 10,
-                10, 10,  10,  10,  10,  10, 10, 10,  0,   0,  0,  0,   0,  0,  0,
+                0,   202, 0,  0,   0,   0,   0,  8,  8,  10, 10, 0,  0,  0,   0,  0,   0,   0,
+                0,   0,   0,  0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,   0,  0,   0,   35,
+                35,  0,   38, 0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,   0,  0,   0,   0,
+                0,   0,   0,  0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,   0,  0,   71,  71,
+                71,  71,  71, 71,  71,  71,  71, 71, 0,  0,  0,  0,  0,  0,   87, 10,  10,  10,
+                10,  10,  10, 10,  95,  10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  107, 10,
+                10,  10,  10, 10,  10,  10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10,
+                10,  10,  10, 130, 10,  10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10,
+                10,  10,  10, 10,  149, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10,
+                10,  10,  10, 10,  10,  10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10,
+                181, 10,  10, 10,  10,  10,  10, 10, 10, 10, 10, 10, 10, 194, 10, 10,  10,  10,
+                10,  10,  10, 10,  10,  10,  10, 10, 10, 10, 10, 10, 10, 212, 10, 10,  10,  10,
+                10,  218, 10, 10,  10,  10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10,
+                10,  10,  10, 10,  10,  240, 10, 10, 10, 10, 10, 10, 10, 10,  10, 250, 10,  10,
+                10,  10,  10, 10,  10,  258, 10, 10, 10, 10, 10, 10, 10, 10,  10, 10,  273, 10,
+                10,  10,  10, 10,  10,  10,  10, 10, 10, 10, 10, 0,  0,  0,   0,  0,   0,   0,
         },
         {
-                0,   213, 0,   0,   0,  0,  0,   8,  8,   10, 10,  0,  0,   0,  0,  0,  0,   0,  0,
-                0,   0,   0,   0,   0,  0,  0,   0,  0,   0,  0,   0,  0,   0,  0,  0,  35,  35, 0,
-                38,  0,   0,   0,   0,  0,  0,   0,  0,   0,  0,   0,  0,   0,  0,  0,  0,   0,  0,
-                0,   0,   0,   0,   0,  0,  0,   0,  0,   0,  0,   0,  0,   74, 71, 71, 71,  71, 71,
-                71,  71,  71,  71,  0,  0,  0,   0,  0,   0,  10,  10, 10,  10, 10, 10, 10,  10, 10,
-                10,  10,  98,  10,  10, 10, 10,  10, 10,  10, 10,  10, 108, 10, 10, 10, 10,  10, 10,
-                10,  10,  10,  10,  10, 10, 10,  10, 123, 10, 10,  10, 10,  10, 10, 10, 131, 10, 10,
-                10,  10,  136, 10,  10, 10, 10,  10, 10,  10, 10,  10, 10,  10, 10, 10, 10,  10, 10,
-                10,  10,  10,  10,  10, 10, 10,  10, 10,  10, 10,  10, 10,  10, 10, 10, 10,  10, 10,
-                10,  10,  10,  175, 10, 10, 10,  10, 10,  10, 10,  10, 10,  10, 10, 10, 10,  10, 10,
-                191, 10,  10,  10,  10, 10, 203, 10, 10,  10, 10,  10, 10,  10, 10, 10, 10,  10, 10,
-                10,  10,  10,  10,  10, 10, 10,  10, 218, 10, 220, 10, 10,  10, 10, 10, 10,  10, 10,
-                10,  10,  231, 10,  10, 10, 10,  10, 10,  10, 10,  10, 10,  10, 10, 10, 10,  10, 10,
-                10,  10,  10,  10,  10, 10, 10,  10, 10,  10, 10,  10, 10,  10, 10, 10, 10,  10, 10,
-                10,  10,  10,  10,  10, 10, 10,  10, 0,   0,  0,   0,  0,   0,  0,
+                0,   220, 0,  0,   0,  0,   0,  8,  8,   10, 10,  0,   0,   0,  0,  0,  0,   0,
+                0,   0,   0,  0,   0,  0,   0,  0,  0,   0,  0,   0,   0,   0,  0,  0,  0,   35,
+                35,  0,   38, 0,   0,  0,   0,  0,  0,   0,  0,   0,   0,   0,  0,  0,  0,   0,
+                0,   0,   0,  0,   0,  0,   0,  0,  0,   0,  0,   0,   0,   0,  0,  0,  74,  71,
+                71,  71,  71, 71,  71, 71,  71, 71, 0,   0,  0,   0,   0,   0,  10, 10, 10,  10,
+                10,  10,  10, 10,  10, 10,  10, 98, 10,  10, 10,  102, 103, 10, 10, 10, 10,  10,
+                10,  10,  10, 112, 10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10, 10,  10,
+                127, 10,  10, 10,  10, 10,  10, 10, 135, 10, 10,  10,  10,  10, 10, 10, 143, 10,
+                10,  10,  10, 10,  10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10, 10,  10,
+                10,  10,  10, 10,  10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10, 10,  10,
+                10,  182, 10, 10,  10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10, 10,  198,
+                10,  10,  10, 10,  10, 210, 10, 10, 10,  10, 10,  10,  10,  10, 10, 10, 10,  10,
+                10,  10,  10, 10,  10, 10,  10, 10, 225, 10, 227, 10,  10,  10, 10, 10, 10,  10,
+                10,  10,  10, 238, 10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10, 10,  10,
+                10,  10,  10, 10,  10, 10,  10, 10, 10,  10, 10,  10,  10,  10, 10, 10, 10,  10,
+                10,  10,  10, 10,  10, 10,  10, 10, 10,  10, 10,  0,   0,   0,  0,  0,  0,   0,
         },
         {
-                0,   242, 0,  0,  0,   0,   0,  8,  8,   10,  10, 0,  0,   0,   0,   0,   0,   0,
-                0,   0,   0,  0,  0,   0,   0,  0,  0,   0,   0,  0,  0,   0,   0,   0,   0,   35,
-                35,  0,   38, 0,  0,   0,   0,  0,  0,   0,   0,  0,  0,   0,   0,   0,   0,   0,
-                0,   0,   0,  0,  0,   0,   0,  0,  0,   0,   0,  0,  0,   0,   0,   0,   71,  71,
-                71,  71,  71, 71, 77,  71,  71, 71, 0,   0,   0,  0,  0,   0,   10,  10,  10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 10,  10,  10, 10, 10,  10,  10,  106, 10,  110,
-                109, 10,  10, 10, 10,  10,  10, 10, 10,  10,  10, 10, 121, 10,  10,  10,  10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 10,  10,  10, 10, 10,  140, 10,  10,  10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 153, 10,  10, 10, 10,  10,  159, 10,  10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 10,  10,  10, 10, 10,  10,  10,  10,  179, 10,
-                10,  10,  10, 10, 185, 10,  10, 10, 10,  10,  10, 10, 10,  10,  10,  10,  209, 10,
-                10,  10,  10, 10, 10,  204, 10, 10, 10,  208, 10, 10, 10,  10,  10,  232, 10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 10,  10,  10, 10, 10,  230, 10,  10,  10,  10,
-                10,  236, 10, 10, 239, 10,  10, 10, 10,  10,  10, 10, 10,  10,  10,  10,  10,  10,
-                10,  10,  10, 10, 257, 10,  10, 10, 10,  10,  10, 10, 10,  10,  10,  268, 10,  10,
-                10,  10,  10, 10, 0,   0,   0,  0,  0,   0,   0,
+                0,  249, 0,   0,   0,   0,   0,  8,  8,   10, 10, 0,   0,   0,  0,  0,   0,   0,
+                0,  0,   0,   0,   0,   0,   0,  0,  0,   0,  0,  0,   0,   0,  0,  0,   0,   35,
+                35, 0,   38,  0,   0,   0,   0,  0,  0,   0,  0,  0,   0,   0,  0,  0,   0,   0,
+                0,  0,   0,   0,   0,   0,   0,  0,  0,   0,  0,  0,   0,   0,  0,  0,   71,  71,
+                71, 71,  71,  71,  77,  71,  71, 71, 0,   0,  0,  0,   0,   0,  10, 10,  10,  10,
+                10, 10,  10,  10,  10,  10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,  10,  10,
+                10, 110, 10,  114, 113, 10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,  125, 10,
+                10, 10,  10,  10,  10,  10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,  10,  10,
+                10, 10,  147, 10,  10,  10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 160, 10,  10,
+                10, 10,  10,  166, 10,  10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,  10,  10,
+                10, 10,  10,  10,  10,  186, 10, 10, 10,  10, 10, 192, 10,  10, 10, 10,  10,  10,
+                10, 10,  10,  10,  10,  216, 10, 10, 10,  10, 10, 10,  211, 10, 10, 10,  215, 10,
+                10, 10,  10,  10,  239, 10,  10, 10, 10,  10, 10, 10,  10,  10, 10, 10,  10,  10,
+                10, 10,  237, 10,  10,  10,  10, 10, 243, 10, 10, 246, 10,  10, 10, 10,  10,  10,
+                10, 10,  10,  10,  10,  10,  10, 10, 10,  10, 10, 264, 10,  10, 10, 10,  10,  10,
+                10, 10,  10,  10,  275, 10,  10, 10, 10,  10, 10, 0,   0,   0,  0,  0,   0,   0,
         },
         {
-                0,   246, 0,  0,  0,   0,   0,  8,  8,  10, 10, 0,  0,   0,  0,   0,   0,  0,   0,
-                0,   0,   0,  0,  0,   0,   0,  0,  0,  0,  0,  0,  0,   0,  0,   0,   35, 35,  0,
-                38,  0,   0,  0,  0,   0,   0,  0,  0,  0,  0,  0,  0,   0,  0,   0,   0,  0,   0,
-                0,   0,   0,  0,  0,   0,   0,  0,  0,  0,  0,  0,  0,   71, 71,  71,  71, 71,  71,
-                71,  71,  71, 71, 0,   0,   0,  0,  0,  0,  91, 10, 10,  10, 10,  10,  10, 10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 113, 10,
-                10,  10,  10, 10, 119, 10,  10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10,  152,
-                10,  10,  10, 10, 10,  158, 10, 10, 10, 10, 10, 10, 10,  10, 167, 10,  10, 10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 10, 10, 10, 10, 184, 10, 10,  10,  10, 10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10,  10,
-                210, 10,  10, 10, 10,  10,  10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10,  10,
-                10,  10,  10, 10, 10,  234, 10, 10, 10, 10, 10, 10, 10,  10, 10,  244, 10, 10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 10, 10, 10, 10, 10,  10, 10,  10,  10, 10,  10,
-                10,  10,  10, 10, 10,  10,  10, 10, 0,  0,  0,  0,  0,   0,  0,
+                0,   253, 0,   0,  0,  0,  0,   8,  8,   10, 10,  0,   0,  0,  0,   0,  0,   0,
+                0,   0,   0,   0,  0,  0,  0,   0,  0,   0,  0,   0,   0,  0,  0,   0,  0,   35,
+                35,  0,   38,  0,  0,  0,  0,   0,  0,   0,  0,   0,   0,  0,  0,   0,  0,   0,
+                0,   0,   0,   0,  0,  0,  0,   0,  0,   0,  0,   0,   0,  0,  0,   0,  71,  71,
+                71,  71,  71,  71, 71, 71, 71,  71, 0,   0,  0,   0,   0,  0,  91,  10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  10,  10, 10, 10,  10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10,  10, 117, 10, 10,  10,  10, 10, 123, 10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  138, 10, 10, 10,  10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  10,  10, 10, 159, 10, 10,  10,
+                10,  10,  165, 10, 10, 10, 10,  10, 10,  10, 10,  174, 10, 10, 10,  10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10,  10, 10,  10, 191, 10,  10, 10, 10,  10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  10,  10, 10, 10,  10, 10,  10,
+                217, 10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  10,  10, 10, 10,  10, 10,  10,
+                10,  10,  10,  10, 10, 10, 241, 10, 10,  10, 10,  10,  10, 10, 10,  10, 251, 10,
+                10,  10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  10,  10, 10, 10,  10, 10,  10,
+                10,  10,  10,  10, 10, 10, 10,  10, 10,  10, 10,  0,   0,  0,  0,   0,  0,   0,
         },
         {
-                0,  253, 0,  0,  0,  0,  0,  8,  8,  10,  10, 0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  35, 35, 0,
-                38, 0,   0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,   0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  71, 71, 71, 71, 71, 71,
-                71, 71,  71, 71, 0,  0,  0,  0,  0,  0,   10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 181, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10, 10, 10, 10, 0,  0,   0,  0,  0,  0,  0,
+                0,  260, 0,  0,  0,  0,  0,  8,   8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  35, 35, 0,  38, 0,
+                0,  0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,   0,  0,  0,  0,  0,  0,   0,  0,  71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+                0,  0,   0,  0,  0,  0,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10, 10, 188, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 0,   0,  0,  0,  0,  0,  0,
         },
         {
-                0,  261, 0,  0,  0,   0,  0,  8,  8,   10, 10, 0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  35, 35, 0,
-                38, 0,   0,  0,  0,   0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-                0,  0,   0,  0,  0,   0,  0,  0,  0,   0,  0,  0,  0,  71, 71, 71, 71, 75, 71,
-                71, 71,  71, 71, 0,   0,  0,  0,  0,   0,  10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 161, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 237, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 10,  10, 10, 10,  10, 10, 10, 0,   0,  0,  0,  0,  0,  0,
+                0,   268, 0,  0,  0,  0,  0,  8,   8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,   0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  35, 35, 0,  38, 0,
+                0,   0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,   0,   0,  0,  0,  0,  0,  0,   0,  0,  71, 71, 71, 71, 75, 71, 71, 71, 71, 71,
+                0,   0,   0,  0,  0,  0,  10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 168, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                244, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10,  10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10,  0,   0,  0,  0,  0,  0,  0,
         },
         {
                 0,  9,  0,  0,  0,  0,  0,  8,  8,  10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -827,93 +846,97 @@
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-                10, 0,  0,  0,  0,  0,  0,  0,
+                10, 10, 10, 10, 10, 10, 10, 10, 0,  0,  0,  0,  0,  0,  0,
         },
         {
-                0,  9,  0,  0,   0,  0,  0,   8,  8,  10, 10, 0,   0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  35, 35, 0,
-                38, 0,  0,  0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,
-                0,  0,  0,  0,   0,  0,  0,   0,  0,  0,  0,  0,   0,  71, 71, 71, 71, 71, 71,
-                71, 71, 71, 71,  0,  0,  0,   0,  0,  0,  10, 10,  10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 156, 10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 202, 10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 10,  10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10,
-                10, 10, 10, 10,  10, 10, 273, 10, 0,  0,  0,  0,   0,  0,  0,
+                0,  9,  0,   0,  0,  0,  0,  8,  8,   10, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  35, 35, 0,  38, 0,
+                0,  0,  0,   0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+                0,  0,  0,   0,  0,  0,  0,  0,  0,   0,  71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+                0,  0,  0,   0,  0,  0,  10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 163, 10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10,  10, 10, 10, 10, 10, 209, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+                10, 10, 10,  10, 10, 10, 10, 10, 10,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 280,
+                10, 0,  0,   0,  0,  0,  0,  0,
         },
         {
-                0, 274, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 275, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 277, 0, 0, 0, 0, 0,
+                0, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 284, 0, 0, 0, 0, 0,
         },
         {
-                0, 279, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
         {
-                0, 280, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+                0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
         },
 };
 
-static int8_t accepts[281] = {
-        -1, -1, 92, 92, 95, 66, 71, 95, 40, 39, 39, 56, 80, 61, 65, 88, 85, 42, 43, 54, 78, 52,
-        50, 76, 49, 53, 51, 77, 90, 48, 1,  -1, -1, 1,  55, -1, -1, 94, 93, 79, 2,  1,  1,  -1,
-        -1, 1,  -1, -1, 1,  2,  -1, -1, 1,  -1, 2,  2,  68, 91, 89, 73, 57, 81, 75, 69, 70, 72,
-        74, 58, 82, 67, 95, 41, 41, 6,  41, 41, 41, 41, 41, 12, 46, 47, 60, 84, 64, 87, 39, 39,
-        39, 39, 15, 39, 39, 39, 39, 34, 39, 39, 39, 13, 39, 39, 39, 39, 39, 39, 31, 39, 39, 23,
-        39, 39, 39, 39, 16, 39, 39, 39, 39, 39, 39, 14, 39, 39, 39, 39, 39, 17, 10, 39, 39, 39,
-        7,  39, 39, 39, 39, 4,  39, 39, 27, 39, 8,  39, 39, 39, 39, 26, 39, 5,  19, 39, 39, 21,
-        39, 39, 39, 39, 39, 37, 39, 39, 24, 39, 39, 39, 39, 39, 39, 25, 39, 39, 39, 39, 39, 39,
-        39, 39, 39, 39, 39, 39, 28, 39, 39, 20, 39, 39, 39, 39, 39, 39, 39, 39, 38, 39, 39, 39,
-        39, 39, 39, 39, 29, 39, 39, 39, 39, 39, 33, 39, 39, 39, 18, 39, 39, 39, 39, 39, 39, 39,
-        39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 35, 39, 39, 39, 39, 36, 39, 39, 39, 39, 11,
-        39, 39, 39, 3,  39, 39, 39, 39, 39, 39, 22, 39, 39, 39, 39, 39, 39, 39, 32, 39, 39, 39,
-        39, 9,  39, 39, 39, 39, 39, 39, 39, 30, 44, 59, 83, 63, 86, 45, 62,
+static int8_t accepts[288] = {
+        -1, -1, 94, 94, 97, 68, 74, 97, 42, 41, 41, 58, 83, 63, 67, 91, 88, 44, 45, 56, 81, 54, 52,
+        79, 51, 55, 53, 80, 93, 50, 1,  -1, -1, 1,  57, -1, -1, 96, 95, 82, 2,  1,  1,  -1, -1, 1,
+        -1, -1, 1,  2,  -1, -1, 1,  -1, 2,  2,  71, 70, 92, 76, 59, 84, 78, 72, 73, 75, 77, 60, 85,
+        69, 97, 43, 43, 6,  43, 43, 43, 43, 43, 12, 48, 49, 62, 87, 66, 90, 41, 41, 41, 41, 15, 41,
+        41, 41, 41, 34, 41, 41, 41, 13, 41, 41, 41, 40, 41, 41, 41, 41, 41, 41, 31, 41, 41, 23, 41,
+        41, 41, 41, 16, 41, 41, 41, 41, 41, 41, 14, 41, 41, 41, 41, 41, 17, 10, 41, 41, 41, 7,  41,
+        41, 39, 41, 41, 41, 41, 4,  41, 41, 27, 41, 8,  41, 41, 41, 41, 26, 41, 5,  19, 41, 41, 21,
+        41, 41, 41, 41, 41, 37, 41, 41, 24, 41, 41, 41, 41, 41, 41, 25, 41, 41, 41, 41, 41, 41, 41,
+        41, 41, 41, 41, 41, 28, 41, 41, 20, 41, 41, 41, 41, 41, 41, 41, 41, 38, 41, 41, 41, 41, 41,
+        41, 41, 29, 41, 41, 41, 41, 41, 33, 41, 41, 41, 18, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+        41, 41, 41, 41, 41, 41, 41, 41, 35, 41, 41, 41, 41, 36, 41, 41, 41, 41, 11, 41, 41, 41, 3,
+        41, 41, 41, 41, 41, 41, 22, 41, 41, 41, 41, 41, 41, 41, 32, 41, 41, 41, 41, 9,  41, 41, 41,
+        41, 41, 41, 41, 30, 46, 61, 86, 65, 89, 47, 64,
 };
 
 Token Lexer::next() {
diff --git a/src/sksl/SkSLLexer.h b/src/sksl/SkSLLexer.h
index 246be22..18f70a1 100644
--- a/src/sksl/SkSLLexer.h
+++ b/src/sksl/SkSLLexer.h
@@ -93,6 +93,10 @@
         LAYOUT,
 #undef PRECISION
         PRECISION,
+#undef ENUM
+        ENUM,
+#undef CLASS
+        CLASS,
 #undef IDENTIFIER
         IDENTIFIER,
 #undef DIRECTIVE
@@ -151,6 +155,8 @@
         LOGICALNOT,
 #undef QUESTION
         QUESTION,
+#undef COLONCOLON
+        COLONCOLON,
 #undef COLON
         COLON,
 #undef EQ
@@ -197,8 +203,6 @@
         SEMICOLON,
 #undef ARROW
         ARROW,
-#undef COLONCOLON
-        COLONCOLON,
 #undef WHITESPACE
         WHITESPACE,
 #undef LINE_COMMENT
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index 267d802..d140ce2 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -15,6 +15,7 @@
 #include "ast/SkSLASTContinueStatement.h"
 #include "ast/SkSLASTDiscardStatement.h"
 #include "ast/SkSLASTDoStatement.h"
+#include "ast/SkSLASTEnum.h"
 #include "ast/SkSLASTExpression.h"
 #include "ast/SkSLASTExpressionStatement.h"
 #include "ast/SkSLASTExtension.h"
@@ -279,11 +280,75 @@
                                                           text));
 }
 
-/* modifiers (structVarDeclaration | type IDENTIFIER ((LPAREN parameter
+/* ENUM CLASS IDENTIFIER LBRACE (IDENTIFIER (EQ expression)? (COMMA IDENTIFIER (EQ expression))*)?
+   RBRACE */
+std::unique_ptr<ASTDeclaration> Parser::enumDeclaration() {
+    Token start;
+    if (!this->expect(Token::ENUM, "'enum'", &start)) {
+        return nullptr;
+    }
+    if (!this->expect(Token::CLASS, "'class'")) {
+        return nullptr;
+    }
+    Token name;
+    if (!this->expect(Token::IDENTIFIER, "an identifier", &name)) {
+        return nullptr;
+    }
+    if (!this->expect(Token::LBRACE, "'{'")) {
+        return nullptr;
+    }
+    fTypes.add(this->text(name), std::unique_ptr<Symbol>(new Type(this->text(name),
+                                                                  Type::kEnum_Kind)));
+    std::vector<StringFragment> names;
+    std::vector<std::unique_ptr<ASTExpression>> values;
+    if (!this->checkNext(Token::RBRACE)) {
+        Token id;
+        if (!this->expect(Token::IDENTIFIER, "an identifier", &id)) {
+            return nullptr;
+        }
+        names.push_back(this->text(id));
+        if (this->checkNext(Token::EQ)) {
+            std::unique_ptr<ASTExpression> value = this->assignmentExpression();
+            if (!value) {
+                return nullptr;
+            }
+            values.push_back(std::move(value));
+        } else {
+            values.push_back(nullptr);
+        }
+        while (!this->checkNext(Token::RBRACE)) {
+            if (!this->expect(Token::COMMA, "','")) {
+                return nullptr;
+            }
+            if (!this->expect(Token::IDENTIFIER, "an identifier", &id)) {
+                return nullptr;
+            }
+            names.push_back(this->text(id));
+            if (this->checkNext(Token::EQ)) {
+                std::unique_ptr<ASTExpression> value = this->assignmentExpression();
+                if (!value) {
+                    return nullptr;
+                }
+                values.push_back(std::move(value));
+            } else {
+                values.push_back(nullptr);
+            }
+        }
+    }
+    this->expect(Token::SEMICOLON, "';'");
+    return std::unique_ptr<ASTDeclaration>(new ASTEnum(name.fOffset, this->text(name), names,
+                                                       std::move(values)));
+}
+
+/* enumDeclaration | modifiers (structVarDeclaration | type IDENTIFIER ((LPAREN parameter
    (COMMA parameter)* RPAREN (block | SEMICOLON)) | SEMICOLON) | interfaceBlock) */
 std::unique_ptr<ASTDeclaration> Parser::declaration() {
-    Modifiers modifiers = this->modifiers();
     Token lookahead = this->peek();
+    if (lookahead.fKind == Token::ENUM) {
+        return this->enumDeclaration();
+    }
+    Modifiers modifiers = this->modifiers();
+    lookahead = this->peek();
     if (lookahead.fKind == Token::IDENTIFIER && !this->isType(this->text(lookahead))) {
         // we have an identifier that's not a type, could be the start of an interface block
         return this->interfaceBlock(modifiers);
@@ -1286,7 +1351,7 @@
     return nullptr;
 }
 
-/* assignmentExpression */
+/* commaExpression */
 std::unique_ptr<ASTExpression> Parser::expression() {
     AutoDepth depth(this);
     if (!depth.checkValid()) {
@@ -1633,11 +1698,12 @@
     }
     for (;;) {
         switch (this->peek().fKind) {
-            case Token::LBRACKET: // fall through
-            case Token::DOT:      // fall through
-            case Token::LPAREN:   // fall through
-            case Token::PLUSPLUS: // fall through
-            case Token::MINUSMINUS: {
+            case Token::LBRACKET:   // fall through
+            case Token::DOT:        // fall through
+            case Token::LPAREN:     // fall through
+            case Token::PLUSPLUS:   // fall through
+            case Token::MINUSMINUS: // fall through
+            case Token::COLONCOLON: {
                 std::unique_ptr<ASTSuffix> s = this->suffix();
                 if (!s) {
                     return nullptr;
@@ -1652,7 +1718,7 @@
 }
 
 /* LBRACKET expression? RBRACKET | DOT IDENTIFIER | LPAREN parameters RPAREN |
-   PLUSPLUS | MINUSMINUS */
+   PLUSPLUS | MINUSMINUS | COLONCOLON IDENTIFIER */
 std::unique_ptr<ASTSuffix> Parser::suffix() {
     Token next = this->nextToken();
     switch (next.fKind) {
@@ -1667,7 +1733,8 @@
             this->expect(Token::RBRACKET, "']' to complete array access expression");
             return std::unique_ptr<ASTSuffix>(new ASTIndexSuffix(std::move(e)));
         }
-        case Token::DOT: {
+        case Token::DOT: // fall through
+        case Token::COLONCOLON: {
             int offset = this->peek().fOffset;
             StringFragment text;
             if (this->identifier(&text)) {
diff --git a/src/sksl/SkSLParser.h b/src/sksl/SkSLParser.h
index 8485500..51e689e 100644
--- a/src/sksl/SkSLParser.h
+++ b/src/sksl/SkSLParser.h
@@ -124,6 +124,8 @@
 
     std::unique_ptr<ASTDeclaration> section();
 
+    std::unique_ptr<ASTDeclaration> enumDeclaration();
+
     std::unique_ptr<ASTDeclaration> declaration();
 
     std::unique_ptr<ASTVarDeclarations> varDeclarations();
diff --git a/src/sksl/ast/SkSLASTDeclaration.h b/src/sksl/ast/SkSLASTDeclaration.h
index 53aa65f..23d3d74 100644
--- a/src/sksl/ast/SkSLASTDeclaration.h
+++ b/src/sksl/ast/SkSLASTDeclaration.h
@@ -23,7 +23,8 @@
         kExtension_Kind,
         kPrecision_Kind,
         kModifiers_Kind,
-        kSection_Kind
+        kSection_Kind,
+        kEnum_Kind
     };
 
     ASTDeclaration(int offset, Kind kind)
diff --git a/src/sksl/ast/SkSLASTEnum.h b/src/sksl/ast/SkSLASTEnum.h
new file mode 100644
index 0000000..6fdd091
--- /dev/null
+++ b/src/sksl/ast/SkSLASTEnum.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SKSL_ASTENUM
+#define SKSL_ASTENUM
+
+#include "SkSLASTDeclaration.h"
+namespace SkSL {
+
+struct ASTEnum : public ASTDeclaration {
+    ASTEnum(int offset, StringFragment typeName, std::vector<StringFragment> names,
+            std::vector<std::unique_ptr<ASTExpression>> values)
+    : INHERITED(offset, kEnum_Kind)
+    , fTypeName(typeName)
+    , fNames(std::move(names))
+    , fValues(std::move(values)) {
+        ASSERT(fNames.size() == fValues.size());
+    }
+
+    String description() const override {
+        String result = "enum class " + fTypeName + " {\n";
+        String separator;
+        for (StringFragment name : fNames) {
+            result += separator + "    " + name;
+            separator = ",\n";
+        }
+        result += "};";
+        return result;
+    }
+
+    const StringFragment fTypeName;
+    const std::vector<StringFragment> fNames;
+    const std::vector<std::unique_ptr<ASTExpression>> fValues;
+
+    typedef ASTDeclaration INHERITED;
+};
+
+} // namespace
+
+#endif
diff --git a/src/sksl/ir/SkSLEnum.h b/src/sksl/ir/SkSLEnum.h
new file mode 100644
index 0000000..6c44a67
--- /dev/null
+++ b/src/sksl/ir/SkSLEnum.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SKSL_ENUM
+#define SKSL_ENUM
+
+#include "SkSLProgramElement.h"
+namespace SkSL {
+
+struct Enum : public ProgramElement {
+    Enum(int offset, StringFragment typeName, std::shared_ptr<SymbolTable> symbols)
+    : INHERITED(offset, kEnum_Kind)
+    , fTypeName(typeName)
+    , fSymbols(std::move(symbols)) {}
+
+    String description() const override {
+        String result = "enum class " + fTypeName + " {\n";
+        String separator;
+        for (auto iter = fSymbols->begin(); iter != fSymbols->end(); ++iter) {
+            result += separator + "    " + iter->first + " = " +
+                      ((Variable&) *iter->second).fInitialValue->description();
+            separator = ",\n";
+        }
+        result += "\n};";
+        return result;
+    }
+
+    bool fBuiltin = false;
+    const StringFragment fTypeName;
+    const std::shared_ptr<SymbolTable> fSymbols;
+
+    typedef ProgramElement INHERITED;
+};
+
+} // namespace
+
+#endif
diff --git a/src/sksl/ir/SkSLProgramElement.h b/src/sksl/ir/SkSLProgramElement.h
index 4a3566d..9d1bdfe 100644
--- a/src/sksl/ir/SkSLProgramElement.h
+++ b/src/sksl/ir/SkSLProgramElement.h
@@ -17,12 +17,13 @@
  */
 struct ProgramElement : public IRNode {
     enum Kind {
-        kVar_Kind,
+        kEnum_Kind,
+        kExtension_Kind,
         kFunction_Kind,
         kInterfaceBlock_Kind,
-        kExtension_Kind,
         kModifiers_Kind,
-        kSection_Kind
+        kSection_Kind,
+        kVar_Kind
     };
 
     ProgramElement(int offset, Kind kind)
diff --git a/src/sksl/ir/SkSLSymbolTable.cpp b/src/sksl/ir/SkSLSymbolTable.cpp
index 40e8e66..701eb75 100644
--- a/src/sksl/ir/SkSLSymbolTable.cpp
+++ b/src/sksl/ir/SkSLSymbolTable.cpp
@@ -60,13 +60,18 @@
 }
 
 Symbol* SymbolTable::takeOwnership(Symbol* s) {
-    fOwnedPointers.push_back(std::unique_ptr<Symbol>(s));
+    fOwnedSymbols.emplace_back(s);
     return s;
 }
 
+IRNode* SymbolTable::takeOwnership(IRNode* n) {
+    fOwnedNodes.emplace_back(n);
+    return n;
+}
+
 void SymbolTable::add(StringFragment name, std::unique_ptr<Symbol> symbol) {
     this->addWithoutOwnership(name, symbol.get());
-    fOwnedPointers.push_back(std::move(symbol));
+    this->takeOwnership(symbol.release());
 }
 
 void SymbolTable::addWithoutOwnership(StringFragment name, const Symbol* symbol) {
@@ -115,4 +120,13 @@
     }
 }
 
+std::unordered_map<StringFragment, const Symbol*>::iterator SymbolTable::begin() {
+    return fSymbols.begin();
+}
+
+std::unordered_map<StringFragment, const Symbol*>::iterator SymbolTable::end() {
+    return fSymbols.end();
+}
+
+
 } // namespace
diff --git a/src/sksl/ir/SkSLSymbolTable.h b/src/sksl/ir/SkSLSymbolTable.h
index 241631d..f245964 100644
--- a/src/sksl/ir/SkSLSymbolTable.h
+++ b/src/sksl/ir/SkSLSymbolTable.h
@@ -39,14 +39,22 @@
 
     Symbol* takeOwnership(Symbol* s);
 
+    IRNode* takeOwnership(IRNode* n);
+
     void markAllFunctionsBuiltin();
 
+    std::unordered_map<StringFragment, const Symbol*>::iterator begin();
+
+    std::unordered_map<StringFragment, const Symbol*>::iterator end();
+
     const std::shared_ptr<SymbolTable> fParent;
 
 private:
     static std::vector<const FunctionDeclaration*> GetFunctions(const Symbol& s);
 
-    std::vector<std::unique_ptr<Symbol>> fOwnedPointers;
+    std::vector<std::unique_ptr<Symbol>> fOwnedSymbols;
+
+    std::vector<std::unique_ptr<IRNode>> fOwnedNodes;
 
     std::unordered_map<StringFragment, const Symbol*> fSymbols;
 
diff --git a/src/sksl/ir/SkSLType.h b/src/sksl/ir/SkSLType.h
index ed5e076..c33b94b 100644
--- a/src/sksl/ir/SkSLType.h
+++ b/src/sksl/ir/SkSLType.h
@@ -42,14 +42,15 @@
     };
 
     enum Kind {
-        kScalar_Kind,
-        kVector_Kind,
-        kMatrix_Kind,
         kArray_Kind,
-        kStruct_Kind,
+        kEnum_Kind,
         kGeneric_Kind,
+        kMatrix_Kind,
+        kOther_Kind,
         kSampler_Kind,
-        kOther_Kind
+        kScalar_Kind,
+        kStruct_Kind,
+        kVector_Kind
     };
 
     enum NumberKind {
@@ -70,6 +71,16 @@
         fName.fLength = fNameString.size();
     }
 
+    // Create a simple type.
+    Type(String name, Kind kind)
+    : INHERITED(-1, kType_Kind, StringFragment())
+    , fNameString(std::move(name))
+    , fTypeKind(kind)
+    , fNumberKind(kNonnumeric_NumberKind) {
+        fName.fChars = fNameString.c_str();
+        fName.fLength = fNameString.size();
+    }
+
     // Create a generic type which maps to the listed types.
     Type(String name, std::vector<const Type*> types)
     : INHERITED(-1, kType_Kind, StringFragment())
diff --git a/src/sksl/ir/SkSLVariable.h b/src/sksl/ir/SkSLVariable.h
index 536d1e6..f16bf4b 100644
--- a/src/sksl/ir/SkSLVariable.h
+++ b/src/sksl/ir/SkSLVariable.h
@@ -15,6 +15,8 @@
 
 namespace SkSL {
 
+struct Expression;
+
 /**
  * Represents a variable, whether local, global, or a function parameter. This represents the
  * variable itself (the storage location), which is shared between all VariableReferences which
@@ -28,11 +30,12 @@
     };
 
     Variable(int offset, Modifiers modifiers, StringFragment name, const Type& type,
-             Storage storage)
+             Storage storage, Expression* initialValue = nullptr)
     : INHERITED(offset, kVariable_Kind, name)
     , fModifiers(modifiers)
     , fType(type)
     , fStorage(storage)
+    , fInitialValue(initialValue)
     , fReadCount(0)
     , fWriteCount(0) {}
 
@@ -48,6 +51,8 @@
     const Type& fType;
     const Storage fStorage;
 
+    Expression* fInitialValue = nullptr;
+
     // Tracks how many sites read from the variable. If this is zero for a non-out variable (or
     // becomes zero during optimization), the variable is dead and may be eliminated.
     mutable int fReadCount;
diff --git a/src/sksl/ir/SkSLVariableReference.h b/src/sksl/ir/SkSLVariableReference.h
index 54917b0..ad54d43 100644
--- a/src/sksl/ir/SkSLVariableReference.h
+++ b/src/sksl/ir/SkSLVariableReference.h
@@ -74,6 +74,10 @@
         return false;
     }
 
+    bool isConstant() const override {
+        return 0 != (fVariable.fModifiers.fFlags & Modifiers::kConst_Flag);
+    }
+
     String description() const override {
         return fVariable.fName;
     }
@@ -120,6 +124,10 @@
         if (fRefKind != kRead_RefKind) {
             return nullptr;
         }
+        if ((fVariable.fModifiers.fFlags & Modifiers::kConst_Flag) && fVariable.fInitialValue &&
+            fVariable.fInitialValue->isConstant()) {
+            return copy_constant(irGenerator, fVariable.fInitialValue);
+        }
         auto exprIter = definitions.find(&fVariable);
         if (exprIter != definitions.end() && exprIter->second &&
             (*exprIter->second)->isConstant()) {
diff --git a/src/sksl/lex/sksl.lex b/src/sksl/lex/sksl.lex
index ada5e24..9c5c769 100644
--- a/src/sksl/lex/sksl.lex
+++ b/src/sksl/lex/sksl.lex
@@ -36,6 +36,8 @@
 STRUCT         = "struct"
 LAYOUT         = "layout"
 PRECISION      = "precision"
+ENUM           = "enum"
+CLASS          = "class"
 IDENTIFIER     = [a-zA-Z_$]([0-9]|[a-zA-Z_$])*
 DIRECTIVE      = #[a-zA-Z_$]([0-9]|[a-zA-Z_$])*
 SECTION        = @[a-zA-Z_$]([0-9]|[a-zA-Z_$])*
@@ -65,6 +67,7 @@
 LOGICALAND     = "&&"
 LOGICALNOT     = "!"
 QUESTION       = "?"
+COLONCOLON     = "::"
 COLON          = ":"
 EQ             = "="
 EQEQ           = "=="
@@ -88,7 +91,6 @@
 LOGICALANDEQ   = "&&="
 SEMICOLON      = ";"
 ARROW          = "->"
-COLONCOLON     = "::"
 WHITESPACE     = \s+
 LINE_COMMENT   = //.*
 BLOCK_COMMENT  = /\*([^*]|\*[^/])*\*/
diff --git a/src/sksl/sksl.include b/src/sksl/sksl.include
index c8a7b6b..9621f88 100644
--- a/src/sksl/sksl.include
+++ b/src/sksl/sksl.include
@@ -1,4 +1,4 @@
-STRINGIFY(
+R"(
 
 // defines built-in functions supported by SkiaSL
 
@@ -330,11 +330,11 @@
 $gfloat4subpassLoad(gsubpassInput subpass);
 $gfloat4subpassLoad(gsubpassInputMS subpass, int sample);
 */
-)
+)"
 
 // split into multiple chunks, as MSVC++ complains if a single string is too long
 
-STRINGIFY(
+R"(
 
 half4 texture($gsampler1D sampler, float2 P);
 half4 texture($gsampler1D sampler, float2 P, float bias);
@@ -560,5 +560,4 @@
 void groupMemoryBarrier();
 */
 
-)
-
+)"
diff --git a/src/sksl/sksl_enums.include b/src/sksl/sksl_enums.include
new file mode 100644
index 0000000..eb60b3b
--- /dev/null
+++ b/src/sksl/sksl_enums.include
@@ -0,0 +1,35 @@
+R"(/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+/*************************************************************************************************/
+/* This file is used from both C++ and SkSL, so we need to stick to syntax compatible with both. */
+/*************************************************************************************************/
+
+/**
+ * We have coverage effects that clip rendering to the edge of some geometric primitive.
+ * This enum specifies how that clipping is performed. Not all factories that take a
+ * GrProcessorEdgeType will succeed with all values and it is up to the caller to check for
+ * a NULL return.
+ */
+enum class GrClipEdgeType {
+    kFillBW,
+    kFillAA,
+    kInverseFillBW,
+    kInverseFillAA,
+    kHairlineAA,
+
+    kLast = kHairlineAA
+};
+
+enum class PMConversion {
+    kToPremul        = 0,
+    kToUnpremul      = 1,
+    kPMConversionCnt = 2
+};
+
+)"
diff --git a/src/sksl/sksl_fp.include b/src/sksl/sksl_fp.include
index 5f8c7ea..9b1eb2a 100644
--- a/src/sksl/sksl_fp.include
+++ b/src/sksl/sksl_fp.include
@@ -1,4 +1,4 @@
-STRINGIFY(
+R"(
 
 // defines built-in interfaces supported by SkiaSL fragment shaders
 
@@ -22,5 +22,4 @@
 layout(builtin=10006) sampler2D[] sk_TextureSamplers;
 
 half4 process(fragmentProcessor fp);
-
-)
+)"
diff --git a/src/sksl/sksl_frag.include b/src/sksl/sksl_frag.include
index e96165b..c041dbf 100644
--- a/src/sksl/sksl_frag.include
+++ b/src/sksl/sksl_frag.include
@@ -1,4 +1,4 @@
-STRINGIFY(
+R"(
 
 // defines built-in interfaces supported by SkiaSL fragment shaders
 
@@ -18,4 +18,4 @@
 
 layout(location=0,index=0,builtin=10001) out half4 sk_FragColor;
 
-)
+)"
diff --git a/src/sksl/sksl_geom.include b/src/sksl/sksl_geom.include
index 3e5ffae..fcac8da 100644
--- a/src/sksl/sksl_geom.include
+++ b/src/sksl/sksl_geom.include
@@ -1,4 +1,4 @@
-STRINGIFY(
+R"(
 
 // defines built-in interfaces supported by SkiaSL geometry shaders
 
@@ -21,4 +21,4 @@
 sk_has_side_effects void EmitVertex();
 sk_has_side_effects void EndPrimitive();
 
-)
+)"
diff --git a/src/sksl/sksl_vert.include b/src/sksl/sksl_vert.include
index 9e797b3..4cc0646 100644
--- a/src/sksl/sksl_vert.include
+++ b/src/sksl/sksl_vert.include
@@ -1,4 +1,4 @@
-STRINGIFY(
+R"(
 
 // defines built-in interfaces supported by SkiaSL vertex shaders
 
@@ -11,5 +11,4 @@
 layout(builtin=5) in int sk_VertexID;
 layout(builtin=6) in int sk_InstanceID;
 
-)
-
+)"
diff --git a/src/utils/SkShadowUtils.cpp b/src/utils/SkShadowUtils.cpp
index 757b65c..0e022cf 100644
--- a/src/utils/SkShadowUtils.cpp
+++ b/src/utils/SkShadowUtils.cpp
@@ -71,7 +71,7 @@
 
 std::unique_ptr<GrFragmentProcessor> SkGaussianColorFilter::asFragmentProcessor(
         GrContext*, const GrColorSpaceInfo&) const {
-    return GrBlurredEdgeFragmentProcessor::Make(GrBlurredEdgeFragmentProcessor::kGaussian_Mode);
+    return GrBlurredEdgeFragmentProcessor::Make(GrBlurredEdgeFragmentProcessor::Mode::kGaussian);
 }
 #endif