ETH Price: $3,228.73 (-1.22%)

Contract

0x7d43AABC515C356145049227CeE54B608342c0ad
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NFTBridge

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, GNU GPLv3 license
File 1 of 10 : NFTBridge.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;

import "../../framework/MessageReceiverApp.sol";
import "../../interfaces/IMessageBus.sol";
import "../../../safeguard/Pauser.sol";

// interface for NFT contract, ERC721 and metadata, only funcs needed by NFTBridge
interface INFT {
    function tokenURI(uint256 tokenId) external view returns (string memory);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    // we do not support NFT that charges transfer fees
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    // impl by NFToken contract, mint an NFT with id and uri to user or burn
    function bridgeMint(
        address to,
        uint256 id,
        string memory uri
    ) external;

    function burn(uint256 id) external;
}

/** @title NFT Bridge */
contract NFTBridge is MessageReceiverApp, Pauser {
    /// per dest chain id executor fee in this chain's gas token
    mapping(uint64 => uint256) public destTxFee;
    /// per dest chain id NFTBridge address
    mapping(uint64 => address) public destBridge;
    /// first key is NFT address on this chain, 2nd key is dest chain id, value is address on dest chain
    mapping(address => mapping(uint64 => address)) public destNFTAddr;

    /// only set to true if NFT addr on this chain is the orig, so we will use deposit/withdraw instead of burn/mint.
    /// not applicable for mcn nft (always burn/mint)
    mapping(address => bool) public origNFT;

    /// only for non-evm chains and address can't fit 20bytes
    mapping(uint64 => bytes) public destBridge2;
    mapping(address => mapping(uint64 => bytes)) public destNFTAddr2;

    struct NFTMsg {
        address user; // receiver of minted or withdrawn NFT
        address nft; // NFT contract on mint/withdraw chain
        uint256 id; // token ID
        string uri; // tokenURI from source NFT
    }
    // for non-evm dst chain, address type is bytes
    struct NFTMsg2 {
        bytes user; // receiver of minted or withdrawn NFT
        bytes nft; // NFT contract on mint/withdraw chain
        uint256 id; // token ID
        string uri; // tokenURI from source NFT
    }
    // emit in deposit or burn
    event Sent(address sender, address srcNft, uint256 id, uint64 dstChid, address receiver, address dstNft);
    // bytes type for receiver and dstNft
    event Sent2(address sender, address srcNft, uint256 id, uint64 dstChid, bytes receiver, bytes dstNft);
    // emit for mint or withdraw message
    event Received(address receiver, address nft, uint256 id, uint64 srcChid);

    // emit when params change
    event SetDestNFT(address srcNft, uint64 dstChid, address dstNft);
    event SetTxFee(uint64 chid, uint256 fee);
    event SetDestBridge(uint64 dstChid, address dstNftBridge);
    event FeeClaimed(uint256 amount);
    event SetOrigNFT(address nft, bool isOrig);
    // emit if executeMessage calls nft transfer or bridgeMint returns error
    event ExtCallErr(bytes returnData);

    event SetDestNFT2(address srcNft, uint64 dstChid, bytes dstNft);
    event SetDestBridge2(uint64 dstChid, bytes dstNftBridge);

    constructor(address _msgBus) {
        messageBus = _msgBus;
    }

    // only to be called by Proxy via delegatecall and will modify Proxy state
    // initOwner will fail if owner is already set, so only delegateCall will work
    function init(address _msgBus) external {
        initOwner();
        messageBus = _msgBus;
    }

    /**
     * @notice totalFee returns gas token value to be set in user tx, includes both msg fee and executor fee for dest chain
     * @dev we assume if dst chain address are bytes, user and nft are same length, otherwise we need to add receiver to args
     * @param _dstChid dest chain ID
     * @param _nft address of source NFT contract
     * @param _id token ID to bridge (need to get accurate tokenURI length)
     * @return total fee needed for user tx
     */
    function totalFee(
        uint64 _dstChid,
        address _nft,
        uint256 _id
    ) external view returns (uint256) {
        string memory _uri = INFT(_nft).tokenURI(_id);
        bytes memory message;
        // try non-evm first
        bytes memory dstNft = destNFTAddr2[_nft][_dstChid];
        if (dstNft.length > 0) {
            message = abi.encode(NFTMsg2(dstNft, dstNft, _id, _uri));
        } else {
            // evm chains or not configured, assume to be evm, 20 bytes address
            message = abi.encode(NFTMsg(_nft, _nft, _id, _uri));
        }
        return IMessageBus(messageBus).calcFee(message) + destTxFee[_dstChid];
    }

    // ===== called by user
    /**
     * @notice locks or burn user's NFT in this contract and send message to mint (or withdraw) on dest chain
     * @param _nft address of source NFT contract
     * @param _id nft token ID to bridge
     * @param _dstChid dest chain ID
     * @param _receiver receiver address on dest chain
     */
    function sendTo(
        address _nft,
        uint256 _id,
        uint64 _dstChid,
        address _receiver
    ) external payable whenNotPaused {
        require(msg.sender == INFT(_nft).ownerOf(_id), "not token owner");
        // must save _uri before burn
        string memory _uri = INFT(_nft).tokenURI(_id);
        lockOrBurn(_nft, _id);
        (address _dstBridge, address _dstNft) = checkAddr(_nft, _dstChid);
        msgBus(_dstBridge, _dstChid, abi.encode(NFTMsg(_receiver, _dstNft, _id, _uri)));
        emit Sent(msg.sender, _nft, _id, _dstChid, _receiver, _dstNft);
    }

    /**
     * @notice locks or burn user's NFT in this contract and send message to mint (or withdraw) on dest chain
     * @param _nft address of source NFT contract
     * @param _id nft token ID to bridge
     * @param _dstChid dest chain ID
     * @param _receiver receiver address on dest chain, arbitrary bytes
     */
    function sendTo(
        address _nft,
        uint256 _id,
        uint64 _dstChid,
        bytes calldata _receiver
    ) external payable whenNotPaused {
        require(msg.sender == INFT(_nft).ownerOf(_id), "not token owner");
        // must save _uri before burn
        string memory _uri = INFT(_nft).tokenURI(_id);
        lockOrBurn(_nft, _id);
        (bytes memory _dstBridge, bytes memory _dstNft) = checkAddr2(_nft, _dstChid);
        msgBus(_dstBridge, _dstChid, abi.encode(NFTMsg2(_receiver, _dstNft, _id, _uri)));
        emit Sent2(msg.sender, _nft, _id, _dstChid, _receiver, _dstNft);
    }

    // ===== called by MCN NFT after NFT is burnt
    function sendMsg(
        uint64 _dstChid,
        address _sender,
        address _receiver,
        uint256 _id,
        string calldata _uri
    ) external payable whenNotPaused {
        address _nft = msg.sender;
        (address _dstBridge, address _dstNft) = checkAddr(_nft, _dstChid);
        msgBus(_dstBridge, _dstChid, abi.encode(NFTMsg(_receiver, _dstNft, _id, _uri)));
        emit Sent(_sender, _nft, _id, _dstChid, _receiver, _dstNft);
    }

    // for non-evm chains and address can't fit 20bytes or non-hex
    function sendMsg(
        uint64 _dstChid,
        address _sender,
        bytes calldata _receiver,
        uint256 _id,
        string calldata _uri
    ) external payable whenNotPaused {
        address _nft = msg.sender;
        (bytes memory _dstBridge, bytes memory _dstNft) = checkAddr2(_nft, _dstChid);
        msgBus(_dstBridge, _dstChid, abi.encode(NFTMsg2(_receiver, _dstNft, _id, _uri)));
        emit Sent2(_sender, _nft, _id, _dstChid, _receiver, _dstNft);
    }

    // ===== called by msgbus
    function executeMessage(
        address sender,
        uint64 srcChid,
        bytes calldata _message,
        address // executor
    ) external payable override onlyMessageBus returns (ExecutionStatus) {
        // Must check sender to ensure msg is from another nft bridge
        // but we allow retry later in case it's a temporary config error
        // risk is invalid sender will be retried but this can be easily filtered
        // in executor or require manual trigger for retry
        if (paused() || sender != destBridge[srcChid]) {
            return ExecutionStatus.Retry;
        }
        return xferOrMint(_message, srcChid);
    }

    function executeMessage(
        bytes calldata sender,
        uint64 srcChid,
        bytes calldata _message,
        address // executor
    ) external payable override onlyMessageBus returns (ExecutionStatus) {
        if (paused() || keccak256(sender) != keccak256(destBridge2[srcChid])) {
            return ExecutionStatus.Retry;
        }
        return xferOrMint(_message, srcChid);
    }

    // ===== internal utils
    // lockOrBurn on sender side
    function lockOrBurn(address _nft, uint256 _id) internal {
        if (origNFT[_nft] == true) {
            // deposit
            INFT(_nft).transferFrom(msg.sender, address(this), _id);
            require(INFT(_nft).ownerOf(_id) == address(this), "transfer NFT failed");
        } else {
            // burn
            INFT(_nft).burn(_id);
        }
    }

    // xferOrMint on receiver side, transfer or mint NFT to receiver
    function xferOrMint(bytes calldata _message, uint64 srcChid) internal returns (ExecutionStatus) {
        // withdraw original locked nft back to user, or mint new nft depending on if this is the orig chain of nft
        NFTMsg memory nftMsg = abi.decode((_message), (NFTMsg));
        // if we are on nft orig chain, use transfer, otherwise, use mint
        // we must never return fail because burnt nft will be lost forever
        if (origNFT[nftMsg.nft] == true) {
            try INFT(nftMsg.nft).transferFrom(address(this), nftMsg.user, nftMsg.id) {
                // do nothing here to move on to emit Received event and return success
            } catch (bytes memory returnData) {
                emit ExtCallErr(returnData);
                return ExecutionStatus.Retry;
            }
        } else {
            try INFT(nftMsg.nft).bridgeMint(nftMsg.user, nftMsg.id, nftMsg.uri) {
                // do nothing here to move on to emit Received event and return success
            } catch (bytes memory returnData) {
                emit ExtCallErr(returnData);
                return ExecutionStatus.Retry;
            }
        }
        emit Received(nftMsg.user, nftMsg.nft, nftMsg.id, srcChid);
        return ExecutionStatus.Success;
    }

    // check _nft and destChid are valid, return dstBridge and dstNft
    function checkAddr(address _nft, uint64 _dstChid) internal view returns (address dstBridge, address dstNft) {
        dstBridge = destBridge[_dstChid];
        require(dstBridge != address(0), "dest NFT Bridge not found");
        dstNft = destNFTAddr[_nft][_dstChid];
        require(dstNft != address(0), "dest NFT not found");
    }

    function checkAddr2(address _nft, uint64 _dstChid)
        internal
        view
        returns (bytes memory dstBridge, bytes memory dstNft)
    {
        dstBridge = destBridge2[_dstChid];
        require(dstBridge.length != 0, "dest NFT Bridge not found");
        dstNft = destNFTAddr2[_nft][_dstChid];
        require(dstNft.length != 0, "dest NFT not found");
    }

    // check fee and call msgbus sendMessage
    function msgBus(
        address _dstBridge,
        uint64 _dstChid,
        bytes memory message
    ) internal {
        uint256 fee = IMessageBus(messageBus).calcFee(message);
        require(msg.value >= fee + destTxFee[_dstChid], "insufficient fee");
        IMessageBus(messageBus).sendMessage{value: fee}(_dstBridge, _dstChid, message);
    }

    function msgBus(
        bytes memory _dstBridge,
        uint64 _dstChid,
        bytes memory message
    ) internal {
        uint256 fee = IMessageBus(messageBus).calcFee(message);
        require(msg.value >= fee + destTxFee[_dstChid], "insufficient fee");
        IMessageBus(messageBus).sendMessage{value: fee}(_dstBridge, _dstChid, message);
    }

    // only owner
    // set per NFT, per chain id, address
    function setDestNFT(
        address srcNft,
        uint64 dstChid,
        address dstNft
    ) external onlyOwner {
        destNFTAddr[srcNft][dstChid] = dstNft;
        emit SetDestNFT(srcNft, dstChid, dstNft);
    }

    // add to destNFTAddr2
    function setDestNFT(
        address srcNft,
        uint64 dstChid,
        bytes calldata dstNft
    ) external onlyOwner {
        destNFTAddr2[srcNft][dstChid] = dstNft;
        emit SetDestNFT2(srcNft, dstChid, dstNft);
    }

    // set all dest chains
    function setDestNFTs(
        address srcNft,
        uint64[] calldata dstChid,
        address[] calldata dstNft
    ) external onlyOwner {
        require(dstChid.length == dstNft.length, "length mismatch");
        for (uint256 i = 0; i < dstChid.length; i++) {
            destNFTAddr[srcNft][dstChid[i]] = dstNft[i];
        }
    }

    // set destTxFee
    function setTxFee(uint64 chid, uint256 fee) external onlyOwner {
        destTxFee[chid] = fee;
        emit SetTxFee(chid, fee);
    }

    // set per chain id, nft bridge address
    function setDestBridge(uint64 dstChid, address dstNftBridge) external onlyOwner {
        destBridge[dstChid] = dstNftBridge;
        emit SetDestBridge(dstChid, dstNftBridge);
    }

    function setDestBridge(uint64 dstChid, bytes calldata dstNftBridge) external onlyOwner {
        destBridge2[dstChid] = dstNftBridge;
        emit SetDestBridge2(dstChid, dstNftBridge);
    }

    // batch set nft bridge addresses for multiple chainids
    function setDestBridges(uint64[] calldata dstChid, address[] calldata dstNftBridge) external onlyOwner {
        for (uint256 i = 0; i < dstChid.length; i++) {
            destBridge[dstChid[i]] = dstNftBridge[i];
        }
    }

    // only called on NFT's orig chain, not applicable for mcn nft
    function setOrigNFT(address _nft) external onlyOwner {
        origNFT[_nft] = true;
        emit SetOrigNFT(_nft, true);
    }

    // remove origNFT entry
    function delOrigNFT(address _nft) external onlyOwner {
        delete origNFT[_nft];
        emit SetOrigNFT(_nft, false);
    }

    // send all gas token this contract has to owner
    function claimFee() external onlyOwner {
        uint256 amount = address(this).balance;
        payable(msg.sender).transfer(amount);
        emit FeeClaimed(amount);
    }
}

File 2 of 10 : MessageReceiverApp.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.8.0;

import "../interfaces/IMessageReceiverApp.sol";
import "./MessageBusAddress.sol";

abstract contract MessageReceiverApp is IMessageReceiverApp, MessageBusAddress {
    modifier onlyMessageBus() {
        require(msg.sender == messageBus, "caller is not message bus");
        _;
    }

    /**
     * @notice Called by MessageBus to execute a message
     * @param _sender The address of the source app contract
     * @param _srcChainId The source chain ID where the transfer is originated from
     * @param _message Arbitrary message bytes originated from and encoded by the source app contract
     * @param _executor Address who called the MessageBus execution function
     */
    function executeMessage(
        address _sender,
        uint64 _srcChainId,
        bytes calldata _message,
        address _executor
    ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {}

    // execute message from non-evm chain with bytes for sender address,
    // otherwise same as above.
    function executeMessage(
        bytes calldata _sender,
        uint64 _srcChainId,
        bytes calldata _message,
        address _executor
    ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {}

    /**
     * @notice Called by MessageBus to execute a message with an associated token transfer.
     * The contract is guaranteed to have received the right amount of tokens before this function is called.
     * @param _sender The address of the source app contract
     * @param _token The address of the token that comes out of the bridge
     * @param _amount The amount of tokens received at this contract through the cross-chain bridge.
     * @param _srcChainId The source chain ID where the transfer is originated from
     * @param _message Arbitrary message bytes originated from and encoded by the source app contract
     * @param _executor Address who called the MessageBus execution function
     */
    function executeMessageWithTransfer(
        address _sender,
        address _token,
        uint256 _amount,
        uint64 _srcChainId,
        bytes calldata _message,
        address _executor
    ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {}

    /**
     * @notice Only called by MessageBus if
     *         1. executeMessageWithTransfer reverts, or
     *         2. executeMessageWithTransfer returns ExecutionStatus.Fail
     * The contract is guaranteed to have received the right amount of tokens before this function is called.
     * @param _sender The address of the source app contract
     * @param _token The address of the token that comes out of the bridge
     * @param _amount The amount of tokens received at this contract through the cross-chain bridge.
     * @param _srcChainId The source chain ID where the transfer is originated from
     * @param _message Arbitrary message bytes originated from and encoded by the source app contract
     * @param _executor Address who called the MessageBus execution function
     */
    function executeMessageWithTransferFallback(
        address _sender,
        address _token,
        uint256 _amount,
        uint64 _srcChainId,
        bytes calldata _message,
        address _executor
    ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {}

    /**
     * @notice Called by MessageBus to process refund of the original transfer from this contract.
     * The contract is guaranteed to have received the refund before this function is called.
     * @param _token The token address of the original transfer
     * @param _amount The amount of the original transfer
     * @param _message The same message associated with the original transfer
     * @param _executor Address who called the MessageBus execution function
     */
    function executeMessageWithTransferRefund(
        address _token,
        uint256 _amount,
        bytes calldata _message,
        address _executor
    ) external payable virtual override onlyMessageBus returns (ExecutionStatus) {}
}

File 3 of 10 : IMessageReceiverApp.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.8.0;

interface IMessageReceiverApp {
    enum ExecutionStatus {
        Fail, // execution failed, finalized
        Success, // execution succeeded, finalized
        Retry // execution rejected, can retry later
    }

    /**
     * @notice Called by MessageBus to execute a message
     * @param _sender The address of the source app contract
     * @param _srcChainId The source chain ID where the transfer is originated from
     * @param _message Arbitrary message bytes originated from and encoded by the source app contract
     * @param _executor Address who called the MessageBus execution function
     */
    function executeMessage(
        address _sender,
        uint64 _srcChainId,
        bytes calldata _message,
        address _executor
    ) external payable returns (ExecutionStatus);

    // same as above, except that sender is an non-evm chain address,
    // otherwise same as above.
    function executeMessage(
        bytes calldata _sender,
        uint64 _srcChainId,
        bytes calldata _message,
        address _executor
    ) external payable returns (ExecutionStatus);

    /**
     * @notice Called by MessageBus to execute a message with an associated token transfer.
     * The contract is guaranteed to have received the right amount of tokens before this function is called.
     * @param _sender The address of the source app contract
     * @param _token The address of the token that comes out of the bridge
     * @param _amount The amount of tokens received at this contract through the cross-chain bridge.
     * @param _srcChainId The source chain ID where the transfer is originated from
     * @param _message Arbitrary message bytes originated from and encoded by the source app contract
     * @param _executor Address who called the MessageBus execution function
     */
    function executeMessageWithTransfer(
        address _sender,
        address _token,
        uint256 _amount,
        uint64 _srcChainId,
        bytes calldata _message,
        address _executor
    ) external payable returns (ExecutionStatus);

    /**
     * @notice Only called by MessageBus if
     *         1. executeMessageWithTransfer reverts, or
     *         2. executeMessageWithTransfer returns ExecutionStatus.Fail
     * The contract is guaranteed to have received the right amount of tokens before this function is called.
     * @param _sender The address of the source app contract
     * @param _token The address of the token that comes out of the bridge
     * @param _amount The amount of tokens received at this contract through the cross-chain bridge.
     * @param _srcChainId The source chain ID where the transfer is originated from
     * @param _message Arbitrary message bytes originated from and encoded by the source app contract
     * @param _executor Address who called the MessageBus execution function
     */
    function executeMessageWithTransferFallback(
        address _sender,
        address _token,
        uint256 _amount,
        uint64 _srcChainId,
        bytes calldata _message,
        address _executor
    ) external payable returns (ExecutionStatus);

    /**
     * @notice Called by MessageBus to process refund of the original transfer from this contract.
     * The contract is guaranteed to have received the refund before this function is called.
     * @param _token The token address of the original transfer
     * @param _amount The amount of the original transfer
     * @param _message The same message associated with the original transfer
     * @param _executor Address who called the MessageBus execution function
     */
    function executeMessageWithTransferRefund(
        address _token,
        uint256 _amount,
        bytes calldata _message,
        address _executor
    ) external payable returns (ExecutionStatus);
}

File 4 of 10 : MessageBusAddress.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.8.0;

import "../../safeguard/Ownable.sol";

abstract contract MessageBusAddress is Ownable {
    event MessageBusUpdated(address messageBus);

    address public messageBus;

    function setMessageBus(address _messageBus) public onlyOwner {
        messageBus = _messageBus;
        emit MessageBusUpdated(messageBus);
    }
}

File 5 of 10 : Ownable.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 *
 * This adds a normal func that setOwner if _owner is address(0). So we can't allow
 * renounceOwnership. So we can support Proxy based upgradable contract
 */
abstract contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(msg.sender);
    }

    /**
     * @dev Only to be called by inherit contracts, in their init func called by Proxy
     * we require _owner == address(0), which is only possible when it's a delegateCall
     * because constructor sets _owner in contract state.
     */
    function initOwner() internal {
        require(_owner == address(0), "owner already set");
        _setOwner(msg.sender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 6 of 10 : IMessageBus.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.8.0;

import "../libraries/MsgDataTypes.sol";

interface IMessageBus {
    /**
     * @notice Send a message to a contract on another chain.
     * Sender needs to make sure the uniqueness of the message Id, which is computed as
     * hash(type.MessageOnly, sender, receiver, srcChainId, srcTxHash, dstChainId, message).
     * If messages with the same Id are sent, only one of them will succeed at dst chain..
     * A fee is charged in the native gas token.
     * @param _receiver The address of the destination app contract.
     * @param _dstChainId The destination chain ID.
     * @param _message Arbitrary message bytes to be decoded by the destination app contract.
     */
    function sendMessage(
        address _receiver,
        uint256 _dstChainId,
        bytes calldata _message
    ) external payable;

    // same as above, except that receiver is an non-evm chain address,
    function sendMessage(
        bytes calldata _receiver,
        uint256 _dstChainId,
        bytes calldata _message
    ) external payable;

    /**
     * @notice Send a message associated with a token transfer to a contract on another chain.
     * If messages with the same srcTransferId are sent, only one of them will succeed at dst chain..
     * A fee is charged in the native token.
     * @param _receiver The address of the destination app contract.
     * @param _dstChainId The destination chain ID.
     * @param _srcBridge The bridge contract to send the transfer with.
     * @param _srcTransferId The transfer ID.
     * @param _dstChainId The destination chain ID.
     * @param _message Arbitrary message bytes to be decoded by the destination app contract.
     */
    function sendMessageWithTransfer(
        address _receiver,
        uint256 _dstChainId,
        address _srcBridge,
        bytes32 _srcTransferId,
        bytes calldata _message
    ) external payable;

    /**
     * @notice Execute a message not associated with a transfer.
     * @param _message Arbitrary message bytes originated from and encoded by the source app contract
     * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by
     * +2/3 of the sigsVerifier's current signing power to be delivered.
     * @param _signers The sorted list of signers.
     * @param _powers The signing powers of the signers.
     */
    function executeMessage(
        bytes calldata _message,
        MsgDataTypes.RouteInfo calldata _route,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external payable;

    /**
     * @notice Execute a message with a successful transfer.
     * @param _message Arbitrary message bytes originated from and encoded by the source app contract
     * @param _transfer The transfer info.
     * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by
     * +2/3 of the sigsVerifier's current signing power to be delivered.
     * @param _signers The sorted list of signers.
     * @param _powers The signing powers of the signers.
     */
    function executeMessageWithTransfer(
        bytes calldata _message,
        MsgDataTypes.TransferInfo calldata _transfer,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external payable;

    /**
     * @notice Execute a message with a refunded transfer.
     * @param _message Arbitrary message bytes originated from and encoded by the source app contract
     * @param _transfer The transfer info.
     * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by
     * +2/3 of the sigsVerifier's current signing power to be delivered.
     * @param _signers The sorted list of signers.
     * @param _powers The signing powers of the signers.
     */
    function executeMessageWithTransferRefund(
        bytes calldata _message, // the same message associated with the original transfer
        MsgDataTypes.TransferInfo calldata _transfer,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external payable;

    /**
     * @notice Withdraws message fee in the form of native gas token.
     * @param _account The address receiving the fee.
     * @param _cumulativeFee The cumulative fee credited to the account. Tracked by SGN.
     * @param _sigs The list of signatures sorted by signing addresses in ascending order. A withdrawal must be
     * signed-off by +2/3 of the sigsVerifier's current signing power to be delivered.
     * @param _signers The sorted list of signers.
     * @param _powers The signing powers of the signers.
     */
    function withdrawFee(
        address _account,
        uint256 _cumulativeFee,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external;

    /**
     * @notice Calculates the required fee for the message.
     * @param _message Arbitrary message bytes to be decoded by the destination app contract.
     @ @return The required fee.
     */
    function calcFee(bytes calldata _message) external view returns (uint256);

    function liquidityBridge() external view returns (address);

    function pegBridge() external view returns (address);

    function pegBridgeV2() external view returns (address);

    function pegVault() external view returns (address);

    function pegVaultV2() external view returns (address);
}

File 7 of 10 : MsgDataTypes.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.8.0;

library MsgDataTypes {
    string constant ABORT_PREFIX = "MSG::ABORT:";

    // bridge operation type at the sender side (src chain)
    enum BridgeSendType {
        Null,
        Liquidity,
        PegDeposit,
        PegBurn,
        PegV2Deposit,
        PegV2Burn,
        PegV2BurnFrom
    }

    // bridge operation type at the receiver side (dst chain)
    enum TransferType {
        Null,
        LqRelay, // relay through liquidity bridge
        LqWithdraw, // withdraw from liquidity bridge
        PegMint, // mint through pegged token bridge
        PegWithdraw, // withdraw from original token vault
        PegV2Mint, // mint through pegged token bridge v2
        PegV2Withdraw // withdraw from original token vault v2
    }

    enum MsgType {
        MessageWithTransfer,
        MessageOnly
    }

    enum TxStatus {
        Null,
        Success,
        Fail,
        Fallback,
        Pending // transient state within a transaction
    }

    struct TransferInfo {
        TransferType t;
        address sender;
        address receiver;
        address token;
        uint256 amount;
        uint64 wdseq; // only needed for LqWithdraw (refund)
        uint64 srcChainId;
        bytes32 refId;
        bytes32 srcTxHash; // src chain msg tx hash
    }

    struct RouteInfo {
        address sender;
        address receiver;
        uint64 srcChainId;
        bytes32 srcTxHash; // src chain msg tx hash
    }

    // used for msg from non-evm chains with longer-bytes address
    struct RouteInfo2 {
        bytes sender;
        address receiver;
        uint64 srcChainId;
        bytes32 srcTxHash;
    }

    // combination of RouteInfo and RouteInfo2 for easier processing
    struct Route {
        address sender; // from RouteInfo
        bytes senderBytes; // from RouteInfo2
        address receiver;
        uint64 srcChainId;
        bytes32 srcTxHash;
    }

    struct MsgWithTransferExecutionParams {
        bytes message;
        TransferInfo transfer;
        bytes[] sigs;
        address[] signers;
        uint256[] powers;
    }

    struct BridgeTransferParams {
        bytes request;
        bytes[] sigs;
        address[] signers;
        uint256[] powers;
    }
}

File 8 of 10 : Pauser.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.17;

import "@openzeppelin/contracts/security/Pausable.sol";
import "./Ownable.sol";

abstract contract Pauser is Ownable, Pausable {
    mapping(address => bool) public pausers;

    event PauserAdded(address account);
    event PauserRemoved(address account);

    constructor() {
        _addPauser(msg.sender);
    }

    modifier onlyPauser() {
        require(isPauser(msg.sender), "Caller is not pauser");
        _;
    }

    function pause() public onlyPauser {
        _pause();
    }

    function unpause() public onlyPauser {
        _unpause();
    }

    function isPauser(address account) public view returns (bool) {
        return pausers[account];
    }

    function addPauser(address account) public onlyOwner {
        _addPauser(account);
    }

    function removePauser(address account) public onlyOwner {
        _removePauser(account);
    }

    function renouncePauser() public {
        _removePauser(msg.sender);
    }

    function _addPauser(address account) private {
        require(!isPauser(account), "Account is already pauser");
        pausers[account] = true;
        emit PauserAdded(account);
    }

    function _removePauser(address account) private {
        require(isPauser(account), "Account is not pauser");
        pausers[account] = false;
        emit PauserRemoved(account);
    }
}

File 9 of 10 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 10 of 10 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_msgBus","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"returnData","type":"bytes"}],"name":"ExtCallErr","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"messageBus","type":"address"}],"name":"MessageBusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"srcChid","type":"uint64"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"srcNft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"dstNft","type":"address"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"srcNft","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"receiver","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"dstNft","type":"bytes"}],"name":"Sent2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"address","name":"dstNftBridge","type":"address"}],"name":"SetDestBridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"dstNftBridge","type":"bytes"}],"name":"SetDestBridge2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"srcNft","type":"address"},{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"address","name":"dstNft","type":"address"}],"name":"SetDestNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"srcNft","type":"address"},{"indexed":false,"internalType":"uint64","name":"dstChid","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"dstNft","type":"bytes"}],"name":"SetDestNFT2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nft","type":"address"},{"indexed":false,"internalType":"bool","name":"isOrig","type":"bool"}],"name":"SetOrigNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chid","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetTxFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"delOrigNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destBridge2","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"destNFTAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"destNFTAddr2","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"destTxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"uint64","name":"srcChid","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"","type":"address"}],"name":"executeMessage","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint64","name":"srcChid","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"","type":"address"}],"name":"executeMessage","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"}],"name":"executeMessageWithTransfer","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"}],"name":"executeMessageWithTransferFallback","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"}],"name":"executeMessageWithTransferRefund","outputs":[{"internalType":"enum IMessageReceiverApp.ExecutionStatus","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_msgBus","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageBus","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"origNFT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"bytes","name":"_receiver","type":"bytes"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"sendMsg","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"sendMsg","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"bytes","name":"_receiver","type":"bytes"}],"name":"sendTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"sendTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChid","type":"uint64"},{"internalType":"address","name":"dstNftBridge","type":"address"}],"name":"setDestBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChid","type":"uint64"},{"internalType":"bytes","name":"dstNftBridge","type":"bytes"}],"name":"setDestBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"dstChid","type":"uint64[]"},{"internalType":"address[]","name":"dstNftBridge","type":"address[]"}],"name":"setDestBridges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"srcNft","type":"address"},{"internalType":"uint64","name":"dstChid","type":"uint64"},{"internalType":"bytes","name":"dstNft","type":"bytes"}],"name":"setDestNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"srcNft","type":"address"},{"internalType":"uint64","name":"dstChid","type":"uint64"},{"internalType":"address","name":"dstNft","type":"address"}],"name":"setDestNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"srcNft","type":"address"},{"internalType":"uint64[]","name":"dstChid","type":"uint64[]"},{"internalType":"address[]","name":"dstNft","type":"address[]"}],"name":"setDestNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_messageBus","type":"address"}],"name":"setMessageBus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"setOrigNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chid","type":"uint64"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTxFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_dstChid","type":"uint64"},{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003d5638038062003d56833981016040819052620000349162000195565b6200003f336200007d565b6001805460ff60a01b191690556200005733620000cd565b600180546001600160a01b0319166001600160a01b0392909216919091179055620001c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526002602052604090205460ff16156200013b5760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c72656164792070617573657200000000000000604482015260640160405180910390fd5b6001600160a01b038116600081815260026020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f8910160405180910390a150565b600060208284031215620001a857600080fd5b81516001600160a01b0381168114620001c057600080fd5b9392505050565b613b7f80620001d76000396000f3fe6080604052600436106102a05760003560e01c80636ef8d66d1161016e5780639e041b9d116100cb578063ed99bf431161007f578063ee91bab811610064578063ee91bab814610760578063f0cb57ce14610773578063f2fde38b1461078657600080fd5b8063ed99bf4314610720578063edea75921461074057600080fd5b8063a1a227fa116100b0578063a1a227fa146106cd578063b2c88775146106ed578063da754f441461070057600080fd5b80639e041b9d1461066c5780639f825f07146106ad57600080fd5b80638da5cb5b1161012257806399d32fc41161010757806399d32fc4146106245780639c1a65bd146106395780639c649fdf1461065957600080fd5b80638da5cb5b146105e657806395b6a1911461060457600080fd5b806380f51c121161015357806380f51c121461058157806382dc1ec4146105b15780638456cb59146105d157600080fd5b80636ef8d66d1461056c5780637cd2bffc1461050757600080fd5b80633f4ba83a1161021c578063583624b7116101d05780635c975abb116101b55780635c975abb1461051a5780635d5b09f2146105395780636b2c0f551461054c57600080fd5b8063583624b7146104e75780635ab7afc61461050757600080fd5b806346fbf68e1161020157806346fbf68e1461046e5780634cc42351146104a7578063547cad12146104c757600080fd5b80633f4ba83a1461043957806343a8c1371461044e57600080fd5b8063151ff4eb116102735780631de13e43116102585780631de13e431461039e57806327cbe705146103cb5780632d5fa47c1461041957600080fd5b8063151ff4eb1461034357806319ab453c1461037e57600080fd5b8063063ce4e5146102a5578063065c38fd146102ce5780630bcb4982146102f05780631140c84e14610303575b600080fd5b6102b86102b3366004612d41565b6107a6565b6040516102c59190612dd7565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612dff565b61088a565b005b6102b86102fe366004612e1c565b610943565b34801561030f57600080fd5b5061033361031e366004612dff565b60066020526000908152604090205460ff1681565b60405190151581526020016102c5565b34801561034f57600080fd5b5061037061035e366004612e90565b60036020526000908152604090205481565b6040519081526020016102c5565b34801561038a57600080fd5b506102ee610399366004612dff565b6109a9565b3480156103aa57600080fd5b506103be6103b9366004612eab565b6109d3565b6040516102c59190612f30565b3480156103d757600080fd5b506104016103e6366004612e90565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b34801561042557600080fd5b506102ee610434366004612f88565b610a78565b34801561044557600080fd5b506102ee610be2565b34801561045a57600080fd5b506102ee61046936600461300b565b610c4b565b34801561047a57600080fd5b50610333610489366004612dff565b6001600160a01b031660009081526002602052604090205460ff1690565b3480156104b357600080fd5b506103be6104c2366004612e90565b610d50565b3480156104d357600080fd5b506102ee6104e2366004612dff565b610d69565b3480156104f357600080fd5b506102ee610502366004613077565b610e0e565b6102b86105153660046130ce565b610ee1565b34801561052657600080fd5b50600154600160a01b900460ff16610333565b6102ee610547366004613165565b610f49565b34801561055857600080fd5b506102ee610567366004612dff565b6111ad565b34801561057857600080fd5b506102ee611210565b34801561058d57600080fd5b5061033361059c366004612dff565b60026020526000908152604090205460ff1681565b3480156105bd57600080fd5b506102ee6105cc366004612dff565b611219565b3480156105dd57600080fd5b506102ee611279565b3480156105f257600080fd5b506000546001600160a01b0316610401565b34801561061057600080fd5b506102ee61061f3660046131c5565b6112e0565b34801561063057600080fd5b506102ee6113c1565b34801561064557600080fd5b5061037061065436600461320e565b611478565b6102b861066736600461324d565b6116f1565b34801561067857600080fd5b50610401610687366004612eab565b60056020908152600092835260408084209091529082529020546001600160a01b031681565b3480156106b957600080fd5b506102ee6106c836600461329a565b6117a3565b3480156106d957600080fd5b50600154610401906001600160a01b031681565b6102ee6106fb3660046132c4565b611854565b34801561070c57600080fd5b506102ee61071b366004613315565b611ab6565b34801561072c57600080fd5b506102ee61073b366004612dff565b611b77565b34801561074c57600080fd5b506102ee61075b36600461334c565b611c25565b6102ee61076e36600461339f565b611cd4565b6102ee61078136600461343c565b611e23565b34801561079257600080fd5b506102ee6107a1366004612dff565b611f73565b6001546000906001600160a01b031633146108085760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff1680610865575067ffffffffffffffff851660009081526007602052604090819020905161084291906134f9565b6040518091039020878760405161085a92919061356f565b604051809103902014155b1561087257506002610880565b61087d84848761204f565b90505b9695505050505050565b3361089d6000546001600160a01b031690565b6001600160a01b0316146108e15760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b038116600081815260066020908152604091829020805460ff191660019081179091558251938452908301527f9800fb32bf5eb9a3b2e42c910912da10ed1881dc538475101797669146166bf891015b60405180910390a150565b6001546000906001600160a01b031633146109a05760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b95945050505050565b6109b161227e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6008602090815260009283526040808420909152908252902080546109f7906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a23906134bf565b8015610a705780601f10610a4557610100808354040283529160200191610a70565b820191906000526020600020905b815481529060010190602001808311610a5357829003601f168201915b505050505081565b33610a8b6000546001600160a01b031690565b6001600160a01b031614610acf5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b828114610b1e5760405162461bcd60e51b815260206004820152600f60248201527f6c656e677468206d69736d61746368000000000000000000000000000000000060448201526064016107ff565b60005b83811015610bda57828282818110610b3b57610b3b61357f565b9050602002016020810190610b509190612dff565b6001600160a01b038716600090815260056020526040812090878785818110610b7b57610b7b61357f565b9050602002016020810190610b909190612e90565b67ffffffffffffffff168152602081019190915260400160002080546001600160a01b0319166001600160a01b039290921691909117905580610bd2816135ab565b915050610b21565b505050505050565b3360009081526002602052604090205460ff16610c415760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f742070617573657200000000000000000000000060448201526064016107ff565b610c496122e0565b565b33610c5e6000546001600160a01b031690565b6001600160a01b031614610ca25760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b60005b83811015610d4957828282818110610cbf57610cbf61357f565b9050602002016020810190610cd49190612dff565b60046000878785818110610cea57610cea61357f565b9050602002016020810190610cff9190612e90565b67ffffffffffffffff168152602081019190915260400160002080546001600160a01b0319166001600160a01b039290921691909117905580610d41816135ab565b915050610ca5565b5050505050565b600760205260009081526040902080546109f7906134bf565b33610d7c6000546001600160a01b031690565b6001600160a01b031614610dc05760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f3f8223bcd8b3b875473e9f9e14e1ad075451a2b5ffd31591655da9a01516bf5e90602001610938565b33610e216000546001600160a01b031690565b6001600160a01b031614610e655760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b038416600090815260086020908152604080832067ffffffffffffffff871684529091529020610e9d828483613625565b507f1a8a0120788995f98396f44447190686d4b5978184ca4f9d726d541aed6fb7d684848484604051610ed3949392919061370e565b60405180910390a150505050565b6001546000906001600160a01b03163314610f3e5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b979650505050505050565b600154600160a01b900460ff1615610f965760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6040516331a9108f60e11b8152600481018590526001600160a01b03861690636352211e90602401602060405180830381865afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190613741565b6001600160a01b0316336001600160a01b0316146110515760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b60448201526064016107ff565b60405163c87b56dd60e01b8152600481018590526000906001600160a01b0387169063c87b56dd90602401600060405180830381865afa158015611099573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c191908101906137e0565b90506110cd8686612386565b6000806110da888761252c565b915091506111608287604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602080820187905260408083018e90526060909201899052905161114c929101613853565b604051602081830303815290604052612736565b7f161c0f80e624fd7198682c940eb06e3a33589fef44e083931a0a7908ea1a1a5e3389898989898760405161119b97969594939291906138b5565b60405180910390a15050505050505050565b336111c06000546001600160a01b031690565b6001600160a01b0316146112045760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b61120d8161287f565b50565b610c493361287f565b3361122c6000546001600160a01b031690565b6001600160a01b0316146112705760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b61120d81612938565b3360009081526002602052604090205460ff166112d85760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f742070617573657200000000000000000000000060448201526064016107ff565b610c496129f5565b336112f36000546001600160a01b031690565b6001600160a01b0316146113375760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b03838116600081815260056020908152604080832067ffffffffffffffff88168085529083529281902080546001600160a01b03191695871695861790558051938452908301919091528101919091527fa5a9b84f1b7eb437335ea919a3ff6de6e242e4733d0100a77391106173794871906060015b60405180910390a1505050565b336113d46000546001600160a01b031690565b6001600160a01b0316146114185760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6040514790339082156108fc029083906000818181858888f19350505050158015611447573d6000803e3d6000fd5b506040518181527f62b10e3ff3d45b5ff546e740b893897facb1680285f989a64ae932d62c5388e190602001610938565b60405163c87b56dd60e01b81526004810182905260009081906001600160a01b0385169063c87b56dd90602401600060405180830381865afa1580156114c2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114ea91908101906137e0565b6001600160a01b038516600090815260086020908152604080832067ffffffffffffffff8a16845290915281208054929350606092611528906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611554906134bf565b80156115a15780601f10611576576101008083540402835291602001916115a1565b820191906000526020600020905b81548152906001019060200180831161158457829003601f168201915b505050505090506000815111156115f9576040518060800160405280828152602001828152602001868152602001848152506040516020016115e39190613853565b604051602081830303815290604052915061164e565b6040518060800160405280876001600160a01b03168152602001876001600160a01b031681526020018681526020018481525060405160200161163c9190613918565b60405160208183030381529060405291505b67ffffffffffffffff87166000908152600360205260409081902054600154915163299aee5160e11b815290916001600160a01b031690635335dca290611699908690600401612f30565b602060405180830381865afa1580156116b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116da9190613966565b6116e4919061397f565b93505050505b9392505050565b6001546000906001600160a01b0316331461174e5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b600154600160a01b900460ff168061178b575067ffffffffffffffff85166000908152600460205260409020546001600160a01b03878116911614155b15611798575060026109a0565b61088084848761204f565b336117b66000546001600160a01b031690565b6001600160a01b0316146117fa5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff8216600081815260036020908152604091829020849055815192835282018390527f446a287c2114fa54d0083d97ce8f6f15b2ce29fa1c2df4b5a580d581ea7c4ad391015b60405180910390a15050565b600154600160a01b900460ff16156118a15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6040516331a9108f60e11b8152600481018490526001600160a01b03851690636352211e90602401602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613741565b6001600160a01b0316336001600160a01b03161461195c5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b60448201526064016107ff565b60405163c87b56dd60e01b8152600481018490526000906001600160a01b0386169063c87b56dd90602401600060405180830381865afa1580156119a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119cc91908101906137e0565b90506119d88585612386565b6000806119e58786612a7d565b91509150611a4582866040518060800160405280886001600160a01b03168152602001856001600160a01b031681526020018a815260200187815250604051602001611a319190613918565b604051602081830303815290604052612b6c565b604080513381526001600160a01b03898116602083015281830189905267ffffffffffffffff881660608301528681166080830152831660a082015290517f40143e5b72b2109d658cfa709dec6213f60364dbd08b7253cdaf5f4e0c49561c9181900360c00190a150505050505050565b33611ac96000546001600160a01b031690565b6001600160a01b031614611b0d5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff821660008181526004602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f3e776334b24c927645043308f89ac1ca734002e5a921ff384a70dcbb88c92cd49101611848565b33611b8a6000546001600160a01b031690565b6001600160a01b031614611bce5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b0381166000818152600660209081526040808320805460ff191690558051938452908301919091527f9800fb32bf5eb9a3b2e42c910912da10ed1881dc538475101797669146166bf89101610938565b33611c386000546001600160a01b031690565b6001600160a01b031614611c7c5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff83166000908152600760205260409020611ca0828483613625565b507ff00f7a8fa03b713f64d18cad2ad60051000162263e005d5ed22c692f42c4a2eb8383836040516113b493929190613998565b600154600160a01b900460ff1615611d215760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b33600080611d2f838b61252c565b91509150611dd4828b60405180608001604052808c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602080820187905260408083018d90528051601f8c018390048302810183019091528a8152606090920191908b908b9081908401838280828437600092019190915250505091525060405161114c9190602001613853565b7f161c0f80e624fd7198682c940eb06e3a33589fef44e083931a0a7908ea1a1a5e8984888d8c8c87604051611e0f97969594939291906138b5565b60405180910390a150505050505050505050565b600154600160a01b900460ff1615611e705760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b33600080611e7e838a612a7d565b91509150611efe828a60405180608001604052808b6001600160a01b03168152602001856001600160a01b031681526020018a815260200189898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250604051611a319190602001613918565b604080516001600160a01b038a81168252858116602083015281830189905267ffffffffffffffff8c1660608301528981166080830152831660a082015290517f40143e5b72b2109d658cfa709dec6213f60364dbd08b7253cdaf5f4e0c49561c9181900360c00190a1505050505050505050565b33611f866000546001600160a01b031690565b6001600160a01b031614611fca5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b0381166120465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107ff565b61120d81612c7d565b60008061205e848601866139bc565b6020808201516001600160a01b031660009081526006909152604090205490915060ff161515600103612174576020810151815160408084015190516323b872dd60e01b81523060048201526001600160a01b03928316602482015260448101919091529116906323b872dd90606401600060405180830381600087803b1580156120e857600080fd5b505af19250505080156120f9575060015b61216f573d808015612127576040519150601f19603f3d011682016040523d82523d6000602084013e61212c565b606091505b507f2c4d9008b1f58a23591c25a813b398a54f438d50b85bedea3d6e7302ee08a8108160405161215c9190612f30565b60405180910390a16002925050506116ea565b61220c565b60208101518151604080840151606085015191516333eba6f160e11b81526001600160a01b03909416936367d74de2936121b393909291600401613a9a565b600060405180830381600087803b1580156121cd57600080fd5b505af19250505080156121de575060015b61220c573d808015612127576040519150601f19603f3d011682016040523d82523d6000602084013e61212c565b805160208083015160408085015181516001600160a01b03958616815294909216928401929092528282015267ffffffffffffffff85166060830152517f0aac355db06d21352d6b898d8e0ae1334d55f65b6c4c09e26951166a8eb4dba79181900360800190a1506001949350505050565b6000546001600160a01b0316156122d75760405162461bcd60e51b815260206004820152601160248201527f6f776e657220616c72656164792073657400000000000000000000000000000060448201526064016107ff565b610c4933612c7d565b600154600160a01b900460ff166123395760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107ff565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03821660009081526006602052604090205460ff1615156001036124d6576040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b1580156123f957600080fd5b505af115801561240d573d6000803e3d6000fd5b50506040516331a9108f60e11b8152600481018490523092506001600160a01b0385169150636352211e90602401602060405180830381865afa158015612458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c9190613741565b6001600160a01b0316146124d25760405162461bcd60e51b815260206004820152601360248201527f7472616e73666572204e4654206661696c65640000000000000000000000000060448201526064016107ff565b5050565b604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561251857600080fd5b505af1158015610bda573d6000803e3d6000fd5b67ffffffffffffffff8116600090815260076020526040902080546060918291612555906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612581906134bf565b80156125ce5780601f106125a3576101008083540402835291602001916125ce565b820191906000526020600020905b8154815290600101906020018083116125b157829003601f168201915b5050505050915081516000036126265760405162461bcd60e51b815260206004820152601960248201527f64657374204e465420427269646765206e6f7420666f756e640000000000000060448201526064016107ff565b6001600160a01b038416600090815260086020908152604080832067ffffffffffffffff871684529091529020805461265e906134bf565b80601f016020809104026020016040519081016040528092919081815260200182805461268a906134bf565b80156126d75780601f106126ac576101008083540402835291602001916126d7565b820191906000526020600020905b8154815290600101906020018083116126ba57829003601f168201915b50505050509050805160000361272f5760405162461bcd60e51b815260206004820152601260248201527f64657374204e4654206e6f7420666f756e64000000000000000000000000000060448201526064016107ff565b9250929050565b60015460405163299aee5160e11b81526000916001600160a01b031690635335dca290612767908590600401612f30565b602060405180830381865afa158015612784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a89190613966565b67ffffffffffffffff84166000908152600360205260409020549091506127cf908261397f565b3410156128115760405162461bcd60e51b815260206004820152601060248201526f696e73756666696369656e742066656560801b60448201526064016107ff565b600154604051637d7a101d60e01b81526001600160a01b0390911690637d7a101d90839061284790889088908890600401613ac2565b6000604051808303818588803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050505050505050565b6001600160a01b03811660009081526002602052604090205460ff166128e75760405162461bcd60e51b815260206004820152601560248201527f4163636f756e74206973206e6f7420706175736572000000000000000000000060448201526064016107ff565b6001600160a01b038116600081815260026020908152604091829020805460ff1916905590519182527fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e9101610938565b6001600160a01b03811660009081526002602052604090205460ff16156129a15760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c7265616479207061757365720000000000000060448201526064016107ff565b6001600160a01b038116600081815260026020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f89101610938565b600154600160a01b900460ff1615612a425760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123693390565b67ffffffffffffffff81166000908152600460205260408120546001600160a01b03169081612aee5760405162461bcd60e51b815260206004820152601960248201527f64657374204e465420427269646765206e6f7420666f756e640000000000000060448201526064016107ff565b506001600160a01b03808416600090815260056020908152604080832067ffffffffffffffff87168452909152902054168061272f5760405162461bcd60e51b815260206004820152601260248201527f64657374204e4654206e6f7420666f756e64000000000000000000000000000060448201526064016107ff565b60015460405163299aee5160e11b81526000916001600160a01b031690635335dca290612b9d908590600401612f30565b602060405180830381865afa158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190613966565b67ffffffffffffffff8416600090815260036020526040902054909150612c05908261397f565b341015612c475760405162461bcd60e51b815260206004820152601060248201526f696e73756666696369656e742066656560801b60448201526064016107ff565b600154604051634f9e72ad60e11b81526001600160a01b0390911690639f3ce55a90839061284790889088908890600401613af7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f840112612cdf57600080fd5b50813567ffffffffffffffff811115612cf757600080fd5b60208301915083602082850101111561272f57600080fd5b803567ffffffffffffffff81168114612d2757600080fd5b919050565b6001600160a01b038116811461120d57600080fd5b60008060008060008060808789031215612d5a57600080fd5b863567ffffffffffffffff80821115612d7257600080fd5b612d7e8a838b01612ccd565b9098509650869150612d9260208a01612d0f565b95506040890135915080821115612da857600080fd5b50612db589828a01612ccd565b9094509250506060870135612dc981612d2c565b809150509295509295509295565b6020810160038310612df957634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612e1157600080fd5b81356116ea81612d2c565b600080600080600060808688031215612e3457600080fd5b8535612e3f81612d2c565b945060208601359350604086013567ffffffffffffffff811115612e6257600080fd5b612e6e88828901612ccd565b9094509250506060860135612e8281612d2c565b809150509295509295909350565b600060208284031215612ea257600080fd5b6116ea82612d0f565b60008060408385031215612ebe57600080fd5b8235612ec981612d2c565b9150612ed760208401612d0f565b90509250929050565b60005b83811015612efb578181015183820152602001612ee3565b50506000910152565b60008151808452612f1c816020860160208601612ee0565b601f01601f19169290920160200192915050565b6020815260006116ea6020830184612f04565b60008083601f840112612f5557600080fd5b50813567ffffffffffffffff811115612f6d57600080fd5b6020830191508360208260051b850101111561272f57600080fd5b600080600080600060608688031215612fa057600080fd5b8535612fab81612d2c565b9450602086013567ffffffffffffffff80821115612fc857600080fd5b612fd489838a01612f43565b90965094506040880135915080821115612fed57600080fd5b50612ffa88828901612f43565b969995985093965092949392505050565b6000806000806040858703121561302157600080fd5b843567ffffffffffffffff8082111561303957600080fd5b61304588838901612f43565b9096509450602087013591508082111561305e57600080fd5b5061306b87828801612f43565b95989497509550505050565b6000806000806060858703121561308d57600080fd5b843561309881612d2c565b93506130a660208601612d0f565b9250604085013567ffffffffffffffff8111156130c257600080fd5b61306b87828801612ccd565b600080600080600080600060c0888a0312156130e957600080fd5b87356130f481612d2c565b9650602088013561310481612d2c565b95506040880135945061311960608901612d0f565b9350608088013567ffffffffffffffff81111561313557600080fd5b6131418a828b01612ccd565b90945092505060a088013561315581612d2c565b8091505092959891949750929550565b60008060008060006080868803121561317d57600080fd5b853561318881612d2c565b94506020860135935061319d60408701612d0f565b9250606086013567ffffffffffffffff8111156131b957600080fd5b612ffa88828901612ccd565b6000806000606084860312156131da57600080fd5b83356131e581612d2c565b92506131f360208501612d0f565b9150604084013561320381612d2c565b809150509250925092565b60008060006060848603121561322357600080fd5b61322c84612d0f565b9250602084013561323c81612d2c565b929592945050506040919091013590565b60008060008060006080868803121561326557600080fd5b853561327081612d2c565b945061327e60208701612d0f565b9350604086013567ffffffffffffffff811115612e6257600080fd5b600080604083850312156132ad57600080fd5b6132b683612d0f565b946020939093013593505050565b600080600080608085870312156132da57600080fd5b84356132e581612d2c565b9350602085013592506132fa60408601612d0f565b9150606085013561330a81612d2c565b939692955090935050565b6000806040838503121561332857600080fd5b61333183612d0f565b9150602083013561334181612d2c565b809150509250929050565b60008060006040848603121561336157600080fd5b61336a84612d0f565b9250602084013567ffffffffffffffff81111561338657600080fd5b61339286828701612ccd565b9497909650939450505050565b600080600080600080600060a0888a0312156133ba57600080fd5b6133c388612d0f565b965060208801356133d381612d2c565b9550604088013567ffffffffffffffff808211156133f057600080fd5b6133fc8b838c01612ccd565b909750955060608a0135945060808a013591508082111561341c57600080fd5b506134298a828b01612ccd565b989b979a50959850939692959293505050565b60008060008060008060a0878903121561345557600080fd5b61345e87612d0f565b9550602087013561346e81612d2c565b9450604087013561347e81612d2c565b935060608701359250608087013567ffffffffffffffff8111156134a157600080fd5b6134ad89828a01612ccd565b979a9699509497509295939492505050565b600181811c908216806134d357607f821691505b6020821081036134f357634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354613507816134bf565b6001828116801561351f576001811461353457613563565b60ff1984168752821515830287019450613563565b8760005260208060002060005b8581101561355a5781548a820152908401908201613541565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016135bd576135bd613595565b5060010190565b634e487b7160e01b600052604160045260246000fd5b601f82111561362057600081815260208120601f850160051c810160208610156136015750805b601f850160051c820191505b81811015610bda5782815560010161360d565b505050565b67ffffffffffffffff83111561363d5761363d6135c4565b6136518361364b83546134bf565b836135da565b6000601f841160018114613685576000851561366d5750838201355b600019600387901b1c1916600186901b178355610d49565b600083815260209020601f19861690835b828110156136b65786850135825560209485019460019092019101613696565b50868210156136d35760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038516815267ffffffffffffffff841660208201526060604082015260006108806060830184866136e5565b60006020828403121561375357600080fd5b81516116ea81612d2c565b6040516080810167ffffffffffffffff81118282101715613781576137816135c4565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156137b0576137b06135c4565b604052919050565b600067ffffffffffffffff8211156137d2576137d26135c4565b50601f01601f191660200190565b6000602082840312156137f257600080fd5b815167ffffffffffffffff81111561380957600080fd5b8201601f8101841361381a57600080fd5b805161382d613828826137b8565b613787565b81815285602083850101111561384257600080fd5b6109a0826020830160208601612ee0565b60208152600082516080602084015261386f60a0840182612f04565b90506020840151601f198085840301604086015261388d8383612f04565b9250604086015160608601526060860151915080858403016080860152506109a08282612f04565b60006001600160a01b03808a16835280891660208401525086604083015267ffffffffffffffff8616606083015260c060808301526138f860c0830185876136e5565b82810360a084015261390a8185612f04565b9a9950505050505050505050565b6020815260006001600160a01b038084511660208401528060208501511660408401525060408301516060830152606083015160808084015261395e60a0840182612f04565b949350505050565b60006020828403121561397857600080fd5b5051919050565b8082018082111561399257613992613595565b92915050565b67ffffffffffffffff841681526040602082015260006109a06040830184866136e5565b600060208083850312156139cf57600080fd5b823567ffffffffffffffff808211156139e757600080fd5b90840190608082870312156139fb57600080fd5b613a0361375e565b8235613a0e81612d2c565b815282840135613a1d81612d2c565b8185015260408381013590820152606083013582811115613a3d57600080fd5b80840193505086601f840112613a5257600080fd5b82359150613a62613828836137b8565b8281528785848601011115613a7657600080fd5b82858501868301376000858483010152806060830152508094505050505092915050565b6001600160a01b03841681528260208201526060604082015260006109a06060830184612f04565b606081526000613ad56060830186612f04565b67ffffffffffffffff8516602084015282810360408401526108808185612f04565b6001600160a01b038416815267ffffffffffffffff831660208201526060604082015260006109a06060830184612f0456fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220b858f5b10153bc66bb5164b900409fd0964426a32294f87e83a5e247222a2a4b64736f6c634300081100330000000000000000000000009bb46d5100d2db4608112026951c9c965b233f4d

Deployed Bytecode

0x6080604052600436106102a05760003560e01c80636ef8d66d1161016e5780639e041b9d116100cb578063ed99bf431161007f578063ee91bab811610064578063ee91bab814610760578063f0cb57ce14610773578063f2fde38b1461078657600080fd5b8063ed99bf4314610720578063edea75921461074057600080fd5b8063a1a227fa116100b0578063a1a227fa146106cd578063b2c88775146106ed578063da754f441461070057600080fd5b80639e041b9d1461066c5780639f825f07146106ad57600080fd5b80638da5cb5b1161012257806399d32fc41161010757806399d32fc4146106245780639c1a65bd146106395780639c649fdf1461065957600080fd5b80638da5cb5b146105e657806395b6a1911461060457600080fd5b806380f51c121161015357806380f51c121461058157806382dc1ec4146105b15780638456cb59146105d157600080fd5b80636ef8d66d1461056c5780637cd2bffc1461050757600080fd5b80633f4ba83a1161021c578063583624b7116101d05780635c975abb116101b55780635c975abb1461051a5780635d5b09f2146105395780636b2c0f551461054c57600080fd5b8063583624b7146104e75780635ab7afc61461050757600080fd5b806346fbf68e1161020157806346fbf68e1461046e5780634cc42351146104a7578063547cad12146104c757600080fd5b80633f4ba83a1461043957806343a8c1371461044e57600080fd5b8063151ff4eb116102735780631de13e43116102585780631de13e431461039e57806327cbe705146103cb5780632d5fa47c1461041957600080fd5b8063151ff4eb1461034357806319ab453c1461037e57600080fd5b8063063ce4e5146102a5578063065c38fd146102ce5780630bcb4982146102f05780631140c84e14610303575b600080fd5b6102b86102b3366004612d41565b6107a6565b6040516102c59190612dd7565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612dff565b61088a565b005b6102b86102fe366004612e1c565b610943565b34801561030f57600080fd5b5061033361031e366004612dff565b60066020526000908152604090205460ff1681565b60405190151581526020016102c5565b34801561034f57600080fd5b5061037061035e366004612e90565b60036020526000908152604090205481565b6040519081526020016102c5565b34801561038a57600080fd5b506102ee610399366004612dff565b6109a9565b3480156103aa57600080fd5b506103be6103b9366004612eab565b6109d3565b6040516102c59190612f30565b3480156103d757600080fd5b506104016103e6366004612e90565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b34801561042557600080fd5b506102ee610434366004612f88565b610a78565b34801561044557600080fd5b506102ee610be2565b34801561045a57600080fd5b506102ee61046936600461300b565b610c4b565b34801561047a57600080fd5b50610333610489366004612dff565b6001600160a01b031660009081526002602052604090205460ff1690565b3480156104b357600080fd5b506103be6104c2366004612e90565b610d50565b3480156104d357600080fd5b506102ee6104e2366004612dff565b610d69565b3480156104f357600080fd5b506102ee610502366004613077565b610e0e565b6102b86105153660046130ce565b610ee1565b34801561052657600080fd5b50600154600160a01b900460ff16610333565b6102ee610547366004613165565b610f49565b34801561055857600080fd5b506102ee610567366004612dff565b6111ad565b34801561057857600080fd5b506102ee611210565b34801561058d57600080fd5b5061033361059c366004612dff565b60026020526000908152604090205460ff1681565b3480156105bd57600080fd5b506102ee6105cc366004612dff565b611219565b3480156105dd57600080fd5b506102ee611279565b3480156105f257600080fd5b506000546001600160a01b0316610401565b34801561061057600080fd5b506102ee61061f3660046131c5565b6112e0565b34801561063057600080fd5b506102ee6113c1565b34801561064557600080fd5b5061037061065436600461320e565b611478565b6102b861066736600461324d565b6116f1565b34801561067857600080fd5b50610401610687366004612eab565b60056020908152600092835260408084209091529082529020546001600160a01b031681565b3480156106b957600080fd5b506102ee6106c836600461329a565b6117a3565b3480156106d957600080fd5b50600154610401906001600160a01b031681565b6102ee6106fb3660046132c4565b611854565b34801561070c57600080fd5b506102ee61071b366004613315565b611ab6565b34801561072c57600080fd5b506102ee61073b366004612dff565b611b77565b34801561074c57600080fd5b506102ee61075b36600461334c565b611c25565b6102ee61076e36600461339f565b611cd4565b6102ee61078136600461343c565b611e23565b34801561079257600080fd5b506102ee6107a1366004612dff565b611f73565b6001546000906001600160a01b031633146108085760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff1680610865575067ffffffffffffffff851660009081526007602052604090819020905161084291906134f9565b6040518091039020878760405161085a92919061356f565b604051809103902014155b1561087257506002610880565b61087d84848761204f565b90505b9695505050505050565b3361089d6000546001600160a01b031690565b6001600160a01b0316146108e15760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b038116600081815260066020908152604091829020805460ff191660019081179091558251938452908301527f9800fb32bf5eb9a3b2e42c910912da10ed1881dc538475101797669146166bf891015b60405180910390a150565b6001546000906001600160a01b031633146109a05760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b95945050505050565b6109b161227e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6008602090815260009283526040808420909152908252902080546109f7906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a23906134bf565b8015610a705780601f10610a4557610100808354040283529160200191610a70565b820191906000526020600020905b815481529060010190602001808311610a5357829003601f168201915b505050505081565b33610a8b6000546001600160a01b031690565b6001600160a01b031614610acf5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b828114610b1e5760405162461bcd60e51b815260206004820152600f60248201527f6c656e677468206d69736d61746368000000000000000000000000000000000060448201526064016107ff565b60005b83811015610bda57828282818110610b3b57610b3b61357f565b9050602002016020810190610b509190612dff565b6001600160a01b038716600090815260056020526040812090878785818110610b7b57610b7b61357f565b9050602002016020810190610b909190612e90565b67ffffffffffffffff168152602081019190915260400160002080546001600160a01b0319166001600160a01b039290921691909117905580610bd2816135ab565b915050610b21565b505050505050565b3360009081526002602052604090205460ff16610c415760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f742070617573657200000000000000000000000060448201526064016107ff565b610c496122e0565b565b33610c5e6000546001600160a01b031690565b6001600160a01b031614610ca25760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b60005b83811015610d4957828282818110610cbf57610cbf61357f565b9050602002016020810190610cd49190612dff565b60046000878785818110610cea57610cea61357f565b9050602002016020810190610cff9190612e90565b67ffffffffffffffff168152602081019190915260400160002080546001600160a01b0319166001600160a01b039290921691909117905580610d41816135ab565b915050610ca5565b5050505050565b600760205260009081526040902080546109f7906134bf565b33610d7c6000546001600160a01b031690565b6001600160a01b031614610dc05760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f3f8223bcd8b3b875473e9f9e14e1ad075451a2b5ffd31591655da9a01516bf5e90602001610938565b33610e216000546001600160a01b031690565b6001600160a01b031614610e655760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b038416600090815260086020908152604080832067ffffffffffffffff871684529091529020610e9d828483613625565b507f1a8a0120788995f98396f44447190686d4b5978184ca4f9d726d541aed6fb7d684848484604051610ed3949392919061370e565b60405180910390a150505050565b6001546000906001600160a01b03163314610f3e5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b979650505050505050565b600154600160a01b900460ff1615610f965760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6040516331a9108f60e11b8152600481018590526001600160a01b03861690636352211e90602401602060405180830381865afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190613741565b6001600160a01b0316336001600160a01b0316146110515760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b60448201526064016107ff565b60405163c87b56dd60e01b8152600481018590526000906001600160a01b0387169063c87b56dd90602401600060405180830381865afa158015611099573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110c191908101906137e0565b90506110cd8686612386565b6000806110da888761252c565b915091506111608287604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602080820187905260408083018e90526060909201899052905161114c929101613853565b604051602081830303815290604052612736565b7f161c0f80e624fd7198682c940eb06e3a33589fef44e083931a0a7908ea1a1a5e3389898989898760405161119b97969594939291906138b5565b60405180910390a15050505050505050565b336111c06000546001600160a01b031690565b6001600160a01b0316146112045760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b61120d8161287f565b50565b610c493361287f565b3361122c6000546001600160a01b031690565b6001600160a01b0316146112705760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b61120d81612938565b3360009081526002602052604090205460ff166112d85760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f742070617573657200000000000000000000000060448201526064016107ff565b610c496129f5565b336112f36000546001600160a01b031690565b6001600160a01b0316146113375760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b03838116600081815260056020908152604080832067ffffffffffffffff88168085529083529281902080546001600160a01b03191695871695861790558051938452908301919091528101919091527fa5a9b84f1b7eb437335ea919a3ff6de6e242e4733d0100a77391106173794871906060015b60405180910390a1505050565b336113d46000546001600160a01b031690565b6001600160a01b0316146114185760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6040514790339082156108fc029083906000818181858888f19350505050158015611447573d6000803e3d6000fd5b506040518181527f62b10e3ff3d45b5ff546e740b893897facb1680285f989a64ae932d62c5388e190602001610938565b60405163c87b56dd60e01b81526004810182905260009081906001600160a01b0385169063c87b56dd90602401600060405180830381865afa1580156114c2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114ea91908101906137e0565b6001600160a01b038516600090815260086020908152604080832067ffffffffffffffff8a16845290915281208054929350606092611528906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611554906134bf565b80156115a15780601f10611576576101008083540402835291602001916115a1565b820191906000526020600020905b81548152906001019060200180831161158457829003601f168201915b505050505090506000815111156115f9576040518060800160405280828152602001828152602001868152602001848152506040516020016115e39190613853565b604051602081830303815290604052915061164e565b6040518060800160405280876001600160a01b03168152602001876001600160a01b031681526020018681526020018481525060405160200161163c9190613918565b60405160208183030381529060405291505b67ffffffffffffffff87166000908152600360205260409081902054600154915163299aee5160e11b815290916001600160a01b031690635335dca290611699908690600401612f30565b602060405180830381865afa1580156116b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116da9190613966565b6116e4919061397f565b93505050505b9392505050565b6001546000906001600160a01b0316331461174e5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016107ff565b600154600160a01b900460ff168061178b575067ffffffffffffffff85166000908152600460205260409020546001600160a01b03878116911614155b15611798575060026109a0565b61088084848761204f565b336117b66000546001600160a01b031690565b6001600160a01b0316146117fa5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff8216600081815260036020908152604091829020849055815192835282018390527f446a287c2114fa54d0083d97ce8f6f15b2ce29fa1c2df4b5a580d581ea7c4ad391015b60405180910390a15050565b600154600160a01b900460ff16156118a15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6040516331a9108f60e11b8152600481018490526001600160a01b03851690636352211e90602401602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613741565b6001600160a01b0316336001600160a01b03161461195c5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b60448201526064016107ff565b60405163c87b56dd60e01b8152600481018490526000906001600160a01b0386169063c87b56dd90602401600060405180830381865afa1580156119a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119cc91908101906137e0565b90506119d88585612386565b6000806119e58786612a7d565b91509150611a4582866040518060800160405280886001600160a01b03168152602001856001600160a01b031681526020018a815260200187815250604051602001611a319190613918565b604051602081830303815290604052612b6c565b604080513381526001600160a01b03898116602083015281830189905267ffffffffffffffff881660608301528681166080830152831660a082015290517f40143e5b72b2109d658cfa709dec6213f60364dbd08b7253cdaf5f4e0c49561c9181900360c00190a150505050505050565b33611ac96000546001600160a01b031690565b6001600160a01b031614611b0d5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff821660008181526004602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f3e776334b24c927645043308f89ac1ca734002e5a921ff384a70dcbb88c92cd49101611848565b33611b8a6000546001600160a01b031690565b6001600160a01b031614611bce5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b0381166000818152600660209081526040808320805460ff191690558051938452908301919091527f9800fb32bf5eb9a3b2e42c910912da10ed1881dc538475101797669146166bf89101610938565b33611c386000546001600160a01b031690565b6001600160a01b031614611c7c5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b67ffffffffffffffff83166000908152600760205260409020611ca0828483613625565b507ff00f7a8fa03b713f64d18cad2ad60051000162263e005d5ed22c692f42c4a2eb8383836040516113b493929190613998565b600154600160a01b900460ff1615611d215760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b33600080611d2f838b61252c565b91509150611dd4828b60405180608001604052808c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602080820187905260408083018d90528051601f8c018390048302810183019091528a8152606090920191908b908b9081908401838280828437600092019190915250505091525060405161114c9190602001613853565b7f161c0f80e624fd7198682c940eb06e3a33589fef44e083931a0a7908ea1a1a5e8984888d8c8c87604051611e0f97969594939291906138b5565b60405180910390a150505050505050505050565b600154600160a01b900460ff1615611e705760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b33600080611e7e838a612a7d565b91509150611efe828a60405180608001604052808b6001600160a01b03168152602001856001600160a01b031681526020018a815260200189898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250604051611a319190602001613918565b604080516001600160a01b038a81168252858116602083015281830189905267ffffffffffffffff8c1660608301528981166080830152831660a082015290517f40143e5b72b2109d658cfa709dec6213f60364dbd08b7253cdaf5f4e0c49561c9181900360c00190a1505050505050505050565b33611f866000546001600160a01b031690565b6001600160a01b031614611fca5760405162461bcd60e51b81526020600482018190526024820152600080516020613b2a83398151915260448201526064016107ff565b6001600160a01b0381166120465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107ff565b61120d81612c7d565b60008061205e848601866139bc565b6020808201516001600160a01b031660009081526006909152604090205490915060ff161515600103612174576020810151815160408084015190516323b872dd60e01b81523060048201526001600160a01b03928316602482015260448101919091529116906323b872dd90606401600060405180830381600087803b1580156120e857600080fd5b505af19250505080156120f9575060015b61216f573d808015612127576040519150601f19603f3d011682016040523d82523d6000602084013e61212c565b606091505b507f2c4d9008b1f58a23591c25a813b398a54f438d50b85bedea3d6e7302ee08a8108160405161215c9190612f30565b60405180910390a16002925050506116ea565b61220c565b60208101518151604080840151606085015191516333eba6f160e11b81526001600160a01b03909416936367d74de2936121b393909291600401613a9a565b600060405180830381600087803b1580156121cd57600080fd5b505af19250505080156121de575060015b61220c573d808015612127576040519150601f19603f3d011682016040523d82523d6000602084013e61212c565b805160208083015160408085015181516001600160a01b03958616815294909216928401929092528282015267ffffffffffffffff85166060830152517f0aac355db06d21352d6b898d8e0ae1334d55f65b6c4c09e26951166a8eb4dba79181900360800190a1506001949350505050565b6000546001600160a01b0316156122d75760405162461bcd60e51b815260206004820152601160248201527f6f776e657220616c72656164792073657400000000000000000000000000000060448201526064016107ff565b610c4933612c7d565b600154600160a01b900460ff166123395760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107ff565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03821660009081526006602052604090205460ff1615156001036124d6576040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b1580156123f957600080fd5b505af115801561240d573d6000803e3d6000fd5b50506040516331a9108f60e11b8152600481018490523092506001600160a01b0385169150636352211e90602401602060405180830381865afa158015612458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c9190613741565b6001600160a01b0316146124d25760405162461bcd60e51b815260206004820152601360248201527f7472616e73666572204e4654206661696c65640000000000000000000000000060448201526064016107ff565b5050565b604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561251857600080fd5b505af1158015610bda573d6000803e3d6000fd5b67ffffffffffffffff8116600090815260076020526040902080546060918291612555906134bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612581906134bf565b80156125ce5780601f106125a3576101008083540402835291602001916125ce565b820191906000526020600020905b8154815290600101906020018083116125b157829003601f168201915b5050505050915081516000036126265760405162461bcd60e51b815260206004820152601960248201527f64657374204e465420427269646765206e6f7420666f756e640000000000000060448201526064016107ff565b6001600160a01b038416600090815260086020908152604080832067ffffffffffffffff871684529091529020805461265e906134bf565b80601f016020809104026020016040519081016040528092919081815260200182805461268a906134bf565b80156126d75780601f106126ac576101008083540402835291602001916126d7565b820191906000526020600020905b8154815290600101906020018083116126ba57829003601f168201915b50505050509050805160000361272f5760405162461bcd60e51b815260206004820152601260248201527f64657374204e4654206e6f7420666f756e64000000000000000000000000000060448201526064016107ff565b9250929050565b60015460405163299aee5160e11b81526000916001600160a01b031690635335dca290612767908590600401612f30565b602060405180830381865afa158015612784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a89190613966565b67ffffffffffffffff84166000908152600360205260409020549091506127cf908261397f565b3410156128115760405162461bcd60e51b815260206004820152601060248201526f696e73756666696369656e742066656560801b60448201526064016107ff565b600154604051637d7a101d60e01b81526001600160a01b0390911690637d7a101d90839061284790889088908890600401613ac2565b6000604051808303818588803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050505050505050565b6001600160a01b03811660009081526002602052604090205460ff166128e75760405162461bcd60e51b815260206004820152601560248201527f4163636f756e74206973206e6f7420706175736572000000000000000000000060448201526064016107ff565b6001600160a01b038116600081815260026020908152604091829020805460ff1916905590519182527fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e9101610938565b6001600160a01b03811660009081526002602052604090205460ff16156129a15760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c7265616479207061757365720000000000000060448201526064016107ff565b6001600160a01b038116600081815260026020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f89101610938565b600154600160a01b900460ff1615612a425760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107ff565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123693390565b67ffffffffffffffff81166000908152600460205260408120546001600160a01b03169081612aee5760405162461bcd60e51b815260206004820152601960248201527f64657374204e465420427269646765206e6f7420666f756e640000000000000060448201526064016107ff565b506001600160a01b03808416600090815260056020908152604080832067ffffffffffffffff87168452909152902054168061272f5760405162461bcd60e51b815260206004820152601260248201527f64657374204e4654206e6f7420666f756e64000000000000000000000000000060448201526064016107ff565b60015460405163299aee5160e11b81526000916001600160a01b031690635335dca290612b9d908590600401612f30565b602060405180830381865afa158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190613966565b67ffffffffffffffff8416600090815260036020526040902054909150612c05908261397f565b341015612c475760405162461bcd60e51b815260206004820152601060248201526f696e73756666696369656e742066656560801b60448201526064016107ff565b600154604051634f9e72ad60e11b81526001600160a01b0390911690639f3ce55a90839061284790889088908890600401613af7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f840112612cdf57600080fd5b50813567ffffffffffffffff811115612cf757600080fd5b60208301915083602082850101111561272f57600080fd5b803567ffffffffffffffff81168114612d2757600080fd5b919050565b6001600160a01b038116811461120d57600080fd5b60008060008060008060808789031215612d5a57600080fd5b863567ffffffffffffffff80821115612d7257600080fd5b612d7e8a838b01612ccd565b9098509650869150612d9260208a01612d0f565b95506040890135915080821115612da857600080fd5b50612db589828a01612ccd565b9094509250506060870135612dc981612d2c565b809150509295509295509295565b6020810160038310612df957634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612e1157600080fd5b81356116ea81612d2c565b600080600080600060808688031215612e3457600080fd5b8535612e3f81612d2c565b945060208601359350604086013567ffffffffffffffff811115612e6257600080fd5b612e6e88828901612ccd565b9094509250506060860135612e8281612d2c565b809150509295509295909350565b600060208284031215612ea257600080fd5b6116ea82612d0f565b60008060408385031215612ebe57600080fd5b8235612ec981612d2c565b9150612ed760208401612d0f565b90509250929050565b60005b83811015612efb578181015183820152602001612ee3565b50506000910152565b60008151808452612f1c816020860160208601612ee0565b601f01601f19169290920160200192915050565b6020815260006116ea6020830184612f04565b60008083601f840112612f5557600080fd5b50813567ffffffffffffffff811115612f6d57600080fd5b6020830191508360208260051b850101111561272f57600080fd5b600080600080600060608688031215612fa057600080fd5b8535612fab81612d2c565b9450602086013567ffffffffffffffff80821115612fc857600080fd5b612fd489838a01612f43565b90965094506040880135915080821115612fed57600080fd5b50612ffa88828901612f43565b969995985093965092949392505050565b6000806000806040858703121561302157600080fd5b843567ffffffffffffffff8082111561303957600080fd5b61304588838901612f43565b9096509450602087013591508082111561305e57600080fd5b5061306b87828801612f43565b95989497509550505050565b6000806000806060858703121561308d57600080fd5b843561309881612d2c565b93506130a660208601612d0f565b9250604085013567ffffffffffffffff8111156130c257600080fd5b61306b87828801612ccd565b600080600080600080600060c0888a0312156130e957600080fd5b87356130f481612d2c565b9650602088013561310481612d2c565b95506040880135945061311960608901612d0f565b9350608088013567ffffffffffffffff81111561313557600080fd5b6131418a828b01612ccd565b90945092505060a088013561315581612d2c565b8091505092959891949750929550565b60008060008060006080868803121561317d57600080fd5b853561318881612d2c565b94506020860135935061319d60408701612d0f565b9250606086013567ffffffffffffffff8111156131b957600080fd5b612ffa88828901612ccd565b6000806000606084860312156131da57600080fd5b83356131e581612d2c565b92506131f360208501612d0f565b9150604084013561320381612d2c565b809150509250925092565b60008060006060848603121561322357600080fd5b61322c84612d0f565b9250602084013561323c81612d2c565b929592945050506040919091013590565b60008060008060006080868803121561326557600080fd5b853561327081612d2c565b945061327e60208701612d0f565b9350604086013567ffffffffffffffff811115612e6257600080fd5b600080604083850312156132ad57600080fd5b6132b683612d0f565b946020939093013593505050565b600080600080608085870312156132da57600080fd5b84356132e581612d2c565b9350602085013592506132fa60408601612d0f565b9150606085013561330a81612d2c565b939692955090935050565b6000806040838503121561332857600080fd5b61333183612d0f565b9150602083013561334181612d2c565b809150509250929050565b60008060006040848603121561336157600080fd5b61336a84612d0f565b9250602084013567ffffffffffffffff81111561338657600080fd5b61339286828701612ccd565b9497909650939450505050565b600080600080600080600060a0888a0312156133ba57600080fd5b6133c388612d0f565b965060208801356133d381612d2c565b9550604088013567ffffffffffffffff808211156133f057600080fd5b6133fc8b838c01612ccd565b909750955060608a0135945060808a013591508082111561341c57600080fd5b506134298a828b01612ccd565b989b979a50959850939692959293505050565b60008060008060008060a0878903121561345557600080fd5b61345e87612d0f565b9550602087013561346e81612d2c565b9450604087013561347e81612d2c565b935060608701359250608087013567ffffffffffffffff8111156134a157600080fd5b6134ad89828a01612ccd565b979a9699509497509295939492505050565b600181811c908216806134d357607f821691505b6020821081036134f357634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354613507816134bf565b6001828116801561351f576001811461353457613563565b60ff1984168752821515830287019450613563565b8760005260208060002060005b8581101561355a5781548a820152908401908201613541565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016135bd576135bd613595565b5060010190565b634e487b7160e01b600052604160045260246000fd5b601f82111561362057600081815260208120601f850160051c810160208610156136015750805b601f850160051c820191505b81811015610bda5782815560010161360d565b505050565b67ffffffffffffffff83111561363d5761363d6135c4565b6136518361364b83546134bf565b836135da565b6000601f841160018114613685576000851561366d5750838201355b600019600387901b1c1916600186901b178355610d49565b600083815260209020601f19861690835b828110156136b65786850135825560209485019460019092019101613696565b50868210156136d35760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038516815267ffffffffffffffff841660208201526060604082015260006108806060830184866136e5565b60006020828403121561375357600080fd5b81516116ea81612d2c565b6040516080810167ffffffffffffffff81118282101715613781576137816135c4565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156137b0576137b06135c4565b604052919050565b600067ffffffffffffffff8211156137d2576137d26135c4565b50601f01601f191660200190565b6000602082840312156137f257600080fd5b815167ffffffffffffffff81111561380957600080fd5b8201601f8101841361381a57600080fd5b805161382d613828826137b8565b613787565b81815285602083850101111561384257600080fd5b6109a0826020830160208601612ee0565b60208152600082516080602084015261386f60a0840182612f04565b90506020840151601f198085840301604086015261388d8383612f04565b9250604086015160608601526060860151915080858403016080860152506109a08282612f04565b60006001600160a01b03808a16835280891660208401525086604083015267ffffffffffffffff8616606083015260c060808301526138f860c0830185876136e5565b82810360a084015261390a8185612f04565b9a9950505050505050505050565b6020815260006001600160a01b038084511660208401528060208501511660408401525060408301516060830152606083015160808084015261395e60a0840182612f04565b949350505050565b60006020828403121561397857600080fd5b5051919050565b8082018082111561399257613992613595565b92915050565b67ffffffffffffffff841681526040602082015260006109a06040830184866136e5565b600060208083850312156139cf57600080fd5b823567ffffffffffffffff808211156139e757600080fd5b90840190608082870312156139fb57600080fd5b613a0361375e565b8235613a0e81612d2c565b815282840135613a1d81612d2c565b8185015260408381013590820152606083013582811115613a3d57600080fd5b80840193505086601f840112613a5257600080fd5b82359150613a62613828836137b8565b8281528785848601011115613a7657600080fd5b82858501868301376000858483010152806060830152508094505050505092915050565b6001600160a01b03841681528260208201526060604082015260006109a06060830184612f04565b606081526000613ad56060830186612f04565b67ffffffffffffffff8516602084015282810360408401526108808185612f04565b6001600160a01b038416815267ffffffffffffffff831660208201526060604082015260006109a06060830184612f0456fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220b858f5b10153bc66bb5164b900409fd0964426a32294f87e83a5e247222a2a4b64736f6c63430008110033

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

0000000000000000000000009bb46d5100d2db4608112026951c9c965b233f4d

-----Decoded View---------------
Arg [0] : _msgBus (address): 0x9Bb46D5100d2Db4608112026951c9C965b233f4D

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000009bb46d5100d2db4608112026951c9c965b233f4d


Deployed Bytecode Sourcemap

875:13521:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8279:399;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13873:127;;;;;;;;;;-1:-1:-1;13873:127:0;;;;;:::i;:::-;;:::i;:::-;;3906:234:2;;;;;;:::i;:::-;;:::i;1487:39:0:-;;;;;;;;;;-1:-1:-1;1487:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3160:14:10;;3153:22;3135:41;;3123:2;3108:18;1487:39:0;2995:187:10;995:43:0;;;;;;;;;;-1:-1:-1;995:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3522:25:10;;;3510:2;3495:18;995:43:0;3376:177:10;3409:98:0;;;;;;;;;;-1:-1:-1;3409:98:0;;;;;:::i;:::-;;:::i;1644:64::-;;;;;;;;;;-1:-1:-1;1644:64:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1088:44::-;;;;;;;;;;-1:-1:-1;1088:44:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1088:44:0;;;;;;-1:-1:-1;;;;;4798:55:10;;;4780:74;;4768:2;4753:18;1088:44:0;4634:226:10;12576:338:0;;;;;;;;;;-1:-1:-1;12576:338:0;;;;;:::i;:::-;;:::i;563:64:7:-;;;;;;;;;;;;;:::i;13571:229:0:-;;;;;;;;;;-1:-1:-1;13571:229:0;;;;;:::i;:::-;;:::i;633:102:7:-;;;;;;;;;;-1:-1:-1;633:102:7;;;;;:::i;:::-;-1:-1:-1;;;;;712:16:7;689:4;712:16;;;:7;:16;;;;;;;;;633:102;1595:43:0;;;;;;;;;;-1:-1:-1;1595:43:0;;;;;:::i;:::-;;:::i;242:146:1:-;;;;;;;;;;-1:-1:-1;242:146:1;;;;;:::i;:::-;;:::i;12313:230:0:-;;;;;;;;;;-1:-1:-1;12313:230:0;;;;;:::i;:::-;;:::i;3125:289:2:-;;;;;;:::i;:::-;;:::i;1098:84:8:-;;;;;;;;;;-1:-1:-1;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1098:84;;5910:610:0;;;;;;:::i;:::-;;:::i;836:95:7:-;;;;;;;;;;-1:-1:-1;836:95:7;;;;;:::i;:::-;;:::i;937:75::-;;;;;;;;;;;;;:::i;200:39::-;;;;;;;;;;-1:-1:-1;200:39:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;741:89;;;;;;;;;;-1:-1:-1;741:89:7;;;;;:::i;:::-;;:::i;497:60::-;;;;;;;;;;;;;:::i;1479:85:6:-;;;;;;;;;;-1:-1:-1;1525:7:6;1551:6;-1:-1:-1;;;;;1551:6:6;1479:85;;12059:221:0;;;;;;;;;;-1:-1:-1;12059:221:0;;;;;:::i;:::-;;:::i;14221:173::-;;;;;;;;;;;;;:::i;3986:659::-;;;;;;;;;;-1:-1:-1;3986:659:0;;;;;:::i;:::-;;:::i;7619:654::-;;;;;;:::i;:::-;;:::i;1243:65::-;;;;;;;;;;-1:-1:-1;1243:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1243:65:0;;;12941:135;;;;;;;;;;-1:-1:-1;12941:135:0;;;;;:::i;:::-;;:::i;210:25:1:-;;;;;;;;;;-1:-1:-1;210:25:1;;;;-1:-1:-1;;;;;210:25:1;;;4988:590:0;;;;;;:::i;:::-;;:::i;13126:182::-;;;;;;;;;;-1:-1:-1;13126:182:0;;;;;:::i;:::-;;:::i;14034:128::-;;;;;;;;;;-1:-1:-1;14034:128:0;;;;;:::i;:::-;;:::i;13314:191::-;;;;;;;;;;-1:-1:-1;13314:191:0;;;;;:::i;:::-;;:::i;7106:477::-;;;;;;:::i;:::-;;:::i;6576:457::-;;;;;;:::i;:::-;;:::i;1916:189:6:-;;;;;;;;;;-1:-1:-1;1916:189:6;;;;;:::i;:::-;;:::i;8279:399:0:-;294:10:2;;8476:15:0;;-1:-1:-1;;;;;294:10:2;280;:24;272:62;;;;-1:-1:-1;;;272:62:2;;14462:2:10;272:62:2;;;14444:21:10;14501:2;14481:18;;;14474:30;14540:27;14520:18;;;14513:55;14585:18;;272:62:2;;;;;;;;;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;8507:64:0::1;;;-1:-1:-1::0;8550:20:0::1;::::0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;;8540:31;;::::1;::::0;8550:20;8540:31:::1;:::i;:::-;;;;;;;;8529:6;;8519:17;;;;;;;:::i;:::-;;;;;;;;:52;;8507:64;8503:123;;;-1:-1:-1::0;8594:21:0::1;8587:28;;8503:123;8642:29;8653:8;;8663:7;8642:10;:29::i;:::-;8635:36;;344:1:2;8279:399:0::0;;;;;;;;:::o;13873:127::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;13936:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;;;;;:20;;-1:-1:-1;;13936:20:0::1;13952:4;13936:20:::0;;::::1;::::0;;;13971:22;;16774:74:10;;;16864:18;;;16857:50;13971:22:0::1;::::0;16747:18:10;13971:22:0::1;;;;;;;;13873:127:::0;:::o;3906:234:2:-;294:10;;4121:15;;-1:-1:-1;;;;;294:10:2;280;:24;272:62;;;;-1:-1:-1;;;272:62:2;;14462:2:10;272:62:2;;;14444:21:10;14501:2;14481:18;;;14474:30;14540:27;14520:18;;;14513:55;14585:18;;272:62:2;14260:349:10;272:62:2;3906:234;;;;;;;:::o;3409:98:0:-;3459:11;:9;:11::i;:::-;3480:10;:20;;-1:-1:-1;;;;;;3480:20:0;-1:-1:-1;;;;;3480:20:0;;;;;;;;;;3409:98::o;1644:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12576:338::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;12734:31:0;;::::1;12726:59;;;::::0;-1:-1:-1;;;12726:59:0;;17120:2:10;12726:59:0::1;::::0;::::1;17102:21:10::0;17159:2;17139:18;;;17132:30;17198:17;17178:18;;;17171:45;17233:18;;12726:59:0::1;16918:339:10::0;12726:59:0::1;12800:9;12795:113;12815:18:::0;;::::1;12795:113;;;12888:6;;12895:1;12888:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12854:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;12874:7;;12882:1;12874:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12854:31;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;12854:31:0;:43;;-1:-1:-1;;;;;;12854:43:0::1;-1:-1:-1::0;;;;;12854:43:0;;;::::1;::::0;;;::::1;::::0;;12835:3;::::1;::::0;::::1;:::i;:::-;;;;12795:113;;;;12576:338:::0;;;;;:::o;563:64:7:-;437:10;689:4;712:16;;;:7;:16;;;;;;;;420:53;;;;-1:-1:-1;;;420:53:7;;17868:2:10;420:53:7;;;17850:21:10;17907:2;17887:18;;;17880:30;17946:22;17926:18;;;17919:50;17986:18;;420:53:7;17666:344:10;420:53:7;610:10:::1;:8;:10::i;:::-;563:64::o:0;13571:229:0:-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;13689:9:0::1;13684:110;13704:18:::0;;::::1;13684:110;;;13768:12;;13781:1;13768:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;13743:10;:22;13754:7;;13762:1;13754:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;13743:22;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;13743:22:0;:40;;-1:-1:-1;;;;;;13743:40:0::1;-1:-1:-1::0;;;;;13743:40:0;;;::::1;::::0;;;::::1;::::0;;13724:3;::::1;::::0;::::1;:::i;:::-;;;;13684:110;;;;13571:229:::0;;;;:::o;1595:43::-;;;;;;;;;;;;;;;;:::i;242:146:1:-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;313:10:1::1;:24:::0;;-1:-1:-1;;;;;;313:24:1::1;-1:-1:-1::0;;;;;313:24:1;::::1;::::0;;::::1;::::0;;;352:29:::1;::::0;4780:74:10;;;352:29:1::1;::::0;4768:2:10;4753:18;352:29:1::1;4634:226:10::0;12313:230:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;12447:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;:29:::1;::::0;::::1;::::0;;;;;;;:38:::1;12479:6:::0;;12447:29;:38:::1;:::i;:::-;;12500:36;12512:6;12520:7;12529:6;;12500:36;;;;;;;;;:::i;:::-;;;;;;;;12313:230:::0;;;;:::o;3125:289:2:-;294:10;;3395:15;;-1:-1:-1;;;;;294:10:2;280;:24;272:62;;;;-1:-1:-1;;;272:62:2;;14462:2:10;272:62:2;;;14444:21:10;14501:2;14481:18;;;14474:30;14540:27;14520:18;;;14513:55;14585:18;;272:62:2;14260:349:10;272:62:2;3125:289;;;;;;;;;:::o;5910:610:0:-;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;6097:23:0::1;::::0;-1:-1:-1;;;6097:23:0;;::::1;::::0;::::1;3522:25:10::0;;;-1:-1:-1;;;;;6097:18:0;::::1;::::0;::::1;::::0;3495::10;;6097:23:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6083:37:0::1;:10;-1:-1:-1::0;;;;;6083:37:0::1;;6075:65;;;::::0;-1:-1:-1;;;6075:65:0;;21611:2:10;6075:65:0::1;::::0;::::1;21593:21:10::0;21650:2;21630:18;;;21623:30;-1:-1:-1;;;21669:18:10;;;21662:45;21724:18;;6075:65:0::1;21409:339:10::0;6075:65:0::1;6209:24;::::0;-1:-1:-1;;;6209:24:0;;::::1;::::0;::::1;3522:25:10::0;;;6188:18:0::1;::::0;-1:-1:-1;;;;;6209:19:0;::::1;::::0;::::1;::::0;3495:18:10;;6209:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;6209:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;6188:45;;6243:21;6254:4;6260:3;6243:10;:21::i;:::-;6275:23;6300:20:::0;6324:26:::1;6335:4;6341:8;6324:10;:26::i;:::-;6274:76;;;;6360:80;6367:10;6379:8;6400:38;;;;;;;;6408:9;;6400:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;6400:38:0;;;-1:-1:-1;6400:38:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;6389:50;;::::1;::::0;;::::1;;:::i;:::-;;;;;;;;;;;;;6360:6;:80::i;:::-;6455:58;6461:10;6473:4;6479:3;6484:8;6494:9;;6505:7;6455:58;;;;;;;;;;;;:::i;:::-;;;;;;;;6065:455;;;5910:610:::0;;;;;:::o;836:95:7:-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;902:22:7::1;916:7;902:13;:22::i;:::-;836:95:::0;:::o;937:75::-;980:25;994:10;980:13;:25::i;741:89::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;804:19:7::1;815:7;804:10;:19::i;497:60::-:0;437:10;689:4;712:16;;;:7;:16;;;;;;;;420:53;;;;-1:-1:-1;;;420:53:7;;17868:2:10;420:53:7;;;17850:21:10;17907:2;17887:18;;;17880:30;17946:22;17926:18;;;17919:50;17986:18;;420:53:7;17666:344:10;420:53:7;542:8:::1;:6;:8::i;12059:221:0:-:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;12186:19:0;;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;:28:::1;::::0;::::1;::::0;;;;;;;;;;:37;;-1:-1:-1;;;;;;12186:37:0::1;::::0;;::::1;::::0;;::::1;::::0;;12238:35;;24992:34:10;;;25042:18;;;25035:59;;;;25110:18;;25103:43;;;;12238:35:0::1;::::0;24919:2:10;24904:18;12238:35:0::1;;;;;;;;12059:221:::0;;;:::o;14221:173::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;14318:36:0::1;::::0;14287:21:::1;::::0;14326:10:::1;::::0;14318:36;::::1;;;::::0;14287:21;;14270:14:::1;14318:36:::0;14270:14;14318:36;14287:21;14326:10;14318:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;14369:18:0::1;::::0;3522:25:10;;;14369:18:0::1;::::0;3510:2:10;3495:18;14369::0::1;3376:177:10::0;3986:659:0;4141:24;;-1:-1:-1;;;4141:24:0;;;;;3522:25:10;;;4101:7:0;;;;-1:-1:-1;;;;;4141:19:0;;;;;3495:18:10;;4141:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4141:24:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4256:18:0;;4234:19;4256:18;;;:12;:18;;;;;;;;:28;;;;;;;;;;4234:50;;4120:45;;-1:-1:-1;4175:20:0;;4234:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4314:1;4298:6;:13;:17;4294:266;;;4352:34;;;;;;;;4360:6;4352:34;;;;4368:6;4352:34;;;;4376:3;4352:34;;;;4381:4;4352:34;;;4341:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;4331:56;;4294:266;;;4519:29;;;;;;;;4526:4;-1:-1:-1;;;;;4519:29:0;;;;;4532:4;-1:-1:-1;;;;;4519:29:0;;;;;4538:3;4519:29;;;;4543:4;4519:29;;;4508:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;4498:51;;4294:266;4619:19;;;;;;;:9;:19;;;;;;;;4588:10;;4576:40;;-1:-1:-1;;;4576:40:0;;4619:19;;-1:-1:-1;;;;;4588:10:0;;4576:31;;:40;;4608:7;;4576:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;4569:69;;;;;3986:659;;;;;;:::o;7619:654::-;294:10:2;;7809:15:0;;-1:-1:-1;;;;;294:10:2;280;:24;272:62;;;;-1:-1:-1;;;272:62:2;;14462:2:10;272:62:2;;;14444:21:10;14501:2;14481:18;;;14474:30;14540:27;14520:18;;;14513:55;14585:18;;272:62:2;14260:349:10;272:62:2;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;8125:41:0::1;;;-1:-1:-1::0;8147:19:0::1;::::0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;-1:-1:-1;;;;;8137:29:0;;::::1;8147:19:::0;::::1;8137:29;;8125:41;8121:100;;;-1:-1:-1::0;8189:21:0::1;8182:28;;8121:100;8237:29;8248:8;;8258:7;8237:10;:29::i;12941:135::-:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;13014:15:0::1;::::0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;;:21;;;13050:19;;26244:50:10;;;26310:18;;26303:34;;;13050:19:0::1;::::0;26217:18:10;13050:19:0::1;;;;;;;;12941:135:::0;;:::o;4988:590::-;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;5168:23:0::1;::::0;-1:-1:-1;;;5168:23:0;;::::1;::::0;::::1;3522:25:10::0;;;-1:-1:-1;;;;;5168:18:0;::::1;::::0;::::1;::::0;3495::10;;5168:23:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5154:37:0::1;:10;-1:-1:-1::0;;;;;5154:37:0::1;;5146:65;;;::::0;-1:-1:-1;;;5146:65:0;;21611:2:10;5146:65:0::1;::::0;::::1;21593:21:10::0;21650:2;21630:18;;;21623:30;-1:-1:-1;;;21669:18:10;;;21662:45;21724:18;;5146:65:0::1;21409:339:10::0;5146:65:0::1;5280:24;::::0;-1:-1:-1;;;5280:24:0;;::::1;::::0;::::1;3522:25:10::0;;;5259:18:0::1;::::0;-1:-1:-1;;;;;5280:19:0;::::1;::::0;::::1;::::0;3495:18:10;;5280:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;5280:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;5259:45;;5314:21;5325:4;5331:3;5314:10;:21::i;:::-;5346:18;5366:15:::0;5385:25:::1;5395:4;5401:8;5385:9;:25::i;:::-;5345:65;;;;5420:79;5427:10;5439:8;5460:37;;;;;;;;5467:9;-1:-1:-1::0;;;;;5460:37:0::1;;;;;5478:7;-1:-1:-1::0;;;;;5460:37:0::1;;;;;5487:3;5460:37;;;;5492:4;5460:37;;::::0;5449:49:::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;5420:6;:79::i;:::-;5514:57;::::0;;5519:10:::1;26694:34:10::0;;-1:-1:-1;;;;;26764:15:10;;;26759:2;26744:18;;26737:43;26796:18;;;26789:34;;;26871:18;26859:31;;26854:2;26839:18;;26832:59;26928:15;;;26922:3;26907:19;;26900:44;26981:15;;26975:3;26960:19;;26953:44;5514:57:0;;::::1;::::0;;;;26620:3:10;5514:57:0;;::::1;5136:442;;;4988:590:::0;;;;:::o;13126:182::-;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;13216:19:0::1;::::0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;;;;:34;;-1:-1:-1;;;;;;13216:34:0::1;-1:-1:-1::0;;;;;13216:34:0;::::1;::::0;;::::1;::::0;;;13265:36;;27180:50:10;;;27246:18;;;27239:83;13265:36:0::1;::::0;27153:18:10;13265:36:0::1;27008:320:10::0;14034:128:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;14104:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;;;;14097:20;;-1:-1:-1;;14097:20:0::1;::::0;;14132:23;;16774:74:10;;;16864:18;;;16857:50;;;;14132:23:0::1;::::0;16747:18:10;14132:23:0::1;16606:307:10::0;13314:191:0;1702:10:6;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;13411:20:0::1;::::0;::::1;;::::0;;;:11:::1;:20;::::0;;;;:35:::1;13434:12:::0;;13411:20;:35:::1;:::i;:::-;;13461:37;13476:7;13485:12;;13461:37;;;;;;;;:::i;7106:477::-:0;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;7320:10:0::1;7305:12;::::0;7390:26:::1;7320:10:::0;7407:8;7390:10:::1;:26::i;:::-;7340:76;;;;7426:80;7433:10;7445:8;7466:38;;;;;;;;7474:9;;7466:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;7466:38:0;;;-1:-1:-1;7466:38:0::1;::::0;;::::1;::::0;;;;;;;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;7499:4;;;;;;7466:38;::::1;7499:4:::0;;;;7466:38;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;;7466:38:0;;-1:-1:-1;7455:50:0::1;::::0;::::1;::::0;;::::1;;;:::i;7426:80::-;7521:55;7527:7;7536:4;7542:3;7547:8;7557:9;;7568:7;7521:55;;;;;;;;;;;;:::i;:::-;;;;;;;;7295:288;;;7106:477:::0;;;;;;;:::o;6576:457::-;1168:7:8;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;6783:10:0::1;6768:12;::::0;6843:25:::1;6783:10:::0;6859:8;6843:9:::1;:25::i;:::-;6803:65;;;;6878:79;6885:10;6897:8;6918:37;;;;;;;;6925:9;-1:-1:-1::0;;;;;6918:37:0::1;;;;;6936:7;-1:-1:-1::0;;;;;6918:37:0::1;;;;;6945:3;6918:37;;;;6950:4;;6918:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;6918:37:0;;-1:-1:-1;6907:49:0::1;::::0;::::1;::::0;;::::1;;;:::i;6878:79::-;6972:54;::::0;;-1:-1:-1;;;;;26712:15:10;;;26694:34;;26764:15;;;26759:2;26744:18;;26737:43;26796:18;;;26789:34;;;26871:18;26859:31;;26854:2;26839:18;;26832:59;26928:15;;;26922:3;26907:19;;26900:44;26981:15;;26975:3;26960:19;;26953:44;6972:54:0;;::::1;::::0;;;;26620:3:10;6972:54:0;;::::1;6758:275;;;6576:457:::0;;;;;;:::o;1916:189:6:-;1702:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:6;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:6;;1683:66;;;;-1:-1:-1;;;1683:66:6;;16447:2:10;1683:66:6;;;16429:21:10;;;16466:18;;;16459:30;-1:-1:-1;;;;;;;;;;;16505:18:10;;;16498:62;16577:18;;1683:66:6;16245:356:10;1683:66:6;-1:-1:-1;;;;;2004:22:6;::::1;1996:73;;;::::0;-1:-1:-1;;;1996:73:6;;27878:2:10;1996:73:6::1;::::0;::::1;27860:21:10::0;27917:2;27897:18;;;27890:30;27956:34;27936:18;;;27929:62;28027:8;28007:18;;;28000:36;28053:19;;1996:73:6::1;27676:402:10::0;1996:73:6::1;2079:19;2089:8;2079:9;:19::i;9179:1263:0:-:0;9258:15;;9424:32;;;;9436:8;9424:32;:::i;:::-;9628:10;;;;;-1:-1:-1;;;;;9620:19:0;;;;;:7;:19;;;;;;;9401:55;;-1:-1:-1;9620:19:0;;:27;;:19;:27;9616:712;;9672:10;;;;9712:11;;9725:9;;;;;9667:68;;-1:-1:-1;;;9667:68:0;;9705:4;9667:68;;;29649:34:10;-1:-1:-1;;;;;29719:15:10;;;29699:18;;;29692:43;29751:18;;;29744:34;;;;9667:29:0;;;;;29561:18:10;;9667:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9663:315;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9895:22;9906:10;9895:22;;;;;;:::i;:::-;;;;;;;;9942:21;9935:28;;;;;;9663:315;9616:712;;;10017:10;;;;10040:11;;10053:9;;;;;10064:10;;;;10012:63;;-1:-1:-1;;;10012:63:0;;-1:-1:-1;;;;;10012:27:0;;;;;;:63;;10040:11;;10053:9;10012:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10008:310;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10351:11;;10364:10;;;;;10376:9;;;;;10342:53;;-1:-1:-1;;;;;30512:15:10;;;30494:34;;30564:15;;;;30544:18;;;30537:43;;;;30596:18;;;30589:34;30671:18;30659:31;;30654:2;30639:18;;30632:59;10342:53:0;;;;;;30420:3:10;10342:53:0;;;-1:-1:-1;10412:23:0;;9179:1263;-1:-1:-1;;;;9179:1263:0:o;1275:128:6:-;1341:1;1323:6;-1:-1:-1;;;;;1323:6:6;:20;1315:50;;;;-1:-1:-1;;;1315:50:6;;30904:2:10;1315:50:6;;;30886:21:10;30943:2;30923:18;;;30916:30;30982:19;30962:18;;;30955:47;31019:18;;1315:50:6;30702:341:10;1315:50:6;1375:21;1385:10;1375:9;:21::i;2110:117:8:-;1168:7;;-1:-1:-1;;;1168:7:8;;;;1669:41;;;;-1:-1:-1;;;1669:41:8;;31250:2:10;1669:41:8;;;31232:21:10;31289:2;31269:18;;;31262:30;31328:22;31308:18;;;31301:50;31368:18;;1669:41:8;31048:344:10;1669:41:8;2168:7:::1;:15:::0;;-1:-1:-1;;;;2168:15:8::1;::::0;;2198:22:::1;719:10:9::0;2207:12:8::1;2198:22;::::0;-1:-1:-1;;;;;4798:55:10;;;4780:74;;4768:2;4753:18;2198:22:8::1;;;;;;;2110:117::o:0;8745:359:0:-;-1:-1:-1;;;;;8815:13:0;;;;;;:7;:13;;;;;;;;:21;;:13;:21;8811:287;;8875:55;;-1:-1:-1;;;8875:55:0;;8899:10;8875:55;;;29649:34:10;8919:4:0;29699:18:10;;;29692:43;29751:18;;;29744:34;;;-1:-1:-1;;;;;8875:23:0;;;;;29561:18:10;;8875:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8952:23:0;;-1:-1:-1;;;8952:23:0;;;;;3522:25:10;;;8987:4:0;;-1:-1:-1;;;;;;8952:18:0;;;-1:-1:-1;8952:18:0;;3495::10;;8952:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8952:40:0;;8944:72;;;;-1:-1:-1;;;8944:72:0;;31599:2:10;8944:72:0;;;31581:21:10;31638:2;31618:18;;;31611:30;31677:21;31657:18;;;31650:49;31716:18;;8944:72:0;31397:343:10;8944:72:0;8745:359;;:::o;8811:287::-;9067:20;;-1:-1:-1;;;9067:20:0;;;;;3522:25:10;;;-1:-1:-1;;;;;9067:15:0;;;;;3495:18:10;;9067:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10859:372;11028:21;;;;;;;:11;:21;;;;;11016:33;;10957:22;;;;11016:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11067:9;:16;11087:1;11067:21;11059:59;;;;-1:-1:-1;;;11059:59:0;;31947:2:10;11059:59:0;;;31929:21:10;31986:2;31966:18;;;31959:30;32025:27;32005:18;;;31998:55;32070:18;;11059:59:0;31745:349:10;11059:59:0;-1:-1:-1;;;;;11137:18:0;;;;;;:12;:18;;;;;;;;:28;;;;;;;;;;11128:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11183:6;:13;11200:1;11183:18;11175:49;;;;-1:-1:-1;;;11175:49:0;;32301:2:10;11175:49:0;;;32283:21:10;32340:2;32320:18;;;32313:30;32379:20;32359:18;;;32352:48;32417:18;;11175:49:0;32099:342:10;11175:49:0;10859:372;;;;;:::o;11638:355::-;11793:10;;11781:40;;-1:-1:-1;;;11781:40:0;;11767:11;;-1:-1:-1;;;;;11793:10:0;;11781:31;;:40;;11813:7;;11781:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11858:19;;;;;;;:9;:19;;;;;;11767:54;;-1:-1:-1;11852:25:0;;11767:54;11852:25;:::i;:::-;11839:9;:38;;11831:67;;;;-1:-1:-1;;;11831:67:0;;32648:2:10;11831:67:0;;;32630:21:10;32687:2;32667:18;;;32660:30;-1:-1:-1;;;32706:18:10;;;32699:46;32762:18;;11831:67:0;32446:340:10;11831:67:0;11920:10;;11908:78;;-1:-1:-1;;;11908:78:0;;-1:-1:-1;;;;;11920:10:0;;;;11908:35;;11951:3;;11908:78;;11956:10;;11968:8;;11978:7;;11908:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11757:236;11638:355;;;:::o;1210:187:7:-;-1:-1:-1;;;;;712:16:7;;689:4;712:16;;;:7;:16;;;;;;;;1268:51;;;;-1:-1:-1;;;1268:51:7;;33470:2:10;1268:51:7;;;33452:21:10;33509:2;33489:18;;;33482:30;33548:23;33528:18;;;33521:51;33589:18;;1268:51:7;33268:345:10;1268:51:7;-1:-1:-1;;;;;1329:16:7;;1348:5;1329:16;;;:7;:16;;;;;;;;;:24;;-1:-1:-1;;1329:24:7;;;1368:22;;4780:74:10;;;1368:22:7;;4753:18:10;1368:22:7;4634:226:10;1018:186:7;-1:-1:-1;;;;;712:16:7;;689:4;712:16;;;:7;:16;;;;;;;;1081:18;1073:56;;;;-1:-1:-1;;;1073:56:7;;33820:2:10;1073:56:7;;;33802:21:10;33859:2;33839:18;;;33832:30;33898:27;33878:18;;;33871:55;33943:18;;1073:56:7;33618:349:10;1073:56:7;-1:-1:-1;;;;;1139:16:7;;;;;;:7;:16;;;;;;;;;:23;;-1:-1:-1;;1139:23:7;1158:4;1139:23;;;1177:20;;4780:74:10;;;1177:20:7;;4753:18:10;1177:20:7;4634:226:10;1863:115:8;1168:7;;-1:-1:-1;;;1168:7:8;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:8;;21010:2:10;1403:38:8;;;20992:21:10;21049:2;21029:18;;;21022:30;-1:-1:-1;;;21068:18:10;;;21061:46;21124:18;;1403:38:8;20808:340:10;1403:38:8;1932:4:::1;1922:14:::0;;-1:-1:-1;;;;1922:14:8::1;-1:-1:-1::0;;;1922:14:8::1;::::0;;1951:20:::1;1958:12;719:10:9::0;;640:96;10518:335:0;10648:20;;;10591:17;10648:20;;;:10;:20;;;;;;-1:-1:-1;;;;;10648:20:0;;;10678:61;;;;-1:-1:-1;;;10678:61:0;;31947:2:10;10678:61:0;;;31929:21:10;31986:2;31966:18;;;31959:30;32025:27;32005:18;;;31998:55;32070:18;;10678:61:0;31745:349:10;10678:61:0;-1:-1:-1;;;;;;10758:17:0;;;;;;;:11;:17;;;;;;;;:27;;;;;;;;;;;;;10795:51;;;;-1:-1:-1;;;10795:51:0;;32301:2:10;10795:51:0;;;32283:21:10;32340:2;32320:18;;;32313:30;32379:20;32359:18;;;32352:48;32417:18;;10795:51:0;32099:342:10;11282:350:0;11432:10;;11420:40;;-1:-1:-1;;;11420:40:0;;11406:11;;-1:-1:-1;;;;;11432:10:0;;11420:31;;:40;;11452:7;;11420:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11497:19;;;;;;;:9;:19;;;;;;11406:54;;-1:-1:-1;11491:25:0;;11406:54;11491:25;:::i;:::-;11478:9;:38;;11470:67;;;;-1:-1:-1;;;11470:67:0;;32648:2:10;11470:67:0;;;32630:21:10;32687:2;32667:18;;;32660:30;-1:-1:-1;;;32706:18:10;;;32699:46;32762:18;;11470:67:0;32446:340:10;11470:67:0;11559:10;;11547:78;;-1:-1:-1;;;11547:78:0;;-1:-1:-1;;;;;11559:10:0;;;;11547:35;;11590:3;;11547:78;;11595:10;;11607:8;;11617:7;;11547:78;;;:::i;2111:169:6:-;2166:16;2185:6;;-1:-1:-1;;;;;2201:17:6;;;-1:-1:-1;;;;;;2201:17:6;;;;;;2233:40;;2185:6;;;;;;;2233:40;;2166:16;2233:40;2156:124;2111:169;:::o;14:347:10:-;65:8;75:6;129:3;122:4;114:6;110:17;106:27;96:55;;147:1;144;137:12;96:55;-1:-1:-1;170:20:10;;213:18;202:30;;199:50;;;245:1;242;235:12;199:50;282:4;274:6;270:17;258:29;;334:3;327:4;318:6;310;306:19;302:30;299:39;296:59;;;351:1;348;341:12;366:171;433:20;;493:18;482:30;;472:41;;462:69;;527:1;524;517:12;462:69;366:171;;;:::o;542:154::-;-1:-1:-1;;;;;621:5:10;617:54;610:5;607:65;597:93;;686:1;683;676:12;701:925;808:6;816;824;832;840;848;901:3;889:9;880:7;876:23;872:33;869:53;;;918:1;915;908:12;869:53;958:9;945:23;987:18;1028:2;1020:6;1017:14;1014:34;;;1044:1;1041;1034:12;1014:34;1083:58;1133:7;1124:6;1113:9;1109:22;1083:58;:::i;:::-;1160:8;;-1:-1:-1;1057:84:10;-1:-1:-1;1057:84:10;;-1:-1:-1;1214:37:10;1247:2;1232:18;;1214:37;:::i;:::-;1204:47;;1304:2;1293:9;1289:18;1276:32;1260:48;;1333:2;1323:8;1320:16;1317:36;;;1349:1;1346;1339:12;1317:36;;1388:60;1440:7;1429:8;1418:9;1414:24;1388:60;:::i;:::-;1467:8;;-1:-1:-1;1362:86:10;-1:-1:-1;;1552:2:10;1537:18;;1524:32;1565:31;1524:32;1565:31;:::i;:::-;1615:5;1605:15;;;701:925;;;;;;;;:::o;1631:348::-;1783:2;1768:18;;1816:1;1805:13;;1795:144;;1861:10;1856:3;1852:20;1849:1;1842:31;1896:4;1893:1;1886:15;1924:4;1921:1;1914:15;1795:144;1948:25;;;1631:348;:::o;1984:247::-;2043:6;2096:2;2084:9;2075:7;2071:23;2067:32;2064:52;;;2112:1;2109;2102:12;2064:52;2151:9;2138:23;2170:31;2195:5;2170:31;:::i;2236:754::-;2333:6;2341;2349;2357;2365;2418:3;2406:9;2397:7;2393:23;2389:33;2386:53;;;2435:1;2432;2425:12;2386:53;2474:9;2461:23;2493:31;2518:5;2493:31;:::i;:::-;2543:5;-1:-1:-1;2595:2:10;2580:18;;2567:32;;-1:-1:-1;2650:2:10;2635:18;;2622:32;2677:18;2666:30;;2663:50;;;2709:1;2706;2699:12;2663:50;2748:58;2798:7;2789:6;2778:9;2774:22;2748:58;:::i;:::-;2825:8;;-1:-1:-1;2722:84:10;-1:-1:-1;;2912:2:10;2897:18;;2884:32;2925:33;2884:32;2925:33;:::i;:::-;2977:7;2967:17;;;2236:754;;;;;;;;:::o;3187:184::-;3245:6;3298:2;3286:9;3277:7;3273:23;3269:32;3266:52;;;3314:1;3311;3304:12;3266:52;3337:28;3355:9;3337:28;:::i;3558:319::-;3625:6;3633;3686:2;3674:9;3665:7;3661:23;3657:32;3654:52;;;3702:1;3699;3692:12;3654:52;3741:9;3728:23;3760:31;3785:5;3760:31;:::i;:::-;3810:5;-1:-1:-1;3834:37:10;3867:2;3852:18;;3834:37;:::i;:::-;3824:47;;3558:319;;;;;:::o;3882:250::-;3967:1;3977:113;3991:6;3988:1;3985:13;3977:113;;;4067:11;;;4061:18;4048:11;;;4041:39;4013:2;4006:10;3977:113;;;-1:-1:-1;;4124:1:10;4106:16;;4099:27;3882:250::o;4137:270::-;4178:3;4216:5;4210:12;4243:6;4238:3;4231:19;4259:76;4328:6;4321:4;4316:3;4312:14;4305:4;4298:5;4294:16;4259:76;:::i;:::-;4389:2;4368:15;-1:-1:-1;;4364:29:10;4355:39;;;;4396:4;4351:50;;4137:270;-1:-1:-1;;4137:270:10:o;4412:217::-;4559:2;4548:9;4541:21;4522:4;4579:44;4619:2;4608:9;4604:18;4596:6;4579:44;:::i;4865:366::-;4927:8;4937:6;4991:3;4984:4;4976:6;4972:17;4968:27;4958:55;;5009:1;5006;4999:12;4958:55;-1:-1:-1;5032:20:10;;5075:18;5064:30;;5061:50;;;5107:1;5104;5097:12;5061:50;5144:4;5136:6;5132:17;5120:29;;5204:3;5197:4;5187:6;5184:1;5180:14;5172:6;5168:27;5164:38;5161:47;5158:67;;;5221:1;5218;5211:12;5236:905;5366:6;5374;5382;5390;5398;5451:2;5439:9;5430:7;5426:23;5422:32;5419:52;;;5467:1;5464;5457:12;5419:52;5506:9;5493:23;5525:31;5550:5;5525:31;:::i;:::-;5575:5;-1:-1:-1;5631:2:10;5616:18;;5603:32;5654:18;5684:14;;;5681:34;;;5711:1;5708;5701:12;5681:34;5750:69;5811:7;5802:6;5791:9;5787:22;5750:69;:::i;:::-;5838:8;;-1:-1:-1;5724:95:10;-1:-1:-1;5926:2:10;5911:18;;5898:32;;-1:-1:-1;5942:16:10;;;5939:36;;;5971:1;5968;5961:12;5939:36;;6010:71;6073:7;6062:8;6051:9;6047:24;6010:71;:::i;:::-;5236:905;;;;-1:-1:-1;5236:905:10;;-1:-1:-1;6100:8:10;;5984:97;5236:905;-1:-1:-1;;;5236:905:10:o;6146:770::-;6267:6;6275;6283;6291;6344:2;6332:9;6323:7;6319:23;6315:32;6312:52;;;6360:1;6357;6350:12;6312:52;6400:9;6387:23;6429:18;6470:2;6462:6;6459:14;6456:34;;;6486:1;6483;6476:12;6456:34;6525:69;6586:7;6577:6;6566:9;6562:22;6525:69;:::i;:::-;6613:8;;-1:-1:-1;6499:95:10;-1:-1:-1;6701:2:10;6686:18;;6673:32;;-1:-1:-1;6717:16:10;;;6714:36;;;6746:1;6743;6736:12;6714:36;;6785:71;6848:7;6837:8;6826:9;6822:24;6785:71;:::i;:::-;6146:770;;;;-1:-1:-1;6875:8:10;-1:-1:-1;;;;6146:770:10:o;6921:616::-;7008:6;7016;7024;7032;7085:2;7073:9;7064:7;7060:23;7056:32;7053:52;;;7101:1;7098;7091:12;7053:52;7140:9;7127:23;7159:31;7184:5;7159:31;:::i;:::-;7209:5;-1:-1:-1;7233:37:10;7266:2;7251:18;;7233:37;:::i;:::-;7223:47;;7321:2;7310:9;7306:18;7293:32;7348:18;7340:6;7337:30;7334:50;;;7380:1;7377;7370:12;7334:50;7419:58;7469:7;7460:6;7449:9;7445:22;7419:58;:::i;7542:969::-;7656:6;7664;7672;7680;7688;7696;7704;7757:3;7745:9;7736:7;7732:23;7728:33;7725:53;;;7774:1;7771;7764:12;7725:53;7813:9;7800:23;7832:31;7857:5;7832:31;:::i;:::-;7882:5;-1:-1:-1;7939:2:10;7924:18;;7911:32;7952:33;7911:32;7952:33;:::i;:::-;8004:7;-1:-1:-1;8058:2:10;8043:18;;8030:32;;-1:-1:-1;8081:37:10;8114:2;8099:18;;8081:37;:::i;:::-;8071:47;;8169:3;8158:9;8154:19;8141:33;8197:18;8189:6;8186:30;8183:50;;;8229:1;8226;8219:12;8183:50;8268:58;8318:7;8309:6;8298:9;8294:22;8268:58;:::i;:::-;8345:8;;-1:-1:-1;8242:84:10;-1:-1:-1;;8432:3:10;8417:19;;8404:33;8446;8404;8446;:::i;:::-;8498:7;8488:17;;;7542:969;;;;;;;;;;:::o;8516:685::-;8612:6;8620;8628;8636;8644;8697:3;8685:9;8676:7;8672:23;8668:33;8665:53;;;8714:1;8711;8704:12;8665:53;8753:9;8740:23;8772:31;8797:5;8772:31;:::i;:::-;8822:5;-1:-1:-1;8874:2:10;8859:18;;8846:32;;-1:-1:-1;8897:37:10;8930:2;8915:18;;8897:37;:::i;:::-;8887:47;;8985:2;8974:9;8970:18;8957:32;9012:18;9004:6;9001:30;8998:50;;;9044:1;9041;9034:12;8998:50;9083:58;9133:7;9124:6;9113:9;9109:22;9083:58;:::i;9206:460::-;9282:6;9290;9298;9351:2;9339:9;9330:7;9326:23;9322:32;9319:52;;;9367:1;9364;9357:12;9319:52;9406:9;9393:23;9425:31;9450:5;9425:31;:::i;:::-;9475:5;-1:-1:-1;9499:37:10;9532:2;9517:18;;9499:37;:::i;:::-;9489:47;;9588:2;9577:9;9573:18;9560:32;9601:33;9626:7;9601:33;:::i;:::-;9653:7;9643:17;;;9206:460;;;;;:::o;9671:387::-;9747:6;9755;9763;9816:2;9804:9;9795:7;9791:23;9787:32;9784:52;;;9832:1;9829;9822:12;9784:52;9855:28;9873:9;9855:28;:::i;:::-;9845:38;;9933:2;9922:9;9918:18;9905:32;9946:31;9971:5;9946:31;:::i;:::-;9671:387;;9996:5;;-1:-1:-1;;;10048:2:10;10033:18;;;;10020:32;;9671:387::o;10063:758::-;10159:6;10167;10175;10183;10191;10244:3;10232:9;10223:7;10219:23;10215:33;10212:53;;;10261:1;10258;10251:12;10212:53;10300:9;10287:23;10319:31;10344:5;10319:31;:::i;:::-;10369:5;-1:-1:-1;10393:37:10;10426:2;10411:18;;10393:37;:::i;:::-;10383:47;;10481:2;10470:9;10466:18;10453:32;10508:18;10500:6;10497:30;10494:50;;;10540:1;10537;10530:12;10826:252;10893:6;10901;10954:2;10942:9;10933:7;10929:23;10925:32;10922:52;;;10970:1;10967;10960:12;10922:52;10993:28;11011:9;10993:28;:::i;:::-;10983:38;11068:2;11053:18;;;;11040:32;;-1:-1:-1;;;10826:252:10:o;11083:529::-;11168:6;11176;11184;11192;11245:3;11233:9;11224:7;11220:23;11216:33;11213:53;;;11262:1;11259;11252:12;11213:53;11301:9;11288:23;11320:31;11345:5;11320:31;:::i;:::-;11370:5;-1:-1:-1;11422:2:10;11407:18;;11394:32;;-1:-1:-1;11445:37:10;11478:2;11463:18;;11445:37;:::i;:::-;11435:47;;11534:2;11523:9;11519:18;11506:32;11547:33;11572:7;11547:33;:::i;:::-;11083:529;;;;-1:-1:-1;11083:529:10;;-1:-1:-1;;11083:529:10:o;11617:319::-;11684:6;11692;11745:2;11733:9;11724:7;11720:23;11716:32;11713:52;;;11761:1;11758;11751:12;11713:52;11784:28;11802:9;11784:28;:::i;:::-;11774:38;;11862:2;11851:9;11847:18;11834:32;11875:31;11900:5;11875:31;:::i;:::-;11925:5;11915:15;;;11617:319;;;;;:::o;11941:481::-;12019:6;12027;12035;12088:2;12076:9;12067:7;12063:23;12059:32;12056:52;;;12104:1;12101;12094:12;12056:52;12127:28;12145:9;12127:28;:::i;:::-;12117:38;;12206:2;12195:9;12191:18;12178:32;12233:18;12225:6;12222:30;12219:50;;;12265:1;12262;12255:12;12219:50;12304:58;12354:7;12345:6;12334:9;12330:22;12304:58;:::i;:::-;11941:481;;12381:8;;-1:-1:-1;12278:84:10;;-1:-1:-1;;;;11941:481:10:o;12427:995::-;12544:6;12552;12560;12568;12576;12584;12592;12645:3;12633:9;12624:7;12620:23;12616:33;12613:53;;;12662:1;12659;12652:12;12613:53;12685:28;12703:9;12685:28;:::i;:::-;12675:38;;12763:2;12752:9;12748:18;12735:32;12776:31;12801:5;12776:31;:::i;:::-;12826:5;-1:-1:-1;12882:2:10;12867:18;;12854:32;12905:18;12935:14;;;12932:34;;;12962:1;12959;12952:12;12932:34;13001:58;13051:7;13042:6;13031:9;13027:22;13001:58;:::i;:::-;13078:8;;-1:-1:-1;12975:84:10;-1:-1:-1;13160:2:10;13145:18;;13132:32;;-1:-1:-1;13217:3:10;13202:19;;13189:33;;-1:-1:-1;13234:16:10;;;13231:36;;;13263:1;13260;13253:12;13231:36;;13302:60;13354:7;13343:8;13332:9;13328:24;13302:60;:::i;:::-;12427:995;;;;-1:-1:-1;12427:995:10;;-1:-1:-1;12427:995:10;;;;13276:86;;-1:-1:-1;;;12427:995:10:o;13427:828::-;13533:6;13541;13549;13557;13565;13573;13626:3;13614:9;13605:7;13601:23;13597:33;13594:53;;;13643:1;13640;13633:12;13594:53;13666:28;13684:9;13666:28;:::i;:::-;13656:38;;13744:2;13733:9;13729:18;13716:32;13757:31;13782:5;13757:31;:::i;:::-;13807:5;-1:-1:-1;13864:2:10;13849:18;;13836:32;13877:33;13836:32;13877:33;:::i;:::-;13929:7;-1:-1:-1;13983:2:10;13968:18;;13955:32;;-1:-1:-1;14038:3:10;14023:19;;14010:33;14066:18;14055:30;;14052:50;;;14098:1;14095;14088:12;14052:50;14137:58;14187:7;14178:6;14167:9;14163:22;14137:58;:::i;:::-;13427:828;;;;-1:-1:-1;13427:828:10;;-1:-1:-1;13427:828:10;;14214:8;;13427:828;-1:-1:-1;;;13427:828:10:o;14614:380::-;14693:1;14689:12;;;;14736;;;14757:61;;14811:4;14803:6;14799:17;14789:27;;14757:61;14864:2;14856:6;14853:14;14833:18;14830:38;14827:161;;14910:10;14905:3;14901:20;14898:1;14891:31;14945:4;14942:1;14935:15;14973:4;14970:1;14963:15;14827:161;;14614:380;;;:::o;15124:840::-;15250:3;15279:1;15312:6;15306:13;15342:36;15368:9;15342:36;:::i;:::-;15397:1;15414:18;;;15441:133;;;;15588:1;15583:356;;;;15407:532;;15441:133;-1:-1:-1;;15474:24:10;;15462:37;;15547:14;;15540:22;15528:35;;15519:45;;;-1:-1:-1;15441:133:10;;15583:356;15614:6;15611:1;15604:17;15644:4;15689:2;15686:1;15676:16;15714:1;15728:165;15742:6;15739:1;15736:13;15728:165;;;15820:14;;15807:11;;;15800:35;15863:16;;;;15757:10;;15728:165;;;15732:3;;;15922:6;15917:3;15913:16;15906:23;;15407:532;-1:-1:-1;15955:3:10;;15124:840;-1:-1:-1;;;;;;15124:840:10:o;15969:271::-;16152:6;16144;16139:3;16126:33;16108:3;16178:16;;16203:13;;;16178:16;15969:271;-1:-1:-1;15969:271:10:o;17262:127::-;17323:10;17318:3;17314:20;17311:1;17304:31;17354:4;17351:1;17344:15;17378:4;17375:1;17368:15;17394:127;17455:10;17450:3;17446:20;17443:1;17436:31;17486:4;17483:1;17476:15;17510:4;17507:1;17500:15;17526:135;17565:3;17586:17;;;17583:43;;17606:18;;:::i;:::-;-1:-1:-1;17653:1:10;17642:13;;17526:135::o;18015:127::-;18076:10;18071:3;18067:20;18064:1;18057:31;18107:4;18104:1;18097:15;18131:4;18128:1;18121:15;18147:544;18248:2;18243:3;18240:11;18237:448;;;18284:1;18309:5;18305:2;18298:17;18354:4;18350:2;18340:19;18424:2;18412:10;18408:19;18405:1;18401:27;18395:4;18391:38;18460:4;18448:10;18445:20;18442:47;;;-1:-1:-1;18483:4:10;18442:47;18538:2;18533:3;18529:12;18526:1;18522:20;18516:4;18512:31;18502:41;;18593:82;18611:2;18604:5;18601:13;18593:82;;;18656:17;;;18637:1;18626:13;18593:82;;18237:448;18147:544;;;:::o;18867:1202::-;18989:18;18984:3;18981:27;18978:53;;;19011:18;;:::i;:::-;19040:93;19129:3;19089:38;19121:4;19115:11;19089:38;:::i;:::-;19083:4;19040:93;:::i;:::-;19159:1;19184:2;19179:3;19176:11;19201:1;19196:615;;;;19855:1;19872:3;19869:93;;;-1:-1:-1;19928:19:10;;;19915:33;19869:93;-1:-1:-1;;18824:1:10;18820:11;;;18816:24;18812:29;18802:40;18848:1;18844:11;;;18799:57;19975:78;;19169:894;;19196:615;15071:1;15064:14;;;15108:4;15095:18;;-1:-1:-1;;19232:17:10;;;19332:9;19354:229;19368:7;19365:1;19362:14;19354:229;;;19457:19;;;19444:33;19429:49;;19564:4;19549:20;;;;19517:1;19505:14;;;;19384:12;19354:229;;;19358:3;19611;19602:7;19599:16;19596:159;;;19735:1;19731:6;19725:3;19719;19716:1;19712:11;19708:21;19704:34;19700:39;19687:9;19682:3;19678:19;19665:33;19661:79;19653:6;19646:95;19596:159;;;19798:1;19792:3;19789:1;19785:11;19781:19;19775:4;19768:33;19169:894;;18867:1202;;;:::o;20074:266::-;20162:6;20157:3;20150:19;20214:6;20207:5;20200:4;20195:3;20191:14;20178:43;-1:-1:-1;20266:1:10;20241:16;;;20259:4;20237:27;;;20230:38;;;;20322:2;20301:15;;;-1:-1:-1;;20297:29:10;20288:39;;;20284:50;;20074:266::o;20345:458::-;-1:-1:-1;;;;;20560:6:10;20556:55;20545:9;20538:74;20660:18;20652:6;20648:31;20643:2;20632:9;20628:18;20621:59;20716:2;20711;20700:9;20696:18;20689:30;20519:4;20736:61;20793:2;20782:9;20778:18;20770:6;20762;20736:61;:::i;21153:251::-;21223:6;21276:2;21264:9;21255:7;21251:23;21247:32;21244:52;;;21292:1;21289;21282:12;21244:52;21324:9;21318:16;21343:31;21368:5;21343:31;:::i;21753:253::-;21825:2;21819:9;21867:4;21855:17;;21902:18;21887:34;;21923:22;;;21884:62;21881:88;;;21949:18;;:::i;:::-;21985:2;21978:22;21753:253;:::o;22011:275::-;22082:2;22076:9;22147:2;22128:13;;-1:-1:-1;;22124:27:10;22112:40;;22182:18;22167:34;;22203:22;;;22164:62;22161:88;;;22229:18;;:::i;:::-;22265:2;22258:22;22011:275;;-1:-1:-1;22011:275:10:o;22291:187::-;22340:4;22373:18;22365:6;22362:30;22359:56;;;22395:18;;:::i;:::-;-1:-1:-1;22461:2:10;22440:15;-1:-1:-1;;22436:29:10;22467:4;22432:40;;22291:187::o;22483:649::-;22563:6;22616:2;22604:9;22595:7;22591:23;22587:32;22584:52;;;22632:1;22629;22622:12;22584:52;22665:9;22659:16;22698:18;22690:6;22687:30;22684:50;;;22730:1;22727;22720:12;22684:50;22753:22;;22806:4;22798:13;;22794:27;-1:-1:-1;22784:55:10;;22835:1;22832;22825:12;22784:55;22864:2;22858:9;22889:49;22905:32;22934:2;22905:32;:::i;:::-;22889:49;:::i;:::-;22961:2;22954:5;22947:17;23001:7;22996:2;22991;22987;22983:11;22979:20;22976:33;22973:53;;;23022:1;23019;23012:12;22973:53;23035:67;23099:2;23094;23087:5;23083:14;23078:2;23074;23070:11;23035:67;:::i;23137:790::-;23312:2;23301:9;23294:21;23275:4;23350:6;23344:13;23393:4;23388:2;23377:9;23373:18;23366:32;23421:51;23467:3;23456:9;23452:19;23438:12;23421:51;:::i;:::-;23407:65;;23521:2;23513:6;23509:15;23503:22;23548:2;23544:7;23615:2;23603:9;23595:6;23591:22;23587:31;23582:2;23571:9;23567:18;23560:59;23642:40;23675:6;23659:14;23642:40;:::i;:::-;23628:54;;23736:2;23728:6;23724:15;23718:22;23713:2;23702:9;23698:18;23691:50;23790:2;23782:6;23778:15;23772:22;23750:44;;23860:2;23848:9;23840:6;23836:22;23832:31;23825:4;23814:9;23810:20;23803:61;;23881:40;23914:6;23898:14;23881:40;:::i;23932:794::-;24208:4;-1:-1:-1;;;;;24318:2:10;24310:6;24306:15;24295:9;24288:34;24370:2;24362:6;24358:15;24353:2;24342:9;24338:18;24331:43;;24410:6;24405:2;24394:9;24390:18;24383:34;24465:18;24457:6;24453:31;24448:2;24437:9;24433:18;24426:59;24522:3;24516;24505:9;24501:19;24494:32;24549:62;24606:3;24595:9;24591:19;24583:6;24575;24549:62;:::i;:::-;24660:9;24652:6;24648:22;24642:3;24631:9;24627:19;24620:51;24688:32;24713:6;24705;24688:32;:::i;:::-;24680:40;23932:794;-1:-1:-1;;;;;;;;;;23932:794:10:o;25157:591::-;25330:2;25319:9;25312:21;25293:4;-1:-1:-1;;;;;25449:2:10;25440:6;25434:13;25430:22;25425:2;25414:9;25410:18;25403:50;25517:2;25511;25503:6;25499:15;25493:22;25489:31;25484:2;25473:9;25469:18;25462:59;;25575:2;25567:6;25563:15;25557:22;25552:2;25541:9;25537:18;25530:50;25627:2;25619:6;25615:15;25609:22;25669:4;25662;25651:9;25647:20;25640:34;25691:51;25737:3;25726:9;25722:19;25708:12;25691:51;:::i;:::-;25683:59;25157:591;-1:-1:-1;;;;25157:591:10:o;25753:184::-;25823:6;25876:2;25864:9;25855:7;25851:23;25847:32;25844:52;;;25892:1;25889;25882:12;25844:52;-1:-1:-1;25915:16:10;;25753:184;-1:-1:-1;25753:184:10:o;25942:125::-;26007:9;;;26028:10;;;26025:36;;;26041:18;;:::i;:::-;25942:125;;;;:::o;27333:338::-;27528:18;27520:6;27516:31;27505:9;27498:50;27584:2;27579;27568:9;27564:18;27557:30;27479:4;27604:61;27661:2;27650:9;27646:18;27638:6;27630;27604:61;:::i;28083:1298::-;28164:6;28195:2;28238;28226:9;28217:7;28213:23;28209:32;28206:52;;;28254:1;28251;28244:12;28206:52;28294:9;28281:23;28323:18;28364:2;28356:6;28353:14;28350:34;;;28380:1;28377;28370:12;28350:34;28403:22;;;;28459:4;28441:16;;;28437:27;28434:47;;;28477:1;28474;28467:12;28434:47;28503:22;;:::i;:::-;28562:2;28549:16;28574:33;28599:7;28574:33;:::i;:::-;28616:22;;28675:11;;;28662:25;28696:33;28662:25;28696:33;:::i;:::-;28745:14;;;28738:31;28822:2;28814:11;;;28801:25;28785:14;;;28778:49;28873:2;28865:11;;28852:25;28889:16;;;28886:36;;;28918:1;28915;28908:12;28886:36;28949:8;28945:2;28941:17;28931:27;;;28996:7;28989:4;28985:2;28981:13;28977:27;28967:55;;29018:1;29015;29008:12;28967:55;29054:2;29041:16;29031:26;;29079:49;29095:32;29124:2;29095:32;:::i;29079:49::-;29151:2;29144:5;29137:17;29191:7;29186:2;29181;29177;29173:11;29169:20;29166:33;29163:53;;;29212:1;29209;29202:12;29163:53;29267:2;29262;29258;29254:11;29249:2;29242:5;29238:14;29225:45;29311:1;29306:2;29301;29294:5;29290:14;29286:23;29279:34;29345:5;29340:2;29333:5;29329:14;29322:29;;29370:5;29360:15;;;;;;28083:1298;;;;:::o;29789:410::-;-1:-1:-1;;;;;29998:6:10;29994:55;29983:9;29976:74;30086:6;30081:2;30070:9;30066:18;30059:34;30129:2;30124;30113:9;30109:18;30102:30;29957:4;30149:44;30189:2;30178:9;30174:18;30166:6;30149:44;:::i;32791:472::-;33011:2;33000:9;32993:21;32974:4;33037:44;33077:2;33066:9;33062:18;33054:6;33037:44;:::i;:::-;33129:18;33121:6;33117:31;33112:2;33101:9;33097:18;33090:59;33197:9;33189:6;33185:22;33180:2;33169:9;33165:18;33158:50;33225:32;33250:6;33242;33225:32;:::i;33972:432::-;-1:-1:-1;;;;;34178:6:10;34174:55;34163:9;34156:74;34278:18;34270:6;34266:31;34261:2;34250:9;34246:18;34239:59;34334:2;34329;34318:9;34314:18;34307:30;34137:4;34354:44;34394:2;34383:9;34379:18;34371:6;34354:44;:::i

Swarm Source

ipfs://b858f5b10153bc66bb5164b900409fd0964426a32294f87e83a5e247222a2a4b

Block Transaction Gas Used Reward
view all blocks sequenced

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

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.