S Price: $0.870869 (+0.60%)

Contract

0x09fF1c8C2EeDFAd429567d7aEA0c53020b52AE39

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Train Pet89234332025-02-20 17:13:168 hrs ago1740071596IN
0x09fF1c8C...20b52AE39
0 S0.039722765.00133333
Train Pet89233192025-02-20 17:12:388 hrs ago1740071558IN
0x09fF1c8C...20b52AE39
0 S0.0413616467.63191155
Train Pet89232432025-02-20 17:12:138 hrs ago1740071533IN
0x09fF1c8C...20b52AE39
0 S0.021351850
Train Pet89231662025-02-20 17:11:478 hrs ago1740071507IN
0x09fF1c8C...20b52AE39
0 S0.0274870964.66866666
Train Pet87873212025-02-20 2:41:3523 hrs ago1740019295IN
0x09fF1c8C...20b52AE39
0 S0.022132950
Train Pet87872522025-02-20 2:41:0023 hrs ago1740019260IN
0x09fF1c8C...20b52AE39
0 S0.0212526550
Train Pet87562632025-02-19 23:03:3027 hrs ago1740006210IN
0x09fF1c8C...20b52AE39
0 S0.021348750
Train Pet87562152025-02-19 23:03:0827 hrs ago1740006188IN
0x09fF1c8C...20b52AE39
0 S0.0213565550
Train Pet87561012025-02-19 23:02:2627 hrs ago1740006146IN
0x09fF1c8C...20b52AE39
0 S0.0305534250.2
Open Box87560372025-02-19 23:02:0027 hrs ago1740006120IN
0x09fF1c8C...20b52AE39
0 S0.036007450
Train Pet86802602025-02-19 15:30:2734 hrs ago1739979027IN
0x09fF1c8C...20b52AE39
0 S0.0317834574.4460079
Train Pet86802042025-02-19 15:30:1034 hrs ago1739979010IN
0x09fF1c8C...20b52AE39
0 S0.0291437668.58841807
Train Pet86801512025-02-19 15:29:5234 hrs ago1739978992IN
0x09fF1c8C...20b52AE39
0 S0.0300481170.70993276
Feed Pet86580032025-02-19 13:23:3636 hrs ago1739971416IN
0x09fF1c8C...20b52AE39
0 S0.0311435973.50509993
Feed Pet86579912025-02-19 13:23:3236 hrs ago1739971412IN
0x09fF1c8C...20b52AE39
0 S0.0244443857.97867456
Train Pet86579062025-02-19 13:22:5936 hrs ago1739971379IN
0x09fF1c8C...20b52AE39
0 S0.0221208550
Train Pet86578572025-02-19 13:22:4036 hrs ago1739971360IN
0x09fF1c8C...20b52AE39
0 S0.0213374550
Train Pet86578022025-02-19 13:22:2236 hrs ago1739971342IN
0x09fF1c8C...20b52AE39
0 S0.021346150
Train Pet86577672025-02-19 13:22:0836 hrs ago1739971328IN
0x09fF1c8C...20b52AE39
0 S0.0213425550
Feed Pet86576862025-02-19 13:21:4136 hrs ago1739971301IN
0x09fF1c8C...20b52AE39
0 S0.021184150
Feed Pet86576382025-02-19 13:21:2236 hrs ago1739971282IN
0x09fF1c8C...20b52AE39
0 S0.0210799550
Open Box86569962025-02-19 13:17:2636 hrs ago1739971046IN
0x09fF1c8C...20b52AE39
0 S0.0542991575.4
Train Pet85780222025-02-19 4:17:2845 hrs ago1739938648IN
0x09fF1c8C...20b52AE39
0 S0.0212557550
Train Pet85779882025-02-19 4:17:1345 hrs ago1739938633IN
0x09fF1c8C...20b52AE39
0 S0.0230560454.23076923
Train Pet85779182025-02-19 4:16:3645 hrs ago1739938596IN
0x09fF1c8C...20b52AE39
0 S0.022136450
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
83889262025-02-18 3:48:222 days ago1739850502
0x09fF1c8C...20b52AE39
32 S
83886522025-02-18 3:45:462 days ago1739850346
0x09fF1c8C...20b52AE39
24 S
83886362025-02-18 3:45:342 days ago1739850334
0x09fF1c8C...20b52AE39
16 S
83850792025-02-18 3:12:472 days ago1739848367
0x09fF1c8C...20b52AE39
8 S
83709902025-02-18 1:13:503 days ago1739841230
0x09fF1c8C...20b52AE39
8 S
83582782025-02-17 23:26:003 days ago1739834760
0x09fF1c8C...20b52AE39
8 S
83576982025-02-17 23:21:013 days ago1739834461
0x09fF1c8C...20b52AE39
8 S
83538362025-02-17 22:51:343 days ago1739832694
0x09fF1c8C...20b52AE39
8 S
83528022025-02-17 22:43:323 days ago1739832212
0x09fF1c8C...20b52AE39
120 S
83522552025-02-17 22:39:253 days ago1739831965
0x09fF1c8C...20b52AE39
112 S
83513382025-02-17 22:32:513 days ago1739831571
0x09fF1c8C...20b52AE39
104 S
83507162025-02-17 22:28:173 days ago1739831297
0x09fF1c8C...20b52AE39
96 S
83502782025-02-17 22:25:063 days ago1739831106
0x09fF1c8C...20b52AE39
88 S
83444342025-02-17 21:47:553 days ago1739828875
0x09fF1c8C...20b52AE39
32 S
83444182025-02-17 21:47:483 days ago1739828868
0x09fF1c8C...20b52AE39
24 S
83444012025-02-17 21:47:413 days ago1739828861
0x09fF1c8C...20b52AE39
16 S
83443862025-02-17 21:47:353 days ago1739828855
0x09fF1c8C...20b52AE39
8 S
83359572025-02-17 20:51:193 days ago1739825479
0x09fF1c8C...20b52AE39
8 S
83321392025-02-17 20:22:393 days ago1739823759
0x09fF1c8C...20b52AE39
80 S
83312122025-02-17 20:15:123 days ago1739823312
0x09fF1c8C...20b52AE39
72 S
83293752025-02-17 19:58:533 days ago1739822333
0x09fF1c8C...20b52AE39
64 S
83283362025-02-17 19:50:023 days ago1739821802
0x09fF1c8C...20b52AE39
56 S
83265162025-02-17 19:34:173 days ago1739820857
0x09fF1c8C...20b52AE39
8 S
83242832025-02-17 19:15:273 days ago1739819727
0x09fF1c8C...20b52AE39
15 S
83212172025-02-17 18:53:103 days ago1739818390
0x09fF1c8C...20b52AE39
48 S
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FARPG_BasicInteractions

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-02-14
*/

// File: @openzeppelin/[email protected]/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: FINALdeployFA/LIB - Common Structs.sol


pragma solidity ^0.8.9;
        
        
library S { 

//Pet struct
   
    struct Unit {
        uint hp; //unit fainted when hp <= 0
        uint attack; //attack - defense = damage on hp
        uint defense; //attack - defense = damage on hp
        uint speed; //how frequent to take a move
        uint intelligence; //how frequent to use skill
        uint genestrength; //depends on how many duplicates
        uint range; //range skill, id
        uint special; //special skill, id
    }

    struct Status {
        
        uint id; //unit id
        uint family; //determine which class of gear it can be wore. record while evolve, since its only has max 2 family, example Dragon+phantom, and 30gene max, so can use *100
       
        uint stage; //1 is rookie, 2 is mature, 3 is perfect
       
    }


    struct Time {
        uint bond; //how many time you took on this unit , use to evolve
        uint stamina; //how much you can train it per day. it should follow saturation graph
        uint hunger; //how much you feed it per day. it should follow saturation graph
    }


}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: FINALdeployFA/INTERFACE - StorageV2.sol


pragma solidity ^0.8.20;

// Import your custom structs


/**
 * @title IFARPG_Storage
 * @dev Interface for FARPG_Storage so other contracts can call it
 */
interface IFARPG_Storage {
    //-------------------------------------------------------------------------
    // Administrative / Master Contract Access
    //-------------------------------------------------------------------------
    function owner() external view returns (address);
    function masterContracts(uint index) external view returns (address);
    function masterIndex(address) external view returns (uint);
    function addMasterContract(address _address, uint _index) external;
    function addMasterContractBatch(address[] memory _addresses, uint[] memory _indices) external;
    function removeMasterContract(uint _index) external;
    function getAllMasterContracts() external view returns (address[] memory, uint[] memory);

    //-------------------------------------------------------------------------
    // UID Management
    //-------------------------------------------------------------------------
    function UIDmain(address) external view returns (uint);
    function UID_ownedby(uint) external view returns (address);
    function UIDcounter() external view returns (uint);
    function getUID(address player) external view returns (uint _UID);
    function transferUID(address player, address newplayerwallet) external;
    function registerUID(address player) external;

    function setUIDmain (address playerAddress, uint UID) external;
    function setUID_ownedby (uint UID, address playerAddress) external;

    //-------------------------------------------------------------------------
    // Quest (setters)
    //-------------------------------------------------------------------------
    function setMainQuest(address player, uint index, uint8 progress) external;
    function setSideQuest(address player, uint index, uint8 progress) external;
    function setPremiumScore(address player, uint score) external;
    function setPlayerGeneStrength(address player, uint index, uint strength) external;
    function setPlayerVitamin(address player, uint index, uint amount) external;

    //-------------------------------------------------------------------------
    // Quest (getters)
    //-------------------------------------------------------------------------
    function getMainQuestProgress(address player, uint index) external view returns (uint8);
    function getSideQuestProgress(address player, uint index) external view returns (uint8);
    function getPremiumScore(address player) external view returns (uint);
    function getPlayerQuestAndScore(address player, uint index) external view returns (uint, uint, uint);
    function getMainQuestProgressArray(address player) external view returns (uint8[64] memory);
    function getSideQuestProgressArray(address player) external view returns (uint8[64] memory);


    //-------------------------------------------------------------------------
    // Player Stats (setters)
    //-------------------------------------------------------------------------
    function setPersonalWallet(address player, address personal) external;
    function setGiveControlTo(address player, address web2wallet) external;
    function setExp(address player, uint experience) external;
    function setRankScore(address player, uint score) external;
    function setEnergy1(address player, uint energy) external;
    function setEnergy2(address player, uint energy) external;
    function setEnergy22(address player, uint energy) external;
    function setEnergy3(address player, uint energy) external;
    function setTeamFormat(address player, uint[60] calldata format) external;
    function setUsernameToUID(string memory username, uint _UID) external;
    function setUIDToUsername(uint _UID, string memory username) external;
    function deleteUsernameToAddress (string memory username) external;

    // Points
    function setPoint1(address player, uint point) external;
    function setPoint2(address player, uint point) external;
    function setPoint3(address player, uint point) external;
    function setPoint4(address player, uint point) external;
    function setPoint5(address player, uint point) external;
    function addPoint1(address player, uint point) external;
    function addPoint2(address player, uint point) external;
    function addPoint3(address player, uint point) external;
    function addPoint4(address player, uint point) external;
    function addPoint5(address player, uint point) external;

    //-------------------------------------------------------------------------
    // Player Stats (getters)
    //-------------------------------------------------------------------------
    function personalwallet(address) external view returns (address);
    function givecontrolto(address) external view returns (address);
    function getExperience(address player) external view returns (uint);
    function getRankingScore(address player) external view returns (uint);
    function getEnergy1(address player) external view returns (uint);
    function getEnergy2(address player) external view returns (uint);
    function getEnergy22(address player) external view returns (uint);
    function getEnergy3(address player) external view returns (uint);
    function getPlayerStats(address player) external view returns (uint, uint, uint, uint, uint, uint);
    function UIDToUsername(uint) external view returns (string memory);
    function usernameToUID(string memory) external view returns (uint);
    function getPoint1(address player) external view returns (uint);
    function getPoint2(address player) external view returns (uint);
    function getPoint3(address player) external view returns (uint);
    function getPoint4(address player) external view returns (uint);
    function getPoint5(address player) external view returns (uint);
    function getPlayerPoints(address player) external view returns (uint, uint, uint, uint, uint);
    function getPlayergenestrengthArray(address player) external view returns (uint[50] memory);
    function getPlayerGeneStrength(address player, uint index) external view returns (uint);
    function getPlayervitaminArray(address player) external view returns (uint[50] memory);
    function getPlayerVitamin(address player, uint index) external view returns (uint);
    //-------------------------------------------------------------------------
    // Limits (setters)
    //-------------------------------------------------------------------------
    function setLimit1(address player, uint limit) external;
    function setLimit2(address player, uint limit) external;
    function setLimit3(address player, uint limit) external;
    function setTimebound1(address player, uint timestamp) external;
    function setTimebound2(address player, uint timestamp) external;
    function setTimebound3(address player, uint timestamp) external;

    //-------------------------------------------------------------------------
    // Limits (getters)
    //-------------------------------------------------------------------------
    function getLimit1(address player) external view returns (uint);
    function getLimit2(address player) external view returns (uint);
    function getLimit3(address player) external view returns (uint);
    function getTimebound1(address player) external view returns (uint);
    function getTimebound2(address player) external view returns (uint);
    function getTimebound3(address player) external view returns (uint);
    function getPlayerLimits(address player) external view returns (uint, uint, uint, uint, uint, uint);

    //-------------------------------------------------------------------------
    // Numberset (setters)
    //-------------------------------------------------------------------------
    function setNumberSet1(address player, uint[6] memory number) external;
    function setNumberSet2(address player, uint[5] memory number) external;
    function setNumberSet3(address player, uint[5] memory number) external;
    function setNumberSet4(address player, uint[5] memory number) external;
    function setNumberSet5(address player, uint[5] memory number) external;
    function setNumberSet6(address player, uint[5] memory number) external;
    function setNumberSet7(address player, uint[5] memory number) external;
    function setNumberSet8(address player, uint[5] memory number) external;
    function setNumberSet9(address player, uint[5] memory number) external;
     function setNumberSetA(address player, uint[5] memory number) external; 
    function setNumberSetB(address player, uint[5] memory number) external; 
    function setNumberSetC(address player, uint[5] memory number) external; 
    function setNumberSetD(address player, uint[5] memory number) external; 
    function setNumberSetE(address player, uint[10] memory number) external; 
    function setNumberSetF(address player, uint[10] memory number) external; 
    function setNumberSetG(address player, uint[10] memory number) external; 
    function setNumberSetH(address player, uint[10] memory number) external;    

    //-------------------------------------------------------------------------
    // Numberset (getters)
    //-------------------------------------------------------------------------
    function getNumberSet1(address player) external view returns (uint[6] memory);
    function getNumberSet2(address player) external view returns (uint[5] memory);
    function getNumberSet3(address player) external view returns (uint[5] memory);
    function getNumberSet4(address player) external view returns (uint[5] memory);
    function getNumberSet5(address player) external view returns (uint[5] memory);
    function getNumberSet6(address player) external view returns (uint[5] memory);
    function getNumberSet7(address player) external view returns (uint[5] memory);
    function getNumberSet8(address player) external view returns (uint[5] memory);
    function getNumberSet9(address player) external view returns (uint[5] memory);
    function getNumberSetA(address player) external view returns (uint[5] memory);
    function getNumberSetB(address player) external view returns (uint[5] memory);
    function getNumberSetC(address player) external view returns (uint[5] memory);
    function getNumberSetD(address player) external view returns (uint[5] memory);
    function getNumberSetE(address player) external view returns (uint[10] memory);
    function getNumberSetF(address player) external view returns (uint[10] memory);
    function getNumberSetG(address player) external view returns (uint[10] memory);
    function getNumberSetH(address player) external view returns (uint[10] memory);
    
    //-------------------------------------------------------------------------
    // PVP Ranks
    //-------------------------------------------------------------------------
    struct Player {
        uint256 rankPoints;
        uint256 league;
        uint256 indexInLeague; // Index of the player within their league array
    }
    function setPlayers(address player, Player memory rankpointleagueindexinleague) external; 
    function setReset_Time_Attempts(address player, uint[2] memory resettimeattemps) external;  
    function setEligible_Opponents(address player, address[5] memory eligibleOppo) external;  
    function setFaught_Opponents(address player, uint[5] memory faughtOppo) external;  
    function setDefending_Formation(address player, uint[3] memory defendingslot) external;  
    function getPlayers(address player) external view returns (Player memory ) ;
    function getReset_Time_Attempts(address player ) external view returns (uint[2] memory );
    function getEligible_Opponents(address player  ) external view returns (address[5] memory);
    function getFaught_Opponents(address player ) external view returns(uint[5] memory) ;
    function getDefending_Formation(address player) external view returns (uint[3] memory );



    //-------------------------------------------------------------------------
    // Pet data (setters)
    //-------------------------------------------------------------------------
    function setPetUnits(address player, uint index, S.Unit memory newUnit) external;
    function setPetUnitsMaxVitamined(address player, uint index, S.Unit memory newUnit) external;
    function setPetStatuses(address player, uint index, S.Status memory newStatus) external;
    function setPetTimes(address player, uint index, S.Time memory newTime) external;

    //-------------------------------------------------------------------------
    // Pet data (getters)
    //-------------------------------------------------------------------------
    function getPetUnitsAll(address player) external view returns (S.Unit[500] memory);
    function getPetUnits(address player, uint _index) external view returns (S.Unit memory);
    function getPetUnitsMaxVitaminedAll(address player) external view returns (S.Unit[500] memory);
    function getPetUnitsMaxVitamined(address player, uint _index) external view returns (S.Unit memory);
    function getPetStatusesAll(address player) external view returns (S.Status[500] memory);
    function getPetStatuses(address player, uint _index) external view returns (S.Status memory);
    function getPetTimesAll(address player) external view returns (S.Time[500] memory);
    function getPetTimes(address player, uint _index) external view returns (S.Time memory);

    //-------------------------------------------------------------------------
    // Party / Outfit
    //-------------------------------------------------------------------------
    function setPartyFormation(address player, uint[30] memory slots) external;
    function setTrainerOutfitPosition(address player, uint[150] memory outfitIds) external;
    function getPartyFormation(address player) external view returns (uint[30] memory);
    function getAllOutfits(address player) external view returns (uint[150] memory);

    //-------------------------------------------------------------------------
    // Trainer Gene Infusing
    //-------------------------------------------------------------------------
    function setTrainerGeneInfusingGene(address player, uint index, uint value) external; 
    function setTrainerGeneInfusingGeneAll(address player, uint[50] memory newData) external;
    function setTrainerGeneInfusingTimer(address player, uint index, uint value) external; 
    function setTrainerGeneInfusingTimerAll(address player, uint[50] memory newData) external;

    function getTrainerGeneInfusingGeneAll(address player) external view returns (uint[50] memory) ;
    function getTrainerGeneInfusingTimerAll(address player) external view returns (uint[50] memory);
    function getTrainerGeneInfusingGene(address player, uint Index)external  view returns (uint ) ;
    function getTrainerGeneInfusingTimer(address player, uint Index)external  view returns (uint );


    //-------------------------------------------------------------------------
    // Additional Utility
    //-------------------------------------------------------------------------
    function getBattleUnit3(address player, uint[3] calldata slots)
        external
        view
        returns (S.Unit[3] memory Units3, uint[3] memory UnitIds);

    function getSlotUnitMore(address player, uint startindex, uint stopindex)
        external
        view
        returns (S.Unit[] memory Units, uint[] memory UnitIds);

    function getTeamFormat(address _addr) external view returns (uint[60] memory);

    //-------------------------------------------------------------------------
    // Weather System
    //-------------------------------------------------------------------------
    function getWeatherUnity() external view returns (uint _weather, uint _daylight, uint _blocktime);
    function getWeatherBattle(uint _timenow) external view returns (uint _weather);
    function setWeatherConstants(uint[12] memory _weatherIndices) external;
    function getWeatherIndexConstants() external view returns (uint[] memory);
}

// File: FINALdeployFA/PUBLIC - Basic Interactions V1.sol


pragma solidity ^0.8.19;

//_______________________________________________________________
//    ___ __   __     _   ___      _   ___    _ __  
//   | _ )\ \ / /  _ | | / _ \  _ | | / _ \  (_)\ \ 
//   | _ \ \ V /  | || || (_) || || || (_) |  _  | |
//   |___/  |_|    \__/  \___/  \__/  \___/  ( ) | |
//                                           |/ /_/ 
//_______________________________________________________________





// Interface for accessing Storage
//-------------------------------------------------------------------
//    _____ _   _ _______ ______ _____  ______      _____ ______ 
//   |_   _| \ | |__   __|  ____|  __ \|  ____/\   / ____|  ____|
//     | | |  \| |  | |  | |__  | |__) | |__ /  \ | |    | |__   
//     | | | . ` |  | |  |  __| |  _  /|  __/ /\ \| |    |  __|  
//    _| |_| |\  |  | |  | |____| | \ \| | / ____ \ |____| |____ 
//   |_____|_| \_|  |_|  |______|_|  \_\_|/_/    \_\_____|______|
//                                                          
//-------------------------------------------------------------------

interface FARPG_RAMInterface {
    // Read functions
    struct TrainerData {
        uint gene;
        uint[50] genestrength;
        uint hashed;
    }
    function genetoid_mapping(uint trainergene) external pure returns (uint);
    function petunitsmax(uint id) external pure returns (S.Unit calldata);
    function petunitsevolveid(S.Status calldata _status, S.Unit calldata _Unit, TrainerData calldata _trainerData) external pure returns (S.Status memory , uint  );
}
contract FARPG_BasicInteractions is Ownable, ReentrancyGuard {
    IFARPG_Storage public contractStorage;
    FARPG_RAMInterface public contractRAM;

    constructor() {
        
    }
    event StatChangedResult(S.Unit AfterUnit, S.Status AfterStatus, S.Time AfterTime);
//-------------------------------------------------------------------
//    _____ _      ____  ____          _       __      __    
//   / ____| |    / __ \|  _ \   /\   | |      \ \    / /    
//  | |  __| |   | |  | | |_) | /  \  | |       \ \  / /     
//  | | |_ | |   | |  | |  _ < / /\ \ | |        \ \/ /      
//  | |__| | |___| |__| | |_) / ____ \| |____     \  /     _ 
//   \_____|______\____/|____/_/    \_\______|     \/     (_)
//                                                                                                             
//-------------------------------------------------------------------
    uint public PRICE_TOOPENBOX = 8 ether; //Default 8S .openbox for 1st one in 24hr is free, next will be this PRICE, and 2x, 3x, and so on.
    uint public PRICE_EXPANDSLOT = 5 ether; //Default 5S.fixed for each attemps to expand 1 slot
    uint public TIME_BOXLIMITRESET = 24 hours; //0th box opened until next TIME, the limit is reset, and can open 0th box again for free.
    S.Unit[500] public petunitsMAX;
    uint public TIME_INITIALSTAMINA = 24 hours; //initial stamina
    uint public TIME_INITIALENDURANCE = 3 hours; //initial endurance/hunger
    uint public REENTRANT_TIMELIMIT = 2 seconds; // default 2 seconds. means u cannot run the nonreentrant functions >1 time within 3 seconds.
    uint public PET_STAMINA_MAX = 24 hours; //maximum stamina even rested for so long
    uint public PET_HUNGER_MAX = 24 hours; // if a pet left for very long time. the MAX hunger should be...

    uint public ROOKIETOMATURE_BOND = 35 hours; 
    uint public MATURETOPERFECT_BOND = 81 hours; // on evolved, you gain max stamina and initial hunger again, means 45hours again.
    mapping (address => uint) private reentrant_time;
//--------------------------------------------------------- 
//                     _____  __  __ _____ _   _ 
//               /\   |  __ \|  \/  |_   _| \ | |
//              /  \  | |  | | \  / | | | |  \| |
//             / /\ \ | |  | | |\/| | | | | . ` |
//            / ____ \| |__| | |  | |_| |_| |\  |
//           /_/    \_\_____/|_|  |_|_____|_| \_|
//                                               
//---------------------------------------------------------                                               
    address public treasury = msg.sender; //default

    function updateTreasury(address _newTreasury) external onlyOwner {
        require(_newTreasury != address(0), "Invalid treasury address");
        treasury = _newTreasury;
    }
    function updateStorageContractAAddress(address _newContractAAddress) external onlyOwner {
        require(_newContractAAddress != address(0), "Invalid address");
        contractStorage = IFARPG_Storage(_newContractAAddress);
    }
    function updateRAMContractAAddress(address _newContractAAddress) external onlyOwner {
        require(_newContractAAddress != address(0), "Invalid address");
        contractRAM = FARPG_RAMInterface(_newContractAAddress);
    }
    function withdraw() external onlyOwner {
        // Function to withdraw all balance from the contract for revenue
        require(address(this).balance > 0, "Contract balance is zero");
        payable(treasury).transfer(address(this).balance);
    }
    //------------ game setting -------------

 
    function setPriceToOpenBox(uint _newPrice) external onlyOwner {
        PRICE_TOOPENBOX = _newPrice;
    }
    function setPriceExpandSlot(uint _newPrice) external onlyOwner {
        PRICE_EXPANDSLOT = _newPrice;
    }
    function setTimeBoxLimitReset(uint _newTime) external onlyOwner {
        TIME_BOXLIMITRESET = _newTime;
    }
    function setTimeInitialStamina(uint _newTime) external onlyOwner {
        TIME_INITIALSTAMINA = _newTime;
    }
    function setTimeInitialEndurance(uint _newTime) external onlyOwner {
        TIME_INITIALENDURANCE = _newTime;
    }
    function setReentrantTimeLimit(uint _newLimit) external onlyOwner {
        REENTRANT_TIMELIMIT = _newLimit;
    }
    function setPetStaminaMax(uint _newMax) external onlyOwner {
        PET_STAMINA_MAX = _newMax;
    }
    function setPetHungerMax(uint _newMax) external onlyOwner {
        PET_HUNGER_MAX = _newMax;
    }
    function setRookieToMatureBond(uint _newBond) external onlyOwner {
        ROOKIETOMATURE_BOND = _newBond;
    }
    function setMatureToPerfectBond(uint _newBond) external onlyOwner {
        MATURETOPERFECT_BOND = _newBond;
    }
//---------------------------------------------------------
//              
//             _____ _______       _____ _______ 
//            / ____|__   __|/\   |  __ \__   __|
//           | (___    | |  /  \  | |__) | | |   
//            \___ \   | | / /\ \ |  _  /  | |   
//            ____) |  | |/ ____ \| | \ \  | |   
//           |_____/   |_/_/    \_\_|  \_\ |_|   
//                                               
//---------------------------------------------------------                                     

//--------- sub functions ---------------
    function accountAddressToProceed() public view returns (address) {
    // Ready for account abstraction
    // If the player doesn't provide a personal wallet, all data will be recorded in the trainer wallet
    address playerAddress = contractStorage.personalwallet(msg.sender);
        if (playerAddress == address(0)) {
            return msg.sender;
        } else {
            return playerAddress;
        }
    }
    function forwardEtherToTreasury() internal {
        require(treasury != address(0), "Treasury address not set");
        (bool sent, ) = treasury.call{value: msg.value}("");
        require(sent, "Failed to forward Ether to treasury");
    }

    function openBoxIn24Hr_paid() public view returns (uint boxOpened, uint remainingTimeReset_s, uint pricePerBox) {
       
        address playerAddress = accountAddressToProceed();
        uint timeElapsed = block.timestamp - contractStorage.getTimebound1(playerAddress);
        if (timeElapsed >= 24 hours) { //over the TIME limit for 0th box open
            boxOpened = 0;
            remainingTimeReset_s = 0;
        } else { //still within TIME limit since last 0th box opened
            boxOpened = contractStorage.getLimit1(playerAddress);
            remainingTimeReset_s = 24 hours - timeElapsed;
            pricePerBox = PRICE_TOOPENBOX*boxOpened;
        }
    }
    function subtract(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }
    function slotLimit_expansionCost(uint number_expansionrequest) public view returns (uint slotLimit, uint expansionCost) {
        address playerAddress = accountAddressToProceed();
        slotLimit = contractStorage.getLimit2(playerAddress);
        require (number_expansionrequest + slotLimit < 499); //499 used as empty, so expanded to 498 only
        expansionCost = PRICE_EXPANDSLOT*number_expansionrequest;
    
    }
    function petTiming(uint slot) public view returns (uint bond, uint stamina, uint endurance) { //for front end only
        address playerAddress = accountAddressToProceed();
        S.Time memory pettimes = contractStorage.getPetTimes(playerAddress,slot);
        bond = pettimes.bond;
        uint _timenow = block.timestamp;
        if (_timenow - pettimes.stamina > PET_STAMINA_MAX) {
            stamina = PET_STAMINA_MAX;
        } else {
            stamina = _timenow- pettimes.stamina;
        }
        if (pettimes.hunger < _timenow) {
            endurance = 0;
        } else if (pettimes.hunger - _timenow < PET_HUNGER_MAX) {
            endurance = pettimes.hunger - _timenow;
        } else {
            endurance = PET_HUNGER_MAX;
        }
    }
    modifier onlyEOA() {
        require(!isContract(msg.sender), "Smart contracts not allowed");
        _;
    }
    function noneReentrant_time(address player) internal {
      
        require(block.timestamp - reentrant_time[player] >= REENTRANT_TIMELIMIT,"Non-Reentrant, slow down TX attempts.");
        reentrant_time[player] = block.timestamp;
    }
    function isContract(address _addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(_addr)
        }
        return size > 0;
    }
    
///////////////////////////////////////   OPEN BOX  //////////////////////////////////////////////////////////////////    
    function openBox(uint slot, uint trainergene) public payable nonReentrant {
       
        address playerAddress = accountAddressToProceed();
        uint limit2 = contractStorage.getLimit2(playerAddress); //limit2 is slot limit
        uint genestrength = contractStorage.getPlayerGeneStrength(playerAddress,trainergene);
        uint _timenow = block.timestamp;
        //check to see the chosen slot has occupied or exceed the slotlimit
        S.Status memory _petstatus = contractStorage.getPetStatuses(playerAddress, slot);
        noneReentrant_time(playerAddress); //prevent spam
        if (limit2 == 0) {
            limit2 = 5;
            contractStorage.setLimit2(playerAddress, limit2); //initialize for the limit2 since its a new player
        }
        require(slot < limit2, "Chosen slot exceeds limit.");
        require(_petstatus.id == 0, "Chosen slot is occupied.");
      
            require(genestrength > 0, "Don't have the gene.");
     
       
        (uint openedBox, uint remainingTimeReset, uint priceperbox) = openBoxIn24Hr_paid(); // drop the opened box memory, do not need it
        if (remainingTimeReset == 0) { // means player can start to openbox for free
            //...openbox in next sequence

            //then set the limit to 1
            contractStorage.setLimit1(playerAddress, 1);
            contractStorage.setTimebound1(playerAddress, block.timestamp);
        } else {
            //means taken up the free chances, so need to pay if want to open box
            require(msg.value == priceperbox, "Insufficient payment to open the box");
            //...openbox in next sequence

            //then increase the limit, do not need to reset the timebound
            contractStorage.setLimit1(playerAddress, openedBox+1);
        }
       
        S.Unit memory _petunit = S.Unit({ hp: 1000, attack: 100, defense: 50, speed: 100, intelligence: 100, genestrength: genestrength, range: 0, special: 0});
        _petstatus = S.Status({id: contractRAM.genetoid_mapping(trainergene), family: trainergene + 1 , stage: 1});
        S.Time memory _pettime =  S.Time({bond: 0, stamina: _timenow - TIME_INITIALSTAMINA, hunger: _timenow + TIME_INITIALENDURANCE});
        contractStorage.setPetUnits(playerAddress, slot ,_petunit);
        contractStorage.setPetStatuses(playerAddress,slot , _petstatus);
        contractStorage.setPetTimes(playerAddress, slot ,_pettime);
        
        contractStorage.setPetUnitsMaxVitamined(playerAddress, slot ,contractRAM.petunitsmax(_petstatus.id));
        //***//** evolve set bit based on ID///////////////
        // Function to set the bit corresponding to the ID
        uint GENEbit = contractStorage.getPoint2(playerAddress); 
        // Set the bit at the position corresponding to ID
        GENEbit |= (1 << (_petstatus.id%10000));//do not minus 1 bit as no shinning
        contractStorage.setPoint2(playerAddress,GENEbit);
        //**//***//////////////////////////////////////////
        if (msg.value > 0) {
            forwardEtherToTreasury();
        }
        emit StatChangedResult(_petunit,_petstatus,_pettime);
    }
///////////////////////////////////////   EXPAND SLOT  //////////////////////////////////////////////////////////////////
    function expandSlot(uint numberOfexpansion) public payable nonReentrant {
        address playerAddress = accountAddressToProceed();
        // the slotLimit_expansionCost declare view function above has checked the request expansion slot is no more than 500 hard limit
        (uint slotlimit, uint expansionCost) = slotLimit_expansionCost(numberOfexpansion); 
        require(msg.value == expansionCost, "Insufficient payment to expand");
        contractStorage.setLimit2(playerAddress, slotlimit+numberOfexpansion); //confirmed payment, then expand slot
        forwardEtherToTreasury();
    }

///////////////////////////////////////   FEED PET  //////////////////////////////////////////////////////////////////
    struct PetData { //resolve stack too deep
        S.Status petstatuses;
        S.Unit petunits;
        S.Time pettimes;
        S.Unit petunitsmax;
    }
    function UnitUpdateStats(S.Unit memory petunits, S.Unit memory petunitsmax , uint stats_type, uint rate) internal pure returns (S.Unit memory petunitsout){
        //************* rate in 100% = 1000 ***********
        petunitsout = petunits;
        if        (stats_type == 0) { //hp
            if (petunitsmax.hp > petunits.hp) { //no overflow
                petunitsout.hp = petunits.hp + ((petunitsmax.hp - petunits.hp)*rate)/1000;
            } else {petunitsout.hp = petunitsmax.hp;}
        } else if (stats_type == 1) { // atk
            if (petunitsmax.attack > petunits.attack) { //no overflow
                petunitsout.attack = petunits.attack + ((petunitsmax.attack - petunits.attack)*rate)/1000;
            } else {petunitsout.attack = petunitsmax.attack;}
        } else if (stats_type == 2) { // def
            if (petunitsmax.defense > petunits.defense) { //no overflow
                petunitsout.defense = petunits.defense + ((petunitsmax.defense - petunits.defense)*rate)/1000;
            } else {petunitsout.defense = petunitsmax.defense;}
        } else if (stats_type == 3) { // spd
            if (petunitsmax.speed > petunits.speed) { //no overflow
                petunitsout.speed = petunits.speed + ((petunitsmax.speed - petunits.speed)*rate)/1000;
            } else {petunitsout.speed = petunitsmax.speed;}
        } else if (stats_type == 4) { // int
            if (petunitsmax.intelligence > petunits.intelligence) { //no overflow
                petunitsout.intelligence = petunits.intelligence + ((petunitsmax.intelligence - petunits.intelligence)*rate)/1000;
            } else {petunitsout.intelligence = petunitsmax.intelligence;}
        }
    }
    function feedPet(uint _slot, uint _foodtype, uint _trainergene) public onlyEOA nonReentrant {
        address playerAddress = accountAddressToProceed();
        uint genestrength = contractStorage.getPlayerGeneStrength(playerAddress,_trainergene);
        //if (_trainergene !=0) { //if the trainer is not default Jojo, then make sure this player has different trainer
            require(genestrength > 0, "Don't have the gene.");
            require(_foodtype <= 10, "Wrong Food type");
        //}
        PetData memory Lings;
        Lings.petstatuses = contractStorage.getPetStatuses(playerAddress,_slot);
        Lings.petunits = contractStorage.getPetUnits(playerAddress,_slot);
        Lings.pettimes = contractStorage.getPetTimes(playerAddress,_slot);
        Lings.petunitsmax = contractStorage.getPetUnitsMaxVitamined(playerAddress,_slot);
        uint _exp = contractStorage.getExperience(playerAddress);
        uint _full; //determine how full is the food after eaten in time
        uint _partialstat; // partial stat gain only. 100% = 10000
        uint _timenow = block.timestamp;
        noneReentrant_time(playerAddress); //prevent spam
        require (Lings.petstatuses.id != 0, "empty slot");
        if      (_foodtype==0){_full = 6 hours;} //backpack food
        else if (_foodtype==1){_full = 12 hours; } //shop1
        else if (_foodtype==2){_full = 10 hours; } 
        else if (_foodtype==3){_full = 10 hours; } 
        else if (_foodtype==4){_full = 11 hours; } //shop1.1
        else if (_foodtype==5){_full = 11 hours; } 
        else if (_foodtype==6){_full = 24 hours; } //shop2
        else if (_foodtype==7){_full = 24 hours; } 
        else if (_foodtype==8){_full = 24 hours; } 
        else if (_foodtype==9){_full = 24 hours; } //shop2.2
        else if (_foodtype==10){_full = 24 hours; } 
        if (Lings.pettimes.hunger < _timenow) { //super hungry, endurance = 0
            Lings.pettimes.bond = Lings.pettimes.bond + _full;
            _exp += _full;
            Lings.pettimes.hunger = _timenow + _full;
            _partialstat= 10; // 100% = 10
        } else if (Lings.pettimes.hunger - _timenow + _full> PET_HUNGER_MAX) { //over feed, gain partial stat
            uint fullhittingcap = (PET_HUNGER_MAX- (Lings.pettimes.hunger - _timenow));
            Lings.pettimes.bond = Lings.pettimes.bond + fullhittingcap; 
            _exp += fullhittingcap;
            _partialstat = (fullhittingcap*10)/ (_full); //100 = 1 = 100% (upscale 2 0)
            //this has to run last otherwise alter the hunger variable for above
            Lings.pettimes.hunger = _timenow + PET_HUNGER_MAX; 
        } else { //no over feed. stat gain all
            Lings.pettimes.bond = Lings.pettimes.bond + _full;
            _exp += _full;
            Lings.pettimes.hunger = Lings.pettimes.hunger + _full; 
            _partialstat= 10; // 100% = 10
        }
  
        if      (_foodtype==0){} //backpack food
      
        else if (_foodtype==1){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,10*_partialstat);} //hp + 10% //shop1 
        else if (_foodtype==2){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,5*_partialstat);} //atk + 5%
        else if (_foodtype==3){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,5*_partialstat);} //def + 5%
        else if (_foodtype==4){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,5*_partialstat);} //spd + 5% //shop1.1
        else if (_foodtype==5){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,5*_partialstat);} //int + 5%
        else if (_foodtype==6){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,19*_partialstat);} //hp + 19% //shop2 
        else if (_foodtype==7){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,11*_partialstat);} //atk + 11%
        else if (_foodtype==8){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,11*_partialstat);} //def + 11%
        else if (_foodtype==9){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,11*_partialstat);} //spd + 11% //shop2.2
        else if (_foodtype==10){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,11*_partialstat);} //int + 11%
        
    
        //***************   check evolve **************
        if ((Lings.petstatuses.stage == 1   &&   Lings.pettimes.bond > ROOKIETOMATURE_BOND)|| //check if rookie, then to mature
            (Lings.petstatuses.stage == 2   &&   Lings.pettimes.bond > MATURETOPERFECT_BOND)) { // check if mature, then to perfect
            //evolve id and maxstats
            //this need from RAM as update each patch
            FARPG_RAMInterface.TrainerData memory _trainerdata;
            _trainerdata.gene = _trainergene;
            _trainerdata.genestrength = contractStorage.getPlayergenestrengthArray(playerAddress);
            _trainerdata.hashed = uint(keccak256(abi.encodePacked(playerAddress,block.timestamp,block.prevrandao)));
            uint compiledGenestrength;
            (Lings.petstatuses, compiledGenestrength)= contractRAM.petunitsevolveid(Lings.petstatuses,Lings.petunits, _trainerdata);
           
            contractStorage.setPetStatuses(playerAddress,_slot , Lings.petstatuses); //update: ID, family, stage
            //ONCE evolve you gain Stamina and Endurance
            Lings.pettimes = S.Time({bond: Lings.pettimes.bond, stamina: _timenow - TIME_INITIALSTAMINA, hunger: _timenow + TIME_INITIALENDURANCE});
            contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); //update: bond for evolve, stamina, hunger
            Lings.petunitsmax = contractRAM.petunitsmax(Lings.petstatuses.id); //use new id to get max stat, no genestrength and skills yet
            contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot, Lings.petunitsmax);
            //evolve gain all stats by 30%
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,300);
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,300);
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,300);
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,300);
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,300);
            
            if (Lings.petstatuses.stage == 2) {//evolved into Mature
                    Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas.
                    if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill
                        Lings.petunits.range = Lings.petstatuses.id - 10001;
                    } else {
                        Lings.petunits.range = Lings.petstatuses.id - 1;
                    }
                }
            if (Lings.petstatuses.stage == 3) {//**********evolved into Perfect, determine the genestrength, follow the lowest means it wont change.
                Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas.
                if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill
                    Lings.petunits.special = Lings.petstatuses.id - 10001;
                } else {
                    Lings.petunits.special = Lings.petstatuses.id - 1;
                }
            }
            contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); //final write into petUnits (stats, genestrength, skills)
           
            uint GENEbit = contractStorage.getPoint2(playerAddress);
            // Set the bit at the position corresponding to ID
            GENEbit |= (1 << ((Lings.petstatuses.id-1)%10000));//need to minus 1 bit because of previous add on shinning check
            contractStorage.setPoint2(playerAddress,GENEbit);
            //**//***//////////////////////////////////////////
        } else { //if no evolve, follow back the stamina and hunger, only update Units states and time, Status(ID, Family, stage) no change. 
            contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits);
            contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes);
        }
        //************** check evolve end ******************
        contractStorage.setExp(playerAddress, _exp);
        emit StatChangedResult(Lings.petunits,Lings.petstatuses,Lings.pettimes);
    }   
///////////////////////////////////////   TRAIN PET  //////////////////////////////////////////////////////////////////
    
    function trainPet(uint _slot, uint _traintype, uint _trainergene) public onlyEOA nonReentrant {
        address playerAddress = accountAddressToProceed();
        uint _exp = contractStorage.getExperience(playerAddress);
        uint genestrength = contractStorage.getPlayerGeneStrength(playerAddress,_trainergene);
        //if (_trainergene !=0) { //if the trainer is not default Jojo, then make sure this player has different trainer
            require(genestrength > 0, "Don't have the gene.");
            require(_traintype <= 24, "Wrong Train type");
        //}
        PetData memory Lings;
        Lings.petstatuses = contractStorage.getPetStatuses(playerAddress,_slot);
        Lings.petunits = contractStorage.getPetUnits(playerAddress,_slot);
        Lings.pettimes = contractStorage.getPetTimes(playerAddress,_slot);
        Lings.petunitsmax = contractStorage.getPetUnitsMaxVitamined(playerAddress,_slot);
        uint _effort; //determine how full is the food after eaten in time
        uint _timenow = block.timestamp;
        noneReentrant_time(playerAddress); //prevent spam
        require (Lings.petstatuses.id != 0, "empty slot");
         // training percent over iteration function: (max-current)*(1-(1-rate)^iteration)
        // so i can use this (1-(1-rate)^iteration) to calculate
        // e.g 1 iteration 7%, with that function 3 iteration suppose to be 19.6%
        //**************************** since 100% = 1000, 10% = 100 for UnitUpdateStats ****
        if      (_traintype==0){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } //basic 1, 0hp / 1atk / 2def/ 3spd / 4int
        else if (_traintype==1){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } 
        else if (_traintype==2){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } 
        else if (_traintype==3){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } 
        else if (_traintype==4){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } 
        else if (_traintype==5){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } 
        else if (_traintype==6){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } 
        else if (_traintype==7){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } 
        else if (_traintype==8){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } 
        else if (_traintype==9){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } 
        else if (_traintype==10){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } //after upgrade training ground
        else if (_traintype==11){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } 
        else if (_traintype==12){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } 
        else if (_traintype==13){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } 
        else if (_traintype==14){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } 
        else if (_traintype==15){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } 
        else if (_traintype==16){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } 
        else if (_traintype==17){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } 
        else if (_traintype==18){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } 
        else if (_traintype==19){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } 
        else if (_traintype==20){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } 
        else if (_traintype==21){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } 
        else if (_traintype==22){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } 
        else if (_traintype==23){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } 
        else if (_traintype==24){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } 
        uint _staminaleft = _timenow - Lings.pettimes.stamina; //staminatime sure lower than timenow. NO WAY staminatime > timenow, really is, then revert
        require(_staminaleft >= _effort, "Not enough stamina.");
        if (_staminaleft > PET_STAMINA_MAX) {_staminaleft = PET_STAMINA_MAX;} //capping stamina before spending
        _staminaleft -= _effort; //remaining stamina
        Lings.pettimes.stamina = _timenow - _staminaleft; //timenow always larger than staminaleft.
        Lings.pettimes.bond += _effort;
        _exp += _effort;
        //***************   check evolve **************
        if ((Lings.petstatuses.stage == 1   &&   Lings.pettimes.bond > ROOKIETOMATURE_BOND)|| //check if rookie, then to mature
            (Lings.petstatuses.stage == 2   &&   Lings.pettimes.bond > MATURETOPERFECT_BOND)) { // check if mature, then to perfect
            //evolve id and maxstats
            //this need from RAM as update each patch
            FARPG_RAMInterface.TrainerData memory _trainerdata;
            _trainerdata.gene = _trainergene;
            _trainerdata.genestrength = contractStorage.getPlayergenestrengthArray(playerAddress);
            _trainerdata.hashed = uint(keccak256(abi.encodePacked(playerAddress,block.timestamp,block.prevrandao)));
            uint compiledGenestrength;
            (Lings.petstatuses, compiledGenestrength)= contractRAM.petunitsevolveid(Lings.petstatuses,Lings.petunits, _trainerdata);
          
            contractStorage.setPetStatuses(playerAddress,_slot , Lings.petstatuses); //update: ID, family, stage
            //ONCE evolve you gain Stamina and Endurance
            Lings.pettimes = S.Time({bond: Lings.pettimes.bond, stamina: _timenow - TIME_INITIALSTAMINA, hunger: _timenow + TIME_INITIALENDURANCE});
            contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); //update: bond for evolve, stamina, hunger
            Lings.petunitsmax = contractRAM.petunitsmax(Lings.petstatuses.id); //use new id to get max stat, no genestrength and skills yet
            contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot, Lings.petunitsmax);
            //evolve gain all stats by 30%
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,300);
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,300);
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,300);
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,300);
            Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,300);
            
          
            if (Lings.petstatuses.stage == 2) {//evolved into Mature
                    Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas.
                    if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill
                        Lings.petunits.range = Lings.petstatuses.id - 10001;
                    } else {
                        Lings.petunits.range = Lings.petstatuses.id - 1;
                    }
                }
            if (Lings.petstatuses.stage == 3) {//**********evolved into Perfect, determine the genestrength, follow the lowest means it wont change.
                Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas.
                if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill
                    Lings.petunits.special = Lings.petstatuses.id - 10001;
                } else {
                    Lings.petunits.special = Lings.petstatuses.id - 1;
                }
            }
            contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); //final write into petUnits (stats, genestrength, skills)
          
            uint GENEbit = contractStorage.getPoint2(playerAddress);
            // Set the bit at the position corresponding to ID
            GENEbit |= (1 << ((Lings.petstatuses.id-1)%10000));//need to minus 1 bit because of previous add on shinning check
            contractStorage.setPoint2(playerAddress,GENEbit);
            //**//***//////////////////////////////////////////
            
        } else { //if no evolve, follow back the stamina and hunger, only update Units states and time, Status(ID, Family, stage) no change. 
            contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits);
            contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes);
        }
        //************** check evolve end ******************
        contractStorage.setExp(playerAddress, _exp);
        emit StatChangedResult(Lings.petunits,Lings.petstatuses,Lings.pettimes);


    }

    ////////////////////////////////////////// REGISTER PLAYER NAME ////////////////////////////////////////////
   
    event PlayerRegistered(address indexed playerAddress, string username);
    // Event to log username change
    event UsernameChanged(address indexed playerAddress, string oldUsername, string newUsername);
    uint changeNameCost = 1*10**16; //default 0.01 S to prevent spam register all name
    
    function registerUsername(string memory _username) public payable nonReentrant {
        require(msg.value == changeNameCost, "Insufficient payment to expand");
        require(validateUsername(_username), "Invalid username");
        address playerAddress = accountAddressToProceed();
       
        uint playerUID = contractStorage.getUID(playerAddress);
        
        // Check if this UID is already assigned a username
        require(bytes(contractStorage.UIDToUsername(playerUID)).length == 0, "Player already has a registered name");
        
        // Check if the desired username is taken
        require(contractStorage.usernameToUID(_username) == 0, "Username already exists");

        // Map UID -> Username
        contractStorage.setUIDToUsername(playerUID, _username);
        // Map Username -> UID
        contractStorage.setUsernameToUID(_username, playerUID);

        // Emit an event
        emit PlayerRegistered(msg.sender, _username);
    }



    // Function to change player username
    function changeUsername(string memory _newUsername) public payable nonReentrant {
        require(msg.value == changeNameCost, "Insufficient payment to expand");
        require(validateUsername(_newUsername), "Invalid new username");
        address playerAddress = accountAddressToProceed();
        // Retrieve caller's UID; must exist
        uint playerUID = contractStorage.getUID(playerAddress);

        // Retrieve their old username
        string memory oldUsername = contractStorage.UIDToUsername(playerUID);

        // Make sure the new username is free
        require(contractStorage.usernameToUID(_newUsername) == 0, "New username already exists");

      
        contractStorage.setUIDToUsername(playerUID, _newUsername);
        
        contractStorage.setUsernameToUID(_newUsername, playerUID);

        
        contractStorage.deleteUsernameToAddress(oldUsername);

        // Emit event
        emit UsernameChanged(msg.sender, oldUsername, _newUsername);
    }


    // Function to validate the username
    function validateUsername(string memory _username) internal pure returns (bool) {
        bytes memory usernameBytes = bytes(_username);
        if (usernameBytes.length == 0 || usernameBytes.length > 15) {
            return false;
        }
        for (uint i = 0; i < usernameBytes.length; i++) {
            bytes8 char = usernameBytes[i];
            if (
                !(char >= '0' && char <= '9') && // 0-9
                !(char == '_') &&
                !(char >= 'A' && char <= 'Z') && // A-Z
                !(char >= 'a' && char <= 'z')    // a-z
            ) {
                return false;
            }
        }
        return true;
    }

    function getUsername() public view returns (string memory) {
        // Check UID
        address playerAddress = accountAddressToProceed();
        uint uid = contractStorage.UIDmain(playerAddress);
        return contractStorage.UIDToUsername(uid);
    }

    //////////////////////////////////////// SET TEAM FORMATION ///////////////////////////////////////////
    function changeTeamFormation (uint team, uint[3] calldata format) public nonReentrant {
        address playerAddress = accountAddressToProceed();
        uint[60] memory allformat = contractStorage.getTeamFormat(playerAddress);
        require (team < 20, "Team 0 to 19 is only available right now.");
        require (format[0] != format[1] && format[0] != format[2] && format[1] != format[2], "Cannot have same slot on a team");
        allformat[team*3]=format[0];
        allformat[team*3+1]=format[1];
        allformat[team*3+2]=format[2];
        contractStorage.setTeamFormat(playerAddress, allformat);
    }
    function viewAllTeamFormation() public view returns (uint[60] memory allFormats) {
        address playerAddress = accountAddressToProceed();
        allFormats = contractStorage.getTeamFormat(playerAddress);
    }

//////////////////////////////////////////// READ FUNCTION   /////////////////////////////////////////////////////////////////

    
    function readPetStatusesArray(address _player, uint _slot_start, uint _slot_stop) public view returns (S.Status[] memory petstatuses) {
        uint slotLimit = contractStorage.getLimit2(_player);
        require(_slot_start <= _slot_stop, "Invalid input: _slot_start needs <= _slot_stop");
        require(_slot_stop < slotLimit, "Invalid input: _slot_stop > slotLimit");

        uint numElements = _slot_stop - _slot_start + 1;
        petstatuses = new S.Status[](numElements);

        for (uint i = 0; i < numElements; i++) {
            petstatuses[i] = contractStorage.getPetStatuses(_player, _slot_start + i);
        }
    }

  
    function readPetAllStatsArray(address _player,uint _slot_start,uint _slot_stop) public view returns 
    ( S.Status[] memory petstatuses, S.Unit[] memory petUnits, S.Unit[] memory petUnitsMaxVitamined, S.Time[] memory petTimes) {
        uint slotLimit = contractStorage.getLimit2(_player);
        require(_slot_start <= _slot_stop, "Invalid input: _slot_start must be less than or equal to _slot_stop");
        require(_slot_stop < slotLimit, "Invalid input: _slot_stop exceeds slotLimit");

        uint numElements = _slot_stop - _slot_start + 1;

        petstatuses = new S.Status[](numElements);
        petUnits = new S.Unit[](numElements);
        petUnitsMaxVitamined = new S.Unit[](numElements);
        petTimes = new S.Time[](numElements);

        for (uint i = 0; i < numElements; i++) {
            uint currentIndex = _slot_start + i;
            petstatuses[i] = contractStorage.getPetStatuses(_player, currentIndex);
            petUnits[i] = contractStorage.getPetUnits(_player, currentIndex); 
            petUnitsMaxVitamined[i] = contractStorage.getPetUnitsMaxVitamined(_player, currentIndex); 
            petTimes[i] = contractStorage.getPetTimes(_player, currentIndex); 
        }
    }

    

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"string","name":"username","type":"string"}],"name":"PlayerRegistered","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"indexed":false,"internalType":"struct S.Unit","name":"AfterUnit","type":"tuple"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"indexed":false,"internalType":"struct S.Status","name":"AfterStatus","type":"tuple"},{"components":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"hunger","type":"uint256"}],"indexed":false,"internalType":"struct S.Time","name":"AfterTime","type":"tuple"}],"name":"StatChangedResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"string","name":"oldUsername","type":"string"},{"indexed":false,"internalType":"string","name":"newUsername","type":"string"}],"name":"UsernameChanged","type":"event"},{"inputs":[],"name":"MATURETOPERFECT_BOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PET_HUNGER_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PET_STAMINA_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_EXPANDSLOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_TOOPENBOX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REENTRANT_TIMELIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOKIETOMATURE_BOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_BOXLIMITRESET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_INITIALENDURANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_INITIALSTAMINA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountAddressToProceed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"team","type":"uint256"},{"internalType":"uint256[3]","name":"format","type":"uint256[3]"}],"name":"changeTeamFormation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUsername","type":"string"}],"name":"changeUsername","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractRAM","outputs":[{"internalType":"contract FARPG_RAMInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractStorage","outputs":[{"internalType":"contract IFARPG_Storage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfexpansion","type":"uint256"}],"name":"expandSlot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_foodtype","type":"uint256"},{"internalType":"uint256","name":"_trainergene","type":"uint256"}],"name":"feedPet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getUsername","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"uint256","name":"trainergene","type":"uint256"}],"name":"openBox","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"openBoxIn24Hr_paid","outputs":[{"internalType":"uint256","name":"boxOpened","type":"uint256"},{"internalType":"uint256","name":"remainingTimeReset_s","type":"uint256"},{"internalType":"uint256","name":"pricePerBox","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"petTiming","outputs":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"endurance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"petunitsMAX","outputs":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"},{"internalType":"uint256","name":"_slot_start","type":"uint256"},{"internalType":"uint256","name":"_slot_stop","type":"uint256"}],"name":"readPetAllStatsArray","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"internalType":"struct S.Status[]","name":"petstatuses","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"internalType":"struct S.Unit[]","name":"petUnits","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"internalType":"struct S.Unit[]","name":"petUnitsMaxVitamined","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"hunger","type":"uint256"}],"internalType":"struct S.Time[]","name":"petTimes","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"},{"internalType":"uint256","name":"_slot_start","type":"uint256"},{"internalType":"uint256","name":"_slot_stop","type":"uint256"}],"name":"readPetStatusesArray","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"internalType":"struct S.Status[]","name":"petstatuses","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_username","type":"string"}],"name":"registerUsername","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBond","type":"uint256"}],"name":"setMatureToPerfectBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setPetHungerMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setPetStaminaMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPriceExpandSlot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPriceToOpenBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setReentrantTimeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBond","type":"uint256"}],"name":"setRookieToMatureBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setTimeBoxLimitReset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setTimeInitialEndurance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setTimeInitialStamina","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number_expansionrequest","type":"uint256"}],"name":"slotLimit_expansionCost","outputs":[{"internalType":"uint256","name":"slotLimit","type":"uint256"},{"internalType":"uint256","name":"expansionCost","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_traintype","type":"uint256"},{"internalType":"uint256","name":"_trainergene","type":"uint256"}],"name":"trainPet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateRAMContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateStorageContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasury","type":"address"}],"name":"updateTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewAllTeamFormation","outputs":[{"internalType":"uint256[60]","name":"allFormats","type":"uint256[60]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052676f05b59d3b200000600455674563918244f40000600555620151806006819055610fa7819055612a30610fa8556002610fa955610faa819055610fab556201ec30610fac5562047310610fad55610faf80546001600160a01b03191633179055662386f26fc10000610fb055348015607b575f5ffd5b50608333608b565b6001805560da565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b615b1f806100e75f395ff3fe608060405260043610610275575f3560e01c80636edb6aa01161014a578063b9f54f2c116100be578063e5ea43d411610078578063e5ea43d41461074b578063e9c634c91461077a578063eadfd89314610799578063f2fde38b146107b8578063f35dea5a146107d7578063feaa19bf146107ea575f5ffd5b8063b9f54f2c146106a4578063c2442589146106c3578063cf6621fc146106e2578063d82d7a0d14610701578063d9c17a1a14610717578063e1c361e214610736575f5ffd5b80637f51bb1f1161010f5780637f51bb1f146105b157806381069905146105d05780638197906e1461062a5780638da5cb5b1461065e57806396a33dc51461067a578063a46a6ab41461068e575f5ffd5b80636edb6aa01461052d578063715018a61461054c57806376e2fcd51461056057806377c846af1461057f5780637a44d04814610592575f5ffd5b80633ccfd60b116101ec57806361894434116101a6578063618944341461047c57806361d027b314610491578063635ab8a0146104b1578063647fed85146104c7578063681f3e6d146104f65780636ac5ef7014610517575f5ffd5b80633ccfd60b146103d657806348586b3d146103ea5780634af2fe6f146104095780635054cfe2146104285780635f76310c1461043d5780636070721614610469575f5ffd5b8063236a32c21161023d578063236a32c21461033557806324a22f481461035957806328d24d771461036f5780632fd4f060146103855780633149443c146103a457806336a94134146103c3575f5ffd5b80630549b27e1461027957806306f94913146102b55780630e13ae3b146102d65780631211759b146102f5578063194ace8a14610314575b5f5ffd5b348015610284575f5ffd5b50600254610298906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c0575f5ffd5b506102d46102cf3660046151de565b610809565b005b3480156102e1575f5ffd5b506102d46102f0366004615200565b610880565b348015610300575f5ffd5b506102d461030f366004615229565b61192c565b34801561031f575f5ffd5b5061032861193a565b6040516102ac9190615268565b348015610340575f5ffd5b5061034b610faa5481565b6040519081526020016102ac565b348015610364575f5ffd5b5061034b610fa75481565b34801561037a575f5ffd5b5061034b610fad5481565b348015610390575f5ffd5b506102d461039f366004615229565b6119c0565b3480156103af575f5ffd5b506102d46103be366004615229565b6119cd565b6102d46103d1366004615313565b6119db565b3480156103e1575f5ffd5b506102d4611d57565b3480156103f5575f5ffd5b506102d461040436600461538d565b611de5565b348015610414575f5ffd5b50600354610298906001600160a01b031681565b348015610433575f5ffd5b5061034b60045481565b348015610448575f5ffd5b5061045c6104573660046153bd565b61203c565b6040516102ac9190615448565b6102d4610477366004615229565b6122a9565b348015610487575f5ffd5b5061034b60055481565b34801561049c575f5ffd5b50610faf54610298906001600160a01b031681565b3480156104bc575f5ffd5b5061034b610fac5481565b3480156104d2575f5ffd5b506104db612364565b604080519384526020840192909252908201526060016102ac565b348015610501575f5ffd5b5061050a612497565b6040516102ac9190615488565b348015610522575f5ffd5b5061034b610fab5481565b348015610538575f5ffd5b506102d4610547366004615229565b612588565b348015610557575f5ffd5b506102d4612595565b34801561056b575f5ffd5b506102d461057a366004615229565b6125a8565b6102d461058d366004615313565b6125b6565b34801561059d575f5ffd5b506102d46105ac366004615229565b61293e565b3480156105bc575f5ffd5b506102d46105cb3660046151de565b61294b565b3480156105db575f5ffd5b506105ef6105ea366004615229565b6129cc565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102ac565b348015610635575f5ffd5b50610649610644366004615229565b612a16565b604080519283526020830191909152016102ac565b348015610669575f5ffd5b505f546001600160a01b0316610298565b348015610685575f5ffd5b50610298612abd565b348015610699575f5ffd5b5061034b610fa95481565b3480156106af575f5ffd5b506102d46106be3660046151de565b612b47565b3480156106ce575f5ffd5b506102d46106dd366004615229565b612bb9565b3480156106ed575f5ffd5b506104db6106fc366004615229565b612bc7565b34801561070c575f5ffd5b5061034b610fa85481565b348015610722575f5ffd5b506102d4610731366004615200565b612ce0565b348015610741575f5ffd5b5061034b60065481565b348015610756575f5ffd5b5061076a6107653660046153bd565b613c11565b6040516102ac9493929190615524565b348015610785575f5ffd5b506102d4610794366004615229565b614171565b3480156107a4575f5ffd5b506102d46107b3366004615229565b61417f565b3480156107c3575f5ffd5b506102d46107d23660046151de565b61418d565b6102d46107e53660046155c1565b614203565b3480156107f5575f5ffd5b506102d4610804366004615229565b614ad9565b610811614ae7565b6001600160a01b03811661085e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b333b156108cf5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b6108d7614b40565b5f6108e0612abd565b600254604051631add0e8b60e21b81526001600160a01b0380841660048301529293505f9290911690636b743a2c90602401602060405180830381865afa15801561092d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095191906155e1565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e7989061098890869088906004016155f8565b602060405180830381865afa1580156109a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c791906155e1565b90505f81116109e85760405162461bcd60e51b815260040161085590615611565b6018851115610a2c5760405162461bcd60e51b815260206004820152601060248201526f57726f6e6720547261696e207479706560801b6044820152606401610855565b610a346150b9565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90610a669087908b906004016155f8565b606060405180830381865afa158015610a81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa59190615696565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90610ad99087908b906004016155f8565b61010060405180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1991906156b0565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190610b509087908b906004016155f8565b606060405180830381865afa158015610b6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8f9190615696565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90610bc99087908b906004016155f8565b61010060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0991906156b0565b60608201525f42610c1986614b99565b8251515f03610c575760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b875f03610c9c57612a309150610c78836020015184606001515f60aa614c38565b602084018190526060840151610c92919060016064614c38565b6020840152611080565b87600103610cd957612a309150610cbf83602001518460600151600160aa614c38565b602084018190526060840151610c92919060036064614c38565b87600203610d1657612a309150610cfc83602001518460600151600260aa614c38565b602084018190526060840151610c92919060046064614c38565b87600303610d5257612a309150610d3983602001518460600151600360aa614c38565b602084018190526060840151610c9291905f6064614c38565b87600403610d8f57612a309150610d7583602001518460600151600460aa614c38565b602084018190526060840151610c92919060026064614c38565b87600503610db2576154609150610c78836020015184606001515f610137614c38565b87600603610dd6576154609150610cbf836020015184606001516001610137614c38565b87600703610dfa576154609150610cfc836020015184606001516002610137614c38565b87600803610e1e576154609150610d39836020015184606001516003610137614c38565b87600903610e42576154609150610d75836020015184606001516004610137614c38565b87600a03610e655761a8c09150610c78836020015184606001515f61020d614c38565b87600b03610e895761a8c09150610cbf83602001518460600151600161020d614c38565b87600c03610ead5761a8c09150610cfc83602001518460600151600261020d614c38565b87600d03610ed15761a8c09150610d3983602001518460600151600361020d614c38565b87600e03610ef55761a8c09150610d7583602001518460600151600461020d614c38565b87600f03610f185761fd209150610c78836020015184606001515f6102a1614c38565b87601003610f3c5761fd209150610cbf8360200151846060015160016102a1614c38565b87601103610f605761fd209150610cfc8360200151846060015160026102a1614c38565b87601203610f845761fd209150610d398360200151846060015160036102a1614c38565b87601303610fa85761fd209150610d758360200151846060015160046102a1614c38565b87601403610fcc57620151809150610c78836020015184606001515f610307614c38565b87601503610ff157620151809150610cbf836020015184606001516001610307614c38565b8760160361101657620151809150610cfc836020015184606001516002610307614c38565b8760170361103b57620151809150610d39836020015184606001516003610307614c38565b8760180361108057620151809150611060836020015184606001516004610307614c38565b60208401819052606084015161107a919060026064614c38565b60208401525b5f836040015160200151826110959190615732565b9050828110156110dd5760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b41039ba30b6b4b7309760691b6044820152606401610855565b610faa548111156110ee5750610faa545b6110f88382615732565b90506111048183615732565b60408501805160200191909152518051849190611122908390615745565b90525061112f8387615745565b845160400151909650600114801561114e5750610fac54604085015151115b80611170575083516040015160021480156111705750610fad54604085015151115b156117a95761117d61512a565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156111c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ed9190615758565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354875192880151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926112799290919087906004016157bf565b608060405180830381865afa158015611294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b89190615832565b875f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e895f01516040518463ffffffff1660e01b815260040161130a9392919061585d565b5f604051808303815f87803b158015611321575f5ffd5b505af1158015611333573d5f5f3e3d5ffd5b50505050604051806060016040528087604001515f01518152602001610fa7548661135e9190615732565b8152602001610fa854866113729190615745565b815250866040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e89604001516040518463ffffffff1660e01b81526004016113c59392919061585d565b5f604051808303815f87803b1580156113dc575f5ffd5b505af11580156113ee573d5f5f3e3d5ffd5b50506003548851516040516315e3d00d60e11b81526001600160a01b039092169350632bc7a01a92506114279160040190815260200190565b61010060405180830381865afa158015611443573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146791906156b0565b866060018190525060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e89606001516040518463ffffffff1660e01b81526004016114b793929190615895565b5f604051808303815f87803b1580156114ce575f5ffd5b505af11580156114e0573d5f5f3e3d5ffd5b505050506114fa866020015187606001515f61012c614c38565b6020870181905260608701516115159190600161012c614c38565b6020870181905260608701516115309190600261012c614c38565b60208701819052606087015161154b9190600361012c614c38565b6020870181905260608701516115669190600461012c614c38565b60208701528551604001516002036115d157855180516001919061158b908390615745565b90525085515161271010156115b8578551516115aa9061271190615732565b602087015160c001526115d1565b8551516115c790600190615732565b602087015160c001525b8551604001516003036116375785518051600191906115f1908390615745565b905250855151612710101561161e578551516116109061271190615732565b602087015160e00152611637565b85515161162d90600190615732565b602087015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e89602001516040518463ffffffff1660e01b815260040161167f93929190615895565b5f604051808303815f87803b158015611696575f5ffd5b505af11580156116a8573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156116f6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171a91906155e1565b8751519091506127109061173090600190615732565b61173a91906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90611774908d9085906004016155f8565b5f604051808303815f87803b15801561178b575f5ffd5b505af115801561179d573d5f5f3e3d5ffd5b50505050505050611872565b600254602085015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b916117e0918b918f91600401615895565b5f604051808303815f87803b1580156117f7575f5ffd5b505af1158015611809573d5f5f3e3d5ffd5b5050600254604080880151905163108b074f60e31b81526001600160a01b0390921693506384583a789250611844918b918f9160040161585d565b5f604051808303815f87803b15801561185b575f5ffd5b505af115801561186d573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad906118a4908a908a906004016155f8565b5f604051808303815f87803b1580156118bb575f5ffd5b505af11580156118cd573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8460200151855f0151866040015160405161190f939291906158e1565b60405180910390a15050505050505061192760018055565b505050565b611934614ae7565b610fab55565b61194261514f565b5f61194b612abd565b600254604051633d52077560e01b81526001600160a01b038084166004830152929350911690633d5207759060240161078060405180830381865afa158015611996573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ba9190615931565b91505090565b6119c8614ae7565b600555565b6119d5614ae7565b610fac55565b6119e3614b40565b610fb0543414611a055760405162461bcd60e51b815260040161085590615960565b611a0e81614e4c565b611a4d5760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420757365726e616d6560801b6044820152606401610855565b5f611a56612abd565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015611aa2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac691906155e1565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015611b0d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b349190810190615997565b5115611b8e5760405162461bcd60e51b8152602060048201526024808201527f506c6179657220616c72656164792068617320612072656769737465726564206044820152636e616d6560e01b6064820152608401610855565b60025460405163589d1b5560e11b81526001600160a01b039091169063b13a36aa90611bbe908690600401615488565b602060405180830381865afa158015611bd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bfd91906155e1565b15611c4a5760405162461bcd60e51b815260206004820152601760248201527f557365726e616d6520616c7265616479206578697374730000000000000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf90611c7c9084908790600401615a0c565b5f604051808303815f87803b158015611c93575f5ffd5b505af1158015611ca5573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b9150611cdb9086908590600401615a24565b5f604051808303815f87803b158015611cf2575f5ffd5b505af1158015611d04573d5f5f3e3d5ffd5b50505050336001600160a01b03167fe04d23b73ae3d3b27074da9719b5a4cd521395aaf86bfe7e374933ecb567731a84604051611d419190615488565b60405180910390a25050611d5460018055565b50565b611d5f614ae7565b5f4711611dae5760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f00000000000000006044820152606401610855565b610faf546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611d54573d5f5f3e3d5ffd5b611ded614b40565b5f611df6612abd565b600254604051633d52077560e01b81526001600160a01b0380841660048301529293505f9290911690633d5207759060240161078060405180830381865afa158015611e44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e689190615931565b905060148410611ecc5760405162461bcd60e51b815260206004820152602960248201527f5465616d203020746f203139206973206f6e6c7920617661696c61626c65207260448201526834b3b43a103737bb9760b91b6064820152608401610855565b8235602084013514801590611ee657508235604084013514155b8015611efa57506020830135604084013514155b611f465760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420686176652073616d6520736c6f74206f6e2061207465616d006044820152606401610855565b823581611f54866003615a59565b603c8110611f6457611f64615a45565b6020020152826001602002013581611f7d866003615a59565b611f88906001615745565b603c8110611f9857611f98615a45565b6020020152604083013581611fae866003615a59565b611fb9906002615745565b603c8110611fc957611fc9615a45565b602002015260025460405163ad9bc5fd60e01b81526001600160a01b039091169063ad9bc5fd906120009085908590600401615a70565b5f604051808303815f87803b158015612017575f5ffd5b505af1158015612029573d5f5f3e3d5ffd5b50505050505061203860018055565b5050565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060925f9291169063a4c8ec3490602401602060405180830381865afa158015612088573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ac91906155e1565b9050828411156121155760405162461bcd60e51b815260206004820152602e60248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206e6565647360448201526d0203c3d205f736c6f745f73746f760941b6064820152608401610855565b8083106121725760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420696e7075743a205f736c6f745f73746f70203e20736c6f74604482015264131a5b5a5d60da1b6064820152608401610855565b5f61217d8585615732565b612188906001615745565b90508067ffffffffffffffff8111156121a3576121a361527d565b6040519080825280602002602001820160405280156121f557816020015b6121e260405180606001604052805f81526020015f81526020015f81525090565b8152602001906001900390816121c15790505b5092505f5b8181101561229f576002546001600160a01b03166388e6c74d8861221e848a615745565b6040518363ffffffff1660e01b815260040161223b9291906155f8565b606060405180830381865afa158015612256573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227a9190615696565b84828151811061228c5761228c615a45565b60209081029190910101526001016121fa565b5050509392505050565b6122b1614b40565b5f6122ba612abd565b90505f5f6122c784612a16565b915091508034146122ea5760405162461bcd60e51b815260040161085590615960565b6002546001600160a01b031663ebd6180c846123068786615745565b6040518363ffffffff1660e01b81526004016123239291906155f8565b5f604051808303815f87803b15801561233a575f5ffd5b505af115801561234c573d5f5f3e3d5ffd5b50505050612358614f64565b505050611d5460018055565b5f5f5f5f612370612abd565b60025460405163aa31497760e01b81526001600160a01b0380841660048301529293505f929091169063aa31497790602401602060405180830381865afa1580156123bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e191906155e1565b6123eb9042615732565b9050620151808110612402575f94505f9350612490565b60025460405163f9c0109b60e01b81526001600160a01b0384811660048301529091169063f9c0109b90602401602060405180830381865afa15801561244a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061246e91906155e1565b945061247d8162015180615732565b93508460045461248d9190615a59565b92505b5050909192565b60605f6124a2612abd565b600254604051630bc7d91360e31b81526001600160a01b0380841660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156124ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251391906155e1565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa15801561255a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125819190810190615997565b9250505090565b612590614ae7565b600655565b61259d614ae7565b6125a65f61506a565b565b6125b0614ae7565b610faa55565b6125be614b40565b610fb05434146125e05760405162461bcd60e51b815260040161085590615960565b6125e981614e4c565b61262c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206e657720757365726e616d6560601b6044820152606401610855565b5f612635612abd565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015612681573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126a591906155e1565b6002546040516351a2c27760e01b8152600481018390529192505f916001600160a01b03909116906351a2c277906024015f60405180830381865afa1580156126f0573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127179190810190615997565b60025460405163589d1b5560e11b81529192506001600160a01b03169063b13a36aa90612748908790600401615488565b602060405180830381865afa158015612763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278791906155e1565b156127d45760405162461bcd60e51b815260206004820152601b60248201527f4e657720757365726e616d6520616c72656164792065786973747300000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf906128069085908890600401615a0c565b5f604051808303815f87803b15801561281d575f5ffd5b505af115801561282f573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b91506128659087908690600401615a24565b5f604051808303815f87803b15801561287c575f5ffd5b505af115801561288e573d5f5f3e3d5ffd5b5050600254604051632e9cdc6d60e21b81526001600160a01b03909116925063ba7371b491506128c2908490600401615488565b5f604051808303815f87803b1580156128d9575f5ffd5b505af11580156128eb573d5f5f3e3d5ffd5b50505050336001600160a01b03167f10022a11494e4dcaccdda542dc8a420f8a1c3397f37d5bd035a805e79e1a32ee828660405161292a929190615a8e565b60405180910390a2505050611d5460018055565b612946614ae7565b600455565b612953614ae7565b6001600160a01b0381166129a95760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207472656173757279206164647265737300000000000000006044820152606401610855565b610faf80546001600160a01b0319166001600160a01b0392909216919091179055565b6007816101f481106129dc575f80fd5b6008020180546001820154600283015460038401546004850154600586015460068701546007909701549597509395929491939092909188565b5f5f5f612a21612abd565b6002546040516329323b0d60e21b81526001600160a01b03808416600483015292935091169063a4c8ec3490602401602060405180830381865afa158015612a6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8f91906155e1565b92506101f3612a9e8486615745565b10612aa7575f5ffd5b83600554612ab59190615a59565b915050915091565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015612b07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2b9190615abb565b90506001600160a01b038116612b42573391505090565b919050565b612b4f614ae7565b6001600160a01b038116612b975760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610855565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b612bc1614ae7565b610fa855565b5f5f5f5f612bd3612abd565b60025460405163fd45e19160e01b81529192505f916001600160a01b039091169063fd45e19190612c0a9085908a906004016155f8565b606060405180830381865afa158015612c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c499190615696565b8051610faa546020830151919750919250429190612c679083615732565b1115612c7857610faa549450612c8a565b6020820151612c879082615732565b94505b8082604001511015612c9e575f9350612cd6565b610fab54818360400151612cb29190615732565b1015612ccf57808260400151612cc89190615732565b9350612cd6565b610fab5493505b5050509193909250565b333b15612d2f5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b612d37614b40565b5f612d40612abd565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e79890612d7790859087906004016155f8565b602060405180830381865afa158015612d92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612db691906155e1565b90505f8111612dd75760405162461bcd60e51b815260040161085590615611565b600a841115612e1a5760405162461bcd60e51b815260206004820152600f60248201526e57726f6e6720466f6f64207479706560881b6044820152606401610855565b612e226150b9565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90612e549086908a906004016155f8565b606060405180830381865afa158015612e6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e939190615696565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90612ec79086908a906004016155f8565b61010060405180830381865afa158015612ee3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0791906156b0565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190612f3e9086908a906004016155f8565b606060405180830381865afa158015612f59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7d9190615696565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90612fb79086908a906004016155f8565b61010060405180830381865afa158015612fd3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff791906156b0565b6060820152600254604051631add0e8b60e21b81526001600160a01b0385811660048301525f921690636b743a2c90602401602060405180830381865afa158015613044573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306891906155e1565b90505f804261307687614b99565b8451515f036130b45760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b885f036130c557615460925061317a565b886001036130d75761a8c0925061317a565b886002036130e957618ca0925061317a565b886003036130fb57618ca0925061317a565b8860040361310d57619ab0925061317a565b8860050361311f57619ab0925061317a565b886006036131325762015180925061317a565b886007036131455762015180925061317a565b886008036131585762015180925061317a565b8860090361316b5762015180925061317a565b88600a0361317a576201518092505b8085604001516040015110156131c85760408501515161319b908490615745565b6040860151526131ab8385615745565b93506131b78382615745565b6040808701510152600a91506132b3565b610fab5483828760400151604001516131e19190615732565b6131eb9190615745565b111561326f575f818660400151604001516132069190615732565b610fab546132149190615732565b604087015151909150613228908290615745565b6040870151526132388186615745565b94508361324682600a615a59565b6132509190615ad6565b9250610fab54826132619190615745565b6040808801510152506132b3565b604085015151613280908490615745565b6040860151526132908385615745565b9350828560400151604001516132a69190615745565b6040808701510152600a91505b881561343457886001036132eb576132e1856020015186606001515f85600a6132dc9190615a59565b614c38565b6020860152613434565b8860020361330f576132e18560200151866060015160018560056132dc9190615a59565b88600303613333576132e18560200151866060015160028560056132dc9190615a59565b88600403613357576132e18560200151866060015160038560056132dc9190615a59565b8860050361337b576132e18560200151866060015160048560056132dc9190615a59565b8860060361339e576132e1856020015186606001515f8560136132dc9190615a59565b886007036133c2576132e185602001518660600151600185600b6132dc9190615a59565b886008036133e6576132e185602001518660600151600285600b6132dc9190615a59565b8860090361340a576132e185602001518660600151600385600b6132dc9190615a59565b88600a036134345761342e85602001518660600151600485600b6132dc9190615a59565b60208601525b84516040015160011480156134505750610fac54604086015151115b80613472575084516040015160021480156134725750610fad54604086015151115b15613aab5761347f61512a565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156134cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ef9190615758565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354885192890151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb9261357b9290919087906004016157bf565b608060405180830381865afa158015613596573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135ba9190615832565b885f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e8a5f01516040518463ffffffff1660e01b815260040161360c9392919061585d565b5f604051808303815f87803b158015613623575f5ffd5b505af1158015613635573d5f5f3e3d5ffd5b50505050604051806060016040528088604001515f01518152602001610fa754856136609190615732565b8152602001610fa854856136749190615745565b815250876040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e8a604001516040518463ffffffff1660e01b81526004016136c79392919061585d565b5f604051808303815f87803b1580156136de575f5ffd5b505af11580156136f0573d5f5f3e3d5ffd5b50506003548951516040516315e3d00d60e11b81526001600160a01b039092169350632bc7a01a92506137299160040190815260200190565b61010060405180830381865afa158015613745573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061376991906156b0565b876060018190525060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e8a606001516040518463ffffffff1660e01b81526004016137b993929190615895565b5f604051808303815f87803b1580156137d0575f5ffd5b505af11580156137e2573d5f5f3e3d5ffd5b505050506137fc876020015188606001515f61012c614c38565b6020880181905260608801516138179190600161012c614c38565b6020880181905260608801516138329190600261012c614c38565b60208801819052606088015161384d9190600361012c614c38565b6020880181905260608801516138689190600461012c614c38565b60208801528651604001516002036138d357865180516001919061388d908390615745565b90525086515161271010156138ba578651516138ac9061271190615732565b602088015160c001526138d3565b8651516138c990600190615732565b602088015160c001525b8651604001516003036139395786518051600191906138f3908390615745565b9052508651516127101015613920578651516139129061271190615732565b602088015160e00152613939565b86515161392f90600190615732565b602088015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e8a602001516040518463ffffffff1660e01b815260040161398193929190615895565b5f604051808303815f87803b158015613998575f5ffd5b505af11580156139aa573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156139f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1c91906155e1565b88515190915061271090613a3290600190615732565b613a3c91906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90613a76908d9085906004016155f8565b5f604051808303815f87803b158015613a8d575f5ffd5b505af1158015613a9f573d5f5f3e3d5ffd5b50505050505050613b74565b600254602086015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b91613ae2918b918f91600401615895565b5f604051808303815f87803b158015613af9575f5ffd5b505af1158015613b0b573d5f5f3e3d5ffd5b5050600254604080890151905163108b074f60e31b81526001600160a01b0390921693506384583a789250613b46918b918f9160040161585d565b5f604051808303815f87803b158015613b5d575f5ffd5b505af1158015613b6f573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad90613ba6908a9088906004016155f8565b5f604051808303815f87803b158015613bbd575f5ffd5b505af1158015613bcf573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8560200151865f0151876040015160405161190f939291906158e1565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060928392839283925f9291169063a4c8ec3490602401602060405180830381865afa158015613c63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c8791906155e1565b905085871115613d0b5760405162461bcd60e51b815260206004820152604360248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206d7573742060448201527f6265206c657373207468616e206f7220657175616c20746f205f736c6f745f736064820152620746f760ec1b608482015260a401610855565b808610613d6e5760405162461bcd60e51b815260206004820152602b60248201527f496e76616c696420696e7075743a205f736c6f745f73746f702065786365656460448201526a1cc81cdb1bdd131a5b5a5d60aa1b6064820152608401610855565b5f613d798888615732565b613d84906001615745565b90508067ffffffffffffffff811115613d9f57613d9f61527d565b604051908082528060200260200182016040528015613df157816020015b613dde60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613dbd5790505b5095508067ffffffffffffffff811115613e0d57613e0d61527d565b604051908082528060200260200182016040528015613e4657816020015b613e3361516e565b815260200190600190039081613e2b5790505b5094508067ffffffffffffffff811115613e6257613e6261527d565b604051908082528060200260200182016040528015613e9b57816020015b613e8861516e565b815260200190600190039081613e805790505b5093508067ffffffffffffffff811115613eb757613eb761527d565b604051908082528060200260200182016040528015613f0957816020015b613ef660405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613ed55790505b5092505f5b81811015614165575f613f21828b615745565b6002546040516388e6c74d60e01b81529192506001600160a01b0316906388e6c74d90613f54908e9085906004016155f8565b606060405180830381865afa158015613f6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f939190615696565b888381518110613fa557613fa5615a45565b6020908102919091010152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90613fe2908e9085906004016155f8565b61010060405180830381865afa158015613ffe573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402291906156b0565b87838151811061403457614034615a45565b60209081029190910101526002546040516308ff748760e11b81526001600160a01b03909116906311fee90e90614071908e9085906004016155f8565b61010060405180830381865afa15801561408d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b191906156b0565b8683815181106140c3576140c3615a45565b602090810291909101015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190614100908e9085906004016155f8565b606060405180830381865afa15801561411b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061413f9190615696565b85838151811061415157614151615a45565b602090810291909101015250600101613f0e565b50505093509350935093565b614179614ae7565b610fa955565b614187614ae7565b610fa755565b614195614ae7565b6001600160a01b0381166141fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610855565b611d548161506a565b61420b614b40565b5f614214612abd565b6002546040516329323b0d60e21b81526001600160a01b0380841660048301529293505f929091169063a4c8ec3490602401602060405180830381865afa158015614261573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061428591906155e1565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906142bc90869088906004016155f8565b602060405180830381865afa1580156142d7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142fb91906155e1565b6002546040516388e6c74d60e01b815291925042915f916001600160a01b0316906388e6c74d906143329088908b906004016155f8565b606060405180830381865afa15801561434d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143719190615696565b905061437c85614b99565b835f036143e757600254604051633af5860360e21b8152600595506001600160a01b039091169063ebd6180c906143b990889088906004016155f8565b5f604051808303815f87803b1580156143d0575f5ffd5b505af11580156143e2573d5f5f3e3d5ffd5b505050505b8387106144365760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e0000000000006044820152606401610855565b8051156144855760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e00000000000000006044820152606401610855565b5f83116144a45760405162461bcd60e51b815260040161085590615611565b5f5f5f6144af612364565b925092509250815f0361457e5760025460405163356ba38360e11b81526001600160a01b0390911690636ad74706906144ef908b906001906004016155f8565b5f604051808303815f87803b158015614506575f5ffd5b505af1158015614518573d5f5f3e3d5ffd5b5050600254604051625f880760e01b81526001600160a01b039091169250625f8807915061454c908b9042906004016155f8565b5f604051808303815f87803b158015614563575f5ffd5b505af1158015614575573d5f5f3e3d5ffd5b50505050614641565b8034146145d95760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74207061796d656e7420746f206f70656e20746865604482015263040c4def60e31b6064820152608401610855565b6002546001600160a01b0316636ad74706896145f6866001615745565b6040518363ffffffff1660e01b81526004016146139291906155f8565b5f604051808303815f87803b15801561462a575f5ffd5b505af115801561463c573d5f5f3e3d5ffd5b505050505b60408051610100810182526103e8815260646020820181905260328284015260608083018290526080830182905260a083018a90525f60c0840181905260e0840152835190810193849052600354634fa9782d60e01b9094529081018c9052909181906001600160a01b0316634fa9782d60848301602060405180830381865afa1580156146d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146f591906155e1565b81526020016147058c6001615745565b8152602001600181525094505f60405180606001604052805f8152602001610fa754896147329190615732565b8152602001610fa854896147469190615745565b815250905060025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8b8e856040518463ffffffff1660e01b815260040161478f93929190615895565b5f604051808303815f87803b1580156147a6575f5ffd5b505af11580156147b8573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8b8e896040518463ffffffff1660e01b81526004016148009392919061585d565b5f604051808303815f87803b158015614817575f5ffd5b505af1158015614829573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788b8e846040518463ffffffff1660e01b81526004016148719392919061585d565b5f604051808303815f87803b158015614888575f5ffd5b505af115801561489a573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18b8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01516040518263ffffffff1660e01b815260040161490891815260200190565b61010060405180830381865afa158015614924573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061494891906156b0565b6040518463ffffffff1660e01b815260040161496693929190615895565b5f604051808303815f87803b15801561497d575f5ffd5b505af115801561498f573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038e811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156149dd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0191906155e1565b8751909150614a1390612710906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90614a4d908e9085906004016155f8565b5f604051808303815f87803b158015614a64575f5ffd5b505af1158015614a76573d5f5f3e3d5ffd5b505050505f341115614a8a57614a8a614f64565b7fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd838884604051614abd939291906158e1565b60405180910390a1505050505050505050505061203860018055565b614ae1614ae7565b610fad55565b5f546001600160a01b031633146125a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b600260015403614b925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002600155565b610fa9546001600160a01b0382165f908152610fae6020526040902054614bc09042615732565b1015614c1c5760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b6064820152608401610855565b6001600160a01b03165f908152610fae60205260409020429055565b614c4061516e565b849050825f03614c9857845184511115614c8f57845184516103e8918491614c689190615732565b614c729190615a59565b614c7c9190615ad6565b8551614c889190615745565b8152614e44565b83518152614e44565b82600103614d0457846020015184602001511115614cf5576103e88286602001518660200151614cc89190615732565b614cd29190615a59565b614cdc9190615ad6565b8560200151614ceb9190615745565b6020820152614e44565b60208085015190820152614e44565b82600203614d7057846040015184604001511115614d61576103e88286604001518660400151614d349190615732565b614d3e9190615a59565b614d489190615ad6565b8560400151614d579190615745565b6040820152614e44565b60408085015190820152614e44565b82600303614ddc57846060015184606001511115614dcd576103e88286606001518660600151614da09190615732565b614daa9190615a59565b614db49190615ad6565b8560600151614dc39190615745565b6060820152614e44565b60608085015190820152614e44565b82600403614e4457846080015184608001511115614e39576103e88286608001518660800151614e0c9190615732565b614e169190615a59565b614e209190615ad6565b8560800151614e2f9190615745565b6080820152614e44565b608080850151908201525b949350505050565b80515f9082901580614e5f5750600f8151115b15614e6c57505f92915050565b5f5b8151811015614f5a575f828281518110614e8a57614e8a615a45565b01602001516001600160f81b0319169050600360fc1b8110801590614ebd5750603960f81b6001600160c01b0319821611155b158015614ed85750605f60f81b6001600160c01b0319821614155b8015614f0d5750604160f81b6001600160c01b0319821610801590614f0b5750602d60f91b6001600160c01b0319821611155b155b8015614f425750606160f81b6001600160c01b0319821610801590614f405750603d60f91b6001600160c01b0319821611155b155b15614f5157505f949350505050565b50600101614e6e565b5060019392505050565b610faf546001600160a01b0316614fbd5760405162461bcd60e51b815260206004820152601860248201527f54726561737572792061646472657373206e6f742073657400000000000000006044820152606401610855565b610faf546040515f916001600160a01b03169034908381818185875af1925050503d805f8114615008576040519150601f19603f3d011682016040523d82523d5f602084013e61500d565b606091505b5050905080611d545760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f20666f727761726420457468657220746f20747265617360448201526275727960e81b6064820152608401610855565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405180608001604052806150e560405180606001604052805f81526020015f81526020015f81525090565b81526020016150f261516e565b815260200161511860405180606001604052805f81526020015f81526020015f81525090565b815260200161512561516e565b905290565b60405180606001604052805f81526020016151436151ab565b81526020015f81525090565b604051806107800160405280603c906020820280368337509192915050565b6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b0381168114611d54575f5ffd5b5f602082840312156151ee575f5ffd5b81356151f9816151ca565b9392505050565b5f5f5f60608486031215615212575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215615239575f5ffd5b5035919050565b805f5b603c811015615262578151845260209384019390910190600101615243565b50505050565b61078081016152778284615240565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156152b5576152b561527d565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156152e4576152e461527d565b604052919050565b5f67ffffffffffffffff8211156153055761530561527d565b50601f01601f191660200190565b5f60208284031215615323575f5ffd5b813567ffffffffffffffff811115615339575f5ffd5b8201601f81018413615349575f5ffd5b803561535c615357826152ec565b6152bb565b818152856020838501011115615370575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f6080838503121561539e575f5ffd5b82359150608083018410156153b1575f5ffd5b50926020919091019150565b5f5f5f606084860312156153cf575f5ffd5b83356153da816151ca565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561543e576154288683518051825260208082015190830152604090810151910152565b6060959095019460209190910190600101615401565b5093949350505050565b602081525f6151f960208301846153ef565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6151f9602083018461545a565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b5f8151808452602084019350602083015f5b8281101561543e5761550d86835161549a565b6101009590950194602091909101906001016154fa565b608081525f61553660808301876153ef565b828103602084015261554881876154e8565b9050828103604084015261555c81866154e8565b8381036060850152845180825260208087019350909101905f5b818110156155b35761559d8385518051825260208082015190830152604090810151910152565b6020939093019260609290920191600101615576565b509098975050505050505050565b5f5f604083850312156155d2575f5ffd5b50508035926020909101359150565b5f602082840312156155f1575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601490820152732237b713ba103430bb32903a34329033b2b7329760611b604082015260600190565b5f6060828403121561564f575f5ffd5b6040516060810167ffffffffffffffff811182821017156156725761567261527d565b60409081528351825260208085015190830152928301519281019290925250919050565b5f606082840312156156a6575f5ffd5b6151f9838361563f565b5f6101008284031280156156c2575f5ffd5b506156cb615291565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156152775761527761571e565b808201808211156152775761527761571e565b5f6106408284031215615769575f5ffd5b5f83601f840112615778575f5ffd5b505f80610640615787816152bb565b925082915084018581111561579a575f5ffd5b845b818110156157b457805184526020938401930161579c565b509095945050505050565b8351815260208085015190820152604080850151908201526107e081016157e9606083018561549a565b8251610160830152602083015161018083015f5b603281101561581c5782518252602092830192909101906001016157fd565b50505060408301516107c0830152949350505050565b5f5f60808385031215615843575f5ffd5b61584d848461563f565b6060939093015192949293505050565b6001600160a01b03841681526020810183905260a08101614e4460408301848051825260208082015190830152604090810151910152565b6001600160a01b0384168152602081018390526101408101614e44604083018461549a565b634e487b7160e01b5f52601260045260245ffd5b5f826158dc576158dc6158ba565b500690565b6101c081016158f0828661549a565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152614e44565b5f6107808284031215615942575f5ffd5b5f83601f840112615951575f5ffd5b505f80610780615787816152bb565b6020808252601e908201527f496e73756666696369656e74207061796d656e7420746f20657870616e640000604082015260600190565b5f602082840312156159a7575f5ffd5b815167ffffffffffffffff8111156159bd575f5ffd5b8201601f810184136159cd575f5ffd5b80516159db615357826152ec565b8181528560208385010111156159ef575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b828152604060208201525f614e44604083018461545a565b604081525f615a36604083018561545a565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b80820281158282048414176152775761527761571e565b6001600160a01b03831681526107a081016151f96020830184615240565b604081525f615aa0604083018561545a565b8281036020840152615ab2818561545a565b95945050505050565b5f60208284031215615acb575f5ffd5b81516151f9816151ca565b5f82615ae457615ae46158ba565b50049056fea264697066735822122050f8f9105876dce6fa5413b2f572da476f349e611457d7daa0cd6670f331f83264736f6c634300081c0033

Deployed Bytecode

0x608060405260043610610275575f3560e01c80636edb6aa01161014a578063b9f54f2c116100be578063e5ea43d411610078578063e5ea43d41461074b578063e9c634c91461077a578063eadfd89314610799578063f2fde38b146107b8578063f35dea5a146107d7578063feaa19bf146107ea575f5ffd5b8063b9f54f2c146106a4578063c2442589146106c3578063cf6621fc146106e2578063d82d7a0d14610701578063d9c17a1a14610717578063e1c361e214610736575f5ffd5b80637f51bb1f1161010f5780637f51bb1f146105b157806381069905146105d05780638197906e1461062a5780638da5cb5b1461065e57806396a33dc51461067a578063a46a6ab41461068e575f5ffd5b80636edb6aa01461052d578063715018a61461054c57806376e2fcd51461056057806377c846af1461057f5780637a44d04814610592575f5ffd5b80633ccfd60b116101ec57806361894434116101a6578063618944341461047c57806361d027b314610491578063635ab8a0146104b1578063647fed85146104c7578063681f3e6d146104f65780636ac5ef7014610517575f5ffd5b80633ccfd60b146103d657806348586b3d146103ea5780634af2fe6f146104095780635054cfe2146104285780635f76310c1461043d5780636070721614610469575f5ffd5b8063236a32c21161023d578063236a32c21461033557806324a22f481461035957806328d24d771461036f5780632fd4f060146103855780633149443c146103a457806336a94134146103c3575f5ffd5b80630549b27e1461027957806306f94913146102b55780630e13ae3b146102d65780631211759b146102f5578063194ace8a14610314575b5f5ffd5b348015610284575f5ffd5b50600254610298906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c0575f5ffd5b506102d46102cf3660046151de565b610809565b005b3480156102e1575f5ffd5b506102d46102f0366004615200565b610880565b348015610300575f5ffd5b506102d461030f366004615229565b61192c565b34801561031f575f5ffd5b5061032861193a565b6040516102ac9190615268565b348015610340575f5ffd5b5061034b610faa5481565b6040519081526020016102ac565b348015610364575f5ffd5b5061034b610fa75481565b34801561037a575f5ffd5b5061034b610fad5481565b348015610390575f5ffd5b506102d461039f366004615229565b6119c0565b3480156103af575f5ffd5b506102d46103be366004615229565b6119cd565b6102d46103d1366004615313565b6119db565b3480156103e1575f5ffd5b506102d4611d57565b3480156103f5575f5ffd5b506102d461040436600461538d565b611de5565b348015610414575f5ffd5b50600354610298906001600160a01b031681565b348015610433575f5ffd5b5061034b60045481565b348015610448575f5ffd5b5061045c6104573660046153bd565b61203c565b6040516102ac9190615448565b6102d4610477366004615229565b6122a9565b348015610487575f5ffd5b5061034b60055481565b34801561049c575f5ffd5b50610faf54610298906001600160a01b031681565b3480156104bc575f5ffd5b5061034b610fac5481565b3480156104d2575f5ffd5b506104db612364565b604080519384526020840192909252908201526060016102ac565b348015610501575f5ffd5b5061050a612497565b6040516102ac9190615488565b348015610522575f5ffd5b5061034b610fab5481565b348015610538575f5ffd5b506102d4610547366004615229565b612588565b348015610557575f5ffd5b506102d4612595565b34801561056b575f5ffd5b506102d461057a366004615229565b6125a8565b6102d461058d366004615313565b6125b6565b34801561059d575f5ffd5b506102d46105ac366004615229565b61293e565b3480156105bc575f5ffd5b506102d46105cb3660046151de565b61294b565b3480156105db575f5ffd5b506105ef6105ea366004615229565b6129cc565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102ac565b348015610635575f5ffd5b50610649610644366004615229565b612a16565b604080519283526020830191909152016102ac565b348015610669575f5ffd5b505f546001600160a01b0316610298565b348015610685575f5ffd5b50610298612abd565b348015610699575f5ffd5b5061034b610fa95481565b3480156106af575f5ffd5b506102d46106be3660046151de565b612b47565b3480156106ce575f5ffd5b506102d46106dd366004615229565b612bb9565b3480156106ed575f5ffd5b506104db6106fc366004615229565b612bc7565b34801561070c575f5ffd5b5061034b610fa85481565b348015610722575f5ffd5b506102d4610731366004615200565b612ce0565b348015610741575f5ffd5b5061034b60065481565b348015610756575f5ffd5b5061076a6107653660046153bd565b613c11565b6040516102ac9493929190615524565b348015610785575f5ffd5b506102d4610794366004615229565b614171565b3480156107a4575f5ffd5b506102d46107b3366004615229565b61417f565b3480156107c3575f5ffd5b506102d46107d23660046151de565b61418d565b6102d46107e53660046155c1565b614203565b3480156107f5575f5ffd5b506102d4610804366004615229565b614ad9565b610811614ae7565b6001600160a01b03811661085e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b333b156108cf5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b6108d7614b40565b5f6108e0612abd565b600254604051631add0e8b60e21b81526001600160a01b0380841660048301529293505f9290911690636b743a2c90602401602060405180830381865afa15801561092d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095191906155e1565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e7989061098890869088906004016155f8565b602060405180830381865afa1580156109a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c791906155e1565b90505f81116109e85760405162461bcd60e51b815260040161085590615611565b6018851115610a2c5760405162461bcd60e51b815260206004820152601060248201526f57726f6e6720547261696e207479706560801b6044820152606401610855565b610a346150b9565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90610a669087908b906004016155f8565b606060405180830381865afa158015610a81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa59190615696565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90610ad99087908b906004016155f8565b61010060405180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1991906156b0565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190610b509087908b906004016155f8565b606060405180830381865afa158015610b6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8f9190615696565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90610bc99087908b906004016155f8565b61010060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0991906156b0565b60608201525f42610c1986614b99565b8251515f03610c575760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b875f03610c9c57612a309150610c78836020015184606001515f60aa614c38565b602084018190526060840151610c92919060016064614c38565b6020840152611080565b87600103610cd957612a309150610cbf83602001518460600151600160aa614c38565b602084018190526060840151610c92919060036064614c38565b87600203610d1657612a309150610cfc83602001518460600151600260aa614c38565b602084018190526060840151610c92919060046064614c38565b87600303610d5257612a309150610d3983602001518460600151600360aa614c38565b602084018190526060840151610c9291905f6064614c38565b87600403610d8f57612a309150610d7583602001518460600151600460aa614c38565b602084018190526060840151610c92919060026064614c38565b87600503610db2576154609150610c78836020015184606001515f610137614c38565b87600603610dd6576154609150610cbf836020015184606001516001610137614c38565b87600703610dfa576154609150610cfc836020015184606001516002610137614c38565b87600803610e1e576154609150610d39836020015184606001516003610137614c38565b87600903610e42576154609150610d75836020015184606001516004610137614c38565b87600a03610e655761a8c09150610c78836020015184606001515f61020d614c38565b87600b03610e895761a8c09150610cbf83602001518460600151600161020d614c38565b87600c03610ead5761a8c09150610cfc83602001518460600151600261020d614c38565b87600d03610ed15761a8c09150610d3983602001518460600151600361020d614c38565b87600e03610ef55761a8c09150610d7583602001518460600151600461020d614c38565b87600f03610f185761fd209150610c78836020015184606001515f6102a1614c38565b87601003610f3c5761fd209150610cbf8360200151846060015160016102a1614c38565b87601103610f605761fd209150610cfc8360200151846060015160026102a1614c38565b87601203610f845761fd209150610d398360200151846060015160036102a1614c38565b87601303610fa85761fd209150610d758360200151846060015160046102a1614c38565b87601403610fcc57620151809150610c78836020015184606001515f610307614c38565b87601503610ff157620151809150610cbf836020015184606001516001610307614c38565b8760160361101657620151809150610cfc836020015184606001516002610307614c38565b8760170361103b57620151809150610d39836020015184606001516003610307614c38565b8760180361108057620151809150611060836020015184606001516004610307614c38565b60208401819052606084015161107a919060026064614c38565b60208401525b5f836040015160200151826110959190615732565b9050828110156110dd5760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b41039ba30b6b4b7309760691b6044820152606401610855565b610faa548111156110ee5750610faa545b6110f88382615732565b90506111048183615732565b60408501805160200191909152518051849190611122908390615745565b90525061112f8387615745565b845160400151909650600114801561114e5750610fac54604085015151115b80611170575083516040015160021480156111705750610fad54604085015151115b156117a95761117d61512a565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156111c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ed9190615758565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354875192880151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926112799290919087906004016157bf565b608060405180830381865afa158015611294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b89190615832565b875f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e895f01516040518463ffffffff1660e01b815260040161130a9392919061585d565b5f604051808303815f87803b158015611321575f5ffd5b505af1158015611333573d5f5f3e3d5ffd5b50505050604051806060016040528087604001515f01518152602001610fa7548661135e9190615732565b8152602001610fa854866113729190615745565b815250866040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e89604001516040518463ffffffff1660e01b81526004016113c59392919061585d565b5f604051808303815f87803b1580156113dc575f5ffd5b505af11580156113ee573d5f5f3e3d5ffd5b50506003548851516040516315e3d00d60e11b81526001600160a01b039092169350632bc7a01a92506114279160040190815260200190565b61010060405180830381865afa158015611443573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146791906156b0565b866060018190525060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e89606001516040518463ffffffff1660e01b81526004016114b793929190615895565b5f604051808303815f87803b1580156114ce575f5ffd5b505af11580156114e0573d5f5f3e3d5ffd5b505050506114fa866020015187606001515f61012c614c38565b6020870181905260608701516115159190600161012c614c38565b6020870181905260608701516115309190600261012c614c38565b60208701819052606087015161154b9190600361012c614c38565b6020870181905260608701516115669190600461012c614c38565b60208701528551604001516002036115d157855180516001919061158b908390615745565b90525085515161271010156115b8578551516115aa9061271190615732565b602087015160c001526115d1565b8551516115c790600190615732565b602087015160c001525b8551604001516003036116375785518051600191906115f1908390615745565b905250855151612710101561161e578551516116109061271190615732565b602087015160e00152611637565b85515161162d90600190615732565b602087015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e89602001516040518463ffffffff1660e01b815260040161167f93929190615895565b5f604051808303815f87803b158015611696575f5ffd5b505af11580156116a8573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156116f6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171a91906155e1565b8751519091506127109061173090600190615732565b61173a91906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90611774908d9085906004016155f8565b5f604051808303815f87803b15801561178b575f5ffd5b505af115801561179d573d5f5f3e3d5ffd5b50505050505050611872565b600254602085015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b916117e0918b918f91600401615895565b5f604051808303815f87803b1580156117f7575f5ffd5b505af1158015611809573d5f5f3e3d5ffd5b5050600254604080880151905163108b074f60e31b81526001600160a01b0390921693506384583a789250611844918b918f9160040161585d565b5f604051808303815f87803b15801561185b575f5ffd5b505af115801561186d573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad906118a4908a908a906004016155f8565b5f604051808303815f87803b1580156118bb575f5ffd5b505af11580156118cd573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8460200151855f0151866040015160405161190f939291906158e1565b60405180910390a15050505050505061192760018055565b505050565b611934614ae7565b610fab55565b61194261514f565b5f61194b612abd565b600254604051633d52077560e01b81526001600160a01b038084166004830152929350911690633d5207759060240161078060405180830381865afa158015611996573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ba9190615931565b91505090565b6119c8614ae7565b600555565b6119d5614ae7565b610fac55565b6119e3614b40565b610fb0543414611a055760405162461bcd60e51b815260040161085590615960565b611a0e81614e4c565b611a4d5760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420757365726e616d6560801b6044820152606401610855565b5f611a56612abd565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015611aa2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac691906155e1565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015611b0d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b349190810190615997565b5115611b8e5760405162461bcd60e51b8152602060048201526024808201527f506c6179657220616c72656164792068617320612072656769737465726564206044820152636e616d6560e01b6064820152608401610855565b60025460405163589d1b5560e11b81526001600160a01b039091169063b13a36aa90611bbe908690600401615488565b602060405180830381865afa158015611bd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bfd91906155e1565b15611c4a5760405162461bcd60e51b815260206004820152601760248201527f557365726e616d6520616c7265616479206578697374730000000000000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf90611c7c9084908790600401615a0c565b5f604051808303815f87803b158015611c93575f5ffd5b505af1158015611ca5573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b9150611cdb9086908590600401615a24565b5f604051808303815f87803b158015611cf2575f5ffd5b505af1158015611d04573d5f5f3e3d5ffd5b50505050336001600160a01b03167fe04d23b73ae3d3b27074da9719b5a4cd521395aaf86bfe7e374933ecb567731a84604051611d419190615488565b60405180910390a25050611d5460018055565b50565b611d5f614ae7565b5f4711611dae5760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f00000000000000006044820152606401610855565b610faf546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611d54573d5f5f3e3d5ffd5b611ded614b40565b5f611df6612abd565b600254604051633d52077560e01b81526001600160a01b0380841660048301529293505f9290911690633d5207759060240161078060405180830381865afa158015611e44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e689190615931565b905060148410611ecc5760405162461bcd60e51b815260206004820152602960248201527f5465616d203020746f203139206973206f6e6c7920617661696c61626c65207260448201526834b3b43a103737bb9760b91b6064820152608401610855565b8235602084013514801590611ee657508235604084013514155b8015611efa57506020830135604084013514155b611f465760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420686176652073616d6520736c6f74206f6e2061207465616d006044820152606401610855565b823581611f54866003615a59565b603c8110611f6457611f64615a45565b6020020152826001602002013581611f7d866003615a59565b611f88906001615745565b603c8110611f9857611f98615a45565b6020020152604083013581611fae866003615a59565b611fb9906002615745565b603c8110611fc957611fc9615a45565b602002015260025460405163ad9bc5fd60e01b81526001600160a01b039091169063ad9bc5fd906120009085908590600401615a70565b5f604051808303815f87803b158015612017575f5ffd5b505af1158015612029573d5f5f3e3d5ffd5b50505050505061203860018055565b5050565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060925f9291169063a4c8ec3490602401602060405180830381865afa158015612088573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ac91906155e1565b9050828411156121155760405162461bcd60e51b815260206004820152602e60248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206e6565647360448201526d0203c3d205f736c6f745f73746f760941b6064820152608401610855565b8083106121725760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420696e7075743a205f736c6f745f73746f70203e20736c6f74604482015264131a5b5a5d60da1b6064820152608401610855565b5f61217d8585615732565b612188906001615745565b90508067ffffffffffffffff8111156121a3576121a361527d565b6040519080825280602002602001820160405280156121f557816020015b6121e260405180606001604052805f81526020015f81526020015f81525090565b8152602001906001900390816121c15790505b5092505f5b8181101561229f576002546001600160a01b03166388e6c74d8861221e848a615745565b6040518363ffffffff1660e01b815260040161223b9291906155f8565b606060405180830381865afa158015612256573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227a9190615696565b84828151811061228c5761228c615a45565b60209081029190910101526001016121fa565b5050509392505050565b6122b1614b40565b5f6122ba612abd565b90505f5f6122c784612a16565b915091508034146122ea5760405162461bcd60e51b815260040161085590615960565b6002546001600160a01b031663ebd6180c846123068786615745565b6040518363ffffffff1660e01b81526004016123239291906155f8565b5f604051808303815f87803b15801561233a575f5ffd5b505af115801561234c573d5f5f3e3d5ffd5b50505050612358614f64565b505050611d5460018055565b5f5f5f5f612370612abd565b60025460405163aa31497760e01b81526001600160a01b0380841660048301529293505f929091169063aa31497790602401602060405180830381865afa1580156123bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e191906155e1565b6123eb9042615732565b9050620151808110612402575f94505f9350612490565b60025460405163f9c0109b60e01b81526001600160a01b0384811660048301529091169063f9c0109b90602401602060405180830381865afa15801561244a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061246e91906155e1565b945061247d8162015180615732565b93508460045461248d9190615a59565b92505b5050909192565b60605f6124a2612abd565b600254604051630bc7d91360e31b81526001600160a01b0380841660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156124ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251391906155e1565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa15801561255a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125819190810190615997565b9250505090565b612590614ae7565b600655565b61259d614ae7565b6125a65f61506a565b565b6125b0614ae7565b610faa55565b6125be614b40565b610fb05434146125e05760405162461bcd60e51b815260040161085590615960565b6125e981614e4c565b61262c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206e657720757365726e616d6560601b6044820152606401610855565b5f612635612abd565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015612681573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126a591906155e1565b6002546040516351a2c27760e01b8152600481018390529192505f916001600160a01b03909116906351a2c277906024015f60405180830381865afa1580156126f0573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127179190810190615997565b60025460405163589d1b5560e11b81529192506001600160a01b03169063b13a36aa90612748908790600401615488565b602060405180830381865afa158015612763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278791906155e1565b156127d45760405162461bcd60e51b815260206004820152601b60248201527f4e657720757365726e616d6520616c72656164792065786973747300000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf906128069085908890600401615a0c565b5f604051808303815f87803b15801561281d575f5ffd5b505af115801561282f573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b91506128659087908690600401615a24565b5f604051808303815f87803b15801561287c575f5ffd5b505af115801561288e573d5f5f3e3d5ffd5b5050600254604051632e9cdc6d60e21b81526001600160a01b03909116925063ba7371b491506128c2908490600401615488565b5f604051808303815f87803b1580156128d9575f5ffd5b505af11580156128eb573d5f5f3e3d5ffd5b50505050336001600160a01b03167f10022a11494e4dcaccdda542dc8a420f8a1c3397f37d5bd035a805e79e1a32ee828660405161292a929190615a8e565b60405180910390a2505050611d5460018055565b612946614ae7565b600455565b612953614ae7565b6001600160a01b0381166129a95760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207472656173757279206164647265737300000000000000006044820152606401610855565b610faf80546001600160a01b0319166001600160a01b0392909216919091179055565b6007816101f481106129dc575f80fd5b6008020180546001820154600283015460038401546004850154600586015460068701546007909701549597509395929491939092909188565b5f5f5f612a21612abd565b6002546040516329323b0d60e21b81526001600160a01b03808416600483015292935091169063a4c8ec3490602401602060405180830381865afa158015612a6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8f91906155e1565b92506101f3612a9e8486615745565b10612aa7575f5ffd5b83600554612ab59190615a59565b915050915091565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015612b07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2b9190615abb565b90506001600160a01b038116612b42573391505090565b919050565b612b4f614ae7565b6001600160a01b038116612b975760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610855565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b612bc1614ae7565b610fa855565b5f5f5f5f612bd3612abd565b60025460405163fd45e19160e01b81529192505f916001600160a01b039091169063fd45e19190612c0a9085908a906004016155f8565b606060405180830381865afa158015612c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c499190615696565b8051610faa546020830151919750919250429190612c679083615732565b1115612c7857610faa549450612c8a565b6020820151612c879082615732565b94505b8082604001511015612c9e575f9350612cd6565b610fab54818360400151612cb29190615732565b1015612ccf57808260400151612cc89190615732565b9350612cd6565b610fab5493505b5050509193909250565b333b15612d2f5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b612d37614b40565b5f612d40612abd565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e79890612d7790859087906004016155f8565b602060405180830381865afa158015612d92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612db691906155e1565b90505f8111612dd75760405162461bcd60e51b815260040161085590615611565b600a841115612e1a5760405162461bcd60e51b815260206004820152600f60248201526e57726f6e6720466f6f64207479706560881b6044820152606401610855565b612e226150b9565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90612e549086908a906004016155f8565b606060405180830381865afa158015612e6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e939190615696565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90612ec79086908a906004016155f8565b61010060405180830381865afa158015612ee3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0791906156b0565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190612f3e9086908a906004016155f8565b606060405180830381865afa158015612f59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7d9190615696565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90612fb79086908a906004016155f8565b61010060405180830381865afa158015612fd3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff791906156b0565b6060820152600254604051631add0e8b60e21b81526001600160a01b0385811660048301525f921690636b743a2c90602401602060405180830381865afa158015613044573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306891906155e1565b90505f804261307687614b99565b8451515f036130b45760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b885f036130c557615460925061317a565b886001036130d75761a8c0925061317a565b886002036130e957618ca0925061317a565b886003036130fb57618ca0925061317a565b8860040361310d57619ab0925061317a565b8860050361311f57619ab0925061317a565b886006036131325762015180925061317a565b886007036131455762015180925061317a565b886008036131585762015180925061317a565b8860090361316b5762015180925061317a565b88600a0361317a576201518092505b8085604001516040015110156131c85760408501515161319b908490615745565b6040860151526131ab8385615745565b93506131b78382615745565b6040808701510152600a91506132b3565b610fab5483828760400151604001516131e19190615732565b6131eb9190615745565b111561326f575f818660400151604001516132069190615732565b610fab546132149190615732565b604087015151909150613228908290615745565b6040870151526132388186615745565b94508361324682600a615a59565b6132509190615ad6565b9250610fab54826132619190615745565b6040808801510152506132b3565b604085015151613280908490615745565b6040860151526132908385615745565b9350828560400151604001516132a69190615745565b6040808701510152600a91505b881561343457886001036132eb576132e1856020015186606001515f85600a6132dc9190615a59565b614c38565b6020860152613434565b8860020361330f576132e18560200151866060015160018560056132dc9190615a59565b88600303613333576132e18560200151866060015160028560056132dc9190615a59565b88600403613357576132e18560200151866060015160038560056132dc9190615a59565b8860050361337b576132e18560200151866060015160048560056132dc9190615a59565b8860060361339e576132e1856020015186606001515f8560136132dc9190615a59565b886007036133c2576132e185602001518660600151600185600b6132dc9190615a59565b886008036133e6576132e185602001518660600151600285600b6132dc9190615a59565b8860090361340a576132e185602001518660600151600385600b6132dc9190615a59565b88600a036134345761342e85602001518660600151600485600b6132dc9190615a59565b60208601525b84516040015160011480156134505750610fac54604086015151115b80613472575084516040015160021480156134725750610fad54604086015151115b15613aab5761347f61512a565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156134cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ef9190615758565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354885192890151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb9261357b9290919087906004016157bf565b608060405180830381865afa158015613596573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135ba9190615832565b885f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e8a5f01516040518463ffffffff1660e01b815260040161360c9392919061585d565b5f604051808303815f87803b158015613623575f5ffd5b505af1158015613635573d5f5f3e3d5ffd5b50505050604051806060016040528088604001515f01518152602001610fa754856136609190615732565b8152602001610fa854856136749190615745565b815250876040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e8a604001516040518463ffffffff1660e01b81526004016136c79392919061585d565b5f604051808303815f87803b1580156136de575f5ffd5b505af11580156136f0573d5f5f3e3d5ffd5b50506003548951516040516315e3d00d60e11b81526001600160a01b039092169350632bc7a01a92506137299160040190815260200190565b61010060405180830381865afa158015613745573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061376991906156b0565b876060018190525060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e8a606001516040518463ffffffff1660e01b81526004016137b993929190615895565b5f604051808303815f87803b1580156137d0575f5ffd5b505af11580156137e2573d5f5f3e3d5ffd5b505050506137fc876020015188606001515f61012c614c38565b6020880181905260608801516138179190600161012c614c38565b6020880181905260608801516138329190600261012c614c38565b60208801819052606088015161384d9190600361012c614c38565b6020880181905260608801516138689190600461012c614c38565b60208801528651604001516002036138d357865180516001919061388d908390615745565b90525086515161271010156138ba578651516138ac9061271190615732565b602088015160c001526138d3565b8651516138c990600190615732565b602088015160c001525b8651604001516003036139395786518051600191906138f3908390615745565b9052508651516127101015613920578651516139129061271190615732565b602088015160e00152613939565b86515161392f90600190615732565b602088015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e8a602001516040518463ffffffff1660e01b815260040161398193929190615895565b5f604051808303815f87803b158015613998575f5ffd5b505af11580156139aa573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156139f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1c91906155e1565b88515190915061271090613a3290600190615732565b613a3c91906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90613a76908d9085906004016155f8565b5f604051808303815f87803b158015613a8d575f5ffd5b505af1158015613a9f573d5f5f3e3d5ffd5b50505050505050613b74565b600254602086015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b91613ae2918b918f91600401615895565b5f604051808303815f87803b158015613af9575f5ffd5b505af1158015613b0b573d5f5f3e3d5ffd5b5050600254604080890151905163108b074f60e31b81526001600160a01b0390921693506384583a789250613b46918b918f9160040161585d565b5f604051808303815f87803b158015613b5d575f5ffd5b505af1158015613b6f573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad90613ba6908a9088906004016155f8565b5f604051808303815f87803b158015613bbd575f5ffd5b505af1158015613bcf573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8560200151865f0151876040015160405161190f939291906158e1565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060928392839283925f9291169063a4c8ec3490602401602060405180830381865afa158015613c63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c8791906155e1565b905085871115613d0b5760405162461bcd60e51b815260206004820152604360248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206d7573742060448201527f6265206c657373207468616e206f7220657175616c20746f205f736c6f745f736064820152620746f760ec1b608482015260a401610855565b808610613d6e5760405162461bcd60e51b815260206004820152602b60248201527f496e76616c696420696e7075743a205f736c6f745f73746f702065786365656460448201526a1cc81cdb1bdd131a5b5a5d60aa1b6064820152608401610855565b5f613d798888615732565b613d84906001615745565b90508067ffffffffffffffff811115613d9f57613d9f61527d565b604051908082528060200260200182016040528015613df157816020015b613dde60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613dbd5790505b5095508067ffffffffffffffff811115613e0d57613e0d61527d565b604051908082528060200260200182016040528015613e4657816020015b613e3361516e565b815260200190600190039081613e2b5790505b5094508067ffffffffffffffff811115613e6257613e6261527d565b604051908082528060200260200182016040528015613e9b57816020015b613e8861516e565b815260200190600190039081613e805790505b5093508067ffffffffffffffff811115613eb757613eb761527d565b604051908082528060200260200182016040528015613f0957816020015b613ef660405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613ed55790505b5092505f5b81811015614165575f613f21828b615745565b6002546040516388e6c74d60e01b81529192506001600160a01b0316906388e6c74d90613f54908e9085906004016155f8565b606060405180830381865afa158015613f6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f939190615696565b888381518110613fa557613fa5615a45565b6020908102919091010152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90613fe2908e9085906004016155f8565b61010060405180830381865afa158015613ffe573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402291906156b0565b87838151811061403457614034615a45565b60209081029190910101526002546040516308ff748760e11b81526001600160a01b03909116906311fee90e90614071908e9085906004016155f8565b61010060405180830381865afa15801561408d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b191906156b0565b8683815181106140c3576140c3615a45565b602090810291909101015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190614100908e9085906004016155f8565b606060405180830381865afa15801561411b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061413f9190615696565b85838151811061415157614151615a45565b602090810291909101015250600101613f0e565b50505093509350935093565b614179614ae7565b610fa955565b614187614ae7565b610fa755565b614195614ae7565b6001600160a01b0381166141fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610855565b611d548161506a565b61420b614b40565b5f614214612abd565b6002546040516329323b0d60e21b81526001600160a01b0380841660048301529293505f929091169063a4c8ec3490602401602060405180830381865afa158015614261573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061428591906155e1565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906142bc90869088906004016155f8565b602060405180830381865afa1580156142d7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142fb91906155e1565b6002546040516388e6c74d60e01b815291925042915f916001600160a01b0316906388e6c74d906143329088908b906004016155f8565b606060405180830381865afa15801561434d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143719190615696565b905061437c85614b99565b835f036143e757600254604051633af5860360e21b8152600595506001600160a01b039091169063ebd6180c906143b990889088906004016155f8565b5f604051808303815f87803b1580156143d0575f5ffd5b505af11580156143e2573d5f5f3e3d5ffd5b505050505b8387106144365760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e0000000000006044820152606401610855565b8051156144855760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e00000000000000006044820152606401610855565b5f83116144a45760405162461bcd60e51b815260040161085590615611565b5f5f5f6144af612364565b925092509250815f0361457e5760025460405163356ba38360e11b81526001600160a01b0390911690636ad74706906144ef908b906001906004016155f8565b5f604051808303815f87803b158015614506575f5ffd5b505af1158015614518573d5f5f3e3d5ffd5b5050600254604051625f880760e01b81526001600160a01b039091169250625f8807915061454c908b9042906004016155f8565b5f604051808303815f87803b158015614563575f5ffd5b505af1158015614575573d5f5f3e3d5ffd5b50505050614641565b8034146145d95760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74207061796d656e7420746f206f70656e20746865604482015263040c4def60e31b6064820152608401610855565b6002546001600160a01b0316636ad74706896145f6866001615745565b6040518363ffffffff1660e01b81526004016146139291906155f8565b5f604051808303815f87803b15801561462a575f5ffd5b505af115801561463c573d5f5f3e3d5ffd5b505050505b60408051610100810182526103e8815260646020820181905260328284015260608083018290526080830182905260a083018a90525f60c0840181905260e0840152835190810193849052600354634fa9782d60e01b9094529081018c9052909181906001600160a01b0316634fa9782d60848301602060405180830381865afa1580156146d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146f591906155e1565b81526020016147058c6001615745565b8152602001600181525094505f60405180606001604052805f8152602001610fa754896147329190615732565b8152602001610fa854896147469190615745565b815250905060025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8b8e856040518463ffffffff1660e01b815260040161478f93929190615895565b5f604051808303815f87803b1580156147a6575f5ffd5b505af11580156147b8573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8b8e896040518463ffffffff1660e01b81526004016148009392919061585d565b5f604051808303815f87803b158015614817575f5ffd5b505af1158015614829573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788b8e846040518463ffffffff1660e01b81526004016148719392919061585d565b5f604051808303815f87803b158015614888575f5ffd5b505af115801561489a573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18b8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01516040518263ffffffff1660e01b815260040161490891815260200190565b61010060405180830381865afa158015614924573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061494891906156b0565b6040518463ffffffff1660e01b815260040161496693929190615895565b5f604051808303815f87803b15801561497d575f5ffd5b505af115801561498f573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038e811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156149dd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0191906155e1565b8751909150614a1390612710906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90614a4d908e9085906004016155f8565b5f604051808303815f87803b158015614a64575f5ffd5b505af1158015614a76573d5f5f3e3d5ffd5b505050505f341115614a8a57614a8a614f64565b7fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd838884604051614abd939291906158e1565b60405180910390a1505050505050505050505061203860018055565b614ae1614ae7565b610fad55565b5f546001600160a01b031633146125a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b600260015403614b925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002600155565b610fa9546001600160a01b0382165f908152610fae6020526040902054614bc09042615732565b1015614c1c5760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b6064820152608401610855565b6001600160a01b03165f908152610fae60205260409020429055565b614c4061516e565b849050825f03614c9857845184511115614c8f57845184516103e8918491614c689190615732565b614c729190615a59565b614c7c9190615ad6565b8551614c889190615745565b8152614e44565b83518152614e44565b82600103614d0457846020015184602001511115614cf5576103e88286602001518660200151614cc89190615732565b614cd29190615a59565b614cdc9190615ad6565b8560200151614ceb9190615745565b6020820152614e44565b60208085015190820152614e44565b82600203614d7057846040015184604001511115614d61576103e88286604001518660400151614d349190615732565b614d3e9190615a59565b614d489190615ad6565b8560400151614d579190615745565b6040820152614e44565b60408085015190820152614e44565b82600303614ddc57846060015184606001511115614dcd576103e88286606001518660600151614da09190615732565b614daa9190615a59565b614db49190615ad6565b8560600151614dc39190615745565b6060820152614e44565b60608085015190820152614e44565b82600403614e4457846080015184608001511115614e39576103e88286608001518660800151614e0c9190615732565b614e169190615a59565b614e209190615ad6565b8560800151614e2f9190615745565b6080820152614e44565b608080850151908201525b949350505050565b80515f9082901580614e5f5750600f8151115b15614e6c57505f92915050565b5f5b8151811015614f5a575f828281518110614e8a57614e8a615a45565b01602001516001600160f81b0319169050600360fc1b8110801590614ebd5750603960f81b6001600160c01b0319821611155b158015614ed85750605f60f81b6001600160c01b0319821614155b8015614f0d5750604160f81b6001600160c01b0319821610801590614f0b5750602d60f91b6001600160c01b0319821611155b155b8015614f425750606160f81b6001600160c01b0319821610801590614f405750603d60f91b6001600160c01b0319821611155b155b15614f5157505f949350505050565b50600101614e6e565b5060019392505050565b610faf546001600160a01b0316614fbd5760405162461bcd60e51b815260206004820152601860248201527f54726561737572792061646472657373206e6f742073657400000000000000006044820152606401610855565b610faf546040515f916001600160a01b03169034908381818185875af1925050503d805f8114615008576040519150601f19603f3d011682016040523d82523d5f602084013e61500d565b606091505b5050905080611d545760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f20666f727761726420457468657220746f20747265617360448201526275727960e81b6064820152608401610855565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405180608001604052806150e560405180606001604052805f81526020015f81526020015f81525090565b81526020016150f261516e565b815260200161511860405180606001604052805f81526020015f81526020015f81525090565b815260200161512561516e565b905290565b60405180606001604052805f81526020016151436151ab565b81526020015f81525090565b604051806107800160405280603c906020820280368337509192915050565b6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b0381168114611d54575f5ffd5b5f602082840312156151ee575f5ffd5b81356151f9816151ca565b9392505050565b5f5f5f60608486031215615212575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215615239575f5ffd5b5035919050565b805f5b603c811015615262578151845260209384019390910190600101615243565b50505050565b61078081016152778284615240565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156152b5576152b561527d565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156152e4576152e461527d565b604052919050565b5f67ffffffffffffffff8211156153055761530561527d565b50601f01601f191660200190565b5f60208284031215615323575f5ffd5b813567ffffffffffffffff811115615339575f5ffd5b8201601f81018413615349575f5ffd5b803561535c615357826152ec565b6152bb565b818152856020838501011115615370575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f6080838503121561539e575f5ffd5b82359150608083018410156153b1575f5ffd5b50926020919091019150565b5f5f5f606084860312156153cf575f5ffd5b83356153da816151ca565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561543e576154288683518051825260208082015190830152604090810151910152565b6060959095019460209190910190600101615401565b5093949350505050565b602081525f6151f960208301846153ef565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6151f9602083018461545a565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b5f8151808452602084019350602083015f5b8281101561543e5761550d86835161549a565b6101009590950194602091909101906001016154fa565b608081525f61553660808301876153ef565b828103602084015261554881876154e8565b9050828103604084015261555c81866154e8565b8381036060850152845180825260208087019350909101905f5b818110156155b35761559d8385518051825260208082015190830152604090810151910152565b6020939093019260609290920191600101615576565b509098975050505050505050565b5f5f604083850312156155d2575f5ffd5b50508035926020909101359150565b5f602082840312156155f1575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601490820152732237b713ba103430bb32903a34329033b2b7329760611b604082015260600190565b5f6060828403121561564f575f5ffd5b6040516060810167ffffffffffffffff811182821017156156725761567261527d565b60409081528351825260208085015190830152928301519281019290925250919050565b5f606082840312156156a6575f5ffd5b6151f9838361563f565b5f6101008284031280156156c2575f5ffd5b506156cb615291565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156152775761527761571e565b808201808211156152775761527761571e565b5f6106408284031215615769575f5ffd5b5f83601f840112615778575f5ffd5b505f80610640615787816152bb565b925082915084018581111561579a575f5ffd5b845b818110156157b457805184526020938401930161579c565b509095945050505050565b8351815260208085015190820152604080850151908201526107e081016157e9606083018561549a565b8251610160830152602083015161018083015f5b603281101561581c5782518252602092830192909101906001016157fd565b50505060408301516107c0830152949350505050565b5f5f60808385031215615843575f5ffd5b61584d848461563f565b6060939093015192949293505050565b6001600160a01b03841681526020810183905260a08101614e4460408301848051825260208082015190830152604090810151910152565b6001600160a01b0384168152602081018390526101408101614e44604083018461549a565b634e487b7160e01b5f52601260045260245ffd5b5f826158dc576158dc6158ba565b500690565b6101c081016158f0828661549a565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152614e44565b5f6107808284031215615942575f5ffd5b5f83601f840112615951575f5ffd5b505f80610780615787816152bb565b6020808252601e908201527f496e73756666696369656e74207061796d656e7420746f20657870616e640000604082015260600190565b5f602082840312156159a7575f5ffd5b815167ffffffffffffffff8111156159bd575f5ffd5b8201601f810184136159cd575f5ffd5b80516159db615357826152ec565b8181528560208385010111156159ef575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b828152604060208201525f614e44604083018461545a565b604081525f615a36604083018561545a565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b80820281158282048414176152775761527761571e565b6001600160a01b03831681526107a081016151f96020830184615240565b604081525f615aa0604083018561545a565b8281036020840152615ab2818561545a565b95945050505050565b5f60208284031215615acb575f5ffd5b81516151f9816151ca565b5f82615ae457615ae46158ba565b50049056fea264697066735822122050f8f9105876dce6fa5413b2f572da476f349e611457d7daa0cd6670f331f83264736f6c634300081c0033

Deployed Bytecode Sourcemap

26162:41328:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26230:37;;;;;;;;;;-1:-1:-1;26230:37:0;;;;-1:-1:-1;;;;;26230:37:0;;;;;;-1:-1:-1;;;;;201:32:1;;;183:51;;171:2;156:18;26230:37:0;;;;;;;;29229:230;;;;;;;;;;-1:-1:-1;29229:230:0;;;;;:::i;:::-;;:::i;:::-;;49616:11374;;;;;;;;;;-1:-1:-1;49616:11374:0;;;;;:::i;:::-;;:::i;30601:101::-;;;;;;;;;;-1:-1:-1;30601:101:0;;;;;:::i;:::-;;:::i;65226:217::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27784:38::-;;;;;;;;;;;;;;;;;;;2039:25:1;;;2027:2;2012:18;27784:38:0;1893:177:1;27496:42:0;;;;;;;;;;;;;;;;28032:43;;;;;;;;;;;;;;;;29892:110;;;;;;;;;;-1:-1:-1;29892:110:0;;;;;:::i;:::-;;:::i;30708:114::-;;;;;;;;;;-1:-1:-1;30708:114:0;;;;;:::i;:::-;;:::i;61424:991::-;;;;;;:::i;:::-;;:::i;29465:255::-;;;;;;;;;;;;;:::i;64594:626::-;;;;;;;;;;-1:-1:-1;64594:626:0;;;;;:::i;:::-;;:::i;26274:37::-;;;;;;;;;;-1:-1:-1;26274:37:0;;;;-1:-1:-1;;;;;26274:37:0;;;27079;;;;;;;;;;;;;;;;65587:645;;;;;;;;;;-1:-1:-1;65587:645:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38313:604::-;;;;;;:::i;:::-;;:::i;27222:38::-;;;;;;;;;;;;;;;;28747:36;;;;;;;;;;-1:-1:-1;28747:36:0;;;;-1:-1:-1;;;;;28747:36:0;;;27982:42;;;;;;;;;;;;;;;;32218:689;;;;;;;;;;;;;:::i;:::-;;;;6122:25:1;;;6178:2;6163:18;;6156:34;;;;6206:18;;;6199:34;6110:2;6095:18;32218:689:0;5920:319:1;64216:261:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27871:37::-;;;;;;;;;;;;;;;;30008:112;;;;;;;;;;-1:-1:-1;30008:112:0;;;;;:::i;:::-;;:::i;2788:103::-;;;;;;;;;;;;;:::i;30492:::-;;;;;;;;;;-1:-1:-1;30492:103:0;;;;;:::i;:::-;;:::i;62470:1009::-;;;;;;:::i;:::-;;:::i;29778:108::-;;;;;;;;;;-1:-1:-1;29778:108:0;;;;;:::i;:::-;;:::i;28802:181::-;;;;;;;;;;-1:-1:-1;28802:181:0;;;;;:::i;:::-;;:::i;27459:30::-;;;;;;;;;;-1:-1:-1;27459:30:0;;;;;:::i;:::-;;:::i;:::-;;;;7106:25:1;;;7162:2;7147:18;;7140:34;;;;7190:18;;;7183:34;;;;7248:2;7233:18;;7226:34;;;;7291:3;7276:19;;7269:35;7335:3;7320:19;;7313:35;7379:3;7364:19;;7357:35;7423:3;7408:19;;7401:35;7093:3;7078:19;27459:30:0;6763:679:1;33082:431:0;;;;;;;;;;-1:-1:-1;33082:431:0;;;;;:::i;:::-;;:::i;:::-;;;;7621:25:1;;;7677:2;7662:18;;7655:34;;;;7594:18;33082:431:0;7447:248:1;2140:87:0;;;;;;;;;;-1:-1:-1;2186:7:0;2213:6;-1:-1:-1;;;;;2213:6:0;2140:87;;31529:429;;;;;;;;;;;;;:::i;27640:43::-;;;;;;;;;;;;;;;;28989:234;;;;;;;;;;-1:-1:-1;28989:234:0;;;;;:::i;:::-;;:::i;30246:118::-;;;;;;;;;;-1:-1:-1;30246:118:0;;;;;:::i;:::-;;:::i;33519:780::-;;;;;;;;;;-1:-1:-1;33519:780:0;;;;;:::i;:::-;;:::i;27563:43::-;;;;;;;;;;;;;;;;40934:8546;;;;;;;;;;-1:-1:-1;40934:8546:0;;;;;:::i;:::-;;:::i;27320:41::-;;;;;;;;;;;;;;;;66244:1233;;;;;;;;;;-1:-1:-1;66244:1233:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;30370:116::-;;;;;;;;;;-1:-1:-1;30370:116:0;;;;;:::i;:::-;;:::i;30126:114::-;;;;;;;;;;-1:-1:-1;30126:114:0;;;;;:::i;:::-;;:::i;3046:201::-;;;;;;;;;;-1:-1:-1;3046:201:0;;;;;:::i;:::-;;:::i;35001:3183::-;;;;;;:::i;:::-;;:::i;30828:116::-;;;;;;;;;;-1:-1:-1;30828:116:0;;;;;:::i;:::-;;:::i;29229:230::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;29332:34:0;::::1;29324:62;;;::::0;-1:-1:-1;;;29324:62:0;;10588:2:1;29324:62:0::1;::::0;::::1;10570:21:1::0;10627:2;10607:18;;;10600:30;-1:-1:-1;;;10646:18:1;;;10639:45;10701:18;;29324:62:0::1;;;;;;;;;29397:11;:54:::0;;-1:-1:-1;;;;;;29397:54:0::1;-1:-1:-1::0;;;;;29397:54:0;;;::::1;::::0;;;::::1;::::0;;29229:230::o;49616:11374::-;34355:10;34803:18;34849:8;34335:63;;;;-1:-1:-1;;;34335:63:0;;10932:2:1;34335:63:0;;;10914:21:1;10971:2;10951:18;;;10944:30;11010:29;10990:18;;;10983:57;11057:18;;34335:63:0;10730:351:1;34335:63:0;7139:21:::1;:19;:21::i;:::-;49721::::2;49745:25;:23;:25::i;:::-;49793:15;::::0;:44:::2;::::0;-1:-1:-1;;;49793:44:0;;-1:-1:-1;;;;;201:32:1;;;49793:44:0::2;::::0;::::2;183:51:1::0;49721:49:0;;-1:-1:-1;49781:9:0::2;::::0;49793:15;;::::2;::::0;:29:::2;::::0;156:18:1;;49793:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49868:15;::::0;:65:::2;::::0;-1:-1:-1;;;49868:65:0;;49781:56;;-1:-1:-1;49848:17:0::2;::::0;-1:-1:-1;;;;;49868:15:0;;::::2;::::0;:37:::2;::::0;:65:::2;::::0;49906:13;;49920:12;;49868:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49848:85;;50093:1;50078:12;:16;50070:49;;;;-1:-1:-1::0;;;50070:49:0::2;;;;;;;:::i;:::-;50156:2;50142:10;:16;;50134:45;;;::::0;-1:-1:-1;;;50134:45:0;;12151:2:1;50134:45:0::2;::::0;::::2;12133:21:1::0;12190:2;12170:18;;;12163:30;-1:-1:-1;;;12209:18:1;;;12202:46;12265:18;;50134:45:0::2;11949:340:1::0;50134:45:0::2;50203:20;;:::i;:::-;50254:15;::::0;:51:::2;::::0;-1:-1:-1;;;50254:51:0;;-1:-1:-1;;;;;50254:15:0;;::::2;::::0;:30:::2;::::0;:51:::2;::::0;50285:13;;50299:5;;50254:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50234:71:::0;;50333:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;50333:48:0;;-1:-1:-1;;;;;50333:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;50361:13;;50375:5;;50333:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50316:14;::::0;::::2;:65:::0;50409:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;50409:48:0;;-1:-1:-1;;;;;50409:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;50437:13;;50451:5;;50409:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50392:14;::::0;;::::2;:65:::0;;;;50488:15:::2;::::0;:60;;-1:-1:-1;;;50488:60:0;;-1:-1:-1;;;;;50488:15:0;;::::2;::::0;:39:::2;::::0;:60:::2;::::0;50528:13;;50542:5;;50488:60:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50468:17;::::0;::::2;:80:::0;50559:12:::2;50651:15;50677:33;50696:13:::0;50677:18:::2;:33::i;:::-;50745:17:::0;;:20;:17:::2;:25:::0;50736:49:::2;;;::::0;-1:-1:-1;;;50736:49:0;;14855:2:1;50736:49:0::2;::::0;::::2;14837:21:1::0;14894:2;14874:18;;;14867:30;-1:-1:-1;;;14913:18:1;;;14906:40;14963:18;;50736:49:0::2;14653:334:1::0;50736:49:0::2;51140:10;51152:1;51140:13:::0;51131:5066:::2;;51165:7;51155:17;;51189:55;51205:5;:14;;;51220:5;:17;;;51238:1;51240:3;51189:15;:55::i;:::-;51174:14;::::0;::::2;:70:::0;;;51292:17:::2;::::0;::::2;::::0;51261:55:::2;::::0;51174:70;51310:1:::2;51312:3;51261:15;:55::i;:::-;51246:14;::::0;::::2;:70:::0;51131:5066:::2;;;51380:10;51392:1;51380:13:::0;51376:4821:::2;;51405:7;51395:17;;51429:55;51445:5;:14;;;51460:5;:17;;;51478:1;51480:3;51429:15;:55::i;:::-;51414:14;::::0;::::2;:70:::0;;;51532:17:::2;::::0;::::2;::::0;51501:55:::2;::::0;51414:70;51550:1:::2;51552:3;51501:15;:55::i;51376:4821::-;51579:10;51591:1;51579:13:::0;51575:4622:::2;;51604:7;51594:17;;51628:55;51644:5;:14;;;51659:5;:17;;;51677:1;51679:3;51628:15;:55::i;:::-;51613:14;::::0;::::2;:70:::0;;;51731:17:::2;::::0;::::2;::::0;51700:55:::2;::::0;51613:70;51749:1:::2;51751:3;51700:15;:55::i;51575:4622::-;51778:10;51790:1;51778:13:::0;51774:4423:::2;;51803:7;51793:17;;51827:55;51843:5;:14;;;51858:5;:17;;;51876:1;51878:3;51827:15;:55::i;:::-;51812:14;::::0;::::2;:70:::0;;;51930:17:::2;::::0;::::2;::::0;51899:55:::2;::::0;51812:70;51948:1:::2;51950:3;51899:15;:55::i;51774:4423::-;51977:10;51989:1;51977:13:::0;51973:4224:::2;;52002:7;51992:17;;52026:55;52042:5;:14;;;52057:5;:17;;;52075:1;52077:3;52026:15;:55::i;:::-;52011:14;::::0;::::2;:70:::0;;;52129:17:::2;::::0;::::2;::::0;52098:55:::2;::::0;52011:70;52147:1:::2;52149:3;52098:15;:55::i;51973:4224::-;52176:10;52188:1;52176:13:::0;52172:4025:::2;;52201:7;52191:17;;52225:55;52241:5;:14;;;52256:5;:17;;;52274:1;52276:3;52225:15;:55::i;52172:4025::-;52375:10;52387:1;52375:13:::0;52371:3826:::2;;52400:7;52390:17;;52424:55;52440:5;:14;;;52455:5;:17;;;52473:1;52475:3;52424:15;:55::i;52371:3826::-;52574:10;52586:1;52574:13:::0;52570:3627:::2;;52599:7;52589:17;;52623:55;52639:5;:14;;;52654:5;:17;;;52672:1;52674:3;52623:15;:55::i;52570:3627::-;52773:10;52785:1;52773:13:::0;52769:3428:::2;;52798:7;52788:17;;52822:55;52838:5;:14;;;52853:5;:17;;;52871:1;52873:3;52822:15;:55::i;52769:3428::-;52972:10;52984:1;52972:13:::0;52968:3229:::2;;52997:7;52987:17;;53021:55;53037:5;:14;;;53052:5;:17;;;53070:1;53072:3;53021:15;:55::i;52968:3229::-;53171:10;53183:2;53171:14:::0;53167:3030:::2;;53197:8;53187:18;;53222:55;53238:5;:14;;;53253:5;:17;;;53271:1;53273:3;53222:15;:55::i;53167:3030::-;53403:10;53415:2;53403:14:::0;53399:2798:::2;;53429:8;53419:18;;53454:55;53470:5;:14;;;53485:5;:17;;;53503:1;53505:3;53454:15;:55::i;53399:2798::-;53604:10;53616:2;53604:14:::0;53600:2597:::2;;53630:8;53620:18;;53655:55;53671:5;:14;;;53686:5;:17;;;53704:1;53706:3;53655:15;:55::i;53600:2597::-;53805:10;53817:2;53805:14:::0;53801:2396:::2;;53831:8;53821:18;;53856:55;53872:5;:14;;;53887:5;:17;;;53905:1;53907:3;53856:15;:55::i;53801:2396::-;54006:10;54018:2;54006:14:::0;54002:2195:::2;;54032:8;54022:18;;54057:55;54073:5;:14;;;54088:5;:17;;;54106:1;54108:3;54057:15;:55::i;54002:2195::-;54207:10;54219:2;54207:14:::0;54203:1994:::2;;54233:8;54223:18;;54258:55;54274:5;:14;;;54289:5;:17;;;54307:1;54309:3;54258:15;:55::i;54203:1994::-;54408:10;54420:2;54408:14:::0;54404:1793:::2;;54434:8;54424:18;;54459:55;54475:5;:14;;;54490:5;:17;;;54508:1;54510:3;54459:15;:55::i;54404:1793::-;54609:10;54621:2;54609:14:::0;54605:1592:::2;;54635:8;54625:18;;54660:55;54676:5;:14;;;54691:5;:17;;;54709:1;54711:3;54660:15;:55::i;54605:1592::-;54810:10;54822:2;54810:14:::0;54806:1391:::2;;54836:8;54826:18;;54861:55;54877:5;:14;;;54892:5;:17;;;54910:1;54912:3;54861:15;:55::i;54806:1391::-;55011:10;55023:2;55011:14:::0;55007:1190:::2;;55037:8;55027:18;;55062:55;55078:5;:14;;;55093:5;:17;;;55111:1;55113:3;55062:15;:55::i;55007:1190::-;55212:10;55224:2;55212:14:::0;55208:989:::2;;55238:8;55228:18;;55263:55;55279:5;:14;;;55294:5;:17;;;55312:1;55314:3;55263:15;:55::i;55208:989::-;55413:10;55425:2;55413:14:::0;55409:788:::2;;55439:8;55429:18;;55464:55;55480:5;:14;;;55495:5;:17;;;55513:1;55515:3;55464:15;:55::i;55409:788::-;55614:10;55626:2;55614:14:::0;55610:587:::2;;55640:8;55630:18;;55665:55;55681:5;:14;;;55696:5;:17;;;55714:1;55716:3;55665:15;:55::i;55610:587::-;55815:10;55827:2;55815:14:::0;55811:386:::2;;55841:8;55831:18;;55866:55;55882:5;:14;;;55897:5;:17;;;55915:1;55917:3;55866:15;:55::i;55811:386::-;56016:10;56028:2;56016:14:::0;56012:185:::2;;56042:8;56032:18;;56067:55;56083:5;:14;;;56098:5;:17;;;56116:1;56118:3;56067:15;:55::i;:::-;56052:14;::::0;::::2;:70:::0;;;56170:17:::2;::::0;::::2;::::0;56139:55:::2;::::0;56052:70;56188:1:::2;56190:3;56139:15;:55::i;:::-;56124:14;::::0;::::2;:70:::0;56012:185:::2;56208:17;56239:5;:14;;;:22;;;56228:8;:33;;;;:::i;:::-;56208:53;;56388:7;56372:12;:23;;56364:55;;;::::0;-1:-1:-1;;;56364:55:0;;15459:2:1;56364:55:0::2;::::0;::::2;15441:21:1::0;15498:2;15478:18;;;15471:30;-1:-1:-1;;;15517:18:1;;;15510:49;15576:18;;56364:55:0::2;15257:343:1::0;56364:55:0::2;56449:15;;56434:12;:30;56430:69;;;-1:-1:-1::0;56482:15:0::2;::::0;56430:69:::2;56543:23;56559:7:::0;56543:23;::::2;:::i;:::-;::::0;-1:-1:-1;56622:23:0::2;56543::::0;56622:8;:23:::2;:::i;:::-;56597:14;::::0;::::2;::::0;;:22:::2;;:48:::0;;;;56698:14;:30;;56721:7;;56698:14;:30:::2;::::0;56721:7;;56698:30:::2;:::i;:::-;::::0;;-1:-1:-1;56739:15:0::2;56747:7:::0;56739:15;::::2;:::i;:::-;56827:17:::0;;:23:::2;;::::0;56739:15;;-1:-1:-1;56854:1:0::2;56827:28;:77:::0;::::2;;;-1:-1:-1::0;56885:19:0::2;::::0;56863:14:::2;::::0;::::2;::::0;:19;:41:::2;56827:77;56826:209;;;-1:-1:-1::0;56956:17:0;;:23:::2;;::::0;56983:1:::2;56956:28;:78:::0;::::2;;;-1:-1:-1::0;57014:20:0::2;::::0;56992:14:::2;::::0;::::2;::::0;:19;:42:::2;56956:78;56822:3959;;;57181:50;;:::i;:::-;57246:32:::0;;;57321:15:::2;::::0;:57:::2;::::0;-1:-1:-1;;;57321:57:0;;-1:-1:-1;;;;;201:32:1;;;57321:57:0::2;::::0;::::2;183:51:1::0;57321:15:0;;::::2;::::0;:42:::2;::::0;156:18:1;;57321:57:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57293:25;::::0;;::::2;:85:::0;;;;57430:64:::2;::::0;-1:-1:-1;;16717:2:1;16713:15;;;16709:53;57430:64:0;;::::2;16697:66:1::0;;;;57461:15:0::2;16779:12:1::0;;;16772:28;57477:16:0::2;16816:12:1::0;;;16809:28;16853:12;;57430:64:0::2;::::0;;-1:-1:-1;;57430:64:0;;::::2;::::0;;;;;;57420:75;;57430:64:::2;57420:75:::0;;::::2;::::0;57393:19;;::::2;:103:::0;57594:11:::2;::::0;57623:17;;57641:14;;::::2;::::0;57594:76;;-1:-1:-1;;;57594:76:0;;57415:81:::2;::::0;-1:-1:-1;;;;;57594:11:0;;::::2;::::0;:28:::2;::::0;:76:::2;::::0;57623:17;;57641:14;57393:12;;57594:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57552:5;:17;;57551:119;;;;;;;;57697:15;;;;;;;;;-1:-1:-1::0;;;;;57697:15:0::2;-1:-1:-1::0;;;;;57697:30:0::2;;57728:13;57742:5;57750;:17;;;57697:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57886:118;;;;;;;;57900:5;:14;;;:19;;;57886:118;;;;57941:19;;57930:8;:30;;;;:::i;:::-;57886:118;;;;57981:21;;57970:8;:32;;;;:::i;:::-;57886:118;;::::0;57869:5:::2;:14;;:135;;;;58019:15;;;;;;;;;-1:-1:-1::0;;;;;58019:15:0::2;-1:-1:-1::0;;;;;58019:27:0::2;;58047:13;58062:5;58069;:14;;;58019:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;58162:11:0::2;::::0;58186:17;;:20;58162:45:::2;::::0;-1:-1:-1;;;58162:45:0;;-1:-1:-1;;;;;58162:11:0;;::::2;::::0;-1:-1:-1;58162:23:0::2;::::0;-1:-1:-1;58162:45:0::2;::::0;::::2;;2039:25:1::0;;;2027:2;2012:18;;1893:177;58162:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58142:5;:17;;:65;;;;58283:15;;;;;;;;;-1:-1:-1::0;;;;;58283:15:0::2;-1:-1:-1::0;;;;;58283:39:0::2;;58323:13;58338:5;58345;:17;;;58283:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58437:55;58453:5;:14;;;58468:5;:17;;;58486:1;58488:3;58437:15;:55::i;:::-;58422:14;::::0;::::2;:70:::0;;;58553:17:::2;::::0;::::2;::::0;58522:55:::2;::::0;58422:70;58571:1:::2;58573:3;58522:15;:55::i;:::-;58507:14;::::0;::::2;:70:::0;;;58638:17:::2;::::0;::::2;::::0;58607:55:::2;::::0;58507:70;58656:1:::2;58658:3;58607:15;:55::i;:::-;58592:14;::::0;::::2;:70:::0;;;58723:17:::2;::::0;::::2;::::0;58692:55:::2;::::0;58592:70;58741:1:::2;58743:3;58692:15;:55::i;:::-;58677:14;::::0;::::2;:70:::0;;;58808:17:::2;::::0;::::2;::::0;58777:55:::2;::::0;58677:70;58826:1:::2;58828:3;58777:15;:55::i;:::-;58762:14;::::0;::::2;:70:::0;58877:17;;:23:::2;;::::0;58904:1:::2;58877:28:::0;58873:484:::2;;58951:17:::0;;:25;;58975:1:::2;::::0;58951:17;:25:::2;::::0;58975:1;;58951:25:::2;:::i;:::-;::::0;;-1:-1:-1;59053:17:0;;:20;59076:5:::2;-1:-1:-1::0;59049:289:0::2;;;59182:17:::0;;:20;:28:::2;::::0;59205:5:::2;::::0;59182:28:::2;:::i;:::-;59159:14;::::0;::::2;::::0;:20:::2;;:51:::0;59049:289:::2;;;59290:17:::0;;:20;:24:::2;::::0;59313:1:::2;::::0;59290:24:::2;:::i;:::-;59267:14;::::0;::::2;::::0;:20:::2;;:47:::0;59049:289:::2;59375:17:::0;;:23:::2;;::::0;59402:1:::2;59375:28:::0;59371:540:::2;;59525:17:::0;;:25;;59549:1:::2;::::0;59525:17;:25:::2;::::0;59549:1;;59525:25:::2;:::i;:::-;::::0;;-1:-1:-1;59623:17:0;;:20;59646:5:::2;-1:-1:-1::0;59619:277:0::2;;;59750:17:::0;;:20;:28:::2;::::0;59773:5:::2;::::0;59750:28:::2;:::i;:::-;59725:14;::::0;::::2;::::0;:22:::2;;:53:::0;59619:277:::2;;;59852:17:::0;;:20;:24:::2;::::0;59875:1:::2;::::0;59852:24:::2;:::i;:::-;59827:14;::::0;::::2;::::0;:22:::2;;:49:::0;59619:277:::2;59925:15;;;;;;;;;-1:-1:-1::0;;;;;59925:15:0::2;-1:-1:-1::0;;;;;59925:27:0::2;;59953:13;59968:5;59976;:14;;;59925:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;60091:15:0::2;::::0;:40:::2;::::0;-1:-1:-1;;;60091:40:0;;-1:-1:-1;;;;;201:32:1;;;60091:40:0::2;::::0;::::2;183:51:1::0;60076:12:0::2;::::0;-1:-1:-1;60091:15:0;;::::2;::::0;-1:-1:-1;60091:25:0::2;::::0;156:18:1;;60091:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60229:17:::0;;:20;60076:55;;-1:-1:-1;60253:5:0::2;::::0;60229:22:::2;::::0;60250:1:::2;::::0;60229:22:::2;:::i;:::-;60228:30;;;;:::i;:::-;60338:15;::::0;:48:::2;::::0;-1:-1:-1;;;60338:48:0;;60222:1:::2;:37:::0;;::::2;60210:50:::0;;;::::2;::::0;-1:-1:-1;;;;;60338:15:0::2;::::0;:25:::2;::::0;:48:::2;::::0;60364:13;;60210:50;;60338:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57037:3440;;;56822:3959;;;60623:15;::::0;60674:14:::2;::::0;::::2;::::0;60623:66:::2;::::0;-1:-1:-1;;;60623:66:0;;-1:-1:-1;;;;;60623:15:0;;::::2;::::0;:27:::2;::::0;:66:::2;::::0;60651:13;;60666:5;;60623:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;60704:15:0::2;::::0;60754:14:::2;::::0;;::::2;::::0;60704:65;;-1:-1:-1;;;60704:65:0;;-1:-1:-1;;;;;60704:15:0;;::::2;::::0;-1:-1:-1;60704:27:0::2;::::0;-1:-1:-1;60704:65:0::2;::::0;60732:13;;60747:5;;60704:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56822:3959;60853:15;::::0;:43:::2;::::0;-1:-1:-1;;;60853:43:0;;-1:-1:-1;;;;;60853:15:0;;::::2;::::0;:22:::2;::::0;:43:::2;::::0;60876:13;;60891:4;;60853:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60912:66;60930:5;:14;;;60945:5;:17;;;60963:5;:14;;;60912:66;;;;;;;;:::i;:::-;;;;;;;;49710:11280;;;;;;;7183:20:::1;6577:1:::0;7703:22;;7520:213;7183:20:::1;49616:11374:::0;;;:::o;30601:101::-;2026:13;:11;:13::i;:::-;30670:14:::1;:24:::0;30601:101::o;65226:217::-;65279:26;;:::i;:::-;65318:21;65342:25;:23;:25::i;:::-;65391:15;;:44;;-1:-1:-1;;;65391:44:0;;-1:-1:-1;;;;;201:32:1;;;65391:44:0;;;183:51:1;65318:49:0;;-1:-1:-1;65391:15:0;;;:29;;156:18:1;;65391:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65378:57;;65307:136;65226:217;:::o;29892:110::-;2026:13;:11;:13::i;:::-;29966:16:::1;:28:::0;29892:110::o;30708:114::-;2026:13;:11;:13::i;:::-;30784:19:::1;:30:::0;30708:114::o;61424:991::-;7139:21;:19;:21::i;:::-;61535:14:::1;;61522:9;:27;61514:70;;;;-1:-1:-1::0;;;61514:70:0::1;;;;;;;:::i;:::-;61603:27;61620:9;61603:16;:27::i;:::-;61595:56;;;::::0;-1:-1:-1;;;61595:56:0;;21488:2:1;61595:56:0::1;::::0;::::1;21470:21:1::0;21527:2;21507:18;;;21500:30;-1:-1:-1;;;21546:18:1;;;21539:46;21602:18;;61595:56:0::1;21286:340:1::0;61595:56:0::1;61662:21;61686:25;:23;:25::i;:::-;61748:15;::::0;:37:::1;::::0;-1:-1:-1;;;61748:37:0;;-1:-1:-1;;;;;201:32:1;;;61748:37:0::1;::::0;::::1;183:51:1::0;61662:49:0;;-1:-1:-1;61731:14:0::1;::::0;61748:15;;::::1;::::0;:22:::1;::::0;156:18:1;;61748:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61881:15;::::0;:40:::1;::::0;-1:-1:-1;;;61881:40:0;;::::1;::::0;::::1;2039:25:1::0;;;61731:54:0;;-1:-1:-1;;;;;;61881:15:0::1;::::0;:29:::1;::::0;2012:18:1;;61881:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;61881:40:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;61875:54:::0;:59;61867:108:::1;;;::::0;-1:-1:-1;;;61867:108:0;;22525:2:1;61867:108:0::1;::::0;::::1;22507:21:1::0;22564:2;22544:18;;;22537:30;22603:34;22583:18;;;22576:62;-1:-1:-1;;;22654:18:1;;;22647:34;22698:19;;61867:108:0::1;22323:400:1::0;61867:108:0::1;62055:15;::::0;:40:::1;::::0;-1:-1:-1;;;62055:40:0;;-1:-1:-1;;;;;62055:15:0;;::::1;::::0;:29:::1;::::0;:40:::1;::::0;62085:9;;62055:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45:::0;62047:81:::1;;;::::0;-1:-1:-1;;;62047:81:0;;22930:2:1;62047:81:0::1;::::0;::::1;22912:21:1::0;22969:2;22949:18;;;22942:30;23008:25;22988:18;;;22981:53;23051:18;;62047:81:0::1;22728:347:1::0;62047:81:0::1;62173:15;::::0;:54:::1;::::0;-1:-1:-1;;;62173:54:0;;-1:-1:-1;;;;;62173:15:0;;::::1;::::0;:32:::1;::::0;:54:::1;::::0;62206:9;;62217;;62173:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;62270:15:0::1;::::0;:54:::1;::::0;-1:-1:-1;;;62270:54:0;;-1:-1:-1;;;;;62270:15:0;;::::1;::::0;-1:-1:-1;62270:32:0::1;::::0;-1:-1:-1;62270:54:0::1;::::0;62303:9;;62314;;62270:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62385:10;-1:-1:-1::0;;;;;62368:39:0::1;;62397:9;62368:39;;;;;;:::i;:::-;;;;;;;;61503:912;;7183:20:::0;6577:1;7703:22;;7520:213;7183:20;61424:991;:::o;29465:255::-;2026:13;:11;:13::i;:::-;29622:1:::1;29598:21;:25;29590:62;;;::::0;-1:-1:-1;;;29590:62:0;;23874:2:1;29590:62:0::1;::::0;::::1;23856:21:1::0;23913:2;23893:18;;;23886:30;23952:26;23932:18;;;23925:54;23996:18;;29590:62:0::1;23672:348:1::0;29590:62:0::1;29671:8;::::0;29663:49:::1;::::0;-1:-1:-1;;;;;29671:8:0;;::::1;::::0;29690:21:::1;29663:49:::0;::::1;;;::::0;29671:8:::1;29663:49:::0;29671:8;29663:49;29690:21;29671:8;29663:49;::::1;;;;;;;;;;;;;;;;;;64594:626:::0;7139:21;:19;:21::i;:::-;64691::::1;64715:25;:23;:25::i;:::-;64779:15;::::0;:44:::1;::::0;-1:-1:-1;;;64779:44:0;;-1:-1:-1;;;;;201:32:1;;;64779:44:0::1;::::0;::::1;183:51:1::0;64691:49:0;;-1:-1:-1;64751:25:0::1;::::0;64779:15;;::::1;::::0;:29:::1;::::0;156:18:1;;64779:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64751:72;;64850:2;64843:4;:9;64834:64;;;::::0;-1:-1:-1;;;64834:64:0;;24227:2:1;64834:64:0::1;::::0;::::1;24209:21:1::0;24266:2;24246:18;;;24239:30;24305:34;24285:18;;;24278:62;-1:-1:-1;;;24356:18:1;;;24349:39;24405:19;;64834:64:0::1;24025:405:1::0;64834:64:0::1;64918:9:::0;::::1;64931;::::0;::::1;;64918:22;::::0;::::1;::::0;:48:::1;;-1:-1:-1::0;64944:9:0;::::1;64957::::0;;::::1;;64944:22;;64918:48;:74;;;;-1:-1:-1::0;64983:9:0::1;64970::::0;::::1;;64983::::0;;::::1;;64970:22;;64918:74;64909:119;;;::::0;-1:-1:-1;;;64909:119:0;;24769:2:1;64909:119:0::1;::::0;::::1;24751:21:1::0;24808:2;24788:18;;;24781:30;24847:33;24827:18;;;24820:61;24898:18;;64909:119:0::1;24567:355:1::0;64909:119:0::1;65057:9:::0;::::1;65039::::0;65049:6:::1;:4:::0;65054:1:::1;65049:6;:::i;:::-;65039:17;;;;;;;:::i;:::-;;;;:27:::0;65097:6;65104:1:::1;65097:9;;;;65077::::0;65087:6:::1;:4:::0;65092:1:::1;65087:6;:::i;:::-;:8;::::0;65094:1:::1;65087:8;:::i;:::-;65077:19;;;;;;;:::i;:::-;;;;:29:::0;65137:9;;::::1;;65117::::0;65127:6:::1;:4:::0;65132:1:::1;65127:6;:::i;:::-;:8;::::0;65134:1:::1;65127:8;:::i;:::-;65117:19;;;;;;;:::i;:::-;;;;:29:::0;65157:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;65157:55:0;;-1:-1:-1;;;;;65157:15:0;;::::1;::::0;:29:::1;::::0;:55:::1;::::0;65187:13;;65202:9;;65157:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64680:540;;7183:20:::0;6577:1;7703:22;;7520:213;7183:20;64594:626;;:::o;65587:645::-;65749:15;;:34;;-1:-1:-1;;;65749:34:0;;-1:-1:-1;;;;;201:32:1;;;65749:34:0;;;183:51:1;65690:29:0;;65732:14;;65749:15;;;:25;;156:18:1;;65749:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65732:51;;65817:10;65802:11;:25;;65794:84;;;;-1:-1:-1;;;65794:84:0;;25649:2:1;65794:84:0;;;25631:21:1;25688:2;25668:18;;;25661:30;25727:34;25707:18;;;25700:62;-1:-1:-1;;;25778:18:1;;;25771:44;25832:19;;65794:84:0;25447:410:1;65794:84:0;65910:9;65897:10;:22;65889:72;;;;-1:-1:-1;;;65889:72:0;;26064:2:1;65889:72:0;;;26046:21:1;26103:2;26083:18;;;26076:30;26142:34;26122:18;;;26115:62;-1:-1:-1;;;26193:18:1;;;26186:35;26238:19;;65889:72:0;25862:401:1;65889:72:0;65974:16;65993:24;66006:11;65993:10;:24;:::i;:::-;:28;;66020:1;65993:28;:::i;:::-;65974:47;;66061:11;66046:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;66046:27:0;;;;;;;;;;;;;;;;-1:-1:-1;66032:41:0;-1:-1:-1;66091:6:0;66086:139;66107:11;66103:1;:15;66086:139;;;66157:15;;-1:-1:-1;;;;;66157:15:0;:30;66188:7;66197:15;66211:1;66197:11;:15;:::i;:::-;66157:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66140:11;66152:1;66140:14;;;;;;;;:::i;:::-;;;;;;;;;;:73;66120:3;;66086:139;;;;65721:511;;65587:645;;;;;:::o;38313:604::-;7139:21;:19;:21::i;:::-;38396::::1;38420:25;:23;:25::i;:::-;38396:49;;38595:14;38611:18;38633:42;38657:17;38633:23;:42::i;:::-;38594:81;;;;38708:13;38695:9;:26;38687:69;;;;-1:-1:-1::0;;;38687:69:0::1;;;;;;;:::i;:::-;38767:15;::::0;-1:-1:-1;;;;;38767:15:0::1;:25;38793:13:::0;38808:27:::1;38818:17:::0;38808:9;:27:::1;:::i;:::-;38767:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38885:24;:22;:24::i;:::-;38385:532;;;7183:20:::0;6577:1;7703:22;;7520:213;32218:689;32269:14;32285:25;32312:16;32350:21;32374:25;:23;:25::i;:::-;32447:15;;:44;;-1:-1:-1;;;32447:44:0;;-1:-1:-1;;;;;201:32:1;;;32447:44:0;;;183:51:1;32350:49:0;;-1:-1:-1;32410:16:0;;32447:15;;;;:29;;156:18:1;;32447:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32429:62;;:15;:62;:::i;:::-;32410:81;;32521:8;32506:11;:23;32502:398;;32597:1;32585:13;;32636:1;32613:24;;32502:398;;;32734:15;;:40;;-1:-1:-1;;;32734:40:0;;-1:-1:-1;;;;;201:32:1;;;32734:40:0;;;183:51:1;32734:15:0;;;;:25;;156:18:1;;32734:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32722:52;-1:-1:-1;32812:22:0;32823:11;32812:8;:22;:::i;:::-;32789:45;;32879:9;32863:15;;:25;;;;:::i;:::-;32849:39;;32502:398;32330:577;;32218:689;;;:::o;64216:261::-;64260:13;64308:21;64332:25;:23;:25::i;:::-;64379:15;;:38;;-1:-1:-1;;;64379:38:0;;-1:-1:-1;;;;;201:32:1;;;64379:38:0;;;183:51:1;64308:49:0;;-1:-1:-1;64368:8:0;;64379:15;;;;:23;;156:18:1;;64379:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64435:15;;:34;;-1:-1:-1;;;64435:34:0;;;;;2039:25:1;;;64368:49:0;;-1:-1:-1;;;;;;64435:15:0;;:29;;2012:18:1;;64435:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64435:34:0;;;;;;;;;;;;:::i;:::-;64428:41;;;;64216:261;:::o;30008:112::-;2026:13;:11;:13::i;:::-;30083:18:::1;:29:::0;30008:112::o;2788:103::-;2026:13;:11;:13::i;:::-;2853:30:::1;2880:1;2853:18;:30::i;:::-;2788:103::o:0;30492:::-;2026:13;:11;:13::i;:::-;30562:15:::1;:25:::0;30492:103::o;62470:1009::-;7139:21;:19;:21::i;:::-;62582:14:::1;;62569:9;:27;62561:70;;;;-1:-1:-1::0;;;62561:70:0::1;;;;;;;:::i;:::-;62650:30;62667:12;62650:16;:30::i;:::-;62642:63;;;::::0;-1:-1:-1;;;62642:63:0;;26470:2:1;62642:63:0::1;::::0;::::1;26452:21:1::0;26509:2;26489:18;;;26482:30;-1:-1:-1;;;26528:18:1;;;26521:50;26588:18;;62642:63:0::1;26268:344:1::0;62642:63:0::1;62716:21;62740:25;:23;:25::i;:::-;62839:15;::::0;:37:::1;::::0;-1:-1:-1;;;62839:37:0;;-1:-1:-1;;;;;201:32:1;;;62839:37:0::1;::::0;::::1;183:51:1::0;62716:49:0;;-1:-1:-1;62822:14:0::1;::::0;62839:15;;::::1;::::0;:22:::1;::::0;156:18:1;;62839:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62957:15;::::0;:40:::1;::::0;-1:-1:-1;;;62957:40:0;;::::1;::::0;::::1;2039:25:1::0;;;62822:54:0;;-1:-1:-1;62929:25:0::1;::::0;-1:-1:-1;;;;;62957:15:0;;::::1;::::0;:29:::1;::::0;2012:18:1;;62957:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;62957:40:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;63065:15;::::0;:43:::1;::::0;-1:-1:-1;;;63065:43:0;;62929:68;;-1:-1:-1;;;;;;63065:15:0::1;::::0;:29:::1;::::0;:43:::1;::::0;63095:12;;63065:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48:::0;63057:88:::1;;;::::0;-1:-1:-1;;;63057:88:0;;26819:2:1;63057:88:0::1;::::0;::::1;26801:21:1::0;26858:2;26838:18;;;26831:30;26897:29;26877:18;;;26870:57;26944:18;;63057:88:0::1;26617:351:1::0;63057:88:0::1;63166:15;::::0;:57:::1;::::0;-1:-1:-1;;;63166:57:0;;-1:-1:-1;;;;;63166:15:0;;::::1;::::0;:32:::1;::::0;:57:::1;::::0;63199:9;;63210:12;;63166:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;63244:15:0::1;::::0;:57:::1;::::0;-1:-1:-1;;;63244:57:0;;-1:-1:-1;;;;;63244:15:0;;::::1;::::0;-1:-1:-1;63244:32:0::1;::::0;-1:-1:-1;63244:57:0::1;::::0;63277:12;;63291:9;;63244:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;63324:15:0::1;::::0;:52:::1;::::0;-1:-1:-1;;;63324:52:0;;-1:-1:-1;;;;;63324:15:0;;::::1;::::0;-1:-1:-1;63324:39:0::1;::::0;-1:-1:-1;63324:52:0::1;::::0;63364:11;;63324:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63433:10;-1:-1:-1::0;;;;;63417:54:0::1;;63445:11;63458:12;63417:54;;;;;;;:::i;:::-;;;;;;;;62550:929;;;7183:20:::0;6577:1;7703:22;;7520:213;29778:108;2026:13;:11;:13::i;:::-;29851:15:::1;:27:::0;29778:108::o;28802:181::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;28886:26:0;::::1;28878:63;;;::::0;-1:-1:-1;;;28878:63:0;;27563:2:1;28878:63:0::1;::::0;::::1;27545:21:1::0;27602:2;27582:18;;;27575:30;27641:26;27621:18;;;27614:54;27685:18;;28878:63:0::1;27361:348:1::0;28878:63:0::1;28952:8;:23:::0;;-1:-1:-1;;;;;;28952:23:0::1;-1:-1:-1::0;;;;;28952:23:0;;;::::1;::::0;;;::::1;::::0;;28802:181::o;27459:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27459:30:0;;;;;;;;;;;:::o;33082:431::-;33166:14;33182:18;33213:21;33237:25;:23;:25::i;:::-;33285:15;;:40;;-1:-1:-1;;;33285:40:0;;-1:-1:-1;;;;;201:32:1;;;33285:40:0;;;183:51:1;33213:49:0;;-1:-1:-1;33285:15:0;;;:25;;156:18:1;;33285:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33273:52;-1:-1:-1;33383:3:0;33345:35;33273:52;33345:23;:35;:::i;:::-;:41;33336:51;;;;;;33476:23;33459:16;;:40;;;;:::i;:::-;33443:56;;33202:311;33082:431;;;:::o;31529:429::-;31768:15;;:42;;-1:-1:-1;;;31768:42:0;;31799:10;31768:42;;;183:51:1;31585:7:0;;;;-1:-1:-1;;;;;31768:15:0;;;;:30;;156:18:1;;31768:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31744:66;-1:-1:-1;;;;;;31825:27:0;;31821:130;;31876:10;31869:17;;;31529:429;:::o;31821:130::-;31926:13;31529:429;-1:-1:-1;31529:429:0:o;28989:234::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;29096:34:0;::::1;29088:62;;;::::0;-1:-1:-1;;;29088:62:0;;10588:2:1;29088:62:0::1;::::0;::::1;10570:21:1::0;10627:2;10607:18;;;10600:30;-1:-1:-1;;;10646:18:1;;;10639:45;10701:18;;29088:62:0::1;10386:339:1::0;29088:62:0::1;29161:15;:54:::0;;-1:-1:-1;;;;;;29161:54:0::1;-1:-1:-1::0;;;;;29161:54:0;;;::::1;::::0;;;::::1;::::0;;28989:234::o;30246:118::-;2026:13;:11;:13::i;:::-;30324:21:::1;:32:::0;30246:118::o;33519:780::-;33570:9;33581:12;33595:14;33643:21;33667:25;:23;:25::i;:::-;33728:15;;:47;;-1:-1:-1;;;33728:47:0;;33643:49;;-1:-1:-1;33703:22:0;;-1:-1:-1;;;;;33728:15:0;;;;:27;;:47;;33643:49;;33770:4;;33728:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33793:13;;33893:15;;33874:16;;;;33793:13;;-1:-1:-1;33703:72:0;;-1:-1:-1;33833:15:0;;33893;33863:27;;33833:15;33863:27;:::i;:::-;:45;33859:172;;;33935:15;;33925:25;;33859:172;;;34003:16;;;;33993:26;;:8;:26;:::i;:::-;33983:36;;33859:172;34063:8;34045;:15;;;:26;34041:251;;;34100:1;34088:13;;34041:251;;;34152:14;;34141:8;34123;:15;;;:26;;;;:::i;:::-;:43;34119:173;;;34213:8;34195;:15;;;:26;;;;:::i;:::-;34183:38;;34119:173;;;34266:14;;34254:26;;34119:173;33611:688;;;33519:780;;;;;:::o;40934:8546::-;34355:10;34803:18;34849:8;34335:63;;;;-1:-1:-1;;;34335:63:0;;10932:2:1;34335:63:0;;;10914:21:1;10971:2;10951:18;;;10944:30;11010:29;10990:18;;;10983:57;11057:18;;34335:63:0;10730:351:1;34335:63:0;7139:21:::1;:19;:21::i;:::-;41037::::2;41061:25;:23;:25::i;:::-;41117:15;::::0;:65:::2;::::0;-1:-1:-1;;;41117:65:0;;41037:49;;-1:-1:-1;41097:17:0::2;::::0;-1:-1:-1;;;;;41117:15:0;;::::2;::::0;:37:::2;::::0;:65:::2;::::0;41037:49;;41169:12;;41117:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41097:85;;41342:1;41327:12;:16;41319:49;;;;-1:-1:-1::0;;;41319:49:0::2;;;;;;;:::i;:::-;41404:2;41391:9;:15;;41383:43;;;::::0;-1:-1:-1;;;41383:43:0;;28172:2:1;41383:43:0::2;::::0;::::2;28154:21:1::0;28211:2;28191:18;;;28184:30;-1:-1:-1;;;28230:18:1;;;28223:45;28285:18;;41383:43:0::2;27970:339:1::0;41383:43:0::2;41450:20;;:::i;:::-;41501:15;::::0;:51:::2;::::0;-1:-1:-1;;;41501:51:0;;-1:-1:-1;;;;;41501:15:0;;::::2;::::0;:30:::2;::::0;:51:::2;::::0;41532:13;;41546:5;;41501:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41481:71:::0;;41580:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;41580:48:0;;-1:-1:-1;;;;;41580:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;41608:13;;41622:5;;41580:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41563:14;::::0;::::2;:65:::0;41656:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;41656:48:0;;-1:-1:-1;;;;;41656:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;41684:13;;41698:5;;41656:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41639:14;::::0;;::::2;:65:::0;;;;41735:15:::2;::::0;:60;;-1:-1:-1;;;41735:60:0;;-1:-1:-1;;;;;41735:15:0;;::::2;::::0;:39:::2;::::0;:60:::2;::::0;41775:13;;41789:5;;41735:60:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41715:17;::::0;::::2;:80:::0;41818:15:::2;::::0;:44:::2;::::0;-1:-1:-1;;;41818:44:0;;-1:-1:-1;;;;;201:32:1;;;41818:44:0::2;::::0;::::2;183:51:1::0;41806:9:0::2;::::0;41818:15:::2;::::0;:29:::2;::::0;156:18:1;;41818:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41806:56:::0;-1:-1:-1;41873:10:0::2;::::0;42031:15:::2;42057:33;42076:13:::0;42057:18:::2;:33::i;:::-;42125:17:::0;;:20;:17:::2;:25:::0;42116:49:::2;;;::::0;-1:-1:-1;;;42116:49:0;;14855:2:1;42116:49:0::2;::::0;::::2;14837:21:1::0;14894:2;14874:18;;;14867:30;-1:-1:-1;;;14913:18:1;;;14906:40;14963:18;;42116:49:0::2;14653:334:1::0;42116:49:0::2;42185:9;42196:1;42185:12:::0;42176:618:::2;;42207:7;42199:15;;42176:618;;;42251:9;42262:1;42251:12:::0;42247:547:::2;;42273:8;42265:16;;42247:547;;;42311:9;42322:1;42311:12:::0;42307:487:::2;;42333:8;42325:16;;42307:487;;;42364:9;42375:1;42364:12:::0;42360:434:::2;;42386:8;42378:16;;42360:434;;;42417:9;42428:1;42417:12:::0;42413:381:::2;;42439:8;42431:16;;42413:381;;;42479:9;42490:1;42479:12:::0;42475:319:::2;;42501:8;42493:16;;42475:319;;;42532:9;42543:1;42532:12:::0;42528:266:::2;;42554:8;42546:16;;42528:266;;;42592:9;42603:1;42592:12:::0;42588:206:::2;;42614:8;42606:16;;42588:206;;;42645:9;42656:1;42645:12:::0;42641:153:::2;;42667:8;42659:16;;42641:153;;;42698:9;42709:1;42698:12:::0;42694:100:::2;;42720:8;42712:16;;42694:100;;;42760:9;42771:2;42760:13:::0;42756:38:::2;;42783:8;42775:16;;42756:38;42833:8;42809:5;:14;;;:21;;;:32;42805:1071;;;42910:14;::::0;::::2;::::0;:19;:27:::2;::::0;42932:5;;42910:27:::2;:::i;:::-;42888:14;::::0;::::2;::::0;:49;42952:13:::2;42960:5:::0;42952:13;::::2;:::i;:::-;::::0;-1:-1:-1;43004:16:0::2;43015:5:::0;43004:8;:16:::2;:::i;:::-;42980:14;::::0;;::::2;::::0;:21:::2;:40:::0;43049:2:::2;::::0;-1:-1:-1;42805:1071:0::2;;;43128:14;;43121:5;43110:8;43086:5;:14;;;:21;;;:32;;;;:::i;:::-;:40;;;;:::i;:::-;:56;43082:794;;;43190:19;43254:8;43230:5;:14;;;:21;;;:32;;;;:::i;:::-;43213:14;;:50;;;;:::i;:::-;43301:14;::::0;::::2;::::0;:19;43190:74;;-1:-1:-1;43301:36:0::2;::::0;43190:74;;43301:36:::2;:::i;:::-;43279:14;::::0;::::2;::::0;:58;43353:22:::2;43361:14:::0;43353:22;::::2;:::i;:::-;::::0;-1:-1:-1;43427:5:0;43406:17:::2;:14:::0;43421:2:::2;43406:17;:::i;:::-;43405:28;;;;:::i;:::-;43390:43;;43596:14;;43585:8;:25;;;;:::i;:::-;43561:14;::::0;;::::2;::::0;:21:::2;:49:::0;-1:-1:-1;43082:794:0::2;;;43696:14;::::0;::::2;::::0;:19;:27:::2;::::0;43718:5;;43696:27:::2;:::i;:::-;43674:14;::::0;::::2;::::0;:49;43738:13:::2;43746:5:::0;43738:13;::::2;:::i;:::-;;;43814:5;43790;:14;;;:21;;;:29;;;;:::i;:::-;43766:14;::::0;;::::2;::::0;:21:::2;:53:::0;43849:2:::2;::::0;-1:-1:-1;43082:794:0::2;43890:1355:::0;;::::2;;43957:9;43968:1;43957:12:::0;43953:1292:::2;;43986:67;44002:5;:14;;;44017:5;:17;;;44035:1;44040:12;44037:2;:15;;;;:::i;:::-;43986;:67::i;:::-;43971:14;::::0;::::2;:82:::0;43953:1292:::2;;;44094:9;44105:1;44094:12:::0;44090:1155:::2;;44123:66;44139:5;:14;;;44154:5;:17;;;44172:1;44176:12;44174:1;:14;;;;:::i;44090:1155::-;44221:9;44232:1;44221:12:::0;44217:1028:::2;;44250:66;44266:5;:14;;;44281:5;:17;;;44299:1;44303:12;44301:1;:14;;;;:::i;44217:1028::-;44348:9;44359:1;44348:12:::0;44344:901:::2;;44377:66;44393:5;:14;;;44408:5;:17;;;44426:1;44430:12;44428:1;:14;;;;:::i;44344:901::-;44485:9;44496:1;44485:12:::0;44481:764:::2;;44514:66;44530:5;:14;;;44545:5;:17;;;44563:1;44567:12;44565:1;:14;;;;:::i;44481:764::-;44612:9;44623:1;44612:12:::0;44608:637:::2;;44641:67;44657:5;:14;;;44672:5;:17;;;44690:1;44695:12;44692:2;:15;;;;:::i;44608:637::-;44749:9;44760:1;44749:12:::0;44745:500:::2;;44778:67;44794:5;:14;;;44809:5;:17;;;44827:1;44832:12;44829:2;:15;;;;:::i;44745:500::-;44878:9;44889:1;44878:12:::0;44874:371:::2;;44907:67;44923:5;:14;;;44938:5;:17;;;44956:1;44961:12;44958:2;:15;;;;:::i;44874:371::-;45007:9;45018:1;45007:12:::0;45003:242:::2;;45036:67;45052:5;:14;;;45067:5;:17;;;45085:1;45090:12;45087:2;:15;;;;:::i;45003:242::-;45146:9;45157:2;45146:13:::0;45142:103:::2;;45176:67;45192:5;:14;;;45207:5;:17;;;45225:1;45230:12;45227:2;:15;;;;:::i;45176:67::-;45161:14;::::0;::::2;:82:::0;45142:103:::2;45345:17:::0;;:23:::2;;::::0;45372:1:::2;45345:28;:77:::0;::::2;;;-1:-1:-1::0;45403:19:0::2;::::0;45381:14:::2;::::0;::::2;::::0;:19;:41:::2;45345:77;45344:209;;;-1:-1:-1::0;45474:17:0;;:23:::2;;::::0;45501:1:::2;45474:28;:78:::0;::::2;;;-1:-1:-1::0;45532:20:0::2;::::0;45510:14:::2;::::0;::::2;::::0;:19;:42:::2;45474:78;45340:3935;;;45699:50;;:::i;:::-;45764:32:::0;;;45839:15:::2;::::0;:57:::2;::::0;-1:-1:-1;;;45839:57:0;;-1:-1:-1;;;;;201:32:1;;;45839:57:0::2;::::0;::::2;183:51:1::0;45839:15:0;;::::2;::::0;:42:::2;::::0;156:18:1;;45839:57:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45811:25;::::0;;::::2;:85:::0;;;;45948:64:::2;::::0;-1:-1:-1;;16717:2:1;16713:15;;;16709:53;45948:64:0;;::::2;16697:66:1::0;;;;45979:15:0::2;16779:12:1::0;;;16772:28;45995:16:0::2;16816:12:1::0;;;16809:28;16853:12;;45948:64:0::2;::::0;;-1:-1:-1;;45948:64:0;;::::2;::::0;;;;;;45938:75;;45948:64:::2;45938:75:::0;;::::2;::::0;45911:19;;::::2;:103:::0;46112:11:::2;::::0;46141:17;;46159:14;;::::2;::::0;46112:76;;-1:-1:-1;;;46112:76:0;;45933:81:::2;::::0;-1:-1:-1;;;;;46112:11:0;;::::2;::::0;:28:::2;::::0;:76:::2;::::0;46141:17;;46159:14;45911:12;;46112:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46070:5;:17;;46069:119;;;;;;;;46216:15;;;;;;;;;-1:-1:-1::0;;;;;46216:15:0::2;-1:-1:-1::0;;;;;46216:30:0::2;;46247:13;46261:5;46269;:17;;;46216:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46405:118;;;;;;;;46419:5;:14;;;:19;;;46405:118;;;;46460:19;;46449:8;:30;;;;:::i;:::-;46405:118;;;;46500:21;;46489:8;:32;;;;:::i;:::-;46405:118;;::::0;46388:5:::2;:14;;:135;;;;46538:15;;;;;;;;;-1:-1:-1::0;;;;;46538:15:0::2;-1:-1:-1::0;;;;;46538:27:0::2;;46566:13;46581:5;46588;:14;;;46538:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;46681:11:0::2;::::0;46705:17;;:20;46681:45:::2;::::0;-1:-1:-1;;;46681:45:0;;-1:-1:-1;;;;;46681:11:0;;::::2;::::0;-1:-1:-1;46681:23:0::2;::::0;-1:-1:-1;46681:45:0::2;::::0;::::2;;2039:25:1::0;;;2027:2;2012:18;;1893:177;46681:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46661:5;:17;;:65;;;;46802:15;;;;;;;;;-1:-1:-1::0;;;;;46802:15:0::2;-1:-1:-1::0;;;;;46802:39:0::2;;46842:13;46857:5;46864;:17;;;46802:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46956:55;46972:5;:14;;;46987:5;:17;;;47005:1;47007:3;46956:15;:55::i;:::-;46941:14;::::0;::::2;:70:::0;;;47072:17:::2;::::0;::::2;::::0;47041:55:::2;::::0;46941:70;47090:1:::2;47092:3;47041:15;:55::i;:::-;47026:14;::::0;::::2;:70:::0;;;47157:17:::2;::::0;::::2;::::0;47126:55:::2;::::0;47026:70;47175:1:::2;47177:3;47126:15;:55::i;:::-;47111:14;::::0;::::2;:70:::0;;;47242:17:::2;::::0;::::2;::::0;47211:55:::2;::::0;47111:70;47260:1:::2;47262:3;47211:15;:55::i;:::-;47196:14;::::0;::::2;:70:::0;;;47327:17:::2;::::0;::::2;::::0;47296:55:::2;::::0;47196:70;47345:1:::2;47347:3;47296:15;:55::i;:::-;47281:14;::::0;::::2;:70:::0;47384:17;;:23:::2;;::::0;47411:1:::2;47384:28:::0;47380:484:::2;;47458:17:::0;;:25;;47482:1:::2;::::0;47458:17;:25:::2;::::0;47482:1;;47458:25:::2;:::i;:::-;::::0;;-1:-1:-1;47560:17:0;;:20;47583:5:::2;-1:-1:-1::0;47556:289:0::2;;;47689:17:::0;;:20;:28:::2;::::0;47712:5:::2;::::0;47689:28:::2;:::i;:::-;47666:14;::::0;::::2;::::0;:20:::2;;:51:::0;47556:289:::2;;;47797:17:::0;;:20;:24:::2;::::0;47820:1:::2;::::0;47797:24:::2;:::i;:::-;47774:14;::::0;::::2;::::0;:20:::2;;:47:::0;47556:289:::2;47882:17:::0;;:23:::2;;::::0;47909:1:::2;47882:28:::0;47878:540:::2;;48032:17:::0;;:25;;48056:1:::2;::::0;48032:17;:25:::2;::::0;48056:1;;48032:25:::2;:::i;:::-;::::0;;-1:-1:-1;48130:17:0;;:20;48153:5:::2;-1:-1:-1::0;48126:277:0::2;;;48257:17:::0;;:20;:28:::2;::::0;48280:5:::2;::::0;48257:28:::2;:::i;:::-;48232:14;::::0;::::2;::::0;:22:::2;;:53:::0;48126:277:::2;;;48359:17:::0;;:20;:24:::2;::::0;48382:1:::2;::::0;48359:24:::2;:::i;:::-;48334:14;::::0;::::2;::::0;:22:::2;;:49:::0;48126:277:::2;48432:15;;;;;;;;;-1:-1:-1::0;;;;;48432:15:0::2;-1:-1:-1::0;;;;;48432:27:0::2;;48460:13;48475:5;48483;:14;;;48432:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;48599:15:0::2;::::0;:40:::2;::::0;-1:-1:-1;;;48599:40:0;;-1:-1:-1;;;;;201:32:1;;;48599:40:0::2;::::0;::::2;183:51:1::0;48584:12:0::2;::::0;-1:-1:-1;48599:15:0;;::::2;::::0;-1:-1:-1;48599:25:0::2;::::0;156:18:1;;48599:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48737:17:::0;;:20;48584:55;;-1:-1:-1;48761:5:0::2;::::0;48737:22:::2;::::0;48758:1:::2;::::0;48737:22:::2;:::i;:::-;48736:30;;;;:::i;:::-;48846:15;::::0;:48:::2;::::0;-1:-1:-1;;;48846:48:0;;48730:1:::2;:37:::0;;::::2;48718:50:::0;;;::::2;::::0;-1:-1:-1;;;;;48846:15:0::2;::::0;:25:::2;::::0;:48:::2;::::0;48872:13;;48718:50;;48846:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45555:3416;;;45340:3935;;;49117:15;::::0;49168:14:::2;::::0;::::2;::::0;49117:66:::2;::::0;-1:-1:-1;;;49117:66:0;;-1:-1:-1;;;;;49117:15:0;;::::2;::::0;:27:::2;::::0;:66:::2;::::0;49145:13;;49160:5;;49117:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;49198:15:0::2;::::0;49248:14:::2;::::0;;::::2;::::0;49198:65;;-1:-1:-1;;;49198:65:0;;-1:-1:-1;;;;;49198:15:0;;::::2;::::0;-1:-1:-1;49198:27:0::2;::::0;-1:-1:-1;49198:65:0::2;::::0;49226:13;;49241:5;;49198:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45340:3935;49347:15;::::0;:43:::2;::::0;-1:-1:-1;;;49347:43:0;;-1:-1:-1;;;;;49347:15:0;;::::2;::::0;:22:::2;::::0;:43:::2;::::0;49370:13;;49385:4;;49347:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49406:66;49424:5;:14;;;49439:5;:17;;;49457:5;:14;;;49406:66;;;;;;;;:::i;66244:1233::-:0;66501:15;;:34;;-1:-1:-1;;;66501:34:0;;-1:-1:-1;;;;;201:32:1;;;66501:34:0;;;183:51:1;66352:29:0;;;;;;;;66484:14;;66501:15;;;:25;;156:18:1;;66501:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66484:51;;66569:10;66554:11;:25;;66546:105;;;;-1:-1:-1;;;66546:105:0;;28641:2:1;66546:105:0;;;28623:21:1;28680:2;28660:18;;;28653:30;28719:34;28699:18;;;28692:62;28790:34;28770:18;;;28763:62;-1:-1:-1;;;28841:19:1;;;28834:34;28885:19;;66546:105:0;28439:471:1;66546:105:0;66683:9;66670:10;:22;66662:78;;;;-1:-1:-1;;;66662:78:0;;29117:2:1;66662:78:0;;;29099:21:1;29156:2;29136:18;;;29129:30;29195:34;29175:18;;;29168:62;-1:-1:-1;;;29246:18:1;;;29239:41;29297:19;;66662:78:0;28915:407:1;66662:78:0;66753:16;66772:24;66785:11;66772:10;:24;:::i;:::-;:28;;66799:1;66772:28;:::i;:::-;66753:47;;66842:11;66827:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;66827:27:0;;;;;;;;;;;;;;;;;66813:41;;66889:11;66876:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;66865:36;;66948:11;66935:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;66912:48;;66995:11;66982:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;66982:25:0;;;;;;;;;;;;;;;;-1:-1:-1;66971:36:0;-1:-1:-1;67025:6:0;67020:450;67041:11;67037:1;:15;67020:450;;;67074:17;67094:15;67108:1;67094:11;:15;:::i;:::-;67141;;:53;;-1:-1:-1;;;67141:53:0;;67074:35;;-1:-1:-1;;;;;;67141:15:0;;:30;;:53;;67172:7;;67074:35;;67141:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67124:11;67136:1;67124:14;;;;;;;;:::i;:::-;;;;;;;;;;:70;67223:15;;:50;;-1:-1:-1;;;67223:50:0;;-1:-1:-1;;;;;67223:15:0;;;;:27;;:50;;67251:7;;67260:12;;67223:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67209:8;67218:1;67209:11;;;;;;;;:::i;:::-;;;;;;;;;;:64;67315:15;;:62;;-1:-1:-1;;;67315:62:0;;-1:-1:-1;;;;;67315:15:0;;;;:39;;:62;;67355:7;;67364:12;;67315:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67289:20;67310:1;67289:23;;;;;;;;:::i;:::-;;;;;;;;;;:88;67407:15;;:50;;-1:-1:-1;;;67407:50:0;;-1:-1:-1;;;;;67407:15:0;;;;:27;;:50;;67435:7;;67444:12;;67407:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67393:8;67402:1;67393:11;;;;;;;;:::i;:::-;;;;;;;;;;:64;-1:-1:-1;67054:3:0;;67020:450;;;;66473:1004;;66244:1233;;;;;;;:::o;30370:116::-;2026:13;:11;:13::i;:::-;30447:19:::1;:31:::0;30370:116::o;30126:114::-;2026:13;:11;:13::i;:::-;30202:19:::1;:30:::0;30126:114::o;3046:201::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;3135:22:0;::::1;3127:73;;;::::0;-1:-1:-1;;;3127:73:0;;29529:2:1;3127:73:0::1;::::0;::::1;29511:21:1::0;29568:2;29548:18;;;29541:30;29607:34;29587:18;;;29580:62;-1:-1:-1;;;29658:18:1;;;29651:36;29704:19;;3127:73:0::1;29327:402:1::0;3127:73:0::1;3211:28;3230:8;3211:18;:28::i;35001:3183::-:0;7139:21;:19;:21::i;:::-;35095::::1;35119:25;:23;:25::i;:::-;35169:15;::::0;:40:::1;::::0;-1:-1:-1;;;35169:40:0;;-1:-1:-1;;;;;201:32:1;;;35169:40:0::1;::::0;::::1;183:51:1::0;35095:49:0;;-1:-1:-1;35155:11:0::1;::::0;35169:15;;::::1;::::0;:25:::1;::::0;156:18:1;;35169:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35263:15;::::0;:64:::1;::::0;-1:-1:-1;;;35263:64:0;;35155:54;;-1:-1:-1;35243:17:0::1;::::0;-1:-1:-1;;;;;35263:15:0;;::::1;::::0;:37:::1;::::0;:64:::1;::::0;35301:13;;35315:11;;35263:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35486:15;::::0;:51:::1;::::0;-1:-1:-1;;;35486:51:0;;35243:84;;-1:-1:-1;35354:15:0::1;::::0;35338:13:::1;::::0;-1:-1:-1;;;;;35486:15:0::1;::::0;:30:::1;::::0;:51:::1;::::0;35517:13;;35532:4;;35486:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35457:80;;35548:33;35567:13;35548:18;:33::i;:::-;35611:6;35621:1;35611:11:::0;35607:168:::1;;35664:15;::::0;:48:::1;::::0;-1:-1:-1;;;35664:48:0;;35648:1:::1;::::0;-1:-1:-1;;;;;;35664:15:0;;::::1;::::0;:25:::1;::::0;:48:::1;::::0;35690:13;;35648:1;;35664:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35607:168;35800:6;35793:4;:13;35785:52;;;::::0;-1:-1:-1;;;35785:52:0;;29936:2:1;35785:52:0::1;::::0;::::1;29918:21:1::0;29975:2;29955:18;;;29948:30;30014:28;29994:18;;;29987:56;30060:18;;35785:52:0::1;29734:350:1::0;35785:52:0::1;35856:13:::0;;:18;35848:55:::1;;;::::0;-1:-1:-1;;;35848:55:0;;30291:2:1;35848:55:0::1;::::0;::::1;30273:21:1::0;30330:2;30310:18;;;30303:30;30369:26;30349:18;;;30342:54;30413:18;;35848:55:0::1;30089:348:1::0;35848:55:0::1;35949:1;35934:12;:16;35926:49;;;;-1:-1:-1::0;;;35926:49:0::1;;;;;;;:::i;:::-;36003:14;36019:23;36044:16;36064:20;:18;:20::i;:::-;36002:82;;;;;;36145:18;36167:1;36145:23:::0;36141:682:::1;;36315:15;::::0;:43:::1;::::0;-1:-1:-1;;;36315:43:0;;-1:-1:-1;;;;;36315:15:0;;::::1;::::0;:25:::1;::::0;:43:::1;::::0;36341:13;;36315:15;;:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;36373:15:0::1;::::0;:61:::1;::::0;-1:-1:-1;;;36373:61:0;;-1:-1:-1;;;;;36373:15:0;;::::1;::::0;-1:-1:-1;36373:29:0::1;::::0;-1:-1:-1;36373:61:0::1;::::0;36403:13;;36418:15:::1;::::0;36373:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36141:682;;;36571:11;36558:9;:24;36550:73;;;::::0;-1:-1:-1;;;36550:73:0;;30931:2:1;36550:73:0::1;::::0;::::1;30913:21:1::0;30970:2;30950:18;;;30943:30;31009:34;30989:18;;;30982:62;-1:-1:-1;;;31060:18:1;;;31053:34;31104:19;;36550:73:0::1;30729:400:1::0;36550:73:0::1;36758:15;::::0;-1:-1:-1;;;;;36758:15:0::1;:25;36784:13:::0;36799:11:::1;:9:::0;36758:15;36799:11:::1;:::i;:::-;36758:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36141:682;36867:126;::::0;;::::1;::::0;::::1;::::0;;36880:4:::1;36867:126:::0;;36894:3:::1;36867:126;::::0;::::1;::::0;;;36908:2:::1;36867:126:::0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36867:126:0;;;;;;;;;;37017:93;;;;::::1;::::0;;;;37031:11:::1;::::0;-1:-1:-1;;;37031:41:0;;;;;;2039:25:1;;;36867:126:0;;37017:93;;-1:-1:-1;;;;;37031:11:0::1;:28;2012:18:1::0;;;37031:41:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37017:93:::0;;::::1;;37082:15;:11:::0;37096:1:::1;37082:15;:::i;:::-;37017:93;;;;37107:1;37017:93;;::::0;37004:106:::1;;37121:22;37147:100;;;;;;;;37161:1;37147:100;;;;37184:19;;37173:8;:30;;;;:::i;:::-;37147:100;;;;37224:21;;37213:8;:32;;;;:::i;:::-;37147:100;;::::0;37121:126:::1;;37258:15;;;;;;;;;-1:-1:-1::0;;;;;37258:15:0::1;-1:-1:-1::0;;;;;37258:27:0::1;;37286:13;37301:4;37307:8;37258:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37327:15;;;;;;;;;-1:-1:-1::0;;;;;37327:15:0::1;-1:-1:-1::0;;;;;37327:30:0::1;;37358:13;37372:4;37379:10;37327:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37401:15;;;;;;;;;-1:-1:-1::0;;;;;37401:15:0::1;-1:-1:-1::0;;;;;37401:27:0::1;;37429:13;37444:4;37450:8;37401:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37480:15;;;;;;;;;-1:-1:-1::0;;;;;37480:15:0::1;-1:-1:-1::0;;;;;37480:39:0::1;;37520:13;37535:4;37541:11;;;;;;;;;-1:-1:-1::0;;;;;37541:11:0::1;-1:-1:-1::0;;;;;37541:23:0::1;;37565:10;:13;;;37541:38;;;;;;;;;;;;;2039:25:1::0;;2027:2;2012:18;;1893:177;37541:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37480:100;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;37727:15:0::1;::::0;:40:::1;::::0;-1:-1:-1;;;37727:40:0;;-1:-1:-1;;;;;201:32:1;;;37727:40:0::1;::::0;::::1;183:51:1::0;37712:12:0::1;::::0;-1:-1:-1;37727:15:0;;::::1;::::0;-1:-1:-1;37727:25:0::1;::::0;156:18:1;;37727:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37857:13:::0;;37712:55;;-1:-1:-1;37857:19:0::1;::::0;37871:5:::1;::::0;37857:19:::1;:::i;:::-;37924:15;::::0;:48:::1;::::0;-1:-1:-1;;;37924:48:0;;37851:1:::1;:26:::0;;::::1;37839:39:::0;;;::::1;::::0;-1:-1:-1;;;;;37924:15:0::1;::::0;:25:::1;::::0;:48:::1;::::0;37950:13;;37839:39;;37924:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38060:1;38048:9;:13;38044:70;;;38078:24;:22;:24::i;:::-;38129:47;38147:8;38156:10;38167:8;38129:47;;;;;;;;:::i;:::-;;;;;;;;35075:3109;;;;;;;;;;;7183:20:::0;6577:1;7703:22;;7520:213;30828:116;2026:13;:11;:13::i;:::-;30905:20:::1;:31:::0;30828:116::o;2305:132::-;2186:7;2213:6;-1:-1:-1;;;;;2213:6:0;765:10;2369:23;2361:68;;;;-1:-1:-1;;;2361:68:0;;31336:2:1;2361:68:0;;;31318:21:1;;;31355:18;;;31348:30;31414:34;31394:18;;;31387:62;31466:18;;2361:68:0;31134:356:1;7219:293:0;6621:1;7353:7;;:19;7345:63;;;;-1:-1:-1;;;7345:63:0;;31697:2:1;7345:63:0;;;31679:21:1;31736:2;31716:18;;;31709:30;31775:33;31755:18;;;31748:61;31826:18;;7345:63:0;31495:355:1;7345:63:0;6621:1;7486:7;:18;7219:293::o;34424:243::-;34548:19;;-1:-1:-1;;;;;34522:22:0;;;;;;:14;:22;;;;;;34504:40;;:15;:40;:::i;:::-;:63;;34496:112;;;;-1:-1:-1;;;34496:112:0;;32057:2:1;34496:112:0;;;32039:21:1;32096:2;32076:18;;;32069:30;32135:34;32115:18;;;32108:62;-1:-1:-1;;;32186:18:1;;;32179:35;32231:19;;34496:112:0;31855:401:1;34496:112:0;-1:-1:-1;;;;;34619:22:0;;;;;:14;:22;;;;;34644:15;34619:40;;34424:243::o;39211:1717::-;39339:25;;:::i;:::-;39447:8;39433:22;;39477:10;39491:1;39477:15;39466:1455;;39535:11;;39518:14;;:28;39514:196;;;39631:11;;39614:14;;39650:4;;39644;;39614:28;;39631:11;39614:28;:::i;:::-;39613:35;;;;:::i;:::-;39612:42;;;;:::i;:::-;39598:11;;:56;;;;:::i;:::-;39581:73;;39466:1455;;39514:196;39694:14;;39677:31;;39466:1455;;;39731:10;39745:1;39731:15;39727:1194;;39795:8;:15;;;39774:11;:18;;;:36;39770:228;;;39930:4;39924;39907:8;:15;;;39886:11;:18;;;:36;;;;:::i;:::-;39885:43;;;;:::i;:::-;39884:50;;;;:::i;:::-;39866:8;:15;;;:68;;;;:::i;:::-;39845:18;;;:89;39727:1194;;39770:228;39978:18;;;;;39957;;;:39;39727:1194;;;40019:10;40033:1;40019:15;40015:906;;40084:8;:16;;;40062:11;:19;;;:38;40058:236;;;40224:4;40218;40200:8;:16;;;40178:11;:19;;;:38;;;;:::i;:::-;40177:45;;;;:::i;:::-;40176:52;;;;:::i;:::-;40157:8;:16;;;:71;;;;:::i;:::-;40135:19;;;:93;40015:906;;40058:236;40273:19;;;;;40251;;;:41;40015:906;;;40315:10;40329:1;40315:15;40311:610;;40378:8;:14;;;40358:11;:17;;;:34;40354:220;;;40508:4;40502;40486:8;:14;;;40466:11;:17;;;:34;;;;:::i;:::-;40465:41;;;;:::i;:::-;40464:48;;;;:::i;:::-;40447:8;:14;;;:65;;;;:::i;:::-;40427:17;;;:85;40311:610;;40354:220;40555:17;;;;;40535;;;:37;40311:610;;;40595:10;40609:1;40595:15;40591:330;;40665:8;:21;;;40638:11;:24;;;:48;40634:276;;;40830:4;40824;40801:8;:21;;;40774:11;:24;;;:48;;;;:::i;:::-;40773:55;;;;:::i;:::-;40772:62;;;;:::i;:::-;40748:8;:21;;;:86;;;;:::i;:::-;40721:24;;;:113;40634:276;;;40884:24;;;;;40857;;;:51;40634:276;39211:1717;;;;;;:::o;63531:677::-;63682:20;;63605:4;;63657:9;;63682:25;;:54;;;63734:2;63711:13;:20;:25;63682:54;63678:99;;;-1:-1:-1;63760:5:0;;63531:677;-1:-1:-1;;63531:677:0:o;63678:99::-;63792:6;63787:392;63808:13;:20;63804:1;:24;63787:392;;;63850:11;63864:13;63878:1;63864:16;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;63864:16:0;;-1:-1:-1;;;;63919:11:0;;;;;:26;;-1:-1:-1;;;;;;;;;;63934:11:0;;;;63919:26;63917:29;:71;;;;-1:-1:-1;;;;;;;;;;63976:11:0;;;63974:14;63917:71;:121;;;;-1:-1:-1;;;;;;;;;;64011:11:0;;;;;;:26;;-1:-1:-1;;;;;;;;;;64026:11:0;;;;64011:26;64009:29;63917:121;:178;;;;-1:-1:-1;;;;;;;;;;64068:11:0;;;;;;:26;;-1:-1:-1;;;;;;;;;;64083:11:0;;;;64068:26;64066:29;63917:178;63895:273;;;-1:-1:-1;64147:5:0;;63531:677;-1:-1:-1;;;;63531:677:0:o;63895:273::-;-1:-1:-1;63830:3:0;;63787:392;;;-1:-1:-1;64196:4:0;;63531:677;-1:-1:-1;;;63531:677:0:o;31964:246::-;32026:8;;-1:-1:-1;;;;;32026:8:0;32018:59;;;;-1:-1:-1;;;32018:59:0;;32463:2:1;32018:59:0;;;32445:21:1;32502:2;32482:18;;;32475:30;32541:26;32521:18;;;32514:54;32585:18;;32018:59:0;32261:348:1;32018:59:0;32104:8;;:35;;32089:9;;-1:-1:-1;;;;;32104:8:0;;32125:9;;32089;32104:35;32089:9;32104:35;32125:9;32104:8;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32088:51;;;32158:4;32150:52;;;;-1:-1:-1;;;32150:52:0;;33026:2:1;32150:52:0;;;33008:21:1;33065:2;33045:18;;;33038:30;33104:34;33084:18;;;33077:62;-1:-1:-1;;;33155:18:1;;;33148:33;33198:19;;32150:52:0;32824:399:1;3407:191:0;3481:16;3500:6;;-1:-1:-1;;;;;3517:17:0;;;-1:-1:-1;;;;;;3517:17:0;;;;;;3550:40;;3500:6;;;;;;;3550:40;;3481:16;3550:40;3470:128;3407:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;245:131:1:-;-1:-1:-1;;;;;320:31:1;;310:42;;300:70;;366:1;363;356:12;381:247;440:6;493:2;481:9;472:7;468:23;464:32;461:52;;;509:1;506;499:12;461:52;548:9;535:23;567:31;592:5;567:31;:::i;:::-;617:5;381:247;-1:-1:-1;;;381:247:1:o;633:466::-;710:6;718;726;779:2;767:9;758:7;754:23;750:32;747:52;;;795:1;792;785:12;747:52;-1:-1:-1;;840:23:1;;;960:2;945:18;;932:32;;-1:-1:-1;1063:2:1;1048:18;;;1035:32;;633:466;-1:-1:-1;633:466:1:o;1104:226::-;1163:6;1216:2;1204:9;1195:7;1191:23;1187:32;1184:52;;;1232:1;1229;1222:12;1184:52;-1:-1:-1;1277:23:1;;1104:226;-1:-1:-1;1104:226:1:o;1335:303::-;1428:5;1451:1;1461:171;1475:4;1472:1;1469:11;1461:171;;;1534:13;;1522:26;;1577:4;1568:14;;;;1605:17;;;;1495:1;1488:9;1461:171;;;1465:3;;1335:303;;:::o;1643:245::-;1825:4;1810:20;;1839:43;1814:9;1864:6;1839:43;:::i;:::-;1643:245;;;;:::o;2075:127::-;2136:10;2131:3;2127:20;2124:1;2117:31;2167:4;2164:1;2157:15;2191:4;2188:1;2181:15;2207:252;2279:2;2273:9;2321:3;2309:16;;2355:18;2340:34;;2376:22;;;2337:62;2334:88;;;2402:18;;:::i;:::-;2438:2;2431:22;2207:252;:::o;2464:275::-;2535:2;2529:9;2600:2;2581:13;;-1:-1:-1;;2577:27:1;2565:40;;2635:18;2620:34;;2656:22;;;2617:62;2614:88;;;2682:18;;:::i;:::-;2718:2;2711:22;2464:275;;-1:-1:-1;2464:275:1:o;2744:187::-;2793:4;2826:18;2818:6;2815:30;2812:56;;;2848:18;;:::i;:::-;-1:-1:-1;2914:2:1;2893:15;-1:-1:-1;;2889:29:1;2920:4;2885:40;;2744:187::o;2936:697::-;3005:6;3058:2;3046:9;3037:7;3033:23;3029:32;3026:52;;;3074:1;3071;3064:12;3026:52;3114:9;3101:23;3147:18;3139:6;3136:30;3133:50;;;3179:1;3176;3169:12;3133:50;3202:22;;3255:4;3247:13;;3243:27;-1:-1:-1;3233:55:1;;3284:1;3281;3274:12;3233:55;3324:2;3311:16;3349:53;3365:36;3394:6;3365:36;:::i;:::-;3349:53;:::i;:::-;3425:6;3418:5;3411:21;3473:7;3468:2;3459:6;3455:2;3451:15;3447:24;3444:37;3441:57;;;3494:1;3491;3484:12;3441:57;3549:6;3544:2;3540;3536:11;3531:2;3524:5;3520:14;3507:49;3601:1;3576:18;;;3596:2;3572:27;3565:38;;;;3580:5;2936:697;-1:-1:-1;;;;2936:697:1:o;3638:367::-;3731:6;3739;3792:3;3780:9;3771:7;3767:23;3763:33;3760:53;;;3809:1;3806;3799:12;3760:53;3854:23;;;-1:-1:-1;3931:3:1;3916:19;;3913:32;-1:-1:-1;3910:52:1;;;3958:1;3955;3948:12;3910:52;-1:-1:-1;3638:367:1;3996:2;3981:18;;;;;-1:-1:-1;3638:367:1:o;4245:487::-;4322:6;4330;4338;4391:2;4379:9;4370:7;4366:23;4362:32;4359:52;;;4407:1;4404;4397:12;4359:52;4446:9;4433:23;4465:31;4490:5;4465:31;:::i;:::-;4515:5;4593:2;4578:18;;4565:32;;-1:-1:-1;4696:2:1;4681:18;;;4668:32;;4245:487;-1:-1:-1;;;4245:487:1:o;4945:444::-;5004:3;5042:5;5036:12;5069:6;5064:3;5057:19;5101:4;5096:3;5092:14;5085:21;;5140:4;5133:5;5129:16;5163:1;5173:191;5187:6;5184:1;5181:13;5173:191;;;5236:44;5276:3;5267:6;5261:13;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;4887:47;4737:203;5236:44;5309:4;5300:14;;;;;5349:4;5337:17;;;;;5209:1;5202:9;5173:191;;;-1:-1:-1;5380:3:1;;4945:444;-1:-1:-1;;;;4945:444:1:o;5394:313::-;5619:2;5608:9;5601:21;5582:4;5639:62;5697:2;5686:9;5682:18;5674:6;5639:62;:::i;6244:289::-;6286:3;6324:5;6318:12;6351:6;6346:3;6339:19;6407:6;6400:4;6393:5;6389:16;6382:4;6377:3;6373:14;6367:47;6459:1;6452:4;6443:6;6438:3;6434:16;6430:27;6423:38;6522:4;6515:2;6511:7;6506:2;6498:6;6494:15;6490:29;6485:3;6481:39;6477:50;6470:57;;;6244:289;;;;:::o;6538:220::-;6687:2;6676:9;6669:21;6650:4;6707:45;6748:2;6737:9;6733:18;6725:6;6707:45;:::i;7700:481::-;7776:5;7770:12;7765:3;7758:25;7832:4;7825:5;7821:16;7815:23;7808:4;7803:3;7799:14;7792:47;7888:4;7881:5;7877:16;7871:23;7864:4;7859:3;7855:14;7848:47;7944:4;7937:5;7933:16;7927:23;7920:4;7915:3;7911:14;7904:47;8000:4;7993:5;7989:16;7983:23;7976:4;7971:3;7967:14;7960:47;8056:4;8049:5;8045:16;8039:23;8032:4;8027:3;8023:14;8016:47;8112:4;8105:5;8101:16;8095:23;8088:4;8083:3;8079:14;8072:47;8168:4;8161:5;8157:16;8151:23;8144:4;8139:3;8135:14;8128:47;;;7700:481::o;8186:442::-;8243:3;8281:5;8275:12;8308:6;8303:3;8296:19;8340:4;8335:3;8331:14;8324:21;;8379:4;8372:5;8368:16;8402:1;8412:191;8426:6;8423:1;8420:13;8412:191;;;8475:42;8513:3;8504:6;8498:13;8475:42;:::i;:::-;8546:6;8537:16;;;;;8588:4;8576:17;;;;;8448:1;8441:9;8412:191;;8633:1397;9218:3;9207:9;9200:22;9181:4;9245:63;9303:3;9292:9;9288:19;9280:6;9245:63;:::i;:::-;9356:9;9348:6;9344:22;9339:2;9328:9;9324:18;9317:50;9390:48;9431:6;9423;9390:48;:::i;:::-;9376:62;;9486:9;9478:6;9474:22;9469:2;9458:9;9454:18;9447:50;9520:48;9561:6;9553;9520:48;:::i;:::-;9604:22;;;9599:2;9584:18;;9577:50;9676:13;;9698:22;;;9748:2;9774:15;;;;-1:-1:-1;9736:15:1;;;;9807:1;9817:187;9831:6;9828:1;9825:13;9817:187;;;9880:44;9920:3;9911:6;9905:13;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;4887:47;4737:203;9880:44;9991:2;9979:15;;;;;9953:2;9944:12;;;;;9853:1;9846:9;9817:187;;;-1:-1:-1;10021:3:1;;8633:1397;-1:-1:-1;;;;;;;;8633:1397:1:o;10035:346::-;10103:6;10111;10164:2;10152:9;10143:7;10139:23;10135:32;10132:52;;;10180:1;10177;10170:12;10132:52;-1:-1:-1;;10225:23:1;;;10345:2;10330:18;;;10317:32;;-1:-1:-1;10035:346:1:o;11086:230::-;11156:6;11209:2;11197:9;11188:7;11184:23;11180:32;11177:52;;;11225:1;11222;11215:12;11177:52;-1:-1:-1;11270:16:1;;11086:230;-1:-1:-1;11086:230:1:o;11321:274::-;-1:-1:-1;;;;;11513:32:1;;;;11495:51;;11577:2;11562:18;;11555:34;11483:2;11468:18;;11321:274::o;11600:344::-;11802:2;11784:21;;;11841:2;11821:18;;;11814:30;-1:-1:-1;;;11875:2:1;11860:18;;11853:50;11935:2;11920:18;;11600:344::o;12294:703::-;12358:5;12406:4;12394:9;12389:3;12385:19;12381:30;12378:50;;;12424:1;12421;12414:12;12378:50;12477:2;12471:9;12519:4;12507:17;;12554:18;12539:34;;12575:22;;;12536:62;12533:88;;;12601:18;;:::i;:::-;12637:2;12630:22;;;12721:16;;12746:23;;12835:2;12820:18;;;12814:25;12855:15;;;12848:32;12931:18;;;12925:25;12966:15;;;12959:32;;;;-1:-1:-1;12670:6:1;12294:703;-1:-1:-1;12294:703:1:o;13002:246::-;13095:6;13148:2;13136:9;13127:7;13123:23;13119:32;13116:52;;;13164:1;13161;13154:12;13116:52;13187:55;13234:7;13223:9;13187:55;:::i;13253:1146::-;13344:6;13404:3;13392:9;13383:7;13379:23;13375:33;13420:2;13417:22;;;13435:1;13432;13425:12;13417:22;-1:-1:-1;13477:22:1;;:::i;:::-;13544:16;;13569:22;;13657:2;13642:18;;;13636:25;13677:14;;;13670:31;13767:2;13752:18;;;13746:25;13787:14;;;13780:31;13877:2;13862:18;;;13856:25;13897:14;;;13890:31;13987:3;13972:19;;;13966:26;14008:15;;;14001:32;14099:3;14084:19;;;14078:26;14120:15;;;14113:32;14211:3;14196:19;;;14190:26;14232:15;;;14225:32;14323:3;14308:19;;;14302:26;14344:15;;;14337:32;;;;-1:-1:-1;13576:5:1;13253:1146;-1:-1:-1;13253:1146:1:o;14992:127::-;15053:10;15048:3;15044:20;15041:1;15034:31;15084:4;15081:1;15074:15;15108:4;15105:1;15098:15;15124:128;15191:9;;;15212:11;;;15209:37;;;15226:18;;:::i;15605:125::-;15670:9;;;15691:10;;;15688:36;;;15704:18;;:::i;15735:772::-;15829:6;15882:4;15870:9;15861:7;15857:23;15853:34;15850:54;;;15900:1;15897;15890:12;15850:54;15926:1;15972:7;15965:4;15954:9;15950:20;15946:34;15936:62;;15994:1;15991;15984:12;15936:62;-1:-1:-1;16022:1:1;;16081:4;16105:21;16081:4;16105:21;:::i;:::-;16094:32;-1:-1:-1;16094:32:1;;-1:-1:-1;16176:20:1;;16208:19;;;16205:39;;;16240:1;16237;16230:12;16205:39;16264:9;16282:193;16298:6;16293:3;16290:15;16282:193;;;16390:10;;16413:18;;16460:4;16451:14;;;;16315;16282:193;;;-1:-1:-1;16494:7:1;;15735:772;-1:-1:-1;;;;;15735:772:1:o;16876:917::-;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;;4887:47;17212:4;17197:20;;17278:50;17324:2;17313:9;17309:18;17301:6;17278:50;:::i;:::-;17371:6;17365:13;17359:3;17348:9;17344:19;17337:42;17426:4;17418:6;17414:17;17408:24;17467:3;17456:9;17452:19;17543:1;17553:171;17567:4;17564:1;17561:11;17553:171;;;17626:13;;17614:26;;17669:4;17697:17;;;;17660:14;;;;17587:1;17580:9;17553:171;;;17557:3;;;17780:4;17772:6;17768:17;17762:24;17755:4;17744:9;17740:20;17733:54;16876:917;;;;;;:::o;17798:354::-;17900:6;17908;17961:3;17949:9;17940:7;17936:23;17932:33;17929:53;;;17978:1;17975;17968:12;17929:53;18001:55;18048:7;18037:9;18001:55;:::i;:::-;18118:2;18103:18;;;;18097:25;17991:65;;18097:25;;-1:-1:-1;;;17798:354:1:o;18157:410::-;-1:-1:-1;;;;;18424:32:1;;18406:51;;18488:2;18473:18;;18466:34;;;18393:3;18378:19;;18509:52;18557:2;18542:18;;18534:6;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;4887:47;4737:203;18983:404;-1:-1:-1;;;;;19246:32:1;;19228:51;;19310:2;19295:18;;19288:34;;;19215:3;19200:19;;19331:50;19377:2;19362:18;;19354:6;19331:50;:::i;19392:127::-;19453:10;19448:3;19444:20;19441:1;19434:31;19484:4;19481:1;19474:15;19508:4;19505:1;19498:15;19524:112;19556:1;19582;19572:35;;19587:18;;:::i;:::-;-1:-1:-1;19621:9:1;;19524:112::o;19641:504::-;19961:3;19946:19;;19974:41;19950:9;19997:6;19974:41;:::i;:::-;4809:12;;20072:3;20057:19;;4797:25;4871:4;4860:16;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;4910:23;4894:14;;;4887:47;4809:12;;20134:3;20119:19;;4797:25;4871:4;4860:16;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;4910:23;4894:14;;;4887:47;20086:53;4737:203;20150:772;20244:6;20297:4;20285:9;20276:7;20272:23;20268:34;20265:54;;;20315:1;20312;20305:12;20265:54;20341:1;20387:7;20380:4;20369:9;20365:20;20361:34;20351:62;;20409:1;20406;20399:12;20351:62;-1:-1:-1;20437:1:1;;20496:4;20520:21;20496:4;20520:21;:::i;20927:354::-;21129:2;21111:21;;;21168:2;21148:18;;;21141:30;21207:32;21202:2;21187:18;;21180:60;21272:2;21257:18;;20927:354::o;21631:687::-;21711:6;21764:2;21752:9;21743:7;21739:23;21735:32;21732:52;;;21780:1;21777;21770:12;21732:52;21813:9;21807:16;21846:18;21838:6;21835:30;21832:50;;;21878:1;21875;21868:12;21832:50;21901:22;;21954:4;21946:13;;21942:27;-1:-1:-1;21932:55:1;;21983:1;21980;21973:12;21932:55;22016:2;22010:9;22041:53;22057:36;22086:6;22057:36;:::i;22041:53::-;22117:6;22110:5;22103:21;22165:7;22160:2;22151:6;22147:2;22143:15;22139:24;22136:37;22133:57;;;22186:1;22183;22176:12;22133:57;22234:6;22229:2;22225;22221:11;22216:2;22209:5;22205:14;22199:42;22286:1;22261:18;;;22281:2;22257:27;22250:38;;;;22265:5;21631:687;-1:-1:-1;;;;21631:687:1:o;23080:291::-;23257:6;23246:9;23239:25;23300:2;23295;23284:9;23280:18;23273:30;23220:4;23320:45;23361:2;23350:9;23346:18;23338:6;23320:45;:::i;23376:291::-;23553:2;23542:9;23535:21;23516:4;23573:45;23614:2;23603:9;23599:18;23591:6;23573:45;:::i;:::-;23565:53;;23654:6;23649:2;23638:9;23634:18;23627:34;23376:291;;;;;:::o;24435:127::-;24496:10;24491:3;24487:20;24484:1;24477:31;24527:4;24524:1;24517:15;24551:4;24548:1;24541:15;24927:168;25000:9;;;25031;;25048:15;;;25042:22;;25028:37;25018:71;;25069:18;;:::i;25100:342::-;-1:-1:-1;;;;;25342:32:1;;25324:51;;25310:4;25295:20;;25384:52;25432:2;25417:18;;25409:6;25384:52;:::i;26973:383::-;27170:2;27159:9;27152:21;27133:4;27196:45;27237:2;27226:9;27222:18;27214:6;27196:45;:::i;:::-;27289:9;27281:6;27277:22;27272:2;27261:9;27257:18;27250:50;27317:33;27343:6;27335;27317:33;:::i;:::-;27309:41;26973:383;-1:-1:-1;;;;;26973:383:1:o;27714:251::-;27784:6;27837:2;27825:9;27816:7;27812:23;27808:32;27805:52;;;27853:1;27850;27843:12;27805:52;27885:9;27879:16;27904:31;27929:5;27904:31;:::i;28314:120::-;28354:1;28380;28370:35;;28385:18;;:::i;:::-;-1:-1:-1;28419:9:1;;28314:120::o

Swarm Source

ipfs://50f8f9105876dce6fa5413b2f572da476f349e611457d7daa0cd6670f331f832

Block Transaction 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
[ 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.