APE Price: $0.19 (-5.71%)

Contract

0xa67d5CD51028cAaa367eEFcE90a5eA0b71c6cBE2

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo1,581.988974209106492084 APE

APE Value

$297.71 (@ $0.19/APE)

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To
Cash Out326221472026-01-20 23:37:3617 mins ago1768952256IN
0xa67d5CD5...b71c6cBE2
0 APE0.01188091101.68276
Make Guess326221382026-01-20 23:37:2417 mins ago1768952244IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.02469691101.68276
Play326221322026-01-20 23:37:1217 mins ago1768952232IN
0xa67d5CD5...b71c6cBE2
50.07321158 APE0.06125989101.68276
Cash Out326220112026-01-20 23:31:5322 mins ago1768951913IN
0xa67d5CD5...b71c6cBE2
0 APE0.00268391101.68276
Cash Out326220092026-01-20 23:31:5122 mins ago1768951911IN
0xa67d5CD5...b71c6cBE2
0 APE0.01187969101.68276
Make Guess326220022026-01-20 23:31:4223 mins ago1768951902IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.0431629101.68276
Make Guess326219932026-01-20 23:31:3023 mins ago1768951890IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.0297544101.68276
Cash Out326217822026-01-20 23:22:5931 mins ago1768951379IN
0xa67d5CD5...b71c6cBE2
0 APE0.01188091101.68276
Make Guess326217792026-01-20 23:22:5031 mins ago1768951370IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.02469803101.68276
Play326217772026-01-20 23:22:4332 mins ago1768951363IN
0xa67d5CD5...b71c6cBE2
10.07321158 APE0.06417005101.68276
Cash Out326217702026-01-20 23:22:1632 mins ago1768951336IN
0xa67d5CD5...b71c6cBE2
0 APE0.01187969101.68276
Make Guess326217672026-01-20 23:22:0232 mins ago1768951322IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.02466071101.68276
Play326217642026-01-20 23:21:5832 mins ago1768951318IN
0xa67d5CD5...b71c6cBE2
3.07321158 APE0.06416761101.68276
Make Guess326217602026-01-20 23:21:4732 mins ago1768951307IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.02470067101.68276
Play326217532026-01-20 23:21:3533 mins ago1768951295IN
0xa67d5CD5...b71c6cBE2
3.07321158 APE0.06416883101.68276
Cash Out326217472026-01-20 23:21:1833 mins ago1768951278IN
0xa67d5CD5...b71c6cBE2
0 APE0.01188091101.68276
Make Guess326217452026-01-20 23:21:1133 mins ago1768951271IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.02466193101.68276
Play326217422026-01-20 23:21:0333 mins ago1768951263IN
0xa67d5CD5...b71c6cBE2
17.07321158 APE0.06417005101.68276
Cash Out326217382026-01-20 23:20:5233 mins ago1768951252IN
0xa67d5CD5...b71c6cBE2
0 APE0.01188091101.68276
Make Guess326217322026-01-20 23:20:4533 mins ago1768951245IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.02469314101.68276
Play326217292026-01-20 23:20:3734 mins ago1768951237IN
0xa67d5CD5...b71c6cBE2
3.07321158 APE0.06417005101.68276
Cash Out326217222026-01-20 23:20:1634 mins ago1768951216IN
0xa67d5CD5...b71c6cBE2
0 APE0.01188091101.68276
Make Guess326217182026-01-20 23:20:0734 mins ago1768951207IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.0428301101.68276
Make Guess326217142026-01-20 23:19:5834 mins ago1768951198IN
0xa67d5CD5...b71c6cBE2
0.07321158 APE0.02469314101.68276
Play326217112026-01-20 23:19:5134 mins ago1768951191IN
0xa67d5CD5...b71c6cBE2
7.07321158 APE0.06417005101.68276
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
326221472026-01-20 23:37:3617 mins ago1768952256
0xa67d5CD5...b71c6cBE2
69.44 APE
326221402026-01-20 23:37:2517 mins ago1768952245
0xa67d5CD5...b71c6cBE2
20.94 APE
326221382026-01-20 23:37:2417 mins ago1768952244
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326221322026-01-20 23:37:1217 mins ago1768952232
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326221322026-01-20 23:37:1217 mins ago1768952232
0xa67d5CD5...b71c6cBE2
1.25 APE
326220092026-01-20 23:31:5122 mins ago1768951911
0xa67d5CD5...b71c6cBE2
26.04125 APE
326220032026-01-20 23:31:4323 mins ago1768951903
0xa67d5CD5...b71c6cBE2
24.020449 APE
326220022026-01-20 23:31:4223 mins ago1768951902
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326220022026-01-20 23:31:4223 mins ago1768951902
0xa67d5CD5...b71c6cBE2
0.0520825 APE
326219972026-01-20 23:31:3223 mins ago1768951892
0xa67d5CD5...b71c6cBE2
1.1133 APE
326219932026-01-20 23:31:3023 mins ago1768951890
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326217822026-01-20 23:22:5931 mins ago1768951379
0xa67d5CD5...b71c6cBE2
10.6 APE
326217802026-01-20 23:22:5231 mins ago1768951372
0xa67d5CD5...b71c6cBE2
0.9 APE
326217792026-01-20 23:22:5031 mins ago1768951370
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326217772026-01-20 23:22:4332 mins ago1768951363
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326217772026-01-20 23:22:4332 mins ago1768951363
0xa67d5CD5...b71c6cBE2
0.25 APE
326217702026-01-20 23:22:1632 mins ago1768951336
0xa67d5CD5...b71c6cBE2
3.18 APE
326217682026-01-20 23:22:0632 mins ago1768951326
0xa67d5CD5...b71c6cBE2
0.27 APE
326217672026-01-20 23:22:0232 mins ago1768951322
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326217642026-01-20 23:21:5832 mins ago1768951318
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326217642026-01-20 23:21:5832 mins ago1768951318
0xa67d5CD5...b71c6cBE2
0.075 APE
326217612026-01-20 23:21:4932 mins ago1768951309
0xa67d5CD5...b71c6cBE2
2.91 APE
326217602026-01-20 23:21:4732 mins ago1768951307
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326217532026-01-20 23:21:3533 mins ago1768951295
0xa67d5CD5...b71c6cBE2
0.07321158 APE
326217532026-01-20 23:21:3533 mins ago1768951295
0xa67d5CD5...b71c6cBE2
0.075 APE
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HighLow

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at basescan.org on 2025-06-19
*/

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

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

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


contract ApeOwnable {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

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

    // GAME ID
    uint256 public immutable GAME_ID;

    // History Manager
    IHistoryManager public immutable history;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    }

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

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

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

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

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

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

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

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

        // emit event
        emit RandomnessRequested(gameId);
    }

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

        // clear storage
        delete requestToGame[requestId];
    }

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

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

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

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

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

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

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

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

contract Claimer {

    address public parent;

    constructor() {
        // set parent to the address that deployed this contract
        parent = msg.sender;
    }

    function claim(address claimManager) external returns (uint256) {
        require(msg.sender == parent, "Only parent can call this function");

        // Call the claim function on the claim manager
        IClaimManager(claimManager).claim();

        // get amount
        uint256 amount = address(this).balance;

        // transfer the balance back to the parent
        (bool success, ) = payable(parent).call{value: amount}("");
        require(success, "Transfer failed");

        // return the amount transferred
        return amount;
    }

    receive() external payable {}
}

interface IHouseMaxPayout {
    function getMaxPayoutForGame(uint256 GAME_ID) external view returns (uint256);
}

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

    // Push Payout
    uint32 public constant PUSH_PAYOUT = 125_000; 

    // Guess Direction Enum
    enum GuessDirection { None, Lower, Higher, Push }

    // Card Payout Structure
    struct CardPayout {
        uint32 higher;
        uint32 lower;
    }

    // Payouts for each card
    mapping ( uint8 => CardPayout ) public cardPayouts;

    // fees
    uint256 public platformFee = 250;
    uint256 public jackpotFee  = 50;

    // number of consecutive rounds for jackpot
    uint256 public roundsForJackpot = 15;

    // current jackpot total value
    uint256 public jackpotTotal;

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

    struct RoundInfo {

        // the current card of this round
        uint8 startingCard;

        // the next card dealt
        uint8 nextCard;

        // 0 = not yet bet, 1 = lower, 2 = higher, 3 = push
        GuessDirection DIRECTION;

        // the amount bet on this round
        uint256 betAmount;

        // the payout of this round
        uint256 payout;
    }

    // Game Struct
    struct Game {

        // user playing the game
        address user;

        // all the rounds played in this game
        RoundInfo[] rounds;

        // total payout - 0 if user lost, set when user cashed out
        uint256 payout;

        // bet amount sub fees for each round
        uint256 amountForHouse;

        // true when the game is over, either by user cashing out or game ended
        bool hasEnded;

        // time the game was started
        uint256 timestamp;
    }

    // return type
    struct GameInfoReturnType {

        uint256 initialBetAmount; // initial bet amount
        uint256 payout; // total payout
        address user; // user playing the game
        bool hasEnded; // has the game ended
        uint256 timestamp; // timestamp of the game

        RoundInfo[] rounds; // all the rounds played in this game
    }

    // claimer
    Claimer public claimer;

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

    /// @notice emitted when the platform fee is changed
    event SetPlatformFee(uint256 newPlatformFee);

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

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

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

    constructor(

        // Game ID
        uint256 GAME_ID_,

        /** History Manager */
        address history_

    ) GameMasterclass(GAME_ID_, history_) {

        cardPayouts[2] = CardPayout({
            higher: 10_600, // 1.06x
            lower:  0
        });

        cardPayouts[3] = CardPayout({
            higher: 11363, // 1.1363x
            lower:  125000  // 12.5x
        });

        cardPayouts[4] = CardPayout({
            higher: 12500, // 1.25x
            lower:  62500  // 6.25x
        });

        cardPayouts[5] = CardPayout({
            higher: 13888, // 1.3888x
            lower:  41666  // 4.1666x
        });

        cardPayouts[6] = CardPayout({
            higher: 15625, // 1.5625x
            lower:  31250  // 3.125x
        });

        cardPayouts[7] = CardPayout({
            higher: 17857, // 1.7857x
            lower:  25000  // 2.5x
        });

        cardPayouts[8] = CardPayout({
            higher: 20833, // 2.0833x
            lower:  20833  // 2.0833x
        });

        cardPayouts[9] = CardPayout({
            higher: 25000, // 2.5x
            lower:  17857  // 1.7857x
        });

        cardPayouts[10] = CardPayout({
            higher: 31250, // 3.125x
            lower:  15625  // 1.5625x
        });

        // Jack
        cardPayouts[11] = CardPayout({
            higher: 41666, // 4.1666x
            lower:  13888  // 1.3888x
        });

        // Queen
        cardPayouts[12] = CardPayout({
            higher: 62500, // 6.25x
            lower:  12500  // 1.25x
        });

        // King
        cardPayouts[13] = CardPayout({
            higher: 125000, // 12.5x 
            lower:  11363   // 1.1363x
        });

        // Ace
        cardPayouts[14] = CardPayout({
            higher: 0, 
            lower: 10_600 // 1.06x
        });

        // set claimer
        claimer = new Claimer();
    }

    function setPlatformFees(uint256 newPlatformFee) external onlyOwner {
        require(
            newPlatformFee <= 500,
            'Cannot Exceed 5% Fee'
        );
        
        platformFee = newPlatformFee;
        emit SetPlatformFee(newPlatformFee);
    }

    function setJackpotFee(uint256 newJackpotFee) external onlyOwner {
        require(
            newJackpotFee <= 150,
            'Cannot Exceed 1.5% Fee'
        );
        
        jackpotFee = newJackpotFee;
    }

    function setRoundsForJackpot(uint256 newRoundsForJackpot) external onlyOwner {        
        roundsForJackpot = newRoundsForJackpot;
    }

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

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

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

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

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

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

        // take jackpot fee out of the buy in
        uint256 jackpotFeeAmount = (totalBetAmount * jackpotFee) / FEE_DENOM;

        // add to jackpot total
        unchecked {
            jackpotTotal += jackpotFeeAmount;
        }

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

        // pair gameId data
        games[gameId].user = player;
        games[gameId].hasEnded = false;
        games[gameId].timestamp = block.timestamp;
        games[gameId].amountForHouse = totalBetAmount - ( platformFeeAmount + jackpotFeeAmount ); // amount for house is total bet minus platform fee
        games[gameId].rounds.push(RoundInfo({
            startingCard: 0, // not set yet
            nextCard: 0, // not set yet
            DIRECTION: GuessDirection.None, // not set yet
            betAmount: totalBetAmount, // set bet amount
            payout: 0 // not set yet
        }));

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

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

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

    function makeGuess(
        uint256 gameId,
        GuessDirection direction, // 1 = lower, 2 = higher, 3 = push
        bytes32 userRandomWord
    ) external payable {
        require(
            msg.value == getVRFFee(),
            'ERR: INVALID FEE AMOUNT'
        );
        require(
            games[gameId].user == msg.sender,
            'ERR: NOT YOUR GAME'
        );
        require(
            games[gameId].hasEnded == false,
            'ERR: GAME HAS ENDED'
        );
        require(
            games[gameId].rounds.length > 0,
            'ERR: NO ROUNDS PLAYED YET'
        );
        require(
            direction == GuessDirection.Lower || direction == GuessDirection.Higher || direction == GuessDirection.Push,
            'ERR: INVALID DIRECTION'
        );
        uint256 roundId = games[gameId].rounds.length - 1;
        require(
            games[gameId].rounds[roundId].DIRECTION == GuessDirection.None,
            'ERR: ALREADY MADE A GUESS'
        );
        require(
            games[gameId].rounds[roundId].startingCard != 0,
            'ERR: NO STARTING CARD YET'
        );
        require(
            games[gameId].rounds[roundId].nextCard == 0,
            'Already received result'
        );
        if (games[gameId].rounds[roundId].startingCard == 2) {
            require(direction != GuessDirection.Lower, 'Cannot Go Lower Than 2');
        } else if (games[gameId].rounds[roundId].startingCard == 14) {
            require(direction != GuessDirection.Higher, 'Cannot Go Higher Than Ace');
        }

        // save direction bet
        games[gameId].rounds[roundId].DIRECTION = direction;

        // if not the first round
        if (roundId > 0) {

            // manage bet amount -- this is the next bet officially -- use the payout of the last round
            uint256 newBetAmount = games[gameId].rounds[roundId - 1].payout;

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

            // take jackpot fee out of the buy in
            uint256 jackpotFeeAmount = (newBetAmount * jackpotFee) / FEE_DENOM;

            // add to jackpot total
            unchecked {
                jackpotTotal += jackpotFeeAmount;
            }

            // send to platform receiver
            _processFee(platformFeeAmount, address(0), msg.sender);

            // update round bet amount             
            games[gameId].rounds[roundId].betAmount = newBetAmount;

            // save amount for house
            games[gameId].amountForHouse = newBetAmount - (platformFeeAmount + jackpotFeeAmount); 

            // register bet
            _registerBet(msg.sender, newBetAmount);
        }

        // request random number
        _requestRandom(gameId, 1, userRandomWord);
    }

    function cashOut(uint256 gameId) external {

        // check if game exists
        require(
            games[gameId].user == msg.sender,
            'ERR: NOT YOUR GAME'
        );

        // check if game has ended
        require(
            games[gameId].hasEnded == false,
            'ERR: GAME HAS ENDED'
        );
        require(
            games[gameId].rounds.length > 1,
            'Invalid Round'
        );

        // check if direction has been set
        uint256 roundId = games[gameId].rounds.length - 2;
        require(
            games[gameId].rounds[roundId + 1].DIRECTION == GuessDirection.None,
            'Direction already set'
        );
        require(
            games[gameId].rounds[roundId + 1].nextCard == 0,
            'Already received result'
        );

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

        // if the last round has a payout, we can cash out
        uint256 payout = games[gameId].rounds[roundId].payout;
        require(
            payout > 0,
            'ERR: NO PAYOUT'
        );

        require(
            address(this).balance >= payout,
            'ERR: NOT ENOUGH FUNDS TO PAYOUT'
        );

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

        // send payout to user
        IClaimManager(manager.claimManager()).credit{value: payout}(
            GAME_ID,
            games[gameId].user
        );
        
        // emit event
        emit GameEnded(games[gameId].user, gameId, games[gameId].rounds[0].betAmount, payout);
    }

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

        // fetch round ID
        uint256 roundId = games[gameId].rounds.length - 1;
        
        // if faulty ID, remove
        if (gameId == 0 || games[gameId].user == address(0) || games[gameId].hasEnded == true) {
            emit FulfilRandomFailed(requestId, gameId, randomWords);
            return;
        }
        
        // fetch card
        uint8 nextCard = uint8((randomWords[0] % 13) + 2); // 2-14
        uint8 startingCard = games[gameId].rounds[roundId].startingCard;

        if (roundId == 0 && startingCard == 0) {

            // set initial card
            games[gameId].rounds[roundId].startingCard = nextCard; // 2-14
            return;
        }

        // ensure a starting card has been set
        if (startingCard == 0 || games[gameId].rounds[roundId].DIRECTION == GuessDirection.None) {
            emit FulfilRandomFailed(requestId, gameId, randomWords);
            return;
        }

        // if we are here, we have a next card
        games[gameId].rounds[roundId].nextCard = nextCard; // 2-14


        // determine if the guess was correct
        if (games[gameId].rounds[roundId].DIRECTION == GuessDirection.Lower) {

            // lower
            if (nextCard < games[gameId].rounds[roundId].startingCard) {

                // correct guess
                games[gameId].rounds[roundId].payout = (games[gameId].rounds[roundId].betAmount * cardPayouts[startingCard].lower) / FEE_DENOM;

            }

        } else if (games[gameId].rounds[roundId].DIRECTION == GuessDirection.Higher) {

            // higher
            if (nextCard > games[gameId].rounds[roundId].startingCard) {

                // correct guess
                games[gameId].rounds[roundId].payout = (games[gameId].rounds[roundId].betAmount * cardPayouts[startingCard].higher) / FEE_DENOM;

            }

        } else if (games[gameId].rounds[roundId].DIRECTION == GuessDirection.Push) {

            // push
            if (nextCard == games[gameId].rounds[roundId].startingCard) {
                
                // correct guess
                games[gameId].rounds[roundId].payout = (games[gameId].rounds[roundId].betAmount * PUSH_PAYOUT) / FEE_DENOM;

            }
        
        }

        if (games[gameId].rounds[roundId].payout > 0) {
            
            if (games[gameId].rounds[roundId].payout > games[gameId].amountForHouse) {
                // get max house payout
                uint256 maxPayout = IHouseMaxPayout(manager.house()).getMaxPayoutForGame(GAME_ID);

                // user won, determine amount needed to payout
                uint256 diff = games[gameId].rounds[roundId].payout - games[gameId].amountForHouse;
                
                // if the payout is larger than the max payout, we need to handle it
                if (diff > maxPayout) {

                    // determine excess
                    uint256 excess = diff - maxPayout;

                    // reduce payout by excess
                    games[gameId].rounds[roundId].payout -= excess;

                    // handle midgame payout
                    uint256 amountOut = _handleMidgamePayout(maxPayout);

                    if (amountOut < maxPayout) {
                        // if the amount out is less than the max payout, we need to reduce the payout
                        games[gameId].rounds[roundId].payout -= (maxPayout - amountOut);
                    }

                } else {

                    // handle midgame payout
                    _handleMidgamePayout(diff);
                }
            }

            if (roundId == (roundsForJackpot - 1)) {

                // user got a portion of the jackpot, relative to his bet amount

                // TODO: Change this to a more complex jackpot system with checks and minimums and maximums
                uint256 jackpotAmount = getJackpotAmount(games[gameId].rounds[roundId].betAmount);

                // reset jackpot total
                jackpotTotal -= jackpotAmount;

                // add jackpot payout to the payout
                unchecked {
                    games[gameId].rounds[roundId].payout += jackpotAmount;
                }

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

                // if the last round has a payout, we can cash out
                uint256 payout = games[gameId].rounds[roundId].payout;

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

                // send payout to user
                IClaimManager(manager.claimManager()).credit{value: payout}(
                    GAME_ID,
                    games[gameId].user
                );
                
                // emit event
                emit GameEnded(games[gameId].user, gameId, games[gameId].rounds[0].betAmount, payout);

            } else {
                // set up for next round
                games[gameId].rounds.push(RoundInfo({
                    startingCard: nextCard, // set next card as starting card for next round
                    nextCard: 0, // not set yet
                    DIRECTION: GuessDirection.None, // not set yet
                    betAmount: 0, // same bet amount as previous round
                    payout: 0 // not set yet
                }));
            }

        } else {

            // game is over, user lost
            games[gameId].hasEnded = true;

            // emit Game Ended Event
            emit GameEnded(games[gameId].user, gameId, games[gameId].rounds[roundId].betAmount, 0);

            // handle payout
            IHouse(manager.house()).houseProfit{value: games[gameId].amountForHouse }(GAME_ID);
        }
    }

    function _handleMidgamePayout(uint256 amount) internal returns (uint256 amountOut) {

        if (amount > 0) {

            // payout the rest from the house
            IHouse(manager.house()).payout(GAME_ID, address(claimer), amount);

            // claim from claim manager
            amountOut = claimer.claim(manager.claimManager());
        }
    }

    function getJackpotAmount(uint256 betAmount) public view returns (uint256) {
        uint256 maxHousePayout = IHouseMaxPayout(manager.house()).getMaxPayoutForGame(GAME_ID);

        if (betAmount >= maxHousePayout) {
            return jackpotTotal;
        } else {
            // calculate jackpot amount relative to bet amount
            return ( jackpotTotal * betAmount ) / maxHousePayout;
        }
    }

    function getGameInfo(uint256 _gameId) public view returns (
        GameInfoReturnType memory
    ) {
        if (games[_gameId].rounds.length == 0) {
            return GameInfoReturnType({
                initialBetAmount: 0,
                payout: 0,
                user: address(0),
                hasEnded: false,
                timestamp: 0,
                rounds: new RoundInfo[](0)
            });
        }

        return GameInfoReturnType({
            initialBetAmount: games[_gameId].rounds[0].betAmount, // first round bet amount
            payout: games[_gameId].payout,
            user: games[_gameId].user,
            hasEnded: games[_gameId].hasEnded,
            timestamp: games[_gameId].timestamp,
            rounds: games[_gameId].rounds
        });
    }

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

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

        for (uint i = 0; i < len;) {
            players[i] = games[gameIds[i]].user;
            uint256 rounds = games[gameIds[i]].rounds.length;
            if (rounds == 0) {
                buyInAmounts[i] = 0;
                totalPayouts[i] = 0;
                timestamps[i] = 0;
                hasEndeds[i] = false;
            } else {
                buyInAmounts[i] = games[gameIds[i]].rounds[0].betAmount; // first round bet amount
                totalPayouts[i] = games[gameIds[i]].payout; // total payout
                timestamps[i] = games[gameIds[i]].timestamp; // timestamp of the game
                hasEndeds[i] = games[gameIds[i]].hasEnded; // has the game ended?
            }
            unchecked { ++i; }
        }
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"GAME_ID_","type":"uint256"},{"internalType":"address","name":"history_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"FulfilRandomFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"GameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"GameStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"RandomnessRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPlatformFee","type":"uint256"}],"name":"SetPlatformFee","type":"event"},{"inputs":[],"name":"GAME_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUSH_PAYOUT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchCallIsUsedGameId","outputs":[{"internalType":"bool[]","name":"isUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchRawGameInfo","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"cardPayouts","outputs":[{"internalType":"uint32","name":"higher","type":"uint32"},{"internalType":"uint32","name":"lower","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"cashOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimer","outputs":[{"internalType":"contract Claimer","name":"","type":"address"}],"stateMutability":"view","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":"user","type":"address"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"amountForHouse","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":"uint256","name":"initialBetAmount","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"components":[{"internalType":"uint8","name":"startingCard","type":"uint8"},{"internalType":"uint8","name":"nextCard","type":"uint8"},{"internalType":"enum HighLow.GuessDirection","name":"DIRECTION","type":"uint8"},{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"}],"internalType":"struct HighLow.RoundInfo[]","name":"rounds","type":"tuple[]"}],"internalType":"struct HighLow.GameInfoReturnType","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHouse","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betAmount","type":"uint256"}],"name":"getJackpotAmount","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":"jackpotFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"},{"internalType":"enum HighLow.GuessDirection","name":"direction","type":"uint8"},{"internalType":"bytes32","name":"userRandomWord","type":"bytes32"}],"name":"makeGuess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IGovernanceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numUsedGameIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"paginateUsedGameIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roundsForJackpot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newJackpotFee","type":"uint256"}],"name":"setJackpotFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPlatformFee","type":"uint256"}],"name":"setPlatformFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRoundsForJackpot","type":"uint256"}],"name":"setRoundsForJackpot","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"}]

60c06040526000805460ff1916905560fa6005556032600655600f60075534801561002957600080fd5b50604051615234380380615234833981016040819052610048916107f5565b81818160808181525050806001600160a01b031660a0816001600160a01b0316815250505050604051806040016040528061296863ffffffff168152602001600063ffffffff1681525060046000600260ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060400160405280612c6363ffffffff1681526020016201e84863ffffffff1681525060046000600360ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555090505060405180604001604052806130d463ffffffff16815260200161f42463ffffffff1681525060046000600460ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff160217905550905050604051806040016040528061364063ffffffff16815260200161a2c263ffffffff1681525060046000600560ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060400160405280613d0963ffffffff168152602001617a1263ffffffff1681525060046000600660ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555090505060405180604001604052806145c163ffffffff1681526020016161a863ffffffff1681525060046000600760ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff160217905550905050604051806040016040528061516163ffffffff16815260200161516163ffffffff1681525060046000600860ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555090505060405180604001604052806161a863ffffffff1681526020016145c163ffffffff1681525060046000600960ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060400160405280617a1263ffffffff168152602001613d0963ffffffff1681525060046000600a60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff160217905550905050604051806040016040528061a2c263ffffffff16815260200161364063ffffffff1681525060046000600b60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff160217905550905050604051806040016040528061f42463ffffffff1681526020016130d463ffffffff1681525060046000600c60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555090505060405180604001604052806201e84863ffffffff168152602001612c6363ffffffff1681525060046000600d60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060400160405280600063ffffffff16815260200161296863ffffffff1681525060046000600e60ff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff1602179055509050506040516107a3906107e8565b604051809103906000f0801580156107bf573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b0392909216919091179055506108329050565b61029780614f9d83390190565b6000806040838503121561080857600080fd5b825160208401519092506001600160a01b038116811461082757600080fd5b809150509250929050565b60805160a051614707610896600039600081816105ad0152613ef20152600081816107070152818161183e015281816120d20152818161241c015281816126fd01528181613202015281816134f50152818161392d0152613ec501526147076000f3fe6080604052600436106101fd5760003560e01c806379caee8c1161010d578063c811ad71116100a0578063e98744361161006f578063e987443614610688578063eaa182861461069e578063f0034a7e146106ca578063f8f30a79146106df578063fdcdb06b146106f557600080fd5b8063c811ad7114610620578063cb37e4b614610633578063cc81d05514610653578063d379be231461066857600080fd5b806391ea41e6116100dc57806391ea41e61461056e57806398daac831461059b5780639e281a98146105cf578063c4fd5d6d146105ef57600080fd5b806379caee8c146104ec5780637b8d38791461050c5780638456cb591461053957806389fc2c0f1461054e57600080fd5b806346d369bc116101905780634b24f3a61161015f5780634b24f3a61461044257806351e92559146104625780635c7b79f5146104925780635c975abb146104b2578063749fa03c146104cc57600080fd5b806346d369bc146103c05780634782f779146103d357806347e1d550146103f3578063481c6a751461042057600080fd5b80631ea9487b116101cc5780631ea9487b14610301578063247939e71461032157806326232a2e1461037d57806332883e7e1461039357600080fd5b8063046f7da21461020957806304e2064f14610220578063117a5b90146102525780631da709f4146102dd57600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e610729565b005b34801561022c57600080fd5b506102356107de565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025e57600080fd5b506102a961026d366004613f9a565b600a60205260009081526040902080546002820154600383015460048401546005909401546001600160a01b03909316939192909160ff169085565b604080516001600160a01b03909616865260208601949094529284019190915215156060830152608082015260a001610249565b3480156102e957600080fd5b506102f360085481565b604051908152602001610249565b34801561030d57600080fd5b5061021e61031c366004613f9a565b610855565b34801561032d57600080fd5b5061036061033c366004613fb3565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff938416815292909116602083015201610249565b34801561038957600080fd5b506102f360055481565b34801561039f57600080fd5b506103b36103ae366004613fd6565b6108fa565b6040516102499190614034565b61021e6103ce366004614047565b6109be565b3480156103df57600080fd5b5061021e6103ee36600461409b565b61102c565b3480156103ff57600080fd5b5061041361040e366004613f9a565b611131565b60405161024991906140dd565b34801561042c57600080fd5b506102356000805160206146b283398151915281565b34801561044e57600080fd5b5061021e61045d366004613f9a565b611365565b34801561046e57600080fd5b5061048261047d366004613f9a565b611454565b6040519015158152602001610249565b34801561049e57600080fd5b5061021e6104ad366004613f9a565b611474565b3480156104be57600080fd5b506000546104829060ff1681565b3480156104d857600080fd5b5061021e6104e7366004614221565b61193c565b3480156104f857600080fd5b5061021e610507366004613f9a565b612774565b34801561051857600080fd5b5061052c610527366004614275565b612898565b60405161024991906142ea565b34801561054557600080fd5b5061021e612955565b34801561055a57600080fd5b506102f3610569366004613f9a565b612a04565b34801561057a57600080fd5b5061058e610589366004614275565b612a25565b6040516102499190614321565b3480156105a757600080fd5b506102357f000000000000000000000000000000000000000000000000000000000000000081565b3480156105db57600080fd5b5061021e6105ea36600461409b565b612af1565b3480156105fb57600080fd5b5061060f61060a366004614275565b612ba0565b6040516102499594939291906143a1565b61021e61062e366004614441565b612fbf565b34801561063f57600080fd5b506102f361064e366004613f9a565b613180565b34801561065f57600080fd5b506001546102f3565b34801561067457600080fd5b50600954610235906001600160a01b031681565b34801561069457600080fd5b506102f360065481565b3480156106aa57600080fd5b506106b56201e84881565b60405163ffffffff9091168152602001610249565b3480156106d657600080fd5b506102f36132b0565b3480156106eb57600080fd5b506102f360075481565b34801561070157600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000081565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610775573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079991906144c6565b6001600160a01b0316336001600160a01b0316146107d25760405162461bcd60e51b81526004016107c9906144e3565b60405180910390fd5b6000805460ff19169055565b60006000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561082c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085091906144c6565b905090565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c591906144c6565b6001600160a01b0316336001600160a01b0316146108f55760405162461bcd60e51b81526004016107c9906144e3565b600755565b60015460609082111561090d5760015491505b6000610919848461451d565b6001600160401b0381111561093057610930614530565b604051908082528060200260200182016040528015610959578160200160208202803683370190505b509050835b838110156109b4576001818154811061097957610979614546565b9060005260206000200154828683610991919061451d565b815181106109a1576109a1614546565b602090810291909101015260010161095e565b5090505b92915050565b6109c66132b0565b3414610a145760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c49442046454520414d4f554e5400000000000000000060448201526064016107c9565b6000838152600a60205260409020546001600160a01b03163314610a6f5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107c9565b6000838152600a602052604090206004015460ff1615610ac75760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107c9565b6000838152600a6020526040902060010154610b255760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f20524f554e445320504c41594544205945540000000000000060448201526064016107c9565b6001826003811115610b3957610b396140c7565b1480610b5657506002826003811115610b5457610b546140c7565b145b80610b7257506003826003811115610b7057610b706140c7565b145b610bb75760405162461bcd60e51b815260206004820152601660248201527522a9291d1024a72b20a624a2102224a922a1aa24a7a760511b60448201526064016107c9565b6000838152600a60205260408120600190810154610bd5919061451d565b9050600080858152600a60205260409020600101805483908110610bfb57610bfb614546565b600091825260209091206003918202015462010000900460ff1690811115610c2557610c256140c7565b14610c725760405162461bcd60e51b815260206004820152601960248201527f4552523a20414c5245414459204d41444520412047554553530000000000000060448201526064016107c9565b6000848152600a60205260409020600101805482908110610c9557610c95614546565b6000918252602082206003909102015460ff169003610cf65760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f205354415254494e472043415244205945540000000000000060448201526064016107c9565b6000848152600a60205260409020600101805482908110610d1957610d19614546565b6000918252602090912060039091020154610100900460ff1615610d795760405162461bcd60e51b8152602060048201526017602482015276105b1c9958591e481c9958d95a5d9959081c995cdd5b1d604a1b60448201526064016107c9565b6000848152600a60205260409020600101805482908110610d9c57610d9c614546565b600091825260209091206003909102015460ff16600203610e16576001836003811115610dcb57610dcb6140c7565b03610e115760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba1023b7902637bbb2b9102a3430b7101960511b60448201526064016107c9565b610eb5565b6000848152600a60205260409020600101805482908110610e3957610e39614546565b600091825260209091206003909102015460ff16600e03610eb5576002836003811115610e6857610e686140c7565b03610eb55760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420476f20486967686572205468616e204163650000000000000060448201526064016107c9565b6000848152600a60205260409020600101805484919083908110610edb57610edb614546565b906000526020600020906003020160000160026101000a81548160ff02191690836003811115610f0d57610f0d6140c7565b0217905550801561101a576000848152600a60205260408120600190810190610f36908461451d565b81548110610f4657610f46614546565b9060005260206000209060030201600201549050600061271060055483610f6d919061455c565b610f779190614589565b9050600061271060065484610f8c919061455c565b610f969190614589565b60088054820190559050610fac82600033613383565b6000878152600a60205260409020600101805484919086908110610fd257610fd2614546565b6000918252602090912060016003909202010155610ff0818361459d565b610ffa908461451d565b6000888152600a6020526040902060030155611016338461345f565b5050505b6110268460018461355d565b50505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109c91906144c6565b6001600160a01b0316336001600160a01b0316146110cc5760405162461bcd60e51b81526004016107c9906144e3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611119576040519150601f19603f3d011682016040523d82523d6000602084013e61111e565b606091505b505090508061112c57600080fd5b505050565b6111756040518060c00160405280600081526020016000815260200160006001600160a01b0316815260200160001515815260200160008152602001606081525090565b6000828152600a6020526040812060010154900361121d576040805160c0810182526000808252602080830182905282840182905260608301829052608083018290528351828152908101909352909160a0830191611214565b6112016040805160a0810182526000808252602082018190529091820190815260200160008152602001600081525090565b8152602001906001900390816111cf5790505b50905292915050565b6040805160c0810182526000848152600a60205291822060010180549192839261124957611249614546565b6000918252602080832060016003909302018201548452868352600a808252604080852060028101548785015280546001600160a01b031682880152600481015460ff1615156060880152600581015460808801528986529183529201805483518184028101840190945280845260a090950194929390929184015b828210156113595760008481526020908190206040805160a0810182526003808702909301805460ff808216845261010082048116968401969096529194909392850192620100009092041690811115611321576113216140c7565b6003811115611332576113326140c7565b815260200160018201548152602001600282015481525050815260200190600101906112c5565b50505091525092915050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d591906144c6565b6001600160a01b0316336001600160a01b0316146114055760405162461bcd60e51b81526004016107c9906144e3565b609681111561144f5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742045786365656420312e35252046656560501b60448201526064016107c9565b600655565b60008181526002602052604081205460ff161580156109b8575050151590565b6000818152600a60205260409020546001600160a01b031633146114cf5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107c9565b6000818152600a602052604090206004015460ff16156115275760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107c9565b6000818152600a60205260409020600190810154116115785760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908149bdd5b99609a1b60448201526064016107c9565b6000818152600a60205260408120600101546115969060029061451d565b9050600080838152600a602052604090206001908101906115b890849061459d565b815481106115c8576115c8614546565b600091825260209091206003918202015462010000900460ff16908111156115f2576115f26140c7565b146116375760405162461bcd60e51b8152602060048201526015602482015274111a5c9958dd1a5bdb88185b1c9958591e481cd95d605a1b60448201526064016107c9565b6000828152600a6020526040902060019081019061165690839061459d565b8154811061166657611666614546565b6000918252602090912060039091020154610100900460ff16156116c65760405162461bcd60e51b8152602060048201526017602482015276105b1c9958591e481c9958d95a5d9959081c995cdd5b1d604a1b60448201526064016107c9565b6000828152600a6020526040812060048101805460ff19166001908117909155018054839081106116f9576116f9614546565b90600052602060002090600302016002015490506000811161174e5760405162461bcd60e51b815260206004820152600e60248201526d1154948e881393c814105653d55560921b60448201526064016107c9565b8047101561179e5760405162461bcd60e51b815260206004820152601f60248201527f4552523a204e4f5420454e4f5547482046554e445320544f205041594f55540060448201526064016107c9565b6000838152600a6020908152604091829020600201839055815163a9a36dcd60e01b815291516000805160206146b28339815191529263a9a36dcd9260048083019391928290030181865afa1580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f91906144c6565b6000848152600a6020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b5050506000858152600a602052604081208054600190910180546001600160a01b0390921694507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae893508792909161190757611907614546565b6000918252602091829020600160039092020101546040805193845291830152810184905260600160405180910390a2505050565b6000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac91906144c6565b6001600160a01b0316336001600160a01b031614611a005760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107c9565b6001600160401b038316600090815260036020526040902054611a22846137c7565b6000818152600a60205260408120600190810154611a40919061451d565b9050811580611a6457506000828152600a60205260409020546001600160a01b0316155b80611a8557506000828152600a602052604090206004015460ff1615156001145b15611ace577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a585838686604051611abf94939291906145b0565b60405180910390a15050505050565b6000600d85856000818110611ae557611ae5614546565b90506020020135611af69190614602565b611b0190600261459d565b6000848152600a602052604081206001018054929350909184908110611b2957611b29614546565b600091825260209091206003909102015460ff16905082158015611b4e575060ff8116155b15611ba4576000848152600a60205260409020600101805483919085908110611b7957611b79614546565b60009182526020909120600390910201805460ff191660ff9290921691909117905550505050505050565b60ff81161580611bfe57506000848152600a60205260408120600101805485908110611bd257611bd2614546565b600091825260209091206003918202015462010000900460ff1690811115611bfc57611bfc6140c7565b145b15611c49577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a587858888604051611c3894939291906145b0565b60405180910390a150505050505050565b6000848152600a60205260409020600101805483919085908110611c6f57611c6f614546565b60009182526020909120600390910201805460ff929092166101000261ff001990921691909117905560016000858152600a60205260409020600101805485908110611cbd57611cbd614546565b600091825260209091206003918202015462010000900460ff1690811115611ce757611ce76140c7565b03611ddc576000848152600a60205260409020600101805484908110611d0f57611d0f614546565b600091825260209091206003909102015460ff9081169083161015611dd75760ff8116600090815260046020908152604080832054878452600a909252909120600101805461271092640100000000900463ffffffff16919086908110611d7857611d78614546565b906000526020600020906003020160010154611d94919061455c565b611d9e9190614589565b6000858152600a60205260409020600101805485908110611dc157611dc1614546565b9060005260206000209060030201600201819055505b611fd4565b60026000858152600a60205260409020600101805485908110611e0157611e01614546565b600091825260209091206003918202015462010000900460ff1690811115611e2b57611e2b6140c7565b03611eb4576000848152600a60205260409020600101805484908110611e5357611e53614546565b600091825260209091206003909102015460ff9081169083161115611dd75760ff8116600090815260046020908152604080832054878452600a90925290912060010180546127109263ffffffff16919086908110611d7857611d78614546565b60036000858152600a60205260409020600101805485908110611ed957611ed9614546565b600091825260209091206003918202015462010000900460ff1690811115611f0357611f036140c7565b03611fd4576000848152600a60205260409020600101805484908110611f2b57611f2b614546565b600091825260209091206003909102015460ff90811690831603611fd4576000848152600a602052604090206001018054612710916201e8489186908110611f7557611f75614546565b906000526020600020906003020160010154611f91919061455c565b611f9b9190614589565b6000858152600a60205260409020600101805485908110611fbe57611fbe614546565b9060005260206000209060030201600201819055505b6000848152600a60205260408120600101805485908110611ff757611ff7614546565b90600052602060002090600302016002015411156125d5576000848152600a602052604090206003810154600190910180548590811061203957612039614546565b906000526020600020906003020160020154111561227c5760006000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c391906144c6565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015612129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214d9190614616565b6000868152600a6020526040812060038101546001909101805493945091929091908790811061217f5761217f614546565b90600052602060002090600302016002015461219b919061451d565b90508181111561226e5760006121b1838361451d565b6000888152600a6020526040902060010180549192508291889081106121d9576121d9614546565b906000526020600020906003020160020160008282546121f9919061451d565b909155506000905061220a846138a3565b9050838110156122675761221e818561451d565b6000898152600a6020526040902060010180548990811061224157612241614546565b90600052602060002090600302016002016000828254612261919061451d565b90915550505b5050612279565b612277816138a3565b505b50505b600160075461228b919061451d565b830361251c576000848152600a6020526040812060010180546122d09190869081106122b9576122b9614546565b906000526020600020906003020160010154613180565b905080600860008282546122e4919061451d565b90915550506000858152600a6020526040902060010180548291908690811061230f5761230f614546565b600091825260208083206002600390930201919091018054909301909255868152600a9091526040812060048101805460ff191660019081179091550180548690811061235e5761235e614546565b906000526020600020906003020160020154905080600a6000888152602001908152602001600020600201819055506000805160206146b28339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd91906144c6565b6000878152600a6020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561247757600080fd5b505af115801561248b573d6000803e3d6000fd5b5050506000888152600a602052604081208054600190910180546001600160a01b0390921694507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae893508a9290916124e5576124e5614546565b6000918252602091829020600160039092020101546040805193845291830152810184905260600160405180910390a2505061276b565b6000848152600a60209081526040808320815160a08101835260ff87811682528185018681529382018681526060830187905260808301879052600193840180549485018155875294909520815160039384029091018054945187166101000261ffff199095169190961617929092178085559251919392839162ff00001990911690620100009084908111156125b5576125b56140c7565b02179055506060820151816001015560808201518160020155505061276b565b6000848152600a6020526040902060048101805460ff191660019081179091558154910180546001600160a01b03909216917fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89187918790811061263b5761263b614546565b6000918252602080832060016003909302019190910154604080519485529184015282015260600160405180910390a26000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126db91906144c6565b6000858152600a6020526040908190206003015490516359e5b78d60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03929092169163b3cb6f1a91906024016000604051808303818588803b15801561275157600080fd5b505af1158015612765573d6000803e3d6000fd5b50505050505b50505050505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e491906144c6565b6001600160a01b0316336001600160a01b0316146128145760405162461bcd60e51b81526004016107c9906144e3565b6101f481111561285d5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74204578636565642035252046656560601b60448201526064016107c9565b60058190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b606081806001600160401b038111156128b3576128b3614530565b6040519080825280602002602001820160405280156128dc578160200160208202803683370190505b50915060005b8181101561294d576002600086868481811061290057612900614546565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061293557612935614546565b911515602092830291909101909101526001016128e2565b505092915050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c591906144c6565b6001600160a01b0316336001600160a01b0316146129f55760405162461bcd60e51b81526004016107c9906144e3565b6000805460ff19166001179055565b60018181548110612a1457600080fd5b600091825260209091200154905081565b6060816000816001600160401b03811115612a4257612a42614530565b604051908082528060200260200182016040528015612a7557816020015b6060815260200190600190039081612a605790505b50905060005b82811015612ae857612aa4868683818110612a9857612a98614546565b90506020020135611131565b604051602001612ab491906140dd565b604051602081830303815290604052828281518110612ad557612ad5614546565b6020908102919091010152600101612a7b565b50949350505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6191906144c6565b6001600160a01b0316336001600160a01b031614612b915760405162461bcd60e51b81526004016107c9906144e3565b612b9c823383613aa9565b5050565b60608080808085806001600160401b03811115612bbf57612bbf614530565b604051908082528060200260200182016040528015612be8578160200160208202803683370190505b509550806001600160401b03811115612c0357612c03614530565b604051908082528060200260200182016040528015612c2c578160200160208202803683370190505b509450806001600160401b03811115612c4757612c47614530565b604051908082528060200260200182016040528015612c70578160200160208202803683370190505b509350806001600160401b03811115612c8b57612c8b614530565b604051908082528060200260200182016040528015612cb4578160200160208202803683370190505b509250806001600160401b03811115612ccf57612ccf614530565b604051908082528060200260200182016040528015612cf8578160200160208202803683370190505b50915060005b81811015612fb357600a60008a8a84818110612d1c57612d1c614546565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b0316878281518110612d5a57612d5a614546565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600a60008b8b85818110612d9257612d92614546565b90506020020135815260200190815260200160002060010180549050905080600003612e41576000878381518110612dcc57612dcc614546565b6020026020010181815250506000868381518110612dec57612dec614546565b6020026020010181815250506000858381518110612e0c57612e0c614546565b6020026020010181815250506000848381518110612e2c57612e2c614546565b91151560209283029190910190910152612faa565b600a60008b8b85818110612e5757612e57614546565b905060200201358152602001908152602001600020600101600081548110612e8157612e81614546565b906000526020600020906003020160010154878381518110612ea557612ea5614546565b602002602001018181525050600a60008b8b85818110612ec757612ec7614546565b90506020020135815260200190815260200160002060020154868381518110612ef257612ef2614546565b602002602001018181525050600a60008b8b85818110612f1457612f14614546565b90506020020135815260200190815260200160002060050154858381518110612f3f57612f3f614546565b602002602001018181525050600a60008b8b85818110612f6157612f61614546565b90506020020135815260200190815260200160002060040160009054906101000a900460ff16848381518110612f9957612f99614546565b911515602092830291909101909101525b50600101612cfe565b50509295509295909350565b826001600160a01b038116331461308957604051636d6d50a160e11b81523360048201526000805160206146b28339815191529063dadaa14290602401602060405180830381865afa158015613019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303d919061462f565b6130895760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107c9565b6000805160206146b28339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f9919061462f565b156131395760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107c9565b60005460ff16156131755760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107c9565b611026848484613bda565b6000806000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f391906144c6565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015613259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327d9190614616565b9050808310613290575050600854919050565b808360085461329f919061455c565b6132a99190614589565b9392505050565b60006000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332291906144c6565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561335f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108509190614616565b6000805160206146b28339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f391906144c6565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e59085906044016000604051808303818588803b15801561344157600080fd5b505af1158015613455573d6000803e3d6000fd5b5050505050505050565b6000805160206146b28339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134cf91906144c6565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000006044830152919091169063eb3d9bea90606401600060405180830381600087803b15801561354157600080fd5b505af1158015613555573d6000803e3d6000fd5b505050505050565b60006000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cf91906144c6565b6001600160a01b03166397cca7af6135e56132b0565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af115801561362a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061364f9190614651565b6001600160401b038116600090815260036020526040902054909150156136ab5760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107c9565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b0319815291516000805160206146b28339815191529263ff9b3acf9260048083019391928290030181865afa158015613712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373691906144c6565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561377057600080fd5b505af1158015613784573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d45846040516137b991815260200190565b60405180910390a150505050565b6000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613813573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383791906144c6565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387157600080fd5b505af1158015613885573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b60008115613aa4576000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391b91906144c6565b60095460405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0391821660248201526044810185905291169063ae2f5d9390606401600060405180830381600087803b15801561398e57600080fd5b505af11580156139a2573d6000803e3d6000fd5b50505050600960009054906101000a90046001600160a01b03166001600160a01b0316631e83409a6000805160206146b28339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3a91906144c6565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015613a80573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190614616565b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613b05919061466e565b6000604051808303816000865af19150503d8060008114613b42576040519150601f19603f3d011682016040523d82523d6000602084013e613b47565b606091505b5091509150818015613b71575080511580613b71575080806020019051810190613b71919061462f565b613bd35760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107c9565b5050505050565b6000613be46132b0565b905060008080613bf68587018761468a565b92509250925083341015613c3e5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107c9565b613c4783611454565b1515600114613c8a5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b60448201526064016107c9565b6000613c96853461451d565b905060008111613cdd5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b60448201526064016107c9565b600061271060055483613cf0919061455c565b613cfa9190614589565b9050600061271060065484613d0f919061455c565b613d199190614589565b60088054820190559050613d2e82868c613383565b6000868152600a6020526040902080546001600160a01b0319166001600160a01b038c1617815560048101805460ff1916905542600590910155613d72818361459d565b613d7c908461451d565b6000878152600a60209081526040808320600380820195909555815160a081018352848152808401858152928101858152606082018a9052608082018690526001928301805493840181558652939094208451918602018054925160ff9081166101000261ffff199094169216919091179190911780825591519293909291839162ff0000199091169062010000908490811115613e1c57613e1c6140c7565b021790555060608201518160010155608082015181600201555050613e418a87613ea6565b613e4b8a8461345f565b896001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c787604051613e8691815260200190565b60405180910390a2613e9a8660018661355d565b50505050505050505050565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690639a4918c190606401600060405180830381600087803b158015613f3657600080fd5b505af1158015613f4a573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b600060208284031215613fac57600080fd5b5035919050565b600060208284031215613fc557600080fd5b813560ff811681146132a957600080fd5b60008060408385031215613fe957600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561402a57815186526020958601959091019060010161400c565b5093949350505050565b6020815260006132a96020830184613ff8565b60008060006060848603121561405c57600080fd5b8335925060208401356004811061407257600080fd5b929592945050506040919091013590565b6001600160a01b038116811461409857600080fd5b50565b600080604083850312156140ae57600080fd5b82356140b981614083565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60208152600060e08201835160208401526020840151604084015260018060a01b036040850151166060840152606084015115156080840152608084015160a084015260a084015160c08085015281815180845261010086019150602083019350600092505b808310156141b757835160ff815116835260ff602082015116602084015260408101516004811061418457634e487b7160e01b600052602160045260246000fd5b8060408501525060608101516060840152608081015160808401525060a082019150602084019350600183019250614143565b5095945050505050565b6001600160401b038116811461409857600080fd5b60008083601f8401126141e857600080fd5b5081356001600160401b038111156141ff57600080fd5b6020830191508360208260051b850101111561421a57600080fd5b9250929050565b60008060006040848603121561423657600080fd5b8335614241816141c1565b925060208401356001600160401b0381111561425c57600080fd5b614268868287016141d6565b9497909650939450505050565b6000806020838503121561428857600080fd5b82356001600160401b0381111561429e57600080fd5b6142aa858286016141d6565b90969095509350505050565b600081518084526020840193506020830160005b8281101561402a57815115158652602095860195909101906001016142ca565b6020815260006132a960208301846142b6565b60005b83811015614318578181015183820152602001614300565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561439557603f19878603018452815180518087526143728160208901602085016142fd565b601f01601f19169590950160209081019550938401939190910190600101614349565b50929695505050505050565b60a08082528651908201819052600090602088019060c0840190835b818110156143e45783516001600160a01b03168352602093840193909201916001016143bd565b505083810360208501526143f88189613ff8565b915050828103604084015261440d8187613ff8565b905082810360608401526144218186613ff8565b9050828103608084015261443581856142b6565b98975050505050505050565b60008060006040848603121561445657600080fd5b833561446181614083565b925060208401356001600160401b0381111561447c57600080fd5b8401601f8101861361448d57600080fd5b80356001600160401b038111156144a357600080fd5b8660208284010111156144b557600080fd5b939660209190910195509293505050565b6000602082840312156144d857600080fd5b81516132a981614083565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156109b8576109b8614507565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176109b8576109b8614507565b634e487b7160e01b600052601260045260246000fd5b60008261459857614598614573565b500490565b808201808211156109b8576109b8614507565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156145e757600080fd5b8260051b808560808501379190910160800195945050505050565b60008261461157614611614573565b500690565b60006020828403121561462857600080fd5b5051919050565b60006020828403121561464157600080fd5b815180151581146132a957600080fd5b60006020828403121561466357600080fd5b81516132a9816141c1565b600082516146808184602087016142fd565b9190910192915050565b60008060006060848603121561469f57600080fd5b8335925060208401356140728161408356fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220c89e4ac6727b7a3b3636ca3648815b8fd45a93c1d556174a1de9420379ba151964736f6c634300081c00336080604052348015600f57600080fd5b50600080546001600160a01b03191633179055610266806100316000396000f3fe60806040526004361061002d5760003560e01c80631e83409a1461003957806360f96a8f1461006c57600080fd5b3661003457005b600080fd5b34801561004557600080fd5b50610059610054366004610200565b6100a4565b6040519081526020015b60405180910390f35b34801561007857600080fd5b5060005461008c906001600160a01b031681565b6040516001600160a01b039091168152602001610063565b600080546001600160a01b0316331461010f5760405162461bcd60e51b815260206004820152602260248201527f4f6e6c7920706172656e742063616e2063616c6c20746869732066756e63746960448201526137b760f11b60648201526084015b60405180910390fd5b816001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561014a57600080fd5b505af115801561015e573d6000803e3d6000fd5b5050600080546040514794509192506001600160a01b03169083908381818185875af1925050503d80600081146101b1576040519150601f19603f3d011682016040523d82523d6000602084013e6101b6565b606091505b50509050806101f95760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610106565b5092915050565b60006020828403121561021257600080fd5b81356001600160a01b038116811461022957600080fd5b939250505056fea264697066735822122018624476a6721dc7d7cd3622d89d7486429f953f6ab06d1bdff0137bf2f166d964736f6c634300081c00330000000000000000000000000000000000000000000000000000000000000007000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c806379caee8c1161010d578063c811ad71116100a0578063e98744361161006f578063e987443614610688578063eaa182861461069e578063f0034a7e146106ca578063f8f30a79146106df578063fdcdb06b146106f557600080fd5b8063c811ad7114610620578063cb37e4b614610633578063cc81d05514610653578063d379be231461066857600080fd5b806391ea41e6116100dc57806391ea41e61461056e57806398daac831461059b5780639e281a98146105cf578063c4fd5d6d146105ef57600080fd5b806379caee8c146104ec5780637b8d38791461050c5780638456cb591461053957806389fc2c0f1461054e57600080fd5b806346d369bc116101905780634b24f3a61161015f5780634b24f3a61461044257806351e92559146104625780635c7b79f5146104925780635c975abb146104b2578063749fa03c146104cc57600080fd5b806346d369bc146103c05780634782f779146103d357806347e1d550146103f3578063481c6a751461042057600080fd5b80631ea9487b116101cc5780631ea9487b14610301578063247939e71461032157806326232a2e1461037d57806332883e7e1461039357600080fd5b8063046f7da21461020957806304e2064f14610220578063117a5b90146102525780631da709f4146102dd57600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e610729565b005b34801561022c57600080fd5b506102356107de565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025e57600080fd5b506102a961026d366004613f9a565b600a60205260009081526040902080546002820154600383015460048401546005909401546001600160a01b03909316939192909160ff169085565b604080516001600160a01b03909616865260208601949094529284019190915215156060830152608082015260a001610249565b3480156102e957600080fd5b506102f360085481565b604051908152602001610249565b34801561030d57600080fd5b5061021e61031c366004613f9a565b610855565b34801561032d57600080fd5b5061036061033c366004613fb3565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff938416815292909116602083015201610249565b34801561038957600080fd5b506102f360055481565b34801561039f57600080fd5b506103b36103ae366004613fd6565b6108fa565b6040516102499190614034565b61021e6103ce366004614047565b6109be565b3480156103df57600080fd5b5061021e6103ee36600461409b565b61102c565b3480156103ff57600080fd5b5061041361040e366004613f9a565b611131565b60405161024991906140dd565b34801561042c57600080fd5b506102356000805160206146b283398151915281565b34801561044e57600080fd5b5061021e61045d366004613f9a565b611365565b34801561046e57600080fd5b5061048261047d366004613f9a565b611454565b6040519015158152602001610249565b34801561049e57600080fd5b5061021e6104ad366004613f9a565b611474565b3480156104be57600080fd5b506000546104829060ff1681565b3480156104d857600080fd5b5061021e6104e7366004614221565b61193c565b3480156104f857600080fd5b5061021e610507366004613f9a565b612774565b34801561051857600080fd5b5061052c610527366004614275565b612898565b60405161024991906142ea565b34801561054557600080fd5b5061021e612955565b34801561055a57600080fd5b506102f3610569366004613f9a565b612a04565b34801561057a57600080fd5b5061058e610589366004614275565b612a25565b6040516102499190614321565b3480156105a757600080fd5b506102357f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa81565b3480156105db57600080fd5b5061021e6105ea36600461409b565b612af1565b3480156105fb57600080fd5b5061060f61060a366004614275565b612ba0565b6040516102499594939291906143a1565b61021e61062e366004614441565b612fbf565b34801561063f57600080fd5b506102f361064e366004613f9a565b613180565b34801561065f57600080fd5b506001546102f3565b34801561067457600080fd5b50600954610235906001600160a01b031681565b34801561069457600080fd5b506102f360065481565b3480156106aa57600080fd5b506106b56201e84881565b60405163ffffffff9091168152602001610249565b3480156106d657600080fd5b506102f36132b0565b3480156106eb57600080fd5b506102f360075481565b34801561070157600080fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000781565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610775573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079991906144c6565b6001600160a01b0316336001600160a01b0316146107d25760405162461bcd60e51b81526004016107c9906144e3565b60405180910390fd5b6000805460ff19169055565b60006000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561082c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085091906144c6565b905090565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c591906144c6565b6001600160a01b0316336001600160a01b0316146108f55760405162461bcd60e51b81526004016107c9906144e3565b600755565b60015460609082111561090d5760015491505b6000610919848461451d565b6001600160401b0381111561093057610930614530565b604051908082528060200260200182016040528015610959578160200160208202803683370190505b509050835b838110156109b4576001818154811061097957610979614546565b9060005260206000200154828683610991919061451d565b815181106109a1576109a1614546565b602090810291909101015260010161095e565b5090505b92915050565b6109c66132b0565b3414610a145760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c49442046454520414d4f554e5400000000000000000060448201526064016107c9565b6000838152600a60205260409020546001600160a01b03163314610a6f5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107c9565b6000838152600a602052604090206004015460ff1615610ac75760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107c9565b6000838152600a6020526040902060010154610b255760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f20524f554e445320504c41594544205945540000000000000060448201526064016107c9565b6001826003811115610b3957610b396140c7565b1480610b5657506002826003811115610b5457610b546140c7565b145b80610b7257506003826003811115610b7057610b706140c7565b145b610bb75760405162461bcd60e51b815260206004820152601660248201527522a9291d1024a72b20a624a2102224a922a1aa24a7a760511b60448201526064016107c9565b6000838152600a60205260408120600190810154610bd5919061451d565b9050600080858152600a60205260409020600101805483908110610bfb57610bfb614546565b600091825260209091206003918202015462010000900460ff1690811115610c2557610c256140c7565b14610c725760405162461bcd60e51b815260206004820152601960248201527f4552523a20414c5245414459204d41444520412047554553530000000000000060448201526064016107c9565b6000848152600a60205260409020600101805482908110610c9557610c95614546565b6000918252602082206003909102015460ff169003610cf65760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f205354415254494e472043415244205945540000000000000060448201526064016107c9565b6000848152600a60205260409020600101805482908110610d1957610d19614546565b6000918252602090912060039091020154610100900460ff1615610d795760405162461bcd60e51b8152602060048201526017602482015276105b1c9958591e481c9958d95a5d9959081c995cdd5b1d604a1b60448201526064016107c9565b6000848152600a60205260409020600101805482908110610d9c57610d9c614546565b600091825260209091206003909102015460ff16600203610e16576001836003811115610dcb57610dcb6140c7565b03610e115760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba1023b7902637bbb2b9102a3430b7101960511b60448201526064016107c9565b610eb5565b6000848152600a60205260409020600101805482908110610e3957610e39614546565b600091825260209091206003909102015460ff16600e03610eb5576002836003811115610e6857610e686140c7565b03610eb55760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420476f20486967686572205468616e204163650000000000000060448201526064016107c9565b6000848152600a60205260409020600101805484919083908110610edb57610edb614546565b906000526020600020906003020160000160026101000a81548160ff02191690836003811115610f0d57610f0d6140c7565b0217905550801561101a576000848152600a60205260408120600190810190610f36908461451d565b81548110610f4657610f46614546565b9060005260206000209060030201600201549050600061271060055483610f6d919061455c565b610f779190614589565b9050600061271060065484610f8c919061455c565b610f969190614589565b60088054820190559050610fac82600033613383565b6000878152600a60205260409020600101805484919086908110610fd257610fd2614546565b6000918252602090912060016003909202010155610ff0818361459d565b610ffa908461451d565b6000888152600a6020526040902060030155611016338461345f565b5050505b6110268460018461355d565b50505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109c91906144c6565b6001600160a01b0316336001600160a01b0316146110cc5760405162461bcd60e51b81526004016107c9906144e3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611119576040519150601f19603f3d011682016040523d82523d6000602084013e61111e565b606091505b505090508061112c57600080fd5b505050565b6111756040518060c00160405280600081526020016000815260200160006001600160a01b0316815260200160001515815260200160008152602001606081525090565b6000828152600a6020526040812060010154900361121d576040805160c0810182526000808252602080830182905282840182905260608301829052608083018290528351828152908101909352909160a0830191611214565b6112016040805160a0810182526000808252602082018190529091820190815260200160008152602001600081525090565b8152602001906001900390816111cf5790505b50905292915050565b6040805160c0810182526000848152600a60205291822060010180549192839261124957611249614546565b6000918252602080832060016003909302018201548452868352600a808252604080852060028101548785015280546001600160a01b031682880152600481015460ff1615156060880152600581015460808801528986529183529201805483518184028101840190945280845260a090950194929390929184015b828210156113595760008481526020908190206040805160a0810182526003808702909301805460ff808216845261010082048116968401969096529194909392850192620100009092041690811115611321576113216140c7565b6003811115611332576113326140c7565b815260200160018201548152602001600282015481525050815260200190600101906112c5565b50505091525092915050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d591906144c6565b6001600160a01b0316336001600160a01b0316146114055760405162461bcd60e51b81526004016107c9906144e3565b609681111561144f5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742045786365656420312e35252046656560501b60448201526064016107c9565b600655565b60008181526002602052604081205460ff161580156109b8575050151590565b6000818152600a60205260409020546001600160a01b031633146114cf5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107c9565b6000818152600a602052604090206004015460ff16156115275760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107c9565b6000818152600a60205260409020600190810154116115785760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908149bdd5b99609a1b60448201526064016107c9565b6000818152600a60205260408120600101546115969060029061451d565b9050600080838152600a602052604090206001908101906115b890849061459d565b815481106115c8576115c8614546565b600091825260209091206003918202015462010000900460ff16908111156115f2576115f26140c7565b146116375760405162461bcd60e51b8152602060048201526015602482015274111a5c9958dd1a5bdb88185b1c9958591e481cd95d605a1b60448201526064016107c9565b6000828152600a6020526040902060019081019061165690839061459d565b8154811061166657611666614546565b6000918252602090912060039091020154610100900460ff16156116c65760405162461bcd60e51b8152602060048201526017602482015276105b1c9958591e481c9958d95a5d9959081c995cdd5b1d604a1b60448201526064016107c9565b6000828152600a6020526040812060048101805460ff19166001908117909155018054839081106116f9576116f9614546565b90600052602060002090600302016002015490506000811161174e5760405162461bcd60e51b815260206004820152600e60248201526d1154948e881393c814105653d55560921b60448201526064016107c9565b8047101561179e5760405162461bcd60e51b815260206004820152601f60248201527f4552523a204e4f5420454e4f5547482046554e445320544f205041594f55540060448201526064016107c9565b6000838152600a6020908152604091829020600201839055815163a9a36dcd60e01b815291516000805160206146b28339815191529263a9a36dcd9260048083019391928290030181865afa1580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f91906144c6565b6000848152600a6020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b5050506000858152600a602052604081208054600190910180546001600160a01b0390921694507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae893508792909161190757611907614546565b6000918252602091829020600160039092020101546040805193845291830152810184905260600160405180910390a2505050565b6000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac91906144c6565b6001600160a01b0316336001600160a01b031614611a005760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107c9565b6001600160401b038316600090815260036020526040902054611a22846137c7565b6000818152600a60205260408120600190810154611a40919061451d565b9050811580611a6457506000828152600a60205260409020546001600160a01b0316155b80611a8557506000828152600a602052604090206004015460ff1615156001145b15611ace577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a585838686604051611abf94939291906145b0565b60405180910390a15050505050565b6000600d85856000818110611ae557611ae5614546565b90506020020135611af69190614602565b611b0190600261459d565b6000848152600a602052604081206001018054929350909184908110611b2957611b29614546565b600091825260209091206003909102015460ff16905082158015611b4e575060ff8116155b15611ba4576000848152600a60205260409020600101805483919085908110611b7957611b79614546565b60009182526020909120600390910201805460ff191660ff9290921691909117905550505050505050565b60ff81161580611bfe57506000848152600a60205260408120600101805485908110611bd257611bd2614546565b600091825260209091206003918202015462010000900460ff1690811115611bfc57611bfc6140c7565b145b15611c49577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a587858888604051611c3894939291906145b0565b60405180910390a150505050505050565b6000848152600a60205260409020600101805483919085908110611c6f57611c6f614546565b60009182526020909120600390910201805460ff929092166101000261ff001990921691909117905560016000858152600a60205260409020600101805485908110611cbd57611cbd614546565b600091825260209091206003918202015462010000900460ff1690811115611ce757611ce76140c7565b03611ddc576000848152600a60205260409020600101805484908110611d0f57611d0f614546565b600091825260209091206003909102015460ff9081169083161015611dd75760ff8116600090815260046020908152604080832054878452600a909252909120600101805461271092640100000000900463ffffffff16919086908110611d7857611d78614546565b906000526020600020906003020160010154611d94919061455c565b611d9e9190614589565b6000858152600a60205260409020600101805485908110611dc157611dc1614546565b9060005260206000209060030201600201819055505b611fd4565b60026000858152600a60205260409020600101805485908110611e0157611e01614546565b600091825260209091206003918202015462010000900460ff1690811115611e2b57611e2b6140c7565b03611eb4576000848152600a60205260409020600101805484908110611e5357611e53614546565b600091825260209091206003909102015460ff9081169083161115611dd75760ff8116600090815260046020908152604080832054878452600a90925290912060010180546127109263ffffffff16919086908110611d7857611d78614546565b60036000858152600a60205260409020600101805485908110611ed957611ed9614546565b600091825260209091206003918202015462010000900460ff1690811115611f0357611f036140c7565b03611fd4576000848152600a60205260409020600101805484908110611f2b57611f2b614546565b600091825260209091206003909102015460ff90811690831603611fd4576000848152600a602052604090206001018054612710916201e8489186908110611f7557611f75614546565b906000526020600020906003020160010154611f91919061455c565b611f9b9190614589565b6000858152600a60205260409020600101805485908110611fbe57611fbe614546565b9060005260206000209060030201600201819055505b6000848152600a60205260408120600101805485908110611ff757611ff7614546565b90600052602060002090600302016002015411156125d5576000848152600a602052604090206003810154600190910180548590811061203957612039614546565b906000526020600020906003020160020154111561227c5760006000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c391906144c6565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015612129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214d9190614616565b6000868152600a6020526040812060038101546001909101805493945091929091908790811061217f5761217f614546565b90600052602060002090600302016002015461219b919061451d565b90508181111561226e5760006121b1838361451d565b6000888152600a6020526040902060010180549192508291889081106121d9576121d9614546565b906000526020600020906003020160020160008282546121f9919061451d565b909155506000905061220a846138a3565b9050838110156122675761221e818561451d565b6000898152600a6020526040902060010180548990811061224157612241614546565b90600052602060002090600302016002016000828254612261919061451d565b90915550505b5050612279565b612277816138a3565b505b50505b600160075461228b919061451d565b830361251c576000848152600a6020526040812060010180546122d09190869081106122b9576122b9614546565b906000526020600020906003020160010154613180565b905080600860008282546122e4919061451d565b90915550506000858152600a6020526040902060010180548291908690811061230f5761230f614546565b600091825260208083206002600390930201919091018054909301909255868152600a9091526040812060048101805460ff191660019081179091550180548690811061235e5761235e614546565b906000526020600020906003020160020154905080600a6000888152602001908152602001600020600201819055506000805160206146b28339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd91906144c6565b6000878152600a6020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561247757600080fd5b505af115801561248b573d6000803e3d6000fd5b5050506000888152600a602052604081208054600190910180546001600160a01b0390921694507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae893508a9290916124e5576124e5614546565b6000918252602091829020600160039092020101546040805193845291830152810184905260600160405180910390a2505061276b565b6000848152600a60209081526040808320815160a08101835260ff87811682528185018681529382018681526060830187905260808301879052600193840180549485018155875294909520815160039384029091018054945187166101000261ffff199095169190961617929092178085559251919392839162ff00001990911690620100009084908111156125b5576125b56140c7565b02179055506060820151816001015560808201518160020155505061276b565b6000848152600a6020526040902060048101805460ff191660019081179091558154910180546001600160a01b03909216917fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89187918790811061263b5761263b614546565b6000918252602080832060016003909302019190910154604080519485529184015282015260600160405180910390a26000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126db91906144c6565b6000858152600a6020526040908190206003015490516359e5b78d60e11b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b03929092169163b3cb6f1a91906024016000604051808303818588803b15801561275157600080fd5b505af1158015612765573d6000803e3d6000fd5b50505050505b50505050505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e491906144c6565b6001600160a01b0316336001600160a01b0316146128145760405162461bcd60e51b81526004016107c9906144e3565b6101f481111561285d5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74204578636565642035252046656560601b60448201526064016107c9565b60058190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b606081806001600160401b038111156128b3576128b3614530565b6040519080825280602002602001820160405280156128dc578160200160208202803683370190505b50915060005b8181101561294d576002600086868481811061290057612900614546565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061293557612935614546565b911515602092830291909101909101526001016128e2565b505092915050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c591906144c6565b6001600160a01b0316336001600160a01b0316146129f55760405162461bcd60e51b81526004016107c9906144e3565b6000805460ff19166001179055565b60018181548110612a1457600080fd5b600091825260209091200154905081565b6060816000816001600160401b03811115612a4257612a42614530565b604051908082528060200260200182016040528015612a7557816020015b6060815260200190600190039081612a605790505b50905060005b82811015612ae857612aa4868683818110612a9857612a98614546565b90506020020135611131565b604051602001612ab491906140dd565b604051602081830303815290604052828281518110612ad557612ad5614546565b6020908102919091010152600101612a7b565b50949350505050565b6000805160206146b28339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6191906144c6565b6001600160a01b0316336001600160a01b031614612b915760405162461bcd60e51b81526004016107c9906144e3565b612b9c823383613aa9565b5050565b60608080808085806001600160401b03811115612bbf57612bbf614530565b604051908082528060200260200182016040528015612be8578160200160208202803683370190505b509550806001600160401b03811115612c0357612c03614530565b604051908082528060200260200182016040528015612c2c578160200160208202803683370190505b509450806001600160401b03811115612c4757612c47614530565b604051908082528060200260200182016040528015612c70578160200160208202803683370190505b509350806001600160401b03811115612c8b57612c8b614530565b604051908082528060200260200182016040528015612cb4578160200160208202803683370190505b509250806001600160401b03811115612ccf57612ccf614530565b604051908082528060200260200182016040528015612cf8578160200160208202803683370190505b50915060005b81811015612fb357600a60008a8a84818110612d1c57612d1c614546565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b0316878281518110612d5a57612d5a614546565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600a60008b8b85818110612d9257612d92614546565b90506020020135815260200190815260200160002060010180549050905080600003612e41576000878381518110612dcc57612dcc614546565b6020026020010181815250506000868381518110612dec57612dec614546565b6020026020010181815250506000858381518110612e0c57612e0c614546565b6020026020010181815250506000848381518110612e2c57612e2c614546565b91151560209283029190910190910152612faa565b600a60008b8b85818110612e5757612e57614546565b905060200201358152602001908152602001600020600101600081548110612e8157612e81614546565b906000526020600020906003020160010154878381518110612ea557612ea5614546565b602002602001018181525050600a60008b8b85818110612ec757612ec7614546565b90506020020135815260200190815260200160002060020154868381518110612ef257612ef2614546565b602002602001018181525050600a60008b8b85818110612f1457612f14614546565b90506020020135815260200190815260200160002060050154858381518110612f3f57612f3f614546565b602002602001018181525050600a60008b8b85818110612f6157612f61614546565b90506020020135815260200190815260200160002060040160009054906101000a900460ff16848381518110612f9957612f99614546565b911515602092830291909101909101525b50600101612cfe565b50509295509295909350565b826001600160a01b038116331461308957604051636d6d50a160e11b81523360048201526000805160206146b28339815191529063dadaa14290602401602060405180830381865afa158015613019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303d919061462f565b6130895760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107c9565b6000805160206146b28339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f9919061462f565b156131395760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107c9565b60005460ff16156131755760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107c9565b611026848484613bda565b6000806000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f391906144c6565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015613259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327d9190614616565b9050808310613290575050600854919050565b808360085461329f919061455c565b6132a99190614589565b9392505050565b60006000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332291906144c6565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561335f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108509190614616565b6000805160206146b28339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f391906144c6565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e59085906044016000604051808303818588803b15801561344157600080fd5b505af1158015613455573d6000803e3d6000fd5b5050505050505050565b6000805160206146b28339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134cf91906144c6565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000076044830152919091169063eb3d9bea90606401600060405180830381600087803b15801561354157600080fd5b505af1158015613555573d6000803e3d6000fd5b505050505050565b60006000805160206146b28339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cf91906144c6565b6001600160a01b03166397cca7af6135e56132b0565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af115801561362a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061364f9190614651565b6001600160401b038116600090815260036020526040902054909150156136ab5760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107c9565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b0319815291516000805160206146b28339815191529263ff9b3acf9260048083019391928290030181865afa158015613712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373691906144c6565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561377057600080fd5b505af1158015613784573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d45846040516137b991815260200190565b60405180910390a150505050565b6000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613813573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383791906144c6565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387157600080fd5b505af1158015613885573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b60008115613aa4576000805160206146b28339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391b91906144c6565b60095460405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000760048201526001600160a01b0391821660248201526044810185905291169063ae2f5d9390606401600060405180830381600087803b15801561398e57600080fd5b505af11580156139a2573d6000803e3d6000fd5b50505050600960009054906101000a90046001600160a01b03166001600160a01b0316631e83409a6000805160206146b28339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3a91906144c6565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015613a80573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190614616565b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613b05919061466e565b6000604051808303816000865af19150503d8060008114613b42576040519150601f19603f3d011682016040523d82523d6000602084013e613b47565b606091505b5091509150818015613b71575080511580613b71575080806020019051810190613b71919061462f565b613bd35760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107c9565b5050505050565b6000613be46132b0565b905060008080613bf68587018761468a565b92509250925083341015613c3e5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107c9565b613c4783611454565b1515600114613c8a5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b60448201526064016107c9565b6000613c96853461451d565b905060008111613cdd5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b60448201526064016107c9565b600061271060055483613cf0919061455c565b613cfa9190614589565b9050600061271060065484613d0f919061455c565b613d199190614589565b60088054820190559050613d2e82868c613383565b6000868152600a6020526040902080546001600160a01b0319166001600160a01b038c1617815560048101805460ff1916905542600590910155613d72818361459d565b613d7c908461451d565b6000878152600a60209081526040808320600380820195909555815160a081018352848152808401858152928101858152606082018a9052608082018690526001928301805493840181558652939094208451918602018054925160ff9081166101000261ffff199094169216919091179190911780825591519293909291839162ff0000199091169062010000908490811115613e1c57613e1c6140c7565b021790555060608201518160010155608082015181600201555050613e418a87613ea6565b613e4b8a8461345f565b896001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c787604051613e8691815260200190565b60405180910390a2613e9a8660018661355d565b50505050505050505050565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000076024830152604482018390527f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa1690639a4918c190606401600060405180830381600087803b158015613f3657600080fd5b505af1158015613f4a573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b600060208284031215613fac57600080fd5b5035919050565b600060208284031215613fc557600080fd5b813560ff811681146132a957600080fd5b60008060408385031215613fe957600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561402a57815186526020958601959091019060010161400c565b5093949350505050565b6020815260006132a96020830184613ff8565b60008060006060848603121561405c57600080fd5b8335925060208401356004811061407257600080fd5b929592945050506040919091013590565b6001600160a01b038116811461409857600080fd5b50565b600080604083850312156140ae57600080fd5b82356140b981614083565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b60208152600060e08201835160208401526020840151604084015260018060a01b036040850151166060840152606084015115156080840152608084015160a084015260a084015160c08085015281815180845261010086019150602083019350600092505b808310156141b757835160ff815116835260ff602082015116602084015260408101516004811061418457634e487b7160e01b600052602160045260246000fd5b8060408501525060608101516060840152608081015160808401525060a082019150602084019350600183019250614143565b5095945050505050565b6001600160401b038116811461409857600080fd5b60008083601f8401126141e857600080fd5b5081356001600160401b038111156141ff57600080fd5b6020830191508360208260051b850101111561421a57600080fd5b9250929050565b60008060006040848603121561423657600080fd5b8335614241816141c1565b925060208401356001600160401b0381111561425c57600080fd5b614268868287016141d6565b9497909650939450505050565b6000806020838503121561428857600080fd5b82356001600160401b0381111561429e57600080fd5b6142aa858286016141d6565b90969095509350505050565b600081518084526020840193506020830160005b8281101561402a57815115158652602095860195909101906001016142ca565b6020815260006132a960208301846142b6565b60005b83811015614318578181015183820152602001614300565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561439557603f19878603018452815180518087526143728160208901602085016142fd565b601f01601f19169590950160209081019550938401939190910190600101614349565b50929695505050505050565b60a08082528651908201819052600090602088019060c0840190835b818110156143e45783516001600160a01b03168352602093840193909201916001016143bd565b505083810360208501526143f88189613ff8565b915050828103604084015261440d8187613ff8565b905082810360608401526144218186613ff8565b9050828103608084015261443581856142b6565b98975050505050505050565b60008060006040848603121561445657600080fd5b833561446181614083565b925060208401356001600160401b0381111561447c57600080fd5b8401601f8101861361448d57600080fd5b80356001600160401b038111156144a357600080fd5b8660208284010111156144b557600080fd5b939660209190910195509293505050565b6000602082840312156144d857600080fd5b81516132a981614083565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156109b8576109b8614507565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176109b8576109b8614507565b634e487b7160e01b600052601260045260246000fd5b60008261459857614598614573565b500490565b808201808211156109b8576109b8614507565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156145e757600080fd5b8260051b808560808501379190910160800195945050505050565b60008261461157614611614573565b500690565b60006020828403121561462857600080fd5b5051919050565b60006020828403121561464157600080fd5b815180151581146132a957600080fd5b60006020828403121561466357600080fd5b81516132a9816141c1565b600082516146808184602087016142fd565b9190910192915050565b60008060006060848603121561469f57600080fd5b8335925060208401356140728161408356fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220c89e4ac6727b7a3b3636ca3648815b8fd45a93c1d556174a1de9420379ba151964736f6c634300081c0033

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

0000000000000000000000000000000000000000000000000000000000000007000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa

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

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


Deployed Bytecode Sourcemap

14081:21781:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6867:70;;;;;;;;;;;;;:::i;:::-;;11644:91;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;11644:91:0;;;;;;;;16221:40;;;;;;;;;;-1:-1:-1;16221:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16221:40:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;724:32:1;;;706:51;;788:2;773:18;;766:34;;;;816:18;;;809:34;;;;886:14;879:22;874:2;859:18;;852:50;933:3;918:19;;911:35;693:3;678:19;16221:40:0;453:499:1;14708:27:0;;;;;;;;;;;;;;;;;;;1103:25:1;;;1091:2;1076:18;14708:27:0;957:177:1;19424:142:0;;;;;;;;;;-1:-1:-1;19424:142:0;;;;;:::i;:::-;;:::i;14427:50::-;;;;;;;;;;-1:-1:-1;14427:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1613:10:1;1601:23;;;1583:42;;1661:23;;;;1656:2;1641:18;;1634:51;1556:18;14427:50:0;1413:278:1;14499:32:0;;;;;;;;;;;;;;;;12209:409;;;;;;;;;;-1:-1:-1;12209:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21776:2907::-;;;;;;:::i;:::-;;:::i;6945:155::-;;;;;;;;;;-1:-1:-1;6945:155:0;;;;;:::i;:::-;;:::i;33329:809::-;;;;;;;;;;-1:-1:-1;33329:809:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1085:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1085:107:0;;19193:223;;;;;;;;;;-1:-1:-1;19193:223:0;;;;;:::i;:::-;;:::i;11743:135::-;;;;;;;;;;-1:-1:-1;11743:135:0;;;;;:::i;:::-;;:::i;:::-;;;5877:14:1;;5870:22;5852:41;;5840:2;5825:18;11743:135:0;5712:187:1;24691:1608:0;;;;;;;;;;-1:-1:-1;24691:1608:0;;;;;:::i;:::-;;:::i;6016:26::-;;;;;;;;;;-1:-1:-1;6016:26:0;;;;;;;;26373:6145;;;;;;;;;;-1:-1:-1;26373:6145:0;;;;;:::i;:::-;;:::i;18912:273::-;;;;;;;;;;-1:-1:-1;18912:273:0;;;;;:::i;:::-;;:::i;11886:315::-;;;;;;;;;;-1:-1:-1;11886:315:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6791:68::-;;;;;;;;;;;;;:::i;6089:28::-;;;;;;;;;;-1:-1:-1;6089:28:0;;;;;:::i;:::-;;:::i;34146:370::-;;;;;;;;;;-1:-1:-1;34146:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5921:40::-;;;;;;;;;;;;;;;7108:143;;;;;;;;;;-1:-1:-1;7108:143:0;;;;;:::i;:::-;;:::i;34524:1298::-;;;;;;;;;;-1:-1:-1;34524:1298:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;7823:260::-;;;;;;:::i;:::-;;:::i;32901:420::-;;;;;;;;;;-1:-1:-1;32901:420:0;;;;;:::i;:::-;;:::i;12626:102::-;;;;;;;;;;-1:-1:-1;12702:11:0;:18;12626:102;;16154:22;;;;;;;;;;-1:-1:-1;16154:22:0;;;;-1:-1:-1;;;;;16154:22:0;;;14538:31;;;;;;;;;;;;;;;;14146:44;;;;;;;;;;;;14183:7;14146:44;;;;;12165:10:1;12153:23;;;12135:42;;12123:2;12108:18;14146:44:0;11991:192:1;7605:105:0;;;;;;;;;;;;;:::i;14627:36::-;;;;;;;;;;;;;;;;5856:32;;;;;;;;;;;;;;;6867:70;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;;;;;;;;;6924:5:::1;6915:14:::0;;-1:-1:-1;;6915:14:0::1;::::0;;6867:70::o;11644:91::-;11685:7;-1:-1:-1;;;;;;;;;;;;;;;;11712:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11705:22;;11644:91;:::o;19424:142::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;19520:16:::1;:38:::0;19424:142::o;12209:409::-;12328:11;:18;12289:16;;12322:24;;12318:81;;;12369:11;:18;;-1:-1:-1;12318:81:0;12409:20;12446:11;12452:5;12446:3;:11;:::i;:::-;-1:-1:-1;;;;;12432:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12432:26:0;-1:-1:-1;12409:49:0;-1:-1:-1;12483:5:0;12469:121;12494:3;12490:1;:7;12469:121;;;12532:11;12544:1;12532:14;;;;;;;;:::i;:::-;;;;;;;;;12515:3;12523:5;12519:1;:9;;;;:::i;:::-;12515:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;12573:3;;12469:121;;;-1:-1:-1;12607:3:0;-1:-1:-1;12209:409:0;;;;;:::o;21776:2907::-;21993:11;:9;:11::i;:::-;21980:9;:24;21958:97;;;;-1:-1:-1;;;21958:97:0;;13514:2:1;21958:97:0;;;13496:21:1;13553:2;13533:18;;;13526:30;13592:25;13572:18;;;13565:53;13635:18;;21958:97:0;13312:347:1;21958:97:0;22088:13;;;;:5;:13;;;;;:18;-1:-1:-1;;;;;22088:18:0;22110:10;22088:32;22066:100;;;;-1:-1:-1;;;22066:100:0;;13866:2:1;22066:100:0;;;13848:21:1;13905:2;13885:18;;;13878:30;-1:-1:-1;;;13924:18:1;;;13917:48;13982:18;;22066:100:0;13664:342:1;22066:100:0;22199:13;;;;:5;:13;;;;;:22;;;;;:31;22177:100;;;;-1:-1:-1;;;22177:100:0;;14213:2:1;22177:100:0;;;14195:21:1;14252:2;14232:18;;;14225:30;-1:-1:-1;;;14271:18:1;;;14264:49;14330:18;;22177:100:0;14011:343:1;22177:100:0;22340:1;22310:13;;;:5;:13;;;;;:20;;:27;22288:106;;;;-1:-1:-1;;;22288:106:0;;14561:2:1;22288:106:0;;;14543:21:1;14600:2;14580:18;;;14573:30;14639:27;14619:18;;;14612:55;14684:18;;22288:106:0;14359:349:1;22288:106:0;22440:20;22427:9;:33;;;;;;;;:::i;:::-;;:71;;;-1:-1:-1;22477:21:0;22464:9;:34;;;;;;;;:::i;:::-;;22427:71;:107;;;-1:-1:-1;22515:19:0;22502:9;:32;;;;;;;;:::i;:::-;;22427:107;22405:179;;;;-1:-1:-1;;;22405:179:0;;14915:2:1;22405:179:0;;;14897:21:1;14954:2;14934:18;;;14927:30;-1:-1:-1;;;14973:18:1;;;14966:52;15035:18;;22405:179:0;14713:346:1;22405:179:0;22595:15;22613:13;;;:5;:13;;;;;22643:1;22613:20;;;:27;:31;;22643:1;22613:31;:::i;:::-;22595:49;-1:-1:-1;22720:19:0;22677:13;;;;:5;:13;;;;;:20;;:29;;22698:7;;22677:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;;;:62;;;;;;;:::i;:::-;;22655:137;;;;-1:-1:-1;;;22655:137:0;;15266:2:1;22655:137:0;;;15248:21:1;15305:2;15285:18;;;15278:30;15344:27;15324:18;;;15317:55;15389:18;;22655:137:0;15064:349:1;22655:137:0;22825:13;;;;:5;:13;;;;;:20;;:29;;22846:7;;22825:29;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;:47;;22803:122;;;;-1:-1:-1;;;22803:122:0;;15620:2:1;22803:122:0;;;15602:21:1;15659:2;15639:18;;;15632:30;15698:27;15678:18;;;15671:55;15743:18;;22803:122:0;15418:349:1;22803:122:0;22958:13;;;;:5;:13;;;;;:20;;:29;;22979:7;;22958:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:38;;;;;;:43;22936:116;;;;-1:-1:-1;;;22936:116:0;;15974:2:1;22936:116:0;;;15956:21:1;16013:2;15993:18;;;15986:30;-1:-1:-1;;;16032:18:1;;;16025:53;16095:18;;22936:116:0;15772:347:1;22936:116:0;23067:13;;;;:5;:13;;;;;:20;;:29;;23088:7;;23067:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;23113:1;23067:47;23063:307;;23152:20;23139:9;:33;;;;;;;;:::i;:::-;;23131:68;;;;-1:-1:-1;;;23131:68:0;;16326:2:1;23131:68:0;;;16308:21:1;16365:2;16345:18;;;16338:30;-1:-1:-1;;;16384:18:1;;;16377:52;16446:18;;23131:68:0;16124:346:1;23131:68:0;23063:307;;;23221:13;;;;:5;:13;;;;;:20;;:29;;23242:7;;23221:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;23267:2;23221:48;23217:153;;23307:21;23294:9;:34;;;;;;;;:::i;:::-;;23286:72;;;;-1:-1:-1;;;23286:72:0;;16677:2:1;23286:72:0;;;16659:21:1;16716:2;16696:18;;;16689:30;16755:27;16735:18;;;16728:55;16800:18;;23286:72:0;16475:349:1;23286:72:0;23413:13;;;;:5;:13;;;;;:20;;:29;;23455:9;;23413:20;23434:7;;23413:29;;;;;;:::i;:::-;;;;;;;;;;;:39;;;:51;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;23516:11:0;;23512:1076;;23651:20;23674:13;;;:5;:13;;;;;:20;;;;;23695:11;;:7;:11;:::i;:::-;23674:33;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;23651:63;;23783:25;14809:6;23827:11;;23812:12;:26;;;;:::i;:::-;23811:40;;;;:::i;:::-;23783:68;;23919:24;14809:6;23962:10;;23947:12;:25;;;;:::i;:::-;23946:39;;;;:::i;:::-;24068:12;:32;;;;;;23919:66;-1:-1:-1;24174:54:0;24186:17;24068:12;24217:10;24174:11;:54::i;:::-;24298:13;;;;:5;:13;;;;;:20;;:29;;24340:12;;24298:20;24319:7;;24298:29;;;;;;:::i;:::-;;;;;;;;;:39;:29;;;;;:39;:54;24454:36;24474:16;24454:17;:36;:::i;:::-;24438:53;;:12;:53;:::i;:::-;24407:13;;;;:5;:13;;;;;:28;;:84;24538:38;24551:10;24563:12;24538;:38::i;:::-;23529:1059;;;23512:1076;24634:41;24649:6;24657:1;24660:14;24634;:41::i;:::-;21947:2736;21776:2907;;;:::o;6945:155::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;7025:6:::1;7044:2;-1:-1:-1::0;;;;;7036:16:0::1;7060:6;7036:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7024:47;;;7090:1;7082:10;;;::::0;::::1;;7013:87;6945:155:::0;;:::o;33329:809::-;33398:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33398:25:0;33446:14;;;;:5;:14;;;;;:21;;:28;:33;;33442:319;;33503:246;;;;;;;;-1:-1:-1;33503:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33715:18;;;;;;;;;;;33503:246;;;;;;33715:18;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33715:18:0;;;;;;;;;;;;;;;;-1:-1:-1;33503:246:0;;33496:253;33329:809;-1:-1:-1;;33329:809:0:o;33442:319::-;33780:350;;;;;;;;-1:-1:-1;33832:14:0;;;:5;:14;;;;;:21;;:24;;33780:350;;;;33832:24;;;;:::i;:::-;;;;;;;;;:34;:24;;;;;:34;;;33780:350;;33915:14;;;:5;:14;;;;;;;:21;;;;33780:350;;;;33957:19;;-1:-1:-1;;;;;33957:19:0;33780:350;;;;34001:23;;;;;;33780:350;;;;;;34050:24;;;;33780:350;;;;34097:14;;;;;;:21;;33780:350;;;;;;;;;;;;;;;;;;;;;;;;34097:21;;33780:350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33780:350:0;;-1:-1:-1;33773:357:0;33329:809;-1:-1:-1;;33329:809:0:o;19193:223::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;19308:3:::1;19291:13;:20;;19269:92;;;::::0;-1:-1:-1;;;19269:92:0;;17801:2:1;19269:92:0::1;::::0;::::1;17783:21:1::0;17840:2;17820:18;;;17813:30;-1:-1:-1;;;17859:18:1;;;17852:52;17921:18;;19269:92:0::1;17599:346:1::0;19269:92:0::1;19382:10;:26:::0;19193:223::o;11743:135::-;11803:4;11827:20;;;:12;:20;;;;;;;;:29;;;:43;;-1:-1:-1;;11860:10:0;;;11743:135::o;24691:1608::-;24801:13;;;;:5;:13;;;;;:18;-1:-1:-1;;;;;24801:18:0;24823:10;24801:32;24779:100;;;;-1:-1:-1;;;24779:100:0;;13866:2:1;24779:100:0;;;13848:21:1;13905:2;13885:18;;;13878:30;-1:-1:-1;;;13924:18:1;;;13917:48;13982:18;;24779:100:0;13664:342:1;24779:100:0;24950:13;;;;:5;:13;;;;;:22;;;;;:31;24928:100;;;;-1:-1:-1;;;24928:100:0;;14213:2:1;24928:100:0;;;14195:21:1;14252:2;14232:18;;;14225:30;-1:-1:-1;;;14271:18:1;;;14264:49;14330:18;;24928:100:0;14011:343:1;24928:100:0;25061:13;;;;:5;:13;;;;;25091:1;25061:20;;;:27;:31;25039:94;;;;-1:-1:-1;;;25039:94:0;;18152:2:1;25039:94:0;;;18134:21:1;18191:2;18171:18;;;18164:30;-1:-1:-1;;;18210:18:1;;;18203:43;18263:18;;25039:94:0;17950:337:1;25039:94:0;25190:15;25208:13;;;:5;:13;;;;;:20;;:27;:31;;25238:1;;25208:31;:::i;:::-;25190:49;-1:-1:-1;25319:19:0;25272:13;;;;:5;:13;;;;;:20;;;;;25293:11;;:7;;:11;:::i;:::-;25272:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:43;;;;;;;:66;;;;;;;:::i;:::-;;25250:137;;;;-1:-1:-1;;;25250:137:0;;18494:2:1;25250:137:0;;;18476:21:1;18533:2;18513:18;;;18506:30;-1:-1:-1;;;18552:18:1;;;18545:51;18613:18;;25250:137:0;18292:345:1;25250:137:0;25420:13;;;;:5;:13;;;;;:20;;;;;25441:11;;:7;;:11;:::i;:::-;25420:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;;;;:47;25398:120;;;;-1:-1:-1;;;25398:120:0;;15974:2:1;25398:120:0;;;15956:21:1;16013:2;15993:18;;;15986:30;-1:-1:-1;;;16032:18:1;;;16025:53;16095:18;;25398:120:0;15772:347:1;25398:120:0;25561:13;;;;:5;:13;;;;;:22;;;:29;;-1:-1:-1;;25561:29:0;25586:4;25561:29;;;;;;25680:20;:29;;25701:7;;25680:29;;;;;;:::i;:::-;;;;;;;;;;;:36;;;25663:53;;25758:1;25749:6;:10;25727:74;;;;-1:-1:-1;;;25727:74:0;;18844:2:1;25727:74:0;;;18826:21:1;18883:2;18863:18;;;18856:30;-1:-1:-1;;;18902:18:1;;;18895:44;18956:18;;25727:74:0;18642:338:1;25727:74:0;25861:6;25836:21;:31;;25814:112;;;;-1:-1:-1;;;25814:112:0;;19187:2:1;25814:112:0;;;19169:21:1;19226:2;19206:18;;;19199:30;19265:33;19245:18;;;19238:61;19316:18;;25814:112:0;18985:355:1;25814:112:0;25963:13;;;;:5;:13;;;;;;;;;:20;;:29;;;26051:22;;-1:-1:-1;;;26051:22:0;;;;-1:-1:-1;;;;;;;;;;;1149:42:0;26051:20;;:22;;;;;25963:13;;26051:22;;;;;1149:42;26051:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26133:13;;;;:5;:13;;;;;;;:18;26037:125;;-1:-1:-1;;;26037:125:0;;26111:7;26037:125;;;19519:25:1;-1:-1:-1;;;;;26133:18:0;;;19560::1;;;19553:60;26037:44:0;;;;;26089:6;;19492:18:1;;26037:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26221:13:0;;;;:5;:13;;;;;:18;;;26249:20;;;:23;;-1:-1:-1;;;;;26221:18:0;;;;-1:-1:-1;26211:80:0;;-1:-1:-1;26227:6:0;;26249:20;;:23;;;;:::i;:::-;;;;;;;;;;:33;:23;;;;;:33;;26211:80;;;19826:25:1;;;19867:18;;;19860:34;19910:18;;19903:34;;;19814:2;19799:18;26211:80:0;;;;;;;24733:1566;;24691:1608;:::o;26373:6145::-;-1:-1:-1;;;;;;;;;;;;;;;;1563:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1549:27:0;:10;-1:-1:-1;;;;;1549:27:0;;1527:94;;;;-1:-1:-1;;;1527:94:0;;20150:2:1;1527:94:0;;;20132:21:1;20189:2;20169:18;;;20162:30;-1:-1:-1;;;20208:18:1;;;20201:47;20265:18;;1527:94:0;19948:341:1;1527:94:0;-1:-1:-1;;;;;11604:24:0;;26554:14:::1;11604:24:::0;;;:13;:24;;;;;;26646:25:::1;11604:24:::0;26646:14:::1;:25::i;:::-;26711:15;26729:13:::0;;;:5:::1;:13;::::0;;;;26759:1:::1;26729:20:::0;;::::1;:27:::0;:31:::1;::::0;26759:1;26729:31:::1;:::i;:::-;26711:49:::0;-1:-1:-1;26818:11:0;;;:47:::1;;-1:-1:-1::0;26863:1:0::1;26833:13:::0;;;:5:::1;:13;::::0;;;;:18;-1:-1:-1;;;;;26833:18:0::1;:32:::0;26818:47:::1;:81;;;-1:-1:-1::0;26869:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:30;;:22:::0;:30:::1;26818:81;26814:190;;;26921:50;26940:9;26951:6;26959:11;;26921:50;;;;;;;;;:::i;:::-;;;;;;;;26986:7;;7013:87;6945:155:::0;;:::o;26814:190::-:1;27047:14;27088:2;27071:11;;27083:1;27071:14;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;27070:25;::::0;27094:1:::1;27070:25;:::i;:::-;27115:18;27136:13:::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27047:49;;-1:-1:-1;27115:18:0;;27157:7;;27136:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:42:::0;::::1;;::::0;-1:-1:-1;27195:12:0;;:33;::::1;;;-1:-1:-1::0;27211:17:0::1;::::0;::::1;::::0;27195:33:::1;27191:183;;;27280:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27325:8;;27280:20;27301:7;;27280:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:53:::0;;-1:-1:-1;;27280:53:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;;6945:155:0:o;27191:183::-:1;27438:17;::::0;::::1;::::0;;:83:::1;;-1:-1:-1::0;27502:19:0::1;27459:13:::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27480:7;;27459:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39:::0;;;::::1;;;::::0;:62;::::1;;;;;;:::i;:::-;;27438:83;27434:192;;;27543:50;27562:9;27573:6;27581:11;;27543:50;;;;;;;;;:::i;:::-;;;;;;;;27608:7;;;;7013:87;6945:155:::0;;:::o;27434:192::-:1;27686:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27727:8;;27686:20;27707:7;;27686:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:49:::0;;::::1;::::0;;;::::1;;;-1:-1:-1::0;;27686:49:0;;::::1;::::0;;;::::1;::::0;;:38:::1;27809:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27830:7;;27809:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39:::0;;;::::1;;;::::0;:63;::::1;;;;;;:::i;:::-;::::0;27805:1155:::1;;27928:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;27949:7;;27928:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:42:::0;::::1;::::0;;::::1;27917:53:::0;;::::1;;27913:258;;;28109:25;::::0;::::1;;::::0;;;:11:::1;:25;::::0;;;;;;;:31;28067:13;;;:5:::1;:13:::0;;;;;;:20:::1;;:29:::0;;14809:6:::1;::::0;28109:31;;::::1;;;::::0;28067:20;28088:7;;28067:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;;:73;;;;:::i;:::-;28066:87;;;;:::i;:::-;28027:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28048:7;;28027:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;:126;;;;27913:258;27805:1155;;;28237:21;28194:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28215:7;;28194:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39:::0;;;::::1;;;::::0;:64;::::1;;;;;;:::i;:::-;::::0;28190:770:::1;;28315:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28336:7;;28315:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:42:::0;::::1;::::0;;::::1;28304:53:::0;;::::1;;28300:259;;;28496:25;::::0;::::1;;::::0;;;:11:::1;:25;::::0;;;;;;;:32;28454:13;;;:5:::1;:13:::0;;;;;;28496:32;28454:20:::1;:29:::0;;14809:6:::1;::::0;28496:32:::1;;::::0;28454:20;28475:7;;28454:29;::::1;;;;;:::i;28190:770::-;28625:19;28582:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28603:7;;28582:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39:::0;;;::::1;;;::::0;:62;::::1;;;;;;:::i;:::-;::::0;28578:382:::1;;28700:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28721:7;;28700:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:42:::0;::::1;::::0;;::::1;28688:54:::0;;::::1;::::0;28684:255:::1;;28855:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;14809:6:::1;::::0;14183:7:::1;::::0;28876;;28855:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;;:53;;;;:::i;:::-;28854:67;;;;:::i;:::-;28815:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28836:7;;28815:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;:106;;;;28684:255;29015:1;28976:13:::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;28997:7;;28976:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:40;28972:3539;;;29090:13;::::0;;;:5:::1;:13;::::0;;;;:28:::1;::::0;::::1;::::0;29051:20:::1;::::0;;::::1;:29:::0;;29072:7;;29051:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:67;29047:1295;;;29180:17;-1:-1:-1::0;;;;;;;;;;;;;;;;29216:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29200:61;::::0;-1:-1:-1;;;29200:61:0;;29253:7:::1;29200:61;::::0;::::1;1103:25:1::0;-1:-1:-1;;;;;29200:52:0;;;::::1;::::0;::::1;::::0;1076:18:1;;29200:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29346:12;29400:13:::0;;;:5:::1;:13;::::0;;;;:28:::1;::::0;::::1;::::0;29361:20:::1;::::0;;::::1;:29:::0;;29180:81;;-1:-1:-1;29346:12:0;;29400:28;;29361:20;29382:7;;29361:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:67;;;;:::i;:::-;29346:82;;29562:9;29555:4;:16;29551:776;;;29639:14;29656:16;29663:9:::0;29656:4;:16:::1;:::i;:::-;29745:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;29639:33;;-1:-1:-1;29639:33:0;;29766:7;;29745:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:46;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;29862:17:0::1;::::0;-1:-1:-1;29882:31:0::1;29903:9:::0;29882:20:::1;:31::i;:::-;29862:51;;29954:9;29942;:21;29938:245;;;30137:21;30149:9:::0;30137;:21:::1;:::i;:::-;30096:13;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;30117:7;;30096:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;:63;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;29938:245:0::1;29573:631;;29551:776;;;30281:26;30302:4;30281:20;:26::i;:::-;;29551:776;29120:1222;;29047:1295;30393:1;30374:16;;:20;;;;:::i;:::-;30362:7;:33:::0;30358:1766:::1;;30611:21;30652:13:::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;30635:57:::1;::::0;30652:20;30673:7;;30652:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:39;;;30635:16;:57::i;:::-;30611:81;;30769:13;30753:12;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;30889:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:20:::1;;:29:::0;;30929:13;;30889:20;30910:7;;30889:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:29;::::0;;::::1;;:36:::0;;;::::1;:53:::0;;;;::::1;::::0;;;31020:13;;;:5:::1;:13:::0;;;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;31020:29:0::1;-1:-1:-1::0;31020:29:0;;::::1;::::0;;;31155:20:::1;:29:::0;;31176:7;;31155:29;::::1;;;;;:::i;:::-;;;;;;;;;;;:36;;;31138:53;;31267:6;31244:5;:13;31250:6;31244:13;;;;;;;;;;;:20;;:29;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;31348:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31446:13;::::0;;;:5:::1;:13;::::0;;;;;;:18;31334:149;;-1:-1:-1;;;31334:149:0;;31416:7:::1;31334:149;::::0;::::1;19519:25:1::0;-1:-1:-1;;;;;31446:18:0;;::::1;19560::1::0;;;19553:60;31334:44:0;::::1;::::0;::::1;::::0;31386:6;;19492:18:1;;31334:149:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;31566:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:18;;;31594:20;;::::1;:23:::0;;-1:-1:-1;;;;;31566:18:0;;::::1;::::0;-1:-1:-1;31556:80:0::1;::::0;-1:-1:-1;31572:6:0;;31594:20;;:23:::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;:33:::1;:23;::::0;;::::1;;:33;::::0;31556:80:::1;::::0;;19826:25:1;;;19867:18;;;19860:34;19910:18;;19903:34;;;19814:2;19799:18;31556:80:0::1;;;;;;;30397:1257;;28972:3539;;30358:1766;31721:13;::::0;;;:5:::1;:13;::::0;;;;;;;31747:360;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;31721:20:::1;::::0;;::::1;:387:::0;;;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;;-1:-1:-1::0;;31721:387:0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;31747:360;;31721:387;;;-1:-1:-1;;31721:387:0;;::::1;::::0;;;;;;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;28972:3539;;;32200:13;::::0;;;:5:::1;:13;::::0;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;32200:29:0::1;32225:4;32200:29:::0;;::::1;::::0;;;32299:18;;32327:20;::::1;:29:::0;;-1:-1:-1;;;;;32299:18:0;;::::1;::::0;32289:81:::1;::::0;32206:6;;32348:7;;32327:29;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:39:::1;:29;::::0;;::::1;;:39:::0;;;::::1;::::0;32289:81:::1;::::0;;19826:25:1;;;19867:18;;;19860:34;19910:18;;19903:34;19814:2;19799:18;32289:81:0::1;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;32424:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32460:13;::::0;;;:5:::1;:13;::::0;;;;;;:28:::1;;::::0;32417:82;;-1:-1:-1;;;32417:82:0;;32491:7:::1;32417:82;::::0;::::1;1103:25:1::0;-1:-1:-1;;;;;32417:35:0;;;::::1;::::0;::::1;::::0;32460:28;1076:18:1;;32417:82:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28972:3539;26502:6016;;;;26373:6145:::0;;;:::o;18912:273::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;19031:3:::1;19013:14;:21;;18991:91;;;::::0;-1:-1:-1;;;18991:91:0;;21750:2:1;18991:91:0::1;::::0;::::1;21732:21:1::0;21789:2;21769:18;;;21762:30;-1:-1:-1;;;21808:18:1;;;21801:50;21868:18;;18991:91:0::1;21548:344:1::0;18991:91:0::1;19103:11;:28:::0;;;19147:30:::1;::::0;1103:25:1;;;19147:30:0::1;::::0;1091:2:1;1076:18;19147:30:0::1;;;;;;;18912:273:::0;:::o;11886:315::-;11968:20;12012:7;;-1:-1:-1;;;;;12046:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12046:15:0;;12037:24;;12077:6;12072:122;12093:3;12089:1;:7;12072:122;;;12126:12;:24;12139:7;;12147:1;12139:10;;;;;;;:::i;:::-;;;;;;;12126:24;;;;;;;;;;;;;;;;;;;;;12114:6;12121:1;12114:9;;;;;;;;:::i;:::-;:36;;;:9;;;;;;;;;;;:36;12177:3;;12072:122;;;;11990:211;11886:315;;;;:::o;6791:68::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;6838:6:::1;:13:::0;;-1:-1:-1;;6838:13:0::1;6847:4;6838:13;::::0;;6791:68::o;6089:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6089:28:0;:::o;34146:370::-;34232:14;34270:7;34259:8;34270:7;-1:-1:-1;;;;;34321:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34295:42;;34353:6;34348:135;34369:3;34365:1;:7;34348:135;;;34415:23;34427:7;;34435:1;34427:10;;;;;;;:::i;:::-;;;;;;;34415:11;:23::i;:::-;34404:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;34390:8;34399:1;34390:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;34466:3;;34348:135;;;-1:-1:-1;34500:8:0;34146:370;-1:-1:-1;;;;34146:370:0:o;7108:143::-;-1:-1:-1;;;;;;;;;;;;;;;;1269:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1255:29:0;:10;-1:-1:-1;;;;;1255:29:0;;1233:89;;;;-1:-1:-1;;;1233:89:0;;;;;;;:::i;:::-;7189:54:::1;7217:5;7224:10;7236:6;7189:27;:54::i;:::-;7108:143:::0;;:::o;34524:1298::-;34624:24;;;;;34830:7;;-1:-1:-1;;;;;34865:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34865:18:0;;34855:28;;34923:3;-1:-1:-1;;;;;34909:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34909:18:0;;34894:33;;34967:3;-1:-1:-1;;;;;34953:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34953:18:0;;34938:33;;35009:3;-1:-1:-1;;;;;34995:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34995:18:0;;34982:31;;35047:3;-1:-1:-1;;;;;35036:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35036:15:0;;35024:27;;35069:6;35064:751;35085:3;35081:1;:7;35064:751;;;35119:5;:17;35125:7;;35133:1;35125:10;;;;;;;:::i;:::-;;;;;;;35119:17;;;;;;;;;;;:22;;;;;;;;;;-1:-1:-1;;;;;35119:22:0;35106:7;35114:1;35106:10;;;;;;;;:::i;:::-;;;;;;:35;-1:-1:-1;;;;;35106:35:0;;;-1:-1:-1;;;;;35106:35:0;;;;;35156:14;35173:5;:17;35179:7;;35187:1;35179:10;;;;;;;:::i;:::-;;;;;;;35173:17;;;;;;;;;;;:24;;:31;;;;35156:48;;35223:6;35233:1;35223:11;35219:553;;35273:1;35255:12;35268:1;35255:15;;;;;;;;:::i;:::-;;;;;;:19;;;;;35311:1;35293:12;35306:1;35293:15;;;;;;;;:::i;:::-;;;;;;:19;;;;;35347:1;35331:10;35342:1;35331:13;;;;;;;;:::i;:::-;;;;;;:17;;;;;35382:5;35367:9;35377:1;35367:12;;;;;;;;:::i;:::-;:20;;;:12;;;;;;;;;;;:20;35219:553;;;35446:5;:17;35452:7;;35460:1;35452:10;;;;;;;:::i;:::-;;;;;;;35446:17;;;;;;;;;;;:24;;35471:1;35446:27;;;;;;;;:::i;:::-;;;;;;;;;;;:37;;;35428:12;35441:1;35428:15;;;;;;;;:::i;:::-;;;;;;:55;;;;;35546:5;:17;35552:7;;35560:1;35552:10;;;;;;;:::i;:::-;;;;;;;35546:17;;;;;;;;;;;:24;;;35528:12;35541:1;35528:15;;;;;;;;:::i;:::-;;;;;;:42;;;;;35621:5;:17;35627:7;;35635:1;35627:10;;;;;;;:::i;:::-;;;;;;;35621:17;;;;;;;;;;;:27;;;35605:10;35616:1;35605:13;;;;;;;;:::i;:::-;;;;;;:43;;;;;35707:5;:17;35713:7;;35721:1;35713:10;;;;;;;:::i;:::-;;;;;;;35707:17;;;;;;;;;;;:26;;;;;;;;;;;;35692:9;35702:1;35692:12;;;;;;;;:::i;:::-;:41;;;:12;;;;;;;;;;;:41;35219:553;-1:-1:-1;35798:3:0;;35064:751;;;;34808:1014;34524:1298;;;;;;;;:::o;7823:260::-;7919:6;-1:-1:-1;;;;;1704:20:0;;1714:10;1704:20;1700:182;;1767:36;;-1:-1:-1;;;1767:36:0;;1792:10;1767:36;;;160:51:1;-1:-1:-1;;;;;;;;;;;1149:42:0;1767:24;;133:18:1;;1767:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1741:129;;;;-1:-1:-1;;;1741:129:0;;22381:2:1;1741:129:0;;;22363:21:1;22420:2;22400:18;;;22393:30;22459:33;22439:18;;;22432:61;22510:18;;1741:129:0;22179:355:1;1741:129:0;-1:-1:-1;;;;;;;;;;;;;;;;1963:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;1941:91;;;::::0;-1:-1:-1;;;1941:91:0;;22741:2:1;1941:91:0::1;::::0;::::1;22723:21:1::0;22780:2;22760:18;;;22753:30;-1:-1:-1;;;22799:18:1;;;22792:46;22855:18;;1941:91:0::1;22539:340:1::0;1941:91:0::1;7973:6:::2;::::0;::::2;;7972:7;7950:63;;;::::0;-1:-1:-1;;;7950:63:0;;23086:2:1;7950:63:0::2;::::0;::::2;23068:21:1::0;23125:1;23105:18;;;23098:29;-1:-1:-1;;;23143:18:1;;;23136:36;23189:18;;7950:63:0::2;22884:329:1::0;7950:63:0::2;8048:27;8058:6;8066:8;;8048:9;:27::i;32901:420::-:0;32967:7;32987:22;-1:-1:-1;;;;;;;;;;;;;;;;33028:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33012:61;;-1:-1:-1;;;33012:61:0;;33065:7;33012:61;;;1103:25:1;-1:-1:-1;;;;;33012:52:0;;;;;;;1076:18:1;;33012:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32987:86;;33103:14;33090:9;:27;33086:228;;-1:-1:-1;;33141:12:0;;;32901:420;-1:-1:-1;32901:420:0:o;33086:228::-;33288:14;33274:9;33259:12;;:24;;;;:::i;:::-;33257:45;;;;:::i;:::-;33250:52;32901:420;-1:-1:-1;;;32901:420:0:o;7605:105::-;7647:7;-1:-1:-1;;;;;;;;;;;;;;;;7679:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7674:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7421:172::-;-1:-1:-1;;;;;;;;;;;;;;;;7524:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7510:75;;-1:-1:-1;;;7510:75:0;;-1:-1:-1;;;;;23410:32:1;;;7510:75:0;;;23392:51:1;23479:32;;;23459:18;;;23452:60;7510:44:0;;;;;;;7562:9;;23365:18:1;;7510:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7421:172;;;:::o;7259:154::-;-1:-1:-1;;;;;;;;;;;;;;;;7348:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7331:74;;-1:-1:-1;;;7331:74:0;;-1:-1:-1;;;;;23743:32:1;;;7331:74:0;;;23725:51:1;23792:18;;;23785:34;;;7397:7:0;23835:18:1;;;23828:34;7331:51:0;;;;;;;23698:18:1;;7331:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7259:154;;:::o;10488:778::-;10641:16;-1:-1:-1;;;;;;;;;;;;;;;;10665:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10660:33:0;;10701:11;:9;:11::i;:::-;10660:185;;-1:-1:-1;;;;;;10660:185:0;;;;;;;;;;24043:25:1;;;24116:4;24104:17;;24084:18;;;24077:45;24016:18;;10660:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10929:24:0;;;;;;:13;:24;;;;;;10641:204;;-1:-1:-1;10929:29:0;10907:95;;;;-1:-1:-1;;;10907:95:0;;24589:2:1;10907:95:0;;;24571:21:1;24628:2;24608:18;;;24601:30;-1:-1:-1;;;24647:18:1;;;24640:46;24703:18;;10907:95:0;24387:340:1;10907:95:0;-1:-1:-1;;;;;11073:24:0;;;;;;:13;:24;;;;;;;;;:33;;;11156:15;;-1:-1:-1;;;;;;11156:15:0;;;;-1:-1:-1;;;;;;;;;;;1149:42:0;11156:13;;:15;;;;;11073:24;;11156:15;;;;;1149:42;11156:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11149:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11231:27;11251:6;11231:27;;;;1103:25:1;;1091:2;1076:18;;957:177;11231:27:0;;;;;;;;10577:689;10488:778;;;:::o;11274:224::-;-1:-1:-1;;;;;;;;;;;;;;;;11380:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11373:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;11466:24:0;;;;;:13;:24;;;;;11459:31;11274:224::o;32526:367::-;32590:17;32626:10;;32622:264;;-1:-1:-1;;;;;;;;;;;;;;;;32709:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32750:7;;32702:65;;-1:-1:-1;;;32702:65:0;;32733:7;32702:65;;;24934:25:1;-1:-1:-1;;;;;32750:7:0;;;24975:18:1;;;24968:60;25044:18;;;25037:34;;;32702:30:0;;;;;24907:18:1;;32702:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32837:7;;;;;;;;;-1:-1:-1;;;;;32837:7:0;-1:-1:-1;;;;;32837:13:0;;-1:-1:-1;;;;;;;;;;;;;;;;32851:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32837:37;;-1:-1:-1;;;;;;32837:37:0;;;;;;;-1:-1:-1;;;;;178:32:1;;;32837:37:0;;;160:51:1;133:18;;32837:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32622:264::-;32526:367;;;:::o;3576:449::-;3808:45;;;-1:-1:-1;;;;;25274:32:1;;;3808:45:0;;;25256:51:1;25323:18;;;;25316:34;;;3808:45:0;;;;;;;;;;25229:18:1;;;;3808:45:0;;;;;;;-1:-1:-1;;;;;3808:45:0;-1:-1:-1;;;3808:45:0;;;3797:57;;-1:-1:-1;;;;3797:10:0;;;;:57;;3808:45;3797:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3761:93;;;;3887:7;:57;;;;-1:-1:-1;3899:11:0;;:16;;:44;;;3930:4;3919:24;;;;;;;;;;;;:::i;:::-;3865:152;;;;-1:-1:-1;;;3865:152:0;;25855:2:1;3865:152:0;;;25837:21:1;25894:2;25874:18;;;25867:30;25933:34;25913:18;;;25906:62;-1:-1:-1;;;25984:18:1;;;25977:43;26037:19;;3865:152:0;25653:409:1;3865:152:0;3683:342;;3576:449;;;:::o;19574:2194::-;19695:14;19712:11;:9;:11::i;:::-;19695:28;-1:-1:-1;19780:14:0;;;19871:49;;;;19882:8;19871:49;:::i;:::-;19765:155;;;;;;19996:6;19983:9;:19;;19961:84;;;;-1:-1:-1;;;19961:84:0;;26769:2:1;19961:84:0;;;26751:21:1;26808:2;26788:18;;;26781:30;-1:-1:-1;;;26827:18:1;;;26820:45;26882:18;;19961:84:0;26567:339:1;19961:84:0;20078:21;20092:6;20078:13;:21::i;:::-;:29;;20103:4;20078:29;20056:94;;;;-1:-1:-1;;;20056:94:0;;27113:2:1;20056:94:0;;;27095:21:1;27152:2;27132:18;;;27125:30;-1:-1:-1;;;27171:18:1;;;27164:45;27226:18;;20056:94:0;26911:339:1;20056:94:0;20202:22;20227:18;20239:6;20227:9;:18;:::i;:::-;20202:43;;20295:1;20278:14;:18;20256:86;;;;-1:-1:-1;;;20256:86:0;;27457:2:1;20256:86:0;;;27439:21:1;27496:2;27476:18;;;27469:30;-1:-1:-1;;;27515:18:1;;;27508:48;27573:18;;20256:86:0;27255:342:1;20256:86:0;20403:25;14809:6;20449:11;;20432:14;:28;;;;:::i;:::-;20431:42;;;;:::i;:::-;20403:70;;20533:24;14809:6;20578:10;;20561:14;:27;;;;:::i;:::-;20560:41;;;;:::i;:::-;20672:12;:32;;;;;;20533:68;-1:-1:-1;20792:43:0;20804:17;20823:3;20828:6;20792:11;:43::i;:::-;20877:13;;;;:5;:13;;;;;:27;;-1:-1:-1;;;;;;20877:27:0;-1:-1:-1;;;;;20877:27:0;;;;;20915:22;;;:30;;-1:-1:-1;;20915:30:0;;;20982:15;20956:23;;;;:41;21058:36;21078:16;21058:17;:36;:::i;:::-;21039:57;;:14;:57;:::i;:::-;21008:13;;;;:5;:13;;;;;;;;:28;;;;:88;;;;21185:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21159:20;;;;:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21159:292:0;;;;;;;;;;;;;;;;;;21185:265;;21159:292;;;;;-1:-1:-1;;21159:292:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;21493:31;21509:6;21517;21493:15;:31::i;:::-;21562:36;21575:6;21583:14;21562:12;:36::i;:::-;21659:6;-1:-1:-1;;;;;21647:27:0;;21667:6;21647:27;;;;1103:25:1;;1091:2;1076:18;;957:177;21647:27:0;;;;;;;;21719:41;21734:6;21742:1;21745:14;21719;:41::i;:::-;19652:2116;;;;;;;19574:2194;;;:::o;10208:272::-;10316:40;;-1:-1:-1;;;10316:40:0;;-1:-1:-1;;;;;23743:32:1;;;10316:40:0;;;23725:51:1;10340:7:0;23792:18:1;;;23785:34;23835:18;;;23828:34;;;10316:7:0;:15;;;;23698:18:1;;10316:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10410:11:0;:24;;;;;;;;;;;;-1:-1:-1;10445:20:0;;;:12;10410:24;10445:20;;;;;:27;;-1:-1:-1;;10445:27:0;;;;;;;-1:-1:-1;;;10208:272:0:o;222:226:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;395:23:1;;222:226;-1:-1:-1;222:226:1:o;1139:269::-;1196:6;1249:2;1237:9;1228:7;1224:23;1220:32;1217:52;;;1265:1;1262;1255:12;1217:52;1304:9;1291:23;1354:4;1347:5;1343:16;1336:5;1333:27;1323:55;;1374:1;1371;1364:12;1696:346;1764:6;1772;1825:2;1813:9;1804:7;1800:23;1796:32;1793:52;;;1841:1;1838;1831:12;1793:52;-1:-1:-1;;1886:23:1;;;2006:2;1991:18;;;1978:32;;-1:-1:-1;1696:346:1:o;2047:420::-;2100:3;2138:5;2132:12;2165:6;2160:3;2153:19;2197:4;2192:3;2188:14;2181:21;;2236:4;2229:5;2225:16;2259:1;2269:173;2283:6;2280:1;2277:13;2269:173;;;2344:13;;2332:26;;2387:4;2378:14;;;;2415:17;;;;2305:1;2298:9;2269:173;;;-1:-1:-1;2458:3:1;;2047:420;-1:-1:-1;;;;2047:420:1:o;2472:261::-;2651:2;2640:9;2633:21;2614:4;2671:56;2723:2;2712:9;2708:18;2700:6;2671:56;:::i;2738:515::-;2834:6;2842;2850;2903:2;2891:9;2882:7;2878:23;2874:32;2871:52;;;2919:1;2916;2909:12;2871:52;2964:23;;;-1:-1:-1;3063:2:1;3048:18;;3035:32;3098:1;3086:14;;3076:42;;3114:1;3111;3104:12;3076:42;2738:515;;3137:7;;-1:-1:-1;;;3217:2:1;3202:18;;;;3189:32;;2738:515::o;3258:131::-;-1:-1:-1;;;;;3333:31:1;;3323:42;;3313:70;;3379:1;3376;3369:12;3313:70;3258:131;:::o;3394:367::-;3462:6;3470;3523:2;3511:9;3502:7;3498:23;3494:32;3491:52;;;3539:1;3536;3529:12;3491:52;3578:9;3565:23;3597:31;3622:5;3597:31;:::i;:::-;3647:5;3725:2;3710:18;;;;3697:32;;-1:-1:-1;;;3394:367:1:o;3766:127::-;3827:10;3822:3;3818:20;3815:1;3808:31;3858:4;3855:1;3848:15;3882:4;3879:1;3872:15;3898:1576;4099:2;4088:9;4081:21;4062:4;4140:3;4129:9;4125:19;4186:6;4180:13;4175:2;4164:9;4160:18;4153:41;4248:2;4240:6;4236:15;4230:22;4225:2;4214:9;4210:18;4203:50;4334:1;4330;4325:3;4321:11;4317:19;4311:2;4303:6;4299:15;4293:22;4289:48;4284:2;4273:9;4269:18;4262:76;4407:2;4399:6;4395:15;4389:22;4382:30;4375:38;4369:3;4358:9;4354:19;4347:67;4469:3;4461:6;4457:16;4451:23;4445:3;4434:9;4430:19;4423:52;4522:3;4514:6;4510:16;4504:23;4565:4;4558;4547:9;4543:20;4536:34;4590:6;4625:12;4619:19;4662:6;4654;4647:22;4700:3;4689:9;4685:19;4678:26;;4745:2;4731:12;4727:21;4713:35;;4766:1;4757:10;;4776:672;4790:6;4787:1;4784:13;4776:672;;;4855:6;4849:13;4902:4;4897:2;4891:9;4887:20;4882:3;4875:33;4966:4;4960:2;4956;4952:11;4946:18;4942:29;4937:2;4932:3;4928:12;4921:51;5021:2;5017;5013:11;5007:18;5067:1;5051:14;5048:21;5038:172;;5120:10;5115:3;5111:20;5108:1;5101:31;5159:4;5156:1;5149:15;5191:4;5188:1;5181:15;5038:172;5244:14;5239:2;5234:3;5230:12;5223:36;;5307:2;5303;5299:11;5293:18;5288:2;5283:3;5279:12;5272:40;5361:3;5357:2;5353:12;5347:19;5341:3;5336;5332:13;5325:42;;5396:3;5391;5387:13;5380:20;;5435:2;5427:6;5423:15;5413:25;;4812:1;4809;4805:9;4800:14;;4776:672;;;-1:-1:-1;5465:3:1;3898:1576;-1:-1:-1;;;;;3898:1576:1:o;5904:129::-;-1:-1:-1;;;;;5982:5:1;5978:30;5971:5;5968:41;5958:69;;6023:1;6020;6013:12;6038:367;6101:8;6111:6;6165:3;6158:4;6150:6;6146:17;6142:27;6132:55;;6183:1;6180;6173:12;6132:55;-1:-1:-1;6206:20:1;;-1:-1:-1;;;;;6238:30:1;;6235:50;;;6281:1;6278;6271:12;6235:50;6318:4;6310:6;6306:17;6294:29;;6378:3;6371:4;6361:6;6358:1;6354:14;6346:6;6342:27;6338:38;6335:47;6332:67;;;6395:1;6392;6385:12;6332:67;6038:367;;;;;:::o;6410:570::-;6504:6;6512;6520;6573:2;6561:9;6552:7;6548:23;6544:32;6541:52;;;6589:1;6586;6579:12;6541:52;6628:9;6615:23;6647:30;6671:5;6647:30;:::i;:::-;6696:5;-1:-1:-1;6752:2:1;6737:18;;6724:32;-1:-1:-1;;;;;6768:30:1;;6765:50;;;6811:1;6808;6801:12;6765:50;6850:70;6912:7;6903:6;6892:9;6888:22;6850:70;:::i;:::-;6410:570;;6939:8;;-1:-1:-1;6824:96:1;;-1:-1:-1;;;;6410:570:1:o;6985:437::-;7071:6;7079;7132:2;7120:9;7111:7;7107:23;7103:32;7100:52;;;7148:1;7145;7138:12;7100:52;7188:9;7175:23;-1:-1:-1;;;;;7213:6:1;7210:30;7207:50;;;7253:1;7250;7243:12;7207:50;7292:70;7354:7;7345:6;7334:9;7330:22;7292:70;:::i;:::-;7381:8;;7266:96;;-1:-1:-1;6985:437:1;-1:-1:-1;;;;6985:437:1:o;7427:433::-;7477:3;7515:5;7509:12;7542:6;7537:3;7530:19;7574:4;7569:3;7565:14;7558:21;;7613:4;7606:5;7602:16;7636:1;7646:189;7660:6;7657:1;7654:13;7646:189;;;7735:13;;7728:21;7721:29;7709:42;;7780:4;7771:14;;;;7808:17;;;;7682:1;7675:9;7646:189;;7865:252;8038:2;8027:9;8020:21;8001:4;8058:53;8107:2;8096:9;8092:18;8084:6;8058:53;:::i;8122:250::-;8207:1;8217:113;8231:6;8228:1;8225:13;8217:113;;;8307:11;;;8301:18;8288:11;;;8281:39;8253:2;8246:10;8217:113;;;-1:-1:-1;;8364:1:1;8346:16;;8339:27;8122:250::o;8377:991::-;8537:4;8585:2;8574:9;8570:18;8615:2;8604:9;8597:21;8638:6;8673;8667:13;8704:6;8696;8689:22;8742:2;8731:9;8727:18;8720:25;;8804:2;8794:6;8791:1;8787:14;8776:9;8772:30;8768:39;8754:53;;8842:2;8834:6;8830:15;8863:1;8873:466;8887:6;8884:1;8881:13;8873:466;;;8980:2;8976:7;8964:9;8956:6;8952:22;8948:36;8943:3;8936:49;9014:6;9008:13;9056:2;9050:9;9087:8;9079:6;9072:24;9109:74;9174:8;9169:2;9161:6;9157:15;9152:2;9148;9144:11;9109:74;:::i;:::-;9249:2;9226:17;-1:-1:-1;;9222:31:1;9210:44;;;;9256:2;9206:53;;;;-1:-1:-1;9317:12:1;;;;9282:15;;;;;8909:1;8902:9;8873:466;;;-1:-1:-1;9356:6:1;;8377:991;-1:-1:-1;;;;;;8377:991:1:o;9604:1424::-;10100:3;10113:22;;;10184:13;;10085:19;;;10206:22;;;10052:4;;10298;10286:17;;;10259:3;10244:19;;;10052:4;10331:199;10345:6;10342:1;10339:13;10331:199;;;10410:13;;-1:-1:-1;;;;;10406:39:1;10394:52;;10475:4;10503:17;;;;10466:14;;;;10442:1;10360:9;10331:199;;;10335:3;;10577:9;10572:3;10568:19;10561:4;10550:9;10546:20;10539:49;10611:41;10648:3;10640:6;10611:41;:::i;:::-;10597:55;;;10700:9;10692:6;10688:22;10683:2;10672:9;10668:18;10661:50;10734:44;10771:6;10763;10734:44;:::i;:::-;10720:58;;10826:9;10818:6;10814:22;10809:2;10798:9;10794:18;10787:50;10860:44;10897:6;10889;10860:44;:::i;:::-;10846:58;;10953:9;10945:6;10941:22;10935:3;10924:9;10920:19;10913:51;10981:41;11015:6;11007;10981:41;:::i;:::-;10973:49;9604:1424;-1:-1:-1;;;;;;;;9604:1424:1:o;11033:721::-;11112:6;11120;11128;11181:2;11169:9;11160:7;11156:23;11152:32;11149:52;;;11197:1;11194;11187:12;11149:52;11236:9;11223:23;11255:31;11280:5;11255:31;:::i;:::-;11305:5;-1:-1:-1;11361:2:1;11346:18;;11333:32;-1:-1:-1;;;;;11377:30:1;;11374:50;;;11420:1;11417;11410:12;11374:50;11443:22;;11496:4;11488:13;;11484:27;-1:-1:-1;11474:55:1;;11525:1;11522;11515:12;11474:55;11565:2;11552:16;-1:-1:-1;;;;;11583:6:1;11580:30;11577:50;;;11623:1;11620;11613:12;11577:50;11668:7;11663:2;11654:6;11650:2;11646:15;11642:24;11639:37;11636:57;;;11689:1;11686;11679:12;11636:57;11033:721;;11720:2;11712:11;;;;;-1:-1:-1;11742:6:1;;-1:-1:-1;;;11033:721:1:o;12188:251::-;12258:6;12311:2;12299:9;12290:7;12286:23;12282:32;12279:52;;;12327:1;12324;12317:12;12279:52;12359:9;12353:16;12378:31;12403:5;12378:31;:::i;12444:334::-;12646:2;12628:21;;;12685:2;12665:18;;;12658:30;-1:-1:-1;;;12719:2:1;12704:18;;12697:40;12769:2;12754:18;;12444:334::o;12783:127::-;12844:10;12839:3;12835:20;12832:1;12825:31;12875:4;12872:1;12865:15;12899:4;12896:1;12889:15;12915:128;12982:9;;;13003:11;;;13000:37;;;13017:18;;:::i;13048:127::-;13109:10;13104:3;13100:20;13097:1;13090:31;13140:4;13137:1;13130:15;13164:4;13161:1;13154:15;13180:127;13241:10;13236:3;13232:20;13229:1;13222:31;13272:4;13269:1;13262:15;13296:4;13293:1;13286:15;16829:168;16902:9;;;16933;;16950:15;;;16944:22;;16930:37;16920:71;;16971:18;;:::i;17002:127::-;17063:10;17058:3;17054:20;17051:1;17044:31;17094:4;17091:1;17084:15;17118:4;17115:1;17108:15;17134:120;17174:1;17200;17190:35;;17205:18;;:::i;:::-;-1:-1:-1;17239:9:1;;17134:120::o;17259:125::-;17324:9;;;17345:10;;;17342:36;;;17358:18;;:::i;20294:611::-;-1:-1:-1;;;;;20538:31:1;;20520:50;;20601:2;20586:18;;20579:34;;;20649:2;20644;20629:18;;20622:30;;;20668:18;;20661:34;;;-1:-1:-1;;;;;;20707:31:1;;20704:51;;;20751:1;20748;20741:12;20704:51;20785:6;20782:1;20778:14;20843:6;20835;20829:3;20818:9;20814:19;20801:49;20871:22;;;;20895:3;20867:32;;20294:611;-1:-1:-1;;;;;20294:611:1:o;20910:112::-;20942:1;20968;20958:35;;20973:18;;:::i;:::-;-1:-1:-1;21007:9:1;;20910:112::o;21027:184::-;21097:6;21150:2;21138:9;21129:7;21125:23;21121:32;21118:52;;;21166:1;21163;21156:12;21118:52;-1:-1:-1;21189:16:1;;21027:184;-1:-1:-1;21027:184:1:o;21897:277::-;21964:6;22017:2;22005:9;21996:7;21992:23;21988:32;21985:52;;;22033:1;22030;22023:12;21985:52;22065:9;22059:16;22118:5;22111:13;22104:21;22097:5;22094:32;22084:60;;22140:1;22137;22130:12;24133:249;24202:6;24255:2;24243:9;24234:7;24230:23;24226:32;24223:52;;;24271:1;24268;24261:12;24223:52;24303:9;24297:16;24322:30;24346:5;24322:30;:::i;25361:287::-;25490:3;25528:6;25522:13;25544:66;25603:6;25598:3;25591:4;25583:6;25579:17;25544:66;:::i;:::-;25626:16;;;;;25361:287;-1:-1:-1;;25361:287:1:o;26067:495::-;26152:6;26160;26168;26221:2;26209:9;26200:7;26196:23;26192:32;26189:52;;;26237:1;26234;26227:12;26189:52;26282:23;;;-1:-1:-1;26381:2:1;26366:18;;26353:32;26394:33;26353:32;26394:33;:::i

Swarm Source

ipfs://18624476a6721dc7d7cd3622d89d7486429f953f6ab06d1bdff0137bf2f166d9

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