APE Price: $0.19 (-3.33%)

Contract

0x7B53Ec7A5e1C30D4b91D2c3Ec0472a6E4818a657

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To
Play327848072026-01-24 16:52:348 mins ago1769273554IN
0x7B53Ec7A...E4818a657
50.07321158 APE0.07230925101.68276
Play327847732026-01-24 16:51:389 mins ago1769273498IN
0x7B53Ec7A...E4818a657
50.07321158 APE0.07230925101.68276
Play327822162026-01-24 15:34:031 hr ago1769268843IN
0x7B53Ec7A...E4818a657
10.07321158 APE0.07230925101.68276
Play327816382026-01-24 15:17:431 hr ago1769267863IN
0x7B53Ec7A...E4818a657
10.07321158 APE0.07202332101.68276
Play327798192026-01-24 14:28:062 hrs ago1769264886IN
0x7B53Ec7A...E4818a657
15.07321158 APE0.07230925101.68276
Play327796642026-01-24 14:24:382 hrs ago1769264678IN
0x7B53Ec7A...E4818a657
5.07321158 APE0.07230925101.68276
Play327784282026-01-24 13:52:263 hrs ago1769262746IN
0x7B53Ec7A...E4818a657
15.07321158 APE0.07221987101.68276
Play327747342026-01-24 12:21:434 hrs ago1769257303IN
0x7B53Ec7A...E4818a657
10.07321158 APE0.07726649101.68276
Play327747222026-01-24 12:21:264 hrs ago1769257286IN
0x7B53Ec7A...E4818a657
10.07321158 APE0.07220401101.68276
Play327740192026-01-24 11:59:145 hrs ago1769255954IN
0x7B53Ec7A...E4818a657
5.07321158 APE0.07220401101.68276
Play327740092026-01-24 11:58:575 hrs ago1769255937IN
0x7B53Ec7A...E4818a657
5.07321158 APE0.07220401101.68276
Play327740052026-01-24 11:58:425 hrs ago1769255922IN
0x7B53Ec7A...E4818a657
5.07321158 APE0.07218693101.68276
Play327714432026-01-24 10:35:056 hrs ago1769250905IN
0x7B53Ec7A...E4818a657
5.07321158 APE0.07221987101.68276
Play327714352026-01-24 10:34:496 hrs ago1769250889IN
0x7B53Ec7A...E4818a657
5.07321158 APE0.07221987101.68276
Play327714302026-01-24 10:34:316 hrs ago1769250871IN
0x7B53Ec7A...E4818a657
5.07321158 APE0.07221987101.68276
Play327701292026-01-24 9:52:247 hrs ago1769248344IN
0x7B53Ec7A...E4818a657
50.07321158 APE0.07230925101.68276
Play327700992026-01-24 9:51:387 hrs ago1769248298IN
0x7B53Ec7A...E4818a657
10.07321158 APE0.07230925101.68276
Play327700232026-01-24 9:50:107 hrs ago1769248210IN
0x7B53Ec7A...E4818a657
10.07321158 APE0.07230925101.68276
Play327677512026-01-24 8:20:018 hrs ago1769242801IN
0x7B53Ec7A...E4818a657
733.47321158 APE0.07233365101.68276
Play327677362026-01-24 8:19:158 hrs ago1769242755IN
0x7B53Ec7A...E4818a657
1,000.07321158 APE0.07233365101.68276
Play327677202026-01-24 8:18:388 hrs ago1769242718IN
0x7B53Ec7A...E4818a657
1,000.07321158 APE0.07233365101.68276
Play327674422026-01-24 8:10:578 hrs ago1769242257IN
0x7B53Ec7A...E4818a657
1,003.17321158 APE0.07739491101.68276
Play327674232026-01-24 8:10:238 hrs ago1769242223IN
0x7B53Ec7A...E4818a657
1,003.17321158 APE0.07233365101.68276
Play327619802026-01-24 5:18:3611 hrs ago1769231916IN
0x7B53Ec7A...E4818a657
38.87321158 APE0.0722517101.68276
Play327617602026-01-24 5:12:2211 hrs ago1769231542IN
0x7B53Ec7A...E4818a657
38.87321158 APE0.07737783101.68276
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
327848962026-01-24 16:56:144 mins ago1769273774
0x7B53Ec7A...E4818a657
5.92998 APE
327848942026-01-24 16:56:134 mins ago1769273773
0x7B53Ec7A...E4818a657
0.07321158 APE
327848942026-01-24 16:56:134 mins ago1769273773
0x7B53Ec7A...E4818a657
0.12102 APE
327848942026-01-24 16:56:134 mins ago1769273773
0x7B53Ec7A...E4818a657
6.12421158 APE
327848082026-01-24 16:52:368 mins ago1769273556
0x7B53Ec7A...E4818a657
22.3335 APE
327848082026-01-24 16:52:368 mins ago1769273556
0x7B53Ec7A...E4818a657
26.6665 APE
327848072026-01-24 16:52:348 mins ago1769273554
0x7B53Ec7A...E4818a657
0.07321158 APE
327848072026-01-24 16:52:348 mins ago1769273554
0x7B53Ec7A...E4818a657
1 APE
327847742026-01-24 16:51:389 mins ago1769273498
0x7B53Ec7A...E4818a657
7.056 APE
327847742026-01-24 16:51:389 mins ago1769273498
0x7B53Ec7A...E4818a657
41.944 APE
327847732026-01-24 16:51:389 mins ago1769273498
0x7B53Ec7A...E4818a657
0.07321158 APE
327847732026-01-24 16:51:389 mins ago1769273498
0x7B53Ec7A...E4818a657
1 APE
327822172026-01-24 15:34:041 hr ago1769268844
0x7B53Ec7A...E4818a657
0.9112 APE
327822172026-01-24 15:34:041 hr ago1769268844
0x7B53Ec7A...E4818a657
8.8888 APE
327822162026-01-24 15:34:031 hr ago1769268843
0x7B53Ec7A...E4818a657
0.07321158 APE
327822162026-01-24 15:34:031 hr ago1769268843
0x7B53Ec7A...E4818a657
0.2 APE
327816392026-01-24 15:17:441 hr ago1769267864
0x7B53Ec7A...E4818a657
4.55 APE
327816392026-01-24 15:17:441 hr ago1769267864
0x7B53Ec7A...E4818a657
5.25 APE
327816382026-01-24 15:17:431 hr ago1769267863
0x7B53Ec7A...E4818a657
0.07321158 APE
327816382026-01-24 15:17:431 hr ago1769267863
0x7B53Ec7A...E4818a657
0.2 APE
327798212026-01-24 14:28:072 hrs ago1769264887
0x7B53Ec7A...E4818a657
5.41875 APE
327798212026-01-24 14:28:072 hrs ago1769264887
0x7B53Ec7A...E4818a657
9.28125 APE
327798192026-01-24 14:28:062 hrs ago1769264886
0x7B53Ec7A...E4818a657
0.07321158 APE
327798192026-01-24 14:28:062 hrs ago1769264886
0x7B53Ec7A...E4818a657
0.3 APE
327796652026-01-24 14:24:402 hrs ago1769264680
0x7B53Ec7A...E4818a657
4.9 APE
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x9ebb4Df2...E7723F3CB
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Slots

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-05-23
*/

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


// 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');
    }
}

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 IRNG {
    function requestRandom(bytes32 userRandomNumber, uint8 numWords) external payable returns (uint64);
    function getFee() external view returns (uint256);
}

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 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;

}

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;
}

interface IERC20 {

    function totalSupply() external view returns (uint256);
    
    function symbol() external view returns(string memory);
    
    function name() external view returns(string memory);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
    
    /**
     * @dev Returns the number of decimal places
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
    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) {}
}

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

    /** Reel Info */
    uint8[] public reel1;
    uint8[] public reel2;
    uint8[] public reel3;

    /** num to coin in reel */
    mapping ( uint8 => uint8 ) public numToCoinReel1;
    mapping ( uint8 => uint8 ) public numToCoinReel2;
    mapping ( uint8 => uint8 ) public numToCoinReel3;

    // Num Spins
    uint8 public MAX_SPINS = 10;

    // Game Struct
    struct Game {

        /** Player */
        address player;

        /** Amount Bet */
        uint256 betAmount;

        /** Total Amount For House */
        uint256 amountForHouse;

        /** Final Output -- reels */
        uint8[] num0;
        uint8[] num1;
        uint8[] num2;

        /** Payouts */
        uint256 payout;

        /** Whether or not the game has ended and the VRF has called back */
        bool hasEnded;

        /** Timestamp */
        uint256 timestamp;
    }

    struct GameInfoReturnType {
        address player;
        uint256 betAmountPerSpin;
        uint256 totalBetAmount;
        uint8[] num0;
        uint8[] num1;
        uint8[] num2;
        uint256 totalPayout;
        bool hasEnded;
        uint256 timestamp;
    }

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

    /** Platform Fee Taken Out Of Buy In */
    uint256 public platformFee = 100;

    /** Maps three random numbers to a payout */
    mapping ( uint8 => mapping ( uint8 => mapping ( uint8 => uint256 ) ) ) public payout;

    /** Payout Denom */
    uint256 public constant PAYOUT_DENOM = 10_000; // 0.01x precision (payout of 100 = 1%, 10,000 = 1x, 1,000,000 = 100x)

    /** Locks changes to odds */
    bool public oddsLocked;

    /// @notice emitted after the platform fee has been changed
    event SetPlatformFee(uint256 newFee);

    /// @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);

    /// @notice Emitted when the reel data is updated, emits the odds associated with the reel data
    event OddsLocked();

    constructor(

        /** Game Configs */
        uint8[] memory reel1_,
        uint8[] memory reel2_,
        uint8[] memory reel3_,

        uint256 GAME_ID_,
        address _history
    ) GameMasterclass(GAME_ID_, _history){

        // set reels
        reel1 = reel1_;
        reel2 = reel2_;
        reel3 = reel3_;
        require(
            reel1_.length == reel2_.length &&
            reel2_.length == reel3_.length,
            'Invalid Reel Length'
        );
    }

    // set spins
    function setMaxSpins(uint8 _maxSpins) external onlyOwner {
        MAX_SPINS = _maxSpins;
    }

    function setPlatformFee(uint256 newPlatform) external onlyOwner {
        require(
            newPlatform <= PAYOUT_DENOM / 5,
            'Cannot Exceed 20%'
        );
        platformFee = newPlatform;
        emit SetPlatformFee(newPlatform);
    }

    function lockOdds() external onlyOwner {
        oddsLocked = true;
        emit OddsLocked();
    }

    function setReels(
        uint8[] calldata reel1_,
        uint8[] calldata reel2_,
        uint8[] calldata reel3_
    ) external onlyOwner {
        require(
            oddsLocked == false,
            'Odds Are Locked'
        );
        require(
            reel1_.length == reel2_.length &&
            reel2_.length == reel3_.length,
            'Invalid Reel Length'
        );
        reel1 = reel1_;
        reel2 = reel2_;
        reel3 = reel3_;
    }

    function enforceReel1() public onlyOwner {
        // set num to coins
        uint8 coin1 = 0;
        uint8 len = reel1[reel1.length - 1];
        for (uint8 i = 0; i < len;) {
            numToCoinReel1[i] = coin1;
            unchecked { ++i; }
            if (i == reel1[coin1]) {
                unchecked { ++coin1; }
            }
        }
    }

    function enforceReel2() public onlyOwner {
        // set num to coins
        uint8 coin2 = 0;
        uint8 len = reel2[reel2.length - 1];
        for (uint8 i = 0; i < len;) {
            numToCoinReel2[i] = coin2;
            unchecked { ++i; }
            if (i == reel2[coin2]) {
                unchecked { ++coin2; }
            }
        }
    }

    function enforceReel3() public onlyOwner {
        // set num to coins
        uint8 coin3 = 0;
        uint8 len = reel3[reel3.length - 1];
        for (uint8 i = 0; i < len;) {
            numToCoinReel3[i] = coin3;
            unchecked { ++i; }
            if (i == reel3[coin3]) {
                unchecked { ++coin3; }
            }
        }
    }

    function batchSetPayouts(
        uint8[] calldata coins0,
        uint8[] calldata coins1,
        uint8[] calldata coins2,
        uint256[] calldata payoutMultiplier
    ) external onlyOwner {
        require(
            oddsLocked == false,
            'Odds are locked'
        );
        uint len = coins0.length;
        require(
            len == coins1.length,
            'Invalid Length 0-1'
        );
        require(
            len == coins2.length,
            'Invalid Length 0-2'
        );
        require(
            len == payoutMultiplier.length,
            'Invalid Length 0-payout'
        );

        for (uint i = 0; i < len;) {
            // set payout
            payout[coins0[i]][coins1[i]][coins2[i]] = payoutMultiplier[i];
            unchecked { ++i; }
        }
    }

    receive() external payable {}

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

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

        // decode game data
        (
            uint256 gameId,
            uint8 numSpins,
            address ref,
            bytes32 userRandomWord
        ) = abi.decode(gameData, (uint256, uint8, address, bytes32));

        // validate inputs
        require(
            msg.value >= vrfFee,
            'ERR: MIN BUY IN'
        );
        require(
            isValidGameId(gameId) == true,
            'ERR: INVALID GAME ID'
        );
        require(
            numSpins > 0 && numSpins <= MAX_SPINS,
            'ERR: INVALID SPINS'
        );

        // determine total bet amount
        uint256 totalBetAmount = msg.value - vrfFee;

        // calculate the bet amount
        uint256 betAmountPerSpin = totalBetAmount  / numSpins;

        // take platform fee out of the buy in
        uint256 platformFeeAmount = ( totalBetAmount * platformFee ) / PAYOUT_DENOM;

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

        // save game data
        games[gameId].player = player;
        games[gameId].betAmount = betAmountPerSpin;
        games[gameId].amountForHouse = totalBetAmount - platformFeeAmount;
        games[gameId].num0 = new uint8[](numSpins);
        games[gameId].num1 = new uint8[](numSpins);
        games[gameId].num2 = new uint8[](numSpins);
        games[gameId].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, numSpins * 3, 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].player == address(0) || 
            games[gameId].hasEnded == true ||
            games[gameId].num0.length == 0 ||
            randomWords.length != (games[gameId].num0.length * 3)
        ) {
            emit FulfilRandomFailed(requestId, gameId, randomWords);
            return;
        }

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

        // fetch the bet amount per spin
        uint256 betAmountPerSpin = games[gameId].betAmount;

        // total to pay out for the house and total to send the house
        uint256 totalToPayout = 0;

        // get total options per reel
        uint8 numReel1 = numOptionsReel1();
        uint8 numReel2 = numOptionsReel2();
        uint8 numReel3 = numOptionsReel3();

        // get num spins
        uint8 NUM_SPINS = uint8(games[gameId].num0.length);

        // loop through spins
        for (uint i = 0; i < NUM_SPINS;) {

            // fetch index (coin) of reel array
            uint8 index1 = numToCoinReel1[uint8(randomWords[i * 3] % numReel1)];
            uint8 index2 = numToCoinReel2[uint8(randomWords[(i * 3) + 1] % numReel2)];
            uint8 index3 = numToCoinReel3[uint8(randomWords[(i * 3) + 2] % numReel3)];

            // save indexes to state
            games[gameId].num0[i] = index1;
            games[gameId].num1[i] = index2;
            games[gameId].num2[i] = index3;

            // if payout exists, user won this spin
            if (payout[index1][index2][index3] > 0) {

                // increment data, add to total payout
                unchecked {
                    totalToPayout += ( ( payout[index1][index2][index3] * betAmountPerSpin ) / PAYOUT_DENOM );
                }
            }
            unchecked { ++i; }
        }

        // save payout info
        games[gameId].payout = totalToPayout;

        // handle payouts
        _handlePayout(games[gameId].player, totalToPayout, games[gameId].amountForHouse);

        // emit game ended event
        emit GameEnded(games[gameId].player, gameId, games[gameId].betAmount * NUM_SPINS, totalToPayout);
    }

    function optionsReel1() external view returns (uint8[] memory) {
        return reel1;
    }

    function optionsReel2() external view returns (uint8[] memory) {
        return reel2;
    }

    function optionsReel3() external view returns (uint8[] memory) {
        return reel3;
    }

    function numOptionsReel1() public view returns (uint8) {
        return reel1[reel1.length - 1];
    }

    function numOptionsReel2() public view returns (uint8) {
        return reel2[reel2.length - 1];
    }

    function numOptionsReel3() public view returns (uint8) {
        return reel3[reel3.length - 1];
    }

    function getPayout(uint8 coin1, uint8 coin2, uint8 coin3) public view returns (uint256) {
        return payout[coin1][coin2][coin3];
    }

    function getGameInfo(uint256 gameId) public view returns (
        GameInfoReturnType memory
    ) {
        return GameInfoReturnType({
            player: games[gameId].player,
            betAmountPerSpin: games[gameId].betAmount,
            totalBetAmount: games[gameId].betAmount * games[gameId].num0.length,
            num0: games[gameId].num0,
            num1: games[gameId].num1,
            num2: games[gameId].num2,
            totalPayout: games[gameId].payout,
            hasEnded: games[gameId].hasEnded,
            timestamp: games[gameId].timestamp
        });
    }

    function batchGameInfo(uint256[] calldata gameIds) external view returns (
        GameInfoReturnType[] memory
    ) {
        uint len = gameIds.length;
        GameInfoReturnType[] memory retTypes = new GameInfoReturnType[](len);
        
        for (uint i = 0; i < len;) {
            retTypes[i] = getGameInfo(gameIds[i]);
            unchecked { ++i; }
        }

        return retTypes;
    }

    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]].player;
            buyInAmounts[i] = games[gameIds[i]].betAmount * games[gameIds[i]].num0.length;
            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":"uint8[]","name":"reel1_","type":"uint8[]"},{"internalType":"uint8[]","name":"reel2_","type":"uint8[]"},{"internalType":"uint8[]","name":"reel3_","type":"uint8[]"},{"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":[],"name":"OddsLocked","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":"newFee","type":"uint256"}],"name":"SetPlatformFee","type":"event"},{"inputs":[],"name":"GAME_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SPINS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYOUT_DENOM","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":"batchGameInfo","outputs":[{"components":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmountPerSpin","type":"uint256"},{"internalType":"uint256","name":"totalBetAmount","type":"uint256"},{"internalType":"uint8[]","name":"num0","type":"uint8[]"},{"internalType":"uint8[]","name":"num1","type":"uint8[]"},{"internalType":"uint8[]","name":"num2","type":"uint8[]"},{"internalType":"uint256","name":"totalPayout","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Slots.GameInfoReturnType[]","name":"","type":"tuple[]"}],"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":"coins0","type":"uint8[]"},{"internalType":"uint8[]","name":"coins1","type":"uint8[]"},{"internalType":"uint8[]","name":"coins2","type":"uint8[]"},{"internalType":"uint256[]","name":"payoutMultiplier","type":"uint256[]"}],"name":"batchSetPayouts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforceReel1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforceReel2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforceReel3","outputs":[],"stateMutability":"nonpayable","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":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"uint256","name":"amountForHouse","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"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":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmountPerSpin","type":"uint256"},{"internalType":"uint256","name":"totalBetAmount","type":"uint256"},{"internalType":"uint8[]","name":"num0","type":"uint8[]"},{"internalType":"uint8[]","name":"num1","type":"uint8[]"},{"internalType":"uint8[]","name":"num2","type":"uint8[]"},{"internalType":"uint256","name":"totalPayout","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Slots.GameInfoReturnType","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHouse","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"coin1","type":"uint8"},{"internalType":"uint8","name":"coin2","type":"uint8"},{"internalType":"uint8","name":"coin3","type":"uint8"}],"name":"getPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"lockOdds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IGovernanceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOptionsReel1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOptionsReel2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOptionsReel3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"numToCoinReel1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"numToCoinReel2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"numToCoinReel3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numUsedGameIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oddsLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optionsReel1","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optionsReel2","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optionsReel3","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"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":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"payout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reel1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reel2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reel3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxSpins","type":"uint8"}],"name":"setMaxSpins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPlatform","type":"uint256"}],"name":"setPlatformFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"reel1_","type":"uint8[]"},{"internalType":"uint8[]","name":"reel2_","type":"uint8[]"},{"internalType":"uint8[]","name":"reel3_","type":"uint8[]"}],"name":"setReels","outputs":[],"stateMutability":"nonpayable","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"},{"stateMutability":"payable","type":"receive"}]

0x60c06040526000805460ff19908116909155600a8054909116811790556064600c5534801561002d57600080fd5b5060405161492438038061492483398101604081905261004c91610293565b60808290526001600160a01b03811660a0528451610071906004906020880190610106565b508351610085906005906020870190610106565b508251610099906006906020860190610106565b50835185511480156100ac575082518451145b6100fc5760405162461bcd60e51b815260206004820152601360248201527f496e76616c6964205265656c204c656e67746800000000000000000000000000604482015260640160405180910390fd5b5050505050610355565b82805482825590600052602060002090601f0160209004810192821561019c5791602002820160005b8382111561016d57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030261012f565b801561019a5782816101000a81549060ff021916905560010160208160000104928301926001030261016d565b505b506101a89291506101ac565b5090565b5b808211156101a857600081556001016101ad565b634e487b7160e01b600052604160045260246000fd5b805160ff811681146101e857600080fd5b919050565b600082601f8301126101fe57600080fd5b81516001600160401b03811115610217576102176101c1565b604051600582901b90603f8201601f191681016001600160401b0381118282101715610245576102456101c1565b60405291825260208185018101929081018684111561026357600080fd5b6020860192505b838310156102895761027b836101d7565b81526020928301920161026a565b5095945050505050565b600080600080600060a086880312156102ab57600080fd5b85516001600160401b038111156102c157600080fd5b6102cd888289016101ed565b602088015190965090506001600160401b038111156102eb57600080fd5b6102f7888289016101ed565b604088015190955090506001600160401b0381111561031557600080fd5b610321888289016101ed565b60608801516080890151919550935090506001600160a01b038116811461034757600080fd5b809150509295509295909350565b60805160a0516145726103b2600039600081816106e5015261361e01526000818161097201528181612c1701528181612d2201528181612e2201528181612f290152818161301f015281816135f1015261375c01526145726000f3fe6080604052600436106102975760003560e01c806389fc2c0f1161015a578063c271ac1a116100c1578063d7b7ca4a1161007a578063d7b7ca4a146108ec578063d951ec5b14610901578063e4b26ae714610916578063f0034a7e14610936578063fc628ac41461094b578063fdcdb06b1461096057600080fd5b8063c271ac1a146107f9578063c4fd5d6d14610843578063c811ad7114610874578063cc81d05514610887578063d01585d41461089c578063d02e3555146108bc57600080fd5b80639fe870dd116101135780639fe870dd14610765578063a16c47371461077a578063aa44cf171461079a578063aa5a60e5146107af578063b79f2925146107c4578063bd92621b146107e457600080fd5b806389fc2c0f146106715780638a31ae561461069157806391ea41e6146106a657806398daac83146106d35780639e281a98146107075780639f90bd651461072757600080fd5b8063481c6a75116101fe5780636c236d58116101b75780636c236d58146105c0578063749fa03c146105d55780637b8d3879146105f55780638456cb5914610622578063864638a51461063757806387cf2a231461065157600080fd5b8063481c6a751461050157806348e8294a1461052357806351e925591461055057806352233e91146105705780635c975abb14610586578063614be8d4146105a057600080fd5b80632fbb0116116102505780632fbb0116146103f357806330ea95f31461041557806332883e7e1461045757806338b6d2e5146104845780634782f779146104b457806347e1d550146104d457600080fd5b8063046f7da2146102a35780630476f004146102ba57806304e2064f146102e9578063117a5b901461031657806312e8e2c3146103af57806326232a2e146103cf57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610994565b005b3480156102c657600080fd5b50600e546102d49060ff1681565b60405190151581526020015b60405180910390f35b3480156102f557600080fd5b506102fe610a49565b6040516001600160a01b0390911681526020016102e0565b34801561032257600080fd5b50610376610331366004613b9c565b600b602052600090815260409020805460018201546002830154600684015460078501546008909501546001600160a01b039094169492939192909160ff9091169086565b604080516001600160a01b03909716875260208701959095529385019290925260608401521515608083015260a082015260c0016102e0565b3480156103bb57600080fd5b506102b86103ca366004613b9c565b610ac0565b3480156103db57600080fd5b506103e5600c5481565b6040519081526020016102e0565b3480156103ff57600080fd5b50610408610beb565b6040516102e09190613bb5565b34801561042157600080fd5b50610445610430366004613c11565b60086020526000908152604090205460ff1681565b60405160ff90911681526020016102e0565b34801561046357600080fd5b50610477610472366004613c33565b610c61565b6040516102e09190613c91565b34801561049057600080fd5b5061044561049f366004613c11565b60096020526000908152604090205460ff1681565b3480156104c057600080fd5b506102b86104cf366004613cbc565b610d25565b3480156104e057600080fd5b506104f46104ef366004613b9c565b610e2a565b6040516102e09190613dc5565b34801561050d57600080fd5b506102fe60008051602061451d83398151915281565b34801561052f57600080fd5b5061054361053e366004613e23565b611054565b6040516102e09190613e64565b34801561055c57600080fd5b506102d461056b366004613b9c565b611107565b34801561057c57600080fd5b506103e561271081565b34801561059257600080fd5b506000546102d49060ff1681565b3480156105ac57600080fd5b506104456105bb366004613b9c565b611127565b3480156105cc57600080fd5b5061040861115b565b3480156105e157600080fd5b506102b86105f0366004613ede565b6111b5565b34801561060157600080fd5b50610615610610366004613e23565b6116f3565b6040516102e09190613f66565b34801561062e57600080fd5b506102b86117b0565b34801561064357600080fd5b50600a546104459060ff1681565b34801561065d57600080fd5b506102b861066c366004613f79565b61185f565b34801561067d57600080fd5b506103e561068c366004613b9c565b611b0d565b34801561069d57600080fd5b506102b8611b2e565b3480156106b257600080fd5b506106c66106c1366004613e23565b611c95565b6040516102e09190614070565b3480156106df57600080fd5b506102fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561071357600080fd5b506102b8610722366004613cbc565b611d4c565b34801561073357600080fd5b506103e56107423660046140e4565b600d60209081526000938452604080852082529284528284209052825290205481565b34801561077157600080fd5b506102b8611dfb565b34801561078657600080fd5b50610445610795366004613b9c565b611f62565b3480156107a657600080fd5b50610445611f72565b3480156107bb57600080fd5b506102b8611fbb565b3480156107d057600080fd5b506104456107df366004613b9c565b612122565b3480156107f057600080fd5b50610445612132565b34801561080557600080fd5b506103e56108143660046140e4565b60ff9283166000908152600d602090815260408083209486168352938152838220929094168152925290205490565b34801561084f57600080fd5b5061086361085e366004613e23565b612146565b6040516102e0959493929190614127565b6102b86108823660046141c7565b6124b5565b34801561089357600080fd5b506001546103e5565b3480156108a857600080fd5b506102b86108b7366004613c11565b61267c565b3480156108c857600080fd5b506104456108d7366004613c11565b60076020526000908152604090205460ff1681565b3480156108f857600080fd5b50610445612732565b34801561090d57600080fd5b506102b8612746565b34801561092257600080fd5b506102b861093136600461424c565b61281e565b34801561094257600080fd5b506103e5612982565b34801561095757600080fd5b50610408612a55565b34801561096c57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0491906142ef565b6001600160a01b0316336001600160a01b031614610a3d5760405162461bcd60e51b8152600401610a349061430c565b60405180910390fd5b6000805460ff19169055565b600060008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb91906142ef565b905090565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3091906142ef565b6001600160a01b0316336001600160a01b031614610b605760405162461bcd60e51b8152600401610a349061430c565b610b6d600561271061435c565b811115610bb05760405162461bcd60e51b815260206004820152601160248201527043616e6e6f74204578636565642032302560781b6044820152606401610a34565b600c8190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b60606004805480602002602001604051908101604052809291908181526020018280548015610c5757602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610c285790505b5050505050905090565b600154606090821115610c745760015491505b6000610c808484614370565b6001600160401b03811115610c9757610c97614383565b604051908082528060200260200182016040528015610cc0578160200160208202803683370190505b509050835b83811015610d1b5760018181548110610ce057610ce0614399565b9060005260206000200154828683610cf89190614370565b81518110610d0857610d08614399565b6020908102919091010152600101610cc5565b5090505b92915050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9591906142ef565b6001600160a01b0316336001600160a01b031614610dc55760405162461bcd60e51b8152600401610a349061430c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e12576040519150601f19603f3d011682016040523d82523d6000602084013e610e17565b606091505b5050905080610e2557600080fd5b505050565b610e32613a20565b60408051610120810182526000848152600b602081815284832080546001600160a01b03168552600181015482860181905293889052919052600301549192830191610e7d916143af565b81526000848152600b60209081526040918290206003018054835181840281018401909452808452938201939091830182828015610ef857602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610ec95790505b50505050508152602001600b6000858152602001908152602001600020600401805480602002602001604051908101604052809291908181526020018280548015610f8057602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610f515790505b50505050508152602001600b600085815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561100857602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610fd95790505b50505091835250506000848152600b60208181526040808420600681015483870152600781015460ff161515918601919091529690925290526008909301546060909301929092525090565b6060816000816001600160401b0381111561107157611071614383565b6040519080825280602002602001820160405280156110aa57816020015b611097613a20565b81526020019060019003908161108f5790505b50905060005b828110156110fe576110d98686838181106110cd576110cd614399565b90506020020135610e2a565b8282815181106110eb576110eb614399565b60209081029190910101526001016110b0565b50949350505050565b60008181526002602052604081205460ff16158015610d1f575050151590565b6006818154811061113757600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60606005805480602002602001604051908101604052809291908181526020018280548015610c57576000918252602091829020805460ff168452908202830192909160019101808411610c285790505050505050905090565b60008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611201573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122591906142ef565b6001600160a01b0316336001600160a01b0316146112795760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b6044820152606401610a34565b6001600160401b03831660009081526003602052604090205461129b84612aaf565b8015806112bd57506000818152600b60205260409020546001600160a01b0316155b806112de57506000818152600b602052604090206007015460ff1615156001145b806112f857506000818152600b6020526040902060030154155b8061131f57506000818152600b6020526040902060039081015461131b916143af565b8214155b15611367577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a58482858560405161135994939291906143c6565b60405180910390a150505050565b6000818152600b6020526040812060078101805460ff1916600190811790915501549080611393611f72565b9050600061139f612132565b905060006113ab612732565b6000878152600b60205260408120600301549192505b8160ff1681101561164157600060078160ff88168d8d6113e28760036143af565b8181106113f1576113f1614399565b905060200201356114029190614418565b60ff908116825260208201929092526040016000908120548216925090600890829088168e8e6114338860036143af565b61143e90600161442c565b81811061144d5761144d614399565b9050602002013561145e9190614418565b60ff908116825260208201929092526040016000908120548216925090600990829088168f8f61148f8960036143af565b61149a90600261442c565b8181106114a9576114a9614399565b905060200201356114ba9190614418565b60ff1660ff16815260200190815260200160002060009054906101000a900460ff16905082600b60008d8152602001908152602001600020600301858154811061150657611506614399565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555081600b60008d8152602001908152602001600020600401858154811061155857611558614399565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555080600b60008d815260200190815260200160002060050185815481106115aa576115aa614399565b60009182526020808320818304018054601f9093166101000a60ff8181021990941695841602949094179093558581168252600d8352604080832086831684528452808320918516835292522054156116335760ff8084166000908152600d602090815260408083208685168452825280832093851683529290522054612710908b0204890198505b8360010193505050506113c1565b506000878152600b60205260409020600681018690558054600290910154611674916001600160a01b0316908790612b8b565b6000878152600b6020526040902080546001909101546001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89089906116c89060ff8616906143af565b604080519283526020830191909152810188905260600160405180910390a250505050505050505050565b606081806001600160401b0381111561170e5761170e614383565b604051908082528060200260200182016040528015611737578160200160208202803683370190505b50915060005b818110156117a8576002600086868481811061175b5761175b614399565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061179057611790614399565b9115156020928302919091019091015260010161173d565b505092915050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182091906142ef565b6001600160a01b0316336001600160a01b0316146118505760405162461bcd60e51b8152600401610a349061430c565b6000805460ff19166001179055565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf91906142ef565b6001600160a01b0316336001600160a01b0316146118ff5760405162461bcd60e51b8152600401610a349061430c565b600e5460ff16156119445760405162461bcd60e51b815260206004820152600f60248201526e13d9191cc8185c99481b1bd8dad959608a1b6044820152606401610a34565b868581146119895760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964204c656e67746820302d3160701b6044820152606401610a34565b8084146119cd5760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b2102632b733ba341018169960711b6044820152606401610a34565b808214611a1c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c656e67746820302d7061796f75740000000000000000006044820152606401610a34565b60005b81811015611b0157838382818110611a3957611a39614399565b90506020020135600d60008c8c85818110611a5657611a56614399565b9050602002016020810190611a6b9190613c11565b60ff1660ff16815260200190815260200160002060008a8a85818110611a9357611a93614399565b9050602002016020810190611aa89190613c11565b60ff1660ff1681526020019081526020016000206000888885818110611ad057611ad0614399565b9050602002016020810190611ae59190613c11565b60ff168152602081019190915260400160002055600101611a1f565b50505050505050505050565b60018181548110611b1d57600080fd5b600091825260209091200154905081565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9e91906142ef565b6001600160a01b0316336001600160a01b031614611bce5760405162461bcd60e51b8152600401610a349061430c565b600580546000918291611be390600190614370565b81548110611bf357611bf3614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600860205260409020805460ff19169185169182179055600580546001909301929091908110611c5d57611c5d614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff1603611c90578260010192505b611c13565b6060816000816001600160401b03811115611cb257611cb2614383565b604051908082528060200260200182016040528015611ce557816020015b6060815260200190600190039081611cd05790505b50905060005b828110156110fe57611d088686838181106110cd576110cd614399565b604051602001611d189190613dc5565b604051602081830303815290604052828281518110611d3957611d39614399565b6020908102919091010152600101611ceb565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc91906142ef565b6001600160a01b0316336001600160a01b031614611dec5760405162461bcd60e51b8152600401610a349061430c565b611df7823383613075565b5050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b91906142ef565b6001600160a01b0316336001600160a01b031614611e9b5760405162461bcd60e51b8152600401610a349061430c565b600480546000918291611eb090600190614370565b81548110611ec057611ec0614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600760205260409020805460ff19169185169182179055600480546001909301929091908110611f2a57611f2a614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff1603611f5d578260010192505b611ee0565b6005818154811061113757600080fd5b6004805460009190611f8690600190614370565b81548110611f9657611f96614399565b90600052602060002090602091828204019190069054906101000a900460ff16905090565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b91906142ef565b6001600160a01b0316336001600160a01b03161461205b5760405162461bcd60e51b8152600401610a349061430c565b60068054600091829161207090600190614370565b8154811061208057612080614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600960205260409020805460ff191691851691821790556006805460019093019290919081106120ea576120ea614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff160361211d578260010192505b6120a0565b6004818154811061113757600080fd5b6005805460009190611f8690600190614370565b60608080808085806001600160401b0381111561216557612165614383565b60405190808252806020026020018201604052801561218e578160200160208202803683370190505b509550806001600160401b038111156121a9576121a9614383565b6040519080825280602002602001820160405280156121d2578160200160208202803683370190505b509450806001600160401b038111156121ed576121ed614383565b604051908082528060200260200182016040528015612216578160200160208202803683370190505b509350806001600160401b0381111561223157612231614383565b60405190808252806020026020018201604052801561225a578160200160208202803683370190505b509250806001600160401b0381111561227557612275614383565b60405190808252806020026020018201604052801561229e578160200160208202803683370190505b50915060005b818110156124a957600b60008a8a848181106122c2576122c2614399565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b031687828151811061230057612300614399565b60200260200101906001600160a01b031690816001600160a01b031681525050600b60008a8a8481811061233657612336614399565b90506020020135815260200190815260200160002060030180549050600b60008b8b8581811061236857612368614399565b9050602002013581526020019081526020016000206001015461238b91906143af565b86828151811061239d5761239d614399565b602002602001018181525050600b60008a8a848181106123bf576123bf614399565b905060200201358152602001908152602001600020600601548582815181106123ea576123ea614399565b602002602001018181525050600b60008a8a8481811061240c5761240c614399565b9050602002013581526020019081526020016000206008015484828151811061243757612437614399565b602002602001018181525050600b60008a8a8481811061245957612459614399565b90506020020135815260200190815260200160002060070160009054906101000a900460ff1683828151811061249157612491614399565b911515602092830291909101909101526001016122a4565b50509295509295909350565b826001600160a01b038116331461257f57604051636d6d50a160e11b815233600482015260008051602061451d8339815191529063dadaa14290602401602060405180830381865afa15801561250f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612533919061443f565b61257f5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f7468657273006044820152606401610a34565b60008051602061451d8339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ef919061443f565b1561262f5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b6044820152606401610a34565b60005460ff161561266b5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610a34565b6126768484846131a6565b50505050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ec91906142ef565b6001600160a01b0316336001600160a01b03161461271c5760405162461bcd60e51b8152600401610a349061430c565b600a805460ff191660ff92909216919091179055565b6006805460009190611f8690600190614370565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b691906142ef565b6001600160a01b0316336001600160a01b0316146127e65760405162461bcd60e51b8152600401610a349061430c565b600e805460ff191660011790556040517f4dd505a3f8a65b7f59071d5daac7f7a386abde7d7712486e25d410e6e9e38d2f90600090a1565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561286a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288e91906142ef565b6001600160a01b0316336001600160a01b0316146128be5760405162461bcd60e51b8152600401610a349061430c565b600e5460ff16156129035760405162461bcd60e51b815260206004820152600f60248201526e13d9191cc8105c9948131bd8dad959608a1b6044820152606401610a34565b848314801561291157508281145b6129535760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840a4cacad84098cadccee8d606b1b6044820152606401610a34565b61295f60048787613a77565b5061296c60058585613a77565b5061297960068383613a77565b50505050505050565b600060008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f491906142ef565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb9190614461565b60606006805480602002602001604051908101604052809291908181526020018280548015610c57576000918252602091829020805460ff168452908202830192909160019101808411610c285790505050505050905090565b60008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612afb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1f91906142ef565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b8115612f9e57808210612da35760008051602061451d8339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0891906142ef565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b158015612c7457600080fd5b505af1158015612c88573d6000803e3d6000fd5b505050505060008183612c9b9190614370565b905080156126765760008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1391906142ef565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b158015612d8557600080fd5b505af1158015612d99573d6000803e3d6000fd5b5050505050505050565b60008051602061451d8339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1391906142ef565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b158015612e7f57600080fd5b505af1158015612e93573d6000803e3d6000fd5b505050505060008282612ea69190614370565b905060008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1891906142ef565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401612f6691815260200190565b6000604051808303818588803b158015612f7f57600080fd5b505af1158015612f93573d6000803e3d6000fd5b505050505050505050565b60008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300e91906142ef565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040161305c91815260200190565b6000604051808303818588803b158015612d8557600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916130d1919061447a565b6000604051808303816000865af19150503d806000811461310e576040519150601f19603f3d011682016040523d82523d6000602084013e613113565b606091505b509150915081801561313d57508051158061313d57508080602001905181019061313d919061443f565b61319f5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610a34565b5050505050565b60006131b0612982565b905060008080806131c386880188614496565b93509350935093508434101561320d5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b6044820152606401610a34565b61321684611107565b151560011461325e5760405162461bcd60e51b81526020600482015260146024820152731154948e88125395905312510811d0535148125160621b6044820152606401610a34565b60008360ff1611801561327a5750600a5460ff90811690841611155b6132bb5760405162461bcd60e51b81526020600482015260126024820152714552523a20494e56414c4944205350494e5360701b6044820152606401610a34565b60006132c78634614370565b905060006132d860ff86168361435c565b90506000612710600c54846132ed91906143af565b6132f7919061435c565b905061330481868d613528565b6000878152600b6020526040902080546001600160a01b0319166001600160a01b038d1617815560010182905561333b8184614370565b6000888152600b602052604090206002015560ff86166001600160401b0381111561336857613368614383565b604051908082528060200260200182016040528015613391578160200160208202803683370190505b50600b600089815260200190815260200160002060030190805190602001906133bb929190613b20565b508560ff166001600160401b038111156133d7576133d7614383565b604051908082528060200260200182016040528015613400578160200160208202803683370190505b50600b6000898152602001908152602001600020600401908051906020019061342a929190613b20565b508560ff166001600160401b0381111561344657613446614383565b60405190808252806020026020018201604052801561346f578160200160208202803683370190505b50600b60008981526020019081526020016000206005019080519060200190613499929190613b20565b506000878152600b60205260409020426008909101556134b98b886135d2565b6134c38b846136c6565b8a6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c7886040516134fe91815260200190565b60405180910390a261351b876135158860036144dc565b866137c4565b5050505050505050505050565b60008051602061451d8339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa158015613574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061359891906142ef565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e590859060440161305c565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690639a4918c190606401600060405180830381600087803b15801561366257600080fd5b505af1158015613676573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b60008051602061451d8339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015613712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373691906142ef565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000006044830152919091169063eb3d9bea90606401600060405180830381600087803b1580156137a857600080fd5b505af11580156137bc573d6000803e3d6000fd5b505050505050565b600060008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015613812573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383691906142ef565b6001600160a01b03166397cca7af61384c612982565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015613891573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906138b691906144ff565b6001600160401b038116600090815260036020526040902054909150156139125760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b6044820152606401610a34565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b03198152915160008051602061451d8339815191529263ff9b3acf9260048083019391928290030181865afa158015613979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399d91906142ef565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156139d757600080fd5b505af11580156139eb573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d458460405161135991815260200190565b60405180610120016040528060006001600160a01b03168152602001600081526020016000815260200160608152602001606081526020016060815260200160008152602001600015158152602001600081525090565b82805482825590600052602060002090601f01602090048101928215613b105791602002820160005b83821115613ae157833560ff1683826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613aa0565b8015613b0e5782816101000a81549060ff0219169055600101602081600001049283019260010302613ae1565b505b50613b1c929150613b87565b5090565b82805482825590600052602060002090601f01602090048101928215613b105791602002820160005b83821115613ae157835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613b49565b5b80821115613b1c5760008155600101613b88565b600060208284031215613bae57600080fd5b5035919050565b602080825282518282018190526000918401906040840190835b81811015613bf057835160ff16835260209384019390920191600101613bcf565b509095945050505050565b803560ff81168114613c0c57600080fd5b919050565b600060208284031215613c2357600080fd5b613c2c82613bfb565b9392505050565b60008060408385031215613c4657600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b82811015613c87578151865260209586019590910190600101613c69565b5093949350505050565b602081526000613c2c6020830184613c55565b6001600160a01b0381168114613cb957600080fd5b50565b60008060408385031215613ccf57600080fd5b8235613cda81613ca4565b946020939093013593505050565b600081518084526020840193506020830160005b82811015613c8757815160ff16865260209586019590910190600101613cfc565b80516001600160a01b031682526020810151602083015260408101516040830152600060608201516101206060850152613d5b610120850182613ce8565b905060808301518482036080860152613d748282613ce8565b91505060a083015184820360a0860152613d8e8282613ce8565b91505060c083015160c085015260e0830151613dae60e086018215159052565b506101008301516101008501528091505092915050565b602081526000613c2c6020830184613d1d565b60008083601f840112613dea57600080fd5b5081356001600160401b03811115613e0157600080fd5b6020830191508360208260051b8501011115613e1c57600080fd5b9250929050565b60008060208385031215613e3657600080fd5b82356001600160401b03811115613e4c57600080fd5b613e5885828601613dd8565b90969095509350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015613ebd57603f19878603018452613ea8858351613d1d565b94506020938401939190910190600101613e8c565b50929695505050505050565b6001600160401b0381168114613cb957600080fd5b600080600060408486031215613ef357600080fd5b8335613efe81613ec9565b925060208401356001600160401b03811115613f1957600080fd5b613f2586828701613dd8565b9497909650939450505050565b600081518084526020840193506020830160005b82811015613c875781511515865260209586019590910190600101613f46565b602081526000613c2c6020830184613f32565b6000806000806000806000806080898b031215613f9557600080fd5b88356001600160401b03811115613fab57600080fd5b613fb78b828c01613dd8565b90995097505060208901356001600160401b03811115613fd657600080fd5b613fe28b828c01613dd8565b90975095505060408901356001600160401b0381111561400157600080fd5b61400d8b828c01613dd8565b90955093505060608901356001600160401b0381111561402c57600080fd5b6140388b828c01613dd8565b999c989b5096995094979396929594505050565b60005b8381101561406757818101518382015260200161404f565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015613ebd57603f19878603018452815180518087526140c181602089016020850161404c565b601f01601f19169590950160209081019550938401939190910190600101614098565b6000806000606084860312156140f957600080fd5b61410284613bfb565b925061411060208501613bfb565b915061411e60408501613bfb565b90509250925092565b60a08082528651908201819052600090602088019060c0840190835b8181101561416a5783516001600160a01b0316835260209384019390920191600101614143565b5050838103602085015261417e8189613c55565b91505082810360408401526141938187613c55565b905082810360608401526141a78186613c55565b905082810360808401526141bb8185613f32565b98975050505050505050565b6000806000604084860312156141dc57600080fd5b83356141e781613ca4565b925060208401356001600160401b0381111561420257600080fd5b8401601f8101861361421357600080fd5b80356001600160401b0381111561422957600080fd5b86602082840101111561423b57600080fd5b939660209190910195509293505050565b6000806000806000806060878903121561426557600080fd5b86356001600160401b0381111561427b57600080fd5b61428789828a01613dd8565b90975095505060208701356001600160401b038111156142a657600080fd5b6142b289828a01613dd8565b90955093505060408701356001600160401b038111156142d157600080fd5b6142dd89828a01613dd8565b979a9699509497509295939492505050565b60006020828403121561430157600080fd5b8151613c2c81613ca4565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008261436b5761436b614330565b500490565b81810381811115610d1f57610d1f614346565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610d1f57610d1f614346565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156143fd57600080fd5b8260051b808560808501379190910160800195945050505050565b60008261442757614427614330565b500690565b80820180821115610d1f57610d1f614346565b60006020828403121561445157600080fd5b81518015158114613c2c57600080fd5b60006020828403121561447357600080fd5b5051919050565b6000825161448c81846020870161404c565b9190910192915050565b600080600080608085870312156144ac57600080fd5b843593506144bc60208601613bfb565b925060408501356144cc81613ca4565b9396929550929360600135925050565b60ff81811683821602908116908181146144f8576144f8614346565b5092915050565b60006020828403121561451157600080fd5b8151613c2c81613ec956fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212205e8743371fed897511ecad57fea6c30eee379dd9761ab3cc9470c0844901035364736f6c634300081c003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000003b0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000f9

Deployed Bytecode

0x6080604052600436106102975760003560e01c806389fc2c0f1161015a578063c271ac1a116100c1578063d7b7ca4a1161007a578063d7b7ca4a146108ec578063d951ec5b14610901578063e4b26ae714610916578063f0034a7e14610936578063fc628ac41461094b578063fdcdb06b1461096057600080fd5b8063c271ac1a146107f9578063c4fd5d6d14610843578063c811ad7114610874578063cc81d05514610887578063d01585d41461089c578063d02e3555146108bc57600080fd5b80639fe870dd116101135780639fe870dd14610765578063a16c47371461077a578063aa44cf171461079a578063aa5a60e5146107af578063b79f2925146107c4578063bd92621b146107e457600080fd5b806389fc2c0f146106715780638a31ae561461069157806391ea41e6146106a657806398daac83146106d35780639e281a98146107075780639f90bd651461072757600080fd5b8063481c6a75116101fe5780636c236d58116101b75780636c236d58146105c0578063749fa03c146105d55780637b8d3879146105f55780638456cb5914610622578063864638a51461063757806387cf2a231461065157600080fd5b8063481c6a751461050157806348e8294a1461052357806351e925591461055057806352233e91146105705780635c975abb14610586578063614be8d4146105a057600080fd5b80632fbb0116116102505780632fbb0116146103f357806330ea95f31461041557806332883e7e1461045757806338b6d2e5146104845780634782f779146104b457806347e1d550146104d457600080fd5b8063046f7da2146102a35780630476f004146102ba57806304e2064f146102e9578063117a5b901461031657806312e8e2c3146103af57806326232a2e146103cf57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610994565b005b3480156102c657600080fd5b50600e546102d49060ff1681565b60405190151581526020015b60405180910390f35b3480156102f557600080fd5b506102fe610a49565b6040516001600160a01b0390911681526020016102e0565b34801561032257600080fd5b50610376610331366004613b9c565b600b602052600090815260409020805460018201546002830154600684015460078501546008909501546001600160a01b039094169492939192909160ff9091169086565b604080516001600160a01b03909716875260208701959095529385019290925260608401521515608083015260a082015260c0016102e0565b3480156103bb57600080fd5b506102b86103ca366004613b9c565b610ac0565b3480156103db57600080fd5b506103e5600c5481565b6040519081526020016102e0565b3480156103ff57600080fd5b50610408610beb565b6040516102e09190613bb5565b34801561042157600080fd5b50610445610430366004613c11565b60086020526000908152604090205460ff1681565b60405160ff90911681526020016102e0565b34801561046357600080fd5b50610477610472366004613c33565b610c61565b6040516102e09190613c91565b34801561049057600080fd5b5061044561049f366004613c11565b60096020526000908152604090205460ff1681565b3480156104c057600080fd5b506102b86104cf366004613cbc565b610d25565b3480156104e057600080fd5b506104f46104ef366004613b9c565b610e2a565b6040516102e09190613dc5565b34801561050d57600080fd5b506102fe60008051602061451d83398151915281565b34801561052f57600080fd5b5061054361053e366004613e23565b611054565b6040516102e09190613e64565b34801561055c57600080fd5b506102d461056b366004613b9c565b611107565b34801561057c57600080fd5b506103e561271081565b34801561059257600080fd5b506000546102d49060ff1681565b3480156105ac57600080fd5b506104456105bb366004613b9c565b611127565b3480156105cc57600080fd5b5061040861115b565b3480156105e157600080fd5b506102b86105f0366004613ede565b6111b5565b34801561060157600080fd5b50610615610610366004613e23565b6116f3565b6040516102e09190613f66565b34801561062e57600080fd5b506102b86117b0565b34801561064357600080fd5b50600a546104459060ff1681565b34801561065d57600080fd5b506102b861066c366004613f79565b61185f565b34801561067d57600080fd5b506103e561068c366004613b9c565b611b0d565b34801561069d57600080fd5b506102b8611b2e565b3480156106b257600080fd5b506106c66106c1366004613e23565b611c95565b6040516102e09190614070565b3480156106df57600080fd5b506102fe7f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa81565b34801561071357600080fd5b506102b8610722366004613cbc565b611d4c565b34801561073357600080fd5b506103e56107423660046140e4565b600d60209081526000938452604080852082529284528284209052825290205481565b34801561077157600080fd5b506102b8611dfb565b34801561078657600080fd5b50610445610795366004613b9c565b611f62565b3480156107a657600080fd5b50610445611f72565b3480156107bb57600080fd5b506102b8611fbb565b3480156107d057600080fd5b506104456107df366004613b9c565b612122565b3480156107f057600080fd5b50610445612132565b34801561080557600080fd5b506103e56108143660046140e4565b60ff9283166000908152600d602090815260408083209486168352938152838220929094168152925290205490565b34801561084f57600080fd5b5061086361085e366004613e23565b612146565b6040516102e0959493929190614127565b6102b86108823660046141c7565b6124b5565b34801561089357600080fd5b506001546103e5565b3480156108a857600080fd5b506102b86108b7366004613c11565b61267c565b3480156108c857600080fd5b506104456108d7366004613c11565b60076020526000908152604090205460ff1681565b3480156108f857600080fd5b50610445612732565b34801561090d57600080fd5b506102b8612746565b34801561092257600080fd5b506102b861093136600461424c565b61281e565b34801561094257600080fd5b506103e5612982565b34801561095757600080fd5b50610408612a55565b34801561096c57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000381565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0491906142ef565b6001600160a01b0316336001600160a01b031614610a3d5760405162461bcd60e51b8152600401610a349061430c565b60405180910390fd5b6000805460ff19169055565b600060008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb91906142ef565b905090565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3091906142ef565b6001600160a01b0316336001600160a01b031614610b605760405162461bcd60e51b8152600401610a349061430c565b610b6d600561271061435c565b811115610bb05760405162461bcd60e51b815260206004820152601160248201527043616e6e6f74204578636565642032302560781b6044820152606401610a34565b600c8190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b60606004805480602002602001604051908101604052809291908181526020018280548015610c5757602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610c285790505b5050505050905090565b600154606090821115610c745760015491505b6000610c808484614370565b6001600160401b03811115610c9757610c97614383565b604051908082528060200260200182016040528015610cc0578160200160208202803683370190505b509050835b83811015610d1b5760018181548110610ce057610ce0614399565b9060005260206000200154828683610cf89190614370565b81518110610d0857610d08614399565b6020908102919091010152600101610cc5565b5090505b92915050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9591906142ef565b6001600160a01b0316336001600160a01b031614610dc55760405162461bcd60e51b8152600401610a349061430c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e12576040519150601f19603f3d011682016040523d82523d6000602084013e610e17565b606091505b5050905080610e2557600080fd5b505050565b610e32613a20565b60408051610120810182526000848152600b602081815284832080546001600160a01b03168552600181015482860181905293889052919052600301549192830191610e7d916143af565b81526000848152600b60209081526040918290206003018054835181840281018401909452808452938201939091830182828015610ef857602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610ec95790505b50505050508152602001600b6000858152602001908152602001600020600401805480602002602001604051908101604052809291908181526020018280548015610f8057602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610f515790505b50505050508152602001600b600085815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561100857602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610fd95790505b50505091835250506000848152600b60208181526040808420600681015483870152600781015460ff161515918601919091529690925290526008909301546060909301929092525090565b6060816000816001600160401b0381111561107157611071614383565b6040519080825280602002602001820160405280156110aa57816020015b611097613a20565b81526020019060019003908161108f5790505b50905060005b828110156110fe576110d98686838181106110cd576110cd614399565b90506020020135610e2a565b8282815181106110eb576110eb614399565b60209081029190910101526001016110b0565b50949350505050565b60008181526002602052604081205460ff16158015610d1f575050151590565b6006818154811061113757600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60606005805480602002602001604051908101604052809291908181526020018280548015610c57576000918252602091829020805460ff168452908202830192909160019101808411610c285790505050505050905090565b60008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611201573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122591906142ef565b6001600160a01b0316336001600160a01b0316146112795760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b6044820152606401610a34565b6001600160401b03831660009081526003602052604090205461129b84612aaf565b8015806112bd57506000818152600b60205260409020546001600160a01b0316155b806112de57506000818152600b602052604090206007015460ff1615156001145b806112f857506000818152600b6020526040902060030154155b8061131f57506000818152600b6020526040902060039081015461131b916143af565b8214155b15611367577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a58482858560405161135994939291906143c6565b60405180910390a150505050565b6000818152600b6020526040812060078101805460ff1916600190811790915501549080611393611f72565b9050600061139f612132565b905060006113ab612732565b6000878152600b60205260408120600301549192505b8160ff1681101561164157600060078160ff88168d8d6113e28760036143af565b8181106113f1576113f1614399565b905060200201356114029190614418565b60ff908116825260208201929092526040016000908120548216925090600890829088168e8e6114338860036143af565b61143e90600161442c565b81811061144d5761144d614399565b9050602002013561145e9190614418565b60ff908116825260208201929092526040016000908120548216925090600990829088168f8f61148f8960036143af565b61149a90600261442c565b8181106114a9576114a9614399565b905060200201356114ba9190614418565b60ff1660ff16815260200190815260200160002060009054906101000a900460ff16905082600b60008d8152602001908152602001600020600301858154811061150657611506614399565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555081600b60008d8152602001908152602001600020600401858154811061155857611558614399565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555080600b60008d815260200190815260200160002060050185815481106115aa576115aa614399565b60009182526020808320818304018054601f9093166101000a60ff8181021990941695841602949094179093558581168252600d8352604080832086831684528452808320918516835292522054156116335760ff8084166000908152600d602090815260408083208685168452825280832093851683529290522054612710908b0204890198505b8360010193505050506113c1565b506000878152600b60205260409020600681018690558054600290910154611674916001600160a01b0316908790612b8b565b6000878152600b6020526040902080546001909101546001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89089906116c89060ff8616906143af565b604080519283526020830191909152810188905260600160405180910390a250505050505050505050565b606081806001600160401b0381111561170e5761170e614383565b604051908082528060200260200182016040528015611737578160200160208202803683370190505b50915060005b818110156117a8576002600086868481811061175b5761175b614399565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061179057611790614399565b9115156020928302919091019091015260010161173d565b505092915050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182091906142ef565b6001600160a01b0316336001600160a01b0316146118505760405162461bcd60e51b8152600401610a349061430c565b6000805460ff19166001179055565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf91906142ef565b6001600160a01b0316336001600160a01b0316146118ff5760405162461bcd60e51b8152600401610a349061430c565b600e5460ff16156119445760405162461bcd60e51b815260206004820152600f60248201526e13d9191cc8185c99481b1bd8dad959608a1b6044820152606401610a34565b868581146119895760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964204c656e67746820302d3160701b6044820152606401610a34565b8084146119cd5760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b2102632b733ba341018169960711b6044820152606401610a34565b808214611a1c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c656e67746820302d7061796f75740000000000000000006044820152606401610a34565b60005b81811015611b0157838382818110611a3957611a39614399565b90506020020135600d60008c8c85818110611a5657611a56614399565b9050602002016020810190611a6b9190613c11565b60ff1660ff16815260200190815260200160002060008a8a85818110611a9357611a93614399565b9050602002016020810190611aa89190613c11565b60ff1660ff1681526020019081526020016000206000888885818110611ad057611ad0614399565b9050602002016020810190611ae59190613c11565b60ff168152602081019190915260400160002055600101611a1f565b50505050505050505050565b60018181548110611b1d57600080fd5b600091825260209091200154905081565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9e91906142ef565b6001600160a01b0316336001600160a01b031614611bce5760405162461bcd60e51b8152600401610a349061430c565b600580546000918291611be390600190614370565b81548110611bf357611bf3614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600860205260409020805460ff19169185169182179055600580546001909301929091908110611c5d57611c5d614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff1603611c90578260010192505b611c13565b6060816000816001600160401b03811115611cb257611cb2614383565b604051908082528060200260200182016040528015611ce557816020015b6060815260200190600190039081611cd05790505b50905060005b828110156110fe57611d088686838181106110cd576110cd614399565b604051602001611d189190613dc5565b604051602081830303815290604052828281518110611d3957611d39614399565b6020908102919091010152600101611ceb565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc91906142ef565b6001600160a01b0316336001600160a01b031614611dec5760405162461bcd60e51b8152600401610a349061430c565b611df7823383613075565b5050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b91906142ef565b6001600160a01b0316336001600160a01b031614611e9b5760405162461bcd60e51b8152600401610a349061430c565b600480546000918291611eb090600190614370565b81548110611ec057611ec0614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600760205260409020805460ff19169185169182179055600480546001909301929091908110611f2a57611f2a614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff1603611f5d578260010192505b611ee0565b6005818154811061113757600080fd5b6004805460009190611f8690600190614370565b81548110611f9657611f96614399565b90600052602060002090602091828204019190069054906101000a900460ff16905090565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b91906142ef565b6001600160a01b0316336001600160a01b03161461205b5760405162461bcd60e51b8152600401610a349061430c565b60068054600091829161207090600190614370565b8154811061208057612080614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600960205260409020805460ff191691851691821790556006805460019093019290919081106120ea576120ea614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff160361211d578260010192505b6120a0565b6004818154811061113757600080fd5b6005805460009190611f8690600190614370565b60608080808085806001600160401b0381111561216557612165614383565b60405190808252806020026020018201604052801561218e578160200160208202803683370190505b509550806001600160401b038111156121a9576121a9614383565b6040519080825280602002602001820160405280156121d2578160200160208202803683370190505b509450806001600160401b038111156121ed576121ed614383565b604051908082528060200260200182016040528015612216578160200160208202803683370190505b509350806001600160401b0381111561223157612231614383565b60405190808252806020026020018201604052801561225a578160200160208202803683370190505b509250806001600160401b0381111561227557612275614383565b60405190808252806020026020018201604052801561229e578160200160208202803683370190505b50915060005b818110156124a957600b60008a8a848181106122c2576122c2614399565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b031687828151811061230057612300614399565b60200260200101906001600160a01b031690816001600160a01b031681525050600b60008a8a8481811061233657612336614399565b90506020020135815260200190815260200160002060030180549050600b60008b8b8581811061236857612368614399565b9050602002013581526020019081526020016000206001015461238b91906143af565b86828151811061239d5761239d614399565b602002602001018181525050600b60008a8a848181106123bf576123bf614399565b905060200201358152602001908152602001600020600601548582815181106123ea576123ea614399565b602002602001018181525050600b60008a8a8481811061240c5761240c614399565b9050602002013581526020019081526020016000206008015484828151811061243757612437614399565b602002602001018181525050600b60008a8a8481811061245957612459614399565b90506020020135815260200190815260200160002060070160009054906101000a900460ff1683828151811061249157612491614399565b911515602092830291909101909101526001016122a4565b50509295509295909350565b826001600160a01b038116331461257f57604051636d6d50a160e11b815233600482015260008051602061451d8339815191529063dadaa14290602401602060405180830381865afa15801561250f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612533919061443f565b61257f5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f7468657273006044820152606401610a34565b60008051602061451d8339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ef919061443f565b1561262f5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b6044820152606401610a34565b60005460ff161561266b5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610a34565b6126768484846131a6565b50505050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ec91906142ef565b6001600160a01b0316336001600160a01b03161461271c5760405162461bcd60e51b8152600401610a349061430c565b600a805460ff191660ff92909216919091179055565b6006805460009190611f8690600190614370565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b691906142ef565b6001600160a01b0316336001600160a01b0316146127e65760405162461bcd60e51b8152600401610a349061430c565b600e805460ff191660011790556040517f4dd505a3f8a65b7f59071d5daac7f7a386abde7d7712486e25d410e6e9e38d2f90600090a1565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561286a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288e91906142ef565b6001600160a01b0316336001600160a01b0316146128be5760405162461bcd60e51b8152600401610a349061430c565b600e5460ff16156129035760405162461bcd60e51b815260206004820152600f60248201526e13d9191cc8105c9948131bd8dad959608a1b6044820152606401610a34565b848314801561291157508281145b6129535760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840a4cacad84098cadccee8d606b1b6044820152606401610a34565b61295f60048787613a77565b5061296c60058585613a77565b5061297960068383613a77565b50505050505050565b600060008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f491906142ef565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb9190614461565b60606006805480602002602001604051908101604052809291908181526020018280548015610c57576000918252602091829020805460ff168452908202830192909160019101808411610c285790505050505050905090565b60008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612afb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1f91906142ef565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b8115612f9e57808210612da35760008051602061451d8339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0891906142ef565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000360048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b158015612c7457600080fd5b505af1158015612c88573d6000803e3d6000fd5b505050505060008183612c9b9190614370565b905080156126765760008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1391906142ef565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000360048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b158015612d8557600080fd5b505af1158015612d99573d6000803e3d6000fd5b5050505050505050565b60008051602061451d8339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1391906142ef565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000360048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b158015612e7f57600080fd5b505af1158015612e93573d6000803e3d6000fd5b505050505060008282612ea69190614370565b905060008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1891906142ef565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000036040518363ffffffff1660e01b8152600401612f6691815260200190565b6000604051808303818588803b158015612f7f57600080fd5b505af1158015612f93573d6000803e3d6000fd5b505050505050505050565b60008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300e91906142ef565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000036040518363ffffffff1660e01b815260040161305c91815260200190565b6000604051808303818588803b158015612d8557600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916130d1919061447a565b6000604051808303816000865af19150503d806000811461310e576040519150601f19603f3d011682016040523d82523d6000602084013e613113565b606091505b509150915081801561313d57508051158061313d57508080602001905181019061313d919061443f565b61319f5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610a34565b5050505050565b60006131b0612982565b905060008080806131c386880188614496565b93509350935093508434101561320d5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b6044820152606401610a34565b61321684611107565b151560011461325e5760405162461bcd60e51b81526020600482015260146024820152731154948e88125395905312510811d0535148125160621b6044820152606401610a34565b60008360ff1611801561327a5750600a5460ff90811690841611155b6132bb5760405162461bcd60e51b81526020600482015260126024820152714552523a20494e56414c4944205350494e5360701b6044820152606401610a34565b60006132c78634614370565b905060006132d860ff86168361435c565b90506000612710600c54846132ed91906143af565b6132f7919061435c565b905061330481868d613528565b6000878152600b6020526040902080546001600160a01b0319166001600160a01b038d1617815560010182905561333b8184614370565b6000888152600b602052604090206002015560ff86166001600160401b0381111561336857613368614383565b604051908082528060200260200182016040528015613391578160200160208202803683370190505b50600b600089815260200190815260200160002060030190805190602001906133bb929190613b20565b508560ff166001600160401b038111156133d7576133d7614383565b604051908082528060200260200182016040528015613400578160200160208202803683370190505b50600b6000898152602001908152602001600020600401908051906020019061342a929190613b20565b508560ff166001600160401b0381111561344657613446614383565b60405190808252806020026020018201604052801561346f578160200160208202803683370190505b50600b60008981526020019081526020016000206005019080519060200190613499929190613b20565b506000878152600b60205260409020426008909101556134b98b886135d2565b6134c38b846136c6565b8a6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c7886040516134fe91815260200190565b60405180910390a261351b876135158860036144dc565b866137c4565b5050505050505050505050565b60008051602061451d8339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa158015613574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061359891906142ef565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e590859060440161305c565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000036024830152604482018390527f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa1690639a4918c190606401600060405180830381600087803b15801561366257600080fd5b505af1158015613676573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b60008051602061451d8339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015613712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373691906142ef565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000036044830152919091169063eb3d9bea90606401600060405180830381600087803b1580156137a857600080fd5b505af11580156137bc573d6000803e3d6000fd5b505050505050565b600060008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015613812573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383691906142ef565b6001600160a01b03166397cca7af61384c612982565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015613891573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906138b691906144ff565b6001600160401b038116600090815260036020526040902054909150156139125760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b6044820152606401610a34565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b03198152915160008051602061451d8339815191529263ff9b3acf9260048083019391928290030181865afa158015613979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399d91906142ef565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156139d757600080fd5b505af11580156139eb573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d458460405161135991815260200190565b60405180610120016040528060006001600160a01b03168152602001600081526020016000815260200160608152602001606081526020016060815260200160008152602001600015158152602001600081525090565b82805482825590600052602060002090601f01602090048101928215613b105791602002820160005b83821115613ae157833560ff1683826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613aa0565b8015613b0e5782816101000a81549060ff0219169055600101602081600001049283019260010302613ae1565b505b50613b1c929150613b87565b5090565b82805482825590600052602060002090601f01602090048101928215613b105791602002820160005b83821115613ae157835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613b49565b5b80821115613b1c5760008155600101613b88565b600060208284031215613bae57600080fd5b5035919050565b602080825282518282018190526000918401906040840190835b81811015613bf057835160ff16835260209384019390920191600101613bcf565b509095945050505050565b803560ff81168114613c0c57600080fd5b919050565b600060208284031215613c2357600080fd5b613c2c82613bfb565b9392505050565b60008060408385031215613c4657600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b82811015613c87578151865260209586019590910190600101613c69565b5093949350505050565b602081526000613c2c6020830184613c55565b6001600160a01b0381168114613cb957600080fd5b50565b60008060408385031215613ccf57600080fd5b8235613cda81613ca4565b946020939093013593505050565b600081518084526020840193506020830160005b82811015613c8757815160ff16865260209586019590910190600101613cfc565b80516001600160a01b031682526020810151602083015260408101516040830152600060608201516101206060850152613d5b610120850182613ce8565b905060808301518482036080860152613d748282613ce8565b91505060a083015184820360a0860152613d8e8282613ce8565b91505060c083015160c085015260e0830151613dae60e086018215159052565b506101008301516101008501528091505092915050565b602081526000613c2c6020830184613d1d565b60008083601f840112613dea57600080fd5b5081356001600160401b03811115613e0157600080fd5b6020830191508360208260051b8501011115613e1c57600080fd5b9250929050565b60008060208385031215613e3657600080fd5b82356001600160401b03811115613e4c57600080fd5b613e5885828601613dd8565b90969095509350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015613ebd57603f19878603018452613ea8858351613d1d565b94506020938401939190910190600101613e8c565b50929695505050505050565b6001600160401b0381168114613cb957600080fd5b600080600060408486031215613ef357600080fd5b8335613efe81613ec9565b925060208401356001600160401b03811115613f1957600080fd5b613f2586828701613dd8565b9497909650939450505050565b600081518084526020840193506020830160005b82811015613c875781511515865260209586019590910190600101613f46565b602081526000613c2c6020830184613f32565b6000806000806000806000806080898b031215613f9557600080fd5b88356001600160401b03811115613fab57600080fd5b613fb78b828c01613dd8565b90995097505060208901356001600160401b03811115613fd657600080fd5b613fe28b828c01613dd8565b90975095505060408901356001600160401b0381111561400157600080fd5b61400d8b828c01613dd8565b90955093505060608901356001600160401b0381111561402c57600080fd5b6140388b828c01613dd8565b999c989b5096995094979396929594505050565b60005b8381101561406757818101518382015260200161404f565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015613ebd57603f19878603018452815180518087526140c181602089016020850161404c565b601f01601f19169590950160209081019550938401939190910190600101614098565b6000806000606084860312156140f957600080fd5b61410284613bfb565b925061411060208501613bfb565b915061411e60408501613bfb565b90509250925092565b60a08082528651908201819052600090602088019060c0840190835b8181101561416a5783516001600160a01b0316835260209384019390920191600101614143565b5050838103602085015261417e8189613c55565b91505082810360408401526141938187613c55565b905082810360608401526141a78186613c55565b905082810360808401526141bb8185613f32565b98975050505050505050565b6000806000604084860312156141dc57600080fd5b83356141e781613ca4565b925060208401356001600160401b0381111561420257600080fd5b8401601f8101861361421357600080fd5b80356001600160401b0381111561422957600080fd5b86602082840101111561423b57600080fd5b939660209190910195509293505050565b6000806000806000806060878903121561426557600080fd5b86356001600160401b0381111561427b57600080fd5b61428789828a01613dd8565b90975095505060208701356001600160401b038111156142a657600080fd5b6142b289828a01613dd8565b90955093505060408701356001600160401b038111156142d157600080fd5b6142dd89828a01613dd8565b979a9699509497509295939492505050565b60006020828403121561430157600080fd5b8151613c2c81613ca4565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008261436b5761436b614330565b500490565b81810381811115610d1f57610d1f614346565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610d1f57610d1f614346565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156143fd57600080fd5b8260051b808560808501379190910160800195945050505050565b60008261442757614427614330565b500690565b80820180821115610d1f57610d1f614346565b60006020828403121561445157600080fd5b81518015158114613c2c57600080fd5b60006020828403121561447357600080fd5b5051919050565b6000825161448c81846020870161404c565b9190910192915050565b600080600080608085870312156144ac57600080fd5b843593506144bc60208601613bfb565b925060408501356144cc81613ca4565b9396929550929360600135925050565b60ff81811683821602908116908181146144f8576144f8614346565b5092915050565b60006020828403121561451157600080fd5b8151613c2c81613ec956fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212205e8743371fed897511ecad57fea6c30eee379dd9761ab3cc9470c0844901035364736f6c634300081c0033

Deployed Bytecode Sourcemap

15895:13751:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9593:70;;;;;;;;;;;;;:::i;:::-;;17629:22;;;;;;;;;;-1:-1:-1;17629:22:0;;;;;;;;;;;275:14:1;;268:22;250:41;;238:2;223:18;17629:22:0;;;;;;;;14370:91;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;575:32:1;;;557:51;;545:2;530:18;14370:91:0;411:203:1;17167:40:0;;;;;;;;;;-1:-1:-1;17167:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17167:40:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1149:32:1;;;1131:51;;1213:2;1198:18;;1191:34;;;;1241:18;;;1234:34;;;;1299:2;1284:18;;1277:34;1355:14;1348:22;1342:3;1327:19;;1320:51;1169:3;1387:19;;1380:35;1118:3;1103:19;17167:40:0;850:571:1;19079:260:0;;;;;;;;;;-1:-1:-1;19079:260:0;;;;;:::i;:::-;;:::i;17261:32::-;;;;;;;;;;;;;;;;;;;1572:25:1;;;1560:2;1545:18;17261:32:0;1426:177:1;26512:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16130:48::-;;;;;;;;;;-1:-1:-1;16130:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2751:4:1;2739:17;;;2721:36;;2709:2;2694:18;16130:48:0;2579:184:1;14935:409:0;;;;;;;;;;-1:-1:-1;14935:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16185:48::-;;;;;;;;;;-1:-1:-1;16185:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9671:155;;;;;;;;;;-1:-1:-1;9671:155:0;;;;;:::i;:::-;;:::i;27303:600::-;;;;;;;;;;-1:-1:-1;27303:600:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1899:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1899:107:0;;27911:413;;;;;;;;;;-1:-1:-1;27911:413:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14469:135::-;;;;;;;;;;-1:-1:-1;14469:135:0;;;;;:::i;:::-;;:::i;17470:45::-;;;;;;;;;;;;17509:6;17470:45;;8742:26;;;;;;;;;;-1:-1:-1;8742:26:0;;;;;;;;16014:20;;;;;;;;;;-1:-1:-1;16014:20:0;;;;;:::i;:::-;;:::i;26614:94::-;;;;;;;;;;;;;:::i;23944:2560::-;;;;;;;;;;-1:-1:-1;23944:2560:0;;;;;:::i;:::-;;:::i;14612:315::-;;;;;;;;;;-1:-1:-1;14612:315:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9517:68::-;;;;;;;;;;;;;:::i;16260:27::-;;;;;;;;;;-1:-1:-1;16260:27:0;;;;;;;;21066:835;;;;;;;;;;-1:-1:-1;21066:835:0;;;;;:::i;:::-;;:::i;8815:28::-;;;;;;;;;;-1:-1:-1;8815:28:0;;;;;:::i;:::-;;:::i;20320:365::-;;;;;;;;;;;;;:::i;28332:370::-;;;;;;;;;;-1:-1:-1;28332:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8647:40::-;;;;;;;;;;;;;;;9834:143;;;;;;;;;;-1:-1:-1;9834:143:0;;;;;:::i;:::-;;:::i;17352:84::-;;;;;;;;;;-1:-1:-1;17352:84:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19947:365;;;;;;;;;;;;;:::i;15987:20::-;;;;;;;;;;-1:-1:-1;15987:20:0;;;;;:::i;:::-;;:::i;26818:104::-;;;;;;;;;;;;;:::i;20693:365::-;;;;;;;;;;;;;:::i;15960:20::-;;;;;;;;;;-1:-1:-1;15960:20:0;;;;;:::i;:::-;;:::i;26930:104::-;;;;;;;;;;;;;:::i;27154:141::-;;;;;;;;;;-1:-1:-1;27154:141:0;;;;;:::i;:::-;27260:13;;;;27233:7;27260:13;;;:6;:13;;;;;;;;:20;;;;;;;;;;;:27;;;;;;;;;;;;27154:141;28710:933;;;;;;;;;;-1:-1:-1;28710:933:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;10549:260::-;;;;;;:::i;:::-;;:::i;15352:102::-;;;;;;;;;;-1:-1:-1;15428:11:0;:18;15352:102;;18974:97;;;;;;;;;;-1:-1:-1;18974:97:0;;;;;:::i;:::-;;:::i;16075:48::-;;;;;;;;;;-1:-1:-1;16075:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27042:104;;;;;;;;;;;;;:::i;19347:103::-;;;;;;;;;;;;;:::i;19458:481::-;;;;;;;;;;-1:-1:-1;19458:481:0;;;;;:::i;:::-;;:::i;10331:105::-;;;;;;;;;;;;;:::i;26716:94::-;;;;;;;;;;;;;:::i;8582:32::-;;;;;;;;;;;;;;;9593:70;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;;;;;;;;;9650:5:::1;9641:14:::0;;-1:-1:-1;;9641:14:0::1;::::0;;9593:70::o;14370:91::-;14411:7;-1:-1:-1;;;;;;;;;;;;;;;;14438:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14431:22;;14370:91;:::o;19079:260::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;19191:16:::1;19206:1;17509:6;19191:16;:::i;:::-;19176:11;:31;;19154:98;;;::::0;-1:-1:-1;;;19154:98:0;;17041:2:1;19154:98:0::1;::::0;::::1;17023:21:1::0;17080:2;17060:18;;;17053:30;-1:-1:-1;;;17099:18:1;;;17092:47;17156:18;;19154:98:0::1;16839:341:1::0;19154:98:0::1;19263:11;:25:::0;;;19304:27:::1;::::0;1572:25:1;;;19304:27:0::1;::::0;1560:2:1;1545:18;19304:27:0::1;;;;;;;19079:260:::0;:::o;26512:94::-;26559:14;26593:5;26586:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26512:94;:::o;14935:409::-;15054:11;:18;15015:16;;15048:24;;15044:81;;;15095:11;:18;;-1:-1:-1;15044:81:0;15135:20;15172:11;15178:5;15172:3;:11;:::i;:::-;-1:-1:-1;;;;;15158:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15158:26:0;-1:-1:-1;15135:49:0;-1:-1:-1;15209:5:0;15195:121;15220:3;15216:1;:7;15195:121;;;15258:11;15270:1;15258:14;;;;;;;;:::i;:::-;;;;;;;;;15241:3;15249:5;15245:1;:9;;;;:::i;:::-;15241:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;15299:3;;15195:121;;;-1:-1:-1;15333:3:0;-1:-1:-1;14935:409:0;;;;;:::o;9671:155::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;9751:6:::1;9770:2;-1:-1:-1::0;;;;;9762:16:0::1;9786:6;9762:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9750:47;;;9816:1;9808:10;;;::::0;::::1;;9739:87;9671:155:::0;;:::o;27303:600::-;27371:25;;:::i;:::-;27422:473;;;;;;;;-1:-1:-1;27464:13:0;;;:5;:13;;;;;;;:20;;-1:-1:-1;;;;;27464:20:0;27422:473;;27464:20;27517:23;;;27422:473;;;;;;27597:13;;;;;;;:18;;:25;27422:473;;;;;27571:51;;;:::i;:::-;27422:473;;27643:13;;;;:5;27422:473;27643:13;;;;;;;;:18;;27422:473;;;;;;;;;;;;;;;;;;;;;27643:18;;27422:473;;27643:18;27422:473;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27682:5;:13;27688:6;27682:13;;;;;;;;;;;:18;;27422:473;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27721:5;:13;27727:6;27721:13;;;;;;;;;;;:18;;27422:473;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27422:473:0;;;-1:-1:-1;;27767:13:0;;;;:5;27422:473;27767:13;;;;;;;:20;;;;27422:473;;;;27812:22;;;;;;27422:473;;;;;;;;;27860:13;;;;;;:23;;;;;27422:473;;;;;;;;-1:-1:-1;27415:480:0;27303:600::o;27911:413::-;27995:27;28052:7;28041:8;28052:7;-1:-1:-1;;;;;28116:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;28077:68;;28171:6;28166:123;28187:3;28183:1;:7;28166:123;;;28222:23;28234:7;;28242:1;28234:10;;;;;;;:::i;:::-;;;;;;;28222:11;:23::i;:::-;28208:8;28217:1;28208:11;;;;;;;;:::i;:::-;;;;;;;;;;:37;28272:3;;28166:123;;;-1:-1:-1;28308:8:0;27911:413;-1:-1:-1;;;;27911:413:0:o;14469:135::-;14529:4;14553:20;;;:12;:20;;;;;;;;:29;;;:43;;-1:-1:-1;;14586:10:0;;;14469:135::o;16014:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26614:94::-;26661:14;26695:5;26688:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26614:94;:::o;23944:2560::-;-1:-1:-1;;;;;;;;;;;;;;;;2377:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2363:27:0;:10;-1:-1:-1;;;;;2363:27:0;;2341:94;;;;-1:-1:-1;;;2341:94:0;;18167:2:1;2341:94:0;;;18149:21:1;18206:2;18186:18;;;18179:30;-1:-1:-1;;;18225:18:1;;;18218:47;18282:18;;2341:94:0;17965:341:1;2341:94:0;-1:-1:-1;;;;;14330:24:0;;24125:14:::1;14330:24:::0;;;:13;:24;;;;;;24217:25:::1;14330:24:::0;24217:14:::1;:25::i;:::-;24314:11:::0;;;:63:::1;;-1:-1:-1::0;24375:1:0::1;24343:13:::0;;;:5:::1;:13;::::0;;;;:20;-1:-1:-1;;;;;24343:20:0::1;:34:::0;24314:63:::1;:111;;;-1:-1:-1::0;24395:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:30;;:22:::0;:30:::1;24314:111;:158;;;-1:-1:-1::0;24442:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:18:::1;;:25:::0;:30;24314:158:::1;:228;;;-1:-1:-1::0;24512:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:18:::1;::::0;;::::1;:25:::0;:29:::1;::::0;::::1;:::i;:::-;24489:53:::0;::::1;;24314:228;24296:361;;;24574:50;24593:9;24604:6;24612:11;;24574:50;;;;;;;;;:::i;:::-;;;;;;;;24639:7;9739:87;9671:155:::0;;:::o;24296:361::-:1;24700:13;::::0;;;:5:::1;:13;::::0;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;24700:29:0::1;24725:4;24700:29:::0;;::::1;::::0;;;24811:23:::1;::::0;;24700:13;25012:17:::1;:15;:17::i;:::-;24995:34;;25040:14;25057:17;:15;:17::i;:::-;25040:34;;25085:14;25102:17;:15;:17::i;:::-;25158:15;25182:13:::0;;;:5:::1;:13;::::0;;;;:18:::1;;:25:::0;25085:34;;-1:-1:-1;25252:904:0::1;25273:9;25269:13;;:1;:13;25252:904;;;25351:12;25366:14;25351:12:::0;25387:29:::1;::::0;::::1;:11:::0;;25399:5:::1;:1:::0;25403::::1;25399:5;:::i;:::-;25387:18;;;;;;;:::i;:::-;;;;;;;:29;;;;:::i;:::-;25366:52;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25366:52:0;;;;;::::1;::::0;-1:-1:-1;;25448:14:0::1;::::0;-1:-1:-1;;25469:35:0;::::1;:11:::0;;25482:5:::1;:1:::0;25486::::1;25482:5;:::i;:::-;25481:11;::::0;25491:1:::1;25481:11;:::i;:::-;25469:24;;;;;;;:::i;:::-;;;;;;;:35;;;;:::i;:::-;25448:58;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25448:58:0;;;;;::::1;::::0;-1:-1:-1;;25536:14:0::1;::::0;-1:-1:-1;;25557:35:0;::::1;:11:::0;;25570:5:::1;:1:::0;25574::::1;25570:5;:::i;:::-;25569:11;::::0;25579:1:::1;25569:11;:::i;:::-;25557:24;;;;;;;:::i;:::-;;;;;;;:35;;;;:::i;:::-;25536:58;;;;;;;;;;;;;;;;;;;;;;;;;25521:73;;25673:6;25649:5;:13;25655:6;25649:13;;;;;;;;;;;:18;;25668:1;25649:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;25718:6;25694:5;:13;25700:6;25694:13;;;;;;;;;;;:18;;25713:1;25694:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;25763:6;25739:5;:13;25745:6;25739:13;;;;;;;;;;;:18;;25758:1;25739:21;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;:30:::0;;:21;;;;:30:::1;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;25843:14;;::::1;::::0;;:6:::1;:14:::0;;;;;;:22;;::::1;::::0;;;;;;;:30;;::::1;::::0;;;;;;:34;25839:274:::1;;26010:14;::::0;;::::1;;::::0;;;:6:::1;:14;::::0;;;;;;;:22;;::::1;::::0;;;;;;;:30;;::::1;::::0;;;;;;;17509:6:::1;::::0;26010:49;::::1;26008:68;25989:89;;;;25839:274;26139:3;;;;;25285:871;;;25252:904;;;-1:-1:-1::0;26197:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:20:::1;::::0;::::1;:36:::0;;;26287:20;;26324:28:::1;::::0;;::::1;::::0;26273:80:::1;::::0;-1:-1:-1;;;;;26287:20:0::1;::::0;26220:13;;26273::::1;:80::i;:::-;26415:13;::::0;;;:5:::1;:13;::::0;;;;:20;;;26445:23;;::::1;::::0;-1:-1:-1;;;;;26415:20:0;;::::1;::::0;26405:91:::1;::::0;26421:6;;26445:35:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;26405:91;::::0;;19376:25:1;;;19432:2;19417:18;;19410:34;;;;19460:18;;19453:34;;;19364:2;19349:18;26405:91:0::1;;;;;;;24073:2431;;;;;;;23944:2560:::0;;;:::o;14612:315::-;14694:20;14738:7;;-1:-1:-1;;;;;14772:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14772:15:0;;14763:24;;14803:6;14798:122;14819:3;14815:1;:7;14798:122;;;14852:12;:24;14865:7;;14873:1;14865:10;;;;;;;:::i;:::-;;;;;;;14852:24;;;;;;;;;;;;;;;;;;;;;14840:6;14847:1;14840:9;;;;;;;;:::i;:::-;:36;;;:9;;;;;;;;;;;:36;14903:3;;14798:122;;;;14716:211;14612:315;;;;:::o;9517:68::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;9564:6:::1;:13:::0;;-1:-1:-1;;9564:13:0::1;9573:4;9564:13;::::0;;9517:68::o;21066:835::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;21298:10:::1;::::0;::::1;;:19;21276:84;;;::::0;-1:-1:-1;;;21276:84:0;;19700:2:1;21276:84:0::1;::::0;::::1;19682:21:1::0;19739:2;19719:18;;;19712:30;-1:-1:-1;;;19758:18:1;;;19751:45;19813:18;;21276:84:0::1;19498:339:1::0;21276:84:0::1;21382:6:::0;21428:20;;::::1;21406:88;;;::::0;-1:-1:-1;;;21406:88:0;;20044:2:1;21406:88:0::1;::::0;::::1;20026:21:1::0;20083:2;20063:18;;;20056:30;-1:-1:-1;;;20102:18:1;;;20095:48;20160:18;;21406:88:0::1;19842:342:1::0;21406:88:0::1;21527:20:::0;;::::1;21505:88;;;::::0;-1:-1:-1;;;21505:88:0;;20391:2:1;21505:88:0::1;::::0;::::1;20373:21:1::0;20430:2;20410:18;;;20403:30;-1:-1:-1;;;20449:18:1;;;20442:48;20507:18;;21505:88:0::1;20189:342:1::0;21505:88:0::1;21626:30:::0;;::::1;21604:103;;;::::0;-1:-1:-1;;;21604:103:0;;20738:2:1;21604:103:0::1;::::0;::::1;20720:21:1::0;20777:2;20757:18;;;20750:30;20816:25;20796:18;;;20789:53;20859:18;;21604:103:0::1;20536:347:1::0;21604:103:0::1;21725:6;21720:174;21741:3;21737:1;:7;21720:174;;;21831:16;;21848:1;21831:19;;;;;;;:::i;:::-;;;;;;;21789:6;:17;21796:6;;21803:1;21796:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21789:17;;;;;;;;;;;;;;;:28;21807:6;;21814:1;21807:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21789:28;;;;;;;;;;;;;;;:39;21818:6;;21825:1;21818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21789:39;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;21789:39:0;:61;21877:3:::1;;21720:174;;;;21265:636;21066:835:::0;;;;;;;;:::o;8815:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8815:28:0;:::o;20320:365::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;20439:5:::1;20445:12:::0;;20401:11:::1;::::0;;;20445:16:::1;::::0;20460:1:::1;::::0;20445:16:::1;:::i;:::-;20439:23;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;::::0;-1:-1:-1;20473:205:0::1;20495:3;20491:7;;:1;:7;;;20473:205;;;20516:17;::::0;;::::1;;::::0;;;:14:::1;:17;::::0;;;;:25;;-1:-1:-1;;20516:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;20597:5:::1;:12:::0;;-1:-1:-1;20568:3:0;;::::1;::::0;20597:5;;20516:25;20597:12;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;20592:17;;:1;:17;;::::0;20588:79:::1;;20642:7;;;;;20588:79;20473:205;;28332:370:::0;28418:14;28456:7;28445:8;28456:7;-1:-1:-1;;;;;28507:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28481:42;;28539:6;28534:135;28555:3;28551:1;:7;28534:135;;;28601:23;28613:7;;28621:1;28613:10;;;;;;;:::i;28601:23::-;28590:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;28576:8;28585:1;28576:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;28652:3;;28534:135;;9834:143;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;9915:54:::1;9943:5;9950:10;9962:6;9915:27;:54::i;:::-;9834:143:::0;;:::o;19947:365::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;20066:5:::1;20072:12:::0;;20028:11:::1;::::0;;;20072:16:::1;::::0;20087:1:::1;::::0;20072:16:::1;:::i;:::-;20066:23;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;::::0;-1:-1:-1;20100:205:0::1;20122:3;20118:7;;:1;:7;;;20100:205;;;20143:17;::::0;;::::1;;::::0;;;:14:::1;:17;::::0;;;;:25;;-1:-1:-1;;20143:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;20224:5:::1;:12:::0;;-1:-1:-1;20195:3:0;;::::1;::::0;20224:5;;20143:25;20224:12;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;20219:17;;:1;:17;;::::0;20215:79:::1;;20269:7;;;;;20215:79;20100:205;;15987:20:::0;;;;;;;;;;;;26818:104;26891:5;26897:12;;26866:5;;26891;26897:16;;26912:1;;26897:16;:::i;:::-;26891:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;26884:30;;26818:104;:::o;20693:365::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;20812:5:::1;20818:12:::0;;20774:11:::1;::::0;;;20818:16:::1;::::0;20833:1:::1;::::0;20818:16:::1;:::i;:::-;20812:23;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;::::0;-1:-1:-1;20846:205:0::1;20868:3;20864:7;;:1;:7;;;20846:205;;;20889:17;::::0;;::::1;;::::0;;;:14:::1;:17;::::0;;;;:25;;-1:-1:-1;;20889:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;20970:5:::1;:12:::0;;-1:-1:-1;20941:3:0;;::::1;::::0;20970:5;;20889:25;20970:12;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;20965:17;;:1;:17;;::::0;20961:79:::1;;21015:7;;;;;20961:79;20846:205;;15960:20:::0;;;;;;;;;;;;26930:104;27003:5;27009:12;;26978:5;;27003;27009:16;;27024:1;;27009:16;:::i;28710:933::-;28810:24;;;;;29016:7;;-1:-1:-1;;;;;29051:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29051:18:0;;29041:28;;29109:3;-1:-1:-1;;;;;29095:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29095:18:0;;29080:33;;29153:3;-1:-1:-1;;;;;29139:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29139:18:0;;29124:33;;29195:3;-1:-1:-1;;;;;29181:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29181:18:0;;29168:31;;29233:3;-1:-1:-1;;;;;29222:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29222:15:0;;29210:27;;29255:6;29250:386;29271:3;29267:1;:7;29250:386;;;29305:5;:17;29311:7;;29319:1;29311:10;;;;;;;:::i;:::-;;;;;;;29305:17;;;;;;;;;;;:24;;;;;;;;;;-1:-1:-1;;;;;29305:24:0;29292:7;29300:1;29292:10;;;;;;;;:::i;:::-;;;;;;:37;-1:-1:-1;;;;;29292:37:0;;;-1:-1:-1;;;;;29292:37:0;;;;;29392:5;:17;29398:7;;29406:1;29398:10;;;;;;;:::i;:::-;;;;;;;29392:17;;;;;;;;;;;:22;;:29;;;;29362:5;:17;29368:7;;29376:1;29368:10;;;;;;;:::i;:::-;;;;;;;29362:17;;;;;;;;;;;:27;;;:59;;;;:::i;:::-;29344:12;29357:1;29344:15;;;;;;;;:::i;:::-;;;;;;:77;;;;;29454:5;:17;29460:7;;29468:1;29460:10;;;;;;;:::i;:::-;;;;;;;29454:17;;;;;;;;;;;:24;;;29436:12;29449:1;29436:15;;;;;;;;:::i;:::-;;;;;;:42;;;;;29509:5;:17;29515:7;;29523:1;29515:10;;;;;;;:::i;:::-;;;;;;;29509:17;;;;;;;;;;;:27;;;29493:10;29504:1;29493:13;;;;;;;;:::i;:::-;;;;;;:43;;;;;29566:5;:17;29572:7;;29580:1;29572:10;;;;;;;:::i;:::-;;;;;;;29566:17;;;;;;;;;;;:26;;;;;;;;;;;;29551:9;29561:1;29551:12;;;;;;;;:::i;:::-;:41;;;:12;;;;;;;;;;;:41;29619:3;;29250:386;;;;28994:649;28710:933;;;;;;;;:::o;10549:260::-;10645:6;-1:-1:-1;;;;;2518:20:0;;2528:10;2518:20;2514:182;;2581:36;;-1:-1:-1;;;2581:36:0;;2606:10;2581:36;;;557:51:1;-1:-1:-1;;;;;;;;;;;1963:42:0;2581:24;;530:18:1;;2581:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2555:129;;;;-1:-1:-1;;;2555:129:0;;21372:2:1;2555:129:0;;;21354:21:1;21411:2;21391:18;;;21384:30;21450:33;21430:18;;;21423:61;21501:18;;2555:129:0;21170:355:1;2555:129:0;-1:-1:-1;;;;;;;;;;;;;;;;2777:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;2755:91;;;::::0;-1:-1:-1;;;2755:91:0;;21732:2:1;2755:91:0::1;::::0;::::1;21714:21:1::0;21771:2;21751:18;;;21744:30;-1:-1:-1;;;21790:18:1;;;21783:46;21846:18;;2755:91:0::1;21530:340:1::0;2755:91:0::1;10699:6:::2;::::0;::::2;;10698:7;10676:63;;;::::0;-1:-1:-1;;;10676:63:0;;22077:2:1;10676:63:0::2;::::0;::::2;22059:21:1::0;22116:1;22096:18;;;22089:29;-1:-1:-1;;;22134:18:1;;;22127:36;22180:18;;10676:63:0::2;21875:329:1::0;10676:63:0::2;10774:27;10784:6;10792:8;;10774:9;:27::i;:::-;10549:260:::0;;;;:::o;18974:97::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;19042:9:::1;:21:::0;;-1:-1:-1;;19042:21:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;18974:97::o;27042:104::-;27115:5;27121:12;;27090:5;;27115;27121:16;;27136:1;;27121:16;:::i;19347:103::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;19397:10:::1;:17:::0;;-1:-1:-1;;19397:17:0::1;19410:4;19397:17;::::0;;19430:12:::1;::::0;::::1;::::0;19397:10:::1;::::0;19430:12:::1;19347:103::o:0;19458:481::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;19637:10:::1;::::0;::::1;;:19;19615:84;;;::::0;-1:-1:-1;;;19615:84:0;;22411:2:1;19615:84:0::1;::::0;::::1;22393:21:1::0;22450:2;22430:18;;;22423:30;-1:-1:-1;;;22469:18:1;;;22462:45;22524:18;;19615:84:0::1;22209:339:1::0;19615:84:0::1;19732:30:::0;;::::1;:77:::0;::::1;;;-1:-1:-1::0;19779:30:0;;::::1;19732:77;19710:146;;;::::0;-1:-1:-1;;;19710:146:0;;22755:2:1;19710:146:0::1;::::0;::::1;22737:21:1::0;22794:2;22774:18;;;22767:30;-1:-1:-1;;;22813:18:1;;;22806:49;22872:18;;19710:146:0::1;22553:343:1::0;19710:146:0::1;19867:14;:5;19875:6:::0;;19867:14:::1;:::i;:::-;-1:-1:-1::0;19892:14:0::1;:5;19900:6:::0;;19892:14:::1;:::i;:::-;-1:-1:-1::0;19917:14:0::1;:5;19925:6:::0;;19917:14:::1;:::i;:::-;;19458:481:::0;;;;;;:::o;10331:105::-;10373:7;-1:-1:-1;;;;;;;;;;;;;;;;10405:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10400:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26716:94::-;26763:14;26797:5;26790:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26716:94;:::o;14000:224::-;-1:-1:-1;;;;;;;;;;;;;;;;14106:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;14099:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;14192:24:0;;;;;:13;:24;;;;;14185:31;14000:224::o;10904:1941::-;11016:17;;11012:1824;;11125:14;11108:13;:31;11104:1552;;-1:-1:-1;;;;;;;;;;;;;;;;11495:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11481:145;;-1:-1:-1;;;11481:145:0;;11571:7;11481:145;;;23264:25:1;-1:-1:-1;;;;;23325:32:1;;;23305:18;;;23298:60;11481:44:0;;;;;;;11533:14;;23237:18:1;;11481:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11686:17;11722:14;11706:13;:30;;;;:::i;:::-;11686:50;-1:-1:-1;11759:13:0;;11755:175;;-1:-1:-1;;;;;;;;;;;;;;;;11859:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11852:58;;-1:-1:-1;;;11852:58:0;;11883:7;11852:58;;;23571:25:1;-1:-1:-1;;;;;23632:32:1;;;23612:18;;;23605:60;23681:18;;;23674:34;;;11852:30:0;;;;;;;23544:18:1;;11852:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11141:822;9739:87:::1;9671:155:::0;;:::o;11104:1552::-;-1:-1:-1;;;;;;;;;;;;;;;;12242:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12228:144;;-1:-1:-1;;;12228:144:0;;12317:7;12228:144;;;23264:25:1;-1:-1:-1;;;;;23325:32:1;;;23305:18;;;23298:60;12228:44:0;;;;;;;12280:13;;23237:18:1;;12228:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12452:17;12489:13;12472:14;:30;;;;:::i;:::-;12452:50;;-1:-1:-1;;;;;;;;;;;;;;;;12582:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12575:35:0;;12618:9;12630:7;12575:63;;;;;;;;;;;;;1572:25:1;;1560:2;1545:18;;1426:177;12575:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11969:687;9739:87:::1;9671:155:::0;;:::o;11012:1824::-;-1:-1:-1;;;;;;;;;;;;;;;;12763:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12756:35:0;;12799:14;12816:7;12756:68;;;;;;;;;;;;;1572:25:1;;1560:2;1545:18;;1426:177;12756:68:0;;;;;;;;;;;;;;;;;;;;656:449;888:45;;;-1:-1:-1;;;;;23911:32:1;;;888:45:0;;;23893:51:1;23960:18;;;;23953:34;;;888:45:0;;;;;;;;;;23866:18:1;;;;888:45:0;;;;;;;-1:-1:-1;;;;;888:45:0;-1:-1:-1;;;888:45:0;;;877:57;;-1:-1:-1;;;;877:10:0;;;;:57;;888:45;877:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;841:93;;;;967:7;:57;;;;-1:-1:-1;979:11:0;;:16;;:44;;;1010:4;999:24;;;;;;;;;;;;:::i;:::-;945:152;;;;-1:-1:-1;;;945:152:0;;24492:2:1;945:152:0;;;24474:21:1;24531:2;24511:18;;;24504:30;24570:34;24550:18;;;24543:62;-1:-1:-1;;;24621:18:1;;;24614:43;24674:19;;945:152:0;24290:409:1;945:152:0;763:342;;656:449;;;:::o;21946:1924::-;22067:14;22084:11;:9;:11::i;:::-;22067:28;-1:-1:-1;22152:14:0;;;;22272:56;;;;22283:8;22272:56;:::i;:::-;22137:191;;;;;;;;22404:6;22391:9;:19;;22369:84;;;;-1:-1:-1;;;22369:84:0;;25425:2:1;22369:84:0;;;25407:21:1;25464:2;25444:18;;;25437:30;-1:-1:-1;;;25483:18:1;;;25476:45;25538:18;;22369:84:0;25223:339:1;22369:84:0;22486:21;22500:6;22486:13;:21::i;:::-;:29;;22511:4;22486:29;22464:99;;;;-1:-1:-1;;;22464:99:0;;25769:2:1;22464:99:0;;;25751:21:1;25808:2;25788:18;;;25781:30;-1:-1:-1;;;25827:18:1;;;25820:50;25887:18;;22464:99:0;25567:344:1;22464:99:0;22607:1;22596:8;:12;;;:37;;;;-1:-1:-1;22624:9:0;;;;;;22612:21;;;;;22596:37;22574:105;;;;-1:-1:-1;;;22574:105:0;;26118:2:1;22574:105:0;;;26100:21:1;26157:2;26137:18;;;26130:30;-1:-1:-1;;;26176:18:1;;;26169:48;26234:18;;22574:105:0;25916:342:1;22574:105:0;22731:22;22756:18;22768:6;22756:9;:18;:::i;:::-;22731:43;-1:-1:-1;22824:24:0;22851:26;;;;22731:43;22851:26;:::i;:::-;22824:53;;22938:25;17509:6;22985:11;;22968:14;:28;;;;:::i;:::-;22966:47;;;;:::i;:::-;22938:75;;23090:43;23102:17;23121:3;23126:6;23090:11;:43::i;:::-;23173:13;;;;:5;:13;;;;;:29;;-1:-1:-1;;;;;;23173:29:0;-1:-1:-1;;;;;23173:29:0;;;;;-1:-1:-1;23213:23:0;:42;;;23297:34;23314:17;23297:14;:34;:::i;:::-;23266:13;;;;:5;:13;;;;;:28;;:65;23363:21;;;-1:-1:-1;;;;;23363:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23363:21:0;;23342:5;:13;23348:6;23342:13;;;;;;;;;;;:18;;:42;;;;;;;;;;;;:::i;:::-;;23428:8;23416:21;;-1:-1:-1;;;;;23416:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23416:21:0;;23395:5;:13;23401:6;23395:13;;;;;;;;;;;:18;;:42;;;;;;;;;;;;:::i;:::-;;23481:8;23469:21;;-1:-1:-1;;;;;23469:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23469:21:0;;23448:5;:13;23454:6;23448:13;;;;;;;;;;;:18;;:42;;;;;;;;;;;;:::i;:::-;-1:-1:-1;23501:13:0;;;;:5;:13;;;;;23527:15;23501:23;;;;:41;23584:31;23600:6;23507;23584:15;:31::i;:::-;23653:36;23666:6;23674:14;23653:12;:36::i;:::-;23750:6;-1:-1:-1;;;;;23738:27:0;;23758:6;23738:27;;;;1572:25:1;;1560:2;1545:18;;1426:177;23738:27:0;;;;;;;;23810:52;23825:6;23833:12;:8;23844:1;23833:12;:::i;:::-;23847:14;23810;:52::i;:::-;22024:1846;;;;;;;;21946:1924;;;:::o;10147:172::-;-1:-1:-1;;;;;;;;;;;;;;;;10250:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10236:75;;-1:-1:-1;;;10236:75:0;;-1:-1:-1;;;;;26685:32:1;;;10236:75:0;;;26667:51:1;26754:32;;;26734:18;;;26727:60;10236:44:0;;;;;;;10288:9;;26640:18:1;;10236:75:0;26493:300:1;12934:272:0;13042:40;;-1:-1:-1;;;13042:40:0;;-1:-1:-1;;;;;27018:32:1;;;13042:40:0;;;27000:51:1;13066:7:0;27067:18:1;;;27060:34;27110:18;;;27103:34;;;13042:7:0;:15;;;;26973:18:1;;13042:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13136:11:0;:24;;;;;;;;;;;;-1:-1:-1;13171:20:0;;;:12;13136:24;13171:20;;;;;:27;;-1:-1:-1;;13171:27:0;;;;;;;-1:-1:-1;;;12934:272:0:o;9985:154::-;-1:-1:-1;;;;;;;;;;;;;;;;10074:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10057:74;;-1:-1:-1;;;10057:74:0;;-1:-1:-1;;;;;27018:32:1;;;10057:74:0;;;27000:51:1;27067:18;;;27060:34;;;10123:7:0;27110:18:1;;;27103:34;10057:51:0;;;;;;;26973:18:1;;10057:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9985:154;;:::o;13214:778::-;13367:16;-1:-1:-1;;;;;;;;;;;;;;;;13391:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13386:33:0;;13427:11;:9;:11::i;:::-;13386:185;;-1:-1:-1;;;;;;13386:185:0;;;;;;;;;;27318:25:1;;;27391:4;27379:17;;27359:18;;;27352:45;27291:18;;13386:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13655:24:0;;;;;;:13;:24;;;;;;13367:204;;-1:-1:-1;13655:29:0;13633:95;;;;-1:-1:-1;;;13633:95:0;;27864:2:1;13633:95:0;;;27846:21:1;27903:2;27883:18;;;27876:30;-1:-1:-1;;;27922:18:1;;;27915:46;27978:18;;13633:95:0;27662:340:1;13633:95:0;-1:-1:-1;;;;;13799:24:0;;;;;;:13;:24;;;;;;;;;:33;;;13882:15;;-1:-1:-1;;;;;;13882:15:0;;;;-1:-1:-1;;;;;;;;;;;1963:42:0;13882:13;;:15;;;;;13799:24;;13882:15;;;;;1963:42;13882:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13875:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13957:27;13977:6;13957:27;;;;1572:25:1;;1560:2;1545:18;;1426:177;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;619:226:1;678:6;731:2;719:9;710:7;706:23;702:32;699:52;;;747:1;744;737:12;699:52;-1:-1:-1;792:23:1;;619:226;-1:-1:-1;619:226:1:o;1608:618::-;1794:2;1806:21;;;1876:13;;1779:18;;;1898:22;;;1746:4;;1977:15;;;1951:2;1936:18;;;1746:4;2020:180;2034:6;2031:1;2028:13;2020:180;;;2099:13;;2114:4;2095:24;2083:37;;2149:2;2175:15;;;;2140:12;;;;2056:1;2049:9;2020:180;;;-1:-1:-1;2217:3:1;;1608:618;-1:-1:-1;;;;;1608:618:1:o;2231:156::-;2297:20;;2357:4;2346:16;;2336:27;;2326:55;;2377:1;2374;2367:12;2326:55;2231:156;;;:::o;2392:182::-;2449:6;2502:2;2490:9;2481:7;2477:23;2473:32;2470:52;;;2518:1;2515;2508:12;2470:52;2541:27;2558:9;2541:27;:::i;:::-;2531:37;2392:182;-1:-1:-1;;;2392:182:1:o;2768:346::-;2836:6;2844;2897:2;2885:9;2876:7;2872:23;2868:32;2865:52;;;2913:1;2910;2903:12;2865:52;-1:-1:-1;;2958:23:1;;;3078:2;3063:18;;;3050:32;;-1:-1:-1;2768:346:1:o;3119:420::-;3172:3;3210:5;3204:12;3237:6;3232:3;3225:19;3269:4;3264:3;3260:14;3253:21;;3308:4;3301:5;3297:16;3331:1;3341:173;3355:6;3352:1;3349:13;3341:173;;;3416:13;;3404:26;;3459:4;3450:14;;;;3487:17;;;;3377:1;3370:9;3341:173;;;-1:-1:-1;3530:3:1;;3119:420;-1:-1:-1;;;;3119:420:1:o;3544:261::-;3723:2;3712:9;3705:21;3686:4;3743:56;3795:2;3784:9;3780:18;3772:6;3743:56;:::i;3810:131::-;-1:-1:-1;;;;;3885:31:1;;3875:42;;3865:70;;3931:1;3928;3921:12;3865:70;3810:131;:::o;3946:367::-;4014:6;4022;4075:2;4063:9;4054:7;4050:23;4046:32;4043:52;;;4091:1;4088;4081:12;4043:52;4130:9;4117:23;4149:31;4174:5;4149:31;:::i;:::-;4199:5;4277:2;4262:18;;;;4249:32;;-1:-1:-1;;;3946:367:1:o;4318:429::-;4369:3;4407:5;4401:12;4434:6;4429:3;4422:19;4466:4;4461:3;4457:14;4450:21;;4505:4;4498:5;4494:16;4528:1;4538:184;4552:6;4549:1;4546:13;4538:184;;;4617:13;;4632:4;4613:24;4601:37;;4667:4;4658:14;;;;4695:17;;;;4574:1;4567:9;4538:184;;4752:1000;4850:12;;-1:-1:-1;;;;;368:31:1;356:44;;4917:4;4910:5;4906:16;4900:23;4893:4;4888:3;4884:14;4877:47;4973:4;4966:5;4962:16;4956:23;4949:4;4944:3;4940:14;4933:47;4813:3;5026:4;5019:5;5015:16;5009:23;5064:6;5057:4;5052:3;5048:14;5041:30;5092:58;5142:6;5137:3;5133:16;5119:12;5092:58;:::i;:::-;5080:70;;5198:4;5191:5;5187:16;5181:23;5246:3;5240:4;5236:14;5229:4;5224:3;5220:14;5213:38;5274:48;5317:4;5301:14;5274:48;:::i;:::-;5260:62;;;5370:4;5363:5;5359:16;5353:23;5420:3;5412:6;5408:16;5401:4;5396:3;5392:14;5385:40;5448:50;5491:6;5475:14;5448:50;:::i;:::-;5434:64;;;5547:4;5540:5;5536:16;5530:23;5523:4;5518:3;5514:14;5507:47;5602:4;5595:5;5591:16;5585:23;5617:47;5658:4;5653:3;5649:14;5633;84:13;77:21;65:34;;14:91;5617:47;;5715:6;5708:5;5704:18;5698:25;5689:6;5684:3;5680:16;5673:51;5740:6;5733:13;;;4752:1000;;;;:::o;5757:291::-;5958:2;5947:9;5940:21;5921:4;5978:64;6038:2;6027:9;6023:18;6015:6;5978:64;:::i;6287:367::-;6350:8;6360:6;6414:3;6407:4;6399:6;6395:17;6391:27;6381:55;;6432:1;6429;6422:12;6381:55;-1:-1:-1;6455:20:1;;-1:-1:-1;;;;;6487:30:1;;6484:50;;;6530:1;6527;6520:12;6484:50;6567:4;6559:6;6555:17;6543:29;;6627:3;6620:4;6610:6;6607:1;6603:14;6595:6;6591:27;6587:38;6584:47;6581:67;;;6644:1;6641;6634:12;6581:67;6287:367;;;;;:::o;6659:437::-;6745:6;6753;6806:2;6794:9;6785:7;6781:23;6777:32;6774:52;;;6822:1;6819;6812:12;6774:52;6862:9;6849:23;-1:-1:-1;;;;;6887:6:1;6884:30;6881:50;;;6927:1;6924;6917:12;6881:50;6966:70;7028:7;7019:6;7008:9;7004:22;6966:70;:::i;:::-;7055:8;;6940:96;;-1:-1:-1;6659:437:1;-1:-1:-1;;;;6659:437:1:o;7101:853::-;7315:4;7363:2;7352:9;7348:18;7393:2;7382:9;7375:21;7416:6;7451;7445:13;7482:6;7474;7467:22;7520:2;7509:9;7505:18;7498:25;;7582:2;7572:6;7569:1;7565:14;7554:9;7550:30;7546:39;7532:53;;7620:2;7612:6;7608:15;7641:1;7651:274;7665:6;7662:1;7659:13;7651:274;;;7758:2;7754:7;7742:9;7734:6;7730:22;7726:36;7721:3;7714:49;7786:59;7838:6;7829;7823:13;7786:59;:::i;:::-;7776:69;-1:-1:-1;7880:2:1;7903:12;;;;7868:15;;;;;7687:1;7680:9;7651:274;;;-1:-1:-1;7942:6:1;;7101:853;-1:-1:-1;;;;;;7101:853:1:o;7959:129::-;-1:-1:-1;;;;;8037:5:1;8033:30;8026:5;8023:41;8013:69;;8078:1;8075;8068:12;8093:570;8187:6;8195;8203;8256:2;8244:9;8235:7;8231:23;8227:32;8224:52;;;8272:1;8269;8262:12;8224:52;8311:9;8298:23;8330:30;8354:5;8330:30;:::i;:::-;8379:5;-1:-1:-1;8435:2:1;8420:18;;8407:32;-1:-1:-1;;;;;8451:30:1;;8448:50;;;8494:1;8491;8484:12;8448:50;8533:70;8595:7;8586:6;8575:9;8571:22;8533:70;:::i;:::-;8093:570;;8622:8;;-1:-1:-1;8507:96:1;;-1:-1:-1;;;;8093:570:1:o;8668:433::-;8718:3;8756:5;8750:12;8783:6;8778:3;8771:19;8815:4;8810:3;8806:14;8799:21;;8854:4;8847:5;8843:16;8877:1;8887:189;8901:6;8898:1;8895:13;8887:189;;;8976:13;;8969:21;8962:29;8950:42;;9021:4;9012:14;;;;9049:17;;;;8923:1;8916:9;8887:189;;9106:252;9279:2;9268:9;9261:21;9242:4;9299:53;9348:2;9337:9;9333:18;9325:6;9299:53;:::i;9363:1425::-;9551:6;9559;9567;9575;9583;9591;9599;9607;9660:3;9648:9;9639:7;9635:23;9631:33;9628:53;;;9677:1;9674;9667:12;9628:53;9717:9;9704:23;-1:-1:-1;;;;;9742:6:1;9739:30;9736:50;;;9782:1;9779;9772:12;9736:50;9821:70;9883:7;9874:6;9863:9;9859:22;9821:70;:::i;:::-;9910:8;;-1:-1:-1;9795:96:1;-1:-1:-1;;9998:2:1;9983:18;;9970:32;-1:-1:-1;;;;;10014:32:1;;10011:52;;;10059:1;10056;10049:12;10011:52;10098:72;10162:7;10151:8;10140:9;10136:24;10098:72;:::i;:::-;10189:8;;-1:-1:-1;10072:98:1;-1:-1:-1;;10277:2:1;10262:18;;10249:32;-1:-1:-1;;;;;10293:32:1;;10290:52;;;10338:1;10335;10328:12;10290:52;10377:72;10441:7;10430:8;10419:9;10415:24;10377:72;:::i;:::-;10468:8;;-1:-1:-1;10351:98:1;-1:-1:-1;;10556:2:1;10541:18;;10528:32;-1:-1:-1;;;;;10572:32:1;;10569:52;;;10617:1;10614;10607:12;10569:52;10656:72;10720:7;10709:8;10698:9;10694:24;10656:72;:::i;:::-;9363:1425;;;;-1:-1:-1;9363:1425:1;;-1:-1:-1;9363:1425:1;;;;;;10747:8;-1:-1:-1;;;9363:1425:1:o;10793:250::-;10878:1;10888:113;10902:6;10899:1;10896:13;10888:113;;;10978:11;;;10972:18;10959:11;;;10952:39;10924:2;10917:10;10888:113;;;-1:-1:-1;;11035:1:1;11017:16;;11010:27;10793:250::o;11048:991::-;11208:4;11256:2;11245:9;11241:18;11286:2;11275:9;11268:21;11309:6;11344;11338:13;11375:6;11367;11360:22;11413:2;11402:9;11398:18;11391:25;;11475:2;11465:6;11462:1;11458:14;11447:9;11443:30;11439:39;11425:53;;11513:2;11505:6;11501:15;11534:1;11544:466;11558:6;11555:1;11552:13;11544:466;;;11651:2;11647:7;11635:9;11627:6;11623:22;11619:36;11614:3;11607:49;11685:6;11679:13;11727:2;11721:9;11758:8;11750:6;11743:24;11780:74;11845:8;11840:2;11832:6;11828:15;11823:2;11819;11815:11;11780:74;:::i;:::-;11920:2;11897:17;-1:-1:-1;;11893:31:1;11881:44;;;;11927:2;11877:53;;;;-1:-1:-1;11988:12:1;;;;11953:15;;;;;11580:1;11573:9;11544:466;;12275:322;12346:6;12354;12362;12415:2;12403:9;12394:7;12390:23;12386:32;12383:52;;;12431:1;12428;12421:12;12383:52;12454:27;12471:9;12454:27;:::i;:::-;12444:37;;12500:36;12532:2;12521:9;12517:18;12500:36;:::i;:::-;12490:46;;12555:36;12587:2;12576:9;12572:18;12555:36;:::i;:::-;12545:46;;12275:322;;;;;:::o;12602:1424::-;13098:3;13111:22;;;13182:13;;13083:19;;;13204:22;;;13050:4;;13296;13284:17;;;13257:3;13242:19;;;13050:4;13329:199;13343:6;13340:1;13337:13;13329:199;;;13408:13;;-1:-1:-1;;;;;13404:39:1;13392:52;;13473:4;13501:17;;;;13464:14;;;;13440:1;13358:9;13329:199;;;13333:3;;13575:9;13570:3;13566:19;13559:4;13548:9;13544:20;13537:49;13609:41;13646:3;13638:6;13609:41;:::i;:::-;13595:55;;;13698:9;13690:6;13686:22;13681:2;13670:9;13666:18;13659:50;13732:44;13769:6;13761;13732:44;:::i;:::-;13718:58;;13824:9;13816:6;13812:22;13807:2;13796:9;13792:18;13785:50;13858:44;13895:6;13887;13858:44;:::i;:::-;13844:58;;13951:9;13943:6;13939:22;13933:3;13922:9;13918:19;13911:51;13979:41;14013:6;14005;13979:41;:::i;:::-;13971:49;12602:1424;-1:-1:-1;;;;;;;;12602:1424:1:o;14031:721::-;14110:6;14118;14126;14179:2;14167:9;14158:7;14154:23;14150:32;14147:52;;;14195:1;14192;14185:12;14147:52;14234:9;14221:23;14253:31;14278:5;14253:31;:::i;:::-;14303:5;-1:-1:-1;14359:2:1;14344:18;;14331:32;-1:-1:-1;;;;;14375:30:1;;14372:50;;;14418:1;14415;14408:12;14372:50;14441:22;;14494:4;14486:13;;14482:27;-1:-1:-1;14472:55:1;;14523:1;14520;14513:12;14472:55;14563:2;14550:16;-1:-1:-1;;;;;14581:6:1;14578:30;14575:50;;;14621:1;14618;14611:12;14575:50;14666:7;14661:2;14652:6;14648:2;14644:15;14640:24;14637:37;14634:57;;;14687:1;14684;14677:12;14634:57;14031:721;;14718:2;14710:11;;;;;-1:-1:-1;14740:6:1;;-1:-1:-1;;;14031:721:1:o;14757:1093::-;14909:6;14917;14925;14933;14941;14949;15002:2;14990:9;14981:7;14977:23;14973:32;14970:52;;;15018:1;15015;15008:12;14970:52;15058:9;15045:23;-1:-1:-1;;;;;15083:6:1;15080:30;15077:50;;;15123:1;15120;15113:12;15077:50;15162:70;15224:7;15215:6;15204:9;15200:22;15162:70;:::i;:::-;15251:8;;-1:-1:-1;15136:96:1;-1:-1:-1;;15339:2:1;15324:18;;15311:32;-1:-1:-1;;;;;15355:32:1;;15352:52;;;15400:1;15397;15390:12;15352:52;15439:72;15503:7;15492:8;15481:9;15477:24;15439:72;:::i;:::-;15530:8;;-1:-1:-1;15413:98:1;-1:-1:-1;;15618:2:1;15603:18;;15590:32;-1:-1:-1;;;;;15634:32:1;;15631:52;;;15679:1;15676;15669:12;15631:52;15718:72;15782:7;15771:8;15760:9;15756:24;15718:72;:::i;:::-;14757:1093;;;;-1:-1:-1;14757:1093:1;;-1:-1:-1;14757:1093:1;;15809:8;;14757:1093;-1:-1:-1;;;14757:1093:1:o;15855:251::-;15925:6;15978:2;15966:9;15957:7;15953:23;15949:32;15946:52;;;15994:1;15991;15984:12;15946:52;16026:9;16020:16;16045:31;16070:5;16045:31;:::i;16111:334::-;16313:2;16295:21;;;16352:2;16332:18;;;16325:30;-1:-1:-1;;;16386:2:1;16371:18;;16364:40;16436:2;16421:18;;16111:334::o;16450:127::-;16511:10;16506:3;16502:20;16499:1;16492:31;16542:4;16539:1;16532:15;16566:4;16563:1;16556:15;16582:127;16643:10;16638:3;16634:20;16631:1;16624:31;16674:4;16671:1;16664:15;16698:4;16695:1;16688:15;16714:120;16754:1;16780;16770:35;;16785:18;;:::i;:::-;-1:-1:-1;16819:9:1;;16714:120::o;17185:128::-;17252:9;;;17273:11;;;17270:37;;;17287:18;;:::i;17318:127::-;17379:10;17374:3;17370:20;17367:1;17360:31;17410:4;17407:1;17400:15;17434:4;17431:1;17424:15;17450:127;17511:10;17506:3;17502:20;17499:1;17492:31;17542:4;17539:1;17532:15;17566:4;17563:1;17556:15;17792:168;17865:9;;;17896;;17913:15;;;17907:22;;17893:37;17883:71;;17934:18;;:::i;18311:611::-;-1:-1:-1;;;;;18555:31:1;;18537:50;;18618:2;18603:18;;18596:34;;;18666:2;18661;18646:18;;18639:30;;;18685:18;;18678:34;;;-1:-1:-1;;;;;;18724:31:1;;18721:51;;;18768:1;18765;18758:12;18721:51;18802:6;18799:1;18795:14;18860:6;18852;18846:3;18835:9;18831:19;18818:49;18888:22;;;;18912:3;18884:32;;18311:611;-1:-1:-1;;;;;18311:611:1:o;18927:112::-;18959:1;18985;18975:35;;18990:18;;:::i;:::-;-1:-1:-1;19024:9:1;;18927:112::o;19044:125::-;19109:9;;;19130:10;;;19127:36;;;19143:18;;:::i;20888:277::-;20955:6;21008:2;20996:9;20987:7;20983:23;20979:32;20976:52;;;21024:1;21021;21014:12;20976:52;21056:9;21050:16;21109:5;21102:13;21095:21;21088:5;21085:32;21075:60;;21131:1;21128;21121:12;22901:184;22971:6;23024:2;23012:9;23003:7;22999:23;22995:32;22992:52;;;23040:1;23037;23030:12;22992:52;-1:-1:-1;23063:16:1;;22901:184;-1:-1:-1;22901:184:1:o;23998:287::-;24127:3;24165:6;24159:13;24181:66;24240:6;24235:3;24228:4;24220:6;24216:17;24181:66;:::i;:::-;24263:16;;;;;23998:287;-1:-1:-1;;23998:287:1:o;24704:514::-;24796:6;24804;24812;24820;24873:3;24861:9;24852:7;24848:23;24844:33;24841:53;;;24890:1;24887;24880:12;24841:53;24935:23;;;-1:-1:-1;25001:36:1;25033:2;25018:18;;25001:36;:::i;:::-;24991:46;;25089:2;25078:9;25074:18;25061:32;25102:33;25127:7;25102:33;:::i;:::-;24704:514;;;;-1:-1:-1;25154:7:1;;25208:2;25193:18;25180:32;;-1:-1:-1;;24704:514:1:o;26263:225::-;26367:4;26346:12;;;26360;;;26342:31;26393:22;;;;26434:24;;;26424:58;;26462:18;;:::i;:::-;26424:58;26263:225;;;;:::o;27408:249::-;27477:6;27530:2;27518:9;27509:7;27505:23;27501:32;27498:52;;;27546:1;27543;27536:12;27498:52;27578:9;27572:16;27597:30;27621:5;27597:30;:::i

Swarm Source

ipfs://5e8743371fed897511ecad57fea6c30eee379dd9761ab3cc9470c08449010353

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
0x7B53Ec7A5e1C30D4b91D2c3Ec0472a6E4818a657
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.