ETH Price: $3,366.28 (-3.14%)

Contract

0x8eF2E125eea6800AE35c10d5BE3B96Fe1171B5f0
 

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:
MPondLogic

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-12-16
*/

pragma solidity 0.5.17;
pragma experimental ABIEncoderV2;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}


contract MPondLogic is Initializable {
    /// @notice EIP-20 token name for this token
    string public name;

    /// @notice EIP-20 token symbol for this token
    string public symbol;

    /// @notice EIP-20 token decimals for this token
    uint8 public decimals;

    /// @notice Total number of tokens in circulation
    uint256 public totalSupply; // 10k MPond
    uint256 public bridgeSupply; // 3k MPond

    address public dropBridge;
    /// @notice Allowance amounts on behalf of others
    mapping(address => mapping(address => uint96)) internal allowances;

    /// @notice Official record of token balances for each account
    mapping(address => uint96) internal balances;

    /// @notice A record of each accounts delegate
    mapping(address => mapping(address => uint96)) public delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public DOMAIN_TYPEHASH;

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public DELEGATION_TYPEHASH;

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public UNDELEGATION_TYPEHASH;

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    /// customized params
    address public admin;
    mapping(address => bool) public isWhiteListed;
    bool public enableAllTranfers;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(
        address indexed delegator,
        address indexed fromDelegate,
        address indexed toDelegate
    );

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(
        address indexed delegate,
        uint256 previousBalance,
        uint256 newBalance
    );

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @notice The standard EIP-20 approval event
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );

    /**
     * @notice Initializer a new MPond token
     * @param account The initial account to grant all the tokens
     */
    function initialize(
        address account,
        address bridge,
        address dropBridgeAddress
    ) public initializer {
        createConstants();
        require(
            account != bridge,
            "Bridge and account should not be the same address"
        );
        balances[bridge] = uint96(bridgeSupply);
        delegates[bridge][address(0)] = uint96(bridgeSupply);
        isWhiteListed[bridge] = true;
        emit Transfer(address(0), bridge, bridgeSupply);

        uint96 remainingSupply = sub96(
            uint96(totalSupply),
            uint96(bridgeSupply),
            "MPond: Subtraction overflow in the constructor"
        );
        balances[account] = remainingSupply;
        delegates[account][address(0)] = remainingSupply;
        isWhiteListed[account] = true;
        dropBridge = dropBridgeAddress;
        emit Transfer(address(0), account, uint256(remainingSupply));
    }

    function createConstants() internal {
        name = "Marlin";
        symbol = "MPond";
        decimals = 18;
        totalSupply = 10000e18;
        bridgeSupply = 7000e18;
        DOMAIN_TYPEHASH = keccak256(
            "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
        );
        DELEGATION_TYPEHASH = keccak256(
            "Delegation(address delegatee,uint256 nonce,uint256 expiry,uint96 amount)"
        );
        UNDELEGATION_TYPEHASH = keccak256(
            "Unelegation(address delegatee,uint256 nonce,uint256 expiry,uint96 amount)"
        );
        admin = msg.sender;
        // enableAllTranfers = true; //This is only for testing, will be false
    }

    function addWhiteListAddress(address _address)
        external
        onlyAdmin("Only admin can whitelist")
        returns (bool)
    {
        isWhiteListed[_address] = true;
        return true;
    }

    function removeWhiteListAddress(address _address)
        external
        onlyAdmin("Only admin can remove from whitelist")
        returns (bool)
    {
        isWhiteListed[_address] = false;
        return true;
    }

    function enableAllTransfers()
        external
        onlyAdmin("Only admin can enable all transfers")
        returns (bool)
    {
        enableAllTranfers = true;
        return true;
    }

    function disableAllTransfers()
        external
        onlyAdmin("Only admin can disable all transfers")
        returns (bool)
    {
        enableAllTranfers = false;
        return true;
    }

    function changeDropBridge(address _updatedBridge)
        public
        onlyAdmin("Only admin can change drop bridge")
    {
        dropBridge = _updatedBridge;
    }

    function isWhiteListedTransfer(address _address1, address _address2)
        public
        view
        returns (bool)
    {
        if (_address1 == dropBridge) {
            return true;
        } else if (_address2 == dropBridge) {
            return (isWhiteListed[_address1] || enableAllTranfers);
        }
        return
            (isWhiteListed[_address1] || isWhiteListed[_address2]) ||
            enableAllTranfers;
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender)
        external
        view
        returns (uint256)
    {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint256 rawAmount)
        external
        returns (bool)
    {
        uint96 amount;
        if (rawAmount == uint256(-1)) {
            amount = uint96(-1);
        } else {
            amount = safe96(
                rawAmount,
                "MPond::approve: amount exceeds 96 bits"
            );
        }

        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedAmount)
        external
        returns (bool)
    {
        uint96 amount;
        if (addedAmount == uint256(-1)) {
            amount = uint96(-1);
        } else {
            amount = safe96(
                addedAmount,
                "MPond::approve: addedAmount exceeds 96 bits"
            );
        }

        allowances[msg.sender][spender] = add96(
            allowances[msg.sender][spender],
            amount,
            "MPond: increaseAllowance allowance value overflows"
        );
        emit Approval(msg.sender, spender, allowances[msg.sender][spender]);
        return true;
    }

    function decreaseAllowance(address spender, uint256 removedAmount)
        external
        returns (bool)
    {
        uint96 amount;
        if (removedAmount == uint256(-1)) {
            amount = uint96(-1);
        } else {
            amount = safe96(
                removedAmount,
                "MPond::approve: removedAmount exceeds 96 bits"
            );
        }

        allowances[msg.sender][spender] = sub96(
            allowances[msg.sender][spender],
            amount,
            "MPond: decreaseAllowance allowance value underflows"
        );
        emit Approval(msg.sender, spender, allowances[msg.sender][spender]);
        return true;
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint256) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint256 rawAmount) external returns (bool) {
        require(
            isWhiteListedTransfer(msg.sender, dst),
            "Atleast one of the address (src or dst) should be whitelisted or all transfers must be enabled via enableAllTransfers()"
        );
        uint96 amount = safe96(
            rawAmount,
            "MPond::transfer: amount exceeds 96 bits"
        );
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(
        address src,
        address dst,
        uint256 rawAmount
    ) external returns (bool) {
        require(
            isWhiteListedTransfer(msg.sender, dst),
            "Atleast one of the address (src or dst) should be whitelisted or all transfers must be enabled via enableAllTransfers()"
        );
        address spender = msg.sender;
        uint96 spenderAllowance = allowances[src][spender];
        uint96 amount = safe96(
            rawAmount,
            "MPond::approve: amount exceeds 96 bits"
        );

        if (spender != src && spenderAllowance != uint96(-1)) {
            uint96 newAllowance = sub96(
                spenderAllowance,
                amount,
                "MPond::transferFrom: transfer amount exceeds spender allowance"
            );
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee, uint96 amount) public {
        return _delegate(msg.sender, delegatee, amount);
    }

    function undelegate(address delegatee, uint96 amount) public {
        return _undelegate(msg.sender, delegatee, amount);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s,
        uint96 amount
    ) public {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry, amount)
        );
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainSeparator, structHash)
        );
        address signatory = ecrecover(digest, v, r, s);
        require(
            signatory != address(0),
            "MPond::delegateBySig: invalid signature"
        );
        require(
            nonce == nonces[signatory]++,
            "MPond::delegateBySig: invalid nonce"
        );
        require(now <= expiry, "MPond::delegateBySig: signature expired");
        return _delegate(signatory, delegatee, amount);
    }

    function undelegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s,
        uint96 amount
    ) public {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(UNDELEGATION_TYPEHASH, delegatee, nonce, expiry, amount)
        );
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainSeparator, structHash)
        );
        address signatory = ecrecover(digest, v, r, s);
        require(
            signatory != address(0),
            "MPond::undelegateBySig: invalid signature"
        );
        require(
            nonce == nonces[signatory]++,
            "MPond::undelegateBySig: invalid nonce"
        );
        require(now <= expiry, "MPond::undelegateBySig: signature expired");
        return _undelegate(signatory, delegatee, amount);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return
            nCheckpoints != 0
                ? checkpoints[account][nCheckpoints - 1].votes
                : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint256 blockNumber)
        public
        view
        returns (uint96)
    {
        require(
            blockNumber < block.number,
            "MPond::getPriorVotes: not yet determined"
        );

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(
        address delegator,
        address delegatee,
        uint96 amount
    ) internal {
        delegates[delegator][address(0)] = sub96(
            delegates[delegator][address(0)],
            amount,
            "MPond: delegates underflow"
        );
        delegates[delegator][delegatee] = add96(
            delegates[delegator][delegatee],
            amount,
            "MPond: delegates overflow"
        );

        emit DelegateChanged(delegator, address(0), delegatee);

        _moveDelegates(address(0), delegatee, amount);
    }

    function _undelegate(
        address delegator,
        address delegatee,
        uint96 amount
    ) internal {
        delegates[delegator][delegatee] = sub96(
            delegates[delegator][delegatee],
            amount,
            "MPond: undelegates underflow"
        );
        delegates[delegator][address(0)] = add96(
            delegates[delegator][address(0)],
            amount,
            "MPond: delegates underflow"
        );
        emit DelegateChanged(delegator, delegatee, address(0));
        _moveDelegates(delegatee, address(0), amount);
    }

    function _transferTokens(
        address src,
        address dst,
        uint96 amount
    ) internal {
        require(
            src != address(0),
            "MPond::_transferTokens: cannot transfer from the zero address"
        );
        require(
            delegates[src][address(0)] >= amount,
            "MPond: _transferTokens: undelegated amount should be greater than transfer amount"
        );
        require(
            dst != address(0),
            "MPond::_transferTokens: cannot transfer to the zero address"
        );

        balances[src] = sub96(
            balances[src],
            amount,
            "MPond::_transferTokens: transfer amount exceeds balance"
        );
        delegates[src][address(0)] = sub96(
            delegates[src][address(0)],
            amount,
            "MPond: _tranferTokens: undelegate subtraction error"
        );

        balances[dst] = add96(
            balances[dst],
            amount,
            "MPond::_transferTokens: transfer amount overflows"
        );
        delegates[dst][address(0)] = add96(
            delegates[dst][address(0)],
            amount,
            "MPond: _transferTokens: undelegate addition error"
        );
        emit Transfer(src, dst, amount);

        // _moveDelegates(delegates[src], delegates[dst], amount);
    }

    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint96 amount
    ) internal {
        if (srcRep != dstRep && amount != 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum != 0
                    ? checkpoints[srcRep][srcRepNum - 1].votes
                    : 0;
                uint96 srcRepNew = sub96(
                    srcRepOld,
                    amount,
                    "MPond::_moveVotes: vote amount underflows"
                );
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum != 0
                    ? checkpoints[dstRep][dstRepNum - 1].votes
                    : 0;
                uint96 dstRepNew = add96(
                    dstRepOld,
                    amount,
                    "MPond::_moveVotes: vote amount overflows"
                );
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint96 oldVotes,
        uint96 newVotes
    ) internal {
        uint32 blockNumber = safe32(
            block.number,
            "MPond::_writeCheckpoint: block number exceeds 32 bits"
        );

        if (
            nCheckpoints != 0 &&
            checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber
        ) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(
                blockNumber,
                newVotes
            );
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint32)
    {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function safe96(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint96)
    {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    function add96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function getChainId() internal pure returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }

    modifier onlyAdmin(string memory _error) {
        require(msg.sender == admin, _error);
        _;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UNDELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addWhiteListAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bridgeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_updatedBridge","type":"address"}],"name":"changeDropBridge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"removedAmount","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"delegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableAllTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dropBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"enableAllTranfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"enableAllTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedAmount","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"bridge","type":"address"},{"internalType":"address","name":"dropBridgeAddress","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_address1","type":"address"},{"internalType":"address","name":"_address2","type":"address"}],"name":"isWhiteListedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhiteListAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"undelegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"undelegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50613f12806100206000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c806395d89b4111610145578063ce114c25116100bd578063e7a324dc1161008c578063f425859211610071578063f4258592146104c2578063f851a440146104d5578063fd71d86a146104ea5761025c565b8063e7a324dc14610499578063f1127ed8146104a15761025c565b8063ce114c251461044d578063dd62ed3e14610460578063e1032b8314610473578063e5843242146104865761025c565b8063b4b5ea5711610114578063c0c53b8b116100f9578063c0c53b8b1461042a578063c43ff0c81461043d578063c6d6125e146104455761025c565b8063b4b5ea571461040f578063b9371343146104225761025c565b806395d89b41146103ce578063a457c2d7146103d6578063a65835da146103e9578063a9059cbb146103fc5761025c565b806367cb1601116101d857806370a08231116101a75780637ecebe001161018c5780637ecebe00146103955780638164c309146103a85780638b41166c146103bb5761025c565b806370a0823114610362578063782d6fe1146103755761025c565b806367cb1601146103145780636ab5cc381461031c5780636f9170f61461032f5780636fcfff45146103425761025c565b806318160ddd1161022f57806323b872dd1161021457806323b872dd146102d9578063313ce567146102ec57806339509351146103015761025c565b806318160ddd146102c957806320606b70146102d15761025c565b806302cb3a881461026157806306fdde0314610276578063095ea7b31461029457806316aeac20146102b4575b600080fd5b61027461026f366004612ea8565b6104f2565b005b61027e610724565b60405161028b919061392b565b60405180910390f35b6102a76102a2366004612e78565b6107d0565b60405161028b9190613850565b6102bc6108f5565b60405161028b919061385e565b6102bc6108fb565b6102bc610901565b6102a76102e7366004612e35565b610907565b6102f4610aeb565b60405161028b9190613a35565b6102a761030f366004612e78565b610af4565b6102a7610c6d565b6102a761032a366004612dae565b610d12565b6102a761033d366004612d88565b610e0c565b610355610350366004612d88565b610e21565b60405161028b9190613a0c565b6102bc610370366004612d88565b610e39565b610388610383366004612e78565b610e6f565b60405161028b9190613a51565b6102bc6103a3366004612d88565b611151565b6102a76103b6366004612d88565b611163565b6102746103c9366004612f74565b611245565b61027e611254565b6102a76103e4366004612e78565b6112cd565b6102746103f7366004612ea8565b6113a9565b6102a761040a366004612e78565b6115c5565b61038861041d366004612d88565b611642565b6102bc6116f0565b610274610438366004612de8565b6116f6565b6102a7611a94565b6102a7611a9d565b6102a761045b366004612d88565b611b3c565b6102bc61046e366004612dae565b611bfd565b610274610481366004612f74565b611c43565b610388610494366004612dae565b611c4e565b6102bc611c79565b6104b46104af366004612f44565b611c7f565b60405161028b929190613a1a565b6102746104d0366004612d88565b611cba565b6104dd611d70565b60405161028b9190613842565b6104dd611d8c565b6000603e54603360405161050691906137e4565b6040518091039020610516611da8565b3060405160200161052a94939291906138b8565b60405160208183030381529060405280519060200120905060006040548989898660405160200161055f95949392919061386c565b6040516020818303038152906040528051906020012090506000828260405160200161058c9291906137fb565b6040516020818303038152906040528051906020012090506000600182898989604051600081526020016040526040516105c994939291906138f6565b6020604051602081039080840390855afa1580156105eb573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661066c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061396c565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526041602052604090208054600181019091558a146106d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139ac565b8842111561070c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061397c565b610717818c87611dad565b5050505050505050505050565b6033805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156107c85780601f1061079d576101008083540402835291602001916107c8565b820191906000526020600020905b8154815290600101906020018083116107ab57829003601f168201915b505050505081565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141561082257507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610847565b61084483604051806060016040528060268152602001613d0f60269139611f91565b90505b33600081815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff891680855292529182902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff861617905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906108e1908590613a43565b60405180910390a360019150505b92915050565b60405481565b60365481565b603e5481565b60006109133384610d12565b610949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061395c565b73ffffffffffffffffffffffffffffffffffffffff841660009081526039602090815260408083203380855290835281842054825160608101909352602680845291946bffffffffffffffffffffffff9091169390926109b1928892613d0f90830139611f91565b90508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156109fd57506bffffffffffffffffffffffff82811614155b15610ad1576000610a2783836040518060600160405280603e8152602001613c75603e9139611fe3565b73ffffffffffffffffffffffffffffffffffffffff8981166000818152603960209081526040808320948a16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff86161790555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610ac7908590613a43565b60405180910390a3505b610adc878783612046565b600193505050505b9392505050565b60355460ff1681565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831415610b4657507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610b6b565b610b68836040518060600160405280602b8152602001613bff602b9139611f91565b90505b33600090815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452825291829020548251606081019093526032808452610bd0936bffffffffffffffffffffffff9092169285929190613d5d90830139612435565b33600081815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a1680855292529182902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff9586161790819055915190937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926108e192911690613a43565b6000604051806060016040528060238152602001613e5b60239139604254819073ffffffffffffffffffffffffffffffffffffffff163314610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b50604480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591505b5090565b60385460009073ffffffffffffffffffffffffffffffffffffffff84811691161415610d40575060016108ef565b60385473ffffffffffffffffffffffffffffffffffffffff83811691161415610da05773ffffffffffffffffffffffffffffffffffffffff831660009081526043602052604090205460ff1680610d99575060445460ff165b90506108ef565b73ffffffffffffffffffffffffffffffffffffffff831660009081526043602052604090205460ff1680610df9575073ffffffffffffffffffffffffffffffffffffffff821660009081526043602052604090205460ff165b80610ae4575060445460ff169392505050565b60436020526000908152604090205460ff1681565b603d6020526000908152604090205463ffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff166000908152603a60205260409020546bffffffffffffffffffffffff1690565b6000438210610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139bc565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603d602052604090205463ffffffff1680610ee55760009150506108ef565b73ffffffffffffffffffffffffffffffffffffffff84166000908152603c6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860181168552925290912054168310610fbd5773ffffffffffffffffffffffffffffffffffffffff84166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff168352929052205464010000000090046bffffffffffffffffffffffff1690506108ef565b73ffffffffffffffffffffffffffffffffffffffff84166000908152603c6020908152604080832083805290915290205463ffffffff168310156110055760009150506108ef565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff1611156110f957600282820363ffffffff16048103611055612cac565b5073ffffffffffffffffffffffffffffffffffffffff87166000908152603c6020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff1691810191909152908714156110d4576020015194506108ef9350505050565b805163ffffffff168711156110eb578193506110f2565b6001820392505b505061102b565b5073ffffffffffffffffffffffffffffffffffffffff85166000908152603c6020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b60416020526000908152604090205481565b60408051808201909152601881527f4f6e6c792061646d696e2063616e2077686974656c6973740000000000000000602082015260425460009190819073ffffffffffffffffffffffffffffffffffffffff1633146111ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b50505073ffffffffffffffffffffffffffffffffffffffff16600090815260436020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915590565b611250338383612490565b5050565b6034805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156107c85780601f1061079d576101008083540402835291602001916107c8565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141561131f57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611344565b611341836040518060600160405280602d8152602001613dc2602d9139611f91565b90505b33600090815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452825291829020548251606081019093526033808452610bd0936bffffffffffffffffffffffff9092169285929190613d8f90830139611fe3565b6000603e5460336040516113bd91906137e4565b60405180910390206113cd611da8565b306040516020016113e194939291906138b8565b6040516020818303038152906040528051906020012090506000603f548989898660405160200161141695949392919061386c565b604051602081830303815290604052805190602001209050600082826040516020016114439291906137fb565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161148094939291906138f6565b6020604051602081039080840390855afa1580156114a2573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661151a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139dc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526041602052604090208054600181019091558a14611580576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061398c565b884211156115ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139ec565b610717818c87612490565b60006115d13384610d12565b611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061395c565b600061162b83604051806060016040528060278152602001613c4e60279139611f91565b9050611638338583612046565b5060019392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152603d602052604081205463ffffffff168061167a576000610ae4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff850163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff169392505050565b60375481565b600054610100900460ff168061170f575061170f61266d565b8061171d575060005460ff16155b611753576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061399c565b600054610100900460ff161580156117b957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6117c1612673565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061393c565b6037805473ffffffffffffffffffffffffffffffffffffffff85166000818152603a6020908152604080832080546bffffffffffffffffffffffff9687167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000918216179091558654603b845282852085805284528285208054919097169116179094558282526043905282812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055925491519092917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91611910919061385e565b60405180910390a360006119416036546037546040518060600160405280602e8152602001613bd1602e9139611fe3565b73ffffffffffffffffffffffffffffffffffffffff8681166000818152603a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166bffffffffffffffffffffffff8916908117909255603b84528285208580528452828520805490911682179055848452604390925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016958a16959095179094559251939450909290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91611a56919061385e565b60405180910390a3508015611a8e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050565b60445460ff1681565b6000604051806060016040528060248152602001613c2a60249139604254819073ffffffffffffffffffffffffffffffffffffffff163314611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b5050604480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905550600190565b6000604051806060016040528060248152602001613b7c60249139604254819073ffffffffffffffffffffffffffffffffffffffff163314611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b50505073ffffffffffffffffffffffffffffffffffffffff16600090815260436020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600190565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526039602090815260408083209390941682529190915220546bffffffffffffffffffffffff1690565b611250338383611dad565b603b6020908152600092835260408084209091529082529020546bffffffffffffffffffffffff1681565b603f5481565b603c60209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b604051806060016040528060218152602001613eaf60219139604254819073ffffffffffffffffffffffffffffffffffffffff163314611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b5050603880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60425473ffffffffffffffffffffffffffffffffffffffff1681565b60385473ffffffffffffffffffffffffffffffffffffffff1681565b465b90565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152603b60209081526040808320938616835292815290829020548251808401909352601c83527f4d506f6e643a20756e64656c65676174657320756e646572666c6f770000000091830191909152611e33916bffffffffffffffffffffffff909116908390611fe3565b73ffffffffffffffffffffffffffffffffffffffff8481166000908152603b60209081526040808320938716835292815282822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff95861617905581805290829020548251808401909352601a83527f4d506f6e643a2064656c65676174657320756e646572666c6f7700000000000091830191909152611ee79216908390612435565b73ffffffffffffffffffffffffffffffffffffffff8481166000818152603b6020908152604080832083805290915280822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff96909616959095179094559251918516917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f908490a4611f8c826000836127b3565b505050565b6000816c010000000000000000000000008410611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b509192915050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff161115829061203e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8316612093576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139fc565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603b602090815260408083208380529091529020546bffffffffffffffffffffffff8083169116101561210e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061394c565b73ffffffffffffffffffffffffffffffffffffffff821661215b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139cc565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603a60209081526040918290205482516060810190935260378084526121b8936bffffffffffffffffffffffff9092169285929190613e2490830139611fe3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152603a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff958616179055603b82528083208380528252918290205482516060810190935260338084526122509491909116928592909190613cdc90830139611fe3565b73ffffffffffffffffffffffffffffffffffffffff8481166000908152603b60209081526040808320838052825280832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff9687161790559286168252603a8152908290205482516060810190935260318084526122ee9491909116928592909190613ba090830139612435565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff958616179055603b82528083208380528252918290205482516060810190935260318084526123869491909116928592909190613e7e90830139612435565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152603b602090815260408083208380529091529081902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff95909516949094179093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612428908590613a43565b60405180910390a3505050565b6000838301826bffffffffffffffffffffffff8087169083161015612487576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b50949350505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603b60209081526040808320838052825291829020548251808401909352601a83527f4d506f6e643a2064656c65676174657320756e646572666c6f7700000000000091830191909152612512916bffffffffffffffffffffffff909116908390611fe3565b73ffffffffffffffffffffffffffffffffffffffff8481166000908152603b60209081526040808320838052825280832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff968716179055928616825290829020548251808401909352601983527f4d506f6e643a2064656c656761746573206f766572666c6f7700000000000000918301919091526125c59216908390612435565b73ffffffffffffffffffffffffffffffffffffffff8481166000818152603b602090815260408083209488168084529490915280822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff969096169590951790945592519192917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f908390a4611f8c600083836127b3565b303b1590565b6040805180820190915260068082527f4d61726c696e000000000000000000000000000000000000000000000000000060209092019182526126b791603391612cc3565b506040805180820190915260058082527f4d506f6e6400000000000000000000000000000000000000000000000000000060209092019182526126fc91603491612cc3565b50603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016601217905569021e19e0c9bab240000060365569017b7883c069166000006037556040516127509061382c565b604051908190038120603e5561276590613837565b604051908190038120603f5561277a906137f0565b60408051918290039091209055604280547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127fc57506bffffffffffffffffffffffff811615155b15611f8c5773ffffffffffffffffffffffffffffffffffffffff8316156128ff5773ffffffffffffffffffffffffffffffffffffffff83166000908152603d602052604081205463ffffffff1690816128565760006128c6565b73ffffffffffffffffffffffffffffffffffffffff85166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b905060006128ed8285604051806060016040528060298152602001613cb360299139611fe3565b90506128fb86848484612a01565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615611f8c5773ffffffffffffffffffffffffffffffffffffffff82166000908152603d602052604081205463ffffffff1690816129545760006129c4565b73ffffffffffffffffffffffffffffffffffffffff84166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b905060006129eb8285604051806060016040528060288152602001613d3560289139612435565b90506129f985848484612a01565b505050505050565b6000612a2543604051806060016040528060358152602001613def60359139612c6a565b905063ffffffff841615801590612a98575073ffffffffffffffffffffffffffffffffffffffff85166000908152603c6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901811685529252909120548282169116145b15612b375773ffffffffffffffffffffffffffffffffffffffff85166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff880163ffffffff168452909152902080547fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff166401000000006bffffffffffffffffffffffff851602179055612c13565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000818152603c83528781208c871682528352878120965187549451909516640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff9587167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000958616179590951694909417909555938252603d90935292909220805460018801909316929091169190911790555b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051612c5b929190613a5f565b60405180910390a25050505050565b6000816401000000008410611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612d0457805160ff1916838001178555612d31565b82800160010185558215612d31579182015b82811115612d31578251825591602001919060010190612d16565b50610d0e92611daa9250905b80821115610d0e5760008155600101612d3d565b80356108ef81613b40565b80356108ef81613b57565b80356108ef81613b60565b80356108ef81613b69565b80356108ef81613b72565b600060208284031215612d9a57600080fd5b6000612da68484612d51565b949350505050565b60008060408385031215612dc157600080fd5b6000612dcd8585612d51565b9250506020612dde85828601612d51565b9150509250929050565b600080600060608486031215612dfd57600080fd5b6000612e098686612d51565b9350506020612e1a86828701612d51565b9250506040612e2b86828701612d51565b9150509250925092565b600080600060608486031215612e4a57600080fd5b6000612e568686612d51565b9350506020612e6786828701612d51565b9250506040612e2b86828701612d5c565b60008060408385031215612e8b57600080fd5b6000612e978585612d51565b9250506020612dde85828601612d5c565b600080600080600080600060e0888a031215612ec357600080fd5b6000612ecf8a8a612d51565b9750506020612ee08a828b01612d5c565b9650506040612ef18a828b01612d5c565b9550506060612f028a828b01612d72565b9450506080612f138a828b01612d5c565b93505060a0612f248a828b01612d5c565b92505060c0612f358a828b01612d7d565b91505092959891949750929550565b60008060408385031215612f5757600080fd5b6000612f638585612d51565b9250506020612dde85828601612d67565b60008060408385031215612f8757600080fd5b6000612f938585612d51565b9250506020612dde85828601612d7d565b612fad81613a98565b82525050565b612fad81613aa3565b612fad81611daa565b612fad612fd182611daa565b611daa565b600081546001811660008114612ff3576001811461303457613073565b607f60028304166130048187613a8a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168152955085019250613073565b600282046130428187613a8a565b955061304d85613a7a565b60005b8281101561306c57815488820152600190910190602001613050565b5050850192505b505092915050565b600061308682613a86565b6130908185613a8f565b93506130a0818560208601613aec565b6130a981613b18565b9093019392505050565b60006130c0604983613a8a565b7f556e656c65676174696f6e28616464726573732064656c6567617465652c756981527f6e74323536206e6f6e63652c75696e74323536206578706972792c75696e743960208201527f3620616d6f756e74290000000000000000000000000000000000000000000000604082015260490192915050565b6000613145600283613a8a565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b600061317e603183613a8f565b7f42726964676520616e64206163636f756e742073686f756c64206e6f7420626581527f207468652073616d652061646472657373000000000000000000000000000000602082015260400192915050565b60006131dd605183613a8f565b7f4d506f6e643a205f7472616e73666572546f6b656e733a20756e64656c65676181527f74656420616d6f756e742073686f756c6420626520677265617465722074686160208201527f6e207472616e7366657220616d6f756e74000000000000000000000000000000604082015260600192915050565b6000613262607783613a8f565b7f41746c65617374206f6e65206f6620746865206164647265737320287372632081527f6f7220647374292073686f756c642062652077686974656c6973746564206f7260208201527f20616c6c207472616e7366657273206d75737420626520656e61626c6564207660408201527f696120656e61626c65416c6c5472616e73666572732829000000000000000000606082015260800192915050565b600061330d604383613a8a565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201527f6374290000000000000000000000000000000000000000000000000000000000604082015260430192915050565b6000613392602983613a8f565b7f4d506f6e643a3a756e64656c656761746542795369673a20696e76616c69642081527f7369676e61747572650000000000000000000000000000000000000000000000602082015260400192915050565b60006133f1602983613a8f565b7f4d506f6e643a3a756e64656c656761746542795369673a207369676e6174757281527f6520657870697265640000000000000000000000000000000000000000000000602082015260400192915050565b6000613450602383613a8f565b7f4d506f6e643a3a64656c656761746542795369673a20696e76616c6964206e6f81527f6e63650000000000000000000000000000000000000000000000000000000000602082015260400192915050565b60006134af602e83613a8f565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626581527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015260400192915050565b600061350e602583613a8f565b7f4d506f6e643a3a756e64656c656761746542795369673a20696e76616c69642081527f6e6f6e6365000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061356d602883613a8f565b7f4d506f6e643a3a6765745072696f72566f7465733a206e6f742079657420646581527f7465726d696e6564000000000000000000000000000000000000000000000000602082015260400192915050565b60006135cc603b83613a8f565b7f4d506f6e643a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207481527f72616e7366657220746f20746865207a65726f20616464726573730000000000602082015260400192915050565b600061362b602783613a8f565b7f4d506f6e643a3a64656c656761746542795369673a20696e76616c696420736981527f676e617475726500000000000000000000000000000000000000000000000000602082015260400192915050565b600061368a602783613a8f565b7f4d506f6e643a3a64656c656761746542795369673a207369676e61747572652081527f6578706972656400000000000000000000000000000000000000000000000000602082015260400192915050565b60006136e9604883613a8a565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e74323536206578706972792c75696e74393660208201527f20616d6f756e7429000000000000000000000000000000000000000000000000604082015260480192915050565b600061376e603d83613a8f565b7f4d506f6e643a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207481527f72616e736665722066726f6d20746865207a65726f2061646472657373000000602082015260400192915050565b612fad81613ac1565b612fad81613aca565b612fad81613ae1565b612fad81613ad0565b6000610ae48284612fd6565b60006108ef826130b3565b600061380682613138565b91506138128285612fc5565b6020820191506138228284612fc5565b5060200192915050565b60006108ef82613300565b60006108ef826136dc565b602081016108ef8284612fa4565b602081016108ef8284612fb3565b602081016108ef8284612fbc565b60a0810161387a8288612fbc565b6138876020830187612fa4565b6138946040830186612fbc565b6138a16060830185612fbc565b6138ae60808301846137db565b9695505050505050565b608081016138c68287612fbc565b6138d36020830186612fbc565b6138e06040830185612fbc565b6138ed6060830184612fa4565b95945050505050565b608081016139048287612fbc565b61391160208301866137c9565b61391e6040830185612fbc565b6138ed6060830184612fbc565b60208082528101610ae4818461307b565b602080825281016108ef81613171565b602080825281016108ef816131d0565b602080825281016108ef81613255565b602080825281016108ef81613385565b602080825281016108ef816133e4565b602080825281016108ef81613443565b602080825281016108ef816134a2565b602080825281016108ef81613501565b602080825281016108ef81613560565b602080825281016108ef816135bf565b602080825281016108ef8161361e565b602080825281016108ef8161367d565b602080825281016108ef81613761565b602081016108ef82846137c0565b60408101613a2882856137c0565b610ae460208301846137db565b602081016108ef82846137c9565b602081016108ef82846137d2565b602081016108ef82846137db565b60408101613a6d82856137d2565b610ae460208301846137d2565b60009081526020902090565b5190565b919050565b90815260200190565b60006108ef82613aa8565b151590565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60ff1690565b6bffffffffffffffffffffffff1690565b60006108ef82613ad0565b60005b83811015613b07578181015183820152602001613aef565b83811115611a8e5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b613b4981613a98565b8114613b5457600080fd5b50565b613b4981611daa565b613b4981613ac1565b613b4981613aca565b613b4981613ad056fe4f6e6c792061646d696e2063616e2072656d6f76652066726f6d2077686974656c6973744d506f6e643a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f77734d506f6e643a205375627472616374696f6e206f766572666c6f7720696e2074686520636f6e7374727563746f724d506f6e643a3a617070726f76653a206164646564416d6f756e74206578636565647320393620626974734f6e6c792061646d696e2063616e2064697361626c6520616c6c207472616e73666572734d506f6e643a3a7472616e736665723a20616d6f756e74206578636565647320393620626974734d506f6e643a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e63654d506f6e643a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f77734d506f6e643a205f7472616e666572546f6b656e733a20756e64656c6567617465207375627472616374696f6e206572726f724d506f6e643a3a617070726f76653a20616d6f756e74206578636565647320393620626974734d506f6e643a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f77734d506f6e643a20696e637265617365416c6c6f77616e636520616c6c6f77616e63652076616c7565206f766572666c6f77734d506f6e643a206465637265617365416c6c6f77616e636520616c6c6f77616e63652076616c756520756e646572666c6f77734d506f6e643a3a617070726f76653a2072656d6f766564416d6f756e74206578636565647320393620626974734d506f6e643a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974734d506f6e643a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f6e6c792061646d696e2063616e20656e61626c6520616c6c207472616e73666572734d506f6e643a205f7472616e73666572546f6b656e733a20756e64656c6567617465206164646974696f6e206572726f724f6e6c792061646d696e2063616e206368616e67652064726f7020627269646765a365627a7a72315820b2d439a0721ffa7414ea2a1e84fd08f6745a1aa9a9cbf585c05dfcb75c4354b66c6578706572696d656e74616cf564736f6c63430005110040

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025c5760003560e01c806395d89b4111610145578063ce114c25116100bd578063e7a324dc1161008c578063f425859211610071578063f4258592146104c2578063f851a440146104d5578063fd71d86a146104ea5761025c565b8063e7a324dc14610499578063f1127ed8146104a15761025c565b8063ce114c251461044d578063dd62ed3e14610460578063e1032b8314610473578063e5843242146104865761025c565b8063b4b5ea5711610114578063c0c53b8b116100f9578063c0c53b8b1461042a578063c43ff0c81461043d578063c6d6125e146104455761025c565b8063b4b5ea571461040f578063b9371343146104225761025c565b806395d89b41146103ce578063a457c2d7146103d6578063a65835da146103e9578063a9059cbb146103fc5761025c565b806367cb1601116101d857806370a08231116101a75780637ecebe001161018c5780637ecebe00146103955780638164c309146103a85780638b41166c146103bb5761025c565b806370a0823114610362578063782d6fe1146103755761025c565b806367cb1601146103145780636ab5cc381461031c5780636f9170f61461032f5780636fcfff45146103425761025c565b806318160ddd1161022f57806323b872dd1161021457806323b872dd146102d9578063313ce567146102ec57806339509351146103015761025c565b806318160ddd146102c957806320606b70146102d15761025c565b806302cb3a881461026157806306fdde0314610276578063095ea7b31461029457806316aeac20146102b4575b600080fd5b61027461026f366004612ea8565b6104f2565b005b61027e610724565b60405161028b919061392b565b60405180910390f35b6102a76102a2366004612e78565b6107d0565b60405161028b9190613850565b6102bc6108f5565b60405161028b919061385e565b6102bc6108fb565b6102bc610901565b6102a76102e7366004612e35565b610907565b6102f4610aeb565b60405161028b9190613a35565b6102a761030f366004612e78565b610af4565b6102a7610c6d565b6102a761032a366004612dae565b610d12565b6102a761033d366004612d88565b610e0c565b610355610350366004612d88565b610e21565b60405161028b9190613a0c565b6102bc610370366004612d88565b610e39565b610388610383366004612e78565b610e6f565b60405161028b9190613a51565b6102bc6103a3366004612d88565b611151565b6102a76103b6366004612d88565b611163565b6102746103c9366004612f74565b611245565b61027e611254565b6102a76103e4366004612e78565b6112cd565b6102746103f7366004612ea8565b6113a9565b6102a761040a366004612e78565b6115c5565b61038861041d366004612d88565b611642565b6102bc6116f0565b610274610438366004612de8565b6116f6565b6102a7611a94565b6102a7611a9d565b6102a761045b366004612d88565b611b3c565b6102bc61046e366004612dae565b611bfd565b610274610481366004612f74565b611c43565b610388610494366004612dae565b611c4e565b6102bc611c79565b6104b46104af366004612f44565b611c7f565b60405161028b929190613a1a565b6102746104d0366004612d88565b611cba565b6104dd611d70565b60405161028b9190613842565b6104dd611d8c565b6000603e54603360405161050691906137e4565b6040518091039020610516611da8565b3060405160200161052a94939291906138b8565b60405160208183030381529060405280519060200120905060006040548989898660405160200161055f95949392919061386c565b6040516020818303038152906040528051906020012090506000828260405160200161058c9291906137fb565b6040516020818303038152906040528051906020012090506000600182898989604051600081526020016040526040516105c994939291906138f6565b6020604051602081039080840390855afa1580156105eb573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661066c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061396c565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526041602052604090208054600181019091558a146106d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139ac565b8842111561070c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061397c565b610717818c87611dad565b5050505050505050505050565b6033805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156107c85780601f1061079d576101008083540402835291602001916107c8565b820191906000526020600020905b8154815290600101906020018083116107ab57829003601f168201915b505050505081565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141561082257507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610847565b61084483604051806060016040528060268152602001613d0f60269139611f91565b90505b33600081815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff891680855292529182902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff861617905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906108e1908590613a43565b60405180910390a360019150505b92915050565b60405481565b60365481565b603e5481565b60006109133384610d12565b610949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061395c565b73ffffffffffffffffffffffffffffffffffffffff841660009081526039602090815260408083203380855290835281842054825160608101909352602680845291946bffffffffffffffffffffffff9091169390926109b1928892613d0f90830139611f91565b90508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156109fd57506bffffffffffffffffffffffff82811614155b15610ad1576000610a2783836040518060600160405280603e8152602001613c75603e9139611fe3565b73ffffffffffffffffffffffffffffffffffffffff8981166000818152603960209081526040808320948a16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff86161790555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610ac7908590613a43565b60405180910390a3505b610adc878783612046565b600193505050505b9392505050565b60355460ff1681565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831415610b4657507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610b6b565b610b68836040518060600160405280602b8152602001613bff602b9139611f91565b90505b33600090815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452825291829020548251606081019093526032808452610bd0936bffffffffffffffffffffffff9092169285929190613d5d90830139612435565b33600081815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a1680855292529182902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff9586161790819055915190937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926108e192911690613a43565b6000604051806060016040528060238152602001613e5b60239139604254819073ffffffffffffffffffffffffffffffffffffffff163314610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b50604480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591505b5090565b60385460009073ffffffffffffffffffffffffffffffffffffffff84811691161415610d40575060016108ef565b60385473ffffffffffffffffffffffffffffffffffffffff83811691161415610da05773ffffffffffffffffffffffffffffffffffffffff831660009081526043602052604090205460ff1680610d99575060445460ff165b90506108ef565b73ffffffffffffffffffffffffffffffffffffffff831660009081526043602052604090205460ff1680610df9575073ffffffffffffffffffffffffffffffffffffffff821660009081526043602052604090205460ff165b80610ae4575060445460ff169392505050565b60436020526000908152604090205460ff1681565b603d6020526000908152604090205463ffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff166000908152603a60205260409020546bffffffffffffffffffffffff1690565b6000438210610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139bc565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603d602052604090205463ffffffff1680610ee55760009150506108ef565b73ffffffffffffffffffffffffffffffffffffffff84166000908152603c6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860181168552925290912054168310610fbd5773ffffffffffffffffffffffffffffffffffffffff84166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff168352929052205464010000000090046bffffffffffffffffffffffff1690506108ef565b73ffffffffffffffffffffffffffffffffffffffff84166000908152603c6020908152604080832083805290915290205463ffffffff168310156110055760009150506108ef565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff1611156110f957600282820363ffffffff16048103611055612cac565b5073ffffffffffffffffffffffffffffffffffffffff87166000908152603c6020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff1691810191909152908714156110d4576020015194506108ef9350505050565b805163ffffffff168711156110eb578193506110f2565b6001820392505b505061102b565b5073ffffffffffffffffffffffffffffffffffffffff85166000908152603c6020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b60416020526000908152604090205481565b60408051808201909152601881527f4f6e6c792061646d696e2063616e2077686974656c6973740000000000000000602082015260425460009190819073ffffffffffffffffffffffffffffffffffffffff1633146111ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b50505073ffffffffffffffffffffffffffffffffffffffff16600090815260436020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915590565b611250338383612490565b5050565b6034805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156107c85780601f1061079d576101008083540402835291602001916107c8565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141561131f57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611344565b611341836040518060600160405280602d8152602001613dc2602d9139611f91565b90505b33600090815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452825291829020548251606081019093526033808452610bd0936bffffffffffffffffffffffff9092169285929190613d8f90830139611fe3565b6000603e5460336040516113bd91906137e4565b60405180910390206113cd611da8565b306040516020016113e194939291906138b8565b6040516020818303038152906040528051906020012090506000603f548989898660405160200161141695949392919061386c565b604051602081830303815290604052805190602001209050600082826040516020016114439291906137fb565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161148094939291906138f6565b6020604051602081039080840390855afa1580156114a2573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661151a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139dc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526041602052604090208054600181019091558a14611580576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061398c565b884211156115ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139ec565b610717818c87612490565b60006115d13384610d12565b611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061395c565b600061162b83604051806060016040528060278152602001613c4e60279139611f91565b9050611638338583612046565b5060019392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152603d602052604081205463ffffffff168061167a576000610ae4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff850163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff169392505050565b60375481565b600054610100900460ff168061170f575061170f61266d565b8061171d575060005460ff16155b611753576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061399c565b600054610100900460ff161580156117b957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6117c1612673565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061393c565b6037805473ffffffffffffffffffffffffffffffffffffffff85166000818152603a6020908152604080832080546bffffffffffffffffffffffff9687167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000918216179091558654603b845282852085805284528285208054919097169116179094558282526043905282812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055925491519092917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91611910919061385e565b60405180910390a360006119416036546037546040518060600160405280602e8152602001613bd1602e9139611fe3565b73ffffffffffffffffffffffffffffffffffffffff8681166000818152603a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166bffffffffffffffffffffffff8916908117909255603b84528285208580528452828520805490911682179055848452604390925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016958a16959095179094559251939450909290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91611a56919061385e565b60405180910390a3508015611a8e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050565b60445460ff1681565b6000604051806060016040528060248152602001613c2a60249139604254819073ffffffffffffffffffffffffffffffffffffffff163314611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b5050604480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905550600190565b6000604051806060016040528060248152602001613b7c60249139604254819073ffffffffffffffffffffffffffffffffffffffff163314611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b50505073ffffffffffffffffffffffffffffffffffffffff16600090815260436020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600190565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526039602090815260408083209390941682529190915220546bffffffffffffffffffffffff1690565b611250338383611dad565b603b6020908152600092835260408084209091529082529020546bffffffffffffffffffffffff1681565b603f5481565b603c60209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b604051806060016040528060218152602001613eaf60219139604254819073ffffffffffffffffffffffffffffffffffffffff163314611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b5050603880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60425473ffffffffffffffffffffffffffffffffffffffff1681565b60385473ffffffffffffffffffffffffffffffffffffffff1681565b465b90565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152603b60209081526040808320938616835292815290829020548251808401909352601c83527f4d506f6e643a20756e64656c65676174657320756e646572666c6f770000000091830191909152611e33916bffffffffffffffffffffffff909116908390611fe3565b73ffffffffffffffffffffffffffffffffffffffff8481166000908152603b60209081526040808320938716835292815282822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff95861617905581805290829020548251808401909352601a83527f4d506f6e643a2064656c65676174657320756e646572666c6f7700000000000091830191909152611ee79216908390612435565b73ffffffffffffffffffffffffffffffffffffffff8481166000818152603b6020908152604080832083805290915280822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff96909616959095179094559251918516917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f908490a4611f8c826000836127b3565b505050565b6000816c010000000000000000000000008410611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b509192915050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff161115829061203e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8316612093576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139fc565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603b602090815260408083208380529091529020546bffffffffffffffffffffffff8083169116101561210e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106639061394c565b73ffffffffffffffffffffffffffffffffffffffff821661215b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663906139cc565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603a60209081526040918290205482516060810190935260378084526121b8936bffffffffffffffffffffffff9092169285929190613e2490830139611fe3565b73ffffffffffffffffffffffffffffffffffffffff84166000908152603a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff958616179055603b82528083208380528252918290205482516060810190935260338084526122509491909116928592909190613cdc90830139611fe3565b73ffffffffffffffffffffffffffffffffffffffff8481166000908152603b60209081526040808320838052825280832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff9687161790559286168252603a8152908290205482516060810190935260318084526122ee9491909116928592909190613ba090830139612435565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff958616179055603b82528083208380528252918290205482516060810190935260318084526123869491909116928592909190613e7e90830139612435565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152603b602090815260408083208380529091529081902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff95909516949094179093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612428908590613a43565b60405180910390a3505050565b6000838301826bffffffffffffffffffffffff8087169083161015612487576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b50949350505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603b60209081526040808320838052825291829020548251808401909352601a83527f4d506f6e643a2064656c65676174657320756e646572666c6f7700000000000091830191909152612512916bffffffffffffffffffffffff909116908390611fe3565b73ffffffffffffffffffffffffffffffffffffffff8481166000908152603b60209081526040808320838052825280832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff968716179055928616825290829020548251808401909352601983527f4d506f6e643a2064656c656761746573206f766572666c6f7700000000000000918301919091526125c59216908390612435565b73ffffffffffffffffffffffffffffffffffffffff8481166000818152603b602090815260408083209488168084529490915280822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff969096169590951790945592519192917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f908390a4611f8c600083836127b3565b303b1590565b6040805180820190915260068082527f4d61726c696e000000000000000000000000000000000000000000000000000060209092019182526126b791603391612cc3565b506040805180820190915260058082527f4d506f6e6400000000000000000000000000000000000000000000000000000060209092019182526126fc91603491612cc3565b50603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016601217905569021e19e0c9bab240000060365569017b7883c069166000006037556040516127509061382c565b604051908190038120603e5561276590613837565b604051908190038120603f5561277a906137f0565b60408051918290039091209055604280547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127fc57506bffffffffffffffffffffffff811615155b15611f8c5773ffffffffffffffffffffffffffffffffffffffff8316156128ff5773ffffffffffffffffffffffffffffffffffffffff83166000908152603d602052604081205463ffffffff1690816128565760006128c6565b73ffffffffffffffffffffffffffffffffffffffff85166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b905060006128ed8285604051806060016040528060298152602001613cb360299139611fe3565b90506128fb86848484612a01565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615611f8c5773ffffffffffffffffffffffffffffffffffffffff82166000908152603d602052604081205463ffffffff1690816129545760006129c4565b73ffffffffffffffffffffffffffffffffffffffff84166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b905060006129eb8285604051806060016040528060288152602001613d3560289139612435565b90506129f985848484612a01565b505050505050565b6000612a2543604051806060016040528060358152602001613def60359139612c6a565b905063ffffffff841615801590612a98575073ffffffffffffffffffffffffffffffffffffffff85166000908152603c6020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901811685529252909120548282169116145b15612b375773ffffffffffffffffffffffffffffffffffffffff85166000908152603c602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff880163ffffffff168452909152902080547fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff166401000000006bffffffffffffffffffffffff851602179055612c13565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000818152603c83528781208c871682528352878120965187549451909516640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff9587167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000958616179590951694909417909555938252603d90935292909220805460018801909316929091169190911790555b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051612c5b929190613a5f565b60405180910390a25050505050565b6000816401000000008410611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610663919061392b565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612d0457805160ff1916838001178555612d31565b82800160010185558215612d31579182015b82811115612d31578251825591602001919060010190612d16565b50610d0e92611daa9250905b80821115610d0e5760008155600101612d3d565b80356108ef81613b40565b80356108ef81613b57565b80356108ef81613b60565b80356108ef81613b69565b80356108ef81613b72565b600060208284031215612d9a57600080fd5b6000612da68484612d51565b949350505050565b60008060408385031215612dc157600080fd5b6000612dcd8585612d51565b9250506020612dde85828601612d51565b9150509250929050565b600080600060608486031215612dfd57600080fd5b6000612e098686612d51565b9350506020612e1a86828701612d51565b9250506040612e2b86828701612d51565b9150509250925092565b600080600060608486031215612e4a57600080fd5b6000612e568686612d51565b9350506020612e6786828701612d51565b9250506040612e2b86828701612d5c565b60008060408385031215612e8b57600080fd5b6000612e978585612d51565b9250506020612dde85828601612d5c565b600080600080600080600060e0888a031215612ec357600080fd5b6000612ecf8a8a612d51565b9750506020612ee08a828b01612d5c565b9650506040612ef18a828b01612d5c565b9550506060612f028a828b01612d72565b9450506080612f138a828b01612d5c565b93505060a0612f248a828b01612d5c565b92505060c0612f358a828b01612d7d565b91505092959891949750929550565b60008060408385031215612f5757600080fd5b6000612f638585612d51565b9250506020612dde85828601612d67565b60008060408385031215612f8757600080fd5b6000612f938585612d51565b9250506020612dde85828601612d7d565b612fad81613a98565b82525050565b612fad81613aa3565b612fad81611daa565b612fad612fd182611daa565b611daa565b600081546001811660008114612ff3576001811461303457613073565b607f60028304166130048187613a8a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168152955085019250613073565b600282046130428187613a8a565b955061304d85613a7a565b60005b8281101561306c57815488820152600190910190602001613050565b5050850192505b505092915050565b600061308682613a86565b6130908185613a8f565b93506130a0818560208601613aec565b6130a981613b18565b9093019392505050565b60006130c0604983613a8a565b7f556e656c65676174696f6e28616464726573732064656c6567617465652c756981527f6e74323536206e6f6e63652c75696e74323536206578706972792c75696e743960208201527f3620616d6f756e74290000000000000000000000000000000000000000000000604082015260490192915050565b6000613145600283613a8a565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b600061317e603183613a8f565b7f42726964676520616e64206163636f756e742073686f756c64206e6f7420626581527f207468652073616d652061646472657373000000000000000000000000000000602082015260400192915050565b60006131dd605183613a8f565b7f4d506f6e643a205f7472616e73666572546f6b656e733a20756e64656c65676181527f74656420616d6f756e742073686f756c6420626520677265617465722074686160208201527f6e207472616e7366657220616d6f756e74000000000000000000000000000000604082015260600192915050565b6000613262607783613a8f565b7f41746c65617374206f6e65206f6620746865206164647265737320287372632081527f6f7220647374292073686f756c642062652077686974656c6973746564206f7260208201527f20616c6c207472616e7366657273206d75737420626520656e61626c6564207660408201527f696120656e61626c65416c6c5472616e73666572732829000000000000000000606082015260800192915050565b600061330d604383613a8a565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201527f6374290000000000000000000000000000000000000000000000000000000000604082015260430192915050565b6000613392602983613a8f565b7f4d506f6e643a3a756e64656c656761746542795369673a20696e76616c69642081527f7369676e61747572650000000000000000000000000000000000000000000000602082015260400192915050565b60006133f1602983613a8f565b7f4d506f6e643a3a756e64656c656761746542795369673a207369676e6174757281527f6520657870697265640000000000000000000000000000000000000000000000602082015260400192915050565b6000613450602383613a8f565b7f4d506f6e643a3a64656c656761746542795369673a20696e76616c6964206e6f81527f6e63650000000000000000000000000000000000000000000000000000000000602082015260400192915050565b60006134af602e83613a8f565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626581527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015260400192915050565b600061350e602583613a8f565b7f4d506f6e643a3a756e64656c656761746542795369673a20696e76616c69642081527f6e6f6e6365000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061356d602883613a8f565b7f4d506f6e643a3a6765745072696f72566f7465733a206e6f742079657420646581527f7465726d696e6564000000000000000000000000000000000000000000000000602082015260400192915050565b60006135cc603b83613a8f565b7f4d506f6e643a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207481527f72616e7366657220746f20746865207a65726f20616464726573730000000000602082015260400192915050565b600061362b602783613a8f565b7f4d506f6e643a3a64656c656761746542795369673a20696e76616c696420736981527f676e617475726500000000000000000000000000000000000000000000000000602082015260400192915050565b600061368a602783613a8f565b7f4d506f6e643a3a64656c656761746542795369673a207369676e61747572652081527f6578706972656400000000000000000000000000000000000000000000000000602082015260400192915050565b60006136e9604883613a8a565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e74323536206578706972792c75696e74393660208201527f20616d6f756e7429000000000000000000000000000000000000000000000000604082015260480192915050565b600061376e603d83613a8f565b7f4d506f6e643a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207481527f72616e736665722066726f6d20746865207a65726f2061646472657373000000602082015260400192915050565b612fad81613ac1565b612fad81613aca565b612fad81613ae1565b612fad81613ad0565b6000610ae48284612fd6565b60006108ef826130b3565b600061380682613138565b91506138128285612fc5565b6020820191506138228284612fc5565b5060200192915050565b60006108ef82613300565b60006108ef826136dc565b602081016108ef8284612fa4565b602081016108ef8284612fb3565b602081016108ef8284612fbc565b60a0810161387a8288612fbc565b6138876020830187612fa4565b6138946040830186612fbc565b6138a16060830185612fbc565b6138ae60808301846137db565b9695505050505050565b608081016138c68287612fbc565b6138d36020830186612fbc565b6138e06040830185612fbc565b6138ed6060830184612fa4565b95945050505050565b608081016139048287612fbc565b61391160208301866137c9565b61391e6040830185612fbc565b6138ed6060830184612fbc565b60208082528101610ae4818461307b565b602080825281016108ef81613171565b602080825281016108ef816131d0565b602080825281016108ef81613255565b602080825281016108ef81613385565b602080825281016108ef816133e4565b602080825281016108ef81613443565b602080825281016108ef816134a2565b602080825281016108ef81613501565b602080825281016108ef81613560565b602080825281016108ef816135bf565b602080825281016108ef8161361e565b602080825281016108ef8161367d565b602080825281016108ef81613761565b602081016108ef82846137c0565b60408101613a2882856137c0565b610ae460208301846137db565b602081016108ef82846137c9565b602081016108ef82846137d2565b602081016108ef82846137db565b60408101613a6d82856137d2565b610ae460208301846137d2565b60009081526020902090565b5190565b919050565b90815260200190565b60006108ef82613aa8565b151590565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60ff1690565b6bffffffffffffffffffffffff1690565b60006108ef82613ad0565b60005b83811015613b07578181015183820152602001613aef565b83811115611a8e5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b613b4981613a98565b8114613b5457600080fd5b50565b613b4981611daa565b613b4981613ac1565b613b4981613aca565b613b4981613ad056fe4f6e6c792061646d696e2063616e2072656d6f76652066726f6d2077686974656c6973744d506f6e643a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f77734d506f6e643a205375627472616374696f6e206f766572666c6f7720696e2074686520636f6e7374727563746f724d506f6e643a3a617070726f76653a206164646564416d6f756e74206578636565647320393620626974734f6e6c792061646d696e2063616e2064697361626c6520616c6c207472616e73666572734d506f6e643a3a7472616e736665723a20616d6f756e74206578636565647320393620626974734d506f6e643a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e63654d506f6e643a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f77734d506f6e643a205f7472616e666572546f6b656e733a20756e64656c6567617465207375627472616374696f6e206572726f724d506f6e643a3a617070726f76653a20616d6f756e74206578636565647320393620626974734d506f6e643a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f77734d506f6e643a20696e637265617365416c6c6f77616e636520616c6c6f77616e63652076616c7565206f766572666c6f77734d506f6e643a206465637265617365416c6c6f77616e636520616c6c6f77616e63652076616c756520756e646572666c6f77734d506f6e643a3a617070726f76653a2072656d6f766564416d6f756e74206578636565647320393620626974734d506f6e643a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974734d506f6e643a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f6e6c792061646d696e2063616e20656e61626c6520616c6c207472616e73666572734d506f6e643a205f7472616e73666572546f6b656e733a20756e64656c6567617465206164646974696f6e206572726f724f6e6c792061646d696e2063616e206368616e67652064726f7020627269646765a365627a7a72315820b2d439a0721ffa7414ea2a1e84fd08f6745a1aa9a9cbf585c05dfcb75c4354b66c6578706572696d656e74616cf564736f6c63430005110040

Deployed Bytecode Sourcemap

2107:22342:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2107:22342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15325:1140;;;;;;;;;:::i;:::-;;2201:18;;;:::i;:::-;;;;;;;;;;;;;;;;9033:498;;;;;;;;;:::i;:::-;;;;;;;;3694:36;;;:::i;:::-;;;;;;;;2448:26;;;:::i;3442:30::-;;;:::i;12313:1032::-;;;;;;;;;:::i;2363:21::-;;;:::i;:::-;;;;;;;;9539:686;;;;;;;;;:::i;7032:200::-;;;:::i;7632:448::-;;;;;;;;;:::i;3915:45::-;;;;;;;;;:::i;3321:48::-;;;;;;;;;:::i;:::-;;;;;;;;11131:111;;;;;;;;;:::i;17367:1291::-;;;;;;;;;:::i;:::-;;;;;;;;3811:41;;;;;;;;;:::i;6576:212::-;;;;;;;;;:::i;13493:125::-;;;;;;;;;:::i;2280:20::-;;;:::i;10233:695::-;;;;;;;;;:::i;14189:1128::-;;;;;;;;;:::i;11506:497::-;;;;;;;;;:::i;16666:270::-;;;;;;;;;:::i;2494:27::-;;;:::i;4895:949::-;;;;;;;;;:::i;3967:29::-;;;:::i;7240:203::-;;;:::i;6796:228::-;;;;;;;;;:::i;8384:171::-;;;;;;;;;:::i;13626:129::-;;;;;;;;;:::i;2877:63::-;;;;;;;;;:::i;3566:34::-;;;:::i;3184:68::-;;;;;;;;;:::i;:::-;;;;;;;;;7451:173;;;;;;;;;:::i;3888:20::-;;;:::i;:::-;;;;;;;;2542:25;;;:::i;15325:1140::-;15534:23;15613:15;;15663:4;15647:22;;;;;;;;;;;;;;;15688:12;:10;:12::i;:::-;15727:4;15584:163;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15584:163:0;;;15560:198;;;;;;15534:224;;15769:18;15825:21;;15848:9;15859:5;15866:6;15874;15814:67;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15814:67:0;;;15790:102;;;;;;15769:123;;15903:14;15973:15;15990:10;15944:57;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15944:57:0;;;15920:92;;;;;;15903:109;;16023:17;16043:26;16053:6;16061:1;16064;16067;16043:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;16043:26:0;;;;;;-1:-1:-1;;16102:23:0;;;16080:114;;;;;;;;;;;;;;;;;;;;;;16236:17;;;;;;;:6;:17;;;;;:19;;;;;;;;16227:28;;16205:115;;;;;;;;;;;;;;16346:6;16339:3;:13;;16331:67;;;;;;;;;;;;;;16416:41;16428:9;16439;16450:6;16416:11;:41::i;:::-;16409:48;;;;15325:1140;;;;;;;:::o;2201:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9033:498::-;9122:4;9144:13;9193:2;9172:9;:24;9168:226;;;-1:-1:-1;9229:2:0;9168:226;;;9274:108;9299:9;9274:108;;;;;;;;;;;;;;;;;:6;:108::i;:::-;9265:117;;9168:226;9417:10;9406:22;;;;:10;:22;;;;;;;;;:31;;;;;;;;;;;:40;;;;;;;;;;9464:37;;9406:31;;9417:10;9464:37;;;;9406:40;;9464:37;;;;;;;;;;9519:4;9512:11;;;9033:498;;;;;:::o;3694:36::-;;;;:::o;2448:26::-;;;;:::o;3442:30::-;;;;:::o;12313:1032::-;12432:4;12471:38;12493:10;12505:3;12471:21;:38::i;:::-;12449:207;;;;;;;;;;;;;;12732:15;;;12667;12732;;;:10;:15;;;;;;;;12685:10;12732:24;;;;;;;;;;12783:96;;;;;;;;;;;;12685:10;;12732:24;;;;;12667:15;;12783:96;;12804:9;;12783:96;;;;;:6;:96::i;:::-;12767:112;;12907:3;12896:14;;:7;:14;;;;:48;;;;-1:-1:-1;12914:30:0;;;;;;12896:48;12892:378;;;12961:19;12983:163;13007:16;13042:6;12983:163;;;;;;;;;;;;;;;;;:5;:163::i;:::-;13161:15;;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;;:39;;;;;;;;;;13222:36;13161:39;;-1:-1:-1;13161:24:0;;13222:36;;;;13161:39;;13222:36;;;;;;;;;;12892:378;;13282:33;13298:3;13303;13308:6;13282:15;:33::i;:::-;13333:4;13326:11;;;;;12313:1032;;;;;;:::o;2363:21::-;;;;;;:::o;9539:686::-;9640:4;9662:13;9713:2;9690:11;:26;9686:235;;;-1:-1:-1;9749:2:0;9686:235;;;9794:115;9819:11;9794:115;;;;;;;;;;;;;;;;;:6;:115::i;:::-;9785:124;;9686:235;9998:10;9987:22;;;;:10;:22;;;;;;;;;:31;;;;;;;;;;;9967:150;;;;;;;;;;;;;;9987:31;;;;;10033:6;;9967:150;;;;;;;:5;:150::i;:::-;9944:10;9933:22;;;;:10;:22;;;;;;;;;:31;;;;;;;;;;;:184;;;;;;;;;;;;;10133:62;;9933:31;;10133:62;;;;10163:31;;;10133:62;;7032:200;7156:4;24338:108;;;;;;;;;;;;;;;;;24412:5;;24419:6;;24412:5;;24398:10;:19;24390:36;;;;;;;;;;;;;;;-1:-1:-1;7178:17:0;:24;;;;7198:4;7178:24;;;;;;7198:4;-1:-1:-1;24437:1:0;7032:200;;:::o;7632:448::-;7788:10;;7749:4;;7788:10;7775:23;;;7788:10;;7775:23;7771:183;;;-1:-1:-1;7822:4:0;7815:11;;7771:183;7861:10;;;7848:23;;;7861:10;;7848:23;7844:110;;;7896:24;;;;;;;:13;:24;;;;;;;;;:45;;-1:-1:-1;7924:17:0;;;;7896:45;7888:54;;;;7844:110;7985:24;;;;;;;:13;:24;;;;;;;;;:52;;-1:-1:-1;8013:24:0;;;;;;;:13;:24;;;;;;;;7985:52;7984:88;;;-1:-1:-1;8055:17:0;;;;7964:108;7632:448;-1:-1:-1;;;7632:448:0:o;3915:45::-;;;;;;;;;;;;;;;:::o;3321:48::-;;;;;;;;;;;;;;;:::o;11131:111::-;11217:17;;11190:7;11217:17;;;:8;:17;;;;;;;;;11131:111::o;17367:1291::-;17476:6;17536:12;17522:11;:26;17500:116;;;;;;;;;;;;;;17651:23;;;17629:19;17651:23;;;:14;:23;;;;;;;;17689:17;17685:58;;17730:1;17723:8;;;;;17685:58;17803:20;;;;;;;:11;:20;;;;;;;;:38;17824:16;;;17803:38;;;;;;;;;:48;;:63;-1:-1:-1;17799:147:0;;17890:20;;;;;;;:11;:20;;;;;;;;17911:16;;;;;17890:38;;;;;;;;:44;;;;;;;-1:-1:-1;17883:51:0;;17799:147;18007:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;18003:88:0;;;18078:1;18071:8;;;;;18003:88;18103:12;18145:16;;;18172:428;18187:5;18179:13;;:5;:13;;;18172:428;;;18251:1;18234:13;;;18233:19;;;18225:27;;18294:20;;:::i;:::-;-1:-1:-1;18317:20:0;;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;18294:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18364:27;;18360:229;;;18419:8;;;;-1:-1:-1;18412:15:0;;-1:-1:-1;;;;18412:15:0;18360:229;18453:12;;:26;;;-1:-1:-1;18449:140:0;;;18508:6;18500:14;;18449:140;;;18572:1;18563:6;:10;18555:18;;18449:140;18172:428;;;;;-1:-1:-1;18617:20:0;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;;;;;-1:-1:-1;;17367:1291:0;;;;:::o;3811:41::-;;;;;;;;;;;;;:::o;6576:212::-;24338:108;;;;;;;;;;;;;;;;;24412:5;;-1:-1:-1;;24338:108:0;;;24412:5;;24398:10;:19;24390:36;;;;;;;;;;;;;;;-1:-1:-1;;;6728:23:0;;;;;;:13;:23;;;;;:30;;;;6754:4;6728:30;;;;;;6754:4;6576:212::o;13493:125::-;13570:40;13580:10;13592:9;13603:6;13570:9;:40::i;:::-;13493:125;;:::o;2280:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10233:695;10336:4;10358:13;10411:2;10386:13;:28;10382:241;;;-1:-1:-1;10447:2:0;10382:241;;;10492:119;10517:13;10492:119;;;;;;;;;;;;;;;;;:6;:119::i;:::-;10483:128;;10382:241;10700:10;10689:22;;;;:10;:22;;;;;;;;;:31;;;;;;;;;;;10669:151;;;;;;;;;;;;;;10689:31;;;;;10735:6;;10669:151;;;;;;;:5;:151::i;14189:1128::-;14396:23;14475:15;;14525:4;14509:22;;;;;;;;;;;;;;;14550:12;:10;:12::i;:::-;14589:4;14446:163;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14446:163:0;;;14422:198;;;;;;14396:224;;14631:18;14687:19;;14708:9;14719:5;14726:6;14734;14676:65;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14676:65:0;;;14652:100;;;;;;14631:121;;14763:14;14833:15;14850:10;14804:57;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14804:57:0;;;14780:92;;;;;;14763:109;;14883:17;14903:26;14913:6;14921:1;14924;14927;14903:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;14903:26:0;;;;;;-1:-1:-1;;14962:23:0;;;14940:112;;;;;;;;;;;;;;15094:17;;;;;;;:6;:17;;;;;:19;;;;;;;;15085:28;;15063:113;;;;;;;;;;;;;;15202:6;15195:3;:13;;15187:65;;;;;;;;;;;;;;15270:39;15280:9;15291;15302:6;15270:9;:39::i;11506:497::-;11574:4;11613:38;11635:10;11647:3;11613:21;:38::i;:::-;11591:207;;;;;;;;;;;;;;11809:13;11825:97;11846:9;11825:97;;;;;;;;;;;;;;;;;:6;:97::i;:::-;11809:113;;11933:40;11949:10;11961:3;11966:6;11933:15;:40::i;:::-;-1:-1:-1;11991:4:0;;11506:497;-1:-1:-1;;;11506:497:0:o;16666:270::-;16772:23;;;16731:6;16772:23;;;:14;:23;;;;;;;;16826:17;:102;;16927:1;16826:102;;;16863:20;;;;;;;:11;:20;;;;;;;;16884:16;;;16863:38;;;;;;;;;:44;;;;;;16806:122;16666:270;-1:-1:-1;;;16666:270:0:o;2494:27::-;;;;:::o;4895:949::-;1081:12;;;;;;;;:31;;;1097:15;:13;:15::i;:::-;1081:47;;;-1:-1:-1;1117:11:0;;;;1116:12;1081:47;1073:106;;;;;;;;;;;;;;1188:19;1211:12;;;;;;1210:13;1230:83;;;;1259:12;:19;;1287:18;1259:19;;;;;;1287:18;1274:4;1287:18;;;1230:83;5039:17;:15;:17::i;:::-;5100:6;5089:17;;:7;:17;;;;5067:116;;;;;;;;;;;;;;5220:12;;;5194:16;;;;;;;:8;:16;;;;;;;;:39;;;;;;;;;;;;;;5283:12;;5244:9;:17;;;;;:29;;;;;;;;:52;;;;;;;;;;;;5307:21;;;:13;:21;;;;;:28;;;;5194:39;5307:28;;;5380:12;;5351:42;;5194:16;;;5351:42;;;;5380:12;5351:42;;;;;;;;;;5406:22;5431:148;5458:11;;5492:12;;5431:148;;;;;;;;;;;;;;;;;:5;:148::i;:::-;5590:17;;;;;;;;:8;:17;;;;;;;;:35;;;;;;;;;;;;;;;5636:9;:18;;;;;:30;;;;;;;;:48;;;;;;;;;5695:22;;;:13;:22;;;;;;:29;;;;-1:-1:-1;5695:29:0;;;5735:10;:30;;;;;;;;;;;;;;5781:55;;5590:35;;-1:-1:-1;5590:17:0;;;;5781:55;;;;5590:35;5781:55;;;;;;;;;;1321:1;1335:14;1331:57;;;1375:5;1360:20;;;;;;1331:57;4895:949;;;;:::o;3967:29::-;;;;;;:::o;7240:203::-;7366:4;24338:108;;;;;;;;;;;;;;;;;24412:5;;24419:6;;24412:5;;24398:10;:19;24390:36;;;;;;;;;;;;;;;-1:-1:-1;;7388:17:0;:25;;;;;;-1:-1:-1;;;7240:203:0:o;6796:228::-;6941:4;24338:108;;;;;;;;;;;;;;;;;24412:5;;24419:6;;24412:5;;24398:10;:19;24390:36;;;;;;;;;;;;;;;-1:-1:-1;;;6963:23:0;;6989:5;6963:23;;;:13;:23;;;;;:31;;;;;;-1:-1:-1;;6796:228:0:o;8384:171::-;8519:19;;;;8487:7;8519:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;;;8384:171::o;13626:129::-;13705:42;13717:10;13729:9;13740:6;13705:11;:42::i;2877:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3566:34::-;;;;:::o;3184:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7451:173::-;24338:108;;;;;;;;;;;;;;;;;24412:5;;24419:6;;24412:5;;24398:10;:19;24390:36;;;;;;;;;;;;;;;-1:-1:-1;;7589:10:0;:27;;;;;;;;;;;;;;;7451:173::o;3888:20::-;;;;;;:::o;2542:25::-;;;;;;:::o;24152:178::-;24278:9;24152:178;;:::o;19265:592::-;19447:20;;;;;;;;:9;:20;;;;;;;;:31;;;;;;;;;;;;;19427:128;;;;;;;;;;;;;;;;;;;;;19447:31;;;;;19493:6;;19427:5;:128::i;:::-;19393:20;;;;;;;;:9;:20;;;;;;;;:31;;;;;;;;;;;:162;;;;;;;;;;;19621:32;;;;;;;;19601:127;;;;;;;;;;;;;;;;;;;;;19621:32;;19668:6;;19601:5;:127::i;:::-;19566:20;;;;;;;;:9;:20;;;;;;;;:32;;;;;;;;;:162;;;;;;;;;;;;;;;;19744:49;;;;;;;;19566:20;;19744:49;19804:45;19819:9;19838:1;19842:6;19804:14;:45::i;:::-;19265:592;;;:::o;23511:196::-;23616:6;23659:12;23652:5;23648:9;;23640:32;;;;;;;;;;;;;;;-1:-1:-1;23697:1:0;;23511:196;-1:-1:-1;;23511:196:0:o;23945:199::-;24065:6;24097:1;24092:6;;:1;:6;;;;24100:12;24084:29;;;;;;;;;;;;;;;;-1:-1:-1;;;24131:5:0;;;23945:199::o;19865:1379::-;20007:17;;;19985:128;;;;;;;;;;;;;;20146:14;;;;;;;:9;:14;;;;;;;;:26;;;;;;;;;:36;;;;:26;;:36;;20124:167;;;;;;;;;;;;;;20324:17;;;20302:126;;;;;;;;;;;;;;20477:13;;;;;;;:8;:13;;;;;;;;;;20457:137;;;;;;;;;;;;;;20477:13;;;;;20505:6;;20457:137;;;;;;;:5;:137::i;:::-;20441:13;;;;;;;:8;:13;;;;;;;;:153;;;;;;;;;;;20654:9;:14;;;;;:26;;;;;;;;;;20634:146;;;;;;;;;;;;;;20654:26;;;;;20695:6;;20634:146;;;;;;;;:5;:146::i;:::-;20605:14;;;;;;;;:9;:14;;;;;;;;:26;;;;;;;;:175;;;;;;;;;;;20829:13;;;;;:8;:13;;;;;;;20809:131;;;;;;;;;;;;;;20829:13;;;;;20857:6;;20809:131;;;;;;;;:5;:131::i;:::-;20793:13;;;;;;;:8;:13;;;;;;;;:147;;;;;;;;;;;21000:9;:14;;;;;:26;;;;;;;;;;20980:144;;;;;;;;;;;;;;21000:26;;;;;21041:6;;20980:144;;;;;;;;:5;:144::i;:::-;20951:14;;;;;;;;:9;:14;;;;;;;;:26;;;;;;;;;;:173;;;;;;;;;;;;;;;;21140:26;;;;;;;;;;21159:6;;21140:26;;;;;;;;;;19865:1379;;;:::o;23715:222::-;23835:6;23865:5;;;23897:12;23889:6;;;;;;;;;23881:29;;;;;;;;;;;;;;;-1:-1:-1;23928:1:0;23715:222;-1:-1:-1;;;;23715:222:0:o;18666:591::-;18847:20;;;;;;;:9;:20;;;;;;;;:32;;;;;;;;;;18827:127;;;;;;;;;;;;;;;;;;;;;18847:32;;;;;18894:6;;18827:5;:127::i;:::-;18792:20;;;;;;;;:9;:20;;;;;;;;:32;;;;;;;;:162;;;;;;;;;;;19019:31;;;;;;;;;;18999:125;;;;;;;;;;;;;;;;;;;;;19019:31;;19065:6;;18999:5;:125::i;:::-;18965:20;;;;;;;;:9;:20;;;;;;;;:31;;;;;;;;;;;;;:159;;;;;;;;;;;;;;;;19142:49;;18965:31;;:20;19142:49;;18965:20;;19142:49;19204:45;19227:1;19231:9;19242:6;19204:14;:45::i;1482:508::-;1899:4;1945:17;1977:7;1482:508;:::o;5852:716::-;5899:15;;;;;;;;;;;;;;;;;;;;;;;:4;;:15;:::i;:::-;-1:-1:-1;5925:16:0;;;;;;;;;;;;;;;;;;;;;;;:6;;:16;:::i;:::-;-1:-1:-1;5952:8:0;:13;;;;5963:2;5952:13;;;5990:8;5976:11;:22;6024:7;6009:12;:22;6060:104;;;;;;;;;;;;;;;6042:15;:122;6197:109;;;;;;;;;;;;;6175:19;:131;6341:110;;;;;;;;;;;;;;;6317:134;;6462:5;:18;;;;6470:10;6462:18;;;5852:716::o;21252:1226::-;21391:6;21381:16;;:6;:16;;;;:31;;;;-1:-1:-1;21401:11:0;;;;;21381:31;21377:1094;;;21433:20;;;;21429:508;;21493:22;;;21474:16;21493:22;;;:14;:22;;;;;;;;;21553:14;:103;;21655:1;21553:103;;;21591:19;;;;;;;:11;:19;;;;;;;;21611:13;;;21591:34;;;;;;;;;:40;;;;;;21553:103;21534:122;;21675:16;21694:151;21722:9;21754:6;21694:151;;;;;;;;;;;;;;;;;:5;:151::i;:::-;21675:170;;21864:57;21881:6;21889:9;21900;21911;21864:16;:57::i;:::-;21429:508;;;;21957:20;;;;21953:507;;22017:22;;;21998:16;22017:22;;;:14;:22;;;;;;;;;22077:14;:103;;22179:1;22077:103;;;22115:19;;;;;;;:11;:19;;;;;;;;22135:13;;;22115:34;;;;;;;;;:40;;;;;;22077:103;22058:122;;22199:16;22218:150;22246:9;22278:6;22218:150;;;;;;;;;;;;;;;;;:5;:150::i;:::-;22199:169;;22387:57;22404:6;22412:9;22423;22434;22387:16;:57::i;:::-;21953:507;;;21252:1226;;;:::o;22486:813::-;22649:18;22670:114;22691:12;22670:114;;;;;;;;;;;;;;;;;:6;:114::i;:::-;22649:135;-1:-1:-1;22815:17:0;;;;;;;:99;;-1:-1:-1;22849:22:0;;;;;;;:11;:22;;;;;;;;:65;22872:16;;;22849:40;;;;;;;;;:50;:65;;;:50;;:65;22815:99;22797:426;;;22941:22;;;;;;;:11;:22;;;;;;;;22964:16;;;22941:40;;;;;;;;;:57;;;;;;;;;;;;22797:426;;;23070:82;;;;;;;;;;;;;;;;;;;;;;;;;23031:22;;;-1:-1:-1;23031:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23167:25;;;:14;:25;;;;;;;:44;;23031:121;23195:16;;23167:44;;;;;;;;;;;;;22797:426;23261:9;23240:51;;;23272:8;23282;23240:51;;;;;;;;;;;;;;;;22486:813;;;;;:::o;23307:196::-;23412:6;23455:12;23448:5;23444:9;;23436:32;;;;;;;;;;;;;;2107:22342;;;;;;;;;;-1:-1:-1;2107:22342:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2107:22342:0;;;;-1:-1:-1;2107:22342:0;;;;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;142:130;209:20;;234:33;209:20;234:33;;416:128;482:20;;507:32;482:20;507:32;;551:126;616:20;;641:31;616:20;641:31;;684:128;750:20;;775:32;750:20;775:32;;819:241;;923:2;911:9;902:7;898:23;894:32;891:2;;;939:1;936;929:12;891:2;974:1;991:53;1036:7;1016:9;991:53;;;981:63;885:175;-1:-1;;;;885:175;1067:366;;;1188:2;1176:9;1167:7;1163:23;1159:32;1156:2;;;1204:1;1201;1194:12;1156:2;1239:1;1256:53;1301:7;1281:9;1256:53;;;1246:63;;1218:97;1346:2;1364:53;1409:7;1400:6;1389:9;1385:22;1364:53;;;1354:63;;1325:98;1150:283;;;;;;1440:491;;;;1578:2;1566:9;1557:7;1553:23;1549:32;1546:2;;;1594:1;1591;1584:12;1546:2;1629:1;1646:53;1691:7;1671:9;1646:53;;;1636:63;;1608:97;1736:2;1754:53;1799:7;1790:6;1779:9;1775:22;1754:53;;;1744:63;;1715:98;1844:2;1862:53;1907:7;1898:6;1887:9;1883:22;1862:53;;;1852:63;;1823:98;1540:391;;;;;;1938:491;;;;2076:2;2064:9;2055:7;2051:23;2047:32;2044:2;;;2092:1;2089;2082:12;2044:2;2127:1;2144:53;2189:7;2169:9;2144:53;;;2134:63;;2106:97;2234:2;2252:53;2297:7;2288:6;2277:9;2273:22;2252:53;;;2242:63;;2213:98;2342:2;2360:53;2405:7;2396:6;2385:9;2381:22;2360:53;;2436:366;;;2557:2;2545:9;2536:7;2532:23;2528:32;2525:2;;;2573:1;2570;2563:12;2525:2;2608:1;2625:53;2670:7;2650:9;2625:53;;;2615:63;;2587:97;2715:2;2733:53;2778:7;2769:6;2758:9;2754:22;2733:53;;2809:989;;;;;;;;3012:3;3000:9;2991:7;2987:23;2983:33;2980:2;;;3029:1;3026;3019:12;2980:2;3064:1;3081:53;3126:7;3106:9;3081:53;;;3071:63;;3043:97;3171:2;3189:53;3234:7;3225:6;3214:9;3210:22;3189:53;;;3179:63;;3150:98;3279:2;3297:53;3342:7;3333:6;3322:9;3318:22;3297:53;;;3287:63;;3258:98;3387:2;3405:51;3448:7;3439:6;3428:9;3424:22;3405:51;;;3395:61;;3366:96;3493:3;3512:53;3557:7;3548:6;3537:9;3533:22;3512:53;;;3502:63;;3472:99;3602:3;3621:53;3666:7;3657:6;3646:9;3642:22;3621:53;;;3611:63;;3581:99;3711:3;3730:52;3774:7;3765:6;3754:9;3750:22;3730:52;;;3720:62;;3690:98;2974:824;;;;;;;;;;;3805:364;;;3925:2;3913:9;3904:7;3900:23;3896:32;3893:2;;;3941:1;3938;3931:12;3893:2;3976:1;3993:53;4038:7;4018:9;3993:53;;;3983:63;;3955:97;4083:2;4101:52;4145:7;4136:6;4125:9;4121:22;4101:52;;4176:364;;;4296:2;4284:9;4275:7;4271:23;4267:32;4264:2;;;4312:1;4309;4302:12;4264:2;4347:1;4364:53;4409:7;4389:9;4364:53;;;4354:63;;4326:97;4454:2;4472:52;4516:7;4507:6;4496:9;4492:22;4472:52;;4547:113;4630:24;4648:5;4630:24;;;4625:3;4618:37;4612:48;;;4667:104;4744:21;4759:5;4744:21;;4778:113;4861:24;4879:5;4861:24;;4898:152;4999:45;5019:24;5037:5;5019:24;;;4999:45;;5080:887;;5219:5;5213:12;5253:1;5242:9;5238:17;5266:1;5261:267;;;;5539:1;5534:427;;;;5231:730;;5261:267;5339:4;5335:1;5324:9;5320:17;5316:28;5358:88;5439:6;5434:3;5358:88;;;5480:9;5465:25;;5453:38;;5351:95;-1:-1;5505:16;;;-1:-1;5261:267;;5534:427;5603:1;5592:9;5588:17;5619:88;5700:6;5695:3;5619:88;;;5612:95;;5729:41;5764:5;5729:41;;;5786:1;5794:130;5808:6;5805:1;5802:13;5794:130;;;5867:14;;5854:11;;;5847:35;5914:1;5901:15;;;;5830:4;5823:12;5794:130;;;-1:-1;;5938:16;;;-1:-1;5231:730;;5189:778;;;;;;5975:347;;6087:39;6120:5;6087:39;;;6138:71;6202:6;6197:3;6138:71;;;6131:78;;6214:52;6259:6;6254:3;6247:4;6240:5;6236:16;6214:52;;;6287:29;6309:6;6287:29;;;6278:39;;;;6067:255;-1:-1;;;6067:255;6676:483;;6854:85;6936:2;6931:3;6854:85;;;6972:34;6952:55;;7041:34;7036:2;7027:12;;7020:56;7110:11;7105:2;7096:12;;7089:33;7150:2;7141:12;;6840:319;-1:-1;;6840:319;7168:398;;7346:84;7428:1;7423:3;7346:84;;;7463:66;7443:87;;7558:1;7549:11;;7332:234;-1:-1;;7332:234;7575:386;;7735:67;7799:2;7794:3;7735:67;;;7835:34;7815:55;;7904:19;7899:2;7890:12;;7883:41;7952:2;7943:12;;7721:240;-1:-1;;7721:240;7970:455;;8130:67;8194:2;8189:3;8130:67;;;8230:34;8210:55;;8299:34;8294:2;8285:12;;8278:56;8368:19;8363:2;8354:12;;8347:41;8416:2;8407:12;;8116:309;-1:-1;;8116:309;8434:532;;8594:68;8658:3;8653;8594:68;;;8695:34;8675:55;;8764:34;8759:2;8750:12;;8743:56;8833:34;8828:2;8819:12;;8812:56;8902:25;8897:2;8888:12;;8881:47;8956:3;8947:13;;8580:386;-1:-1;;8580:386;8975:477;;9153:85;9235:2;9230:3;9153:85;;;9271:34;9251:55;;9340:34;9335:2;9326:12;;9319:56;9409:5;9404:2;9395:12;;9388:27;9443:2;9434:12;;9139:313;-1:-1;;9139:313;9461:378;;9621:67;9685:2;9680:3;9621:67;;;9721:34;9701:55;;9790:11;9785:2;9776:12;;9769:33;9830:2;9821:12;;9607:232;-1:-1;;9607:232;9848:378;;10008:67;10072:2;10067:3;10008:67;;;10108:34;10088:55;;10177:11;10172:2;10163:12;;10156:33;10217:2;10208:12;;9994:232;-1:-1;;9994:232;10235:372;;10395:67;10459:2;10454:3;10395:67;;;10495:34;10475:55;;10564:5;10559:2;10550:12;;10543:27;10598:2;10589:12;;10381:226;-1:-1;;10381:226;10616:383;;10776:67;10840:2;10835:3;10776:67;;;10876:34;10856:55;;10945:16;10940:2;10931:12;;10924:38;10990:2;10981:12;;10762:237;-1:-1;;10762:237;11008:374;;11168:67;11232:2;11227:3;11168:67;;;11268:34;11248:55;;11337:7;11332:2;11323:12;;11316:29;11373:2;11364:12;;11154:228;-1:-1;;11154:228;11391:377;;11551:67;11615:2;11610:3;11551:67;;;11651:34;11631:55;;11720:10;11715:2;11706:12;;11699:32;11759:2;11750:12;;11537:231;-1:-1;;11537:231;11777:396;;11937:67;12001:2;11996:3;11937:67;;;12037:34;12017:55;;12106:29;12101:2;12092:12;;12085:51;12164:2;12155:12;;11923:250;-1:-1;;11923:250;12182:376;;12342:67;12406:2;12401:3;12342:67;;;12442:34;12422:55;;12511:9;12506:2;12497:12;;12490:31;12549:2;12540:12;;12328:230;-1:-1;;12328:230;12567:376;;12727:67;12791:2;12786:3;12727:67;;;12827:34;12807:55;;12896:9;12891:2;12882:12;;12875:31;12934:2;12925:12;;12713:230;-1:-1;;12713:230;12952:482;;13130:85;13212:2;13207:3;13130:85;;;13248:34;13228:55;;13317:34;13312:2;13303:12;;13296:56;13386:10;13381:2;13372:12;;13365:32;13425:2;13416:12;;13116:318;-1:-1;;13116:318;13443:398;;13603:67;13667:2;13662:3;13603:67;;;13703:34;13683:55;;13772:31;13767:2;13758:12;;13751:53;13832:2;13823:12;;13589:252;-1:-1;;13589:252;13969:110;14050:23;14067:5;14050:23;;14086:107;14165:22;14181:5;14165:22;;14200:124;14282:36;14312:5;14282:36;;14331:110;14412:23;14429:5;14412:23;;14448:264;;14593:94;14683:3;14674:6;14593:94;;14719:372;;14918:148;15062:3;14918:148;;15098:650;;15353:148;15497:3;15353:148;;;15346:155;;15512:75;15583:3;15574:6;15512:75;;;15609:2;15604:3;15600:12;15593:19;;15623:75;15694:3;15685:6;15623:75;;;-1:-1;15720:2;15711:12;;15334:414;-1:-1;;15334:414;15755:372;;15954:148;16098:3;15954:148;;16134:372;;16333:148;16477:3;16333:148;;16513:213;16631:2;16616:18;;16645:71;16620:9;16689:6;16645:71;;16733:201;16845:2;16830:18;;16859:65;16834:9;16897:6;16859:65;;16941:213;17059:2;17044:18;;17073:71;17048:9;17117:6;17073:71;;17161:655;17389:3;17374:19;;17404:71;17378:9;17448:6;17404:71;;;17486:72;17554:2;17543:9;17539:18;17530:6;17486:72;;;17569;17637:2;17626:9;17622:18;17613:6;17569:72;;;17652;17720:2;17709:9;17705:18;17696:6;17652:72;;;17735:71;17801:3;17790:9;17786:19;17777:6;17735:71;;;17360:456;;;;;;;;;17823:547;18025:3;18010:19;;18040:71;18014:9;18084:6;18040:71;;;18122:72;18190:2;18179:9;18175:18;18166:6;18122:72;;;18205;18273:2;18262:9;18258:18;18249:6;18205:72;;;18288;18356:2;18345:9;18341:18;18332:6;18288:72;;;17996:374;;;;;;;;18377:539;18575:3;18560:19;;18590:71;18564:9;18634:6;18590:71;;;18672:68;18736:2;18725:9;18721:18;18712:6;18672:68;;;18751:72;18819:2;18808:9;18804:18;18795:6;18751:72;;;18834;18902:2;18891:9;18887:18;18878:6;18834:72;;18923:293;19057:2;19071:47;;;19042:18;;19132:74;19042:18;19192:6;19132:74;;19531:407;19722:2;19736:47;;;19707:18;;19797:131;19707:18;19797:131;;19945:407;20136:2;20150:47;;;20121:18;;20211:131;20121:18;20211:131;;20359:407;20550:2;20564:47;;;20535:18;;20625:131;20535:18;20625:131;;20773:407;20964:2;20978:47;;;20949:18;;21039:131;20949:18;21039:131;;21187:407;21378:2;21392:47;;;21363:18;;21453:131;21363:18;21453:131;;21601:407;21792:2;21806:47;;;21777:18;;21867:131;21777:18;21867:131;;22015:407;22206:2;22220:47;;;22191:18;;22281:131;22191:18;22281:131;;22429:407;22620:2;22634:47;;;22605:18;;22695:131;22605:18;22695:131;;22843:407;23034:2;23048:47;;;23019:18;;23109:131;23019:18;23109:131;;23257:407;23448:2;23462:47;;;23433:18;;23523:131;23433:18;23523:131;;23671:407;23862:2;23876:47;;;23847:18;;23937:131;23847:18;23937:131;;24085:407;24276:2;24290:47;;;24261:18;;24351:131;24261:18;24351:131;;24499:407;24690:2;24704:47;;;24675:18;;24765:131;24675:18;24765:131;;25133:209;25249:2;25234:18;;25263:69;25238:9;25305:6;25263:69;;25349:316;25491:2;25476:18;;25505:69;25480:9;25547:6;25505:69;;;25585:70;25651:2;25640:9;25636:18;25627:6;25585:70;;25672:205;25786:2;25771:18;;25800:67;25775:9;25840:6;25800:67;;25884:211;26001:2;25986:18;;26015:70;25990:9;26058:6;26015:70;;26102:209;26218:2;26203:18;;26232:69;26207:9;26274:6;26232:69;;26318:320;26462:2;26447:18;;26476:70;26451:9;26519:6;26476:70;;;26557:71;26624:2;26613:9;26609:18;26600:6;26557:71;;26645:161;;26743:14;;;26785:4;26772:18;;;26702:104;26813:118;26897:12;;26868:63;27068:144;27203:3;27181:31;-1:-1;27181:31;27221:163;27324:19;;;27373:4;27364:14;;27317:67;27546:91;;27608:24;27626:5;27608:24;;27644:85;27710:13;27703:21;;27686:43;27815:121;27888:42;27877:54;;27860:76;28022:88;28094:10;28083:22;;28066:44;28117:81;28188:4;28177:16;;28160:38;28205:104;28277:26;28266:38;;28249:60;28316:106;;28394:23;28411:5;28394:23;;28430:268;28495:1;28502:101;28516:6;28513:1;28510:13;28502:101;;;28583:11;;;28577:18;28564:11;;;28557:39;28538:2;28531:10;28502:101;;;28618:6;28615:1;28612:13;28609:2;;;-1:-1;;28683:1;28665:16;;28658:27;28479:219;28787:97;28875:2;28855:14;28871:7;28851:28;;28835:49;28892:117;28961:24;28979:5;28961:24;;;28954:5;28951:35;28941:2;;29000:1;28997;28990:12;28941:2;28935:74;;29016:117;29085:24;29103:5;29085:24;;29264:115;29332:23;29349:5;29332:23;;29386:113;29453:22;29469:5;29453:22;;29506:115;29574:23;29591:5;29574:23;

Swarm Source

bzzr://b2d439a0721ffa7414ea2a1e84fd08f6745a1aa9a9cbf585c05dfcb75c4354b6

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.