ETH Price: $3,442.63 (+4.97%)

Contract

0x4d982203992F75289b9e323117B2b81A27BbfbB6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Layer2

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: contracts/lib/SafeMath.sol

pragma solidity ^0.5.12;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0); // Solidity only automatically asserts when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    uint256 c = a - b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul64(uint64 a, uint64 b) internal pure returns (uint64) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint64 c = a * b;
    require(c / a == b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div64(uint64 a, uint64 b) internal pure returns (uint64) {
    require(b > 0); // Solidity only automatically asserts when dividing by 0
    uint64 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub64(uint64 a, uint64 b) internal pure returns (uint64) {
    require(b <= a);
    uint64 c = a - b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add64(uint64 a, uint64 b) internal pure returns (uint64) {
    uint64 c = a + b;
    require(c >= a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod64(uint64 a, uint64 b) internal pure returns (uint64) {
    require(b != 0);
    return a % b;
  }
}

// File: contracts/lib/Math.sol

pragma solidity ^0.5.12;

/**
 * @title Math
 * @dev Assorted math operations
 */
library Math {
  function max(uint256 a, uint256 b) internal pure returns (uint256) {
    return a >= b ? a : b;
  }

  function min(uint256 a, uint256 b) internal pure returns (uint256) {
    return a < b ? a : b;
  }

  function average(uint256 a, uint256 b) internal pure returns (uint256) {
    // (a + b) / 2 can overflow, so we distribute
    return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
  }

  // return ceil(n/d)
  function divCeil(uint256 n, uint256 d) internal pure returns (uint256) {
    return n % d == 0 ? n / d : n / d + 1;
  }
}

// File: contracts/lib/RLP.sol

pragma solidity ^0.5.12;

/**
 * @title RLPReader
 * @dev RLPReader is used to read and parse RLP encoded data in memory.
 * @author Andreas Olofsson ([email protected])
 */


library RLP {
    uint constant DATA_SHORT_START = 0x80;
    uint constant DATA_LONG_START = 0xB8;
    uint constant LIST_SHORT_START = 0xC0;
    uint constant LIST_LONG_START = 0xF8;

    uint constant DATA_LONG_OFFSET = 0xB7;
    uint constant LIST_LONG_OFFSET = 0xF7;



    struct RLPItem {
        uint _unsafeMemPtr;    // Pointer to the RLP-encoded bytes.
        uint _unsafeLength;    // Number of bytes. This is the full length of the string.
    }

    struct Iterator {
        RLPItem _unsafeItem;   // Item that's being iterated over.
        uint _unsafeNextPtr;   // Position of the next item in the list.
    }

    /* RLPItem */

    /// @dev Creates an RLPItem from an array of RLP encoded bytes.
    /// @param self The RLP encoded bytes.
    /// @return An RLPItem
    function toRLPItem(bytes memory self) internal pure returns (RLPItem memory) {
        uint len = self.length;
        uint memPtr;
        assembly {
            memPtr := add(self, 0x20)
        }
        return RLPItem(memPtr, len);
    }

    /// @dev Get the list of sub-items from an RLP encoded list.
    /// Warning: This requires passing in the number of items.
    /// @param self The RLP item.
    /// @return Array of RLPItems.
    function toList(RLPItem memory self, uint256 numItems) internal pure returns (RLPItem[] memory list) {
        list = new RLPItem[](numItems);
        Iterator memory it = iterator(self);
        uint idx;
        while (idx < numItems) {
            list[idx] = next(it);
            idx++;
        }
    }

    /// @dev Decode an RLPItem into a uint. This will not work if the
    /// RLPItem is a list.
    /// @param self The RLPItem.
    /// @return The decoded string.
    function toUint(RLPItem memory self) internal pure returns (uint data) {
        (uint rStartPos, uint len) = _decode(self);
        assembly {
            data := div(mload(rStartPos), exp(256, sub(32, len)))
        }
    }

    /// @dev Decode an RLPItem into an address. This will not work if the
    /// RLPItem is a list.
    /// @param self The RLPItem.
    /// @return The decoded string.
    function toAddress(RLPItem memory self)
    internal
    pure
    returns (address data)
    {
        (uint rStartPos,) = _decode(self);
        assembly {
            data := div(mload(rStartPos), exp(256, 12))
        }
    }

    /// @dev Create an iterator.
    /// @param self The RLP item.
    /// @return An 'Iterator' over the item.
    function iterator(RLPItem memory self) private pure returns (Iterator memory it) {
        uint ptr = self._unsafeMemPtr + _payloadOffset(self);
        it._unsafeItem = self;
        it._unsafeNextPtr = ptr;
    }

    /* Iterator */
    function next(Iterator memory self) private pure returns (RLPItem memory subItem) {
        uint ptr = self._unsafeNextPtr;
        uint itemLength = _itemLength(ptr);
        subItem._unsafeMemPtr = ptr;
        subItem._unsafeLength = itemLength;
        self._unsafeNextPtr = ptr + itemLength;
    }

    function hasNext(Iterator memory self) private pure returns (bool) {
        RLPItem memory item = self._unsafeItem;
        return self._unsafeNextPtr < item._unsafeMemPtr + item._unsafeLength;
    }

    // Get the payload offset.
    function _payloadOffset(RLPItem memory self)
    private
    pure
    returns (uint)
    {
        uint b0;
        uint memPtr = self._unsafeMemPtr;
        assembly {
            b0 := byte(0, mload(memPtr))
        }
        if (b0 < DATA_SHORT_START)
            return 0;
        if (b0 < DATA_LONG_START || (b0 >= LIST_SHORT_START && b0 < LIST_LONG_START))
            return 1;
        if (b0 < LIST_SHORT_START)
            return b0 - DATA_LONG_OFFSET + 1;
        return b0 - LIST_LONG_OFFSET + 1;
    }

    // Get the full length of an RLP item.
    function _itemLength(uint memPtr)
    private
    pure
    returns (uint len)
    {
        uint b0;
        assembly {
            b0 := byte(0, mload(memPtr))
        }
        if (b0 < DATA_SHORT_START)
            len = 1;
        else if (b0 < DATA_LONG_START)
            len = b0 - DATA_SHORT_START + 1;
    }

    // Get start position and length of the data.
    function _decode(RLPItem memory self)
    private
    pure
    returns (uint memPtr, uint len)
    {
        uint b0;
        uint start = self._unsafeMemPtr;
        assembly {
            b0 := byte(0, mload(start))
        }
        if (b0 < DATA_SHORT_START) {
            memPtr = start;
            len = 1;
            return (memPtr, len);
        }
        if (b0 < DATA_LONG_START) {
            len = self._unsafeLength - 1;
            memPtr = start + 1;
        } else {
            uint bLen;
            assembly {
                bLen := sub(b0, 0xB7) // DATA_LONG_OFFSET
            }
            len = self._unsafeLength - 1 - bLen;
            memPtr = start + bLen + 1;
        }
        return (memPtr, len);
    }

    /// @dev Return the RLP encoded bytes.
    /// @param self The RLPItem.
    /// @return The bytes.
    function toBytes(RLPItem memory self)
    internal
    pure
    returns (bytes memory bts)
    {
        uint len = self._unsafeLength;
        if (len == 0)
            return bts;
        bts = new bytes(len);
        _copyToBytes(self._unsafeMemPtr, bts, len);
    }

    // Assumes that enough memory has been allocated to store in target.
    function _copyToBytes(uint btsPtr, bytes memory tgt, uint btsLen)
    private
    pure
    {
        // Exploiting the fact that 'tgt' was the last thing to be allocated,
        // we can write entire words, and just overwrite any excess.
        assembly {
            {
            // evm operations on words
                let words := div(add(btsLen, 31), 32)
                let rOffset := btsPtr
                let wOffset := add(tgt, 0x20)
                for
                { let i := 0 } // start at arr + 0x20 -> first byte corresponds to length
                lt(i, words)
                { i := add(i, 1) }
                {
                    let offset := mul(i, 0x20)
                    mstore(add(wOffset, offset), mload(add(rOffset, offset)))
                }
                mstore(add(tgt, add(0x20, mload(tgt))), 0)
            }
        }

    }

}

// File: contracts/lib/RLPEncode.sol

pragma solidity ^0.5.12;

/**
 * @title A simple RLP encoding library
 * @author Bakaoh
 */
library RLPEncode {

    uint8 constant STRING_OFFSET = 0x80;
    uint8 constant LIST_OFFSET = 0xc0;

    /**
     * @notice Encode string item
     * @param self The string (ie. byte array) item to encode
     * @return The RLP encoded string in bytes
     */
    function encodeBytes(bytes memory self) internal pure returns (bytes memory) {
        if (self.length == 1 && self[0] <= 0x7f) {
            return self;
        }
        return mergeBytes(encodeLength(self.length, STRING_OFFSET), self);
    }

    /**
     * @notice Encode address
     * @param self The address to encode
     * @return The RLP encoded address in bytes
     */
    function encodeAddress(address self) internal pure returns (bytes memory) {
        bytes memory b;
        assembly {
            let m := mload(0x40)
            mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, self))
            mstore(0x40, add(m, 52))
            b := m
        }
        return encodeBytes(b);
    }

    /**
     * @notice Encode uint
     * @param self The uint to encode
     * @return The RLP encoded uint in bytes
     */
    function encodeUint(uint self) internal pure returns (bytes memory) {
        return encodeBytes(toBinary(self));
    }

    /**
     * @notice Encode int
     * @param self The int to encode
     * @return The RLP encoded int in bytes
     */
    function encodeInt(int self) internal pure returns (bytes memory) {
        return encodeUint(uint(self));
    }

    /**
     * @notice Encode bool
     * @param self The bool to encode
     * @return The RLP encoded bool in bytes
     */
    function encodeBool(bool self) internal pure returns (bytes memory) {
        bytes memory rs = new bytes(1);
        if (self) {
            rs[0] = bytes1(uint8(1));
        }
        return rs;
    }

    /**
     * @notice Encode list of items
     * @param self The list of items to encode, each item in list must be already encoded
     * @return The RLP encoded list of items in bytes
     */
    function encodeList(bytes[] memory self) internal pure returns (bytes memory) {
        bytes memory payload = new bytes(0);
        for (uint i = 0; i < self.length; i++) {
            payload = mergeBytes(payload, self[i]);
        }
        return mergeBytes(encodeLength(payload.length, LIST_OFFSET), payload);
    }

    /**
     * @notice Concat two bytes arrays
     * @dev This should be optimize with assembly to save gas costs
     * @param param1 The first bytes array
     * @param param2 The second bytes array
     * @return The merged bytes array
     */
    function mergeBytes(bytes memory param1, bytes memory param2) internal pure returns (bytes memory) {
        bytes memory merged = new bytes(param1.length + param2.length);
        uint k = 0;
        uint i;
        for (i = 0; i < param1.length; i++) {
            merged[k] = param1[i];
            k++;
        }

        for (i = 0; i < param2.length; i++) {
            merged[k] = param2[i];
            k++;
        }
        return merged;
    }

    /**
     * @notice Encode the first byte, followed by the `length` in binary form if `length` is more than 55.
     * @param length The length of the string or the payload
     * @param offset `STRING_OFFSET` if item is string, `LIST_OFFSET` if item is list
     * @return RLP encoded bytes
     */
    function encodeLength(uint length, uint offset) internal pure returns (bytes memory) {
        require(length < 256**8, "input too long");
        bytes memory rs = new bytes(1);
        if (length <= 55) {
            rs[0] = byte(uint8(length + offset));
            return rs;
        }
        bytes memory bl = toBinary(length);
        rs[0] = byte(uint8(bl.length + offset + 55));
        return mergeBytes(rs, bl);
    }

    /**
     * @notice Encode integer in big endian binary form with no leading zeroes
     * @dev This should be optimize with assembly to save gas costs
     * @param x The integer to encode
     * @return RLP encoded bytes
     */
    function toBinary(uint x) internal pure returns (bytes memory) {
        uint i;
        bytes memory b = new bytes(32);
        assembly {
            mstore(add(b, 32), x)
        }
        for (i = 0; i < 32; i++) {
            if (b[i] != 0) {
                break;
            }
        }
        bytes memory rs = new bytes(32 - i);
        for (uint j = 0; j < rs.length; j++) {
            rs[j] = b[i++];
        }
        return rs;
    }
}

// File: contracts/lib/BMT.sol

pragma solidity ^0.5.12;


library BMT {
  // TODO: remove recursive call
  function getRoot(bytes32[] memory level)
    internal
    view
    returns (bytes32)
  {
    if (level.length == 1) return level[0];

    bytes32[] memory nextLevel = new bytes32[]((level.length + 1) / 2);
    uint i;

    for (; i + 1 < level.length; i += 2) {
      nextLevel[i/2] = keccak256(abi.encodePacked(level[i], level[i+1]));
    }

    if (level.length % 2 == 1) {
      nextLevel[i/2] = keccak256(
        abi.encodePacked(level[level.length - 1], level[level.length - 1])
      );
    }

    return getRoot(nextLevel);
  }

  function checkMembership(
    bytes32 leaf,
    uint256 index,
    bytes32 rootHash,
    bytes memory proof
  )
    internal
    pure
    returns (bool)
  {
    require(proof.length % 32 == 0);

    uint256 numElements = proof.length / 32;
    require(numElements < 16);

    bytes32 proofElement;
    bytes32 computedHash = leaf;

    for (uint256 i = 32; i <= 32 * numElements; i += 32) {
      assembly {
        proofElement := mload(add(proof, i))
      }
      if (index % 2 == 0) {
        computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
      } else {
        computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
      }
      index = index / 2;
    }
    return computedHash == rootHash;
  }
}

// File: contracts/RequestableI.sol

pragma solidity ^0.5.12;

interface RequestableI {
  function applyRequestInRootChain(
    bool isExit,
    uint256 requestId,
    address requestor,
    bytes32 trieKey,
    bytes calldata trieValue
  ) external returns (bool success);

  function applyRequestInChildChain(
    bool isExit,
    uint256 requestId,
    address requestor,
    bytes32 trieKey,
    bytes calldata trieValue
  ) external returns (bool success);
}

// File: contracts/lib/Data.sol

pragma solidity ^0.5.12;






// import "../patricia_tree/PatriciaTree.sol"; // use binary merkle tree



library Data {
  using SafeMath for uint;
  using SafeMath for uint64;
  using Math for *;
  using RLP for *;
  using RLPEncode for *;
  using BMT for *;

  // solium-disable max-len
  bytes4 public constant APPLY_IN_CHILDCHAIN_SIGNATURE = bytes4(keccak256("applyRequestInChildChain(bool,uint256,address,bytes32,bytes)"));
  bytes4 public constant APPLY_IN_ROOTCHAIN_SIGNATURE = bytes4(keccak256("applyRequestInRootChain(bool,uint256,address,bytes32,bytes)"));
  // solium-enable max-len

  address public constant NA = address(0);
  uint public constant NA_TX_GAS_PRICE = 1e9;
  uint public constant NA_TX_GAS_LIMIT = 100000;

  // How many requests can be included in a single request block
  function MAX_REQUESTS() internal pure returns (uint) {
    // TODO: use 100 in production mode
    // return 1000;
    return 20;
  }

  // Timeout for URB submission
  function URE_TIMEOUT() internal pure returns (uint) {
    return 1 hours;
  }

  function decodePos(uint _pos) internal pure returns (uint v1, uint v2) {
    assembly {
      v1 := div(_pos, exp(2, 128))
      v2 := and(_pos, sub(exp(2, 128), 1))
    }
  }

  /**
   * highestFinalizedBlock
   * firstEpochNumber
   * blockToRenew               0 means no renew required
   * forkedBlock                forked block number due to URB submission
   *                            last finalized block is forkedBlockNumber - 1
   * urbEpochNumber
   * lastEpoch
   * lastBlock
   * lastFinalizedBlock
   * timestamp
   * firstEnterEpoch            epoch number of first enter request epoch
   * lastEnterEpoch             epoch number of last enter request epoch
   * nextBlockToRebase
   * rebased                    true if all blocks are rebased
   * epochs                     epochs in this fork
   * blocks                     blocks in this fork
   */
  struct Fork {
    // uint64 blockToRenew;
    uint64 forkedBlock; // TODO: change to forkedEpoch
    uint64 firstEpoch;
    uint64 lastEpoch;
    uint64 firstBlock;
    uint64 lastBlock;
    uint64 lastFinalizedEpoch;
    uint64 lastFinalizedBlock;
    uint64 timestamp;
    uint64 firstEnterEpoch;
    uint64 lastEnterEpoch;
    uint64 nextBlockToRebase;
    bool rebased;
    mapping (uint => Epoch) epochs;
    mapping (uint => PlasmaBlock) blocks;
  }

  function getForkedEpoch(Fork storage self) internal view returns (uint64) {
    require(self.forkedBlock != 0);
    return self.blocks[self.forkedBlock].epochNumber;
  }

  /**
   * @notice Insert a block (ORB / NRB) into the fork.
   */
  function insertBlock(
    Fork storage _f,
    bytes32 _statesRoot,
    bytes32 _transactionsRoot,
    bytes32 _receiptsRoot,
    bool _isRequest,
    bool _userActivated,
    bool _rebase
  )
    internal
    returns (uint epochNumber, uint blockNumber)
  {
    epochNumber = _f.lastEpoch;
    blockNumber = _f.lastBlock.add(1);

    Data.Epoch storage epoch = _f.epochs[epochNumber];

    if (blockNumber == epoch.endBlockNumber + 1) {
      epochNumber += 1;
      _f.lastEpoch = uint64(epochNumber);
      epoch = _f.epochs[epochNumber];
    }

    require(epoch.startBlockNumber <= blockNumber);
    require(_rebase || epoch.endBlockNumber >= blockNumber);

    require(epoch.isRequest == _isRequest);
    require(epoch.userActivated == _userActivated);

    Data.PlasmaBlock storage b = _f.blocks[blockNumber];

    b.epochNumber = uint64(epochNumber);
    b.statesRoot = _statesRoot;
    b.transactionsRoot = _transactionsRoot;
    b.receiptsRoot = _receiptsRoot;
    b.timestamp = uint64(block.timestamp);
    b.isRequest = _isRequest;
    b.userActivated = _userActivated;

    if (_isRequest) {
      b.requestBlockId = uint64(epoch.RE.firstRequestBlockId + blockNumber - epoch.startBlockNumber);
    }

    _f.lastBlock = uint64(blockNumber);
    return (epochNumber, blockNumber);
  }


  /**
   * TODO: implement insert rebased non-request epoch
   * @notice Insert non-request epoch into the fork.
   */
  function insertNRE(
    Fork storage _f,
    uint _epochNumber,
    bytes32 _epochStateRoot,
    bytes32 _epochTransactionsRoot,
    bytes32 _epochReceiptsRoot,
    uint _startBlockNumber,
    uint _endBlockNumber
  )
    internal
  {
    require(_f.lastEpoch.add(1) == _epochNumber);
    require(_f.lastBlock.add(1) == _startBlockNumber);

    Data.Epoch storage epoch = _f.epochs[_epochNumber];

    require(!epoch.isRequest);
    require(!epoch.userActivated);
    require(!epoch.rebase);

    require(epoch.startBlockNumber == _startBlockNumber);
    require(epoch.endBlockNumber == _endBlockNumber);

    epoch.NRE.epochStateRoot = _epochStateRoot;
    epoch.NRE.epochTransactionsRoot = _epochTransactionsRoot;
    epoch.NRE.epochReceiptsRoot = _epochReceiptsRoot;
    epoch.NRE.submittedAt = uint64(block.timestamp);

    _f.lastEpoch = uint64(_epochNumber);
    _f.lastBlock = uint64(_endBlockNumber);
  }

  function getLastEpochNumber(Fork storage _f, bool _isRequest) internal returns (uint) {
    if (_f.epochs[_f.lastEpoch].isRequest == _isRequest) {
      return _f.lastEpoch;
    }

    return _f.lastEpoch - 1;
  }

  // function getFirstNotFinalizedEpochNumber(Fork storage _f, bool _isRequest) internal returns (uint) {
  //   if (_f.epochs[_f.lastEpoch].isRequest == _isRequest) {
  //     return _f.lastEpoch;
  //   }

  //   return _f.lastEpoch - 1;
  // }

  /**
   * @notice Update nextBlockToRebase to next request block containing enter request.
   *         If all ORBs are rebased, return true.
   */
  function checkNextORBToRebase(
    Fork storage _cur,
    Fork storage _pre,
    RequestBlock[] storage _rbs
  ) internal returns (bool finished) {
    uint blockNumber = _cur.nextBlockToRebase;
    uint epochNumber = _pre.blocks[_cur.nextBlockToRebase].epochNumber;
    // uint lastEpochNumber = getLastEpochNumber(_pre, true);

    while (_pre.epochs[epochNumber].initialized) {
      // at the end of epoch
      if (_pre.epochs[epochNumber].endBlockNumber <= blockNumber) {
        epochNumber += 2;
        blockNumber = _pre.epochs[epochNumber].startBlockNumber;
      }

      // skip until epoch has enter request
      while (_pre.epochs[epochNumber].RE.numEnter == 0 && _pre.epochs[epochNumber].initialized) {
        epochNumber += 2;
        blockNumber = _pre.epochs[epochNumber].startBlockNumber;
      }

      // short circuit if all OREs are empty or has no enter
      if (!_pre.epochs[epochNumber].initialized) {
        return true;
      }

      // skip blocks without enter request
      uint endBlockNumber = _pre.epochs[epochNumber].endBlockNumber;
      while (blockNumber <= endBlockNumber) {
        if (_rbs[_pre.blocks[blockNumber].requestBlockId].numEnter > 0) {
          break;
        }
        blockNumber += 1;
      }

      // continue if there is no block containing enter request
      if (blockNumber > endBlockNumber) {
        epochNumber += 2;
        blockNumber = _pre.epochs[epochNumber].startBlockNumber;
        continue;
      }

      // target block number is found
      _cur.nextBlockToRebase = uint64(blockNumber);
      return false;
    }

    // ready to prepare NRE
    return true;
  }

  /**
   * @notice Update nextBlockToRebase to next non request block
   *         If all NRBs are rebased, return true.
   * TODO    What if no ORE' ?
   */
  function checkNextNRBToRebase(
    Fork storage _cur,
    Fork storage _pre
  ) internal returns (bool finished) {
    uint blockNumber = _cur.nextBlockToRebase;
    uint epochNumber = _pre.blocks[blockNumber].epochNumber;

    // at the end of epoch
    if (_pre.epochs[epochNumber].endBlockNumber <= blockNumber) {
      epochNumber += 2;
      blockNumber = _pre.epochs[epochNumber].startBlockNumber;
    } else {
      blockNumber += 1;
    }

    // short circit if all NRE's are rebased
    if (!_pre.epochs[epochNumber].initialized) {
      _cur.nextBlockToRebase = 0;
      return true;
    }

    // short circuit if block is not submitted
    if (_pre.blocks[blockNumber].timestamp == 0) {
      _cur.nextBlockToRebase = 0;
      return true;
    }

    _cur.nextBlockToRebase = uint64(blockNumber);
    return false;
  }

  /**
   *
   * startBlockNumber       first block number of the epoch.
   * endBlockNumber         last block number of the epoch. 0 if the epoch is ORE' / NRE' until ORE' is filled.
   * timestamp              timestamp when the epoch is initialized.
   *                        required for URB / ORB
   * epochStateRoot         merkle root of [block.stateRoot] for block in the epoch.
   * epochTransactionsRoot  merkle root of [block.transactionsRoot] for block in the epoch.
   * epochReceiptsRoot      merkle root of [block.receiptsRoot] for block in the epoch.
   * isEmpty                true if request epoch has no request block
   *                        also and requestStart == requestEnd == previousEpoch.RE.requestEnd
   *                        and startBlockNumber == endBlockNumber == previousEpoch.endBlockNumber
   *                        and firstRequestBlockId == previousEpoch.firstRequestBlockId
   * initialized            true if epoch is initialized
   * isRequest              true in case of URB / ORB
   * userActivated          true in case of URB
   * rebase                 true in case of ORE' or NRE'
   */
  struct Epoch {
    uint64 startBlockNumber;
    uint64 endBlockNumber;
    uint64 timestamp;
    bool isEmpty;
    bool initialized;
    bool isRequest;
    bool userActivated;
    bool rebase;
    RequestEpochMeta RE;
    NonRequestEpochMeta NRE;
  }

  struct NonRequestEpochMeta {
    bytes32 epochStateRoot;
    bytes32 epochTransactionsRoot;
    bytes32 epochReceiptsRoot;
    uint64 submittedAt;
    uint64 finalizedAt;
    bool finalized;
    bool challenging;
    bool challenged;
  }

  /**
   * requestStart           first request id.
   * requestEnd             last request id.
   * firstRequestBlockId    first id of RequestBlock[]
   *                        if epochs is ORE', copy from last request epoch in previous fork
   * numEnter               number of enter request
   * nextEnterEpoch         next request epoch including enter request
   * nextEpoch              next non-empty request epoch
   */
  struct RequestEpochMeta {
    uint64 requestStart;
    uint64 requestEnd;
    uint64 firstRequestBlockId;
    uint64 numEnter;
    uint64 nextEnterEpoch;
    uint64 nextEpoch;
  }

  // function noExit(Epoch storage self) internal returns (bool) {
  //   if (self.rebase) return true;
  //   return self.RE.requestEnd.sub64(self.RE.requestStart).add64(1) == self.RE.firstRequestBlockId;
  // }

  function getNumBlocks(Epoch storage _e) internal view returns (uint) {
    if (_e.isEmpty || _e.rebase && _e.endBlockNumber == 0) return 0;
    return _e.endBlockNumber + 1 - _e.startBlockNumber;
  }

  function getNumRequests(Epoch storage _e) internal view returns (uint) {
    if (_e.isEmpty || _e.rebase && _e.endBlockNumber == 0) return 0;
    return _e.RE.requestEnd + 1 - _e.RE.requestStart;
  }

  function calcNumBlock(uint _rs, uint _re) internal pure returns (uint) {
    return _re.sub(_rs).add(1).divCeil(MAX_REQUESTS());
  }

  /**
   * epochNumber
   * requestBlockId       id of RequestBlock[]
   * timestamp
   * referenceBlock       block number in previous fork
   * statesRoot
   * transactionsRoot
   * receiptsRoot
   * isRequest            true in case of URB & OR
   * userActivated        true in case of URB
   * challenged           true if it is challenge
   * challenging          true if it is being challenged
   * finalized            true if it is successfully finalize
   */
  struct PlasmaBlock {
    uint64 epochNumber;
    uint64 requestBlockId;
    uint64 timestamp;
    uint64 finalizedAt;
    uint64 referenceBlock;
    bytes32 statesRoot;
    bytes32 transactionsRoot;
    bytes32 receiptsRoot;
    bool isRequest;
    bool userActivated;
    bool challenged;
    bool challenging;
    bool finalized;
  }

  /**
   *
   * timestamp
   * isExit
   * isTransfer
   * finalized         true if request is finalized
   * challenged
   * value             ether amount in wei
   * requestor
   * to                requestable contract in root chain
   * trieKey
   * trieValue
   * hash              keccak256 hash of request transaction (in plasma chain)
   */
  struct Request {
    uint64 timestamp;
    bool isExit;
    bool isTransfer;
    bool finalized;
    bool challenged;
    uint128 value;
    address payable requestor;
    address to;
    bytes32 trieKey;
    bytes32 hash;
    bytes trieValue;
  }

  function applyRequestInRootChain(
    Request memory self,
    uint _requestId
  )
    internal
    returns (bool)
  {
    require(gasleft() > NA_TX_GAS_LIMIT + 5000);

    return RequestableI(self.to).applyRequestInRootChain(
      self.isExit,
      _requestId,
      self.requestor,
      self.trieKey,
      self.trieValue
    );
  }

  function toChildChainRequest(
    Request memory self,
    address _to
  )
    internal
    pure
    returns (Request memory out)
  {
    out.isExit = self.isExit;
    out.isTransfer = self.isTransfer;
    out.requestor = self.requestor;

    // Enter request of EtherToken mints PETH to requestor.
    if (!self.isExit && self.isTransfer) {
      out.to = self.requestor;
      bytes memory b = self.trieValue;
      uint128 v;

      assembly {
        v := mload(add(b, 0x20))
      }

      require(v > 0);

      // no trieKey and trieValue for EtherToken enter
      out.value = uint128(v);
    } else {
      out.to = _to;
      out.value = self.value;
      out.trieKey = self.trieKey;
      out.trieValue = self.trieValue;
    }
  }

  /**
   * @notice return tx.data
   */
  function getData(
    Request memory self,
    uint _requestId,
    bool _rootchain
  )
    internal
    pure
    returns (bytes memory out)
  {
    if (self.isTransfer && !self.isExit) {
      return out;
    }

    bytes4 funcSig = _rootchain ? APPLY_IN_ROOTCHAIN_SIGNATURE : APPLY_IN_CHILDCHAIN_SIGNATURE;

    out = abi.encodePacked(
      funcSig,
      abi.encode(
        bytes32(uint(self.isExit ? 1 : 0)),
        _requestId,
        uint256(uint160(self.requestor)),
        self.trieKey,
        self.trieValue
      )
    );
  }

  /**
   * @notice convert Request to TX
   */
  function toTX(
    Request memory self,
    uint _requestId,
    bool _rootchain
  )
    internal
    pure
    returns (TX memory out)
  {
    out.gasPrice = NA_TX_GAS_PRICE;
    out.gasLimit = uint64(NA_TX_GAS_LIMIT);
    out.to = self.to;
    out.value = self.value;
    out.data = getData(self, _requestId, _rootchain);
  }

  /**
   * submitted      true if no more request can be inserted
   *                because epoch is initialized
   * epochNumber    non request epoch number where the request is created
   * requestStart   first request id
   * requestEnd     last request id
   * trie           patricia tree contract address
   */
  struct RequestBlock {
    bool submitted;
    uint64 numEnter;
    uint64 epochNumber;
    uint64 requestStart;
    uint64 requestEnd;
    address trie;
  }

  // function noExit(RequestBlock storage self) internal returns (bool) {
  //   return self.RE.requestEnd.sub64(self.RE.requestStart).add64(1) == self.RE.firstRequestBlockId;
  // }

  function init(RequestBlock storage self) internal {
    /* use binary merkle tree instead of patricia tree
    if (self.trie == address(0)) {
      self.trie = new PatriciaTree();
    }
     */
  }

  function addRequest(
    RequestBlock storage self,
    Request storage _rootchainRequest,  // request in root chain
    Request memory _childchainRequest,  // request in child chain
    uint _requestId
  ) internal {
    _rootchainRequest.hash = hash(toTX(_childchainRequest, _requestId, false));

    /* use binary merkle tree instead of patricia tree
    require(self.trie != address(0));

    uint txIndex = _requestId.sub(self.RE.requestStart);

    bytes memory key = txIndex.encodeUint();
    bytes memory value = toBytes(toTX(_request, _requestId, false));

    PatriciaTree(self.trie).insert(key, value);
    self.transactionsRoot = PatriciaTree(self.trie).getRootHash();
     */
  }

  /*
   * TX for Ethereum transaction
   */
  struct TX {
    uint64 nonce;
    uint256 gasPrice;
    uint64 gasLimit;
    address to;
    uint256 value;
    bytes data;
    uint256 v;
    uint256 r;
    uint256 s;
  }

  function isNATX(TX memory self) internal pure returns (bool) {
    return self.v == 0 && self.r == 0 && self.s == 0;
  }

  // function toTX(bytes memory self) internal pure returns (TX memory out) {
  //   RLP.RLPItem[] memory packArr = self.toRLPItem().toList(9);

  //   out.nonce = uint64(packArr[0].toUint());
  //   out.gasPrice = packArr[1].toUint();
  //   out.gasLimit = uint64(packArr[2].toUint());
  //   out.to = packArr[3].toAddress();
  //   out.value = packArr[4].toUint();
  //   out.data = packArr[5].toBytes();
  //   out.v = packArr[6].toUint();
  //   out.r = packArr[7].toUint();
  //   out.s = packArr[8].toUint();
  // }

  /**
   * @notice Convert TX to RLP-encoded bytes
   */
  function toBytes(TX memory self) internal pure returns (bytes memory out) {
    bytes[] memory packArr = new bytes[](9);

    packArr[0] = self.nonce.encodeUint();
    packArr[1] = self.gasPrice.encodeUint();
    packArr[2] = self.gasLimit.encodeUint();
    packArr[3] = self.to.encodeAddress();
    packArr[4] = self.value.encodeUint();
    packArr[5] = self.data.encodeBytes();
    packArr[6] = self.v.encodeUint();
    packArr[7] = self.r.encodeUint();
    packArr[8] = self.s.encodeUint();

    return packArr.encodeList();
  }

  function hash(TX memory self) internal pure returns (bytes32) {
    bytes memory txBytes = toBytes(self);
    return keccak256(txBytes);
  }

  /**
   * Transaction Receipt
   */

  struct Log {
    address contractAddress;
    bytes32[] topics;
    bytes data;
  }

  struct Receipt {
    uint64 status;
    uint64 cumulativeGasUsed;
    bytes bloom; // 2048 bloom bits, byte[256]
    Log[] logs;
  }

  function toReceipt(bytes memory self) internal pure returns (Receipt memory r) {
    RLP.RLPItem[] memory items = self.toRLPItem().toList(4);

    r.status = uint64(items[0].toUint());
    r.cumulativeGasUsed = uint64(items[1].toUint());
    r.bloom = items[2].toBytes();

    // TODO: parse Logs
    r.logs = new Log[](0);
  }

  function toReceiptStatus(bytes memory self) internal pure returns (uint) {
    RLP.RLPItem[] memory items = self.toRLPItem().toList(4);
    return items[0].toUint();
  }


  /**
   * Helpers
   */

  /**
   * @notice Checks transaction root of a request block
   */
  function _checkTxRoot(
    bytes32 _transactionsRoot,
    RequestBlock storage _rb,
    Request[] storage _rs,
    bool _skipExit
  ) internal {
    uint s = _rb.requestStart;
    uint e = _rb.requestEnd;
    uint n = _skipExit ? _rb.numEnter : e - s + 1;

    require(n > 0);

    bytes32[] memory hashes = new bytes32[](n);

    // TODO: optimize to reduce gas
    uint j = s;
    for (uint i = s; i <= e; i++) {
      if (!_skipExit || !_rs[i].isExit) {
        hashes[j - s] = _rs[i].hash;
        j++;
      }
    }

    require(hashes.getRoot() == _transactionsRoot);

    /* use binary merkle tree instead of patricia tree
    Data.RequestBlock storage ORB = ORBs[fork.blocks[blockNumber].requestBlockId];
    require(_transactionsRoot == ORB.transactionsRoot);
      */
  }
}

// File: contracts/lib/Address.sol

// https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/utils/Address.sol
pragma solidity ^0.5.12;

/**
 * Utility library of inline functions on addresses
 */
library Address {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param account address of the account to check
   * @return whether the target address is a contract
   */
  function isContract(address account) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(account) }
    return size > 0;
  }

}

// File: contracts/lib/Roles.sol

// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/67bca85/contracts/access/Roles.sol
pragma solidity ^0.5.12;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
  struct Role {
    mapping (address => bool) bearer;
  }

  /**
   * @dev Give an account access to this role.
   */
  function add(Role storage role, address account) internal {
    require(!has(role, account));
    role.bearer[account] = true;
  }

  /**
   * @dev Remove an account's access to this role.
   */
  function remove(Role storage role, address account) internal {
    require(has(role, account));
    role.bearer[account] = false;
  }

  /**
   * @dev Check if an account has this role.
   * @return bool
   */
  function has(Role storage role, address account) internal view returns (bool) {
    require(account != address(0));
    return role.bearer[account];
  }
}

// File: contracts/roles/MapperRole.sol

pragma solidity ^0.5.12;



contract MapperRole {
  using Roles for Roles.Role;

  event MapperAdded(address indexed account);
  event MapperRemoved(address indexed account);

  Roles.Role private _mappers;

  constructor () internal {
    _addMapper(msg.sender);
  }

  modifier onlyMapper() {
    require(isMapper(msg.sender));
    _;
  }

  function isMapper(address account) public view returns (bool) {
    return _mappers.has(account);
  }

  function addMapper(address account) public onlyMapper {
    _addMapper(account);
  }

  function renounceMapper() public {
    _removeMapper(msg.sender);
  }

  function _addMapper(address account) internal {
    _mappers.add(account);
    emit MapperAdded(account);
  }

  function _removeMapper(address account) internal {
    _mappers.remove(account);
    emit MapperRemoved(account);
  }
}

// File: contracts/roles/SubmitterRole.sol

pragma solidity ^0.5.12;



contract SubmitterRole {
  using Roles for Roles.Role;

  event SubmitterAdded(address indexed account);
  event SubmitterRemoved(address indexed account);

  Roles.Role private _submitters;

  constructor () internal {
    _addSubmitter(msg.sender);
  }

  modifier onlySubmitter() {
    require(isSubmitter(msg.sender));
    _;
  }

  function isSubmitter(address account) public view returns (bool) {
    return _submitters.has(account);
  }

  function addSubmitter(address account) public onlySubmitter {
    _addSubmitter(account);
  }

  function renounceSubmitter() public {
    _removeSubmitter(msg.sender);
  }

  function _addSubmitter(address account) internal {
    _submitters.add(account);
    emit SubmitterAdded(account);
  }

  function _removeSubmitter(address account) internal {
    _submitters.remove(account);
    emit SubmitterRemoved(account);
  }
}

// File: contracts/Layer2Storage.sol

pragma solidity ^0.5.12;



contract Layer2Storage {
  /*
   * Storage
   */
  bool public development; // dev mode
  address public operator;
  address public epochHandler;
  address public submitHandler;
  address public etherToken;
  address public seigManager;

  // 1 epoch = N NRBs or k URBs or k ORBs.
  // N consecutive NRBs must be submitted in an epoch. In case of request block,
  // massive requests can be included in k ORBs, and k is determined when
  // N NRBs are submitted or when preparing URBs submission.
  uint public NRELength;

  // Increase for each URB
  uint public currentFork;

  // First not-empty request epochs of a fork
  mapping (uint => uint) public firstFilledORENumber;

  mapping (uint => Data.Fork) public forks;

  // Enter & Exit requests for ORB / URB
  Data.Request[] public EROs;
  Data.Request[] public ERUs;

  // Consecutive request block. The fork where they are in is defined in Data.PlasmaBlock
  Data.RequestBlock[] public ORBs;
  Data.RequestBlock[] public URBs;

  // count enter requests for epoch
  uint public numEnterForORB;

  // epoch number of last non-empty request epoch.
  mapping(uint => uint) public lastNonEmptyRequestEpoch;

  // epoch number of first non-empty request epoch.
  mapping(uint => uint) public firstNonEmptyRequestEpoch;

  // Last applied request
  uint public lastAppliedForkNumber;
  uint public lastAppliedEpochNumber;
  uint public lastAppliedBlockNumber;

  // solium-disable mixedcase
  uint public EROIdToFinalize;
  uint public ERUIdToFinalize;
  // solium-enable mixedcase

  // uint public finalizableEROId = 2^256 - 1;
  // uint public finalizableERUId = 2^256 - 1;

  // Requestable contract address in child chain
  mapping (address => address) public requestableContracts;

  /*
   * Constant
   */
  address constant public NULL_ADDRESS = 0x0000000000000000000000000000000000000000;

  // Cost parameters for development and test
  uint public constant COST_ERO = 0;
  uint public constant COST_ERU = 0;
  uint public constant COST_URB_PREPARE = 0;
  uint public constant COST_URB = 0;
  uint public constant COST_ORB = 0;
  uint public constant COST_NRB = 0;
  uint public constant PREPARE_TIMEOUT = 60; // 60 sec for dev

  // Challenge periods for computation and withholding
  uint public constant CP_COMPUTATION = 15; // 15 sec for dev
  uint public constant CP_WITHHOLDING = 20; // 20 sec for dev
  uint public constant CP_EXIT = 10; // 10 sec for dev

  // TODO: develop more concrete cost model
  // Cost parameters for production
  // uint public constant COST_ERO = 0.1 ether;         // cost for invalid exit
  // uint public constant COST_ERU = 0.2 ether;         // cost for fork & rebase
  // uint public constant COST_URB_PREPARE = 0.1 ether; // cost for URB prepare
  // uint public constant COST_URB = 0.9 ether;         // cost for fork & rebase
  // uint public constant COST_ORB = 0.1 ether;         // cost for invalid computation
  // uint public constant COST_NRB = 0.1 ether;         // cost for invalid computation
  // uint public constant PREPARE_TIMEOUT = 1 hours;

  // // Challenge periods for computation and withholding
  // uint public constant CP_COMPUTATION = 1 days;
  // uint public constant CP_WITHHOLDING = 7 days;
  // uint public constant CP_EXIT = 1 days;


  // Gas limit for request trasaction
  uint public constant REQUEST_GAS = 100000;

  bool public constant isLayer2 = true;
}

// File: contracts/Layer2Event.sol

pragma solidity ^0.5.12;



contract Layer2Event {
  event OperatorChanged(address _newOperator);

  event SessionTimeout(bool userActivated);

  event Forked(uint newFork, uint epochNumber, uint forkedBlockNumber);

  /**
   * epochNumber          the number of prepared epoch
   * startBlockNumber     first block number of the epoch.
   * endBlockNumber       last block number of the epoch. It is 0 for ORE' and NRE'.
   * requestStart         first request id of the epoch.
   * requestEnd           last request id of the epoch.
   * epochIsEmpty         true if epoch doesn't have block.
   * isRequest            true for ORE and URE.
   * userActivated        true for URE.
   */
  event EpochPrepared(
    uint forkNumber,
    uint epochNumber,
    uint startBlockNumber,
    uint endBlockNumber,
    uint requestStart,
    uint requestEnd,
    bool epochIsEmpty,
    bool isRequest,
    bool userActivated,
    bool rebase
  );

  event EpochFilling(
    uint forkNumber,
    uint epochNumber
  );

  event EpochFilled(
    uint forkNumber,
    uint epochNumber
  );

  event EpochRebased(
    uint forkNumber,
    uint epochNumber,
    uint startBlockNumber,
    uint endBlockNumber,
    uint requestStart,
    uint requestEnd,
    bool epochIsEmpty,
    bool isRequest,
    bool userActivated
  );

  event BlockSubmitted(
    uint fork,
    uint epochNumber,
    uint blockNumber,
    bool isRequest,
    bool userActivated
  );

  event RequestCreated(
    uint requestId,
    address requestor,
    address to,
    uint weiAmount,
    bytes32 trieKey,
    bytes trieValue,
    bool isExit,
    bool userActivated
  );
  event ERUCreated(
    uint requestId,
    address requestor,
    address to,
    bytes trieKey,
    bytes32 trieValue
  );

  event BlockFinalized(uint forkNumber, uint blockNumber);
  event EpochFinalized(
    uint forkNumber,
    uint epochNumber,
    uint startBlockNumber,
    uint endBlockNumber
  );

  // emit when exit is finalized. _userActivated is true for ERU
  event RequestFinalized(uint requestId, bool userActivated);
  event RequestApplied(uint requestId, bool userActivated);
  event RequestChallenged(uint requestId, bool userActivated);

  event RequestableContractMapped(address contractInRootchain, address contractInChildchain);
}

// File: contracts/Layer2Base.sol

pragma solidity ^0.5.12;



/**
 * @notice Layer2Base provides functions to be delegated to other handlers,
 *         EpochHandler, SubmitHandler.
 */
contract Layer2Base is Layer2Storage, Layer2Event {
  /**
   * Constants
   */

  // solium-disable mixedcase
  // EpochHandler functions
  bytes4 constant PREPARE_TO_SUTMIBT_ORB_SIG = bytes4(keccak256("prepareORE()"));
  bytes4 constant PREPARE_TO_SUTMIBT_NRB_SIG = bytes4(keccak256("prepareNRE()"));
  bytes4 constant PREPARE_TO_SUTMIBT_URB_SIG = bytes4(keccak256("prepareToSubmitURB()"));
  bytes4 constant PREPARE_ORE_AFTER_URE_SIG = bytes4(keccak256("prepareOREAfterURE()"));
  bytes4 constant PREPARE_NRE_AFTER_URE_SIG = bytes4(keccak256("prepareNREAfterURE()"));

  // SubmitHandler functions
  bytes4 constant SUBMIT_NRE_SIG = bytes4(keccak256("submitNRE(uint256,uint256,bytes32,bytes32,bytes32)"));
  bytes4 constant SUBMIT_ORB_SIG = bytes4(keccak256("submitORB(uint256,bytes32,bytes32,bytes32)"));
  bytes4 constant SUBMIT_URB_SIG = bytes4(keccak256("submitURB(uint256,bytes32,bytes32,bytes32)"));
  // solium-endable mixedcase

  /**
   * Functions
   */
  // delegate to epoch handler
  function _delegatePrepareORE() internal {
    // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars
    (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_ORB_SIG));
    require(success);
  }

  // delegate to epoch handler
  function _delegatePrepareNRE() internal {
    // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars
    (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_NRB_SIG));
    // (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_NRB_SIG));
    require(success);
  }

  // delegate to epoch handler
  function _delegatePrepareToSubmitURB() internal {
    // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars
    (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_URB_SIG));
    // (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_TO_SUTMIBT_NRB_SIG));
    require(success);
  }

  // delegate to epoch handler
  function _delegatePrepareOREAfterURE() internal {
    // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars
    (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_ORE_AFTER_URE_SIG));
    require(success);
  }

  // delegate to epoch handler
  function _delegatePrepareNREAfterURE() internal {
    // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars
    (bool success, bytes memory returnData) = epochHandler.delegatecall(abi.encodeWithSelector(PREPARE_NRE_AFTER_URE_SIG));
    require(success);
  }

  // delegate to submit handler
  function _delegateSubmitNRE(
    uint _pos1, // forknumber + epochNumber
    uint _pos2, // startBlockNumber + endBlockNumber
    bytes32 _epochStateRoot,
    bytes32 _epochTransactionsRoot,
    bytes32 _epochReceiptsRoot
  )
    internal
    returns (bool success)
  {
    // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars
    (bool success, bytes memory returnData) = submitHandler.delegatecall(abi.encodeWithSelector(
      SUBMIT_NRE_SIG,
      _pos1,
      _pos2,
      _epochStateRoot,
      _epochTransactionsRoot,
      _epochReceiptsRoot
    ));
    require(success);
    return true;
  }

  // delegate to submit handler
  function _delegateSubmitORB(
    uint _pos,
    bytes32 _statesRoot,
    bytes32 _transactionsRoot,
    bytes32 _receiptsRoot
  )
    internal
    returns (bool success)
  {
    // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars
    (bool success, bytes memory returnData) = submitHandler.delegatecall(abi.encodeWithSelector(
      SUBMIT_ORB_SIG,
      _pos,
      _statesRoot,
      _transactionsRoot,
      _receiptsRoot
    ));
    require(success);
    return true;
  }

  // delegate to submit handler
  function _delegateSubmitURB(
    uint _pos,
    bytes32 _statesRoot,
    bytes32 _transactionsRoot,
    bytes32 _receiptsRoot
  )
    internal
    returns (bool success)
  {
    // solium-disable-next-line security/no-low-level-calls, max-len, no-unused-vars
    (bool success, bytes memory returnData) = submitHandler.delegatecall(abi.encodeWithSelector(
      SUBMIT_URB_SIG,
      _pos,
      _statesRoot,
      _transactionsRoot,
      _receiptsRoot
    ));
    require(success);
    return true;
  }
}

// File: contracts/Layer2.sol

pragma solidity ^0.5.12;
pragma experimental ABIEncoderV2;





// import "./patricia_tree/PatriciaTreeFace.sol";







contract Layer2 is Layer2Storage, Layer2Event, Layer2Base, MapperRole, SubmitterRole {
  using SafeMath for uint;
  using SafeMath for uint64;
  using Math for *;
  using Data for *;
  using Address for address;
  using BMT for *;

  /*
   * Modifiers
   */
  modifier onlyOperator() {
    require(msg.sender == operator);
    _;
  }

  modifier onlyValidCost(uint _expected) {
    require(msg.value >= _expected);
    _;
  }

  modifier finalizeBlocks() {
    if (!development) {
      _finalizeBlock();
    }
    _;
  }

  modifier checkURBSubmission () {
    Data.Fork storage fork = forks[currentFork];
    if (fork.timestamp + Data.URE_TIMEOUT() < block.timestamp) {
      // TODO: reset fork
      fork.forkedBlock = 0;
    }
    _;
  }

  modifier onlyOperatorOrSeigManager () {
    require(msg.sender == operator || msg.sender == seigManager);
    _;
  }

  /*
   * Constructor
   */
  constructor(
    address _epochHandler,
    address _submitHandler,
    address _etherToken,
    bool _development,
    uint _NRELength,

    // genesis block state
    bytes32 _statesRoot,
    bytes32 _transactionsRoot,
    bytes32 _receiptsRoot
  )
    public
  {
    require(_epochHandler.isContract());
    require(_submitHandler.isContract());
    require(_etherToken.isContract());

    epochHandler = _epochHandler;
    submitHandler = _submitHandler;
    etherToken = _etherToken;

    development = _development;
    operator = msg.sender;
    NRELength = _NRELength;

    Data.Fork storage fork = forks[currentFork];
    Data.PlasmaBlock storage genesis = fork.blocks[0];
    genesis.statesRoot = _statesRoot;
    genesis.transactionsRoot = _transactionsRoot;
    genesis.receiptsRoot = _receiptsRoot;

    // set up the genesis epoch
    fork.epochs[0].timestamp = uint64(block.timestamp);
    fork.epochs[0].initialized = true;

    // prepare ORE#2
    fork.epochs[2].isEmpty = true;
    fork.epochs[2].isRequest = true;

    _doFinalizeBlock(fork, genesis, 0);
    _doFinalizeNRE(fork, 0);

    _delegatePrepareNRE();
  }

  /*
   * External Functions
   */

  function changeOperator(address _operator) external onlyOperatorOrSeigManager {
    operator = _operator;
    emit OperatorChanged(_operator);
  }

  function addSubmitter(address account) public onlyOperator {
    _addSubmitter(account);
  }

  function addMapper(address account) public onlyOperator {
    _addMapper(account);
  }

  function setSeigManager(address account) public onlyOperatorOrSeigManager {
    seigManager = account;
  }

  /**
   * @notice map requestable contract in child chain
   * NOTE: only operator?
   */
  function mapRequestableContractByOperator(address _layer2, address _childchain)
    external
    onlyMapper
    returns (bool success)
  {
    require(_layer2.isContract());
    require(requestableContracts[_layer2] == address(0));

    requestableContracts[_layer2] = _childchain;

    emit RequestableContractMapped(_layer2, _childchain);
    return true;
  }

  function getNumEROs() external view returns (uint) {
    return EROs.length;
  }

  function getNumORBs() external view returns (uint) {
    return ORBs.length;
  }

  function getEROBytes(uint _requestId) public view returns (bytes memory out) {
    Data.Request storage ERO = EROs[_requestId];

    return ERO.toChildChainRequest(requestableContracts[ERO.to])
      .toTX(_requestId, false)
      .toBytes();
  }

  /**
   * @notice Declare to submit URB.
   */
  function prepareToSubmitURB()
    public
    payable
    onlyValidCost(COST_URB_PREPARE)
    // finalizeBlocks
  {
    // TODO: change to continuous rebase scheme.
    // disable UAF.
    revert();
    // return false;
    // Layer2Base.prepareToSubmitURB();
  }

  function submitNRE(
    uint _pos1, // forknumber + epochNumber
    uint _pos2, // startBlockNumber + endBlockNumber
    bytes32 _epochStateRoot,
    bytes32 _epochTransactionsRoot,
    bytes32 _epochReceiptsRoot
  )
    external
    payable
    onlySubmitter
    onlyValidCost(COST_NRB)
    finalizeBlocks
    returns (bool success)
  {
    return Layer2Base._delegateSubmitNRE(
      _pos1,
      _pos2,
      _epochStateRoot,
      _epochTransactionsRoot,
      _epochReceiptsRoot
    );
  }

  function submitORB(
    uint _pos,
    bytes32 _statesRoot,
    bytes32 _transactionsRoot,
    bytes32 _receiptsRoot
  )
    external
    payable
    onlySubmitter
    onlyValidCost(COST_NRB)
    finalizeBlocks
    returns (bool success)
  {
    return Layer2Base._delegateSubmitORB(
      _pos,
      _statesRoot,
      _transactionsRoot,
      _receiptsRoot
    );
  }

  function submitURB(
    uint _pos,
    bytes32 _statesRoot,
    bytes32 _transactionsRoot,
    bytes32 _receiptsRoot
  )
    external
    payable
    onlyValidCost(COST_URB)
    returns (bool success)
  {
    // TODO: change to continuous rebase scheme.
    // disable UAF.
    revert();
    return false;

    // return Layer2Base._delegateSubmitURB(
    //   _pos,
    //   _statesRoot,
    //   _transactionsRoot,
    //   _receiptsRoot
    // );
  }

  function finalizeBlock() external returns (bool success) {
    require(_finalizeBlock());
    return true;
  }

  /**
   * @notice Computation verifier contract reverts the block in case of wrong
   *         computation.
   */
  /* function revertBlock(uint _forkNumber, uint _blockNumber) external {
    // TODO: make a new fork?
  } */

  function challengeExit(
    uint _forkNumber,
    uint _blockNumber,
    uint _index,
    bytes calldata _receiptData,
    bytes calldata _proof
  ) external {
    Data.Fork storage fork = forks[_forkNumber];
    Data.PlasmaBlock storage pb = fork.blocks[_blockNumber];

    require(pb.isRequest);
    require(pb.finalized);

    uint requestId;
    bool userActivated = pb.userActivated;

    if (userActivated) {
      requestId = _doChallengeExit(pb, URBs[pb.requestBlockId], ERUs, _index, _receiptData, _proof);
      // TODO: dynamic cost for ERU
      msg.sender.transfer(COST_ERU);
    } else {
      requestId = _doChallengeExit(pb, ORBs[pb.requestBlockId], EROs,_index, _receiptData, _proof);
      msg.sender.transfer(COST_ERO);
    }

    emit RequestChallenged(requestId, userActivated);
  }

  function _doChallengeExit(
    Data.PlasmaBlock storage _pb,
    Data.RequestBlock storage _rb,
    Data.Request[] storage _rs,
    uint _index,
    bytes memory _receiptData,
    bytes memory _proof
  )
    internal
    returns (uint requestId)
  {
    requestId = _rb.requestStart + _index;
    require(requestId <= _rb.requestEnd);

    Data.Request storage r = _rs[requestId];

    require(_pb.finalizedAt + CP_EXIT > block.timestamp);
    require(_pb.finalized);
    require(!r.challenged);
    require(!r.finalized);

    bytes32 leaf = keccak256(_receiptData);

    require(_receiptData.toReceiptStatus() == 0);
    if (!development) {
      require(BMT.checkMembership(leaf, _index, _pb.receiptsRoot, _proof));
    }

    r.challenged = true;

    return requestId;
  }

  /**
   * @notice It challenges on NRBs containing null address transaction.
   */
  function challengeNullAddress(
    uint _blockNumber,
    bytes calldata _key,
    bytes calldata _txByte, // RLP encoded transaction
    uint _branchMask,
    bytes32[] calldata  _siblings
  ) external {
    Data.Fork storage fork = forks[currentFork];
    Data.PlasmaBlock storage pb = fork.blocks[_blockNumber];

    // check if the plasma block is NRB
    require(!pb.isRequest);

    // check if challenge period does not end yet
    require(pb.timestamp + CP_COMPUTATION > block.timestamp);

    // PatriciaTreeFace trie;
    // if (pb.userActivated) {
    //   trie = PatriciaTreeFace(URBs[pb.requestBlockId].trie);
    // } else {
    //   trie = PatriciaTreeFace(ORBs[pb.requestBlockId].trie);
    // }

    // Data.TX memory txData = Data.toTX(_txByte);
    // require(txData.isNATX());

    // TODO: use patricia verify library
    // require(trie.verifyProof(pb.transactionsRoot, _key, _txByte, _branchMask, _siblings));

    // TODO: fork? penalize?
  }

  /*
   * Public Functions
   */
  function startExit(
    address _to,
    bytes32 _trieKey,
    bytes memory _trieValue
  )
    public
    payable
    onlyValidCost(COST_ERO)
    returns (bool success)
  {
    uint requestId;
    requestId = _storeRequest(EROs, ORBs, _to, 0, _trieKey, _trieValue, true, false);

    emit RequestCreated(requestId, msg.sender, _to, 0, _trieKey, _trieValue, true, false);
    return true;
  }

  function startEnter(
    address _to,
    bytes32 _trieKey,
    bytes memory _trieValue
  )
    public
    payable
    returns (bool success)
  {
    uint requestId;
    uint weiAmount = msg.value;
    requestId = _storeRequest(EROs, ORBs, _to, weiAmount, _trieKey, _trieValue, false, false);
    numEnterForORB += 1;

    Data.Fork storage fork = forks[currentFork];

    emit RequestApplied(requestId, false);
    emit RequestCreated(requestId, msg.sender, _to, weiAmount, _trieKey, _trieValue, false, false);
    return true;
  }

  function makeERU(
    address _to,
    bytes32 _trieKey,
    bytes memory _trieValue
  )
    public
    payable
    onlyValidCost(COST_ERU)
    returns (bool success)
  {
    uint requestId;
    requestId = _storeRequest(ERUs, URBs, _to, 0, _trieKey, _trieValue, true, true);

    emit RequestCreated(requestId, msg.sender, _to, 0, _trieKey, _trieValue, true, true);
    return true;
  }

  /**
   * @notice Finalize a request if request block including it
   *         is finalized.
   * TODO: refactor implementation
   */
  function finalizeRequest() public returns (bool success) {
    uint requestId;
    Data.Fork storage fork = forks[lastAppliedForkNumber];
    uint epochNumber = lastAppliedEpochNumber;

    require(lastAppliedBlockNumber <= fork.lastBlock);

    Data.PlasmaBlock storage pb = fork.blocks[lastAppliedBlockNumber];
    Data.Epoch storage epoch = fork.epochs[epochNumber];

    // TODO: execute after finding next request block
    // find next fork
    if (fork.forkedBlock != 0 && lastAppliedBlockNumber >= fork.forkedBlock) {
      lastAppliedForkNumber += 1;
      fork = forks[lastAppliedForkNumber];

      epochNumber = fork.firstEpoch;
      epoch = fork.epochs[epochNumber];

      lastAppliedBlockNumber = fork.firstBlock;
      lastAppliedEpochNumber = epochNumber;

      pb = fork.blocks[lastAppliedBlockNumber];
    }

    // find next request block
    if (!pb.isRequest) {
      if (epochNumber == 0) {
        epochNumber = firstNonEmptyRequestEpoch[lastAppliedForkNumber];
      } else {
        epochNumber = fork.epochs[epochNumber].RE.nextEpoch;
      }
      require(epochNumber != 0);

      epoch = fork.epochs[epochNumber];
      lastAppliedBlockNumber = epoch.startBlockNumber;
      pb = fork.blocks[lastAppliedBlockNumber];
    } else {
      epochNumber = pb.epochNumber;
      epoch = fork.epochs[epochNumber];
    }

    lastAppliedEpochNumber = epochNumber;

    require(!epoch.isEmpty);
    require(epoch.isRequest);
    require(pb.isRequest);
    require(pb.finalized);
    require(pb.finalizedAt + CP_EXIT <= block.timestamp);

    // apply ERU
    if (pb.userActivated) {
      requestId = ERUIdToFinalize;

      require(ERUs.length > requestId);

      Data.Request storage ERU = ERUs[requestId];
      Data.RequestBlock storage URB = URBs[pb.requestBlockId];

      require(URB.requestStart <= requestId && requestId <= URB.requestEnd);

      // check next block
      if (requestId == URB.requestEnd) {
        if (fork.forkedBlock > 0 && lastAppliedBlockNumber == fork.forkedBlock - 1) {
          lastAppliedForkNumber += 1;
        }

        lastAppliedBlockNumber += 1;
      }

      ERUIdToFinalize = requestId + 1;

      if (ERU.isExit && !ERU.challenged) {
        // NOTE: do not check it reverted or not?
        ERU.applyRequestInRootChain(requestId);
        // TODO: dynamic cost and bond release period
        ERU.requestor.transfer(COST_ERU);
        emit RequestApplied(requestId, true);
      }
      ERU.finalized = true;

      emit RequestFinalized(requestId, true);
      return true;
    }

    // apply ERO
    requestId = EROIdToFinalize;

    require(EROs.length > requestId);

    Data.RequestBlock storage ORB = ORBs[pb.requestBlockId];

    require(ORB.requestStart <= requestId && requestId <= ORB.requestEnd);

    // check next block
    if (requestId == ORB.requestEnd) {
      // TODO: iterator blocks by NRE length for NRE'
      if (fork.forkedBlock > 0 && lastAppliedBlockNumber == fork.forkedBlock - 1) {
        lastAppliedForkNumber += 1;
      }

      lastAppliedBlockNumber += 1;
    }

    Data.Request storage ERO = EROs[requestId];
    EROIdToFinalize = requestId + 1;
    ERO.finalized = true;

    if (ERO.isExit && !ERO.challenged) {
      ERO.applyRequestInRootChain(requestId);
      ERO.requestor.transfer(COST_ERO);
      emit RequestApplied(requestId, false);
    }

    emit RequestFinalized(requestId, false);
    return true;
  }

  function finalizeRequests(uint n) external returns (bool success) {
    for (uint i = 0; i < n; i++) {
      require(finalizeRequest());
    }

    return true;
  }

  /**
   * @notice return the max number of request
   */
  function MAX_REQUESTS() external pure returns (uint maxRequests) {
    return Data.MAX_REQUESTS();
  }

  function lastBlock(uint forkNumber) public view returns (uint lastBlock) {
    return forks[forkNumber].lastBlock;
  }

  function lastEpoch(uint forkNumber) public view returns (uint lastBlock) {
    return forks[forkNumber].lastEpoch;
  }

  function getEpoch(
    uint forkNumber,
    uint epochNumber
  ) external view returns (
    Data.Epoch memory epoch
  ) {
    return forks[forkNumber].epochs[epochNumber];
  }

  function getLastEpoch() public view returns (Data.Epoch memory) {
    return forks[currentFork].epochs[forks[currentFork].lastEpoch];
  }

  function getBlock(
    uint forkNumber,
    uint blockNumber
  ) public view returns (Data.PlasmaBlock memory) {
    return forks[forkNumber].blocks[blockNumber];
  }

  function getBlockFinalizedAt(
    uint forkNumber,
    uint blockNumber
  ) public view returns (uint) {
    return forks[forkNumber].blocks[blockNumber].finalizedAt;
  }

  function getLastFinalizedBlock(uint forkNumber) public view returns (uint) {
    return forks[forkNumber].lastFinalizedBlock;
  }

  function getLastFinalizedEpoch(uint forkNumber) public view returns (uint) {
    return forks[forkNumber].lastFinalizedEpoch;
  }

  /**
   * @notice return true if the chain is forked by URB
   */
  function forked(uint _forkNumber) public view returns (bool result) {
    return _forkNumber != currentFork;
  }

  /**
   * @notice return true if the request is finalized
   */
  function getRequestFinalized(uint _requestId, bool _userActivated) public view returns (bool finalized) {
    if (_userActivated) {
      ERUs[_requestId].finalized;
    }

    return EROs[_requestId].finalized;
  }

  /*
   * Internal Functions
   */
  function _storeRequest(
    Data.Request[] storage _requests,
    Data.RequestBlock[] storage _rbs,
    address _to,
    uint _weiAmount,
    bytes32 _trieKey,
    bytes memory _trieValue,
    bool _isExit,
    bool _userActivated
  )
    internal
    returns (uint requestId)
  {
    // trieValue cannot be longer than 1KB.
    require(_trieValue.length <= 1024);

    bool isTransfer = _to == etherToken;

    // check parameters for simple ether transfer and message-call
    require(isTransfer && !_isExit || (requestableContracts[_to] != address(0)));

    requestId = _requests.length++;
    Data.Request storage r = _requests[requestId];

    r.requestor = msg.sender;
    r.to = _to;
    r.timestamp = uint64(block.timestamp);
    r.isExit = _isExit;
    r.isTransfer = isTransfer;
    r.value = uint128(_weiAmount);
    r.trieKey = _trieKey;
    r.trieValue = _trieValue;

    // apply message-call in case of enter request.
    if (!_isExit) {
      require(r.applyRequestInRootChain(requestId));
    }

    uint requestBlockId = _rbs.length == 0 ? _rbs.length++ : _rbs.length - 1;

    Data.RequestBlock storage rb = _rbs[requestBlockId];

    // make a new RequestBlock.
    if (rb.submitted || rb.requestEnd - rb.requestStart + 1 == Data.MAX_REQUESTS()) {
      rb.submitted = true;
      rb = _rbs[_rbs.length++];
      rb.requestStart = uint64(requestId);
    }

    rb.init();

    rb.requestEnd = uint64(requestId);
    if (!_isExit) {
      rb.numEnter += 1;
    }

    if (isTransfer && !_isExit) {
      rb.addRequest(r, r.toChildChainRequest(msg.sender), requestId);
    } else {
      rb.addRequest(r, r.toChildChainRequest(requestableContracts[_to]), requestId);
    }
  }

  /**
   * @notice finalize a block if possible.
   */
  function _finalizeBlock() internal returns (bool) {
    Data.Fork storage fork = forks[currentFork];

    // short circuit if waiting URBs
    if (fork.forkedBlock != 0) {
      return false;
    }

    uint blockNumber = Math.max(fork.firstBlock, fork.lastFinalizedBlock + 1);

    // short circuit if all blocks are submitted yet
    if (blockNumber > fork.lastBlock) {
      return false;
    }

    Data.PlasmaBlock storage pb = fork.blocks[blockNumber];

    // short circuit if the block is under challenge
    if (pb.challenging) {
      return false;
    }

    // 1. finalize request block
    if (pb.isRequest) {
      // short circuit if challenge period doesn't end
      if (pb.timestamp + CP_COMPUTATION > block.timestamp) {
        return false;
      }

      // finalize block
      _doFinalizeBlock(fork, pb, blockNumber);
      return true;
    }

    // 2. finalize non request epoch
    uint nextEpochNumber = fork.lastFinalizedEpoch + 1;
    while (fork.epochs[nextEpochNumber].isRequest) {
      nextEpochNumber += 1;
    }

    // if the first block of the next request epoch is finalized, finalize all
    // blocks of the current non request epoch.
    if (_checkFinalizableNRE(fork, nextEpochNumber)) {
      _doFinalizeNRE(fork, nextEpochNumber);
      return true;
    }

    return false;
  }

  /**
   * @notice return true if NRE can be finalized.
   */
  function _checkFinalizableNRE(Data.Fork storage fork, uint _epochNumber) internal view returns (bool) {
    // short circuit if epoch is not submitted yet
    if (_epochNumber > fork.lastEpoch) {
      return false;
    }

    Data.Epoch storage epoch = fork.epochs[_epochNumber];

    // short circuit if epoch is not initialized
    if (!epoch.initialized) {
      return false;
    }

    // short circuit if epoch is not NRE
    if (epoch.isRequest) {
      return false;
    }

    // short circuit if epoch is challenged or under challenge
    if (epoch.NRE.challenging || epoch.NRE.challenged) {
      return false;
    }

    // return if challenge period end
    return epoch.NRE.submittedAt + CP_WITHHOLDING <= block.timestamp;
    // return true;
  }

  /**
   * @notice finalize a block
   */
  function _doFinalizeBlock(
    Data.Fork storage _f,
    Data.PlasmaBlock storage _pb,
    uint _blockNumber
  ) internal {
    _pb.finalized = true;
    _pb.finalizedAt = uint64(block.timestamp);

    _f.lastFinalizedBlock = uint64(_blockNumber);
    _f.lastFinalizedEpoch = uint64(_pb.epochNumber);

    emit BlockFinalized(currentFork, _blockNumber);
  }

  /**
   * @notice finalize all blocks in the non request epoch
   */
  function _doFinalizeNRE(
    Data.Fork storage _f,
    uint _epochNumber
  ) internal {
    Data.Epoch storage epoch = _f.epochs[_epochNumber];

    epoch.NRE.finalized = true;
    epoch.NRE.finalizedAt = uint64(block.timestamp);

    _f.lastFinalizedBlock = uint64(epoch.endBlockNumber);
    _f.lastFinalizedEpoch = uint64(_epochNumber);

    // a single EpochFinalized event replaces lots of BlockFinalized events.
    emit EpochFinalized(currentFork, _epochNumber, epoch.startBlockNumber, epoch.endBlockNumber);

    return;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_epochHandler","type":"address"},{"internalType":"address","name":"_submitHandler","type":"address"},{"internalType":"address","name":"_etherToken","type":"address"},{"internalType":"bool","name":"_development","type":"bool"},{"internalType":"uint256","name":"_NRELength","type":"uint256"},{"internalType":"bytes32","name":"_statesRoot","type":"bytes32"},{"internalType":"bytes32","name":"_transactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"_receiptsRoot","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"BlockFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fork","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isRequest","type":"bool"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"BlockSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"address","name":"requestor","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes","name":"trieKey","type":"bytes"},{"indexed":false,"internalType":"bytes32","name":"trieValue","type":"bytes32"}],"name":"ERUCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"}],"name":"EpochFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"}],"name":"EpochFilling","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlockNumber","type":"uint256"}],"name":"EpochFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestEnd","type":"uint256"},{"indexed":false,"internalType":"bool","name":"epochIsEmpty","type":"bool"},{"indexed":false,"internalType":"bool","name":"isRequest","type":"bool"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"},{"indexed":false,"internalType":"bool","name":"rebase","type":"bool"}],"name":"EpochPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forkNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestEnd","type":"uint256"},{"indexed":false,"internalType":"bool","name":"epochIsEmpty","type":"bool"},{"indexed":false,"internalType":"bool","name":"isRequest","type":"bool"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"EpochRebased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFork","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forkedBlockNumber","type":"uint256"}],"name":"Forked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MapperAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MapperRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newOperator","type":"address"}],"name":"OperatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"RequestApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"RequestChallenged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"address","name":"requestor","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"trieKey","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"trieValue","type":"bytes"},{"indexed":false,"internalType":"bool","name":"isExit","type":"bool"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"RequestCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"RequestFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractInRootchain","type":"address"},{"indexed":false,"internalType":"address","name":"contractInChildchain","type":"address"}],"name":"RequestableContractMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"userActivated","type":"bool"}],"name":"SessionTimeout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SubmitterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SubmitterRemoved","type":"event"},{"constant":true,"inputs":[],"name":"COST_ERO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_ERU","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_NRB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_ORB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_URB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COST_URB_PREPARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CP_COMPUTATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CP_EXIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CP_WITHHOLDING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EROIdToFinalize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"EROs","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bool","name":"isExit","type":"bool"},{"internalType":"bool","name":"isTransfer","type":"bool"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"},{"internalType":"uint128","name":"value","type":"uint128"},{"internalType":"address payable","name":"requestor","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"trieKey","type":"bytes32"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"trieValue","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERUIdToFinalize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ERUs","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bool","name":"isExit","type":"bool"},{"internalType":"bool","name":"isTransfer","type":"bool"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"},{"internalType":"uint128","name":"value","type":"uint128"},{"internalType":"address payable","name":"requestor","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"trieKey","type":"bytes32"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"trieValue","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_REQUESTS","outputs":[{"internalType":"uint256","name":"maxRequests","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"NRELength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NULL_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ORBs","outputs":[{"internalType":"bool","name":"submitted","type":"bool"},{"internalType":"uint64","name":"numEnter","type":"uint64"},{"internalType":"uint64","name":"epochNumber","type":"uint64"},{"internalType":"uint64","name":"requestStart","type":"uint64"},{"internalType":"uint64","name":"requestEnd","type":"uint64"},{"internalType":"address","name":"trie","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PREPARE_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REQUEST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"URBs","outputs":[{"internalType":"bool","name":"submitted","type":"bool"},{"internalType":"uint64","name":"numEnter","type":"uint64"},{"internalType":"uint64","name":"epochNumber","type":"uint64"},{"internalType":"uint64","name":"requestStart","type":"uint64"},{"internalType":"uint64","name":"requestEnd","type":"uint64"},{"internalType":"address","name":"trie","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMapper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addSubmitter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_forkNumber","type":"uint256"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes","name":"_receiptData","type":"bytes"},{"internalType":"bytes","name":"_proof","type":"bytes"}],"name":"challengeExit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"bytes","name":"_key","type":"bytes"},{"internalType":"bytes","name":"_txByte","type":"bytes"},{"internalType":"uint256","name":"_branchMask","type":"uint256"},{"internalType":"bytes32[]","name":"_siblings","type":"bytes32[]"}],"name":"challengeNullAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"changeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"currentFork","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"development","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"epochHandler","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"etherToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalizeBlock","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalizeRequest","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"finalizeRequests","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"firstFilledORENumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"firstNonEmptyRequestEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_forkNumber","type":"uint256"}],"name":"forked","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"forks","outputs":[{"internalType":"uint64","name":"forkedBlock","type":"uint64"},{"internalType":"uint64","name":"firstEpoch","type":"uint64"},{"internalType":"uint64","name":"lastEpoch","type":"uint64"},{"internalType":"uint64","name":"firstBlock","type":"uint64"},{"internalType":"uint64","name":"lastBlock","type":"uint64"},{"internalType":"uint64","name":"lastFinalizedEpoch","type":"uint64"},{"internalType":"uint64","name":"lastFinalizedBlock","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"firstEnterEpoch","type":"uint64"},{"internalType":"uint64","name":"lastEnterEpoch","type":"uint64"},{"internalType":"uint64","name":"nextBlockToRebase","type":"uint64"},{"internalType":"bool","name":"rebased","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getBlock","outputs":[{"components":[{"internalType":"uint64","name":"epochNumber","type":"uint64"},{"internalType":"uint64","name":"requestBlockId","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"finalizedAt","type":"uint64"},{"internalType":"uint64","name":"referenceBlock","type":"uint64"},{"internalType":"bytes32","name":"statesRoot","type":"bytes32"},{"internalType":"bytes32","name":"transactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"receiptsRoot","type":"bytes32"},{"internalType":"bool","name":"isRequest","type":"bool"},{"internalType":"bool","name":"userActivated","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"},{"internalType":"bool","name":"challenging","type":"bool"},{"internalType":"bool","name":"finalized","type":"bool"}],"internalType":"struct Data.PlasmaBlock","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getBlockFinalizedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"getEROBytes","outputs":[{"internalType":"bytes","name":"out","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"},{"internalType":"uint256","name":"epochNumber","type":"uint256"}],"name":"getEpoch","outputs":[{"components":[{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bool","name":"isEmpty","type":"bool"},{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"bool","name":"isRequest","type":"bool"},{"internalType":"bool","name":"userActivated","type":"bool"},{"internalType":"bool","name":"rebase","type":"bool"},{"components":[{"internalType":"uint64","name":"requestStart","type":"uint64"},{"internalType":"uint64","name":"requestEnd","type":"uint64"},{"internalType":"uint64","name":"firstRequestBlockId","type":"uint64"},{"internalType":"uint64","name":"numEnter","type":"uint64"},{"internalType":"uint64","name":"nextEnterEpoch","type":"uint64"},{"internalType":"uint64","name":"nextEpoch","type":"uint64"}],"internalType":"struct Data.RequestEpochMeta","name":"RE","type":"tuple"},{"components":[{"internalType":"bytes32","name":"epochStateRoot","type":"bytes32"},{"internalType":"bytes32","name":"epochTransactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"epochReceiptsRoot","type":"bytes32"},{"internalType":"uint64","name":"submittedAt","type":"uint64"},{"internalType":"uint64","name":"finalizedAt","type":"uint64"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenging","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"}],"internalType":"struct Data.NonRequestEpochMeta","name":"NRE","type":"tuple"}],"internalType":"struct Data.Epoch","name":"epoch","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLastEpoch","outputs":[{"components":[{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bool","name":"isEmpty","type":"bool"},{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"bool","name":"isRequest","type":"bool"},{"internalType":"bool","name":"userActivated","type":"bool"},{"internalType":"bool","name":"rebase","type":"bool"},{"components":[{"internalType":"uint64","name":"requestStart","type":"uint64"},{"internalType":"uint64","name":"requestEnd","type":"uint64"},{"internalType":"uint64","name":"firstRequestBlockId","type":"uint64"},{"internalType":"uint64","name":"numEnter","type":"uint64"},{"internalType":"uint64","name":"nextEnterEpoch","type":"uint64"},{"internalType":"uint64","name":"nextEpoch","type":"uint64"}],"internalType":"struct Data.RequestEpochMeta","name":"RE","type":"tuple"},{"components":[{"internalType":"bytes32","name":"epochStateRoot","type":"bytes32"},{"internalType":"bytes32","name":"epochTransactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"epochReceiptsRoot","type":"bytes32"},{"internalType":"uint64","name":"submittedAt","type":"uint64"},{"internalType":"uint64","name":"finalizedAt","type":"uint64"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenging","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"}],"internalType":"struct Data.NonRequestEpochMeta","name":"NRE","type":"tuple"}],"internalType":"struct Data.Epoch","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"}],"name":"getLastFinalizedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"}],"name":"getLastFinalizedEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumEROs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumORBs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"},{"internalType":"bool","name":"_userActivated","type":"bool"}],"name":"getRequestFinalized","outputs":[{"internalType":"bool","name":"finalized","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isLayer2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMapper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSubmitter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastAppliedBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastAppliedEpochNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastAppliedForkNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"}],"name":"lastBlock","outputs":[{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"forkNumber","type":"uint256"}],"name":"lastEpoch","outputs":[{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastNonEmptyRequestEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_trieKey","type":"bytes32"},{"internalType":"bytes","name":"_trieValue","type":"bytes"}],"name":"makeERU","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_layer2","type":"address"},{"internalType":"address","name":"_childchain","type":"address"}],"name":"mapRequestableContractByOperator","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"numEnterForORB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"prepareToSubmitURB","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMapper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceSubmitter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"requestableContracts","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"seigManager","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setSeigManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_trieKey","type":"bytes32"},{"internalType":"bytes","name":"_trieValue","type":"bytes"}],"name":"startEnter","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_trieKey","type":"bytes32"},{"internalType":"bytes","name":"_trieValue","type":"bytes"}],"name":"startExit","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"submitHandler","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_pos1","type":"uint256"},{"internalType":"uint256","name":"_pos2","type":"uint256"},{"internalType":"bytes32","name":"_epochStateRoot","type":"bytes32"},{"internalType":"bytes32","name":"_epochTransactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"_epochReceiptsRoot","type":"bytes32"}],"name":"submitNRE","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_pos","type":"uint256"},{"internalType":"bytes32","name":"_statesRoot","type":"bytes32"},{"internalType":"bytes32","name":"_transactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"_receiptsRoot","type":"bytes32"}],"name":"submitORB","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_pos","type":"uint256"},{"internalType":"bytes32","name":"_statesRoot","type":"bytes32"},{"internalType":"bytes32","name":"_transactionsRoot","type":"bytes32"},{"internalType":"bytes32","name":"_receiptsRoot","type":"bytes32"}],"name":"submitURB","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005fbe38038062005fbe83398101604081905262000034916200063e565b62000048336001600160e01b036200026316565b6200005c336001600160e01b03620002b516565b6200007b886001600160a01b03166200030760201b6200359d1760201c565b6200008557600080fd5b620000a4876001600160a01b03166200030760201b6200359d1760201c565b620000ae57600080fd5b620000cd866001600160a01b03166200030760201b6200359d1760201c565b620000d757600080fd5b600180546001600160a01b03199081166001600160a01b038b8116919091179092556002805482168a8416178155600380549092169289169290921781556000805460ff191688151517610100600160a81b031916610100330217815560058790556006548152600860209081526040808320838052600480820184528285208088018b90558087018a90559081018890559481019092528083208054790100000000000000000000000000000000000000000000000000600160801b600160c01b0319909116700100000000000000000000000000000000426001600160401b0316021760ff60c81b191617905593825292812080547a010000000000000000000000000000000000000000000000000000780100000000000000000000000000000000000000000000000060ff60c01b199092169190911760ff60d01b19161790556200022a90839083906200030d565b620002408260006001600160e01b03620003f316565b620002536001600160e01b03620004c916565b50505050505050505050620008b8565b6200027e8160166200059860201b6200386c1790919060201c565b6040516001600160a01b038216907fa199526a01dbcba68aa3ab9d7d06c6692c83fb1a8bcf2184e6d94ad34f5aaf9590600090a250565b620002d08160176200059860201b6200386c1790919060201c565b6040516001600160a01b038216907fb079bc2cbde1f186e0b351d4a87c4597e3ed098f571548617449e73506428d8b90600090a250565b3b151590565b60058201805464010000000060ff60201b1990911617905581546001600160c01b03167801000000000000000000000000000000000000000000000000426001600160401b0390811691909102919091178355600184018054600160801b600160c01b03191670010000000000000000000000000000000084841602178082558454600160401b600160801b0319909116921668010000000000000000029190911790556006546040517ffb96205e4b3633fd57aa805b26b51ecf528714a10241a4af015929dce86768d991620003e6918490620007ad565b60405180910390a1505050565b6000818152600383016020526040908190206006808201805470010000000000000000000000000000000060ff60801b199091168117600160401b600160801b031990811668010000000000000000426001600160401b03908116820292909217909455855460018a018054600160801b600160c01b0319169186900483169094021790911681881684021790915591548354945193947f70801d4d63b3da6c19ba7349911f45bed5a99ccdfb51b8138c105872529bebd594620003e6949293889383811693919091041690620007cc565b5050565b6001546040516000916060916001600160a01b0390911690620004ec90620007a0565b60408051918290038220600483526024830182526020830180516001600160e01b03167fffffffff00000000000000000000000000000000000000000000000000000000909216919091179052516200054691906200078b565b600060405180830381855af49150503d806000811462000583576040519150601f19603f3d011682016040523d82523d6000602084013e62000588565b606091505b509150915081620004c557600080fd5b620005ad82826001600160e01b03620005dd16565b15620005b857600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620005f357600080fd5b506001600160a01b03811660009081526020839052604090205460ff165b92915050565b8051620006118162000888565b80516200061181620008a2565b80516200061181620008ad565b600080600080600080600080610100898b0312156200065c57600080fd5b60006200066a8b8b62000617565b98505060206200067d8b828c0162000617565b9750506040620006908b828c0162000617565b9650506060620006a38b828c0162000624565b9550506080620006b68b828c0162000631565b94505060a0620006c98b828c0162000631565b93505060c0620006dc8b828c0162000631565b92505060e0620006ef8b828c0162000631565b9150509295985092959890939650565b60006200070c8262000812565b62000718818562000816565b93506200072a81856020860162000855565b9290920192915050565b600062000743600c8362000816565b7f707265706172654e5245282900000000000000000000000000000000000000008152600c0192915050565b6200077a816200082d565b82525050565b6200077a8162000848565b6000620007998284620006ff565b9392505050565b6000620006118262000734565b60408101620007bd82856200076f565b6200079960208301846200076f565b60808101620007dc82876200076f565b620007eb60208301866200076f565b620007fa604083018562000780565b62000809606083018462000780565b95945050505050565b5190565b919050565b6000620006118262000830565b151590565b90565b6001600160a01b031690565b6001600160401b031690565b600062000611826200083c565b60005b838110156200087257818101518382015260200162000858565b8381111562000882576000848401525b50505050565b62000893816200081b565b81146200089f57600080fd5b50565b620008938162000828565b62000893816200082d565b6156f680620008c86000396000f3fe6080604052600436106104105760003560e01c80638b5172d01161021e578063c8ad329f11610123578063e259faf7116100ab578063ea0c73f61161007a578063ea0c73f614610ab5578063ea7f22a814610aca578063f28a7afa14610aea578063f4f31de414610b0a578063fb788a2714610b2a57610410565b8063e259faf714610a70578063e6925d0814610a85578063e7b88b8014610a8d578063e7f9650514610aa257610410565b8063d1723a96116100f2578063d1723a96146109ee578063d636857e14610a1b578063d691acd81461044b578063da0185f814610a3b578063de0ce17d14610a5b57610410565b8063c8ad329f14610979578063ca6f63801461098e578063cb5d742f146109ae578063ce8a2bc2146109ce57610410565b8063b2ae9ba8116101a6578063b8066bcb11610175578063b8066bcb146108e8578063c0c49c2a146108fd578063c0e860641461091d578063c2bc88fa1461094f578063c54626cc1461096457610410565b8063b2ae9ba81461044b578063b443f3cc1461087c578063b540adba146108b3578063b6715647146108c857610410565b806399bd3600116101ed57806399bd36001461080a578063a820c0671461081f578063a926fdbc14610832578063ab96da2d14610852578063b17fa6e91461086757610410565b80638b5172d01461044b5780638eb288ca146107e057806393521222146107f557806394be3aa51461044b57610410565b8063404f7d66116103245780636fb7f558116102ac57806378fe705f1161027b57806378fe705f1461076e5780637b929c271461078157806380e3e81d146107965780638155717d146107b6578063882eed2c146107cb57610410565b80636fb7f5581461070457806372ecb9a81461071957806375395a58146107395780637657f20a1461074e57610410565b8063570ca735116102f3578063570ca7351461067a5780635b8846821461069c5780635e0ca71b146106bc5780636299fb24146106d15780636f3e4b90146106f157610410565b8063404f7d66146105d55780634a44bdb8146105f55780634ba3a12614610622578063547685711461065a57610410565b8063183d2d1c116103a75780632aa196c8116103765780632aa196c8146105565780632b25a38b146105695780632dc6bb7b146105965780633565fb0d146105ab578063398bac63146105c057610410565b8063183d2d1c1461050c578063192adc5b1461044b5780631ec2042b14610521578063236915661461054157610410565b806308c4fff0116103e357806308c4fff0146104a25780630eaf45a8146104b757806311e4c914146104d7578063164bc2ae146104f757610410565b8063019dc09914610415578063033cfbed1461044b57806306394c9b14610460578063072900f914610482575b600080fd5b34801561042157600080fd5b506104356104303660046148f7565b610b3f565b6040516104429190615294565b60405180910390f35b34801561045757600080fd5b50610435610b67565b34801561046c57600080fd5b5061048061047b366004614815565b610b6c565b005b34801561048e57600080fd5b5061048061049d366004614815565b610bf8565b3480156104ae57600080fd5b50610435610c20565b6104ca6104c5366004614a9d565b610c25565b6040516104429190615189565b3480156104e357600080fd5b506104356104f23660046148f7565b610c66565b34801561050357600080fd5b50610435610c88565b34801561051857600080fd5b50610435610c8e565b34801561052d57600080fd5b5061043561053c3660046148f7565b610c94565b34801561054d57600080fd5b50610435610cb2565b6104ca610564366004614875565b610cb8565b34801561057557600080fd5b50610589610584366004614a6d565b610d7a565b6040516104429190615276565b3480156105a257600080fd5b506104356110e2565b3480156105b757600080fd5b506104806110e8565b3480156105cc57600080fd5b506105896110f3565b3480156105e157600080fd5b506104806105f0366004614b12565b61148e565b34801561060157600080fd5b50610615610610366004614a6d565b61171a565b6040516104429190615285565b34801561062e57600080fd5b5061064261063d3660046148f7565b61180a565b6040516104429c9b9a999897969594939291906154e2565b34801561066657600080fd5b506104ca6106753660046148f7565b611881565b34801561068657600080fd5b5061068f6118af565b6040516104429190615160565b3480156106a857600080fd5b506104356106b7366004614a6d565b6118c3565b3480156106c857600080fd5b506104806118f4565b3480156106dd57600080fd5b506104806106ec3660046149a6565b6118fd565b6104ca6106ff366004614945565b611960565b34801561071057600080fd5b5061068f611968565b34801561072557600080fd5b506104356107343660046148f7565b611977565b34801561074557600080fd5b506104ca611989565b34801561075a57600080fd5b50610480610769366004614815565b6119a2565b6104ca61077c366004614875565b6119f5565b34801561078d57600080fd5b506104ca611a63565b3480156107a257600080fd5b506104806107b1366004614815565b611a6c565b3480156107c257600080fd5b50610435611a91565b3480156107d757600080fd5b506104ca611a96565b3480156107ec57600080fd5b50610435611a9b565b34801561080157600080fd5b50610435611aa2565b34801561081657600080fd5b506104ca611ab1565b6104ca61082d366004614945565b612351565b34801561083e57600080fd5b506104ca61084d366004614815565b612390565b34801561085e57600080fd5b506104356123a3565b34801561087357600080fd5b506104356123a9565b34801561088857600080fd5b5061089c6108973660046148f7565b6123ae565b6040516104429b9a99989796959493929190615438565b3480156108bf57600080fd5b506104356124cf565b3480156108d457600080fd5b506104356108e33660046148f7565b6124d5565b3480156108f457600080fd5b5061068f6124e7565b34801561090957600080fd5b506104ca610918366004614815565b6124f6565b34801561092957600080fd5b5061093d6109383660046148f7565b612509565b604051610442969594939291906151de565b34801561095b57600080fd5b50610435612570565b34801561097057600080fd5b50610435612575565b34801561098557600080fd5b5061043561257b565b34801561099a57600080fd5b506104356109a93660046148f7565b612581565b3480156109ba57600080fd5b506104ca6109c936600461483b565b612593565b3480156109da57600080fd5b506104ca6109e93660046148f7565b612659565b3480156109fa57600080fd5b50610a0e610a093660046148f7565b612661565b6040516104429190615255565b348015610a2757600080fd5b50610435610a363660046148f7565b61280a565b348015610a4757600080fd5b5061068f610a56366004614815565b61282f565b348015610a6757600080fd5b5061068f610b67565b348015610a7c57600080fd5b5061068f61284a565b610480612859565b348015610a9957600080fd5b5061068f612860565b6104ca610ab0366004614875565b61286f565b348015610ac157600080fd5b506104356128cb565b348015610ad657600080fd5b5061093d610ae53660046148f7565b6128d1565b348015610af657600080fd5b506104ca610b05366004614915565b6128de565b348015610b1657600080fd5b5061089c610b253660046148f7565b612927565b348015610b3657600080fd5b50610435612934565b600081815260086020526040902060010154600160401b90046001600160401b03165b919050565b600081565b60005461010090046001600160a01b0316331480610b9457506004546001600160a01b031633145b610b9d57600080fd5b60008054610100600160a81b0319166101006001600160a01b038416021790556040517f4721129e0e676ed6a92909bb24e853ccdd63ad72280cc2e974e38e480e0e6e5490610bed908390615160565b60405180910390a150565b60005461010090046001600160a01b03163314610c1457600080fd5b610c1d8161293a565b50565b600f81565b6000610c3033612390565b610c3957600080fd5b6000805460ff16610c4e57610c4c612982565b505b610c5b8787878787612af8565b979650505050505050565b600090815260086020526040902054600160801b90046001600160401b031690565b60105481565b60065481565b6000908152600860205260409020600101546001600160401b031690565b600d5481565b60008034610cce6009600b888489898880612bd7565b600d805460010190556006546000908152600860205260408082209051929450917f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c291610d1d91869190615356565b60405180910390a17f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d833389858a8a600080604051610d63989796959493929190615320565b60405180910390a1600193505050505b9392505050565b610d826142f7565b600860008481526020019081526020016000206003016000838152602001908152602001600020604051806101400160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a900460ff161515151581526020016000820160199054906101000a900460ff1615151515815260200160008201601a9054906101000a900460ff1615151515815260200160008201601b9054906101000a900460ff1615151515815260200160008201601c9054906101000a900460ff16151515158152602001600182016040518060c00160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681525050815260200160038201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a900460ff161515151581526020016003820160119054906101000a900460ff161515151581526020016003820160129054906101000a900460ff1615151515815250508152505090505b92915050565b60135481565b6110f1336131f9565b565b6110fb6142f7565b600860006006548152602001908152602001600020600301600060086000600654815260200190815260200160002060000160109054906101000a90046001600160401b03166001600160401b03168152602001908152602001600020604051806101400160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a900460ff161515151581526020016000820160199054906101000a900460ff1615151515815260200160008201601a9054906101000a900460ff1615151515815260200160008201601b9054906101000a900460ff1615151515815260200160008201601c9054906101000a900460ff16151515158152602001600182016040518060c00160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681525050815260200160038201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a900460ff161515151581526020016003820160119054906101000a900460ff161515151581526020016003820160129054906101000a900460ff1615151515815250508152505090505b90565b600087815260086020908152604080832089845260048101909252909120600581015460ff166114bd57600080fd5b6005810154640100000000900460ff166114d657600080fd5b6005810154600090610100900460ff1680156115e2576115af83600c8560000160089054906101000a90046001600160401b03166001600160401b03168154811061151d57fe5b9060005260206000209060020201600a8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061324192505050565b60405190925033906108fc9060009081818181818888f193505050501580156115dc573d6000803e3d6000fd5b506116d4565b6116a583600b8560000160089054906101000a90046001600160401b03166001600160401b03168154811061161357fe5b906000526020600020906002020160098c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061324192505050565b60405190925033906108fc9060009081818181818888f193505050501580156116d2573d6000803e3d6000fd5b505b7fc8135db115644ed4ae193313c4c801235ef740d2a57a8d5e6fe26ab66635698a8282604051611705929190615356565b60405180910390a15050505050505050505050565b611722614357565b506000918252600860209081526040808420928452600492830182529283902083516101a08101855281546001600160401b038082168352600160401b8204811694830194909452600160801b8104841695820195909552600160c01b9094048216606085015260018101549091166080840152600281015460a0840152600381015460c08401529081015460e08301526005015460ff80821615156101008085019190915282048116151561012084015262010000820481161515610140840152630100000082048116151561016084015264010000000090910416151561018082015290565b6008602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b808504831694600160801b808204851695600160c01b92839004861695858116958581048216958482048316959182900483169484841694918204841693908204169160ff9104168c565b6000805b828110156118a657611895611ab1565b61189e57600080fd5b600101611885565b50600192915050565b60005461010090046001600160a01b031681565b600091825260086020908152604080842092845260049092019052902054600160c01b90046001600160401b031690565b6110f13361334c565b60065460009081526008602090815260408083208b845260048101909252909120600581015460ff161561193057600080fd5b8054426001600160401b03600160801b90920491909116600f011161195457600080fd5b50505050505050505050565b600080610410565b6004546001600160a01b031681565b60076020526000908152604090205481565b6000611993612982565b61199c57600080fd5b50600190565b60005461010090046001600160a01b03163314806119ca57506004546001600160a01b031633145b6119d357600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000611a0e600a600c8860008989600180612bd7565b90507f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d81338860008989600180604051611a4f9897969594939291906152a2565b60405180910390a150600195945050505050565b60005460ff1681565b60005461010090046001600160a01b03163314611a8857600080fd5b610c1d81613394565b600a81565b600181565b620186a081565b6000611aac6133dc565b905090565b60105460009081526008602052604081206011546001820154601254849392916001600160401b03161015611ae557600080fd5b601254600090815260048301602090815260408083208484526003860190925290912083546001600160401b031615801590611b2f575083546012546001600160401b0390911611155b15611b9a5750506010805460010190819055600090815260086020908152604080832080546001600160401b03600160401b82048116808752600384018652848720600160c01b90930490911660128190556011829055865260048301909452919093209294509092505b600582015460ff16611c2c5782611bc4576010546000908152600f60205260409020549250611beb565b600092835260038401602052604090922060020154600160401b90046001600160401b0316915b82611bf557600080fd5b50506000818152600383016020908152604080832080546001600160401b0316601281905584526004860190925290912090611c4c565b5080546001600160401b0316600081815260038501602052604090209092505b60118390558054600160c01b900460ff1615611c6757600080fd5b8054600160d01b900460ff16611c7c57600080fd5b600582015460ff16611c8d57600080fd5b6005820154640100000000900460ff16611ca657600080fd5b8154426001600160401b03600160c01b90920491909116600a011115611ccb57600080fd5b6005820154610100900460ff161561203f57601454600a549095508510611cf157600080fd5b6000600a8681548110611d0057fe5b906000526020600020906006020190506000600c8460000160089054906101000a90046001600160401b03166001600160401b031681548110611d3f57fe5b600091825260209091206002909102018054909150600160881b90046001600160401b03168710801590611d80575060018101546001600160401b03168711155b611d8957600080fd5b60018101546001600160401b0316871415611de45785546001600160401b031615801590611dcb575085546012546000196001600160401b0392831601909116145b15611dda576010805460010190555b6012805460010190555b600187016014558154600160401b900460ff168015611e0c57508154600160581b900460ff16155b15611fe357604080516101608101825283546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808601546001600160a01b0390811660c085015260028088015490911660e085015260038701546101008086019190915260048801546101208601526005880180548751948116159092026000190190911691909104601f8101849004840283018401909552848252611f6d948c9493889361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b820191906000526020600020905b815481529060010190602001808311611f3957829003601f168201915b5050505050815250506133e190919063ffffffff16565b5060018201546040516001600160a01b03909116906108fc9060009081818181818888f19350505050158015611fa7573d6000803e3d6000fd5b507f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c2876001604051611fda929190615356565b60405180910390a15b815460ff60501b1916600160501b1782556040517f134017cf3262b18f892ee95dde3b0aec9a80cc70a7c96f09c64bd237aceb047390612027908990600190615356565b60405180910390a1600197505050505050505061148b565b601354600954909550851061205357600080fd5b8154600b8054600092600160401b90046001600160401b031690811061207557fe5b600091825260209091206002909102018054909150600160881b90046001600160401b031686108015906120b6575060018101546001600160401b03168611155b6120bf57600080fd5b60018101546001600160401b031686141561211a5784546001600160401b031615801590612101575084546012546000196001600160401b0392831601909116145b15612110576010805460010190555b6012805460010190555b60006009878154811061212957fe5b6000918252602090912060018901601355600690910201805460ff60501b1916600160501b17808255909150600160401b900460ff16801561217457508054600160581b900460ff16155b1561230957604080516101608101825282546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808501546001600160a01b0390811660c085015260028087015490911660e085015260038601546101008086019190915260048701546101208601526005870180548751948116159092026000190190911691909104601f8101849004840283018401909552848252612293948c9493879361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b5060018101546040516001600160a01b03909116906108fc9060009081818181818888f193505050501580156122cd573d6000803e3d6000fd5b507f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c2876000604051612300929190615356565b60405180910390a15b7f134017cf3262b18f892ee95dde3b0aec9a80cc70a7c96f09c64bd237aceb047387600060405161233b929190615356565b60405180910390a1600197505050505050505090565b600061235c33612390565b61236557600080fd5b6000805460ff1661237a57612378612982565b505b6123868686868661348e565b9695505050505050565b60006110dc60178363ffffffff61356816565b60055481565b601481565b600981815481106123bb57fe5b6000918252602091829020600691909102018054600180830154600280850154600386015460048701546005880180546040805161010099831615999099026000190190911695909504601f81018b90048b0288018b019095528487526001600160401b0388169a50600160401b880460ff9081169a600160481b8a0482169a600160501b8b0483169a600160581b810490931699600160601b9093046001600160801b0316986001600160a01b03908116989716969093918301828280156124c55780601f1061249a576101008083540402835291602001916124c5565b820191906000526020600020905b8154815290600101906020018083116124a857829003601f168201915b505050505090508b565b60095490565b600e6020526000908152604090205481565b6003546001600160a01b031681565b60006110dc60168363ffffffff61356816565b600c818154811061251657fe5b60009182526020909120600290910201805460019091015460ff821692506001600160401b036101008304811692600160481b8104821692600160881b9091048216918116906001600160a01b03600160401b9091041686565b603c81565b60145481565b60115481565b600f6020526000908152604090205481565b600061259e336124f6565b6125a757600080fd5b6125b9836001600160a01b031661359d565b6125c257600080fd5b6001600160a01b0383811660009081526015602052604090205416156125e757600080fd5b6001600160a01b038381166000908152601560205260409081902080546001600160a01b03191692851692909217909155517fc5ec2ed49686197edd2ed642c7e6096893cc81e6658cde2527030316037715d090612648908590859061516e565b60405180910390a150600192915050565b600654141590565b606060006009838154811061267257fe5b600091825260208083206002600690930201828101546001600160a01b039081168086526015845260408087205481516101608101835285546001600160401b038116825260ff600160401b820481161515838a0152600160481b82048116151583860152600160501b8204811615156060840152600160581b820416151560808301526001600160801b03600160601b9091041660a0820152600180870154861660c083015260e082019490945260038601546101008281019190915260048701546101208301526005870180548551601f60001998831615909402979097011699909904908101889004880285018801909352828452949850610d7397612805978c9791966127f896939093169492938b93610140860193909291908301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b820191906000526020600020905b8154815290600101906020018083116127c457829003601f168201915b5050505050815250506135a390919063ffffffff16565b919063ffffffff61367116565b6136c9565b600090815260086020526040902060010154600160801b90046001600160401b031690565b6015602052600090815260409020546001600160a01b031681565b6002546001600160a01b031681565b6000610410565b6001546001600160a01b031681565b60008060006128896009600b886000898960016000612bd7565b90507f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d8133886000898960016000604051611a4f9897969594939291906152a2565b600b5490565b600b818154811061251657fe5b600081156128f857600a83815481106128f357fe5b506000525b6009838154811061290557fe5b6000918252602090912060069091020154600160501b900460ff169392505050565b600a81815481106123bb57fe5b60125481565b61294b60178263ffffffff61386c16565b6040516001600160a01b038216907fb079bc2cbde1f186e0b351d4a87c4597e3ed098f571548617449e73506428d8b90600090a250565b600654600090815260086020526040812080546001600160401b0316156129ad57600091505061148b565b80546001808301546000926129df926001600160401b03600160c01b909204821692600160801b9004821601166138a5565b60018301549091506001600160401b0316811115612a025760009250505061148b565b6000818152600483016020526040902060058101546301000000900460ff1615612a32576000935050505061148b565b600581015460ff1615612a82578054426001600160401b03600160801b90920491909116600f011115612a6b576000935050505061148b565b612a768382846138bc565b6001935050505061148b565b6001808401546001600160401b03600160401b9091048116909101165b6000818152600385016020526040902054600160d01b900460ff1615612ac757600101612a9f565b612ad1848261397c565b15612aed57612ae08482613a36565b600194505050505061148b565b600094505050505090565b60025460405160009182916060916001600160a01b031690612b1990615134565b60405180910390208989898989604051602401612b3a9594939291906153c1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612b789190615128565b600060405180830381855af49150503d8060008114612bb3576040519150601f19603f3d011682016040523d82523d6000602084013e612bb8565b606091505b509150915081612bc757600080fd5b6001925050505b95945050505050565b600061040084511115612be957600080fd5b6003546001600160a01b03888116911614808015612c05575083155b80612c2957506001600160a01b038881166000908152601560205260409020541615155b612c3257600080fd5b8954612c418b600183016143c3565b915060008a8381548110612c5157fe5b600091825260209182902060069190910201600181018054336001600160a01b0319918216179091556002820180549091166001600160a01b038d16179055805467ffffffffffffffff1916426001600160401b03161768ff00000000000000001916600160401b881515021769ff0000000000000000001916600160481b85151502176fffffffffffffffffffffffffffffffff60601b1916600160601b6001600160801b038c1602178155600381018990558751909250612d1c916005840191908901906143f4565b5084612e4557604080516101608101825282546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808501546001600160a01b0390811660c085015260028087015490911660e085015260038601546101008086019190915260048701546101208601526005870180548751948116159092026000190190911691909104601f8101849004840283018401909552848252612e3c94889493879361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b612e4557600080fd5b895460009015612e5a578a5460001901612e69565b8a54612e698c60018301614472565b905060008b8281548110612e7957fe5b60009182526020909120600290910201805490915060ff1680612ec15750612e9f6133dc565b81546001808401546001600160401b03600160881b9093048316908316030116145b15612f2457805460ff1916600190811782558c548d91612ee49083908301614472565b81548110612eee57fe5b60009182526020909120600290910201805467ffffffffffffffff60881b1916600160881b6001600160401b0388160217815590505b612f2d81610c1d565b60018101805467ffffffffffffffff19166001600160401b03871617905586612f7b5780546001600160401b0361010080830482166001019091160268ffffffffffffffff00199091161781555b838015612f86575086155b156130bd57604080516101608101825284546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808701546001600160a01b0390811660c085015260028089015490911660e085015260038801546101008086019190915260048901546101208601526005890180548751948116159092026000190190911691909104601f81018490048402830184019095528482526130b89488946130a994339491938793610140860193928301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b8391908863ffffffff613af616565b6131e9565b6001600160a01b038b81166000908152601560209081526040918290205482516101608101845287546001600160401b0381168252600160401b810460ff908116151583860152600160481b82048116151583870152600160501b8204811615156060840152600160581b82041615156080830152600160601b90046001600160801b031660a0820152600180890154861660c08301526002808a0154871660e084015260038a01546101008085019190915260048b015461012085015260058b0180548851948116159092026000190190911691909104601f81018690048602830186019096528582526131e9968a966130a99695909116948793610140860193909290918301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b5050505098975050505050505050565b61320a60168263ffffffff613b1816565b6040516001600160a01b038216907ff012269e1b6bb33c7800e7e54167ddd74f0ae7244108030b6876821d3779822f90600090a250565b845460018601546001600160401b03600160881b90920482168501911681111561326a57600080fd5b600085828154811061327857fe5b6000918252602090912089546006909202019150426001600160401b03600160c01b90920491909116600a01116132ae57600080fd5b6005880154640100000000900460ff166132c757600080fd5b8054600160581b900460ff16156132dd57600080fd5b8054600160501b900460ff16156132f357600080fd5b8351602085012061330385613b4d565b1561330d57600080fd5b60005460ff166133305761332781878b6004015487613b8a565b61333057600080fd5b50805460ff60581b1916600160581b1790559695505050505050565b61335d60178263ffffffff613b1816565b6040516001600160a01b038216907ff84a004e1673d2f349a7c93c72b3794b8eba6d2f9338044d8c8cd260e51a57a190600090a250565b6133a560168263ffffffff61386c16565b6040516001600160a01b038216907fa199526a01dbcba68aa3ab9d7d06c6692c83fb1a8bcf2184e6d94ad34f5aaf9590600090a250565b601490565b600062019a285a116133f257600080fd5b8260e001516001600160a01b031663a9f793088460200151848660c001518761010001518861014001516040518663ffffffff1660e01b815260040161343c959493929190615197565b602060405180830381600087803b15801561345657600080fd5b505af115801561346a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d7391908101906148d9565b60025460405160009182916060916001600160a01b0316906134af9061514a565b6040518091039020888888886040516024016134ce9493929190615371565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161350c9190615128565b600060405180830381855af49150503d8060008114613547576040519150601f19603f3d011682016040523d82523d6000602084013e61354c565b606091505b50915091508161355b57600080fd5b5060019695505050505050565b60006001600160a01b03821661357d57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b3b151590565b6135ab61449e565b6020808401805115159183019190915260408085015115159083015260c0808501516001600160a01b031690830152511580156135e9575082604001515b156136335760c08301516001600160a01b031660e082015261014083015160208101516001600160801b03811661361f57600080fd5b6001600160801b031660a0830152506110dc565b6001600160a01b03821660e082015260a0808401516001600160801b0316908201526101008084015190820152610140808401519082015292915050565b6136796144fc565b633b9aca006020820152620186a0604082015260e08401516001600160a01b0316606082015260a08401516001600160801b031660808201526136bd848484613c55565b60a08201529392505050565b6040805160098082526101408201909252606091829190816020015b60608152602001906001900390816136e55750508351909150613710906001600160401b0316613d2b565b8160008151811061371d57fe5b60200260200101819052506137358360200151613d2b565b8160018151811061374257fe5b602002602001018190525061376383604001516001600160401b0316613d2b565b8160028151811061377057fe5b602002602001018190525061379183606001516001600160a01b0316613d3e565b8160038151811061379e57fe5b60200260200101819052506137b68360800151613d2b565b816004815181106137c357fe5b60200260200101819052506137db8360a00151613d5d565b816005815181106137e857fe5b60200260200101819052506138008360c00151613d2b565b8160068151811061380d57fe5b60200260200101819052506138258360e00151613d2b565b8160078151811061383257fe5b602002602001018190525061384b836101000151613d2b565b8160088151811061385857fe5b6020026020010181905250610d7381613db3565b6138768282613568565b1561388057600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000818310156138b55781610d73565b5090919050565b60058201805464010000000064ff000000001990911617905581546001600160c01b0316600160c01b426001600160401b039081169190910291909117835560018401805467ffffffffffffffff60801b1916600160801b8484160217808255845467ffffffffffffffff60401b199091169216600160401b029190911790556006546040517ffb96205e4b3633fd57aa805b26b51ecf528714a10241a4af015929dce86768d99161396f9184906153a6565b60405180910390a1505050565b8154600090600160801b90046001600160401b03168211156139a0575060006110dc565b600082815260038401602052604090208054600160c81b900460ff166139ca5760009150506110dc565b8054600160d01b900460ff16156139e55760009150506110dc565b6006810154600160881b900460ff1680613a0a57506006810154600160901b900460ff165b15613a195760009150506110dc565b60060154426001600160401b039091166014011115905092915050565b60008181526003830160205260409081902060068082018054600160801b60ff60801b19909116811767ffffffffffffffff60401b19908116600160401b426001600160401b03908116820292909217909455855460018a01805467ffffffffffffffff60801b19169186900483169094021790911681881684021790915591548354945193947f70801d4d63b3da6c19ba7349911f45bed5a99ccdfb51b8138c105872529bebd59461396f949293889383811693919091041690615403565b613b0a613b0583836000613671565b613e10565b836004018190555050505050565b613b228282613568565b613b2b57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006060613b6b6004613b5f85613e2c565b9063ffffffff613e4f16565b9050610d7381600081518110613b7d57fe5b6020026020010151613edc565b60006020825181613b9757fe5b0615613ba257600080fd5b60006020835181613baf57fe5b04905060108110613bbf57600080fd5b60008660205b836020028111613c475785810151925060028806613c0d578183604051602001613bf09291906150e6565b604051602081830303815290604052805190602001209150613c39565b8282604051602001613c209291906150e6565b6040516020818303038152906040528051906020012091505b600288049750602001613bc5565b509094149695505050505050565b606083604001518015613c6a57508360200151155b15613c7457610d73565b600082613c9457604051613c879061513f565b6040518091039020613ca9565b604051613ca090615155565b60405180910390205b9050808560200151613cbc576000613cbf565b60015b60ff1660001b858760c001516001600160a01b0316886101000151896101400151604051602001613cf495949392919061522d565b60408051601f1981840301815290829052613d12929160200161510c565b6040516020818303038152906040529150509392505050565b60606110dc613d3983613f00565b613d5d565b60408051600560a21b8318601482015260348101909152606090610d73815b606081516001148015613d8f5750607f60f81b82600081518110613d7d57fe5b01602001516001600160f81b03191611155b15613d9b575080610b62565b6110dc613dad8351608060ff16613ff9565b836140c2565b604080516000808252602082019092526060915b8351811015613df757613ded82858381518110613de057fe5b60200260200101516140c2565b9150600101613dc7565b50610d73613e0a825160c060ff16613ff9565b826140c2565b60006060613e1d836136c9565b80516020909101209392505050565b613e34614563565b50805160408051808201909152602092830181529182015290565b606081604051908082528060200260200182016040528015613e8b57816020015b613e78614563565b815260200190600190039081613e705790505b509050613e9661457d565b613e9f846141a7565b905060005b83811015613ed457613eb5826141cc565b838281518110613ec157fe5b6020908102919091010152600101613ea4565b505092915050565b6000806000613eea846141fe565b90516020919091036101000a9004949350505050565b6040805160208082528183019092526060916000918391602082018180388339019050509050836020820152600091505b6020821015613f6a57808281518110613f4657fe5b01602001516001600160f81b03191615613f5f57613f6a565b600190910190613f31565b6060826020036040519080825280601f01601f191660200182016040528015613f9a576020820181803883390190505b50905060005b8151811015613ff0578251600185019484918110613fba57fe5b602001015160f81c60f81b828281518110613fd157fe5b60200101906001600160f81b031916908160001a905350600101613fa0565b50949350505050565b6060600160401b83106140275760405162461bcd60e51b815260040161401e90615266565b60405180910390fd5b604080516001808252818301909252606091602082018180388339019050509050603784116140815782840160f81b8160008151811061406357fe5b60200101906001600160f81b031916908160001a90535090506110dc565b606061408c85613f00565b90508381510160370160f81b826000815181106140a557fe5b60200101906001600160f81b031916908160001a905350612bce82825b60608082518451016040519080825280601f01601f1916602001820160405280156140f4576020820181803883390190505b5090506000805b855181101561414a5785818151811061411057fe5b602001015160f81c60f81b83838151811061412757fe5b60200101906001600160f81b031916908160001a905350600191820191016140fb565b5060005b845181101561419d5784818151811061416357fe5b602001015160f81c60f81b83838151811061417a57fe5b60200101906001600160f81b031916908160001a9053506001918201910161414e565b5090949350505050565b6141af61457d565b60006141ba8361425d565b83519383529092016020820152919050565b6141d4614563565b602082015160006141e4826142c7565b828452602080850182905292019390910192909252919050565b805180516000918291821a906080821015614220579250600191506142589050565b60b882101561423e5760018560200151039250806001019350614255565b602085015182820160b51901945082900360b60192505b50505b915091565b8051805160009190821a90608082101561427c57600092505050610b62565b60b8821080614297575060c08210158015614297575060f882105b156142a757600192505050610b62565b60c08210156142bc575060b519019050610b62565b5060f5190192915050565b8051600090811a60808110156142e057600191506142f1565b60b88110156142f157607e19810191505b50919050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152610100810161434561459d565b81526020016143526145d2565b905290565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915290565b8154818355818111156143ef576006028160060283600052602060002091820191016143ef9190614616565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061443557805160ff1916838001178555614462565b82800160010185558215614462579182015b82811115614462578251825591602001919060010190614447565b5061446e929150614678565b5090565b8154818355818111156143ef576002028160020283600052602060002091820191016143ef9190614692565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925261014081019190915290565b60405180610120016040528060006001600160401b031681526020016000815260200160006001600160401b0316815260200160006001600160a01b0316815260200160008152602001606081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518060400160405280614590614563565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b61148b91905b8082111561446e5780546001600160e01b03191681556001810180546001600160a01b031990811690915560028201805490911690556000600382018190556004820181905561466f60058301826146c8565b5060060161461c565b61148b91905b8082111561446e576000815560010161467e565b61148b91905b8082111561446e5780546001600160c81b03191681556001810180546001600160e01b0319169055600201614698565b50805460018160011615610100020316600290046000825580601f106146ee5750610c1d565b601f016020900490600052602060002090810190610c1d9190614678565b80356110dc8161568d565b60008083601f84011261472957600080fd5b5081356001600160401b0381111561474057600080fd5b60208301915083602082028301111561475857600080fd5b9250929050565b80356110dc816156a1565b80516110dc816156a1565b80356110dc816156aa565b60008083601f84011261479257600080fd5b5081356001600160401b038111156147a957600080fd5b60208301915083600182028301111561475857600080fd5b600082601f8301126147d257600080fd5b81356147e56147e0826155aa565b615584565b9150808252602083016020830185838301111561480157600080fd5b61480c83828461564b565b50505092915050565b60006020828403121561482757600080fd5b6000614833848461470c565b949350505050565b6000806040838503121561484e57600080fd5b600061485a858561470c565b925050602061486b8582860161470c565b9150509250929050565b60008060006060848603121561488a57600080fd5b6000614896868661470c565b93505060206148a786828701614775565b92505060408401356001600160401b038111156148c357600080fd5b6148cf868287016147c1565b9150509250925092565b6000602082840312156148eb57600080fd5b6000614833848461476a565b60006020828403121561490957600080fd5b60006148338484614775565b6000806040838503121561492857600080fd5b60006149348585614775565b925050602061486b8582860161475f565b6000806000806080858703121561495b57600080fd5b60006149678787614775565b945050602061497887828801614775565b935050604061498987828801614775565b925050606061499a87828801614775565b91505092959194509250565b60008060008060008060008060a0898b0312156149c257600080fd5b60006149ce8b8b614775565b98505060208901356001600160401b038111156149ea57600080fd5b6149f68b828c01614780565b975097505060408901356001600160401b03811115614a1457600080fd5b614a208b828c01614780565b95509550506060614a338b828c01614775565b93505060808901356001600160401b03811115614a4f57600080fd5b614a5b8b828c01614717565b92509250509295985092959890939650565b60008060408385031215614a8057600080fd5b6000614a8c8585614775565b925050602061486b85828601614775565b600080600080600060a08688031215614ab557600080fd5b6000614ac18888614775565b9550506020614ad288828901614775565b9450506040614ae388828901614775565b9350506060614af488828901614775565b9250506080614b0588828901614775565b9150509295509295909350565b600080600080600080600060a0888a031215614b2d57600080fd5b6000614b398a8a614775565b9750506020614b4a8a828b01614775565b9650506040614b5b8a828b01614775565b95505060608801356001600160401b03811115614b7757600080fd5b614b838a828b01614780565b945094505060808801356001600160401b03811115614ba157600080fd5b614bad8a828b01614780565b925092505092959891949750929550565b614bc78161561f565b82525050565b614bc7816155de565b614bc7816155e9565b614bc78161148b565b614bc7614bf48261148b565b61148b565b614bc7614bf4826155ee565b6000614c10826155d1565b614c1a81856155d5565b9350614c2a818560208601615657565b614c3381615683565b9093019392505050565b6000614c48826155d1565b614c528185610b62565b9350614c62818560208601615657565b9290920192915050565b614bc78161562a565b6000614c82603283610b62565b7f7375626d69744e52452875696e743235362c75696e743235362c627974657333815271322c627974657333322c627974657333322960701b602082015260320192915050565b6000614cd6603c83610b62565b7f6170706c7952657175657374496e4368696c64436861696e28626f6f6c2c756981527f6e743235362c616464726573732c627974657333322c627974657329000000006020820152603c0192915050565b6000614d35600e836155d5565b6d696e70757420746f6f206c6f6e6760901b815260200192915050565b6000614d5f602a83610b62565b7f7375626d69744f52422875696e743235362c627974657333322c627974657333815269322c627974657333322960b01b6020820152602a0192915050565b6000614dab603b83610b62565b7f6170706c7952657175657374496e526f6f74436861696e28626f6f6c2c75696e81527f743235362c616464726573732c627974657333322c62797465732900000000006020820152603b0192915050565b80516102c0830190614e0f84826150dd565b506020820151614e2260208501826150dd565b506040820151614e3560408501826150dd565b506060820151614e486060850182614bd6565b506080820151614e5b6080850182614bd6565b5060a0820151614e6e60a0850182614bd6565b5060c0820151614e8160c0850182614bd6565b5060e0820151614e9460e0850182614bd6565b50610100820151614ea961010085018261505b565b50610120820151614ebe6101c0850182614ec4565b50505050565b8051610100830190614ed68482614bdf565b506020820151614ee96020850182614bdf565b506040820151614efc6040850182614bdf565b506060820151614f0f60608501826150dd565b506080820151614f2260808501826150dd565b5060a0820151614f3560a0850182614bd6565b5060c0820151614f4860c0850182614bd6565b5060e0820151614ebe60e0850182614bd6565b80516101a0830190614f6d84826150dd565b506020820151614f8060208501826150dd565b506040820151614f9360408501826150dd565b506060820151614fa660608501826150dd565b506080820151614fb960808501826150dd565b5060a0820151614fcc60a0850182614bdf565b5060c0820151614fdf60c0850182614bdf565b5060e0820151614ff260e0850182614bdf565b50610100820151615007610100850182614bd6565b5061012082015161501c610120850182614bd6565b50610140820151615031610140850182614bd6565b50610160820151615046610160850182614bd6565b50610180820151614ebe610180850182614bd6565b805160c083019061506c84826150dd565b50602082015161507f60208501826150dd565b50604082015161509260408501826150dd565b5060608201516150a560608501826150dd565b5060808201516150b860808501826150dd565b5060a0820151614ebe60a08501826150dd565b614bc7816155fb565b614bc781615640565b614bc781615613565b60006150f28285614be8565b6020820191506151028284614be8565b5060200192915050565b60006151188285614bf9565b6004820191506148338284614c3d565b6000610d738284614c3d565b60006110dc82614c75565b60006110dc82614cc9565b60006110dc82614d52565b60006110dc82614d9e565b602081016110dc8284614bcd565b6040810161517c8285614bcd565b610d736020830184614bcd565b602081016110dc8284614bd6565b60a081016151a58288614bd6565b6151b26020830187614bdf565b6151bf6040830186614bbe565b6151cc6060830185614bdf565b8181036080830152610c5b8184614c05565b60c081016151ec8289614bd6565b6151f960208301886150dd565b61520660408301876150dd565b61521360608301866150dd565b61522060808301856150dd565b610c5b60a0830184614bcd565b60a0810161523b8288614bdf565b6152486020830187614bdf565b6151bf6040830186614bdf565b60208082528101610d738184614c05565b602080825281016110dc81614d28565b6102c081016110dc8284614dfd565b6101a081016110dc8284614f5b565b602081016110dc8284614bdf565b61010081016152b1828b614bdf565b6152be602083018a614bbe565b6152cb6040830189614bcd565b6152d86060830188614c6c565b6152e56080830187614bdf565b81810360a08301526152f78186614c05565b905061530660c0830185614bd6565b61531360e0830184614bd6565b9998505050505050505050565b610100810161532f828b614bdf565b61533c602083018a614bbe565b6153496040830189614bcd565b6152d86060830188614bdf565b604081016153648285614bdf565b610d736020830184614bd6565b6080810161537f8287614bdf565b61538c6020830186614bdf565b6153996040830185614bdf565b612bce6060830184614bdf565b604081016153b48285614bdf565b610d736020830184614bdf565b60a081016153cf8288614bdf565b6153dc6020830187614bdf565b6153e96040830186614bdf565b6153f66060830185614bdf565b6123866080830184614bdf565b608081016154118287614bdf565b61541e6020830186614bdf565b61542b60408301856150d4565b612bce60608301846150d4565b6101608101615447828e6150dd565b615454602083018d614bd6565b615461604083018c614bd6565b61546e606083018b614bd6565b61547b608083018a614bd6565b61548860a08301896150cb565b61549560c0830188614bcd565b6154a260e0830187614bcd565b6154b0610100830186614bdf565b6154be610120830185614bdf565b8181036101408301526154d18184614c05565b9d9c50505050505050505050505050565b61018081016154f1828f6150dd565b6154fe602083018e6150dd565b61550b604083018d6150dd565b615518606083018c6150dd565b615525608083018b6150dd565b61553260a083018a6150dd565b61553f60c08301896150dd565b61554c60e08301886150dd565b61555a6101008301876150dd565b6155686101208301866150dd565b6155766101408301856150dd565b6154d1610160830184614bd6565b6040518181016001600160401b03811182821017156155a257600080fd5b604052919050565b60006001600160401b038211156155c057600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b60006110dc82615607565b151590565b6001600160e01b03191690565b6001600160801b031690565b6001600160a01b031690565b6001600160401b031690565b60006110dc82615635565b60006110dc8261148b565b60006110dc826155de565b60006110dc82615613565b82818337506000910152565b60005b8381101561567257818101518382015260200161565a565b83811115614ebe5750506000910152565b601f01601f191690565b615696816155de565b8114610c1d57600080fd5b615696816155e9565b6156968161148b56fea365627a7a72315820bfe268b1a951973c135b3127ddf36b187f7ab4cdf0aca2a2f9f73df2846800136c6578706572696d656e74616cf564736f6c634300050c00400000000000000000000000000a2d8bf53ff0e6b208fddd2696b156a7ccb4d1a80000000000000000000000004b01361e3bb5c1856103ce7fc1c923b6adcc3eed0000000000000000000000005c642140a3b6fa39dfd1aa9eba6c5239f5c457d500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002db431b544b2f5468e3f771d7843d9c5df3b4edcf8bc1c599f18f0b4ea8709bc356e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42156e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421

Deployed Bytecode

0x6080604052600436106104105760003560e01c80638b5172d01161021e578063c8ad329f11610123578063e259faf7116100ab578063ea0c73f61161007a578063ea0c73f614610ab5578063ea7f22a814610aca578063f28a7afa14610aea578063f4f31de414610b0a578063fb788a2714610b2a57610410565b8063e259faf714610a70578063e6925d0814610a85578063e7b88b8014610a8d578063e7f9650514610aa257610410565b8063d1723a96116100f2578063d1723a96146109ee578063d636857e14610a1b578063d691acd81461044b578063da0185f814610a3b578063de0ce17d14610a5b57610410565b8063c8ad329f14610979578063ca6f63801461098e578063cb5d742f146109ae578063ce8a2bc2146109ce57610410565b8063b2ae9ba8116101a6578063b8066bcb11610175578063b8066bcb146108e8578063c0c49c2a146108fd578063c0e860641461091d578063c2bc88fa1461094f578063c54626cc1461096457610410565b8063b2ae9ba81461044b578063b443f3cc1461087c578063b540adba146108b3578063b6715647146108c857610410565b806399bd3600116101ed57806399bd36001461080a578063a820c0671461081f578063a926fdbc14610832578063ab96da2d14610852578063b17fa6e91461086757610410565b80638b5172d01461044b5780638eb288ca146107e057806393521222146107f557806394be3aa51461044b57610410565b8063404f7d66116103245780636fb7f558116102ac57806378fe705f1161027b57806378fe705f1461076e5780637b929c271461078157806380e3e81d146107965780638155717d146107b6578063882eed2c146107cb57610410565b80636fb7f5581461070457806372ecb9a81461071957806375395a58146107395780637657f20a1461074e57610410565b8063570ca735116102f3578063570ca7351461067a5780635b8846821461069c5780635e0ca71b146106bc5780636299fb24146106d15780636f3e4b90146106f157610410565b8063404f7d66146105d55780634a44bdb8146105f55780634ba3a12614610622578063547685711461065a57610410565b8063183d2d1c116103a75780632aa196c8116103765780632aa196c8146105565780632b25a38b146105695780632dc6bb7b146105965780633565fb0d146105ab578063398bac63146105c057610410565b8063183d2d1c1461050c578063192adc5b1461044b5780631ec2042b14610521578063236915661461054157610410565b806308c4fff0116103e357806308c4fff0146104a25780630eaf45a8146104b757806311e4c914146104d7578063164bc2ae146104f757610410565b8063019dc09914610415578063033cfbed1461044b57806306394c9b14610460578063072900f914610482575b600080fd5b34801561042157600080fd5b506104356104303660046148f7565b610b3f565b6040516104429190615294565b60405180910390f35b34801561045757600080fd5b50610435610b67565b34801561046c57600080fd5b5061048061047b366004614815565b610b6c565b005b34801561048e57600080fd5b5061048061049d366004614815565b610bf8565b3480156104ae57600080fd5b50610435610c20565b6104ca6104c5366004614a9d565b610c25565b6040516104429190615189565b3480156104e357600080fd5b506104356104f23660046148f7565b610c66565b34801561050357600080fd5b50610435610c88565b34801561051857600080fd5b50610435610c8e565b34801561052d57600080fd5b5061043561053c3660046148f7565b610c94565b34801561054d57600080fd5b50610435610cb2565b6104ca610564366004614875565b610cb8565b34801561057557600080fd5b50610589610584366004614a6d565b610d7a565b6040516104429190615276565b3480156105a257600080fd5b506104356110e2565b3480156105b757600080fd5b506104806110e8565b3480156105cc57600080fd5b506105896110f3565b3480156105e157600080fd5b506104806105f0366004614b12565b61148e565b34801561060157600080fd5b50610615610610366004614a6d565b61171a565b6040516104429190615285565b34801561062e57600080fd5b5061064261063d3660046148f7565b61180a565b6040516104429c9b9a999897969594939291906154e2565b34801561066657600080fd5b506104ca6106753660046148f7565b611881565b34801561068657600080fd5b5061068f6118af565b6040516104429190615160565b3480156106a857600080fd5b506104356106b7366004614a6d565b6118c3565b3480156106c857600080fd5b506104806118f4565b3480156106dd57600080fd5b506104806106ec3660046149a6565b6118fd565b6104ca6106ff366004614945565b611960565b34801561071057600080fd5b5061068f611968565b34801561072557600080fd5b506104356107343660046148f7565b611977565b34801561074557600080fd5b506104ca611989565b34801561075a57600080fd5b50610480610769366004614815565b6119a2565b6104ca61077c366004614875565b6119f5565b34801561078d57600080fd5b506104ca611a63565b3480156107a257600080fd5b506104806107b1366004614815565b611a6c565b3480156107c257600080fd5b50610435611a91565b3480156107d757600080fd5b506104ca611a96565b3480156107ec57600080fd5b50610435611a9b565b34801561080157600080fd5b50610435611aa2565b34801561081657600080fd5b506104ca611ab1565b6104ca61082d366004614945565b612351565b34801561083e57600080fd5b506104ca61084d366004614815565b612390565b34801561085e57600080fd5b506104356123a3565b34801561087357600080fd5b506104356123a9565b34801561088857600080fd5b5061089c6108973660046148f7565b6123ae565b6040516104429b9a99989796959493929190615438565b3480156108bf57600080fd5b506104356124cf565b3480156108d457600080fd5b506104356108e33660046148f7565b6124d5565b3480156108f457600080fd5b5061068f6124e7565b34801561090957600080fd5b506104ca610918366004614815565b6124f6565b34801561092957600080fd5b5061093d6109383660046148f7565b612509565b604051610442969594939291906151de565b34801561095b57600080fd5b50610435612570565b34801561097057600080fd5b50610435612575565b34801561098557600080fd5b5061043561257b565b34801561099a57600080fd5b506104356109a93660046148f7565b612581565b3480156109ba57600080fd5b506104ca6109c936600461483b565b612593565b3480156109da57600080fd5b506104ca6109e93660046148f7565b612659565b3480156109fa57600080fd5b50610a0e610a093660046148f7565b612661565b6040516104429190615255565b348015610a2757600080fd5b50610435610a363660046148f7565b61280a565b348015610a4757600080fd5b5061068f610a56366004614815565b61282f565b348015610a6757600080fd5b5061068f610b67565b348015610a7c57600080fd5b5061068f61284a565b610480612859565b348015610a9957600080fd5b5061068f612860565b6104ca610ab0366004614875565b61286f565b348015610ac157600080fd5b506104356128cb565b348015610ad657600080fd5b5061093d610ae53660046148f7565b6128d1565b348015610af657600080fd5b506104ca610b05366004614915565b6128de565b348015610b1657600080fd5b5061089c610b253660046148f7565b612927565b348015610b3657600080fd5b50610435612934565b600081815260086020526040902060010154600160401b90046001600160401b03165b919050565b600081565b60005461010090046001600160a01b0316331480610b9457506004546001600160a01b031633145b610b9d57600080fd5b60008054610100600160a81b0319166101006001600160a01b038416021790556040517f4721129e0e676ed6a92909bb24e853ccdd63ad72280cc2e974e38e480e0e6e5490610bed908390615160565b60405180910390a150565b60005461010090046001600160a01b03163314610c1457600080fd5b610c1d8161293a565b50565b600f81565b6000610c3033612390565b610c3957600080fd5b6000805460ff16610c4e57610c4c612982565b505b610c5b8787878787612af8565b979650505050505050565b600090815260086020526040902054600160801b90046001600160401b031690565b60105481565b60065481565b6000908152600860205260409020600101546001600160401b031690565b600d5481565b60008034610cce6009600b888489898880612bd7565b600d805460010190556006546000908152600860205260408082209051929450917f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c291610d1d91869190615356565b60405180910390a17f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d833389858a8a600080604051610d63989796959493929190615320565b60405180910390a1600193505050505b9392505050565b610d826142f7565b600860008481526020019081526020016000206003016000838152602001908152602001600020604051806101400160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a900460ff161515151581526020016000820160199054906101000a900460ff1615151515815260200160008201601a9054906101000a900460ff1615151515815260200160008201601b9054906101000a900460ff1615151515815260200160008201601c9054906101000a900460ff16151515158152602001600182016040518060c00160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681525050815260200160038201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a900460ff161515151581526020016003820160119054906101000a900460ff161515151581526020016003820160129054906101000a900460ff1615151515815250508152505090505b92915050565b60135481565b6110f1336131f9565b565b6110fb6142f7565b600860006006548152602001908152602001600020600301600060086000600654815260200190815260200160002060000160109054906101000a90046001600160401b03166001600160401b03168152602001908152602001600020604051806101400160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a900460ff161515151581526020016000820160199054906101000a900460ff1615151515815260200160008201601a9054906101000a900460ff1615151515815260200160008201601b9054906101000a900460ff1615151515815260200160008201601c9054906101000a900460ff16151515158152602001600182016040518060c00160405290816000820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016000820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016001820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681525050815260200160038201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a900460ff161515151581526020016003820160119054906101000a900460ff161515151581526020016003820160129054906101000a900460ff1615151515815250508152505090505b90565b600087815260086020908152604080832089845260048101909252909120600581015460ff166114bd57600080fd5b6005810154640100000000900460ff166114d657600080fd5b6005810154600090610100900460ff1680156115e2576115af83600c8560000160089054906101000a90046001600160401b03166001600160401b03168154811061151d57fe5b9060005260206000209060020201600a8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061324192505050565b60405190925033906108fc9060009081818181818888f193505050501580156115dc573d6000803e3d6000fd5b506116d4565b6116a583600b8560000160089054906101000a90046001600160401b03166001600160401b03168154811061161357fe5b906000526020600020906002020160098c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061324192505050565b60405190925033906108fc9060009081818181818888f193505050501580156116d2573d6000803e3d6000fd5b505b7fc8135db115644ed4ae193313c4c801235ef740d2a57a8d5e6fe26ab66635698a8282604051611705929190615356565b60405180910390a15050505050505050505050565b611722614357565b506000918252600860209081526040808420928452600492830182529283902083516101a08101855281546001600160401b038082168352600160401b8204811694830194909452600160801b8104841695820195909552600160c01b9094048216606085015260018101549091166080840152600281015460a0840152600381015460c08401529081015460e08301526005015460ff80821615156101008085019190915282048116151561012084015262010000820481161515610140840152630100000082048116151561016084015264010000000090910416151561018082015290565b6008602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b808504831694600160801b808204851695600160c01b92839004861695858116958581048216958482048316959182900483169484841694918204841693908204169160ff9104168c565b6000805b828110156118a657611895611ab1565b61189e57600080fd5b600101611885565b50600192915050565b60005461010090046001600160a01b031681565b600091825260086020908152604080842092845260049092019052902054600160c01b90046001600160401b031690565b6110f13361334c565b60065460009081526008602090815260408083208b845260048101909252909120600581015460ff161561193057600080fd5b8054426001600160401b03600160801b90920491909116600f011161195457600080fd5b50505050505050505050565b600080610410565b6004546001600160a01b031681565b60076020526000908152604090205481565b6000611993612982565b61199c57600080fd5b50600190565b60005461010090046001600160a01b03163314806119ca57506004546001600160a01b031633145b6119d357600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000611a0e600a600c8860008989600180612bd7565b90507f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d81338860008989600180604051611a4f9897969594939291906152a2565b60405180910390a150600195945050505050565b60005460ff1681565b60005461010090046001600160a01b03163314611a8857600080fd5b610c1d81613394565b600a81565b600181565b620186a081565b6000611aac6133dc565b905090565b60105460009081526008602052604081206011546001820154601254849392916001600160401b03161015611ae557600080fd5b601254600090815260048301602090815260408083208484526003860190925290912083546001600160401b031615801590611b2f575083546012546001600160401b0390911611155b15611b9a5750506010805460010190819055600090815260086020908152604080832080546001600160401b03600160401b82048116808752600384018652848720600160c01b90930490911660128190556011829055865260048301909452919093209294509092505b600582015460ff16611c2c5782611bc4576010546000908152600f60205260409020549250611beb565b600092835260038401602052604090922060020154600160401b90046001600160401b0316915b82611bf557600080fd5b50506000818152600383016020908152604080832080546001600160401b0316601281905584526004860190925290912090611c4c565b5080546001600160401b0316600081815260038501602052604090209092505b60118390558054600160c01b900460ff1615611c6757600080fd5b8054600160d01b900460ff16611c7c57600080fd5b600582015460ff16611c8d57600080fd5b6005820154640100000000900460ff16611ca657600080fd5b8154426001600160401b03600160c01b90920491909116600a011115611ccb57600080fd5b6005820154610100900460ff161561203f57601454600a549095508510611cf157600080fd5b6000600a8681548110611d0057fe5b906000526020600020906006020190506000600c8460000160089054906101000a90046001600160401b03166001600160401b031681548110611d3f57fe5b600091825260209091206002909102018054909150600160881b90046001600160401b03168710801590611d80575060018101546001600160401b03168711155b611d8957600080fd5b60018101546001600160401b0316871415611de45785546001600160401b031615801590611dcb575085546012546000196001600160401b0392831601909116145b15611dda576010805460010190555b6012805460010190555b600187016014558154600160401b900460ff168015611e0c57508154600160581b900460ff16155b15611fe357604080516101608101825283546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808601546001600160a01b0390811660c085015260028088015490911660e085015260038701546101008086019190915260048801546101208601526005880180548751948116159092026000190190911691909104601f8101849004840283018401909552848252611f6d948c9493889361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b820191906000526020600020905b815481529060010190602001808311611f3957829003601f168201915b5050505050815250506133e190919063ffffffff16565b5060018201546040516001600160a01b03909116906108fc9060009081818181818888f19350505050158015611fa7573d6000803e3d6000fd5b507f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c2876001604051611fda929190615356565b60405180910390a15b815460ff60501b1916600160501b1782556040517f134017cf3262b18f892ee95dde3b0aec9a80cc70a7c96f09c64bd237aceb047390612027908990600190615356565b60405180910390a1600197505050505050505061148b565b601354600954909550851061205357600080fd5b8154600b8054600092600160401b90046001600160401b031690811061207557fe5b600091825260209091206002909102018054909150600160881b90046001600160401b031686108015906120b6575060018101546001600160401b03168611155b6120bf57600080fd5b60018101546001600160401b031686141561211a5784546001600160401b031615801590612101575084546012546000196001600160401b0392831601909116145b15612110576010805460010190555b6012805460010190555b60006009878154811061212957fe5b6000918252602090912060018901601355600690910201805460ff60501b1916600160501b17808255909150600160401b900460ff16801561217457508054600160581b900460ff16155b1561230957604080516101608101825282546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808501546001600160a01b0390811660c085015260028087015490911660e085015260038601546101008086019190915260048701546101208601526005870180548751948116159092026000190190911691909104601f8101849004840283018401909552848252612293948c9493879361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b5060018101546040516001600160a01b03909116906108fc9060009081818181818888f193505050501580156122cd573d6000803e3d6000fd5b507f6940a01870e576ceb735867e13863646d517ce10e66c0133186a4ebdfe9388c2876000604051612300929190615356565b60405180910390a15b7f134017cf3262b18f892ee95dde3b0aec9a80cc70a7c96f09c64bd237aceb047387600060405161233b929190615356565b60405180910390a1600197505050505050505090565b600061235c33612390565b61236557600080fd5b6000805460ff1661237a57612378612982565b505b6123868686868661348e565b9695505050505050565b60006110dc60178363ffffffff61356816565b60055481565b601481565b600981815481106123bb57fe5b6000918252602091829020600691909102018054600180830154600280850154600386015460048701546005880180546040805161010099831615999099026000190190911695909504601f81018b90048b0288018b019095528487526001600160401b0388169a50600160401b880460ff9081169a600160481b8a0482169a600160501b8b0483169a600160581b810490931699600160601b9093046001600160801b0316986001600160a01b03908116989716969093918301828280156124c55780601f1061249a576101008083540402835291602001916124c5565b820191906000526020600020905b8154815290600101906020018083116124a857829003601f168201915b505050505090508b565b60095490565b600e6020526000908152604090205481565b6003546001600160a01b031681565b60006110dc60168363ffffffff61356816565b600c818154811061251657fe5b60009182526020909120600290910201805460019091015460ff821692506001600160401b036101008304811692600160481b8104821692600160881b9091048216918116906001600160a01b03600160401b9091041686565b603c81565b60145481565b60115481565b600f6020526000908152604090205481565b600061259e336124f6565b6125a757600080fd5b6125b9836001600160a01b031661359d565b6125c257600080fd5b6001600160a01b0383811660009081526015602052604090205416156125e757600080fd5b6001600160a01b038381166000908152601560205260409081902080546001600160a01b03191692851692909217909155517fc5ec2ed49686197edd2ed642c7e6096893cc81e6658cde2527030316037715d090612648908590859061516e565b60405180910390a150600192915050565b600654141590565b606060006009838154811061267257fe5b600091825260208083206002600690930201828101546001600160a01b039081168086526015845260408087205481516101608101835285546001600160401b038116825260ff600160401b820481161515838a0152600160481b82048116151583860152600160501b8204811615156060840152600160581b820416151560808301526001600160801b03600160601b9091041660a0820152600180870154861660c083015260e082019490945260038601546101008281019190915260048701546101208301526005870180548551601f60001998831615909402979097011699909904908101889004880285018801909352828452949850610d7397612805978c9791966127f896939093169492938b93610140860193909291908301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b820191906000526020600020905b8154815290600101906020018083116127c457829003601f168201915b5050505050815250506135a390919063ffffffff16565b919063ffffffff61367116565b6136c9565b600090815260086020526040902060010154600160801b90046001600160401b031690565b6015602052600090815260409020546001600160a01b031681565b6002546001600160a01b031681565b6000610410565b6001546001600160a01b031681565b60008060006128896009600b886000898960016000612bd7565b90507f879922cf5fcada9ebaf8bd7424dc62877f4b220cae07fb6695cc1e8f94c52b4d8133886000898960016000604051611a4f9897969594939291906152a2565b600b5490565b600b818154811061251657fe5b600081156128f857600a83815481106128f357fe5b506000525b6009838154811061290557fe5b6000918252602090912060069091020154600160501b900460ff169392505050565b600a81815481106123bb57fe5b60125481565b61294b60178263ffffffff61386c16565b6040516001600160a01b038216907fb079bc2cbde1f186e0b351d4a87c4597e3ed098f571548617449e73506428d8b90600090a250565b600654600090815260086020526040812080546001600160401b0316156129ad57600091505061148b565b80546001808301546000926129df926001600160401b03600160c01b909204821692600160801b9004821601166138a5565b60018301549091506001600160401b0316811115612a025760009250505061148b565b6000818152600483016020526040902060058101546301000000900460ff1615612a32576000935050505061148b565b600581015460ff1615612a82578054426001600160401b03600160801b90920491909116600f011115612a6b576000935050505061148b565b612a768382846138bc565b6001935050505061148b565b6001808401546001600160401b03600160401b9091048116909101165b6000818152600385016020526040902054600160d01b900460ff1615612ac757600101612a9f565b612ad1848261397c565b15612aed57612ae08482613a36565b600194505050505061148b565b600094505050505090565b60025460405160009182916060916001600160a01b031690612b1990615134565b60405180910390208989898989604051602401612b3a9594939291906153c1565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612b789190615128565b600060405180830381855af49150503d8060008114612bb3576040519150601f19603f3d011682016040523d82523d6000602084013e612bb8565b606091505b509150915081612bc757600080fd5b6001925050505b95945050505050565b600061040084511115612be957600080fd5b6003546001600160a01b03888116911614808015612c05575083155b80612c2957506001600160a01b038881166000908152601560205260409020541615155b612c3257600080fd5b8954612c418b600183016143c3565b915060008a8381548110612c5157fe5b600091825260209182902060069190910201600181018054336001600160a01b0319918216179091556002820180549091166001600160a01b038d16179055805467ffffffffffffffff1916426001600160401b03161768ff00000000000000001916600160401b881515021769ff0000000000000000001916600160481b85151502176fffffffffffffffffffffffffffffffff60601b1916600160601b6001600160801b038c1602178155600381018990558751909250612d1c916005840191908901906143f4565b5084612e4557604080516101608101825282546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808501546001600160a01b0390811660c085015260028087015490911660e085015260038601546101008086019190915260048701546101208601526005870180548751948116159092026000190190911691909104601f8101849004840283018401909552848252612e3c94889493879361014086019390929091830182828015611f565780601f10611f2b57610100808354040283529160200191611f56565b612e4557600080fd5b895460009015612e5a578a5460001901612e69565b8a54612e698c60018301614472565b905060008b8281548110612e7957fe5b60009182526020909120600290910201805490915060ff1680612ec15750612e9f6133dc565b81546001808401546001600160401b03600160881b9093048316908316030116145b15612f2457805460ff1916600190811782558c548d91612ee49083908301614472565b81548110612eee57fe5b60009182526020909120600290910201805467ffffffffffffffff60881b1916600160881b6001600160401b0388160217815590505b612f2d81610c1d565b60018101805467ffffffffffffffff19166001600160401b03871617905586612f7b5780546001600160401b0361010080830482166001019091160268ffffffffffffffff00199091161781555b838015612f86575086155b156130bd57604080516101608101825284546001600160401b0381168252600160401b810460ff9081161515602080850191909152600160481b83048216151584860152600160501b8304821615156060850152600160581b830490911615156080840152600160601b9091046001600160801b031660a08301526001808701546001600160a01b0390811660c085015260028089015490911660e085015260038801546101008086019190915260048901546101208601526005890180548751948116159092026000190190911691909104601f81018490048402830184019095528482526130b89488946130a994339491938793610140860193928301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b8391908863ffffffff613af616565b6131e9565b6001600160a01b038b81166000908152601560209081526040918290205482516101608101845287546001600160401b0381168252600160401b810460ff908116151583860152600160481b82048116151583870152600160501b8204811615156060840152600160581b82041615156080830152600160601b90046001600160801b031660a0820152600180890154861660c08301526002808a0154871660e084015260038a01546101008085019190915260048b015461012085015260058b0180548851948116159092026000190190911691909104601f81018690048602830186019096528582526131e9968a966130a99695909116948793610140860193909290918301828280156127e15780601f106127b6576101008083540402835291602001916127e1565b5050505098975050505050505050565b61320a60168263ffffffff613b1816565b6040516001600160a01b038216907ff012269e1b6bb33c7800e7e54167ddd74f0ae7244108030b6876821d3779822f90600090a250565b845460018601546001600160401b03600160881b90920482168501911681111561326a57600080fd5b600085828154811061327857fe5b6000918252602090912089546006909202019150426001600160401b03600160c01b90920491909116600a01116132ae57600080fd5b6005880154640100000000900460ff166132c757600080fd5b8054600160581b900460ff16156132dd57600080fd5b8054600160501b900460ff16156132f357600080fd5b8351602085012061330385613b4d565b1561330d57600080fd5b60005460ff166133305761332781878b6004015487613b8a565b61333057600080fd5b50805460ff60581b1916600160581b1790559695505050505050565b61335d60178263ffffffff613b1816565b6040516001600160a01b038216907ff84a004e1673d2f349a7c93c72b3794b8eba6d2f9338044d8c8cd260e51a57a190600090a250565b6133a560168263ffffffff61386c16565b6040516001600160a01b038216907fa199526a01dbcba68aa3ab9d7d06c6692c83fb1a8bcf2184e6d94ad34f5aaf9590600090a250565b601490565b600062019a285a116133f257600080fd5b8260e001516001600160a01b031663a9f793088460200151848660c001518761010001518861014001516040518663ffffffff1660e01b815260040161343c959493929190615197565b602060405180830381600087803b15801561345657600080fd5b505af115801561346a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d7391908101906148d9565b60025460405160009182916060916001600160a01b0316906134af9061514a565b6040518091039020888888886040516024016134ce9493929190615371565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161350c9190615128565b600060405180830381855af49150503d8060008114613547576040519150601f19603f3d011682016040523d82523d6000602084013e61354c565b606091505b50915091508161355b57600080fd5b5060019695505050505050565b60006001600160a01b03821661357d57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b3b151590565b6135ab61449e565b6020808401805115159183019190915260408085015115159083015260c0808501516001600160a01b031690830152511580156135e9575082604001515b156136335760c08301516001600160a01b031660e082015261014083015160208101516001600160801b03811661361f57600080fd5b6001600160801b031660a0830152506110dc565b6001600160a01b03821660e082015260a0808401516001600160801b0316908201526101008084015190820152610140808401519082015292915050565b6136796144fc565b633b9aca006020820152620186a0604082015260e08401516001600160a01b0316606082015260a08401516001600160801b031660808201526136bd848484613c55565b60a08201529392505050565b6040805160098082526101408201909252606091829190816020015b60608152602001906001900390816136e55750508351909150613710906001600160401b0316613d2b565b8160008151811061371d57fe5b60200260200101819052506137358360200151613d2b565b8160018151811061374257fe5b602002602001018190525061376383604001516001600160401b0316613d2b565b8160028151811061377057fe5b602002602001018190525061379183606001516001600160a01b0316613d3e565b8160038151811061379e57fe5b60200260200101819052506137b68360800151613d2b565b816004815181106137c357fe5b60200260200101819052506137db8360a00151613d5d565b816005815181106137e857fe5b60200260200101819052506138008360c00151613d2b565b8160068151811061380d57fe5b60200260200101819052506138258360e00151613d2b565b8160078151811061383257fe5b602002602001018190525061384b836101000151613d2b565b8160088151811061385857fe5b6020026020010181905250610d7381613db3565b6138768282613568565b1561388057600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000818310156138b55781610d73565b5090919050565b60058201805464010000000064ff000000001990911617905581546001600160c01b0316600160c01b426001600160401b039081169190910291909117835560018401805467ffffffffffffffff60801b1916600160801b8484160217808255845467ffffffffffffffff60401b199091169216600160401b029190911790556006546040517ffb96205e4b3633fd57aa805b26b51ecf528714a10241a4af015929dce86768d99161396f9184906153a6565b60405180910390a1505050565b8154600090600160801b90046001600160401b03168211156139a0575060006110dc565b600082815260038401602052604090208054600160c81b900460ff166139ca5760009150506110dc565b8054600160d01b900460ff16156139e55760009150506110dc565b6006810154600160881b900460ff1680613a0a57506006810154600160901b900460ff165b15613a195760009150506110dc565b60060154426001600160401b039091166014011115905092915050565b60008181526003830160205260409081902060068082018054600160801b60ff60801b19909116811767ffffffffffffffff60401b19908116600160401b426001600160401b03908116820292909217909455855460018a01805467ffffffffffffffff60801b19169186900483169094021790911681881684021790915591548354945193947f70801d4d63b3da6c19ba7349911f45bed5a99ccdfb51b8138c105872529bebd59461396f949293889383811693919091041690615403565b613b0a613b0583836000613671565b613e10565b836004018190555050505050565b613b228282613568565b613b2b57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006060613b6b6004613b5f85613e2c565b9063ffffffff613e4f16565b9050610d7381600081518110613b7d57fe5b6020026020010151613edc565b60006020825181613b9757fe5b0615613ba257600080fd5b60006020835181613baf57fe5b04905060108110613bbf57600080fd5b60008660205b836020028111613c475785810151925060028806613c0d578183604051602001613bf09291906150e6565b604051602081830303815290604052805190602001209150613c39565b8282604051602001613c209291906150e6565b6040516020818303038152906040528051906020012091505b600288049750602001613bc5565b509094149695505050505050565b606083604001518015613c6a57508360200151155b15613c7457610d73565b600082613c9457604051613c879061513f565b6040518091039020613ca9565b604051613ca090615155565b60405180910390205b9050808560200151613cbc576000613cbf565b60015b60ff1660001b858760c001516001600160a01b0316886101000151896101400151604051602001613cf495949392919061522d565b60408051601f1981840301815290829052613d12929160200161510c565b6040516020818303038152906040529150509392505050565b60606110dc613d3983613f00565b613d5d565b60408051600560a21b8318601482015260348101909152606090610d73815b606081516001148015613d8f5750607f60f81b82600081518110613d7d57fe5b01602001516001600160f81b03191611155b15613d9b575080610b62565b6110dc613dad8351608060ff16613ff9565b836140c2565b604080516000808252602082019092526060915b8351811015613df757613ded82858381518110613de057fe5b60200260200101516140c2565b9150600101613dc7565b50610d73613e0a825160c060ff16613ff9565b826140c2565b60006060613e1d836136c9565b80516020909101209392505050565b613e34614563565b50805160408051808201909152602092830181529182015290565b606081604051908082528060200260200182016040528015613e8b57816020015b613e78614563565b815260200190600190039081613e705790505b509050613e9661457d565b613e9f846141a7565b905060005b83811015613ed457613eb5826141cc565b838281518110613ec157fe5b6020908102919091010152600101613ea4565b505092915050565b6000806000613eea846141fe565b90516020919091036101000a9004949350505050565b6040805160208082528183019092526060916000918391602082018180388339019050509050836020820152600091505b6020821015613f6a57808281518110613f4657fe5b01602001516001600160f81b03191615613f5f57613f6a565b600190910190613f31565b6060826020036040519080825280601f01601f191660200182016040528015613f9a576020820181803883390190505b50905060005b8151811015613ff0578251600185019484918110613fba57fe5b602001015160f81c60f81b828281518110613fd157fe5b60200101906001600160f81b031916908160001a905350600101613fa0565b50949350505050565b6060600160401b83106140275760405162461bcd60e51b815260040161401e90615266565b60405180910390fd5b604080516001808252818301909252606091602082018180388339019050509050603784116140815782840160f81b8160008151811061406357fe5b60200101906001600160f81b031916908160001a90535090506110dc565b606061408c85613f00565b90508381510160370160f81b826000815181106140a557fe5b60200101906001600160f81b031916908160001a905350612bce82825b60608082518451016040519080825280601f01601f1916602001820160405280156140f4576020820181803883390190505b5090506000805b855181101561414a5785818151811061411057fe5b602001015160f81c60f81b83838151811061412757fe5b60200101906001600160f81b031916908160001a905350600191820191016140fb565b5060005b845181101561419d5784818151811061416357fe5b602001015160f81c60f81b83838151811061417a57fe5b60200101906001600160f81b031916908160001a9053506001918201910161414e565b5090949350505050565b6141af61457d565b60006141ba8361425d565b83519383529092016020820152919050565b6141d4614563565b602082015160006141e4826142c7565b828452602080850182905292019390910192909252919050565b805180516000918291821a906080821015614220579250600191506142589050565b60b882101561423e5760018560200151039250806001019350614255565b602085015182820160b51901945082900360b60192505b50505b915091565b8051805160009190821a90608082101561427c57600092505050610b62565b60b8821080614297575060c08210158015614297575060f882105b156142a757600192505050610b62565b60c08210156142bc575060b519019050610b62565b5060f5190192915050565b8051600090811a60808110156142e057600191506142f1565b60b88110156142f157607e19810191505b50919050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152610100810161434561459d565b81526020016143526145d2565b905290565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915290565b8154818355818111156143ef576006028160060283600052602060002091820191016143ef9190614616565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061443557805160ff1916838001178555614462565b82800160010185558215614462579182015b82811115614462578251825591602001919060010190614447565b5061446e929150614678565b5090565b8154818355818111156143ef576002028160020283600052602060002091820191016143ef9190614692565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925261014081019190915290565b60405180610120016040528060006001600160401b031681526020016000815260200160006001600160401b0316815260200160006001600160a01b0316815260200160008152602001606081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6040518060400160405280614590614563565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b61148b91905b8082111561446e5780546001600160e01b03191681556001810180546001600160a01b031990811690915560028201805490911690556000600382018190556004820181905561466f60058301826146c8565b5060060161461c565b61148b91905b8082111561446e576000815560010161467e565b61148b91905b8082111561446e5780546001600160c81b03191681556001810180546001600160e01b0319169055600201614698565b50805460018160011615610100020316600290046000825580601f106146ee5750610c1d565b601f016020900490600052602060002090810190610c1d9190614678565b80356110dc8161568d565b60008083601f84011261472957600080fd5b5081356001600160401b0381111561474057600080fd5b60208301915083602082028301111561475857600080fd5b9250929050565b80356110dc816156a1565b80516110dc816156a1565b80356110dc816156aa565b60008083601f84011261479257600080fd5b5081356001600160401b038111156147a957600080fd5b60208301915083600182028301111561475857600080fd5b600082601f8301126147d257600080fd5b81356147e56147e0826155aa565b615584565b9150808252602083016020830185838301111561480157600080fd5b61480c83828461564b565b50505092915050565b60006020828403121561482757600080fd5b6000614833848461470c565b949350505050565b6000806040838503121561484e57600080fd5b600061485a858561470c565b925050602061486b8582860161470c565b9150509250929050565b60008060006060848603121561488a57600080fd5b6000614896868661470c565b93505060206148a786828701614775565b92505060408401356001600160401b038111156148c357600080fd5b6148cf868287016147c1565b9150509250925092565b6000602082840312156148eb57600080fd5b6000614833848461476a565b60006020828403121561490957600080fd5b60006148338484614775565b6000806040838503121561492857600080fd5b60006149348585614775565b925050602061486b8582860161475f565b6000806000806080858703121561495b57600080fd5b60006149678787614775565b945050602061497887828801614775565b935050604061498987828801614775565b925050606061499a87828801614775565b91505092959194509250565b60008060008060008060008060a0898b0312156149c257600080fd5b60006149ce8b8b614775565b98505060208901356001600160401b038111156149ea57600080fd5b6149f68b828c01614780565b975097505060408901356001600160401b03811115614a1457600080fd5b614a208b828c01614780565b95509550506060614a338b828c01614775565b93505060808901356001600160401b03811115614a4f57600080fd5b614a5b8b828c01614717565b92509250509295985092959890939650565b60008060408385031215614a8057600080fd5b6000614a8c8585614775565b925050602061486b85828601614775565b600080600080600060a08688031215614ab557600080fd5b6000614ac18888614775565b9550506020614ad288828901614775565b9450506040614ae388828901614775565b9350506060614af488828901614775565b9250506080614b0588828901614775565b9150509295509295909350565b600080600080600080600060a0888a031215614b2d57600080fd5b6000614b398a8a614775565b9750506020614b4a8a828b01614775565b9650506040614b5b8a828b01614775565b95505060608801356001600160401b03811115614b7757600080fd5b614b838a828b01614780565b945094505060808801356001600160401b03811115614ba157600080fd5b614bad8a828b01614780565b925092505092959891949750929550565b614bc78161561f565b82525050565b614bc7816155de565b614bc7816155e9565b614bc78161148b565b614bc7614bf48261148b565b61148b565b614bc7614bf4826155ee565b6000614c10826155d1565b614c1a81856155d5565b9350614c2a818560208601615657565b614c3381615683565b9093019392505050565b6000614c48826155d1565b614c528185610b62565b9350614c62818560208601615657565b9290920192915050565b614bc78161562a565b6000614c82603283610b62565b7f7375626d69744e52452875696e743235362c75696e743235362c627974657333815271322c627974657333322c627974657333322960701b602082015260320192915050565b6000614cd6603c83610b62565b7f6170706c7952657175657374496e4368696c64436861696e28626f6f6c2c756981527f6e743235362c616464726573732c627974657333322c627974657329000000006020820152603c0192915050565b6000614d35600e836155d5565b6d696e70757420746f6f206c6f6e6760901b815260200192915050565b6000614d5f602a83610b62565b7f7375626d69744f52422875696e743235362c627974657333322c627974657333815269322c627974657333322960b01b6020820152602a0192915050565b6000614dab603b83610b62565b7f6170706c7952657175657374496e526f6f74436861696e28626f6f6c2c75696e81527f743235362c616464726573732c627974657333322c62797465732900000000006020820152603b0192915050565b80516102c0830190614e0f84826150dd565b506020820151614e2260208501826150dd565b506040820151614e3560408501826150dd565b506060820151614e486060850182614bd6565b506080820151614e5b6080850182614bd6565b5060a0820151614e6e60a0850182614bd6565b5060c0820151614e8160c0850182614bd6565b5060e0820151614e9460e0850182614bd6565b50610100820151614ea961010085018261505b565b50610120820151614ebe6101c0850182614ec4565b50505050565b8051610100830190614ed68482614bdf565b506020820151614ee96020850182614bdf565b506040820151614efc6040850182614bdf565b506060820151614f0f60608501826150dd565b506080820151614f2260808501826150dd565b5060a0820151614f3560a0850182614bd6565b5060c0820151614f4860c0850182614bd6565b5060e0820151614ebe60e0850182614bd6565b80516101a0830190614f6d84826150dd565b506020820151614f8060208501826150dd565b506040820151614f9360408501826150dd565b506060820151614fa660608501826150dd565b506080820151614fb960808501826150dd565b5060a0820151614fcc60a0850182614bdf565b5060c0820151614fdf60c0850182614bdf565b5060e0820151614ff260e0850182614bdf565b50610100820151615007610100850182614bd6565b5061012082015161501c610120850182614bd6565b50610140820151615031610140850182614bd6565b50610160820151615046610160850182614bd6565b50610180820151614ebe610180850182614bd6565b805160c083019061506c84826150dd565b50602082015161507f60208501826150dd565b50604082015161509260408501826150dd565b5060608201516150a560608501826150dd565b5060808201516150b860808501826150dd565b5060a0820151614ebe60a08501826150dd565b614bc7816155fb565b614bc781615640565b614bc781615613565b60006150f28285614be8565b6020820191506151028284614be8565b5060200192915050565b60006151188285614bf9565b6004820191506148338284614c3d565b6000610d738284614c3d565b60006110dc82614c75565b60006110dc82614cc9565b60006110dc82614d52565b60006110dc82614d9e565b602081016110dc8284614bcd565b6040810161517c8285614bcd565b610d736020830184614bcd565b602081016110dc8284614bd6565b60a081016151a58288614bd6565b6151b26020830187614bdf565b6151bf6040830186614bbe565b6151cc6060830185614bdf565b8181036080830152610c5b8184614c05565b60c081016151ec8289614bd6565b6151f960208301886150dd565b61520660408301876150dd565b61521360608301866150dd565b61522060808301856150dd565b610c5b60a0830184614bcd565b60a0810161523b8288614bdf565b6152486020830187614bdf565b6151bf6040830186614bdf565b60208082528101610d738184614c05565b602080825281016110dc81614d28565b6102c081016110dc8284614dfd565b6101a081016110dc8284614f5b565b602081016110dc8284614bdf565b61010081016152b1828b614bdf565b6152be602083018a614bbe565b6152cb6040830189614bcd565b6152d86060830188614c6c565b6152e56080830187614bdf565b81810360a08301526152f78186614c05565b905061530660c0830185614bd6565b61531360e0830184614bd6565b9998505050505050505050565b610100810161532f828b614bdf565b61533c602083018a614bbe565b6153496040830189614bcd565b6152d86060830188614bdf565b604081016153648285614bdf565b610d736020830184614bd6565b6080810161537f8287614bdf565b61538c6020830186614bdf565b6153996040830185614bdf565b612bce6060830184614bdf565b604081016153b48285614bdf565b610d736020830184614bdf565b60a081016153cf8288614bdf565b6153dc6020830187614bdf565b6153e96040830186614bdf565b6153f66060830185614bdf565b6123866080830184614bdf565b608081016154118287614bdf565b61541e6020830186614bdf565b61542b60408301856150d4565b612bce60608301846150d4565b6101608101615447828e6150dd565b615454602083018d614bd6565b615461604083018c614bd6565b61546e606083018b614bd6565b61547b608083018a614bd6565b61548860a08301896150cb565b61549560c0830188614bcd565b6154a260e0830187614bcd565b6154b0610100830186614bdf565b6154be610120830185614bdf565b8181036101408301526154d18184614c05565b9d9c50505050505050505050505050565b61018081016154f1828f6150dd565b6154fe602083018e6150dd565b61550b604083018d6150dd565b615518606083018c6150dd565b615525608083018b6150dd565b61553260a083018a6150dd565b61553f60c08301896150dd565b61554c60e08301886150dd565b61555a6101008301876150dd565b6155686101208301866150dd565b6155766101408301856150dd565b6154d1610160830184614bd6565b6040518181016001600160401b03811182821017156155a257600080fd5b604052919050565b60006001600160401b038211156155c057600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b60006110dc82615607565b151590565b6001600160e01b03191690565b6001600160801b031690565b6001600160a01b031690565b6001600160401b031690565b60006110dc82615635565b60006110dc8261148b565b60006110dc826155de565b60006110dc82615613565b82818337506000910152565b60005b8381101561567257818101518382015260200161565a565b83811115614ebe5750506000910152565b601f01601f191690565b615696816155de565b8114610c1d57600080fd5b615696816155e9565b6156968161148b56fea365627a7a72315820bfe268b1a951973c135b3127ddf36b187f7ab4cdf0aca2a2f9f73df2846800136c6578706572696d656e74616cf564736f6c634300050c0040

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000a2d8bf53ff0e6b208fddd2696b156a7ccb4d1a80000000000000000000000004b01361e3bb5c1856103ce7fc1c923b6adcc3eed0000000000000000000000005c642140a3b6fa39dfd1aa9eba6c5239f5c457d500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002db431b544b2f5468e3f771d7843d9c5df3b4edcf8bc1c599f18f0b4ea8709bc356e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42156e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421

-----Decoded View---------------
Arg [0] : _epochHandler (address): 0x0A2D8BF53FF0E6B208fddd2696b156a7cCb4D1A8
Arg [1] : _submitHandler (address): 0x4B01361e3bb5C1856103ce7fc1C923b6ADcC3eED
Arg [2] : _etherToken (address): 0x5c642140A3b6fA39Dfd1AA9eBA6C5239F5c457D5
Arg [3] : _development (bool): True
Arg [4] : _NRELength (uint256): 2
Arg [5] : _statesRoot (bytes32): 0xdb431b544b2f5468e3f771d7843d9c5df3b4edcf8bc1c599f18f0b4ea8709bc3
Arg [6] : _transactionsRoot (bytes32): 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
Arg [7] : _receiptsRoot (bytes32): 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000a2d8bf53ff0e6b208fddd2696b156a7ccb4d1a8
Arg [1] : 0000000000000000000000004b01361e3bb5c1856103ce7fc1c923b6adcc3eed
Arg [2] : 0000000000000000000000005c642140a3b6fa39dfd1aa9eba6c5239f5c457d5
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : db431b544b2f5468e3f771d7843d9c5df3b4edcf8bc1c599f18f0b4ea8709bc3
Arg [6] : 56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
Arg [7] : 56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421


Deployed Bytecode Sourcemap

52769:20642:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67654:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67654:131:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43844:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43844:41:0;;;:::i;54933:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54933:149:0;;;;;;;;:::i;:::-;;55088:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55088:94:0;;;;;;;;:::i;44126:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44126:40:0;;;:::i;56634:515::-;;;;;;;;;:::i;:::-;;;;;;;;66699:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66699:120:0;;;;;;;;:::i;43149:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43149:33:0;;;:::i;42374:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42374:23:0;;;:::i;66573:120::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66573:120:0;;;;;;;;:::i;42863:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42863:26:0;;;:::i;61572:551::-;;;;;;;;;:::i;66825:183::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66825:183:0;;;;;;;;:::i;:::-;;;;;;;;43298:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43298:27:0;;;:::i;40416:71::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40416:71:0;;;:::i;67014:139::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67014:139:0;;;:::i;58386:829::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58386:829:0;;;;;;;;:::i;67159:171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67159:171:0;;;;;;;;:::i;:::-;;;;;;;;42508:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42508:40:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66226:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66226:170:0;;;;;;;;:::i;41899:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41899:23:0;;;:::i;:::-;;;;;;;;67336:175;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67336:175:0;;;;;;;;:::i;41386:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41386:77:0;;;:::i;60122:996::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;60122:996:0;;;;;;;;:::i;57550:475::-;;;;;;;;;:::i;42022:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42022:26:0;;;:::i;42451:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42451:50:0;;;;;;;;:::i;58031:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58031:113:0;;;:::i;55282:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55282:108:0;;;;;;;;:::i;62129:402::-;;;;;;;;;:::i;41859:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41859:23:0;;;:::i;55188:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55188:88:0;;;;;;;;:::i;44252:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44252:33:0;;;:::i;45254:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45254:36:0;;;:::i;45206:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45206:41:0;;;:::i;66463:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66463:104:0;;;:::i;62678:3542::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62678:3542:0;;;:::i;57155:389::-;;;;;;;;;:::i;41170:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41170:109:0;;;;;;;;:::i;42318:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42318:21:0;;;:::i;44189:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44189:40:0;;;:::i;42597:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42597:26:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;55870:82;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55870:82:0;;;:::i;42948:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42948:53:0;;;;;;;;:::i;41992:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41992:25:0;;;:::i;40215:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40215:103:0;;;;;;;;:::i;42788:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42788:31:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;44004:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44004:41:0;;;:::i;43330:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43330:27:0;;;:::i;43187:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43187:34:0;;;:::i;43061:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;43061:54:0;;;;;;;;:::i;55491:373::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55491:373:0;;;;;;;;:::i;67861:114::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67861:114:0;;;;;;;;:::i;56046:252::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56046:252:0;;;;;;;;:::i;:::-;;;;;;;;67517:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;67517:131:0;;;;;;;;:::i;43542:56::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;43542:56:0;;;;;;;;:::i;43633:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43633:81:0;;;:::i;41959:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41959:28:0;;;:::i;56355:273::-;;;:::i;41927:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41927:27:0;;;:::i;61160:406::-;;;;;;;;;:::i;55958:82::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55958:82:0;;;:::i;42752:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42752:31:0;;;;;;;;:::i;68049:221::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;68049:221:0;;;;;;;;:::i;42628:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42628:26:0;;;;;;;;:::i;43226:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43226:34:0;;;:::i;67654:131::-;67723:4;67743:17;;;:5;:17;;;;;:36;;;-1:-1:-1;;;67743:36:0;;-1:-1:-1;;;;;67743:36:0;67654:131;;;;:::o;43844:41::-;43884:1;43844:41;:::o;54933:149::-;53619:8;;;;;-1:-1:-1;;;;;53619:8:0;53605:10;:22;;:51;;-1:-1:-1;53645:11:0;;-1:-1:-1;;;;;53645:11:0;53631:10;:25;53605:51;53597:60;;;;;;55018:8;:20;;-1:-1:-1;;;;;;55018:20:0;;-1:-1:-1;;;;;55018:20:0;;;;;;55050:26;;;;;;55018:20;;55050:26;;;;;;;;;;54933:149;:::o;55088:94::-;53093:8;;;;;-1:-1:-1;;;;;53093:8:0;53079:10;:22;53071:31;;;;;;55154:22;55168:7;55154:13;:22::i;:::-;55088:94;:::o;44126:40::-;44164:2;44126:40;:::o;56634:515::-;56966:12;41126:23;41138:10;41126:11;:23::i;:::-;41118:32;;;;;;43998:1;53257:11;;;;53252:51;;53279:16;:14;:16::i;:::-;;53252:51;56997:146;57035:5;57049;57063:15;57087:22;57118:18;56997:29;:146::i;:::-;56990:153;56634:515;-1:-1:-1;;;;;;;56634:515:0:o;66699:120::-;66756:14;66786:17;;;:5;:17;;;;;:27;-1:-1:-1;;;66786:27:0;;-1:-1:-1;;;;;66786:27:0;;66699:120::o;43149:33::-;;;;:::o;42374:23::-;;;;:::o;66573:120::-;66630:14;66660:17;;;:5;:17;;;;;:27;;;-1:-1:-1;;;;;66660:27:0;;66573:120::o;42863:26::-;;;;:::o;61572:551::-;61707:12;;61769:9;61797:77;61811:4;61817;61823:3;61769:9;61839:8;61849:10;61707:12;;61797:13;:77::i;:::-;61881:14;:19;;61899:1;61881:19;;;61940:11;;61881:14;61934:18;;;:5;:18;;;;;;61966:32;;61785:89;;-1:-1:-1;61934:18:0;61966:32;;;;61785:89;;61881:14;61966:32;;;;;;;;;;62010:89;62025:9;62036:10;62048:3;62053:9;62064:8;62074:10;62086:5;62093;62010:89;;;;;;;;;;;;;;;;;;;;;;62113:4;62106:11;;;;;61572:551;;;;;;:::o;66825:183::-;66922:23;;:::i;:::-;66965:5;:17;66971:10;66965:17;;;;;;;;;;;:24;;:37;66990:11;66965:37;;;;;;;;;;;66958:44;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;-1:-1:-1;;;;;66958:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66825:183;;;;;:::o;43298:27::-;;;;:::o;40416:71::-;40456:25;40470:10;40456:13;:25::i;:::-;40416:71::o;67014:139::-;67059:17;;:::i;:::-;67092:5;:18;67098:11;;67092:18;;;;;;;;;;;:25;;:55;67118:5;:18;67124:11;;67118:18;;;;;;;;;;;:28;;;;;;;;;;-1:-1:-1;;;;;67118:28:0;-1:-1:-1;;;;;67092:55:0;;;;;;;;;;;;67085:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;-1:-1:-1;;;;;67085:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67014:139;;:::o;58386:829::-;58557:22;58582:18;;;:5;:18;;;;;;;;58637:25;;;:11;;;:25;;;;;;58679:12;;;;;;58671:21;;;;;;58707:12;;;;;;;;;58699:21;;;;;;58771:16;;;;58729:14;;58771:16;;;;;58796:357;;;;58836:81;58853:2;58857:4;58862:2;:17;;;;;;;;;;-1:-1:-1;;;;;58862:17:0;-1:-1:-1;;;;;58857:23:0;;;;;;;;;;;;;;;;;;;58882:4;58888:6;58896:12;;58836:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;58836:81:0;;;;;;58910:6;;58836:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58836:16:0;;-1:-1:-1;;;58836:81:0:i;:::-;58963:29;;58824:93;;-1:-1:-1;58963:10:0;;:29;;43838:1;;;58963:29;43838:1;58963:29;43838:1;58963:10;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58963:29:0;58796:357;;;59027:80;59044:2;59048:4;59053:2;:17;;;;;;;;;;-1:-1:-1;;;;;59053:17:0;-1:-1:-1;;;;;59048:23:0;;;;;;;;;;;;;;;;;;;59073:4;59078:6;59086:12;;59027:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;59027:80:0;;;;;;59100:6;;59027:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;59027:16:0;;-1:-1:-1;;;59027:80:0:i;:::-;59116:29;;59015:92;;-1:-1:-1;59116:10:0;;:29;;43800:1;;;59116:29;43800:1;59116:29;43800:1;59116:10;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59116:29:0;58796:357;59166:43;59184:9;59195:13;59166:43;;;;;;;;;;;;;;;;58386:829;;;;;;;;;;;:::o;67159:171::-;67248:23;;:::i;:::-;-1:-1:-1;67287:17:0;;;;:5;:17;;;;;;;;:37;;;:24;;;;:37;;;;;;67280:44;;;;;;;;;-1:-1:-1;;;;;67280:44:0;;;;;-1:-1:-1;;;67280:44:0;;;;;;;;;;;-1:-1:-1;;;67280:44:0;;;;;;;;;;;-1:-1:-1;;;67280:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67159:171::o;42508:40::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42508:40:0;;;;-1:-1:-1;;;42508:40:0;;;;;;-1:-1:-1;;;42508:40:0;;;;;;-1:-1:-1;;;42508:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66226:170::-;66278:12;;66299:72;66320:1;66316;:5;66299:72;;;66345:17;:15;:17::i;:::-;66337:26;;;;;;66323:3;;66299:72;;;-1:-1:-1;66386:4:0;;66226:170;-1:-1:-1;;66226:170:0:o;41899:23::-;;;;;;-1:-1:-1;;;;;41899:23:0;;:::o;67336:175::-;67436:4;67456:17;;;:5;:17;;;;;;;;:37;;;:24;;;;:37;;;;:49;-1:-1:-1;;;67456:49:0;;-1:-1:-1;;;;;67456:49:0;;67336:175::o;41386:77::-;41429:28;41446:10;41429:16;:28::i;60122:996::-;60369:11;;60338:22;60363:18;;;:5;:18;;;;;;;;60418:25;;;:11;;;:25;;;;;;60502:12;;;;;;60501:13;60493:22;;;;;;60583:12;;60615:15;-1:-1:-1;;;;;;;;60583:12:0;;;;;;;44164:2;60583:29;:47;60575:56;;;;;;60122:996;;;;;;;;;;:::o;57550:475::-;57746:12;;53168:31;;42022:26;;;-1:-1:-1;;;;;42022:26:0;;:::o;42451:50::-;;;;;;;;;;;;;:::o;58031:113::-;58074:12;58103:16;:14;:16::i;:::-;58095:25;;;;;;-1:-1:-1;58134:4:0;58031:113;:::o;55282:108::-;53619:8;;;;;-1:-1:-1;;;;;53619:8:0;53605:10;:22;;:51;;-1:-1:-1;53645:11:0;;-1:-1:-1;;;;;53645:11:0;53631:10;:25;53605:51;53597:60;;;;;;55363:11;:21;;-1:-1:-1;;;;;;55363:21:0;-1:-1:-1;;;;;55363:21:0;;;;;;;;;;55282:108::o;62129:402::-;62290:12;;62314:14;62347:67;62361:4;62367;62373:3;62378:1;62381:8;62391:10;62403:4;62409;62347:13;:67::i;:::-;62335:79;;62428;62443:9;62454:10;62466:3;62471:1;62474:8;62484:10;62496:4;62502;62428:79;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62521:4:0;;62129:402;-1:-1:-1;;;;;62129:402:0:o;41859:23::-;;;;;;:::o;55188:88::-;53093:8;;;;;-1:-1:-1;;;;;53093:8:0;53079:10;:22;53071:31;;;;;;55251:19;55262:7;55251:10;:19::i;44252:33::-;44283:2;44252:33;:::o;45254:36::-;45286:4;45254:36;:::o;45206:41::-;45241:6;45206:41;:::o;66463:104::-;66510:16;66542:19;:17;:19::i;:::-;66535:26;;66463:104;:::o;62678:3542::-;62794:21;;62721:12;62788:28;;;:5;:28;;;;;62842:22;;62907:14;;;;62881:22;;62721:12;;62788:28;62842:22;-1:-1:-1;;;;;62907:14:0;-1:-1:-1;62881:40:0;62873:49;;;;;;62973:22;;62931:27;62961:35;;;:11;;;:35;;;;;;;;63030:24;;;:11;;;:24;;;;;;63145:16;;-1:-1:-1;;;;;63145:16:0;:21;;;;:67;;-1:-1:-1;63196:16:0;;63170:22;;-1:-1:-1;;;;;63196:16:0;;;-1:-1:-1;63170:42:0;63145:67;63141:388;;;-1:-1:-1;;63223:21:0;:26;;63248:1;63223:26;;;;;:21;63265:28;;;:5;:28;;;;;;;;63318:15;;-1:-1:-1;;;;;;;;63318:15:0;;;;63350:24;;;:11;;;:24;;;;;-1:-1:-1;;;63410:15:0;;;;;;63385:22;:40;;;63434:22;:36;;;63486:35;;:11;;;:35;;;;;;;63265:28;;-1:-1:-1;63318:15:0;;-1:-1:-1;63141:388:0;63574:12;;;;;;63569:492;;63601:16;63597:183;;63670:21;;63644:48;;;;:25;:48;;;;;;;-1:-1:-1;63597:183:0;;;63733:24;;;;:11;;;:24;;;;;;:37;;;-1:-1:-1;;;63733:37:0;;-1:-1:-1;;;;;63733:37:0;;63597:183;63796:16;63788:25;;;;;;-1:-1:-1;;63832:24:0;;;;:11;;;:24;;;;;;;;63890:22;;-1:-1:-1;;;;;63890:22:0;63865;:47;;;63926:35;;:11;;;:35;;;;;;;63569:492;;;-1:-1:-1;63998:14:0;;-1:-1:-1;;;;;63998:14:0;;64029:24;;;:11;;;:24;;;;;63998:14;;-1:-1:-1;63569:492:0;64069:22;:36;;;64123:13;;-1:-1:-1;;;64123:13:0;;;;64122:14;64114:23;;;;;;64152:15;;-1:-1:-1;;;64152:15:0;;;;64144:24;;;;;;64183:12;;;;;;64175:21;;;;;;64211:12;;;;;;;;;64203:21;;;;;;64239:14;;64267:15;-1:-1:-1;;;;;;;;64239:14:0;;;;;;;44283:2;64239:24;:43;;64231:52;;;;;;64314:16;;;;;;;;;64310:1003;;;64353:15;;64387:4;:11;64353:15;;-1:-1:-1;64387:23:0;-1:-1:-1;64379:32:0;;;;;;64422:24;64449:4;64454:9;64449:15;;;;;;;;;;;;;;;;;;64422:42;;64473:29;64505:4;64510:2;:17;;;;;;;;;;-1:-1:-1;;;;;64510:17:0;-1:-1:-1;;;;;64505:23:0;;;;;;;;;;;;;;;;;;;;;;64547:16;;64505:23;;-1:-1:-1;;;;64547:16:0;;-1:-1:-1;;;;;64547:16:0;-1:-1:-1;;64547:29:0;;;:60;;-1:-1:-1;64593:14:0;;;;-1:-1:-1;;;;;64593:14:0;64580:27;;;64547:60;64539:69;;;;;;64663:14;;;;-1:-1:-1;;;;;64663:14:0;64650:27;;64646:220;;;64694:16;;-1:-1:-1;;;;;64694:16:0;:20;;;;:70;;-1:-1:-1;64744:16:0;;64718:22;;-1:-1:-1;;;;;;;64744:16:0;;;:20;64718:46;;;;64694:70;64690:127;;;64779:21;:26;;64804:1;64779:26;;;64690:127;64829:22;:27;;64855:1;64829:27;;;64646:220;64906:1;64894:13;;64876:15;:31;64922:10;;-1:-1:-1;;;64922:10:0;;;;:29;;;;-1:-1:-1;64937:14:0;;-1:-1:-1;;;64937:14:0;;;;64936:15;64922:29;64918:290;;;65015:27;;;;;;;;;;-1:-1:-1;;;;;65015:27:0;;;;-1:-1:-1;;;65015:27:0;;;;;;;;;;;;;;;;-1:-1:-1;;;65015:27:0;;;;;;;;;;-1:-1:-1;;;65015:27:0;;;;;;;;;;-1:-1:-1;;;65015:27:0;;;;;;;;;;;-1:-1:-1;;;65015:27:0;;;-1:-1:-1;;;;;65015:27:0;;;;;;;;;;-1:-1:-1;;;;;65015:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65015:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;65043:9;;65015:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;-1:-1:-1;65119:13:0;;;;:32;;-1:-1:-1;;;;;65119:13:0;;;;:32;;:13;;;:32;:13;:32;:13;;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65119:32:0;65167:31;65182:9;65193:4;65167:31;;;;;;;;;;;;;;;;64918:290;65216:20;;-1:-1:-1;;;;65216:20:0;-1:-1:-1;;;65216:20:0;;;65252:33;;;;;;65269:9;;65232:4;;65252:33;;;;;;;;;;65301:4;65294:11;;;;;;;;;;;64310:1003;65351:15;;65383:4;:11;65351:15;;-1:-1:-1;65383:23:0;-1:-1:-1;65375:32:0;;;;;;65453:17;;65448:4;:23;;65416:29;;-1:-1:-1;;;65453:17:0;;-1:-1:-1;;;;;65453:17:0;;65448:23;;;;;;;;;;;;;;;;;;;65488:16;;65448:23;;-1:-1:-1;;;;65488:16:0;;-1:-1:-1;;;;;65488:16:0;-1:-1:-1;;65488:29:0;;;:60;;-1:-1:-1;65534:14:0;;;;-1:-1:-1;;;;;65534:14:0;65521:27;;;65488:60;65480:69;;;;;;65600:14;;;;-1:-1:-1;;;;;65600:14:0;65587:27;;65583:265;;;65684:16;;-1:-1:-1;;;;;65684:16:0;:20;;;;:70;;-1:-1:-1;65734:16:0;;65708:22;;-1:-1:-1;;;;;;;65734:16:0;;;:20;65708:46;;;;65684:70;65680:123;;;65767:21;:26;;65792:1;65767:26;;;65680:123;65813:22;:27;;65839:1;65813:27;;;65583:265;65856:24;65883:4;65888:9;65883:15;;;;;;;;;;;;;;;;65935:1;65923:13;;65905:15;:31;65883:15;;;;;65943:20;;-1:-1:-1;;;;65943:20:0;-1:-1:-1;;;65943:20:0;;;;65883:15;;-1:-1:-1;;;;65976:10:0;;65943:20;65976:10;:29;;;;-1:-1:-1;65991:14:0;;-1:-1:-1;;;65991:14:0;;;;65990:15;65976:29;65972:177;;;66016:27;;;;;;;;;;-1:-1:-1;;;;;66016:27:0;;;;-1:-1:-1;;;66016:27:0;;;;;;;;;;;;;;;;-1:-1:-1;;;66016:27:0;;;;;;;;;;-1:-1:-1;;;66016:27:0;;;;;;;;;;-1:-1:-1;;;66016:27:0;;;;;;;;;;;-1:-1:-1;;;66016:27:0;;;-1:-1:-1;;;;;66016:27:0;;;;;;;;;;-1:-1:-1;;;;;66016:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66016:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;66044:9;;66016:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:38;-1:-1:-1;66063:13:0;;;;:32;;-1:-1:-1;;;;;66063:13:0;;;;:32;;:13;;;:32;:13;:32;:13;;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66063:32:0;66109;66124:9;66135:5;66109:32;;;;;;;;;;;;;;;;65972:177;66162:34;66179:9;66190:5;66162:34;;;;;;;;;;;;;;;;66210:4;66203:11;;;;;;;;;62678:3542;:::o;57155:389::-;57390:12;41126:23;41138:10;41126:11;:23::i;:::-;41118:32;;;;;;43998:1;53257:11;;;;53252:51;;53279:16;:14;:16::i;:::-;;53252:51;57421:117;57459:4;57472:11;57492:17;57518:13;57421:29;:117::i;:::-;57414:124;57155:389;-1:-1:-1;;;;;;57155:389:0:o;41170:109::-;41229:4;41249:24;:11;41265:7;41249:24;:15;:24;:::i;42318:21::-;;;;:::o;44189:40::-;44227:2;44189:40;:::o;42597:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42597:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42597:26:0;;;-1:-1:-1;;;;42597:26:0;;;;;;;-1:-1:-1;;;42597:26:0;;;;;-1:-1:-1;;;42597:26:0;;;;;-1:-1:-1;;;42597:26:0;;;;;;-1:-1:-1;;;42597:26:0;;;-1:-1:-1;;;;;42597:26:0;;-1:-1:-1;;;;;42597:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55870:82::-;55935:4;:11;55870:82;:::o;42948:53::-;;;;;;;;;;;;;:::o;41992:25::-;;;-1:-1:-1;;;;;41992:25:0;;:::o;40215:103::-;40271:4;40291:21;:8;40304:7;40291:21;:12;:21;:::i;42788:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42788:31:0;;;;;;-1:-1:-1;;;42788:31:0;;;;;-1:-1:-1;;;42788:31:0;;;;;;;;;-1:-1:-1;;;;;;;;42788:31:0;;;;;:::o;44004:41::-;44043:2;44004:41;:::o;43330:27::-;;;;:::o;43187:34::-;;;;:::o;43061:54::-;;;;;;;;;;;;;:::o;55491:373::-;55615:12;40174:20;40183:10;40174:8;:20::i;:::-;40166:29;;;;;;55647:20;:7;-1:-1:-1;;;;;55647:18:0;;:20::i;:::-;55639:29;;;;;;-1:-1:-1;;;;;55683:29:0;;;55724:1;55683:29;;;:20;:29;;;;;;;:43;55675:52;;;;;;-1:-1:-1;;;;;55736:29:0;;;;;;;:20;:29;;;;;;;:43;;-1:-1:-1;;;;;;55736:43:0;;;;;;;;;;;55793:47;;;;;55736:29;;:43;;55793:47;;;;;;;;;;-1:-1:-1;55854:4:0;55491:373;;;;:::o;67861:114::-;67958:11;;67943:26;;;67861:114::o;56046:252::-;56105:16;56130:24;56157:4;56162:10;56157:16;;;;;;;;;;;;;;;;56234:6;56157:16;;;;;56234:6;;;;-1:-1:-1;;;;;56234:6:0;;;56213:28;;;:20;:28;;;;;;;56189:23;;;;;;;;;-1:-1:-1;;;;;56189:23:0;;;;;-1:-1:-1;;;56189:23:0;;;;;;;;;;-1:-1:-1;;;56189:23:0;;;;;;;;;;-1:-1:-1;;;56189:23:0;;;;;;;;;;-1:-1:-1;;;56189:23:0;;;;;;;;;-1:-1:-1;;;;;;;;56189:23:0;;;;;;;;56234:6;56189:23;;;;;;;;;;;;;;;;;;;;;56234:6;56189:23;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56189:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56157:16;;-1:-1:-1;56189:103:0;;:85;;56256:10;;56157:16;;56189:53;;56213:28;;;;;56189:23;;56157:16;;56189:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;:66;:85;;:66;:85;:::i;:::-;:101;:103::i;67517:131::-;67586:4;67606:17;;;:5;:17;;;;;:36;;;-1:-1:-1;;;67606:36:0;;-1:-1:-1;;;;;67606:36:0;;67517:131::o;43542:56::-;;;;;;;;;;;;-1:-1:-1;;;;;43542:56:0;;:::o;41959:28::-;;;-1:-1:-1;;;;;41959:28:0;;:::o;56355:273::-;43884:1;53168:31;;41927:27;;;-1:-1:-1;;;;;41927:27:0;;:::o;61160:406::-;61323:12;;61347:14;61380:68;61394:4;61400;61406:3;61411:1;61414:8;61424:10;61436:4;61442:5;61380:13;:68::i;:::-;61368:80;;61462;61477:9;61488:10;61500:3;61505:1;61508:8;61518:10;61530:4;61536:5;61462:80;;;;;;;;;;;;;;55958:82;56023:4;:11;55958:82;:::o;42752:31::-;;;;;;;;;;68049:221;68137:14;68164;68160:63;;;68189:4;68194:10;68189:16;;;;;;;;-1:-1:-1;68189:16:0;;68160:63;68238:4;68243:10;68238:16;;;;;;;;;;;;;;;;;;;;;:26;-1:-1:-1;;;68238:26:0;;;;;68049:221;-1:-1:-1;;;68049:221:0:o;42628:26::-;;;;;;;;;;43226:34;;;;:::o;41469:121::-;41525:24;:11;41541:7;41525:24;:15;:24;:::i;:::-;41561:23;;-1:-1:-1;;;;;41561:23:0;;;;;;;;41469:121;:::o;70134:1370::-;70222:11;;70178:4;70216:18;;;:5;:18;;;;;70285:16;;-1:-1:-1;;;;;70285:16:0;:21;70281:56;;70324:5;70317:12;;;;;70281:56;70373:15;;70390:23;;;;;70345:16;;70364:54;;-1:-1:-1;;;;;;;;70373:15:0;;;;;;-1:-1:-1;;;70390:23:0;;;;:27;70364:54;:8;:54::i;:::-;70499:14;;;;70345:73;;-1:-1:-1;;;;;;70499:14:0;70485:28;;70481:63;;;70531:5;70524:12;;;;;;70481:63;70552:27;70582:24;;;:11;;;:24;;;;;70673:14;;;;;;;;;70669:49;;;70705:5;70698:12;;;;;;;70669:49;70764:12;;;;;;70760:271;;;70847:12;;70879:15;-1:-1:-1;;;;;;;;70847:12:0;;;;;;;44164:2;70847:29;:47;70843:86;;;70914:5;70907:12;;;;;;;70843:86;70964:39;70981:4;70987:2;70991:11;70964:16;:39::i;:::-;71019:4;71012:11;;;;;;;70760:271;71100:23;;;;;-1:-1:-1;;;;;;;;71100:23:0;;;;;:27;;;71077:50;71134:84;71141:28;;;;:11;;;:28;;;;;:38;-1:-1:-1;;;71141:38:0;;;;71134:84;;;71209:1;71190:20;71134:84;;;71359:43;71380:4;71386:15;71359:20;:43::i;:::-;71355:123;;;71413:37;71428:4;71434:15;71413:14;:37::i;:::-;71466:4;71459:11;;;;;;;;71355:123;71493:5;71486:12;;;;;;70134:1370;:::o;50820:649::-;51232:13;;48578:63;;51080:12;;;;51205:23;;-1:-1:-1;;;;;51232:13:0;;48578:63;;;;;;;;;;;;51313:5;51327;51341:15;51365:22;51396:18;51259:162;;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;51259:162:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;51259:162:0;;;179:29:-1;;;;160:49;;;51232:190:0;;;;51259:162;51232:190;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;51190:232:0;;;;51437:7;51429:16;;;;;;51459:4;51452:11;;;;50820:649;;;;;;;;:::o;68314:1756::-;68586:14;68686:4;68665:10;:17;:25;;68657:34;;;;;;68725:10;;-1:-1:-1;;;;;68718:17:0;;;68725:10;;68718:17;;68820:22;;;;;68835:7;68834:8;68820:22;:67;;;-1:-1:-1;;;;;;68847:25:0;;;68884:1;68847:25;;;:20;:25;;;;;;;:39;;68820:67;68812:76;;;;;;68909:18;;;:9;:18;;;;:::i;:::-;68897:30;;68934:22;68959:9;68969;68959:20;;;;;;;;;;;;;;;;;;;;;;;68988:11;;;:24;;69002:10;-1:-1:-1;;;;;;68988:24:0;;;;;;;69019:4;;;:10;;;;;-1:-1:-1;;;;;69019:10:0;;;;;69036:37;;-1:-1:-1;;69036:37:0;69057:15;-1:-1:-1;;;;;69036:37:0;;-1:-1:-1;;69080:18:0;-1:-1:-1;;;69080:18:0;;;;;-1:-1:-1;;69105:25:0;-1:-1:-1;;;69105:25:0;;;;;-1:-1:-1;;;;69137:29:0;-1:-1:-1;;;;;;;;69137:29:0;;;;;;69173:9;;;:20;;;69200:24;;68959:20;;-1:-1:-1;69200:24:0;;:11;;;;:24;;;;;:::i;:::-;;69291:7;69286:76;;69317:25;;;;;;;;;;-1:-1:-1;;;;;69317:25:0;;;;-1:-1:-1;;;69317:25:0;;;;;;;;;;;;;;;;-1:-1:-1;;;69317:25:0;;;;;;;;;;-1:-1:-1;;;69317:25:0;;;;;;;;;;-1:-1:-1;;;69317:25:0;;;;;;;;;;;-1:-1:-1;;;69317:25:0;;;-1:-1:-1;;;;;69317:25:0;;;;;;;;;;-1:-1:-1;;;;;69317:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69317:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;69343:9;;69317:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;69309:45;;;;;;69392:11;;69370:19;;69392:16;:50;;69427:11;;-1:-1:-1;;69427:15:0;69392:50;;;69411:13;;;:4;:13;;;;:::i;:::-;69370:72;;69451:28;69482:4;69487:14;69482:20;;;;;;;;;;;;;;;;;;;;;69548:12;;69482:20;;-1:-1:-1;69548:12:0;;;:74;;;69603:19;:17;:19::i;:::-;69580:15;;69564:13;;;;;-1:-1:-1;;;;;;;;69580:15:0;;;;;69564:13;;;:31;:35;:58;;69548:74;69544:193;;;69633:19;;-1:-1:-1;;69633:19:0;69648:4;69633:19;;;;;69671:13;;69666:4;;69671:13;;69666:4;;69671:13;;;:::i;:::-;69666:19;;;;;;;;;;;;;;;;;;;;;69694:35;;-1:-1:-1;;;;69694:35:0;-1:-1:-1;;;;;;;;69694:35:0;;;;;;69666:19;-1:-1:-1;69544:193:0;69745:9;:2;:7;:9::i;:::-;69763:13;;;:33;;-1:-1:-1;;69763:33:0;-1:-1:-1;;;;;69763:33:0;;;;;69808:7;69803:47;;69826:16;;-1:-1:-1;;;;;69826:16:0;;;;;;69841:1;69826:16;;;;;-1:-1:-1;;69826:16:0;;;;;;69803:47;69862:10;:22;;;;;69877:7;69876:8;69862:22;69858:207;;;69912:21;;;;;;;;;;-1:-1:-1;;;;;69912:21:0;;;;-1:-1:-1;;;69912:21:0;;;;;;;;;;;;;;;;-1:-1:-1;;;69912:21:0;;;;;;;;;;-1:-1:-1;;;69912:21:0;;;;;;;;;;-1:-1:-1;;;69912:21:0;;;;;;;;;;;-1:-1:-1;;;69912:21:0;;;-1:-1:-1;;;;;69912:21:0;;;;;;;;;;-1:-1:-1;;;;;69912:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69912:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;69895:62;;69912:21;;:33;;69934:10;;69912:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;69895:2;;:62;69947:9;69895:62;:13;:62;:::i;:::-;69858:207;;;-1:-1:-1;;;;;70019:25:0;;;;;;;:20;:25;;;;;;;;;;69997:21;;;;;;;;;-1:-1:-1;;;;;69997:21:0;;;;-1:-1:-1;;;69997:21:0;;;;;;;;;;;;-1:-1:-1;;;69997:21:0;;;;;;;;;;-1:-1:-1;;;69997:21:0;;;;;;;;;;-1:-1:-1;;;69997:21:0;;;;;;;;;-1:-1:-1;;;69997:21:0;;-1:-1:-1;;;;;69997:21:0;;;;;70019:25;69997:21;;;;;;;;;;;;;;;;;;;;;;;;;70019:25;69997:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69997:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;69980:77;;69997:21;;:48;;70019:25;;;;;69997:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69980:77;68314:1756;;;;;;;;;;;;;;:::o;40611:120::-;40667:24;:8;40683:7;40667:24;:15;:24;:::i;:::-;40703:22;;-1:-1:-1;;;;;40703:22:0;;;;;;;;40611:120;:::o;59221:808::-;59498:16;;59551:14;;;;-1:-1:-1;;;;;;;;59498:16:0;;;;;:25;;;59551:14;59538:27;;;59530:36;;;;;;59575:22;59600:3;59604:9;59600:14;;;;;;;;;;;;;;;;59631:15;;59600:14;;;;;;-1:-1:-1;59659:15:0;-1:-1:-1;;;;;;;;59631:15:0;;;;;;;44283:2;59631:25;:43;59623:52;;;;;;59690:13;;;;;;;;;59682:22;;;;;;59720:12;;-1:-1:-1;;;59720:12:0;;;;59719:13;59711:22;;;;;;59749:11;;-1:-1:-1;;;59749:11:0;;;;59748:12;59740:21;;;;;;59785:23;;;;;;59825:30;59795:12;59825:28;:30::i;:::-;:35;59817:44;;;;;;59873:11;;;;59868:103;;59903:59;59923:4;59929:6;59937:3;:16;;;59955:6;59903:19;:59::i;:::-;59895:68;;;;;;-1:-1:-1;59979:19:0;;-1:-1:-1;;;;59979:19:0;-1:-1:-1;;;59979:19:0;;;59221:808;;;;;;;;:::o;41596:129::-;41655:27;:11;41674:7;41655:27;:18;:27;:::i;:::-;41694:25;;-1:-1:-1;;;;;41694:25:0;;;;;;;;41596:129;:::o;40493:112::-;40546:21;:8;40559:7;40546:21;:12;:21;:::i;:::-;40579:20;;-1:-1:-1;;;;;40579:20:0;;;;;;;;40493:112;:::o;18259:137::-;18388:2;18259:137;:::o;30488:353::-;30602:4;30638:22;30626:9;:34;30618:43;;;;;;30690:4;:7;;;-1:-1:-1;;;;;30677:45:0;;30731:4;:11;;;30751:10;30770:4;:14;;;30793:4;:12;;;30814:4;:14;;;30677:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30677:158:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30677:158:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30677:158:0;;;;;;;;51508:523;51823:13;;48687:55;;51671:12;;;;51796:23;;-1:-1:-1;;;;;51823:13:0;;48687:55;;;;;;;;;;;;51904:4;51917:11;51937:17;51963:13;51850:133;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;51850:133:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;51850:133:0;;;179:29:-1;;;;160:49;;;51823:161:0;;;;51850:133;51823:161;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;51781:203:0;;;;51999:7;51991:16;;;;;;-1:-1:-1;52021:4:0;;51508:523;-1:-1:-1;;;;;;51508:523:0:o;39645:155::-;39717:4;-1:-1:-1;;;;;39738:21:0;;39730:30;;;;;;-1:-1:-1;;;;;;39774:20:0;:11;:20;;;;;;;;;;;;;;;39645:155::o;38223:593::-;38767:20;38802:8;;;38223:593::o;30847:773::-;30963:18;;:::i;:::-;31006:11;;;;;;30993:24;;:10;;;:24;;;;31041:15;;;;;31024:32;;:14;;;:32;31079:14;;;;;-1:-1:-1;;;;;31063:30:0;:13;;;:30;31168:11;31167:12;:31;;;;;31183:4;:15;;;31167:31;31163:452;;;31218:14;;;;-1:-1:-1;;;;;31209:23:0;:6;;;:23;31258:14;;;;31339:4;31332:12;;31326:19;-1:-1:-1;;;;;31372:5:0;;31364:14;;;;;;-1:-1:-1;;;;;31445:22:0;:9;;;:22;-1:-1:-1;31163:452:0;;;-1:-1:-1;;;;;31490:12:0;;:6;;;:12;31523:10;;;;;-1:-1:-1;;;;;31511:22:0;:9;;;:22;31556:12;;;;;31542:11;;;:26;31593:14;;;;;31577:13;;;:30;30847:773;;;;:::o;32290:340::-;32417:13;;:::i;:::-;18133:3;32442:12;;;:30;18180:6;32479:12;;;:38;32533:7;;;;-1:-1:-1;;;;;32524:16:0;:6;;;:16;32559:10;;;;-1:-1:-1;;;;;32547:22:0;-1:-1:-1;32547:9:0;;:22;32587:37;32533:4;32601:10;32613;32587:7;:37::i;:::-;32576:8;;;:48;:3;32290:340;-1:-1:-1;;;32290:340:0:o;35206:545::-;35312:14;;;35324:1;35312:14;;;;;;;;;35262:16;;;;35312:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;35348:10:0;;35287:39;;-1:-1:-1;35348:23:0;;-1:-1:-1;;;;;35348:21:0;;:23::i;:::-;35335:7;35343:1;35335:10;;;;;;;;;;;;;:36;;;;35391:26;:4;:13;;;:24;:26::i;:::-;35378:7;35386:1;35378:10;;;;;;;;;;;;;:39;;;;35437:26;:4;:13;;;-1:-1:-1;;;;;35437:24:0;;:26::i;:::-;35424:7;35432:1;35424:10;;;;;;;;;;;;;:39;;;;35483:23;:4;:7;;;-1:-1:-1;;;;;35483:21:0;;:23::i;:::-;35470:7;35478:1;35470:10;;;;;;;;;;;;;:36;;;;35526:23;:4;:10;;;:21;:23::i;:::-;35513:7;35521:1;35513:10;;;;;;;;;;;;;:36;;;;35569:23;:4;:9;;;:21;:23::i;:::-;35556:7;35564:1;35556:10;;;;;;;;;;;;;:36;;;;35612:19;:4;:6;;;:17;:19::i;:::-;35599:7;35607:1;35599:10;;;;;;;;;;;;;:32;;;;35651:19;:4;:6;;;:17;:19::i;:::-;35638:7;35646:1;35638:10;;;;;;;;;;;;;:32;;;;35690:19;:4;:6;;;:17;:19::i;:::-;35677:7;35685:1;35677:10;;;;;;;;;;;;;:32;;;;35725:20;:7;:18;:20::i;39219:133::-;39293:18;39297:4;39303:7;39293:3;:18::i;:::-;39292:19;39284:28;;;;;;-1:-1:-1;;;;;39319:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;39319:27:0;39342:4;39319:27;;;39219:133::o;3455:101::-;3513:7;3541:1;3536;:6;;:14;;3549:1;3536:14;;;-1:-1:-1;3545:1:0;;3455:101;-1:-1:-1;3455:101:0:o;72413:369::-;72546:13;;;:20;;;-1:-1:-1;;72546:20:0;;;;;;72573:41;;-1:-1:-1;;;;;72573:41:0;-1:-1:-1;;;72598:15:0;-1:-1:-1;;;;;72573:41:0;;;;;;;;;;;;;-1:-1:-1;72623:21:0;;:44;;-1:-1:-1;;;;72623:44:0;-1:-1:-1;;;72623:44:0;;;;;;;;72705:15;;-1:-1:-1;;;;72674:47:0;;;72705:15;;-1:-1:-1;;;72674:47:0;;;;;;;72750:11;;72735:41;;;;;;72623:44;;72735:41;;;;;;;;;;72413:369;;;:::o;71575:787::-;71755:14;;71671:4;;-1:-1:-1;;;71755:14:0;;-1:-1:-1;;;;;71755:14:0;71740:29;;71736:64;;;-1:-1:-1;71787:5:0;71780:12;;71736:64;71808:24;71835:25;;;:11;;;:25;;;;;71924:17;;-1:-1:-1;;;71924:17:0;;;;71919:53;;71959:5;71952:12;;;;;71919:53;72026:15;;-1:-1:-1;;;72026:15:0;;;;72022:50;;;72059:5;72052:12;;;;;72022:50;72148:21;;;;-1:-1:-1;;;72148:21:0;;;;;:45;;-1:-1:-1;72173:20:0;;;;-1:-1:-1;;;72173:20:0;;;;72148:45;72144:80;;;72211:5;72204:12;;;;;72144:80;72278:21;;;72320:15;-1:-1:-1;;;;;72278:21:0;;;44227:2;72278:38;:57;;;-1:-1:-1;71575:787:0;;;;:::o;72861:547::-;72957:24;72984:23;;;:9;;;:23;;;;;;;73016:19;;;;:26;;-1:-1:-1;;;;;;;73016:26:0;;;;;-1:-1:-1;;;;73049:47:0;;;-1:-1:-1;;;73080:15:0;-1:-1:-1;;;;;73049:47:0;;;;;;;;;;;;73136:20;;-1:-1:-1;73105:21:0;;:52;;-1:-1:-1;;;;73105:52:0;73136:20;;;;;;73105:52;;;;73164:44;;;;;;;;;;;;73315:11;;73342:22;;73300:87;;72984:23;;73300:87;;;;73315:11;;72984:23;;73342:22;;;;73366:20;;;;;;73300:87;;33529:711;33782:49;33787:43;33792:18;33812:10;33824:5;33787:4;:43::i;:::-;33782:4;:49::i;:::-;33757:17;:22;;:74;;;;33529:711;;;;:::o;39424:136::-;39500:18;39504:4;39510:7;39500:3;:18::i;:::-;39492:27;;;;;;-1:-1:-1;;;;;39526:20:0;39549:5;39526:20;;;;;;;;;;;:28;;-1:-1:-1;;39526:28:0;;;39424:136::o;36526:172::-;36593:4;36606:26;36635;36659:1;36635:16;:4;:14;:16::i;:::-;:23;:26;:23;:26;:::i;:::-;36606:55;;36675:17;:5;36681:1;36675:8;;;;;;;;;;;;;;:15;:17::i;16126:773::-;16281:4;16320:2;16305:5;:12;:17;;;;;;:22;16297:31;;;;;;16337:19;16374:2;16359:5;:12;:17;;;;;;16337:39;;16405:2;16391:11;:16;16383:25;;;;;;16417:20;16467:4;16497:2;16480:376;16511:11;16506:2;:16;16501:1;:21;16480:376;;16584:13;;;16578:20;;-1:-1:-1;16627:1:0;16619:5;:9;16615:208;;16688:12;16702;16671:44;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;16671:44:0;;;16661:55;;;;;;16646:70;;16615:208;;;16785:12;16799;16768:44;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;16768:44:0;;;16758:55;;;;;;16743:70;;16615:208;16847:1;16839:5;:9;;-1:-1:-1;16529:2:0;16524:7;16480:376;;;-1:-1:-1;16869:24:0;;;;16126:773;-1:-1:-1;;;;;;16126:773:0:o;31669:565::-;31799:16;31831:4;:15;;;:31;;;;;31851:4;:11;;;31850:12;31831:31;31827:64;;;31873:10;;31827:64;31899:14;31916:10;:73;;17802;;;;;;;;;;;;;;31916;;;17942:72;;;;;;;;;;;;;;31916:73;31899:90;;32029:7;32079:4;:11;;;:19;;32097:1;32079:19;;;32093:1;32079:19;32074:25;;32066:34;;32111:10;32148:4;:14;;;-1:-1:-1;;;;;32132:32:0;32175:4;:12;;;32198:4;:14;;;32045:176;;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;32045:176:0;;;;32004:224;;;49:4:-1;32004:224:0;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;32004:224:0;;;31998:230;;31669:565;;;;;;:::o;11990:121::-;12044:12;12076:27;12088:14;12097:4;12088:8;:14::i;:::-;12076:11;:27::i;11500:351::-;11649:4;11643:11;;-1:-1:-1;;;11687:55:0;;11682:2;11675:10;;11668:75;11777:2;11770:10;;11757:24;;;11560:12;;11829:14;11643:11;11102:250;11165:12;11194:4;:11;11209:1;11194:16;:35;;;;;11225:4;11214:15;;:4;11219:1;11214:7;;;;;;;;;;;;-1:-1:-1;;;;;;11214:7:0;:15;;11194:35;11190:79;;;-1:-1:-1;11253:4:0;11246:11;;11190:79;11286:58;11297:40;11310:4;:11;10885:4;11297:40;;:12;:40::i;:::-;11339:4;11286:10;:58::i;12917:326::-;13029:12;;;13039:1;13029:12;;;;;;;;;12981;;13052:104;13073:4;:11;13069:1;:15;13052:104;;;13116:28;13127:7;13136:4;13141:1;13136:7;;;;;;;;;;;;;;13116:10;:28::i;:::-;13106:38;-1:-1:-1;13086:3:0;;13052:104;;;;13173:62;13184:41;13197:7;:14;10925:4;13184:41;;:12;:41::i;:::-;13227:7;13173:10;:62::i;35757:143::-;35810:7;35826:20;35849:13;35857:4;35849:7;:13::i;:::-;35876:18;;;;;;;;35757:143;-1:-1:-1;;;35757:143:0:o;5047:248::-;5108:14;;:::i;:::-;-1:-1:-1;5146:11:0;;5267:20;;;;;;;;;5234:4;5224:15;;;5267:20;;;;;;;5047:248::o;5504:315::-;5582:21;5637:8;5623:23;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5616:30;;5657:18;;:::i;:::-;5678:14;5687:4;5678:8;:14::i;:::-;5657:35;;5703:8;5722:90;5735:8;5729:3;:14;5722:90;;;5772:8;5777:2;5772:4;:8::i;:::-;5760:4;5765:3;5760:9;;;;;;;;;;;;;;;;;:20;5795:5;;5722:90;;;5504:315;;;;;;:::o;5997:230::-;6057:9;6080:14;6096:8;6108:13;6116:4;6108:7;:13::i;:::-;6168:16;;6199:2;6195:12;;;;6190:3;6186:22;6164:45;;;6141:79;-1:-1:-1;;;;6141:79:0:o;14977:465::-;15085:13;;;15095:2;15085:13;;;;;;;;;15026:12;;15051:6;;15026:12;;15085:13;;;21:6:-1;;104:10;15085:13:0;87:34:-1;135:17;;-1:-1;15085:13:0;15068:30;;15152:1;15147:2;15144:1;15140:10;15133:21;15184:1;15180:5;;15175:106;15191:2;15187:1;:6;15175:106;;;15219:1;15221;15219:4;;;;;;;;;;;;-1:-1:-1;;;;;;15219:4:0;:9;15215:55;;15249:5;;15215:55;15195:3;;;;;15175:106;;;15291:15;15324:1;15319:2;:6;15309:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;15309:17:0;87:34:-1;135:17;;-1:-1;15309:17:0;-1:-1:-1;15291:35:0;-1:-1:-1;15342:6:0;15337:78;15358:2;:9;15354:1;:13;15337:78;;;15397:6;;15399:3;;;;15397:1;;:6;;;;;;;;;;;;;;15389:2;15392:1;15389:5;;;;;;;;;;;:14;-1:-1:-1;;;;;15389:14:0;;;;;;;;-1:-1:-1;15369:3:0;;15337:78;;;-1:-1:-1;15432:2:0;14977:465;-1:-1:-1;;;;14977:465:0:o;14291:438::-;14362:12;-1:-1:-1;;;14395:6:0;:15;14387:42;;;;-1:-1:-1;;;14387:42:0;;;;;;;;;;;;;;;;;14458:12;;;14468:1;14458:12;;;;;;;;;14440:15;;14458:12;;;21:6:-1;;104:10;14458:12:0;87:34:-1;135:17;;-1:-1;14458:12:0;14440:30;;14495:2;14485:6;:12;14481:105;;14542:6;14533;:15;14522:28;;14514:2;14517:1;14514:5;;;;;;;;;;;:36;-1:-1:-1;;;;;14514:36:0;;;;;;;;-1:-1:-1;14572:2:0;-1:-1:-1;14565:9:0;;14481:105;14596:15;14614:16;14623:6;14614:8;:16::i;:::-;14596:34;;14672:6;14660:2;:9;:18;14681:2;14660:23;14649:36;;14641:2;14644:1;14641:5;;;;;;;;;;;:44;-1:-1:-1;;;;;14641:44:0;;;;;;;;;14703:18;14714:2;14718;13506:468;13591:12;13616:19;13664:6;:13;13648:6;:13;:29;13638:40;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;13638:40:0;87:34:-1;135:17;;-1:-1;13638:40:0;-1:-1:-1;13616:62:0;-1:-1:-1;13689:6:0;;13727:102;13743:6;:13;13739:1;:17;13727:102;;;13790:6;13797:1;13790:9;;;;;;;;;;;;;;;;13778:6;13785:1;13778:9;;;;;;;;;;;:21;-1:-1:-1;;;;;13778:21:0;;;;;;;;-1:-1:-1;13814:3:0;;;;;13758;13727:102;;;-1:-1:-1;13850:1:0;13841:102;13857:6;:13;13853:1;:17;13841:102;;;13904:6;13911:1;13904:9;;;;;;;;;;;;;;;;13892:6;13899:1;13892:9;;;;;;;;;;;:21;-1:-1:-1;;;;;13892:21:0;;;;;;;;-1:-1:-1;13928:3:0;;;;;13872;13841:102;;;-1:-1:-1;13960:6:0;;13506:468;-1:-1:-1;;;;13506:468:0:o;6769:218::-;6830:18;;:::i;:::-;6861:8;6893:20;6908:4;6893:14;:20::i;:::-;6872:18;;6924:21;;;6872:41;;;6956:17;;;:23;6924:2;6769:218;-1:-1:-1;6769:218:0:o;7015:308::-;7073:22;;:::i;:::-;7119:19;;;;7108:8;7167:16;7119:19;7167:11;:16::i;:::-;7194:27;;;7232:21;;;;:34;;;7299:16;;7277:19;;;;:38;;;;7194:7;7015:308;-1:-1:-1;7015:308:0:o;8544:763::-;8689:18;;8756:12;;8619:11;;;;8748:21;;;4283:4;8794:21;;8790:125;;;8841:5;-1:-1:-1;8867:1:0;;-1:-1:-1;8883:20:0;;-1:-1:-1;8883:20:0;8790:125;4326:4;8929:2;:20;8925:344;;;8993:1;8972:4;:18;;;:22;8966:28;;9018:5;9026:1;9018:9;9009:18;;8925:344;;;9188:18;;;;9241:12;;;-1:-1:-1;;9241:16:0;;-1:-1:-1;9188:29:0;;;;;;-1:-1:-1;8925:344:0;-1:-1:-1;;8544:763:0;;;;:::o;7574:530::-;7710:18;;7777:13;;7656:4;;7769:22;;;;4283:4;7816:21;;7812:48;;;7859:1;7852:8;;;;;;7812:48;4326:4;7875:2;:20;:72;;;;4370:4;7900:2;:22;;:46;;;;;4413:4;7926:2;:20;7900:46;7871:99;;;7969:1;7962:8;;;;;;7871:99;4370:4;7985:2;:21;7981:72;;;-1:-1:-1;;;8028:25:0;;-1:-1:-1;8021:32:0;;7981:72;-1:-1:-1;;;8071:25:0;;7574:530;-1:-1:-1;;7574:530:0:o;8156:329::-;8309:13;;8227:8;;8301:22;;4283:4;8348:21;;8344:133;;;8390:1;8384:7;;8344:133;;;4326:4;8411:2;:20;8407:70;;;-1:-1:-1;;8452:25:0;;;-1:-1:-1;8407:70:0;8156:329;;;;:::o;52769:20642::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52769:20642:0;;;-1:-1:-1;52769:20642:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;52769:20642:0;;;;;;;;;;;-1:-1:-1;;;;;52769:20642:0;;;;;;-1:-1:-1;;;;;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;52769:20642:0;;;;;;;;-1:-1:-1;;;;;;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52769:20642:0;;;;;;;;-1:-1:-1;;;;;;52769:20642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5:130:-1:-;72:20;;97:33;72:20;97:33;;160:352;;;290:3;283:4;275:6;271:17;267:27;257:2;;308:1;305;298:12;257:2;-1:-1;328:20;;-1:-1;;;;;357:30;;354:2;;;400:1;397;390:12;354:2;434:4;426:6;422:17;410:29;;485:3;477:4;469:6;465:17;455:8;451:32;448:41;445:2;;;502:1;499;492:12;445:2;250:262;;;;;;520:124;584:20;;609:30;584:20;609:30;;651:128;726:13;;744:30;726:13;744:30;;786:130;853:20;;878:33;853:20;878:33;;937:335;;;1051:3;1044:4;1036:6;1032:17;1028:27;1018:2;;1069:1;1066;1059:12;1018:2;-1:-1;1089:20;;-1:-1;;;;;1118:30;;1115:2;;;1161:1;1158;1151:12;1115:2;1195:4;1187:6;1183:17;1171:29;;1245:3;1238;1230:6;1226:16;1216:8;1212:31;1209:40;1206:2;;;1262:1;1259;1252:12;1281:440;;1382:3;1375:4;1367:6;1363:17;1359:27;1349:2;;1400:1;1397;1390:12;1349:2;1437:6;1424:20;1459:64;1474:48;1515:6;1474:48;;;1459:64;;;1450:73;;1543:6;1536:5;1529:21;1579:4;1571:6;1567:17;1612:4;1605:5;1601:16;1647:3;1638:6;1633:3;1629:16;1626:25;1623:2;;;1664:1;1661;1654:12;1623:2;1674:41;1708:6;1703:3;1698;1674:41;;;1342:379;;;;;;;;1866:241;;1970:2;1958:9;1949:7;1945:23;1941:32;1938:2;;;1986:1;1983;1976:12;1938:2;2021:1;2038:53;2083:7;2063:9;2038:53;;;2028:63;1932:175;-1:-1;;;;1932:175;2114:366;;;2235:2;2223:9;2214:7;2210:23;2206:32;2203:2;;;2251:1;2248;2241:12;2203:2;2286:1;2303:53;2348:7;2328:9;2303:53;;;2293:63;;2265:97;2393:2;2411:53;2456:7;2447:6;2436:9;2432:22;2411:53;;;2401:63;;2372:98;2197:283;;;;;;2487:595;;;;2634:2;2622:9;2613:7;2609:23;2605:32;2602:2;;;2650:1;2647;2640:12;2602:2;2685:1;2702:53;2747:7;2727:9;2702:53;;;2692:63;;2664:97;2792:2;2810:53;2855:7;2846:6;2835:9;2831:22;2810:53;;;2800:63;;2771:98;2928:2;2917:9;2913:18;2900:32;-1:-1;;;;;2944:6;2941:30;2938:2;;;2984:1;2981;2974:12;2938:2;3004:62;3058:7;3049:6;3038:9;3034:22;3004:62;;;2994:72;;2879:193;2596:486;;;;;;3089:257;;3201:2;3189:9;3180:7;3176:23;3172:32;3169:2;;;3217:1;3214;3207:12;3169:2;3252:1;3269:61;3322:7;3302:9;3269:61;;3353:241;;3457:2;3445:9;3436:7;3432:23;3428:32;3425:2;;;3473:1;3470;3463:12;3425:2;3508:1;3525:53;3570:7;3550:9;3525:53;;3601:360;;;3719:2;3707:9;3698:7;3694:23;3690:32;3687:2;;;3735:1;3732;3725:12;3687:2;3770:1;3787:53;3832:7;3812:9;3787:53;;;3777:63;;3749:97;3877:2;3895:50;3937:7;3928:6;3917:9;3913:22;3895:50;;3968:617;;;;;4123:3;4111:9;4102:7;4098:23;4094:33;4091:2;;;4140:1;4137;4130:12;4091:2;4175:1;4192:53;4237:7;4217:9;4192:53;;;4182:63;;4154:97;4282:2;4300:53;4345:7;4336:6;4325:9;4321:22;4300:53;;;4290:63;;4261:98;4390:2;4408:53;4453:7;4444:6;4433:9;4429:22;4408:53;;;4398:63;;4369:98;4498:2;4516:53;4561:7;4552:6;4541:9;4537:22;4516:53;;;4506:63;;4477:98;4085:500;;;;;;;;4592:1147;;;;;;;;;4837:3;4825:9;4816:7;4812:23;4808:33;4805:2;;;4854:1;4851;4844:12;4805:2;4889:1;4906:53;4951:7;4931:9;4906:53;;;4896:63;;4868:97;5024:2;5013:9;5009:18;4996:32;-1:-1;;;;;5040:6;5037:30;5034:2;;;5080:1;5077;5070:12;5034:2;5108:64;5164:7;5155:6;5144:9;5140:22;5108:64;;;5098:74;;;;4975:203;5237:2;5226:9;5222:18;5209:32;-1:-1;;;;;5253:6;5250:30;5247:2;;;5293:1;5290;5283:12;5247:2;5321:64;5377:7;5368:6;5357:9;5353:22;5321:64;;;5311:74;;;;5188:203;5422:2;5440:53;5485:7;5476:6;5465:9;5461:22;5440:53;;;5430:63;;5401:98;5558:3;5547:9;5543:19;5530:33;-1:-1;;;;;5575:6;5572:30;5569:2;;;5615:1;5612;5605:12;5569:2;5643:80;5715:7;5706:6;5695:9;5691:22;5643:80;;;5633:90;;;;5509:220;4799:940;;;;;;;;;;;;5746:366;;;5867:2;5855:9;5846:7;5842:23;5838:32;5835:2;;;5883:1;5880;5873:12;5835:2;5918:1;5935:53;5980:7;5960:9;5935:53;;;5925:63;;5897:97;6025:2;6043:53;6088:7;6079:6;6068:9;6064:22;6043:53;;6119:743;;;;;;6291:3;6279:9;6270:7;6266:23;6262:33;6259:2;;;6308:1;6305;6298:12;6259:2;6343:1;6360:53;6405:7;6385:9;6360:53;;;6350:63;;6322:97;6450:2;6468:53;6513:7;6504:6;6493:9;6489:22;6468:53;;;6458:63;;6429:98;6558:2;6576:53;6621:7;6612:6;6601:9;6597:22;6576:53;;;6566:63;;6537:98;6666:2;6684:53;6729:7;6720:6;6709:9;6705:22;6684:53;;;6674:63;;6645:98;6774:3;6793:53;6838:7;6829:6;6818:9;6814:22;6793:53;;;6783:63;;6753:99;6253:609;;;;;;;;;6869:991;;;;;;;;7079:3;7067:9;7058:7;7054:23;7050:33;7047:2;;;7096:1;7093;7086:12;7047:2;7131:1;7148:53;7193:7;7173:9;7148:53;;;7138:63;;7110:97;7238:2;7256:53;7301:7;7292:6;7281:9;7277:22;7256:53;;;7246:63;;7217:98;7346:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;;;7354:63;;7325:98;7482:2;7471:9;7467:18;7454:32;-1:-1;;;;;7498:6;7495:30;7492:2;;;7538:1;7535;7528:12;7492:2;7566:64;7622:7;7613:6;7602:9;7598:22;7566:64;;;7556:74;;;;7433:203;7695:3;7684:9;7680:19;7667:33;-1:-1;;;;;7712:6;7709:30;7706:2;;;7752:1;7749;7742:12;7706:2;7780:64;7836:7;7827:6;7816:9;7812:22;7780:64;;;7770:74;;;;7646:204;7041:819;;;;;;;;;;;7867:142;7958:45;7997:5;7958:45;;;7953:3;7946:58;7940:69;;;8016:137;8115:32;8141:5;8115:32;;8280:94;8347:21;8362:5;8347:21;;8492:103;8565:24;8583:5;8565:24;;8722:152;8823:45;8843:24;8861:5;8843:24;;;8823:45;;8881:148;8980:43;8999:23;9016:5;8999:23;;9036:343;;9146:38;9178:5;9146:38;;;9196:70;9259:6;9254:3;9196:70;;;9189:77;;9271:52;9316:6;9311:3;9304:4;9297:5;9293:16;9271:52;;;9344:29;9366:6;9344:29;;;9335:39;;;;9126:253;-1:-1;;;9126:253;9386:356;;9514:38;9546:5;9514:38;;;9564:88;9645:6;9640:3;9564:88;;;9557:95;;9657:52;9702:6;9697:3;9690:4;9683:5;9679:16;9657:52;;;9721:16;;;;;9494:248;-1:-1;;9494:248;10091:142;10182:45;10221:5;10182:45;;10241:501;;10419:85;10501:2;10496:3;10419:85;;;10537:66;10517:87;;-1:-1;;;10633:2;10624:12;;10617:88;10733:2;10724:12;;10405:337;-1:-1;;10405:337;10751:501;;10929:85;11011:2;11006:3;10929:85;;;11047:66;11027:87;;11148:66;11143:2;11134:12;;11127:88;11243:2;11234:12;;10915:337;-1:-1;;10915:337;11261:364;;11421:67;11485:2;11480:3;11421:67;;;-1:-1;;;11501:87;;11616:2;11607:12;;11407:218;-1:-1;;11407:218;11634:501;;11812:85;11894:2;11889:3;11812:85;;;11930:66;11910:87;;-1:-1;;;12026:2;12017:12;;12010:88;12126:2;12117:12;;11798:337;-1:-1;;11798:337;12144:501;;12322:85;12404:2;12399:3;12322:85;;;12440:66;12420:87;;12541:66;12536:2;12527:12;;12520:88;12636:2;12627:12;;12308:337;-1:-1;;12308:337;12698:1855;12916:22;;12837:5;12828:15;;;12944:60;12832:3;12916:22;12944:60;;;12858:152;13093:4;13086:5;13082:16;13076:23;13105:61;13160:4;13155:3;13151:14;13137:12;13105:61;;;13020:152;13250:4;13243:5;13239:16;13233:23;13262:61;13317:4;13312:3;13308:14;13294:12;13262:61;;;13182:147;13405:4;13398:5;13394:16;13388:23;13417:57;13468:4;13463:3;13459:14;13445:12;13417:57;;;13339:141;13560:4;13553:5;13549:16;13543:23;13572:57;13623:4;13618:3;13614:14;13600:12;13572:57;;;13490:145;13713:4;13706:5;13702:16;13696:23;13725:57;13776:4;13771:3;13767:14;13753:12;13725:57;;;13645:143;13870:4;13863:5;13859:16;13853:23;13882:57;13933:4;13928:3;13924:14;13910:12;13882:57;;;13798:147;14020:4;14013:5;14009:16;14003:23;14032:57;14083:4;14078:3;14074:14;14060:12;14032:57;;;13955:140;14166:5;14159;14155:17;14149:24;14179:128;14300:5;14295:3;14291:15;14277:12;14179:128;;;14105:208;14385:5;14378;14374:17;14368:24;14398:134;14525:5;14520:3;14516:15;14502:12;14398:134;;;14323:215;12810:1743;;;;14633:1459;14863:22;;14786:5;14777:15;;;14891:62;14781:3;14863:22;14891:62;;;14807:152;15049:4;15042:5;15038:16;15032:23;15061:63;15118:4;15113:3;15109:14;15095:12;15061:63;;;14969:161;15216:4;15209:5;15205:16;15199:23;15228:63;15285:4;15280:3;15276:14;15262:12;15228:63;;;15140:157;15377:4;15370:5;15366:16;15360:23;15389:61;15444:4;15439:3;15435:14;15421:12;15389:61;;;15307:149;15536:4;15529:5;15525:16;15519:23;15548:61;15603:4;15598:3;15594:14;15580:12;15548:61;;;15466:149;15693:4;15686:5;15682:16;15676:23;15705:57;15756:4;15751:3;15747:14;15733:12;15705:57;;;15625:143;15848:4;15841:5;15837:16;15831:23;15860:57;15911:4;15906:3;15902:14;15888:12;15860:57;;;15778:145;16002:4;15995:5;15991:16;15985:23;16014:57;16065:4;16060:3;16056:14;16042:12;16014:57;;16156:2244;16381:22;;16307:5;16298:15;;;16409:60;16302:3;16381:22;16409:60;;;16328:147;16558:4;16551:5;16547:16;16541:23;16570:61;16625:4;16620:3;16616:14;16602:12;16570:61;;;16485:152;16715:4;16708:5;16704:16;16698:23;16727:61;16782:4;16777:3;16773:14;16759:12;16727:61;;;16647:147;16874:4;16867:5;16863:16;16857:23;16886:61;16941:4;16936:3;16932:14;16918:12;16886:61;;;16804:149;17036:4;17029:5;17025:16;17019:23;17048:61;17103:4;17098:3;17094:14;17080:12;17048:61;;;16963:152;17194:4;17187:5;17183:16;17177:23;17206:63;17263:4;17258:3;17254:14;17240:12;17206:63;;;17125:150;17360:4;17353:5;17349:16;17343:23;17372:63;17429:4;17424:3;17420:14;17406:12;17372:63;;;17285:156;17522:4;17515:5;17511:16;17505:23;17534:63;17591:4;17586:3;17582:14;17568:12;17534:63;;;17451:152;17681:5;17674;17670:17;17664:24;17694:58;17745:5;17740:3;17736:15;17722:12;17694:58;;;17613:145;17840:5;17833;17829:17;17823:24;17853:58;17904:5;17899:3;17895:15;17881:12;17853:58;;;17768:149;17996:5;17989;17985:17;17979:24;18009:58;18060:5;18055:3;18051:15;18037:12;18009:58;;;17927:146;18153:5;18146;18142:17;18136:24;18166:58;18217:5;18212:3;18208:15;18194:12;18166:58;;;18083:147;18308:5;18301;18297:17;18291:24;18321:58;18372:5;18367:3;18363:15;18349:12;18321:58;;18474:1130;18695:22;;18621:4;18612:14;;;18723:60;18616:3;18695:22;18723:60;;;18641:148;18868:4;18861:5;18857:16;18851:23;18880:61;18935:4;18930:3;18926:14;18912:12;18880:61;;;18799:148;19035:4;19028:5;19024:16;19018:23;19047:61;19102:4;19097:3;19093:14;19079:12;19047:61;;;18957:157;19191:4;19184:5;19180:16;19174:23;19203:61;19258:4;19253:3;19249:14;19235:12;19203:61;;;19124:146;19353:4;19346:5;19342:16;19336:23;19365:61;19420:4;19415:3;19411:14;19397:12;19365:61;;;19280:152;19510:4;19503:5;19499:16;19493:23;19522:61;19577:4;19572:3;19568:14;19554:12;19522:61;;19611:113;19694:24;19712:5;19694:24;;19851:124;19933:36;19963:5;19933:36;;19982:100;20053:23;20070:5;20053:23;;20206:383;;20353:75;20424:3;20415:6;20353:75;;;20450:2;20445:3;20441:12;20434:19;;20464:75;20535:3;20526:6;20464:75;;;-1:-1;20561:2;20552:12;;20341:248;-1:-1;;20341:248;20596:396;;20759:73;20828:3;20819:6;20759:73;;;20854:1;20849:3;20845:11;20838:18;;20874:93;20963:3;20954:6;20874:93;;20999:262;;21143:93;21232:3;21223:6;21143:93;;21268:372;;21467:148;21611:3;21467:148;;21647:372;;21846:148;21990:3;21846:148;;22026:372;;22225:148;22369:3;22225:148;;22405:372;;22604:148;22748:3;22604:148;;22784:213;22902:2;22887:18;;22916:71;22891:9;22960:6;22916:71;;23004:324;23150:2;23135:18;;23164:71;23139:9;23208:6;23164:71;;;23246:72;23314:2;23303:9;23299:18;23290:6;23246:72;;23335:201;23447:2;23432:18;;23461:65;23436:9;23499:6;23461:65;;23543:739;23789:3;23774:19;;23804:65;23778:9;23842:6;23804:65;;;23880:72;23948:2;23937:9;23933:18;23924:6;23880:72;;;23963:80;24039:2;24028:9;24024:18;24015:6;23963:80;;;24054:72;24122:2;24111:9;24107:18;24098:6;24054:72;;;24175:9;24169:4;24165:20;24159:3;24148:9;24144:19;24137:49;24200:72;24267:4;24258:6;24200:72;;24289:743;24533:3;24518:19;;24548:65;24522:9;24586:6;24548:65;;;24624:70;24690:2;24679:9;24675:18;24666:6;24624:70;;;24705;24771:2;24760:9;24756:18;24747:6;24705:70;;;24786;24852:2;24841:9;24837:18;24828:6;24786:70;;;24867:71;24933:3;24922:9;24918:19;24909:6;24867:71;;;24949:73;25017:3;25006:9;25002:19;24993:6;24949:73;;25039:735;25283:3;25268:19;;25298:71;25272:9;25342:6;25298:71;;;25380:72;25448:2;25437:9;25433:18;25424:6;25380:72;;;25463;25531:2;25520:9;25516:18;25507:6;25463:72;;25781:297;25917:2;25931:47;;;25902:18;;25992:76;25902:18;26054:6;25992:76;;26085:407;26276:2;26290:47;;;26261:18;;26351:131;26261:18;26351:131;;26499:306;26663:3;26648:19;;26678:117;26652:9;26768:6;26678:117;;26812:330;26988:3;26973:19;;27003:129;26977:9;27105:6;27003:129;;27149:213;27267:2;27252:18;;27281:71;27256:9;27325:6;27281:71;;27369:1087;27705:3;27690:19;;27720:71;27694:9;27764:6;27720:71;;;27802:80;27878:2;27867:9;27863:18;27854:6;27802:80;;;27893:72;27961:2;27950:9;27946:18;27937:6;27893:72;;;27976:80;28052:2;28041:9;28037:18;28028:6;27976:80;;;28067:73;28135:3;28124:9;28120:19;28111:6;28067:73;;;28189:9;28183:4;28179:20;28173:3;28162:9;28158:19;28151:49;28214:76;28285:4;28276:6;28214:76;;;28206:84;;28301:67;28363:3;28352:9;28348:19;28339:6;28301:67;;;28379;28441:3;28430:9;28426:19;28417:6;28379:67;;;27676:780;;;;;;;;;;;;28463:1071;28791:3;28776:19;;28806:71;28780:9;28850:6;28806:71;;;28888:80;28964:2;28953:9;28949:18;28940:6;28888:80;;;28979:72;29047:2;29036:9;29032:18;29023:6;28979:72;;;29062;29130:2;29119:9;29115:18;29106:6;29062:72;;29541:312;29681:2;29666:18;;29695:71;29670:9;29739:6;29695:71;;;29777:66;29839:2;29828:9;29824:18;29815:6;29777:66;;29860:547;30062:3;30047:19;;30077:71;30051:9;30121:6;30077:71;;;30159:72;30227:2;30216:9;30212:18;30203:6;30159:72;;;30242;30310:2;30299:9;30295:18;30286:6;30242:72;;;30325;30393:2;30382:9;30378:18;30369:6;30325:72;;30414:324;30560:2;30545:18;;30574:71;30549:9;30618:6;30574:71;;;30656:72;30724:2;30713:9;30709:18;30700:6;30656:72;;30745:659;30975:3;30960:19;;30990:71;30964:9;31034:6;30990:71;;;31072:72;31140:2;31129:9;31125:18;31116:6;31072:72;;;31155;31223:2;31212:9;31208:18;31199:6;31155:72;;;31238;31306:2;31295:9;31291:18;31282:6;31238:72;;;31321:73;31389:3;31378:9;31374:19;31365:6;31321:73;;31411:543;31611:3;31596:19;;31626:71;31600:9;31670:6;31626:71;;;31708:72;31776:2;31765:9;31761:18;31752:6;31708:72;;;31791:71;31858:2;31847:9;31843:18;31834:6;31791:71;;;31873;31940:2;31929:9;31925:18;31916:6;31873:71;;31961:1389;32364:3;32349:19;;32379:69;32353:9;32421:6;32379:69;;;32459:66;32521:2;32510:9;32506:18;32497:6;32459:66;;;32536;32598:2;32587:9;32583:18;32574:6;32536:66;;;32613;32675:2;32664:9;32660:18;32651:6;32613:66;;;32690:67;32752:3;32741:9;32737:19;32728:6;32690:67;;;32768:73;32836:3;32825:9;32821:19;32812:6;32768:73;;;32852:89;32936:3;32925:9;32921:19;32912:6;32852:89;;;32952:73;33020:3;33009:9;33005:19;32996:6;32952:73;;;33036;33104:3;33093:9;33089:19;33080:6;33036:73;;;33120;33188:3;33177:9;33173:19;33164:6;33120:73;;;33242:9;33236:4;33232:20;33226:3;33215:9;33211:19;33204:49;33267:73;33335:4;33325:7;33267:73;;;33259:81;32335:1015;-1:-1;;;;;;;;;;;;;32335:1015;33357:1391;33757:3;33742:19;;33772:69;33746:9;33814:6;33772:69;;;33852:70;33918:2;33907:9;33903:18;33894:6;33852:70;;;33933;33999:2;33988:9;33984:18;33975:6;33933:70;;;34014;34080:2;34069:9;34065:18;34056:6;34014:70;;;34095:71;34161:3;34150:9;34146:19;34137:6;34095:71;;;34177;34243:3;34232:9;34228:19;34219:6;34177:71;;;34259;34325:3;34314:9;34310:19;34301:6;34259:71;;;34341;34407:3;34396:9;34392:19;34383:6;34341:71;;;34423;34489:3;34478:9;34474:19;34465:6;34423:71;;;34505;34571:3;34560:9;34556:19;34547:6;34505:71;;;34587:72;34654:3;34643:9;34639:19;34629:7;34587:72;;;34670:68;34733:3;34722:9;34718:19;34708:7;34670:68;;34755:256;34817:2;34811:9;34843:17;;;-1:-1;;;;;34903:34;;34939:22;;;34900:62;34897:2;;;34975:1;34972;34965:12;34897:2;34991;34984:22;34795:216;;-1:-1;34795:216;35018:321;;-1:-1;;;;;35153:6;35150:30;35147:2;;;35193:1;35190;35183:12;35147:2;-1:-1;35324:4;35260;35237:17;;;;-1:-1;;35233:33;35314:15;;35084:255;35346:117;35429:12;;35400:63;35599:162;35701:19;;;35750:4;35741:14;;35694:67;36248:91;;36310:24;36328:5;36310:24;;36452:85;36518:13;36511:21;;36494:43;36623:144;-1:-1;;;;;;36684:78;;36667:100;36774:113;-1:-1;;;;;36836:46;;36819:68;36894:121;-1:-1;;;;;36956:54;;36939:76;37101:96;-1:-1;;;;;37162:30;;37145:52;37204:129;;37291:37;37322:5;37291:37;;37340:116;;37427:24;37445:5;37427:24;;37463:121;;37542:37;37573:5;37542:37;;37706:106;;37784:23;37801:5;37784:23;;37820:145;37901:6;37896:3;37891;37878:30;-1:-1;37957:1;37939:16;;37932:27;37871:94;37974:268;38039:1;38046:101;38060:6;38057:1;38054:13;38046:101;;;38127:11;;;38121:18;38108:11;;;38101:39;38082:2;38075:10;38046:101;;;38162:6;38159:1;38156:13;38153:2;;;-1:-1;;38227:1;38209:16;;38202:27;38023:219;38411:97;38499:2;38479:14;-1:-1;;38475:28;;38459:49;38516:117;38585:24;38603:5;38585:24;;;38578:5;38575:35;38565:2;;38624:1;38621;38614:12;38640:111;38706:21;38721:5;38706:21;;38758:117;38827:24;38845:5;38827:24;

Swarm Source

bzzr://bfe268b1a951973c135b3127ddf36b187f7ab4cdf0aca2a2f9f73df284680013

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.