APE Price: $0.19 (-3.36%)

Contract

0xB08C669dc0419151bA4e4920E80128802dB5497b

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo56.434055 APE

APE Value

$10.54 (@ $0.19/APE)

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To
Play327842032026-01-24 16:33:5128 mins ago1769272431IN
0xB08C669d...02dB5497b
1.07321158 APE0.06896389101.68276
Play327841692026-01-24 16:32:5629 mins ago1769272376IN
0xB08C669d...02dB5497b
1.07321158 APE0.06896399101.68276
Play327841582026-01-24 16:32:3929 mins ago1769272359IN
0xB08C669d...02dB5497b
1.07321158 APE0.06867928101.68276
Play327841482026-01-24 16:32:1929 mins ago1769272339IN
0xB08C669d...02dB5497b
1.07321158 APE0.07244154101.68276
Play327809022026-01-24 14:56:342 hrs ago1769266594IN
0xB08C669d...02dB5497b
100.07321158 APE0.06896399101.68276
Play327808872026-01-24 14:56:182 hrs ago1769266578IN
0xB08C669d...02dB5497b
100.07321158 APE0.06896399101.68276
Play327808772026-01-24 14:56:012 hrs ago1769266561IN
0xB08C669d...02dB5497b
300.07321158 APE0.06896399101.68276
Play327808562026-01-24 14:55:452 hrs ago1769266545IN
0xB08C669d...02dB5497b
100.07321158 APE0.06896389101.68276
Play327808422026-01-24 14:55:322 hrs ago1769266532IN
0xB08C669d...02dB5497b
100.07321158 APE0.06896399101.68276
Play327808252026-01-24 14:55:102 hrs ago1769266510IN
0xB08C669d...02dB5497b
300.07321158 APE0.06896389101.68276
Play327808002026-01-24 14:54:522 hrs ago1769266492IN
0xB08C669d...02dB5497b
100.07321158 APE0.06896277101.68276
Play327807822026-01-24 14:54:352 hrs ago1769266475IN
0xB08C669d...02dB5497b
100.07321158 APE0.06896399101.68276
Play327807672026-01-24 14:54:202 hrs ago1769266460IN
0xB08C669d...02dB5497b
100.07321158 APE0.06896389101.68276
Play327807462026-01-24 14:53:462 hrs ago1769266426IN
0xB08C669d...02dB5497b
100.07321158 APE0.06896267101.68276
Play327807392026-01-24 14:53:312 hrs ago1769266411IN
0xB08C669d...02dB5497b
100.07321158 APE0.06896033101.68276
Play327775562026-01-24 13:32:063 hrs ago1769261526IN
0xB08C669d...02dB5497b
1.07321158 APE0.06896399101.68276
Play327775452026-01-24 13:31:473 hrs ago1769261507IN
0xB08C669d...02dB5497b
1.07321158 APE0.06896399101.68276
Play327775282026-01-24 13:31:233 hrs ago1769261483IN
0xB08C669d...02dB5497b
1.07321158 APE0.06896399101.68276
Play327775142026-01-24 13:30:593 hrs ago1769261459IN
0xB08C669d...02dB5497b
1.07321158 APE0.07244032101.68276
Play327546822026-01-24 2:08:5514 hrs ago1769220535IN
0xB08C669d...02dB5497b
3.07321158 APE0.07121718101.68276
Play327546702026-01-24 2:08:4314 hrs ago1769220523IN
0xB08C669d...02dB5497b
3.07321158 APE0.07121718101.68276
Play327542782026-01-24 1:57:2815 hrs ago1769219848IN
0xB08C669d...02dB5497b
300.07321158 APE0.06898961101.68276
Play327542662026-01-24 1:57:1315 hrs ago1769219833IN
0xB08C669d...02dB5497b
300.07321158 APE0.06898961101.68276
Play327542522026-01-24 1:56:5615 hrs ago1769219816IN
0xB08C669d...02dB5497b
300.07321158 APE0.06898839101.68276
Play327542412026-01-24 1:56:3915 hrs ago1769219799IN
0xB08C669d...02dB5497b
300.07321158 APE0.06898961101.68276
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
327842062026-01-24 16:33:5428 mins ago1769272434
0xB08C669d...02dB5497b
0.99 APE
327842032026-01-24 16:33:5128 mins ago1769272431
0xB08C669d...02dB5497b
0.07321158 APE
327842032026-01-24 16:33:5128 mins ago1769272431
0xB08C669d...02dB5497b
0.01 APE
327841722026-01-24 16:32:5729 mins ago1769272377
0xB08C669d...02dB5497b
0.99 APE
327841692026-01-24 16:32:5629 mins ago1769272376
0xB08C669d...02dB5497b
0.07321158 APE
327841692026-01-24 16:32:5629 mins ago1769272376
0xB08C669d...02dB5497b
0.01 APE
327841592026-01-24 16:32:4129 mins ago1769272361
0xB08C669d...02dB5497b
0.99 APE
327841582026-01-24 16:32:3929 mins ago1769272359
0xB08C669d...02dB5497b
0.07321158 APE
327841582026-01-24 16:32:3929 mins ago1769272359
0xB08C669d...02dB5497b
0.01 APE
327841502026-01-24 16:32:2129 mins ago1769272341
0xB08C669d...02dB5497b
0.99 APE
327841482026-01-24 16:32:1929 mins ago1769272339
0xB08C669d...02dB5497b
0.07321158 APE
327841482026-01-24 16:32:1929 mins ago1769272339
0xB08C669d...02dB5497b
0.01 APE
327809042026-01-24 14:56:362 hrs ago1769266596
0xB08C669d...02dB5497b
99 APE
327809022026-01-24 14:56:342 hrs ago1769266594
0xB08C669d...02dB5497b
0.07321158 APE
327809022026-01-24 14:56:342 hrs ago1769266594
0xB08C669d...02dB5497b
1 APE
327808912026-01-24 14:56:202 hrs ago1769266580
0xB08C669d...02dB5497b
99 APE
327808872026-01-24 14:56:182 hrs ago1769266578
0xB08C669d...02dB5497b
0.07321158 APE
327808872026-01-24 14:56:182 hrs ago1769266578
0xB08C669d...02dB5497b
1 APE
327808782026-01-24 14:56:022 hrs ago1769266562
0xB08C669d...02dB5497b
297 APE
327808772026-01-24 14:56:012 hrs ago1769266561
0xB08C669d...02dB5497b
0.07321158 APE
327808772026-01-24 14:56:012 hrs ago1769266561
0xB08C669d...02dB5497b
3 APE
327808572026-01-24 14:55:462 hrs ago1769266546
0xB08C669d...02dB5497b
99 APE
327808562026-01-24 14:55:452 hrs ago1769266545
0xB08C669d...02dB5497b
0.07321158 APE
327808562026-01-24 14:55:452 hrs ago1769266545
0xB08C669d...02dB5497b
1 APE
327808432026-01-24 14:55:332 hrs ago1769266533
0xB08C669d...02dB5497b
99 APE
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Baccarat

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2025-06-10
*/

//SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

interface IGovernanceManager {
    function RNG() external view returns (address);
    function owner() external view returns (address);
    function referralManager() external view returns (address);
    function feeReceiver() external view returns (address);
    function claimManager() external view returns (address);
    function house() external view returns (address);
    function isGame(address game) external view returns (bool);
    function userInfoTracker() external view returns (address);
    function canPlayForOthers(address addr) external view returns (bool);
    function paused() external view returns (bool);
    function isAdmin(address admin) external view returns (bool);
}

interface IRNG {
    function requestRandom(bytes32 userRandomNumber, uint8 numWords) external payable returns (uint64);
    function getFee() external view returns (uint256);
}

contract ApeOwnable {

    // Governance Manager
    IGovernanceManager public constant manager = IGovernanceManager(0x8632f22e5A921C751CFbBFF92F058A3b11E96b8a);

    modifier onlyOwner() {
        require(
            msg.sender == manager.owner(),
            'Only Owner'
        );
        _;
    }

    modifier onlyGame() {
        require(
            manager.isGame(msg.sender),
            'UnAuthorized'
        );
        _;
    }

    modifier onlyRNG() {
        require(
            msg.sender == manager.RNG(),
            'Only RNG Contract'
        );
        _;
    }

    modifier validatePlayer(address player) {
        if (player != msg.sender) {
            require(
                manager.canPlayForOthers(msg.sender),
                'UnAuthorized To Play For Others'
            );
        }
        _;
    }

    modifier notPaused() {
        require(
            manager.paused() == false,
            'All Games Paused'
        );
        _;
    }

    modifier onlyAdmin() {
        require(
            manager.isAdmin(msg.sender),
            'UnAuthorized'
        );
        _;
    }
}

interface IGame {
    /**
        Callback to provide us with randomness
     */
    function fulfillRandomWords(
        uint64 requestId,
        uint256[] calldata randomWords
    ) external;

    function play(address user, bytes calldata gameData) external payable;
}

interface IUserInfoTracker {
    function wagered(address user, uint256 amount, uint256 GAME_ID) external;
}

interface IClaimManager {
    function credit(
        uint256 GAME_ID,
        address user
    ) external payable;
}

interface IHistoryManager {
    function addData(address user, uint256 GAME_ID, uint256 gameId) external;
}

interface IFeeRecipient {
    function takeFee(address ref, address player) external payable;
}

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}

interface IHouse {
    
    /**
        House has profited from game, call this to send value into the house and emit the correct event for SubGraphs
     */
    function houseProfit(uint256 GAME_ID) external payable;

    /**
        Function Games Call to tell the house that a user has won the bet
     */
    function payout(uint256 GAME_ID, address user, uint256 value) external;
    
    /**
        Read function to determine the maximum payout allowed by the house at the current time
     */
    function maxPayout() external view returns (uint256);

    /**
        Randomness has been requested, withdrawals are paused until it is resolved by called `randomRequestResolved()`
     */
    function randomRequested() external;

    /**
        Resolves a random request from chainlink, allowing house users to withdraw
     */
    function randomRequestResolved() external;

}

/**
    Game Master Class, any inheriting game must pass the necessary fields into the constructor
 */
contract GameMasterclass is ApeOwnable, IGame {

    // GAME ID
    uint256 public immutable GAME_ID;

    // History Manager
    IHistoryManager public immutable history;

    /** Game Is Either Paused Or Unpaused */
    bool public paused = false;

    /** List of all used game ids */
    uint256[] public usedGameIds;
    mapping ( uint256 => bool ) internal isUsedGameId;

    // request ID => GameID
    mapping ( uint64 => uint256 ) private requestToGame;

    /// @notice emitted after a random request has been sent out
    event RandomnessRequested(uint256 gameId);

    /**
        Builds The Necessary Components Of Any Game
     */
    constructor(
        uint256 GAME_ID_,
        address history_
    )  {

        // set other variables
        GAME_ID = GAME_ID_;
        history = IHistoryManager(history_);
    }

    //////////////////////////////////////
    ///////    OWNER FUNCTIONS    ////////
    //////////////////////////////////////

    function pause() external onlyOwner {
        paused = true;
    }

    function resume() external onlyOwner {
        paused = false;
    }

    function withdrawETH(address to, uint256 amount) external onlyOwner {
        (bool s,) = payable(to).call{value: amount}("");
        require(s);
    }

    function withdrawToken(address token, uint amount) external onlyOwner {
        TransferHelper.safeTransfer(token, msg.sender, amount);
    }

    function _registerBet(address user, uint256 amount) internal {
        IUserInfoTracker(manager.userInfoTracker()).wagered(user, amount, GAME_ID);
    }

    function _processFee(uint256 feeAmount, address ref, address player) internal {
        IFeeRecipient(manager.feeReceiver()).takeFee{value: feeAmount}(ref, player);
    }
    
    function getVRFFee() public view returns (uint256) {
        return IRNG(manager.RNG()).getFee();
    }

    function fulfillRandomWords(uint64 requestId, uint256[] calldata randomWords) external virtual {}

    function play(address player, bytes calldata gameData) external payable override validatePlayer(player) notPaused() {
        require(
            !paused,
            'Paused'
        );

        // play game
        _playGame(player, gameData);
    }

    function _playGame(address player, bytes calldata gameData) internal virtual {}

    function _handlePayout(address player, uint256 totalToPayout, uint256 amountForHouse) internal {

        if (totalToPayout > 0) {
            // there is a payout, we won something

            if (totalToPayout >= amountForHouse) {
                // the user has won more than we are giving to the house
                // this means we need to send them (to claim manager) amountForHouse directly
                // and only request that the house `payout` the difference!

                // add to user's claim manager the amount for the house
                IClaimManager(manager.claimManager()).credit{value: amountForHouse}(
                    GAME_ID,
                    player
                );

                // get the difference
                uint256 remaining = totalToPayout - amountForHouse;
                if (remaining > 0) {
                    // payout the rest from the house
                    IHouse(manager.house()).payout(GAME_ID, player, remaining);
                }
                
            } else {
                // the user has won less than we are giving to the house
                // pay them out directly in full, send whatever is left over to the house

                // add to user's claim manager the amount for the house
                IClaimManager(manager.claimManager()).credit{value: totalToPayout}(
                    GAME_ID,
                    player
                );

                // calculate remaining left for the house
                uint256 remaining = amountForHouse - totalToPayout;

                // send the remaining to the house
                IHouse(manager.house()).houseProfit{value: remaining }(GAME_ID);

            }
        
        } else {
            // we won nothing, send the house everything
            IHouse(manager.house()).houseProfit{value: amountForHouse }(GAME_ID);
        }

    }

    /// @dev logs the gameId in the used list and adds game to player's history
    function _registerGameId(address player, uint256 gameId) internal {

        // set history data
        history.addData(player, GAME_ID, gameId);

        // add to list of used game ids
        usedGameIds.push(gameId);
        isUsedGameId[gameId] = true;
    }

    function _requestRandom(uint256 gameId, uint8 numWords, bytes32 userRandomWord) internal {

        // request random words from RNG contract
        uint64 requestId = IRNG(manager.RNG()).requestRandom{value: getVRFFee()}(
            userRandomWord, // random user seed
            numWords        // the number of random results to return
        );

        // require that the requestId is unused
        require(
            requestToGame[requestId] == 0,
            'RequestId In Use'
        );

        // map this request ID to the game it belongs to
        requestToGame[requestId] = gameId;

        // set data in house
        IHouse(manager.house()).randomRequested();

        // emit event
        emit RandomnessRequested(gameId);
    }

    function _resolveRandom(uint64 requestId) internal {
        // resolve request in house
        IHouse(manager.house()).randomRequestResolved();

        // clear storage
        delete requestToGame[requestId];
    }

    function getGameIdFromRequest(uint64 requestId) internal view returns (uint256) {
        return requestToGame[requestId];
    }

    function getHouse() public view returns (address) {
        return manager.house();
    }

    function isValidGameId(uint256 gameId) public view returns (bool) {
        return isUsedGameId[gameId] == false && gameId > 0;
    }

    function batchCallIsUsedGameId(uint256[] calldata gameIds) external view returns (bool[] memory isUsed) {
        uint len = gameIds.length;
        isUsed = new bool[](len);
        for (uint i = 0; i < len;) {
            isUsed[i] = isUsedGameId[gameIds[i]];
            unchecked { ++i; }
        }
    }

    function paginateUsedGameIDs(uint256 start, uint256 end) external view returns (uint256[] memory) {
        if (end > usedGameIds.length) {
            end = usedGameIds.length;
        }
        uint256[] memory ids = new uint256[](end - start);
        for (uint i = start; i < end;) {
            ids[i - start] = usedGameIds[i];
            unchecked { ++i; }
        }
        return ids;
    }

    function numUsedGameIDs() external view returns (uint256) {
        return usedGameIds.length;
    }

    function getEssentialGameInfo(uint256[] calldata gameIds) external view virtual returns (
        address[] memory players,
        uint256[] memory buyInAmounts,
        uint256[] memory totalPayouts,
        uint256[] memory timestamps,
        bool[] memory hasEndeds
    ) {}

    function batchRawGameInfo(uint256[] calldata gameIds) external view virtual returns (bytes[] memory) {}
}

/**
    Baccarat PvH Game
 */
contract Baccarat is GameMasterclass {

    // payouts
    uint256 public constant PLAYER_PAYOUT = 200;
    uint256 public constant BANKER_PAYOUT = 195;
    uint256 public constant TIE_PAYOUT    = 900;

    // fees
    uint256 public playerBankerFee = 100;
    uint256 public tieFee          = 300;

    /** Fee Denominator */
    uint256 private constant FEE_DENOM = 10_000;

    // Game Struct
    struct Game {
        uint256 playerBankerBet;
        uint256 tieBet;
        uint256 payout;
        uint256 amountForHouse;
        address user;
        bool betOnBanker;
        uint8[] playerCards;
        uint8[] bankerCards;
        bool hasEnded;
        uint256 timestamp;
    }

    // return type
    struct GameInfoReturnType {
        uint256 playerBankerBet;
        uint256 tieBet;
        uint256 payout;
        address user;
        bool betOnBanker;
        uint8[] playerCards;
        uint8[] bankerCards;
        bool hasEnded;
        uint256 timestamp;
    }

    // mapping from GameID => Game
    mapping ( uint256 => Game ) public games;

    // request ID => GameID
    mapping ( uint256 => uint256 ) private requestToGame;

    // Gas to call the RNG
    uint32 public gasToCallRandom;

    // Min Buy In Gas
    uint256 public minBuyInGas;

    /// @notice emitted when the platform fee is changed
    event SetPlatformFees(uint256 newPlayerBankerFee, uint256 newTieFee);

    /// @notice emitted after a game has been started at a specific table
    event GameStarted(address indexed user, uint256 gameId);

    /// @notice Emitted after the VRF comes back with the index of the winning player
    event GameEnded(
        address indexed user, 
        uint256 gameId, 
        uint256 buyIn,
        uint256 payout
    );

    /// @notice Emitted if the fulfilRandomWords function needs to return out for any reason
    event FulfilRandomFailed(uint256 requestId, uint256 gameId, uint256[] randomWords);

    constructor(

        // Game ID
        uint256 GAME_ID_,

        /** History Manager */
        address history_

    ) GameMasterclass(GAME_ID_, history_) {}

    function setPlatformFees(uint256 newPlayerBankerFee, uint256 newTieFee) external onlyOwner {
        require(
            newPlayerBankerFee <= 120,
            'Cannot Exceed 1.2% Fee'
        );
        require(
            newTieFee <= 1_000,
            'Cannot Exceed 10% Fee'
        );
        playerBankerFee = newPlayerBankerFee;
        tieFee = newTieFee;
        emit SetPlatformFees(newPlayerBankerFee, newTieFee);
    }

    function _playGame(address player, bytes calldata gameData) internal override {

        // determine vrf fee
        uint256 vrfFee = getVRFFee();

        // decode game data
        (
            uint256 gameId,
            uint256 playerBankerBet,
            uint256 tieBet,
            bool isBanker,
            address ref,
            bytes32 userRandomWord
        ) = abi.decode(gameData, (uint256, uint256, uint256, bool, address, bytes32));

        // validate inputs
        require(
            msg.value >= vrfFee,
            'ERR: MIN BUY IN'
        );
        require(
            isValidGameId(gameId) == true,
            'Invalid Game ID'
        );

        // determine total bet amount
        uint256 totalBetAmount = msg.value - vrfFee;
        require(
            totalBetAmount > 0,
            'Invalid Bet Amount'
        );
        require(
            totalBetAmount == playerBankerBet + tieBet,
            'Invalid Bet Amounts'
        );

        // take platform fee out of the buy in
        uint256 platformFeeAmount;

        // calculate fee based on bets
        if (playerBankerBet > 0) {
            unchecked {
                platformFeeAmount += ( playerBankerBet * playerBankerFee ) / FEE_DENOM;
            }
        }
        if (tieBet > 0) {
            unchecked {
                platformFeeAmount += ( tieBet * tieFee ) / FEE_DENOM;
            }
        }

        // send to platform receiver (taking ref into account)
        _processFee(platformFeeAmount, ref, player);

        // set game data
        games[gameId] = Game({
            playerBankerBet: playerBankerBet,
            tieBet: tieBet,
            payout: 0,
            amountForHouse: totalBetAmount - platformFeeAmount,
            user: player,
            betOnBanker: isBanker,
            playerCards: new uint8[](3),
            bankerCards: new uint8[](3),
            hasEnded: false,
            timestamp: block.timestamp
        });

        // register game Id
        _registerGameId(player, gameId);

        // register bet
        _registerBet(player, totalBetAmount);
        
        // emit event
        emit GameStarted(player, gameId);

        // fetch random number
        _requestRandom(gameId, 6, userRandomWord);
    }

    /**
        Callback to provide us with randomness
     */
    function fulfillRandomWords(
        uint64 requestId,
        uint256[] calldata randomWords
    ) external override onlyRNG {

        // get game ID from requestId
        uint256 gameId = getGameIdFromRequest(requestId);

        // resolve randomness
        _resolveRandom(requestId);
        
        // if faulty ID, remove
        if (gameId == 0 || games[gameId].user == address(0) || games[gameId].hasEnded == true) {
            emit FulfilRandomFailed(requestId, gameId, randomWords);
            return;
        }

        // set game has ended
        games[gameId].hasEnded = true;

        // set player and banker cards based on input
        games[gameId].playerCards[0] = uint8((randomWords[0] % 13) + 1);
        games[gameId].playerCards[1] = uint8((randomWords[1] % 13) + 1);
        games[gameId].bankerCards[0] = uint8((randomWords[2] % 13) + 1);
        games[gameId].bankerCards[1] = uint8((randomWords[3] % 13) + 1);

        // set bonus cards anyway -- maybe scrap this, but this is what they are
        games[gameId].playerCards[2] = uint8((randomWords[4] % 13) + 1);
        games[gameId].bankerCards[2] = uint8((randomWords[5] % 13) + 1);
        
        // determine winner
        uint8 winner = determineWinner(games[gameId].playerCards, games[gameId].bankerCards);

        // handle payout
        uint256 payout = getPayoutAmount(games[gameId].playerBankerBet, games[gameId].tieBet, games[gameId].betOnBanker, winner);

        // set payout
        games[gameId].payout = payout;

        // handle payout
        _handlePayout(games[gameId].user, payout, games[gameId].amountForHouse);

        // Emit Game Ended Event
        emit GameEnded(games[gameId].user, gameId, games[gameId].playerBankerBet + games[gameId].tieBet, payout);
    }

    /**
        returns 0 if player wins, 1 if banker wins, 2 if tie
     */
    function determineWinner(uint8[] memory playerCards, uint8[] memory bankerCards) public pure returns (uint8) {

        // 1 is Ace
        // 2 is 2... 9 is 9
        // 10, 11 (J), 12 (Q), 13 (K) are 0

        // player and banker totals - start at 0 and add cards, then modulo 10
        uint8 playerTotal;
        uint8 bankerTotal;

        for (uint8 i = 0; i < 2;) {
            if (playerCards[i] < 10) {
                unchecked {
                    playerTotal += playerCards[i];
                }
            }
            if (bankerCards[i] < 10) {
                unchecked {
                    bankerTotal += bankerCards[i];
                }
            }
            unchecked { ++i; }
        }

        // modulo 10
        playerTotal %= 10;
        bankerTotal %= 10;

        // check if natural 8 or 9
        if (playerTotal == 8 || playerTotal == 9 || bankerTotal == 8 || bankerTotal == 9) {

            // natural 8 or 9, determine winner
            if (playerTotal > bankerTotal) {
                return 0;
            } else if (playerTotal < bankerTotal) {
                return 1;
            } else {
                return 2;
            }
        }

        // if the player has a score of 0-5, they draw a third card
        if (playerTotal <= 5) {

            // draw third for player
            if (playerCards[2] < 10) {
                unchecked {
                    playerTotal += playerCards[2];
                }
                playerTotal %= 10;
            }

            // now we check if the banker draws a third card
            if (bankerTotal <= 2) {

                // if 0-2, always draw
                if (bankerCards[2] < 10) {
                    unchecked {
                        bankerTotal += bankerCards[2];
                    }
                    bankerTotal %= 10;
                }

            } else if (bankerTotal == 3) {

                // if banker has 3, they draw unless player draws an 8
                if (playerCards[2] != 8) {
                    if (bankerCards[2] < 10) {
                        unchecked {
                            bankerTotal += bankerCards[2];
                        }
                        bankerTotal %= 10;
                    }
                }

            } else if (bankerTotal == 4) {
                
                // The Banker draws if the Player's third card is 2, 3, 4, 5, 6, or 7
                if (playerCards[2] >= 2 && playerCards[2] <= 7) {
                    if (bankerCards[2] < 10) {
                        unchecked {
                            bankerTotal += bankerCards[2];
                        }
                        bankerTotal %= 10;
                    }
                }

            } else if (bankerTotal == 5) {

                // The Banker draws if the Player's third card is 4, 5, 6, or 7
                if (playerCards[2] >= 4 && playerCards[2] <= 7) {
                    if (bankerCards[2] < 10) {
                        unchecked {
                            bankerTotal += bankerCards[2];
                        }
                        bankerTotal %= 10;
                    }
                }

            } else if (bankerTotal == 6) {

                // The Banker draws if the Player's third card is 6 or 7
                if (playerCards[2] == 6 || playerCards[2] == 7) {
                    if (bankerCards[2] < 10) {
                        unchecked {
                            bankerTotal += bankerCards[2];
                        }
                        bankerTotal %= 10;
                    }
                }

            }

        } else {
            // player has a score of six or seven, they stand, so the Banker draws a third card if they have 0-5
            if (bankerTotal <= 5) {
                if (bankerCards[2] < 10) {
                    unchecked {
                        bankerTotal += bankerCards[2];
                    }
                    bankerTotal %= 10;
                }
            }
        }

        if (playerTotal > bankerTotal) {
            return 0;
        } else if (playerTotal < bankerTotal) {
            return 1;
        } else {
            return 2;
        }
    }


    function getPayoutAmount(uint256 playerBankerBet, uint256 tieBet, bool isBanker, uint8 winner) public pure returns (uint256 payout) {

        if (winner == 0 && isBanker == false) {

            // player win
            payout = ( playerBankerBet * PLAYER_PAYOUT ) / 100;
            
        } else if (winner == 1 && isBanker == true) {

            // banker win
            payout = ( playerBankerBet * BANKER_PAYOUT ) / 100;
            
        }

        if (winner == 2) {
            
            // tie
            if (tieBet > 0) {

                // user bet on tie
                unchecked {
                    payout += ( tieBet * TIE_PAYOUT ) / 100;
                }
                
            }

            if (playerBankerBet > 0) {

                // refund player banker bet
                unchecked {
                    payout += playerBankerBet;
                }
            }
        }
    }

    function getGameInfo(uint256 _gameId) public view returns (
        GameInfoReturnType memory
    ) {
        return GameInfoReturnType({
            playerBankerBet: games[_gameId].playerBankerBet,
            tieBet: games[_gameId].tieBet,
            payout: games[_gameId].payout,
            user: games[_gameId].user,
            betOnBanker: games[_gameId].betOnBanker,
            playerCards: games[_gameId].playerCards,
            bankerCards: games[_gameId].bankerCards,
            hasEnded: games[_gameId].hasEnded,
            timestamp: games[_gameId].timestamp
        });
    }

    function batchRawGameInfo(uint256[] calldata gameIds) external view override returns (bytes[] memory) {
        uint len = gameIds.length;
        bytes[] memory retTypes = new bytes[](len);
        for (uint i = 0; i < len;) {
            retTypes[i] = abi.encode(getGameInfo(gameIds[i]));
            unchecked { ++i; }
        }
        return retTypes;
    }

    function getEssentialGameInfo(uint256[] calldata gameIds) external view override returns (
        address[] memory players,
        uint256[] memory buyInAmounts,
        uint256[] memory totalPayouts,
        uint256[] memory timestamps,
        bool[] memory hasEndeds
    ) {
        uint len = gameIds.length;
        players = new address[](len);
        buyInAmounts = new uint256[](len);
        totalPayouts = new uint256[](len);
        timestamps = new uint256[](len);
        hasEndeds = new bool[](len);

        for (uint i = 0; i < len;) {
            players[i] = games[gameIds[i]].user;
            buyInAmounts[i] = games[gameIds[i]].playerBankerBet + games[gameIds[i]].tieBet;
            totalPayouts[i] = games[gameIds[i]].payout;
            timestamps[i] = games[gameIds[i]].timestamp;
            hasEndeds[i] = games[gameIds[i]].hasEnded;
            unchecked { ++i; }
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"GAME_ID_","type":"uint256"},{"internalType":"address","name":"history_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"FulfilRandomFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"GameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"GameStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"RandomnessRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPlayerBankerFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTieFee","type":"uint256"}],"name":"SetPlatformFees","type":"event"},{"inputs":[],"name":"BANKER_PAYOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GAME_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PLAYER_PAYOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIE_PAYOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchCallIsUsedGameId","outputs":[{"internalType":"bool[]","name":"isUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchRawGameInfo","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"playerCards","type":"uint8[]"},{"internalType":"uint8[]","name":"bankerCards","type":"uint8[]"}],"name":"determineWinner","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint64","name":"requestId","type":"uint64"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"fulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"games","outputs":[{"internalType":"uint256","name":"playerBankerBet","type":"uint256"},{"internalType":"uint256","name":"tieBet","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"amountForHouse","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"betOnBanker","type":"bool"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasToCallRandom","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"getEssentialGameInfo","outputs":[{"internalType":"address[]","name":"players","type":"address[]"},{"internalType":"uint256[]","name":"buyInAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"totalPayouts","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"},{"internalType":"bool[]","name":"hasEndeds","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"getGameInfo","outputs":[{"components":[{"internalType":"uint256","name":"playerBankerBet","type":"uint256"},{"internalType":"uint256","name":"tieBet","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"betOnBanker","type":"bool"},{"internalType":"uint8[]","name":"playerCards","type":"uint8[]"},{"internalType":"uint8[]","name":"bankerCards","type":"uint8[]"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Baccarat.GameInfoReturnType","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHouse","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"playerBankerBet","type":"uint256"},{"internalType":"uint256","name":"tieBet","type":"uint256"},{"internalType":"bool","name":"isBanker","type":"bool"},{"internalType":"uint8","name":"winner","type":"uint8"}],"name":"getPayoutAmount","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getVRFFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"history","outputs":[{"internalType":"contract IHistoryManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"isValidGameId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IGovernanceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBuyInGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numUsedGameIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"paginateUsedGameIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"bytes","name":"gameData","type":"bytes"}],"name":"play","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"playerBankerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPlayerBankerFee","type":"uint256"},{"internalType":"uint256","name":"newTieFee","type":"uint256"}],"name":"setPlatformFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tieFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedGameIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000805460ff19169055606460045561012c60055534801561002557600080fd5b50604051613ad0380380613ad08339810160408190526100449161005b565b6080919091526001600160a01b031660a052610098565b6000806040838503121561006e57600080fd5b825160208401519092506001600160a01b038116811461008d57600080fd5b809150509250929050565b60805160a0516139db6100f5600039600081816105510152612c5301526000818161067a0152818161224f0152818161235a0152818161245a015281816125610152818161265701528181612c260152612d9101526139db6000f3fe6080604052600436106101d85760003560e01c80637c274abe11610102578063af31b8b311610095578063cc81d05511610064578063cc81d0551461060c578063f0034a7e14610621578063fa3208ff14610636578063fdcdb06b1461066857600080fd5b8063af31b8b314610593578063bad8054b146105b3578063c4fd5d6d146105c8578063c811ad71146105f957600080fd5b806389fc2c0f116100d157806389fc2c0f146104f257806391ea41e61461051257806398daac831461053f5780639e281a981461057357600080fd5b80637c274abe1461047f5780637e0a9b29146104955780638456cb59146104ab578063896c0591146104c057600080fd5b806351e925591161017a578063720f428f11610149578063720f428f146103fc57806372b4916114610412578063749fa03c146104325780637b8d38791461045257600080fd5b806351e92559146103795780635c975abb146103a95780635ca79647146103c35780636d3f47ff146103e657600080fd5b806332883e7e116101b657806332883e7e146102dd5780634782f7791461030a57806347e1d5501461032a578063481c6a751461035757600080fd5b8063046f7da2146101dd57806304e2064f146101f4578063117a5b9014610226575b600080fd5b3480156101e957600080fd5b506101f261069c565b005b34801561020057600080fd5b50610209610751565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023257600080fd5b50610295610241366004613110565b600660205260009081526040902080546001820154600283015460038401546004850154600786015460089096015494959394929391926001600160a01b0382169260ff600160a01b909304831692169088565b6040805198895260208901979097529587019490945260608601929092526001600160a01b03166080850152151560a0840152151560c083015260e08201526101000161021d565b3480156102e957600080fd5b506102fd6102f8366004613129565b6107c8565b60405161021d9190613187565b34801561031657600080fd5b506101f26103253660046131b9565b61088c565b34801561033657600080fd5b5061034a610345366004613110565b610991565b60405161021d919061321a565b34801561036357600080fd5b5061020960008051602061398683398151915281565b34801561038557600080fd5b50610399610394366004613110565b610b79565b604051901515815260200161021d565b3480156103b557600080fd5b506000546103999060ff1681565b3480156103cf57600080fd5b506103d860c881565b60405190815260200161021d565b3480156103f257600080fd5b506103d860045481565b34801561040857600080fd5b506103d860095481565b34801561041e57600080fd5b506101f261042d366004613129565b610b99565b34801561043e57600080fd5b506101f261044d36600461332a565b610d14565b34801561045e57600080fd5b5061047261046d36600461337e565b61138d565b60405161021d91906133f3565b34801561048b57600080fd5b506103d860055481565b3480156104a157600080fd5b506103d861038481565b3480156104b757600080fd5b506101f261144a565b3480156104cc57600080fd5b506104e06104db3660046134d6565b6114f9565b60405160ff909116815260200161021d565b3480156104fe57600080fd5b506103d861050d366004613110565b6118b1565b34801561051e57600080fd5b5061053261052d36600461337e565b6118d2565b60405161021d9190613561565b34801561054b57600080fd5b506102097f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b506101f261058e3660046131b9565b61199e565b34801561059f57600080fd5b506103d86105ae3660046135ef565b611a4d565b3480156105bf57600080fd5b506103d860c381565b3480156105d457600080fd5b506105e86105e336600461337e565b611ae1565b60405161021d959493929190613637565b6101f26106073660046136d7565b611e4d565b34801561061857600080fd5b506001546103d8565b34801561062d57600080fd5b506103d8612014565b34801561064257600080fd5b506008546106539063ffffffff1681565b60405163ffffffff909116815260200161021d565b34801561067457600080fd5b506103d87f000000000000000000000000000000000000000000000000000000000000000081565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070c919061375c565b6001600160a01b0316336001600160a01b0316146107455760405162461bcd60e51b815260040161073c90613779565b60405180910390fd5b6000805460ff19169055565b60006000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c3919061375c565b905090565b6001546060908211156107db5760015491505b60006107e784846137b3565b6001600160401b038111156107fe576107fe613406565b604051908082528060200260200182016040528015610827578160200160208202803683370190505b509050835b838110156108825760018181548110610847576108476137c6565b906000526020600020015482868361085f91906137b3565b8151811061086f5761086f6137c6565b602090810291909101015260010161082c565b5090505b92915050565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fc919061375c565b6001600160a01b0316336001600160a01b03161461092c5760405162461bcd60e51b815260040161073c90613779565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b505090508061098c57600080fd5b505050565b6109ed60405180610120016040528060008152602001600081526020016000815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001600015158152602001600081525090565b60408051610120810182526000848152600660208181528483208054855260018101548286015260028101548587015260048101546001600160a01b0381166060870152600160a01b900460ff16151560808601529287905290815260059091018054845181840281018401909552808552929360a08501939092830182828015610ab557602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610a865790505b5050505050815260200160066000858152602001908152602001600020600601805480602002602001604051908101604052809291908181526020018280548015610b3d57602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b0e5790505b50505091835250506000848152600660208181526040808420600781015460ff1615158387015297909352526008909401549301929092525090565b60008181526002602052604081205460ff16158015610886575050151590565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c09919061375c565b6001600160a01b0316336001600160a01b031614610c395760405162461bcd60e51b815260040161073c90613779565b6078821115610c835760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742045786365656420312e32252046656560501b604482015260640161073c565b6103e8811115610ccd5760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420457863656564203130252046656560581b604482015260640161073c565b6004829055600581905560408051838152602081018390527f5dba31167d97811cf01a09fa52c7a1e9a3c9cb574cce8d0bf8dc7eadbb7ce252910160405180910390a15050565b6000805160206139868339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d84919061375c565b6001600160a01b0316336001600160a01b031614610dd85760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b604482015260640161073c565b6001600160401b038316600090815260036020526040902054610dfa846120e7565b801580610e1f57506000818152600660205260409020600401546001600160a01b0316155b80610e40575060008181526006602052604090206007015460ff1615156001145b15610e88577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a584828585604051610e7a94939291906137dc565b60405180910390a150505050565b6000818152600660205260408120600701805460ff19166001179055600d908490849081610eb857610eb86137c6565b90506020020135610ec99190613844565b610ed4906001613858565b60008281526006602052604081206005018054909190610ef657610ef66137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d83836001818110610f3557610f356137c6565b90506020020135610f469190613844565b610f51906001613858565b600082815260066020526040902060050180546001908110610f7557610f756137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d83836002818110610fb457610fb46137c6565b90506020020135610fc59190613844565b610fd0906001613858565b60008281526006602081905260408220018054909190610ff257610ff26137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d83836003818110611031576110316137c6565b905060200201356110429190613844565b61104d906001613858565b60008281526006602081905260409091200180546001908110611072576110726137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d838360048181106110b1576110b16137c6565b905060200201356110c29190613844565b6110cd906001613858565b6000828152600660205260409020600501805460029081106110f1576110f16137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d83836005818110611130576111306137c6565b905060200201356111419190613844565b61114c906001613858565b60008281526006602081905260409091200180546002908110611171576111716137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555060006112a36006600084815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561121e57602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116111ef5790505b5050506000868152600660208181526040928390209091018054835181840281018401909452808452929450925083018282801561129957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161126a5790505b50505050506114f9565b60008381526006602052604081208054600182015460049092015493945091926112d9929190600160a01b900460ff1685611a4d565b6000848152600660205260409020600281018290556004810154600390910154919250611313916001600160a01b039091169083906121c3565b60008381526006602052604090206004810154600182015491546001600160a01b03909116917fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae891869161136691613858565b604080519283526020830191909152810184905260600160405180910390a2505050505050565b606081806001600160401b038111156113a8576113a8613406565b6040519080825280602002602001820160405280156113d1578160200160208202803683370190505b50915060005b8181101561144257600260008686848181106113f5576113f56137c6565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061142a5761142a6137c6565b911515602092830291909101909101526001016113d7565b505092915050565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba919061375c565b6001600160a01b0316336001600160a01b0316146114ea5760405162461bcd60e51b815260040161073c90613779565b6000805460ff19166001179055565b60008080805b60028160ff1610156115a757600a868260ff1681518110611522576115226137c6565b602002602001015160ff16101561155557858160ff1681518110611548576115486137c6565b6020026020010151830192505b600a858260ff168151811061156c5761156c6137c6565b602002602001015160ff16101561159f57848160ff1681518110611592576115926137c6565b6020026020010151820191505b6001016114ff565b506115b3600a8361386b565b91506115c0600a8261386b565b90508160ff16600814806115d757508160ff166009145b806115e557508060ff166008145b806115f357508060ff166009145b15611635578060ff168260ff16111561161157600092505050610886565b8060ff168260ff16101561162a57600192505050610886565b600292505050610886565b60058260ff161161183a57600a85600281518110611655576116556137c6565b602002602001015160ff1610156116955784600281518110611679576116796137c6565b602002602001015182019150600a82611692919061386b565b91505b60028160ff16116116f857600a846002815181106116b5576116b56137c6565b602002602001015160ff1610156116f357836002815181106116d9576116d96137c6565b6020908102919091010151016116f0600a8261386b565b90505b611898565b8060ff1660030361173d5784600281518110611716576117166137c6565b602002602001015160ff166008146116f357600a846002815181106116b5576116b56137c6565b8060ff166004036117ae5760028560028151811061175d5761175d6137c6565b602002602001015160ff16101580156117945750600785600281518110611786576117866137c6565b602002602001015160ff1611155b156116f357600a846002815181106116b5576116b56137c6565b8060ff166005036117ce5760048560028151811061175d5761175d6137c6565b8060ff166006036116f357846002815181106117ec576117ec6137c6565b602002602001015160ff1660061480611794575084600281518110611813576118136137c6565b602002602001015160ff166007036116f357600a846002815181106116b5576116b56137c6565b60058160ff161161189857600a8460028151811061185a5761185a6137c6565b602002602001015160ff161015611898578360028151811061187e5761187e6137c6565b602090810291909101015101611895600a8261386b565b90505b8060ff168260ff16111561161157600092505050610886565b600181815481106118c157600080fd5b600091825260209091200154905081565b6060816000816001600160401b038111156118ef576118ef613406565b60405190808252806020026020018201604052801561192257816020015b606081526020019060019003908161190d5790505b50905060005b8281101561199557611951868683818110611945576119456137c6565b90506020020135610991565b604051602001611961919061321a565b604051602081830303815290604052828281518110611982576119826137c6565b6020908102919091010152600101611928565b50949350505050565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0e919061375c565b6001600160a01b0316336001600160a01b031614611a3e5760405162461bcd60e51b815260040161073c90613779565b611a498233836126ad565b5050565b600060ff8216158015611a5e575082155b15611a81576064611a7060c88761388d565b611a7a91906138a4565b9050611ab5565b8160ff166001148015611a9657506001831515145b15611ab5576064611aa860c38761388d565b611ab291906138a4565b90505b8160ff16600203611ad9578315611ad0576064610384850204015b8415611ad95784015b949350505050565b60608080808085806001600160401b03811115611b0057611b00613406565b604051908082528060200260200182016040528015611b29578160200160208202803683370190505b509550806001600160401b03811115611b4457611b44613406565b604051908082528060200260200182016040528015611b6d578160200160208202803683370190505b509450806001600160401b03811115611b8857611b88613406565b604051908082528060200260200182016040528015611bb1578160200160208202803683370190505b509350806001600160401b03811115611bcc57611bcc613406565b604051908082528060200260200182016040528015611bf5578160200160208202803683370190505b509250806001600160401b03811115611c1057611c10613406565b604051908082528060200260200182016040528015611c39578160200160208202803683370190505b50915060005b81811015611e4157600660008a8a84818110611c5d57611c5d6137c6565b90506020020135815260200190815260200160002060040160009054906101000a90046001600160a01b0316878281518110611c9b57611c9b6137c6565b60200260200101906001600160a01b031690816001600160a01b031681525050600660008a8a84818110611cd157611cd16137c6565b90506020020135815260200190815260200160002060010154600660008b8b85818110611d0057611d006137c6565b90506020020135815260200190815260200160002060000154611d239190613858565b868281518110611d3557611d356137c6565b602002602001018181525050600660008a8a84818110611d5757611d576137c6565b90506020020135815260200190815260200160002060020154858281518110611d8257611d826137c6565b602002602001018181525050600660008a8a84818110611da457611da46137c6565b90506020020135815260200190815260200160002060080154848281518110611dcf57611dcf6137c6565b602002602001018181525050600660008a8a84818110611df157611df16137c6565b90506020020135815260200190815260200160002060070160009054906101000a900460ff16838281518110611e2957611e296137c6565b91151560209283029190910190910152600101611c3f565b50509295509295909350565b826001600160a01b0381163314611f1757604051636d6d50a160e11b81523360048201526000805160206139868339815191529063dadaa14290602401602060405180830381865afa158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb91906138b8565b611f175760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f746865727300604482015260640161073c565b6000805160206139868339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8791906138b8565b15611fc75760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b604482015260640161073c565b60005460ff16156120035760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015260640161073c565b61200e8484846127de565b50505050565b60006000805160206139868339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612062573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612086919061375c565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c391906138d5565b6000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612133573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612157919061375c565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b81156125d6578082106123db576000805160206139868339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612240919061375c565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b1580156122ac57600080fd5b505af11580156122c0573d6000803e3d6000fd5b5050505050600081836122d391906137b3565b9050801561200e576000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612327573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234b919061375c565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b1580156123bd57600080fd5b505af11580156123d1573d6000803e3d6000fd5b5050505050505050565b6000805160206139868339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b919061375c565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b1580156124b757600080fd5b505af11580156124cb573d6000803e3d6000fd5b5050505050600082826124de91906137b3565b90506000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561252c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612550919061375c565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040161259e91815260200190565b6000604051808303818588803b1580156125b757600080fd5b505af11580156125cb573d6000803e3d6000fd5b505050505050505050565b6000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612622573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612646919061375c565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040161269491815260200190565b6000604051808303818588803b1580156123bd57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161270991906138ee565b6000604051808303816000865af19150503d8060008114612746576040519150601f19603f3d011682016040523d82523d6000602084013e61274b565b606091505b509150915081801561277557508051158061277557508080602001905181019061277591906138b8565b6127d75760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b606482015260840161073c565b5050505050565b60006127e8612014565b9050600080808080806127fd888a018a61390a565b9550955095509550955095508634101561284b5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b604482015260640161073c565b61285486610b79565b15156001146128975760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b604482015260640161073c565b60006128a388346137b3565b9050600081116128ea5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b604482015260640161073c565b6128f48587613858565b81146129385760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642042657420416d6f756e747360681b604482015260640161073c565b60008615612958576127106004548802816129555761295561382e565b04015b8515612976576127106005548702816129735761297361382e565b04015b61298181858e612b5d565b6040518061014001604052808881526020018781526020016000815260200182846129ac91906137b3565b81526001600160a01b038e166020820152861515604082015260600160036040519080825280602002602001820160405280156129f3578160200160208202803683370190505b50815260408051600380825260808201909252602092830192909190820160608036833701905050815260006020808301829052426040938401528b825260068152908290208351815583820151600182015591830151600283015560608301516003830155608083015160048301805460a08601511515600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560c08301518051612aa99260058501920190613055565b5060e08201518051612ac5916006840191602090910190613055565b5061010082015160078201805460ff191691151591909117905561012090910151600890910155612af68c89612c07565b612b008c83612cfb565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c789604051612b3b91815260200190565b60405180910390a2612b4f88600685612df9565b505050505050505050505050565b6000805160206139868339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bcd919061375c565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e5908590604401612694565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690639a4918c190606401600060405180830381600087803b158015612c9757600080fd5b505af1158015612cab573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000805160206139868339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6b919061375c565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000006044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612ddd57600080fd5b505af1158015612df1573d6000803e3d6000fd5b505050505050565b60006000805160206139868339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6b919061375c565b6001600160a01b03166397cca7af612e81612014565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015612ec6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612eeb9190613968565b6001600160401b03811660009081526003602052604090205490915015612f475760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b604482015260640161073c565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b0319815291516000805160206139868339815191529263ff9b3acf9260048083019391928290030181865afa158015612fae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd2919061375c565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561300c57600080fd5b505af1158015613020573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d4584604051610e7a91815260200190565b82805482825590600052602060002090601f016020900481019282156130eb5791602002820160005b838211156130bc57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030261307e565b80156130e95782816101000a81549060ff02191690556001016020816000010492830192600103026130bc565b505b506130f79291506130fb565b5090565b5b808211156130f757600081556001016130fc565b60006020828403121561312257600080fd5b5035919050565b6000806040838503121561313c57600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561317d57815186526020958601959091019060010161315f565b5093949350505050565b60208152600061319a602083018461314b565b9392505050565b6001600160a01b03811681146131b657600080fd5b50565b600080604083850312156131cc57600080fd5b82356131d7816131a1565b946020939093013593505050565b600081518084526020840193506020830160005b8281101561317d57815160ff168652602095860195909101906001016131f9565b602081528151602082015260208201516040820152604082015160608201526000606083015161325560808401826001600160a01b03169052565b50608083015180151560a08401525060a083015161012060c084015261327f6101408401826131e5565b905060c0840151601f198483030160e085015261329c82826131e5565b91505060e08401516132b361010085018215159052565b506101008401516101208401528091505092915050565b6001600160401b03811681146131b657600080fd5b60008083601f8401126132f157600080fd5b5081356001600160401b0381111561330857600080fd5b6020830191508360208260051b850101111561332357600080fd5b9250929050565b60008060006040848603121561333f57600080fd5b833561334a816132ca565b925060208401356001600160401b0381111561336557600080fd5b613371868287016132df565b9497909650939450505050565b6000806020838503121561339157600080fd5b82356001600160401b038111156133a757600080fd5b6133b3858286016132df565b90969095509350505050565b600081518084526020840193506020830160005b8281101561317d57815115158652602095860195909101906001016133d3565b60208152600061319a60208301846133bf565b634e487b7160e01b600052604160045260246000fd5b803560ff8116811461342d57600080fd5b919050565b600082601f83011261344357600080fd5b81356001600160401b0381111561345c5761345c613406565b8060051b604051601f19603f83011681018181106001600160401b038211171561348857613488613406565b6040529182526020818501810192908101868411156134a657600080fd5b6020860192505b838310156134cc576134be8361341c565b8152602092830192016134ad565b5095945050505050565b600080604083850312156134e957600080fd5b82356001600160401b038111156134ff57600080fd5b61350b85828601613432565b92505060208301356001600160401b0381111561352757600080fd5b61353385828601613432565b9150509250929050565b60005b83811015613558578181015183820152602001613540565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156135d557603f19878603018452815180518087526135b281602089016020850161353d565b601f01601f19169590950160209081019550938401939190910190600101613589565b50929695505050505050565b80151581146131b657600080fd5b6000806000806080858703121561360557600080fd5b8435935060208501359250604085013561361e816135e1565b915061362c6060860161341c565b905092959194509250565b60a08082528651908201819052600090602088019060c0840190835b8181101561367a5783516001600160a01b0316835260209384019390920191600101613653565b5050838103602085015261368e818961314b565b91505082810360408401526136a3818761314b565b905082810360608401526136b7818661314b565b905082810360808401526136cb81856133bf565b98975050505050505050565b6000806000604084860312156136ec57600080fd5b83356136f7816131a1565b925060208401356001600160401b0381111561371257600080fd5b8401601f8101861361372357600080fd5b80356001600160401b0381111561373957600080fd5b86602082840101111561374b57600080fd5b939660209190910195509293505050565b60006020828403121561376e57600080fd5b815161319a816131a1565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156108865761088661379d565b634e487b7160e01b600052603260045260246000fd5b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b0383111561381357600080fd5b8260051b808560808501379190910160800195945050505050565b634e487b7160e01b600052601260045260246000fd5b6000826138535761385361382e565b500690565b808201808211156108865761088661379d565b600060ff83168061387e5761387e61382e565b8060ff84160691505092915050565b80820281158282048414176108865761088661379d565b6000826138b3576138b361382e565b500490565b6000602082840312156138ca57600080fd5b815161319a816135e1565b6000602082840312156138e757600080fd5b5051919050565b6000825161390081846020870161353d565b9190910192915050565b60008060008060008060c0878903121561392357600080fd5b8635955060208701359450604087013593506060870135613943816135e1565b92506080870135613953816131a1565b8092505060a087013590509295509295509295565b60006020828403121561397a57600080fd5b815161319a816132ca56fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220712d9c740ebb75293de500fab6674451b8a5d918f68e38fc1e7c8ac18ad5753164736f6c634300081c00330000000000000000000000000000000000000000000000000000000000000006000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80637c274abe11610102578063af31b8b311610095578063cc81d05511610064578063cc81d0551461060c578063f0034a7e14610621578063fa3208ff14610636578063fdcdb06b1461066857600080fd5b8063af31b8b314610593578063bad8054b146105b3578063c4fd5d6d146105c8578063c811ad71146105f957600080fd5b806389fc2c0f116100d157806389fc2c0f146104f257806391ea41e61461051257806398daac831461053f5780639e281a981461057357600080fd5b80637c274abe1461047f5780637e0a9b29146104955780638456cb59146104ab578063896c0591146104c057600080fd5b806351e925591161017a578063720f428f11610149578063720f428f146103fc57806372b4916114610412578063749fa03c146104325780637b8d38791461045257600080fd5b806351e92559146103795780635c975abb146103a95780635ca79647146103c35780636d3f47ff146103e657600080fd5b806332883e7e116101b657806332883e7e146102dd5780634782f7791461030a57806347e1d5501461032a578063481c6a751461035757600080fd5b8063046f7da2146101dd57806304e2064f146101f4578063117a5b9014610226575b600080fd5b3480156101e957600080fd5b506101f261069c565b005b34801561020057600080fd5b50610209610751565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023257600080fd5b50610295610241366004613110565b600660205260009081526040902080546001820154600283015460038401546004850154600786015460089096015494959394929391926001600160a01b0382169260ff600160a01b909304831692169088565b6040805198895260208901979097529587019490945260608601929092526001600160a01b03166080850152151560a0840152151560c083015260e08201526101000161021d565b3480156102e957600080fd5b506102fd6102f8366004613129565b6107c8565b60405161021d9190613187565b34801561031657600080fd5b506101f26103253660046131b9565b61088c565b34801561033657600080fd5b5061034a610345366004613110565b610991565b60405161021d919061321a565b34801561036357600080fd5b5061020960008051602061398683398151915281565b34801561038557600080fd5b50610399610394366004613110565b610b79565b604051901515815260200161021d565b3480156103b557600080fd5b506000546103999060ff1681565b3480156103cf57600080fd5b506103d860c881565b60405190815260200161021d565b3480156103f257600080fd5b506103d860045481565b34801561040857600080fd5b506103d860095481565b34801561041e57600080fd5b506101f261042d366004613129565b610b99565b34801561043e57600080fd5b506101f261044d36600461332a565b610d14565b34801561045e57600080fd5b5061047261046d36600461337e565b61138d565b60405161021d91906133f3565b34801561048b57600080fd5b506103d860055481565b3480156104a157600080fd5b506103d861038481565b3480156104b757600080fd5b506101f261144a565b3480156104cc57600080fd5b506104e06104db3660046134d6565b6114f9565b60405160ff909116815260200161021d565b3480156104fe57600080fd5b506103d861050d366004613110565b6118b1565b34801561051e57600080fd5b5061053261052d36600461337e565b6118d2565b60405161021d9190613561565b34801561054b57600080fd5b506102097f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa81565b34801561057f57600080fd5b506101f261058e3660046131b9565b61199e565b34801561059f57600080fd5b506103d86105ae3660046135ef565b611a4d565b3480156105bf57600080fd5b506103d860c381565b3480156105d457600080fd5b506105e86105e336600461337e565b611ae1565b60405161021d959493929190613637565b6101f26106073660046136d7565b611e4d565b34801561061857600080fd5b506001546103d8565b34801561062d57600080fd5b506103d8612014565b34801561064257600080fd5b506008546106539063ffffffff1681565b60405163ffffffff909116815260200161021d565b34801561067457600080fd5b506103d87f000000000000000000000000000000000000000000000000000000000000000681565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070c919061375c565b6001600160a01b0316336001600160a01b0316146107455760405162461bcd60e51b815260040161073c90613779565b60405180910390fd5b6000805460ff19169055565b60006000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c3919061375c565b905090565b6001546060908211156107db5760015491505b60006107e784846137b3565b6001600160401b038111156107fe576107fe613406565b604051908082528060200260200182016040528015610827578160200160208202803683370190505b509050835b838110156108825760018181548110610847576108476137c6565b906000526020600020015482868361085f91906137b3565b8151811061086f5761086f6137c6565b602090810291909101015260010161082c565b5090505b92915050565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fc919061375c565b6001600160a01b0316336001600160a01b03161461092c5760405162461bcd60e51b815260040161073c90613779565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b505090508061098c57600080fd5b505050565b6109ed60405180610120016040528060008152602001600081526020016000815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001600015158152602001600081525090565b60408051610120810182526000848152600660208181528483208054855260018101548286015260028101548587015260048101546001600160a01b0381166060870152600160a01b900460ff16151560808601529287905290815260059091018054845181840281018401909552808552929360a08501939092830182828015610ab557602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610a865790505b5050505050815260200160066000858152602001908152602001600020600601805480602002602001604051908101604052809291908181526020018280548015610b3d57602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b0e5790505b50505091835250506000848152600660208181526040808420600781015460ff1615158387015297909352526008909401549301929092525090565b60008181526002602052604081205460ff16158015610886575050151590565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c09919061375c565b6001600160a01b0316336001600160a01b031614610c395760405162461bcd60e51b815260040161073c90613779565b6078821115610c835760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742045786365656420312e32252046656560501b604482015260640161073c565b6103e8811115610ccd5760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420457863656564203130252046656560581b604482015260640161073c565b6004829055600581905560408051838152602081018390527f5dba31167d97811cf01a09fa52c7a1e9a3c9cb574cce8d0bf8dc7eadbb7ce252910160405180910390a15050565b6000805160206139868339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d84919061375c565b6001600160a01b0316336001600160a01b031614610dd85760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b604482015260640161073c565b6001600160401b038316600090815260036020526040902054610dfa846120e7565b801580610e1f57506000818152600660205260409020600401546001600160a01b0316155b80610e40575060008181526006602052604090206007015460ff1615156001145b15610e88577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a584828585604051610e7a94939291906137dc565b60405180910390a150505050565b6000818152600660205260408120600701805460ff19166001179055600d908490849081610eb857610eb86137c6565b90506020020135610ec99190613844565b610ed4906001613858565b60008281526006602052604081206005018054909190610ef657610ef66137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d83836001818110610f3557610f356137c6565b90506020020135610f469190613844565b610f51906001613858565b600082815260066020526040902060050180546001908110610f7557610f756137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d83836002818110610fb457610fb46137c6565b90506020020135610fc59190613844565b610fd0906001613858565b60008281526006602081905260408220018054909190610ff257610ff26137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d83836003818110611031576110316137c6565b905060200201356110429190613844565b61104d906001613858565b60008281526006602081905260409091200180546001908110611072576110726137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d838360048181106110b1576110b16137c6565b905060200201356110c29190613844565b6110cd906001613858565b6000828152600660205260409020600501805460029081106110f1576110f16137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550600d83836005818110611130576111306137c6565b905060200201356111419190613844565b61114c906001613858565b60008281526006602081905260409091200180546002908110611171576111716137c6565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555060006112a36006600084815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561121e57602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116111ef5790505b5050506000868152600660208181526040928390209091018054835181840281018401909452808452929450925083018282801561129957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161126a5790505b50505050506114f9565b60008381526006602052604081208054600182015460049092015493945091926112d9929190600160a01b900460ff1685611a4d565b6000848152600660205260409020600281018290556004810154600390910154919250611313916001600160a01b039091169083906121c3565b60008381526006602052604090206004810154600182015491546001600160a01b03909116917fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae891869161136691613858565b604080519283526020830191909152810184905260600160405180910390a2505050505050565b606081806001600160401b038111156113a8576113a8613406565b6040519080825280602002602001820160405280156113d1578160200160208202803683370190505b50915060005b8181101561144257600260008686848181106113f5576113f56137c6565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061142a5761142a6137c6565b911515602092830291909101909101526001016113d7565b505092915050565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba919061375c565b6001600160a01b0316336001600160a01b0316146114ea5760405162461bcd60e51b815260040161073c90613779565b6000805460ff19166001179055565b60008080805b60028160ff1610156115a757600a868260ff1681518110611522576115226137c6565b602002602001015160ff16101561155557858160ff1681518110611548576115486137c6565b6020026020010151830192505b600a858260ff168151811061156c5761156c6137c6565b602002602001015160ff16101561159f57848160ff1681518110611592576115926137c6565b6020026020010151820191505b6001016114ff565b506115b3600a8361386b565b91506115c0600a8261386b565b90508160ff16600814806115d757508160ff166009145b806115e557508060ff166008145b806115f357508060ff166009145b15611635578060ff168260ff16111561161157600092505050610886565b8060ff168260ff16101561162a57600192505050610886565b600292505050610886565b60058260ff161161183a57600a85600281518110611655576116556137c6565b602002602001015160ff1610156116955784600281518110611679576116796137c6565b602002602001015182019150600a82611692919061386b565b91505b60028160ff16116116f857600a846002815181106116b5576116b56137c6565b602002602001015160ff1610156116f357836002815181106116d9576116d96137c6565b6020908102919091010151016116f0600a8261386b565b90505b611898565b8060ff1660030361173d5784600281518110611716576117166137c6565b602002602001015160ff166008146116f357600a846002815181106116b5576116b56137c6565b8060ff166004036117ae5760028560028151811061175d5761175d6137c6565b602002602001015160ff16101580156117945750600785600281518110611786576117866137c6565b602002602001015160ff1611155b156116f357600a846002815181106116b5576116b56137c6565b8060ff166005036117ce5760048560028151811061175d5761175d6137c6565b8060ff166006036116f357846002815181106117ec576117ec6137c6565b602002602001015160ff1660061480611794575084600281518110611813576118136137c6565b602002602001015160ff166007036116f357600a846002815181106116b5576116b56137c6565b60058160ff161161189857600a8460028151811061185a5761185a6137c6565b602002602001015160ff161015611898578360028151811061187e5761187e6137c6565b602090810291909101015101611895600a8261386b565b90505b8060ff168260ff16111561161157600092505050610886565b600181815481106118c157600080fd5b600091825260209091200154905081565b6060816000816001600160401b038111156118ef576118ef613406565b60405190808252806020026020018201604052801561192257816020015b606081526020019060019003908161190d5790505b50905060005b8281101561199557611951868683818110611945576119456137c6565b90506020020135610991565b604051602001611961919061321a565b604051602081830303815290604052828281518110611982576119826137c6565b6020908102919091010152600101611928565b50949350505050565b6000805160206139868339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0e919061375c565b6001600160a01b0316336001600160a01b031614611a3e5760405162461bcd60e51b815260040161073c90613779565b611a498233836126ad565b5050565b600060ff8216158015611a5e575082155b15611a81576064611a7060c88761388d565b611a7a91906138a4565b9050611ab5565b8160ff166001148015611a9657506001831515145b15611ab5576064611aa860c38761388d565b611ab291906138a4565b90505b8160ff16600203611ad9578315611ad0576064610384850204015b8415611ad95784015b949350505050565b60608080808085806001600160401b03811115611b0057611b00613406565b604051908082528060200260200182016040528015611b29578160200160208202803683370190505b509550806001600160401b03811115611b4457611b44613406565b604051908082528060200260200182016040528015611b6d578160200160208202803683370190505b509450806001600160401b03811115611b8857611b88613406565b604051908082528060200260200182016040528015611bb1578160200160208202803683370190505b509350806001600160401b03811115611bcc57611bcc613406565b604051908082528060200260200182016040528015611bf5578160200160208202803683370190505b509250806001600160401b03811115611c1057611c10613406565b604051908082528060200260200182016040528015611c39578160200160208202803683370190505b50915060005b81811015611e4157600660008a8a84818110611c5d57611c5d6137c6565b90506020020135815260200190815260200160002060040160009054906101000a90046001600160a01b0316878281518110611c9b57611c9b6137c6565b60200260200101906001600160a01b031690816001600160a01b031681525050600660008a8a84818110611cd157611cd16137c6565b90506020020135815260200190815260200160002060010154600660008b8b85818110611d0057611d006137c6565b90506020020135815260200190815260200160002060000154611d239190613858565b868281518110611d3557611d356137c6565b602002602001018181525050600660008a8a84818110611d5757611d576137c6565b90506020020135815260200190815260200160002060020154858281518110611d8257611d826137c6565b602002602001018181525050600660008a8a84818110611da457611da46137c6565b90506020020135815260200190815260200160002060080154848281518110611dcf57611dcf6137c6565b602002602001018181525050600660008a8a84818110611df157611df16137c6565b90506020020135815260200190815260200160002060070160009054906101000a900460ff16838281518110611e2957611e296137c6565b91151560209283029190910190910152600101611c3f565b50509295509295909350565b826001600160a01b0381163314611f1757604051636d6d50a160e11b81523360048201526000805160206139868339815191529063dadaa14290602401602060405180830381865afa158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb91906138b8565b611f175760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f746865727300604482015260640161073c565b6000805160206139868339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8791906138b8565b15611fc75760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b604482015260640161073c565b60005460ff16156120035760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015260640161073c565b61200e8484846127de565b50505050565b60006000805160206139868339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612062573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612086919061375c565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c391906138d5565b6000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612133573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612157919061375c565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b81156125d6578082106123db576000805160206139868339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612240919061375c565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000660048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b1580156122ac57600080fd5b505af11580156122c0573d6000803e3d6000fd5b5050505050600081836122d391906137b3565b9050801561200e576000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612327573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234b919061375c565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000660048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b1580156123bd57600080fd5b505af11580156123d1573d6000803e3d6000fd5b5050505050505050565b6000805160206139868339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b919061375c565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000660048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b1580156124b757600080fd5b505af11580156124cb573d6000803e3d6000fd5b5050505050600082826124de91906137b3565b90506000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561252c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612550919061375c565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000066040518363ffffffff1660e01b815260040161259e91815260200190565b6000604051808303818588803b1580156125b757600080fd5b505af11580156125cb573d6000803e3d6000fd5b505050505050505050565b6000805160206139868339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612622573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612646919061375c565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000066040518363ffffffff1660e01b815260040161269491815260200190565b6000604051808303818588803b1580156123bd57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161270991906138ee565b6000604051808303816000865af19150503d8060008114612746576040519150601f19603f3d011682016040523d82523d6000602084013e61274b565b606091505b509150915081801561277557508051158061277557508080602001905181019061277591906138b8565b6127d75760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b606482015260840161073c565b5050505050565b60006127e8612014565b9050600080808080806127fd888a018a61390a565b9550955095509550955095508634101561284b5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b604482015260640161073c565b61285486610b79565b15156001146128975760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b604482015260640161073c565b60006128a388346137b3565b9050600081116128ea5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b604482015260640161073c565b6128f48587613858565b81146129385760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642042657420416d6f756e747360681b604482015260640161073c565b60008615612958576127106004548802816129555761295561382e565b04015b8515612976576127106005548702816129735761297361382e565b04015b61298181858e612b5d565b6040518061014001604052808881526020018781526020016000815260200182846129ac91906137b3565b81526001600160a01b038e166020820152861515604082015260600160036040519080825280602002602001820160405280156129f3578160200160208202803683370190505b50815260408051600380825260808201909252602092830192909190820160608036833701905050815260006020808301829052426040938401528b825260068152908290208351815583820151600182015591830151600283015560608301516003830155608083015160048301805460a08601511515600160a01b026001600160a81b03199091166001600160a01b039093169290921791909117905560c08301518051612aa99260058501920190613055565b5060e08201518051612ac5916006840191602090910190613055565b5061010082015160078201805460ff191691151591909117905561012090910151600890910155612af68c89612c07565b612b008c83612cfb565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c789604051612b3b91815260200190565b60405180910390a2612b4f88600685612df9565b505050505050505050505050565b6000805160206139868339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bcd919061375c565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e5908590604401612694565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000066024830152604482018390527f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa1690639a4918c190606401600060405180830381600087803b158015612c9757600080fd5b505af1158015612cab573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000805160206139868339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6b919061375c565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000066044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612ddd57600080fd5b505af1158015612df1573d6000803e3d6000fd5b505050505050565b60006000805160206139868339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6b919061375c565b6001600160a01b03166397cca7af612e81612014565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015612ec6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612eeb9190613968565b6001600160401b03811660009081526003602052604090205490915015612f475760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b604482015260640161073c565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b0319815291516000805160206139868339815191529263ff9b3acf9260048083019391928290030181865afa158015612fae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd2919061375c565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561300c57600080fd5b505af1158015613020573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d4584604051610e7a91815260200190565b82805482825590600052602060002090601f016020900481019282156130eb5791602002820160005b838211156130bc57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030261307e565b80156130e95782816101000a81549060ff02191690556001016020816000010492830192600103026130bc565b505b506130f79291506130fb565b5090565b5b808211156130f757600081556001016130fc565b60006020828403121561312257600080fd5b5035919050565b6000806040838503121561313c57600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561317d57815186526020958601959091019060010161315f565b5093949350505050565b60208152600061319a602083018461314b565b9392505050565b6001600160a01b03811681146131b657600080fd5b50565b600080604083850312156131cc57600080fd5b82356131d7816131a1565b946020939093013593505050565b600081518084526020840193506020830160005b8281101561317d57815160ff168652602095860195909101906001016131f9565b602081528151602082015260208201516040820152604082015160608201526000606083015161325560808401826001600160a01b03169052565b50608083015180151560a08401525060a083015161012060c084015261327f6101408401826131e5565b905060c0840151601f198483030160e085015261329c82826131e5565b91505060e08401516132b361010085018215159052565b506101008401516101208401528091505092915050565b6001600160401b03811681146131b657600080fd5b60008083601f8401126132f157600080fd5b5081356001600160401b0381111561330857600080fd5b6020830191508360208260051b850101111561332357600080fd5b9250929050565b60008060006040848603121561333f57600080fd5b833561334a816132ca565b925060208401356001600160401b0381111561336557600080fd5b613371868287016132df565b9497909650939450505050565b6000806020838503121561339157600080fd5b82356001600160401b038111156133a757600080fd5b6133b3858286016132df565b90969095509350505050565b600081518084526020840193506020830160005b8281101561317d57815115158652602095860195909101906001016133d3565b60208152600061319a60208301846133bf565b634e487b7160e01b600052604160045260246000fd5b803560ff8116811461342d57600080fd5b919050565b600082601f83011261344357600080fd5b81356001600160401b0381111561345c5761345c613406565b8060051b604051601f19603f83011681018181106001600160401b038211171561348857613488613406565b6040529182526020818501810192908101868411156134a657600080fd5b6020860192505b838310156134cc576134be8361341c565b8152602092830192016134ad565b5095945050505050565b600080604083850312156134e957600080fd5b82356001600160401b038111156134ff57600080fd5b61350b85828601613432565b92505060208301356001600160401b0381111561352757600080fd5b61353385828601613432565b9150509250929050565b60005b83811015613558578181015183820152602001613540565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156135d557603f19878603018452815180518087526135b281602089016020850161353d565b601f01601f19169590950160209081019550938401939190910190600101613589565b50929695505050505050565b80151581146131b657600080fd5b6000806000806080858703121561360557600080fd5b8435935060208501359250604085013561361e816135e1565b915061362c6060860161341c565b905092959194509250565b60a08082528651908201819052600090602088019060c0840190835b8181101561367a5783516001600160a01b0316835260209384019390920191600101613653565b5050838103602085015261368e818961314b565b91505082810360408401526136a3818761314b565b905082810360608401526136b7818661314b565b905082810360808401526136cb81856133bf565b98975050505050505050565b6000806000604084860312156136ec57600080fd5b83356136f7816131a1565b925060208401356001600160401b0381111561371257600080fd5b8401601f8101861361372357600080fd5b80356001600160401b0381111561373957600080fd5b86602082840101111561374b57600080fd5b939660209190910195509293505050565b60006020828403121561376e57600080fd5b815161319a816131a1565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156108865761088661379d565b634e487b7160e01b600052603260045260246000fd5b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b0383111561381357600080fd5b8260051b808560808501379190910160800195945050505050565b634e487b7160e01b600052601260045260246000fd5b6000826138535761385361382e565b500690565b808201808211156108865761088661379d565b600060ff83168061387e5761387e61382e565b8060ff84160691505092915050565b80820281158282048414176108865761088661379d565b6000826138b3576138b361382e565b500490565b6000602082840312156138ca57600080fd5b815161319a816135e1565b6000602082840312156138e757600080fd5b5051919050565b6000825161390081846020870161353d565b9190910192915050565b60008060008060008060c0878903121561392357600080fd5b8635955060208701359450604087013593506060870135613943816135e1565b92506080870135613953816131a1565b8092505060a087013590509295509295509295565b60006020828403121561397a57600080fd5b815161319a816132ca56fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220712d9c740ebb75293de500fab6674451b8a5d918f68e38fc1e7c8ac18ad5753164736f6c634300081c0033

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

0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

-----Decoded View---------------
Arg [0] : GAME_ID_ (uint256): 6
Arg [1] : history_ (address): 0xFa296156dAc165Af92F7Fdb012B61a874670e1AA

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [1] : 000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa


Deployed Bytecode Sourcemap

13067:14239:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6762:70;;;;;;;;;;;;;:::i;:::-;;11539:91;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;287:32:1;;;269:51;;257:2;242:18;11539:91:0;;;;;;;;14133:40;;;;;;;;;;-1:-1:-1;14133:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14133:40:0;;;;-1:-1:-1;;;14133:40:0;;;;;;;;;;;;;;989:25:1;;;1045:2;1030:18;;1023:34;;;;1073:18;;;1066:34;;;;1131:2;1116:18;;1109:34;;;;-1:-1:-1;;;;;1180:32:1;1174:3;1159:19;;1152:61;1257:14;1250:22;1200:3;1229:19;;1222:51;1317:14;1310:22;1304:3;1289:19;;1282:51;1364:3;1349:19;;1342:35;976:3;961:19;14133:40:0;658:725:1;12104:409:0;;;;;;;;;;-1:-1:-1;12104:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6840:155::-;;;;;;;;;;-1:-1:-1;6840:155:0;;;;;:::i;:::-;;:::i;25376:609::-;;;;;;;;;;-1:-1:-1;25376:609:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1012:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1012:107:0;;11638:135;;;;;;;;;;-1:-1:-1;11638:135:0;;;;;:::i;:::-;;:::i;:::-;;;4968:14:1;;4961:22;4943:41;;4931:2;4916:18;11638:135:0;4803:187:1;5911:26:0;;;;;;;;;;-1:-1:-1;5911:26:0;;;;;;;;13129:43;;;;;;;;;;;;13169:3;13129:43;;;;;5141:25:1;;;5129:2;5114:18;13129:43:0;4995:177:1;13294:36:0;;;;;;;;;;;;;;;;14361:26;;;;;;;;;;;;;;;;15257:445;;;;;;;;;;-1:-1:-1;15257:445:0;;;;;:::i;:::-;;:::i;18138:1826::-;;;;;;;;;;-1:-1:-1;18138:1826:0;;;;;:::i;:::-;;:::i;11781:315::-;;;;;;;;;;-1:-1:-1;11781:315:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13337:36::-;;;;;;;;;;;;;;;;13229:43;;;;;;;;;;;;13269:3;13229:43;;6686:68;;;;;;;;;;;;;:::i;20052:4346::-;;;;;;;;;;-1:-1:-1;20052:4346:0;;;;;:::i;:::-;;:::i;:::-;;;9354:4:1;9342:17;;;9324:36;;9312:2;9297:18;20052:4346:0;9182:184:1;5984:28:0;;;;;;;;;;-1:-1:-1;5984:28:0;;;;;:::i;:::-;;:::i;25993:370::-;;;;;;;;;;-1:-1:-1;25993:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5816:40::-;;;;;;;;;;;;;;;7003:143;;;;;;;;;;-1:-1:-1;7003:143:0;;;;;:::i;:::-;;:::i;24408:960::-;;;;;;;;;;-1:-1:-1;24408:960:0;;;;;:::i;:::-;;:::i;13179:43::-;;;;;;;;;;;;13219:3;13179:43;;26371:932;;;;;;;;;;-1:-1:-1;26371:932:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;7718:260::-;;;;;;:::i;:::-;;:::i;12521:102::-;;;;;;;;;;-1:-1:-1;12597:11:0;:18;12521:102;;7500:105;;;;;;;;;;;;;:::i;14300:29::-;;;;;;;;;;-1:-1:-1;14300:29:0;;;;;;;;;;;13862:10:1;13850:23;;;13832:42;;13820:2;13805:18;14300:29:0;13688:192:1;5751:32:0;;;;;;;;;;;;;;;6762:70;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;;;;;;;;;6819:5:::1;6810:14:::0;;-1:-1:-1;;6810:14:0::1;::::0;;6762:70::o;11539:91::-;11580:7;-1:-1:-1;;;;;;;;;;;;;;;;11607:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11600:22;;11539:91;:::o;12104:409::-;12223:11;:18;12184:16;;12217:24;;12213:81;;;12264:11;:18;;-1:-1:-1;12213:81:0;12304:20;12341:11;12347:5;12341:3;:11;:::i;:::-;-1:-1:-1;;;;;12327:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12327:26:0;-1:-1:-1;12304:49:0;-1:-1:-1;12378:5:0;12364:121;12389:3;12385:1;:7;12364:121;;;12427:11;12439:1;12427:14;;;;;;;;:::i;:::-;;;;;;;;;12410:3;12418:5;12414:1;:9;;;;:::i;:::-;12410:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;12468:3;;12364:121;;;-1:-1:-1;12502:3:0;-1:-1:-1;12104:409:0;;;;;:::o;6840:155::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;6920:6:::1;6939:2;-1:-1:-1::0;;;;;6931:16:0::1;6955:6;6931:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6919:47;;;6985:1;6977:10;;;::::0;::::1;;6908:87;6840:155:::0;;:::o;25376:609::-;25445:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25445:25:0;25496:481;;;;;;;;-1:-1:-1;25547:14:0;;;:5;:14;;;;;;;:30;;25496:481;;25600:21;;;;25496:481;;;;25644:21;;;;25496:481;;;;25686:19;;;;-1:-1:-1;;;;;25686:19:0;;25496:481;;;;-1:-1:-1;;;25733:26:0;;;;25496:481;;;;;;25787:14;;;;;;;:26;;;;25496:481;;;;;;;;;;;;;;;;;;;;;;;;;;;25787:26;25496:481;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25841:5;:14;25847:7;25841:14;;;;;;;;;;;:26;;25496:481;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25496:481:0;;;-1:-1:-1;;25892:14:0;;;;:5;25496:481;25892:14;;;;;;;:23;;;;;;25496:481;;;;;;25941:14;;;;;:24;;;;;25496:481;;;;;;-1:-1:-1;25489:488:0;25376:609::o;11638:135::-;11698:4;11722:20;;;:12;:20;;;;;;;;:29;;;:43;;-1:-1:-1;;11755:10:0;;;11638:135::o;15257:445::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;15403:3:::1;15381:18;:25;;15359:97;;;::::0;-1:-1:-1;;;15359:97:0;;15289:2:1;15359:97:0::1;::::0;::::1;15271:21:1::0;15328:2;15308:18;;;15301:30;-1:-1:-1;;;15347:18:1;;;15340:52;15409:18;;15359:97:0::1;15087:346:1::0;15359:97:0::1;15502:5;15489:9;:18;;15467:89;;;::::0;-1:-1:-1;;;15467:89:0;;15640:2:1;15467:89:0::1;::::0;::::1;15622:21:1::0;15679:2;15659:18;;;15652:30;-1:-1:-1;;;15698:18:1;;;15691:51;15759:18;;15467:89:0::1;15438:345:1::0;15467:89:0::1;15567:15;:36:::0;;;15614:6:::1;:18:::0;;;15648:46:::1;::::0;;15962:25:1;;;16018:2;16003:18;;15996:34;;;15648:46:0::1;::::0;15935:18:1;15648:46:0::1;;;;;;;15257:445:::0;;:::o;18138:1826::-;-1:-1:-1;;;;;;;;;;;;;;;;1490:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1476:27:0;:10;-1:-1:-1;;;;;1476:27:0;;1454:94;;;;-1:-1:-1;;;1454:94:0;;16243:2:1;1454:94:0;;;16225:21:1;16282:2;16262:18;;;16255:30;-1:-1:-1;;;16301:18:1;;;16294:47;16358:18;;1454:94:0;16041:341:1;1454:94:0;-1:-1:-1;;;;;11499:24:0;;18319:14:::1;11499:24:::0;;;:13;:24;;;;;;18411:25:::1;11499:24:::0;18411:14:::1;:25::i;:::-;18494:11:::0;;;:47:::1;;-1:-1:-1::0;18539:1:0::1;18509:13:::0;;;:5:::1;:13;::::0;;;;:18:::1;;::::0;-1:-1:-1;;;;;18509:18:0::1;:32:::0;18494:47:::1;:81;;;-1:-1:-1::0;18545:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:30;;:22:::0;:30:::1;18494:81;18490:190;;;18597:50;18616:9;18627:6;18635:11;;18597:50;;;;;;;;;:::i;:::-;;;;;;;;18662:7;6908:87;6840:155:::0;;:::o;18490:190::-:1;18723:13;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;:29:::0;;-1:-1:-1;;18723:29:0::1;18748:4;18723:29;::::0;;18875:2:::1;::::0;18858:11;;;;:14;::::1;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;18857:25;::::0;18881:1:::1;18857:25;:::i;:::-;18820:13;::::0;;;:5:::1;:13;::::0;;;;:25:::1;;:28:::0;;:25;;:13;:28:::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;18949:2;18932:11;;18944:1;18932:14;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;18931:25;::::0;18955:1:::1;18931:25;:::i;:::-;18894:13;::::0;;;:5:::1;:13;::::0;;;;:25:::1;;:28:::0;;18920:1:::1;::::0;18894:28;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;19023:2;19006:11;;19018:1;19006:14;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;19005:25;::::0;19029:1:::1;19005:25;:::i;:::-;18968:13;::::0;;;:5:::1;:13;::::0;;;;;;:25:::1;:28:::0;;:25;;:13;:28:::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;19097:2;19080:11;;19092:1;19080:14;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;19079:25;::::0;19103:1:::1;19079:25;:::i;:::-;19042:13;::::0;;;:5:::1;:13;::::0;;;;;;;:25:::1;:28:::0;;19068:1:::1;::::0;19042:28;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;19255:2;19238:11;;19250:1;19238:14;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;19237:25;::::0;19261:1:::1;19237:25;:::i;:::-;19200:13;::::0;;;:5:::1;:13;::::0;;;;:25:::1;;:28:::0;;19226:1:::1;::::0;19200:28;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;19329:2;19312:11;;19324:1;19312:14;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;19311:25;::::0;19335:1:::1;19311:25;:::i;:::-;19274:13;::::0;;;:5:::1;:13;::::0;;;;;;;:25:::1;:28:::0;;19300:1:::1;::::0;19274:28;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;19387:12;19402:69;19418:5;:13;19424:6;19418:13;;;;;;;;;;;:25;;19402:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;::::1;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;;;;-1:-1:-1::0;;;19445:13:0::1;::::0;;;:5:::1;:13;::::0;;;;;;;;:25;;::::1;19402:69:::0;;;;;;::::1;::::0;;;;;;;;;;;;-1:-1:-1;19445:25:0;-1:-1:-1;19402:69:0;::::1;19445:25:::0;19402:69;;::::1;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;::::1;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;;;;;;;;;:15;:69::i;:::-;19510:14;19543:13:::0;;;:5:::1;:13;::::0;;;;:29;;19574:20:::1;::::0;::::1;::::0;19596:25:::1;::::0;;::::1;::::0;19387:84;;-1:-1:-1;19510:14:0;;19527:103:::1;::::0;19543:29;19574:20;-1:-1:-1;;;19596:25:0;::::1;;;19387:84:::0;19527:15:::1;:103::i;:::-;19666:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;::::0;::::1;:29:::0;;;19748:18:::1;::::0;::::1;::::0;19776:28:::1;::::0;;::::1;::::0;19510:120;;-1:-1:-1;19734:71:0::1;::::0;-1:-1:-1;;;;;19748:18:0;;::::1;::::0;19510:120;;19734:13:::1;:71::i;:::-;19867:13;::::0;;;:5:::1;:13;::::0;;;;:18:::1;::::0;::::1;::::0;;19927:20;::::1;::::0;19895:29;;-1:-1:-1;;;;;19867:18:0;;::::1;::::0;19857:99:::1;::::0;19873:6;;19895:52:::1;::::0;::::1;:::i;:::-;19857:99;::::0;;17584:25:1;;;17640:2;17625:18;;17618:34;;;;17668:18;;17661:34;;;17572:2;17557:18;19857:99:0::1;;;;;;;18267:1697;;;18138:1826:::0;;;:::o;11781:315::-;11863:20;11907:7;;-1:-1:-1;;;;;11941:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11941:15:0;;11932:24;;11972:6;11967:122;11988:3;11984:1;:7;11967:122;;;12021:12;:24;12034:7;;12042:1;12034:10;;;;;;;:::i;:::-;;;;;;;12021:24;;;;;;;;;;;;;;;;;;;;;12009:6;12016:1;12009:9;;;;;;;;:::i;:::-;:36;;;:9;;;;;;;;;;;:36;12072:3;;11967:122;;;;11885:211;11781:315;;;;:::o;6686:68::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;6733:6:::1;:13:::0;;-1:-1:-1;;6733:13:0::1;6742:4;6733:13;::::0;;6686:68::o;20052:4346::-;20154:5;;;;20409:380;20431:1;20427;:5;;;20409:380;;;20471:2;20454:11;20466:1;20454:14;;;;;;;;;;:::i;:::-;;;;;;;:19;;;20450:141;;;20542:11;20554:1;20542:14;;;;;;;;;;:::i;:::-;;;;;;;20527:29;;;;20450:141;20626:2;20609:11;20621:1;20609:14;;;;;;;;;;:::i;:::-;;;;;;;:19;;;20605:141;;;20697:11;20709:1;20697:14;;;;;;;;;;:::i;:::-;;;;;;;20682:29;;;;20605:141;20772:3;;20409:380;;;-1:-1:-1;20823:17:0;20838:2;20823:17;;:::i;:::-;;-1:-1:-1;20851:17:0;20866:2;20851:17;;:::i;:::-;;;20921:11;:16;;20936:1;20921:16;:36;;;;20941:11;:16;;20956:1;20941:16;20921:36;:56;;;;20961:11;:16;;20976:1;20961:16;20921:56;:76;;;;20981:11;:16;;20996:1;20981:16;20921:76;20917:362;;;21083:11;21069:25;;:11;:25;;;21065:203;;;21122:1;21115:8;;;;;;21065:203;21163:11;21149:25;;:11;:25;;;21145:123;;;21202:1;21195:8;;;;;;21145:123;21251:1;21244:8;;;;;;21145:123;21379:1;21364:11;:16;;;21360:2840;;21458:2;21441:11;21453:1;21441:14;;;;;;;;:::i;:::-;;;;;;;:19;;;21437:177;;;21529:11;21541:1;21529:14;;;;;;;;:::i;:::-;;;;;;;21514:29;;;;21596:2;21581:17;;;;;:::i;:::-;;;21437:177;21711:1;21696:11;:16;;;21692:2096;;21796:2;21779:11;21791:1;21779:14;;;;;;;;:::i;:::-;;;;;;;:19;;;21775:197;;;21875:11;21887:1;21875:14;;;;;;;;:::i;:::-;;;;;;;;;;;21860:29;21935:17;21950:2;21860:29;21935:17;:::i;:::-;;;21775:197;21360:2840;;21692:2096;21999:11;:16;;22014:1;21999:16;21995:1793;;22114:11;22126:1;22114:14;;;;;;;;:::i;:::-;;;;;;;:19;;22132:1;22114:19;22110:284;;22179:2;22162:11;22174:1;22162:14;;;;;;;;:::i;21995:1793::-;22421:11;:16;;22436:1;22421:16;22417:1371;;22585:1;22567:11;22579:1;22567:14;;;;;;;;:::i;:::-;;;;;;;:19;;;;:42;;;;;22608:1;22590:11;22602:1;22590:14;;;;;;;;:::i;:::-;;;;;;;:19;;;;22567:42;22563:307;;;22655:2;22638:11;22650:1;22638:14;;;;;;;;:::i;22417:1371::-;22897:11;:16;;22912:1;22897:16;22893:895;;23039:1;23021:11;23033:1;23021:14;;;;;;;;:::i;22893:895::-;23351:11;:16;;23366:1;23351:16;23347:441;;23468:11;23480:1;23468:14;;;;;;;;:::i;:::-;;;;;;;:19;;23486:1;23468:19;:42;;;;23491:11;23503:1;23491:14;;;;;;;;:::i;:::-;;;;;;;:19;;23509:1;23491:19;23464:307;;23556:2;23539:11;23551:1;23539:14;;;;;;;;:::i;21360:2840::-;23955:1;23940:11;:16;;;23936:253;;23998:2;23981:11;23993:1;23981:14;;;;;;;;:::i;:::-;;;;;;;:19;;;23977:197;;;24077:11;24089:1;24077:14;;;;;;;;:::i;:::-;;;;;;;;;;;24062:29;24137:17;24152:2;24062:29;24137:17;:::i;:::-;;;23977:197;24230:11;24216:25;;:11;:25;;;24212:179;;;24265:1;24258:8;;;;;;5984:28;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5984:28:0;:::o;25993:370::-;26079:14;26117:7;26106:8;26117:7;-1:-1:-1;;;;;26168:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26142:42;;26200:6;26195:135;26216:3;26212:1;:7;26195:135;;;26262:23;26274:7;;26282:1;26274:10;;;;;;;:::i;:::-;;;;;;;26262:11;:23::i;:::-;26251:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;26237:8;26246:1;26237:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;26313:3;;26195:135;;;-1:-1:-1;26347:8:0;25993:370;-1:-1:-1;;;;25993:370:0:o;7003:143::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;7084:54:::1;7112:5;7119:10;7131:6;7084:27;:54::i;:::-;7003:143:::0;;:::o;24408:960::-;24524:14;24557:11;;;;:32;;;;-1:-1:-1;24572:17:0;;24557:32;24553:321;;;24682:3;24646:31;13169:3;24646:15;:31;:::i;:::-;24644:41;;;;:::i;:::-;24635:50;;24553:321;;;24721:6;:11;;24731:1;24721:11;:31;;;;-1:-1:-1;24748:4:0;24736:16;;;;24721:31;24717:157;;;24845:3;24809:31;13219:3;24809:15;:31;:::i;:::-;24807:41;;;;:::i;:::-;24798:50;;24717:157;24890:6;:11;;24900:1;24890:11;24886:475;;24956:10;;24952:198;;25094:3;13269;25070:19;;25068:29;25058:39;24952:198;25170:19;;25166:184;;25290:25;;25166:184;24408:960;;;;;;:::o;26371:932::-;26471:24;;;;;26677:7;;-1:-1:-1;;;;;26712:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26712:18:0;;26702:28;;26770:3;-1:-1:-1;;;;;26756:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26756:18:0;;26741:33;;26814:3;-1:-1:-1;;;;;26800:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26800:18:0;;26785:33;;26856:3;-1:-1:-1;;;;;26842:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26842:18:0;;26829:31;;26894:3;-1:-1:-1;;;;;26883:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26883:15:0;;26871:27;;26916:6;26911:385;26932:3;26928:1;:7;26911:385;;;26966:5;:17;26972:7;;26980:1;26972:10;;;;;;;:::i;:::-;;;;;;;26966:17;;;;;;;;;;;:22;;;;;;;;;;-1:-1:-1;;;;;26966:22:0;26953:7;26961:1;26953:10;;;;;;;;:::i;:::-;;;;;;:35;-1:-1:-1;;;;;26953:35:0;;;-1:-1:-1;;;;;26953:35:0;;;;;27057:5;:17;27063:7;;27071:1;27063:10;;;;;;;:::i;:::-;;;;;;;27057:17;;;;;;;;;;;:24;;;27021:5;:17;27027:7;;27035:1;27027:10;;;;;;;:::i;:::-;;;;;;;27021:17;;;;;;;;;;;:33;;;:60;;;;:::i;:::-;27003:12;27016:1;27003:15;;;;;;;;:::i;:::-;;;;;;:78;;;;;27114:5;:17;27120:7;;27128:1;27120:10;;;;;;;:::i;:::-;;;;;;;27114:17;;;;;;;;;;;:24;;;27096:12;27109:1;27096:15;;;;;;;;:::i;:::-;;;;;;:42;;;;;27169:5;:17;27175:7;;27183:1;27175:10;;;;;;;:::i;:::-;;;;;;;27169:17;;;;;;;;;;;:27;;;27153:10;27164:1;27153:13;;;;;;;;:::i;:::-;;;;;;:43;;;;;27226:5;:17;27232:7;;27240:1;27232:10;;;;;;;:::i;:::-;;;;;;;27226:17;;;;;;;;;;;:26;;;;;;;;;;;;27211:9;27221:1;27211:12;;;;;;;;:::i;:::-;:41;;;:12;;;;;;;;;;;:41;27279:3;;26911:385;;;;26655:648;26371:932;;;;;;;;:::o;7718:260::-;7814:6;-1:-1:-1;;;;;1631:20:0;;1641:10;1631:20;1627:182;;1694:36;;-1:-1:-1;;;1694:36:0;;1719:10;1694:36;;;269:51:1;-1:-1:-1;;;;;;;;;;;1076:42:0;1694:24;;242:18:1;;1694:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1668:129;;;;-1:-1:-1;;;1668:129:0;;18618:2:1;1668:129:0;;;18600:21:1;18657:2;18637:18;;;18630:30;18696:33;18676:18;;;18669:61;18747:18;;1668:129:0;18416:355:1;1668:129:0;-1:-1:-1;;;;;;;;;;;;;;;;1890:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;1868:91;;;::::0;-1:-1:-1;;;1868:91:0;;18978:2:1;1868:91:0::1;::::0;::::1;18960:21:1::0;19017:2;18997:18;;;18990:30;-1:-1:-1;;;19036:18:1;;;19029:46;19092:18;;1868:91:0::1;18776:340:1::0;1868:91:0::1;7868:6:::2;::::0;::::2;;7867:7;7845:63;;;::::0;-1:-1:-1;;;7845:63:0;;19323:2:1;7845:63:0::2;::::0;::::2;19305:21:1::0;19362:1;19342:18;;;19335:29;-1:-1:-1;;;19380:18:1;;;19373:36;19426:18;;7845:63:0::2;19121:329:1::0;7845:63:0::2;7943:27;7953:6;7961:8;;7943:9;:27::i;:::-;7718:260:::0;;;;:::o;7500:105::-;7542:7;-1:-1:-1;;;;;;;;;;;;;;;;7574:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7569:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;11169:224::-;-1:-1:-1;;;;;;;;;;;;;;;;11275:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11268:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;11361:24:0;;;;;:13;:24;;;;;11354:31;11169:224::o;8073:1941::-;8185:17;;8181:1824;;8294:14;8277:13;:31;8273:1552;;-1:-1:-1;;;;;;;;;;;;;;;;8664:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8650:145;;-1:-1:-1;;;8650:145:0;;8740:7;8650:145;;;19818:25:1;-1:-1:-1;;;;;19879:32:1;;;19859:18;;;19852:60;8650:44:0;;;;;;;8702:14;;19791:18:1;;8650:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8855:17;8891:14;8875:13;:30;;;;:::i;:::-;8855:50;-1:-1:-1;8928:13:0;;8924:175;;-1:-1:-1;;;;;;;;;;;;;;;;9028:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9021:58;;-1:-1:-1;;;9021:58:0;;9052:7;9021:58;;;20125:25:1;-1:-1:-1;;;;;20186:32:1;;;20166:18;;;20159:60;20235:18;;;20228:34;;;9021:30:0;;;;;;;20098:18:1;;9021:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8310:822;6908:87:::1;6840:155:::0;;:::o;8273:1552::-;-1:-1:-1;;;;;;;;;;;;;;;;9411:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9397:144;;-1:-1:-1;;;9397:144:0;;9486:7;9397:144;;;19818:25:1;-1:-1:-1;;;;;19879:32:1;;;19859:18;;;19852:60;9397:44:0;;;;;;;9449:13;;19791:18:1;;9397:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9621:17;9658:13;9641:14;:30;;;;:::i;:::-;9621:50;;-1:-1:-1;;;;;;;;;;;;;;;;9751:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9744:35:0;;9787:9;9799:7;9744:63;;;;;;;;;;;;;5141:25:1;;5129:2;5114:18;;4995:177;9744:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9138:687;6908:87:::1;6840:155:::0;;:::o;8181:1824::-;-1:-1:-1;;;;;;;;;;;;;;;;9932:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9925:35:0;;9968:14;9985:7;9925:68;;;;;;;;;;;;;5141:25:1;;5129:2;5114:18;;4995:177;9925:68:0;;;;;;;;;;;;;;;;;;;;3471:449;3703:45;;;-1:-1:-1;;;;;20465:32:1;;;3703:45:0;;;20447:51:1;20514:18;;;;20507:34;;;3703:45:0;;;;;;;;;;20420:18:1;;;;3703:45:0;;;;;;;-1:-1:-1;;;;;3703:45:0;-1:-1:-1;;;3703:45:0;;;3692:57;;-1:-1:-1;;;;3692:10:0;;;;:57;;3703:45;3692:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3656:93;;;;3782:7;:57;;;;-1:-1:-1;3794:11:0;;:16;;:44;;;3825:4;3814:24;;;;;;;;;;;;:::i;:::-;3760:152;;;;-1:-1:-1;;;3760:152:0;;21046:2:1;3760:152:0;;;21028:21:1;21085:2;21065:18;;;21058:30;21124:34;21104:18;;;21097:62;-1:-1:-1;;;21175:18:1;;;21168:43;21228:19;;3760:152:0;20844:409:1;3760:152:0;3578:342;;3471:449;;;:::o;15710:2354::-;15831:14;15848:11;:9;:11::i;:::-;15831:28;-1:-1:-1;15916:14:0;;;;;;16102:73;;;;16113:8;16102:73;:::i;:::-;15901:274;;;;;;;;;;;;16251:6;16238:9;:19;;16216:84;;;;-1:-1:-1;;;16216:84:0;;22286:2:1;16216:84:0;;;22268:21:1;22325:2;22305:18;;;22298:30;-1:-1:-1;;;22344:18:1;;;22337:45;22399:18;;16216:84:0;22084:339:1;16216:84:0;16333:21;16347:6;16333:13;:21::i;:::-;:29;;16358:4;16333:29;16311:94;;;;-1:-1:-1;;;16311:94:0;;22630:2:1;16311:94:0;;;22612:21:1;22669:2;22649:18;;;22642:30;-1:-1:-1;;;22688:18:1;;;22681:45;22743:18;;16311:94:0;22428:339:1;16311:94:0;16457:22;16482:18;16494:6;16482:9;:18;:::i;:::-;16457:43;;16550:1;16533:14;:18;16511:86;;;;-1:-1:-1;;;16511:86:0;;22974:2:1;16511:86:0;;;22956:21:1;23013:2;22993:18;;;22986:30;-1:-1:-1;;;23032:18:1;;;23025:48;23090:18;;16511:86:0;22772:342:1;16511:86:0;16648:24;16666:6;16648:15;:24;:::i;:::-;16630:14;:42;16608:111;;;;-1:-1:-1;;;16608:111:0;;23321:2:1;16608:111:0;;;23303:21:1;23360:2;23340:18;;;23333:30;-1:-1:-1;;;23379:18:1;;;23372:49;23438:18;;16608:111:0;23119:343:1;16608:111:0;16780:25;16862:19;;16858:166;;13447:6;16968:15;;16950;:33;16948:49;;;;;:::i;:::-;;16927:70;16858:166;17038:10;;17034:139;;13447:6;17126;;17117;:15;17115:31;;;;;:::i;:::-;;17094:52;17034:139;17249:43;17261:17;17280:3;17285:6;17249:11;:43::i;:::-;17347:400;;;;;;;;17384:15;17347:400;;;;17422:6;17347:400;;;;17451:1;17347:400;;;;17500:17;17483:14;:34;;;;:::i;:::-;17347:400;;-1:-1:-1;;;;;17347:400:0;;;;;;;;;;;;;;;17620:1;17608:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17608:14:0;-1:-1:-1;17347:400:0;;17650:14;;;17662:1;17650:14;;;;;;;;;17347:400;;;;;17650:14;;17662:1;17650:14;;;;;;;;;-1:-1:-1;;17347:400:0;;17689:5;17347:400;;;;;;;17720:15;17347:400;;;;;17331:13;;;:5;:13;;;;;;:416;;;;;;;;17347:400;17331:416;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17331:416:0;-1:-1:-1;;;;;;17331:416:0;;;-1:-1:-1;;;;;17331:416:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17331:416:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17331:416:0;;;;;;;;;-1:-1:-1;;17331:416:0;;;;;;;;;;;;;;;;;;;;17789:31;17805:6;17813;17789:15;:31::i;:::-;17858:36;17871:6;17879:14;17858:12;:36::i;:::-;17955:6;-1:-1:-1;;;;;17943:27:0;;17963:6;17943:27;;;;5141:25:1;;5129:2;5114:18;;4995:177;17943:27:0;;;;;;;;18015:41;18030:6;18038:1;18041:14;18015;:41::i;:::-;15788:2276;;;;;;;;;15710:2354;;;:::o;7316:172::-;-1:-1:-1;;;;;;;;;;;;;;;;7419:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7405:75;;-1:-1:-1;;;7405:75:0;;-1:-1:-1;;;;;23659:32:1;;;7405:75:0;;;23641:51:1;23728:32;;;23708:18;;;23701:60;7405:44:0;;;;;;;7457:9;;23614:18:1;;7405:75:0;23467:300:1;10103:272:0;10211:40;;-1:-1:-1;;;10211:40:0;;-1:-1:-1;;;;;23992:32:1;;;10211:40:0;;;23974:51:1;10235:7:0;24041:18:1;;;24034:34;24084:18;;;24077:34;;;10211:7:0;:15;;;;23947:18:1;;10211:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10305:11:0;:24;;;;;;;;;;;;-1:-1:-1;10340:20:0;;;:12;10305:24;10340:20;;;;;:27;;-1:-1:-1;;10340:27:0;;;;;;;-1:-1:-1;;;10103:272:0:o;7154:154::-;-1:-1:-1;;;;;;;;;;;;;;;;7243:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7226:74;;-1:-1:-1;;;7226:74:0;;-1:-1:-1;;;;;23992:32:1;;;7226:74:0;;;23974:51:1;24041:18;;;24034:34;;;7292:7:0;24084:18:1;;;24077:34;7226:51:0;;;;;;;23947:18:1;;7226:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7154:154;;:::o;10383:778::-;10536:16;-1:-1:-1;;;;;;;;;;;;;;;;10560:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10555:33:0;;10596:11;:9;:11::i;:::-;10555:185;;-1:-1:-1;;;;;;10555:185:0;;;;;;;;;;24292:25:1;;;24365:4;24353:17;;24333:18;;;24326:45;24265:18;;10555:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10824:24:0;;;;;;:13;:24;;;;;;10536:204;;-1:-1:-1;10824:29:0;10802:95;;;;-1:-1:-1;;;10802:95:0;;24838:2:1;10802:95:0;;;24820:21:1;24877:2;24857:18;;;24850:30;-1:-1:-1;;;24896:18:1;;;24889:46;24952:18;;10802:95:0;24636:340:1;10802:95:0;-1:-1:-1;;;;;10968:24:0;;;;;;:13;:24;;;;;;;;;:33;;;11051:15;;-1:-1:-1;;;;;;11051:15:0;;;;-1:-1:-1;;;;;;;;;;;1076:42:0;11051:13;;:15;;;;;10968:24;;11051:15;;;;;1076:42;11051:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11044:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11126:27;11146:6;11126:27;;;;5141:25:1;;5129:2;5114:18;;4995:177;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;331:226:1;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;-1:-1:-1;504:23:1;;331:226;-1:-1:-1;331:226:1:o;1388:346::-;1456:6;1464;1517:2;1505:9;1496:7;1492:23;1488:32;1485:52;;;1533:1;1530;1523:12;1485:52;-1:-1:-1;;1578:23:1;;;1698:2;1683:18;;;1670:32;;-1:-1:-1;1388:346:1:o;1739:420::-;1792:3;1830:5;1824:12;1857:6;1852:3;1845:19;1889:4;1884:3;1880:14;1873:21;;1928:4;1921:5;1917:16;1951:1;1961:173;1975:6;1972:1;1969:13;1961:173;;;2036:13;;2024:26;;2079:4;2070:14;;;;2107:17;;;;1997:1;1990:9;1961:173;;;-1:-1:-1;2150:3:1;;1739:420;-1:-1:-1;;;;1739:420:1:o;2164:261::-;2343:2;2332:9;2325:21;2306:4;2363:56;2415:2;2404:9;2400:18;2392:6;2363:56;:::i;:::-;2355:64;2164:261;-1:-1:-1;;;2164:261:1:o;2430:131::-;-1:-1:-1;;;;;2505:31:1;;2495:42;;2485:70;;2551:1;2548;2541:12;2485:70;2430:131;:::o;2566:367::-;2634:6;2642;2695:2;2683:9;2674:7;2670:23;2666:32;2663:52;;;2711:1;2708;2701:12;2663:52;2750:9;2737:23;2769:31;2794:5;2769:31;:::i;:::-;2819:5;2897:2;2882:18;;;;2869:32;;-1:-1:-1;;;2566:367:1:o;2938:429::-;2989:3;3027:5;3021:12;3054:6;3049:3;3042:19;3086:4;3081:3;3077:14;3070:21;;3125:4;3118:5;3114:16;3148:1;3158:184;3172:6;3169:1;3166:13;3158:184;;;3237:13;;3252:4;3233:24;3221:37;;3287:4;3278:14;;;;3315:17;;;;3194:1;3187:9;3158:184;;3372:1193;3573:2;3562:9;3555:21;3618:6;3612:13;3607:2;3596:9;3592:18;3585:41;3680:2;3672:6;3668:15;3662:22;3657:2;3646:9;3642:18;3635:50;3739:2;3731:6;3727:15;3721:22;3716:2;3705:9;3701:18;3694:50;3536:4;3791:2;3783:6;3779:15;3773:22;3804:53;3852:3;3841:9;3837:19;3823:12;-1:-1:-1;;;;;80:31:1;68:44;;14:104;3804:53;-1:-1:-1;3906:3:1;3894:16;;3888:23;632:13;;625:21;3967:3;3952:19;;613:34;3920:52;4021:3;4013:6;4009:16;4003:23;4063:6;4057:3;4046:9;4042:19;4035:35;4093:63;4151:3;4140:9;4136:19;4120:14;4093:63;:::i;:::-;4079:77;;4205:3;4197:6;4193:16;4187:23;4279:2;4275:7;4263:9;4255:6;4251:22;4247:36;4241:3;4230:9;4226:19;4219:65;4307:50;4350:6;4334:14;4307:50;:::i;:::-;4293:64;;;4406:3;4398:6;4394:16;4388:23;4420:52;4467:3;4456:9;4452:19;4436:14;632:13;625:21;613:34;;562:91;4420:52;;4530:3;4522:6;4518:16;4512:23;4503:6;4492:9;4488:22;4481:55;4553:6;4545:14;;;3372:1193;;;;:::o;5177:129::-;-1:-1:-1;;;;;5255:5:1;5251:30;5244:5;5241:41;5231:69;;5296:1;5293;5286:12;5311:367;5374:8;5384:6;5438:3;5431:4;5423:6;5419:17;5415:27;5405:55;;5456:1;5453;5446:12;5405:55;-1:-1:-1;5479:20:1;;-1:-1:-1;;;;;5511:30:1;;5508:50;;;5554:1;5551;5544:12;5508:50;5591:4;5583:6;5579:17;5567:29;;5651:3;5644:4;5634:6;5631:1;5627:14;5619:6;5615:27;5611:38;5608:47;5605:67;;;5668:1;5665;5658:12;5605:67;5311:367;;;;;:::o;5683:570::-;5777:6;5785;5793;5846:2;5834:9;5825:7;5821:23;5817:32;5814:52;;;5862:1;5859;5852:12;5814:52;5901:9;5888:23;5920:30;5944:5;5920:30;:::i;:::-;5969:5;-1:-1:-1;6025:2:1;6010:18;;5997:32;-1:-1:-1;;;;;6041:30:1;;6038:50;;;6084:1;6081;6074:12;6038:50;6123:70;6185:7;6176:6;6165:9;6161:22;6123:70;:::i;:::-;5683:570;;6212:8;;-1:-1:-1;6097:96:1;;-1:-1:-1;;;;5683:570:1:o;6258:437::-;6344:6;6352;6405:2;6393:9;6384:7;6380:23;6376:32;6373:52;;;6421:1;6418;6411:12;6373:52;6461:9;6448:23;-1:-1:-1;;;;;6486:6:1;6483:30;6480:50;;;6526:1;6523;6516:12;6480:50;6565:70;6627:7;6618:6;6607:9;6603:22;6565:70;:::i;:::-;6654:8;;6539:96;;-1:-1:-1;6258:437:1;-1:-1:-1;;;;6258:437:1:o;6700:433::-;6750:3;6788:5;6782:12;6815:6;6810:3;6803:19;6847:4;6842:3;6838:14;6831:21;;6886:4;6879:5;6875:16;6909:1;6919:189;6933:6;6930:1;6927:13;6919:189;;;7008:13;;7001:21;6994:29;6982:42;;7053:4;7044:14;;;;7081:17;;;;6955:1;6948:9;6919:189;;7138:252;7311:2;7300:9;7293:21;7274:4;7331:53;7380:2;7369:9;7365:18;7357:6;7331:53;:::i;7395:127::-;7456:10;7451:3;7447:20;7444:1;7437:31;7487:4;7484:1;7477:15;7511:4;7508:1;7501:15;7527:156;7593:20;;7653:4;7642:16;;7632:27;;7622:55;;7673:1;7670;7663:12;7622:55;7527:156;;;:::o;7688:902::-;7740:5;7793:3;7786:4;7778:6;7774:17;7770:27;7760:55;;7811:1;7808;7801:12;7760:55;7851:6;7838:20;-1:-1:-1;;;;;7873:6:1;7870:30;7867:56;;;7903:18;;:::i;:::-;7949:6;7946:1;7942:14;7985:2;7979:9;8048:2;8044:7;8039:2;8035;8031:11;8027:25;8019:6;8015:38;8119:6;8107:10;8104:22;-1:-1:-1;;;;;8071:10:1;8068:34;8065:62;8062:88;;;8130:18;;:::i;:::-;8166:2;8159:22;8216;;;8266:4;8298:15;;;8294:26;;;8216:22;8254:17;;8332:15;;;8329:35;;;8360:1;8357;8350:12;8329:35;8396:4;8388:6;8384:17;8373:28;;8410:150;8426:6;8421:3;8418:15;8410:150;;;8494:21;8511:3;8494:21;:::i;:::-;8482:34;;8545:4;8443:14;;;;8536;8410:150;;;-1:-1:-1;8578:6:1;7688:902;-1:-1:-1;;;;;7688:902:1:o;8595:582::-;8709:6;8717;8770:2;8758:9;8749:7;8745:23;8741:32;8738:52;;;8786:1;8783;8776:12;8738:52;8826:9;8813:23;-1:-1:-1;;;;;8851:6:1;8848:30;8845:50;;;8891:1;8888;8881:12;8845:50;8914:59;8965:7;8956:6;8945:9;8941:22;8914:59;:::i;:::-;8904:69;;;9026:2;9015:9;9011:18;8998:32;-1:-1:-1;;;;;9045:8:1;9042:32;9039:52;;;9087:1;9084;9077:12;9039:52;9110:61;9163:7;9152:8;9141:9;9137:24;9110:61;:::i;:::-;9100:71;;;8595:582;;;;;:::o;9371:250::-;9456:1;9466:113;9480:6;9477:1;9474:13;9466:113;;;9556:11;;;9550:18;9537:11;;;9530:39;9502:2;9495:10;9466:113;;;-1:-1:-1;;9613:1:1;9595:16;;9588:27;9371:250::o;9626:991::-;9786:4;9834:2;9823:9;9819:18;9864:2;9853:9;9846:21;9887:6;9922;9916:13;9953:6;9945;9938:22;9991:2;9980:9;9976:18;9969:25;;10053:2;10043:6;10040:1;10036:14;10025:9;10021:30;10017:39;10003:53;;10091:2;10083:6;10079:15;10112:1;10122:466;10136:6;10133:1;10130:13;10122:466;;;10229:2;10225:7;10213:9;10205:6;10201:22;10197:36;10192:3;10185:49;10263:6;10257:13;10305:2;10299:9;10336:8;10328:6;10321:24;10358:74;10423:8;10418:2;10410:6;10406:15;10401:2;10397;10393:11;10358:74;:::i;:::-;10498:2;10475:17;-1:-1:-1;;10471:31:1;10459:44;;;;10505:2;10455:53;;;;-1:-1:-1;10566:12:1;;;;10531:15;;;;;10158:1;10151:9;10122:466;;;-1:-1:-1;10605:6:1;;9626:991;-1:-1:-1;;;;;;9626:991:1:o;10853:118::-;10939:5;10932:13;10925:21;10918:5;10915:32;10905:60;;10961:1;10958;10951:12;10976:552;11057:6;11065;11073;11081;11134:3;11122:9;11113:7;11109:23;11105:33;11102:53;;;11151:1;11148;11141:12;11102:53;11196:23;;;-1:-1:-1;11316:2:1;11301:18;;11288:32;;-1:-1:-1;11398:2:1;11383:18;;11370:32;11411:30;11370:32;11411:30;:::i;:::-;11460:7;-1:-1:-1;11486:36:1;11518:2;11503:18;;11486:36;:::i;:::-;11476:46;;10976:552;;;;;;;:::o;11533:1424::-;12029:3;12042:22;;;12113:13;;12014:19;;;12135:22;;;11981:4;;12227;12215:17;;;12188:3;12173:19;;;11981:4;12260:199;12274:6;12271:1;12268:13;12260:199;;;12339:13;;-1:-1:-1;;;;;12335:39:1;12323:52;;12404:4;12432:17;;;;12395:14;;;;12371:1;12289:9;12260:199;;;12264:3;;12506:9;12501:3;12497:19;12490:4;12479:9;12475:20;12468:49;12540:41;12577:3;12569:6;12540:41;:::i;:::-;12526:55;;;12629:9;12621:6;12617:22;12612:2;12601:9;12597:18;12590:50;12663:44;12700:6;12692;12663:44;:::i;:::-;12649:58;;12755:9;12747:6;12743:22;12738:2;12727:9;12723:18;12716:50;12789:44;12826:6;12818;12789:44;:::i;:::-;12775:58;;12882:9;12874:6;12870:22;12864:3;12853:9;12849:19;12842:51;12910:41;12944:6;12936;12910:41;:::i;:::-;12902:49;11533:1424;-1:-1:-1;;;;;;;;11533:1424:1:o;12962:721::-;13041:6;13049;13057;13110:2;13098:9;13089:7;13085:23;13081:32;13078:52;;;13126:1;13123;13116:12;13078:52;13165:9;13152:23;13184:31;13209:5;13184:31;:::i;:::-;13234:5;-1:-1:-1;13290:2:1;13275:18;;13262:32;-1:-1:-1;;;;;13306:30:1;;13303:50;;;13349:1;13346;13339:12;13303:50;13372:22;;13425:4;13417:13;;13413:27;-1:-1:-1;13403:55:1;;13454:1;13451;13444:12;13403:55;13494:2;13481:16;-1:-1:-1;;;;;13512:6:1;13509:30;13506:50;;;13552:1;13549;13542:12;13506:50;13597:7;13592:2;13583:6;13579:2;13575:15;13571:24;13568:37;13565:57;;;13618:1;13615;13608:12;13565:57;12962:721;;13649:2;13641:11;;;;;-1:-1:-1;13671:6:1;;-1:-1:-1;;;12962:721:1:o;13885:251::-;13955:6;14008:2;13996:9;13987:7;13983:23;13979:32;13976:52;;;14024:1;14021;14014:12;13976:52;14056:9;14050:16;14075:31;14100:5;14075:31;:::i;14141:334::-;14343:2;14325:21;;;14382:2;14362:18;;;14355:30;-1:-1:-1;;;14416:2:1;14401:18;;14394:40;14466:2;14451:18;;14141:334::o;14480:127::-;14541:10;14536:3;14532:20;14529:1;14522:31;14572:4;14569:1;14562:15;14596:4;14593:1;14586:15;14612:128;14679:9;;;14700:11;;;14697:37;;;14714:18;;:::i;14745:127::-;14806:10;14801:3;14797:20;14794:1;14787:31;14837:4;14834:1;14827:15;14861:4;14858:1;14851:15;16387:611;-1:-1:-1;;;;;16631:31:1;;16613:50;;16694:2;16679:18;;16672:34;;;16742:2;16737;16722:18;;16715:30;;;16761:18;;16754:34;;;-1:-1:-1;;;;;;16800:31:1;;16797:51;;;16844:1;16841;16834:12;16797:51;16878:6;16875:1;16871:14;16936:6;16928;16922:3;16911:9;16907:19;16894:49;16964:22;;;;16988:3;16960:32;;16387:611;-1:-1:-1;;;;;16387:611:1:o;17003:127::-;17064:10;17059:3;17055:20;17052:1;17045:31;17095:4;17092:1;17085:15;17119:4;17116:1;17109:15;17135:112;17167:1;17193;17183:35;;17198:18;;:::i;:::-;-1:-1:-1;17232:9:1;;17135:112::o;17252:125::-;17317:9;;;17338:10;;;17335:36;;;17351:18;;:::i;17706:157::-;17736:1;17770:4;17767:1;17763:12;17794:3;17784:37;;17801:18;;:::i;:::-;17853:3;17846:4;17843:1;17839:12;17835:22;17830:27;;;17706:157;;;;:::o;17868:168::-;17941:9;;;17972;;17989:15;;;17983:22;;17969:37;17959:71;;18010:18;;:::i;18041:120::-;18081:1;18107;18097:35;;18112:18;;:::i;:::-;-1:-1:-1;18146:9:1;;18041:120::o;18166:245::-;18233:6;18286:2;18274:9;18265:7;18261:23;18257:32;18254:52;;;18302:1;18299;18292:12;18254:52;18334:9;18328:16;18353:28;18375:5;18353:28;:::i;19455:184::-;19525:6;19578:2;19566:9;19557:7;19553:23;19549:32;19546:52;;;19594:1;19591;19584:12;19546:52;-1:-1:-1;19617:16:1;;19455:184;-1:-1:-1;19455:184:1:o;20552:287::-;20681:3;20719:6;20713:13;20735:66;20794:6;20789:3;20782:4;20774:6;20770:17;20735:66;:::i;:::-;20817:16;;;;;20552:287;-1:-1:-1;;20552:287:1:o;21258:821::-;21367:6;21375;21383;21391;21399;21407;21460:3;21448:9;21439:7;21435:23;21431:33;21428:53;;;21477:1;21474;21467:12;21428:53;21522:23;;;-1:-1:-1;21642:2:1;21627:18;;21614:32;;-1:-1:-1;21745:2:1;21730:18;;21717:32;;-1:-1:-1;21827:2:1;21812:18;;21799:32;21840:30;21799:32;21840:30;:::i;:::-;21889:7;-1:-1:-1;21948:3:1;21933:19;;21920:33;21962;21920;21962;:::i;:::-;22014:7;22004:17;;;22068:3;22057:9;22053:19;22040:33;22030:43;;21258:821;;;;;;;;:::o;24382:249::-;24451:6;24504:2;24492:9;24483:7;24479:23;24475:32;24472:52;;;24520:1;24517;24510:12;24472:52;24552:9;24546:16;24571:30;24595:5;24571:30;:::i

Swarm Source

ipfs://712d9c740ebb75293de500fab6674451b8a5d918f68e38fc1e7c8ac18ad57531

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0xB08C669dc0419151bA4e4920E80128802dB5497b
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.