Переглянути джерело

Merge branch 'master' of https://git.winfor.ch/nicolas/Almond

Nicolas Winkler 4 роки тому
батько
коміт
e69de0f9c4
44 змінених файлів з 4011 додано та 2113 видалено
  1. 7 0
      include/Almond.h
  2. 1 0
      libmandel/CMakeLists.txt
  3. 26 1
      libmandel/include/ClGenerators.h
  4. 1 0
      libmandel/include/CpuGenerators.h
  5. 3 62
      libmandel/include/Generators.h
  6. 1 1
      libmandel/include/IterationFormula.h
  7. 1 1
      libmandel/include/IterationIR.h
  8. 1 1
      libmandel/include/MandelUtil.h
  9. 2 2
      libmandel/include/NaiveIRGenerator.h
  10. 194 0
      libmandel/include/OctaDouble.h
  11. 3 1
      libmandel/include/OpenClCode.h
  12. 9 0
      libmandel/include/PolyfloatUtil.h
  13. 34 0
      libmandel/include/Real.h
  14. 85 0
      libmandel/include/TripleFloat.h
  15. 55 38
      libmandel/include/Types.h
  16. 111 52
      libmandel/src/ClGenerators.cpp
  17. 6 0
      libmandel/src/CpuGenerators.cpp
  18. 67 7
      libmandel/src/CpuGeneratorsAVX.cpp
  19. 99 10
      libmandel/src/CpuGeneratorsAVXFMA.cpp
  20. 49 3
      libmandel/src/Generators.cpp
  21. 14 2
      libmandel/src/Mandel.cpp
  22. 1 0
      libmandel/src/NaiveIRGenerator.cpp
  23. 10 0
      libmandel/src/OpenClCode.cpp
  24. 31 0
      libmandel/src/Real.cpp
  25. 0 76
      libmandel/src/Types.cpp
  26. 2 1
      libmandel/src/opencl/doubledouble.cl
  27. 205 210
      libmandel/src/opencl/doubledouble.h
  28. 11 27
      libmandel/src/opencl/doublefloat.cl
  29. 238 275
      libmandel/src/opencl/doublefloat.h
  30. 19 5
      libmandel/src/opencl/hexdouble.cl
  31. 558 555
      libmandel/src/opencl/hexdouble.h
  32. 272 0
      libmandel/src/opencl/octadouble.cl
  33. 712 0
      libmandel/src/opencl/octadouble.h
  34. 2 1
      libmandel/src/opencl/quaddouble.cl
  35. 513 510
      libmandel/src/opencl/quaddouble.h
  36. 3 1
      libmandel/src/opencl/tripledouble.cl
  37. 257 263
      libmandel/src/opencl/tripledouble.h
  38. 103 0
      libmandel/src/opencl/triplefloat.cl
  39. 268 0
      libmandel/src/opencl/triplefloat.h
  40. 18 8
      mandelvid/src/main.cpp
  41. 1 0
      resources/Almond.qrc
  42. 16 0
      resources/gradients/almond.xml
  43. 1 0
      src/Almond.cpp
  44. 1 0
      src/GradientMenu.cpp

+ 7 - 0
include/Almond.h

@@ -21,6 +21,10 @@
 
 #include <memory>
 
+///
+/// \brief contains a viewport that can be restored when switching
+///        between mandelbrot set and julia set
+///
 struct ViewState
 {
     mnd::MandelViewport viewport;
@@ -36,6 +40,9 @@ enum ViewType
 };
 
 
+///
+/// \brief The main window of the Almond application
+///
 class Almond : public QMainWindow
 {
     Q_OBJECT

+ 1 - 0
libmandel/CMakeLists.txt

@@ -38,6 +38,7 @@ SET(MandelSources
     src/Hardware.cpp
     src/MandelUtil.cpp
     src/Types.cpp
+    src/Real.cpp
     src/OpenClCode.cpp
     src/IterationGenerator.cpp
     src/IterationFormula.cpp

+ 26 - 1
libmandel/include/ClGenerators.h

@@ -33,11 +33,13 @@ namespace mnd
     class ClGenerator;
     class ClGeneratorFloat;
     class ClGeneratorDoubleFloat;
+    class ClGeneratorTripleFloat;
     class ClGeneratorDouble;
     class ClGeneratorDoubleDouble;
     class ClGeneratorTripleDouble;
     class ClGeneratorQuadDouble;
     class ClGeneratorHexDouble;
+    class ClGeneratorOctaDouble;
     class ClGenerator128;
     class ClGenerator64;
 }
@@ -85,6 +87,18 @@ protected:
 };
 
 
+class mnd::ClGeneratorTripleFloat : public ClGenerator
+{
+public:
+    ClGeneratorTripleFloat(MandelDevice& device);
+    virtual ~ClGeneratorTripleFloat(void) = default;
+
+    virtual void generate(const MandelInfo& info, float* data) override;
+protected:
+    virtual std::string getKernelCode(bool smooth) const;
+};
+
+
 class mnd::ClGeneratorDouble : public ClGenerator
 {
 public:
@@ -138,7 +152,6 @@ protected:
 
 class mnd::ClGeneratorHexDouble : public ClGenerator
 {
-    bool smooth;
 public:
     ClGeneratorHexDouble(mnd::MandelDevice& device);
     virtual ~ClGeneratorHexDouble(void) = default;
@@ -149,6 +162,18 @@ protected:
 };
 
 
+class mnd::ClGeneratorOctaDouble : public ClGenerator
+{
+public:
+    ClGeneratorOctaDouble(mnd::MandelDevice& device);
+    virtual ~ClGeneratorOctaDouble(void) = default;
+
+    virtual void generate(const MandelInfo& info, float* data) override;
+protected:
+    virtual std::string getKernelCode(bool smooth) const;
+};
+
+
 class mnd::ClGenerator128 : public ClGenerator
 {
 public:

+ 1 - 0
libmandel/include/CpuGenerators.h

@@ -2,6 +2,7 @@
 #define MANDEL_CPUGENERATORS_H
 
 #include "Generators.h"
+#include "Types.h"
 
 namespace mnd
 {

+ 3 - 62
libmandel/include/Generators.h

@@ -7,24 +7,23 @@
 #include <map>
 #include <utility>
 
-
-
 namespace mnd
 {
     class MandelGenerator;
 
     class AdaptiveGenerator;
 
-    enum class GeneratorType : int;
     enum class Precision : int
     {
         FLOAT,
         DOUBLE_FLOAT,
+        TRIPLE_FLOAT,
         DOUBLE,
         DOUBLE_DOUBLE,
         TRIPLE_DOUBLE,
         QUAD_DOUBLE,
         HEX_DOUBLE,
+        OCTA_DOUBLE,
         FLOAT128,
         FLOAT256,
         FLOAT512,
@@ -49,74 +48,16 @@ namespace mnd
     std::string toString(CpuExtension);
 
     Real getPrecision(Precision p);
-    
+
     template<typename T>
     Real getPrecision(void);
 
-    template<> Real getPrecision<float>();
-    template<> Real getPrecision<double>();
-    template<> Real getPrecision<DoubleDouble>();
-    template<> Real getPrecision<TripleDouble>();
-    template<> Real getPrecision<QuadDouble>();
-    template<> Real getPrecision<HexDouble>();
-    template<> Real getPrecision<Fixed64>();
-    template<> Real getPrecision<Fixed128>();
-    template<> Real getPrecision<Fixed512>();
-    template<> Real getPrecision<Float128>();
-    template<> Real getPrecision<Float256>();
-    template<> Real getPrecision<Float512>();
-
     template<typename T>
     Precision getType(void);
-    template<> inline Precision getType<float>() { return Precision::FLOAT; }
-    template<> inline Precision getType<double>() { return Precision::DOUBLE; }
-    template<> inline Precision getType<DoubleDouble>() { return Precision::DOUBLE_DOUBLE; }
-    template<> inline Precision getType<TripleDouble>() { return Precision::TRIPLE_DOUBLE; }
-    template<> inline Precision getType<QuadDouble>() { return Precision::QUAD_DOUBLE; }
-    template<> inline Precision getType<HexDouble>() { return Precision::HEX_DOUBLE; }
-    template<> inline Precision getType<Fixed64>() { return Precision::FIXED64; }
-    template<> inline Precision getType<Fixed128>() { return Precision::FIXED128; }
-    template<> inline Precision getType<Fixed512>() { return Precision::FIXED512; }
-    template<> inline Precision getType<Float128>() { return Precision::FLOAT128; }
-    template<> inline Precision getType<Float256>() { return Precision::FLOAT256; }
-    template<> inline Precision getType<Float512>() { return Precision::FLOAT512; }
 
     class MandelDevice;
 }
 
-/*
-enum class mnd::GeneratorType : int
-{
-    UNSPECIFIED,
-    FLOAT,
-    FLOAT_SSE2,
-    FLOAT_AVX,
-    FLOAT_AVX_FMA,
-    FLOAT_AVX512,
-    FLOAT_NEON,
-    DOUBLE_FLOAT,
-    DOUBLE,
-    DOUBLE_SSE2,
-    DOUBLE_AVX,
-    DOUBLE_AVX_FMA,
-    DOUBLE_AVX512,
-    DOUBLE_NEON,
-    DOUBLE_DOUBLE,
-    DOUBLE_DOUBLE_AVX,
-    DOUBLE_DOUBLE_AVX_FMA,
-    DOUBLE_DOUBLE_NEON,
-    TRIPLE_DOUBLE,
-    TRIPLE_DOUBLE_AVX,
-    QUAD_DOUBLE,
-    QUAD_DOUBLE_AVX_FMA,
-    FLOAT128,
-    FLOAT256,
-    FIXED64,
-    FIXED128,
-    FIXED512
-};
-*/
-
 
 class mnd::MandelGenerator
 {

+ 1 - 1
libmandel/include/IterationFormula.h

@@ -7,7 +7,7 @@
 #include <stdexcept>
 #include <optional>
 
-#include "Types.h"
+#include "Real.h"
 
 namespace mnd
 {

+ 1 - 1
libmandel/include/IterationIR.h

@@ -7,7 +7,7 @@
 #include <any>
 
 #include "IterationFormula.h"
-#include "Types.h"
+#include "Real.h"
 #include "Arena.h"
 
 namespace mnd

+ 1 - 1
libmandel/include/MandelUtil.h

@@ -1,7 +1,7 @@
 #ifndef MANDEL_MANDELUTIL_H
 #define MANDEL_MANDELUTIL_H
 
-#include "Types.h"
+#include "Real.h"
 
 namespace mnd 
 {

+ 2 - 2
libmandel/include/NaiveIRGenerator.h

@@ -124,7 +124,7 @@ public:
 
 extern template class mnd::NaiveIRGenerator<float>;
 extern template class mnd::NaiveIRGenerator<double>;
-extern template class mnd::NaiveIRGenerator<mnd::DoubleDouble>;
-extern template class mnd::NaiveIRGenerator<mnd::QuadDouble>;
+//extern template class mnd::NaiveIRGenerator<mnd::DoubleDouble>;
+//extern template class mnd::NaiveIRGenerator<mnd::QuadDouble>;
 
 #endif // MANDEL_NAIVEIRGENERATOR_H

+ 194 - 0
libmandel/include/OctaDouble.h

@@ -0,0 +1,194 @@
+#ifndef MANDEL_OCTADOUBLE_H
+#define MANDEL_OCTADOUBLE_H
+
+#include "PolyfloatUtil.h"
+
+#ifndef _MSC_VER
+#   define likely(x)      __builtin_expect(!!(x), 1) 
+#else
+#   define likely(x)      (x)
+#endif
+
+namespace mnd
+{
+    struct OctaDouble;
+}
+
+struct mnd::OctaDouble
+{
+    double x[8];
+
+    inline OctaDouble(double val) :
+        x{ val, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
+    {}
+
+    inline OctaDouble(double a, double b, double c, double d, double e, double f, double g, double h) :
+        x{ a, b, c, d, e, f, g, h }
+    {}
+
+    double operator[]           (int i) const   { return x[i]; }
+    const double& operator[]    (int i)         { return x[i]; }
+};
+
+
+inline mnd::OctaDouble operator+(const mnd::OctaDouble& a,
+    const mnd::OctaDouble& b)
+{
+    auto[a0, a1] = mnd::pfu::twoSum(a[0], b[0]);
+    auto[b0, b1] = mnd::pfu::twoSum(a[1], b[1]);
+    auto[c0, c1] = mnd::pfu::twoSum(a[2], b[2]);
+    auto[d0, d1] = mnd::pfu::twoSum(a[3], b[3]);
+    auto[e0, e1] = mnd::pfu::twoSum(a[4], b[4]);
+    auto[f0, f1] = mnd::pfu::twoSum(a[5], b[5]);
+    auto[g0, g1] = mnd::pfu::twoSum(a[6], b[6]);
+
+    if (likely(a1 + b0 != b0)) {
+        auto t0 = a0;
+        auto [t1, p1] = mnd::pfu::twoSum(a1, b0);
+        auto [t2, p2] = mnd::pfu::threeTwoSum(b1, c0, p1);
+        auto [t3, p3] = mnd::pfu::threeTwoSum(c1, d0, p2);
+        auto [t4, p4] = mnd::pfu::threeTwoSum(d1, e0, p3);
+        auto [t5, p5] = mnd::pfu::threeTwoSum(e1, f0, p4);
+        auto [t6, p6] = mnd::pfu::threeTwoSum(f1, g0, p5);
+        auto t7 = a[7] + b[7] + g1 + p6;
+
+        auto[re0, er1] = mnd::pfu::quickTwoSum(t0, t1);
+        auto[re1, e2] = mnd::pfu::quickTwoSum(er1, t2);
+        auto[re2, e3] = mnd::pfu::quickTwoSum(e2, t3);
+        auto[re3, e4] = mnd::pfu::quickTwoSum(e3, t4);
+        auto[re4, e5] = mnd::pfu::quickTwoSum(e4, t5);
+        auto[re5, e6] = mnd::pfu::quickTwoSum(e5, t6);
+        auto[re6, re7] = mnd::pfu::quickTwoSum(e6, t7);
+
+        //return { t1, t2, t3, t4, t5, t6 };
+        return { re0, re1, re2, re3, re4, re5, re6, re7 };
+    }
+    auto t0 = a0;
+    auto [t1, p1] = mnd::pfu::twoSum(a1, b0);
+    auto [t2, p2, p3] = mnd::pfu::threeSum(b1, c0, p1);
+    auto [t3, p4, p5, p6] = mnd::pfu::fourSum(c1, d0, p2, p3);
+    auto [t4, p7, p8] = mnd::pfu::sixThreeSum(d1, e0, p4, p5, p6, 0.0);
+    auto [t5, p9, p10] = mnd::pfu::sixThreeSum(e1, f0, p7, p8, 0.0, 0.0);
+    auto [t6, p11] = mnd::pfu::fiveTwoSum(f1, g0, p9, p10, 0.0);
+    auto t7 = a[7] + b[7] + g1 + p11;
+
+    auto[re0, er1] = mnd::pfu::quickTwoSum(t0, t1);
+    auto[re1, e2] = mnd::pfu::quickTwoSum(er1, t2);
+    auto[re2, e3] = mnd::pfu::quickTwoSum(e2, t3);
+    auto[re3, e4] = mnd::pfu::quickTwoSum(e3, t4);
+    auto[re4, e5] = mnd::pfu::quickTwoSum(e4, t5);
+    auto[re5, e6] = mnd::pfu::quickTwoSum(e5, t6);
+    auto[re6, re7] = mnd::pfu::quickTwoSum(e6, t7);
+
+    //return { t1, t2, t3, t4, t5, t6 };
+    return { re0, re1, re2, re3, re4, re5, re6, re7 };
+}
+
+
+inline bool operator>(const mnd::OctaDouble& a, const mnd::OctaDouble& b)
+{
+    if (a[0] > b[0])
+        return true;
+    if (a[0] < b[0])
+        return false;
+    if (a[1] > b[1])
+        return true;
+    if (a[1] < b[1])
+        return false;
+    return a[2] > b[2];
+}
+
+
+inline mnd::OctaDouble operator-(const mnd::OctaDouble& a,
+    const mnd::OctaDouble& b)
+{
+    return a + mnd::OctaDouble{ -b[0], -b[1], -b[2], -b[3], -b[4], -b[5], -b[6], -b[7] };
+}
+
+
+inline mnd::OctaDouble operator*(const mnd::OctaDouble& a,
+    const mnd::OctaDouble& b)
+{
+    auto[p1_0, p2_0] = mnd::pfu::twoProd(a[0], b[0]);
+
+    auto[p2_1, p3_0] = mnd::pfu::twoProd(a[0], b[1]);
+    auto[p2_2, p3_1] = mnd::pfu::twoProd(a[1], b[0]);
+
+    auto[p3_2, p4_0] = mnd::pfu::twoProd(a[2], b[0]);
+    auto[p3_3, p4_1] = mnd::pfu::twoProd(a[1], b[1]);
+    auto[p3_4, p4_2] = mnd::pfu::twoProd(a[0], b[2]);
+
+    auto[p4_3, p5_0] = mnd::pfu::twoProd(a[3], b[0]);
+    auto[p4_4, p5_1] = mnd::pfu::twoProd(a[2], b[1]);
+    auto[p4_5, p5_2] = mnd::pfu::twoProd(a[1], b[2]);
+    auto[p4_6, p5_3] = mnd::pfu::twoProd(a[0], b[3]);
+
+    auto[p5_4, p6_0] = mnd::pfu::twoProd(a[4], b[0]);
+    auto[p5_5, p6_1] = mnd::pfu::twoProd(a[3], b[1]);
+    auto[p5_6, p6_2] = mnd::pfu::twoProd(a[2], b[2]);
+    auto[p5_7, p6_3] = mnd::pfu::twoProd(a[1], b[3]);
+    auto[p5_8, p6_4] = mnd::pfu::twoProd(a[0], b[4]);
+
+    auto[p6_5, p7_0] = mnd::pfu::twoProd(a[5], b[0]);
+    auto[p6_6, p7_1] = mnd::pfu::twoProd(a[4], b[1]);
+    auto[p6_7, p7_2] = mnd::pfu::twoProd(a[3], b[2]);
+    auto[p6_8, p7_3] = mnd::pfu::twoProd(a[2], b[3]);
+    auto[p6_9, p7_4] = mnd::pfu::twoProd(a[1], b[4]);
+    auto[p6_10, p7_5] = mnd::pfu::twoProd(a[0], b[5]);
+
+    auto[p7_6, p8_0] = mnd::pfu::twoProd(a[6], b[0]);
+    auto[p7_7, p8_1] = mnd::pfu::twoProd(a[5], b[1]);
+    auto[p7_8, p8_2] = mnd::pfu::twoProd(a[4], b[2]);
+    auto[p7_9, p8_3] = mnd::pfu::twoProd(a[3], b[3]);
+    auto[p7_10, p8_4] = mnd::pfu::twoProd(a[2], b[4]);
+    auto[p7_11, p8_5] = mnd::pfu::twoProd(a[1], b[5]);
+    auto[p7_12, p8_6] = mnd::pfu::twoProd(a[0], b[6]);
+
+    auto t1 = p1_0;
+    auto[t2, tl3, tl4] = mnd::pfu::threeSum(p2_0, p2_1, p2_2);
+    auto[t3, tl4_2, tl5] = mnd::pfu::sixThreeSum(p3_0, p3_1, p3_2, p3_3, p3_4, tl3);
+    auto[t4, tl5_2, tl6] = mnd::pfu::nineThreeSum(p4_0, p4_1, p4_2, p4_3, p4_4, p4_5, p4_6, tl4, tl4_2);
+    auto[x1, x2, x3] = mnd::pfu::nineThreeSum(p5_0, p5_1, p5_2, p5_3, p5_4, p5_5, p5_6, p5_7, p5_8);
+    auto[t5, tl6_1, tl7] = mnd::pfu::sixThreeSum(x1, x2, x3, tl5, tl5_2, 0.0);
+    auto[x4, x5, x6] = mnd::pfu::nineThreeSum(p6_0, p6_1, p6_2, p6_3, p6_4, p6_5, p6_6, p6_7, p6_8);
+    auto[t6, tl7_1, tl8] = mnd::pfu::nineThreeSum(x4, x5, x6, tl6, tl6_1, p6_9, p6_10, 0.0, 0.0);
+    auto[x7, x8, x9] = mnd::pfu::nineThreeSum(p7_0, p7_1, p7_2, p7_3, p7_4, p7_5, p7_6, p7_7, p7_8);
+    auto[t7, tl8_1, tl9] = mnd::pfu::nineThreeSum(x7, x8, x9, tl7, tl7_1, p7_9, p7_10, p7_11, p7_12);
+
+    auto t8 = tl8 + tl8_1 + tl9 + p8_0 + p8_1 + p8_2 + p8_3 + p8_4 + p8_5 + p8_6 +
+        a[7] * b[0] + a[6] * b[1] + a[5] * b[2] + a[5] * b[3] +
+        a[3] * b[4] + a[2] * b[5] + a[1] * b[6] + a[0] * b[7];
+
+    auto[re0, e1] = mnd::pfu::quickTwoSum(t1, t2);
+    auto[re1, e2] = mnd::pfu::quickTwoSum(e1, t3);
+    auto[re2, e3] = mnd::pfu::quickTwoSum(e2, t4);
+    auto[re3, e4] = mnd::pfu::quickTwoSum(e3, t5);
+    auto[re4, e5] = mnd::pfu::quickTwoSum(e4, t6);
+    auto[re5, e6] = mnd::pfu::quickTwoSum(e5, t7);
+    auto[re6, re7] = mnd::pfu::quickTwoSum(e6, t8);
+
+    return { re0, re1, re2, re3, re4, re5, re6, re7 };
+
+    /*double r[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+    for (int i = 0; i < 8; i++) {
+#pragma GCC unroll(8)
+        for (int j = 0; i + j < 8; j++) {
+            auto[s, e] = mnd::pfu::twoProd(a[i], b[j]);
+
+#pragma GCC unroll(8)
+            for (int k = 0; k < 8; k++) {
+                auto[x1, x2, x3] = mnd::pfu::threeSum(r[k], s, e);
+                r[k] = x1;
+                s = x2;
+                e = x3;
+            }
+        }
+    }
+
+    return mnd::OctaDouble{ r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7] };
+    */
+}
+
+
+#endif // MANDEL_OCTADOUBLE_H
+

+ 3 - 1
libmandel/include/OpenClCode.h

@@ -7,11 +7,13 @@ namespace mnd
 {
     std::string getFloat_cl();
     std::string getDouble_cl();
-    std::string getDoubleFloat_cl();
     std::string getDoubleDouble_cl();
+    std::string getDoubleFloat_cl();
     std::string getTripleDouble_cl();
+    std::string getTripleFloat_cl();
     std::string getQuadDouble_cl();
     std::string getHexDouble_cl();
+    std::string getOctaDouble_cl();
     std::string getFixed64_cl();
     std::string getFixed128_cl();
     std::string getFixed512_cl();

+ 9 - 0
libmandel/include/PolyfloatUtil.h

@@ -123,6 +123,15 @@ namespace mnd
             return { ahi, alo };
         }
 
+        inline Pair<float> split(float a)
+        {
+            static const float splitter = float((1ULL << 12) + 1);
+            float t = splitter * a;
+            float ahi = t - (t - a);
+            float alo = a - ahi;
+            return { ahi, alo };
+        }
+
         template<typename T>
         inline Pair<T> twoProd(T a, T b)
         {

+ 34 - 0
libmandel/include/Real.h

@@ -0,0 +1,34 @@
+#ifndef MANDEL_REAL_H
+#define MANDEL_REAL_H
+
+#include <boost/multiprecision/cpp_bin_float.hpp>
+#include <boost/multiprecision/cpp_int.hpp>
+
+namespace mnd
+{
+    using Float512 = boost::multiprecision::number<
+        boost::multiprecision::backends::cpp_bin_float<
+            496, boost::multiprecision::backends::digit_base_2, void, boost::int16_t, -16382, 16383>,
+            boost::multiprecision::et_off>;
+
+    using Real = Float512;
+    using Integer = boost::multiprecision::int512_t;
+
+    inline Real abs(const Real& x) { return boost::multiprecision::abs(x); }
+    inline Real sqrt(const Real& x) { return boost::multiprecision::sqrt(x); }
+    inline Real floor(const Real& x) { return boost::multiprecision::floor(x); }
+    inline Real log(const Real& x) { return boost::multiprecision::log(x); }
+    inline Real log2(const Real& x) { return boost::multiprecision::log2(x); }
+    inline Real pow(const Real& x, const Real& y) { return boost::multiprecision::pow(x, y); }
+    inline Real atan2(const Real& y, const Real& x) { return boost::multiprecision::atan2(y, x); }
+    inline Real cos(const Real& x) { return boost::multiprecision::cos(x); }
+    inline Real sin(const Real& x) { return boost::multiprecision::sin(x); }
+    inline Real exp(const Real& x) { return boost::multiprecision::exp(x); }
+
+    std::string toString(const Real& num);
+    std::string toLegibleString(const Real& num);
+}
+
+
+#endif // MANDEL_REAL_H
+

+ 85 - 0
libmandel/include/TripleFloat.h

@@ -0,0 +1,85 @@
+#ifndef MANDEL_TRIPLEFLOAT_H
+#define MANDEL_TRIPLEFLOAT_H
+
+#include "PolyfloatUtil.h"
+
+namespace mnd
+{
+    struct TripleFloat;
+}
+
+struct mnd::TripleFloat
+{
+    float x[3];
+
+    inline TripleFloat(float val) :
+        x{ val, 0.0, 0.0 }
+    {}
+
+    inline TripleFloat(float a, float b, float c) :
+        x{ a, b, c }
+    {}
+
+    float operator[]           (int i) const   { return x[i]; }
+    const float& operator[]    (int i)         { return x[i]; }
+};
+
+
+inline mnd::TripleFloat operator+(const mnd::TripleFloat& a,
+    const mnd::TripleFloat& b)
+{
+    auto[r0, t0] = mnd::pfu::twoSum(a[0], b[0]);
+    auto[t1, t2] = mnd::pfu::twoSum(a[1], b[1]);
+    auto[r1, t3] = mnd::pfu::twoSum(t0, t1);
+    auto r2 = t2 + t3 + a[2] + b[2];
+
+    auto[re1, t4] = mnd::pfu::quickTwoSum(r0, r1);
+    auto[re2, re3] = mnd::pfu::quickTwoSum(t4, r2);
+    return { re1, re2, re3 };
+}
+
+
+inline bool operator>(const mnd::TripleFloat& a, const mnd::TripleFloat& b)
+{
+    if (a[0] > b[0])
+        return true;
+    if (a[0] < b[0])
+        return false;
+    if (a[1] > b[1])
+        return true;
+    if (a[1] < b[1])
+        return false;
+    return a[2] > b[2];
+}
+
+inline mnd::TripleFloat operator-(const mnd::TripleFloat& a,
+    const mnd::TripleFloat& b)
+{
+    auto[r0, t0] = mnd::pfu::twoSum(a[0], -b[0]);
+    auto[t1, t2] = mnd::pfu::twoSum(a[1], -b[1]);
+    auto[r1, t3] = mnd::pfu::twoSum(t0, t1);
+    auto r2 = t2 + t3 + a[2] - b[2];
+
+    auto[re1, t4] = mnd::pfu::quickTwoSum(r0, r1);
+    auto[re2, re3] = mnd::pfu::quickTwoSum(t4, r2);
+    return { re1, re2, re3 };
+}
+
+
+inline mnd::TripleFloat operator*(const mnd::TripleFloat& a,
+    const mnd::TripleFloat& b)
+{
+    auto[p1_0, p2_0] = mnd::pfu::twoProd(a[0], b[0]);
+    auto[p2_1, p3_0] = mnd::pfu::twoProd(a[0], b[1]);
+    auto[p2_2, p3_1] = mnd::pfu::twoProd(a[1], b[0]);
+
+    auto[t2, tl3] = mnd::pfu::threeTwoSum(p2_0, p2_1, p2_2);
+    auto t3 = tl3 + p3_0 + p3_1 + a[1] * b[1] + a[2] * b[0] + a[0] * b[2];
+    auto[re0, q2] = mnd::pfu::quickTwoSum(p1_0, t2);
+    auto[re1, re2] = mnd::pfu::quickTwoSum(q2, t3);
+    return { re0, re1, re2 };
+}
+
+
+#endif // MANDEL_TRIPLEFLOAT_H
+

+ 55 - 38
libmandel/include/Types.h

@@ -1,6 +1,8 @@
 #ifndef MANDEL_TYPES_H
 #define MANDEL_TYPES_H
 
+#include "Real.h"
+
 #include <cinttypes>
 #include <cmath>
 #include <string>
@@ -24,7 +26,9 @@
 
 #include "LightDoubleDouble.h"
 #include "TripleDouble.h"
+#include "TripleFloat.h"
 #include "HexDouble.h"
+#include "OctaDouble.h"
 
 namespace mnd
 {
@@ -67,46 +71,8 @@ namespace mnd
     inline Float256 sin(const Float256& x) { return boost::multiprecision::sin(x); }
     inline Float256 exp(const Float256& x) { return boost::multiprecision::exp(x); }
 
-    using Float512 = boost::multiprecision::number<
-        boost::multiprecision::backends::cpp_bin_float<
-            496, boost::multiprecision::backends::digit_base_2, void, boost::int16_t, -16382, 16383>,
-            boost::multiprecision::et_off>;
-
-    inline Float512 abs(const Float512& x) { return boost::multiprecision::abs(x); }
-    inline Float512 sqrt(const Float512& x) { return boost::multiprecision::sqrt(x); }
-    inline Float512 floor(const Float512& x) { return boost::multiprecision::floor(x); }
-    inline Float512 log(const Float512& x) { return boost::multiprecision::log(x); }
-    inline Float512 log2(const Float512& x) { return boost::multiprecision::log2(x); }
-    inline Float512 pow(const Float512& x, const Float512& y) { return boost::multiprecision::pow(x, y); }
-    inline Float512 atan2(const Float512& y, const Float512& x) { return boost::multiprecision::atan2(y, x); }
-    inline Float512 cos(const Float512& x) { return boost::multiprecision::cos(x); }
-    inline Float512 sin(const Float512& x) { return boost::multiprecision::sin(x); }
-    inline Float512 exp(const Float512& x) { return boost::multiprecision::exp(x); }
-
-    using Real = Float512;
-    using Integer = boost::multiprecision::int512_t;
-    /*boost::multiprecision::number<
-        boost::multiprecision::backends::cpp_bin_float<
-            1500, boost::multiprecision::backends::digit_base_2, void, boost::int16_t, -16382, 16383>,
-            boost::multiprecision::et_off>;
-
-    inline Real abs(const Real& x) { return boost::multiprecision::abs(x); }
-    inline Real sqrt(const Real& x) { return boost::multiprecision::sqrt(x); }
-    inline Real floor(const Real& x) { return boost::multiprecision::floor(x); }
-    inline Real log(const Real& x) { return boost::multiprecision::log(x); }
-    inline Real log2(const Real& x) { return boost::multiprecision::log2(x); }
-    inline Real pow(const Real& x, const Real& y) { return boost::multiprecision::pow(x, y); }
-    inline Real atan2(const Real& y, const Real& x) { return boost::multiprecision::atan2(y, x); }
-    inline Real cos(const Real& x) { return boost::multiprecision::cos(x); }
-    inline Real sin(const Real& x) { return boost::multiprecision::sin(x); }
-    inline Real exp(const Real& x) { return boost::multiprecision::exp(x); }
-*/
-#else
-    using Real = double;
-    using Integer = int64_t;
 #endif
 
-
     using DoubleDouble = dd_real;
     using QuadDouble = qd_real;
 
@@ -162,6 +128,23 @@ namespace mnd
     }
 
 #if defined(WITH_BOOST)
+
+    template<>
+    inline TripleFloat convert<TripleFloat, Real>(const Real& x)
+    {
+        float s = static_cast<float>(x);
+        Real t = x - s;
+        float e1 = static_cast<float>(t);
+        float e2 = static_cast<float>(t - e1);
+        return TripleFloat{ s, e1, e2 };
+    }
+
+    template<>
+    inline Real convert<Real, TripleFloat>(const TripleFloat& x)
+    {
+        return Real{ x[0] } + x[1] + x[2];
+    }
+    
     template<>
     inline DoubleDouble convert<DoubleDouble, Real>(const Real& x)
     {
@@ -268,6 +251,39 @@ namespace mnd
     }
 
     template<>
+    inline Real convert<Real, OctaDouble>(const OctaDouble& x)
+    {
+        return Real{ x[0] } + x[1] + x[2] + x[3] + x[4] + x[5] + x[6] + x[7];
+    }
+
+    template<>
+    inline OctaDouble convert<OctaDouble, Real>(const Real& x)
+    {
+        double s = static_cast<double>(x);
+        Real tmp = x - s;
+        double e1 = static_cast<double>(tmp);
+        tmp = tmp - e1;
+        double e2 = static_cast<double>(tmp);
+        tmp = tmp - e2;
+        double e3 = static_cast<double>(tmp);
+        tmp = tmp - e3;
+        double e4 = static_cast<double>(tmp);
+        tmp = tmp - e4;
+        double e5 = static_cast<double>(tmp);
+        tmp = tmp - e5;
+        double e6 = static_cast<double>(tmp);
+        tmp = tmp - e6;
+        double e7 = static_cast<double>(tmp);
+        return OctaDouble{ s, e1, e2, e3, e4, e5, e6, e7 };
+    }
+
+    template<>
+    inline float convert<float, OctaDouble>(const OctaDouble& x)
+    {
+        return float(x.x[0] + x.x[1]);
+    }
+
+    template<>
     inline float convert<float, Fixed512>(const Fixed512& x)
     {
         return float(Real(x));
@@ -301,3 +317,4 @@ namespace mnd
 
 
 #endif // MANDEL_TYPES_H
+

+ 111 - 52
libmandel/src/ClGenerators.cpp

@@ -1,4 +1,5 @@
 #include "ClGenerators.h"
+#include "Types.h"
 #include "Mandel.h"
 #include "OpenClInternal.h"
 #include "OpenClCode.h"
@@ -17,11 +18,13 @@ using namespace cl;
 using mnd::ClGenerator;
 using mnd::ClGeneratorFloat;
 using mnd::ClGeneratorDoubleFloat;
+using mnd::ClGeneratorTripleFloat;
 using mnd::ClGeneratorDouble;
 using mnd::ClGeneratorDoubleDouble;
 using mnd::ClGeneratorTripleDouble;
 using mnd::ClGeneratorQuadDouble;
 using mnd::ClGeneratorHexDouble;
+using mnd::ClGeneratorOctaDouble;
 using mnd::ClGenerator128;
 using mnd::ClGenerator64;
 
@@ -196,57 +199,6 @@ ClGeneratorDoubleFloat::ClGeneratorDoubleFloat(mnd::MandelDevice& device) :
 }
 
 
-std::pair<float, float> twoSum(float a, float b) {
-    float s = a + b;
-    float v = s - a;
-    float r = (a - (s - v)) + (b - v);
-    return { s, r };
-}
-
-std::pair<float, float> split(float a) {
-    float c = (4096 + 1) * a;
-    float abig = c - a;
-    float ahi = c - abig;
-    float alo = a - ahi;
-    return { ahi, alo };
-}
-
-std::pair<float, float> twoProd(float a, float b) {
-    float x = a * b;
-    auto aex = split(a);
-    auto bex = split(b);
-    float errx = x - (aex.first * bex.first);
-    float erry = errx - (aex.second * bex.first);
-    float errz = erry - (aex.first * bex.second);
-    float y = (aex.second * bex.second) - errz;
-    return { x, y };
-}
-
-std::pair<float, float> add(std::pair<float, float> a, std::pair<float, float> b) {
-    float r = a.first + b.first;
-    float s;
-    if (fabs(a.first) >= fabs(b.first)) {
-        s = (((a.first - r) + b.first) + b.second) + a.second;
-    }
-    else {
-        s = (((b.first - r) + a.first) + a.second) + b.second;
-    }
-    return twoSum(r, s);
-}
-
-std::pair<float, float> mul(std::pair<float, float> a, std::pair<float, float> b) {
-    auto t = twoProd(a.first, b.first);
-    t.second += ((a.first * b.second) + (a.second * b.first));
-    return twoSum(t.first, t.second);
-}
-
-std::pair<float, float> mulFloat(std::pair<float, float> a, float b) {
-    std::pair<float, float> t = twoProd(a.first, b);
-    float t3 = (a.second * b) + t.second;
-    return twoSum(t.first, t.second);
-}
-
-
 void ClGeneratorDoubleFloat::generate(const mnd::MandelInfo& info, float* data)
 {
     ::size_t bufferSize = info.bWidth * info.bHeight * sizeof(float);
@@ -289,6 +241,61 @@ std::string ClGeneratorDoubleFloat::getKernelCode(bool smooth) const
 }
 
 
+ClGeneratorTripleFloat::ClGeneratorTripleFloat(mnd::MandelDevice& device) :
+    ClGenerator{ device, this->getKernelCode(false), mnd::Precision::TRIPLE_FLOAT  }
+{
+    kernel = Kernel(program, "iterate");
+}
+
+
+void ClGeneratorTripleFloat::generate(const mnd::MandelInfo& info, float* data)
+{
+    ::size_t bufferSize = info.bWidth * info.bHeight * sizeof(float);
+
+    Buffer buffer_A(context, CL_MEM_WRITE_ONLY, bufferSize);
+    mnd::TripleFloat pixelScX = mnd::convert<mnd::TripleFloat>(info.view.width / info.bWidth);
+    mnd::TripleFloat pixelScY = mnd::convert<mnd::TripleFloat>(info.view.height / info.bHeight);
+
+    mnd::TripleFloat x = mnd::convert<mnd::TripleFloat>(info.view.x);
+    mnd::TripleFloat y = mnd::convert<mnd::TripleFloat>(info.view.y);
+    mnd::TripleFloat jx = mnd::convert<mnd::TripleFloat>(info.juliaX);
+    mnd::TripleFloat jy = mnd::convert<mnd::TripleFloat>(info.juliaY);
+
+    kernel.setArg(0, buffer_A);
+    kernel.setArg(1, int(info.bWidth));
+    kernel.setArg(2, x[0]);
+    kernel.setArg(3, x[1]);
+    kernel.setArg(4, x[2]);
+    kernel.setArg(5, y[0]);
+    kernel.setArg(6, y[1]);
+    kernel.setArg(7, y[2]);
+    kernel.setArg(8, pixelScX[0]);
+    kernel.setArg(9, pixelScX[1]);
+    kernel.setArg(10, pixelScX[2]);
+    kernel.setArg(11, pixelScY[0]);
+    kernel.setArg(12, pixelScY[1]);
+    kernel.setArg(13, pixelScY[2]);
+    kernel.setArg(14, int(info.maxIter));
+    kernel.setArg(15, int(info.smooth ? 1 : 0));
+    kernel.setArg(16, int(info.julia ? 1 : 0));
+    kernel.setArg(17, jx[0]);
+    kernel.setArg(18, jx[1]);
+    kernel.setArg(19, jx[2]);
+    kernel.setArg(20, jy[0]);
+    kernel.setArg(21, jy[1]);
+    kernel.setArg(22, jy[2]);
+
+    cl_int result = queue.enqueueNDRangeKernel(kernel, 0, NDRange(info.bWidth * info.bHeight));
+    queue.enqueueReadBuffer(buffer_A, CL_TRUE, 0, bufferSize, data);
+}
+
+
+std::string ClGeneratorTripleFloat::getKernelCode(bool smooth) const
+{
+    return getTripleFloat_cl();
+}
+
+
 ClGeneratorDouble::ClGeneratorDouble(mnd::MandelDevice& device, const std::string& source) :
     ClGenerator{ device, source, mnd::Precision::DOUBLE }
 {
@@ -554,7 +561,6 @@ void ClGeneratorHexDouble::generate(const mnd::MandelInfo& info, float* data)
     mnd::HexDouble jx = mnd::convert<mnd::HexDouble>(info.juliaX);
     mnd::HexDouble jy = mnd::convert<mnd::HexDouble>(info.juliaY);
 
-    double vals[] = {250, 250, 250, 250, 250, 250 };
     const size_t argBufSize = 6 * sizeof(double);
     Buffer xbuf(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, argBufSize, x.x);
     Buffer ybuf(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, argBufSize, y.x);
@@ -587,6 +593,59 @@ std::string ClGeneratorHexDouble::getKernelCode(bool smooth) const
 }
 
 
+ClGeneratorOctaDouble::ClGeneratorOctaDouble(mnd::MandelDevice& device) :
+    ClGenerator{ device, getOctaDouble_cl(), mnd::Precision::OCTA_DOUBLE }
+{
+    kernel = Kernel(program, "iterate");
+}
+
+
+void ClGeneratorOctaDouble::generate(const mnd::MandelInfo& info, float* data)
+{
+    ::size_t bufferSize = info.bWidth * info.bHeight * sizeof(float);
+
+    Buffer buffer_A(context, CL_MEM_WRITE_ONLY, bufferSize);
+
+    mnd::OctaDouble x = mnd::convert<mnd::OctaDouble>(info.view.x);
+    mnd::OctaDouble y = mnd::convert<mnd::OctaDouble>(info.view.y);
+
+    mnd::OctaDouble psx = mnd::convert<mnd::OctaDouble>(info.view.width / info.bWidth);
+    mnd::OctaDouble psy = mnd::convert<mnd::OctaDouble>(info.view.height / info.bHeight);
+
+    mnd::OctaDouble jx = mnd::convert<mnd::OctaDouble>(info.juliaX);
+    mnd::OctaDouble jy = mnd::convert<mnd::OctaDouble>(info.juliaY);
+
+    const size_t argBufSize = 8 * sizeof(double);
+    Buffer xbuf(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, argBufSize, x.x);
+    Buffer ybuf(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, argBufSize, y.x);
+    Buffer psxbuf(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, argBufSize, psx.x);
+    Buffer psybuf(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, argBufSize, psy.x);
+    Buffer jxbuf(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, argBufSize, jx.x);
+    Buffer jybuf(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, argBufSize);
+
+    kernel.setArg(0, buffer_A);
+    kernel.setArg(1, int(info.bWidth));
+    kernel.setArg(2, xbuf);
+    kernel.setArg(3, ybuf);
+    kernel.setArg(4, psxbuf);
+    kernel.setArg(5, psybuf);
+    kernel.setArg(6, int(info.maxIter));
+    kernel.setArg(7, int(info.smooth ? 1 : 0));
+    kernel.setArg(8, int(info.julia ? 1 : 0));
+    kernel.setArg(9, jxbuf);
+    kernel.setArg(10, jybuf);
+
+    cl_int result = queue.enqueueNDRangeKernel(kernel, 0, NDRange(info.bWidth * info.bHeight));
+    queue.enqueueReadBuffer(buffer_A, CL_TRUE, 0, bufferSize, data);
+
+}
+
+
+std::string ClGeneratorOctaDouble::getKernelCode(bool smooth) const
+{
+    return getOctaDouble_cl();
+}
+
 ClGenerator128::ClGenerator128(mnd::MandelDevice& device) :
     ClGenerator{ device, getFixed512_cl(), mnd::Precision::FIXED128 }
 {

+ 6 - 0
libmandel/src/CpuGenerators.cpp

@@ -40,6 +40,9 @@ namespace mnd
     template class CpuGenerator<mnd::Float256, mnd::NONE, false>;
     template class CpuGenerator<mnd::Float256, mnd::NONE, true>;
 
+    template class CpuGenerator<mnd::Float512, mnd::NONE, false>;
+    template class CpuGenerator<mnd::Float512, mnd::NONE, true>;
+
     template class CpuGenerator<Fixed512, mnd::NONE, false>;
     template class CpuGenerator<Fixed512, mnd::NONE, true>;
 #endif
@@ -56,6 +59,9 @@ namespace mnd
 
     template class CpuGenerator<mnd::HexDouble, mnd::NONE, false>;
     template class CpuGenerator<mnd::HexDouble, mnd::NONE, true>;
+
+    template class CpuGenerator<mnd::OctaDouble, mnd::NONE, false>;
+    template class CpuGenerator<mnd::OctaDouble, mnd::NONE, true>;
 #endif
 }
 

+ 67 - 7
libmandel/src/CpuGeneratorsAVX.cpp

@@ -363,6 +363,24 @@ static inline VecPair twoProd(__m256d a, __m256d b)
     return { p, err };
 }
 
+static inline VecPair twoSq(__m256d a)
+{
+    __m256d p = _mm256_mul_pd(a, a);
+    auto[a_hi, a_lo] = split(a);
+    __m256d err =
+        _mm256_add_pd(
+            _mm256_add_pd(
+                _mm256_sub_pd(_mm256_mul_pd(a_hi, a_hi), p),
+                _mm256_add_pd(
+                    _mm256_mul_pd(a_hi, a_lo),
+                    _mm256_mul_pd(a_hi, a_lo)
+                )
+            ),
+        _mm256_mul_pd(a_lo, a_lo)
+        );
+    return { p, err };
+}
+
 
 struct AvxDoubleDouble
 {
@@ -402,6 +420,20 @@ struct AvxDoubleDouble
         auto[r1, r2] = quickTwoSum(p1, p2);
         return AvxDoubleDouble{ r1, r2 };
     }
+
+    inline AvxDoubleDouble sq(void) const
+    {
+        auto[p1, p2] = twoSq(x[0]);
+        __m256d x01_2 = _mm256_mul_pd(_mm256_add_pd(x[0], x[0]), x[1]);
+        p2 = _mm256_add_pd(p2, x01_2);
+        auto[r1, r2] = quickTwoSum(p1, p2);
+        return AvxDoubleDouble{ r1, r2 };
+    }
+
+    inline AvxDoubleDouble twice(void) const
+    {
+        return AvxDoubleDouble{ _mm256_add_pd(x[0], x[0]), _mm256_add_pd(x[1], x[1]) };
+    }
 };
 
 
@@ -467,6 +499,34 @@ struct AvxTripleDouble
         auto[re1, re2] = quickTwoSum(q2, t3);
         return { re0, re1, re2 };
     }
+
+    inline AvxTripleDouble sq(void) const
+    {
+        auto twox0 = _mm256_add_pd(x[0], x[0]);
+        auto[p1_0, p2_0] = twoProd(x[0], x[0]);
+        auto[p2_1, p3_0] = twoProd(twox0, x[1]);
+
+        auto[t2, tl3] = twoSum(p2_0, p2_1);
+        auto t3 =
+            _mm256_add_pd(
+                tl3,
+                _mm256_add_pd(
+                    p3_0,
+                    _mm256_add_pd(
+                        _mm256_mul_pd(x[1], x[1]),
+                        _mm256_mul_pd(x[2], twox0)
+                    )
+                )
+            );
+        auto[re0, q2] = quickTwoSum(p1_0, t2);
+        auto[re1, re2] = quickTwoSum(q2, t3);
+        return { re0, re1, re2 };
+    }
+
+    inline AvxTripleDouble twice(void) const
+    {
+        return AvxTripleDouble{ _mm256_add_pd(x[0], x[0]), _mm256_add_pd(x[1], x[1]), _mm256_add_pd(x[2], x[2]) };
+    }
 };
 
 } // namespace avx_private
@@ -530,9 +590,9 @@ void generateDoubleDoubleAvx(long width, long height, float* data, bool parallel
 
             __m256d cmp = _mm256_cmp_pd(threshold, threshold, _CMP_LE_OQ);
             for (int k = 0; k < maxIter; k++) {
-                AvxDoubleDouble aa = a * a;
-                AvxDoubleDouble bb = b * b;
-                AvxDoubleDouble abab = a * b; abab = abab + abab;
+                AvxDoubleDouble aa = a.sq();
+                AvxDoubleDouble bb = b.sq();
+                AvxDoubleDouble abab = a * b.twice();
                 a = aa - bb + cx;
                 b = abab + cy;
                 if (smooth) {
@@ -627,9 +687,9 @@ void generateTripleDoubleAvx(long width, long height, float* data, bool parallel
 
             __m256d cmp = _mm256_cmp_pd(threshold, threshold, _CMP_LE_OQ);
             for (int k = 0; k < maxIter; k++) {
-                AvxTripleDouble aa = a * a;
-                AvxTripleDouble bb = b * b;
-                AvxTripleDouble abab = a * b; abab = abab + abab;
+                AvxTripleDouble aa = a.sq();
+                AvxTripleDouble bb = b.sq();
+                AvxTripleDouble abab = a * b.twice();
                 a = aa - bb + cx;
                 b = abab + cy;
                 if (smooth) {
@@ -654,7 +714,7 @@ void generateTripleDoubleAvx(long width, long height, float* data, bool parallel
                 if (smooth)
                     data[i + k + j * width] = float(ftRes[k] < 0 ? maxIter :
                         ftRes[k] >= maxIter ? maxIter :
-                        ((float)ftRes[k]) + 1 - floatLog2(::floatLog(float(resa[k] * resa[k] + resb[k] * resb[k])) / 2));
+                        ((float)ftRes[k]) + 1 - floatLog2(::floatLog(float(resa[k] * resa[k] + resb[k] * resb[k])) * 0.5f));
                 else
                     data[i + k + j * width] = ftRes[k] >= 0 ? float(ftRes[k]) : maxIter;
             }

+ 99 - 10
libmandel/src/CpuGeneratorsAVXFMA.cpp

@@ -417,6 +417,21 @@ static inline VecTriple sixThreeSum(__m256d a, __m256d b, __m256d c,
     return { r0, r1, r2 };
 }
 
+static inline VecPair sixTwoSum(__m256d a, __m256d b, __m256d c,
+                                    __m256d d, __m256d e, __m256d f)
+{
+    auto[x0, x1, x2] = threeSum(a, b, c);
+    auto[y0, y1, y2] = threeSum(d, e, f);
+
+    auto[r0, t0] = twoSum(x0, y0);
+    auto[t1, t2] = twoSum(x1, y1);
+    auto[r1, t3] = twoSum(t0, t1);
+    r1 = _mm256_add_pd(r1, _mm256_add_pd(x2, y2));
+    r1 = _mm256_add_pd(r1, t3);
+
+    return { r0, r1 };
+}
+
 static inline VecPair addDD(const VecPair& a, const VecPair& b)
 {
     auto[s, e] = twoSum(a.a, b.a);
@@ -470,6 +485,34 @@ static inline VecQuadruple renormalize(__m256d x0, __m256d x1, __m256d x2, __m25
     return { b[0], b[1], b[2], b[3] };
 }
 
+
+static inline VecQuadruple renorm1(__m256d x0, __m256d x1, __m256d x2, __m256d x3, __m256d x4)
+{
+    auto [r0, t0] = quickTwoSum(x0, x1);
+    auto [r1, t1] = quickTwoSum(t0, x2);
+    auto [r2, t2] = quickTwoSum(t1, x3);
+    auto r3 = _mm256_add_pd(t2, x4);
+
+    return { r0, r1, r2, r3 };
+}
+
+
+static inline VecQuadruple renorm2(__m256d x0, __m256d x1, __m256d x2, __m256d x3, __m256d x4)
+{
+    auto [st1, t4] = quickTwoSum(x3, x4);
+    auto [st2, t3] = quickTwoSum(x2, st1);
+    auto [st3, t2] = quickTwoSum(x1, st2);
+    auto [t0, t1] = quickTwoSum(x0, st3);
+
+    __m256d e = t0;
+
+    auto [r0, e1] = quickTwoSum(e, t1);
+    auto [r1, e2] = quickTwoSum(e1, t2);
+    auto [r2, e3] = quickTwoSum(e2, t3);
+    auto r3 = _mm256_add_pd(e3, t4);
+    return { r0, r1, r2, r3 };
+}
+
 static inline VecPair twoProd(__m256d a, __m256d b)
 {
     __m256d p = _mm256_mul_pd(a, b);
@@ -515,6 +558,21 @@ struct AvxDoubleDouble
         auto[r1, r2] = quickTwoSum(p1, p2);
         return AvxDoubleDouble{ r1, r2 };
     }
+
+    inline AvxDoubleDouble sq(void) const
+    {
+        auto[p1, p2] = twoProd(x[0], x[0]);
+        __m256d x01 = _mm256_mul_pd(x[1], x[0]);
+        p2 = _mm256_add_pd(p2, _mm256_add_pd(x01, x01));
+        auto[r1, r2] = quickTwoSum(p1, p2);
+        return AvxDoubleDouble{ r1, r2 };
+    }
+
+    inline AvxDoubleDouble mul_pow2(double v) const
+    {
+        __m256d vv = _mm256_set1_pd(v);
+        return { _mm256_mul_pd(vv, x[0]), _mm256_mul_pd(vv, x[1]) };
+    }
 };
 
 
@@ -580,9 +638,9 @@ void CpuGenerator<mnd::DoubleDouble, mnd::X86_AVX_FMA, parallel>::generate(const
 
             __m256d cmp = _mm256_cmp_pd(threshold, threshold, _CMP_LE_OQ);
             for (int k = 0; k < info.maxIter; k++) {
-                AvxDoubleDouble aa = a * a;
-                AvxDoubleDouble bb = b * b;
-                AvxDoubleDouble abab = a * b; abab = abab + abab;
+                AvxDoubleDouble aa = a.sq();
+                AvxDoubleDouble bb = b.sq();
+                AvxDoubleDouble abab = a * b.mul_pow2(2.0);
                 a = aa - bb + cx;
                 b = abab + cy;
                 if (info.smooth) {
@@ -592,7 +650,7 @@ void CpuGenerator<mnd::DoubleDouble, mnd::X86_AVX_FMA, parallel>::generate(const
                 cmp = _mm256_cmp_pd(_mm256_add_pd(aa.x[0], bb.x[0]), threshold, _CMP_LE_OQ);
                 adder = _mm256_and_pd(adder, cmp);
                 counter = _mm256_add_pd(counter, adder);
-                if (_mm256_testz_si256(_mm256_castpd_si256(cmp), _mm256_castpd_si256(cmp)) != 0) {
+                if ((k & 0x7) && _mm256_testz_si256(_mm256_castpd_si256(cmp), _mm256_castpd_si256(cmp)) != 0) {
                     break;
                 }
             }
@@ -648,7 +706,7 @@ struct AvxQuadDouble
         auto [r3, t3, _t4] = threeSum(s3, e2, t1);
         auto [r4, _t5, _t6] = threeSum(e3, t3, t2);
 
-        auto [re0, re1, re2, re3] = renormalize(r0, r1, r2, r3, r4);
+        auto [re0, re1, re2, re3] = renorm1(r0, r1, r2, r3, r4);
         return { re0, re1, re2, re3 };
     }
 
@@ -665,7 +723,7 @@ struct AvxQuadDouble
         auto [r3, t3, _t4] = threeSum(s3, e2, t1);
         auto [r4, _t5, _t6] = threeSum(e3, t3, t2);
 
-        auto [re0, re1, re2, re3] = renormalize(r0, r1, r2, r3, r4);
+        auto [re0, re1, re2, re3] = renorm1(r0, r1, r2, r3, r4);
         return { re0, re1, re2, re3 };
     }
 
@@ -688,7 +746,38 @@ struct AvxQuadDouble
         auto[r3, e1] = nineTwoSum(d0, d1, d2, d3, d4, d5, d6, d7, d8);
         auto r4 = _mm256_add_pd(e0, e1);
 
-        auto [n0, n1, n2, n3] = renormalize(r0, r1, r2, r3, r4);
+        auto [n0, n1, n2, n3] = renorm2(r0, r1, r2, r3, r4);
+
+        return { n0, n1, n2, n3 };
+    }
+
+    inline AvxQuadDouble mul_pow2(double v) const
+    {
+        __m256d vv = _mm256_set1_pd(v);
+        return { _mm256_mul_pd(vv, x[0]), _mm256_mul_pd(vv, x[1]),
+                 _mm256_mul_pd(vv, x[2]), _mm256_mul_pd(vv, x[3]) };
+    }
+
+    inline AvxQuadDouble sq(void) const
+    {
+        auto[a0, b0] = twoProd(x[0], x[0]);
+        auto[b1, c0] = twoProd(x[0], x[1]);
+        //auto[b2, c1] = twoProd(x[0], x[1]); //
+        auto[c2, d0] = twoProd(x[0], x[2]);
+        auto[c3, d1] = twoProd(x[1], x[1]);
+        //auto[c4, d2] = twoProd(x[0], x[2]); //
+        auto d5 = _mm256_mul_pd(x[3], x[0]);
+        auto d6 = _mm256_mul_pd(x[2], x[1]);
+        //auto d7 = _mm256_mul_pd(x[1], x[2]); //
+        //auto d8 = _mm256_mul_pd(x[0], x[3]); //
+
+        auto r0 = a0;
+        auto[r1, c5] = twoSum(b0, _mm256_add_pd(b1, b1)); // d3
+        auto[r2, d4, e0] = sixThreeSum(_mm256_add_pd(c0, c0), /*c0*/ _mm256_set1_pd(0.0), c2, c3, c2, c5);
+        auto[r3, e1] = sixTwoSum(d0, d1, d0, d4, _mm256_add_pd(d5, d5), _mm256_add_pd(d6, d6));
+        auto r4 = _mm256_add_pd(e0, e1);
+
+        auto [n0, n1, n2, n3] = renorm2(r0, r1, r2, r3, r4);
 
         return { n0, n1, n2, n3 };
     }
@@ -779,9 +868,9 @@ void CpuGenerator<mnd::QuadDouble, mnd::X86_AVX_FMA, parallel>::generate(const m
 
             __m256d cmp = _mm256_cmp_pd(threshold, threshold, _CMP_LE_OQ);
             for (int k = 0; k < info.maxIter; k++) {
-                AvxQuadDouble aa = a * a;
-                AvxQuadDouble bb = b * b;
-                AvxQuadDouble abab = a * b; abab = abab + abab;
+                AvxQuadDouble aa = a.sq();
+                AvxQuadDouble bb = b.sq();
+                AvxQuadDouble abab = a * b.mul_pow2(2.0);
                 a = aa - bb + cx;
                 b = abab + cy;
                 if (info.smooth) {

+ 49 - 3
libmandel/src/Generators.cpp

@@ -1,17 +1,53 @@
 #include "Generators.h"
 
+#include "Types.h"
+
 #include <cstdio>
 
 using mnd::MandelGenerator;
 using mnd::AdaptiveGenerator;
 
 
-MandelGenerator::~MandelGenerator(void)
+namespace mnd
 {
+    template<> Real getPrecision<float>();
+    template<> Real getPrecision<double>();
+    template<> Real getPrecision<DoubleDouble>();
+    template<> Real getPrecision<TripleDouble>();
+    template<> Real getPrecision<QuadDouble>();
+    template<> Real getPrecision<HexDouble>();
+    template<> Real getPrecision<OctaDouble>();
+    template<> Real getPrecision<Fixed64>();
+    template<> Real getPrecision<Fixed128>();
+    template<> Real getPrecision<Fixed512>();
+    template<> Real getPrecision<Float128>();
+    template<> Real getPrecision<Float256>();
+    template<> Real getPrecision<Float512>();
+
+    template<typename T>
+    Precision getType(void);
+    template<> Precision getType<float>() { return Precision::FLOAT; }
+    template<> Precision getType<double>() { return Precision::DOUBLE; }
+    template<> Precision getType<DoubleDouble>() { return Precision::DOUBLE_DOUBLE; }
+    template<> Precision getType<TripleDouble>() { return Precision::TRIPLE_DOUBLE; }
+    template<> Precision getType<QuadDouble>() { return Precision::QUAD_DOUBLE; }
+    template<> Precision getType<HexDouble>() { return Precision::HEX_DOUBLE; }
+    template<> Precision getType<OctaDouble>() { return Precision::OCTA_DOUBLE; }
+    template<> Precision getType<Fixed64>() { return Precision::FIXED64; }
+    template<> Precision getType<Fixed128>() { return Precision::FIXED128; }
+    template<> Precision getType<Fixed512>() { return Precision::FIXED512; }
+    template<> Precision getType<Float128>() { return Precision::FLOAT128; }
+    template<> Precision getType<Float256>() { return Precision::FLOAT256; }
+    template<> Precision getType<Float512>() { return Precision::FLOAT512; }
 }
 
 
 
+MandelGenerator::~MandelGenerator(void)
+{
+}
+
+
 mnd::MandelDevice* MandelGenerator::getDevice(void)
 {
     return nullptr;
@@ -126,6 +162,8 @@ namespace mnd
             return "float";
         case Precision::DOUBLE_FLOAT:
             return "double-float";
+        case Precision::TRIPLE_FLOAT:
+            return "triple-float";
         case Precision::DOUBLE:
             return "double";
         case Precision::DOUBLE_DOUBLE:
@@ -136,10 +174,12 @@ namespace mnd
             return "quad-double";
         case Precision::HEX_DOUBLE:
             return "hex-double";
+        case Precision::OCTA_DOUBLE:
+            return "octa-double";
         case Precision::FLOAT128:
-            return "IEEE 754 128-bit float";
+            return "float128";
         case Precision::FLOAT256:
-            return "IEEE 754 256-bit float";
+            return "float256";
         case Precision::FLOAT512:
             return "float512";
         case Precision::FIXED64:
@@ -180,11 +220,13 @@ namespace mnd
         static const std::map<Precision, Real> precs {
             { Precision::FLOAT, getPrecision<float>() },
             { Precision::DOUBLE_FLOAT, Real("4.0e-15") },
+            { Precision::TRIPLE_FLOAT, Real("1.0e-21") },
             { Precision::DOUBLE, getPrecision<double>() },
             { Precision::DOUBLE_DOUBLE, Real("1.0e-29") },
             { Precision::TRIPLE_DOUBLE, Real("1.0e-47") },
             { Precision::QUAD_DOUBLE, Real("1.0e-56") },
             { Precision::HEX_DOUBLE, Real("1.0e-94") },
+            { Precision::OCTA_DOUBLE, Real("1.0e-126") },
             { Precision::FIXED64, Real("3.5e-15") },
             { Precision::FIXED128, Real("1.317e-29") },
             { Precision::FIXED512, Real("1.5e-130") },
@@ -222,6 +264,10 @@ namespace mnd
         return Real("3.0e-94");
     }
     template<>
+    Real getPrecision<OctaDouble>() {
+        return Real("1.0e-126");
+    }
+    template<>
     Real getPrecision<Fixed64>() {
         return Real("3.5e-15");
     }

+ 14 - 2
libmandel/src/Mandel.cpp

@@ -127,18 +127,22 @@ MandelContext::MandelContext(void)
 #ifdef WITH_BOOST
     auto quad = std::make_unique<CpuGenerator<Float128, mnd::NONE, true>>();
     auto oct = std::make_unique<CpuGenerator<Float256, mnd::NONE, true>>();
+    auto f512 = std::make_unique<CpuGenerator<Float512, mnd::NONE, true>>();
     cpuGenerators.insert({ std::pair{ Precision::FLOAT128, CpuExtension::NONE }, std::move(quad) });
     cpuGenerators.insert({ std::pair{ Precision::FLOAT256, CpuExtension::NONE }, std::move(oct) });
+    cpuGenerators.insert({ std::pair{ Precision::FLOAT512, CpuExtension::NONE }, std::move(f512) });
 #endif // WITH_BOOST
 
     auto dd = std::make_unique<CpuGenerator<DoubleDouble, mnd::NONE, true>>();
     auto td = std::make_unique<CpuGenerator<TripleDouble, mnd::NONE, true>>();
     auto qd = std::make_unique<CpuGenerator<QuadDouble, mnd::NONE, true>>();
     auto hd = std::make_unique<CpuGenerator<HexDouble, mnd::NONE, true>>();
+    auto od = std::make_unique<CpuGenerator<OctaDouble, mnd::NONE, true>>();
     cpuGenerators.insert({ std::pair{ Precision::DOUBLE_DOUBLE, CpuExtension::NONE }, std::move(dd) });
     cpuGenerators.insert({ std::pair{ Precision::TRIPLE_DOUBLE, CpuExtension::NONE }, std::move(td) });
     cpuGenerators.insert({ std::pair{ Precision::QUAD_DOUBLE, CpuExtension::NONE }, std::move(qd) });
     cpuGenerators.insert({ std::pair{ Precision::HEX_DOUBLE, CpuExtension::NONE }, std::move(hd) });
+    cpuGenerators.insert({ std::pair{ Precision::OCTA_DOUBLE, CpuExtension::NONE }, std::move(od) });
 
 
     auto fix512 = std::make_unique<CpuGenerator<Fixed512, mnd::NONE, true>>();
@@ -161,7 +165,8 @@ std::unique_ptr<mnd::AdaptiveGenerator> MandelContext::createAdaptiveGenerator(v
         Precision::TRIPLE_DOUBLE,
         Precision::QUAD_DOUBLE,
         Precision::HEX_DOUBLE,
-        Precision::FIXED512
+        Precision::OCTA_DOUBLE,
+        Precision::FLOAT512
     };
 
     auto ag = std::make_unique<AdaptiveGenerator>();
@@ -236,7 +241,7 @@ std::vector<std::unique_ptr<MandelDevice>> MandelContext::createDevices(void)
             //printf("    using opencl device: %s\n", md.name.c_str());
             try {
                 md.mandelGenerators.insert({ Precision::FLOAT, std::make_unique<ClGeneratorFloat>(md) });
-                md.mandelGenerators.insert({ Precision::FIXED64, std::make_unique<ClGenerator64>(md) });
+                //md.mandelGenerators.insert({ Precision::FIXED64, std::make_unique<ClGenerator64>(md) });
                 //md.mandelGenerators.insert({ GeneratorType::FIXED128, std::make_unique<ClGenerator128>(md) });
             }
             catch (const std::string& err) {
@@ -248,6 +253,12 @@ std::vector<std::unique_ptr<MandelDevice>> MandelContext::createDevices(void)
             catch (const std::string& err) {
                 printf("err: %s", err.c_str());
             }
+            try {
+                md.mandelGenerators.insert({ Precision::TRIPLE_FLOAT, std::make_unique<ClGeneratorTripleFloat>(md) });
+            }
+            catch (const std::string& err) {
+                printf("err: %s", err.c_str());
+            }
 
             if (supportsDouble) {
                 try {
@@ -256,6 +267,7 @@ std::vector<std::unique_ptr<MandelDevice>> MandelContext::createDevices(void)
                     md.mandelGenerators.insert({ Precision::TRIPLE_DOUBLE, std::make_unique<ClGeneratorTripleDouble>(md) });
                     md.mandelGenerators.insert({ Precision::QUAD_DOUBLE, std::make_unique<ClGeneratorQuadDouble>(md) });
                     md.mandelGenerators.insert({ Precision::HEX_DOUBLE, std::make_unique<ClGeneratorHexDouble>(md) });
+                    md.mandelGenerators.insert({ Precision::OCTA_DOUBLE, std::make_unique<ClGeneratorOctaDouble>(md) });
                 }
                 catch (const std::string& err) {
                     printf("err: %s", err.c_str());

+ 1 - 0
libmandel/src/NaiveIRGenerator.cpp

@@ -1,6 +1,7 @@
 #include "NaiveIRGenerator.h"
 #include <omp.h>
 
+#include "Types.h"
 
 using mnd::NaiveIRGenerator;
 

+ 10 - 0
libmandel/src/OpenClCode.cpp

@@ -5,8 +5,10 @@
 #include "opencl/doublefloat.h"
 #include "opencl/doubledouble.h"
 #include "opencl/tripledouble.h"
+#include "opencl/triplefloat.h"
 #include "opencl/quaddouble.h"
 #include "opencl/hexdouble.h"
+#include "opencl/octadouble.h"
 
 #include "opencl/fixed64.h"
 #include "opencl/fixed128.h"
@@ -34,6 +36,10 @@ namespace mnd
         return std::string{ (char*) tripledouble_cl, tripledouble_cl_len };
     }
 
+    std::string getTripleFloat_cl() {
+        return std::string{ (char*) triplefloat_cl, triplefloat_cl_len };
+    }
+
     std::string getQuadDouble_cl() {
         return std::string{ (char*) quaddouble_cl, quaddouble_cl_len };
     }
@@ -42,6 +48,10 @@ namespace mnd
         return std::string{ (char*) hexdouble_cl, hexdouble_cl_len };
     }
 
+    std::string getOctaDouble_cl() {
+        return std::string{ (char*) octadouble_cl, octadouble_cl_len };
+    }
+
     std::string getFixed64_cl() {
         return std::string{ (char*) fixed64_cl, fixed64_cl_len };
     }

+ 31 - 0
libmandel/src/Real.cpp

@@ -0,0 +1,31 @@
+#include "Real.h"
+#include <sstream>
+
+
+
+namespace mnd
+{
+    std::string toString(const Real& num)
+    {
+        return num.str();
+    }
+
+    std::string toLegibleString(const Real& num)
+    {
+        if (num == Real(0.0)) {
+            return "0";
+        }
+        int exponent = int(std::floor(static_cast<float>(mnd::log(num)) / ::logf(10.000001f)));
+        float fac = static_cast<float>(num / mnd::pow(Real(10), Real(exponent)));
+        std::stringstream ss;
+        ss.precision(3);
+        ss << std::fixed << fac << "e";
+        if (exponent < 0)
+            ss << "-" << -exponent;
+        else
+            ss << "+" << exponent;
+        return ss.str();
+    }
+}
+
+

+ 0 - 76
libmandel/src/Types.cpp

@@ -2,79 +2,3 @@
 #include <sstream>
 
 
-namespace mnd
-{
-#ifdef WITH_BOOST
-    std::string toString(const Real& num)
-    {
-        return num.str();
-    }
-
-    std::string toLegibleString(const Real& num)
-    {
-        if (num == Real(0.0)) {
-            return "0";
-        }
-        int exponent = int(std::floor(static_cast<float>(mnd::log(num)) / ::logf(10.000001f)));
-        float fac = static_cast<float>(num / mnd::pow(Real(10), Real(exponent)));
-        std::stringstream ss;
-        ss.precision(3);
-        ss << std::fixed << fac << "e";
-        if (exponent < 0)
-            ss << "-" << -exponent;
-        else
-            ss << "+" << exponent;
-        return ss.str();
-    }
-#else // !WITH_BOOST
-    std::string toString(const Real& num)
-    {
-        std::stringstream ss;
-        ss << num;
-        return ss.str();
-    }
-#endif // WITH_BOOST
-
-
-/*
-    template<>
-    constexpr Real precision<float>(void)
-    {
-        return 1.0e-7;
-    }
-
-    template<>
-    constexpr Real precision<double>(void)
-    {
-        return 1.0e-15;
-    }
-
-#ifdef WITH_QD
-    template<>
-    constexpr Real precision<DoubleDouble>(void)
-    {
-        return Real("1.0e-29");
-    }
-
-    template<>
-    constexpr Real precision<QuadDouble>(void)
-    {
-        return Real("1.0e-57");
-    }
-#endif // WITH_QD
-#ifdef WITH_BOOST
-    template<>
-    constexpr Real precision<Float128>(void)
-    {
-        return Real("1.0e-29");
-    }
-
-    template<>
-    constexpr Real precision<Float256>(void)
-    {
-        return Real("1.0e-60");
-    }
-#endif // WITH_BOOST
-*/
-}
-

+ 2 - 1
libmandel/src/opencl/doubledouble.cl

@@ -1,4 +1,5 @@
 #pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#pragma OPENCL FP_CONTRACT OFF
 
 inline double2 twoSum(double a, double b) {
     double s = a + b;
@@ -85,4 +86,4 @@ __kernel void iterate(__global float* A, const int width,
     }
     //               A[index] = ((float)n) + 1 - (a * a + b * b - 16) / (256 - 16);
     //           A[get_global_id(0)] = 5;
-}
+}

+ 205 - 210
libmandel/src/opencl/doubledouble.h

@@ -2,230 +2,225 @@ unsigned char doubledouble_cl[] = {
   0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e,
   0x43, 0x4c, 0x20, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e,
   0x20, 0x63, 0x6c, 0x5f, 0x6b, 0x68, 0x72, 0x5f, 0x66, 0x70, 0x36, 0x34,
-  0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x0d,
-  0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d,
-  0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x62, 0x20, 0x3d,
-  0x20, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20,
-  0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x62, 0x62,
-  0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d, 0x20, 0x62, 0x62,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
-  0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29,
-  0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a,
-  0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77,
-  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29,
-  0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x28, 0x73,
-  0x20, 0x2d, 0x20, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0d,
-  0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
+  0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x23, 0x70,
+  0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4c,
+  0x20, 0x46, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54,
+  0x20, 0x4f, 0x46, 0x46, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
   0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x77, 0x6f,
-  0x50, 0x72, 0x6f, 0x64, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29,
-  0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2a, 0x20, 0x62,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x61, 0x2c,
-  0x20, 0x62, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x70, 0x2c, 0x20, 0x65, 0x29,
-  0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69,
-  0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x6d,
-  0x75, 0x6c, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x62, 0x29,
-  0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
-  0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e,
-  0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x2e,
-  0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20,
-  0x2a, 0x20, 0x62, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x61, 0x2e, 0x73,
-  0x31, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x71,
-  0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x70,
-  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x70, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d,
-  0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x71, 0x28,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x29, 0x20, 0x7b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f,
-  0x64, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x61, 0x2e, 0x73, 0x30,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x61,
-  0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x31, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x3d,
-  0x20, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62,
+  0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20,
+  0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20,
+  0x62, 0x62, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d, 0x20,
+  0x62, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20,
+  0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x61,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
+  0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28,
+  0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e,
+  0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61, 0x20,
+  0x2a, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28,
+  0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x70, 0x2c, 0x20, 0x65,
+  0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x6d, 0x75, 0x6c,
+  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x2c, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x62, 0x29, 0x20, 0x7b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
+  0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x2e, 0x73, 0x31, 0x20, 0x2b,
+  0x3d, 0x20, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e,
+  0x73, 0x31, 0x20, 0x2b, 0x20, 0x61, 0x2e, 0x73, 0x31, 0x20, 0x2a, 0x20,
+  0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
+  0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x70, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e,
+  0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x73, 0x71, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x61,
+  0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x32, 0x20, 0x2a,
+  0x20, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x31,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x2e, 0x73, 0x31, 0x20, 0x2b,
+  0x3d, 0x20, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
   0x75, 0x72, 0x6e, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f,
   0x53, 0x75, 0x6d, 0x28, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x70, 0x2e,
-  0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69,
+  0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69,
+  0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61,
+  0x64, 0x64, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x62, 0x29,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x2e, 0x73,
+  0x31, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20,
+  0x62, 0x2e, 0x73, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
+  0x74, 0x75, 0x72, 0x6e, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77,
+  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x73, 0x65, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x73, 0x65, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69,
   0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x61, 0x64, 0x64, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
-  0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x65, 0x20, 0x3d, 0x20,
-  0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c,
-  0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x73, 0x65, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x2e,
-  0x73, 0x31, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x31, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x71,
-  0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x73,
-  0x65, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x65, 0x2e, 0x73, 0x31, 0x29,
-  0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69,
-  0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x6d,
-  0x75, 0x6c, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x28, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x70, 0x20, 0x3d,
-  0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73,
-  0x30, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x70, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x2e, 0x73, 0x31,
-  0x20, 0x2a, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
+  0x32, 0x20, 0x6d, 0x75, 0x6c, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x2c, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x70,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x70, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x2e, 0x73,
+  0x31, 0x20, 0x2a, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
   0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
   0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20,
-  0x70, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d,
-  0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f,
-  0x69, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x5f,
-  0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x2a, 0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20,
-  0x69, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0d, 0x0a,
+  0x70, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f,
+  0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20,
+  0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c,
+  0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20,
+  0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74,
+  0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x79, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x79, 0x32, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x78, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79,
+  0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x32,
+  0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x77, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x77, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x68, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x68, 0x32, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78,
-  0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68,
-  0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x31, 0x2c, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x31, 0x2c, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x32, 0x2c, 0x20,
+  0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74,
+  0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x78, 0x31, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x79, 0x31, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x79, 0x32, 0x29, 0x20,
-  0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69,
-  0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67,
-  0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x78,
-  0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x77,
-  0x69, 0x64, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
-  0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65,
-  0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0d, 0x0a,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x29, 0x28, 0x78, 0x31, 0x2c, 0x20, 0x78, 0x32, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a,
+  0x75, 0x6c, 0x69, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x6a, 0x79, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x6a, 0x79, 0x32, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20,
+  0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69,
+  0x64, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x20, 0x70, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
+  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x78, 0x31, 0x2c, 0x20, 0x78, 0x32,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
   0x65, 0x32, 0x20, 0x79, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75,
   0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x79, 0x31, 0x2c, 0x20, 0x79, 0x32,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
-  0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x29, 0x28, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x70, 0x77, 0x32,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
-  0x6c, 0x65, 0x59, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x29, 0x28, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x70, 0x68, 0x32,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c,
+  0x65, 0x58, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x29, 0x28, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x70, 0x77, 0x32, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
+  0x59, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x29, 0x28, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x70, 0x68, 0x32, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c,
+  0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c,
+  0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x29, 0x20, 0x70, 0x78, 0x29, 0x2c, 0x20, 0x78, 0x6c,
+  0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53,
+  0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x2a, 0x20, 0x70, 0x78, 0x20, 0x2b,
+  0x20, 0x78, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28,
   0x6d, 0x75, 0x6c, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x69,
-  0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x2c, 0x20, 0x28,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20, 0x70, 0x78, 0x29, 0x2c,
-  0x20, 0x78, 0x6c, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78,
-  0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x2a, 0x20, 0x70,
-  0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x62, 0x20, 0x3d, 0x20,
-  0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x44, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
-  0x59, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20,
-  0x70, 0x79, 0x29, 0x2c, 0x20, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f, 0x2f,
-  0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59,
-  0x20, 0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
-  0x63, 0x61, 0x20, 0x3d, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21,
-  0x3d, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x28, 0x28, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x29, 0x20, 0x28, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x6a,
-  0x78, 0x32, 0x29, 0x29, 0x20, 0x3a, 0x20, 0x61, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x63,
-  0x62, 0x20, 0x3d, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d,
-  0x20, 0x30, 0x20, 0x3f, 0x20, 0x28, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x29, 0x20, 0x28, 0x6a, 0x79, 0x31, 0x2c, 0x20, 0x6a, 0x79,
-  0x32, 0x29, 0x29, 0x20, 0x3a, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x20,
-  0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68,
-  0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78,
-  0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
-  0x20, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c,
-  0x20, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x2c, 0x20, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20, 0x70, 0x79, 0x29, 0x2c,
+  0x20, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78,
+  0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x2a, 0x20, 0x70,
+  0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x63, 0x61, 0x20, 0x3d, 0x20,
+  0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x20, 0x3f,
+  0x20, 0x28, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x20,
+  0x28, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x6a, 0x78, 0x32, 0x29, 0x29, 0x20,
+  0x3a, 0x20, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x6a, 0x75,
+  0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x28,
+  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x20, 0x28, 0x6a,
+  0x79, 0x31, 0x2c, 0x20, 0x6a, 0x79, 0x32, 0x29, 0x29, 0x20, 0x3a, 0x20,
+  0x62, 0x3b, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x20, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x20, 0x3c, 0x20, 0x6d,
+  0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61,
+  0x2c, 0x20, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x62, 0x62,
   0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x62, 0x2c, 0x20, 0x62, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20,
-  0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x20,
-  0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28,
-  0x2d, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e,
-  0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64,
-  0x64, 0x28, 0x61, 0x61, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62,
-  0x62, 0x29, 0x2c, 0x20, 0x63, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64,
-  0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x62, 0x2c, 0x20, 0x61, 0x62,
-  0x29, 0x2c, 0x20, 0x63, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x61, 0x2e,
-  0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x3e,
-  0x20, 0x31, 0x36, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x2b, 0x2b,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x31,
-  0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28, 0x6c, 0x6f, 0x67, 0x20,
-  0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29, 0x20, 0x2f, 0x20, 0x6c,
-  0x6f, 0x67, 0x20, 0x32, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66,
-  0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d,
-  0x20, 0x31, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20,
-  0x6d, 0x61, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c,
-  0x73, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68,
-  0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d,
+  0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x20, 0x3d, 0x20,
+  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x2d, 0x62,
+  0x62, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x31,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61,
+  0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61,
+  0x61, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x29, 0x2c,
+  0x20, 0x63, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64,
+  0x64, 0x28, 0x61, 0x62, 0x2c, 0x20, 0x61, 0x62, 0x29, 0x2c, 0x20, 0x63,
+  0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x66, 0x20, 0x28, 0x61, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20,
+  0x62, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x20, 0x31, 0x36, 0x29, 0x20,
+  0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x20,
+  0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28, 0x6c,
+  0x6f, 0x67, 0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29, 0x20,
+  0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x61, 0x78,
+  0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d,
+  0x20, 0x6d, 0x61, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c,
+  0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x20,
+  0x21, 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65,
+  0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x29, 0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c,
+  0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20,
+  0x2a, 0x20, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73,
+  0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x20, 0x2f, 0x20,
+  0x32, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x32, 0x2e, 0x30,
+  0x66, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29,
+  0x20, 0x6e, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e,
   0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f,
-  0x61, 0x74, 0x29, 0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d,
-  0x20, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61, 0x2e, 0x73,
-  0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62,
-  0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x20,
-  0x2f, 0x20, 0x32, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x32,
-  0x2e, 0x30, 0x66, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69,
-  0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d,
-  0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x20,
-  0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x28, 0x61, 0x20, 0x2a, 0x20, 0x61,
-  0x20, 0x2b, 0x20, 0x62, 0x20, 0x2a, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x31,
-  0x36, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x32, 0x35, 0x36, 0x20, 0x2d, 0x20,
-  0x31, 0x36, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41,
-  0x5b, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f,
-  0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x35, 0x3b, 0x0d,
-  0x0a, 0x7d
+  0x61, 0x74, 0x29, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20,
+  0x28, 0x61, 0x20, 0x2a, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x20, 0x2a,
+  0x20, 0x62, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x28,
+  0x32, 0x35, 0x36, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c,
+  0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x20,
+  0x3d, 0x20, 0x35, 0x3b, 0x0a, 0x7d, 0x0a
 };
-unsigned int doubledouble_cl_len = 2726;
+unsigned int doubledouble_cl_len = 2671;

+ 11 - 27
libmandel/src/opencl/doublefloat.cl

@@ -2,6 +2,7 @@
 // Real Numbers and Computers 7, Jul 2006, Nancy, France. pp.23-32. ffhal-00021443
 // https://hal.archives-ouvertes.fr/hal-00021443/document
 // added some optimizations using fma
+#pragma OPENCL FP_CONTRACT OFF
 
 float2 twoSum(float a, float b) {
     float s = a + b;
@@ -25,7 +26,11 @@ float2 split(float a) {
 }
 
 float2 twoProd(float a, float b) {
-    /*
+#ifdef FP_FAST_FMA
+    float p = a * b;
+    float e = fma(a, b, -p);
+    return (float2)(p, e);
+#else
     float x = a * b;
     float2 aex = split(a);
     float2 bex = split(b);
@@ -34,30 +39,9 @@ float2 twoProd(float a, float b) {
     float errz = erry - (aex.s0 * bex.s1);
     float y = (aex.s1 * bex.s1) - errz;
     return (float2)(x, y);
-    */
-    float p = a * b;
-    float e = fma(a, b, -p);
-    return (float2)(p, e);
-}
-
-float2 twoProdSq(float a) {
-    float p = a * a;
-    float e = fma(a, a, -p);
-    return (float2)(p, e);
+#endif
 }
 
-/*float2 add(float2 a, float2 b) {
-    float r = a.s0 + b.s0;
-    float s;
-    if (fabs(a.s0) >= fabs(b.s0)) {
-        s = (((a.s0 - r) + b.s0) + b.s1) + a.s1;
-    }
-    else {
-        s = (((b.s0 - r) + a.s0) + a.s1) + b.s1;
-    }
-    return twoSum(r, s);
-}*/
-
 float2 add(float2 a, float2 b) {
     float2 se = twoSum(a.s0, b.s0);
     se.s1 += a.s1 + b.s1;
@@ -71,9 +55,9 @@ float2 mul(float2 a, float2 b) {
 }
 
 float2 sq(float2 a) {
-    float2 t = twoProdSq(a.s0);
-    float e = a.s0 * a.s1;
-    t.s1 += e + e;
+    float2 t = twoProd(a.s0, a.s0);
+    float e = 2 * a.s0 * a.s1;
+    t.s1 += e;
     return quickTwoSum(t.s0, t.s1);
 }
 
@@ -126,4 +110,4 @@ __kernel void iterate(__global float* A, const int width,
         else
             A[index] = ((float)n);
     }
-}
+}

+ 238 - 275
libmandel/src/opencl/doublefloat.h

@@ -8,295 +8,258 @@ unsigned char doublefloat_cl[] = {
   0x2d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61,
   0x74, 0x6f, 0x72, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x67, 0x72, 0x61, 0x70,
   0x68, 0x69, 0x63, 0x73, 0x20, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72,
-  0x65, 0x2e, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x52, 0x65, 0x61, 0x6c, 0x20,
-  0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20,
-  0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x73, 0x20, 0x37, 0x2c,
-  0x20, 0x4a, 0x75, 0x6c, 0x20, 0x32, 0x30, 0x30, 0x36, 0x2c, 0x20, 0x4e,
-  0x61, 0x6e, 0x63, 0x79, 0x2c, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65,
-  0x2e, 0x20, 0x70, 0x70, 0x2e, 0x32, 0x33, 0x2d, 0x33, 0x32, 0x2e, 0x20,
-  0x66, 0x66, 0x68, 0x61, 0x6c, 0x2d, 0x30, 0x30, 0x30, 0x32, 0x31, 0x34,
-  0x34, 0x33, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73,
-  0x3a, 0x2f, 0x2f, 0x68, 0x61, 0x6c, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x69,
-  0x76, 0x65, 0x73, 0x2d, 0x6f, 0x75, 0x76, 0x65, 0x72, 0x74, 0x65, 0x73,
-  0x2e, 0x66, 0x72, 0x2f, 0x68, 0x61, 0x6c, 0x2d, 0x30, 0x30, 0x30, 0x32,
-  0x31, 0x34, 0x34, 0x33, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
-  0x74, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20,
-  0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
-  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67,
-  0x20, 0x66, 0x6d, 0x61, 0x0d, 0x0a, 0x0d, 0x0a, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x32, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b,
-  0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
-  0x61, 0x74, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d, 0x20, 0x61,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x20, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73,
-  0x20, 0x2d, 0x20, 0x76, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20,
-  0x2d, 0x20, 0x76, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
-  0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x72, 0x29, 0x3b, 0x0d, 0x0a, 0x7d,
-  0x0d, 0x0a, 0x0d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x71,
-  0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x65, 0x2e, 0x0a, 0x2f, 0x2f, 0x20, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x4e,
+  0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43,
+  0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x73, 0x20, 0x37, 0x2c, 0x20,
+  0x4a, 0x75, 0x6c, 0x20, 0x32, 0x30, 0x30, 0x36, 0x2c, 0x20, 0x4e, 0x61,
+  0x6e, 0x63, 0x79, 0x2c, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x2e,
+  0x20, 0x70, 0x70, 0x2e, 0x32, 0x33, 0x2d, 0x33, 0x32, 0x2e, 0x20, 0x66,
+  0x66, 0x68, 0x61, 0x6c, 0x2d, 0x30, 0x30, 0x30, 0x32, 0x31, 0x34, 0x34,
+  0x33, 0x0a, 0x2f, 0x2f, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f,
+  0x2f, 0x68, 0x61, 0x6c, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
+  0x73, 0x2d, 0x6f, 0x75, 0x76, 0x65, 0x72, 0x74, 0x65, 0x73, 0x2e, 0x66,
+  0x72, 0x2f, 0x68, 0x61, 0x6c, 0x2d, 0x30, 0x30, 0x30, 0x32, 0x31, 0x34,
+  0x34, 0x33, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x0a,
+  0x2f, 0x2f, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x6d,
+  0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x73, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6d,
+  0x61, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50,
+  0x45, 0x4e, 0x43, 0x4c, 0x20, 0x46, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54,
+  0x52, 0x41, 0x43, 0x54, 0x20, 0x4f, 0x46, 0x46, 0x0a, 0x0a, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20,
-  0x2b, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20,
-  0x28, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b,
-  0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x32, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x20, 0x61, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d, 0x20, 0x61,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x72, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20,
+  0x2d, 0x20, 0x76, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d,
+  0x20, 0x76, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29,
+  0x28, 0x73, 0x2c, 0x20, 0x72, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x29, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x20, 0x3d,
+  0x20, 0x62, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
+  0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x73, 0x2c,
+  0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x32, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x34,
   0x30, 0x39, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x61,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x20, 0x61, 0x62, 0x69, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x20, 0x2d, 0x20,
-  0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x20, 0x61, 0x68, 0x69, 0x20, 0x3d, 0x20, 0x63, 0x20, 0x2d, 0x20,
-  0x61, 0x62, 0x69, 0x67, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x6f, 0x20, 0x3d, 0x20, 0x61,
-  0x20, 0x2d, 0x20, 0x61, 0x68, 0x69, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c, 0x6f,
-  0x61, 0x74, 0x32, 0x29, 0x28, 0x61, 0x68, 0x69, 0x2c, 0x20, 0x61, 0x6c,
-  0x6f, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
-  0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x2f, 0x2a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2a, 0x20,
-  0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x32, 0x20, 0x61, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c,
-  0x69, 0x74, 0x28, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x62, 0x65, 0x78, 0x20, 0x3d,
-  0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x62, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x72,
-  0x72, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2d, 0x20, 0x28, 0x61, 0x65,
-  0x78, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x65, 0x78, 0x2e, 0x73,
-  0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
-  0x61, 0x74, 0x20, 0x65, 0x72, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x65, 0x72,
-  0x72, 0x78, 0x20, 0x2d, 0x20, 0x28, 0x61, 0x65, 0x78, 0x2e, 0x73, 0x31,
-  0x20, 0x2a, 0x20, 0x62, 0x65, 0x78, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65,
-  0x72, 0x72, 0x7a, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x79, 0x20, 0x2d,
-  0x20, 0x28, 0x61, 0x65, 0x78, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62,
-  0x65, 0x78, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x28,
-  0x61, 0x65, 0x78, 0x2e, 0x73, 0x31, 0x20, 0x2a, 0x20, 0x62, 0x65, 0x78,
-  0x2e, 0x73, 0x31, 0x29, 0x20, 0x2d, 0x20, 0x65, 0x72, 0x72, 0x7a, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
-  0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2c,
-  0x20, 0x79, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x2f,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
-  0x70, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2a, 0x20, 0x62, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x20,
-  0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20,
-  0x2d, 0x70, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
-  0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
-  0x29, 0x28, 0x70, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d,
-  0x0a, 0x0d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x77,
-  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x53, 0x71, 0x28, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x20, 0x61, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61, 0x20,
-  0x2a, 0x20, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x61, 0x62, 0x69, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x20, 0x2d, 0x20, 0x61,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x61, 0x68, 0x69, 0x20, 0x3d, 0x20, 0x63, 0x20, 0x2d, 0x20, 0x61, 0x62,
+  0x69, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x20, 0x61, 0x6c, 0x6f, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2d, 0x20,
+  0x61, 0x68, 0x69, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29,
+  0x28, 0x61, 0x68, 0x69, 0x2c, 0x20, 0x61, 0x6c, 0x6f, 0x29, 0x3b, 0x0a,
+  0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x77,
+  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x29, 0x20,
+  0x7b, 0x0a, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x46, 0x50, 0x5f,
+  0x46, 0x41, 0x53, 0x54, 0x5f, 0x46, 0x4d, 0x41, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61,
+  0x20, 0x2a, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
   0x6f, 0x61, 0x74, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28,
-  0x61, 0x2c, 0x20, 0x61, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28,
-  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x70, 0x2c, 0x20, 0x65,
-  0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2a, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x61, 0x64, 0x64, 0x28, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x32, 0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x32, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x61,
-  0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66,
-  0x61, 0x62, 0x73, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x29, 0x20, 0x3e, 0x3d,
-  0x20, 0x66, 0x61, 0x62, 0x73, 0x28, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x29,
-  0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20,
-  0x2d, 0x20, 0x72, 0x29, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29,
-  0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x61,
-  0x2e, 0x73, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x3d,
-  0x20, 0x28, 0x28, 0x28, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2d, 0x20, 0x72,
-  0x29, 0x20, 0x2b, 0x20, 0x61, 0x2e, 0x73, 0x30, 0x29, 0x20, 0x2b, 0x20,
-  0x61, 0x2e, 0x73, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x31,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x77, 0x6f,
-  0x53, 0x75, 0x6d, 0x28, 0x72, 0x2c, 0x20, 0x73, 0x29, 0x3b, 0x0d, 0x0a,
-  0x7d, 0x2a, 0x2f, 0x0d, 0x0a, 0x0d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x32, 0x20, 0x61, 0x64, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
-  0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x62,
-  0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
-  0x61, 0x74, 0x32, 0x20, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
-  0x53, 0x75, 0x6d, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e,
-  0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65,
-  0x2e, 0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x2e, 0x73, 0x31, 0x20,
-  0x2b, 0x20, 0x62, 0x2e, 0x73, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
+  0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x70, 0x2c, 0x20, 0x65, 0x29,
+  0x3b, 0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x20,
+  0x2a, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x32, 0x20, 0x61, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x70,
+  0x6c, 0x69, 0x74, 0x28, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x62, 0x65, 0x78, 0x20, 0x3d,
+  0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x62, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x72, 0x72,
+  0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2d, 0x20, 0x28, 0x61, 0x65, 0x78,
+  0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x65, 0x78, 0x2e, 0x73, 0x30,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x20, 0x65, 0x72, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x78,
+  0x20, 0x2d, 0x20, 0x28, 0x61, 0x65, 0x78, 0x2e, 0x73, 0x31, 0x20, 0x2a,
+  0x20, 0x62, 0x65, 0x78, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x72, 0x72, 0x7a,
+  0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x79, 0x20, 0x2d, 0x20, 0x28, 0x61,
+  0x65, 0x78, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x65, 0x78, 0x2e,
+  0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x65, 0x78, 0x2e,
+  0x73, 0x31, 0x20, 0x2a, 0x20, 0x62, 0x65, 0x78, 0x2e, 0x73, 0x31, 0x29,
+  0x20, 0x2d, 0x20, 0x65, 0x72, 0x72, 0x7a, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x0a,
+  0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x32, 0x20, 0x61, 0x64, 0x64, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x32, 0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x32, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x65, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x2e, 0x73, 0x31,
+  0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x71, 0x75, 0x69, 0x63,
   0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x73, 0x65, 0x2e, 0x73,
-  0x30, 0x2c, 0x20, 0x73, 0x65, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a,
-  0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20,
-  0x6d, 0x75, 0x6c, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x61,
-  0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x62, 0x29, 0x20,
-  0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x32, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f,
-  0x64, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x30,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x2e, 0x73, 0x31,
-  0x20, 0x2b, 0x3d, 0x20, 0x28, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a,
-  0x20, 0x62, 0x2e, 0x73, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x61, 0x2e,
-  0x73, 0x31, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x29, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
-  0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x74, 0x2e, 0x73, 0x30,
-  0x2c, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d,
-  0x0a, 0x0d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x71,
-  0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x61, 0x29, 0x20, 0x7b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
-  0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
-  0x53, 0x71, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x20, 0x3d,
-  0x20, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x31,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x20,
-  0x2b, 0x3d, 0x20, 0x65, 0x20, 0x2b, 0x20, 0x65, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x71, 0x75,
-  0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x74, 0x2e,
-  0x73, 0x30, 0x2c, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a,
-  0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20,
+  0x30, 0x2c, 0x20, 0x73, 0x65, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d,
+  0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x75, 0x6c,
+  0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x61, 0x2c, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x28,
+  0x28, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x31,
+  0x29, 0x20, 0x2b, 0x20, 0x28, 0x61, 0x2e, 0x73, 0x31, 0x20, 0x2a, 0x20,
+  0x62, 0x2e, 0x73, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75,
+  0x6d, 0x28, 0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x2e, 0x73, 0x31,
+  0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
+  0x20, 0x73, 0x71, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x61,
+  0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x32, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72,
+  0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x61, 0x2e, 0x73,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x61, 0x2e,
+  0x73, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x31, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x65,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x29,
+  0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20,
   0x6d, 0x75, 0x6c, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x66, 0x6c, 0x6f,
   0x61, 0x74, 0x32, 0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77,
-  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20,
-  0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x2e, 0x73,
-  0x31, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x61, 0x2e, 0x73, 0x31, 0x20, 0x2a,
-  0x20, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
-  0x74, 0x75, 0x72, 0x6e, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77,
-  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74,
-  0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
-  0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69,
-  0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f,
-  0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x2a, 0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69,
-  0x6e, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0d, 0x0a, 0x20,
+  0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x20,
+  0x2b, 0x3d, 0x20, 0x28, 0x61, 0x2e, 0x73, 0x31, 0x20, 0x2a, 0x20, 0x62,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
+  0x6e, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75,
+  0x6d, 0x28, 0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x2e, 0x73, 0x31,
+  0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e,
+  0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72,
+  0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x41, 0x2c, 0x20, 0x63,
+  0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x64,
+  0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
-  0x61, 0x74, 0x20, 0x78, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x20, 0x78, 0x32, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79,
-  0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x32, 0x2c,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x31, 0x2c, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x32, 0x2c, 0x20, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x20, 0x79, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x20, 0x79, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x20, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f,
-  0x61, 0x74, 0x20, 0x70, 0x68, 0x32, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20,
-  0x6d, 0x61, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6d, 0x6f,
-  0x6f, 0x74, 0x68, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x77,
+  0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x77, 0x32,
+  0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x68, 0x31, 0x2c,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x68, 0x32, 0x2c, 0x20,
+  0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74,
+  0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x75, 0x6c, 0x69,
-  0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x78, 0x31,
-  0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x78, 0x32, 0x2c,
-  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x79, 0x31, 0x2c, 0x20,
-  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x79, 0x32, 0x29, 0x20, 0x7b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e,
-  0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c,
-  0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x78, 0x20,
-  0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x77, 0x69,
-  0x64, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a,
+  0x75, 0x6c, 0x69, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x6a, 0x78, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a,
+  0x78, 0x32, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x79,
+  0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x79, 0x32,
+  0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20,
+  0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f,
+  0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x78,
+  0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x77,
+  0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
   0x74, 0x20, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78,
-  0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20,
-  0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
-  0x29, 0x28, 0x78, 0x31, 0x2c, 0x20, 0x78, 0x32, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x79,
-  0x74, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29,
-  0x28, 0x79, 0x31, 0x2c, 0x20, 0x79, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x70, 0x69,
-  0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20,
-  0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x70, 0x77, 0x31,
-  0x2c, 0x20, 0x70, 0x77, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65,
-  0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x3d, 0x20, 0x28, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x70, 0x68, 0x31, 0x2c, 0x20,
-  0x70, 0x68, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x61, 0x20, 0x3d, 0x20,
-  0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x46, 0x6c, 0x6f, 0x61, 0x74,
-  0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58,
-  0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20, 0x70, 0x78,
-  0x29, 0x2c, 0x20, 0x78, 0x6c, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70,
-  0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x2a,
-  0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x62, 0x20, 0x3d,
-  0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x46, 0x6c, 0x6f, 0x61,
-  0x74, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
-  0x59, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20, 0x70,
-  0x79, 0x29, 0x2c, 0x20, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20,
-  0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x20,
-  0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x61,
-  0x20, 0x3d, 0x20, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x62,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a,
-  0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61,
+  0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x78, 0x6c,
   0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28,
-  0x6a, 0x78, 0x31, 0x2c, 0x20, 0x6a, 0x78, 0x32, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x62, 0x20, 0x3d,
-  0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x6a, 0x79,
-  0x31, 0x2c, 0x20, 0x6a, 0x79, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
-  0x6e, 0x74, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x20,
-  0x3c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x32, 0x20, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x71,
-  0x28, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x62, 0x62, 0x20,
-  0x3d, 0x20, 0x73, 0x71, 0x28, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
-  0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c,
-  0x20, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x69, 0x6e,
-  0x75, 0x73, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61,
-  0x74, 0x32, 0x29, 0x28, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x2c, 0x20,
-  0x2d, 0x62, 0x62, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64,
-  0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x61, 0x2c, 0x20, 0x6d, 0x69,
-  0x6e, 0x75, 0x73, 0x62, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x61, 0x29, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20,
-  0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x62,
-  0x2c, 0x20, 0x61, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x62, 0x29, 0x3b, 0x0d,
+  0x78, 0x31, 0x2c, 0x20, 0x78, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x79, 0x74, 0x20, 0x3d,
+  0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x79, 0x31,
+  0x2c, 0x20, 0x79, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53,
+  0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x32, 0x29, 0x28, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x70, 0x77,
+  0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c,
+  0x65, 0x59, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
+  0x29, 0x28, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x70, 0x68, 0x32, 0x29, 0x3b,
+  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
+  0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c,
+  0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53,
+  0x63, 0x61, 0x6c, 0x65, 0x58, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x29, 0x20, 0x70, 0x78, 0x29, 0x2c, 0x20, 0x78, 0x6c, 0x29, 0x3b,
+  0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
+  0x6c, 0x65, 0x58, 0x20, 0x2a, 0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78,
+  0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
+  0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c,
+  0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53,
+  0x63, 0x61, 0x6c, 0x65, 0x59, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x29, 0x20, 0x70, 0x79, 0x29, 0x2c, 0x20, 0x79, 0x74, 0x29, 0x3b,
+  0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
+  0x6c, 0x65, 0x59, 0x20, 0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x79,
+  0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
+  0x20, 0x63, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x62, 0x20, 0x3d,
+  0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28,
+  0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61,
+  0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28,
+  0x6a, 0x78, 0x31, 0x2c, 0x20, 0x6a, 0x78, 0x32, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20,
+  0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x6a, 0x79, 0x31,
+  0x2c, 0x20, 0x6a, 0x79, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6e,
+  0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68,
+  0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78,
+  0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x61,
+  0x61, 0x20, 0x3d, 0x20, 0x73, 0x71, 0x28, 0x61, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x32, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x71, 0x28, 0x62, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x32, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75,
+  0x6c, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20,
+  0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x2d, 0x62, 0x62, 0x2e, 0x73,
+  0x30, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20,
+  0x61, 0x64, 0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x61, 0x2c, 0x20,
+  0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x61,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
+  0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61,
+  0x62, 0x2c, 0x20, 0x61, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x62, 0x29, 0x3b,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
   0x28, 0x61, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x62, 0x2e,
   0x73, 0x30, 0x20, 0x3e, 0x20, 0x31, 0x36, 0x29, 0x20, 0x62, 0x72, 0x65,
-  0x61, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d,
-  0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e,
-  0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28,
-  0x6c, 0x6f, 0x67, 0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29,
-  0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d,
-  0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78,
-  0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x6d,
-  0x6f, 0x6f, 0x74, 0x68, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28,
-  0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e, 0x29, 0x20, 0x2b,
-  0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x67,
-  0x28, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x30,
-  0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e,
-  0x73, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x20, 0x2f, 0x20, 0x6c,
-  0x6f, 0x67, 0x28, 0x32, 0x2e, 0x30, 0x66, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20,
-  0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x7d
+  0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x6e, 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x31,
+  0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28, 0x6c, 0x6f, 0x67, 0x20,
+  0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29, 0x20, 0x2f, 0x20, 0x6c,
+  0x6f, 0x67, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
+  0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d, 0x20,
+  0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41,
+  0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61,
+  0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66,
+  0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x20, 0x21, 0x3d, 0x20,
+  0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20,
+  0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e,
+  0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x28,
+  0x6c, 0x6f, 0x67, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x61,
+  0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2a,
+  0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x20,
+  0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x32, 0x2e, 0x30, 0x66, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73,
+  0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d,
+  0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a
 };
-unsigned int doublefloat_cl_len = 3585;
+unsigned int doublefloat_cl_len = 3141;

+ 19 - 5
libmandel/src/opencl/hexdouble.cl

@@ -1,4 +1,5 @@
 #pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#pragma OPENCL FP_CONTRACT OFF
 
 
 typedef struct hex_double {
@@ -157,6 +158,19 @@ inline HexDouble mul(const __private HexDouble* a, const __private HexDouble* b)
 }
 
 
+inline HexDouble twice(const __private HexDouble* a)
+{
+    return (HexDouble) {
+        a->x[0] * 2,
+        a->x[1] * 2,
+        a->x[2] * 2,
+        a->x[3] * 2,
+        a->x[4] * 2,
+        a->x[5] * 2,
+    };
+}
+
+
 HexDouble loadHd(const __constant double* v) {
     return (HexDouble) {
         v[0],
@@ -171,7 +185,7 @@ HexDouble loadHd(const __constant double* v) {
 
 __kernel void iterate(__global float* A, const int width,
                       __constant double* x, __constant double* y,
-                      __constant double* pw, __constant double* ph, int max, int smooth, int julia,
+                      __constant double* pw, __constant double* ph, int maxIter, int smooth, int julia,
                       __constant double* jx, __constant double* jy) {
     int index = get_global_id(0);
     int px = index % width;
@@ -197,13 +211,13 @@ __kernel void iterate(__global float* A, const int width,
     }
 
     int n = 0;
-    while (n < max - 1) {
+    while (n < maxIter - 1) {
         HexDouble aa = mul(&a, &a); /* TODO add squaring function */
         HexDouble bb = mul(&b, &b);
         HexDouble ab = mul(&a, &b);
         HexDouble minusbb = { -bb.x[0], -bb.x[1], -bb.x[2], -bb.x[3], -bb.x[4], -bb.x[5] };
         HexDouble aambb = add(&aa, &minusbb);
-        HexDouble abab = add(&ab, &ab);
+        HexDouble abab = twice(&ab);
         a = add(&aambb, &ca);
         b = add(&abab, &cb);
         if (aa.x[0] + bb.x[0] > 16) break;
@@ -211,8 +225,8 @@ __kernel void iterate(__global float* A, const int width,
     }
 
     // N + 1 - log (log  |Z(N)|) / log 2
-    if (n >= max - 1)
-        A[index] = max;
+    if (n >= maxIter - 1)
+        A[index] = maxIter;
     else {
         if (smooth != 0)
             A[index] = ((float) n) + 1 - log2(log(a.x[0] * a.x[0] + b.x[0] * b.x[0]) * 0.5);

+ 558 - 555
libmandel/src/opencl/hexdouble.h

@@ -2,603 +2,606 @@ unsigned char hexdouble_cl[] = {
   0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e,
   0x43, 0x4c, 0x20, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e,
   0x20, 0x63, 0x6c, 0x5f, 0x6b, 0x68, 0x72, 0x5f, 0x66, 0x70, 0x36, 0x34,
-  0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x0d,
-  0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73,
-  0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x68, 0x65, 0x78, 0x5f, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x5b, 0x36, 0x5d, 0x3b,
-  0x0d, 0x0a, 0x7d, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
+  0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x23, 0x70,
+  0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4c,
+  0x20, 0x46, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54,
+  0x20, 0x4f, 0x46, 0x46, 0x0a, 0x0a, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64,
+  0x65, 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x68, 0x65,
+  0x78, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x7b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x5b,
+  0x36, 0x5d, 0x3b, 0x0a, 0x7d, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x3b, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
   0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x77, 0x6f,
   0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
   0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20,
-  0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62,
+  0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20,
+  0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20,
+  0x62, 0x62, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d, 0x20,
+  0x62, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x2a, 0x20, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20,
+  0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x73,
+  0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x65,
+  0x72, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73,
   0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62,
-  0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b,
-  0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e,
-  0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x77, 0x6f,
-  0x5f, 0x73, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x65, 0x72, 0x72,
-  0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20,
-  0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d, 0x20,
-  0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x65, 0x72, 0x72,
-  0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d,
-  0x20, 0x62, 0x62, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d,
-  0x20, 0x62, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
-  0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d,
-  0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
-  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62,
-  0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20,
-  0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x28,
-  0x73, 0x20, 0x2d, 0x20, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b,
-  0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c,
-  0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
-  0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61, 0x20,
-  0x2a, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61,
-  0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
-  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x70, 0x2c,
-  0x20, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d,
+  0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3b, 0x0a, 0x7d, 0x0a,
   0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x33, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d,
-  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x63, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x78,
-  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c,
-  0x20, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x77,
-  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x63,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53,
-  0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x79, 0x2e, 0x73,
-  0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
-  0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33,
-  0x29, 0x28, 0x79, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x7a, 0x2e, 0x73, 0x30,
-  0x2c, 0x20, 0x7a, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d,
-  0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x66, 0x6f, 0x75, 0x72,
+  0x6c, 0x65, 0x32, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f,
   0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x2c, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65,
+  0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20,
+  0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
+  0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29,
+  0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x20, 0x3d, 0x20,
+  0x61, 0x20, 0x2a, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d,
+  0x61, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
+  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x70, 0x2c,
+  0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c,
+  0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x63, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x79,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x7a, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x79, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x33, 0x29, 0x28, 0x79, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x7a,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x7a, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
+  0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x53,
+  0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x64, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x78, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75,
+  0x6d, 0x28, 0x78, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
-  0x78, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61,
-  0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x74,
-  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x30, 0x2c, 0x20,
-  0x63, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x32, 0x20, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
-  0x53, 0x75, 0x6d, 0x28, 0x79, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x64, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x33, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65,
-  0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x79, 0x2e,
-  0x73, 0x31, 0x2c, 0x20, 0x7a, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x7a, 0x2e, 0x73,
-  0x30, 0x2c, 0x20, 0x72, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x2e, 0x73,
-  0x31, 0x2c, 0x20, 0x72, 0x2e, 0x73, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x7d,
-  0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x66, 0x69, 0x76,
-  0x65, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x29, 0x0d, 0x0a, 0x7b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d,
-  0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x79, 0x20, 0x3d,
-  0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x30,
-  0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x7a, 0x20, 0x3d, 0x20, 0x74,
-  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x79, 0x2e, 0x73, 0x30, 0x2c, 0x20,
-  0x64, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x32, 0x20, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
-  0x53, 0x75, 0x6d, 0x28, 0x7a, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x65, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
-  0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28,
-  0x77, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x78, 0x2e, 0x73, 0x31, 0x20, 0x2b,
-  0x20, 0x79, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x7a, 0x2e, 0x73, 0x31,
-  0x20, 0x2b, 0x20, 0x77, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d,
-  0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x73, 0x69, 0x78,
-  0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75,
+  0x7a, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x79,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x72, 0x20, 0x3d,
+  0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x79, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x7a, 0x2e,
+  0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
+  0x29, 0x28, 0x7a, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x72, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x2e, 0x73, 0x32,
+  0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e,
+  0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x66, 0x69,
+  0x76, 0x65, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75,
   0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
   0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
   0x63, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x2c,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x2c, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x29, 0x0d, 0x0a, 0x7b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33,
-  0x20, 0x61, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53,
-  0x75, 0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x29, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x29, 0x0a, 0x7b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x63, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x79, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x64, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x7a, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x77, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x78, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x79, 0x2e, 0x73, 0x31,
+  0x20, 0x2b, 0x20, 0x7a, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x77, 0x2e,
+  0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c,
+  0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x73, 0x69, 0x78, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x63, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x64, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x29, 0x0a,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x33, 0x20, 0x61, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65,
+  0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
   0x33, 0x20, 0x62, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65,
   0x53, 0x75, 0x6d, 0x28, 0x64, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x66, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x31, 0x74,
-  0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61,
-  0x76, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x76, 0x2e, 0x73, 0x30, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x20, 0x74, 0x32, 0x74, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77,
-  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x76, 0x2e, 0x73, 0x31, 0x2c, 0x20,
-  0x62, 0x76, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x34, 0x20, 0x3d,
-  0x20, 0x61, 0x76, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x62, 0x76, 0x2e,
-  0x73, 0x32, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x32, 0x74, 0x35, 0x20,
-  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x31, 0x74,
-  0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x32, 0x74, 0x33, 0x2e, 0x73,
-  0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x72, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x34, 0x20,
-  0x2b, 0x20, 0x74, 0x32, 0x74, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20,
-  0x72, 0x32, 0x74, 0x35, 0x2e, 0x73, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x72, 0x31, 0x74, 0x31, 0x2e,
-  0x73, 0x30, 0x2c, 0x20, 0x72, 0x32, 0x74, 0x35, 0x2e, 0x73, 0x30, 0x2c,
-  0x20, 0x72, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
-  0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x31, 0x74, 0x31, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x76, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x62, 0x76, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x74, 0x32, 0x74, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75,
+  0x6d, 0x28, 0x61, 0x76, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x76, 0x2e,
+  0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x74, 0x34, 0x20, 0x3d, 0x20, 0x61, 0x76, 0x2e,
+  0x73, 0x32, 0x20, 0x2b, 0x20, 0x62, 0x76, 0x2e, 0x73, 0x32, 0x3b, 0x0a,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x72, 0x32, 0x74, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x72, 0x31, 0x74, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x74, 0x32, 0x74, 0x33, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x33, 0x20,
+  0x3d, 0x20, 0x74, 0x34, 0x20, 0x2b, 0x20, 0x74, 0x32, 0x74, 0x33, 0x2e,
+  0x73, 0x31, 0x20, 0x2b, 0x20, 0x72, 0x32, 0x74, 0x35, 0x2e, 0x73, 0x31,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
+  0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x72,
+  0x31, 0x74, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x32, 0x74, 0x35,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a,
+  0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75,
   0x62, 0x6c, 0x65, 0x33, 0x20, 0x6e, 0x69, 0x6e, 0x65, 0x54, 0x68, 0x72,
   0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
   0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62,
   0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x2c, 0x20,
   0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x2c, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x67, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x68, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x69, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x76, 0x20,
-  0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x61,
-  0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x62, 0x76,
-  0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28,
-  0x64, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x66, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x63,
-  0x76, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d,
-  0x28, 0x67, 0x2c, 0x20, 0x68, 0x2c, 0x20, 0x69, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x72, 0x31, 0x74, 0x31, 0x74, 0x32,
-  0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28,
-  0x61, 0x76, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x76, 0x2e, 0x73, 0x30,
-  0x2c, 0x20, 0x63, 0x76, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x72,
-  0x32, 0x74, 0x33, 0x74, 0x34, 0x74, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x6f,
-  0x75, 0x72, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x76, 0x2e, 0x73, 0x31, 0x2c,
-  0x20, 0x62, 0x76, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x63, 0x76, 0x2e, 0x73,
-  0x31, 0x2c, 0x20, 0x72, 0x31, 0x74, 0x31, 0x74, 0x32, 0x2e, 0x73, 0x31,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x72, 0x33, 0x20, 0x3d, 0x20, 0x61, 0x76, 0x2e, 0x73,
-  0x32, 0x20, 0x2b, 0x20, 0x62, 0x76, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20,
-  0x63, 0x76, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x72, 0x31, 0x74, 0x31,
-  0x74, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x72, 0x32, 0x74, 0x33,
-  0x74, 0x34, 0x74, 0x35, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x72, 0x32,
-  0x74, 0x33, 0x74, 0x34, 0x74, 0x35, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20,
-  0x72, 0x32, 0x74, 0x33, 0x74, 0x34, 0x74, 0x35, 0x2e, 0x73, 0x33, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
-  0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x72,
-  0x31, 0x74, 0x31, 0x74, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x32,
-  0x74, 0x33, 0x74, 0x34, 0x74, 0x35, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72,
-  0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x64, 0x64, 0x28, 0x63, 0x6f, 0x6e,
-  0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
-  0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20,
-  0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70,
-  0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x62, 0x29, 0x0d, 0x0a, 0x7b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
-  0x20, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d,
-  0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x2d,
-  0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x62, 0x70, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x67, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x68, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x69, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x76, 0x20, 0x3d, 0x20, 0x74,
+  0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62,
+  0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x62, 0x76, 0x20, 0x3d, 0x20, 0x74,
+  0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x2c, 0x20, 0x65,
+  0x2c, 0x20, 0x66, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x63, 0x76, 0x20, 0x3d, 0x20, 0x74,
+  0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x67, 0x2c, 0x20, 0x68,
+  0x2c, 0x20, 0x69, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x72,
+  0x31, 0x74, 0x31, 0x74, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65,
+  0x65, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x76, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x62, 0x76, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x76, 0x2e, 0x73, 0x30,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x34, 0x20, 0x72, 0x32, 0x74, 0x33, 0x74, 0x34, 0x74, 0x35, 0x20,
+  0x3d, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x76,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x76, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x63, 0x76, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x31, 0x74, 0x31, 0x74,
+  0x32, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x33, 0x20, 0x3d, 0x20, 0x61,
+  0x76, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x62, 0x76, 0x2e, 0x73, 0x32,
+  0x20, 0x2b, 0x20, 0x63, 0x76, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x72,
+  0x31, 0x74, 0x31, 0x74, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x72,
+  0x32, 0x74, 0x33, 0x74, 0x34, 0x74, 0x35, 0x2e, 0x73, 0x31, 0x20, 0x2b,
+  0x20, 0x72, 0x32, 0x74, 0x33, 0x74, 0x34, 0x74, 0x35, 0x2e, 0x73, 0x32,
+  0x20, 0x2b, 0x20, 0x72, 0x32, 0x74, 0x33, 0x74, 0x34, 0x74, 0x35, 0x2e,
+  0x73, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
+  0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29,
+  0x28, 0x72, 0x31, 0x74, 0x31, 0x74, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x72, 0x32, 0x74, 0x33, 0x74, 0x34, 0x74, 0x35, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x72, 0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e,
+  0x6c, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x61, 0x64, 0x64, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+  0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x48,
+  0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x61, 0x2c,
+  0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69,
+  0x76, 0x61, 0x74, 0x65, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x2a, 0x20, 0x62, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x70, 0x20,
   0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e,
-  0x78, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x31,
-  0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x32, 0x20, 0x63, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77,
-  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d,
-  0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x29, 0x3b, 0x0d,
+  0x78, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30,
+  0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x62, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x2c,
+  0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x63,
+  0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61,
+  0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78,
+  0x5b, 0x32, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x64, 0x70, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x33,
+  0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x3b,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
-  0x20, 0x64, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d,
-  0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x62, 0x2d,
-  0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x65, 0x70, 0x20,
-  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e,
-  0x78, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x34,
-  0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x61,
-  0x70, 0x2e, 0x73, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x31, 0x70, 0x31, 0x20,
-  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x70, 0x2e,
-  0x73, 0x31, 0x2c, 0x20, 0x62, 0x70, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d,
+  0x20, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x62, 0x2d,
+  0x3e, 0x78, 0x5b, 0x34, 0x5d, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x30, 0x20, 0x3d,
+  0x20, 0x61, 0x70, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x31, 0x70, 0x31,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x70,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x70, 0x2e, 0x73, 0x30, 0x29, 0x3b,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33,
   0x20, 0x74, 0x32, 0x70, 0x32, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x68,
   0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x62, 0x70, 0x2e, 0x73, 0x31,
   0x2c, 0x20, 0x63, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x70,
-  0x31, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x74, 0x33, 0x70, 0x34,
-  0x35, 0x36, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x53, 0x75, 0x6d,
-  0x28, 0x63, 0x70, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x64, 0x70, 0x2e, 0x73,
-  0x30, 0x2c, 0x20, 0x74, 0x32, 0x70, 0x32, 0x70, 0x33, 0x2e, 0x73, 0x31,
-  0x2c, 0x20, 0x74, 0x32, 0x70, 0x32, 0x70, 0x33, 0x2e, 0x73, 0x32, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x20, 0x74, 0x34, 0x70, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x69,
-  0x76, 0x65, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x70, 0x2e,
-  0x73, 0x31, 0x2c, 0x20, 0x65, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74,
-  0x33, 0x70, 0x34, 0x35, 0x36, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x33,
-  0x70, 0x34, 0x35, 0x36, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x74, 0x33, 0x70,
-  0x34, 0x35, 0x36, 0x2e, 0x73, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x35, 0x20,
-  0x3d, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20,
-  0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x65, 0x70,
-  0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x34, 0x70, 0x37, 0x2e, 0x73,
-  0x31, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x71,
-  0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x74,
-  0x30, 0x2c, 0x20, 0x74, 0x31, 0x70, 0x31, 0x2e, 0x73, 0x30, 0x29, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
-  0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x30, 0x2e, 0x73, 0x31,
-  0x2c, 0x20, 0x74, 0x32, 0x70, 0x32, 0x70, 0x33, 0x2e, 0x73, 0x30, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x20, 0x72, 0x32, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
-  0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x31, 0x2e, 0x73,
-  0x31, 0x2c, 0x20, 0x74, 0x33, 0x70, 0x34, 0x35, 0x36, 0x2e, 0x73, 0x30,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x72, 0x33, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69,
-  0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x32, 0x2e,
-  0x73, 0x31, 0x2c, 0x20, 0x74, 0x34, 0x70, 0x37, 0x2e, 0x73, 0x30, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x20, 0x72, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69,
-  0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x33, 0x2e,
-  0x73, 0x31, 0x2c, 0x20, 0x74, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28,
-  0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x7b, 0x20,
-  0x72, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x31, 0x2e, 0x73, 0x30,
-  0x2c, 0x20, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x33, 0x2e,
-  0x73, 0x30, 0x2c, 0x20, 0x72, 0x34, 0x35, 0x2e, 0x73, 0x30, 0x2c, 0x20,
-  0x72, 0x34, 0x35, 0x2e, 0x73, 0x31, 0x20, 0x7d, 0x3b, 0x0d, 0x0a, 0x7d,
-  0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
-  0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6d,
-  0x75, 0x6c, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70,
-  0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6e,
-  0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
-  0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20,
-  0x62, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x70, 0x30, 0x20, 0x3d, 0x20,
+  0x31, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x74, 0x33, 0x70, 0x34, 0x35,
+  0x36, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x53, 0x75, 0x6d, 0x28,
+  0x63, 0x70, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x64, 0x70, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x74, 0x32, 0x70, 0x32, 0x70, 0x33, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x74, 0x32, 0x70, 0x32, 0x70, 0x33, 0x2e, 0x73, 0x32, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x74, 0x34, 0x70, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x76, 0x65,
+  0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x70, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x65, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x33, 0x70,
+  0x34, 0x35, 0x36, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x33, 0x70, 0x34,
+  0x35, 0x36, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x74, 0x33, 0x70, 0x34, 0x35,
+  0x36, 0x2e, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x35, 0x20, 0x3d, 0x20, 0x61,
+  0x2d, 0x3e, 0x78, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x62, 0x2d, 0x3e,
+  0x78, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x65, 0x70, 0x2e, 0x73, 0x31,
+  0x20, 0x2b, 0x20, 0x74, 0x34, 0x70, 0x37, 0x2e, 0x73, 0x31, 0x3b, 0x0a,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x74, 0x30, 0x2c, 0x20, 0x74, 0x31,
+  0x70, 0x31, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x31, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x32, 0x70, 0x32,
+  0x70, 0x33, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x32, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x72, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x33, 0x70, 0x34,
+  0x35, 0x36, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x33, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x34, 0x70, 0x37,
+  0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x34, 0x35, 0x20, 0x3d, 0x20,
+  0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x72, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x35, 0x29, 0x3b, 0x0a,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
+  0x28, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x7b,
+  0x20, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x31, 0x2e, 0x73,
+  0x30, 0x2c, 0x20, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x33,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x34, 0x35, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x72, 0x34, 0x35, 0x2e, 0x73, 0x31, 0x20, 0x7d, 0x3b, 0x0a, 0x7d,
+  0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x65,
+  0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x75, 0x6c, 0x28,
+  0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76,
+  0x61, 0x74, 0x65, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x2a, 0x20, 0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20,
+  0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x48, 0x65,
+  0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x62, 0x29, 0x0a,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x70, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72,
+  0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x2c, 0x20,
+  0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x71,
+  0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28,
+  0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e,
+  0x78, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x31, 0x20, 0x3d, 0x20,
   0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78,
-  0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d,
-  0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x30, 0x20, 0x3d, 0x20, 0x74,
-  0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b,
-  0x30, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x20, 0x71, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
-  0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x2c,
-  0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0d, 0x0a,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72,
-  0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x2c, 0x20,
-  0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72,
-  0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28,
-  0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e,
-  0x78, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d,
+  0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d,
+  0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x72, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
+  0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x2d,
+  0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x32, 0x20, 0x3d,
   0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e,
   0x78, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x32,
-  0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20,
-  0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78,
-  0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
-  0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d,
-  0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x0d,
+  0x5d, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x33,
+  0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x29, 0x3b,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
-  0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f,
-  0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62,
-  0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x33,
-  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61,
-  0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78,
-  0x5b, 0x33, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x30, 0x20,
+  0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f,
+  0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x62,
+  0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x32, 0x20,
   0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d,
-  0x3e, 0x78, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b,
-  0x30, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x74,
+  0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b,
+  0x32, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x30,
+  0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x3b,
+  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72,
+  0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x34, 0x5d, 0x2c, 0x20,
+  0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x31,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x2d, 0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78,
+  0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x32, 0x20, 0x3d, 0x20, 0x74,
   0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b,
-  0x33, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x20, 0x74, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
-  0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x2c,
-  0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
-  0x74, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
-  0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x2d,
-  0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x34, 0x20,
-  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d,
-  0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b,
-  0x34, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x31, 0x20, 0x3d, 0x20,
-  0x70, 0x30, 0x2e, 0x73, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x32, 0x4c, 0x33,
-  0x34, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d,
-  0x28, 0x70, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x71, 0x30, 0x2e, 0x73,
-  0x30, 0x2c, 0x20, 0x71, 0x31, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
-  0x74, 0x33, 0x4c, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x78, 0x54,
-  0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2e, 0x73,
-  0x31, 0x2c, 0x20, 0x71, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x30,
-  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20,
-  0x72, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x32, 0x4c, 0x33, 0x34,
-  0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x34, 0x4c, 0x35, 0x36,
-  0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65,
-  0x53, 0x75, 0x6d, 0x28, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72,
-  0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x2c,
-  0x20, 0x73, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2e, 0x73,
-  0x30, 0x2c, 0x20, 0x73, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x33,
-  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x32, 0x4c, 0x33, 0x34, 0x2e, 0x73,
-  0x32, 0x2c, 0x20, 0x74, 0x33, 0x4c, 0x34, 0x35, 0x2e, 0x73, 0x31, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x33, 0x20, 0x78, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x6e, 0x69,
-  0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x73,
-  0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x31, 0x2e, 0x73, 0x31, 0x2c,
-  0x20, 0x73, 0x32, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x33, 0x2e, 0x73,
-  0x31, 0x2c, 0x20, 0x74, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x31,
-  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20,
-  0x74, 0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x34, 0x2e, 0x73, 0x30,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x33, 0x20, 0x74, 0x35, 0x4c, 0x36, 0x37, 0x20, 0x3d, 0x20,
-  0x73, 0x69, 0x78, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28,
-  0x78, 0x31, 0x32, 0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x78, 0x31, 0x32,
-  0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x78, 0x31, 0x32, 0x33, 0x2e, 0x73,
-  0x32, 0x2c, 0x20, 0x74, 0x33, 0x4c, 0x34, 0x35, 0x2e, 0x73, 0x32, 0x2c,
-  0x20, 0x74, 0x34, 0x4c, 0x35, 0x36, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x30,
-  0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x36, 0x20, 0x3d, 0x20,
-  0x74, 0x34, 0x4c, 0x35, 0x36, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x74,
-  0x35, 0x4c, 0x36, 0x37, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x35,
-  0x4c, 0x36, 0x37, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x30, 0x2e,
-  0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x31, 0x2e, 0x73, 0x31, 0x20, 0x2b,
-  0x20, 0x74, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x33, 0x2e,
-  0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x34, 0x2e, 0x73, 0x31, 0x20, 0x2b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d,
-  0x3e, 0x78, 0x5b, 0x35, 0x5d, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x78,
-  0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x34,
-  0x5d, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x20,
-  0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x20, 0x2a, 0x20,
-  0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x2d,
-  0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x78,
-  0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x31,
-  0x5d, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x34, 0x5d, 0x20,
-  0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20,
-  0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x35, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
-  0x72, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
-  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x76, 0x31, 0x2c, 0x20, 0x74, 0x32,
-  0x4c, 0x33, 0x34, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
+  0x32, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x74, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72,
+  0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x31, 0x5d, 0x2c, 0x20,
+  0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x34,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x78,
+  0x5b, 0x34, 0x5d, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x31, 0x20, 0x3d, 0x20, 0x70,
+  0x30, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x32, 0x4c, 0x33, 0x34, 0x20,
+  0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x70,
+  0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x71, 0x30, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x71, 0x31, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x33, 0x4c,
+  0x34, 0x35, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x78, 0x54, 0x68, 0x72, 0x65,
+  0x65, 0x53, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x71, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x30, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x32, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x74, 0x32, 0x4c, 0x33, 0x34, 0x2e, 0x73, 0x31,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x33, 0x20, 0x74, 0x34, 0x4c, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x6e,
+  0x69, 0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28,
+  0x72, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x31, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x30, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73,
+  0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x33, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x74, 0x32, 0x4c, 0x33, 0x34, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x74,
+  0x33, 0x4c, 0x34, 0x35, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x78, 0x31,
+  0x32, 0x33, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6e, 0x65, 0x54, 0x68, 0x72,
+  0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x73, 0x30, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x73, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x32, 0x2e, 0x73,
+  0x31, 0x2c, 0x20, 0x73, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x30,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x74, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x33, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x74, 0x34, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x35,
+  0x4c, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x78, 0x54, 0x68, 0x72,
+  0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x31, 0x32, 0x33, 0x2e, 0x73,
+  0x30, 0x2c, 0x20, 0x78, 0x31, 0x32, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x78, 0x31, 0x32, 0x33, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x74, 0x33, 0x4c,
+  0x34, 0x35, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x74, 0x34, 0x4c, 0x35, 0x36,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x76,
+  0x36, 0x20, 0x3d, 0x20, 0x74, 0x34, 0x4c, 0x35, 0x36, 0x2e, 0x73, 0x32,
+  0x20, 0x2b, 0x20, 0x74, 0x35, 0x4c, 0x36, 0x37, 0x2e, 0x73, 0x31, 0x20,
+  0x2b, 0x20, 0x74, 0x35, 0x4c, 0x36, 0x37, 0x2e, 0x73, 0x32, 0x20, 0x2b,
+  0x20, 0x74, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x31, 0x2e,
+  0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x2b,
+  0x20, 0x74, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x34, 0x2e,
+  0x73, 0x31, 0x20, 0x2b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x35, 0x5d, 0x20, 0x2a, 0x20, 0x62,
+  0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e,
+  0x78, 0x5b, 0x34, 0x5d, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b,
+  0x31, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x33, 0x5d,
+  0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2b,
+  0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a, 0x20, 0x62,
+  0x2d, 0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e,
+  0x78, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b,
+  0x34, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x30, 0x5d,
+  0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x78, 0x5b, 0x35, 0x5d, 0x3b, 0x0a,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x72, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
+  0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x76, 0x31, 0x2c, 0x20, 0x74,
+  0x32, 0x4c, 0x33, 0x34, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
   0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65,
   0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f,
   0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20,
-  0x74, 0x33, 0x4c, 0x34, 0x35, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a,
+  0x74, 0x33, 0x4c, 0x34, 0x35, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72,
+  0x65, 0x32, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77,
+  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x31, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x74, 0x34, 0x4c, 0x35, 0x36, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
-  0x72, 0x65, 0x32, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
-  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x31, 0x2e, 0x73, 0x31,
-  0x2c, 0x20, 0x74, 0x34, 0x4c, 0x35, 0x36, 0x2e, 0x73, 0x30, 0x29, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x72, 0x65, 0x33, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
-  0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x32, 0x2e,
-  0x73, 0x31, 0x2c, 0x20, 0x74, 0x35, 0x4c, 0x36, 0x37, 0x2e, 0x73, 0x30,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x71,
-  0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72,
-  0x65, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x76, 0x36, 0x29, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
-  0x28, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x7b,
-  0x20, 0x72, 0x65, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x31,
-  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x32, 0x2e, 0x73, 0x30, 0x2c,
-  0x20, 0x72, 0x65, 0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x34,
-  0x35, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x34, 0x35, 0x2e, 0x73,
-  0x31, 0x20, 0x7d, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d,
-  0x0a, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6c,
-  0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20,
-  0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x76, 0x29, 0x20, 0x7b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
-  0x28, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20,
-  0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76,
-  0x5b, 0x30, 0x5d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x76, 0x5b, 0x31, 0x5d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x32, 0x5d, 0x2c, 0x0d, 0x0a,
+  0x72, 0x65, 0x33, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x32, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x74, 0x35, 0x4c, 0x36, 0x37, 0x2e, 0x73, 0x30, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x72, 0x65, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
+  0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x33, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x76, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x48, 0x65, 0x78,
+  0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x7b, 0x20, 0x72, 0x65, 0x30,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x31, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x72, 0x65, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x33,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x34, 0x35, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x72, 0x65, 0x34, 0x35, 0x2e, 0x73, 0x31, 0x20, 0x7d, 0x3b,
+  0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20,
+  0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x77,
+  0x69, 0x63, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f,
+  0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x48, 0x65, 0x78, 0x44,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x61, 0x29, 0x0a, 0x7b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28,
+  0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20, 0x7b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e,
+  0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x31,
+  0x5d, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x32, 0x5d, 0x20, 0x2a,
+  0x20, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x33, 0x5d, 0x20, 0x2a, 0x20, 0x32, 0x2c,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e,
+  0x78, 0x5b, 0x34, 0x5d, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x78, 0x5b, 0x35,
+  0x5d, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d,
+  0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x63,
+  0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+  0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20,
+  0x76, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x28, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x76, 0x5b, 0x30, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x31, 0x5d, 0x2c, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x32, 0x5d, 0x2c, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x33, 0x5d,
-  0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76,
-  0x5b, 0x34, 0x5d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x76, 0x5b, 0x35, 0x5d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x7d, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-  0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69,
-  0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f,
-  0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x2a, 0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69,
-  0x6e, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0d, 0x0a, 0x20,
+  0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b,
+  0x34, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x76, 0x5b, 0x35, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b,
+  0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65,
+  0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61,
+  0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f,
+  0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74,
+  0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63,
-  0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x2a, 0x20, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e,
-  0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x2a, 0x20, 0x79, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x78, 0x2c, 0x20, 0x5f,
+  0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x79, 0x2c, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61,
-  0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x70,
-  0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e,
-  0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x70, 0x68,
-  0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x69,
-  0x6e, 0x74, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x2c, 0x20, 0x69,
-  0x6e, 0x74, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x2c, 0x0d, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e,
+  0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x2a, 0x20, 0x70, 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73,
+  0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a,
+  0x20, 0x70, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78,
+  0x49, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6d,
+  0x6f, 0x6f, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x75,
+  0x6c, 0x69, 0x61, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63,
-  0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x2a, 0x20, 0x6a, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x63, 0x6f,
-  0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x2a, 0x20, 0x6a, 0x79, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20,
-  0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c,
-  0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e,
-  0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x79,
-  0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x77,
-  0x69, 0x64, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78,
-  0x6c, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x78,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44,
+  0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e,
+  0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x6a, 0x78,
+  0x2c, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x6a, 0x79, 0x29,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67,
+  0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x78, 0x20,
+  0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x77, 0x69,
+  0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x20, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20,
+  0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x78, 0x6c, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64, 0x28,
+  0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44,
   0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x74, 0x20, 0x3d, 0x20, 0x6c,
-  0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x79, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58,
-  0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x70, 0x77,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53,
-  0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64,
-  0x48, 0x64, 0x28, 0x70, 0x68, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x70, 0x78, 0x68, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x70, 0x78, 0x2c,
-  0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c,
-  0x20, 0x30, 0x20, 0x7d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48,
-  0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x79, 0x68,
-  0x20, 0x3d, 0x20, 0x7b, 0x20, 0x70, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20,
+  0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20,
+  0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x70, 0x77, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
+  0x6c, 0x65, 0x59, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64,
+  0x28, 0x70, 0x68, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48,
+  0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x78, 0x68,
+  0x20, 0x3d, 0x20, 0x7b, 0x20, 0x70, 0x78, 0x2c, 0x20, 0x30, 0x2c, 0x20,
   0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d,
-  0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78,
-  0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x61, 0x4f, 0x66, 0x66,
-  0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x26, 0x70, 0x69, 0x78, 0x65,
-  0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x2c, 0x20, 0x26, 0x70, 0x78,
-  0x68, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78,
-  0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x62, 0x4f, 0x66, 0x66,
-  0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x26, 0x70, 0x69, 0x78, 0x65,
-  0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x2c, 0x20, 0x26, 0x70, 0x79,
-  0x68, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78,
-  0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x61, 0x20, 0x3d, 0x20,
-  0x61, 0x64, 0x64, 0x28, 0x26, 0x63, 0x61, 0x4f, 0x66, 0x66, 0x2c, 0x20,
-  0x26, 0x78, 0x6c, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78,
-  0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x2a, 0x20, 0x70,
-  0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x62,
-  0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x26, 0x63, 0x62, 0x4f, 0x66,
-  0x66, 0x2c, 0x20, 0x26, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20,
-  0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x20,
-  0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x61, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x79, 0x68, 0x20, 0x3d, 0x20, 0x7b, 0x20,
+  0x70, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c,
+  0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x3b, 0x0a, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x63, 0x61, 0x4f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28,
+  0x26, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58,
+  0x2c, 0x20, 0x26, 0x70, 0x78, 0x68, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63,
+  0x62, 0x4f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x26,
+  0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x2c,
+  0x20, 0x26, 0x70, 0x79, 0x68, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x61,
+  0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x26, 0x63, 0x61, 0x4f, 0x66,
+  0x66, 0x2c, 0x20, 0x26, 0x78, 0x6c, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20,
+  0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20,
+  0x2a, 0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c, 0x0a, 0x20, 0x20,
   0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x62, 0x20, 0x3d, 0x20, 0x63, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21,
-  0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61,
-  0x64, 0x48, 0x64, 0x28, 0x6a, 0x78, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x6c,
-  0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x6a, 0x79, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28,
-  0x6e, 0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29,
-  0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x61,
-  0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x26, 0x61, 0x2c, 0x20, 0x26,
-  0x61, 0x29, 0x3b, 0x20, 0x2f, 0x2a, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x20,
-  0x61, 0x64, 0x64, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x69, 0x6e, 0x67,
-  0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x2f,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65,
-  0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x62, 0x20, 0x3d,
-  0x20, 0x6d, 0x75, 0x6c, 0x28, 0x26, 0x62, 0x2c, 0x20, 0x26, 0x62, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48,
-  0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x62, 0x20,
-  0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x26, 0x61, 0x2c, 0x20, 0x26, 0x62,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x69,
-  0x6e, 0x75, 0x73, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x2d, 0x62,
-  0x62, 0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e,
-  0x78, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x78, 0x5b,
-  0x32, 0x5d, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x78, 0x5b, 0x33, 0x5d,
-  0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x78, 0x5b, 0x34, 0x5d, 0x2c, 0x20,
-  0x2d, 0x62, 0x62, 0x2e, 0x78, 0x5b, 0x35, 0x5d, 0x20, 0x7d, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78,
-  0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x61, 0x6d, 0x62, 0x62,
-  0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x26, 0x61, 0x61, 0x2c, 0x20,
-  0x26, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x29, 0x3b, 0x0d, 0x0a,
+  0x63, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x26, 0x63, 0x62,
+  0x4f, 0x66, 0x66, 0x2c, 0x20, 0x26, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f,
+  0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
+  0x59, 0x20, 0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x62, 0x20, 0x3d, 0x20, 0x63, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x66, 0x20, 0x28, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d,
+  0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x63, 0x61, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48,
+  0x64, 0x28, 0x6a, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64,
+  0x48, 0x64, 0x28, 0x6a, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6e,
+  0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68,
+  0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78,
+  0x49, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x62, 0x61, 0x62, 0x20, 0x3d,
-  0x20, 0x61, 0x64, 0x64, 0x28, 0x26, 0x61, 0x62, 0x2c, 0x20, 0x26, 0x61,
-  0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x26, 0x61, 0x61,
-  0x6d, 0x62, 0x62, 0x2c, 0x20, 0x26, 0x63, 0x61, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20,
-  0x61, 0x64, 0x64, 0x28, 0x26, 0x61, 0x62, 0x61, 0x62, 0x2c, 0x20, 0x26,
-  0x63, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x61, 0x2e, 0x78, 0x5b, 0x30,
-  0x5d, 0x20, 0x2b, 0x20, 0x62, 0x62, 0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x20,
-  0x3e, 0x20, 0x31, 0x36, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x2b,
-  0x2b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x20, 0x2b, 0x20,
-  0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28, 0x6c, 0x6f, 0x67,
-  0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29, 0x20, 0x2f, 0x20,
-  0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
-  0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x20,
-  0x2d, 0x20, 0x31, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d,
-  0x20, 0x6d, 0x61, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65,
-  0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74,
-  0x68, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69,
-  0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20,
-  0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61,
-  0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x78, 0x5b,
-  0x30, 0x5d, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x20,
-  0x2a, 0x20, 0x62, 0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x29, 0x20, 0x2a, 0x20,
-  0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69,
-  0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20,
-  0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x20, 0x2b,
-  0x20, 0x31, 0x20, 0x2d, 0x20, 0x28, 0x61, 0x20, 0x2a, 0x20, 0x61, 0x20,
-  0x2b, 0x20, 0x62, 0x20, 0x2a, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x31, 0x36,
-  0x29, 0x20, 0x2f, 0x20, 0x28, 0x32, 0x35, 0x36, 0x20, 0x2d, 0x20, 0x31,
-  0x36, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b,
-  0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69,
-  0x64, 0x28, 0x30, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x35, 0x3b, 0x0d, 0x0a,
-  0x7d, 0x0d, 0x0a, 0x0d, 0x0a
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x6d,
+  0x75, 0x6c, 0x28, 0x26, 0x61, 0x2c, 0x20, 0x26, 0x61, 0x29, 0x3b, 0x20,
+  0x2f, 0x2a, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x20, 0x61, 0x64, 0x64, 0x20,
+  0x73, 0x71, 0x75, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28,
+  0x26, 0x62, 0x2c, 0x20, 0x26, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28,
+  0x26, 0x61, 0x2c, 0x20, 0x26, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x20, 0x3d,
+  0x20, 0x7b, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x2c,
+  0x20, 0x2d, 0x62, 0x62, 0x2e, 0x78, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x2d,
+  0x62, 0x62, 0x2e, 0x78, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x2d, 0x62, 0x62,
+  0x2e, 0x78, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x78,
+  0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x78, 0x5b, 0x35,
+  0x5d, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x48, 0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
+  0x61, 0x6d, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x26,
+  0x61, 0x61, 0x2c, 0x20, 0x26, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48,
+  0x65, 0x78, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x62, 0x61,
+  0x62, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x69, 0x63, 0x65, 0x28, 0x26, 0x61,
+  0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x26, 0x61, 0x61, 0x6d,
+  0x62, 0x62, 0x2c, 0x20, 0x26, 0x63, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64,
+  0x64, 0x28, 0x26, 0x61, 0x62, 0x61, 0x62, 0x2c, 0x20, 0x26, 0x63, 0x62,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x66, 0x20, 0x28, 0x61, 0x61, 0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2b,
+  0x20, 0x62, 0x62, 0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x3e, 0x20, 0x31,
+  0x36, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f,
+  0x20, 0x4e, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67,
+  0x20, 0x28, 0x6c, 0x6f, 0x67, 0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29,
+  0x7c, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20,
+  0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x31, 0x29,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x49,
+  0x74, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73,
+  0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x20, 0x21,
+  0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29,
+  0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f,
+  0x67, 0x32, 0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61, 0x2e, 0x78, 0x5b, 0x30,
+  0x5d, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2b,
+  0x20, 0x62, 0x2e, 0x78, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20, 0x62, 0x2e,
+  0x78, 0x5b, 0x30, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c,
+  0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20,
+  0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29,
+  0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x28, 0x61, 0x20,
+  0x2a, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x20, 0x2a, 0x20, 0x62, 0x20,
+  0x2d, 0x20, 0x31, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x32, 0x35, 0x36,
+  0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x41, 0x5b, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61,
+  0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x35,
+  0x3b, 0x0a, 0x7d, 0x0a, 0x0a
 };
-unsigned int hexdouble_cl_len = 7205;
+unsigned int hexdouble_cl_len = 7241;

+ 272 - 0
libmandel/src/opencl/octadouble.cl

@@ -0,0 +1,272 @@
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#pragma OPENCL FP_CONTRACT OFF
+
+
+typedef double8 OctaDouble;
+
+inline double2 twoSum(double a, double b) {
+    double s = a + b;
+    double bb = s - a;
+    double e = (a - (s - bb)) + (b - bb);
+    return (double2)(s, e);
+}
+
+inline double two_sum(double a, double b, double* err) {
+    double s = a + b;
+    double bb = s - a;
+    *err = (a - (s - bb)) + (b - bb);
+    return s;
+}
+
+inline double2 quickTwoSum(double a, double b) {
+    double s = a + b;
+    double e = b - (s - a);
+    return (double2)(s, e);
+}
+
+
+inline double2 twoProd(double a, double b) {
+    double p = a * b;
+    double e = fma(a, b, -p);
+    return (double2)(p, e);
+}
+
+
+inline double3 threeSum(double a, double b, double c)
+{
+    double2 x = twoSum(a, b);
+    double2 y = twoSum(x.s0, c);
+    double2 z = twoSum(x.s1, y.s1);
+    return (double3)(y.s0, z.s0, z.s1);
+}
+
+
+inline double4 fourSum(double a, double b, double c, double d)
+{
+    double2 x = twoSum(a, b);
+    double2 y = twoSum(x.s0, c);
+    double2 z = twoSum(y.s0, d);
+    double3 r = threeSum(x.s1, y.s1, z.s1);
+    return (double4)(z.s0, r.s0, r.s1, r.s2);
+}
+
+
+inline double2 fiveTwoSum(double a, double b, double c, double d, double e)
+{
+    double2 x = twoSum(a, b);
+    double2 y = twoSum(x.s0, c);
+    double2 z = twoSum(y.s0, d);
+    double2 w = twoSum(z.s0, e);
+    return (double2)(w.s0, x.s1 + y.s1 + z.s1 + w.s1);
+}
+
+
+inline double3 sixThreeSum(double a, double b, double c, double d, double e, double f)
+{
+    double3 av = threeSum(a, b, c);
+    double3 bv = threeSum(d, e, f);
+    
+    double2 r1t1 = twoSum(av.s0, bv.s0);
+    double2 t2t3 = twoSum(av.s1, bv.s1);
+    double t4 = av.s2 + bv.s2;
+
+    double2 r2t5 = twoSum(r1t1.s1, t2t3.s0);
+    double r3 = t4 + t2t3.s1 + r2t5.s1;
+    return (double3)(r1t1.s0, r2t5.s0, r3);
+}
+
+
+inline double3 nineThreeSum(double a, double b, double c, double d, double e,
+                            double f, double g, double h, double i)
+{
+    double3 av = threeSum(a, b, c);
+    double3 bv = threeSum(d, e, f);
+    double3 cv = threeSum(g, h, i);
+    
+    double3 r1t1t2 = threeSum(av.s0, bv.s0, cv.s0);
+    double4 r2t3t4t5 = fourSum(av.s1, bv.s1, cv.s1, r1t1t2.s1);
+    double r3 = av.s2 + bv.s2 + cv.s2 + r1t1t2.s2 + r2t3t4t5.s1 + r2t3t4t5.s2 + r2t3t4t5.s3;
+    return (double3)(r1t1t2.s0, r2t3t4t5.s0, r3);
+}
+
+
+inline OctaDouble add(const __private OctaDouble* a, const __private OctaDouble* b)
+{
+    double2 ap = twoSum(a->s0, b->s0);
+    double2 bp = twoSum(a->s1, b->s1);
+    double2 cp = twoSum(a->s2, b->s2);
+    double2 dp = twoSum(a->s3, b->s3);
+    double2 ep = twoSum(a->s4, b->s4);
+    double2 fp = twoSum(a->s5, b->s5);
+    double2 gp = twoSum(a->s6, b->s6);
+
+    double t0 = ap.s0;
+    double2 t1p1 = twoSum(ap.s1, bp.s0);
+    double3 t2p2p3 = threeSum(bp.s1, cp.s0, t1p1.s1);
+    double4 t3p456 = fourSum(cp.s1, dp.s0, t2p2p3.s1, t2p2p3.s2);
+    double3 t4p78 = sixThreeSum(dp.s1, ep.s0, t3p456.s1, t3p456.s2, t3p456.s3, 0.0);
+    double3 t5p910 = sixThreeSum(ep.s1, fp.s0, t4p78.s1, t4p78.s2, 0.0, 0.0);
+    double2 t6p11 = fiveTwoSum(fp.s1, gp.s0, t5p910.s1, t5p910.s2, 0.0);
+    double t7 = a->s7 + b->s7 + gp.s1 + t6p11.s1;
+
+    double2 r0 = quickTwoSum(t0, t1p1.s0);
+    double2 r1 = quickTwoSum(r0.s1, t2p2p3.s0);
+    double2 r2 = quickTwoSum(r1.s1, t3p456.s0);
+    double2 r3 = quickTwoSum(r2.s1, t4p78.s0);
+    double2 r4 = quickTwoSum(r3.s1, t5p910.s0);
+    double2 r5 = quickTwoSum(r4.s1, t6p11.s0);
+    double2 r67 = quickTwoSum(r5.s1, t7);
+
+    return (OctaDouble)(r0.s0, r1.s0, r2.s0, r3.s0, r4.s0, r5.s0, r67.s0, r67.s1);
+}
+
+
+inline OctaDouble mul(const __private OctaDouble* a, const __private OctaDouble* b)
+{
+
+    double r[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+    for (int i = 0; i < 8; i++) {
+        for (int j = 0; i + j < 8; j++) {
+            double2 se = twoProd((*a)[i], (*b)[j]);
+            for (int k = 0; k < 8; k++) {
+                double3 x123 = threeSum(r[k], se.s0, se.s1);
+                r[k] = x123.s0;
+                se.s0 = x123.s1;
+                se.s1 = x123.s2;
+            }
+        }
+    }
+
+    return (OctaDouble) (r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7]);
+    /*double2 p0 = twoProd(a->s0, b->s0);
+
+    double2 q0 = twoProd(a->s0, b->s1);
+    double2 q1 = twoProd(a->s1, b->s0);
+
+    double2 r0 = twoProd(a->s2, b->s0);
+    double2 r1 = twoProd(a->s1, b->s1);
+    double2 r2 = twoProd(a->s0, b->s2);
+
+    double2 s0 = twoProd(a->s3, b->s0);
+    double2 s1 = twoProd(a->s2, b->s1);
+    double2 s2 = twoProd(a->s1, b->s2);
+    double2 s3 = twoProd(a->s0, b->s3);
+
+    double2 t0 = twoProd(a->s4, b->s0);
+    double2 t1 = twoProd(a->s3, b->s1);
+    double2 t2 = twoProd(a->s2, b->s2);
+    double2 t3 = twoProd(a->s1, b->s3);
+    double2 t4 = twoProd(a->s0, b->s4);
+
+    double2 u0 = twoProd(a->s5, b->s0);
+    double2 u1 = twoProd(a->s4, b->s1);
+    double2 u2 = twoProd(a->s3, b->s2);
+    double2 u3 = twoProd(a->s2, b->s3);
+    double2 u4 = twoProd(a->s1, b->s4);
+    double2 u5 = twoProd(a->s0, b->s5);
+
+    double v1 = p0.s0;
+    double3 t2L34 = threeSum(p0.s1, q0.s0, q1.s0);
+    double3 t3L45 = sixThreeSum(q0.s1, q1.s1, r0.s0, r1.s0, r2.s0, t2L34.s1);
+    double3 t4L56 = nineThreeSum(r0.s1, r1.s1, r2.s1, s0.s0, s1.s0, s2.s0, s3.s0, t2L34.s2, t3L45.s1);
+    double3 x123 = nineThreeSum(s0.s1, s1.s1, s2.s1, s3.s1, t0.s0, t1.s0, t2.s0, t3.s0, t4.s0);
+    double3 t5L67 = sixThreeSum(x123.s0, x123.s1, x123.s2, t3L45.s2, t4L56.s1, t4L56.s2);
+    double3 x456 = nineThreeSum(t0.s1, t1.s1, t2.s1, t3.s1, t4.s1, u0.s0, u1.s0, u2.s0, u3.s0);
+    double3 t6L89 = nineThreeSum(x456.s0, x456.s1, x456.s2, t5L67.s1, t5L67.s2, u4.s0, u5.s0, 0.0, 0.0);
+
+    double v7 = t6L89.s1 + t6L89.s2 + 
+        a->s6 * b->s0 + a->s5 * b->s1 + a->s4 * b->s2 + a->s3 * b->s3 + a->s2 * b->s4 + a->s1 * b->s5 + a->s0 * b->s6;
+
+    double2 re0 = quickTwoSum(v1, t2L34.s0);
+    double2 re1 = quickTwoSum(re0.s1, t3L45.s0);
+    double2 re2 = quickTwoSum(re1.s1, t4L56.s0);
+    double2 re3 = quickTwoSum(re2.s1, t5L67.s0);
+    double2 re4 = quickTwoSum(re3.s1, t6L89.s0);
+    double2 re56 = quickTwoSum(re4.s1, v7);
+    return (OctaDouble)(re0.s0, re1.s0, re2.s0, re3.s0, re4.s0, re56.s0, re56.s1, 0.0);*/
+}
+
+
+inline OctaDouble twice(const __private OctaDouble* a)
+{
+    return (OctaDouble) (
+        a->s0 * 2,
+        a->s1 * 2,
+        a->s2 * 2,
+        a->s3 * 2,
+        a->s4 * 2,
+        a->s5 * 2,
+        a->s6 * 2,
+        a->s7 * 2
+    );
+}
+
+
+OctaDouble loadHd(const __constant double* v) {
+    return (OctaDouble) (
+        v[0],
+        v[1],
+        v[2],
+        v[3],
+        v[4],
+        v[5],
+        v[6],
+        v[7]
+    );
+}
+
+
+__kernel void iterate(__global float* A, const int width,
+                      __constant double* x, __constant double* y,
+                      __constant double* pw, __constant double* ph, int maxIter, int smooth, int julia,
+                      __constant double* jx, __constant double* jy) {
+    int index = get_global_id(0);
+    int px = index % width;
+    int py = index / width;
+
+    OctaDouble xl = loadHd(x);
+    OctaDouble yt = loadHd(y);
+    OctaDouble pixelScaleX = loadHd(pw);
+    OctaDouble pixelScaleY = loadHd(ph);
+
+    OctaDouble pxh = { px, 0, 0, 0, 0, 0, 0, 0 };
+    OctaDouble pyh = { py, 0, 0, 0, 0, 0, 0, 0 };
+
+    OctaDouble caOff = mul(&pixelScaleX, &pxh);
+    OctaDouble cbOff = mul(&pixelScaleY, &pyh);
+    OctaDouble ca = add(&caOff, &xl); // pixelScaleX * px + xl
+    OctaDouble cb = add(&cbOff, &yt); // pixelScaleY * py + yt
+    OctaDouble a = ca;
+    OctaDouble b = cb;
+    if (julia != 0) {
+        ca = loadHd(jx);
+        cb = loadHd(jy);
+    }
+
+    int n = 0;
+    while (n < maxIter - 1) {
+        OctaDouble aa = mul(&a, &a); /* TODO add squaring function */
+        OctaDouble bb = mul(&b, &b);
+        OctaDouble ab = mul(&a, &b);
+        OctaDouble minusbb = (OctaDouble)(-bb.s0, -bb.s1, -bb.s2, -bb.s3, -bb.s4, -bb.s5, -bb.s6, -bb.s7);
+        OctaDouble aambb = add(&aa, &minusbb);
+        OctaDouble abab = twice(&ab);
+        a = add(&aambb, &ca);
+        b = add(&abab, &cb);
+        if (aa.s0 + bb.s0 > 16) break;
+        n++;
+    }
+
+    // N + 1 - log (log  |Z(N)|) / log 2
+    if (n >= maxIter - 1)
+        A[index] = maxIter;
+    else {
+        if (smooth != 0)
+            A[index] = ((float) n) + 1 - log2(log(a.s0 * a.s0 + b.s0 * b.s0) * 0.5);
+        else
+            A[index] = ((float)n);
+    }
+    //               A[index] = ((float)n) + 1 - (a * a + b * b - 16) / (256 - 16);
+    //           A[get_global_id(0)] = 5;
+}
+

+ 712 - 0
libmandel/src/opencl/octadouble.h

@@ -0,0 +1,712 @@
+unsigned char octadouble_cl[] = {
+  0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e,
+  0x43, 0x4c, 0x20, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e,
+  0x20, 0x63, 0x6c, 0x5f, 0x6b, 0x68, 0x72, 0x5f, 0x66, 0x70, 0x36, 0x34,
+  0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x23, 0x70,
+  0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4c,
+  0x20, 0x46, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54,
+  0x20, 0x4f, 0x46, 0x46, 0x0a, 0x0a, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64,
+  0x65, 0x66, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x38, 0x20, 0x4f,
+  0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x3b, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61,
+  0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x20,
+  0x2d, 0x20, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d,
+  0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x29, 0x20, 0x2b,
+  0x20, 0x28, 0x62, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65,
+  0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x5f,
+  0x73, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x65, 0x72, 0x72, 0x29,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x62, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x2a, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x28,
+  0x61, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29,
+  0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
+  0x20, 0x73, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e,
+  0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x75,
+  0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61,
+  0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d,
+  0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29,
+  0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x77, 0x6f,
+  0x50, 0x72, 0x6f, 0x64, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2a, 0x20, 0x62, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x61, 0x2c, 0x20, 0x62,
+  0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
+  0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x29, 0x28, 0x70, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d,
+  0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53,
+  0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x29, 0x0a, 0x7b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x78,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c,
+  0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x78, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x79, 0x2e, 0x73, 0x31, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
+  0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x79,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x7a, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x7a,
+  0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e,
+  0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
+  0x20, 0x66, 0x6f, 0x75, 0x72, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x63, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x29,
+  0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75,
+  0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x79, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x79, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x64,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x33, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65,
+  0x53, 0x75, 0x6d, 0x28, 0x78, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x79, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x7a, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x7a, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x72, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x72, 0x2e, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a,
+  0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x66, 0x69, 0x76, 0x65, 0x54, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x65, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x78, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x7a, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x79, 0x2e, 0x73,
+  0x30, 0x2c, 0x20, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x77, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x7a, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
+  0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29,
+  0x28, 0x77, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x78, 0x2e, 0x73, 0x31, 0x20,
+  0x2b, 0x20, 0x79, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x7a, 0x2e, 0x73,
+  0x31, 0x20, 0x2b, 0x20, 0x77, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d,
+  0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x73, 0x69, 0x78, 0x54, 0x68, 0x72,
+  0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x2c, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x66, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x76, 0x20, 0x3d,
+  0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c,
+  0x20, 0x62, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x62, 0x76, 0x20, 0x3d,
+  0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x2c,
+  0x20, 0x65, 0x2c, 0x20, 0x66, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x72, 0x31, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x61, 0x76, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x76,
+  0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x32, 0x74, 0x33, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x76, 0x2e, 0x73,
+  0x31, 0x2c, 0x20, 0x62, 0x76, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x34,
+  0x20, 0x3d, 0x20, 0x61, 0x76, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x62,
+  0x76, 0x2e, 0x73, 0x32, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x32, 0x74, 0x35, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x31, 0x74,
+  0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x32, 0x74, 0x33, 0x2e, 0x73,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x72, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x34, 0x20, 0x2b,
+  0x20, 0x74, 0x32, 0x74, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x72,
+  0x32, 0x74, 0x35, 0x2e, 0x73, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x33, 0x29, 0x28, 0x72, 0x31, 0x74, 0x31, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x72, 0x32, 0x74, 0x35, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72,
+  0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69,
+  0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x6e,
+  0x69, 0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x63, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x64, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65,
+  0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x66, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x67,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x68, 0x2c, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x29, 0x0a, 0x7b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x61, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75,
+  0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x62, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75,
+  0x6d, 0x28, 0x64, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x66, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x63, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75,
+  0x6d, 0x28, 0x67, 0x2c, 0x20, 0x68, 0x2c, 0x20, 0x69, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x33, 0x20, 0x72, 0x31, 0x74, 0x31, 0x74, 0x32, 0x20,
+  0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x61,
+  0x76, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x76, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x63, 0x76, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x72, 0x32, 0x74,
+  0x33, 0x74, 0x34, 0x74, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x75, 0x72,
+  0x53, 0x75, 0x6d, 0x28, 0x61, 0x76, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62,
+  0x76, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x63, 0x76, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x72, 0x31, 0x74, 0x31, 0x74, 0x32, 0x2e, 0x73, 0x31, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x72, 0x33, 0x20, 0x3d, 0x20, 0x61, 0x76, 0x2e, 0x73, 0x32, 0x20, 0x2b,
+  0x20, 0x62, 0x76, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x63, 0x76, 0x2e,
+  0x73, 0x32, 0x20, 0x2b, 0x20, 0x72, 0x31, 0x74, 0x31, 0x74, 0x32, 0x2e,
+  0x73, 0x32, 0x20, 0x2b, 0x20, 0x72, 0x32, 0x74, 0x33, 0x74, 0x34, 0x74,
+  0x35, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x72, 0x32, 0x74, 0x33, 0x74,
+  0x34, 0x74, 0x35, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x72, 0x32, 0x74,
+  0x33, 0x74, 0x34, 0x74, 0x35, 0x2e, 0x73, 0x33, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x72, 0x31, 0x74, 0x31, 0x74,
+  0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x32, 0x74, 0x33, 0x74, 0x34,
+  0x74, 0x35, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x33, 0x29, 0x3b, 0x0a,
+  0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x4f,
+  0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x64,
+  0x64, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70, 0x72,
+  0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6e,
+  0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
+  0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a,
+  0x20, 0x62, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c,
+  0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x62, 0x70, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e,
+  0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x63, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x61, 0x2d, 0x3e, 0x73, 0x32, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x32,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x64, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x33, 0x2c, 0x20, 0x62, 0x2d,
+  0x3e, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x34, 0x2c,
+  0x20, 0x62, 0x2d, 0x3e, 0x73, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x66, 0x70, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2d, 0x3e,
+  0x73, 0x35, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x35, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x67, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x61, 0x2d, 0x3e, 0x73, 0x36, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x36,
+  0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x2e, 0x73,
+  0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x74, 0x31, 0x70, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x70, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x62, 0x70, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x32, 0x70, 0x32,
+  0x70, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75,
+  0x6d, 0x28, 0x62, 0x70, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x63, 0x70, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x70, 0x31, 0x2e, 0x73, 0x31, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x34, 0x20, 0x74, 0x33, 0x70, 0x34, 0x35, 0x36, 0x20, 0x3d, 0x20, 0x66,
+  0x6f, 0x75, 0x72, 0x53, 0x75, 0x6d, 0x28, 0x63, 0x70, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x64, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x32, 0x70,
+  0x32, 0x70, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x32, 0x70, 0x32,
+  0x70, 0x33, 0x2e, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x34, 0x70, 0x37,
+  0x38, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x78, 0x54, 0x68, 0x72, 0x65, 0x65,
+  0x53, 0x75, 0x6d, 0x28, 0x64, 0x70, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x65,
+  0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x33, 0x70, 0x34, 0x35, 0x36,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x33, 0x70, 0x34, 0x35, 0x36, 0x2e,
+  0x73, 0x32, 0x2c, 0x20, 0x74, 0x33, 0x70, 0x34, 0x35, 0x36, 0x2e, 0x73,
+  0x33, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x35, 0x70,
+  0x39, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x78, 0x54, 0x68, 0x72,
+  0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x65, 0x70, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x66, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x34, 0x70, 0x37,
+  0x38, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x34, 0x70, 0x37, 0x38, 0x2e,
+  0x73, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x74, 0x36, 0x70, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x66,
+  0x69, 0x76, 0x65, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x66, 0x70,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x67, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x74, 0x35, 0x70, 0x39, 0x31, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74,
+  0x35, 0x70, 0x39, 0x31, 0x30, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x30, 0x2e,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x74, 0x37, 0x20, 0x3d, 0x20, 0x61, 0x2d, 0x3e, 0x73,
+  0x37, 0x20, 0x2b, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x37, 0x20, 0x2b, 0x20,
+  0x67, 0x70, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x36, 0x70, 0x31,
+  0x31, 0x2e, 0x73, 0x31, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x30, 0x20, 0x3d, 0x20,
+  0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x74, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x70, 0x31, 0x2e, 0x73, 0x30, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
+  0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x30, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x74, 0x32, 0x70, 0x32, 0x70, 0x33, 0x2e, 0x73, 0x30, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x72, 0x32, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
+  0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x31, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x74, 0x33, 0x70, 0x34, 0x35, 0x36, 0x2e, 0x73, 0x30, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x72, 0x33, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
+  0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x32, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x74, 0x34, 0x70, 0x37, 0x38, 0x2e, 0x73, 0x30, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x72, 0x34, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x74, 0x35, 0x70, 0x39, 0x31, 0x30, 0x2e, 0x73, 0x30, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x72, 0x35, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x34, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x74, 0x36, 0x70, 0x31, 0x31, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x72, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x35, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x74, 0x37, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
+  0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4f, 0x63, 0x74, 0x61, 0x44,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x28, 0x72, 0x30, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x32, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x72, 0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72,
+  0x34, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x35, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x72, 0x36, 0x37, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x36, 0x37,
+  0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e,
+  0x6c, 0x69, 0x6e, 0x65, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x63, 0x6f, 0x6e, 0x73,
+  0x74, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20,
+  0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20,
+  0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70,
+  0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x62, 0x29, 0x0a, 0x7b, 0x0a,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x72, 0x5b, 0x38, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20,
+  0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20,
+  0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20,
+  0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x38,
+  0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e,
+  0x74, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x2b,
+  0x20, 0x6a, 0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, 0x6a, 0x2b, 0x2b, 0x29,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73,
+  0x65, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28,
+  0x28, 0x2a, 0x61, 0x29, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x28, 0x2a, 0x62,
+  0x29, 0x5b, 0x6a, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28,
+  0x69, 0x6e, 0x74, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x6b,
+  0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, 0x6b, 0x2b, 0x2b, 0x29, 0x20, 0x7b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33,
+  0x20, 0x78, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65,
+  0x65, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x5b, 0x6b, 0x5d, 0x2c, 0x20, 0x73,
+  0x65, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x65, 0x2e, 0x73, 0x31, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x5b, 0x6b, 0x5d, 0x20, 0x3d,
+  0x20, 0x78, 0x31, 0x32, 0x33, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x65, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x31,
+  0x32, 0x33, 0x2e, 0x73, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x65, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x78, 0x31, 0x32, 0x33, 0x2e,
+  0x73, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4f,
+  0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20, 0x28,
+  0x72, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x72, 0x5b, 0x31, 0x5d, 0x2c, 0x20,
+  0x72, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x72, 0x5b, 0x33, 0x5d, 0x2c, 0x20,
+  0x72, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x72, 0x5b, 0x35, 0x5d, 0x2c, 0x20,
+  0x72, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x72, 0x5b, 0x37, 0x5d, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2a, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x70, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
+  0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c, 0x20, 0x62,
+  0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x30, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e,
+  0x73, 0x30, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x71, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
+  0x28, 0x61, 0x2d, 0x3e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73,
+  0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x32, 0x2c,
+  0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x31, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d,
+  0x3e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x72, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f,
+  0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2d, 0x3e,
+  0x73, 0x32, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x33,
+  0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x31,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x2d, 0x3e, 0x73, 0x32, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72,
+  0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d,
+  0x3e, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30,
+  0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74,
+  0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28,
+  0x61, 0x2d, 0x3e, 0x73, 0x34, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
+  0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x33, 0x2c, 0x20, 0x62,
+  0x2d, 0x3e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x32, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73,
+  0x32, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74,
+  0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28,
+  0x61, 0x2d, 0x3e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x33,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x74, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
+  0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c, 0x20, 0x62,
+  0x2d, 0x3e, 0x73, 0x34, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x75, 0x30, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e,
+  0x73, 0x35, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x75, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
+  0x28, 0x61, 0x2d, 0x3e, 0x73, 0x34, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73,
+  0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x75, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x33, 0x2c, 0x20,
+  0x62, 0x2d, 0x3e, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x75, 0x33, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e,
+  0x73, 0x32, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x33, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x75, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
+  0x28, 0x61, 0x2d, 0x3e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73,
+  0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x75, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c, 0x20,
+  0x62, 0x2d, 0x3e, 0x73, 0x35, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x31, 0x20, 0x3d,
+  0x20, 0x70, 0x30, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x32, 0x4c, 0x33,
+  0x34, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d,
+  0x28, 0x70, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x71, 0x30, 0x2e, 0x73,
+  0x30, 0x2c, 0x20, 0x71, 0x31, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74,
+  0x33, 0x4c, 0x34, 0x35, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x78, 0x54, 0x68,
+  0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x71, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x30, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72,
+  0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x32, 0x4c, 0x33, 0x34, 0x2e,
+  0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x34, 0x4c, 0x35, 0x36, 0x20, 0x3d,
+  0x20, 0x6e, 0x69, 0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75,
+  0x6d, 0x28, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x31, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x73,
+  0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x73, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x33, 0x2e, 0x73,
+  0x30, 0x2c, 0x20, 0x74, 0x32, 0x4c, 0x33, 0x34, 0x2e, 0x73, 0x32, 0x2c,
+  0x20, 0x74, 0x33, 0x4c, 0x34, 0x35, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x78, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6e, 0x65, 0x54,
+  0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x73, 0x30, 0x2e, 0x73,
+  0x31, 0x2c, 0x20, 0x73, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x32,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x74, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x74, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x33, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x74, 0x34, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x74, 0x35, 0x4c, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x78, 0x54,
+  0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x31, 0x32, 0x33,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x78, 0x31, 0x32, 0x33, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x78, 0x31, 0x32, 0x33, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x74,
+  0x33, 0x4c, 0x34, 0x35, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x74, 0x34, 0x4c,
+  0x35, 0x36, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x34, 0x4c, 0x35, 0x36,
+  0x2e, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x78, 0x34, 0x35, 0x36, 0x20, 0x3d,
+  0x20, 0x6e, 0x69, 0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75,
+  0x6d, 0x28, 0x74, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x31, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x74, 0x32, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74,
+  0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x34, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x75, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x75, 0x31, 0x2e, 0x73,
+  0x30, 0x2c, 0x20, 0x75, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x75, 0x33,
+  0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x74, 0x36, 0x4c, 0x38, 0x39, 0x20,
+  0x3d, 0x20, 0x6e, 0x69, 0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53,
+  0x75, 0x6d, 0x28, 0x78, 0x34, 0x35, 0x36, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x78, 0x34, 0x35, 0x36, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x78, 0x34, 0x35,
+  0x36, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x74, 0x35, 0x4c, 0x36, 0x37, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x74, 0x35, 0x4c, 0x36, 0x37, 0x2e, 0x73, 0x32,
+  0x2c, 0x20, 0x75, 0x34, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x75, 0x35, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30,
+  0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x76, 0x37, 0x20, 0x3d, 0x20, 0x74, 0x36, 0x4c, 0x38,
+  0x39, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x36, 0x4c, 0x38, 0x39,
+  0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x36, 0x20, 0x2a, 0x20, 0x62,
+  0x2d, 0x3e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x35,
+  0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x61,
+  0x2d, 0x3e, 0x73, 0x34, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x32,
+  0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x33, 0x20, 0x2a, 0x20, 0x62,
+  0x2d, 0x3e, 0x73, 0x33, 0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x32,
+  0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x34, 0x20, 0x2b, 0x20, 0x61,
+  0x2d, 0x3e, 0x73, 0x31, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x35,
+  0x20, 0x2b, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62,
+  0x2d, 0x3e, 0x73, 0x36, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x30, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x76, 0x31, 0x2c, 0x20, 0x74, 0x32, 0x4c, 0x33, 0x34, 0x2e, 0x73,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x71, 0x75,
+  0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65,
+  0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x33, 0x4c, 0x34, 0x35, 0x2e,
+  0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x32, 0x20, 0x3d, 0x20, 0x71,
+  0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72,
+  0x65, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x34, 0x4c, 0x35, 0x36,
+  0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x33, 0x20, 0x3d, 0x20,
+  0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x72, 0x65, 0x32, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x35, 0x4c, 0x36,
+  0x37, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x34, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x72, 0x65, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x36, 0x4c,
+  0x38, 0x39, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x35, 0x36,
+  0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x72, 0x65, 0x34, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x76,
+  0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
+  0x72, 0x6e, 0x20, 0x28, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x29, 0x28, 0x72, 0x65, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x72, 0x65, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x32, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x72, 0x65, 0x34, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x35, 0x36,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x35, 0x36, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x2a, 0x2f, 0x0a, 0x7d, 0x0a,
+  0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x4f, 0x63, 0x74,
+  0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x77, 0x69, 0x63,
+  0x65, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70, 0x72,
+  0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x61, 0x29, 0x0a, 0x7b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4f,
+  0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20, 0x28,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e,
+  0x73, 0x30, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x31, 0x20, 0x2a, 0x20,
+  0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61,
+  0x2d, 0x3e, 0x73, 0x32, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x33, 0x20,
+  0x2a, 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x61, 0x2d, 0x3e, 0x73, 0x34, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x73,
+  0x35, 0x20, 0x2a, 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x36, 0x20, 0x2a, 0x20, 0x32,
+  0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d,
+  0x3e, 0x73, 0x37, 0x20, 0x2a, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x4f, 0x63, 0x74, 0x61, 0x44,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64,
+  0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e,
+  0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x2a, 0x20, 0x76, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
+  0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4f, 0x63, 0x74, 0x61, 0x44,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20, 0x28, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x30, 0x5d, 0x2c, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x31, 0x5d, 0x2c,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x32,
+  0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76,
+  0x5b, 0x33, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x76, 0x5b, 0x34, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x76, 0x5b, 0x35, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x36, 0x5d, 0x2c, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x37, 0x5d, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x5f,
+  0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64,
+  0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67,
+  0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a,
+  0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e,
+  0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e,
+  0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x2a, 0x20, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+  0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20,
+  0x79, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x70, 0x77, 0x2c, 0x20,
+  0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x70, 0x68, 0x2c, 0x20, 0x69,
+  0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x72, 0x2c, 0x20,
+  0x69, 0x6e, 0x74, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x2c, 0x20,
+  0x69, 0x6e, 0x74, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x2c, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63,
+  0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x2a, 0x20, 0x6a, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x63, 0x6f,
+  0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x2a, 0x20, 0x6a, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d,
+  0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f,
+  0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x20, 0x70, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65,
+  0x78, 0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d, 0x20,
+  0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74,
+  0x68, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x63, 0x74, 0x61,
+  0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x6c, 0x20, 0x3d, 0x20,
+  0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x79, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48,
+  0x64, 0x28, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x63,
+  0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x69, 0x78,
+  0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20, 0x6c,
+  0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x70, 0x77, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
+  0x59, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x70,
+  0x68, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x63, 0x74,
+  0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x78, 0x68, 0x20,
+  0x3d, 0x20, 0x7b, 0x20, 0x70, 0x78, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30,
+  0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30,
+  0x2c, 0x20, 0x30, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f,
+  0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x79,
+  0x68, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x70, 0x79, 0x2c, 0x20, 0x30, 0x2c,
+  0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c,
+  0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x3b, 0x0a, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x63, 0x61, 0x4f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c,
+  0x28, 0x26, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
+  0x58, 0x2c, 0x20, 0x26, 0x70, 0x78, 0x68, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x63, 0x62, 0x4f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c,
+  0x28, 0x26, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
+  0x59, 0x2c, 0x20, 0x26, 0x70, 0x79, 0x68, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x63, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x26, 0x63,
+  0x61, 0x4f, 0x66, 0x66, 0x2c, 0x20, 0x26, 0x78, 0x6c, 0x29, 0x3b, 0x20,
+  0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c,
+  0x65, 0x58, 0x20, 0x2a, 0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64,
+  0x28, 0x26, 0x63, 0x62, 0x4f, 0x66, 0x66, 0x2c, 0x20, 0x26, 0x79, 0x74,
+  0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53,
+  0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b,
+  0x20, 0x79, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x63, 0x74, 0x61,
+  0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x63,
+  0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x62,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x75,
+  0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x20, 0x3d,
+  0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x6a, 0x78, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x62, 0x20,
+  0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x64, 0x28, 0x6a, 0x79, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e,
+  0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x72, 0x20, 0x2d,
+  0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x26, 0x61,
+  0x2c, 0x20, 0x26, 0x61, 0x29, 0x3b, 0x20, 0x2f, 0x2a, 0x20, 0x54, 0x4f,
+  0x44, 0x4f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72,
+  0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62,
+  0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x26, 0x62, 0x2c, 0x20,
+  0x26, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x26, 0x61, 0x2c,
+  0x20, 0x26, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x28,
+  0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x28,
+  0x2d, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x32, 0x2c, 0x20,
+  0x2d, 0x62, 0x62, 0x2e, 0x73, 0x33, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e,
+  0x73, 0x34, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x35, 0x2c, 0x20,
+  0x2d, 0x62, 0x62, 0x2e, 0x73, 0x36, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e,
+  0x73, 0x37, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x61, 0x61, 0x6d, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28,
+  0x26, 0x61, 0x61, 0x2c, 0x20, 0x26, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62,
+  0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
+  0x62, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x69, 0x63, 0x65, 0x28,
+  0x26, 0x61, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x26, 0x61,
+  0x61, 0x6d, 0x62, 0x62, 0x2c, 0x20, 0x26, 0x63, 0x61, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20,
+  0x61, 0x64, 0x64, 0x28, 0x26, 0x61, 0x62, 0x61, 0x62, 0x2c, 0x20, 0x26,
+  0x63, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b,
+  0x20, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x20, 0x31, 0x36, 0x29,
+  0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e,
+  0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28,
+  0x6c, 0x6f, 0x67, 0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29,
+  0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x61,
+  0x78, 0x49, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64,
+  0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65,
+  0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66,
+  0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x20, 0x21, 0x3d, 0x20,
+  0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20,
+  0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e,
+  0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x32,
+  0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20,
+  0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x20,
+  0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e,
+  0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29,
+  0x6e, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64,
+  0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x29, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x28,
+  0x61, 0x20, 0x2a, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x20, 0x2a, 0x20,
+  0x62, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x32,
+  0x35, 0x36, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x41, 0x5b, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f,
+  0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x20, 0x3d,
+  0x20, 0x35, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a
+};
+unsigned int octadouble_cl_len = 8503;

+ 2 - 1
libmandel/src/opencl/quaddouble.cl

@@ -1,4 +1,5 @@
 #pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#pragma OPENCL FP_CONTRACT OFF
 
 inline double2 twoSum(double a, double b) {
     double s = a + b;
@@ -249,4 +250,4 @@ __kernel void iterate(__global float* A, const int width,
     }
     //               A[index] = ((float)n) + 1 - (a * a + b * b - 16) / (256 - 16);
     //           A[get_global_id(0)] = 5;
-}
+}

+ 513 - 510
libmandel/src/opencl/quaddouble.h

@@ -2,543 +2,546 @@ unsigned char quaddouble_cl[] = {
   0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e,
   0x43, 0x4c, 0x20, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e,
   0x20, 0x63, 0x6c, 0x5f, 0x6b, 0x68, 0x72, 0x5f, 0x66, 0x70, 0x36, 0x34,
-  0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x0a, 0x69,
-  0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20,
-  0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d,
-  0x20, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20,
-  0x28, 0x73, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x29, 0x20, 0x2b, 0x20,
-  0x28, 0x62, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29,
-  0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73,
-  0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x65, 0x72, 0x72, 0x29, 0x20,
+  0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x23, 0x70,
+  0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4c,
+  0x20, 0x46, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54,
+  0x20, 0x4f, 0x46, 0x46, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20,
   0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
   0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62,
   0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x2a, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x61,
-  0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x29,
-  0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x3b,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
-  0x73, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x75, 0x69,
-  0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20,
-  0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20,
-  0x28, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b,
-  0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f,
-  0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20,
-  0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20,
-  0x62, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20,
-  0x62, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x29, 0x3b,
-  0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3b,
-  0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x77, 0x6f, 0x50,
-  0x72, 0x6f, 0x64, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20,
+  0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20,
+  0x62, 0x62, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d, 0x20,
+  0x62, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x2a, 0x20, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20,
+  0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x73,
+  0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x65,
+  0x72, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73,
+  0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62,
+  0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3b, 0x0a, 0x7d, 0x0a,
+  0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
   0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20,
   0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x70, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2a, 0x20, 0x62, 0x3b, 0x0a,
+  0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65,
+  0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20,
+  0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
+  0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29,
+  0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69,
+  0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73,
+  0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x65, 0x72, 0x72, 0x29, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73,
+  0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20,
+  0x2a, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x28,
+  0x73, 0x20, 0x2d, 0x20, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x65,
+  0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x20, 0x3d, 0x20,
+  0x61, 0x20, 0x2a, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d,
+  0x61, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
+  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x70, 0x2c,
+  0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69,
+  0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x77,
+  0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x65,
+  0x72, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2a,
+  0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x65, 0x72, 0x72,
   0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c,
   0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
-  0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x29, 0x28, 0x70, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a,
-  0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x2a, 0x20, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x20,
-  0x3d, 0x20, 0x61, 0x20, 0x2a, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x2a, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28,
-  0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x3b,
-  0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20,
-  0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75,
-  0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x61, 0x2c,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x62, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x63, 0x29, 0x20, 0x7b,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
-  0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
-  0x2a, 0x61, 0x2c, 0x20, 0x2a, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x74, 0x33,
-  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x2a, 0x63,
-  0x2c, 0x20, 0x74, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x62, 0x63, 0x20,
-  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x74, 0x2e, 0x73,
-  0x31, 0x2c, 0x20, 0x61, 0x74, 0x33, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x2a, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x74, 0x33,
-  0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x62, 0x20,
-  0x3d, 0x20, 0x62, 0x63, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x2a, 0x63, 0x20, 0x3d, 0x20, 0x62, 0x63, 0x2e, 0x73, 0x31, 0x3b,
-  0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20,
-  0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75,
-  0x6d, 0x32, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x61,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x62, 0x2c,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x63, 0x29, 0x20,
-  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x32, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d,
-  0x28, 0x2a, 0x61, 0x2c, 0x20, 0x2a, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x74,
-  0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x2a,
-  0x63, 0x2c, 0x20, 0x74, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x2a, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x74, 0x33, 0x2e, 0x73,
-  0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x62, 0x20, 0x3d, 0x20,
-  0x74, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x61, 0x74, 0x33, 0x2e, 0x73,
-  0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
-  0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x72, 0x65, 0x6e, 0x6f, 0x72, 0x6d,
-  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x2a, 0x63, 0x30, 0x2c,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x2a, 0x63, 0x31, 0x2c,
-  0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x2a, 0x63, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x2a, 0x63, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x2a, 0x63, 0x34, 0x29, 0x20, 0x7b, 0x0a, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x30, 0x2c, 0x20,
-  0x73, 0x31, 0x2c, 0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30,
-  0x2c, 0x20, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a,
-  0x0a, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
-  0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x2a, 0x63,
-  0x33, 0x2c, 0x20, 0x2a, 0x63, 0x34, 0x2c, 0x20, 0x63, 0x34, 0x29, 0x3b,
-  0x0a, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
-  0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x2a, 0x63,
-  0x32, 0x2c, 0x20, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x33, 0x29, 0x3b, 0x0a,
-  0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
-  0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x2a, 0x63, 0x31,
-  0x2c, 0x20, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x32, 0x29, 0x3b, 0x0a, 0x20,
-  0x20, 0x2a, 0x63, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
-  0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x2a, 0x63, 0x30,
-  0x2c, 0x20, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x0a,
-  0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x2a, 0x63, 0x30, 0x3b, 0x0a,
-  0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x2a, 0x63, 0x31, 0x3b, 0x0a,
-  0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x31, 0x20, 0x21, 0x3d,
-  0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x73, 0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74,
-  0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x2a,
-  0x63, 0x32, 0x2c, 0x20, 0x26, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20,
+  0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x2a, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x2a, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x2a, 0x20, 0x63, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x2a, 0x61, 0x2c, 0x20, 0x2a,
+  0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x61, 0x74, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x2a, 0x63, 0x2c, 0x20, 0x74, 0x2e, 0x73,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x62, 0x63, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x74, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x61, 0x74,
+  0x33, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a,
+  0x61, 0x20, 0x3d, 0x20, 0x61, 0x74, 0x33, 0x2e, 0x73, 0x30, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x2a, 0x62, 0x20, 0x3d, 0x20, 0x62, 0x63, 0x2e,
+  0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x63, 0x20, 0x3d,
+  0x20, 0x62, 0x63, 0x2e, 0x73, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20,
+  0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x32, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x2a, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x2a, 0x20, 0x63, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x2a, 0x61, 0x2c, 0x20,
+  0x2a, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x61, 0x74, 0x33, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x2a, 0x63, 0x2c, 0x20, 0x74, 0x2e,
+  0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x61, 0x20,
+  0x3d, 0x20, 0x61, 0x74, 0x33, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x2a, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x20,
+  0x2b, 0x20, 0x61, 0x74, 0x33, 0x2e, 0x73, 0x31, 0x3b, 0x0a, 0x7d, 0x0a,
+  0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x76, 0x6f, 0x69, 0x64,
+  0x20, 0x72, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x2a, 0x63, 0x30, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x2a, 0x63, 0x31, 0x2c, 0x20, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x2a,
+  0x63, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x2a,
+  0x63, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x2a,
+  0x63, 0x34, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x73,
+  0x32, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x73, 0x33, 0x20,
+  0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x73, 0x30,
+  0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f,
+  0x5f, 0x73, 0x75, 0x6d, 0x28, 0x2a, 0x63, 0x33, 0x2c, 0x20, 0x2a, 0x63,
+  0x34, 0x2c, 0x20, 0x63, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x30,
+  0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f,
+  0x5f, 0x73, 0x75, 0x6d, 0x28, 0x2a, 0x63, 0x32, 0x2c, 0x20, 0x73, 0x30,
+  0x2c, 0x20, 0x63, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x30, 0x20,
+  0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f,
+  0x73, 0x75, 0x6d, 0x28, 0x2a, 0x63, 0x31, 0x2c, 0x20, 0x73, 0x30, 0x2c,
+  0x20, 0x63, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x63, 0x30, 0x20,
+  0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f,
+  0x73, 0x75, 0x6d, 0x28, 0x2a, 0x63, 0x30, 0x2c, 0x20, 0x73, 0x30, 0x2c,
+  0x20, 0x63, 0x31, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x73, 0x30, 0x20,
+  0x3d, 0x20, 0x2a, 0x63, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x31, 0x20,
+  0x3d, 0x20, 0x2a, 0x63, 0x31, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x69, 0x66,
+  0x20, 0x28, 0x73, 0x31, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20,
+  0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75,
+  0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x2a, 0x63, 0x32, 0x2c, 0x20, 0x26,
+  0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20,
+  0x28, 0x73, 0x32, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73,
+  0x75, 0x6d, 0x28, 0x73, 0x32, 0x2c, 0x20, 0x2a, 0x63, 0x33, 0x2c, 0x20,
+  0x26, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x66, 0x20, 0x28, 0x73, 0x33, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e,
+  0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x33, 0x20, 0x2b, 0x3d, 0x20, 0x2a, 0x63, 0x34, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x71, 0x75,
+  0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28,
+  0x73, 0x32, 0x2c, 0x20, 0x2a, 0x63, 0x34, 0x2c, 0x20, 0x26, 0x73, 0x33,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73,
+  0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31,
+  0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f,
+  0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x2a, 0x63, 0x33,
+  0x2c, 0x20, 0x26, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x32, 0x20, 0x21, 0x3d, 0x20,
-  0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f,
   0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x32, 0x2c, 0x20,
-  0x2a, 0x63, 0x33, 0x2c, 0x20, 0x26, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x33, 0x20,
-  0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x73, 0x33, 0x20, 0x2b, 0x3d, 0x20, 0x2a, 0x63,
-  0x34, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73,
-  0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32,
+  0x2a, 0x63, 0x34, 0x2c, 0x20, 0x26, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x71,
+  0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d,
+  0x28, 0x73, 0x31, 0x2c, 0x20, 0x2a, 0x63, 0x34, 0x2c, 0x20, 0x26, 0x73,
+  0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20,
+  0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f,
+  0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x30, 0x2c, 0x20,
+  0x2a, 0x63, 0x32, 0x2c, 0x20, 0x26, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x31, 0x20, 0x21, 0x3d,
+  0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
+  0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c,
+  0x20, 0x2a, 0x63, 0x33, 0x2c, 0x20, 0x26, 0x73, 0x32, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x32,
+  0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x71, 0x75,
+  0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28,
+  0x73, 0x32, 0x2c, 0x20, 0x2a, 0x63, 0x34, 0x2c, 0x20, 0x26, 0x73, 0x33,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73,
+  0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31,
   0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f,
-  0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x32, 0x2c, 0x20, 0x2a, 0x63, 0x34,
-  0x2c, 0x20, 0x26, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x2a, 0x63, 0x34,
+  0x2c, 0x20, 0x26, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
-  0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31,
-  0x2c, 0x20, 0x2a, 0x63, 0x33, 0x2c, 0x20, 0x26, 0x73, 0x32, 0x29, 0x3b,
+  0x20, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
+  0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x30,
+  0x2c, 0x20, 0x2a, 0x63, 0x33, 0x2c, 0x20, 0x26, 0x73, 0x31, 0x29, 0x3b,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73,
-  0x32, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x71,
+  0x31, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x71,
   0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d,
-  0x28, 0x73, 0x32, 0x2c, 0x20, 0x2a, 0x63, 0x34, 0x2c, 0x20, 0x26, 0x73,
-  0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c,
+  0x28, 0x73, 0x31, 0x2c, 0x20, 0x2a, 0x63, 0x34, 0x2c, 0x20, 0x26, 0x73,
+  0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c,
   0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73,
-  0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77,
-  0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x2a, 0x63,
-  0x34, 0x2c, 0x20, 0x26, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20,
-  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x71,
-  0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d,
-  0x28, 0x73, 0x30, 0x2c, 0x20, 0x2a, 0x63, 0x32, 0x2c, 0x20, 0x26, 0x73,
-  0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28,
-  0x73, 0x31, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20,
-  0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75,
-  0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x2a, 0x63, 0x33, 0x2c, 0x20, 0x26,
-  0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
-  0x66, 0x20, 0x28, 0x73, 0x32, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e, 0x30,
-  0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32,
-  0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f,
-  0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x32, 0x2c, 0x20, 0x2a, 0x63, 0x34,
-  0x2c, 0x20, 0x26, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
-  0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31,
-  0x2c, 0x20, 0x2a, 0x63, 0x34, 0x2c, 0x20, 0x26, 0x73, 0x32, 0x29, 0x3b,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20,
-  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d,
-  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73,
-  0x75, 0x6d, 0x28, 0x73, 0x30, 0x2c, 0x20, 0x2a, 0x63, 0x33, 0x2c, 0x20,
-  0x26, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x66, 0x20, 0x28, 0x73, 0x31, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x2e,
-  0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73,
-  0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77,
-  0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x2a, 0x63,
-  0x34, 0x2c, 0x20, 0x26, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69,
-  0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73,
-  0x30, 0x2c, 0x20, 0x2a, 0x63, 0x34, 0x2c, 0x20, 0x26, 0x73, 0x31, 0x29,
-  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a,
-  0x0a, 0x20, 0x20, 0x2a, 0x63, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x30, 0x3b,
-  0x0a, 0x20, 0x20, 0x2a, 0x63, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x31, 0x3b,
-  0x0a, 0x20, 0x20, 0x2a, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x73, 0x32, 0x3b,
-  0x0a, 0x20, 0x20, 0x2a, 0x63, 0x33, 0x20, 0x3d, 0x20, 0x73, 0x33, 0x3b,
-  0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x64, 0x64, 0x28,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x2c, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73,
-  0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x32, 0x2c, 0x20, 0x73,
-  0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x74, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x2c, 0x20, 0x74, 0x32,
-  0x2c, 0x20, 0x74, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f,
-  0x73, 0x75, 0x6d, 0x28, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x5b,
-  0x30, 0x5d, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73,
-  0x75, 0x6d, 0x28, 0x61, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x31,
-  0x5d, 0x2c, 0x20, 0x26, 0x74, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75,
-  0x6d, 0x28, 0x61, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x32, 0x5d,
-  0x2c, 0x20, 0x26, 0x74, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x73, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d,
-  0x28, 0x61, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x33, 0x5d, 0x2c,
-  0x20, 0x26, 0x74, 0x33, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x73, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d,
-  0x28, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x74, 0x30,
+  0x30, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77,
+  0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x30, 0x2c, 0x20, 0x2a, 0x63,
+  0x34, 0x2c, 0x20, 0x26, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x2a, 0x63,
+  0x30, 0x20, 0x3d, 0x20, 0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x63,
+  0x31, 0x20, 0x3d, 0x20, 0x73, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x63,
+  0x32, 0x20, 0x3d, 0x20, 0x73, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x63,
+  0x33, 0x20, 0x3d, 0x20, 0x73, 0x33, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x34, 0x20, 0x61, 0x64, 0x64, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x34, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x34, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31,
+  0x2c, 0x20, 0x73, 0x32, 0x2c, 0x20, 0x73, 0x33, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x30, 0x2c,
+  0x20, 0x74, 0x31, 0x2c, 0x20, 0x74, 0x32, 0x2c, 0x20, 0x74, 0x33, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x30,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x61,
+  0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x26,
+  0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x61, 0x5b,
+  0x31, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x26, 0x74,
+  0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x61, 0x5b, 0x32,
+  0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x26, 0x74, 0x32,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x33, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x61, 0x5b, 0x33, 0x5d,
+  0x2c, 0x20, 0x62, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x26, 0x74, 0x33, 0x29,
+  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20,
+  0x74, 0x30, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x26,
+  0x73, 0x32, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x74, 0x31,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65,
+  0x53, 0x75, 0x6d, 0x32, 0x28, 0x26, 0x73, 0x33, 0x2c, 0x20, 0x26, 0x74,
+  0x30, 0x2c, 0x20, 0x26, 0x74, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x74,
+  0x31, 0x20, 0x2b, 0x20, 0x74, 0x33, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x72, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x28, 0x26, 0x73, 0x30, 0x2c,
+  0x20, 0x26, 0x73, 0x31, 0x2c, 0x20, 0x26, 0x73, 0x32, 0x2c, 0x20, 0x26,
+  0x73, 0x33, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x73, 0x30, 0x2c, 0x20, 0x73,
+  0x31, 0x2c, 0x20, 0x73, 0x32, 0x2c, 0x20, 0x73, 0x33, 0x29, 0x3b, 0x0a,
+  0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x30,
+  0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20, 0x70, 0x32, 0x2c, 0x20, 0x70, 0x33,
+  0x2c, 0x20, 0x70, 0x34, 0x2c, 0x20, 0x70, 0x35, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x71, 0x30, 0x2c,
+  0x20, 0x71, 0x31, 0x2c, 0x20, 0x71, 0x32, 0x2c, 0x20, 0x71, 0x33, 0x2c,
+  0x20, 0x71, 0x34, 0x2c, 0x20, 0x71, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x30, 0x2c, 0x20,
+  0x74, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x73,
+  0x32, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x30, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b,
+  0x30, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x26, 0x71,
+  0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x31, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x26,
+  0x71, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x32, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x26,
+  0x71, 0x32, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x33,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28,
+  0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x32, 0x5d, 0x2c, 0x20,
+  0x26, 0x71, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x34,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28,
+  0x61, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x31, 0x5d, 0x2c, 0x20,
+  0x26, 0x71, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x35,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28,
+  0x61, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x30, 0x5d, 0x2c, 0x20,
+  0x26, 0x71, 0x35, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f,
+  0x2a, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x20, 0x41, 0x63, 0x63, 0x75,
+  0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x2f, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d,
+  0x28, 0x26, 0x70, 0x31, 0x2c, 0x20, 0x26, 0x70, 0x32, 0x2c, 0x20, 0x26,
+  0x71, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2a,
+  0x20, 0x53, 0x69, 0x78, 0x2d, 0x54, 0x68, 0x72, 0x65, 0x65, 0x20, 0x53,
+  0x75, 0x6d, 0x20, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x32, 0x2c, 0x20, 0x71,
+  0x31, 0x2c, 0x20, 0x71, 0x32, 0x2c, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x70,
+  0x34, 0x2c, 0x20, 0x70, 0x35, 0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x26,
+  0x70, 0x32, 0x2c, 0x20, 0x26, 0x71, 0x31, 0x2c, 0x20, 0x26, 0x71, 0x32,
   0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65,
-  0x53, 0x75, 0x6d, 0x28, 0x26, 0x73, 0x32, 0x2c, 0x20, 0x26, 0x74, 0x30,
-  0x2c, 0x20, 0x26, 0x74, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x32, 0x28, 0x26, 0x73,
-  0x33, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x74, 0x32, 0x29,
-  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x74,
-  0x30, 0x20, 0x2b, 0x20, 0x74, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x33, 0x3b,
-  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6e, 0x6f, 0x72, 0x6d,
-  0x28, 0x26, 0x73, 0x30, 0x2c, 0x20, 0x26, 0x73, 0x31, 0x2c, 0x20, 0x26,
-  0x73, 0x32, 0x2c, 0x20, 0x26, 0x73, 0x33, 0x2c, 0x20, 0x26, 0x74, 0x30,
-  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
-  0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28,
-  0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x32, 0x2c, 0x20,
-  0x73, 0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c,
-  0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20,
-  0x6d, 0x75, 0x6c, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20,
-  0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x62,
-  0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x70, 0x30, 0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20, 0x70,
-  0x32, 0x2c, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x70, 0x34, 0x2c, 0x20, 0x70,
-  0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x71, 0x30, 0x2c, 0x20, 0x71, 0x31, 0x2c, 0x20, 0x71, 0x32,
-  0x2c, 0x20, 0x71, 0x33, 0x2c, 0x20, 0x71, 0x34, 0x2c, 0x20, 0x71, 0x35,
+  0x53, 0x75, 0x6d, 0x28, 0x26, 0x70, 0x33, 0x2c, 0x20, 0x26, 0x70, 0x34,
+  0x2c, 0x20, 0x26, 0x70, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x2f, 0x2a, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x28,
+  0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x32, 0x29, 0x20,
+  0x3d, 0x20, 0x28, 0x70, 0x32, 0x2c, 0x20, 0x71, 0x31, 0x2c, 0x20, 0x71,
+  0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x70, 0x33, 0x2c, 0x20, 0x70, 0x34,
+  0x2c, 0x20, 0x70, 0x35, 0x29, 0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73,
+  0x75, 0x6d, 0x28, 0x70, 0x32, 0x2c, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x26,
+  0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x71, 0x31,
+  0x2c, 0x20, 0x70, 0x34, 0x2c, 0x20, 0x26, 0x74, 0x31, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x71, 0x32, 0x20,
+  0x2b, 0x20, 0x70, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73,
+  0x31, 0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32, 0x20, 0x2b, 0x3d, 0x20, 0x28,
+  0x74, 0x30, 0x20, 0x2b, 0x20, 0x74, 0x31, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x2f, 0x2a, 0x20, 0x4f, 0x28, 0x65, 0x70, 0x73, 0x5e,
+  0x33, 0x29, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x65, 0x72,
+  0x6d, 0x73, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31,
+  0x20, 0x2b, 0x3d, 0x20, 0x61, 0x5b, 0x30, 0x5d, 0x2a, 0x62, 0x5b, 0x33,
+  0x5d, 0x20, 0x2b, 0x20, 0x61, 0x5b, 0x31, 0x5d, 0x2a, 0x62, 0x5b, 0x32,
+  0x5d, 0x20, 0x2b, 0x20, 0x61, 0x5b, 0x32, 0x5d, 0x2a, 0x62, 0x5b, 0x31,
+  0x5d, 0x20, 0x2b, 0x20, 0x61, 0x5b, 0x33, 0x5d, 0x2a, 0x62, 0x5b, 0x30,
+  0x5d, 0x20, 0x2b, 0x20, 0x71, 0x30, 0x20, 0x2b, 0x20, 0x71, 0x33, 0x20,
+  0x2b, 0x20, 0x71, 0x34, 0x20, 0x2b, 0x20, 0x71, 0x35, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x72, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x28, 0x26, 0x70,
+  0x30, 0x2c, 0x20, 0x26, 0x70, 0x31, 0x2c, 0x20, 0x26, 0x73, 0x30, 0x2c,
+  0x20, 0x26, 0x73, 0x31, 0x2c, 0x20, 0x26, 0x73, 0x32, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x70, 0x30, 0x2c,
+  0x20, 0x70, 0x31, 0x2c, 0x20, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x29,
+  0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x73, 0x71, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x29, 0x20, 0x7b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70,
+  0x30, 0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20, 0x70, 0x32, 0x2c, 0x20, 0x70,
+  0x33, 0x2c, 0x20, 0x70, 0x34, 0x2c, 0x20, 0x70, 0x35, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x71, 0x30,
+  0x2c, 0x20, 0x71, 0x31, 0x2c, 0x20, 0x71, 0x32, 0x2c, 0x20, 0x71, 0x33,
   0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x74, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x30, 0x2c, 0x20,
-  0x73, 0x31, 0x2c, 0x20, 0x73, 0x32, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x30, 0x2c, 0x20,
+  0x74, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x70, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72,
-  0x6f, 0x64, 0x28, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x5b, 0x30,
-  0x5d, 0x2c, 0x20, 0x26, 0x71, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x70, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70,
-  0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62, 0x5b,
-  0x31, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x70, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70,
-  0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62, 0x5b,
-  0x30, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x32, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f,
-  0x70, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x62,
-  0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x33, 0x29, 0x3b, 0x0a, 0x20,
+  0x6f, 0x64, 0x28, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x61, 0x5b, 0x30,
+  0x5d, 0x2c, 0x20, 0x26, 0x71, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x70, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72,
+  0x6f, 0x64, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x30,
+  0x5d, 0x2c, 0x20, 0x61, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x31,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x32, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x32, 0x2e, 0x30,
+  0x20, 0x2a, 0x20, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x61, 0x5b, 0x32,
+  0x5d, 0x2c, 0x20, 0x26, 0x71, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72,
+  0x6f, 0x64, 0x28, 0x61, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x61, 0x5b, 0x31,
+  0x5d, 0x2c, 0x20, 0x26, 0x71, 0x33, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x70, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73,
+  0x75, 0x6d, 0x28, 0x71, 0x30, 0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20, 0x26,
+  0x71, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x71, 0x30,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x71,
+  0x30, 0x2c, 0x20, 0x71, 0x31, 0x2c, 0x20, 0x26, 0x71, 0x31, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x70, 0x32, 0x2c, 0x20, 0x70, 0x33,
+  0x2c, 0x20, 0x26, 0x70, 0x33, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75,
+  0x6d, 0x28, 0x71, 0x30, 0x2c, 0x20, 0x70, 0x32, 0x2c, 0x20, 0x26, 0x74,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x71, 0x31, 0x2c,
+  0x20, 0x70, 0x33, 0x2c, 0x20, 0x26, 0x74, 0x31, 0x29, 0x3b, 0x0a, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x30, 0x2c,
+  0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74,
+  0x30, 0x20, 0x2b, 0x3d, 0x20, 0x74, 0x31, 0x3b, 0x0a, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
+  0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c,
+  0x20, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x70, 0x32, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
+  0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x30,
+  0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x26, 0x74, 0x31, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69,
+  0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x74,
+  0x31, 0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x71, 0x30, 0x29, 0x3b,
+  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x34, 0x20, 0x3d, 0x20, 0x32,
+  0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x30, 0x5d, 0x20, 0x2a, 0x20,
+  0x61, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x35,
+  0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x31,
+  0x5d, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x32, 0x5d, 0x3b, 0x0a, 0x0a, 0x20,
   0x20, 0x20, 0x20, 0x70, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f,
-  0x70, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x62,
-  0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x34, 0x29, 0x3b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x70, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f,
-  0x70, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x62,
-  0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x35, 0x29, 0x3b, 0x0a, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x2f, 0x2a, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74,
-  0x20, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f,
-  0x6e, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72,
-  0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x26, 0x70, 0x31, 0x2c, 0x20, 0x26,
-  0x70, 0x32, 0x2c, 0x20, 0x26, 0x71, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x2f, 0x2a, 0x20, 0x53, 0x69, 0x78, 0x2d, 0x54, 0x68,
-  0x72, 0x65, 0x65, 0x20, 0x53, 0x75, 0x6d, 0x20, 0x20, 0x6f, 0x66, 0x20,
-  0x70, 0x32, 0x2c, 0x20, 0x71, 0x31, 0x2c, 0x20, 0x71, 0x32, 0x2c, 0x20,
-  0x70, 0x33, 0x2c, 0x20, 0x70, 0x34, 0x2c, 0x20, 0x70, 0x35, 0x2e, 0x20,
-  0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65,
-  0x53, 0x75, 0x6d, 0x28, 0x26, 0x70, 0x32, 0x2c, 0x20, 0x26, 0x71, 0x31,
-  0x2c, 0x20, 0x26, 0x71, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x74, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x26, 0x70, 0x33,
-  0x2c, 0x20, 0x26, 0x70, 0x34, 0x2c, 0x20, 0x26, 0x70, 0x35, 0x29, 0x3b,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2a, 0x20, 0x63, 0x6f, 0x6d, 0x70,
-  0x75, 0x74, 0x65, 0x20, 0x28, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c,
-  0x20, 0x73, 0x32, 0x29, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x32, 0x2c, 0x20,
-  0x71, 0x31, 0x2c, 0x20, 0x71, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x70,
-  0x33, 0x2c, 0x20, 0x70, 0x34, 0x2c, 0x20, 0x70, 0x35, 0x29, 0x2e, 0x20,
-  0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20,
-  0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x70, 0x32, 0x2c, 0x20,
-  0x70, 0x33, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73,
-  0x75, 0x6d, 0x28, 0x71, 0x31, 0x2c, 0x20, 0x70, 0x34, 0x2c, 0x20, 0x26,
-  0x74, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32, 0x20,
-  0x3d, 0x20, 0x71, 0x32, 0x20, 0x2b, 0x20, 0x70, 0x35, 0x3b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f,
-  0x73, 0x75, 0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20,
-  0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x32,
-  0x20, 0x2b, 0x3d, 0x20, 0x28, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x74, 0x31,
-  0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2a, 0x20, 0x4f,
-  0x28, 0x65, 0x70, 0x73, 0x5e, 0x33, 0x29, 0x20, 0x6f, 0x72, 0x64, 0x65,
-  0x72, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x2a, 0x2f, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x5b, 0x30,
-  0x5d, 0x2a, 0x62, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x5b, 0x31,
-  0x5d, 0x2a, 0x62, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x5b, 0x32,
-  0x5d, 0x2a, 0x62, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x61, 0x5b, 0x33,
-  0x5d, 0x2a, 0x62, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x71, 0x30, 0x20,
-  0x2b, 0x20, 0x71, 0x33, 0x20, 0x2b, 0x20, 0x71, 0x34, 0x20, 0x2b, 0x20,
-  0x71, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6e, 0x6f,
+  0x73, 0x75, 0x6d, 0x28, 0x70, 0x34, 0x2c, 0x20, 0x70, 0x35, 0x2c, 0x20,
+  0x26, 0x70, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x71, 0x32,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x71,
+  0x32, 0x2c, 0x20, 0x71, 0x33, 0x2c, 0x20, 0x26, 0x71, 0x33, 0x29, 0x3b,
+  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x70, 0x34, 0x2c, 0x20, 0x71,
+  0x32, 0x2c, 0x20, 0x26, 0x74, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x31, 0x20, 0x2b, 0x20, 0x70,
+  0x35, 0x20, 0x2b, 0x20, 0x71, 0x33, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75,
+  0x6d, 0x28, 0x70, 0x33, 0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x70,
+  0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x34, 0x20, 0x3d,
+  0x20, 0x70, 0x34, 0x20, 0x2b, 0x20, 0x71, 0x30, 0x20, 0x2b, 0x20, 0x74,
+  0x31, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6e, 0x6f,
   0x72, 0x6d, 0x28, 0x26, 0x70, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x31, 0x2c,
-  0x20, 0x26, 0x73, 0x30, 0x2c, 0x20, 0x26, 0x73, 0x31, 0x2c, 0x20, 0x26,
-  0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x20, 0x26, 0x70, 0x32, 0x2c, 0x20, 0x26, 0x70, 0x33, 0x2c, 0x20, 0x26,
+  0x70, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
   0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
-  0x29, 0x28, 0x70, 0x30, 0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20, 0x73, 0x30,
-  0x2c, 0x20, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e,
-  0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
-  0x20, 0x73, 0x71, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20,
-  0x61, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x70, 0x30, 0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20,
-  0x70, 0x32, 0x2c, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x70, 0x34, 0x2c, 0x20,
-  0x70, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x71, 0x30, 0x2c, 0x20, 0x71, 0x31, 0x2c, 0x20, 0x71,
-  0x32, 0x2c, 0x20, 0x71, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31,
-  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x74, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x30, 0x20, 0x3d, 0x20, 0x74,
-  0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b, 0x30, 0x5d,
-  0x2c, 0x20, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x30, 0x29,
-  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x31, 0x20, 0x3d, 0x20, 0x74,
-  0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x32, 0x2e, 0x30, 0x20,
-  0x2a, 0x20, 0x61, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x61, 0x5b, 0x31, 0x5d,
-  0x2c, 0x20, 0x26, 0x71, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x70, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f,
-  0x64, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x30, 0x5d,
-  0x2c, 0x20, 0x61, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x32, 0x29,
-  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x74,
-  0x77, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x5b, 0x31, 0x5d,
-  0x2c, 0x20, 0x61, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x26, 0x71, 0x33, 0x29,
-  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x31, 0x20, 0x3d, 0x20,
-  0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2c, 0x20,
-  0x70, 0x31, 0x2c, 0x20, 0x26, 0x71, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x71, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f,
-  0x73, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2c, 0x20, 0x71, 0x31, 0x2c, 0x20,
-  0x26, 0x71, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x32,
-  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x70,
-  0x32, 0x2c, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x26, 0x70, 0x33, 0x29, 0x3b,
-  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x74,
-  0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2c, 0x20, 0x70,
-  0x32, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75,
-  0x6d, 0x28, 0x71, 0x31, 0x2c, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x26, 0x74,
-  0x31, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20,
-  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x73, 0x31,
-  0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x74, 0x30, 0x29, 0x3b, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x74, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x74, 0x31,
-  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20,
-  0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75,
-  0x6d, 0x28, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20, 0x26, 0x74,
-  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x32, 0x20, 0x3d,
-  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f, 0x73,
-  0x75, 0x6d, 0x28, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x26,
-  0x74, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x33, 0x20,
-  0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x5f,
-  0x73, 0x75, 0x6d, 0x28, 0x74, 0x31, 0x2c, 0x20, 0x74, 0x30, 0x2c, 0x20,
-  0x26, 0x71, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70,
-  0x34, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x5b,
-  0x30, 0x5d, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x70, 0x35, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20,
-  0x2a, 0x20, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x2a, 0x20, 0x61, 0x5b, 0x32,
-  0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x34, 0x20, 0x3d,
-  0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x70, 0x34, 0x2c,
-  0x20, 0x70, 0x35, 0x2c, 0x20, 0x26, 0x70, 0x35, 0x29, 0x3b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x71, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f,
-  0x73, 0x75, 0x6d, 0x28, 0x71, 0x32, 0x2c, 0x20, 0x71, 0x33, 0x2c, 0x20,
-  0x26, 0x71, 0x33, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74,
-  0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28,
-  0x70, 0x34, 0x2c, 0x20, 0x71, 0x32, 0x2c, 0x20, 0x26, 0x74, 0x31, 0x29,
-  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x74,
-  0x31, 0x20, 0x2b, 0x20, 0x70, 0x35, 0x20, 0x2b, 0x20, 0x71, 0x33, 0x3b,
-  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x74,
-  0x77, 0x6f, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x70, 0x33, 0x2c, 0x20, 0x74,
-  0x30, 0x2c, 0x20, 0x26, 0x70, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x70, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x34, 0x20, 0x2b, 0x20, 0x71,
-  0x30, 0x20, 0x2b, 0x20, 0x74, 0x31, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x72, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x28, 0x26, 0x70, 0x30, 0x2c,
-  0x20, 0x26, 0x70, 0x31, 0x2c, 0x20, 0x26, 0x70, 0x32, 0x2c, 0x20, 0x26,
-  0x70, 0x33, 0x2c, 0x20, 0x26, 0x70, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x70, 0x30, 0x2c, 0x20, 0x70,
-  0x31, 0x2c, 0x20, 0x70, 0x32, 0x2c, 0x20, 0x70, 0x33, 0x29, 0x3b, 0x0a,
-  0x7d, 0x0a, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c,
-  0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74,
-  0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e,
-  0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
-  0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x29, 0x28, 0x70, 0x30, 0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20, 0x70, 0x32,
+  0x2c, 0x20, 0x70, 0x33, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x5f,
+  0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64,
+  0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67,
+  0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a,
+  0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e,
+  0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x31, 0x2c, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x78, 0x34, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x79, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x79, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x20, 0x79, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x79, 0x34, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x78, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x78, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78,
+  0x34, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x31,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x32, 0x2c,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x33, 0x2c, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x34, 0x2c, 0x0a, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x31,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x32,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x33,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x34,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x31,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x32,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x33,
-  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x34,
-  0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x69,
-  0x6e, 0x74, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x2c, 0x20, 0x69,
-  0x6e, 0x74, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x2c, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x34, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x34, 0x2c, 0x20, 0x69, 0x6e, 0x74,
+  0x20, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6d,
+  0x6f, 0x6f, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x75,
+  0x6c, 0x69, 0x61, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x6a, 0x78, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x6a, 0x78, 0x34, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x6a, 0x79, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x6a, 0x79, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x6a, 0x79, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x6a, 0x79, 0x34, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20,
-  0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c,
-  0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x6e, 0x74, 0x20, 0x70, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64,
-  0x65, 0x78, 0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d,
-  0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64,
-  0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x34, 0x20, 0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x78, 0x31, 0x2c, 0x20,
-  0x78, 0x32, 0x2c, 0x20, 0x78, 0x33, 0x2c, 0x20, 0x78, 0x34, 0x29, 0x3b,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
-  0x20, 0x79, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x34, 0x29, 0x28, 0x79, 0x31, 0x2c, 0x20, 0x79, 0x32, 0x2c, 0x20,
-  0x79, 0x33, 0x2c, 0x20, 0x79, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x70, 0x69, 0x78,
-  0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20, 0x28,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x70, 0x77, 0x31,
-  0x2c, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20, 0x70, 0x77, 0x33, 0x2c, 0x20,
-  0x70, 0x77, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53,
-  0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x70,
-  0x68, 0x32, 0x2c, 0x20, 0x70, 0x68, 0x33, 0x2c, 0x20, 0x70, 0x68, 0x34,
-  0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x34, 0x20, 0x63, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64,
-  0x28, 0x6d, 0x75, 0x6c, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63,
-  0x61, 0x6c, 0x65, 0x58, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x34, 0x29, 0x20, 0x28, 0x70, 0x78, 0x2c, 0x20, 0x30, 0x2c, 0x20,
-  0x30, 0x2c, 0x20, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x78, 0x6c, 0x29, 0x3b,
-  0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
-  0x6c, 0x65, 0x58, 0x20, 0x2a, 0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78,
-  0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x34, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d,
-  0x75, 0x6c, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c,
-  0x65, 0x59, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
-  0x29, 0x20, 0x28, 0x70, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c,
-  0x20, 0x30, 0x29, 0x29, 0x2c, 0x20, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f,
-  0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
-  0x59, 0x20, 0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0a,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x78,
+  0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x78,
+  0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x78,
+  0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x78,
+  0x34, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x79,
+  0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x79,
+  0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x79,
+  0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x79,
+  0x34, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74,
+  0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70,
+  0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20,
+  0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65,
+  0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20,
-  0x61, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x62, 0x20, 0x3d, 0x20,
-  0x63, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28,
-  0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20,
-  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61,
+  0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x34, 0x29, 0x28, 0x78, 0x31, 0x2c, 0x20, 0x78, 0x32, 0x2c, 0x20, 0x78,
+  0x33, 0x2c, 0x20, 0x78, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x79, 0x74, 0x20, 0x3d,
+  0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x79,
+  0x31, 0x2c, 0x20, 0x79, 0x32, 0x2c, 0x20, 0x79, 0x33, 0x2c, 0x20, 0x79,
+  0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x34, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
+  0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x34, 0x29, 0x28, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x70, 0x77, 0x32,
+  0x2c, 0x20, 0x70, 0x77, 0x33, 0x2c, 0x20, 0x70, 0x77, 0x34, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
+  0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59,
   0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29,
-  0x28, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20, 0x6a,
-  0x78, 0x33, 0x2c, 0x20, 0x6a, 0x78, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x28,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x6a, 0x79, 0x31,
-  0x2c, 0x20, 0x6a, 0x79, 0x32, 0x2c, 0x20, 0x6a, 0x79, 0x33, 0x2c, 0x20,
-  0x6a, 0x79, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x20, 0x3d,
-  0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c,
-  0x65, 0x20, 0x28, 0x6e, 0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d,
-  0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x61,
-  0x20, 0x3d, 0x20, 0x73, 0x71, 0x28, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x34, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x71, 0x28, 0x62, 0x29,
-  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d,
-  0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x34, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x20, 0x3d, 0x20,
-  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x2d, 0x62,
-  0x62, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x31,
-  0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x2d, 0x62,
-  0x62, 0x2e, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61,
-  0x64, 0x64, 0x28, 0x61, 0x61, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73,
-  0x62, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64,
-  0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x62, 0x2c, 0x20, 0x61, 0x62,
-  0x29, 0x2c, 0x20, 0x63, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x61, 0x2e, 0x73,
-  0x30, 0x20, 0x2b, 0x20, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x20,
-  0x31, 0x36, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f,
-  0x2f, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f,
-  0x67, 0x20, 0x28, 0x6c, 0x6f, 0x67, 0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e,
-  0x29, 0x7c, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d,
-  0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20,
+  0x28, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x70, 0x68, 0x32, 0x2c, 0x20, 0x70,
+  0x68, 0x33, 0x2c, 0x20, 0x70, 0x68, 0x34, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x63,
+  0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x28,
+  0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x2c,
+  0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x20, 0x28,
+  0x70, 0x78, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29,
+  0x29, 0x2c, 0x20, 0x78, 0x6c, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70,
+  0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x2a,
+  0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x63, 0x62, 0x20,
+  0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x28, 0x70, 0x69,
+  0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x2c, 0x20, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x20, 0x28, 0x70, 0x79,
+  0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x29, 0x2c,
+  0x20, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78,
+  0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x2a, 0x20, 0x70,
+  0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x63,
+  0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x34, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x62, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x75, 0x6c, 0x69, 0x61,
+  0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x29, 0x28, 0x6a, 0x78, 0x31, 0x2c,
+  0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20, 0x6a, 0x78, 0x33, 0x2c, 0x20, 0x6a,
+  0x78, 0x34, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x34, 0x29, 0x28, 0x6a, 0x79, 0x31, 0x2c, 0x20, 0x6a, 0x79, 0x32,
+  0x2c, 0x20, 0x6a, 0x79, 0x33, 0x2c, 0x20, 0x6a, 0x79, 0x34, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x20,
+  0x3c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x34, 0x20, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x71,
+  0x28, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x62, 0x62, 0x20,
+  0x3d, 0x20, 0x73, 0x71, 0x28, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34,
+  0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c,
+  0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x34, 0x20, 0x6d, 0x69, 0x6e,
+  0x75, 0x73, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x34, 0x29, 0x28, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x2d, 0x62, 0x62,
+  0x2e, 0x73, 0x32, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x33, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20,
+  0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x61,
+  0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x29, 0x2c, 0x20,
+  0x63, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64, 0x64,
+  0x28, 0x61, 0x62, 0x2c, 0x20, 0x61, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x62,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x66, 0x20, 0x28, 0x61, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62,
+  0x62, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x20, 0x31, 0x36, 0x29, 0x20, 0x62,
+  0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d,
+  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x20, 0x2b,
+  0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28, 0x6c, 0x6f,
+  0x67, 0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29, 0x20, 0x2f,
+  0x20, 0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x20,
+  0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20,
+  0x6d, 0x61, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73,
+  0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x20, 0x21,
+  0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29,
+  0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f,
+  0x67, 0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a,
+  0x20, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x30,
+  0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x32,
+  0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x32, 0x2e, 0x30, 0x66,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65,
+  0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d,
+  0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x6e,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65,
-  0x78, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x3b, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f,
-  0x6f, 0x74, 0x68, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b,
-  0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66,
-  0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31,
-  0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61,
-  0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b,
-  0x20, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30,
-  0x29, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67,
-  0x28, 0x32, 0x2e, 0x30, 0x66, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69,
-  0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41,
-  0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28,
-  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31,
-  0x20, 0x2d, 0x20, 0x28, 0x61, 0x20, 0x2a, 0x20, 0x61, 0x20, 0x2b, 0x20,
-  0x62, 0x20, 0x2a, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x20,
-  0x2f, 0x20, 0x28, 0x32, 0x35, 0x36, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29,
-  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x67, 0x65, 0x74,
-  0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30,
-  0x29, 0x5d, 0x20, 0x3d, 0x20, 0x35, 0x3b, 0x0a, 0x7d
+  0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x29, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x28, 0x61,
+  0x20, 0x2a, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x20, 0x2a, 0x20, 0x62,
+  0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x32, 0x35,
+  0x36, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x41, 0x5b, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62,
+  0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x20, 0x3d, 0x20,
+  0x35, 0x3b, 0x0a, 0x7d, 0x0a
 };
-unsigned int quaddouble_cl_len = 6489;
+unsigned int quaddouble_cl_len = 6521;

+ 3 - 1
libmandel/src/opencl/tripledouble.cl

@@ -1,4 +1,6 @@
 #pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#pragma OPENCL FP_CONTRACT OFF
+
 
 inline double2 twoSum(double a, double b) {
     double s = a + b;
@@ -100,4 +102,4 @@ __kernel void iterate(__global float* A, const int width,
     }
     //               A[index] = ((float)n) + 1 - (a * a + b * b - 16) / (256 - 16);
     //           A[get_global_id(0)] = 5;
-}
+}

+ 257 - 263
libmandel/src/opencl/tripledouble.h

@@ -2,284 +2,278 @@ unsigned char tripledouble_cl[] = {
   0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e,
   0x43, 0x4c, 0x20, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e,
   0x20, 0x63, 0x6c, 0x5f, 0x6b, 0x68, 0x72, 0x5f, 0x66, 0x70, 0x36, 0x34,
-  0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x0d,
-  0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d,
-  0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x62, 0x20, 0x3d,
-  0x20, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20,
-  0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x62, 0x62,
-  0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d, 0x20, 0x62, 0x62,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
-  0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29,
-  0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a,
-  0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77,
+  0x20, 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x23, 0x70,
+  0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4c,
+  0x20, 0x46, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54,
+  0x20, 0x4f, 0x46, 0x46, 0x0a, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e,
+  0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x77,
   0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
   0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29,
-  0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x28, 0x73,
-  0x20, 0x2d, 0x20, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0d,
-  0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x77, 0x6f,
-  0x50, 0x72, 0x6f, 0x64, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29,
-  0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2a, 0x20, 0x62,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x61, 0x2c,
-  0x20, 0x62, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x70, 0x2c, 0x20, 0x65, 0x29,
-  0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69,
-  0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74,
-  0x68, 0x72, 0x65, 0x65, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x63, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x20, 0x3d,
-  0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
-  0x53, 0x75, 0x6d, 0x28, 0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
-  0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28,
-  0x72, 0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x20,
-  0x2b, 0x20, 0x72, 0x74, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d,
-  0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x62, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65,
+  0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d,
+  0x20, 0x62, 0x62, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d,
+  0x20, 0x62, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
+  0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x29, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a,
+  0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65,
+  0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20,
+  0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,
+  0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29,
+  0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69,
+  0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61,
+  0x20, 0x2a, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61,
+  0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x70, 0x2c, 0x20,
+  0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e,
+  0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x68,
+  0x72, 0x65, 0x65, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x20, 0x62, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x63, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
-  0x70, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
-  0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x20, 0x70, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
+  0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x29, 0x28, 0x72, 0x74, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x74, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x72, 0x74, 0x2e,
+  0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69,
+  0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x6d,
+  0x75, 0x6c, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x62, 0x29,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x70, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
   0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e,
-  0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x74,
-  0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73, 0x31, 0x2c,
-  0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74,
-  0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x54, 0x77,
-  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x70, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20,
-  0x70, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x70, 0x33, 0x2e, 0x73, 0x30,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x74, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x31, 0x32, 0x2e,
-  0x73, 0x31, 0x20, 0x2b, 0x20, 0x70, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x2b,
-  0x20, 0x70, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x61, 0x2e, 0x73,
-  0x32, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x61,
-  0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x32, 0x20, 0x2b,
-  0x20, 0x61, 0x2e, 0x73, 0x31, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x31,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x20, 0x72, 0x65, 0x30, 0x71, 0x20, 0x3d, 0x20, 0x71, 0x75,
-  0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x70, 0x31,
-  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x32, 0x2e, 0x73, 0x30, 0x29,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x32, 0x20, 0x72, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69,
-  0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x30,
-  0x71, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x33, 0x29, 0x3b, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x72, 0x65, 0x30,
-  0x71, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x72, 0x2e, 0x73, 0x30,
-  0x2c, 0x20, 0x72, 0x65, 0x72, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a,
-  0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x73, 0x71, 0x28, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x29, 0x20, 0x7b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f,
-  0x3a, 0x20, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x75,
-  0x6c, 0x28, 0x61, 0x2c, 0x20, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d,
-  0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x64, 0x64, 0x28, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x33, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72,
-  0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61,
-  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
-  0x20, 0x74, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75,
-  0x6d, 0x28, 0x61, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x31,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x32, 0x20, 0x74, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x77,
-  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x74, 0x2e, 0x73, 0x31, 0x2c, 0x20,
-  0x74, 0x31, 0x32, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x32, 0x20,
-  0x3d, 0x20, 0x74, 0x31, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74,
-  0x33, 0x34, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x61, 0x2e, 0x73, 0x32,
-  0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x32, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a,
+  0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x70, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x62, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x31,
+  0x32, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x54, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x70, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x70,
+  0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x70, 0x33, 0x2e, 0x73, 0x30, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x74, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x31, 0x32, 0x2e, 0x73, 0x31,
+  0x20, 0x2b, 0x20, 0x70, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x70,
+  0x33, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x61, 0x2e, 0x73, 0x32, 0x20,
+  0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x61, 0x2e, 0x73,
+  0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x61,
+  0x2e, 0x73, 0x31, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x31, 0x3b, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
-  0x72, 0x65, 0x31, 0x74, 0x34, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63,
-  0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x74, 0x2e, 0x73,
-  0x30, 0x2c, 0x20, 0x74, 0x33, 0x34, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
-  0x20, 0x72, 0x65, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53,
-  0x75, 0x6d, 0x28, 0x72, 0x65, 0x31, 0x74, 0x34, 0x2e, 0x73, 0x31, 0x2c,
-  0x20, 0x72, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
+  0x72, 0x65, 0x30, 0x71, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b,
+  0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x70, 0x31, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x74, 0x31, 0x32, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72,
+  0x65, 0x72, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77,
+  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x30, 0x71, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x74, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
   0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x33, 0x29, 0x28, 0x72, 0x65, 0x31, 0x74, 0x34, 0x2e, 0x73, 0x30,
-  0x2c, 0x20, 0x72, 0x65, 0x32, 0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72,
-  0x65, 0x32, 0x33, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d,
-  0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f,
+  0x65, 0x33, 0x29, 0x28, 0x72, 0x65, 0x30, 0x71, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x72, 0x65, 0x72, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x72,
+  0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c,
+  0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x73, 0x71, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61,
+  0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54,
+  0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
+  0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x61, 0x29, 0x3b, 0x0a, 0x7d,
+  0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x64, 0x64, 0x28, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x33, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x74, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2e, 0x73,
+  0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x31,
+  0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x74, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x72, 0x74, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x31, 0x32, 0x2e,
+  0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x20, 0x72, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x31, 0x32,
+  0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x33, 0x34, 0x2e, 0x73, 0x31,
+  0x20, 0x2b, 0x20, 0x61, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x62, 0x2e,
+  0x73, 0x32, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x31, 0x74, 0x34, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x72, 0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x33, 0x34, 0x2e,
+  0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x32, 0x33, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x31, 0x74, 0x34,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x72, 0x65, 0x31, 0x74, 0x34,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x32, 0x33, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x72, 0x65, 0x32, 0x33, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
+  0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f,
   0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x6d, 0x75, 0x6c, 0x44, 0x6f, 0x75,
   0x62, 0x6c, 0x65, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
   0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x29,
-  0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54,
-  0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
-  0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x62, 0x2c, 0x20, 0x30, 0x2e, 0x30,
-  0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d,
-  0x0a, 0x0d, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20,
-  0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65,
-  0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x2a, 0x20, 0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73,
-  0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f,
+  0x44, 0x4f, 0x3a, 0x20, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d,
+  0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x33, 0x29, 0x28, 0x62, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20,
+  0x30, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f,
+  0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20,
+  0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c,
+  0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20,
+  0x41, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74,
+  0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x31, 0x2c, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x20, 0x78, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x20, 0x79, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x20, 0x79, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x79, 0x33, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x20, 0x78, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x78,
+  0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x31,
+  0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x32, 0x2c,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x79, 0x33, 0x2c, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x77, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x77, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x77, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x68, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x68, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
-  0x70, 0x68, 0x33, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78,
-  0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68,
-  0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x77, 0x33, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x32, 0x2c, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x33, 0x2c, 0x20, 0x69, 0x6e,
+  0x74, 0x20, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73,
+  0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x78, 0x31, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x78, 0x33, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x79, 0x31, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x79, 0x32, 0x2c, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a, 0x79, 0x33, 0x29, 0x20,
-  0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69,
-  0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67,
-  0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x78,
-  0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x77,
-  0x69, 0x64, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
-  0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65,
-  0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0d, 0x0a,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x33, 0x20, 0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x33, 0x29, 0x28, 0x78, 0x31, 0x2c, 0x20, 0x78, 0x32, 0x2c,
-  0x20, 0x78, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
-  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x79, 0x74, 0x20, 0x3d, 0x20,
-  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x79, 0x31,
-  0x2c, 0x20, 0x79, 0x32, 0x2c, 0x20, 0x79, 0x33, 0x29, 0x3b, 0x0d, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x75, 0x6c,
+  0x69, 0x61, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a,
+  0x78, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a,
+  0x78, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a,
+  0x78, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a,
+  0x79, 0x31, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a,
+  0x79, 0x32, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x6a,
+  0x79, 0x33, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65,
+  0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20,
+  0x70, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25,
+  0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64,
+  0x65, 0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33,
+  0x20, 0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x33, 0x29, 0x28, 0x78, 0x31, 0x2c, 0x20, 0x78, 0x32, 0x2c, 0x20,
+  0x78, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x33, 0x20, 0x79, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x79, 0x31, 0x2c, 0x20,
+  0x79, 0x32, 0x2c, 0x20, 0x79, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x70, 0x69, 0x78,
+  0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20, 0x28,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28, 0x70, 0x77, 0x31,
+  0x2c, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20, 0x70, 0x77, 0x33, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33,
+  0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59,
+  0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29,
+  0x28, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x70, 0x68, 0x32, 0x2c, 0x20, 0x70,
+  0x68, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64,
+  0x28, 0x6d, 0x75, 0x6c, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x28, 0x70,
+  0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x2c, 0x20,
+  0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20, 0x70, 0x78, 0x29,
+  0x2c, 0x20, 0x78, 0x6c, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69,
+  0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x2a, 0x20,
+  0x70, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x62, 0x20, 0x3d, 0x20,
+  0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x44, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
+  0x59, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x29, 0x20,
+  0x70, 0x79, 0x29, 0x2c, 0x20, 0x79, 0x74, 0x29, 0x3b, 0x20, 0x2f, 0x2f,
+  0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59,
+  0x20, 0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x74, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x63,
+  0x61, 0x20, 0x3d, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d,
+  0x20, 0x30, 0x20, 0x3f, 0x20, 0x28, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x33, 0x29, 0x20, 0x28, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x6a, 0x78,
+  0x32, 0x2c, 0x20, 0x6a, 0x78, 0x33, 0x29, 0x29, 0x20, 0x3a, 0x20, 0x61,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x33, 0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61,
+  0x20, 0x21, 0x3d, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x28, 0x28, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x20, 0x28, 0x6a, 0x79, 0x31, 0x2c,
+  0x20, 0x6a, 0x79, 0x32, 0x2c, 0x20, 0x6a, 0x79, 0x33, 0x29, 0x29, 0x20,
+  0x3a, 0x20, 0x62, 0x3b, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x20, 0x3c,
+  0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x33, 0x20, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c,
+  0x28, 0x61, 0x2c, 0x20, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
-  0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x58, 0x20,
+  0x62, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x62, 0x2c, 0x20,
+  0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x62, 0x20, 0x3d,
+  0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x33, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x20,
   0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x28,
-  0x70, 0x77, 0x31, 0x2c, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20, 0x70, 0x77,
-  0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x33, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63,
-  0x61, 0x6c, 0x65, 0x59, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62,
-  0x6c, 0x65, 0x33, 0x29, 0x28, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x70, 0x68,
-  0x32, 0x2c, 0x20, 0x70, 0x68, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x20,
-  0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x44, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
-  0x6c, 0x65, 0x58, 0x2c, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x29, 0x20, 0x70, 0x78, 0x29, 0x2c, 0x20, 0x78, 0x6c, 0x29, 0x3b, 0x20,
-  0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c,
-  0x65, 0x58, 0x20, 0x2a, 0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x33, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75,
-  0x6c, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x69, 0x78, 0x65,
-  0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x2c, 0x20, 0x28, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x29, 0x20, 0x70, 0x79, 0x29, 0x2c, 0x20, 0x79,
-  0x74, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c,
-  0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x2a, 0x20, 0x70, 0x79, 0x20,
-  0x2b, 0x20, 0x79, 0x74, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
-  0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x63, 0x61, 0x20, 0x3d, 0x20, 0x6a,
-  0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x20, 0x3f, 0x20,
-  0x28, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x29, 0x20, 0x28,
-  0x6a, 0x78, 0x31, 0x2c, 0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20, 0x6a, 0x78,
-  0x33, 0x29, 0x29, 0x20, 0x3a, 0x20, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x63, 0x62,
-  0x20, 0x3d, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21, 0x3d, 0x20,
-  0x30, 0x20, 0x3f, 0x20, 0x28, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x33, 0x29, 0x20, 0x28, 0x6a, 0x79, 0x31, 0x2c, 0x20, 0x6a, 0x79, 0x32,
-  0x2c, 0x20, 0x6a, 0x79, 0x33, 0x29, 0x29, 0x20, 0x3a, 0x20, 0x62, 0x3b,
-  0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
-  0x74, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x20, 0x3c,
-  0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
-  0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x75,
-  0x6c, 0x28, 0x61, 0x2c, 0x20, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
-  0x33, 0x20, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x62,
-  0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61,
-  0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c, 0x20, 0x62,
-  0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x6d, 0x69, 0x6e, 0x75,
-  0x73, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x33, 0x29, 0x28, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x2c, 0x20,
-  0x2d, 0x62, 0x62, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e,
-  0x73, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64,
-  0x64, 0x28, 0x61, 0x61, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62,
-  0x62, 0x29, 0x2c, 0x20, 0x63, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64,
-  0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x62, 0x2c, 0x20, 0x61, 0x62,
-  0x29, 0x2c, 0x20, 0x63, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x61, 0x2e,
-  0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x3e,
-  0x20, 0x31, 0x36, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x2b, 0x2b,
-  0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x31,
-  0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28, 0x6c, 0x6f, 0x67, 0x20,
-  0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29, 0x20, 0x2f, 0x20, 0x6c,
-  0x6f, 0x67, 0x20, 0x32, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66,
+  0x2d, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x32, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d,
+  0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x61, 0x2c,
+  0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62, 0x62, 0x29, 0x2c, 0x20, 0x63,
+  0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64, 0x64, 0x28,
+  0x61, 0x62, 0x2c, 0x20, 0x61, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x62, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66,
+  0x20, 0x28, 0x61, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62, 0x62,
+  0x2e, 0x73, 0x30, 0x20, 0x3e, 0x20, 0x31, 0x36, 0x29, 0x20, 0x62, 0x72,
+  0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x20, 0x2b, 0x20,
+  0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x28, 0x6c, 0x6f, 0x67,
+  0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29, 0x7c, 0x29, 0x20, 0x2f, 0x20,
+  0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66,
   0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x2d,
-  0x20, 0x31, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20,
-  0x6d, 0x61, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c,
-  0x73, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68,
-  0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e,
-  0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f,
-  0x61, 0x74, 0x29, 0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x2e, 0x30,
-  0x66, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x6c, 0x6f, 0x67,
-  0x28, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x30,
-  0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e,
-  0x73, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x66, 0x29, 0x3b,
-  0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c,
-  0x73, 0x65, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x6d,
+  0x61, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65,
+  0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x20, 0x21, 0x3d,
+  0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d,
   0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20,
-  0x6e, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69,
-  0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d,
-  0x20, 0x28, 0x61, 0x20, 0x2a, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x20,
-  0x2a, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x20, 0x2f, 0x20,
-  0x28, 0x32, 0x35, 0x36, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x3b, 0x0d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x67, 0x65, 0x74, 0x5f,
-  0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29,
-  0x5d, 0x20, 0x3d, 0x20, 0x35, 0x3b, 0x0d, 0x0a, 0x7d
+  0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x2e, 0x30, 0x66, 0x20, 0x2d, 0x20,
+  0x6c, 0x6f, 0x67, 0x32, 0x28, 0x6c, 0x6f, 0x67, 0x28, 0x61, 0x2e, 0x73,
+  0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x62,
+  0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x20,
+  0x2a, 0x20, 0x30, 0x2e, 0x35, 0x66, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b,
+  0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20,
+  0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x6e, 0x29, 0x20, 0x2b,
+  0x20, 0x31, 0x20, 0x2d, 0x20, 0x28, 0x61, 0x20, 0x2a, 0x20, 0x61, 0x20,
+  0x2b, 0x20, 0x62, 0x20, 0x2a, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x31, 0x36,
+  0x29, 0x20, 0x2f, 0x20, 0x28, 0x32, 0x35, 0x36, 0x20, 0x2d, 0x20, 0x31,
+  0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x67,
+  0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64,
+  0x28, 0x30, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x35, 0x3b, 0x0a, 0x7d, 0x0a
 };
-unsigned int tripledouble_cl_len = 3381;
+unsigned int tripledouble_cl_len = 3312;

+ 103 - 0
libmandel/src/opencl/triplefloat.cl

@@ -0,0 +1,103 @@
+#pragma OPENCL FP_CONTRACT OFF
+
+inline float2 twoSum(float a, float b) {
+    float s = a + b;
+    float bb = s - a;
+    float e = (a - (s - bb)) + (b - bb);
+    return (float2)(s, e);
+}
+
+inline float2 quickTwoSum(float a, float b) {
+    float s = a + b;
+    float e = b - (s - a);
+    return (float2)(s, e);
+}
+
+inline float2 twoProd(float a, float b) {
+    float p = a * b;
+    float e = fma(a, b, -p);
+    return (float2)(p, e);
+}
+
+inline float2 threeTwoSum(float a, float b, float c)
+{
+    float2 t = twoSum(a, b);
+    float2 rt = twoSum(t.s0, c);
+    return (float2)(rt.s0, t.s1 + rt.s1);
+}
+
+inline float3 mul(float3 a, float3 b) {
+    float2 p1 = twoProd(a.s0, b.s0);
+    float2 p2 = twoProd(a.s0, b.s1);
+    float2 p3 = twoProd(a.s1, b.s0);
+
+    float2 t12 = threeTwoSum(p1.s1, p2.s0, p3.s0);
+    float t3 = t12.s1 + p2.s1 + p3.s1 + a.s2 * b.s0 + a.s0 * b.s2 + a.s1 * b.s1;
+    float2 re0q = quickTwoSum(p1.s0, t12.s0);
+    float2 rer = quickTwoSum(re0q.s1, t3);
+    return (float3)(re0q.s0, rer.s0, rer.s1);
+}
+
+inline float3 sq(float3 a) {
+    // TODO: improve
+    return mul(a, a);
+}
+
+inline float3 add(float3 a, float3 b) {
+    float2 rt = twoSum(a.s0, b.s0);
+    float2 t12 = twoSum(a.s1, b.s1);
+    float2 t34 = twoSum(rt.s1, t12.s0);
+    float r2 = t12.s1 + t34.s1 + a.s2 + b.s2;
+
+    float2 re1t4 = quickTwoSum(rt.s0, t34.s0);
+    float2 re23 = twoSum(re1t4.s1, r2);
+    return (float3)(re1t4.s0, re23.s0, re23.s1);
+}
+
+inline float3 mulSingle(float3 a, float b) {
+    // TODO: improve
+    return mul(a, (float3)(b, 0.0, 0.0));
+}
+
+__kernel void iterate(__global float* A, const int width,
+                      float x1, float x2, float x3, float y1, float y2, float y3,
+                      float pw1, float pw2, float pw3, float ph1, float ph2, float ph3, int max, int smooth,
+                      int julia, float jx1, float jx2, float jx3, float jy1, float jy2, float jy3) {
+    int index = get_global_id(0);
+    int px = index % width;
+    int py = index / width;
+
+    float3 xl = (float3)(x1, x2, x3);
+    float3 yt = (float3)(y1, y2, y3);
+    float3 pixelScaleX = (float3)(pw1, pw2, pw3);
+    float3 pixelScaleY = (float3)(ph1, ph2, ph3);
+    float3 a = add(mulSingle(pixelScaleX, (float) px), xl); // pixelScaleX * px + xl
+    float3 b = add(mulSingle(pixelScaleY, (float) py), yt); // pixelScaleY * py + yt
+    float3 ca = julia != 0 ? ((float3) (jx1, jx2, jx3)) : a;
+    float3 cb = julia != 0 ? ((float3) (jy1, jy2, jy3)) : b;
+
+
+    int n = 0;
+    while (n < max - 1) {
+        float3 aa = mul(a, a);
+        float3 bb = mul(b, b);
+        float3 ab = mul(a, b);
+        float3 minusbb = (float3)(-bb.s0, -bb.s1, -bb.s2);
+        a = add(add(aa, minusbb), ca);
+        b = add(add(ab, ab), cb);
+        if (aa.s0 + bb.s0 > 16) break;
+        n++;
+    }
+
+    // N + 1 - log (log  |Z(N)|) / log 2
+    if (n >= max - 1)
+        A[index] = max;
+    else {
+        if (smooth != 0)
+            A[index] = ((float) n) + 1.0f - log2(log(a.s0 * a.s0 + b.s0 * b.s0) * 0.5f);
+        else
+            A[index] = ((float) n);
+    }
+    //               A[index] = ((float)n) + 1 - (a * a + b * b - 16) / (256 - 16);
+    //           A[get_global_id(0)] = 5;
+}

+ 268 - 0
libmandel/src/opencl/triplefloat.h

@@ -0,0 +1,268 @@
+unsigned char triplefloat_cl[] = {
+  0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e,
+  0x43, 0x4c, 0x20, 0x46, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41,
+  0x43, 0x54, 0x20, 0x4f, 0x46, 0x46, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69,
+  0x6e, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x77,
+  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61,
+  0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x29, 0x20, 0x7b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73,
+  0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x62, 0x20, 0x3d,
+  0x20, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x61,
+  0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x29,
+  0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, 0x2d, 0x20, 0x62, 0x62, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
+  0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x73, 0x2c, 0x20,
+  0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e,
+  0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x71, 0x75, 0x69,
+  0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x65, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x28, 0x73, 0x20, 0x2d,
+  0x20, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29,
+  0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69,
+  0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
+  0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2a, 0x20, 0x62,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x65, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x61, 0x2c, 0x20, 0x62,
+  0x2c, 0x20, 0x2d, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72,
+  0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x32, 0x29, 0x28, 0x70, 0x2c, 0x20, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a,
+  0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x32, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x54, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x2c, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x2c, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x63, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20,
+  0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x72, 0x74, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x74, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x72, 0x74, 0x2e, 0x73,
+  0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e,
+  0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x75, 0x6c,
+  0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x61, 0x2c, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x70, 0x31,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x70,
+  0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28,
+  0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x31, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20,
+  0x70, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
+  0x28, 0x61, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x29,
+  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x32, 0x20, 0x74, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65,
+  0x65, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x70, 0x31, 0x2e, 0x73,
+  0x31, 0x2c, 0x20, 0x70, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x70, 0x33,
+  0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x20, 0x74, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x31, 0x32,
+  0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x70, 0x32, 0x2e, 0x73, 0x31, 0x20,
+  0x2b, 0x20, 0x70, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x61, 0x2e,
+  0x73, 0x32, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20,
+  0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73, 0x32, 0x20,
+  0x2b, 0x20, 0x61, 0x2e, 0x73, 0x31, 0x20, 0x2a, 0x20, 0x62, 0x2e, 0x73,
+  0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x32, 0x20, 0x72, 0x65, 0x30, 0x71, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69,
+  0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x70, 0x31, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x32, 0x2e, 0x73, 0x30, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20,
+  0x72, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54,
+  0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x30, 0x71, 0x2e, 0x73,
+  0x31, 0x2c, 0x20, 0x74, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x33, 0x29, 0x28, 0x72, 0x65, 0x30, 0x71, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x72, 0x65, 0x72, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x72,
+  0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c,
+  0x69, 0x6e, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x73,
+  0x71, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x61, 0x29, 0x20,
+  0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44,
+  0x4f, 0x3a, 0x20, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x75,
+  0x6c, 0x28, 0x61, 0x2c, 0x20, 0x61, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a,
+  0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x33, 0x20, 0x61, 0x64, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33,
+  0x20, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x62,
+  0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x32, 0x20, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2e, 0x73,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x32, 0x20, 0x74, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x61, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2e,
+  0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x32, 0x20, 0x74, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x74, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x74, 0x31, 0x32, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x32, 0x20, 0x3d, 0x20,
+  0x74, 0x31, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x33, 0x34,
+  0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x61, 0x2e, 0x73, 0x32, 0x20, 0x2b,
+  0x20, 0x62, 0x2e, 0x73, 0x32, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x72, 0x65, 0x31, 0x74, 0x34,
+  0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53,
+  0x75, 0x6d, 0x28, 0x72, 0x74, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x33,
+  0x34, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x72, 0x65, 0x32, 0x33, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x31, 0x74,
+  0x34, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x32, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x33, 0x29, 0x28, 0x72, 0x65, 0x31, 0x74, 0x34,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x32, 0x33, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x72, 0x65, 0x32, 0x33, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
+  0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x75, 0x6c, 0x53, 0x69, 0x6e, 0x67,
+  0x6c, 0x65, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x61, 0x2c,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a,
+  0x20, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x75, 0x6c, 0x28,
+  0x61, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x29, 0x28,
+  0x62, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29,
+  0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e,
+  0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72,
+  0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x41, 0x2c, 0x20, 0x63,
+  0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x64,
+  0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x31, 0x2c, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x32, 0x2c, 0x20, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x20, 0x78, 0x33, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x20, 0x79, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
+  0x79, 0x32, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x79, 0x33,
+  0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x77, 0x32, 0x2c, 0x20, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x20, 0x70, 0x77, 0x33, 0x2c, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x70, 0x68, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x20, 0x70, 0x68, 0x32, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x20, 0x70, 0x68, 0x33, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61,
+  0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74,
+  0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x2c, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6a, 0x78, 0x32, 0x2c, 0x20, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x20, 0x6a, 0x78, 0x33, 0x2c, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x20, 0x6a, 0x79, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x20, 0x6a, 0x79, 0x32, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x20, 0x6a, 0x79, 0x33, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20,
+  0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69,
+  0x64, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x20, 0x70, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
+  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x33, 0x20, 0x78, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x33, 0x29, 0x28, 0x78, 0x31, 0x2c, 0x20, 0x78, 0x32, 0x2c, 0x20,
+  0x78, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x33, 0x20, 0x79, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x33, 0x29, 0x28, 0x79, 0x31, 0x2c, 0x20, 0x79, 0x32,
+  0x2c, 0x20, 0x79, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53,
+  0x63, 0x61, 0x6c, 0x65, 0x58, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x33, 0x29, 0x28, 0x70, 0x77, 0x31, 0x2c, 0x20, 0x70, 0x77,
+  0x32, 0x2c, 0x20, 0x70, 0x77, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x70, 0x69, 0x78, 0x65,
+  0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x59, 0x20, 0x3d, 0x20, 0x28, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x33, 0x29, 0x28, 0x70, 0x68, 0x31, 0x2c, 0x20,
+  0x70, 0x68, 0x32, 0x2c, 0x20, 0x70, 0x68, 0x33, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x61, 0x20,
+  0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x53, 0x69, 0x6e,
+  0x67, 0x6c, 0x65, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61,
+  0x6c, 0x65, 0x58, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29,
+  0x20, 0x70, 0x78, 0x29, 0x2c, 0x20, 0x78, 0x6c, 0x29, 0x3b, 0x20, 0x2f,
+  0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65,
+  0x58, 0x20, 0x2a, 0x20, 0x70, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x6c, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x62,
+  0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x6d, 0x75, 0x6c, 0x53, 0x69,
+  0x6e, 0x67, 0x6c, 0x65, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63,
+  0x61, 0x6c, 0x65, 0x59, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x29, 0x20, 0x70, 0x79, 0x29, 0x2c, 0x20, 0x79, 0x74, 0x29, 0x3b, 0x20,
+  0x2f, 0x2f, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c,
+  0x65, 0x59, 0x20, 0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x74,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20,
+  0x63, 0x61, 0x20, 0x3d, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20, 0x21,
+  0x3d, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x33, 0x29, 0x20, 0x28, 0x6a, 0x78, 0x31, 0x2c, 0x20, 0x6a, 0x78,
+  0x32, 0x2c, 0x20, 0x6a, 0x78, 0x33, 0x29, 0x29, 0x20, 0x3a, 0x20, 0x61,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33,
+  0x20, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x61, 0x20,
+  0x21, 0x3d, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x33, 0x29, 0x20, 0x28, 0x6a, 0x79, 0x31, 0x2c, 0x20, 0x6a,
+  0x79, 0x32, 0x2c, 0x20, 0x6a, 0x79, 0x33, 0x29, 0x29, 0x20, 0x3a, 0x20,
+  0x62, 0x3b, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x20, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x20, 0x3c, 0x20, 0x6d,
+  0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33,
+  0x20, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28, 0x61, 0x2c,
+  0x20, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x62, 0x62, 0x20, 0x3d,
+  0x20, 0x6d, 0x75, 0x6c, 0x28, 0x62, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x33, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x28,
+  0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x69,
+  0x6e, 0x75, 0x73, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x33, 0x29, 0x28, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x2d, 0x62, 0x62, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x2d, 0x62, 0x62,
+  0x2e, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x28, 0x61, 0x64,
+  0x64, 0x28, 0x61, 0x61, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x62,
+  0x62, 0x29, 0x2c, 0x20, 0x63, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64,
+  0x28, 0x61, 0x64, 0x64, 0x28, 0x61, 0x62, 0x2c, 0x20, 0x61, 0x62, 0x29,
+  0x2c, 0x20, 0x63, 0x62, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x61, 0x2e, 0x73, 0x30,
+  0x20, 0x2b, 0x20, 0x62, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x20, 0x31,
+  0x36, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x2b, 0x2b, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f,
+  0x20, 0x4e, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67,
+  0x20, 0x28, 0x6c, 0x6f, 0x67, 0x20, 0x20, 0x7c, 0x5a, 0x28, 0x4e, 0x29,
+  0x7c, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x32, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x3e, 0x3d, 0x20,
+  0x6d, 0x61, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x6d, 0x6f, 0x6f,
+  0x74, 0x68, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x2e,
+  0x30, 0x66, 0x20, 0x2d, 0x20, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x6c, 0x6f,
+  0x67, 0x28, 0x61, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x61, 0x2e, 0x73,
+  0x30, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62,
+  0x2e, 0x73, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x66, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c,
+  0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20,
+  0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x20, 0x6e,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x5b, 0x69, 0x6e, 0x64, 0x65,
+  0x78, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x29, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x28, 0x61,
+  0x20, 0x2a, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x62, 0x20, 0x2a, 0x20, 0x62,
+  0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x32, 0x35,
+  0x36, 0x20, 0x2d, 0x20, 0x31, 0x36, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x41, 0x5b, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62,
+  0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x20, 0x3d, 0x20,
+  0x35, 0x3b, 0x0a, 0x7d, 0x0a
+};
+unsigned int triplefloat_cl_len = 3173;

+ 18 - 8
mandelvid/src/main.cpp

@@ -2,19 +2,25 @@
 #include <iostream>
 
 #include <boost/program_options.hpp>
+#include <boost/optional.hpp>
 
 namespace progOpts = boost::program_options;
 
 int main(int argc, char** argv)
 {
     progOpts::options_description desc("Available options");
+    progOpts::positional_options_description p;
+
+    boost::optional<std::string> inPath;
+    boost::optional<std::string> outPath;
     desc.add_options()
         ("help", "display this help message")
         ("render-image,i", "render a mandelbrot view")
-        ("file,f", progOpts::value<std::string>(), "specifies a file to load")
-        ("output,o", progOpts::value<std::string>(), "file to output")
+        ("file,f", progOpts::value(&inPath), "specifies a file to load")
+        ("output,o", progOpts::value(&outPath), "file to output")
     ;
-    progOpts::positional_options_description p;
+
+
     p.add("file", 1);
     progOpts::variables_map vm;
     progOpts::store(progOpts::command_line_parser(argc, argv)
@@ -26,12 +32,16 @@ int main(int argc, char** argv)
         return 0;
     }
 
-    std::string out = vm["output"].as<std::string>();
-
     if (vm.count("render-image")) {
-        std::string inPath = vm["file"].as<std::string>();
-        std::cout << "rendering image " << inPath << std::endl;
-        renderImage(inPath, out);
+        if (!inPath) {
+            std::cout << "Please specify a path" << std::endl;
+            return 1;
+        }
+        if (!outPath) {
+            std::cout << "Please specify an output file" << std::endl;
+            return 1;
+        }
+        renderImage(*inPath, *outPath);
     } else {
         std::cout << "No files specified" << std::endl;
     }

+ 1 - 0
resources/Almond.qrc

@@ -8,6 +8,7 @@
         <file alias="cancel">icons/cancel.svg</file>
     </qresource>
     <qresource prefix="/gradients">
+        <file alias="almond">gradients/almond.xml</file>
         <file alias="oldschool">gradients/oldschool.xml</file>
         <file alias="clouds">gradients/clouds.xml</file>
         <file alias="rainbow">gradients/rainbow.xml</file>

+ 16 - 0
resources/gradients/almond.xml

@@ -0,0 +1,16 @@
+<gradient max="380" repeat="true" version="1.0.0" >
+    <color r="0" g="0" b="0" p="0" />
+    <color r="0" g="163" b="77" p="25.1529" />
+    <color r="28" g="63" b="157" p="42.3529" />
+    <color r="180" g="140" b="20" p="68.1176" />
+    <color r="255" g="255" b="0" p="94.5882" />
+    <color r="100" g="16" b="0" p="117.176" />
+    <color r="143" g="67" b="0" p="150" />
+    <color r="53" g="53" b="53" p="180" />
+    <color r="240" g="179" b="148" p="210" />
+    <color r="145" g="38" b="69" p="240" />
+    <color r="255" g="255" b="255" p="270" />
+    <color r="0" g="5" b="86" p="308.471" />
+    <color r="65" g="218" b="238" p="337.082" />
+    <color r="0" g="0" b="0" p="380" />
+</gradient>

+ 1 - 0
src/Almond.cpp

@@ -72,6 +72,7 @@ Almond::Almond(QWidget* parent) :
     connect(aboutSm, &AlmondSubMenu::accepted, [] () {});
     connect(aboutSm, &AlmondSubMenu::cancelled, [] () {});
 
+    fractalWidget->setGradient(gradientMenu->getGradient());
 
     /*QStatusBar* bar = new QStatusBar(this);
     bar->addWidget(new QLabel("ayay"));

+ 1 - 0
src/GradientMenu.cpp

@@ -13,6 +13,7 @@
 using alm::Gradient;
 
 const QString GradientMenu::presetNames[] = {
+    "almond",
     "blue gold",
     "clouds",
     "oldschool",