ETH Price: $2,355.60 (+1.85%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Cashout88967032019-11-08 14:26:362278 days ago1573223196IN
0xf51e2A77...d1Aa94D53
0 ETH0.000288693
Cashout88941792019-11-08 4:37:412278 days ago1573187861IN
0xf51e2A77...d1Aa94D53
0 ETH0.000192632
Cashout88848192019-11-06 16:14:212280 days ago1573056861IN
0xf51e2A77...d1Aa94D53
0 ETH0.000105921.1
Cashout88848192019-11-06 16:14:212280 days ago1573056861IN
0xf51e2A77...d1Aa94D53
0 ETH0.000105871.1
Cashout88828422019-11-06 8:38:512280 days ago1573029531IN
0xf51e2A77...d1Aa94D53
0 ETH0.00048185
Cashout88828322019-11-06 8:36:162280 days ago1573029376IN
0xf51e2A77...d1Aa94D53
0 ETH0.000481385
Cashout88828322019-11-06 8:36:162280 days ago1573029376IN
0xf51e2A77...d1Aa94D53
0 ETH0.000481385
Open Escrow88826972019-11-06 8:00:262280 days ago1573027226IN
0xf51e2A77...d1Aa94D53
0 ETH0.00016225
Cashout88825982019-11-06 7:34:402280 days ago1573025680IN
0xf51e2A77...d1Aa94D53
0 ETH0.000291262.4
Open Escrow88824472019-11-06 7:00:432280 days ago1573023643IN
0xf51e2A77...d1Aa94D53
0 ETH0.000068122.1
Open Escrow88824472019-11-06 7:00:432280 days ago1573023643IN
0xf51e2A77...d1Aa94D53
0 ETH0.000068122.1
Open Escrow88824402019-11-06 6:59:442280 days ago1573023584IN
0xf51e2A77...d1Aa94D53
0 ETH0.000068122.1
Open Escrow88795852019-11-05 20:10:442280 days ago1572984644IN
0xf51e2A77...d1Aa94D53
0 ETH0.000038921.2
Cashout88795372019-11-05 20:00:562280 days ago1572984056IN
0xf51e2A77...d1Aa94D53
0 ETH0.00011551.2
Open Escrow88795222019-11-05 19:57:522280 days ago1572983872IN
0xf51e2A77...d1Aa94D53
0 ETH0.000064752
Open Escrow88794742019-11-05 19:48:182280 days ago1572983298IN
0xf51e2A77...d1Aa94D53
0 ETH0.000042171.3
Cashout88794082019-11-05 19:35:182280 days ago1572982518IN
0xf51e2A77...d1Aa94D53
0 ETH0.000189122.4
Cashout88793092019-11-05 19:13:252280 days ago1572981205IN
0xf51e2A77...d1Aa94D53
0 ETH0.000157772
Cashout88792992019-11-05 19:10:272280 days ago1572981027IN
0xf51e2A77...d1Aa94D53
0 ETH0.000288753
Open Escrow88792992019-11-05 19:10:272280 days ago1572981027IN
0xf51e2A77...d1Aa94D53
0 ETH0.000097323
Open Escrow88792962019-11-05 19:09:122280 days ago1572980952IN
0xf51e2A77...d1Aa94D53
0 ETH0.000064882
Open Escrow88792852019-11-05 19:06:552280 days ago1572980815IN
0xf51e2A77...d1Aa94D53
0 ETH0.000077852.4
Cashout88792062019-11-05 18:45:512280 days ago1572979551IN
0xf51e2A77...d1Aa94D53
0 ETH0.000115351.2
Open Escrow88791872019-11-05 18:40:482280 days ago1572979248IN
0xf51e2A77...d1Aa94D53
0 ETH0.000064882
Open Escrow88783072019-11-05 15:18:432281 days ago1572967123IN
0xf51e2A77...d1Aa94D53
0 ETH0.00016225
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
-88726652019-11-04 17:35:332282 days ago1572888933  Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
EscrowLibrary

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2019-11-04
*/

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

// File: contracts/IEscrow.sol

pragma solidity ^0.5.0;


interface IEscrow {
    function balance() external returns (uint);
    function send(address payable addr, uint amt) external returns (bool);
}

// File: openzeppelin-solidity/contracts/cryptography/ECDSA.sol

pragma solidity ^0.5.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * (.note) This call _does not revert_ if the signature is invalid, or
     * if the signer is otherwise unable to be retrieved. In those scenarios,
     * the zero address is returned.
     *
     * (.warning) `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise)
     * be too long), and then calling `toEthSignedMessageHash` on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            return (address(0));
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return address(0);
        }

        if (v != 27 && v != 28) {
            return address(0);
        }

        // If the signature is valid (and not malleable), return the signer address
        return ecrecover(hash, v, r, s);
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * [`eth_sign`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign)
     * JSON-RPC method.
     *
     * See `recover`.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
}

// File: contracts/EscrowLibrary.sol

pragma solidity ^0.5.0;





/**
* Central contract containing the business logic for interacting with and
* managing the state of Arwen unidirectional payment channels
* @dev Escrows contracts are created and linked to this library from the
* EscrowFactory contract
*/
contract EscrowLibrary {

    using SafeMath for uint;

    string constant SIGNATURE_PREFIX = '\x19Ethereum Signed Message:\n';
    uint constant FORCE_REFUND_TIME = 2 days;

    /**
    * Escrow State Machine
    * @param None Preliminary state of an escrow before it has been created.
    * @param Unfunded Initial state of the escrow once created. The escrow can only
    * transition to the Open state once it has been funded with required escrow
    * amount and openEscrow method is called.
    * @param Open From this state the escrow can transition to Closed state
    * via the cashout or refund methods or it can transition to PuzzlePosted state
    * via the postPuzzle method.
    * @param PuzzlePosted From this state the escrow can only transition to
    * closed via the solve or puzzleRefund methods
    * @param Closed The final sink state of the escrow
    */
    enum EscrowState {
        None,
        Unfunded,
        Open,
        PuzzlePosted,
        Closed
    }

    /**
    * Unique ID for each different type of signed message in the protocol
    */
    enum MessageTypeId {
        None,
        Cashout,
        Puzzle,
        Refund
    }

    /**
    * Possible reasons the escrow can become closed
    */
    enum EscrowCloseReason {
        Refund,
        PuzzleRefund,
        PuzzleSolve,
        Cashout,
        ForceRefund
    }

    event EscrowOpened(address indexed escrow);
    event EscrowFunded(address indexed escrow, uint amountFunded);
    event PuzzlePosted(address indexed escrow, bytes32 puzzleSighash);
    event Preimage(address indexed escrow, bytes32 preimage, bytes32 puzzleSighash);
    event EscrowClosed(address indexed escrow, EscrowCloseReason reason, bytes32 closingSighash);
    event FundsTransferred(address indexed escrow, address reserveAddress);

    struct EscrowParams {
        // The amount expected to be funded by the escrower to open the payment channel
        uint escrowAmount;

        // Expiration time of the escrow when it can refunded by the escrower
        uint escrowTimelock;

        // Escrower's pub keys
        address payable escrowerReserve;
        address escrowerTrade;
        address escrowerRefund;

        // Payee's pub keys
        address payable payeeReserve;
        address payeeTrade;

        // Current state of the escrow
        EscrowState escrowState;

        // Internal payee/escrower balances within the payment channel
        uint escrowerBalance;
        uint payeeBalance;
    }

    /**
    * Represents a trade in the payment channel that can be executed
    * on-chain by the payee by revealing a hash preimage
    */
    struct PuzzleParams {
        // The amount of coins in this trade
        uint tradeAmount;

        // A hash output or "puzzle" which can be "solved" by revealing the preimage
        bytes32 puzzle;

        // The expiration time of the puzzle when the trade can be refunded by the escrower
        uint puzzleTimelock;

        // The signature hash of the `postPuzzle` message
        bytes32 puzzleSighash;
    }

    // The EscrowFactory contract that deployed this library
    address public escrowFactory;

    // Mapping of escrow address to EscrowParams
    mapping(address => EscrowParams) public escrows;

    // Mapping of escrow address to PuzzleParams
    // Only a single puzzle can be posted for a given escrow
    mapping(address => PuzzleParams) public puzzles;

    constructor() public {
        escrowFactory = msg.sender;
    }

    modifier onlyFactory() {
        require(msg.sender == escrowFactory, "Can only be called by escrow factory");
        _;
    }

    /**
    * Add a new escrow that is controlled by the library
    * @dev Only callable by the factory which should have already deployed the
    * escrow at the provided address
    */
    function newEscrow(
        address escrow,
        uint escrowAmount,
        uint timelock,
        address payable escrowerReserve,
        address escrowerTrade,
        address escrowerRefund,
        address payable payeeReserve,
        address payeeTrade
    )
        public
        onlyFactory
    {
        require(escrows[escrow].escrowState == EscrowState.None, "Escrow already exists");
        require(escrowAmount > 0, "Escrow amount too low");

        uint escrowerStartingBalance = 0;
        uint payeeStartingBalance = 0;

        escrows[escrow] = EscrowParams(
            escrowAmount,
            timelock,
            escrowerReserve,
            escrowerTrade,
            escrowerRefund,
            payeeReserve,
            payeeTrade,
            EscrowState.Unfunded,
            escrowerStartingBalance,
            payeeStartingBalance
        );
    }

    /**
    * Emits an event with the current balance of the escrow
    * @dev Can be used by the EthEscrow contract's payable fallback to
    * automatically emit an event when an escrow is funded
    */
    function checkFunded(address escrowAddress) public {
        EscrowParams storage escrowParams = escrows[escrowAddress];

        require(msg.sender == escrowAddress, "Only callable by the Escrow contract");
        require(escrowParams.escrowState == EscrowState.Unfunded, "Escrow must be in state Unfunded");

        emit EscrowFunded(escrowAddress, IEscrow(escrowAddress).balance());
    }

    /**
    * Moves the escrow to the open state if it has been funded
    * @dev Will send back any additional collateral above the `escrowAmount`
    * back to the escrower before opening
    */
    function openEscrow(address escrowAddress) public {
        EscrowParams storage escrowParams = escrows[escrowAddress];
        require(escrowParams.escrowState == EscrowState.Unfunded, "Escrow must be in state Unfunded");
        
        IEscrow escrow = IEscrow(escrowAddress);
        uint escrowAmount = escrowParams.escrowAmount;
        uint escrowBalance = escrow.balance();

        // Check the escrow is funded for at least escrowAmount
        require(escrowBalance >= escrowAmount, "Escrow not funded");

        escrowParams.escrowState = EscrowState.Open;
        emit EscrowOpened(escrowAddress);

        // If over-funded return any excess funds back to the escrower
        if(escrowBalance > escrowAmount) {
           escrow.send(escrowParams.escrowerReserve, escrowBalance.sub(escrowAmount));
        }
    }

    /**
    * Cashout the escrow with the final balances after trading
    * @dev Must be signed by both the escrower and payee trade keys
    * @dev Must be in Open state
    * @param amountTraded The total amount traded to the payee
    */
    function cashout(
        address escrowAddress,
        uint amountTraded,
        bytes memory eSig,
        bytes memory pSig
    )
        public
    {
        EscrowParams storage escrowParams = escrows[escrowAddress];
        require(escrowParams.escrowState == EscrowState.Open, "Escrow must be in state Open");

        // Length of the actual message: 20 + 1 + 32
        string memory messageLength = '53';
        bytes32 sighash = keccak256(abi.encodePacked(
            SIGNATURE_PREFIX,
            messageLength,
            escrowAddress,
            uint8(MessageTypeId.Cashout),
            amountTraded
        ));

        // Check signatures
        require(verify(sighash, eSig) == escrowParams.escrowerTrade, "Invalid escrower cashout sig");
        require(verify(sighash, pSig) == escrowParams.payeeTrade, "Invalid payee cashout sig");

        escrowParams.payeeBalance = amountTraded;
        escrowParams.escrowerBalance = escrowParams.escrowAmount.sub(amountTraded);
        escrowParams.escrowState = EscrowState.Closed;

        if(escrowParams.escrowerBalance > 0) sendEscrower(escrowAddress, escrowParams);
        if(escrowParams.payeeBalance > 0) sendPayee(escrowAddress, escrowParams);

        emit EscrowClosed(escrowAddress, EscrowCloseReason.Cashout, sighash);
    }

    /**
    * Allows the escrower to refund the escrow after the escrow expires
    * @dev This is a signed refund because it allows the refunder to
    * specify the amount traded in the escrow. This is useful for the escrower to
    * benevolently close the escrow with the final balances despite the other
    * party being offline
    * @dev Must be signed by the escrower refund key
    * @dev Must be in Open state
    * @param amountTraded The total amount traded to the payee
    */
    function refund(address escrowAddress, uint amountTraded, bytes memory eSig) public {
        EscrowParams storage escrowParams = escrows[escrowAddress];
        require(escrowParams.escrowState == EscrowState.Open, "Escrow must be in state Open");
        require(now >= escrowParams.escrowTimelock, "Escrow timelock not reached");
        
        // Length of the actual message: 20 + 1 + 32
        string memory messageLength = '53';
        bytes32 sighash = keccak256(abi.encodePacked(
            SIGNATURE_PREFIX,
            messageLength,
            escrowAddress,
            uint8(MessageTypeId.Refund),
            amountTraded
        ));

        // Check signature
        require(verify(sighash, eSig) == escrowParams.escrowerRefund, "Invalid escrower sig");

        escrowParams.payeeBalance = amountTraded;
        escrowParams.escrowerBalance = escrowParams.escrowAmount.sub(amountTraded);
        escrowParams.escrowState = EscrowState.Closed;

        if(escrowParams.escrowerBalance > 0) sendEscrower(escrowAddress, escrowParams);
        if(escrowParams.payeeBalance > 0) sendPayee(escrowAddress, escrowParams);

        emit EscrowClosed(escrowAddress, EscrowCloseReason.Refund, sighash);
    }

    /**
    * Allows anyone to refund the escrow back to the escrower without a
    * signature after escrowTimelock + FORCE_REFUND_TIME
    * @dev This method can be used in the event the escrower's keys are lost
    * or if the escrower remains offline for an extended period of time
    */
    function forceRefund(address escrowAddress) public {
        EscrowParams storage escrowParams = escrows[escrowAddress];
        require(escrowParams.escrowState == EscrowState.Open, "Escrow must be in state Open");
        require(now >= escrowParams.escrowTimelock + FORCE_REFUND_TIME, "Escrow force refund timelock not reached");

        escrowParams.escrowerBalance = IEscrow(escrowAddress).balance();
        escrowParams.escrowState = EscrowState.Closed;

        if(escrowParams.escrowerBalance > 0) sendEscrower(escrowAddress, escrowParams);

        // Use 0x0 as the closing sighash because there is no signature required
        emit EscrowClosed(escrowAddress, EscrowCloseReason.ForceRefund, 0x0);
    }

    /**
    * Post a hash puzzle unlocks lastest trade in the escrow
    * @dev Must be signed by both the escrower and payee trade keys
    * @dev Must be in Open state
    * @param prevAmountTraded The total amount traded to the payee in the
    * payment channel before the last trade
    * @param tradeAmount The last trade amount
    * @param puzzle A hash puzzle where the solution (preimage) releases the
    * `tradeAmount` to the payee
    * @param  puzzleTimelock The time at which the `tradeAmount` can be
    * refunded back to the escrower if the puzzle solution is not posted
    */
    function postPuzzle(
        address escrowAddress,
        uint prevAmountTraded,
        uint tradeAmount,
        bytes32 puzzle,
        uint puzzleTimelock,
        bytes memory eSig,
        bytes memory pSig
    )
        public
    {
        EscrowParams storage escrowParams = escrows[escrowAddress];
        require(escrowParams.escrowState == EscrowState.Open, "Escrow must be in state Open");

        // Length of the actual message: 20 + 1 + 32 + 32 + 32 + 32
        string memory messageLength = '149';
        bytes32 sighash = keccak256(abi.encodePacked(
            SIGNATURE_PREFIX,
            messageLength,
            escrowAddress,
            uint8(MessageTypeId.Puzzle),
            prevAmountTraded,
            tradeAmount,
            puzzle,
            puzzleTimelock
        ));

        require(verify(sighash, eSig) == escrowParams.escrowerTrade, "Invalid escrower sig");
        require(verify(sighash, pSig) == escrowParams.payeeTrade, "Invalid payee sig");

        puzzles[escrowAddress] = PuzzleParams(
            tradeAmount,
            puzzle,
            puzzleTimelock,
            sighash
        );

        escrowParams.escrowState = EscrowState.PuzzlePosted;
        escrowParams.payeeBalance = prevAmountTraded;
        escrowParams.escrowerBalance = escrowParams.escrowAmount.sub(prevAmountTraded).sub(tradeAmount);

        emit PuzzlePosted(escrowAddress, sighash);
    }

    /**
    * Payee solves the hash puzzle redeeming the last trade amount of funds in the escrow
    * @dev Must be in PuzzlePosted state
    * @param preimage The preimage x such that H(x) == puzzle
    */
    function solvePuzzle(address escrowAddress, bytes32 preimage) public {
        EscrowParams storage escrowParams = escrows[escrowAddress];
        require(escrowParams.escrowState == EscrowState.PuzzlePosted, "Escrow must be in state PuzzlePosted");

        PuzzleParams memory puzzleParams = puzzles[escrowAddress];
        bytes32 h = sha256(abi.encodePacked(preimage));
        require(h == puzzleParams.puzzle, "Invalid preimage");
        emit Preimage(escrowAddress, preimage, puzzleParams.puzzleSighash);

        escrowParams.payeeBalance = escrowParams.payeeBalance.add(puzzleParams.tradeAmount);
        escrowParams.escrowState = EscrowState.Closed;

        emit EscrowClosed(escrowAddress, EscrowCloseReason.PuzzleSolve, puzzleParams.puzzleSighash);
    }

    /**
    * Escrower refunds the last trade amount after `puzzleTimelock` has been reached
    * @dev Must be in PuzzlePosted state
    */
    function refundPuzzle(address escrowAddress) public {
        EscrowParams storage escrowParams = escrows[escrowAddress];
        require(escrowParams.escrowState == EscrowState.PuzzlePosted, "Escrow must be in state PuzzlePosted");

        PuzzleParams memory puzzleParams = puzzles[escrowAddress];
        require(now >= puzzleParams.puzzleTimelock, "Puzzle timelock not reached");
        
        escrowParams.escrowerBalance = escrowParams.escrowerBalance.add(puzzleParams.tradeAmount);
        escrowParams.escrowState = EscrowState.Closed;

        emit EscrowClosed(escrowAddress, EscrowCloseReason.PuzzleRefund, puzzleParams.puzzleSighash);
    }

    function withdraw(address escrowAddress, bool escrower) public {
        EscrowParams storage escrowParams = escrows[escrowAddress];

        require(escrowParams.escrowState == EscrowState.Closed, "Withdraw attempted before escrow is closed");

        if(escrower) {
            require(escrowParams.escrowerBalance > 0, "escrower balance is 0");
            sendEscrower(escrowAddress, escrowParams);
        } else {
            require(escrowParams.payeeBalance > 0, "payee balance is 0");
            sendPayee(escrowAddress, escrowParams);
        }
    }

    function sendEscrower(address escrowAddress, EscrowParams storage escrowParams) internal {
        IEscrow escrow = IEscrow(escrowAddress);

        uint amountToSend = escrowParams.escrowerBalance;
        escrowParams.escrowerBalance = 0;
        require(escrow.send(escrowParams.escrowerReserve, amountToSend), "escrower send failure");

        emit FundsTransferred(escrowAddress, escrowParams.escrowerReserve);
    }

    function sendPayee(address escrowAddress, EscrowParams storage escrowParams) internal {
        IEscrow escrow = IEscrow(escrowAddress);

        uint amountToSend = escrowParams.payeeBalance;
        escrowParams.payeeBalance = 0;
        require(escrow.send(escrowParams.payeeReserve, amountToSend), "payee send failure");

        emit FundsTransferred(escrowAddress, escrowParams.payeeReserve);
    }

    /**
    * Verify a EC signature (v,r,s) on a message digest h
    * @return retAddr The recovered address from the signature or 0 if signature is invalid
    */
    function verify(bytes32 sighash, bytes memory sig) internal pure returns(address retAddr) {
        retAddr = ECDSA.recover(sighash, sig);
    }
}

// File: contracts/Escrow.sol

pragma solidity ^0.5.0;





/**
* Thin wrapper around a ETH/ERC20 payment channel deposit that is controlled
* by a library contract for the purpose of trading with atomic swaps using the
* Arwen protocol.
* @dev Abstract contract with `balance` and `send` methods that must be implemented
* for either ETH or ERC20 tokens in derived contracts. The `send` method should only
* callable by the library contract that controls this escrow
*/
contract Escrow is IEscrow {

    address public escrowLibrary;

    modifier onlyLibrary() {
        require(msg.sender == escrowLibrary, "Only callable by library contract");
        _;
    }

    constructor(address _escrowLibrary) internal {
        escrowLibrary = _escrowLibrary;
    }
}


/**
* Escrow Contract backed by ETH
*/
contract EthEscrow is Escrow {

    constructor(address escrowLibrary) public Escrow(escrowLibrary) { }

    /**
    * Payable fallback method that allows the escrow to be funded and triggers
    * a `checkFunded` call on the library contract to emit an event when the
    * escrow becomes fully funded
    */
    function () external payable {
       EscrowLibrary(escrowLibrary).checkFunded(address(this));
    }

    function send(address payable addr, uint amt) public onlyLibrary returns (bool) {
        return addr.send(amt);
    }

    function balance() public returns (uint) {
        return address(this).balance;
    }
}


// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 */
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 () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * > Note: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/EscrowFactory.sol

pragma solidity ^0.5.0;





/**
* Creates an EscrowLibrary contract and allows for creating new escrows linked
* to that library
* @dev The factory  contract can be self-destructed by the owner to prevent
* new escrows from being created without affecting the library and the ability
* to close already existing escrows
*/
contract EscrowFactory is Ownable {

    EscrowLibrary public escrowLibrary;
    mapping(bytes32 => bool) internal escrowsCreated;

    constructor () public {
        escrowLibrary = new EscrowLibrary();
    }

    event EscrowCreated(
        bytes32 indexed escrowParams,
        address escrowAddress
    );

    function createEthEscrow(
        uint escrowAmount,
        uint timelock,
        address payable escrowerReserve,
        address escrowerTrade,
        address escrowerRefund,
        address payable payeeReserve,
        address payeeTrade
    )
    public
    {
        bytes32 escrowParamsHash = keccak256(abi.encodePacked(
            address(this),
            escrowAmount,
            timelock,
            escrowerReserve,
            escrowerTrade,
            escrowerRefund,
            payeeReserve,
            payeeTrade
        ));

        require(! escrowsCreated[escrowParamsHash], "escrow already exists");
        
        EthEscrow escrow = new EthEscrow(
            address(escrowLibrary)
        );

        escrowLibrary.newEscrow(
            address(escrow),
            escrowAmount,
            timelock,
            escrowerReserve,
            escrowerTrade,
            escrowerRefund,
            payeeReserve,
            payeeTrade
        );

        escrowsCreated[escrowParamsHash] = true;

        emit EscrowCreated(escrowParamsHash, address(escrow));
    }

    function selfDestruct() public onlyOwner {
        selfdestruct(msg.sender);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"enum EscrowLibrary.EscrowCloseReason","name":"reason","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"closingSighash","type":"bytes32"}],"name":"EscrowClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountFunded","type":"uint256"}],"name":"EscrowFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"}],"name":"EscrowOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"address","name":"reserveAddress","type":"address"}],"name":"FundsTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"bytes32","name":"preimage","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"puzzleSighash","type":"bytes32"}],"name":"Preimage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"escrow","type":"address"},{"indexed":false,"internalType":"bytes32","name":"puzzleSighash","type":"bytes32"}],"name":"PuzzlePosted","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"uint256","name":"amountTraded","type":"uint256"},{"internalType":"bytes","name":"eSig","type":"bytes"},{"internalType":"bytes","name":"pSig","type":"bytes"}],"name":"cashout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"}],"name":"checkFunded","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"escrowFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"escrows","outputs":[{"internalType":"uint256","name":"escrowAmount","type":"uint256"},{"internalType":"uint256","name":"escrowTimelock","type":"uint256"},{"internalType":"address payable","name":"escrowerReserve","type":"address"},{"internalType":"address","name":"escrowerTrade","type":"address"},{"internalType":"address","name":"escrowerRefund","type":"address"},{"internalType":"address payable","name":"payeeReserve","type":"address"},{"internalType":"address","name":"payeeTrade","type":"address"},{"internalType":"enum EscrowLibrary.EscrowState","name":"escrowState","type":"uint8"},{"internalType":"uint256","name":"escrowerBalance","type":"uint256"},{"internalType":"uint256","name":"payeeBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"}],"name":"forceRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrow","type":"address"},{"internalType":"uint256","name":"escrowAmount","type":"uint256"},{"internalType":"uint256","name":"timelock","type":"uint256"},{"internalType":"address payable","name":"escrowerReserve","type":"address"},{"internalType":"address","name":"escrowerTrade","type":"address"},{"internalType":"address","name":"escrowerRefund","type":"address"},{"internalType":"address payable","name":"payeeReserve","type":"address"},{"internalType":"address","name":"payeeTrade","type":"address"}],"name":"newEscrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"}],"name":"openEscrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"uint256","name":"prevAmountTraded","type":"uint256"},{"internalType":"uint256","name":"tradeAmount","type":"uint256"},{"internalType":"bytes32","name":"puzzle","type":"bytes32"},{"internalType":"uint256","name":"puzzleTimelock","type":"uint256"},{"internalType":"bytes","name":"eSig","type":"bytes"},{"internalType":"bytes","name":"pSig","type":"bytes"}],"name":"postPuzzle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"puzzles","outputs":[{"internalType":"uint256","name":"tradeAmount","type":"uint256"},{"internalType":"bytes32","name":"puzzle","type":"bytes32"},{"internalType":"uint256","name":"puzzleTimelock","type":"uint256"},{"internalType":"bytes32","name":"puzzleSighash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"uint256","name":"amountTraded","type":"uint256"},{"internalType":"bytes","name":"eSig","type":"bytes"}],"name":"refund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"}],"name":"refundPuzzle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"bytes32","name":"preimage","type":"bytes32"}],"name":"solvePuzzle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"escrowAddress","type":"address"},{"internalType":"bool","name":"escrower","type":"bool"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061362d806100606000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639771b7de1161008c578063bdd1daaa11610066578063bdd1daaa14610756578063c4de5dce146107a0578063d4b64dad1461091c578063f2aecf4614610960576100cf565b80639771b7de14610534578063a34e7d2a14610578578063a37eec6214610671576100cf565b8063054848b6146100d45780633fb6c74e14610141578063477230b2146101855780635437e4011461030657806357c1766d14610356578063701554591461039a575b600080fd5b610116600480360360208110156100ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109ae565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6101836004803603602081101561015757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109de565b005b6101c76004803603602081101561019b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c56565b604051808b81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018460048111156102dd57fe5b60ff1681526020018381526020018281526020019a505050505050505050505060405180910390f35b6103546004803603604081101561031c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050610d57565b005b6103986004803603602081101561036c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f32565b005b610532600480360360e08110156103b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561041557600080fd5b82018360208201111561042757600080fd5b8035906020019184600183028401116401000000008311171561044957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104ac57600080fd5b8201836020820111156104be57600080fd5b803590602001918460018302840111640100000000831117156104e057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061116a565b005b6105766004803603602081101561054a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116d7565b005b61066f600480360361010081101561058f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a34565b005b6107546004803603606081101561068757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106ce57600080fd5b8201836020820111156106e057600080fd5b8035906020019184600183028401116401000000008311171561070257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ef8565b005b61075e61239e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61091a600480360360808110156107b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156107fd57600080fd5b82018360208201111561080f57600080fd5b8035906020019184600183028401116401000000008311171561083157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561089457600080fd5b8201836020820111156108a657600080fd5b803590602001918460018302840111640100000000831117156108c857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506123c3565b005b61095e6004803603602081101561093257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128bf565b005b6109ac6004803603604081101561097657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b2f565b005b60026020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060026004811115610a2e57fe5b8160060160149054906101000a900460ff166004811115610a4b57fe5b14610abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b6202a300816001015401421015610b20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806135a76028913960400191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b6857600080fd5b505af1158015610b7c573d6000803e3d6000fd5b505050506040513d6020811015610b9257600080fd5b8101908080519060200190929190505050816007018190555060048160060160146101000a81548160ff02191690836004811115610bcc57fe5b0217905550600081600701541115610be957610be88282612ebb565b5b8173ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6004600060405180836004811115610c3557fe5b60ff1681526020018260001b81526020019250505060405180910390a25050565b60016020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160149054906101000a900460ff1690806007015490806008015490508a565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600480811115610da657fe5b8160060160149054906101000a900460ff166004811115610dc357fe5b14610e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806135cf602a913960400191505060405180910390fd5b8115610ea8576000816007015411610e99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f657363726f7765722062616c616e63652069732030000000000000000000000081525060200191505060405180910390fd5b610ea38382612ebb565b610f2d565b6000816008015411610f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f70617965652062616c616e63652069732030000000000000000000000000000081525060200191505060405180910390fd5b610f2c83826130cf565b5b505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ff9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061353b6024913960400191505060405180910390fd5b6001600481111561100657fe5b8160060160149054906101000a900460ff16600481111561102357fe5b14611096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f457363726f77206d75737420626520696e20737461746520556e66756e64656481525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f511c3b325f63024e6754176648b89f4bab878b1712366d9bf3729c501dcbad798373ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561111657600080fd5b505af115801561112a573d6000803e3d6000fd5b505050506040513d602081101561114057600080fd5b81019080805190602001909291905050506040518082815260200191505060405180910390a25050565b6000600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600260048111156111ba57fe5b8160060160149054906101000a900460ff1660048111156111d757fe5b1461124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b60606040518060400160405280600381526020017f3134390000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250828b600260038111156112cb57fe5b8c8c8c8c6040516020018089805190602001908083835b6020831061130557805182526020820191506020810190506020830392506112e2565b6001836020036101000a03801982511681845116808217855250505050505090500188805190602001908083835b602083106113565780518252602082019150602081019050602083039250611333565b6001836020036101000a0380198251168184511680821785525050505050509050018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018660ff1660ff1660f81b8152600101858152602001848152602001838152602001828152602001985050505050505050506040516020818303038152906040528051906020012090508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661143b82876132e3565b73ffffffffffffffffffffffffffffffffffffffff16146114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c696420657363726f7765722073696700000000000000000000000081525060200191505060405180910390fd5b8260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661150982866132e3565b73ffffffffffffffffffffffffffffffffffffffff1614611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c69642070617965652073696700000000000000000000000000000081525060200191505060405180910390fd5b604051806080016040528089815260200188815260200187815260200182815250600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505060038360060160146101000a81548160ff0219169083600481111561163e57fe5b0217905550888360080181905550611675886116678b86600001546132f790919063ffffffff16565b6132f790919063ffffffff16565b83600701819055508973ffffffffffffffffffffffffffffffffffffffff167fba17d7bcab79df89a9c2ce06d6ae417e98df55f0768715b7cee8e00a41cc6f0c826040518082815260200191505060405180910390a250505050505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506001600481111561172757fe5b8160060160149054906101000a900460ff16600481111561174457fe5b146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f457363726f77206d75737420626520696e20737461746520556e66756e64656481525060200191505060405180910390fd5b600082905060008260000154905060008273ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561180f57600080fd5b505af1158015611823573d6000803e3d6000fd5b505050506040513d602081101561183957600080fd5b81019080805190602001909291905050509050818110156118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f457363726f77206e6f742066756e64656400000000000000000000000000000081525060200191505060405180910390fd5b60028460060160146101000a81548160ff021916908360048111156118e357fe5b02179055508473ffffffffffffffffffffffffffffffffffffffff167fa6ad72bd1facaeefbc0081332e37b7f9e50ab106dac569b8913e2e5cdee2bb7060405160405180910390a281811115611a2d578273ffffffffffffffffffffffffffffffffffffffff1663d0679d348560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661198785856132f790919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d6020811015611a1a57600080fd5b8101908080519060200190929190505050505b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806135836024913960400191505060405180910390fd5b60006004811115611ae657fe5b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060160149054906101000a900460ff166004811115611b4157fe5b14611bb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f457363726f7720616c726561647920657869737473000000000000000000000081525060200191505060405180910390fd5b60008711611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f457363726f7720616d6f756e7420746f6f206c6f77000000000000000000000081525060200191505060405180910390fd5b600080905060008090506040518061014001604052808a81526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160016004811115611ce557fe5b815260200183815260200182815250600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160060160146101000a81548160ff02191690836004811115611ece57fe5b02179055506101008201518160070155610120820151816008015590505050505050505050505050565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060026004811115611f4857fe5b8160060160149054906101000a900460ff166004811115611f6557fe5b14611fd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b8060010154421015612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f457363726f772074696d656c6f636b206e6f742072656163686564000000000081525060200191505060405180910390fd5b60606040518060400160405280600281526020017f3533000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525082876003808111156120d257fe5b886040516020018086805190602001908083835b6020831061210957805182526020820191506020810190506020830392506120e6565b6001836020036101000a03801982511681845116808217855250505050505090500185805190602001908083835b6020831061215a5780518252602082019150602081019050602083039250612137565b6001836020036101000a0380198251168184511680821785525050505050509050018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018360ff1660ff1660f81b8152600101828152602001955050505050506040516020818303038152906040528051906020012090508260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661222a82866132e3565b73ffffffffffffffffffffffffffffffffffffffff16146122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c696420657363726f7765722073696700000000000000000000000081525060200191505060405180910390fd5b8483600801819055506122d38584600001546132f790919063ffffffff16565b836007018190555060048360060160146101000a81548160ff021916908360048111156122fc57fe5b0217905550600083600701541115612319576123188684612ebb565b5b6000836008015411156123315761233086846130cf565b5b8573ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6000836040518083600481111561237c57fe5b60ff1681526020018281526020019250505060405180910390a2505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506002600481111561241357fe5b8160060160149054906101000a900460ff16600481111561243057fe5b146124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b60606040518060400160405280600281526020017f3533000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525082886001600381111561252457fe5b896040516020018086805190602001908083835b6020831061255b5780518252602082019150602081019050602083039250612538565b6001836020036101000a03801982511681845116808217855250505050505090500185805190602001908083835b602083106125ac5780518252602082019150602081019050602083039250612589565b6001836020036101000a0380198251168184511680821785525050505050509050018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018360ff1660ff1660f81b8152600101828152602001955050505050506040516020818303038152906040528051906020012090508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661267c82876132e3565b73ffffffffffffffffffffffffffffffffffffffff1614612705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c696420657363726f77657220636173686f7574207369670000000081525060200191505060405180910390fd5b8260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661274a82866132e3565b73ffffffffffffffffffffffffffffffffffffffff16146127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c696420706179656520636173686f7574207369670000000000000081525060200191505060405180910390fd5b8583600801819055506127f38684600001546132f790919063ffffffff16565b836007018190555060048360060160146101000a81548160ff0219169083600481111561281c57fe5b0217905550600083600701541115612839576128388784612ebb565b5b6000836008015411156128515761285087846130cf565b5b8673ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6003836040518083600481111561289c57fe5b60ff1681526020018281526020019250505060405180910390a250505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506003600481111561290f57fe5b8160060160149054906101000a900460ff16600481111561292c57fe5b14612982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061355f6024913960400191505060405180910390fd5b61298a61350c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090508060400151421015612a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f50757a7a6c652074696d656c6f636b206e6f742072656163686564000000000081525060200191505060405180910390fd5b612a938160000151836007015461338090919063ffffffff16565b826007018190555060048260060160146101000a81548160ff02191690836004811115612abc57fe5b02179055508273ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6001836060015160405180836004811115612b1057fe5b60ff1681526020018281526020019250505060405180910390a2505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060036004811115612b7f57fe5b8160060160149054906101000a900460ff166004811115612b9c57fe5b14612bf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061355f6024913960400191505060405180910390fd5b612bfa61350c565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000600284604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612cc55780518252602082019150602081019050602083039250612ca2565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015612d07573d6000803e3d6000fd5b5050506040513d6020811015612d1c57600080fd5b8101908080519060200190929190505050905081602001518114612da8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e76616c696420707265696d6167650000000000000000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f206fdb7f1bb710f91aa27c794fd6a39e4ff1377d3b4b0bb49687a4c079bbd758858460600151604051808381526020018281526020019250505060405180910390a2612e1d8260000151846008015461338090919063ffffffff16565b836008018190555060048360060160146101000a81548160ff02191690836004811115612e4657fe5b02179055508473ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6002846060015160405180836004811115612e9a57fe5b60ff1681526020018281526020019250505060405180910390a25050505050565b6000829050600082600701549050600083600701819055508173ffffffffffffffffffffffffffffffffffffffff1663d0679d348460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f7e57600080fd5b505af1158015612f92573d6000803e3d6000fd5b505050506040513d6020811015612fa857600080fd5b810190808051906020019092919050505061302b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f657363726f7765722073656e64206661696c757265000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f39e3a9984488025e3a162a593e8e94e7f8eab80cd7e70d23c46c8e1e8101c7398460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250505050565b6000829050600082600801549050600083600801819055508173ffffffffffffffffffffffffffffffffffffffff1663d0679d348460050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b505050506040513d60208110156131bc57600080fd5b810190808051906020019092919050505061323f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f70617965652073656e64206661696c757265000000000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f39e3a9984488025e3a162a593e8e94e7f8eab80cd7e70d23c46c8e1e8101c7398460050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250505050565b60006132ef8383613408565b905092915050565b60008282111561336f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110156133fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000604182511461341c5760009050613506565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156134705760009350505050613506565b601b8160ff16141580156134885750601c8160ff1614155b156134995760009350505050613506565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156134f6573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b604051806080016040528060008152602001600080191681526020016000815260200160008019168152509056fe4f6e6c792063616c6c61626c652062792074686520457363726f7720636f6e7472616374457363726f77206d75737420626520696e2073746174652050757a7a6c65506f7374656443616e206f6e6c792062652063616c6c656420627920657363726f7720666163746f7279457363726f7720666f72636520726566756e642074696d656c6f636b206e6f742072656163686564576974686472617720617474656d70746564206265666f726520657363726f7720697320636c6f736564a265627a7a7231582033e4fc478925a8af1a370ee7970dac21d70ba854a069a9f3c2712f1aea79009c64736f6c634300050c0032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639771b7de1161008c578063bdd1daaa11610066578063bdd1daaa14610756578063c4de5dce146107a0578063d4b64dad1461091c578063f2aecf4614610960576100cf565b80639771b7de14610534578063a34e7d2a14610578578063a37eec6214610671576100cf565b8063054848b6146100d45780633fb6c74e14610141578063477230b2146101855780635437e4011461030657806357c1766d14610356578063701554591461039a575b600080fd5b610116600480360360208110156100ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109ae565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6101836004803603602081101561015757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109de565b005b6101c76004803603602081101561019b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c56565b604051808b81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018460048111156102dd57fe5b60ff1681526020018381526020018281526020019a505050505050505050505060405180910390f35b6103546004803603604081101561031c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050610d57565b005b6103986004803603602081101561036c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f32565b005b610532600480360360e08110156103b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561041557600080fd5b82018360208201111561042757600080fd5b8035906020019184600183028401116401000000008311171561044957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104ac57600080fd5b8201836020820111156104be57600080fd5b803590602001918460018302840111640100000000831117156104e057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061116a565b005b6105766004803603602081101561054a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116d7565b005b61066f600480360361010081101561058f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a34565b005b6107546004803603606081101561068757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106ce57600080fd5b8201836020820111156106e057600080fd5b8035906020019184600183028401116401000000008311171561070257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ef8565b005b61075e61239e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61091a600480360360808110156107b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156107fd57600080fd5b82018360208201111561080f57600080fd5b8035906020019184600183028401116401000000008311171561083157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561089457600080fd5b8201836020820111156108a657600080fd5b803590602001918460018302840111640100000000831117156108c857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506123c3565b005b61095e6004803603602081101561093257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128bf565b005b6109ac6004803603604081101561097657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b2f565b005b60026020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060026004811115610a2e57fe5b8160060160149054906101000a900460ff166004811115610a4b57fe5b14610abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b6202a300816001015401421015610b20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806135a76028913960400191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b6857600080fd5b505af1158015610b7c573d6000803e3d6000fd5b505050506040513d6020811015610b9257600080fd5b8101908080519060200190929190505050816007018190555060048160060160146101000a81548160ff02191690836004811115610bcc57fe5b0217905550600081600701541115610be957610be88282612ebb565b5b8173ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6004600060405180836004811115610c3557fe5b60ff1681526020018260001b81526020019250505060405180910390a25050565b60016020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160149054906101000a900460ff1690806007015490806008015490508a565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600480811115610da657fe5b8160060160149054906101000a900460ff166004811115610dc357fe5b14610e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806135cf602a913960400191505060405180910390fd5b8115610ea8576000816007015411610e99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f657363726f7765722062616c616e63652069732030000000000000000000000081525060200191505060405180910390fd5b610ea38382612ebb565b610f2d565b6000816008015411610f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f70617965652062616c616e63652069732030000000000000000000000000000081525060200191505060405180910390fd5b610f2c83826130cf565b5b505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ff9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061353b6024913960400191505060405180910390fd5b6001600481111561100657fe5b8160060160149054906101000a900460ff16600481111561102357fe5b14611096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f457363726f77206d75737420626520696e20737461746520556e66756e64656481525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f511c3b325f63024e6754176648b89f4bab878b1712366d9bf3729c501dcbad798373ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561111657600080fd5b505af115801561112a573d6000803e3d6000fd5b505050506040513d602081101561114057600080fd5b81019080805190602001909291905050506040518082815260200191505060405180910390a25050565b6000600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600260048111156111ba57fe5b8160060160149054906101000a900460ff1660048111156111d757fe5b1461124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b60606040518060400160405280600381526020017f3134390000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250828b600260038111156112cb57fe5b8c8c8c8c6040516020018089805190602001908083835b6020831061130557805182526020820191506020810190506020830392506112e2565b6001836020036101000a03801982511681845116808217855250505050505090500188805190602001908083835b602083106113565780518252602082019150602081019050602083039250611333565b6001836020036101000a0380198251168184511680821785525050505050509050018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018660ff1660ff1660f81b8152600101858152602001848152602001838152602001828152602001985050505050505050506040516020818303038152906040528051906020012090508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661143b82876132e3565b73ffffffffffffffffffffffffffffffffffffffff16146114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c696420657363726f7765722073696700000000000000000000000081525060200191505060405180910390fd5b8260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661150982866132e3565b73ffffffffffffffffffffffffffffffffffffffff1614611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c69642070617965652073696700000000000000000000000000000081525060200191505060405180910390fd5b604051806080016040528089815260200188815260200187815260200182815250600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505060038360060160146101000a81548160ff0219169083600481111561163e57fe5b0217905550888360080181905550611675886116678b86600001546132f790919063ffffffff16565b6132f790919063ffffffff16565b83600701819055508973ffffffffffffffffffffffffffffffffffffffff167fba17d7bcab79df89a9c2ce06d6ae417e98df55f0768715b7cee8e00a41cc6f0c826040518082815260200191505060405180910390a250505050505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506001600481111561172757fe5b8160060160149054906101000a900460ff16600481111561174457fe5b146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f457363726f77206d75737420626520696e20737461746520556e66756e64656481525060200191505060405180910390fd5b600082905060008260000154905060008273ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561180f57600080fd5b505af1158015611823573d6000803e3d6000fd5b505050506040513d602081101561183957600080fd5b81019080805190602001909291905050509050818110156118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f457363726f77206e6f742066756e64656400000000000000000000000000000081525060200191505060405180910390fd5b60028460060160146101000a81548160ff021916908360048111156118e357fe5b02179055508473ffffffffffffffffffffffffffffffffffffffff167fa6ad72bd1facaeefbc0081332e37b7f9e50ab106dac569b8913e2e5cdee2bb7060405160405180910390a281811115611a2d578273ffffffffffffffffffffffffffffffffffffffff1663d0679d348560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661198785856132f790919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d6020811015611a1a57600080fd5b8101908080519060200190929190505050505b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806135836024913960400191505060405180910390fd5b60006004811115611ae657fe5b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060160149054906101000a900460ff166004811115611b4157fe5b14611bb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f457363726f7720616c726561647920657869737473000000000000000000000081525060200191505060405180910390fd5b60008711611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f457363726f7720616d6f756e7420746f6f206c6f77000000000000000000000081525060200191505060405180910390fd5b600080905060008090506040518061014001604052808a81526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160016004811115611ce557fe5b815260200183815260200182815250600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160060160146101000a81548160ff02191690836004811115611ece57fe5b02179055506101008201518160070155610120820151816008015590505050505050505050505050565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060026004811115611f4857fe5b8160060160149054906101000a900460ff166004811115611f6557fe5b14611fd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b8060010154421015612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f457363726f772074696d656c6f636b206e6f742072656163686564000000000081525060200191505060405180910390fd5b60606040518060400160405280600281526020017f3533000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525082876003808111156120d257fe5b886040516020018086805190602001908083835b6020831061210957805182526020820191506020810190506020830392506120e6565b6001836020036101000a03801982511681845116808217855250505050505090500185805190602001908083835b6020831061215a5780518252602082019150602081019050602083039250612137565b6001836020036101000a0380198251168184511680821785525050505050509050018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018360ff1660ff1660f81b8152600101828152602001955050505050506040516020818303038152906040528051906020012090508260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661222a82866132e3565b73ffffffffffffffffffffffffffffffffffffffff16146122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c696420657363726f7765722073696700000000000000000000000081525060200191505060405180910390fd5b8483600801819055506122d38584600001546132f790919063ffffffff16565b836007018190555060048360060160146101000a81548160ff021916908360048111156122fc57fe5b0217905550600083600701541115612319576123188684612ebb565b5b6000836008015411156123315761233086846130cf565b5b8573ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6000836040518083600481111561237c57fe5b60ff1681526020018281526020019250505060405180910390a2505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506002600481111561241357fe5b8160060160149054906101000a900460ff16600481111561243057fe5b146124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f457363726f77206d75737420626520696e207374617465204f70656e0000000081525060200191505060405180910390fd5b60606040518060400160405280600281526020017f3533000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525082886001600381111561252457fe5b896040516020018086805190602001908083835b6020831061255b5780518252602082019150602081019050602083039250612538565b6001836020036101000a03801982511681845116808217855250505050505090500185805190602001908083835b602083106125ac5780518252602082019150602081019050602083039250612589565b6001836020036101000a0380198251168184511680821785525050505050509050018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018360ff1660ff1660f81b8152600101828152602001955050505050506040516020818303038152906040528051906020012090508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661267c82876132e3565b73ffffffffffffffffffffffffffffffffffffffff1614612705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c696420657363726f77657220636173686f7574207369670000000081525060200191505060405180910390fd5b8260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661274a82866132e3565b73ffffffffffffffffffffffffffffffffffffffff16146127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c696420706179656520636173686f7574207369670000000000000081525060200191505060405180910390fd5b8583600801819055506127f38684600001546132f790919063ffffffff16565b836007018190555060048360060160146101000a81548160ff0219169083600481111561281c57fe5b0217905550600083600701541115612839576128388784612ebb565b5b6000836008015411156128515761285087846130cf565b5b8673ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6003836040518083600481111561289c57fe5b60ff1681526020018281526020019250505060405180910390a250505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506003600481111561290f57fe5b8160060160149054906101000a900460ff16600481111561292c57fe5b14612982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061355f6024913960400191505060405180910390fd5b61298a61350c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090508060400151421015612a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f50757a7a6c652074696d656c6f636b206e6f742072656163686564000000000081525060200191505060405180910390fd5b612a938160000151836007015461338090919063ffffffff16565b826007018190555060048260060160146101000a81548160ff02191690836004811115612abc57fe5b02179055508273ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6001836060015160405180836004811115612b1057fe5b60ff1681526020018281526020019250505060405180910390a2505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060036004811115612b7f57fe5b8160060160149054906101000a900460ff166004811115612b9c57fe5b14612bf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061355f6024913960400191505060405180910390fd5b612bfa61350c565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000600284604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612cc55780518252602082019150602081019050602083039250612ca2565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015612d07573d6000803e3d6000fd5b5050506040513d6020811015612d1c57600080fd5b8101908080519060200190929190505050905081602001518114612da8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e76616c696420707265696d6167650000000000000000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f206fdb7f1bb710f91aa27c794fd6a39e4ff1377d3b4b0bb49687a4c079bbd758858460600151604051808381526020018281526020019250505060405180910390a2612e1d8260000151846008015461338090919063ffffffff16565b836008018190555060048360060160146101000a81548160ff02191690836004811115612e4657fe5b02179055508473ffffffffffffffffffffffffffffffffffffffff167faaeadc493bde97bcc1d65fc982df495dff306008f03bf6b8401117ab8e028f2d6002846060015160405180836004811115612e9a57fe5b60ff1681526020018281526020019250505060405180910390a25050505050565b6000829050600082600701549050600083600701819055508173ffffffffffffffffffffffffffffffffffffffff1663d0679d348460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f7e57600080fd5b505af1158015612f92573d6000803e3d6000fd5b505050506040513d6020811015612fa857600080fd5b810190808051906020019092919050505061302b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f657363726f7765722073656e64206661696c757265000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f39e3a9984488025e3a162a593e8e94e7f8eab80cd7e70d23c46c8e1e8101c7398460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250505050565b6000829050600082600801549050600083600801819055508173ffffffffffffffffffffffffffffffffffffffff1663d0679d348460050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b505050506040513d60208110156131bc57600080fd5b810190808051906020019092919050505061323f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f70617965652073656e64206661696c757265000000000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f39e3a9984488025e3a162a593e8e94e7f8eab80cd7e70d23c46c8e1e8101c7398460050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a250505050565b60006132ef8383613408565b905092915050565b60008282111561336f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110156133fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000604182511461341c5760009050613506565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156134705760009350505050613506565b601b8160ff16141580156134885750601c8160ff1614155b156134995760009350505050613506565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156134f6573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b604051806080016040528060008152602001600080191681526020016000815260200160008019168152509056fe4f6e6c792063616c6c61626c652062792074686520457363726f7720636f6e7472616374457363726f77206d75737420626520696e2073746174652050757a7a6c65506f7374656443616e206f6e6c792062652063616c6c656420627920657363726f7720666163746f7279457363726f7720666f72636520726566756e642074696d656c6f636b206e6f742072656163686564576974686472617720617474656d70746564206265666f726520657363726f7720697320636c6f736564a265627a7a7231582033e4fc478925a8af1a370ee7970dac21d70ba854a069a9f3c2712f1aea79009c64736f6c634300050c0032

Deployed Bytecode Sourcemap

8040:16609:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8040:16609:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11535:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11535:47:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18248:728;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18248:728:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11367:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11367:47:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22891:574;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22891:574:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13131:400;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13131:400:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;19593:1467;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;19593:1467:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19593:1467:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19593:1467:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19593:1467:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;19593:1467:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19593:1467:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19593:1467:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19593:1467:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;19593:1467:0;;;;;;;;;;;;;;;:::i;:::-;;13741:848;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13741:848:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11996:917;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;11996:917:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16693:1248;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16693:1248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;16693:1248:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16693:1248:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16693:1248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16693:1248:0;;;;;;;;;;;;;;;:::i;:::-;;11280:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14845:1339;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;14845:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;14845:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14845:1339:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14845:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;14845:1339:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;14845:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14845:1339:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14845:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;14845:1339:0;;;;;;;;;;;;;;;:::i;:::-;;22216:667;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22216:667:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;21281:782;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21281:782:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11535:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18248:728::-;18310:33;18346:7;:22;18354:13;18346:22;;;;;;;;;;;;;;;18310:58;;18415:16;18387:44;;;;;;;;:12;:24;;;;;;;;;;;;:44;;;;;;;;;18379:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8212:6;18490:12;:27;;;:47;18483:3;:54;;18475:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18634:13;18626:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18626:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18626:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18626:32:0;;;;;;;;;;;;;;;;18595:12;:28;;:63;;;;18696:18;18669:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;18761:1;18730:12;:28;;;:32;18727:78;;;18764:41;18777:13;18792:12;18764;:41::i;:::-;18727:78;18918:13;18905:63;;;18933:29;18964:3;18905:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18248:728;;:::o;11367:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22891:574::-;22965:33;23001:7;:22;23009:13;23001:22;;;;;;;;;;;;;;;22965:58;;23072:18;23044:46;;;;;;;;:12;:24;;;;;;;;;;;;:46;;;;;;;;;23036:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23153:8;23150:308;;;23217:1;23186:12;:28;;;:32;23178:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23259:41;23272:13;23287:12;23259;:41::i;:::-;23150:308;;;23369:1;23341:12;:25;;;:29;23333:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23408:38;23418:13;23433:12;23408:9;:38::i;:::-;23150:308;22891:574;;;:::o;13131:400::-;13193:33;13229:7;:22;13237:13;13229:22;;;;;;;;;;;;;;;13193:58;;13286:13;13272:27;;:10;:27;;;13264:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13387:20;13359:48;;;;;;;;:12;:24;;;;;;;;;;;;:48;;;;;;;;;13351:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13475:13;13462:61;;;13498:13;13490:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13490:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13490:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13490:32:0;;;;;;;;;;;;;;;;13462:61;;;;;;;;;;;;;;;;;;13131:400;;:::o;19593:1467::-;19854:33;19890:7;:22;19898:13;19890:22;;;;;;;;;;;;;;;19854:58;;19959:16;19931:44;;;;;;;;:12;:24;;;;;;;;;;;;:44;;;;;;;;;19923:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20090:27;:35;;;;;;;;;;;;;;;;;;;20136:15;20195:16;;;;;;;;;;;;;;;;;20226:13;20254;20288:20;20282:27;;;;;;;;20324:16;20355:11;20381:6;20402:14;20164:263;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20164:263:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20164:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20164:263:0;;;20154:274;;;;;;20136:292;;20474:12;:26;;;;;;;;;;;;20449:51;;:21;20456:7;20465:4;20449:6;:21::i;:::-;:51;;;20441:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20569:12;:23;;;;;;;;;;;;20544:48;;:21;20551:7;20560:4;20544:6;:21::i;:::-;:48;;;20536:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20652:121;;;;;;;;20679:11;20652:121;;;;20705:6;20652:121;;;;20726:14;20652:121;;;;20755:7;20652:121;;;20627:7;:22;20635:13;20627:22;;;;;;;;;;;;;;;:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20813:24;20786:12;:24;;;:51;;;;;;;;;;;;;;;;;;;;;;;;20876:16;20848:12;:25;;:44;;;;20934:64;20986:11;20934:47;20964:16;20934:12;:25;;;:29;;:47;;;;:::i;:::-;:51;;:64;;;;:::i;:::-;20903:12;:28;;:95;;;;21029:13;21016:36;;;21044:7;21016:36;;;;;;;;;;;;;;;;;;19593:1467;;;;;;;;;;:::o;13741:848::-;13802:33;13838:7;:22;13846:13;13838:22;;;;;;;;;;;;;;;13802:58;;13907:20;13879:48;;;;;;;;:12;:24;;;;;;;;;;;;:48;;;;;;;;;13871:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13985:14;14010:13;13985:39;;14035:17;14055:12;:25;;;14035:45;;14091:18;14112:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14112:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14112:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14112:16:0;;;;;;;;;;;;;;;;14091:37;;14231:12;14214:13;:29;;14206:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14305:16;14278:12;:24;;;:43;;;;;;;;;;;;;;;;;;;;;;;;14350:13;14337:27;;;;;;;;;;;;14468:12;14452:13;:28;14449:133;;;14496:6;:11;;;14508:12;:28;;;;;;;;;;;;14538:31;14556:12;14538:13;:17;;:31;;;;:::i;:::-;14496:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14496:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14496:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14496:74:0;;;;;;;;;;;;;;;;;14449:133;13741:848;;;;;:::o;11996:917::-;11721:13;;;;;;;;;;;11707:27;;:10;:27;;;11699:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12366:16;12335:47;;;;;;;;:7;:15;12343:6;12335:15;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:47;;;;;;;;;12327:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12442:1;12427:12;:16;12419:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12482:28;12513:1;12482:32;;12525:25;12553:1;12525:29;;12585:320;;;;;;;;12612:12;12585:320;;;;12639:8;12585:320;;;;12662:15;12585:320;;;;;;12692:13;12585:320;;;;;;12720:14;12585:320;;;;;;12749:12;12585:320;;;;;;12776:10;12585:320;;;;;;12801:20;12585:320;;;;;;;;;;;;12836:23;12585:320;;;;12874:20;12585:320;;;12567:7;:15;12575:6;12567:15;;;;;;;;;;;;;;;:338;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11786:1;;11996:917;;;;;;;;:::o;16693:1248::-;16788:33;16824:7;:22;16832:13;16824:22;;;;;;;;;;;;;;;16788:58;;16893:16;16865:44;;;;;;;;:12;:24;;;;;;;;;;;;:44;;;;;;;;;16857:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16968:12;:27;;;16961:3;:34;;16953:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17102:27;:34;;;;;;;;;;;;;;;;;;;17147:15;17206:16;;;;;;;;;;;;;;;;;17237:13;17265;17299:20;17293:27;;;;;;;;17335:12;17175:183;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17175:183:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17175:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17175:183:0;;;17165:194;;;;;;17147:212;;17433:12;:27;;;;;;;;;;;;17408:52;;:21;17415:7;17424:4;17408:6;:21::i;:::-;:52;;;17400:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17526:12;17498;:25;;:40;;;;17580:43;17610:12;17580;:25;;;:29;;:43;;;;:::i;:::-;17549:12;:28;;:74;;;;17661:18;17634:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;17726:1;17695:12;:28;;;:32;17692:78;;;17729:41;17742:13;17757:12;17729;:41::i;:::-;17692:78;17812:1;17784:12;:25;;;:29;17781:72;;;17815:38;17825:13;17840:12;17815:9;:38::i;:::-;17781:72;17884:13;17871:62;;;17899:24;17925:7;17871:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16693:1248;;;;;;:::o;11280:28::-;;;;;;;;;;;;;:::o;14845:1339::-;15017:33;15053:7;:22;15061:13;15053:22;;;;;;;;;;;;;;;15017:58;;15122:16;15094:44;;;;;;;;:12;:24;;;;;;;;;;;;:44;;;;;;;;;15086:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15238:27;:34;;;;;;;;;;;;;;;;;;;15283:15;15342:16;;;;;;;;;;;;;;;;;15373:13;15401;15435:21;15429:28;;;;;;;;15472:12;15311:184;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15311:184:0;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15311:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15311:184:0;;;15301:195;;;;;;15283:213;;15571:12;:26;;;;;;;;;;;;15546:51;;:21;15553:7;15562:4;15546:6;:21::i;:::-;:51;;;15538:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15674:12;:23;;;;;;;;;;;;15649:48;;:21;15656:7;15665:4;15649:6;:21::i;:::-;:48;;;15641:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15768:12;15740;:25;;:40;;;;15822:43;15852:12;15822;:25;;;:29;;:43;;;;:::i;:::-;15791:12;:28;;:74;;;;15903:18;15876:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;15968:1;15937:12;:28;;;:32;15934:78;;;15971:41;15984:13;15999:12;15971;:41::i;:::-;15934:78;16054:1;16026:12;:25;;;:29;16023:72;;;16057:38;16067:13;16082:12;16057:9;:38::i;:::-;16023:72;16126:13;16113:63;;;16141:25;16168:7;16113:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14845:1339;;;;;;;:::o;22216:667::-;22279:33;22315:7;:22;22323:13;22315:22;;;;;;;;;;;;;;;22279:58;;22384:24;22356:52;;;;;;;;:12;:24;;;;;;;;;;;;:52;;;;;;;;;22348:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22462:32;;:::i;:::-;22497:7;:22;22505:13;22497:22;;;;;;;;;;;;;;;22462:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22545:12;:27;;;22538:3;:34;;22530:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22656:58;22689:12;:24;;;22656:12;:28;;;:32;;:58;;;;:::i;:::-;22625:12;:28;;:89;;;;22752:18;22725:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;22801:13;22788:87;;;22816:30;22848:12;:26;;;22788:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22216:667;;;:::o;21281:782::-;21361:33;21397:7;:22;21405:13;21397:22;;;;;;;;;;;;;;;21361:58;;21466:24;21438:52;;;;;;;;:12;:24;;;;;;;;;;;;:52;;;;;;;;;21430:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21544:32;;:::i;:::-;21579:7;:22;21587:13;21579:22;;;;;;;;;;;;;;;21544:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21612:9;21624:34;21648:8;21631:26;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21631:26:0;;;21624:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;21624:34:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21624:34:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21624:34:0;;;;;;;;;;;;;;;;21612:46;;21682:12;:19;;;21677:1;:24;21669:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21747:13;21738:61;;;21762:8;21772:12;:26;;;21738:61;;;;;;;;;;;;;;;;;;;;;;;;21840:55;21870:12;:24;;;21840:12;:25;;;:29;;:55;;;;:::i;:::-;21812:12;:25;;:83;;;;21933:18;21906:12;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;21982:13;21969:86;;;21997:29;22028:12;:26;;;21969:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21281:782;;;;;:::o;23473:430::-;23573:14;23598:13;23573:39;;23625:17;23645:12;:28;;;23625:48;;23715:1;23684:12;:28;;:32;;;;23735:6;:11;;;23747:12;:28;;;;;;;;;;;;23777:12;23735:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23735:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23735:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23735:55:0;;;;;;;;;;;;;;;;23727:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23851:13;23834:61;;;23866:12;:28;;;;;;;;;;;;23834:61;;;;;;;;;;;;;;;;;;;;;;23473:430;;;;:::o;23911:412::-;24008:14;24033:13;24008:39;;24060:17;24080:12;:25;;;24060:45;;24144:1;24116:12;:25;;:29;;;;24164:6;:11;;;24176:12;:25;;;;;;;;;;;;24203:12;24164:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24164:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24164:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24164:52:0;;;;;;;;;;;;;;;;24156:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24274:13;24257:58;;;24289:12;:25;;;;;;;;;;;;24257:58;;;;;;;;;;;;;;;;;;;;;;23911:412;;;;:::o;24500:146::-;24573:15;24611:27;24625:7;24634:3;24611:13;:27::i;:::-;24601:37;;24500:146;;;;:::o;1377:184::-;1435:7;1468:1;1463;:6;;1455:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1515:9;1531:1;1527;:5;1515:17;;1552:1;1545:8;;;1377:184;;;;:::o;921:181::-;979:7;999:9;1015:1;1011;:5;999:17;;1040:1;1035;:6;;1027:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1093:1;1086:8;;;921:181;;;;:::o;5236:1930::-;5314:7;5397:2;5377:9;:16;:22;5373:74;;5432:1;5416:19;;;;5373:74;5516:9;5536;5556:7;5808:4;5797:9;5793:20;5787:27;5782:32;;5854:4;5843:9;5839:20;5833:27;5828:32;;5908:4;5897:9;5893:20;5887:27;5884:1;5879:36;5874:41;;6838:66;6833:1;6825:10;;:79;6821:129;;;6936:1;6921:17;;;;;;;6821:129;6971:2;6966:1;:7;;;;:18;;;;;6982:2;6977:1;:7;;;;6966:18;6962:68;;;7016:1;7001:17;;;;;;;6962:68;7134:24;7144:4;7150:1;7153;7156;7134:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7134:24:0;;;;;;;;7127:31;;;;;5236:1930;;;;;:::o;8040:16609::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://33e4fc478925a8af1a370ee7970dac21d70ba854a069a9f3c2712f1aea79009c

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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.