ETH Price: $3,149.67 (+0.97%)
Gas: 2 Gwei

Token

Arsu (ARSU)
 

Overview

Max Total Supply

308.262436062 ARSU

Holders

553

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.000545592 ARSU

Value
$0.00
0xd07418d2c5c71d02ad9ebaa0fbee1c63bfd267cf
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Arsu

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-24
*/

pragma solidity ^0.6.6;

contract ABDKMathQuad {
/*
 * ABDK Math Quad Smart Contract Library.  Copyright © 2019 by ABDK Consulting.
 * Author: Mikhail Vladimirov <[email protected]>
 */

/**
 * Smart contract library of mathematical functions operating with IEEE 754
 * quadruple-precision binary floating-point numbers (quadruple precision
 * numbers).  As long as quadruple precision numbers are 16-bytes long, they are
 * represented by bytes16 type.
 */
  /**
   * 0.
   */
  bytes16 private constant POSITIVE_ZERO = 0x00000000000000000000000000000000;

  /**
   * -0.
   */
  bytes16 private constant NEGATIVE_ZERO = 0x80000000000000000000000000000000;

  /**
   * +Infinity.
   */
  bytes16 private constant POSITIVE_INFINITY = 0x7FFF0000000000000000000000000000;

  /**
   * -Infinity.
   */
  bytes16 private constant NEGATIVE_INFINITY = 0xFFFF0000000000000000000000000000;

  /**
   * Canonical NaN value.
   */
  bytes16 private constant NaN = 0x7FFF8000000000000000000000000000;

  /**
   * Convert unsigned 256-bit integer number into quadruple precision number.
   *
   * @param x unsigned 256-bit integer number
   * @return quadruple precision number
   */
  function fromUInt (uint256 x) internal pure returns (bytes16) {
    if (x == 0) return bytes16 (0);
    else {
      uint256 result = x;

      uint256 msb = msb (result);
      if (msb < 112) result <<= 112 - msb;
      else if (msb > 112) result >>= msb - 112;

      result = result & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | 16383 + msb << 112;

      return bytes16 (uint128 (result));
    }
  }

  /**
   * Convert quadruple precision number into unsigned 256-bit integer number
   * rounding towards zero.  Revert on underflow.  Note, that negative floating
   * point numbers in range (-1.0 .. 0.0) may be converted to unsigned integer
   * without error, because they are rounded to zero.
   *
   * @param x quadruple precision number
   * @return unsigned 256-bit integer number
   */
  function toUInt (bytes16 x) internal pure returns (uint256) {
    uint256 exponent = uint128 (x) >> 112 & 0x7FFF;

    if (exponent < 16383) return 0; // Underflow

    require (uint128 (x) < 0x80000000000000000000000000000000); // Negative

    require (exponent <= 16638); // Overflow
    uint256 result = uint256 (uint128 (x)) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF |
      0x10000000000000000000000000000;

    if (exponent < 16495) result >>= 16495 - exponent;
    else if (exponent > 16495) result <<= exponent - 16495;

    return result;
  }

  /**
   * Calculate x + y.  Special values behave in the following way:
   *
   * NaN + x = NaN for any x.
   * Infinity + x = Infinity for any finite x.
   * -Infinity + x = -Infinity for any finite x.
   * Infinity + Infinity = Infinity.
   * -Infinity + -Infinity = -Infinity.
   * Infinity + -Infinity = -Infinity + Infinity = NaN.
   *
   * @param x quadruple precision number
   * @param y quadruple precision number
   * @return quadruple precision number
   */
  function addABDK (bytes16 x, bytes16 y) internal pure returns (bytes16) {
    uint256 xExponent = uint128 (x) >> 112 & 0x7FFF;
    uint256 yExponent = uint128 (y) >> 112 & 0x7FFF;

    if (xExponent == 0x7FFF) {
      if (yExponent == 0x7FFF) { 
        if (x == y) return x;
        else return NaN;
      } else return x; 
    } else if (yExponent == 0x7FFF) return y;
    else {
      bool xSign = uint128 (x) >= 0x80000000000000000000000000000000;
      uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (xExponent == 0) xExponent = 1;
      else xSignifier |= 0x10000000000000000000000000000;

      bool ySign = uint128 (y) >= 0x80000000000000000000000000000000;
      uint256 ySignifier = uint128 (y) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (yExponent == 0) yExponent = 1;
      else ySignifier |= 0x10000000000000000000000000000;

      if (xSignifier == 0) return y == NEGATIVE_ZERO ? POSITIVE_ZERO : y;
      else if (ySignifier == 0) return x == NEGATIVE_ZERO ? POSITIVE_ZERO : x;
      else {
        int256 delta = int256 (xExponent) - int256 (yExponent);
  
        if (xSign == ySign) {
          if (delta > 112) return x;
          else if (delta > 0) ySignifier >>= delta;
          else if (delta < -112) return y;
          else if (delta < 0) {
            xSignifier >>= -delta;
            xExponent = yExponent;
          }
  
          xSignifier += ySignifier;
  
          if (xSignifier >= 0x20000000000000000000000000000) {
            xSignifier >>= 1;
            xExponent += 1;
          }
  
          if (xExponent == 0x7FFF)
            return xSign ? NEGATIVE_INFINITY : POSITIVE_INFINITY;
          else {
            if (xSignifier < 0x10000000000000000000000000000) xExponent = 0;
            else xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
  
            return bytes16 (uint128 (
                (xSign ? 0x80000000000000000000000000000000 : 0) |
                (xExponent << 112) |
                xSignifier)); 
          }
        } else {
          if (delta > 0) {
            xSignifier <<= 1;
            xExponent -= 1;
          } else if (delta < 0) {
            ySignifier <<= 1;
            xExponent = yExponent - 1;
          }

          if (delta > 112) ySignifier = 1;
          else if (delta > 1) ySignifier = (ySignifier - 1 >> delta - 1) + 1;
          else if (delta < -112) xSignifier = 1;
          else if (delta < -1) xSignifier = (xSignifier - 1 >> -delta - 1) + 1;

          if (xSignifier >= ySignifier) xSignifier -= ySignifier;
          else {
            xSignifier = ySignifier - xSignifier;
            xSign = ySign;
          }

          if (xSignifier == 0)
            return POSITIVE_ZERO;

          uint256 msb = msb (xSignifier);

          if (msb == 113) {
            xSignifier = xSignifier >> 1 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
            xExponent += 1;
          } else if (msb < 112) {
            uint256 shift = 112 - msb;
            if (xExponent > shift) {
              xSignifier = xSignifier << shift & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
              xExponent -= shift;
            } else {
              xSignifier <<= xExponent - 1;
              xExponent = 0;
            }
          } else xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

          if (xExponent == 0x7FFF)
            return xSign ? NEGATIVE_INFINITY : POSITIVE_INFINITY;
          else return bytes16 (uint128 (
              (xSign ? 0x80000000000000000000000000000000 : 0) |
              (xExponent << 112) |
              xSignifier));
        }
      }
    }
  }

  /**
   * Calculate x - y.  Special values behave in the following way:
   *
   * NaN - x = NaN for any x.
   * Infinity - x = Infinity for any finite x.
   * -Infinity - x = -Infinity for any finite x.
   * Infinity - -Infinity = Infinity.
   * -Infinity - Infinity = -Infinity.
   * Infinity - Infinity = -Infinity - -Infinity = NaN.
   *
   * @param x quadruple precision number
   * @param y quadruple precision number
   * @return quadruple precision number
   */
  function subABDK (bytes16 x, bytes16 y) internal pure returns (bytes16) {
    return addABDK(x, y ^ 0x80000000000000000000000000000000);
  }

  /**
   * Calculate x * y.  Special values behave in the following way:
   *
   * NaN * x = NaN for any x.
   * Infinity * x = Infinity for any finite positive x.
   * Infinity * x = -Infinity for any finite negative x.
   * -Infinity * x = -Infinity for any finite positive x.
   * -Infinity * x = Infinity for any finite negative x.
   * Infinity * 0 = NaN.
   * -Infinity * 0 = NaN.
   * Infinity * Infinity = Infinity.
   * Infinity * -Infinity = -Infinity.
   * -Infinity * Infinity = -Infinity.
   * -Infinity * -Infinity = Infinity.
   *
   * @param x quadruple precision number
   * @param y quadruple precision number
   * @return quadruple precision number
   */
  function mulABDK (bytes16 x, bytes16 y) internal pure returns (bytes16) {
    uint256 xExponent = uint128 (x) >> 112 & 0x7FFF;
    uint256 yExponent = uint128 (y) >> 112 & 0x7FFF;

    if (xExponent == 0x7FFF) {
      if (yExponent == 0x7FFF) {
        if (x == y) return x ^ y & 0x80000000000000000000000000000000;
        else if (x ^ y == 0x80000000000000000000000000000000) return x | y;
        else return NaN;
      } else {
        if (y & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) return NaN;
        else return x ^ y & 0x80000000000000000000000000000000;
      }
    } else if (yExponent == 0x7FFF) {
        if (x & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) return NaN;
        else return y ^ x & 0x80000000000000000000000000000000;
    } else {
      uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (xExponent == 0) xExponent = 1;
      else xSignifier |= 0x10000000000000000000000000000;

      uint256 ySignifier = uint128 (y) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (yExponent == 0) yExponent = 1;
      else ySignifier |= 0x10000000000000000000000000000;

      xSignifier *= ySignifier;
      if (xSignifier == 0)
        return (x ^ y) & 0x80000000000000000000000000000000 > 0 ?
            NEGATIVE_ZERO : POSITIVE_ZERO;

      xExponent += yExponent;

      uint256 msb =
        xSignifier >= 0x200000000000000000000000000000000000000000000000000000000 ? 225 :
        xSignifier >= 0x100000000000000000000000000000000000000000000000000000000 ? 224 :
        msb (xSignifier);

      if (xExponent + msb < 16496) { // Underflow
        xExponent = 0;
        xSignifier = 0;
      } else if (xExponent + msb < 16608) { // Subnormal
        if (xExponent < 16496)
          xSignifier >>= 16496 - xExponent;
        else if (xExponent > 16496)
          xSignifier <<= xExponent - 16496;
        xExponent = 0;
      } else if (xExponent + msb > 49373) {
        xExponent = 0x7FFF;
        xSignifier = 0;
      } else {
        if (msb > 112)
          xSignifier >>= msb - 112;
        else if (msb < 112)
          xSignifier <<= 112 - msb;

        xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

        xExponent = xExponent + msb - 16607;
      }

      return bytes16 (uint128 (uint128 ((x ^ y) & 0x80000000000000000000000000000000) |
          xExponent << 112 | xSignifier));
    }
  }

  /**
   * Calculate x / y.  Special values behave in the following way:
   *
   * NaN / x = NaN for any x.
   * x / NaN = NaN for any x.
   * Infinity / x = Infinity for any finite non-negative x.
   * Infinity / x = -Infinity for any finite negative x including -0.
   * -Infinity / x = -Infinity for any finite non-negative x.
   * -Infinity / x = Infinity for any finite negative x including -0.
   * x / Infinity = 0 for any finite non-negative x.
   * x / -Infinity = -0 for any finite non-negative x.
   * x / Infinity = -0 for any finite non-negative x including -0.
   * x / -Infinity = 0 for any finite non-negative x including -0.
   * 
   * Infinity / Infinity = NaN.
   * Infinity / -Infinity = -NaN.
   * -Infinity / Infinity = -NaN.
   * -Infinity / -Infinity = NaN.
   *
   * Division by zero behaves in the following way:
   *
   * x / 0 = Infinity for any finite positive x.
   * x / -0 = -Infinity for any finite positive x.
   * x / 0 = -Infinity for any finite negative x.
   * x / -0 = Infinity for any finite negative x.
   * 0 / 0 = NaN.
   * 0 / -0 = NaN.
   * -0 / 0 = NaN.
   * -0 / -0 = NaN.
   *
   * @param x quadruple precision number
   * @param y quadruple precision number
   * @return quadruple precision number
   */
  function divABDK (bytes16 x, bytes16 y) internal pure returns (bytes16) {
    uint256 xExponent = uint128 (x) >> 112 & 0x7FFF;
    uint256 yExponent = uint128 (y) >> 112 & 0x7FFF;

    if (xExponent == 0x7FFF) {
      if (yExponent == 0x7FFF) return NaN;
      else return x ^ y & 0x80000000000000000000000000000000;
    } else if (yExponent == 0x7FFF) {
      if (y & 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF != 0) return NaN;
      else return POSITIVE_ZERO | (x ^ y) & 0x80000000000000000000000000000000;
    } else if (y & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) {
      if (x & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) return NaN;
      else return POSITIVE_INFINITY | (x ^ y) & 0x80000000000000000000000000000000;
    } else {
      uint256 ySignifier = uint128 (y) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (yExponent == 0) yExponent = 1;
      else ySignifier |= 0x10000000000000000000000000000;

      uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (xExponent == 0) {
        if (xSignifier != 0) {
          uint shift = 226 - msb (xSignifier);

          xSignifier <<= shift;

          xExponent = 1;
          yExponent += shift - 114;
        }
      }
      else {
        xSignifier = (xSignifier | 0x10000000000000000000000000000) << 114;
      }

      xSignifier = xSignifier / ySignifier;
      if (xSignifier == 0)
        return (x ^ y) & 0x80000000000000000000000000000000 > 0 ?
            NEGATIVE_ZERO : POSITIVE_ZERO;

      assert (xSignifier >= 0x1000000000000000000000000000);

      uint256 msb =
        xSignifier >= 0x80000000000000000000000000000 ? msb (xSignifier) :
        xSignifier >= 0x40000000000000000000000000000 ? 114 :
        xSignifier >= 0x20000000000000000000000000000 ? 113 : 112;

      if (xExponent + msb > yExponent + 16497) { // Overflow
        xExponent = 0x7FFF;
        xSignifier = 0;
      } else if (xExponent + msb + 16380  < yExponent) { // Underflow
        xExponent = 0;
        xSignifier = 0;
      } else if (xExponent + msb + 16268  < yExponent) { // Subnormal
        if (xExponent + 16380 > yExponent)
          xSignifier <<= xExponent + 16380 - yExponent;
        else if (xExponent + 16380 < yExponent)
          xSignifier >>= yExponent - xExponent - 16380;

        xExponent = 0;
      } else { // Normal
        if (msb > 112)
          xSignifier >>= msb - 112;

        xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

        xExponent = xExponent + msb + 16269 - yExponent;
      }

      return bytes16 (uint128 (uint128 ((x ^ y) & 0x80000000000000000000000000000000) |
          xExponent << 112 | xSignifier));
    }
  }

  /**
   * Calculate 2^x.
   *
   * @param x quadruple precision number
   * @return quadruple precision number
   */
  function pow_2 (bytes16 x) internal pure returns (bytes16) {
    bool xNegative = uint128 (x) > 0x80000000000000000000000000000000;
    uint256 xExponent = uint128 (x) >> 112 & 0x7FFF;
    uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

    if (xExponent == 0x7FFF && xSignifier != 0) return NaN;
    else if (xExponent > 16397)
      return xNegative ? POSITIVE_ZERO : POSITIVE_INFINITY;
    else if (xExponent < 16255)
      return 0x3FFF0000000000000000000000000000;
    else {
      if (xExponent == 0) xExponent = 1;
      else xSignifier |= 0x10000000000000000000000000000;

      if (xExponent > 16367)
        xSignifier <<= xExponent - 16367;
      else if (xExponent < 16367)
        xSignifier >>= 16367 - xExponent;

      if (xNegative && xSignifier > 0x406E00000000000000000000000000000000)
        return POSITIVE_ZERO;

      if (!xNegative && xSignifier > 0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
        return POSITIVE_INFINITY;

      uint256 resultExponent = xSignifier >> 128;
      xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (xNegative && xSignifier != 0) {
        xSignifier = ~xSignifier;
        resultExponent += 1;
      }

      uint256 resultSignifier = 0x80000000000000000000000000000000;
      if (xSignifier & 0x80000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128;
      if (xSignifier & 0x40000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128;
      if (xSignifier & 0x20000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128;
      if (xSignifier & 0x10000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10B5586CF9890F6298B92B71842A98363 >> 128;
      if (xSignifier & 0x8000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1059B0D31585743AE7C548EB68CA417FD >> 128;
      if (xSignifier & 0x4000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128;
      if (xSignifier & 0x2000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128;
      if (xSignifier & 0x1000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128;
      if (xSignifier & 0x800000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128;
      if (xSignifier & 0x400000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128;
      if (xSignifier & 0x200000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100162F3904051FA128BCA9C55C31E5DF >> 128;
      if (xSignifier & 0x100000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000B175EFFDC76BA38E31671CA939725 >> 128;
      if (xSignifier & 0x80000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128;
      if (xSignifier & 0x40000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128;
      if (xSignifier & 0x20000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000162E525EE054754457D5995292026 >> 128;
      if (xSignifier & 0x10000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000B17255775C040618BF4A4ADE83FC >> 128;
      if (xSignifier & 0x8000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128;
      if (xSignifier & 0x4000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128;
      if (xSignifier & 0x2000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000162E43F4F831060E02D839A9D16D >> 128;
      if (xSignifier & 0x1000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000B1721BCFC99D9F890EA06911763 >> 128;
      if (xSignifier & 0x800000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128;
      if (xSignifier & 0x400000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128;
      if (xSignifier & 0x200000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000162E430E5A18F6119E3C02282A5 >> 128;
      if (xSignifier & 0x100000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000B1721835514B86E6D96EFD1BFE >> 128;
      if (xSignifier & 0x80000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128;
      if (xSignifier & 0x40000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000002C5C8601CC6B9E94213C72737A >> 128;
      if (xSignifier & 0x20000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000162E42FFF037DF38AA2B219F06 >> 128;
      if (xSignifier & 0x10000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000B17217FBA9C739AA5819F44F9 >> 128;
      if (xSignifier & 0x8000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128;
      if (xSignifier & 0x4000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128;
      if (xSignifier & 0x2000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000162E42FF0999CE3541B9FFFCF >> 128;
      if (xSignifier & 0x1000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000B17217F80F4EF5AADDA45554 >> 128;
      if (xSignifier & 0x800000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000058B90BFBF8479BD5A81B51AD >> 128;
      if (xSignifier & 0x400000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128;
      if (xSignifier & 0x200000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000162E42FEFB2FED257559BDAA >> 128;
      if (xSignifier & 0x100000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128;
      if (xSignifier & 0x80000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128;
      if (xSignifier & 0x40000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128;
      if (xSignifier & 0x20000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000162E42FEFA494F1478FDE05 >> 128;
      if (xSignifier & 0x10000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000B17217F7D20CF927C8E94C >> 128;
      if (xSignifier & 0x8000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128;
      if (xSignifier & 0x4000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000002C5C85FDF477B662B26945 >> 128;
      if (xSignifier & 0x2000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000162E42FEFA3AE53369388C >> 128;
      if (xSignifier & 0x1000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000B17217F7D1D351A389D40 >> 128;
      if (xSignifier & 0x800000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128;
      if (xSignifier & 0x400000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000002C5C85FDF4741BEA6E77E >> 128;
      if (xSignifier & 0x200000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000162E42FEFA39FE95583C2 >> 128;
      if (xSignifier & 0x100000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000B17217F7D1CFB72B45E1 >> 128;
      if (xSignifier & 0x80000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128;
      if (xSignifier & 0x40000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000002C5C85FDF473E242EA38 >> 128;
      if (xSignifier & 0x20000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000162E42FEFA39F02B772C >> 128;
      if (xSignifier & 0x10000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000B17217F7D1CF7D83C1A >> 128;
      if (xSignifier & 0x8000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128;
      if (xSignifier & 0x4000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000002C5C85FDF473DEA871F >> 128;
      if (xSignifier & 0x2000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000162E42FEFA39EF44D91 >> 128;
      if (xSignifier & 0x1000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000B17217F7D1CF79E949 >> 128;
      if (xSignifier & 0x800000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000058B90BFBE8E7BCE544 >> 128;
      if (xSignifier & 0x400000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000002C5C85FDF473DE6ECA >> 128;
      if (xSignifier & 0x200000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000162E42FEFA39EF366F >> 128;
      if (xSignifier & 0x100000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000B17217F7D1CF79AFA >> 128;
      if (xSignifier & 0x80000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000058B90BFBE8E7BCD6D >> 128;
      if (xSignifier & 0x40000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000002C5C85FDF473DE6B2 >> 128;
      if (xSignifier & 0x20000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000162E42FEFA39EF358 >> 128;
      if (xSignifier & 0x10000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000B17217F7D1CF79AB >> 128;
      if (xSignifier & 0x8000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000058B90BFBE8E7BCD5 >> 128;
      if (xSignifier & 0x4000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000002C5C85FDF473DE6A >> 128;
      if (xSignifier & 0x2000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000162E42FEFA39EF34 >> 128;
      if (xSignifier & 0x1000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000B17217F7D1CF799 >> 128;
      if (xSignifier & 0x800000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000058B90BFBE8E7BCC >> 128;
      if (xSignifier & 0x400000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000002C5C85FDF473DE5 >> 128;
      if (xSignifier & 0x200000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000162E42FEFA39EF2 >> 128;
      if (xSignifier & 0x100000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000B17217F7D1CF78 >> 128;
      if (xSignifier & 0x80000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000058B90BFBE8E7BB >> 128;
      if (xSignifier & 0x40000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000002C5C85FDF473DD >> 128;
      if (xSignifier & 0x20000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000162E42FEFA39EE >> 128;
      if (xSignifier & 0x10000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000B17217F7D1CF6 >> 128;
      if (xSignifier & 0x8000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000058B90BFBE8E7A >> 128;
      if (xSignifier & 0x4000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000002C5C85FDF473C >> 128;
      if (xSignifier & 0x2000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000162E42FEFA39D >> 128;
      if (xSignifier & 0x1000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000B17217F7D1CE >> 128;
      if (xSignifier & 0x800000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000058B90BFBE8E6 >> 128;
      if (xSignifier & 0x400000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000002C5C85FDF472 >> 128;
      if (xSignifier & 0x200000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000162E42FEFA38 >> 128;
      if (xSignifier & 0x100000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000B17217F7D1B >> 128;
      if (xSignifier & 0x80000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000058B90BFBE8D >> 128;
      if (xSignifier & 0x40000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000002C5C85FDF46 >> 128;
      if (xSignifier & 0x20000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000162E42FEFA2 >> 128;
      if (xSignifier & 0x10000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000B17217F7D0 >> 128;
      if (xSignifier & 0x8000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000058B90BFBE7 >> 128;
      if (xSignifier & 0x4000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000002C5C85FDF3 >> 128;
      if (xSignifier & 0x2000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000162E42FEF9 >> 128;
      if (xSignifier & 0x1000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000B17217F7C >> 128;
      if (xSignifier & 0x800000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000058B90BFBD >> 128;
      if (xSignifier & 0x400000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000002C5C85FDE >> 128;
      if (xSignifier & 0x200000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000162E42FEE >> 128;
      if (xSignifier & 0x100000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000B17217F6 >> 128;
      if (xSignifier & 0x80000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000058B90BFA >> 128;
      if (xSignifier & 0x40000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000002C5C85FC >> 128;
      if (xSignifier & 0x20000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000162E42FD >> 128;
      if (xSignifier & 0x10000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000B17217E >> 128;
      if (xSignifier & 0x8000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000058B90BE >> 128;
      if (xSignifier & 0x4000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000002C5C85E >> 128;
      if (xSignifier & 0x2000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000162E42E >> 128;
      if (xSignifier & 0x1000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000B17216 >> 128;
      if (xSignifier & 0x800000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000058B90A >> 128;
      if (xSignifier & 0x400000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000002C5C84 >> 128;
      if (xSignifier & 0x200000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000162E41 >> 128;
      if (xSignifier & 0x100000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000B1720 >> 128;
      if (xSignifier & 0x80000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000058B8F >> 128;
      if (xSignifier & 0x40000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000002C5C7 >> 128;
      if (xSignifier & 0x20000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000162E3 >> 128;
      if (xSignifier & 0x10000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000B171 >> 128;
      if (xSignifier & 0x8000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000058B8 >> 128;
      if (xSignifier & 0x4000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000002C5B >> 128;
      if (xSignifier & 0x2000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000162D >> 128;
      if (xSignifier & 0x1000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000B16 >> 128;
      if (xSignifier & 0x800 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000058A >> 128;
      if (xSignifier & 0x400 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000002C4 >> 128;
      if (xSignifier & 0x200 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000161 >> 128;
      if (xSignifier & 0x100 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000000B0 >> 128;
      if (xSignifier & 0x80 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000057 >> 128;
      if (xSignifier & 0x40 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000002B >> 128;
      if (xSignifier & 0x20 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000015 >> 128;
      if (xSignifier & 0x10 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000000A >> 128;
      if (xSignifier & 0x8 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000004 >> 128;
      if (xSignifier & 0x4 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000001 >> 128;

      if (!xNegative) {
        resultSignifier = resultSignifier >> 15 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
        resultExponent += 0x3FFF;
      } else if (resultExponent <= 0x3FFE) {
        resultSignifier = resultSignifier >> 15 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
        resultExponent = 0x3FFF - resultExponent;
      } else {
        resultSignifier = resultSignifier >> resultExponent - 16367;
        resultExponent = 0;
      }

      return bytes16 (uint128 (resultExponent << 112 | resultSignifier));
    }
  }

  /**
   * Calculate e^x.
   *
   * @param x quadruple precision number
   * @return quadruple precision number
   */
  function exp (bytes16 x) internal pure returns (bytes16) {
    return pow_2 (mulABDK (x, 0x3FFF71547652B82FE1777D0FFDA0D23A));
  }
  
  function msb (uint256 x) private pure returns (uint256) {
    require (x > 0);

    uint256 result = 0;

    if (x >= 0x100000000000000000000000000000000) { x >>= 128; result += 128; }
    if (x >= 0x10000000000000000) { x >>= 64; result += 64; }
    if (x >= 0x100000000) { x >>= 32; result += 32; }
    if (x >= 0x10000) { x >>= 16; result += 16; }
    if (x >= 0x100) { x >>= 8; result += 8; }
    if (x >= 0x10) { x >>= 4; result += 4; }
    if (x >= 0x4) { x >>= 2; result += 2; }
    if (x >= 0x2) result += 1; // No need to shift x anymore

    return result;
  }
  
  function totalSupplyAtTime (uint t) internal pure returns (bytes16 fin) {
      bytes16 xQuad = fromUInt(t);
      bytes16 xQuadSub = subABDK(xQuad, 0x4016e133800000000000000000000000);
      bytes16 exponent = mulABDK(xQuadSub, 0xbfea0c6f7a0b5ed8d36b4c7f34938583);
      bytes16 expExp = exp(exponent);
      bytes16 bottom = addABDK(0x3fff0000000000000000000000000000, expExp);
      bytes16 whole = divABDK(0x402a22db571485000000000000000000, bottom);
      fin = addABDK(whole, 0x401f73b9fbd700000000000000000000);
  }
  
}

contract SafeMath {
    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }
    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
    
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
    
}

contract ERC20wRebase is SafeMath, ABDKMathQuad {

  string public name;
  string public symbol;
  uint8 public decimals;
  address public _owner;
  uint private supplyTotal;
  uint private constant _decimals = 9;
  uint private constant uintMax = ~uint256(0);
  uint private constant tokensMax = 10**4 * 10**_decimals;
  uint private tokensInitial = 10**1 * 10**_decimals;
  uint internal unitsPerToken;
  uint private unitsTotal = uintMax - (uintMax % tokensMax);
  uint public tokensCurrent;

  mapping(address => uint) balances;
  mapping(address => mapping(address => uint)) allowed;

  event Transfer(address indexed from, address indexed to, uint tokens);
  event Approval(address indexed tokenOwner, address indexed spender, uint tokens);

  modifier onlyOwner() {
    require(_owner == msg.sender, "Ownable: caller is not the owner");
    _;
  }

  constructor() public {
    name = "Arsu";
    symbol = "ARSU";
    decimals = 9;
    supplyTotal = tokensMax;
    unitsPerToken = div(unitsTotal, supplyTotal);
    uint unitsInitial =  mul(unitsPerToken, tokensInitial);
    tokensCurrent = tokensInitial;
    balances[msg.sender] = unitsInitial;
    _owner = msg.sender;
    emit Transfer(address(0), msg.sender, tokensInitial);
  }

  function rebase(int supplyDelta) external onlyOwner returns (uint) {
    if (supplyDelta == 0) {
        emit RebaseEvent(supplyDelta);
        return supplyTotal;
    }
    
    if (supplyDelta < 0) {
        tokensCurrent = sub(tokensCurrent, div(mul(uint(-supplyDelta), tokensCurrent), supplyTotal));
        supplyTotal = sub(supplyTotal, uint(-supplyDelta));
    }
    
    if (supplyDelta > 0) {
        tokensCurrent = add(tokensCurrent, div(mul(uint(supplyDelta), tokensCurrent), supplyTotal));
        supplyTotal = add(supplyTotal, uint(supplyDelta));
    }

    unitsPerToken = div(unitsTotal, supplyTotal);

    emit RebaseEvent(supplyDelta);
    return supplyTotal;
  }

  function totalSupply() public view returns (uint) {
    return tokensCurrent;
  }
  
  function balanceOf(address who) public view returns (uint) {
    return div(balances[who], unitsPerToken);
  }

  function transfer(address to, uint value) public returns (bool) {
    uint unitValue = mul(value, unitsPerToken);
    balances[msg.sender] = sub(balances[msg.sender], unitValue);
    balances[to] = add(balances[to], unitValue);
    emit Transfer(msg.sender, to, value);
    return true;
  }

  function allowance(address owner_, address spender) public view returns (uint) {
    return allowed[owner_][spender];
  }

  function transferFrom(address from, address to, uint256 value) public returns (bool) {
    allowed[from][msg.sender] = sub(allowed[from][msg.sender], value);

    uint unitValue = mul(value, unitsPerToken);
    balances[from] = sub(balances[from], unitValue);
    balances[to] = add(balances[to], unitValue);
    emit Transfer(from, to, value);

    return true;
  }

  function approve(address spender, uint value) public returns (bool) {
    allowed[msg.sender][spender] = value;
    emit Approval(msg.sender, spender, value);
    return true;
  }

  function increaseAllowance(address spender, uint addedValue) public returns (bool) {
    allowed[msg.sender][spender] = add(allowed[msg.sender][spender], addedValue);
    emit Approval(msg.sender, spender, allowed[msg.sender][spender]);
    return true;
  }

  function decreaseAllowance(address spender, uint subtractedValue) public returns (bool) {
    uint256 oldValue = allowed[msg.sender][spender];
    if (subtractedValue >= oldValue) {
      allowed[msg.sender][spender] = 0;
    } else {
      allowed[msg.sender][spender] = sub(oldValue, subtractedValue);
    }
    emit Approval(msg.sender, spender, allowed[msg.sender][spender]);
    return true;
  }

  event RebaseEvent(int supplyDelta);

}

abstract contract TwinContract {
    
    function totalBalanceOf(address _of) virtual public view returns (uint256 amount);
    function mint(address unlocker, uint unlockAmount) virtual external returns (bool);
    function getRewardsGiven() virtual public view returns(uint);
    function rebase(int supplyDelta) virtual external returns (uint);
    function getTokensCurrent() virtual public view returns(uint);
    function getSupplyTotal() virtual public view returns (uint);
    function setTokensCurrent(uint newTokens) virtual external returns(uint);
    function getUnitsPerToken() virtual public view returns (uint);
    
}

abstract contract ThirdPartyContract {
    
    function transferFrom(address from, address to, uint256 value) virtual public returns (bool);
    function transfer(address to, uint value) virtual public returns (bool);
    
}

contract Arsu is ERC20wRebase {
  
  uint public totalValueTPT;
  uint public totalRewardsGivenTPT;
  
  address public twinAddress;
  TwinContract private twinContract;
  address public thirdPartyTokenAddress;
  ThirdPartyContract private thirdPartyContract;
  uint public lockingEnabledTime;
  bool public lockEnabled = false;

  event Mint(address mintee, uint amount);
  event Lock(address locker, uint lockAmount, uint duration);
  event Unlock(address unlocker, uint unlockAmount);
  event UpdatePosition(address updater, int amountDelta, int timeDelta);
  event LockTPT(address locker, uint lockAmount, uint duration);
  event UnlockTPT(address unlocker);
  event UpdatePositionTPT(address updater, int amountDelta, int timeDelta);
  event EnableLock();
  event SetTwin(address twinAddress);
  event SetTPT(address tptAddress);
  event ChangeOwner(address newOwner);
  
  modifier onlyTwin() {
    require(msg.sender == twinAddress, "Ownable: caller is not the owner");
    _;
  }
  
  function setTwin(address addr) external onlyOwner returns (bool) {
    require(twinAddress == address(0), "TWIN_ALREADY_SET");
    twinAddress = addr;
    twinContract = TwinContract(addr);
    emit SetTwin(addr);
    return true;
  }
  
  function setTPT(address addr) external onlyOwner returns (bool) {
      thirdPartyTokenAddress = addr;
      thirdPartyContract = ThirdPartyContract(addr);
      emit SetTPT(addr);
      return true;
  }
  
  function changeOwner(address addr) external onlyOwner returns (bool) {
    _owner = addr;
    emit ChangeOwner(addr);
    return true;
  }

  mapping(address => lockStruct) public locked;
  mapping(address => lockTPTStruct) public lockedTPT;
  
  struct lockStruct {
    uint amount;
    bytes16 percentSupplyLocked;
    uint unlockTime;
    bool punishmentFlag;
    uint confirmedReward;
    bytes16 supplyWhenLastModified;
  }
  
  struct lockTPTStruct {
    uint amount;
    uint value;
    uint unlockTime;
    bool punishmentFlag;
    uint confirmedReward;
    bytes16 supplyWhenLastModified;
  }
  
  function mint(address unlocker, uint unlockAmount) external onlyTwin returns (bool) {
    uint addedTokens = unlockAmount;
    uint addedUnits = mul(unitsPerToken, addedTokens);
    tokensCurrent = add(tokensCurrent, addedTokens);
    balances[unlocker] = add(balances[unlocker], addedUnits);
    emit Mint(unlocker, unlockAmount);
    return true;
  }
  
  function enableLocking() external onlyOwner returns (bool) {
    require(!lockEnabled, "LOCKING_ALREADY_ENABLED");
    lockEnabled = true;
    lockingEnabledTime = now;
    emit EnableLock();
    return lockEnabled;
  }
  
  function lock(uint amount, uint duration) public returns (bool) {
    require(locked[msg.sender].amount == 0, "POSITION_ALREADY_EXISTS");
    require(amount > 0, "INVALID_AMOUNT");
    require(duration > 0, "INVALID_DURATION");
    require(lockEnabled, "LOCKING_NOT_ENABLED_YET");
    uint unitAmount = mul(amount, unitsPerToken);
    uint unitsCurrent = mul(tokensCurrent, unitsPerToken);
    bytes16 percentSupplyLocked = divABDK(fromUInt(unitAmount), fromUInt(unitsCurrent));
    uint unlockTime = add(now, duration);
    locked[msg.sender] = lockStruct(unitAmount, percentSupplyLocked, unlockTime, false, 0, mulABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60));
    transfer(address(this), amount);
    emit Lock(msg.sender, amount, duration);
    return true;
  }
  
  function lockTPT(uint amount, uint duration) public returns (bool) {
    require(lockedTPT[msg.sender].amount == 0, "POSITION_ALREADY_EXISTS");
    require(amount > 0, "INVALID_AMOUNT");
    require(duration > 0, "INVALID_DURATION");
    require(lockEnabled, "LOCKING_NOT_ENABLED_YET");
    uint value = mul(amount, mul(duration, duration));
    totalValueTPT = add(totalValueTPT, value);
    lockedTPT[msg.sender] = lockTPTStruct(amount, value, add(now, duration), false, 0, mulABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60));
    thirdPartyContract.transferFrom(msg.sender, address(this), amount);
    emit LockTPT(msg.sender, amount, duration);
    return true;
  }

  function calculateUnlockReward(address unlocker, uint unlockTime, bool includeConfirmed) private view returns (uint reward) {
    bool pseudoFlag = false;
    if (locked[unlocker].punishmentFlag || locked[unlocker].unlockTime > unlockTime) {
      pseudoFlag = true;
    }
    int timeUnlockTimeDiff = int(unlockTime) - int(locked[unlocker].unlockTime);
    if (timeUnlockTimeDiff < 0) {
      timeUnlockTimeDiff = -timeUnlockTimeDiff;
    }
    uint minNowUnlockTime = (unlockTime + locked[unlocker].unlockTime) / 2 - uint(timeUnlockTimeDiff) / 2;
    require(minNowUnlockTime == unlockTime || minNowUnlockTime == locked[unlocker].unlockTime, "MIN_ERROR");
    reward = toUInt(mulABDK(subABDK(mulABDK(totalSupplyAtTime(sub(minNowUnlockTime, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60), locked[unlocker].supplyWhenLastModified), locked[unlocker].percentSupplyLocked));
    if (includeConfirmed) {
        reward = add(reward, locked[unlocker].confirmedReward);
    }
    reward = div(reward, 3);
    if (pseudoFlag) {
      reward = div(reward, 2);
    }
  }
  
  function calculateUnlockRewardTPT(address unlocker, uint unlockTime, bool includeConfirmed) private view returns (uint reward) {
    bool pseudoFlag = false;
    if(lockedTPT[unlocker].punishmentFlag || lockedTPT[unlocker].unlockTime > unlockTime) {
      pseudoFlag = true;
    }
    int timeUnlockTimeDiff = int(unlockTime) - int(lockedTPT[unlocker].unlockTime);
    if (timeUnlockTimeDiff < 0) {
      timeUnlockTimeDiff = -timeUnlockTimeDiff;
    }
    uint minNowUnlockTime = (unlockTime + lockedTPT[unlocker].unlockTime) / 2 - uint(timeUnlockTimeDiff) / 2;
    require(minNowUnlockTime == unlockTime || minNowUnlockTime == lockedTPT[unlocker].unlockTime, "MIN_ERROR");
    reward = toUInt(mulABDK(subABDK(mulABDK(totalSupplyAtTime(sub(minNowUnlockTime, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60), lockedTPT[unlocker].supplyWhenLastModified), divABDK(fromUInt(lockedTPT[unlocker].value), fromUInt(totalValueTPT))));
    if (includeConfirmed) {
        reward = add(reward, lockedTPT[unlocker].confirmedReward);
    }
    reward = toUInt(mulABDK(fromUInt(reward), subABDK(0x3fff0000000000000000000000000000, divABDK(fromUInt(totalRewardsGivenTPT), mulABDK(subABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40202a05f20000000000000000000000), 0x40d3c25c268497681c2650cb4be40d60)))));
    reward = toUInt(mulABDK(fromUInt(reward), 0x3ffe5555555555555555555555555555));
    if (pseudoFlag) {
      reward = div(reward, 2);
    }      
  }
  
  function updatePosition(int amountDelta, int durationDelta) public returns (bool) {
    require(locked[msg.sender].amount > 0, "NO_POSITION");

    uint confirmedReward = calculateUnlockReward(msg.sender, now, false) * 2;
    locked[msg.sender].confirmedReward = add(locked[msg.sender].confirmedReward, confirmedReward);

    uint unitsCurrent = mul(tokensCurrent, unitsPerToken);

    if (locked[msg.sender].unlockTime < now) {
        require (durationDelta > 0, "DURATION_DELTA_OF_EXPIRED_POSITION_MUST_BE_POSITIVE");
        require (amountDelta >= 0, "AMOUNT_DELTA_OF_EXPIRE_POSITION_MUST_BE_AT_LEAST_ZERO");
        bytes16 percentSupplyLocked = divABDK(fromUInt(locked[msg.sender].amount), fromUInt(unitsCurrent));
        locked[msg.sender].percentSupplyLocked = percentSupplyLocked;
        locked[msg.sender].unlockTime = now;
    }

    if (amountDelta > 0) {
      uint unitDelta = mul(uint(amountDelta), unitsPerToken);
      locked[msg.sender].amount = add(locked[msg.sender].amount, unitDelta);
      bytes16 percentSupplyLocked = divABDK(fromUInt(unitDelta), fromUInt(unitsCurrent));
      locked[msg.sender].percentSupplyLocked = addABDK(locked[msg.sender].percentSupplyLocked, percentSupplyLocked);
      transfer(address(this), uint(amountDelta));
    }
    
    if (amountDelta < 0) {
      uint unitDelta = mul(uint(-amountDelta), unitsPerToken);
      locked[msg.sender].amount = sub(locked[msg.sender].amount, unitDelta);
      bytes16 percentSupplyLocked = divABDK(fromUInt(unitDelta), fromUInt(unitsCurrent));
      locked[msg.sender].percentSupplyLocked = subABDK(locked[msg.sender].percentSupplyLocked, percentSupplyLocked);
      locked[msg.sender].punishmentFlag = true;
      this.transfer(msg.sender, uint(-amountDelta));
    }

    if (durationDelta < 0) {
      locked[msg.sender].unlockTime = sub(locked[msg.sender].unlockTime, uint(-durationDelta));
      locked[msg.sender].punishmentFlag = true;
    }

    if (durationDelta > 0) {
      locked[msg.sender].unlockTime = add(locked[msg.sender].unlockTime, uint(durationDelta));
    }
    
    locked[msg.sender].supplyWhenLastModified = mulABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60);

    require(locked[msg.sender].amount > 0, "POSITION_AMOUNT_CANNOT_BE_NEGATIVE");
    require(locked[msg.sender].unlockTime > now, "UNLOCKTIME_MUST_BE_IN_FUTURE");
    
    emit UpdatePosition(msg.sender, amountDelta, durationDelta);
    return true;
  }
  
  function updatePositionTPT(int amountDelta, int durationDelta) public returns (bool) {
    require(lockedTPT[msg.sender].amount > 0, "NO_POSITION");
    
    uint confirmedReward = calculateUnlockRewardTPT(msg.sender, now, false) * 2;
    lockedTPT[msg.sender].confirmedReward = add(lockedTPT[msg.sender].confirmedReward, confirmedReward);

    if (lockedTPT[msg.sender].unlockTime < now) {
        require (durationDelta > 0, "DURATION_DELTA_OF_EXPIRED_POSITION_MUST_BE_POSITIVE");
        require (amountDelta >= 0, "AMOUNT_DELTA_OF_EXPIRE_POSITION_MUST_BE_AT_LEAST_ZERO");
        lockedTPT[msg.sender].unlockTime = now;
    }

    if (amountDelta > 0) {
      lockedTPT[msg.sender].amount = add(lockedTPT[msg.sender].amount, uint(amountDelta));
      uint timeUntilUnlock = sub(lockedTPT[msg.sender].unlockTime, now);
      uint value = mul(uint(amountDelta), mul(timeUntilUnlock, timeUntilUnlock));
      totalValueTPT = add(totalValueTPT, value);
      lockedTPT[msg.sender].value = add(lockedTPT[msg.sender].value, value);
      thirdPartyContract.transferFrom(msg.sender, address(this), uint(amountDelta));
    }
    
    if (amountDelta < 0) {
      lockedTPT[msg.sender].amount = sub(lockedTPT[msg.sender].amount, uint(-amountDelta));
      uint timeUntilUnlock = sub(lockedTPT[msg.sender].unlockTime, now);
      uint value = mul(uint(-amountDelta), mul(timeUntilUnlock, timeUntilUnlock));
      totalValueTPT = sub(totalValueTPT, value);
      lockedTPT[msg.sender].value = sub(lockedTPT[msg.sender].value, value);
      lockedTPT[msg.sender].punishmentFlag = true;
      thirdPartyContract.transfer(msg.sender, uint(-amountDelta));
    }

    if (durationDelta < 0) {
      lockedTPT[msg.sender].unlockTime = sub(lockedTPT[msg.sender].unlockTime, uint(-durationDelta));
      uint value = mul(lockedTPT[msg.sender].amount, mul(uint(-durationDelta), uint(-durationDelta)));
      totalValueTPT = sub(totalValueTPT, value);
      lockedTPT[msg.sender].value = sub(lockedTPT[msg.sender].value, value);
      lockedTPT[msg.sender].punishmentFlag = true;
    }

    if (durationDelta > 0) {
      lockedTPT[msg.sender].unlockTime = add(lockedTPT[msg.sender].unlockTime, uint(durationDelta));
      uint value = mul(lockedTPT[msg.sender].amount, mul(uint(durationDelta), uint(durationDelta)));
      totalValueTPT = add(totalValueTPT, value);
      lockedTPT[msg.sender].value = add(lockedTPT[msg.sender].value, value);
    }
    
    lockedTPT[msg.sender].supplyWhenLastModified = mulABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60);
    
    require(lockedTPT[msg.sender].amount > 0, "POSITION_AMOUNT_CANNOT_BE_NEGATIVE");
    require(lockedTPT[msg.sender].unlockTime > now, "UNLOCKTIME_MUST_BE_IN_FUTURE");
    
    emit UpdatePositionTPT(msg.sender, amountDelta, durationDelta);
    return true;
  }
  
  function unlock() public returns (bool success) {
    require(locked[msg.sender].amount > 0, "NO_POSITION");
    uint tokenAmount = div(locked[msg.sender].amount, unitsPerToken);
    this.transfer(msg.sender, tokenAmount);
    uint reward = calculateUnlockReward(msg.sender, now, true);
    uint rewardTokens = div(reward, twinContract.getUnitsPerToken());
    success = twinContract.mint(msg.sender, rewardTokens);
    locked[msg.sender] = lockStruct(0, bytes16(0), 0, false, 0, bytes16(0));
    require(success, "MINT_FAILED");
    emit UnlockTPT(msg.sender);
  }
  
  function unlockTPT() public returns (bool success) {
    require(lockedTPT[msg.sender].amount > 0, "NO_POSITION");
    thirdPartyContract.transfer(msg.sender, lockedTPT[msg.sender].amount);
    uint reward = calculateUnlockRewardTPT(msg.sender, now, true);
    totalRewardsGivenTPT = add(reward, totalRewardsGivenTPT);
    uint rewardTokens = div(reward, twinContract.getUnitsPerToken());
    success = twinContract.mint(msg.sender, rewardTokens);
    totalValueTPT = sub(totalValueTPT, lockedTPT[msg.sender].value);
    lockedTPT[msg.sender] = lockTPTStruct(0, 0, 0, false, 0, bytes16(0));
    require(success, "MINT_FAILED");
    emit UnlockTPT(msg.sender);
  }
  
  function getRewardTokens(address addr, uint time) public view returns (uint) {
    require(locked[addr].amount > 0, "NO_POSITION");
    return div(calculateUnlockReward(addr, time, true), twinContract.getUnitsPerToken());
  }
  
  function getLockedTokens(address addr) public view returns (uint) {
    require(locked[addr].amount > 0, "NO_POSITION");
    return div(locked[addr].amount, unitsPerToken);   
  }
  
  function getRewardTokensTPT(address addr, uint time) public view returns (uint) {
    require(lockedTPT[addr].amount > 0, "NO_POSITION");
    return div(calculateUnlockRewardTPT(addr, time, true), twinContract.getUnitsPerToken());
  }
  
  function getUnitsPerToken() public view returns (uint) {
      return unitsPerToken;
  }

}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"ChangeOwner","type":"event"},{"anonymous":false,"inputs":[],"name":"EnableLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"LockTPT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"mintee","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int256","name":"supplyDelta","type":"int256"}],"name":"RebaseEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tptAddress","type":"address"}],"name":"SetTPT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"twinAddress","type":"address"}],"name":"SetTwin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"unlocker","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockAmount","type":"uint256"}],"name":"Unlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"unlocker","type":"address"}],"name":"UnlockTPT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"updater","type":"address"},{"indexed":false,"internalType":"int256","name":"amountDelta","type":"int256"},{"indexed":false,"internalType":"int256","name":"timeDelta","type":"int256"}],"name":"UpdatePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"updater","type":"address"},{"indexed":false,"internalType":"int256","name":"amountDelta","type":"int256"},{"indexed":false,"internalType":"int256","name":"timeDelta","type":"int256"}],"name":"UpdatePositionTPT","type":"event"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"changeOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableLocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"getRewardTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"getRewardTokensTPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnitsPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"lock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"lockTPT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"locked","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes16","name":"percentSupplyLocked","type":"bytes16"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"bool","name":"punishmentFlag","type":"bool"},{"internalType":"uint256","name":"confirmedReward","type":"uint256"},{"internalType":"bytes16","name":"supplyWhenLastModified","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedTPT","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"bool","name":"punishmentFlag","type":"bool"},{"internalType":"uint256","name":"confirmedReward","type":"uint256"},{"internalType":"bytes16","name":"supplyWhenLastModified","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockingEnabledTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"unlocker","type":"address"},{"internalType":"uint256","name":"unlockAmount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"supplyDelta","type":"int256"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setTPT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setTwin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thirdPartyTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsGivenTPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalValueTPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"twinAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTPT","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"amountDelta","type":"int256"},{"internalType":"int256","name":"durationDelta","type":"int256"}],"name":"updatePosition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"amountDelta","type":"int256"},{"internalType":"int256","name":"durationDelta","type":"int256"}],"name":"updatePositionTPT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6402540be40060049081556507326b47ffff196006556011805460ff1916905560c06040526080819052634172737560e01b60a09081526200004591600091906200028e565b50604080518082019091526004808252634152535560e01b602090920191825262000073916001916200028e565b506002805460ff191660091790556509184e72a0006003819055600654620000a4916001600160e01b036200013616565b6005819055600454600091620000c3916001600160e01b036200018916565b6004805460075533600081815260086020908152604080832086905560028054610100600160a81b0319166101008602179055935484519081529351949550919390927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92908290030190a35062000333565b60006200018083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620001e760201b60201c565b90505b92915050565b6000826200019a5750600062000183565b82820282848281620001a857fe5b0414620001805760405162461bcd60e51b81526004018080602001828103825260218152602001806200545e6021913960400191505060405180910390fd5b60008183620002775760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200023b57818101518382015260200162000221565b50505050905090810190601f168015620002695780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200028457fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d157805160ff191683800117855562000301565b8280016001018555821562000301579182015b8281111562000301578251825591602001919060010190620002e4565b506200030f92915062000313565b5090565b6200033091905b808211156200030f57600081556001016200031a565b90565b61511b80620003436000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80636b2d95d411610130578063a9059cbb116100b8578063d16bfa5d1161007c578063d16bfa5d146106d7578063dd62ed3e146106fa578063ea4c798c14610728578063eefa39ed14610730578063fcec898d1461073857610227565b8063a9059cbb14610610578063b2bdfa7b1461063c578063c25116b014610644578063c78aa6681461064c578063cbf9fe5f1461067257610227565b80639b5308ec116100ff5780639b5308ec1461052d578063a457c2d714610590578063a69df4b5146105bc578063a6f9dae1146105c4578063a7f89797146105ea57610227565b80636b2d95d4146104b657806370a08231146104dc57806385cb8b571461050257806395d89b411461052557610227565b806324da6603116101b35780633356c39c116101825780633356c39c14610407578063395093511461042a57806340c10f19146104565780634ca5d3e414610482578063627752231461048a57610227565b806324da6603146103ad578063313ce567146103b55780633166b848146103d3578063320d714e146103db57610227565b80630cac4e60116101fa5780630cac4e601461033c5780631089994c146103445780631338736f1461034c57806318160ddd1461036f57806323b872dd1461037757610227565b806301bec1cc1461022c57806306fdde0314610250578063095ea7b3146102cd5780630ab114f91461030d575b600080fd5b610234610740565b604080516001600160a01b039092168252519081900360200190f35b61025861074f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029257818101518382015260200161027a565b50505050905090810190601f1680156102bf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f9600480360360408110156102e357600080fd5b506001600160a01b0381351690602001356107dd565b604080519115158252519081900360200190f35b61032a6004803603602081101561032357600080fd5b5035610844565b60408051918252519081900360200190f35b61032a6109a5565b6102f96109ab565b6102f96004803603604081101561036257600080fd5b5080359060200135610cd2565b61032a610f97565b6102f96004803603606081101561038d57600080fd5b506001600160a01b03813581169160208101359091169060400135610f9d565b61032a6110b7565b6103bd6110bd565b6040805160ff9092168252519081900360200190f35b6102f96110c6565b61032a600480360360408110156103f157600080fd5b506001600160a01b0381351690602001356110cf565b6102f96004803603604081101561041d57600080fd5b508035906020013561118b565b6102f96004803603604081101561044057600080fd5b506001600160a01b038135169060200135611780565b6102f96004803603604081101561046c57600080fd5b506001600160a01b038135169060200135611813565b61032a61190d565b61032a600480360360408110156104a057600080fd5b506001600160a01b038135169060200135611913565b61032a600480360360208110156104cc57600080fd5b50356001600160a01b031661197a565b61032a600480360360208110156104f257600080fd5b50356001600160a01b03166119f8565b6102f96004803603604081101561051857600080fd5b5080359060200135611a1e565b610258611d04565b6105536004803603602081101561054357600080fd5b50356001600160a01b0316611d5e565b60408051968752602087019590955285850193909352901515606085015260808401526001600160801b03191660a0830152519081900360c00190f35b6102f9600480360360408110156105a657600080fd5b506001600160a01b038135169060200135611d9a565b6102f9611e83565b6102f9600480360360208110156105da57600080fd5b50356001600160a01b031661215c565b6102f96004803603602081101561060057600080fd5b50356001600160a01b0316612212565b6102f96004803603604081101561062657600080fd5b506001600160a01b0381351690602001356122cb565b610234612382565b610234612396565b6102f96004803603602081101561066257600080fd5b50356001600160a01b03166123a5565b6106986004803603602081101561068857600080fd5b50356001600160a01b03166124af565b604080519687526001600160801b03199586166020880152868101949094529115156060860152608085015290911660a0830152519081900360c00190f35b6102f9600480360360408110156106ed57600080fd5b50803590602001356124ef565b61032a6004803603604081101561071057600080fd5b506001600160a01b0381358116916020013516612a1c565b6102f9612a47565b61032a612b38565b61032a612b3e565b600e546001600160a01b031681565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b505050505081565b3360008181526009602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b60025460009061010090046001600160a01b03163314610899576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b816108da576040805183815290517f0b7e711d124e53e17b23a99f1ccbb839f29f7988434c16a32905c49fd25c067f9181900360200190a1506003546109a0565b6000821215610920576109086007546109036108fb85600003600754612b44565b600354612b9d565b612bdf565b60075560035461091c906000849003612bdf565b6003555b60008213156109575761094360075461093e6108fb85600754612b44565b612c21565b6007556003546109539083612c21565b6003555b610965600654600354612b9d565b6005556040805183815290517f0b7e711d124e53e17b23a99f1ccbb839f29f7988434c16a32905c49fd25c067f9181900360200190a1506003545b919050565b60075481565b336000908152601360205260408120546109fa576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b600f5433600081815260136020908152604080832054815163a9059cbb60e01b815260048101959095526024850152516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b505050506040513d6020811015610a8357600080fd5b5060009050610a9433426001612c7b565b9050610aa281600b54612c21565b600b819055506000610b2d82600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b505afa158015610b10573d6000803e3d6000fd5b505050506040513d6020811015610b2657600080fd5b5051612b9d565b600d54604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b505050506040513d6020811015610bae57600080fd5b5051600a5433600090815260136020526040902060010154919450610bd291612bdf565b600a556040805160c0810182526000808252602080830182815283850183815260608501848152608080870186815260a0880187815233885260139096529790952095518655915160018601555160028501555160038401805460ff1916911515919091179055925160048301559151600590910180546001600160801b0319169190921c17905582610c9a576040805162461bcd60e51b815260206004820152600b60248201526a1352539517d1905253115160aa1b604482015290519081900360640190fd5b6040805133815290517fc0b7a800db8dd9b5c87a08cd46842e5489191da7f8eb637a690a9202eacd5d049181900360200190a1505090565b3360009081526012602052604081205415610d2e576040805162461bcd60e51b8152602060048201526017602482015276504f534954494f4e5f414c52454144595f45584953545360481b604482015290519081900360640190fd5b60008311610d74576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b60008211610dbc576040805162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa22aa920aa24a7a760811b604482015290519081900360640190fd5b60115460ff16610e0d576040805162461bcd60e51b81526020600482015260176024820152761313d0d2d25391d7d393d517d153905093115117d65155604a1b604482015290519081900360640190fd5b6000610e1b84600554612b44565b90506000610e2d600754600554612b44565b90506000610e4b610e3d84612ecc565b610e4684612ecc565b612f31565b90506000610e594287612c21565b90506040518060c00160405280858152602001836001600160801b031916815260200182815260200160001515815260200160008152602001610ec2610ea9610ea442601054612bdf565b6131de565b6f02069e12e13424bb40e132865a5f206b60851b613279565b6001600160801b03199081169091523360009081526012602090815260409182902084518155908401516001820180548516608092831c179055918401516002820155606084015160038201805460ff191691151591909117905581840151600482015560a0909301516005909301805490921692901c919091179055610f4930886122cb565b50604080513381526020810189905280820188905290517f49eaf4942f1237055eb4cfa5f31c9dfe50d5b4ade01e021f7de8be2fbbde557b9181900360600190a15060019695505050505050565b60075490565b6001600160a01b0383166000908152600960209081526040808320338452909152812054610fcb9083612bdf565b6001600160a01b0385166000908152600960209081526040808320338452909152812091909155600554611000908490612b44565b6001600160a01b0386166000908152600860205260409020549091506110269082612bdf565b6001600160a01b0380871660009081526008602052604080822093909355908616815220546110559082612c21565b6001600160a01b0380861660008181526008602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3506001949350505050565b600b5481565b60025460ff1681565b60115460ff1681565b6001600160a01b038216600090815260136020526040812054611127576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b61118461113684846001612c7b565b600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b9392505050565b336000908152601360205260408120546111da576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b60006111e833426000612c7b565b33600090815260136020526040902060040154600291909102915061120d9082612c21565b3360009081526013602052604090206004810191909155600201544211156112c5576000831361126e5760405162461bcd60e51b81526004018080602001828103825260338152602001806150b36033913960400191505060405180910390fd5b60008412156112ae5760405162461bcd60e51b815260040180806020018281038252603581526020018061501b6035913960400191505060405180910390fd5b336000908152601360205260409020426002909101555b60008413156113ec57336000908152601360205260409020546112e89085612c21565b33600090815260136020526040812091825560029091015461130a9042612bdf565b905060006113218661131c8485612b44565b612b44565b905061132f600a5482612c21565b600a553360009081526013602052604090206001015461134f9082612c21565b33600081815260136020908152604080832060010194909455600f5484516323b872dd60e01b81526004810194909452306024850152604484018b905293516001600160a01b03909416936323b872dd93606480820194918390030190829087803b1580156113bd57600080fd5b505af11580156113d1573d6000803e3d6000fd5b505050506040513d60208110156113e757600080fd5b505050505b600084121561151f573360009081526013602052604081205461141191869003612bdf565b3360009081526013602052604081209182556002909101546114339042612bdf565b905060006114488660000361131c8485612b44565b9050611456600a5482612bdf565b600a55336000908152601360205260409020600101546114769082612bdf565b336000818152601360209081526040808320600180820196909655600301805460ff1916909517909455600f54845163a9059cbb60e01b815260048101949094528a8303602485015293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b1580156114f057600080fd5b505af1158015611504573d6000803e3d6000fd5b505050506040513d602081101561151a57600080fd5b505050505b60008312156115c6573360009081526013602052604081206002015461154791859003612bdf565b336000908152601360205260408120600281019290925590546115709061131c86840380612b44565b905061157e600a5482612bdf565b600a553360009081526013602052604090206001015461159e9082612bdf565b336000908152601360205260409020600180820192909255600301805460ff19169091179055505b600083131561165657336000908152601360205260409020600201546115ec9084612c21565b336000908152601360205260408120600281019290925590546116139061131c8680612b44565b9050611621600a5482612c21565b600a55336000908152601360205260409020600101546116419082612c21565b33600090815260136020526040902060010155505b611668610ea9610ea442601054612bdf565b3360009081526013602052604090206005810180546001600160801b03191660809390931c92909217909155546116d05760405162461bcd60e51b81526004018080602001828103825260228152602001806150916022913960400191505060405180910390fd5b336000908152601360205260409020600201544210611736576040805162461bcd60e51b815260206004820152601c60248201527f554e4c4f434b54494d455f4d5553545f42455f494e5f46555455524500000000604482015290519081900360640190fd5b604080513381526020810186905280820185905290517fc9d9742d6d75df29e861931a83d22f49a9bb389814d2b6ea46e8f01f2d4f8aa59181900360600190a15060019392505050565b3360009081526009602090815260408083206001600160a01b03861684529091528120546117ae9083612c21565b3360008181526009602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600c546000906001600160a01b03163314611863576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b6000829050600061187660055483612b44565b905061188460075483612c21565b6007556001600160a01b0385166000908152600860205260409020546118aa9082612c21565b6001600160a01b03861660008181526008602090815260409182902093909355805191825291810186905281517f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885929181900390910190a1506001949350505050565b600a5481565b6001600160a01b03821660009081526012602052604081205461196b576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b611184611136848460016134d5565b6001600160a01b0381166000908152601260205260408120546119d2576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b6001600160a01b03821660009081526012602052604090205460055461083e9190612b9d565b6001600160a01b03811660009081526008602052604081205460055461083e9190612b9d565b3360009081526013602052604081205415611a7a576040805162461bcd60e51b8152602060048201526017602482015276504f534954494f4e5f414c52454144595f45584953545360481b604482015290519081900360640190fd5b60008311611ac0576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b60008211611b08576040805162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa22aa920aa24a7a760811b604482015290519081900360640190fd5b60115460ff16611b59576040805162461bcd60e51b81526020600482015260176024820152761313d0d2d25391d7d393d517d153905093115117d65155604a1b604482015290519081900360640190fd5b6000611b698461131c8586612b44565b9050611b77600a5482612c21565b600a556040805160c08101825285815260208101839052908101611b9b4286612c21565b815260200160001515815260200160008152602001611bc2610ea9610ea442601054612bdf565b6001600160801b031990811690915233600081815260136020908152604080832086518155868301516001820155868201516002820155606087015160038201805460ff191691151591909117905560808088015160048084019190915560a0909801516005909201805490971691901c17909455600f5484516323b872dd60e01b8152958601939093523060248601526044850189905292516001600160a01b03909216936323b872dd93606480830194919391928390030190829087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b505050506040513d6020811015611cb857600080fd5b5050604080513381526020810186905280820185905290517ff37df2ada5e4cecc7e5442aee1a4f06d88347e03f6aab9ada70c6f2a2ea6f9259181900360600190a15060019392505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b60136020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919260ff9091169160801b86565b3360009081526009602090815260408083206001600160a01b0386168452909152812054808310611dee573360009081526009602090815260408083206001600160a01b0388168452909152812055611e1d565b611df88184612bdf565b3360009081526009602090815260408083206001600160a01b03891684529091529020555b3360008181526009602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b33600090815260126020526040812054611ed2576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b33600090815260126020526040812054600554611eef9190612b9d565b6040805163a9059cbb60e01b8152336004820152602481018390529051919250309163a9059cbb916044808201926020929091908290030181600087803b158015611f3957600080fd5b505af1158015611f4d573d6000803e3d6000fd5b505050506040513d6020811015611f6357600080fd5b5060009050611f74334260016134d5565b90506000611fca82600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b600d54604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561202157600080fd5b505af1158015612035573d6000803e3d6000fd5b505050506040513d602081101561204b57600080fd5b50516040805160c0810182526000808252602080830182815283850183815260608501848152608080870186815260a088018781523388526012909652979095209551865591516001860180546001600160801b031990811692871c92909217905590516002860155905160038501805460ff191691151591909117905593516004840155516005909201805490931691901c179055935083612123576040805162461bcd60e51b815260206004820152600b60248201526a1352539517d1905253115160aa1b604482015290519081900360640190fd5b6040805133815290517fc0b7a800db8dd9b5c87a08cd46842e5489191da7f8eb637a690a9202eacd5d049181900360200190a150505090565b60025460009061010090046001600160a01b031633146121b1576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b600280546001600160a01b0384166101008102610100600160a81b03199092169190911790915560408051918252517ff285329298fd841af46eb83bbe90d1ebe2951c975a65b19a02f965f842ee69c59181900360200190a1506001919050565b60025460009061010090046001600160a01b03163314612267576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b600e80546001600160a01b0384166001600160a01b03199182168117909255600f80549091168217905560408051918252517f5b7aee82a290644995a6f01961d12cb9e4a18b9533c0b2d20d5cd71a8fac9b7a9181900360200190a1506001919050565b6000806122da83600554612b44565b336000908152600860205260409020549091506122f79082612bdf565b33600090815260086020526040808220929092556001600160a01b038616815220546123239082612c21565b6001600160a01b0385166000818152600860209081526040918290209390935580518681529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b60025461010090046001600160a01b031681565b600c546001600160a01b031681565b60025460009061010090046001600160a01b031633146123fa576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b600c546001600160a01b03161561244b576040805162461bcd60e51b815260206004820152601060248201526f1515d25397d053149150511657d4d15560821b604482015290519081900360640190fd5b600c80546001600160a01b0384166001600160a01b03199182168117909255600d80549091168217905560408051918252517f80028450124b717cea125e678344e03e645c9cae901531348f26ddf86e414b5e9181900360200190a1506001919050565b6012602052600090815260409020805460018201546002830154600384015460048501546005909501549394608093841b94929360ff9092169290911b86565b3360009081526012602052604081205461253e576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b600061254c334260006134d5565b3360009081526012602052604090206004015460029190910291506125719082612c21565b336000908152601260205260408120600401919091556007546005546125979190612b44565b3360009081526012602052604090206002015490915042111561268557600084136125f35760405162461bcd60e51b81526004018080602001828103825260338152602001806150b36033913960400191505060405180910390fd5b60008512156126335760405162461bcd60e51b815260040180806020018281038252603581526020018061501b6035913960400191505060405180910390fd5b3360009081526012602052604081205461265090610e3d90612ecc565b3360009081526012602052604090206001810180546001600160801b03191660809390931c9290921790915542600290910155505b600085131561273c57600061269c86600554612b44565b336000908152601260205260409020549091506126b99082612c21565b336000908152601260205260408120919091556126e16126d883612ecc565b610e4685612ecc565b336000908152601260205260409020600101549091506127049060801b8261367c565b33600090815260126020526040902060010180546001600160801b03191660809290921c91909117905561273830886122cb565b5050505b600085121561286957600061275686600003600554612b44565b336000908152601260205260409020549091506127739082612bdf565b336000908152601260205260408120919091556127926126d883612ecc565b336000908152601260205260409020600101549091506127b59060801b82613a6a565b336000818152601260209081526040808320600180820180546001600160801b03191660809890981c97909717909655600301805460ff1916909517909455835163a9059cbb60e01b815260048101939093528a820360248401529251309363a9059cbb93604480820194929392918390030190829087803b15801561283a57600080fd5b505af115801561284e573d6000803e3d6000fd5b505050506040513d602081101561286457600080fd5b505050505b60008412156128b7573360009081526012602052604081206002015461289191869003612bdf565b3360009081526012602052604090206002810191909155600301805460ff191660011790555b60008413156128f157336000908152601260205260409020600201546128dd9085612c21565b336000908152601260205260409020600201555b612903610ea9610ea442601054612bdf565b3360009081526012602052604090206005810180546001600160801b03191660809390931c929092179091555461296b5760405162461bcd60e51b81526004018080602001828103825260228152602001806150916022913960400191505060405180910390fd5b3360009081526012602052604090206002015442106129d1576040805162461bcd60e51b815260206004820152601c60248201527f554e4c4f434b54494d455f4d5553545f42455f494e5f46555455524500000000604482015290519081900360640190fd5b604080513381526020810187905280820186905290517fc89acf41e7e6c33e4ea960f9cfd12574859c1d2083dd730d31f7975e7fafe58f9181900360600190a1506001949350505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b60025460009061010090046001600160a01b03163314612a9c576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b60115460ff1615612af4576040805162461bcd60e51b815260206004820152601760248201527f4c4f434b494e475f414c52454144595f454e41424c4544000000000000000000604482015290519081900360640190fd5b6011805460ff19166001179055426010556040517f8ed8806e096263615ba5e4a411f81ce1ea856a776aa4a3a384fa1e8bba86546790600090a15060115460ff1690565b60105481565b60055490565b600082612b535750600061083e565b82820282848281612b6057fe5b04146111845760405162461bcd60e51b81526004018080602001828103825260218152602001806150506021913960400191505060405180910390fd5b600061118483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a7c565b600061118483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b1e565b600082820183811015611184576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038316600090815260136020526040812060030154819060ff1680612cc157506001600160a01b03851660009081526013602052604090206002015484105b15612cca575060015b6001600160a01b038516600090815260136020526040812060020154850390811215612cf4576000035b6001600160a01b0386166000908152601360205260409020600290810154818304908701919091040380861480612d4557506001600160a01b03871660009081526013602052604090206002015481145b612d82576040805162461bcd60e51b815260206004820152600960248201526826a4a72fa2a92927a960b91b604482015290519081900360640190fd5b612dff612dfa612dc1612d9d610ea9610ea486601054612bdf565b6001600160a01b038b1660009081526013602052604090206005015460801b613a6a565b6001600160a01b038a16600090815260136020526040902060010154612df590612dea90612ecc565b610e46600a54612ecc565b613279565b613b78565b93508415612e31576001600160a01b038716600090815260136020526040902060040154612e2e908590612c21565b93505b612e82612dfa612e4086612ecc565b612df5613fff60701b60801b612e7d612e5a600b54612ecc565b610e46610ea9612e6f610ea442601054612bdf565b6420101502f960d91b613a6a565b613a6a565b9350612eac612dfa612e9386612ecc565b6f3ffe555555555555555555555555555560801b613279565b93508215612ec257612ebf846002612b9d565b93505b5050509392505050565b600081612edb575060006109a0565b816000612ee782613bfc565b90506070811015612f00578060700382901b9150612f13565b6070811115612f13576070810382901c91505b613fff0160701b6001600160701b03919091161760801b90506109a0565b6000617fff60f084811c8216919084901c811690821415612f775780617fff1415612f66575061ffff60ef1b915061083e9050565b505050600160ff1b8116821861083e565b80617fff1415612fbb576dffffffffffffffffffffffffffff60801b841615612faa575061ffff60ef1b915061083e9050565b505050808218600160ff1b1661083e565b600160801b600160ff1b03841661300557600160801b600160ff1b038516612fed575061ffff60ef1b915061083e9050565b505050808218600160ff1b16617fff60f01b1761083e565b6001600160701b03608085901c16816130215760019150613028565b600160701b175b6001600160701b03608087901c168361306757801561306257600061304c82613bfc565b6001955060e20393840160711901939190911b90505b613071565b600160701b1760721b5b81818161307a57fe5b049050806130a757600160ff1b8787181661309657600061309c565b600160ff1b5b94505050505061083e565b6001606c1b8110156130b557fe5b6000600160731b8210156130f557600160721b8210156130ea57600160711b8210156130e25760706130e5565b60715b6130ed565b60725b60ff166130fe565b6130fe82613bfc565b90508361407101818601111561311c57617fff9450600091506131af565b83818601613ffc0110156131375760009450600091506131af565b83818601613f8c011015613184578385613ffc011115613162578385613ffc010382901b915061317b565b8385613ffc01101561317b57613ffc8585030382901c91505b600094506131af565b6070811115613197576070810382901c91505b6001600160701b038216915083818601613f8d010394505b81607086901b888a186001607f1b60801b1660801c6001600160801b0316171760801b9550505050505061083e565b6000806131ea83612ecc565b905060006131ff8263802dc26760df1b613a6a565b90506000613220826fbfea0c6f7a0b5ed8d36b4c7f3493858360801b613279565b9050600061322d82613c9a565b90506000613240613fff60f01b8361367c565b9050600061325866402a22db57148560c81b83612f31565b905061326d8165401f73b9fbd760d01b61367c565b98975050505050505050565b6000617fff60f084811c8216919084901c8116908214156133185780617fff14156132f7576001600160801b031985811690851614156132c457505050600160ff1b8116821861083e565b600160ff1b6001600160801b03198686181614156132e75750505081811761083e565b5061ffff60ef1b915061083e9050565b600160801b600160ff1b038416612f66575061ffff60ef1b915061083e9050565b80617fff141561335457600160801b600160ff1b038516613343575061ffff60ef1b915061083e9050565b505050600160ff1b8216811861083e565b6001600160701b03608086901c16826133705760019250613377565b600160701b175b6001600160701b03608086901c1682613393576001925061339a565b600160701b175b90810290816133b757600160ff1b8787181661309657600061309c565b928201926000600160e11b8310156133eb57600160e01b8310156133e3576133de83613bfc565b6133e6565b60e05b6133ee565b60e15b905061407081860110156134095760009450600092506134a6565b6140e0818601101561344c5761407085101561342e57846140700383901c9250613443565b61407085111561344357614070850383901b92505b600094506134a6565b61c0dd818601111561346657617fff9450600092506134a6565b607081111561347d576070810383901c9250613490565b6070811015613490578060700383901b92505b6001600160701b03831692506140df8186010394505b82607086901b888a186001607f1b60801b1660801c6001600160801b0316171760801b9550505050505061083e565b6001600160a01b038316600090815260126020526040812060030154819060ff168061351b57506001600160a01b03851660009081526012602052604090206002015484105b15613524575060015b6001600160a01b03851660009081526012602052604081206002015485039081121561354e576000035b6001600160a01b038616600090815260126020526040902060029081015481830490870191909104038086148061359f57506001600160a01b03871660009081526012602052604090206002015481145b6135dc576040805162461bcd60e51b815260206004820152600960248201526826a4a72fa2a92927a960b91b604482015290519081900360640190fd5b61363f612dfa61361b6135f7610ea9610ea486601054612bdf565b6001600160a01b038b1660009081526012602052604090206005015460801b613a6a565b6001600160a01b038a1660009081526012602052604090206001015460801b613279565b93508415613671576001600160a01b03871660009081526012602052604090206004015461366e908590612c21565b93505b612eac846003612b9d565b6000617fff60f084811c8216919084901c8116908214156136ca5780617fff14156136c0576001600160801b031985811690851614156132e757849250505061083e565b849250505061083e565b80617fff14156136de57839250505061083e565b6001607f1b608086901c90811015906001600160701b031683613704576001935061370b565b600160701b175b6001607f1b608087901c90811015906001600160701b0316846137315760019450613738565b600160701b175b82613768576001600160801b03198816600160ff1b14613758578761375b565b60005b965050505050505061083e565b80613788576001600160801b03198916600160ff1b14613758578861375b565b84860384151583151514156138ab5760708113156137af578997505050505050505061083e565b60008113156137ce57808260008212156137c557fe5b901c9150613808565b606f198112156137e7578897505050505050505061083e565b6000811215613808578060000384600082121561380057fe5b901c93508596505b92810192600160711b8410613823576001968701969390931c925b86617fff1415613855578461383d57617fff60f01b613847565b6001600160f01b03195b97505050505050505061083e565b600160701b84101561386a5760009650613877565b6001600160701b03841693505b83607088901b8661388957600061388f565b6001607f1b5b6001600160801b0316171760801b97505050505050505061083e565b60008113156138c657600184901b93506001870396506138dd565b60008112156138dd57600182901b91506001860396505b60708113156138ef5760019150613952565b6001811315613917576001810360018303600082121561390b57fe5b901c6001019150613952565b606f1981121561392a5760019350613952565b600019811215613952576001816000030360018503600082121561394a57fe5b901c60010193505b81841061396357818403935061396c565b83820393508294505b8361398257506000965061083e95505050505050565b600061398d85613bfc565b905080607114156139b357600185901c6001600160701b03169450600188019750613a02565b60708110156139f5576070819003808911156139e2578086901b6001600160701b0316955080890398506139ef565b600098600019019590951b945b50613a02565b6001600160701b03851694505b87617fff1415613a355785613a1c57617fff60f01b613a26565b6001600160f01b03195b9850505050505050505061083e565b84607089901b87613a47576000613a4d565b6001607f1b5b6001600160801b0316171760801b9850505050505050505061083e565b600061118483600160ff1b841861367c565b60008183613b085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613acd578181015183820152602001613ab5565b50505050905090810190601f168015613afa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b1457fe5b0495945050505050565b60008184841115613b705760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613acd578181015183820152602001613ab5565b505050900390565b6000617fff60f083901c16613fff811015613b975760009150506109a0565b6001607f1b608084901c10613bab57600080fd5b6140fe811115613bba57600080fd5b600160701b6001600160701b03608085901c161761406f821015613be45761406f8290031c611184565b61406f8211156111845761406e1982011b9392505050565b6000808211613c0a57600080fd5b6000600160801b8310613c1f57608092831c92015b600160401b8310613c3257604092831c92015b6401000000008310613c4657602092831c92015b620100008310613c5857601092831c92015b6101008310613c6957600892831c92015b60108310613c7957600492831c92015b60048310613c8957600292831c92015b6002831061083e5760010192915050565b600061083e613cbc836f1fffb8aa3b295c17f0bbbe87fed0691d60811b613279565b60006001607f1b608083901c90811190617fff60f085901c8116916001600160701b03169082148015613cee57508015155b15613d04575061ffff60ef1b92506109a0915050565b61400d821115613d2b5782613d1e57617fff60f01b613d21565b60005b93505050506109a0565b613f7f821015613d465750613fff60f01b92506109a0915050565b81613d545760019150613d5b565b600160701b175b613fef821115613d7157613fee1982011b613d83565b613fef821015613d8357613fef8290031c5b828015613d94575061203760811b81115b15613da65750600092506109a0915050565b82158015613dc55750713fffffffffffffffffffffffffffffffffff81115b15613ddb5750617fff60f01b92506109a0915050565b6001600160801b0381169060801c838015613df557508115155b15613e01579019906001015b6001607f1b82811615613e255770016a09e667f3bcc908b2fb1366ea957d3e0260801c5b6001607e1b831615613e48577001306fe0a31b7152de8d5a46305c85edec0260801c5b6001607d1b831615613e6b577001172b83c7d517adcdf7c8c50eb14a791f0260801c5b6001607c1b831615613e8e5770010b5586cf9890f6298b92b71842a983630260801c5b6001607b1b831615613eb1577001059b0d31585743ae7c548eb68ca417fd0260801c5b6001607a1b831615613ed457700102c9a3e778060ee6f7caca4f7a29bde80260801c5b600160791b831615613ef75770010163da9fb33356d84a66ae336dcdfa3f0260801c5b600160781b831615613f1a57700100b1afa5abcbed6129ab13ec11dc95430260801c5b600160771b831615613f3d5770010058c86da1c09ea1ff19d294cf2f679b0260801c5b600160761b831615613f60577001002c605e2e8cec506d21bfc89a23a00f0260801c5b600160751b831615613f8357700100162f3904051fa128bca9c55c31e5df0260801c5b600160741b831615613fa6577001000b175effdc76ba38e31671ca9397250260801c5b600160731b831615613fc957700100058ba01fb9f96d6cacd4b180917c3d0260801c5b600160721b831615613fec5770010002c5cc37da9491d0985c348c68e7b30260801c5b600160711b83161561400f577001000162e525ee054754457d59952920260260801c5b600160701b8316156140325770010000b17255775c040618bf4a4ade83fc0260801c5b6001606f1b831615614055577001000058b91b5bc9ae2eed81e9b7d4cfab0260801c5b6001606e1b83161561407857700100002c5c89d5ec6ca4d7c8acc017b7c90260801c5b6001606d1b83161561409b5770010000162e43f4f831060e02d839a9d16d0260801c5b6001606c1b8316156140be57700100000b1721bcfc99d9f890ea069117630260801c5b6001606b1b8316156140e15770010000058b90cf1e6d97f9ca14dbcc16280260801c5b6001606a1b831615614104577001000002c5c863b73f016468f6bac5ca2b0260801c5b600160691b83161561412757700100000162e430e5a18f6119e3c02282a50260801c5b600160681b83161561414a577001000000b1721835514b86e6d96efd1bfe0260801c5b600160671b83161561416d57700100000058b90c0b48c6be5df846c5b2ef0260801c5b600160661b8316156141905770010000002c5c8601cc6b9e94213c72737a0260801c5b600160651b8316156141b3577001000000162e42fff037df38aa2b219f060260801c5b600160641b8316156141d65770010000000b17217fba9c739aa5819f44f90260801c5b600160631b8316156141f9577001000000058b90bfcdee5acd3c1cedc8230260801c5b600160621b83161561421c57700100000002c5c85fe31f35a6a30da1be500260801c5b600160611b83161561423f5770010000000162e42ff0999ce3541b9fffcf0260801c5b600160601b83161561426257700100000000b17217f80f4ef5aadda455540260801c5b6001605f1b8316156142855770010000000058b90bfbf8479bd5a81b51ad0260801c5b6001605e1b8316156142a8577001000000002c5c85fdf84bd62ae30a74cc0260801c5b6001605d1b8316156142cb57700100000000162e42fefb2fed257559bdaa0260801c5b6001605c1b8316156142ee577001000000000b17217f7d5a7716bba4a9ae0260801c5b6001605b1b83161561431157700100000000058b90bfbe9ddbac5e109cce0260801c5b6001605a1b8316156143345770010000000002c5c85fdf4b15de6f17eb0d0260801c5b600160591b831615614357577001000000000162e42fefa494f1478fde050260801c5b600160581b83161561437a5770010000000000b17217f7d20cf927c8e94c0260801c5b600160571b83161561439d577001000000000058b90bfbe8f71cb4e4b33d0260801c5b600160561b8316156143c057700100000000002c5c85fdf477b662b269450260801c5b600160551b8316156143e35770010000000000162e42fefa3ae53369388c0260801c5b600160541b83161561440657700100000000000b17217f7d1d351a389d400260801c5b600160531b8316156144295770010000000000058b90bfbe8e8b2d3d4ede0260801c5b600160521b83161561444c577001000000000002c5c85fdf4741bea6e77e0260801c5b600160511b83161561446f57700100000000000162e42fefa39fe95583c20260801c5b600160501b831615614492577001000000000000b17217f7d1cfb72b45e10260801c5b69800000000000000000008316156144bb57700100000000000058b90bfbe8e7cc35c3f00260801c5b69400000000000000000008316156144e45770010000000000002c5c85fdf473e242ea380260801c5b692000000000000000000083161561450d577001000000000000162e42fefa39f02b772c0260801c5b69100000000000000000008316156145365770010000000000000b17217f7d1cf7d83c1a0260801c5b690800000000000000000083161561455f577001000000000000058b90bfbe8e7bdcbe2e0260801c5b690400000000000000000083161561458857700100000000000002c5c85fdf473dea871f0260801c5b69020000000000000000008316156145b15770010000000000000162e42fefa39ef44d910260801c5b69010000000000000000008316156145da57700100000000000000b17217f7d1cf79e9490260801c5b688000000000000000008316156146025770010000000000000058b90bfbe8e7bce5440260801c5b6840000000000000000083161561462a577001000000000000002c5c85fdf473de6eca0260801c5b6820000000000000000083161561465257700100000000000000162e42fefa39ef366f0260801c5b6810000000000000000083161561467a577001000000000000000b17217f7d1cf79afa0260801c5b680800000000000000008316156146a257700100000000000000058b90bfbe8e7bcd6d0260801c5b680400000000000000008316156146ca5770010000000000000002c5c85fdf473de6b20260801c5b680200000000000000008316156146f2577001000000000000000162e42fefa39ef3580260801c5b600160401b8316156147155770010000000000000000b17217f7d1cf79ab0260801c5b67800000000000000083161561473c577001000000000000000058b90bfbe8e7bcd50260801c5b67400000000000000083161561476357700100000000000000002c5c85fdf473de6a0260801c5b67200000000000000083161561478a5770010000000000000000162e42fefa39ef340260801c5b6710000000000000008316156147b157700100000000000000000b17217f7d1cf7990260801c5b6708000000000000008316156147d85770010000000000000000058b90bfbe8e7bcc0260801c5b6704000000000000008316156147ff577001000000000000000002c5c85fdf473de50260801c5b67020000000000000083161561482657700100000000000000000162e42fefa39ef20260801c5b67010000000000000083161561484d577001000000000000000000b17217f7d1cf780260801c5b668000000000000083161561487357700100000000000000000058b90bfbe8e7bb0260801c5b66400000000000008316156148995770010000000000000000002c5c85fdf473dd0260801c5b66200000000000008316156148bf577001000000000000000000162e42fefa39ee0260801c5b66100000000000008316156148e55770010000000000000000000b17217f7d1cf60260801c5b660800000000000083161561490b577001000000000000000000058b90bfbe8e7a0260801c5b660400000000000083161561493157700100000000000000000002c5c85fdf473c0260801c5b66020000000000008316156149575770010000000000000000000162e42fefa39d0260801c5b660100000000000083161561497d57700100000000000000000000b17217f7d1ce0260801c5b658000000000008316156149a25770010000000000000000000058b90bfbe8e60260801c5b654000000000008316156149c7577001000000000000000000002c5c85fdf4720260801c5b652000000000008316156149ec57700100000000000000000000162e42fefa380260801c5b65100000000000831615614a11577001000000000000000000000b17217f7d1b0260801c5b65080000000000831615614a3657700100000000000000000000058b90bfbe8d0260801c5b65040000000000831615614a5b5770010000000000000000000002c5c85fdf460260801c5b65020000000000831615614a80577001000000000000000000000162e42fefa20260801c5b65010000000000831615614aa55770010000000000000000000000b17217f7d00260801c5b648000000000831615614ac9577001000000000000000000000058b90bfbe70260801c5b644000000000831615614aed57700100000000000000000000002c5c85fdf30260801c5b642000000000831615614b115770010000000000000000000000162e42fef90260801c5b641000000000831615614b3557700100000000000000000000000b17217f7c0260801c5b640800000000831615614b595770010000000000000000000000058b90bfbd0260801c5b640400000000831615614b7d577001000000000000000000000002c5c85fde0260801c5b640200000000831615614ba157700100000000000000000000000162e42fee0260801c5b640100000000831615614bc5577001000000000000000000000000b17217f60260801c5b6380000000831615614be857700100000000000000000000000058b90bfa0260801c5b6340000000831615614c0b5770010000000000000000000000002c5c85fc0260801c5b6320000000831615614c2e577001000000000000000000000000162e42fd0260801c5b6310000000831615614c515770010000000000000000000000000b17217e0260801c5b6308000000831615614c74577001000000000000000000000000058b90be0260801c5b6304000000831615614c9757700100000000000000000000000002c5c85e0260801c5b6302000000831615614cba5770010000000000000000000000000162e42e0260801c5b6301000000831615614cdd57700100000000000000000000000000b172160260801c5b62800000831615614cff5770010000000000000000000000000058b90a0260801c5b62400000831615614d21577001000000000000000000000000002c5c840260801c5b62200000831615614d4357700100000000000000000000000000162e410260801c5b62100000831615614d65577001000000000000000000000000000b17200260801c5b62080000831615614d8757700100000000000000000000000000058b8f0260801c5b62040000831615614da95770010000000000000000000000000002c5c70260801c5b62020000831615614dcb577001000000000000000000000000000162e30260801c5b62010000831615614ded5770010000000000000000000000000000b1710260801c5b618000831615614e0e577001000000000000000000000000000058b80260801c5b614000831615614e2f57700100000000000000000000000000002c5b0260801c5b612000831615614e505770010000000000000000000000000000162d0260801c5b611000831615614e7157700100000000000000000000000000000b160260801c5b610800831615614e925770010000000000000000000000000000058a0260801c5b610400831615614eb3577001000000000000000000000000000002c40260801c5b610200831615614ed4577001000000000000000000000000000001610260801c5b610100831615614ef5577001000000000000000000000000000000b00260801c5b6080831615614f15577001000000000000000000000000000000570260801c5b6040831615614f355770010000000000000000000000000000002b0260801c5b6020831615614f55577001000000000000000000000000000000150260801c5b6010831615614f755770010000000000000000000000000000000a0260801c5b6008831615614f95577001000000000000000000000000000000040260801c5b6004831615614fb5577001000000000000000000000000000000010260801c5b84614fd657600f81901c6001600160701b03169050613fff82019150615005565b613ffe8211614ffb57600f81901c6001600160701b0316905081613fff039150615005565b600091613fee19011c5b60709190911b1760801b93506109a09250505056fe414d4f554e545f44454c54415f4f465f4558504952455f504f534954494f4e5f4d5553545f42455f41545f4c454153545f5a45524f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572504f534954494f4e5f414d4f554e545f43414e4e4f545f42455f4e454741544956454455524154494f4e5f44454c54415f4f465f455850495245445f504f534954494f4e5f4d5553545f42455f504f534954495645a2646970667358221220cced869b31121b59bf63f623d266ee1a3c399b98534acc09c54ffd83d1fc801864736f6c63430006060033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c80636b2d95d411610130578063a9059cbb116100b8578063d16bfa5d1161007c578063d16bfa5d146106d7578063dd62ed3e146106fa578063ea4c798c14610728578063eefa39ed14610730578063fcec898d1461073857610227565b8063a9059cbb14610610578063b2bdfa7b1461063c578063c25116b014610644578063c78aa6681461064c578063cbf9fe5f1461067257610227565b80639b5308ec116100ff5780639b5308ec1461052d578063a457c2d714610590578063a69df4b5146105bc578063a6f9dae1146105c4578063a7f89797146105ea57610227565b80636b2d95d4146104b657806370a08231146104dc57806385cb8b571461050257806395d89b411461052557610227565b806324da6603116101b35780633356c39c116101825780633356c39c14610407578063395093511461042a57806340c10f19146104565780634ca5d3e414610482578063627752231461048a57610227565b806324da6603146103ad578063313ce567146103b55780633166b848146103d3578063320d714e146103db57610227565b80630cac4e60116101fa5780630cac4e601461033c5780631089994c146103445780631338736f1461034c57806318160ddd1461036f57806323b872dd1461037757610227565b806301bec1cc1461022c57806306fdde0314610250578063095ea7b3146102cd5780630ab114f91461030d575b600080fd5b610234610740565b604080516001600160a01b039092168252519081900360200190f35b61025861074f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029257818101518382015260200161027a565b50505050905090810190601f1680156102bf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f9600480360360408110156102e357600080fd5b506001600160a01b0381351690602001356107dd565b604080519115158252519081900360200190f35b61032a6004803603602081101561032357600080fd5b5035610844565b60408051918252519081900360200190f35b61032a6109a5565b6102f96109ab565b6102f96004803603604081101561036257600080fd5b5080359060200135610cd2565b61032a610f97565b6102f96004803603606081101561038d57600080fd5b506001600160a01b03813581169160208101359091169060400135610f9d565b61032a6110b7565b6103bd6110bd565b6040805160ff9092168252519081900360200190f35b6102f96110c6565b61032a600480360360408110156103f157600080fd5b506001600160a01b0381351690602001356110cf565b6102f96004803603604081101561041d57600080fd5b508035906020013561118b565b6102f96004803603604081101561044057600080fd5b506001600160a01b038135169060200135611780565b6102f96004803603604081101561046c57600080fd5b506001600160a01b038135169060200135611813565b61032a61190d565b61032a600480360360408110156104a057600080fd5b506001600160a01b038135169060200135611913565b61032a600480360360208110156104cc57600080fd5b50356001600160a01b031661197a565b61032a600480360360208110156104f257600080fd5b50356001600160a01b03166119f8565b6102f96004803603604081101561051857600080fd5b5080359060200135611a1e565b610258611d04565b6105536004803603602081101561054357600080fd5b50356001600160a01b0316611d5e565b60408051968752602087019590955285850193909352901515606085015260808401526001600160801b03191660a0830152519081900360c00190f35b6102f9600480360360408110156105a657600080fd5b506001600160a01b038135169060200135611d9a565b6102f9611e83565b6102f9600480360360208110156105da57600080fd5b50356001600160a01b031661215c565b6102f96004803603602081101561060057600080fd5b50356001600160a01b0316612212565b6102f96004803603604081101561062657600080fd5b506001600160a01b0381351690602001356122cb565b610234612382565b610234612396565b6102f96004803603602081101561066257600080fd5b50356001600160a01b03166123a5565b6106986004803603602081101561068857600080fd5b50356001600160a01b03166124af565b604080519687526001600160801b03199586166020880152868101949094529115156060860152608085015290911660a0830152519081900360c00190f35b6102f9600480360360408110156106ed57600080fd5b50803590602001356124ef565b61032a6004803603604081101561071057600080fd5b506001600160a01b0381358116916020013516612a1c565b6102f9612a47565b61032a612b38565b61032a612b3e565b600e546001600160a01b031681565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b505050505081565b3360008181526009602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b60025460009061010090046001600160a01b03163314610899576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b816108da576040805183815290517f0b7e711d124e53e17b23a99f1ccbb839f29f7988434c16a32905c49fd25c067f9181900360200190a1506003546109a0565b6000821215610920576109086007546109036108fb85600003600754612b44565b600354612b9d565b612bdf565b60075560035461091c906000849003612bdf565b6003555b60008213156109575761094360075461093e6108fb85600754612b44565b612c21565b6007556003546109539083612c21565b6003555b610965600654600354612b9d565b6005556040805183815290517f0b7e711d124e53e17b23a99f1ccbb839f29f7988434c16a32905c49fd25c067f9181900360200190a1506003545b919050565b60075481565b336000908152601360205260408120546109fa576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b600f5433600081815260136020908152604080832054815163a9059cbb60e01b815260048101959095526024850152516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b505050506040513d6020811015610a8357600080fd5b5060009050610a9433426001612c7b565b9050610aa281600b54612c21565b600b819055506000610b2d82600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b505afa158015610b10573d6000803e3d6000fd5b505050506040513d6020811015610b2657600080fd5b5051612b9d565b600d54604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b505050506040513d6020811015610bae57600080fd5b5051600a5433600090815260136020526040902060010154919450610bd291612bdf565b600a556040805160c0810182526000808252602080830182815283850183815260608501848152608080870186815260a0880187815233885260139096529790952095518655915160018601555160028501555160038401805460ff1916911515919091179055925160048301559151600590910180546001600160801b0319169190921c17905582610c9a576040805162461bcd60e51b815260206004820152600b60248201526a1352539517d1905253115160aa1b604482015290519081900360640190fd5b6040805133815290517fc0b7a800db8dd9b5c87a08cd46842e5489191da7f8eb637a690a9202eacd5d049181900360200190a1505090565b3360009081526012602052604081205415610d2e576040805162461bcd60e51b8152602060048201526017602482015276504f534954494f4e5f414c52454144595f45584953545360481b604482015290519081900360640190fd5b60008311610d74576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b60008211610dbc576040805162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa22aa920aa24a7a760811b604482015290519081900360640190fd5b60115460ff16610e0d576040805162461bcd60e51b81526020600482015260176024820152761313d0d2d25391d7d393d517d153905093115117d65155604a1b604482015290519081900360640190fd5b6000610e1b84600554612b44565b90506000610e2d600754600554612b44565b90506000610e4b610e3d84612ecc565b610e4684612ecc565b612f31565b90506000610e594287612c21565b90506040518060c00160405280858152602001836001600160801b031916815260200182815260200160001515815260200160008152602001610ec2610ea9610ea442601054612bdf565b6131de565b6f02069e12e13424bb40e132865a5f206b60851b613279565b6001600160801b03199081169091523360009081526012602090815260409182902084518155908401516001820180548516608092831c179055918401516002820155606084015160038201805460ff191691151591909117905581840151600482015560a0909301516005909301805490921692901c919091179055610f4930886122cb565b50604080513381526020810189905280820188905290517f49eaf4942f1237055eb4cfa5f31c9dfe50d5b4ade01e021f7de8be2fbbde557b9181900360600190a15060019695505050505050565b60075490565b6001600160a01b0383166000908152600960209081526040808320338452909152812054610fcb9083612bdf565b6001600160a01b0385166000908152600960209081526040808320338452909152812091909155600554611000908490612b44565b6001600160a01b0386166000908152600860205260409020549091506110269082612bdf565b6001600160a01b0380871660009081526008602052604080822093909355908616815220546110559082612c21565b6001600160a01b0380861660008181526008602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3506001949350505050565b600b5481565b60025460ff1681565b60115460ff1681565b6001600160a01b038216600090815260136020526040812054611127576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b61118461113684846001612c7b565b600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b9392505050565b336000908152601360205260408120546111da576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b60006111e833426000612c7b565b33600090815260136020526040902060040154600291909102915061120d9082612c21565b3360009081526013602052604090206004810191909155600201544211156112c5576000831361126e5760405162461bcd60e51b81526004018080602001828103825260338152602001806150b36033913960400191505060405180910390fd5b60008412156112ae5760405162461bcd60e51b815260040180806020018281038252603581526020018061501b6035913960400191505060405180910390fd5b336000908152601360205260409020426002909101555b60008413156113ec57336000908152601360205260409020546112e89085612c21565b33600090815260136020526040812091825560029091015461130a9042612bdf565b905060006113218661131c8485612b44565b612b44565b905061132f600a5482612c21565b600a553360009081526013602052604090206001015461134f9082612c21565b33600081815260136020908152604080832060010194909455600f5484516323b872dd60e01b81526004810194909452306024850152604484018b905293516001600160a01b03909416936323b872dd93606480820194918390030190829087803b1580156113bd57600080fd5b505af11580156113d1573d6000803e3d6000fd5b505050506040513d60208110156113e757600080fd5b505050505b600084121561151f573360009081526013602052604081205461141191869003612bdf565b3360009081526013602052604081209182556002909101546114339042612bdf565b905060006114488660000361131c8485612b44565b9050611456600a5482612bdf565b600a55336000908152601360205260409020600101546114769082612bdf565b336000818152601360209081526040808320600180820196909655600301805460ff1916909517909455600f54845163a9059cbb60e01b815260048101949094528a8303602485015293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b1580156114f057600080fd5b505af1158015611504573d6000803e3d6000fd5b505050506040513d602081101561151a57600080fd5b505050505b60008312156115c6573360009081526013602052604081206002015461154791859003612bdf565b336000908152601360205260408120600281019290925590546115709061131c86840380612b44565b905061157e600a5482612bdf565b600a553360009081526013602052604090206001015461159e9082612bdf565b336000908152601360205260409020600180820192909255600301805460ff19169091179055505b600083131561165657336000908152601360205260409020600201546115ec9084612c21565b336000908152601360205260408120600281019290925590546116139061131c8680612b44565b9050611621600a5482612c21565b600a55336000908152601360205260409020600101546116419082612c21565b33600090815260136020526040902060010155505b611668610ea9610ea442601054612bdf565b3360009081526013602052604090206005810180546001600160801b03191660809390931c92909217909155546116d05760405162461bcd60e51b81526004018080602001828103825260228152602001806150916022913960400191505060405180910390fd5b336000908152601360205260409020600201544210611736576040805162461bcd60e51b815260206004820152601c60248201527f554e4c4f434b54494d455f4d5553545f42455f494e5f46555455524500000000604482015290519081900360640190fd5b604080513381526020810186905280820185905290517fc9d9742d6d75df29e861931a83d22f49a9bb389814d2b6ea46e8f01f2d4f8aa59181900360600190a15060019392505050565b3360009081526009602090815260408083206001600160a01b03861684529091528120546117ae9083612c21565b3360008181526009602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600c546000906001600160a01b03163314611863576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b6000829050600061187660055483612b44565b905061188460075483612c21565b6007556001600160a01b0385166000908152600860205260409020546118aa9082612c21565b6001600160a01b03861660008181526008602090815260409182902093909355805191825291810186905281517f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885929181900390910190a1506001949350505050565b600a5481565b6001600160a01b03821660009081526012602052604081205461196b576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b611184611136848460016134d5565b6001600160a01b0381166000908152601260205260408120546119d2576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b6001600160a01b03821660009081526012602052604090205460055461083e9190612b9d565b6001600160a01b03811660009081526008602052604081205460055461083e9190612b9d565b3360009081526013602052604081205415611a7a576040805162461bcd60e51b8152602060048201526017602482015276504f534954494f4e5f414c52454144595f45584953545360481b604482015290519081900360640190fd5b60008311611ac0576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b60008211611b08576040805162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa22aa920aa24a7a760811b604482015290519081900360640190fd5b60115460ff16611b59576040805162461bcd60e51b81526020600482015260176024820152761313d0d2d25391d7d393d517d153905093115117d65155604a1b604482015290519081900360640190fd5b6000611b698461131c8586612b44565b9050611b77600a5482612c21565b600a556040805160c08101825285815260208101839052908101611b9b4286612c21565b815260200160001515815260200160008152602001611bc2610ea9610ea442601054612bdf565b6001600160801b031990811690915233600081815260136020908152604080832086518155868301516001820155868201516002820155606087015160038201805460ff191691151591909117905560808088015160048084019190915560a0909801516005909201805490971691901c17909455600f5484516323b872dd60e01b8152958601939093523060248601526044850189905292516001600160a01b03909216936323b872dd93606480830194919391928390030190829087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b505050506040513d6020811015611cb857600080fd5b5050604080513381526020810186905280820185905290517ff37df2ada5e4cecc7e5442aee1a4f06d88347e03f6aab9ada70c6f2a2ea6f9259181900360600190a15060019392505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b60136020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919260ff9091169160801b86565b3360009081526009602090815260408083206001600160a01b0386168452909152812054808310611dee573360009081526009602090815260408083206001600160a01b0388168452909152812055611e1d565b611df88184612bdf565b3360009081526009602090815260408083206001600160a01b03891684529091529020555b3360008181526009602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b33600090815260126020526040812054611ed2576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b33600090815260126020526040812054600554611eef9190612b9d565b6040805163a9059cbb60e01b8152336004820152602481018390529051919250309163a9059cbb916044808201926020929091908290030181600087803b158015611f3957600080fd5b505af1158015611f4d573d6000803e3d6000fd5b505050506040513d6020811015611f6357600080fd5b5060009050611f74334260016134d5565b90506000611fca82600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b600d54604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561202157600080fd5b505af1158015612035573d6000803e3d6000fd5b505050506040513d602081101561204b57600080fd5b50516040805160c0810182526000808252602080830182815283850183815260608501848152608080870186815260a088018781523388526012909652979095209551865591516001860180546001600160801b031990811692871c92909217905590516002860155905160038501805460ff191691151591909117905593516004840155516005909201805490931691901c179055935083612123576040805162461bcd60e51b815260206004820152600b60248201526a1352539517d1905253115160aa1b604482015290519081900360640190fd5b6040805133815290517fc0b7a800db8dd9b5c87a08cd46842e5489191da7f8eb637a690a9202eacd5d049181900360200190a150505090565b60025460009061010090046001600160a01b031633146121b1576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b600280546001600160a01b0384166101008102610100600160a81b03199092169190911790915560408051918252517ff285329298fd841af46eb83bbe90d1ebe2951c975a65b19a02f965f842ee69c59181900360200190a1506001919050565b60025460009061010090046001600160a01b03163314612267576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b600e80546001600160a01b0384166001600160a01b03199182168117909255600f80549091168217905560408051918252517f5b7aee82a290644995a6f01961d12cb9e4a18b9533c0b2d20d5cd71a8fac9b7a9181900360200190a1506001919050565b6000806122da83600554612b44565b336000908152600860205260409020549091506122f79082612bdf565b33600090815260086020526040808220929092556001600160a01b038616815220546123239082612c21565b6001600160a01b0385166000818152600860209081526040918290209390935580518681529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b60025461010090046001600160a01b031681565b600c546001600160a01b031681565b60025460009061010090046001600160a01b031633146123fa576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b600c546001600160a01b03161561244b576040805162461bcd60e51b815260206004820152601060248201526f1515d25397d053149150511657d4d15560821b604482015290519081900360640190fd5b600c80546001600160a01b0384166001600160a01b03199182168117909255600d80549091168217905560408051918252517f80028450124b717cea125e678344e03e645c9cae901531348f26ddf86e414b5e9181900360200190a1506001919050565b6012602052600090815260409020805460018201546002830154600384015460048501546005909501549394608093841b94929360ff9092169290911b86565b3360009081526012602052604081205461253e576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b600061254c334260006134d5565b3360009081526012602052604090206004015460029190910291506125719082612c21565b336000908152601260205260408120600401919091556007546005546125979190612b44565b3360009081526012602052604090206002015490915042111561268557600084136125f35760405162461bcd60e51b81526004018080602001828103825260338152602001806150b36033913960400191505060405180910390fd5b60008512156126335760405162461bcd60e51b815260040180806020018281038252603581526020018061501b6035913960400191505060405180910390fd5b3360009081526012602052604081205461265090610e3d90612ecc565b3360009081526012602052604090206001810180546001600160801b03191660809390931c9290921790915542600290910155505b600085131561273c57600061269c86600554612b44565b336000908152601260205260409020549091506126b99082612c21565b336000908152601260205260408120919091556126e16126d883612ecc565b610e4685612ecc565b336000908152601260205260409020600101549091506127049060801b8261367c565b33600090815260126020526040902060010180546001600160801b03191660809290921c91909117905561273830886122cb565b5050505b600085121561286957600061275686600003600554612b44565b336000908152601260205260409020549091506127739082612bdf565b336000908152601260205260408120919091556127926126d883612ecc565b336000908152601260205260409020600101549091506127b59060801b82613a6a565b336000818152601260209081526040808320600180820180546001600160801b03191660809890981c97909717909655600301805460ff1916909517909455835163a9059cbb60e01b815260048101939093528a820360248401529251309363a9059cbb93604480820194929392918390030190829087803b15801561283a57600080fd5b505af115801561284e573d6000803e3d6000fd5b505050506040513d602081101561286457600080fd5b505050505b60008412156128b7573360009081526012602052604081206002015461289191869003612bdf565b3360009081526012602052604090206002810191909155600301805460ff191660011790555b60008413156128f157336000908152601260205260409020600201546128dd9085612c21565b336000908152601260205260409020600201555b612903610ea9610ea442601054612bdf565b3360009081526012602052604090206005810180546001600160801b03191660809390931c929092179091555461296b5760405162461bcd60e51b81526004018080602001828103825260228152602001806150916022913960400191505060405180910390fd5b3360009081526012602052604090206002015442106129d1576040805162461bcd60e51b815260206004820152601c60248201527f554e4c4f434b54494d455f4d5553545f42455f494e5f46555455524500000000604482015290519081900360640190fd5b604080513381526020810187905280820186905290517fc89acf41e7e6c33e4ea960f9cfd12574859c1d2083dd730d31f7975e7fafe58f9181900360600190a1506001949350505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b60025460009061010090046001600160a01b03163314612a9c576040805162461bcd60e51b81526020600482018190526024820152600080516020615071833981519152604482015290519081900360640190fd5b60115460ff1615612af4576040805162461bcd60e51b815260206004820152601760248201527f4c4f434b494e475f414c52454144595f454e41424c4544000000000000000000604482015290519081900360640190fd5b6011805460ff19166001179055426010556040517f8ed8806e096263615ba5e4a411f81ce1ea856a776aa4a3a384fa1e8bba86546790600090a15060115460ff1690565b60105481565b60055490565b600082612b535750600061083e565b82820282848281612b6057fe5b04146111845760405162461bcd60e51b81526004018080602001828103825260218152602001806150506021913960400191505060405180910390fd5b600061118483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a7c565b600061118483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b1e565b600082820183811015611184576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038316600090815260136020526040812060030154819060ff1680612cc157506001600160a01b03851660009081526013602052604090206002015484105b15612cca575060015b6001600160a01b038516600090815260136020526040812060020154850390811215612cf4576000035b6001600160a01b0386166000908152601360205260409020600290810154818304908701919091040380861480612d4557506001600160a01b03871660009081526013602052604090206002015481145b612d82576040805162461bcd60e51b815260206004820152600960248201526826a4a72fa2a92927a960b91b604482015290519081900360640190fd5b612dff612dfa612dc1612d9d610ea9610ea486601054612bdf565b6001600160a01b038b1660009081526013602052604090206005015460801b613a6a565b6001600160a01b038a16600090815260136020526040902060010154612df590612dea90612ecc565b610e46600a54612ecc565b613279565b613b78565b93508415612e31576001600160a01b038716600090815260136020526040902060040154612e2e908590612c21565b93505b612e82612dfa612e4086612ecc565b612df5613fff60701b60801b612e7d612e5a600b54612ecc565b610e46610ea9612e6f610ea442601054612bdf565b6420101502f960d91b613a6a565b613a6a565b9350612eac612dfa612e9386612ecc565b6f3ffe555555555555555555555555555560801b613279565b93508215612ec257612ebf846002612b9d565b93505b5050509392505050565b600081612edb575060006109a0565b816000612ee782613bfc565b90506070811015612f00578060700382901b9150612f13565b6070811115612f13576070810382901c91505b613fff0160701b6001600160701b03919091161760801b90506109a0565b6000617fff60f084811c8216919084901c811690821415612f775780617fff1415612f66575061ffff60ef1b915061083e9050565b505050600160ff1b8116821861083e565b80617fff1415612fbb576dffffffffffffffffffffffffffff60801b841615612faa575061ffff60ef1b915061083e9050565b505050808218600160ff1b1661083e565b600160801b600160ff1b03841661300557600160801b600160ff1b038516612fed575061ffff60ef1b915061083e9050565b505050808218600160ff1b16617fff60f01b1761083e565b6001600160701b03608085901c16816130215760019150613028565b600160701b175b6001600160701b03608087901c168361306757801561306257600061304c82613bfc565b6001955060e20393840160711901939190911b90505b613071565b600160701b1760721b5b81818161307a57fe5b049050806130a757600160ff1b8787181661309657600061309c565b600160ff1b5b94505050505061083e565b6001606c1b8110156130b557fe5b6000600160731b8210156130f557600160721b8210156130ea57600160711b8210156130e25760706130e5565b60715b6130ed565b60725b60ff166130fe565b6130fe82613bfc565b90508361407101818601111561311c57617fff9450600091506131af565b83818601613ffc0110156131375760009450600091506131af565b83818601613f8c011015613184578385613ffc011115613162578385613ffc010382901b915061317b565b8385613ffc01101561317b57613ffc8585030382901c91505b600094506131af565b6070811115613197576070810382901c91505b6001600160701b038216915083818601613f8d010394505b81607086901b888a186001607f1b60801b1660801c6001600160801b0316171760801b9550505050505061083e565b6000806131ea83612ecc565b905060006131ff8263802dc26760df1b613a6a565b90506000613220826fbfea0c6f7a0b5ed8d36b4c7f3493858360801b613279565b9050600061322d82613c9a565b90506000613240613fff60f01b8361367c565b9050600061325866402a22db57148560c81b83612f31565b905061326d8165401f73b9fbd760d01b61367c565b98975050505050505050565b6000617fff60f084811c8216919084901c8116908214156133185780617fff14156132f7576001600160801b031985811690851614156132c457505050600160ff1b8116821861083e565b600160ff1b6001600160801b03198686181614156132e75750505081811761083e565b5061ffff60ef1b915061083e9050565b600160801b600160ff1b038416612f66575061ffff60ef1b915061083e9050565b80617fff141561335457600160801b600160ff1b038516613343575061ffff60ef1b915061083e9050565b505050600160ff1b8216811861083e565b6001600160701b03608086901c16826133705760019250613377565b600160701b175b6001600160701b03608086901c1682613393576001925061339a565b600160701b175b90810290816133b757600160ff1b8787181661309657600061309c565b928201926000600160e11b8310156133eb57600160e01b8310156133e3576133de83613bfc565b6133e6565b60e05b6133ee565b60e15b905061407081860110156134095760009450600092506134a6565b6140e0818601101561344c5761407085101561342e57846140700383901c9250613443565b61407085111561344357614070850383901b92505b600094506134a6565b61c0dd818601111561346657617fff9450600092506134a6565b607081111561347d576070810383901c9250613490565b6070811015613490578060700383901b92505b6001600160701b03831692506140df8186010394505b82607086901b888a186001607f1b60801b1660801c6001600160801b0316171760801b9550505050505061083e565b6001600160a01b038316600090815260126020526040812060030154819060ff168061351b57506001600160a01b03851660009081526012602052604090206002015484105b15613524575060015b6001600160a01b03851660009081526012602052604081206002015485039081121561354e576000035b6001600160a01b038616600090815260126020526040902060029081015481830490870191909104038086148061359f57506001600160a01b03871660009081526012602052604090206002015481145b6135dc576040805162461bcd60e51b815260206004820152600960248201526826a4a72fa2a92927a960b91b604482015290519081900360640190fd5b61363f612dfa61361b6135f7610ea9610ea486601054612bdf565b6001600160a01b038b1660009081526012602052604090206005015460801b613a6a565b6001600160a01b038a1660009081526012602052604090206001015460801b613279565b93508415613671576001600160a01b03871660009081526012602052604090206004015461366e908590612c21565b93505b612eac846003612b9d565b6000617fff60f084811c8216919084901c8116908214156136ca5780617fff14156136c0576001600160801b031985811690851614156132e757849250505061083e565b849250505061083e565b80617fff14156136de57839250505061083e565b6001607f1b608086901c90811015906001600160701b031683613704576001935061370b565b600160701b175b6001607f1b608087901c90811015906001600160701b0316846137315760019450613738565b600160701b175b82613768576001600160801b03198816600160ff1b14613758578761375b565b60005b965050505050505061083e565b80613788576001600160801b03198916600160ff1b14613758578861375b565b84860384151583151514156138ab5760708113156137af578997505050505050505061083e565b60008113156137ce57808260008212156137c557fe5b901c9150613808565b606f198112156137e7578897505050505050505061083e565b6000811215613808578060000384600082121561380057fe5b901c93508596505b92810192600160711b8410613823576001968701969390931c925b86617fff1415613855578461383d57617fff60f01b613847565b6001600160f01b03195b97505050505050505061083e565b600160701b84101561386a5760009650613877565b6001600160701b03841693505b83607088901b8661388957600061388f565b6001607f1b5b6001600160801b0316171760801b97505050505050505061083e565b60008113156138c657600184901b93506001870396506138dd565b60008112156138dd57600182901b91506001860396505b60708113156138ef5760019150613952565b6001811315613917576001810360018303600082121561390b57fe5b901c6001019150613952565b606f1981121561392a5760019350613952565b600019811215613952576001816000030360018503600082121561394a57fe5b901c60010193505b81841061396357818403935061396c565b83820393508294505b8361398257506000965061083e95505050505050565b600061398d85613bfc565b905080607114156139b357600185901c6001600160701b03169450600188019750613a02565b60708110156139f5576070819003808911156139e2578086901b6001600160701b0316955080890398506139ef565b600098600019019590951b945b50613a02565b6001600160701b03851694505b87617fff1415613a355785613a1c57617fff60f01b613a26565b6001600160f01b03195b9850505050505050505061083e565b84607089901b87613a47576000613a4d565b6001607f1b5b6001600160801b0316171760801b9850505050505050505061083e565b600061118483600160ff1b841861367c565b60008183613b085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613acd578181015183820152602001613ab5565b50505050905090810190601f168015613afa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b1457fe5b0495945050505050565b60008184841115613b705760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613acd578181015183820152602001613ab5565b505050900390565b6000617fff60f083901c16613fff811015613b975760009150506109a0565b6001607f1b608084901c10613bab57600080fd5b6140fe811115613bba57600080fd5b600160701b6001600160701b03608085901c161761406f821015613be45761406f8290031c611184565b61406f8211156111845761406e1982011b9392505050565b6000808211613c0a57600080fd5b6000600160801b8310613c1f57608092831c92015b600160401b8310613c3257604092831c92015b6401000000008310613c4657602092831c92015b620100008310613c5857601092831c92015b6101008310613c6957600892831c92015b60108310613c7957600492831c92015b60048310613c8957600292831c92015b6002831061083e5760010192915050565b600061083e613cbc836f1fffb8aa3b295c17f0bbbe87fed0691d60811b613279565b60006001607f1b608083901c90811190617fff60f085901c8116916001600160701b03169082148015613cee57508015155b15613d04575061ffff60ef1b92506109a0915050565b61400d821115613d2b5782613d1e57617fff60f01b613d21565b60005b93505050506109a0565b613f7f821015613d465750613fff60f01b92506109a0915050565b81613d545760019150613d5b565b600160701b175b613fef821115613d7157613fee1982011b613d83565b613fef821015613d8357613fef8290031c5b828015613d94575061203760811b81115b15613da65750600092506109a0915050565b82158015613dc55750713fffffffffffffffffffffffffffffffffff81115b15613ddb5750617fff60f01b92506109a0915050565b6001600160801b0381169060801c838015613df557508115155b15613e01579019906001015b6001607f1b82811615613e255770016a09e667f3bcc908b2fb1366ea957d3e0260801c5b6001607e1b831615613e48577001306fe0a31b7152de8d5a46305c85edec0260801c5b6001607d1b831615613e6b577001172b83c7d517adcdf7c8c50eb14a791f0260801c5b6001607c1b831615613e8e5770010b5586cf9890f6298b92b71842a983630260801c5b6001607b1b831615613eb1577001059b0d31585743ae7c548eb68ca417fd0260801c5b6001607a1b831615613ed457700102c9a3e778060ee6f7caca4f7a29bde80260801c5b600160791b831615613ef75770010163da9fb33356d84a66ae336dcdfa3f0260801c5b600160781b831615613f1a57700100b1afa5abcbed6129ab13ec11dc95430260801c5b600160771b831615613f3d5770010058c86da1c09ea1ff19d294cf2f679b0260801c5b600160761b831615613f60577001002c605e2e8cec506d21bfc89a23a00f0260801c5b600160751b831615613f8357700100162f3904051fa128bca9c55c31e5df0260801c5b600160741b831615613fa6577001000b175effdc76ba38e31671ca9397250260801c5b600160731b831615613fc957700100058ba01fb9f96d6cacd4b180917c3d0260801c5b600160721b831615613fec5770010002c5cc37da9491d0985c348c68e7b30260801c5b600160711b83161561400f577001000162e525ee054754457d59952920260260801c5b600160701b8316156140325770010000b17255775c040618bf4a4ade83fc0260801c5b6001606f1b831615614055577001000058b91b5bc9ae2eed81e9b7d4cfab0260801c5b6001606e1b83161561407857700100002c5c89d5ec6ca4d7c8acc017b7c90260801c5b6001606d1b83161561409b5770010000162e43f4f831060e02d839a9d16d0260801c5b6001606c1b8316156140be57700100000b1721bcfc99d9f890ea069117630260801c5b6001606b1b8316156140e15770010000058b90cf1e6d97f9ca14dbcc16280260801c5b6001606a1b831615614104577001000002c5c863b73f016468f6bac5ca2b0260801c5b600160691b83161561412757700100000162e430e5a18f6119e3c02282a50260801c5b600160681b83161561414a577001000000b1721835514b86e6d96efd1bfe0260801c5b600160671b83161561416d57700100000058b90c0b48c6be5df846c5b2ef0260801c5b600160661b8316156141905770010000002c5c8601cc6b9e94213c72737a0260801c5b600160651b8316156141b3577001000000162e42fff037df38aa2b219f060260801c5b600160641b8316156141d65770010000000b17217fba9c739aa5819f44f90260801c5b600160631b8316156141f9577001000000058b90bfcdee5acd3c1cedc8230260801c5b600160621b83161561421c57700100000002c5c85fe31f35a6a30da1be500260801c5b600160611b83161561423f5770010000000162e42ff0999ce3541b9fffcf0260801c5b600160601b83161561426257700100000000b17217f80f4ef5aadda455540260801c5b6001605f1b8316156142855770010000000058b90bfbf8479bd5a81b51ad0260801c5b6001605e1b8316156142a8577001000000002c5c85fdf84bd62ae30a74cc0260801c5b6001605d1b8316156142cb57700100000000162e42fefb2fed257559bdaa0260801c5b6001605c1b8316156142ee577001000000000b17217f7d5a7716bba4a9ae0260801c5b6001605b1b83161561431157700100000000058b90bfbe9ddbac5e109cce0260801c5b6001605a1b8316156143345770010000000002c5c85fdf4b15de6f17eb0d0260801c5b600160591b831615614357577001000000000162e42fefa494f1478fde050260801c5b600160581b83161561437a5770010000000000b17217f7d20cf927c8e94c0260801c5b600160571b83161561439d577001000000000058b90bfbe8f71cb4e4b33d0260801c5b600160561b8316156143c057700100000000002c5c85fdf477b662b269450260801c5b600160551b8316156143e35770010000000000162e42fefa3ae53369388c0260801c5b600160541b83161561440657700100000000000b17217f7d1d351a389d400260801c5b600160531b8316156144295770010000000000058b90bfbe8e8b2d3d4ede0260801c5b600160521b83161561444c577001000000000002c5c85fdf4741bea6e77e0260801c5b600160511b83161561446f57700100000000000162e42fefa39fe95583c20260801c5b600160501b831615614492577001000000000000b17217f7d1cfb72b45e10260801c5b69800000000000000000008316156144bb57700100000000000058b90bfbe8e7cc35c3f00260801c5b69400000000000000000008316156144e45770010000000000002c5c85fdf473e242ea380260801c5b692000000000000000000083161561450d577001000000000000162e42fefa39f02b772c0260801c5b69100000000000000000008316156145365770010000000000000b17217f7d1cf7d83c1a0260801c5b690800000000000000000083161561455f577001000000000000058b90bfbe8e7bdcbe2e0260801c5b690400000000000000000083161561458857700100000000000002c5c85fdf473dea871f0260801c5b69020000000000000000008316156145b15770010000000000000162e42fefa39ef44d910260801c5b69010000000000000000008316156145da57700100000000000000b17217f7d1cf79e9490260801c5b688000000000000000008316156146025770010000000000000058b90bfbe8e7bce5440260801c5b6840000000000000000083161561462a577001000000000000002c5c85fdf473de6eca0260801c5b6820000000000000000083161561465257700100000000000000162e42fefa39ef366f0260801c5b6810000000000000000083161561467a577001000000000000000b17217f7d1cf79afa0260801c5b680800000000000000008316156146a257700100000000000000058b90bfbe8e7bcd6d0260801c5b680400000000000000008316156146ca5770010000000000000002c5c85fdf473de6b20260801c5b680200000000000000008316156146f2577001000000000000000162e42fefa39ef3580260801c5b600160401b8316156147155770010000000000000000b17217f7d1cf79ab0260801c5b67800000000000000083161561473c577001000000000000000058b90bfbe8e7bcd50260801c5b67400000000000000083161561476357700100000000000000002c5c85fdf473de6a0260801c5b67200000000000000083161561478a5770010000000000000000162e42fefa39ef340260801c5b6710000000000000008316156147b157700100000000000000000b17217f7d1cf7990260801c5b6708000000000000008316156147d85770010000000000000000058b90bfbe8e7bcc0260801c5b6704000000000000008316156147ff577001000000000000000002c5c85fdf473de50260801c5b67020000000000000083161561482657700100000000000000000162e42fefa39ef20260801c5b67010000000000000083161561484d577001000000000000000000b17217f7d1cf780260801c5b668000000000000083161561487357700100000000000000000058b90bfbe8e7bb0260801c5b66400000000000008316156148995770010000000000000000002c5c85fdf473dd0260801c5b66200000000000008316156148bf577001000000000000000000162e42fefa39ee0260801c5b66100000000000008316156148e55770010000000000000000000b17217f7d1cf60260801c5b660800000000000083161561490b577001000000000000000000058b90bfbe8e7a0260801c5b660400000000000083161561493157700100000000000000000002c5c85fdf473c0260801c5b66020000000000008316156149575770010000000000000000000162e42fefa39d0260801c5b660100000000000083161561497d57700100000000000000000000b17217f7d1ce0260801c5b658000000000008316156149a25770010000000000000000000058b90bfbe8e60260801c5b654000000000008316156149c7577001000000000000000000002c5c85fdf4720260801c5b652000000000008316156149ec57700100000000000000000000162e42fefa380260801c5b65100000000000831615614a11577001000000000000000000000b17217f7d1b0260801c5b65080000000000831615614a3657700100000000000000000000058b90bfbe8d0260801c5b65040000000000831615614a5b5770010000000000000000000002c5c85fdf460260801c5b65020000000000831615614a80577001000000000000000000000162e42fefa20260801c5b65010000000000831615614aa55770010000000000000000000000b17217f7d00260801c5b648000000000831615614ac9577001000000000000000000000058b90bfbe70260801c5b644000000000831615614aed57700100000000000000000000002c5c85fdf30260801c5b642000000000831615614b115770010000000000000000000000162e42fef90260801c5b641000000000831615614b3557700100000000000000000000000b17217f7c0260801c5b640800000000831615614b595770010000000000000000000000058b90bfbd0260801c5b640400000000831615614b7d577001000000000000000000000002c5c85fde0260801c5b640200000000831615614ba157700100000000000000000000000162e42fee0260801c5b640100000000831615614bc5577001000000000000000000000000b17217f60260801c5b6380000000831615614be857700100000000000000000000000058b90bfa0260801c5b6340000000831615614c0b5770010000000000000000000000002c5c85fc0260801c5b6320000000831615614c2e577001000000000000000000000000162e42fd0260801c5b6310000000831615614c515770010000000000000000000000000b17217e0260801c5b6308000000831615614c74577001000000000000000000000000058b90be0260801c5b6304000000831615614c9757700100000000000000000000000002c5c85e0260801c5b6302000000831615614cba5770010000000000000000000000000162e42e0260801c5b6301000000831615614cdd57700100000000000000000000000000b172160260801c5b62800000831615614cff5770010000000000000000000000000058b90a0260801c5b62400000831615614d21577001000000000000000000000000002c5c840260801c5b62200000831615614d4357700100000000000000000000000000162e410260801c5b62100000831615614d65577001000000000000000000000000000b17200260801c5b62080000831615614d8757700100000000000000000000000000058b8f0260801c5b62040000831615614da95770010000000000000000000000000002c5c70260801c5b62020000831615614dcb577001000000000000000000000000000162e30260801c5b62010000831615614ded5770010000000000000000000000000000b1710260801c5b618000831615614e0e577001000000000000000000000000000058b80260801c5b614000831615614e2f57700100000000000000000000000000002c5b0260801c5b612000831615614e505770010000000000000000000000000000162d0260801c5b611000831615614e7157700100000000000000000000000000000b160260801c5b610800831615614e925770010000000000000000000000000000058a0260801c5b610400831615614eb3577001000000000000000000000000000002c40260801c5b610200831615614ed4577001000000000000000000000000000001610260801c5b610100831615614ef5577001000000000000000000000000000000b00260801c5b6080831615614f15577001000000000000000000000000000000570260801c5b6040831615614f355770010000000000000000000000000000002b0260801c5b6020831615614f55577001000000000000000000000000000000150260801c5b6010831615614f755770010000000000000000000000000000000a0260801c5b6008831615614f95577001000000000000000000000000000000040260801c5b6004831615614fb5577001000000000000000000000000000000010260801c5b84614fd657600f81901c6001600160701b03169050613fff82019150615005565b613ffe8211614ffb57600f81901c6001600160701b0316905081613fff039150615005565b600091613fee19011c5b60709190911b1760801b93506109a09250505056fe414d4f554e545f44454c54415f4f465f4558504952455f504f534954494f4e5f4d5553545f42455f41545f4c454153545f5a45524f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572504f534954494f4e5f414d4f554e545f43414e4e4f545f42455f4e454741544956454455524154494f4e5f44454c54415f4f465f455850495245445f504f534954494f4e5f4d5553545f42455f504f534954495645a2646970667358221220cced869b31121b59bf63f623d266ee1a3c399b98534acc09c54ffd83d1fc801864736f6c63430006060033

Deployed Bytecode Sourcemap

40392:14339:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40392:14339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;40571:37:0;;;:::i;:::-;;;;-1:-1:-1;;;;;40571:37:0;;;;;;;;;;;;;;35637:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35637:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38594:183;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38594:183:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;36865:702;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36865:702:0;;:::i;:::-;;;;;;;;;;;;;;;;36063:25;;;:::i;53283:674::-;;;:::i;43112:822::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43112:822:0;;;;;;;:::i;37573:83::-;;;:::i;38213:375::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38213:375:0;;;;;;;;;;;;;;;;;:::i;40461:32::-;;;:::i;35685:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40698:31;;;:::i;54391:237::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;54391:237:0;;;;;;;;:::i;49788:2904::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49788:2904:0;;;;;;;:::i;38783:261::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38783:261:0;;;;;;;;:::i;42512:359::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;42512:359:0;;;;;;;;:::i;40431:25::-;;;:::i;53965:228::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;53965:228:0;;;;;;;;:::i;54201:182::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54201:182:0;-1:-1:-1;;;;;54201:182:0;;:::i;37664:112::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37664:112:0;-1:-1:-1;;;;;37664:112:0;;:::i;43942:722::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43942:722:0;;;;;;;:::i;35660:20::-;;;:::i;42075:50::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42075:50:0;-1:-1:-1;;;;;42075:50:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42075:50:0;;;;;;;;;;;;;;39050:409;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;39050:409:0;;;;;;;;:::i;52700:575::-;;;:::i;41878:142::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41878:142:0;-1:-1:-1;;;;;41878:142:0;;:::i;41662:208::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41662:208:0;-1:-1:-1;;;;;41662:208:0;;:::i;37782:296::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;37782:296:0;;;;;;;;:::i;35711:21::-;;;:::i;40502:26::-;;;:::i;41414:240::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41414:240:0;-1:-1:-1;;;;;41414:240:0;;:::i;42026:44::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42026:44:0;-1:-1:-1;;;;;42026:44:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;;42026:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47259:2521;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47259:2521:0;;;;;;;:::i;38084:123::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38084:123:0;;;;;;;;;;:::i;42879:225::-;;;:::i;40663:30::-;;;:::i;54636:90::-;;;:::i;40571:37::-;;;-1:-1:-1;;;;;40571:37:0;;:::o;35637:18::-;;;;;;;;;;;;;;;-1:-1:-1;;35637:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38594:183::-;38677:10;38656:4;38669:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;38669:28:0;;;;;;;;;;;:36;;;38717;;;;;;;38656:4;;38669:28;;38677:10;;38717:36;;;;;;;;-1:-1:-1;38767:4:0;38594:183;;;;;:::o;36865:702::-;36389:6;;36926:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;36943:16;36939:99:::1;;36977:24;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;37019:11:0::1;::::0;37012:18:::1;;36939:99;37068:1;37054:11;:15;37050:193;;;37098:76;37102:13;;37117:56;37121:38;37131:11;37130:12;;37145:13;;37121:3;:38::i;:::-;37161:11;;37117:3;:56::i;:::-;37098:3;:76::i;:::-;37082:13;:92:::0;37203:11:::1;::::0;37199:36:::1;::::0;37221:12:::1;::::0;;::::1;37199:3;:36::i;:::-;37185:11;:50:::0;37050:193:::1;37273:1;37259:11;:15;37255:191;;;37303:75;37307:13;;37322:55;37326:37;37335:11;37349:13;;37326:3;:37::i;37322:55::-;37303:3;:75::i;:::-;37287:13;:91:::0;37407:11:::1;::::0;37403:35:::1;::::0;37425:11;37403:3:::1;:35::i;:::-;37389:11;:49:::0;37255:191:::1;37470:28;37474:10;;37486:11;;37470:3;:28::i;:::-;37454:13;:44:::0;37512:24:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;37550:11:0::1;::::0;36453:1:::1;36865:702:::0;;;:::o;36063:25::-;;;;:::o;53283:674::-;53359:10;53320:12;53349:21;;;:9;:21;;;;;:28;53341:56;;;;;-1:-1:-1;;;53341:56:0;;;;;;;;;;;;-1:-1:-1;;;53341:56:0;;;;;;;;;;;;;;;53404:18;;53432:10;53404:18;53444:21;;;:9;:21;;;;;;;;:28;53404:69;;-1:-1:-1;;;53404:69:0;;;;;;;;;;;;;;-1:-1:-1;;;;;53404:18:0;;;;:27;;:69;;;;;;;;;;;;;:18;:69;;;2:2:-1;;;;27:1;24;17:12;2:2;53404:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53404:69:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53480:11:0;;-1:-1:-1;53494:47:0;53519:10;53531:3;53536:4;53494:24;:47::i;:::-;53480:61;;53571:33;53575:6;53583:20;;53571:3;:33::i;:::-;53548:20;:56;;;;53611:17;53631:44;53635:6;53643:12;;;;;;;;;-1:-1:-1;;;;;53643:12:0;-1:-1:-1;;;;;53643:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53643:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53643:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53643:31:0;53631:3;:44::i;:::-;53692:12;;:43;;;-1:-1:-1;;;53692:43:0;;53710:10;53692:43;;;;;;;;;;;;53611:64;;-1:-1:-1;;;;;;53692:12:0;;;;:17;;:43;;;;;;;;;;;;;;;:12;;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;53692:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53692:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53692:43:0;53762:13;;53787:10;53777:21;;;;:9;53692:43;53777:21;;;;:27;;;53692:43;;-1:-1:-1;53758:47:0;;:3;:47::i;:::-;53742:13;:63;53836:44;;;;;;;;-1:-1:-1;53836:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53822:10;53812:21;;:9;:21;;;;;;;:68;;;;;;53836:44;53812:68;;;;;;;;;;;;;;-1:-1:-1;;53812:68:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53812:68:0;;;;;;;;53895:7;53887:31;;;;;-1:-1:-1;;;53887:31:0;;;;;;;;;;;;-1:-1:-1;;;53887:31:0;;;;;;;;;;;;;;;53930:21;;;53940:10;53930:21;;;;;;;;;;;;;53283:674;;;:::o;43112:822::-;43198:10;43170:4;43191:18;;;:6;:18;;;;;:25;:30;43183:66;;;;;-1:-1:-1;;;43183:66:0;;;;;;;;;;;;-1:-1:-1;;;43183:66:0;;;;;;;;;;;;;;;43273:1;43264:6;:10;43256:37;;;;;-1:-1:-1;;;43256:37:0;;;;;;;;;;;;-1:-1:-1;;;43256:37:0;;;;;;;;;;;;;;;43319:1;43308:8;:12;43300:41;;;;;-1:-1:-1;;;43300:41:0;;;;;;;;;;;;-1:-1:-1;;;43300:41:0;;;;;;;;;;;;;;;43356:11;;;;43348:47;;;;;-1:-1:-1;;;43348:47:0;;;;;;;;;;;;-1:-1:-1;;;43348:47:0;;;;;;;;;;;;;;;43402:15;43420:26;43424:6;43432:13;;43420:3;:26::i;:::-;43402:44;;43453:17;43473:33;43477:13;;43492;;43473:3;:33::i;:::-;43453:53;;43513:27;43543:53;43551:20;43560:10;43551:8;:20::i;:::-;43573:22;43582:12;43573:8;:22::i;:::-;43543:7;:53::i;:::-;43513:83;;43603:15;43621:18;43625:3;43630:8;43621:3;:18::i;:::-;43603:36;;43667:159;;;;;;;;43678:10;43667:159;;;;43690:19;-1:-1:-1;;;;;43667:159:0;;;;;;43711:10;43667:159;;;;43723:5;43667:159;;;;;;43730:1;43667:159;;;;43733:92;43741:47;43759:28;43763:3;43768:18;;43759:3;:28::i;:::-;43741:17;:47::i;:::-;-1:-1:-1;;;43733:7:0;:92::i;:::-;-1:-1:-1;;;;;;43667:159:0;;;;;;43653:10;43646:18;;;;:6;:18;;;;;;;;;:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43646:180:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43833:31;43850:4;43857:6;43833:8;:31::i;:::-;-1:-1:-1;43876:34:0;;;43881:10;43876:34;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43924:4:0;;43112:822;-1:-1:-1;;;;;;43112:822:0:o;37573:83::-;37637:13;;37573:83;:::o;38213:375::-;-1:-1:-1;;;;;38337:13:0;;38292:4;38337:13;;;:7;:13;;;;;;;;38351:10;38337:25;;;;;;;;38333:37;;38364:5;38333:3;:37::i;:::-;-1:-1:-1;;;;;38305:13:0;;;;;;:7;:13;;;;;;;;38319:10;38305:25;;;;;;;:65;;;;38407:13;;38396:25;;38400:5;;38396:3;:25::i;:::-;-1:-1:-1;;;;;38449:14:0;;;;;;:8;:14;;;;;;38379:42;;-1:-1:-1;38445:30:0;;38379:42;38445:3;:30::i;:::-;-1:-1:-1;;;;;38428:14:0;;;;;;;:8;:14;;;;;;:47;;;;38501:12;;;;;;;38497:28;;38515:9;38497:3;:28::i;:::-;-1:-1:-1;;;;;38482:12:0;;;;;;;:8;:12;;;;;;;;;:43;;;;38537:25;;;;;;;38482:12;;38537:25;;;;;;;;;;;;;-1:-1:-1;38578:4:0;;38213:375;-1:-1:-1;;;;38213:375:0:o;40461:32::-;;;;:::o;35685:21::-;;;;;;:::o;40698:31::-;;;;;;:::o;54391:237::-;-1:-1:-1;;;;;54486:15:0;;54465:4;54486:15;;;:9;:15;;;;;:22;54478:50;;;;;-1:-1:-1;;;54478:50:0;;;;;;;;;;;;-1:-1:-1;;;54478:50:0;;;;;;;;;;;;;;;54542:80;54546:42;54571:4;54577;54583;54546:24;:42::i;:::-;54590:12;;;;;;;;;-1:-1:-1;;;;;54590:12:0;-1:-1:-1;;;;;54590:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;54542:80:0;54535:87;54391:237;-1:-1:-1;;;54391:237:0:o;49788:2904::-;49898:10;49867:4;49888:21;;;:9;:21;;;;;:28;49880:56;;;;;-1:-1:-1;;;49880:56:0;;;;;;;;;;;;-1:-1:-1;;;49880:56:0;;;;;;;;;;;;;;;49949:20;49972:48;49997:10;50009:3;50014:5;49972:24;:48::i;:::-;50085:10;50075:21;;;;:9;:21;;;;;:37;;;50023:1;49972:52;;;;;-1:-1:-1;50071:59:0;;49972:52;50071:3;:59::i;:::-;50041:10;50031:21;;;;:9;:21;;;;;:37;;;:99;;;;50143:32;;;50178:3;-1:-1:-1;50139:288:0;;;50219:1;50203:13;:17;50194:82;;;;-1:-1:-1;;;50194:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50311:1;50296:11;:16;;50287:83;;;;-1:-1:-1;;;50287:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50391:10;50381:21;;;;:9;:21;;;;;50416:3;50381:32;;;;:38;50139:288;50453:1;50439:11;:15;50435:492;;;50510:10;50500:21;;;;:9;:21;;;;;:28;50496:52;;50535:11;50496:3;:52::i;:::-;50475:10;50465:21;;;;:9;:21;;;;;:83;;;50584:32;;;;;50580:42;;50618:3;50580;:42::i;:::-;50557:65;;50631:10;50644:61;50653:11;50667:37;50671:15;50688;50667:3;:37::i;:::-;50644:3;:61::i;:::-;50631:74;;50730:25;50734:13;;50749:5;50730:3;:25::i;:::-;50714:13;:41;50808:10;50798:21;;;;:9;:21;;;;;:27;;;50794:39;;50827:5;50794:3;:39::i;:::-;50774:10;50764:21;;;;:9;:21;;;;;;;;:27;;:69;;;;50842:18;;:77;;-1:-1:-1;;;50842:77:0;;;;;;;;;50894:4;50842:77;;;;;;;;;;;;-1:-1:-1;;;;;50842:18:0;;;;:31;;:77;;;;;;;;;;;;;:18;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;50842:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50842:77:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;50435:492:0;50957:1;50943:11;:15;50939:528;;;51014:10;51004:21;;;;:9;:21;;;;;:28;51000:53;;51039:12;;;51000:3;:53::i;:::-;50979:10;50969:21;;;;:9;:21;;;;;:84;;;51089:32;;;;;51085:42;;51123:3;51085;:42::i;:::-;51062:65;;51136:10;51149:62;51159:11;51158:12;;51173:37;51177:15;51194;51173:3;:37::i;51149:62::-;51136:75;;51236:25;51240:13;;51255:5;51236:3;:25::i;:::-;51220:13;:41;51314:10;51304:21;;;;:9;:21;;;;;:27;;;51300:39;;51333:5;51300:3;:39::i;:::-;51280:10;51270:21;;;;:9;:21;;;;;;;;:27;;;;:69;;;;51348:36;;:43;;-1:-1:-1;;51348:43:0;;;;;;;51400:18;;:59;;-1:-1:-1;;;51400:59:0;;;;;;;;;51445:12;;;51400:59;;;;;;-1:-1:-1;;;;;51400:18:0;;;;:27;;:59;;;;;;;;;;;;;:18;:59;;;2:2:-1;;;;27:1;24;17:12;2:2;51400:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51400:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;50939:528:0;51495:1;51479:13;:17;51475:418;;;51556:10;51546:21;;;;:9;:21;;;;;:32;;;51542:59;;51585:14;;;51542:3;:59::i;:::-;51517:10;51507:21;;;;:9;:21;;;;;:32;;;:94;;;;51627:28;;51623:82;;51657:47;51666:14;;;;51657:3;:47::i;51623:82::-;51610:95;;51730:25;51734:13;;51749:5;51730:3;:25::i;:::-;51714:13;:41;51808:10;51798:21;;;;:9;:21;;;;;:27;;;51794:39;;51827:5;51794:3;:39::i;:::-;51774:10;51764:21;;;;:9;:21;;;;;:27;;;;:69;;;;51842:36;;:43;;-1:-1:-1;;51842:43:0;;;;;;-1:-1:-1;51475:418:0;51921:1;51905:13;:17;51901:363;;;51982:10;51972:21;;;;:9;:21;;;;;:32;;;51968:58;;52011:13;51968:3;:58::i;:::-;51943:10;51933:21;;;;:9;:21;;;;;:32;;;:93;;;;52052:28;;52048:80;;52082:45;52091:13;;52082:3;:45::i;52048:80::-;52035:93;;52153:25;52157:13;;52172:5;52153:3;:25::i;:::-;52137:13;:41;52231:10;52221:21;;;;:9;:21;;;;;:27;;;52217:39;;52250:5;52217:3;:39::i;:::-;52197:10;52187:21;;;;:9;:21;;;;;:27;;:69;-1:-1:-1;51901:363:0;52323:92;52331:47;52349:28;52353:3;52358:18;;52349:3;:28::i;52323:92::-;52286:10;52276:21;;;;:9;:21;;;;;:44;;;:139;;-1:-1:-1;;;;;;52276:139:0;;;;;;;;;;;;;52436:28;52428:79;;;;-1:-1:-1;;;52428:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52532:10;52522:21;;;;:9;:21;;;;;:32;;;52557:3;-1:-1:-1;52514:79:0;;;;;-1:-1:-1;;;52514:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52611:57;;;52629:10;52611:57;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52682:4:0;;49788:2904;-1:-1:-1;;;49788:2904:0:o;38783:261::-;38916:10;38860:4;38908:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;38908:28:0;;;;;;;;;;38904:45;;38938:10;38904:3;:45::i;:::-;38881:10;38873:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;38873:28:0;;;;;;;;;;;;:76;;;38961:59;;;;;;38873:28;;38961:59;;;;;;;;;;;-1:-1:-1;39034:4:0;38783:261;;;;:::o;42512:359::-;41344:11;;42590:4;;-1:-1:-1;;;;;41344:11:0;41330:10;:25;41322:70;;;;;-1:-1:-1;;;41322:70:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41322:70:0;;;;;;;;;;;;;;;42603:16:::1;42622:12;42603:31;;42641:15;42659:31;42663:13;;42678:11;42659:3;:31::i;:::-;42641:49;;42713:31;42717:13;;42732:11;42713:3;:31::i;:::-;42697:13;:47:::0;-1:-1:-1;;;;;42776:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;42772:35:::1;::::0;42796:10;42772:3:::1;:35::i;:::-;-1:-1:-1::0;;;;;42751:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;;;:56;;;;42819:28;;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;-1:-1:-1::0;42861:4:0::1;::::0;42512:359;-1:-1:-1;;;;42512:359:0:o;40431:25::-;;;;:::o;53965:228::-;-1:-1:-1;;;;;54057:12:0;;54036:4;54057:12;;;:6;:12;;;;;:19;54049:47;;;;;-1:-1:-1;;;54049:47:0;;;;;;;;;;;;-1:-1:-1;;;54049:47:0;;;;;;;;;;;;;;;54110:77;54114:39;54136:4;54142;54148;54114:21;:39::i;54201:182::-;-1:-1:-1;;;;;54282:12:0;;54261:4;54282:12;;;:6;:12;;;;;:19;54274:47;;;;;-1:-1:-1;;;54274:47:0;;;;;;;;;;;;-1:-1:-1;;;54274:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54339:12:0;;;;;;:6;:12;;;;;:19;54360:13;;54335:39;;54339:19;54335:3;:39::i;37664:112::-;-1:-1:-1;;;;;37741:13:0;;37717:4;37741:13;;;:8;:13;;;;;;37756;;37737:33;;37741:13;37737:3;:33::i;43942:722::-;44034:10;44003:4;44024:21;;;:9;:21;;;;;:28;:33;44016:69;;;;;-1:-1:-1;;;44016:69:0;;;;;;;;;;;;-1:-1:-1;;;44016:69:0;;;;;;;;;;;;;;;44109:1;44100:6;:10;44092:37;;;;;-1:-1:-1;;;44092:37:0;;;;;;;;;;;;-1:-1:-1;;;44092:37:0;;;;;;;;;;;;;;;44155:1;44144:8;:12;44136:41;;;;;-1:-1:-1;;;44136:41:0;;;;;;;;;;;;-1:-1:-1;;;44136:41:0;;;;;;;;;;;;;;;44192:11;;;;44184:47;;;;;-1:-1:-1;;;44184:47:0;;;;;;;;;;;;-1:-1:-1;;;44184:47:0;;;;;;;;;;;;;;;44238:10;44251:36;44255:6;44263:23;44267:8;44277;44263:3;:23::i;44251:36::-;44238:49;;44310:25;44314:13;;44329:5;44310:3;:25::i;:::-;44294:13;:41;44366:152;;;;;;;;;;;;;;;;;;;;44395:18;44399:3;44404:8;44395:3;:18::i;:::-;44366:152;;;;44415:5;44366:152;;;;;;44422:1;44366:152;;;;44425:92;44433:47;44451:28;44455:3;44460:18;;44451:3;:28::i;44425:92::-;-1:-1:-1;;;;;;44366:152:0;;;;;;44352:10;44342:21;;;;:9;:21;;;;;;;;:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44342:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44525:18;;:66;;-1:-1:-1;;;44525:66:0;;;;;;;;;44577:4;44525:66;;;;;;;;;;;;-1:-1:-1;;;;;44525:18:0;;;;:31;;:66;;;;;44342:21;;44525:66;;;;;;;;;:18;:66;;;2:2:-1;;;;27:1;24;17:12;2:2;44525:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44525:66:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;44603:37:0;;;44611:10;44603:37;;44525:66;44603:37;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44654:4:0;;43942:722;-1:-1:-1;;;43942:722:0:o;35660:20::-;;;;;;;;;;;;;;;-1:-1:-1;;35660:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42075:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39050:409::-;39172:10;39132:4;39164:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;39164:28:0;;;;;;;;;;39203:27;;;39199:166;;39249:10;39272:1;39241:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;39241:28:0;;;;;;;;;:32;39199:166;;;39327:30;39331:8;39341:15;39327:3;:30::i;:::-;39304:10;39296:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;39296:28:0;;;;;;;;;:61;39199:166;39385:10;39406:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;39376:59:0;;39406:28;;;;;;;;;;;39376:59;;;;;;;;;39385:10;39376:59;;;;;;;;;;;-1:-1:-1;39449:4:0;;39050:409;-1:-1:-1;;;39050:409:0:o;52700:575::-;52770:10;52734:12;52763:18;;;:6;:18;;;;;:25;52755:53;;;;;-1:-1:-1;;;52755:53:0;;;;;;;;;;;;-1:-1:-1;;;52755:53:0;;;;;;;;;;;;;;;52845:10;52815:16;52838:18;;;:6;:18;;;;;:25;52865:13;;52834:45;;52838:25;52834:3;:45::i;:::-;52886:38;;;-1:-1:-1;;;52886:38:0;;52900:10;52886:38;;;;;;;;;;;;52815:64;;-1:-1:-1;52886:4:0;;:13;;:38;;;;;;;;;;;;;;;-1:-1:-1;52886:4:0;:38;;;2:2:-1;;;;27:1;24;17:12;2:2;52886:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52886:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52931:11:0;;-1:-1:-1;52945:44:0;52967:10;52979:3;52984:4;52945:21;:44::i;:::-;52931:58;;52996:17;53016:44;53020:6;53028:12;;;;;;;;;-1:-1:-1;;;;;53028:12:0;-1:-1:-1;;;;;53028:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;53016:44:0;53077:12;;:43;;;-1:-1:-1;;;53077:43:0;;53095:10;53077:43;;;;;;;;;;;;52996:64;;-1:-1:-1;;;;;;53077:12:0;;;;:17;;:43;;;;;;;;;;;;;;;:12;;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;53077:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53077:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53077:43:0;53148:50;;;;;;;;-1:-1:-1;53148:50:0;;;53077:43;53148:50;;;;;;;;;;;;;;;;;;53162:10;53148:50;;;;;;;;;;;;53134:10;53127:18;;:6;:18;;;;;;;:71;;;;;;53148:50;53127:71;;;;-1:-1:-1;;;;;;53127:71:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53127:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53077:43;-1:-1:-1;53077:43:0;53205:31;;;;;-1:-1:-1;;;53205:31:0;;;;;;;;;;;;-1:-1:-1;;;53205:31:0;;;;;;;;;;;;;;;53248:21;;;53258:10;53248:21;;;;;;;;;;;;;52700:575;;;;:::o;41878:142::-;36389:6;;41941:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;41954:6:::1;:13:::0;;-1:-1:-1;;;;;41954:13:0;::::1;;::::0;::::1;-1:-1:-1::0;;;;;;41954:13:0;;::::1;::::0;;;::::1;::::0;;;41979:17:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;42010:4:0::1;41878:142:::0;;;:::o;41662:208::-;36389:6;;41720:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;41735:22:::1;:29:::0;;-1:-1:-1;;;;;41735:29:0;::::1;-1:-1:-1::0;;;;;;41735:29:0;;::::1;::::0;::::1;::::0;;;41773:18:::1;:45:::0;;;;::::1;::::0;::::1;::::0;;41832:12:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;41860:4:0::1;41662:208:::0;;;:::o;37782:296::-;37840:4;37853:14;37870:25;37874:5;37881:13;;37870:3;:25::i;:::-;37938:10;37929:20;;;;:8;:20;;;;;;37853:42;;-1:-1:-1;37925:36:0;;37853:42;37925:3;:36::i;:::-;37911:10;37902:20;;;;:8;:20;;;;;;:59;;;;-1:-1:-1;;;;;37987:12:0;;;;;;37983:28;;38001:9;37983:3;:28::i;:::-;-1:-1:-1;;;;;37968:12:0;;;;;;:8;:12;;;;;;;;;:43;;;;38023:31;;;;;;;37968:12;;38032:10;;38023:31;;;;;;;;;;-1:-1:-1;38068:4:0;;37782:296;-1:-1:-1;;;37782:296:0:o;35711:21::-;;;;;;-1:-1:-1;;;;;35711:21:0;;:::o;40502:26::-;;;-1:-1:-1;;;;;40502:26:0;;:::o;41414:240::-;36389:6;;41473:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;41494:11:::1;::::0;-1:-1:-1;;;;;41494:11:0::1;:25:::0;41486:54:::1;;;::::0;;-1:-1:-1;;;41486:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41486:54:0;;;;;;;;;;;;;::::1;;41547:11;:18:::0;;-1:-1:-1;;;;;41547:18:0;::::1;-1:-1:-1::0;;;;;;41547:18:0;;::::1;::::0;::::1;::::0;;;41572:12:::1;:33:::0;;;;::::1;::::0;::::1;::::0;;41617:13:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;41644:4:0::1;41414:240:::0;;;:::o;42026:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47259:2521::-;47363:10;47335:4;47356:18;;;:6;:18;;;;;:25;47348:53;;;;;-1:-1:-1;;;47348:53:0;;;;;;;;;;;;-1:-1:-1;;;47348:53:0;;;;;;;;;;;;;;;47410:20;47433:45;47455:10;47467:3;47472:5;47433:21;:45::i;:::-;47537:10;47530:18;;;;:6;:18;;;;;:34;;;47481:1;47433:49;;;;;-1:-1:-1;47526:56:0;;47433:49;47526:3;:56::i;:::-;47496:10;47489:18;;;;:6;:18;;;;;:34;;:93;;;;47615:13;;47630;;47611:33;;47615:13;47611:3;:33::i;:::-;47664:10;47657:18;;;;:6;:18;;;;;:29;;;47591:53;;-1:-1:-1;47689:3:0;-1:-1:-1;47653:462:0;;;47730:1;47714:13;:17;47705:82;;;;-1:-1:-1;;;47705:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47822:1;47807:11;:16;;47798:83;;;;-1:-1:-1;;;47798:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47946:10;47892:27;47939:18;;;:6;:18;;;;;:25;47922:68;;47930:35;;:8;:35::i;47922:68::-;48008:10;48001:18;;;;:6;:18;;;;;:38;;;:60;;-1:-1:-1;;;;;;48001:60:0;;;;;;;;;;;;;48104:3;48072:29;;;;:35;-1:-1:-1;47653:462:0;48141:1;48127:11;:15;48123:430;;;48153:14;48170:37;48179:11;48193:13;;48170:3;:37::i;:::-;48255:10;48248:18;;;;:6;:18;;;;;:25;48153:54;;-1:-1:-1;48244:41:0;;48153:54;48244:3;:41::i;:::-;48223:10;48216:18;;;;:6;:18;;;;;:69;;;;48324:52;48332:19;48341:9;48332:8;:19::i;:::-;48353:22;48362:12;48353:8;:22::i;48324:52::-;48441:10;48434:18;;;;:6;:18;;;;;:38;;;48294:82;;-1:-1:-1;48426:68:0;;48434:38;;48294:82;48426:7;:68::i;:::-;48392:10;48385:18;;;;:6;:18;;;;;:38;;:109;;-1:-1:-1;;;;;;48385:109:0;;;;;;;;;;;;48503:42;48520:4;48532:11;48503:8;:42::i;:::-;;48123:430;;;48583:1;48569:11;:15;48565:483;;;48595:14;48612:38;48622:11;48621:12;;48636:13;;48612:3;:38::i;:::-;48698:10;48691:18;;;;:6;:18;;;;;:25;48595:55;;-1:-1:-1;48687:41:0;;48595:55;48687:3;:41::i;:::-;48666:10;48659:18;;;;:6;:18;;;;;:69;;;;48767:52;48775:19;48784:9;48775:8;:19::i;48767:52::-;48884:10;48877:18;;;;:6;:18;;;;;:38;;;48737:82;;-1:-1:-1;48869:68:0;;48877:38;;48737:82;48869:7;:68::i;:::-;48835:10;48828:18;;;;:6;:18;;;;;;;;:38;;;;:109;;-1:-1:-1;;;;;;48828:109:0;;;;;;;;;;;;;48946:33;;:40;;-1:-1:-1;;48946:40:0;;;;;;;48995:45;;-1:-1:-1;;;48995:45:0;;;;;;;;;49026:12;;;48995:45;;;;;;:4;;:13;;:45;;;;;48828:18;;48995:45;;;;;;;;;:4;:45;;;2:2:-1;;;;27:1;24;17:12;2:2;48995:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48995:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;48565:483:0;49076:1;49060:13;:17;49056:177;;;49131:10;49124:18;;;;:6;:18;;;;;:29;;;49120:56;;49160:14;;;49120:3;:56::i;:::-;49095:10;49088:18;;;;:6;:18;;;;;:29;;;:88;;;;49185:33;;:40;;-1:-1:-1;;49185:40:0;49221:4;49185:40;;;49056:177;49261:1;49245:13;:17;49241:127;;;49316:10;49309:18;;;;:6;:18;;;;;:29;;;49305:55;;49345:13;49305:3;:55::i;:::-;49280:10;49273:18;;;;:6;:18;;;;;:29;;:87;49241:127;49424:92;49432:47;49450:28;49454:3;49459:18;;49450:3;:28::i;49424:92::-;49387:10;49380:18;;;;:6;:18;;;;;:41;;;:136;;-1:-1:-1;;;;;;49380:136:0;;;;;;;;;;;;;49533:25;49525:76;;;;-1:-1:-1;;;49525:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49623:10;49616:18;;;;:6;:18;;;;;:29;;;49648:3;-1:-1:-1;49608:76:0;;;;;-1:-1:-1;;;49608:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49702:54;;;49717:10;49702:54;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49770:4:0;;47259:2521;-1:-1:-1;;;;47259:2521:0:o;38084:123::-;-1:-1:-1;;;;;38177:15:0;;;38157:4;38177:15;;;:7;:15;;;;;;;;:24;;;;;;;;;;;;;38084:123::o;42879:225::-;36389:6;;42932:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;42954:11:::1;::::0;::::1;;42953:12;42945:48;;;::::0;;-1:-1:-1;;;42945:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43000:11;:18:::0;;-1:-1:-1;;43000:18:0::1;43014:4;43000:18;::::0;;43046:3:::1;43025:18;:24:::0;43061:12:::1;::::0;::::1;::::0;43000:11:::1;::::0;43061:12:::1;-1:-1:-1::0;43087:11:0::1;::::0;::::1;;42879:225:::0;:::o;40663:30::-;;;;:::o;54636:90::-;54707:13;;54636:90;:::o;34658:246::-;34716:7;34740:6;34736:47;;-1:-1:-1;34770:1:0;34763:8;;34736:47;34805:5;;;34809:1;34805;:5;:1;34829:5;;;;;:10;34821:56;;;;-1:-1:-1;;;34821:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34916:132;34974:7;35001:39;35005:1;35008;35001:39;;;;;;;;;;;;;;;;;:3;:39::i;34308:136::-;34366:7;34393:43;34397:1;34400;34393:43;;;;;;;;;;;;;;;;;:3;:43::i;34117:179::-;34175:7;34207:5;;;34231:6;;;;34223:46;;;;;-1:-1:-1;;;34223:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;45769:1482;-1:-1:-1;;;;;45936:19:0;;45883:11;45936:19;;;:9;:19;;;;;:34;;;45883:11;;45936:34;;;:81;;-1:-1:-1;;;;;;45974:19:0;;;;;;:9;:19;;;;;:30;;;:43;-1:-1:-1;45936:81:0;45933:120;;;-1:-1:-1;46041:4:0;45933:120;-1:-1:-1;;;;;46106:19:0;;46059:22;46106:19;;;:9;:19;;;;;:30;;;46084:53;;;46148:22;;46144:85;;;46202:19;;46144:85;-1:-1:-1;;;;;46273:19:0;;46235:21;46273:19;;;:9;:19;;;;;46338:1;46273:30;;;;46311:28;;;46260:43;;;46259:49;;;;:80;46354:30;;;;:84;;-1:-1:-1;;;;;;46408:19:0;;;;;;:9;:19;;;;;:30;;;46388:50;;46354:84;46346:106;;;;;-1:-1:-1;;;46346:106:0;;;;;;;;;;;;-1:-1:-1;;;46346:106:0;;;;;;;;;;;;;;;46468:246;46475:238;46483:158;46491:105;46499:60;46517:41;46521:16;46539:18;;46517:3;:41::i;46491:105::-;-1:-1:-1;;;;;46598:19:0;;;;;;:9;:19;;;;;:42;;;;;46483:7;:158::i;:::-;-1:-1:-1;;;;;46660:19:0;;;;;;:9;:19;;;;;:25;;;46643:69;;46651:35;;:8;:35::i;:::-;46688:23;46697:13;;46688:8;:23::i;46643:69::-;46475:7;:238::i;:::-;46468:6;:246::i;:::-;46459:255;;46725:16;46721:98;;;-1:-1:-1;;;;;46775:19:0;;;;;;:9;:19;;;;;:35;;;46763:48;;46767:6;;46763:3;:48::i;:::-;46754:57;;46721:98;46834:258;46841:250;46849:16;46858:6;46849:8;:16::i;:::-;46867:223;-1:-1:-1;;;46867:223:0;;46911:178;46919:30;46928:20;;46919:8;:30::i;:::-;46951:137;46959:92;46967:47;46985:28;46989:3;46994:18;;46985:3;:28::i;46967:47::-;-1:-1:-1;;;46959:7:0;:92::i;46911:178::-;46867:7;:223::i;46834:258::-;46825:267;;47108:69;47115:61;47123:16;47132:6;47123:8;:16::i;:::-;-1:-1:-1;;;47115:7:0;:61::i;47108:69::-;47099:78;;47188:10;47184:56;;;47218:14;47222:6;47230:1;47218:3;:14::i;:::-;47209:23;;47184:56;45769:1482;;;;;;;;:::o;1231:405::-;1284:7;1304:6;1300:331;;-1:-1:-1;1328:1:0;1312:18;;1300:331;1368:1;1351:14;1394:12;1368:1;1394:3;:12::i;:::-;1380:26;;1425:3;1419;:9;1415:84;;;1447:3;1441;:9;1430:20;;;;;1415:84;;;1474:3;1468;:9;1464:35;;;1496:3;1490;:9;1479:20;;;;;1464:35;1561:5;:11;1576:3;1561:18;-1:-1:-1;;;;;1519:39:0;;;;:60;1597:26;;;-1:-1:-1;1590:33:0;;11803:2702;11866:7;11923:6;11902:18;;;;:27;;;11956:18;;;;:27;;;11996:19;;11992:2508;;;12030:9;12043:6;12030:19;12026:98;;;-1:-1:-1;;;;12058:3:0;-1:-1:-1;12051:10:0;;-1:-1:-1;12051:10:0;12026:98;-1:-1:-1;;;;;;12086:38:0;;12082:42;;12075:49;;11992:2508;12142:9;12155:6;12142:19;12138:2362;;;-1:-1:-1;;;12176:38:0;;:43;12172:140;;-1:-1:-1;;;;12228:3:0;-1:-1:-1;12221:10:0;;-1:-1:-1;12221:10:0;12172:140;-1:-1:-1;;;12269:5:0;;;-1:-1:-1;;;12268:44:0;12245:67;;12138:2362;-1:-1:-1;;;;;;;12330:38:0;;12326:2174;;-1:-1:-1;;;;;;;12388:38:0;;12384:144;;-1:-1:-1;;;;12440:3:0;-1:-1:-1;12433:10:0;;-1:-1:-1;12433:10:0;12384:144;-1:-1:-1;;;12485:5:0;;;-1:-1:-1;;;12484:44:0;-1:-1:-1;;;12464:64:0;12457:71;;12326:2174;-1:-1:-1;;;;;12572:11:0;;;;:44;12629:14;12625:92;;12657:1;12645:13;;12625:92;;;-1:-1:-1;;;12672:45:0;12625:92;-1:-1:-1;;;;;12749:11:0;;;;:44;12806:14;12802:321;;12837:15;;12833:181;;12867:10;12886:16;12891:10;12886:3;:16::i;:::-;12964:1;;-1:-1:-1;12880:3:0;:22;12978:24;;;-1:-1:-1;;12978:24:0;;12917:20;;;;;-1:-1:-1;12833:181:0;12802:321;;;-1:-1:-1;;;13061:44:0;13110:3;13060:53;12802:321;13159:10;13146;:23;;;;;;;-1:-1:-1;13182:15:0;13178:130;;-1:-1:-1;;;13216:5:0;;;13215:44;:93;;550:34;13215:93;;;-1:-1:-1;;;13215:93:0;13208:100;;;;;;;;13178:130;-1:-1:-1;;;13327:10:0;:44;;13319:53;;;;13383:11;-1:-1:-1;;;13406:10:0;:45;;:196;;-1:-1:-1;;;13482:10:0;:45;;:120;;-1:-1:-1;;;13545:10:0;:45;;:57;;13599:3;13545:57;;;13593:3;13545:57;13482:120;;;13530:3;13482:120;13406:196;;;;;13454:16;13459:10;13454:3;:16::i;:::-;13383:219;;13635:9;13647:5;13635:17;13629:3;13617:9;:15;:35;13613:745;;;13689:6;13677:18;;13719:1;13706:14;;13613:745;;;13767:9;13752:3;13740:9;:15;13758:5;13740:23;:36;13736:622;;;13814:1;13802:13;;13839:1;13826:14;;13736:622;;;13887:9;13872:3;13860:9;:15;13878:5;13860:23;:36;13856:502;;;13946:9;13926;13938:5;13926:17;:29;13922:196;;;14003:9;13983;13995:5;13983:17;:29;13968:44;;;;;13922:196;;;14052:9;14032;14044:5;14032:17;:29;14028:90;;;14113:5;14101:9;14089;:21;:29;14074:44;;;;;14028:90;14143:1;14131:13;;13856:502;;;14191:3;14185;:9;14181:50;;;14228:3;14222;:9;14207:24;;;;;14181:50;-1:-1:-1;;;;;14244:44:0;;;;14339:9;14325:3;14313:9;:15;14331:5;14313:23;:35;14301:47;;13856:502;14480:10;14474:3;14461:9;:16;;14407:1;14403;:5;-1:-1:-1;;;14402:44:0;;;14393:54;;-1:-1:-1;;;;;14393:84:0;;:97;14375:117;;14368:124;;;;;;;;;33545:530;33604:11;33626:13;33642:11;33651:1;33642:8;:11::i;:::-;33626:27;-1:-1:-1;33662:16:0;33681:50;33626:27;-1:-1:-1;;;33681:7:0;:50::i;:::-;33662:69;-1:-1:-1;33740:16:0;33759:53;33662:69;-1:-1:-1;;;33759:7:0;:53::i;:::-;33740:72;;33821:14;33838:13;33842:8;33838:3;:13::i;:::-;33821:30;-1:-1:-1;33860:14:0;33877:51;-1:-1:-1;;;33821:30:0;33877:7;:51::i;:::-;33860:68;-1:-1:-1;33937:13:0;33953:51;-1:-1:-1;;;33860:68:0;33953:7;:51::i;:::-;33937:67;-1:-1:-1;34019:50:0;33937:67;-1:-1:-1;;;34019:7:0;:50::i;:::-;34013:56;33545:530;-1:-1:-1;;;;;;;;33545:530:0:o;8101:2409::-;8164:7;8221:6;8200:18;;;;:27;;;8254:18;;;;:27;;;8294:19;;8290:2215;;;8328:9;8341:6;8328:19;8324:361;;;-1:-1:-1;;;;;;8364:6:0;;;;;;;8360:164;;;-1:-1:-1;;;;;;8383:38:0;;8379:42;;8372:49;;8360:164;-1:-1:-1;;;;;;;;;8441:5:0;;;:43;;8437:87;;;-1:-1:-1;;;8493:5:0;;;8486:12;;8437:87;-1:-1:-1;;;;8521:3:0;-1:-1:-1;8514:10:0;;-1:-1:-1;8514:10:0;8324:361;-1:-1:-1;;;;;;;8555:38:0;;8551:124;;-1:-1:-1;;;;8607:3:0;-1:-1:-1;8600:10:0;;-1:-1:-1;8600:10:0;8290:2215;8702:9;8715:6;8702:19;8698:1807;;;-1:-1:-1;;;;;;;8738:38:0;;8734:124;;-1:-1:-1;;;;8790:3:0;-1:-1:-1;8783:10:0;;-1:-1:-1;8783:10:0;8734:124;-1:-1:-1;;;;;;8820:38:0;;8816:42;;8809:49;;8698:1807;-1:-1:-1;;;;;8902:11:0;;;;:44;8959:14;8955:92;;8987:1;8975:13;;8955:92;;;-1:-1:-1;;;9002:45:0;8955:92;-1:-1:-1;;;;;9079:11:0;;;;:44;9136:14;9132:92;;9164:1;9152:13;;9132:92;;;-1:-1:-1;;;9179:45:0;9132:92;9235:24;;;;9272:15;9268:130;;-1:-1:-1;;;9306:5:0;;;9305:44;:93;;550:34;9305:93;;9268:130;9409:22;;;;9442:11;-1:-1:-1;;;9465:73:0;;;:198;;-1:-1:-1;;;9556:10:0;:73;;:107;;9647:16;9652:10;9647:3;:16::i;:::-;9556:107;;;9632:3;9556:107;9465:198;;;9541:3;9465:198;9442:221;;9696:5;9690:3;9678:9;:15;:23;9674:689;;;9739:1;9727:13;;9764:1;9751:14;;9674:689;;;9803:5;9797:3;9785:9;:15;:23;9781:582;;;9850:5;9838:9;:17;9834:148;;;9891:9;9883:5;:17;9868:32;;;;;9834:148;;;9932:5;9920:9;:17;9916:66;;;9977:5;9965:9;:17;9950:32;;;;;9916:66;10005:1;9993:13;;9781:582;;;10044:5;10038:3;10026:9;:15;:23;10022:341;;;10074:6;10062:18;;10104:1;10091:14;;10022:341;;;10142:3;10136;:9;10132:116;;;10179:3;10173;:9;10158:24;;;;;10132:116;;;10208:3;10202;:9;10198:50;;;10245:3;10239;:9;10224:24;;;;;10198:50;-1:-1:-1;;;;;10261:44:0;;;;10348:5;10342:3;10330:9;:15;:23;10318:35;;10022:341;10485:10;10479:3;10466:9;:16;;10412:1;10408;:5;-1:-1:-1;;;10407:44:0;;;10398:54;;-1:-1:-1;;;;;10398:84:0;;:97;10380:117;;10373:124;;;;;;;;;44670:1091;-1:-1:-1;;;;;44835:16:0;;44781:11;44835:16;;;:6;:16;;;;;:31;;;44781:11;;44835:31;;;:75;;-1:-1:-1;;;;;;44870:16:0;;;;;;:6;:16;;;;;:27;;;:40;-1:-1:-1;44835:75:0;44831:115;;;-1:-1:-1;44934:4:0;44831:115;-1:-1:-1;;;;;44999:16:0;;44952:22;44999:16;;;:6;:16;;;;;:27;;;44977:50;;;45038:22;;45034:85;;;45092:19;;45034:85;-1:-1:-1;;;;;45163:16:0;;45125:21;45163:16;;;:6;:16;;;;;45225:1;45163:27;;;;45198:28;;;45150:40;;;45149:46;;;;:77;45241:30;;;;:81;;-1:-1:-1;;;;;;45295:16:0;;;;;;:6;:16;;;;;:27;;;45275:47;;45241:81;45233:103;;;;;-1:-1:-1;;;45233:103:0;;;;;;;;;;;;-1:-1:-1;;;45233:103:0;;;;;;;;;;;;;;;45352:210;45359:202;45367:155;45375:105;45383:60;45401:41;45405:16;45423:18;;45401:3;:41::i;45375:105::-;-1:-1:-1;;;;;45482:16:0;;;;;;:6;:16;;;;;:39;;;;;45367:7;:155::i;:::-;-1:-1:-1;;;;;45524:16:0;;;;;;:6;:16;;;;;:36;;;;;45359:7;:202::i;45352:210::-;45343:219;;45573:16;45569:95;;;-1:-1:-1;;;;;45623:16:0;;;;;;:6;:16;;;;;:32;;;45611:45;;45615:6;;45611:3;:45::i;:::-;45602:54;;45569:95;45679:14;45683:6;45691:1;45679:3;:14::i;3092:3678::-;3155:7;3212:6;3191:18;;;;:27;;;3245:18;;;;:27;;;3285:19;;3281:3484;;;3319:9;3332:6;3319:19;3315:107;;;-1:-1:-1;;;;;;3356:6:0;;;;;;;3352:46;;;3371:1;3364:8;;;;;;3315:107;3421:1;3414:8;;;;;;3281:3484;3441:9;3454:6;3441:19;3437:3328;;;3469:1;3462:8;;;;;;3437:3328;-1:-1:-1;;;3504:11:0;;;;:49;;;;;-1:-1:-1;;;;;3583:44:0;3640:14;3636:92;;3668:1;3656:13;;3636:92;;;-1:-1:-1;;;3683:45:0;3636:92;-1:-1:-1;;;3752:11:0;;;;:49;;;;;-1:-1:-1;;;;;3831:44:0;3888:14;3884:92;;3916:1;3904:13;;3884:92;;;-1:-1:-1;;;3931:45:0;3884:92;3991:15;3987:2771;;-1:-1:-1;;;;;;4015:18:0;;-1:-1:-1;;;4015:18:0;:38;;4052:1;4015:38;;;550:34;4015:38;4008:45;;;;;;;;;;3987:2771;4071:15;4067:2691;;-1:-1:-1;;;;;;4095:18:0;;-1:-1:-1;;;4095:18:0;:38;;4132:1;4095:38;;4067:2691;4173:39;;;4231:14;;;;;;;4227:2522;;;4272:3;4264:5;:11;4260:241;;;4284:1;4277:8;;;;;;;;;;;4260:241;4315:1;4307:5;:9;4303:198;;;4333:5;4318:20;;;;;;;;;;;;;4303:198;;;-1:-1:-1;;4360:5:0;:12;4356:145;;;4381:1;4374:8;;;;;;;;;;;4356:145;4412:1;4404:5;:9;4400:101;;;4446:5;4445:6;;4430:21;;;;;;;;;;;;;4478:9;4466:21;;4400:101;4517:24;;;;-1:-1:-1;;;4562:45:0;;4558:125;;4639:1;4655:14;;;;4624:16;;;;;4558:125;4703:9;4716:6;4703:19;4699:445;;;4744:5;:45;;-1:-1:-1;;;4744:45:0;;;-1:-1:-1;;;;;;4744:45:0;4737:52;;;;;;;;;;;4699:445;-1:-1:-1;;;4826:10:0;:44;4822:127;;;4884:1;4872:13;;4822:127;;;-1:-1:-1;;;;;4905:44:0;;;;4822:127;5117:10;5093:3;5080:9;:16;;5012:5;:46;;5057:1;5012:46;;;-1:-1:-1;;;5012:46:0;-1:-1:-1;;;;;5011:86:0;;:116;4975:154;;4968:161;;;;;;;;;;;4227:2522;5186:1;5178:5;:9;5174:195;;;5219:1;5204:16;;;;;5248:1;5235:14;;;;5174:195;;;5281:1;5273:5;:9;5269:100;;;5314:1;5299:16;;;;;5354:1;5342:9;:13;5330:25;;5269:100;5395:3;5387:5;:11;5383:241;;;5413:1;5400:14;;5383:241;;;5444:1;5436:5;:9;5432:192;;;5487:1;5479:5;:9;5474:1;5461:10;:14;:27;;;;;;;;;;5492:1;5460:33;5447:46;;5432:192;;;-1:-1:-1;;5515:5:0;:12;5511:113;;;5542:1;5529:14;;5511:113;;;-1:-1:-1;;5565:5:0;:10;5561:63;;;5618:1;5610:5;5609:6;;:10;5604:1;5591:10;:14;:28;;;;;;;;;;5623:1;5590:34;5577:47;;5561:63;5657:10;5643;:24;5639:165;;5683:10;5669:24;;;;5639:165;;;5752:10;5739;:23;5726:36;;5785:5;5777:13;;5639:165;5822:15;5818:54;;-1:-1:-1;550:34:0;;-1:-1:-1;5852:20:0;;-1:-1:-1;;;;;;5852:20:0;5818:54;5887:11;5901:16;5906:10;5901:3;:16::i;:::-;5887:30;;5936:3;5943;5936:10;5932:527;;;5990:1;5976:10;:15;;-1:-1:-1;;;;;5976:48:0;5963:61;;6052:1;6039:14;;;;5932:527;;;6083:3;6077;:9;6073:386;;;6119:3;:9;;;6147:17;;;6143:253;;;6210:5;6196:10;:19;;-1:-1:-1;;;;;6196:52:0;6183:65;;6278:5;6265:18;;;;6143:253;;;6379:1;;-1:-1:-1;;6337:13:0;6322:28;;;;;6143:253;6073:386;;;;-1:-1:-1;;;;;6415:44:0;;;;6073:386;6478:9;6491:6;6478:19;6474:263;;;6519:5;:45;;-1:-1:-1;;;6519:45:0;;;-1:-1:-1;;;;;;6519:45:0;6512:52;;;;;;;;;;;;6474:263;6725:10;6703:3;6690:9;:16;;6624:5;:46;;6669:1;6624:46;;;-1:-1:-1;;;6624:46:0;-1:-1:-1;;;;;6623:84:0;;:112;6589:148;;6582:155;;;;;;;;;;;;7260:142;7323:7;7346:50;7354:1;-1:-1:-1;;;7357:38:0;;7346:7;:50::i;35060:189::-;35146:7;35181:12;35174:5;35166:28;;;;-1:-1:-1;;;35166:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35166:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35205:9;35221:1;35217;:5;;;;;;;35060:189;-1:-1:-1;;;;;35060:189:0:o;34456:190::-;34542:7;34578:12;34570:6;;;;34562:29;;;;-1:-1:-1;;;34562:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;34562:29:0;-1:-1:-1;;;34614:5:0;;;34456:190::o;2044:558::-;2095:7;2151:6;2130:18;;;;:27;2181:5;2170:16;;2166:30;;;2195:1;2188:8;;;;;2166:30;-1:-1:-1;;;2227:11:0;;;;:48;2218:58;;12:1:-1;9;2:12;2218:58:0;2318:5;2306:8;:17;;2297:27;;12:1:-1;9;2:12;2297:27:0;-1:-1:-1;;;;;;;;2369:11:0;;;;2360:54;:95;2479:5;2468:16;;2464:110;;;2497:5;:16;;;2486:27;2464:110;;;2540:5;2529:8;:16;2525:49;;;-1:-1:-1;;2558:16:0;;2547:27;2590:6;2044:558;-1:-1:-1;;;2044:558:0:o;32952:585::-;32999:7;33028:1;33024;:5;33015:15;;12:1:-1;9;2:12;33015:15:0;33039:14;-1:-1:-1;;;33070:40:0;;33066:75;;33120:3;33114:9;;;;33125:13;33066:75;-1:-1:-1;;;33151:1:0;:24;33147:57;;33185:2;33179:8;;;;33189:12;33147:57;33219:11;33214:1;:16;33210:49;;33240:2;33234:8;;;;33244:12;33210:49;33274:7;33269:1;:12;33265:45;;33291:2;33285:8;;;;33295:12;33265:45;33325:5;33320:1;:10;33316:41;;33340:1;33334:7;;;;33343:11;33316:41;33372:4;33367:1;:9;33363:40;;33386:1;33380:7;;;;33389:11;33363:40;33418:3;33413:1;:8;33409:39;;33431:1;33425:7;;;;33434:11;33409:39;33463:3;33458:1;:8;33454:25;;33478:1;33468:11;33525:6;32952:585;-1:-1:-1;;32952:585:0:o;32812:132::-;32860:7;32883:55;32890:47;32899:1;-1:-1:-1;;;32890:7:0;:47::i;:::-;14685:7;-1:-1:-1;;;14718:11:0;;;;:48;;;;14814:6;14793:18;;;;:27;;;-1:-1:-1;;;;;14848:44:0;;14905:19;;:38;;;;-1:-1:-1;14928:15:0;;;14905:38;14901:17776;;;-1:-1:-1;;;;14952:3:0;-1:-1:-1;14945:10:0;;-1:-1:-1;;14945:10:0;14901:17776;14983:5;14971:9;:17;14967:17710;;;15004:9;:45;;-1:-1:-1;;;15004:45:0;;;550:34;15004:45;14997:52;;;;;;;14967:17710;15077:5;15065:9;:17;15061:17616;;;-1:-1:-1;;;;15091:41:0;-1:-1:-1;15091:41:0;;-1:-1:-1;;15091:41:0;15061:17616;15157:14;15153:92;;15185:1;15173:13;;15153:92;;;-1:-1:-1;;;15200:45:0;15153:92;15272:5;15260:9;:17;15256:142;;;-1:-1:-1;;15303:17:0;;15288:32;15256:142;;;15350:5;15338:9;:17;15334:64;;;15381:5;:17;;;15366:32;15334:64;15413:9;:64;;;;;-1:-1:-1;;;15426:10:0;:51;15413:64;15409:99;;;-1:-1:-1;550:34:0;;-1:-1:-1;15488:20:0;;-1:-1:-1;;15488:20:0;15409:99;15524:9;15523:10;:65;;;;;15550:38;15537:10;:51;15523:65;15519:104;;;-1:-1:-1;;;;15606:17:0;-1:-1:-1;15599:24:0;;-1:-1:-1;;15599:24:0;15519:104;-1:-1:-1;;;;;15685:48:0;;;15673:3;15659:17;15746:9;:28;;;;-1:-1:-1;15759:15:0;;;15746:28;15742:109;;;15800:11;;;15840:1;15822:19;15742:109;-1:-1:-1;;;15934:47:0;;;:51;15930:135;;16023:35;16005:53;16062:3;16005:60;15930:135;-1:-1:-1;;;16078:47:0;;:51;16074:135;;16167:35;16149:53;16206:3;16149:60;16074:135;-1:-1:-1;;;16222:47:0;;:51;16218:135;;16311:35;16293:53;16350:3;16293:60;16218:135;-1:-1:-1;;;16366:47:0;;:51;16362:135;;16455:35;16437:53;16494:3;16437:60;16362:135;-1:-1:-1;;;16510:46:0;;:50;16506:134;;16598:35;16580:53;16637:3;16580:60;16506:134;-1:-1:-1;;;16653:46:0;;:50;16649:134;;16741:35;16723:53;16780:3;16723:60;16649:134;-1:-1:-1;;;16796:46:0;;:50;16792:134;;16884:35;16866:53;16923:3;16866:60;16792:134;-1:-1:-1;;;16939:46:0;;:50;16935:134;;17027:35;17009:53;17066:3;17009:60;16935:134;-1:-1:-1;;;17082:45:0;;:49;17078:133;;17169:35;17151:53;17208:3;17151:60;17078:133;-1:-1:-1;;;17224:45:0;;:49;17220:133;;17311:35;17293:53;17350:3;17293:60;17220:133;-1:-1:-1;;;17366:45:0;;:49;17362:133;;17453:35;17435:53;17492:3;17435:60;17362:133;-1:-1:-1;;;17508:45:0;;:49;17504:133;;17595:35;17577:53;17634:3;17577:60;17504:133;-1:-1:-1;;;17650:44:0;;:48;17646:132;;17736:35;17718:53;17775:3;17718:60;17646:132;-1:-1:-1;;;17791:44:0;;:48;17787:132;;17877:35;17859:53;17916:3;17859:60;17787:132;-1:-1:-1;;;17932:44:0;;:48;17928:132;;18018:35;18000:53;18057:3;18000:60;17928:132;-1:-1:-1;;;18073:44:0;;:48;18069:132;;18159:35;18141:53;18198:3;18141:60;18069:132;-1:-1:-1;;;18214:43:0;;:47;18210:131;;18299:35;18281:53;18338:3;18281:60;18210:131;-1:-1:-1;;;18354:43:0;;:47;18350:131;;18439:35;18421:53;18478:3;18421:60;18350:131;-1:-1:-1;;;18494:43:0;;:47;18490:131;;18579:35;18561:53;18618:3;18561:60;18490:131;-1:-1:-1;;;18634:43:0;;:47;18630:131;;18719:35;18701:53;18758:3;18701:60;18630:131;-1:-1:-1;;;18774:42:0;;:46;18770:130;;18858:35;18840:53;18897:3;18840:60;18770:130;-1:-1:-1;;;18913:42:0;;:46;18909:130;;18997:35;18979:53;19036:3;18979:60;18909:130;-1:-1:-1;;;19052:42:0;;:46;19048:130;;19136:35;19118:53;19175:3;19118:60;19048:130;-1:-1:-1;;;19191:42:0;;:46;19187:130;;19275:35;19257:53;19314:3;19257:60;19187:130;-1:-1:-1;;;19330:41:0;;:45;19326:129;;19413:35;19395:53;19452:3;19395:60;19326:129;-1:-1:-1;;;19468:41:0;;:45;19464:129;;19551:35;19533:53;19590:3;19533:60;19464:129;-1:-1:-1;;;19606:41:0;;:45;19602:129;;19689:35;19671:53;19728:3;19671:60;19602:129;-1:-1:-1;;;19744:41:0;;:45;19740:129;;19827:35;19809:53;19866:3;19809:60;19740:129;-1:-1:-1;;;19882:40:0;;:44;19878:128;;19964:35;19946:53;20003:3;19946:60;19878:128;-1:-1:-1;;;20019:40:0;;:44;20015:128;;20101:35;20083:53;20140:3;20083:60;20015:128;-1:-1:-1;;;20156:40:0;;:44;20152:128;;20238:35;20220:53;20277:3;20220:60;20152:128;-1:-1:-1;;;20293:40:0;;:44;20289:128;;20375:35;20357:53;20414:3;20357:60;20289:128;-1:-1:-1;;;20430:39:0;;:43;20426:127;;20511:35;20493:53;20550:3;20493:60;20426:127;-1:-1:-1;;;20566:39:0;;:43;20562:127;;20647:35;20629:53;20686:3;20629:60;20562:127;-1:-1:-1;;;20702:39:0;;:43;20698:127;;20783:35;20765:53;20822:3;20765:60;20698:127;-1:-1:-1;;;20838:39:0;;:43;20834:127;;20919:35;20901:53;20958:3;20901:60;20834:127;-1:-1:-1;;;20974:38:0;;:42;20970:126;;21054:35;21036:53;21093:3;21036:60;20970:126;-1:-1:-1;;;21109:38:0;;:42;21105:126;;21189:35;21171:53;21228:3;21171:60;21105:126;-1:-1:-1;;;21244:38:0;;:42;21240:126;;21324:35;21306:53;21363:3;21306:60;21240:126;-1:-1:-1;;;21379:38:0;;:42;21375:126;;21459:35;21441:53;21498:3;21441:60;21375:126;-1:-1:-1;;;21514:37:0;;:41;21510:125;;21593:35;21575:53;21632:3;21575:60;21510:125;-1:-1:-1;;;21648:37:0;;:41;21644:125;;21727:35;21709:53;21766:3;21709:60;21644:125;-1:-1:-1;;;21782:37:0;;:41;21778:125;;21861:35;21843:53;21900:3;21843:60;21778:125;-1:-1:-1;;;21916:37:0;;:41;21912:125;;21995:35;21977:53;22034:3;21977:60;21912:125;-1:-1:-1;;;22050:36:0;;:40;22046:124;;22128:35;22110:53;22167:3;22110:60;22046:124;-1:-1:-1;;;22183:36:0;;:40;22179:124;;22261:35;22243:53;22300:3;22243:60;22179:124;-1:-1:-1;;;22316:36:0;;:40;22312:124;;22394:35;22376:53;22433:3;22376:60;22312:124;-1:-1:-1;;;22449:36:0;;:40;22445:124;;22527:35;22509:53;22566:3;22509:60;22445:124;22595:22;22582:35;;:39;22578:123;;22659:35;22641:53;22698:3;22641:60;22578:123;22727:22;22714:35;;:39;22710:123;;22791:35;22773:53;22830:3;22773:60;22710:123;22859:22;22846:35;;:39;22842:123;;22923:35;22905:53;22962:3;22905:60;22842:123;22991:22;22978:35;;:39;22974:123;;23055:35;23037:53;23094:3;23037:60;22974:123;23123:21;23110:34;;:38;23106:122;;23186:35;23168:53;23225:3;23168:60;23106:122;23254:21;23241:34;;:38;23237:122;;23317:35;23299:53;23356:3;23299:60;23237:122;23385:21;23372:34;;:38;23368:122;;23448:35;23430:53;23487:3;23430:60;23368:122;23516:21;23503:34;;:38;23499:122;;23579:35;23561:53;23618:3;23561:60;23499:122;23647:20;23634:33;;:37;23630:121;;23709:35;23691:53;23748:3;23691:60;23630:121;23777:20;23764:33;;:37;23760:121;;23839:35;23821:53;23878:3;23821:60;23760:121;23907:20;23894:33;;:37;23890:121;;23969:35;23951:53;24008:3;23951:60;23890:121;24037:20;24024:33;;:37;24020:121;;24099:35;24081:53;24138:3;24081:60;24020:121;24167:19;24154:32;;:36;24150:120;;24228:35;24210:53;24267:3;24210:60;24150:120;24296:19;24283:32;;:36;24279:120;;24357:35;24339:53;24396:3;24339:60;24279:120;24425:19;24412:32;;:36;24408:120;;24486:35;24468:53;24525:3;24468:60;24408:120;-1:-1:-1;;;24541:32:0;;:36;24537:120;;24615:35;24597:53;24654:3;24597:60;24537:120;24683:18;24670:31;;:35;24666:119;;24743:35;24725:53;24782:3;24725:60;24666:119;24811:18;24798:31;;:35;24794:119;;24871:35;24853:53;24910:3;24853:60;24794:119;24939:18;24926:31;;:35;24922:119;;24999:35;24981:53;25038:3;24981:60;24922:119;25067:18;25054:31;;:35;25050:119;;25127:35;25109:53;25166:3;25109:60;25050:119;25195:17;25182:30;;:34;25178:118;;25254:35;25236:53;25293:3;25236:60;25178:118;25322:17;25309:30;;:34;25305:118;;25381:35;25363:53;25420:3;25363:60;25305:118;25449:17;25436:30;;:34;25432:118;;25508:35;25490:53;25547:3;25490:60;25432:118;25576:17;25563:30;;:34;25559:118;;25635:35;25617:53;25674:3;25617:60;25559:118;25703:16;25690:29;;:33;25686:117;;25761:35;25743:53;25800:3;25743:60;25686:117;25829:16;25816:29;;:33;25812:117;;25887:35;25869:53;25926:3;25869:60;25812:117;25955:16;25942:29;;:33;25938:117;;26013:35;25995:53;26052:3;25995:60;25938:117;26081:16;26068:29;;:33;26064:117;;26139:35;26121:53;26178:3;26121:60;26064:117;26207:15;26194:28;;:32;26190:116;;26264:35;26246:53;26303:3;26246:60;26190:116;26332:15;26319:28;;:32;26315:116;;26389:35;26371:53;26428:3;26371:60;26315:116;26457:15;26444:28;;:32;26440:116;;26514:35;26496:53;26553:3;26496:60;26440:116;26582:15;26569:28;;:32;26565:116;;26639:35;26621:53;26678:3;26621:60;26565:116;26707:14;26694:27;;:31;26690:115;;26763:35;26745:53;26802:3;26745:60;26690:115;26831:14;26818:27;;:31;26814:115;;26887:35;26869:53;26926:3;26869:60;26814:115;26955:14;26942:27;;:31;26938:115;;27011:35;26993:53;27050:3;26993:60;26938:115;27079:14;27066:27;;:31;27062:115;;27135:35;27117:53;27174:3;27117:60;27062:115;27203:13;27190:26;;:30;27186:114;;27258:35;27240:53;27297:3;27240:60;27186:114;27326:13;27313:26;;:30;27309:114;;27381:35;27363:53;27420:3;27363:60;27309:114;27449:13;27436:26;;:30;27432:114;;27504:35;27486:53;27543:3;27486:60;27432:114;27572:13;27559:26;;:30;27555:114;;27627:35;27609:53;27666:3;27609:60;27555:114;27695:12;27682:25;;:29;27678:113;;27749:35;27731:53;27788:3;27731:60;27678:113;27817:12;27804:25;;:29;27800:113;;27871:35;27853:53;27910:3;27853:60;27800:113;27939:12;27926:25;;:29;27922:113;;27993:35;27975:53;28032:3;27975:60;27922:113;28061:12;28048:25;;:29;28044:113;;28115:35;28097:53;28154:3;28097:60;28044:113;28183:11;28170:24;;:28;28166:112;;28236:35;28218:53;28275:3;28218:60;28166:112;28304:11;28291:24;;:28;28287:112;;28357:35;28339:53;28396:3;28339:60;28287:112;28425:11;28412:24;;:28;28408:112;;28478:35;28460:53;28517:3;28460:60;28408:112;28546:11;28533:24;;:28;28529:112;;28599:35;28581:53;28638:3;28581:60;28529:112;28667:10;28654:23;;:27;28650:111;;28719:35;28701:53;28758:3;28701:60;28650:111;28787:10;28774:23;;:27;28770:111;;28839:35;28821:53;28878:3;28821:60;28770:111;28907:10;28894:23;;:27;28890:111;;28959:35;28941:53;28998:3;28941:60;28890:111;29027:10;29014:23;;:27;29010:111;;29079:35;29061:53;29118:3;29061:60;29010:111;29147:9;29134:22;;:26;29130:110;;29198:35;29180:53;29237:3;29180:60;29130:110;29266:9;29253:22;;:26;29249:110;;29317:35;29299:53;29356:3;29299:60;29249:110;29385:9;29372:22;;:26;29368:110;;29436:35;29418:53;29475:3;29418:60;29368:110;29504:9;29491:22;;:26;29487:110;;29555:35;29537:53;29594:3;29537:60;29487:110;29623:8;29610:21;;:25;29606:109;;29673:35;29655:53;29712:3;29655:60;29606:109;29741:8;29728:21;;:25;29724:109;;29791:35;29773:53;29830:3;29773:60;29724:109;29859:8;29846:21;;:25;29842:109;;29909:35;29891:53;29948:3;29891:60;29842:109;29977:8;29964:21;;:25;29960:109;;30027:35;30009:53;30066:3;30009:60;29960:109;30095:7;30082:20;;:24;30078:108;;30144:35;30126:53;30183:3;30126:60;30078:108;30212:7;30199:20;;:24;30195:108;;30261:35;30243:53;30300:3;30243:60;30195:108;30329:7;30316:20;;:24;30312:108;;30378:35;30360:53;30417:3;30360:60;30312:108;30446:7;30433:20;;:24;30429:108;;30495:35;30477:53;30534:3;30477:60;30429:108;30563:6;30550:19;;:23;30546:107;;30611:35;30593:53;30650:3;30593:60;30546:107;30679:6;30666:19;;:23;30662:107;;30727:35;30709:53;30766:3;30709:60;30662:107;30795:6;30782:19;;:23;30778:107;;30843:35;30825:53;30882:3;30825:60;30778:107;30911:6;30898:19;;:23;30894:107;;30959:35;30941:53;30998:3;30941:60;30894:107;31027:5;31014:18;;:22;31010:106;;31074:35;31056:53;31113:3;31056:60;31010:106;31142:5;31129:18;;:22;31125:106;;31189:35;31171:53;31228:3;31171:60;31125:106;31257:5;31244:18;;:22;31240:106;;31304:35;31286:53;31343:3;31286:60;31240:106;31372:5;31359:18;;:22;31355:106;;31419:35;31401:53;31458:3;31401:60;31355:106;31487:4;31474:17;;:21;31470:105;;31533:35;31515:53;31572:3;31515:60;31470:105;31601:4;31588:17;;:21;31584:105;;31647:35;31629:53;31686:3;31629:60;31584:105;31715:4;31702:17;;:21;31698:105;;31761:35;31743:53;31800:3;31743:60;31698:105;31829:4;31816:17;;:21;31812:105;;31875:35;31857:53;31914:3;31857:60;31812:105;31943:3;31930:16;;:20;31926:104;;31988:35;31970:53;32027:3;31970:60;31926:104;32056:3;32043:16;;:20;32039:104;;32101:35;32083:53;32140:3;32083:60;32039:104;32159:9;32154:439;;32218:2;32199:15;:21;;-1:-1:-1;;;;;32199:54:0;32181:72;;32282:6;32264:24;;;;32154:439;;;32326:6;32308:14;:24;32304:289;;32382:2;32363:15;:21;;-1:-1:-1;;;;;32363:54:0;32345:72;;32454:14;32445:6;:23;32428:40;;32304:289;;;32582:1;;-1:-1:-1;;32532:22:0;32513:41;32304:289;32646:3;32628:21;;;;:39;32610:59;;;-1:-1:-1;32603:66:0;;-1:-1:-1;;;32603:66:0

Swarm Source

ipfs://cced869b31121b59bf63f623d266ee1a3c399b98534acc09c54ffd83d1fc8018
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.