S Price: $0.447326 (+2.55%)

Contract

0x87BeB753D3206640fBE2A62dA5648108a50F3A5B

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update RAM Contr...71241032025-02-09 9:59:1539 hrs ago1739095155IN
0x87BeB753...8a50F3A5B
0 S0.0025389155
Update Storage C...71240932025-02-09 9:59:0339 hrs ago1739095143IN
0x87BeB753...8a50F3A5B
0 S0.0025375955

Parent Transaction Hash Block From To
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-09
*/

// 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 {
        //uint32 types; //determine element and some skills. 0=none, 1=fire, 2=water, 3=ice, 4=electic, 5=nature, 6=light, 7=dark //linked to skill right now
        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
        //   family to gene is tricky, need to +1 to make sure 0 means nothing. Thus 1 is Dragon, althought for trainerGene, 0 is dragon 
        //   because player wont submit a transaction to set their trainer gene when start. 
        uint stage; //1 is rookie, 2 is mature, 3 is perfect
        //e.g. start with dragon, so family = 1,  later if evolve with phantom, then 2*100 + family = 201, 102 or 201 also represent Dragon+phantom  
        //0=none, 1=dragon, 2=phantom, 3=aqua, 4=wombat
       // uint32 bond; //how many action you took on this unit
       // uint64 stamina; //how much you can train it per day. it should follow saturation graph
    }


    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
    }


/*
    struct PlayerData {
        //----Player Quest variables--------
        uint mainquest;   // mainquest 77 digits. Each digit represents a quest progress
        uint sidequest;   // side quest 77 digits. Each digit represents a quest progress
        uint premiumscore; // serves like premium exp, gained from events, quests, marketing campaigns, etc.
                          // also indicates player activeness.
        
        //----Player Stats variables--------    
   //     uint exp;        // player experience, increases based on activity
   //     uint rankscore;   // player ranking score for PvP
    //    uint32 energy1;   // energy of the player, for time-gated Quest/SideQuest
   //     uint32 energy2;   // energy of the player, for time-gated PvP-ranking
  //      uint32 energy22;  // energy of the player, for time-gated PvP-kingofthehill
  //      uint32 energy3;   // energy of the player, for time-gated WorldBoss
        
        //-----limits for restriction-------
        uint limit1;      // limit free openbox/mint. Default: 2 per day 
        uint limit2;      // reserve
        uint limit3;      // reserve
        uint timebound1;  // for limit free openbox/mint. Set it to now if >24hr and reset limit1
        uint timebound2;  // reserve
        
*/
}
// 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; // if Bond more than this, evolve. BUT it is Stamina + Hunger, thus 48hr per day, open Box gave 24+21= 45 hours
    // so Rookie to Mature default set at 36 hours. Half of to perfect, Feed enough and Train enough, still can evolve immediately right after open box
    uint public MATURETOPERFECT_BOND = 81 hours; // on evolved, you gain max stamina and initial hunger again, means 45hours again.
    // to Perfect, I wish it to be at the same day, 36~45 hour + 45 hours = 81~90hours base, 12 hours away = 93hours. So default 93 hours
    // For debugging, make it 81hours // after rethink. it will cause fatigue to let them online twice per day. so 24 stamina + 21 hunger = 45hrs, twice = 90 hours. set at 81hr is good
    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) {
        //check the timenow and minted 0th box whether the limit has reset
        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 {
        //this is to prevent player spam an action or botting effectively.
        //this function must be Internal otherwise, it will congest a player reentrant time to make him/her unplayable
        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 {
        // This function is for the user to open a Pet daily. More than a pet needs to be paid.
        // The opening box - pet will be according to the active trainer.
        //----------------
        // Check if the chosen slot is available
        // Check the reset time: Reset time is defined as after the first mint within 24hr
        // It means paid mint for 2nd and so on will not change the first mint time.
        //**** SLOT0 is reserved to be empty, cannot be used, for party setting****
        //require(slot!=0,"Slot0 cannot be used."); front end need major update. postponed
        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.");
        //if (trainergene !=0) { //if the trainer is not default Jojo, then make sure this player has different trainer
        //must play quest 0 to get Jojo genestrength to 1 for free.
            require(genestrength > 0, "Don't have the gene.");
        //}
        //if (genestrength == 0) {genestrength =1;} //after checking limited trainer, set genestr to 1 for default trainer.
        // Add the rest of your code here...
        (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);
        }
        //this is the next sequence, so open box safely
        // I dont use RAM on these setting because it is standard. nothing will change here over patch.
        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);
        //this need RAM to set max stat
        //********************************SET MAX STATSSSSS after opened box**********************************
        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 {petunits.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 {petunits.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 {petunits.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 {petunits.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 {petunits.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
        }
        // 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%
        if      (_foodtype==0){} //backpack food
        //**************************** rate from UnitUpdateStats assume 1000 = 100%, _partialstat already upscale 10 *********
        //**************************** since 10% = 100 for UnitUpdateStats, and *_partialstat here already...  ****
        //**************************** it turns out that 10 = 10% ***************************** 
        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);
            //******  after getting all details from RAM, time to update the storage ******
            //4 stuff to update: Status | Times | Unit | Unitmax
            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
            contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot ,contractRAM.petunitsmax(Lings.petstatuses.id)); //use new id to get max stat, no genestrength and skills yet
            //evolve gain all stats by 20%
            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);
            
            //gain new skill, with training stats above
            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)
            //***//** 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 << ((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);
            //******  after getting all details from RAM, time to update the storage ******
            //4 stuff to update: Status | Times | Unit | Unitmax
            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
            contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot ,contractRAM.petunitsmax(Lings.petstatuses.id)); //use new id to get max stat, no genestrength and skills yet
            //evolve gain all stats by 20%
            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);
            
            //gain new skill, with training stats above
            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)
            //***//** 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 << ((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 to log new player registration
    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();
        // Attempt to get the caller's UID. 
        // If they have never registered a UID, ensure your game logic 
        // calls contractStorage.registerUID(msg.sender) 
        // *before* calling registerPlayer, or do it inline below.
        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");

        // Update UID -> Username
        contractStorage.setUIDToUsername(playerUID, _newUsername);
        // Update Username -> UID
        contractStorage.setUsernameToUID(_newUsername, playerUID);

        // Clear the old username -> UID mapping
        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   /////////////////////////////////////////////////////////////////

    //a quick function to determine which id is 0, which is empty, for Open Box. If non of these are 0, means Box/Slot full.
    //consider remind player to infuse their pet to empty out the slot (free), or expand slot (paid). 
    //suggest max 100 elements per GET to prevent overflow.
    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);
        }
    }

    //this is read full function, but it takes a lot of processing/gas. Do not return too much at once. suggest max 20 elements per GET.
    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"}]

6080604052676f05b59d3b200000600455674563918244f40000600555620151806006819055610fa7819055612a30610fa8556002610fa955610faa819055610fab556201ec30610fac5562047310610fad55610faf80546001600160a01b03191633179055662386f26fc10000610fb055348015607b575f5ffd5b50608333608b565b6001805560da565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b615b2b806100e75f395ff3fe608060405260043610610275575f3560e01c80636edb6aa01161014a578063b9f54f2c116100be578063e5ea43d411610078578063e5ea43d41461074b578063e9c634c91461077a578063eadfd89314610799578063f2fde38b146107b8578063f35dea5a146107d7578063feaa19bf146107ea575f5ffd5b8063b9f54f2c146106a4578063c2442589146106c3578063cf6621fc146106e2578063d82d7a0d14610701578063d9c17a1a14610717578063e1c361e214610736575f5ffd5b80637f51bb1f1161010f5780637f51bb1f146105b157806381069905146105d05780638197906e1461062a5780638da5cb5b1461065e57806396a33dc51461067a578063a46a6ab41461068e575f5ffd5b80636edb6aa01461052d578063715018a61461054c57806376e2fcd51461056057806377c846af1461057f5780637a44d04814610592575f5ffd5b80633ccfd60b116101ec57806361894434116101a6578063618944341461047c57806361d027b314610491578063635ab8a0146104b1578063647fed85146104c7578063681f3e6d146104f65780636ac5ef7014610517575f5ffd5b80633ccfd60b146103d657806348586b3d146103ea5780634af2fe6f146104095780635054cfe2146104285780635f76310c1461043d5780636070721614610469575f5ffd5b8063236a32c21161023d578063236a32c21461033557806324a22f481461035957806328d24d771461036f5780632fd4f060146103855780633149443c146103a457806336a94134146103c3575f5ffd5b80630549b27e1461027957806306f94913146102b55780630e13ae3b146102d65780631211759b146102f5578063194ace8a14610314575b5f5ffd5b348015610284575f5ffd5b50600254610298906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c0575f5ffd5b506102d46102cf3660046151ea565b610809565b005b3480156102e1575f5ffd5b506102d46102f036600461520c565b610880565b348015610300575f5ffd5b506102d461030f366004615235565b611932565b34801561031f575f5ffd5b50610328611940565b6040516102ac9190615274565b348015610340575f5ffd5b5061034b610faa5481565b6040519081526020016102ac565b348015610364575f5ffd5b5061034b610fa75481565b34801561037a575f5ffd5b5061034b610fad5481565b348015610390575f5ffd5b506102d461039f366004615235565b6119c6565b3480156103af575f5ffd5b506102d46103be366004615235565b6119d3565b6102d46103d136600461531f565b6119e1565b3480156103e1575f5ffd5b506102d4611d5d565b3480156103f5575f5ffd5b506102d4610404366004615399565b611deb565b348015610414575f5ffd5b50600354610298906001600160a01b031681565b348015610433575f5ffd5b5061034b60045481565b348015610448575f5ffd5b5061045c6104573660046153c9565b612042565b6040516102ac9190615454565b6102d4610477366004615235565b6122af565b348015610487575f5ffd5b5061034b60055481565b34801561049c575f5ffd5b50610faf54610298906001600160a01b031681565b3480156104bc575f5ffd5b5061034b610fac5481565b3480156104d2575f5ffd5b506104db61236a565b604080519384526020840192909252908201526060016102ac565b348015610501575f5ffd5b5061050a61249d565b6040516102ac9190615494565b348015610522575f5ffd5b5061034b610fab5481565b348015610538575f5ffd5b506102d4610547366004615235565b61258e565b348015610557575f5ffd5b506102d461259b565b34801561056b575f5ffd5b506102d461057a366004615235565b6125ae565b6102d461058d36600461531f565b6125bc565b34801561059d575f5ffd5b506102d46105ac366004615235565b612944565b3480156105bc575f5ffd5b506102d46105cb3660046151ea565b612951565b3480156105db575f5ffd5b506105ef6105ea366004615235565b6129d2565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102ac565b348015610635575f5ffd5b50610649610644366004615235565b612a1c565b604080519283526020830191909152016102ac565b348015610669575f5ffd5b505f546001600160a01b0316610298565b348015610685575f5ffd5b50610298612ac3565b348015610699575f5ffd5b5061034b610fa95481565b3480156106af575f5ffd5b506102d46106be3660046151ea565b612b4d565b3480156106ce575f5ffd5b506102d46106dd366004615235565b612bbf565b3480156106ed575f5ffd5b506104db6106fc366004615235565b612bcd565b34801561070c575f5ffd5b5061034b610fa85481565b348015610722575f5ffd5b506102d461073136600461520c565b612ce6565b348015610741575f5ffd5b5061034b60065481565b348015610756575f5ffd5b5061076a6107653660046153c9565b613c1d565b6040516102ac9493929190615530565b348015610785575f5ffd5b506102d4610794366004615235565b61417d565b3480156107a4575f5ffd5b506102d46107b3366004615235565b61418b565b3480156107c3575f5ffd5b506102d46107d23660046151ea565b614199565b6102d46107e53660046155cd565b61420f565b3480156107f5575f5ffd5b506102d4610804366004615235565b614ae5565b610811614af3565b6001600160a01b03811661085e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b333b156108cf5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b6108d7614b4c565b5f6108e0612ac3565b600254604051631add0e8b60e21b81526001600160a01b0380841660048301529293505f9290911690636b743a2c90602401602060405180830381865afa15801561092d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095191906155ed565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906109889086908890600401615604565b602060405180830381865afa1580156109a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c791906155ed565b90505f81116109e85760405162461bcd60e51b81526004016108559061561d565b6018851115610a2c5760405162461bcd60e51b815260206004820152601060248201526f57726f6e6720547261696e207479706560801b6044820152606401610855565b610a346150c5565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90610a669087908b90600401615604565b606060405180830381865afa158015610a81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa591906156a2565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90610ad99087908b90600401615604565b61010060405180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1991906156bc565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190610b509087908b90600401615604565b606060405180830381865afa158015610b6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8f91906156a2565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90610bc99087908b90600401615604565b61010060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0991906156bc565b60608201525f42610c1986614ba5565b8251515f03610c575760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b875f03610c9c57612a309150610c78836020015184606001515f60aa614c44565b602084018190526060840151610c92919060016064614c44565b6020840152611080565b87600103610cd957612a309150610cbf83602001518460600151600160aa614c44565b602084018190526060840151610c92919060036064614c44565b87600203610d1657612a309150610cfc83602001518460600151600260aa614c44565b602084018190526060840151610c92919060046064614c44565b87600303610d5257612a309150610d3983602001518460600151600360aa614c44565b602084018190526060840151610c9291905f6064614c44565b87600403610d8f57612a309150610d7583602001518460600151600460aa614c44565b602084018190526060840151610c92919060026064614c44565b87600503610db2576154609150610c78836020015184606001515f610137614c44565b87600603610dd6576154609150610cbf836020015184606001516001610137614c44565b87600703610dfa576154609150610cfc836020015184606001516002610137614c44565b87600803610e1e576154609150610d39836020015184606001516003610137614c44565b87600903610e42576154609150610d75836020015184606001516004610137614c44565b87600a03610e655761a8c09150610c78836020015184606001515f61020d614c44565b87600b03610e895761a8c09150610cbf83602001518460600151600161020d614c44565b87600c03610ead5761a8c09150610cfc83602001518460600151600261020d614c44565b87600d03610ed15761a8c09150610d3983602001518460600151600361020d614c44565b87600e03610ef55761a8c09150610d7583602001518460600151600461020d614c44565b87600f03610f185761fd209150610c78836020015184606001515f6102a1614c44565b87601003610f3c5761fd209150610cbf8360200151846060015160016102a1614c44565b87601103610f605761fd209150610cfc8360200151846060015160026102a1614c44565b87601203610f845761fd209150610d398360200151846060015160036102a1614c44565b87601303610fa85761fd209150610d758360200151846060015160046102a1614c44565b87601403610fcc57620151809150610c78836020015184606001515f610307614c44565b87601503610ff157620151809150610cbf836020015184606001516001610307614c44565b8760160361101657620151809150610cfc836020015184606001516002610307614c44565b8760170361103b57620151809150610d39836020015184606001516003610307614c44565b8760180361108057620151809150611060836020015184606001516004610307614c44565b60208401819052606084015161107a919060026064614c44565b60208401525b5f83604001516020015182611095919061573e565b9050828110156110dd5760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b41039ba30b6b4b7309760691b6044820152606401610855565b610faa548111156110ee5750610faa545b6110f8838261573e565b9050611104818361573e565b60408501805160200191909152518051849190611122908390615751565b90525061112f8387615751565b845160400151909650600114801561114e5750610fac54604085015151115b80611170575083516040015160021480156111705750610fad54604085015151115b156117af5761117d615136565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156111c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ed9190615764565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354875192880151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926112799290919087906004016157cb565b608060405180830381865afa158015611294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b8919061583e565b875f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e895f01516040518463ffffffff1660e01b815260040161130a93929190615869565b5f604051808303815f87803b158015611321575f5ffd5b505af1158015611333573d5f5f3e3d5ffd5b50505050604051806060016040528087604001515f01518152602001610fa7548661135e919061573e565b8152602001610fa854866113729190615751565b815250866040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e89604001516040518463ffffffff1660e01b81526004016113c593929190615869565b5f604051808303815f87803b1580156113dc575f5ffd5b505af11580156113ee573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01515f01516040518263ffffffff1660e01b815260040161145f91815260200190565b61010060405180830381865afa15801561147b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149f91906156bc565b6040518463ffffffff1660e01b81526004016114bd939291906158a1565b5f604051808303815f87803b1580156114d4575f5ffd5b505af11580156114e6573d5f5f3e3d5ffd5b50505050611500866020015187606001515f61012c614c44565b60208701819052606087015161151b9190600161012c614c44565b6020870181905260608701516115369190600261012c614c44565b6020870181905260608701516115519190600361012c614c44565b60208701819052606087015161156c9190600461012c614c44565b60208701528551604001516002036115d7578551805160019190611591908390615751565b90525085515161271010156115be578551516115b0906127119061573e565b602087015160c001526115d7565b8551516115cd9060019061573e565b602087015160c001525b85516040015160030361163d5785518051600191906115f7908390615751565b905250855151612710101561162457855151611616906127119061573e565b602087015160e0015261163d565b8551516116339060019061573e565b602087015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e89602001516040518463ffffffff1660e01b8152600401611685939291906158a1565b5f604051808303815f87803b15801561169c575f5ffd5b505af11580156116ae573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156116fc573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172091906155ed565b875151909150612710906117369060019061573e565b61174091906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae9061177a908d908590600401615604565b5f604051808303815f87803b158015611791575f5ffd5b505af11580156117a3573d5f5f3e3d5ffd5b50505050505050611878565b600254602085015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b916117e6918b918f916004016158a1565b5f604051808303815f87803b1580156117fd575f5ffd5b505af115801561180f573d5f5f3e3d5ffd5b5050600254604080880151905163108b074f60e31b81526001600160a01b0390921693506384583a78925061184a918b918f91600401615869565b5f604051808303815f87803b158015611861575f5ffd5b505af1158015611873573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad906118aa908a908a90600401615604565b5f604051808303815f87803b1580156118c1575f5ffd5b505af11580156118d3573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8460200151855f01518660400151604051611915939291906158ed565b60405180910390a15050505050505061192d60018055565b505050565b61193a614af3565b610fab55565b61194861515b565b5f611951612ac3565b600254604051633d52077560e01b81526001600160a01b038084166004830152929350911690633d5207759060240161078060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c0919061593d565b91505090565b6119ce614af3565b600555565b6119db614af3565b610fac55565b6119e9614b4c565b610fb0543414611a0b5760405162461bcd60e51b81526004016108559061596c565b611a1481614e58565b611a535760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420757365726e616d6560801b6044820152606401610855565b5f611a5c612ac3565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc91906155ed565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015611b13573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b3a91908101906159a3565b5115611b945760405162461bcd60e51b8152602060048201526024808201527f506c6179657220616c72656164792068617320612072656769737465726564206044820152636e616d6560e01b6064820152608401610855565b60025460405163589d1b5560e11b81526001600160a01b039091169063b13a36aa90611bc4908690600401615494565b602060405180830381865afa158015611bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0391906155ed565b15611c505760405162461bcd60e51b815260206004820152601760248201527f557365726e616d6520616c7265616479206578697374730000000000000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf90611c829084908790600401615a18565b5f604051808303815f87803b158015611c99575f5ffd5b505af1158015611cab573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b9150611ce19086908590600401615a30565b5f604051808303815f87803b158015611cf8575f5ffd5b505af1158015611d0a573d5f5f3e3d5ffd5b50505050336001600160a01b03167fe04d23b73ae3d3b27074da9719b5a4cd521395aaf86bfe7e374933ecb567731a84604051611d479190615494565b60405180910390a25050611d5a60018055565b50565b611d65614af3565b5f4711611db45760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f00000000000000006044820152606401610855565b610faf546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611d5a573d5f5f3e3d5ffd5b611df3614b4c565b5f611dfc612ac3565b600254604051633d52077560e01b81526001600160a01b0380841660048301529293505f9290911690633d5207759060240161078060405180830381865afa158015611e4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6e919061593d565b905060148410611ed25760405162461bcd60e51b815260206004820152602960248201527f5465616d203020746f203139206973206f6e6c7920617661696c61626c65207260448201526834b3b43a103737bb9760b91b6064820152608401610855565b8235602084013514801590611eec57508235604084013514155b8015611f0057506020830135604084013514155b611f4c5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420686176652073616d6520736c6f74206f6e2061207465616d006044820152606401610855565b823581611f5a866003615a65565b603c8110611f6a57611f6a615a51565b6020020152826001602002013581611f83866003615a65565b611f8e906001615751565b603c8110611f9e57611f9e615a51565b6020020152604083013581611fb4866003615a65565b611fbf906002615751565b603c8110611fcf57611fcf615a51565b602002015260025460405163ad9bc5fd60e01b81526001600160a01b039091169063ad9bc5fd906120069085908590600401615a7c565b5f604051808303815f87803b15801561201d575f5ffd5b505af115801561202f573d5f5f3e3d5ffd5b50505050505061203e60018055565b5050565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060925f9291169063a4c8ec3490602401602060405180830381865afa15801561208e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b291906155ed565b90508284111561211b5760405162461bcd60e51b815260206004820152602e60248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206e6565647360448201526d0203c3d205f736c6f745f73746f760941b6064820152608401610855565b8083106121785760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420696e7075743a205f736c6f745f73746f70203e20736c6f74604482015264131a5b5a5d60da1b6064820152608401610855565b5f612183858561573e565b61218e906001615751565b90508067ffffffffffffffff8111156121a9576121a9615289565b6040519080825280602002602001820160405280156121fb57816020015b6121e860405180606001604052805f81526020015f81526020015f81525090565b8152602001906001900390816121c75790505b5092505f5b818110156122a5576002546001600160a01b03166388e6c74d88612224848a615751565b6040518363ffffffff1660e01b8152600401612241929190615604565b606060405180830381865afa15801561225c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228091906156a2565b84828151811061229257612292615a51565b6020908102919091010152600101612200565b5050509392505050565b6122b7614b4c565b5f6122c0612ac3565b90505f5f6122cd84612a1c565b915091508034146122f05760405162461bcd60e51b81526004016108559061596c565b6002546001600160a01b031663ebd6180c8461230c8786615751565b6040518363ffffffff1660e01b8152600401612329929190615604565b5f604051808303815f87803b158015612340575f5ffd5b505af1158015612352573d5f5f3e3d5ffd5b5050505061235e614f70565b505050611d5a60018055565b5f5f5f5f612376612ac3565b60025460405163aa31497760e01b81526001600160a01b0380841660048301529293505f929091169063aa31497790602401602060405180830381865afa1580156123c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e791906155ed565b6123f1904261573e565b9050620151808110612408575f94505f9350612496565b60025460405163f9c0109b60e01b81526001600160a01b0384811660048301529091169063f9c0109b90602401602060405180830381865afa158015612450573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247491906155ed565b9450612483816201518061573e565b9350846004546124939190615a65565b92505b5050909192565b60605f6124a8612ac3565b600254604051630bc7d91360e31b81526001600160a01b0380841660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156124f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251991906155ed565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015612560573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261258791908101906159a3565b9250505090565b612596614af3565b600655565b6125a3614af3565b6125ac5f615076565b565b6125b6614af3565b610faa55565b6125c4614b4c565b610fb05434146125e65760405162461bcd60e51b81526004016108559061596c565b6125ef81614e58565b6126325760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206e657720757365726e616d6560601b6044820152606401610855565b5f61263b612ac3565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015612687573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ab91906155ed565b6002546040516351a2c27760e01b8152600481018390529192505f916001600160a01b03909116906351a2c277906024015f60405180830381865afa1580156126f6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261271d91908101906159a3565b60025460405163589d1b5560e11b81529192506001600160a01b03169063b13a36aa9061274e908790600401615494565b602060405180830381865afa158015612769573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278d91906155ed565b156127da5760405162461bcd60e51b815260206004820152601b60248201527f4e657720757365726e616d6520616c72656164792065786973747300000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf9061280c9085908890600401615a18565b5f604051808303815f87803b158015612823575f5ffd5b505af1158015612835573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b915061286b9087908690600401615a30565b5f604051808303815f87803b158015612882575f5ffd5b505af1158015612894573d5f5f3e3d5ffd5b5050600254604051632e9cdc6d60e21b81526001600160a01b03909116925063ba7371b491506128c8908490600401615494565b5f604051808303815f87803b1580156128df575f5ffd5b505af11580156128f1573d5f5f3e3d5ffd5b50505050336001600160a01b03167f10022a11494e4dcaccdda542dc8a420f8a1c3397f37d5bd035a805e79e1a32ee8286604051612930929190615a9a565b60405180910390a2505050611d5a60018055565b61294c614af3565b600455565b612959614af3565b6001600160a01b0381166129af5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207472656173757279206164647265737300000000000000006044820152606401610855565b610faf80546001600160a01b0319166001600160a01b0392909216919091179055565b6007816101f481106129e2575f80fd5b6008020180546001820154600283015460038401546004850154600586015460068701546007909701549597509395929491939092909188565b5f5f5f612a27612ac3565b6002546040516329323b0d60e21b81526001600160a01b03808416600483015292935091169063a4c8ec3490602401602060405180830381865afa158015612a71573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9591906155ed565b92506101f3612aa48486615751565b10612aad575f5ffd5b83600554612abb9190615a65565b915050915091565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015612b0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b319190615ac7565b90506001600160a01b038116612b48573391505090565b919050565b612b55614af3565b6001600160a01b038116612b9d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610855565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b612bc7614af3565b610fa855565b5f5f5f5f612bd9612ac3565b60025460405163fd45e19160e01b81529192505f916001600160a01b039091169063fd45e19190612c109085908a90600401615604565b606060405180830381865afa158015612c2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4f91906156a2565b8051610faa546020830151919750919250429190612c6d908361573e565b1115612c7e57610faa549450612c90565b6020820151612c8d908261573e565b94505b8082604001511015612ca4575f9350612cdc565b610fab54818360400151612cb8919061573e565b1015612cd557808260400151612cce919061573e565b9350612cdc565b610fab5493505b5050509193909250565b333b15612d355760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b612d3d614b4c565b5f612d46612ac3565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e79890612d7d9085908790600401615604565b602060405180830381865afa158015612d98573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dbc91906155ed565b90505f8111612ddd5760405162461bcd60e51b81526004016108559061561d565b600a841115612e205760405162461bcd60e51b815260206004820152600f60248201526e57726f6e6720466f6f64207479706560881b6044820152606401610855565b612e286150c5565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90612e5a9086908a90600401615604565b606060405180830381865afa158015612e75573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e9991906156a2565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90612ecd9086908a90600401615604565b61010060405180830381865afa158015612ee9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0d91906156bc565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190612f449086908a90600401615604565b606060405180830381865afa158015612f5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f8391906156a2565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90612fbd9086908a90600401615604565b61010060405180830381865afa158015612fd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ffd91906156bc565b6060820152600254604051631add0e8b60e21b81526001600160a01b0385811660048301525f921690636b743a2c90602401602060405180830381865afa15801561304a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306e91906155ed565b90505f804261307c87614ba5565b8451515f036130ba5760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b885f036130cb576154609250613180565b886001036130dd5761a8c09250613180565b886002036130ef57618ca09250613180565b8860030361310157618ca09250613180565b8860040361311357619ab09250613180565b8860050361312557619ab09250613180565b8860060361313857620151809250613180565b8860070361314b57620151809250613180565b8860080361315e57620151809250613180565b8860090361317157620151809250613180565b88600a03613180576201518092505b8085604001516040015110156131ce576040850151516131a1908490615751565b6040860151526131b18385615751565b93506131bd8382615751565b6040808701510152600a91506132b9565b610fab5483828760400151604001516131e7919061573e565b6131f19190615751565b1115613275575f8186604001516040015161320c919061573e565b610fab5461321a919061573e565b60408701515190915061322e908290615751565b60408701515261323e8186615751565b94508361324c82600a615a65565b6132569190615ae2565b9250610fab54826132679190615751565b6040808801510152506132b9565b604085015151613286908490615751565b6040860151526132968385615751565b9350828560400151604001516132ac9190615751565b6040808701510152600a91505b881561343a57886001036132f1576132e7856020015186606001515f85600a6132e29190615a65565b614c44565b602086015261343a565b88600203613315576132e78560200151866060015160018560056132e29190615a65565b88600303613339576132e78560200151866060015160028560056132e29190615a65565b8860040361335d576132e78560200151866060015160038560056132e29190615a65565b88600503613381576132e78560200151866060015160048560056132e29190615a65565b886006036133a4576132e7856020015186606001515f8560136132e29190615a65565b886007036133c8576132e785602001518660600151600185600b6132e29190615a65565b886008036133ec576132e785602001518660600151600285600b6132e29190615a65565b88600903613410576132e785602001518660600151600385600b6132e29190615a65565b88600a0361343a5761343485602001518660600151600485600b6132e29190615a65565b60208601525b84516040015160011480156134565750610fac54604086015151115b80613478575084516040015160021480156134785750610fad54604086015151115b15613ab757613485615136565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156134d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f59190615764565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354885192890151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926135819290919087906004016157cb565b608060405180830381865afa15801561359c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c0919061583e565b885f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e8a5f01516040518463ffffffff1660e01b815260040161361293929190615869565b5f604051808303815f87803b158015613629575f5ffd5b505af115801561363b573d5f5f3e3d5ffd5b50505050604051806060016040528088604001515f01518152602001610fa75485613666919061573e565b8152602001610fa8548561367a9190615751565b815250876040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e8a604001516040518463ffffffff1660e01b81526004016136cd93929190615869565b5f604051808303815f87803b1580156136e4575f5ffd5b505af11580156136f6573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8c5f01515f01516040518263ffffffff1660e01b815260040161376791815260200190565b61010060405180830381865afa158015613783573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137a791906156bc565b6040518463ffffffff1660e01b81526004016137c5939291906158a1565b5f604051808303815f87803b1580156137dc575f5ffd5b505af11580156137ee573d5f5f3e3d5ffd5b50505050613808876020015188606001515f61012c614c44565b6020880181905260608801516138239190600161012c614c44565b60208801819052606088015161383e9190600261012c614c44565b6020880181905260608801516138599190600361012c614c44565b6020880181905260608801516138749190600461012c614c44565b60208801528651604001516002036138df578651805160019190613899908390615751565b90525086515161271010156138c6578651516138b8906127119061573e565b602088015160c001526138df565b8651516138d59060019061573e565b602088015160c001525b8651604001516003036139455786518051600191906138ff908390615751565b905250865151612710101561392c5786515161391e906127119061573e565b602088015160e00152613945565b86515161393b9060019061573e565b602088015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e8a602001516040518463ffffffff1660e01b815260040161398d939291906158a1565b5f604051808303815f87803b1580156139a4575f5ffd5b505af11580156139b6573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa158015613a04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a2891906155ed565b88515190915061271090613a3e9060019061573e565b613a4891906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90613a82908d908590600401615604565b5f604051808303815f87803b158015613a99575f5ffd5b505af1158015613aab573d5f5f3e3d5ffd5b50505050505050613b80565b600254602086015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b91613aee918b918f916004016158a1565b5f604051808303815f87803b158015613b05575f5ffd5b505af1158015613b17573d5f5f3e3d5ffd5b5050600254604080890151905163108b074f60e31b81526001600160a01b0390921693506384583a789250613b52918b918f91600401615869565b5f604051808303815f87803b158015613b69575f5ffd5b505af1158015613b7b573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad90613bb2908a908890600401615604565b5f604051808303815f87803b158015613bc9575f5ffd5b505af1158015613bdb573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8560200151865f01518760400151604051611915939291906158ed565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060928392839283925f9291169063a4c8ec3490602401602060405180830381865afa158015613c6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c9391906155ed565b905085871115613d175760405162461bcd60e51b815260206004820152604360248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206d7573742060448201527f6265206c657373207468616e206f7220657175616c20746f205f736c6f745f736064820152620746f760ec1b608482015260a401610855565b808610613d7a5760405162461bcd60e51b815260206004820152602b60248201527f496e76616c696420696e7075743a205f736c6f745f73746f702065786365656460448201526a1cc81cdb1bdd131a5b5a5d60aa1b6064820152608401610855565b5f613d85888861573e565b613d90906001615751565b90508067ffffffffffffffff811115613dab57613dab615289565b604051908082528060200260200182016040528015613dfd57816020015b613dea60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613dc95790505b5095508067ffffffffffffffff811115613e1957613e19615289565b604051908082528060200260200182016040528015613e5257816020015b613e3f61517a565b815260200190600190039081613e375790505b5094508067ffffffffffffffff811115613e6e57613e6e615289565b604051908082528060200260200182016040528015613ea757816020015b613e9461517a565b815260200190600190039081613e8c5790505b5093508067ffffffffffffffff811115613ec357613ec3615289565b604051908082528060200260200182016040528015613f1557816020015b613f0260405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613ee15790505b5092505f5b81811015614171575f613f2d828b615751565b6002546040516388e6c74d60e01b81529192506001600160a01b0316906388e6c74d90613f60908e908590600401615604565b606060405180830381865afa158015613f7b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f9f91906156a2565b888381518110613fb157613fb1615a51565b6020908102919091010152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90613fee908e908590600401615604565b61010060405180830381865afa15801561400a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402e91906156bc565b87838151811061404057614040615a51565b60209081029190910101526002546040516308ff748760e11b81526001600160a01b03909116906311fee90e9061407d908e908590600401615604565b61010060405180830381865afa158015614099573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140bd91906156bc565b8683815181106140cf576140cf615a51565b602090810291909101015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e1919061410c908e908590600401615604565b606060405180830381865afa158015614127573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061414b91906156a2565b85838151811061415d5761415d615a51565b602090810291909101015250600101613f1a565b50505093509350935093565b614185614af3565b610fa955565b614193614af3565b610fa755565b6141a1614af3565b6001600160a01b0381166142065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610855565b611d5a81615076565b614217614b4c565b5f614220612ac3565b6002546040516329323b0d60e21b81526001600160a01b0380841660048301529293505f929091169063a4c8ec3490602401602060405180830381865afa15801561426d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061429191906155ed565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906142c89086908890600401615604565b602060405180830381865afa1580156142e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061430791906155ed565b6002546040516388e6c74d60e01b815291925042915f916001600160a01b0316906388e6c74d9061433e9088908b90600401615604565b606060405180830381865afa158015614359573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061437d91906156a2565b905061438885614ba5565b835f036143f357600254604051633af5860360e21b8152600595506001600160a01b039091169063ebd6180c906143c59088908890600401615604565b5f604051808303815f87803b1580156143dc575f5ffd5b505af11580156143ee573d5f5f3e3d5ffd5b505050505b8387106144425760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e0000000000006044820152606401610855565b8051156144915760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e00000000000000006044820152606401610855565b5f83116144b05760405162461bcd60e51b81526004016108559061561d565b5f5f5f6144bb61236a565b925092509250815f0361458a5760025460405163356ba38360e11b81526001600160a01b0390911690636ad74706906144fb908b90600190600401615604565b5f604051808303815f87803b158015614512575f5ffd5b505af1158015614524573d5f5f3e3d5ffd5b5050600254604051625f880760e01b81526001600160a01b039091169250625f88079150614558908b904290600401615604565b5f604051808303815f87803b15801561456f575f5ffd5b505af1158015614581573d5f5f3e3d5ffd5b5050505061464d565b8034146145e55760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74207061796d656e7420746f206f70656e20746865604482015263040c4def60e31b6064820152608401610855565b6002546001600160a01b0316636ad7470689614602866001615751565b6040518363ffffffff1660e01b815260040161461f929190615604565b5f604051808303815f87803b158015614636575f5ffd5b505af1158015614648573d5f5f3e3d5ffd5b505050505b60408051610100810182526103e8815260646020820181905260328284015260608083018290526080830182905260a083018a90525f60c0840181905260e0840152835190810193849052600354634fa9782d60e01b9094529081018c9052909181906001600160a01b0316634fa9782d60848301602060405180830381865afa1580156146dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061470191906155ed565b81526020016147118c6001615751565b8152602001600181525094505f60405180606001604052805f8152602001610fa7548961473e919061573e565b8152602001610fa854896147529190615751565b815250905060025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8b8e856040518463ffffffff1660e01b815260040161479b939291906158a1565b5f604051808303815f87803b1580156147b2575f5ffd5b505af11580156147c4573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8b8e896040518463ffffffff1660e01b815260040161480c93929190615869565b5f604051808303815f87803b158015614823575f5ffd5b505af1158015614835573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788b8e846040518463ffffffff1660e01b815260040161487d93929190615869565b5f604051808303815f87803b158015614894575f5ffd5b505af11580156148a6573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18b8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01516040518263ffffffff1660e01b815260040161491491815260200190565b61010060405180830381865afa158015614930573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061495491906156bc565b6040518463ffffffff1660e01b8152600401614972939291906158a1565b5f604051808303815f87803b158015614989575f5ffd5b505af115801561499b573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038e811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156149e9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0d91906155ed565b8751909150614a1f90612710906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90614a59908e908590600401615604565b5f604051808303815f87803b158015614a70575f5ffd5b505af1158015614a82573d5f5f3e3d5ffd5b505050505f341115614a9657614a96614f70565b7fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd838884604051614ac9939291906158ed565b60405180910390a1505050505050505050505061203e60018055565b614aed614af3565b610fad55565b5f546001600160a01b031633146125ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b600260015403614b9e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002600155565b610fa9546001600160a01b0382165f908152610fae6020526040902054614bcc904261573e565b1015614c285760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b6064820152608401610855565b6001600160a01b03165f908152610fae60205260409020429055565b614c4c61517a565b849050825f03614ca457845184511115614c9b57845184516103e8918491614c74919061573e565b614c7e9190615a65565b614c889190615ae2565b8551614c949190615751565b8152614e50565b83518552614e50565b82600103614d1057846020015184602001511115614d01576103e88286602001518660200151614cd4919061573e565b614cde9190615a65565b614ce89190615ae2565b8560200151614cf79190615751565b6020820152614e50565b60208085015190860152614e50565b82600203614d7c57846040015184604001511115614d6d576103e88286604001518660400151614d40919061573e565b614d4a9190615a65565b614d549190615ae2565b8560400151614d639190615751565b6040820152614e50565b60408085015190860152614e50565b82600303614de857846060015184606001511115614dd9576103e88286606001518660600151614dac919061573e565b614db69190615a65565b614dc09190615ae2565b8560600151614dcf9190615751565b6060820152614e50565b60608085015190860152614e50565b82600403614e5057846080015184608001511115614e45576103e88286608001518660800151614e18919061573e565b614e229190615a65565b614e2c9190615ae2565b8560800151614e3b9190615751565b6080820152614e50565b608080850151908601525b949350505050565b80515f9082901580614e6b5750600f8151115b15614e7857505f92915050565b5f5b8151811015614f66575f828281518110614e9657614e96615a51565b01602001516001600160f81b0319169050600360fc1b8110801590614ec95750603960f81b6001600160c01b0319821611155b158015614ee45750605f60f81b6001600160c01b0319821614155b8015614f195750604160f81b6001600160c01b0319821610801590614f175750602d60f91b6001600160c01b0319821611155b155b8015614f4e5750606160f81b6001600160c01b0319821610801590614f4c5750603d60f91b6001600160c01b0319821611155b155b15614f5d57505f949350505050565b50600101614e7a565b5060019392505050565b610faf546001600160a01b0316614fc95760405162461bcd60e51b815260206004820152601860248201527f54726561737572792061646472657373206e6f742073657400000000000000006044820152606401610855565b610faf546040515f916001600160a01b03169034908381818185875af1925050503d805f8114615014576040519150601f19603f3d011682016040523d82523d5f602084013e615019565b606091505b5050905080611d5a5760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f20666f727761726420457468657220746f20747265617360448201526275727960e81b6064820152608401610855565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405180608001604052806150f160405180606001604052805f81526020015f81526020015f81525090565b81526020016150fe61517a565b815260200161512460405180606001604052805f81526020015f81526020015f81525090565b815260200161513161517a565b905290565b60405180606001604052805f815260200161514f6151b7565b81526020015f81525090565b604051806107800160405280603c906020820280368337509192915050565b6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b0381168114611d5a575f5ffd5b5f602082840312156151fa575f5ffd5b8135615205816151d6565b9392505050565b5f5f5f6060848603121561521e575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215615245575f5ffd5b5035919050565b805f5b603c81101561526e57815184526020938401939091019060010161524f565b50505050565b6107808101615283828461524c565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156152c1576152c1615289565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156152f0576152f0615289565b604052919050565b5f67ffffffffffffffff82111561531157615311615289565b50601f01601f191660200190565b5f6020828403121561532f575f5ffd5b813567ffffffffffffffff811115615345575f5ffd5b8201601f81018413615355575f5ffd5b8035615368615363826152f8565b6152c7565b81815285602083850101111561537c575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f608083850312156153aa575f5ffd5b82359150608083018410156153bd575f5ffd5b50926020919091019150565b5f5f5f606084860312156153db575f5ffd5b83356153e6816151d6565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561544a576154348683518051825260208082015190830152604090810151910152565b606095909501946020919091019060010161540d565b5093949350505050565b602081525f61520560208301846153fb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6152056020830184615466565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b5f8151808452602084019350602083015f5b8281101561544a576155198683516154a6565b610100959095019460209190910190600101615506565b608081525f61554260808301876153fb565b828103602084015261555481876154f4565b9050828103604084015261556881866154f4565b8381036060850152845180825260208087019350909101905f5b818110156155bf576155a98385518051825260208082015190830152604090810151910152565b6020939093019260609290920191600101615582565b509098975050505050505050565b5f5f604083850312156155de575f5ffd5b50508035926020909101359150565b5f602082840312156155fd575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601490820152732237b713ba103430bb32903a34329033b2b7329760611b604082015260600190565b5f6060828403121561565b575f5ffd5b6040516060810167ffffffffffffffff8111828210171561567e5761567e615289565b60409081528351825260208085015190830152928301519281019290925250919050565b5f606082840312156156b2575f5ffd5b615205838361564b565b5f6101008284031280156156ce575f5ffd5b506156d761529d565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156152835761528361572a565b808201808211156152835761528361572a565b5f6106408284031215615775575f5ffd5b5f83601f840112615784575f5ffd5b505f80610640615793816152c7565b92508291508401858111156157a6575f5ffd5b845b818110156157c05780518452602093840193016157a8565b509095945050505050565b8351815260208085015190820152604080850151908201526107e081016157f560608301856154a6565b8251610160830152602083015161018083015f5b6032811015615828578251825260209283019290910190600101615809565b50505060408301516107c0830152949350505050565b5f5f6080838503121561584f575f5ffd5b615859848461564b565b6060939093015192949293505050565b6001600160a01b03841681526020810183905260a08101614e5060408301848051825260208082015190830152604090810151910152565b6001600160a01b0384168152602081018390526101408101614e5060408301846154a6565b634e487b7160e01b5f52601260045260245ffd5b5f826158e8576158e86158c6565b500690565b6101c081016158fc82866154a6565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152614e50565b5f610780828403121561594e575f5ffd5b5f83601f84011261595d575f5ffd5b505f80610780615793816152c7565b6020808252601e908201527f496e73756666696369656e74207061796d656e7420746f20657870616e640000604082015260600190565b5f602082840312156159b3575f5ffd5b815167ffffffffffffffff8111156159c9575f5ffd5b8201601f810184136159d9575f5ffd5b80516159e7615363826152f8565b8181528560208385010111156159fb575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b828152604060208201525f614e506040830184615466565b604081525f615a426040830185615466565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b80820281158282048414176152835761528361572a565b6001600160a01b03831681526107a08101615205602083018461524c565b604081525f615aac6040830185615466565b8281036020840152615abe8185615466565b95945050505050565b5f60208284031215615ad7575f5ffd5b8151615205816151d6565b5f82615af057615af06158c6565b50049056fea26469706673582212208128bd30507afdcb6d0cf48703936a76bf573ae9340eb3674259f63272316a3c64736f6c634300081c0033

Deployed Bytecode

0x608060405260043610610275575f3560e01c80636edb6aa01161014a578063b9f54f2c116100be578063e5ea43d411610078578063e5ea43d41461074b578063e9c634c91461077a578063eadfd89314610799578063f2fde38b146107b8578063f35dea5a146107d7578063feaa19bf146107ea575f5ffd5b8063b9f54f2c146106a4578063c2442589146106c3578063cf6621fc146106e2578063d82d7a0d14610701578063d9c17a1a14610717578063e1c361e214610736575f5ffd5b80637f51bb1f1161010f5780637f51bb1f146105b157806381069905146105d05780638197906e1461062a5780638da5cb5b1461065e57806396a33dc51461067a578063a46a6ab41461068e575f5ffd5b80636edb6aa01461052d578063715018a61461054c57806376e2fcd51461056057806377c846af1461057f5780637a44d04814610592575f5ffd5b80633ccfd60b116101ec57806361894434116101a6578063618944341461047c57806361d027b314610491578063635ab8a0146104b1578063647fed85146104c7578063681f3e6d146104f65780636ac5ef7014610517575f5ffd5b80633ccfd60b146103d657806348586b3d146103ea5780634af2fe6f146104095780635054cfe2146104285780635f76310c1461043d5780636070721614610469575f5ffd5b8063236a32c21161023d578063236a32c21461033557806324a22f481461035957806328d24d771461036f5780632fd4f060146103855780633149443c146103a457806336a94134146103c3575f5ffd5b80630549b27e1461027957806306f94913146102b55780630e13ae3b146102d65780631211759b146102f5578063194ace8a14610314575b5f5ffd5b348015610284575f5ffd5b50600254610298906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c0575f5ffd5b506102d46102cf3660046151ea565b610809565b005b3480156102e1575f5ffd5b506102d46102f036600461520c565b610880565b348015610300575f5ffd5b506102d461030f366004615235565b611932565b34801561031f575f5ffd5b50610328611940565b6040516102ac9190615274565b348015610340575f5ffd5b5061034b610faa5481565b6040519081526020016102ac565b348015610364575f5ffd5b5061034b610fa75481565b34801561037a575f5ffd5b5061034b610fad5481565b348015610390575f5ffd5b506102d461039f366004615235565b6119c6565b3480156103af575f5ffd5b506102d46103be366004615235565b6119d3565b6102d46103d136600461531f565b6119e1565b3480156103e1575f5ffd5b506102d4611d5d565b3480156103f5575f5ffd5b506102d4610404366004615399565b611deb565b348015610414575f5ffd5b50600354610298906001600160a01b031681565b348015610433575f5ffd5b5061034b60045481565b348015610448575f5ffd5b5061045c6104573660046153c9565b612042565b6040516102ac9190615454565b6102d4610477366004615235565b6122af565b348015610487575f5ffd5b5061034b60055481565b34801561049c575f5ffd5b50610faf54610298906001600160a01b031681565b3480156104bc575f5ffd5b5061034b610fac5481565b3480156104d2575f5ffd5b506104db61236a565b604080519384526020840192909252908201526060016102ac565b348015610501575f5ffd5b5061050a61249d565b6040516102ac9190615494565b348015610522575f5ffd5b5061034b610fab5481565b348015610538575f5ffd5b506102d4610547366004615235565b61258e565b348015610557575f5ffd5b506102d461259b565b34801561056b575f5ffd5b506102d461057a366004615235565b6125ae565b6102d461058d36600461531f565b6125bc565b34801561059d575f5ffd5b506102d46105ac366004615235565b612944565b3480156105bc575f5ffd5b506102d46105cb3660046151ea565b612951565b3480156105db575f5ffd5b506105ef6105ea366004615235565b6129d2565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102ac565b348015610635575f5ffd5b50610649610644366004615235565b612a1c565b604080519283526020830191909152016102ac565b348015610669575f5ffd5b505f546001600160a01b0316610298565b348015610685575f5ffd5b50610298612ac3565b348015610699575f5ffd5b5061034b610fa95481565b3480156106af575f5ffd5b506102d46106be3660046151ea565b612b4d565b3480156106ce575f5ffd5b506102d46106dd366004615235565b612bbf565b3480156106ed575f5ffd5b506104db6106fc366004615235565b612bcd565b34801561070c575f5ffd5b5061034b610fa85481565b348015610722575f5ffd5b506102d461073136600461520c565b612ce6565b348015610741575f5ffd5b5061034b60065481565b348015610756575f5ffd5b5061076a6107653660046153c9565b613c1d565b6040516102ac9493929190615530565b348015610785575f5ffd5b506102d4610794366004615235565b61417d565b3480156107a4575f5ffd5b506102d46107b3366004615235565b61418b565b3480156107c3575f5ffd5b506102d46107d23660046151ea565b614199565b6102d46107e53660046155cd565b61420f565b3480156107f5575f5ffd5b506102d4610804366004615235565b614ae5565b610811614af3565b6001600160a01b03811661085e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b333b156108cf5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b6108d7614b4c565b5f6108e0612ac3565b600254604051631add0e8b60e21b81526001600160a01b0380841660048301529293505f9290911690636b743a2c90602401602060405180830381865afa15801561092d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095191906155ed565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906109889086908890600401615604565b602060405180830381865afa1580156109a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c791906155ed565b90505f81116109e85760405162461bcd60e51b81526004016108559061561d565b6018851115610a2c5760405162461bcd60e51b815260206004820152601060248201526f57726f6e6720547261696e207479706560801b6044820152606401610855565b610a346150c5565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90610a669087908b90600401615604565b606060405180830381865afa158015610a81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa591906156a2565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90610ad99087908b90600401615604565b61010060405180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1991906156bc565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190610b509087908b90600401615604565b606060405180830381865afa158015610b6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8f91906156a2565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90610bc99087908b90600401615604565b61010060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0991906156bc565b60608201525f42610c1986614ba5565b8251515f03610c575760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b875f03610c9c57612a309150610c78836020015184606001515f60aa614c44565b602084018190526060840151610c92919060016064614c44565b6020840152611080565b87600103610cd957612a309150610cbf83602001518460600151600160aa614c44565b602084018190526060840151610c92919060036064614c44565b87600203610d1657612a309150610cfc83602001518460600151600260aa614c44565b602084018190526060840151610c92919060046064614c44565b87600303610d5257612a309150610d3983602001518460600151600360aa614c44565b602084018190526060840151610c9291905f6064614c44565b87600403610d8f57612a309150610d7583602001518460600151600460aa614c44565b602084018190526060840151610c92919060026064614c44565b87600503610db2576154609150610c78836020015184606001515f610137614c44565b87600603610dd6576154609150610cbf836020015184606001516001610137614c44565b87600703610dfa576154609150610cfc836020015184606001516002610137614c44565b87600803610e1e576154609150610d39836020015184606001516003610137614c44565b87600903610e42576154609150610d75836020015184606001516004610137614c44565b87600a03610e655761a8c09150610c78836020015184606001515f61020d614c44565b87600b03610e895761a8c09150610cbf83602001518460600151600161020d614c44565b87600c03610ead5761a8c09150610cfc83602001518460600151600261020d614c44565b87600d03610ed15761a8c09150610d3983602001518460600151600361020d614c44565b87600e03610ef55761a8c09150610d7583602001518460600151600461020d614c44565b87600f03610f185761fd209150610c78836020015184606001515f6102a1614c44565b87601003610f3c5761fd209150610cbf8360200151846060015160016102a1614c44565b87601103610f605761fd209150610cfc8360200151846060015160026102a1614c44565b87601203610f845761fd209150610d398360200151846060015160036102a1614c44565b87601303610fa85761fd209150610d758360200151846060015160046102a1614c44565b87601403610fcc57620151809150610c78836020015184606001515f610307614c44565b87601503610ff157620151809150610cbf836020015184606001516001610307614c44565b8760160361101657620151809150610cfc836020015184606001516002610307614c44565b8760170361103b57620151809150610d39836020015184606001516003610307614c44565b8760180361108057620151809150611060836020015184606001516004610307614c44565b60208401819052606084015161107a919060026064614c44565b60208401525b5f83604001516020015182611095919061573e565b9050828110156110dd5760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b41039ba30b6b4b7309760691b6044820152606401610855565b610faa548111156110ee5750610faa545b6110f8838261573e565b9050611104818361573e565b60408501805160200191909152518051849190611122908390615751565b90525061112f8387615751565b845160400151909650600114801561114e5750610fac54604085015151115b80611170575083516040015160021480156111705750610fad54604085015151115b156117af5761117d615136565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156111c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ed9190615764565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354875192880151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926112799290919087906004016157cb565b608060405180830381865afa158015611294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b8919061583e565b875f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e895f01516040518463ffffffff1660e01b815260040161130a93929190615869565b5f604051808303815f87803b158015611321575f5ffd5b505af1158015611333573d5f5f3e3d5ffd5b50505050604051806060016040528087604001515f01518152602001610fa7548661135e919061573e565b8152602001610fa854866113729190615751565b815250866040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e89604001516040518463ffffffff1660e01b81526004016113c593929190615869565b5f604051808303815f87803b1580156113dc575f5ffd5b505af11580156113ee573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01515f01516040518263ffffffff1660e01b815260040161145f91815260200190565b61010060405180830381865afa15801561147b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149f91906156bc565b6040518463ffffffff1660e01b81526004016114bd939291906158a1565b5f604051808303815f87803b1580156114d4575f5ffd5b505af11580156114e6573d5f5f3e3d5ffd5b50505050611500866020015187606001515f61012c614c44565b60208701819052606087015161151b9190600161012c614c44565b6020870181905260608701516115369190600261012c614c44565b6020870181905260608701516115519190600361012c614c44565b60208701819052606087015161156c9190600461012c614c44565b60208701528551604001516002036115d7578551805160019190611591908390615751565b90525085515161271010156115be578551516115b0906127119061573e565b602087015160c001526115d7565b8551516115cd9060019061573e565b602087015160c001525b85516040015160030361163d5785518051600191906115f7908390615751565b905250855151612710101561162457855151611616906127119061573e565b602087015160e0015261163d565b8551516116339060019061573e565b602087015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e89602001516040518463ffffffff1660e01b8152600401611685939291906158a1565b5f604051808303815f87803b15801561169c575f5ffd5b505af11580156116ae573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156116fc573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172091906155ed565b875151909150612710906117369060019061573e565b61174091906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae9061177a908d908590600401615604565b5f604051808303815f87803b158015611791575f5ffd5b505af11580156117a3573d5f5f3e3d5ffd5b50505050505050611878565b600254602085015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b916117e6918b918f916004016158a1565b5f604051808303815f87803b1580156117fd575f5ffd5b505af115801561180f573d5f5f3e3d5ffd5b5050600254604080880151905163108b074f60e31b81526001600160a01b0390921693506384583a78925061184a918b918f91600401615869565b5f604051808303815f87803b158015611861575f5ffd5b505af1158015611873573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad906118aa908a908a90600401615604565b5f604051808303815f87803b1580156118c1575f5ffd5b505af11580156118d3573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8460200151855f01518660400151604051611915939291906158ed565b60405180910390a15050505050505061192d60018055565b505050565b61193a614af3565b610fab55565b61194861515b565b5f611951612ac3565b600254604051633d52077560e01b81526001600160a01b038084166004830152929350911690633d5207759060240161078060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c0919061593d565b91505090565b6119ce614af3565b600555565b6119db614af3565b610fac55565b6119e9614b4c565b610fb0543414611a0b5760405162461bcd60e51b81526004016108559061596c565b611a1481614e58565b611a535760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420757365726e616d6560801b6044820152606401610855565b5f611a5c612ac3565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc91906155ed565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015611b13573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b3a91908101906159a3565b5115611b945760405162461bcd60e51b8152602060048201526024808201527f506c6179657220616c72656164792068617320612072656769737465726564206044820152636e616d6560e01b6064820152608401610855565b60025460405163589d1b5560e11b81526001600160a01b039091169063b13a36aa90611bc4908690600401615494565b602060405180830381865afa158015611bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0391906155ed565b15611c505760405162461bcd60e51b815260206004820152601760248201527f557365726e616d6520616c7265616479206578697374730000000000000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf90611c829084908790600401615a18565b5f604051808303815f87803b158015611c99575f5ffd5b505af1158015611cab573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b9150611ce19086908590600401615a30565b5f604051808303815f87803b158015611cf8575f5ffd5b505af1158015611d0a573d5f5f3e3d5ffd5b50505050336001600160a01b03167fe04d23b73ae3d3b27074da9719b5a4cd521395aaf86bfe7e374933ecb567731a84604051611d479190615494565b60405180910390a25050611d5a60018055565b50565b611d65614af3565b5f4711611db45760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f00000000000000006044820152606401610855565b610faf546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611d5a573d5f5f3e3d5ffd5b611df3614b4c565b5f611dfc612ac3565b600254604051633d52077560e01b81526001600160a01b0380841660048301529293505f9290911690633d5207759060240161078060405180830381865afa158015611e4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6e919061593d565b905060148410611ed25760405162461bcd60e51b815260206004820152602960248201527f5465616d203020746f203139206973206f6e6c7920617661696c61626c65207260448201526834b3b43a103737bb9760b91b6064820152608401610855565b8235602084013514801590611eec57508235604084013514155b8015611f0057506020830135604084013514155b611f4c5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420686176652073616d6520736c6f74206f6e2061207465616d006044820152606401610855565b823581611f5a866003615a65565b603c8110611f6a57611f6a615a51565b6020020152826001602002013581611f83866003615a65565b611f8e906001615751565b603c8110611f9e57611f9e615a51565b6020020152604083013581611fb4866003615a65565b611fbf906002615751565b603c8110611fcf57611fcf615a51565b602002015260025460405163ad9bc5fd60e01b81526001600160a01b039091169063ad9bc5fd906120069085908590600401615a7c565b5f604051808303815f87803b15801561201d575f5ffd5b505af115801561202f573d5f5f3e3d5ffd5b50505050505061203e60018055565b5050565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060925f9291169063a4c8ec3490602401602060405180830381865afa15801561208e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b291906155ed565b90508284111561211b5760405162461bcd60e51b815260206004820152602e60248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206e6565647360448201526d0203c3d205f736c6f745f73746f760941b6064820152608401610855565b8083106121785760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420696e7075743a205f736c6f745f73746f70203e20736c6f74604482015264131a5b5a5d60da1b6064820152608401610855565b5f612183858561573e565b61218e906001615751565b90508067ffffffffffffffff8111156121a9576121a9615289565b6040519080825280602002602001820160405280156121fb57816020015b6121e860405180606001604052805f81526020015f81526020015f81525090565b8152602001906001900390816121c75790505b5092505f5b818110156122a5576002546001600160a01b03166388e6c74d88612224848a615751565b6040518363ffffffff1660e01b8152600401612241929190615604565b606060405180830381865afa15801561225c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228091906156a2565b84828151811061229257612292615a51565b6020908102919091010152600101612200565b5050509392505050565b6122b7614b4c565b5f6122c0612ac3565b90505f5f6122cd84612a1c565b915091508034146122f05760405162461bcd60e51b81526004016108559061596c565b6002546001600160a01b031663ebd6180c8461230c8786615751565b6040518363ffffffff1660e01b8152600401612329929190615604565b5f604051808303815f87803b158015612340575f5ffd5b505af1158015612352573d5f5f3e3d5ffd5b5050505061235e614f70565b505050611d5a60018055565b5f5f5f5f612376612ac3565b60025460405163aa31497760e01b81526001600160a01b0380841660048301529293505f929091169063aa31497790602401602060405180830381865afa1580156123c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e791906155ed565b6123f1904261573e565b9050620151808110612408575f94505f9350612496565b60025460405163f9c0109b60e01b81526001600160a01b0384811660048301529091169063f9c0109b90602401602060405180830381865afa158015612450573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247491906155ed565b9450612483816201518061573e565b9350846004546124939190615a65565b92505b5050909192565b60605f6124a8612ac3565b600254604051630bc7d91360e31b81526001600160a01b0380841660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156124f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251991906155ed565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015612560573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261258791908101906159a3565b9250505090565b612596614af3565b600655565b6125a3614af3565b6125ac5f615076565b565b6125b6614af3565b610faa55565b6125c4614b4c565b610fb05434146125e65760405162461bcd60e51b81526004016108559061596c565b6125ef81614e58565b6126325760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206e657720757365726e616d6560601b6044820152606401610855565b5f61263b612ac3565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015612687573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ab91906155ed565b6002546040516351a2c27760e01b8152600481018390529192505f916001600160a01b03909116906351a2c277906024015f60405180830381865afa1580156126f6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261271d91908101906159a3565b60025460405163589d1b5560e11b81529192506001600160a01b03169063b13a36aa9061274e908790600401615494565b602060405180830381865afa158015612769573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278d91906155ed565b156127da5760405162461bcd60e51b815260206004820152601b60248201527f4e657720757365726e616d6520616c72656164792065786973747300000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf9061280c9085908890600401615a18565b5f604051808303815f87803b158015612823575f5ffd5b505af1158015612835573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b915061286b9087908690600401615a30565b5f604051808303815f87803b158015612882575f5ffd5b505af1158015612894573d5f5f3e3d5ffd5b5050600254604051632e9cdc6d60e21b81526001600160a01b03909116925063ba7371b491506128c8908490600401615494565b5f604051808303815f87803b1580156128df575f5ffd5b505af11580156128f1573d5f5f3e3d5ffd5b50505050336001600160a01b03167f10022a11494e4dcaccdda542dc8a420f8a1c3397f37d5bd035a805e79e1a32ee8286604051612930929190615a9a565b60405180910390a2505050611d5a60018055565b61294c614af3565b600455565b612959614af3565b6001600160a01b0381166129af5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207472656173757279206164647265737300000000000000006044820152606401610855565b610faf80546001600160a01b0319166001600160a01b0392909216919091179055565b6007816101f481106129e2575f80fd5b6008020180546001820154600283015460038401546004850154600586015460068701546007909701549597509395929491939092909188565b5f5f5f612a27612ac3565b6002546040516329323b0d60e21b81526001600160a01b03808416600483015292935091169063a4c8ec3490602401602060405180830381865afa158015612a71573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9591906155ed565b92506101f3612aa48486615751565b10612aad575f5ffd5b83600554612abb9190615a65565b915050915091565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015612b0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b319190615ac7565b90506001600160a01b038116612b48573391505090565b919050565b612b55614af3565b6001600160a01b038116612b9d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610855565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b612bc7614af3565b610fa855565b5f5f5f5f612bd9612ac3565b60025460405163fd45e19160e01b81529192505f916001600160a01b039091169063fd45e19190612c109085908a90600401615604565b606060405180830381865afa158015612c2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4f91906156a2565b8051610faa546020830151919750919250429190612c6d908361573e565b1115612c7e57610faa549450612c90565b6020820151612c8d908261573e565b94505b8082604001511015612ca4575f9350612cdc565b610fab54818360400151612cb8919061573e565b1015612cd557808260400151612cce919061573e565b9350612cdc565b610fab5493505b5050509193909250565b333b15612d355760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b612d3d614b4c565b5f612d46612ac3565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e79890612d7d9085908790600401615604565b602060405180830381865afa158015612d98573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dbc91906155ed565b90505f8111612ddd5760405162461bcd60e51b81526004016108559061561d565b600a841115612e205760405162461bcd60e51b815260206004820152600f60248201526e57726f6e6720466f6f64207479706560881b6044820152606401610855565b612e286150c5565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90612e5a9086908a90600401615604565b606060405180830381865afa158015612e75573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e9991906156a2565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90612ecd9086908a90600401615604565b61010060405180830381865afa158015612ee9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0d91906156bc565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190612f449086908a90600401615604565b606060405180830381865afa158015612f5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f8391906156a2565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90612fbd9086908a90600401615604565b61010060405180830381865afa158015612fd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ffd91906156bc565b6060820152600254604051631add0e8b60e21b81526001600160a01b0385811660048301525f921690636b743a2c90602401602060405180830381865afa15801561304a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306e91906155ed565b90505f804261307c87614ba5565b8451515f036130ba5760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b885f036130cb576154609250613180565b886001036130dd5761a8c09250613180565b886002036130ef57618ca09250613180565b8860030361310157618ca09250613180565b8860040361311357619ab09250613180565b8860050361312557619ab09250613180565b8860060361313857620151809250613180565b8860070361314b57620151809250613180565b8860080361315e57620151809250613180565b8860090361317157620151809250613180565b88600a03613180576201518092505b8085604001516040015110156131ce576040850151516131a1908490615751565b6040860151526131b18385615751565b93506131bd8382615751565b6040808701510152600a91506132b9565b610fab5483828760400151604001516131e7919061573e565b6131f19190615751565b1115613275575f8186604001516040015161320c919061573e565b610fab5461321a919061573e565b60408701515190915061322e908290615751565b60408701515261323e8186615751565b94508361324c82600a615a65565b6132569190615ae2565b9250610fab54826132679190615751565b6040808801510152506132b9565b604085015151613286908490615751565b6040860151526132968385615751565b9350828560400151604001516132ac9190615751565b6040808701510152600a91505b881561343a57886001036132f1576132e7856020015186606001515f85600a6132e29190615a65565b614c44565b602086015261343a565b88600203613315576132e78560200151866060015160018560056132e29190615a65565b88600303613339576132e78560200151866060015160028560056132e29190615a65565b8860040361335d576132e78560200151866060015160038560056132e29190615a65565b88600503613381576132e78560200151866060015160048560056132e29190615a65565b886006036133a4576132e7856020015186606001515f8560136132e29190615a65565b886007036133c8576132e785602001518660600151600185600b6132e29190615a65565b886008036133ec576132e785602001518660600151600285600b6132e29190615a65565b88600903613410576132e785602001518660600151600385600b6132e29190615a65565b88600a0361343a5761343485602001518660600151600485600b6132e29190615a65565b60208601525b84516040015160011480156134565750610fac54604086015151115b80613478575084516040015160021480156134785750610fad54604086015151115b15613ab757613485615136565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156134d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f59190615764565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354885192890151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926135819290919087906004016157cb565b608060405180830381865afa15801561359c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c0919061583e565b885f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e8a5f01516040518463ffffffff1660e01b815260040161361293929190615869565b5f604051808303815f87803b158015613629575f5ffd5b505af115801561363b573d5f5f3e3d5ffd5b50505050604051806060016040528088604001515f01518152602001610fa75485613666919061573e565b8152602001610fa8548561367a9190615751565b815250876040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e8a604001516040518463ffffffff1660e01b81526004016136cd93929190615869565b5f604051808303815f87803b1580156136e4575f5ffd5b505af11580156136f6573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8c5f01515f01516040518263ffffffff1660e01b815260040161376791815260200190565b61010060405180830381865afa158015613783573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137a791906156bc565b6040518463ffffffff1660e01b81526004016137c5939291906158a1565b5f604051808303815f87803b1580156137dc575f5ffd5b505af11580156137ee573d5f5f3e3d5ffd5b50505050613808876020015188606001515f61012c614c44565b6020880181905260608801516138239190600161012c614c44565b60208801819052606088015161383e9190600261012c614c44565b6020880181905260608801516138599190600361012c614c44565b6020880181905260608801516138749190600461012c614c44565b60208801528651604001516002036138df578651805160019190613899908390615751565b90525086515161271010156138c6578651516138b8906127119061573e565b602088015160c001526138df565b8651516138d59060019061573e565b602088015160c001525b8651604001516003036139455786518051600191906138ff908390615751565b905250865151612710101561392c5786515161391e906127119061573e565b602088015160e00152613945565b86515161393b9060019061573e565b602088015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e8a602001516040518463ffffffff1660e01b815260040161398d939291906158a1565b5f604051808303815f87803b1580156139a4575f5ffd5b505af11580156139b6573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa158015613a04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a2891906155ed565b88515190915061271090613a3e9060019061573e565b613a4891906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90613a82908d908590600401615604565b5f604051808303815f87803b158015613a99575f5ffd5b505af1158015613aab573d5f5f3e3d5ffd5b50505050505050613b80565b600254602086015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b91613aee918b918f916004016158a1565b5f604051808303815f87803b158015613b05575f5ffd5b505af1158015613b17573d5f5f3e3d5ffd5b5050600254604080890151905163108b074f60e31b81526001600160a01b0390921693506384583a789250613b52918b918f91600401615869565b5f604051808303815f87803b158015613b69575f5ffd5b505af1158015613b7b573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad90613bb2908a908890600401615604565b5f604051808303815f87803b158015613bc9575f5ffd5b505af1158015613bdb573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8560200151865f01518760400151604051611915939291906158ed565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060928392839283925f9291169063a4c8ec3490602401602060405180830381865afa158015613c6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c9391906155ed565b905085871115613d175760405162461bcd60e51b815260206004820152604360248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206d7573742060448201527f6265206c657373207468616e206f7220657175616c20746f205f736c6f745f736064820152620746f760ec1b608482015260a401610855565b808610613d7a5760405162461bcd60e51b815260206004820152602b60248201527f496e76616c696420696e7075743a205f736c6f745f73746f702065786365656460448201526a1cc81cdb1bdd131a5b5a5d60aa1b6064820152608401610855565b5f613d85888861573e565b613d90906001615751565b90508067ffffffffffffffff811115613dab57613dab615289565b604051908082528060200260200182016040528015613dfd57816020015b613dea60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613dc95790505b5095508067ffffffffffffffff811115613e1957613e19615289565b604051908082528060200260200182016040528015613e5257816020015b613e3f61517a565b815260200190600190039081613e375790505b5094508067ffffffffffffffff811115613e6e57613e6e615289565b604051908082528060200260200182016040528015613ea757816020015b613e9461517a565b815260200190600190039081613e8c5790505b5093508067ffffffffffffffff811115613ec357613ec3615289565b604051908082528060200260200182016040528015613f1557816020015b613f0260405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613ee15790505b5092505f5b81811015614171575f613f2d828b615751565b6002546040516388e6c74d60e01b81529192506001600160a01b0316906388e6c74d90613f60908e908590600401615604565b606060405180830381865afa158015613f7b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f9f91906156a2565b888381518110613fb157613fb1615a51565b6020908102919091010152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90613fee908e908590600401615604565b61010060405180830381865afa15801561400a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402e91906156bc565b87838151811061404057614040615a51565b60209081029190910101526002546040516308ff748760e11b81526001600160a01b03909116906311fee90e9061407d908e908590600401615604565b61010060405180830381865afa158015614099573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140bd91906156bc565b8683815181106140cf576140cf615a51565b602090810291909101015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e1919061410c908e908590600401615604565b606060405180830381865afa158015614127573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061414b91906156a2565b85838151811061415d5761415d615a51565b602090810291909101015250600101613f1a565b50505093509350935093565b614185614af3565b610fa955565b614193614af3565b610fa755565b6141a1614af3565b6001600160a01b0381166142065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610855565b611d5a81615076565b614217614b4c565b5f614220612ac3565b6002546040516329323b0d60e21b81526001600160a01b0380841660048301529293505f929091169063a4c8ec3490602401602060405180830381865afa15801561426d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061429191906155ed565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906142c89086908890600401615604565b602060405180830381865afa1580156142e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061430791906155ed565b6002546040516388e6c74d60e01b815291925042915f916001600160a01b0316906388e6c74d9061433e9088908b90600401615604565b606060405180830381865afa158015614359573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061437d91906156a2565b905061438885614ba5565b835f036143f357600254604051633af5860360e21b8152600595506001600160a01b039091169063ebd6180c906143c59088908890600401615604565b5f604051808303815f87803b1580156143dc575f5ffd5b505af11580156143ee573d5f5f3e3d5ffd5b505050505b8387106144425760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e0000000000006044820152606401610855565b8051156144915760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e00000000000000006044820152606401610855565b5f83116144b05760405162461bcd60e51b81526004016108559061561d565b5f5f5f6144bb61236a565b925092509250815f0361458a5760025460405163356ba38360e11b81526001600160a01b0390911690636ad74706906144fb908b90600190600401615604565b5f604051808303815f87803b158015614512575f5ffd5b505af1158015614524573d5f5f3e3d5ffd5b5050600254604051625f880760e01b81526001600160a01b039091169250625f88079150614558908b904290600401615604565b5f604051808303815f87803b15801561456f575f5ffd5b505af1158015614581573d5f5f3e3d5ffd5b5050505061464d565b8034146145e55760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74207061796d656e7420746f206f70656e20746865604482015263040c4def60e31b6064820152608401610855565b6002546001600160a01b0316636ad7470689614602866001615751565b6040518363ffffffff1660e01b815260040161461f929190615604565b5f604051808303815f87803b158015614636575f5ffd5b505af1158015614648573d5f5f3e3d5ffd5b505050505b60408051610100810182526103e8815260646020820181905260328284015260608083018290526080830182905260a083018a90525f60c0840181905260e0840152835190810193849052600354634fa9782d60e01b9094529081018c9052909181906001600160a01b0316634fa9782d60848301602060405180830381865afa1580156146dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061470191906155ed565b81526020016147118c6001615751565b8152602001600181525094505f60405180606001604052805f8152602001610fa7548961473e919061573e565b8152602001610fa854896147529190615751565b815250905060025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8b8e856040518463ffffffff1660e01b815260040161479b939291906158a1565b5f604051808303815f87803b1580156147b2575f5ffd5b505af11580156147c4573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8b8e896040518463ffffffff1660e01b815260040161480c93929190615869565b5f604051808303815f87803b158015614823575f5ffd5b505af1158015614835573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788b8e846040518463ffffffff1660e01b815260040161487d93929190615869565b5f604051808303815f87803b158015614894575f5ffd5b505af11580156148a6573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18b8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01516040518263ffffffff1660e01b815260040161491491815260200190565b61010060405180830381865afa158015614930573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061495491906156bc565b6040518463ffffffff1660e01b8152600401614972939291906158a1565b5f604051808303815f87803b158015614989575f5ffd5b505af115801561499b573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038e811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156149e9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0d91906155ed565b8751909150614a1f90612710906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90614a59908e908590600401615604565b5f604051808303815f87803b158015614a70575f5ffd5b505af1158015614a82573d5f5f3e3d5ffd5b505050505f341115614a9657614a96614f70565b7fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd838884604051614ac9939291906158ed565b60405180910390a1505050505050505050505061203e60018055565b614aed614af3565b610fad55565b5f546001600160a01b031633146125ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b600260015403614b9e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002600155565b610fa9546001600160a01b0382165f908152610fae6020526040902054614bcc904261573e565b1015614c285760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b6064820152608401610855565b6001600160a01b03165f908152610fae60205260409020429055565b614c4c61517a565b849050825f03614ca457845184511115614c9b57845184516103e8918491614c74919061573e565b614c7e9190615a65565b614c889190615ae2565b8551614c949190615751565b8152614e50565b83518552614e50565b82600103614d1057846020015184602001511115614d01576103e88286602001518660200151614cd4919061573e565b614cde9190615a65565b614ce89190615ae2565b8560200151614cf79190615751565b6020820152614e50565b60208085015190860152614e50565b82600203614d7c57846040015184604001511115614d6d576103e88286604001518660400151614d40919061573e565b614d4a9190615a65565b614d549190615ae2565b8560400151614d639190615751565b6040820152614e50565b60408085015190860152614e50565b82600303614de857846060015184606001511115614dd9576103e88286606001518660600151614dac919061573e565b614db69190615a65565b614dc09190615ae2565b8560600151614dcf9190615751565b6060820152614e50565b60608085015190860152614e50565b82600403614e5057846080015184608001511115614e45576103e88286608001518660800151614e18919061573e565b614e229190615a65565b614e2c9190615ae2565b8560800151614e3b9190615751565b6080820152614e50565b608080850151908601525b949350505050565b80515f9082901580614e6b5750600f8151115b15614e7857505f92915050565b5f5b8151811015614f66575f828281518110614e9657614e96615a51565b01602001516001600160f81b0319169050600360fc1b8110801590614ec95750603960f81b6001600160c01b0319821611155b158015614ee45750605f60f81b6001600160c01b0319821614155b8015614f195750604160f81b6001600160c01b0319821610801590614f175750602d60f91b6001600160c01b0319821611155b155b8015614f4e5750606160f81b6001600160c01b0319821610801590614f4c5750603d60f91b6001600160c01b0319821611155b155b15614f5d57505f949350505050565b50600101614e7a565b5060019392505050565b610faf546001600160a01b0316614fc95760405162461bcd60e51b815260206004820152601860248201527f54726561737572792061646472657373206e6f742073657400000000000000006044820152606401610855565b610faf546040515f916001600160a01b03169034908381818185875af1925050503d805f8114615014576040519150601f19603f3d011682016040523d82523d5f602084013e615019565b606091505b5050905080611d5a5760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f20666f727761726420457468657220746f20747265617360448201526275727960e81b6064820152608401610855565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405180608001604052806150f160405180606001604052805f81526020015f81526020015f81525090565b81526020016150fe61517a565b815260200161512460405180606001604052805f81526020015f81526020015f81525090565b815260200161513161517a565b905290565b60405180606001604052805f815260200161514f6151b7565b81526020015f81525090565b604051806107800160405280603c906020820280368337509192915050565b6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b0381168114611d5a575f5ffd5b5f602082840312156151fa575f5ffd5b8135615205816151d6565b9392505050565b5f5f5f6060848603121561521e575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215615245575f5ffd5b5035919050565b805f5b603c81101561526e57815184526020938401939091019060010161524f565b50505050565b6107808101615283828461524c565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156152c1576152c1615289565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156152f0576152f0615289565b604052919050565b5f67ffffffffffffffff82111561531157615311615289565b50601f01601f191660200190565b5f6020828403121561532f575f5ffd5b813567ffffffffffffffff811115615345575f5ffd5b8201601f81018413615355575f5ffd5b8035615368615363826152f8565b6152c7565b81815285602083850101111561537c575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f608083850312156153aa575f5ffd5b82359150608083018410156153bd575f5ffd5b50926020919091019150565b5f5f5f606084860312156153db575f5ffd5b83356153e6816151d6565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561544a576154348683518051825260208082015190830152604090810151910152565b606095909501946020919091019060010161540d565b5093949350505050565b602081525f61520560208301846153fb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6152056020830184615466565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b5f8151808452602084019350602083015f5b8281101561544a576155198683516154a6565b610100959095019460209190910190600101615506565b608081525f61554260808301876153fb565b828103602084015261555481876154f4565b9050828103604084015261556881866154f4565b8381036060850152845180825260208087019350909101905f5b818110156155bf576155a98385518051825260208082015190830152604090810151910152565b6020939093019260609290920191600101615582565b509098975050505050505050565b5f5f604083850312156155de575f5ffd5b50508035926020909101359150565b5f602082840312156155fd575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601490820152732237b713ba103430bb32903a34329033b2b7329760611b604082015260600190565b5f6060828403121561565b575f5ffd5b6040516060810167ffffffffffffffff8111828210171561567e5761567e615289565b60409081528351825260208085015190830152928301519281019290925250919050565b5f606082840312156156b2575f5ffd5b615205838361564b565b5f6101008284031280156156ce575f5ffd5b506156d761529d565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156152835761528361572a565b808201808211156152835761528361572a565b5f6106408284031215615775575f5ffd5b5f83601f840112615784575f5ffd5b505f80610640615793816152c7565b92508291508401858111156157a6575f5ffd5b845b818110156157c05780518452602093840193016157a8565b509095945050505050565b8351815260208085015190820152604080850151908201526107e081016157f560608301856154a6565b8251610160830152602083015161018083015f5b6032811015615828578251825260209283019290910190600101615809565b50505060408301516107c0830152949350505050565b5f5f6080838503121561584f575f5ffd5b615859848461564b565b6060939093015192949293505050565b6001600160a01b03841681526020810183905260a08101614e5060408301848051825260208082015190830152604090810151910152565b6001600160a01b0384168152602081018390526101408101614e5060408301846154a6565b634e487b7160e01b5f52601260045260245ffd5b5f826158e8576158e86158c6565b500690565b6101c081016158fc82866154a6565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152614e50565b5f610780828403121561594e575f5ffd5b5f83601f84011261595d575f5ffd5b505f80610780615793816152c7565b6020808252601e908201527f496e73756666696369656e74207061796d656e7420746f20657870616e640000604082015260600190565b5f602082840312156159b3575f5ffd5b815167ffffffffffffffff8111156159c9575f5ffd5b8201601f810184136159d9575f5ffd5b80516159e7615363826152f8565b8181528560208385010111156159fb575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b828152604060208201525f614e506040830184615466565b604081525f615a426040830185615466565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b80820281158282048414176152835761528361572a565b6001600160a01b03831681526107a08101615205602083018461524c565b604081525f615aac6040830185615466565b8281036020840152615abe8185615466565b95945050505050565b5f60208284031215615ad7575f5ffd5b8151615205816151d6565b5f82615af057615af06158c6565b50049056fea26469706673582212208128bd30507afdcb6d0cf48703936a76bf573ae9340eb3674259f63272316a3c64736f6c634300081c0033

Deployed Bytecode Sourcemap

28215:45282:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28283:37;;;;;;;;;;-1:-1:-1;28283:37:0;;;;-1:-1:-1;;;;;28283:37:0;;;;;;-1:-1:-1;;;;;201:32:1;;;183:51;;171:2;156:18;28283:37:0;;;;;;;;31871:230;;;;;;;;;;-1:-1:-1;31871:230:0;;;;;:::i;:::-;;:::i;:::-;;54578:11631;;;;;;;;;;-1:-1:-1;54578:11631:0;;;;;:::i;:::-;;:::i;33243:101::-;;;;;;;;;;-1:-1:-1;33243:101:0;;;;;:::i;:::-;;:::i;70814:217::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29837:38::-;;;;;;;;;;;;;;;;;;;2039:25:1;;;2027:2;2012:18;29837:38:0;1893:177:1;29549:42:0;;;;;;;;;;;;;;;;30349:43;;;;;;;;;;;;;;;;32534:110;;;;;;;;;;-1:-1:-1;32534:110:0;;;;;:::i;:::-;;:::i;33350:114::-;;;;;;;;;;-1:-1:-1;33350:114:0;;;;;:::i;:::-;;:::i;66683:1228::-;;;;;;:::i;:::-;;:::i;32107:255::-;;;;;;;;;;;;;:::i;70182:626::-;;;;;;;;;;-1:-1:-1;70182:626:0;;;;;:::i;:::-;;:::i;28327:37::-;;;;;;;;;;-1:-1:-1;28327:37:0;;;;-1:-1:-1;;;;;28327:37:0;;;29132;;;;;;;;;;;;;;;;71460:645;;;;;;;;;;-1:-1:-1;71460:645:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42452:604::-;;;;;;:::i;:::-;;:::i;29275:38::-;;;;;;;;;;;;;;;;31389:36;;;;;;;;;;-1:-1:-1;31389:36:0;;;;-1:-1:-1;;;;;31389:36:0;;;30035:42;;;;;;;;;;;;;;;;34860:756;;;;;;;;;;;;;:::i;:::-;;;;6122:25:1;;;6178:2;6163:18;;6156:34;;;;6206:18;;;6199:34;6110:2;6095:18;34860:756:0;5920:319:1;69804:261:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29924:37::-;;;;;;;;;;;;;;;;32650:112;;;;;;;;;;-1:-1:-1;32650:112:0;;;;;:::i;:::-;;:::i;2788:103::-;;;;;;;;;;;;;:::i;33134:::-;;;;;;;;;;-1:-1:-1;33134:103:0;;;;;:::i;:::-;;:::i;67966:1101::-;;;;;;:::i;:::-;;:::i;32420:108::-;;;;;;;;;;-1:-1:-1;32420:108:0;;;;;:::i;:::-;;:::i;31444:181::-;;;;;;;;;;-1:-1:-1;31444:181:0;;;;;:::i;:::-;;:::i;29512:30::-;;;;;;;;;;-1:-1:-1;29512: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;29512:30:0;6763:679:1;35791:431:0;;;;;;;;;;-1:-1:-1;35791:431:0;;;;;:::i;:::-;;:::i;:::-;;;;7621:25:1;;;7677:2;7662:18;;7655:34;;;;7594:18;35791:431:0;7447:248:1;2140:87:0;;;;;;;;;;-1:-1:-1;2186:7:0;2213:6;-1:-1:-1;;;;;2213:6:0;2140:87;;34171:429;;;;;;;;;;;;;:::i;29693:43::-;;;;;;;;;;;;;;;;31631:234;;;;;;;;;;-1:-1:-1;31631:234:0;;;;;:::i;:::-;;:::i;32888:118::-;;;;;;;;;;-1:-1:-1;32888:118:0;;;;;:::i;:::-;;:::i;36228:780::-;;;;;;;;;;-1:-1:-1;36228:780:0;;;;;:::i;:::-;;:::i;29616:43::-;;;;;;;;;;;;;;;;45058:9384;;;;;;;;;;-1:-1:-1;45058:9384:0;;;;;:::i;:::-;;:::i;29373:41::-;;;;;;;;;;;;;;;;72251:1233;;;;;;;;;;-1:-1:-1;72251:1233:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;33012:116::-;;;;;;;;;;-1:-1:-1;33012:116:0;;;;;:::i;:::-;;:::i;32768:114::-;;;;;;;;;;-1:-1:-1;32768:114:0;;;;;:::i;:::-;;:::i;3046:201::-;;;;;;;;;;-1:-1:-1;3046:201:0;;;;;:::i;:::-;;:::i;37898:4425::-;;;;;;:::i;:::-;;:::i;33470:116::-;;;;;;;;;;-1:-1:-1;33470:116:0;;;;;:::i;:::-;;:::i;31871:230::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;31974:34:0;::::1;31966:62;;;::::0;-1:-1:-1;;;31966:62:0;;10588:2:1;31966: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;;31966:62:0::1;;;;;;;;;32039:11;:54:::0;;-1:-1:-1;;;;;;32039:54:0::1;-1:-1:-1::0;;;;;32039:54:0;;;::::1;::::0;;;::::1;::::0;;31871:230::o;54578:11631::-;37064:10;37700:18;37746:8;37044:63;;;;-1:-1:-1;;;37044:63:0;;10932:2:1;37044:63:0;;;10914:21:1;10971:2;10951:18;;;10944:30;11010:29;10990:18;;;10983:57;11057:18;;37044:63:0;10730:351:1;37044:63:0;9192:21:::1;:19;:21::i;:::-;54683::::2;54707:25;:23;:25::i;:::-;54755:15;::::0;:44:::2;::::0;-1:-1:-1;;;54755:44:0;;-1:-1:-1;;;;;201:32:1;;;54755:44:0::2;::::0;::::2;183:51:1::0;54683:49:0;;-1:-1:-1;54743:9:0::2;::::0;54755:15;;::::2;::::0;:29:::2;::::0;156:18:1;;54755:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54830:15;::::0;:65:::2;::::0;-1:-1:-1;;;54830:65:0;;54743:56;;-1:-1:-1;54810:17:0::2;::::0;-1:-1:-1;;;;;54830:15:0;;::::2;::::0;:37:::2;::::0;:65:::2;::::0;54868:13;;54882:12;;54830:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54810:85;;55055:1;55040:12;:16;55032:49;;;;-1:-1:-1::0;;;55032:49:0::2;;;;;;;:::i;:::-;55118:2;55104:10;:16;;55096:45;;;::::0;-1:-1:-1;;;55096:45:0;;12151:2:1;55096: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;;55096:45:0::2;11949:340:1::0;55096:45:0::2;55165:20;;:::i;:::-;55216:15;::::0;:51:::2;::::0;-1:-1:-1;;;55216:51:0;;-1:-1:-1;;;;;55216:15:0;;::::2;::::0;:30:::2;::::0;:51:::2;::::0;55247:13;;55261:5;;55216:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55196:71:::0;;55295:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;55295:48:0;;-1:-1:-1;;;;;55295:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;55323:13;;55337:5;;55295:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55278:14;::::0;::::2;:65:::0;55371:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;55371:48:0;;-1:-1:-1;;;;;55371:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;55399:13;;55413:5;;55371:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55354:14;::::0;;::::2;:65:::0;;;;55450:15:::2;::::0;:60;;-1:-1:-1;;;55450:60:0;;-1:-1:-1;;;;;55450:15:0;;::::2;::::0;:39:::2;::::0;:60:::2;::::0;55490:13;;55504:5;;55450:60:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55430:17;::::0;::::2;:80:::0;55521:12:::2;55613:15;55639:33;55658:13:::0;55639:18:::2;:33::i;:::-;55707:17:::0;;:20;:17:::2;:25:::0;55698:49:::2;;;::::0;-1:-1:-1;;;55698:49:0;;14855:2:1;55698: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;;55698:49:0::2;14653:334:1::0;55698:49:0::2;56102:10;56114:1;56102:13:::0;56093:5066:::2;;56127:7;56117:17;;56151:55;56167:5;:14;;;56182:5;:17;;;56200:1;56202:3;56151:15;:55::i;:::-;56136:14;::::0;::::2;:70:::0;;;56254:17:::2;::::0;::::2;::::0;56223:55:::2;::::0;56136:70;56272:1:::2;56274:3;56223:15;:55::i;:::-;56208:14;::::0;::::2;:70:::0;56093:5066:::2;;;56342:10;56354:1;56342:13:::0;56338:4821:::2;;56367:7;56357:17;;56391:55;56407:5;:14;;;56422:5;:17;;;56440:1;56442:3;56391:15;:55::i;:::-;56376:14;::::0;::::2;:70:::0;;;56494:17:::2;::::0;::::2;::::0;56463:55:::2;::::0;56376:70;56512:1:::2;56514:3;56463:15;:55::i;56338:4821::-;56541:10;56553:1;56541:13:::0;56537:4622:::2;;56566:7;56556:17;;56590:55;56606:5;:14;;;56621:5;:17;;;56639:1;56641:3;56590:15;:55::i;:::-;56575:14;::::0;::::2;:70:::0;;;56693:17:::2;::::0;::::2;::::0;56662:55:::2;::::0;56575:70;56711:1:::2;56713:3;56662:15;:55::i;56537:4622::-;56740:10;56752:1;56740:13:::0;56736:4423:::2;;56765:7;56755:17;;56789:55;56805:5;:14;;;56820:5;:17;;;56838:1;56840:3;56789:15;:55::i;:::-;56774:14;::::0;::::2;:70:::0;;;56892:17:::2;::::0;::::2;::::0;56861:55:::2;::::0;56774:70;56910:1:::2;56912:3;56861:15;:55::i;56736:4423::-;56939:10;56951:1;56939:13:::0;56935:4224:::2;;56964:7;56954:17;;56988:55;57004:5;:14;;;57019:5;:17;;;57037:1;57039:3;56988:15;:55::i;:::-;56973:14;::::0;::::2;:70:::0;;;57091:17:::2;::::0;::::2;::::0;57060:55:::2;::::0;56973:70;57109:1:::2;57111:3;57060:15;:55::i;56935:4224::-;57138:10;57150:1;57138:13:::0;57134:4025:::2;;57163:7;57153:17;;57187:55;57203:5;:14;;;57218:5;:17;;;57236:1;57238:3;57187:15;:55::i;57134:4025::-;57337:10;57349:1;57337:13:::0;57333:3826:::2;;57362:7;57352:17;;57386:55;57402:5;:14;;;57417:5;:17;;;57435:1;57437:3;57386:15;:55::i;57333:3826::-;57536:10;57548:1;57536:13:::0;57532:3627:::2;;57561:7;57551:17;;57585:55;57601:5;:14;;;57616:5;:17;;;57634:1;57636:3;57585:15;:55::i;57532:3627::-;57735:10;57747:1;57735:13:::0;57731:3428:::2;;57760:7;57750:17;;57784:55;57800:5;:14;;;57815:5;:17;;;57833:1;57835:3;57784:15;:55::i;57731:3428::-;57934:10;57946:1;57934:13:::0;57930:3229:::2;;57959:7;57949:17;;57983:55;57999:5;:14;;;58014:5;:17;;;58032:1;58034:3;57983:15;:55::i;57930:3229::-;58133:10;58145:2;58133:14:::0;58129:3030:::2;;58159:8;58149:18;;58184:55;58200:5;:14;;;58215:5;:17;;;58233:1;58235:3;58184:15;:55::i;58129:3030::-;58365:10;58377:2;58365:14:::0;58361:2798:::2;;58391:8;58381:18;;58416:55;58432:5;:14;;;58447:5;:17;;;58465:1;58467:3;58416:15;:55::i;58361:2798::-;58566:10;58578:2;58566:14:::0;58562:2597:::2;;58592:8;58582:18;;58617:55;58633:5;:14;;;58648:5;:17;;;58666:1;58668:3;58617:15;:55::i;58562:2597::-;58767:10;58779:2;58767:14:::0;58763:2396:::2;;58793:8;58783:18;;58818:55;58834:5;:14;;;58849:5;:17;;;58867:1;58869:3;58818:15;:55::i;58763:2396::-;58968:10;58980:2;58968:14:::0;58964:2195:::2;;58994:8;58984:18;;59019:55;59035:5;:14;;;59050:5;:17;;;59068:1;59070:3;59019:15;:55::i;58964:2195::-;59169:10;59181:2;59169:14:::0;59165:1994:::2;;59195:8;59185:18;;59220:55;59236:5;:14;;;59251:5;:17;;;59269:1;59271:3;59220:15;:55::i;59165:1994::-;59370:10;59382:2;59370:14:::0;59366:1793:::2;;59396:8;59386:18;;59421:55;59437:5;:14;;;59452:5;:17;;;59470:1;59472:3;59421:15;:55::i;59366:1793::-;59571:10;59583:2;59571:14:::0;59567:1592:::2;;59597:8;59587:18;;59622:55;59638:5;:14;;;59653:5;:17;;;59671:1;59673:3;59622:15;:55::i;59567:1592::-;59772:10;59784:2;59772:14:::0;59768:1391:::2;;59798:8;59788:18;;59823:55;59839:5;:14;;;59854:5;:17;;;59872:1;59874:3;59823:15;:55::i;59768:1391::-;59973:10;59985:2;59973:14:::0;59969:1190:::2;;59999:8;59989:18;;60024:55;60040:5;:14;;;60055:5;:17;;;60073:1;60075:3;60024:15;:55::i;59969:1190::-;60174:10;60186:2;60174:14:::0;60170:989:::2;;60200:8;60190:18;;60225:55;60241:5;:14;;;60256:5;:17;;;60274:1;60276:3;60225:15;:55::i;60170:989::-;60375:10;60387:2;60375:14:::0;60371:788:::2;;60401:8;60391:18;;60426:55;60442:5;:14;;;60457:5;:17;;;60475:1;60477:3;60426:15;:55::i;60371:788::-;60576:10;60588:2;60576:14:::0;60572:587:::2;;60602:8;60592:18;;60627:55;60643:5;:14;;;60658:5;:17;;;60676:1;60678:3;60627:15;:55::i;60572:587::-;60777:10;60789:2;60777:14:::0;60773:386:::2;;60803:8;60793:18;;60828:55;60844:5;:14;;;60859:5;:17;;;60877:1;60879:3;60828:15;:55::i;60773:386::-;60978:10;60990:2;60978:14:::0;60974:185:::2;;61004:8;60994:18;;61029:55;61045:5;:14;;;61060:5;:17;;;61078:1;61080:3;61029:15;:55::i;:::-;61014:14;::::0;::::2;:70:::0;;;61132:17:::2;::::0;::::2;::::0;61101:55:::2;::::0;61014:70;61150:1:::2;61152:3;61101:15;:55::i;:::-;61086:14;::::0;::::2;:70:::0;60974:185:::2;61170:17;61201:5;:14;;;:22;;;61190:8;:33;;;;:::i;:::-;61170:53;;61350:7;61334:12;:23;;61326:55;;;::::0;-1:-1:-1;;;61326:55:0;;15459:2:1;61326: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;;61326:55:0::2;15257:343:1::0;61326:55:0::2;61411:15;;61396:12;:30;61392:69;;;-1:-1:-1::0;61444:15:0::2;::::0;61392:69:::2;61505:23;61521:7:::0;61505:23;::::2;:::i;:::-;::::0;-1:-1:-1;61584:23:0::2;61505::::0;61584:8;:23:::2;:::i;:::-;61559:14;::::0;::::2;::::0;;:22:::2;;:48:::0;;;;61660:14;:30;;61683:7;;61660:14;:30:::2;::::0;61683:7;;61660:30:::2;:::i;:::-;::::0;;-1:-1:-1;61701:15:0::2;61709:7:::0;61701:15;::::2;:::i;:::-;61789:17:::0;;:23:::2;;::::0;61701:15;;-1:-1:-1;61816:1:0::2;61789:28;:77:::0;::::2;;;-1:-1:-1::0;61847:19:0::2;::::0;61825:14:::2;::::0;::::2;::::0;:19;:41:::2;61789:77;61788:209;;;-1:-1:-1::0;61918:17:0;;:23:::2;;::::0;61945:1:::2;61918:28;:78:::0;::::2;;;-1:-1:-1::0;61976:20:0::2;::::0;61954:14:::2;::::0;::::2;::::0;:19;:42:::2;61918:78;61784:4216;;;62143:50;;:::i;:::-;62208:32:::0;;;62283:15:::2;::::0;:57:::2;::::0;-1:-1:-1;;;62283:57:0;;-1:-1:-1;;;;;201:32:1;;;62283:57:0::2;::::0;::::2;183:51:1::0;62283:15:0;;::::2;::::0;:42:::2;::::0;156:18:1;;62283:57:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62255:25;::::0;;::::2;:85:::0;;;;62392:64:::2;::::0;-1:-1:-1;;16717:2:1;16713:15;;;16709:53;62392:64:0;;::::2;16697:66:1::0;;;;62423:15:0::2;16779:12:1::0;;;16772:28;62439:16:0::2;16816:12:1::0;;;16809:28;16853:12;;62392:64:0::2;::::0;;-1:-1:-1;;62392:64:0;;::::2;::::0;;;;;;62382:75;;62392:64:::2;62382:75:::0;;::::2;::::0;62355:19;;::::2;:103:::0;62556:11:::2;::::0;62585:17;;62603:14;;::::2;::::0;62556:76;;-1:-1:-1;;;62556:76:0;;62377:81:::2;::::0;-1:-1:-1;;;;;62556:11:0;;::::2;::::0;:28:::2;::::0;:76:::2;::::0;62585:17;;62603:14;62355:12;;62556:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62514:5;:17;;62513:119;;;;;;;;62806:15;;;;;;;;;-1:-1:-1::0;;;;;62806:15:0::2;-1:-1:-1::0;;;;;62806:30:0::2;;62837:13;62851:5;62859;:17;;;62806:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62995:118;;;;;;;;63009:5;:14;;;:19;;;62995:118;;;;63050:19;;63039:8;:30;;;;:::i;:::-;62995:118;;;;63090:21;;63079:8;:32;;;;:::i;:::-;62995:118;;::::0;62978:5:::2;:14;;:135;;;;63128:15;;;;;;;;;-1:-1:-1::0;;;;;63128:15:0::2;-1:-1:-1::0;;;;;63128:27:0::2;;63156:13;63171:5;63178;:14;;;63128:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63251:15;;;;;;;;;-1:-1:-1::0;;;;;63251:15:0::2;-1:-1:-1::0;;;;;63251:39:0::2;;63291:13;63306:5;63313:11;;;;;;;;;-1:-1:-1::0;;;;;63313:11:0::2;-1:-1:-1::0;;;;;63313:23:0::2;;63337:5;:17;;;:20;;;63313:45;;;;;;;;;;;;;2039:25:1::0;;2027:2;2012:18;;1893:177;63313:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63251:108;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63494:55;63510:5;:14;;;63525:5;:17;;;63543:1;63545:3;63494:15;:55::i;:::-;63479:14;::::0;::::2;:70:::0;;;63610:17:::2;::::0;::::2;::::0;63579:55:::2;::::0;63479:70;63628:1:::2;63630:3;63579:15;:55::i;:::-;63564:14;::::0;::::2;:70:::0;;;63695:17:::2;::::0;::::2;::::0;63664:55:::2;::::0;63564:70;63713:1:::2;63715:3;63664:15;:55::i;:::-;63649:14;::::0;::::2;:70:::0;;;63780:17:::2;::::0;::::2;::::0;63749:55:::2;::::0;63649:70;63798:1:::2;63800:3;63749:15;:55::i;:::-;63734:14;::::0;::::2;:70:::0;;;63865:17:::2;::::0;::::2;::::0;63834:55:::2;::::0;63734:70;63883:1:::2;63885:3;63834:15;:55::i;:::-;63819:14;::::0;::::2;:70:::0;63979:17;;:23:::2;;::::0;64006:1:::2;63979:28:::0;63975:484:::2;;64053:17:::0;;:25;;64077:1:::2;::::0;64053:17;:25:::2;::::0;64077:1;;64053:25:::2;:::i;:::-;::::0;;-1:-1:-1;64155:17:0;;:20;64178:5:::2;-1:-1:-1::0;64151:289:0::2;;;64284:17:::0;;:20;:28:::2;::::0;64307:5:::2;::::0;64284:28:::2;:::i;:::-;64261:14;::::0;::::2;::::0;:20:::2;;:51:::0;64151:289:::2;;;64392:17:::0;;:20;:24:::2;::::0;64415:1:::2;::::0;64392:24:::2;:::i;:::-;64369:14;::::0;::::2;::::0;:20:::2;;:47:::0;64151:289:::2;64477:17:::0;;:23:::2;;::::0;64504:1:::2;64477:28:::0;64473:540:::2;;64627:17:::0;;:25;;64651:1:::2;::::0;64627:17;:25:::2;::::0;64651:1;;64627:25:::2;:::i;:::-;::::0;;-1:-1:-1;64725:17:0;;:20;64748:5:::2;-1:-1:-1::0;64721:277:0::2;;;64852:17:::0;;:20;:28:::2;::::0;64875:5:::2;::::0;64852:28:::2;:::i;:::-;64827:14;::::0;::::2;::::0;:22:::2;;:53:::0;64721:277:::2;;;64954:17:::0;;:20;:24:::2;::::0;64977:1:::2;::::0;64954:24:::2;:::i;:::-;64929:14;::::0;::::2;::::0;:22:::2;;:49:::0;64721:277:::2;65027:15;;;;;;;;;-1:-1:-1::0;;;;;65027:15:0::2;-1:-1:-1::0;;;;;65027:27:0::2;;65055:13;65070:5;65078;:14;;;65027:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;65310:15:0::2;::::0;:40:::2;::::0;-1:-1:-1;;;65310:40:0;;-1:-1:-1;;;;;201:32:1;;;65310:40:0::2;::::0;::::2;183:51:1::0;65295:12:0::2;::::0;-1:-1:-1;65310:15:0;;::::2;::::0;-1:-1:-1;65310:25:0::2;::::0;156:18:1;;65310:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65448:17:::0;;:20;65295:55;;-1:-1:-1;65472:5:0::2;::::0;65448:22:::2;::::0;65469:1:::2;::::0;65448:22:::2;:::i;:::-;65447:30;;;;:::i;:::-;65557:15;::::0;:48:::2;::::0;-1:-1:-1;;;65557:48:0;;65441:1:::2;:37:::0;;::::2;65429:50:::0;;;::::2;::::0;-1:-1:-1;;;;;65557:15:0::2;::::0;:25:::2;::::0;:48:::2;::::0;65583:13;;65429:50;;65557:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61999:3697;;;61784:4216;;;65842:15;::::0;65893:14:::2;::::0;::::2;::::0;65842:66:::2;::::0;-1:-1:-1;;;65842:66:0;;-1:-1:-1;;;;;65842:15:0;;::::2;::::0;:27:::2;::::0;:66:::2;::::0;65870:13;;65885:5;;65842:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;65923:15:0::2;::::0;65973:14:::2;::::0;;::::2;::::0;65923:65;;-1:-1:-1;;;65923:65:0;;-1:-1:-1;;;;;65923:15:0;;::::2;::::0;-1:-1:-1;65923:27:0::2;::::0;-1:-1:-1;65923:65:0::2;::::0;65951:13;;65966:5;;65923:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61784:4216;66072:15;::::0;:43:::2;::::0;-1:-1:-1;;;66072:43:0;;-1:-1:-1;;;;;66072:15:0;;::::2;::::0;:22:::2;::::0;:43:::2;::::0;66095:13;;66110:4;;66072:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66131:66;66149:5;:14;;;66164:5;:17;;;66182:5;:14;;;66131:66;;;;;;;;:::i;:::-;;;;;;;;54672:11537;;;;;;;9236:20:::1;8630:1:::0;9756:22;;9573:213;9236:20:::1;54578:11631:::0;;;:::o;33243:101::-;2026:13;:11;:13::i;:::-;33312:14:::1;:24:::0;33243:101::o;70814:217::-;70867:26;;:::i;:::-;70906:21;70930:25;:23;:25::i;:::-;70979:15;;:44;;-1:-1:-1;;;70979:44:0;;-1:-1:-1;;;;;201:32:1;;;70979:44:0;;;183:51:1;70906:49:0;;-1:-1:-1;70979:15:0;;;:29;;156:18:1;;70979:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70966:57;;70895:136;70814:217;:::o;32534:110::-;2026:13;:11;:13::i;:::-;32608:16:::1;:28:::0;32534:110::o;33350:114::-;2026:13;:11;:13::i;:::-;33426:19:::1;:30:::0;33350:114::o;66683:1228::-;9192:21;:19;:21::i;:::-;66794:14:::1;;66781:9;:27;66773:70;;;;-1:-1:-1::0;;;66773:70:0::1;;;;;;;:::i;:::-;66862:27;66879:9;66862:16;:27::i;:::-;66854:56;;;::::0;-1:-1:-1;;;66854:56:0;;21488:2:1;66854: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;;66854:56:0::1;21286:340:1::0;66854:56:0::1;66921:21;66945:25;:23;:25::i;:::-;67244:15;::::0;:37:::1;::::0;-1:-1:-1;;;67244:37:0;;-1:-1:-1;;;;;201:32:1;;;67244:37:0::1;::::0;::::1;183:51:1::0;66921:49:0;;-1:-1:-1;67227:14:0::1;::::0;67244:15;;::::1;::::0;:22:::1;::::0;156:18:1;;67244:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67377:15;::::0;:40:::1;::::0;-1:-1:-1;;;67377:40:0;;::::1;::::0;::::1;2039:25:1::0;;;67227:54:0;;-1:-1:-1;;;;;;67377:15:0::1;::::0;:29:::1;::::0;2012:18:1;;67377:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;67377:40:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;67371:54:::0;:59;67363:108:::1;;;::::0;-1:-1:-1;;;67363:108:0;;22525:2:1;67363: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;;67363:108:0::1;22323:400:1::0;67363:108:0::1;67551:15;::::0;:40:::1;::::0;-1:-1:-1;;;67551:40:0;;-1:-1:-1;;;;;67551:15:0;;::::1;::::0;:29:::1;::::0;:40:::1;::::0;67581:9;;67551:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45:::0;67543:81:::1;;;::::0;-1:-1:-1;;;67543:81:0;;22930:2:1;67543:81:0::1;::::0;::::1;22912:21:1::0;22969:2;22949:18;;;22942:30;23008:25;22988:18;;;22981:53;23051:18;;67543:81:0::1;22728:347:1::0;67543:81:0::1;67669:15;::::0;:54:::1;::::0;-1:-1:-1;;;67669:54:0;;-1:-1:-1;;;;;67669:15:0;;::::1;::::0;:32:::1;::::0;:54:::1;::::0;67702:9;;67713;;67669:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;67766:15:0::1;::::0;:54:::1;::::0;-1:-1:-1;;;67766:54:0;;-1:-1:-1;;;;;67766:15:0;;::::1;::::0;-1:-1:-1;67766:32:0::1;::::0;-1:-1:-1;67766:54:0::1;::::0;67799:9;;67810;;67766:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67881:10;-1:-1:-1::0;;;;;67864:39:0::1;;67893:9;67864:39;;;;;;:::i;:::-;;;;;;;;66762:1149;;9236:20:::0;8630:1;9756:22;;9573:213;9236:20;66683:1228;:::o;32107:255::-;2026:13;:11;:13::i;:::-;32264:1:::1;32240:21;:25;32232:62;;;::::0;-1:-1:-1;;;32232:62:0;;23874:2:1;32232:62:0::1;::::0;::::1;23856:21:1::0;23913:2;23893:18;;;23886:30;23952:26;23932:18;;;23925:54;23996:18;;32232:62:0::1;23672:348:1::0;32232:62:0::1;32313:8;::::0;32305:49:::1;::::0;-1:-1:-1;;;;;32313:8:0;;::::1;::::0;32332:21:::1;32305:49:::0;::::1;;;::::0;32313:8:::1;32305:49:::0;32313:8;32305:49;32332:21;32313:8;32305:49;::::1;;;;;;;;;;;;;;;;;;70182:626:::0;9192:21;:19;:21::i;:::-;70279::::1;70303:25;:23;:25::i;:::-;70367:15;::::0;:44:::1;::::0;-1:-1:-1;;;70367:44:0;;-1:-1:-1;;;;;201:32:1;;;70367:44:0::1;::::0;::::1;183:51:1::0;70279:49:0;;-1:-1:-1;70339:25:0::1;::::0;70367:15;;::::1;::::0;:29:::1;::::0;156:18:1;;70367:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70339:72;;70438:2;70431:4;:9;70422:64;;;::::0;-1:-1:-1;;;70422:64:0;;24227:2:1;70422: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;;70422:64:0::1;24025:405:1::0;70422:64:0::1;70506:9:::0;::::1;70519;::::0;::::1;;70506:22;::::0;::::1;::::0;:48:::1;;-1:-1:-1::0;70532:9:0;::::1;70545::::0;;::::1;;70532:22;;70506:48;:74;;;;-1:-1:-1::0;70571:9:0::1;70558::::0;::::1;;70571::::0;;::::1;;70558:22;;70506:74;70497:119;;;::::0;-1:-1:-1;;;70497:119:0;;24769:2:1;70497:119:0::1;::::0;::::1;24751:21:1::0;24808:2;24788:18;;;24781:30;24847:33;24827:18;;;24820:61;24898:18;;70497:119:0::1;24567:355:1::0;70497:119:0::1;70645:9:::0;::::1;70627::::0;70637:6:::1;:4:::0;70642:1:::1;70637:6;:::i;:::-;70627:17;;;;;;;:::i;:::-;;;;:27:::0;70685:6;70692:1:::1;70685:9;;;;70665::::0;70675:6:::1;:4:::0;70680:1:::1;70675:6;:::i;:::-;:8;::::0;70682:1:::1;70675:8;:::i;:::-;70665:19;;;;;;;:::i;:::-;;;;:29:::0;70725:9;;::::1;;70705::::0;70715:6:::1;:4:::0;70720:1:::1;70715:6;:::i;:::-;:8;::::0;70722:1:::1;70715:8;:::i;:::-;70705:19;;;;;;;:::i;:::-;;;;:29:::0;70745:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;70745:55:0;;-1:-1:-1;;;;;70745:15:0;;::::1;::::0;:29:::1;::::0;:55:::1;::::0;70775:13;;70790:9;;70745:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70268:540;;9236:20:::0;8630:1;9756:22;;9573:213;9236:20;70182:626;;:::o;71460:645::-;71622:15;;:34;;-1:-1:-1;;;71622:34:0;;-1:-1:-1;;;;;201:32:1;;;71622:34:0;;;183:51:1;71563:29:0;;71605:14;;71622:15;;;:25;;156:18:1;;71622:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71605:51;;71690:10;71675:11;:25;;71667:84;;;;-1:-1:-1;;;71667:84:0;;25649:2:1;71667: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;;71667:84:0;25447:410:1;71667:84:0;71783:9;71770:10;:22;71762:72;;;;-1:-1:-1;;;71762:72:0;;26064:2:1;71762: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;;71762:72:0;25862:401:1;71762:72:0;71847:16;71866:24;71879:11;71866:10;:24;:::i;:::-;:28;;71893:1;71866:28;:::i;:::-;71847:47;;71934:11;71919:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;71919:27:0;;;;;;;;;;;;;;;;-1:-1:-1;71905:41:0;-1:-1:-1;71964:6:0;71959:139;71980:11;71976:1;:15;71959:139;;;72030:15;;-1:-1:-1;;;;;72030:15:0;:30;72061:7;72070:15;72084:1;72070:11;:15;:::i;:::-;72030:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72013:11;72025:1;72013:14;;;;;;;;:::i;:::-;;;;;;;;;;:73;71993:3;;71959:139;;;;71594:511;;71460:645;;;;;:::o;42452:604::-;9192:21;:19;:21::i;:::-;42535::::1;42559:25;:23;:25::i;:::-;42535:49;;42734:14;42750:18;42772:42;42796:17;42772:23;:42::i;:::-;42733:81;;;;42847:13;42834:9;:26;42826:69;;;;-1:-1:-1::0;;;42826:69:0::1;;;;;;;:::i;:::-;42906:15;::::0;-1:-1:-1;;;;;42906:15:0::1;:25;42932:13:::0;42947:27:::1;42957:17:::0;42947:9;:27:::1;:::i;:::-;42906:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43024:24;:22;:24::i;:::-;42524:532;;;9236:20:::0;8630:1;9756:22;;9573:213;34860:756;34911:14;34927:25;34954:16;35059:21;35083:25;:23;:25::i;:::-;35156:15;;:44;;-1:-1:-1;;;35156:44:0;;-1:-1:-1;;;;;201:32:1;;;35156:44:0;;;183:51:1;35059:49:0;;-1:-1:-1;35119:16:0;;35156:15;;;;:29;;156:18:1;;35156:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35138:62;;:15;:62;:::i;:::-;35119:81;;35230:8;35215:11;:23;35211:398;;35306:1;35294:13;;35345:1;35322:24;;35211:398;;;35443:15;;:40;;-1:-1:-1;;;35443:40:0;;-1:-1:-1;;;;;201:32:1;;;35443:40:0;;;183:51:1;35443:15:0;;;;:25;;156:18:1;;35443:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35431:52;-1:-1:-1;35521:22:0;35532:11;35521:8;:22;:::i;:::-;35498:45;;35588:9;35572:15;;:25;;;;:::i;:::-;35558:39;;35211:398;34972:644;;34860:756;;;:::o;69804:261::-;69848:13;69896:21;69920:25;:23;:25::i;:::-;69967:15;;:38;;-1:-1:-1;;;69967:38:0;;-1:-1:-1;;;;;201:32:1;;;69967:38:0;;;183:51:1;69896:49:0;;-1:-1:-1;69956:8:0;;69967:15;;;;:23;;156:18:1;;69967:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70023:15;;:34;;-1:-1:-1;;;70023:34:0;;;;;2039:25:1;;;69956:49:0;;-1:-1:-1;;;;;;70023:15:0;;:29;;2012:18:1;;70023:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70023:34:0;;;;;;;;;;;;:::i;:::-;70016:41;;;;69804:261;:::o;32650:112::-;2026:13;:11;:13::i;:::-;32725:18:::1;:29:::0;32650:112::o;2788:103::-;2026:13;:11;:13::i;:::-;2853:30:::1;2880:1;2853:18;:30::i;:::-;2788:103::o:0;33134:::-;2026:13;:11;:13::i;:::-;33204:15:::1;:25:::0;33134:103::o;67966:1101::-;9192:21;:19;:21::i;:::-;68078:14:::1;;68065:9;:27;68057:70;;;;-1:-1:-1::0;;;68057:70:0::1;;;;;;;:::i;:::-;68146:30;68163:12;68146:16;:30::i;:::-;68138:63;;;::::0;-1:-1:-1;;;68138:63:0;;26470:2:1;68138: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;;68138:63:0::1;26268:344:1::0;68138:63:0::1;68212:21;68236:25;:23;:25::i;:::-;68335:15;::::0;:37:::1;::::0;-1:-1:-1;;;68335:37:0;;-1:-1:-1;;;;;201:32:1;;;68335:37:0::1;::::0;::::1;183:51:1::0;68212:49:0;;-1:-1:-1;68318:14:0::1;::::0;68335:15;;::::1;::::0;:22:::1;::::0;156:18:1;;68335:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68453:15;::::0;:40:::1;::::0;-1:-1:-1;;;68453:40:0;;::::1;::::0;::::1;2039:25:1::0;;;68318:54:0;;-1:-1:-1;68425:25:0::1;::::0;-1:-1:-1;;;;;68453:15:0;;::::1;::::0;:29:::1;::::0;2012:18:1;;68453:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;68453:40:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;68561:15;::::0;:43:::1;::::0;-1:-1:-1;;;68561:43:0;;68425:68;;-1:-1:-1;;;;;;68561:15:0::1;::::0;:29:::1;::::0;:43:::1;::::0;68591:12;;68561:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48:::0;68553:88:::1;;;::::0;-1:-1:-1;;;68553:88:0;;26819:2:1;68553:88:0::1;::::0;::::1;26801:21:1::0;26858:2;26838:18;;;26831:30;26897:29;26877:18;;;26870:57;26944:18;;68553:88:0::1;26617:351:1::0;68553:88:0::1;68689:15;::::0;:57:::1;::::0;-1:-1:-1;;;68689:57:0;;-1:-1:-1;;;;;68689:15:0;;::::1;::::0;:32:::1;::::0;:57:::1;::::0;68722:9;;68733:12;;68689:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;68792:15:0::1;::::0;:57:::1;::::0;-1:-1:-1;;;68792:57:0;;-1:-1:-1;;;;;68792:15:0;;::::1;::::0;-1:-1:-1;68792:32:0::1;::::0;-1:-1:-1;68792:57:0::1;::::0;68825:12;;68839:9;;68792:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;68912:15:0::1;::::0;:52:::1;::::0;-1:-1:-1;;;68912:52:0;;-1:-1:-1;;;;;68912:15:0;;::::1;::::0;-1:-1:-1;68912:39:0::1;::::0;-1:-1:-1;68912:52:0::1;::::0;68952:11;;68912:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69021:10;-1:-1:-1::0;;;;;69005:54:0::1;;69033:11;69046:12;69005:54;;;;;;;:::i;:::-;;;;;;;;68046:1021;;;9236:20:::0;8630:1;9756:22;;9573:213;32420:108;2026:13;:11;:13::i;:::-;32493:15:::1;:27:::0;32420:108::o;31444:181::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;31528:26:0;::::1;31520:63;;;::::0;-1:-1:-1;;;31520:63:0;;27563:2:1;31520:63:0::1;::::0;::::1;27545:21:1::0;27602:2;27582:18;;;27575:30;27641:26;27621:18;;;27614:54;27685:18;;31520:63:0::1;27361:348:1::0;31520:63:0::1;31594:8;:23:::0;;-1:-1:-1;;;;;;31594:23:0::1;-1:-1:-1::0;;;;;31594:23:0;;;::::1;::::0;;;::::1;::::0;;31444:181::o;29512:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29512:30:0;;;;;;;;;;;:::o;35791:431::-;35875:14;35891:18;35922:21;35946:25;:23;:25::i;:::-;35994:15;;:40;;-1:-1:-1;;;35994:40:0;;-1:-1:-1;;;;;201:32:1;;;35994:40:0;;;183:51:1;35922:49:0;;-1:-1:-1;35994:15:0;;;:25;;156:18:1;;35994:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35982:52;-1:-1:-1;36092:3:0;36054:35;35982:52;36054:23;:35;:::i;:::-;:41;36045:51;;;;;;36185:23;36168:16;;:40;;;;:::i;:::-;36152:56;;35911:311;35791:431;;;:::o;34171:429::-;34410:15;;:42;;-1:-1:-1;;;34410:42:0;;34441:10;34410:42;;;183:51:1;34227:7:0;;;;-1:-1:-1;;;;;34410:15:0;;;;:30;;156:18:1;;34410:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34386:66;-1:-1:-1;;;;;;34467:27:0;;34463:130;;34518:10;34511:17;;;34171:429;:::o;34463:130::-;34568:13;34171:429;-1:-1:-1;34171:429:0:o;31631:234::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;31738:34:0;::::1;31730:62;;;::::0;-1:-1:-1;;;31730:62:0;;10588:2:1;31730: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;;31730:62:0::1;10386:339:1::0;31730:62:0::1;31803:15;:54:::0;;-1:-1:-1;;;;;;31803:54:0::1;-1:-1:-1::0;;;;;31803:54:0;;;::::1;::::0;;;::::1;::::0;;31631:234::o;32888:118::-;2026:13;:11;:13::i;:::-;32966:21:::1;:32:::0;32888:118::o;36228:780::-;36279:9;36290:12;36304:14;36352:21;36376:25;:23;:25::i;:::-;36437:15;;:47;;-1:-1:-1;;;36437:47:0;;36352:49;;-1:-1:-1;36412:22:0;;-1:-1:-1;;;;;36437:15:0;;;;:27;;:47;;36352:49;;36479:4;;36437:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36502:13;;36602:15;;36583:16;;;;36502:13;;-1:-1:-1;36412:72:0;;-1:-1:-1;36542:15:0;;36602;36572:27;;36542:15;36572:27;:::i;:::-;:45;36568:172;;;36644:15;;36634:25;;36568:172;;;36712:16;;;;36702:26;;:8;:26;:::i;:::-;36692:36;;36568:172;36772:8;36754;:15;;;:26;36750:251;;;36809:1;36797:13;;36750:251;;;36861:14;;36850:8;36832;:15;;;:26;;;;:::i;:::-;:43;36828:173;;;36922:8;36904;:15;;;:26;;;;:::i;:::-;36892:38;;36828:173;;;36975:14;;36963:26;;36828:173;36320:688;;;36228:780;;;;;:::o;45058:9384::-;37064:10;37700:18;37746:8;37044:63;;;;-1:-1:-1;;;37044:63:0;;10932:2:1;37044:63:0;;;10914:21:1;10971:2;10951:18;;;10944:30;11010:29;10990:18;;;10983:57;11057:18;;37044:63:0;10730:351:1;37044:63:0;9192:21:::1;:19;:21::i;:::-;45161::::2;45185:25;:23;:25::i;:::-;45241:15;::::0;:65:::2;::::0;-1:-1:-1;;;45241:65:0;;45161:49;;-1:-1:-1;45221:17:0::2;::::0;-1:-1:-1;;;;;45241:15:0;;::::2;::::0;:37:::2;::::0;:65:::2;::::0;45161:49;;45293:12;;45241:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45221:85;;45466:1;45451:12;:16;45443:49;;;;-1:-1:-1::0;;;45443:49:0::2;;;;;;;:::i;:::-;45528:2;45515:9;:15;;45507:43;;;::::0;-1:-1:-1;;;45507:43:0;;28172:2:1;45507: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;;45507:43:0::2;27970:339:1::0;45507:43:0::2;45574:20;;:::i;:::-;45625:15;::::0;:51:::2;::::0;-1:-1:-1;;;45625:51:0;;-1:-1:-1;;;;;45625:15:0;;::::2;::::0;:30:::2;::::0;:51:::2;::::0;45656:13;;45670:5;;45625:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45605:71:::0;;45704:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;45704:48:0;;-1:-1:-1;;;;;45704:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;45732:13;;45746:5;;45704:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45687:14;::::0;::::2;:65:::0;45780:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;45780:48:0;;-1:-1:-1;;;;;45780:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;45808:13;;45822:5;;45780:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45763:14;::::0;;::::2;:65:::0;;;;45859:15:::2;::::0;:60;;-1:-1:-1;;;45859:60:0;;-1:-1:-1;;;;;45859:15:0;;::::2;::::0;:39:::2;::::0;:60:::2;::::0;45899:13;;45913:5;;45859:60:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45839:17;::::0;::::2;:80:::0;45942:15:::2;::::0;:44:::2;::::0;-1:-1:-1;;;45942:44:0;;-1:-1:-1;;;;;201:32:1;;;45942:44:0::2;::::0;::::2;183:51:1::0;45930:9:0::2;::::0;45942:15:::2;::::0;:29:::2;::::0;156:18:1;;45942:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45930:56:::0;-1:-1:-1;45997:10:0::2;::::0;46155:15:::2;46181:33;46200:13:::0;46181:18:::2;:33::i;:::-;46249:17:::0;;:20;:17:::2;:25:::0;46240:49:::2;;;::::0;-1:-1:-1;;;46240:49:0;;14855:2:1;46240: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;;46240:49:0::2;14653:334:1::0;46240:49:0::2;46309:9;46320:1;46309:12:::0;46300:618:::2;;46331:7;46323:15;;46300:618;;;46375:9;46386:1;46375:12:::0;46371:547:::2;;46397:8;46389:16;;46371:547;;;46435:9;46446:1;46435:12:::0;46431:487:::2;;46457:8;46449:16;;46431:487;;;46488:9;46499:1;46488:12:::0;46484:434:::2;;46510:8;46502:16;;46484:434;;;46541:9;46552:1;46541:12:::0;46537:381:::2;;46563:8;46555:16;;46537:381;;;46603:9;46614:1;46603:12:::0;46599:319:::2;;46625:8;46617:16;;46599:319;;;46656:9;46667:1;46656:12:::0;46652:266:::2;;46678:8;46670:16;;46652:266;;;46716:9;46727:1;46716:12:::0;46712:206:::2;;46738:8;46730:16;;46712:206;;;46769:9;46780:1;46769:12:::0;46765:153:::2;;46791:8;46783:16;;46765:153;;;46822:9;46833:1;46822:12:::0;46818:100:::2;;46844:8;46836:16;;46818:100;;;46884:9;46895:2;46884:13:::0;46880:38:::2;;46907:8;46899:16;;46880:38;46957:8;46933:5;:14;;;:21;;;:32;46929:1071;;;47034:14;::::0;::::2;::::0;:19;:27:::2;::::0;47056:5;;47034:27:::2;:::i;:::-;47012:14;::::0;::::2;::::0;:49;47076:13:::2;47084:5:::0;47076:13;::::2;:::i;:::-;::::0;-1:-1:-1;47128:16:0::2;47139:5:::0;47128:8;:16:::2;:::i;:::-;47104:14;::::0;;::::2;::::0;:21:::2;:40:::0;47173:2:::2;::::0;-1:-1:-1;46929:1071:0::2;;;47252:14;;47245:5;47234:8;47210:5;:14;;;:21;;;:32;;;;:::i;:::-;:40;;;;:::i;:::-;:56;47206:794;;;47314:19;47378:8;47354:5;:14;;;:21;;;:32;;;;:::i;:::-;47337:14;;:50;;;;:::i;:::-;47425:14;::::0;::::2;::::0;:19;47314:74;;-1:-1:-1;47425:36:0::2;::::0;47314:74;;47425:36:::2;:::i;:::-;47403:14;::::0;::::2;::::0;:58;47477:22:::2;47485:14:::0;47477:22;::::2;:::i;:::-;::::0;-1:-1:-1;47551:5:0;47530:17:::2;:14:::0;47545:2:::2;47530:17;:::i;:::-;47529:28;;;;:::i;:::-;47514:43;;47720:14;;47709:8;:25;;;;:::i;:::-;47685:14;::::0;;::::2;::::0;:21:::2;:49:::0;-1:-1:-1;47206:794:0::2;;;47820:14;::::0;::::2;::::0;:19;:27:::2;::::0;47842:5;;47820:27:::2;:::i;:::-;47798:14;::::0;::::2;::::0;:49;47862:13:::2;47870:5:::0;47862:13;::::2;:::i;:::-;;;47938:5;47914;:14;;;:21;;;:29;;;;:::i;:::-;47890:14;::::0;;::::2;::::0;:21:::2;:53:::0;47973:2:::2;::::0;-1:-1:-1;47206:794:0::2;48250:1690:::0;;::::2;;48652:9;48663:1;48652:12:::0;48648:1292:::2;;48681:67;48697:5;:14;;;48712:5;:17;;;48730:1;48735:12;48732:2;:15;;;;:::i;:::-;48681;:67::i;:::-;48666:14;::::0;::::2;:82:::0;48648:1292:::2;;;48789:9;48800:1;48789:12:::0;48785:1155:::2;;48818:66;48834:5;:14;;;48849:5;:17;;;48867:1;48871:12;48869:1;:14;;;;:::i;48785:1155::-;48916:9;48927:1;48916:12:::0;48912:1028:::2;;48945:66;48961:5;:14;;;48976:5;:17;;;48994:1;48998:12;48996:1;:14;;;;:::i;48912:1028::-;49043:9;49054:1;49043:12:::0;49039:901:::2;;49072:66;49088:5;:14;;;49103:5;:17;;;49121:1;49125:12;49123:1;:14;;;;:::i;49039:901::-;49180:9;49191:1;49180:12:::0;49176:764:::2;;49209:66;49225:5;:14;;;49240:5;:17;;;49258:1;49262:12;49260:1;:14;;;;:::i;49176:764::-;49307:9;49318:1;49307:12:::0;49303:637:::2;;49336:67;49352:5;:14;;;49367:5;:17;;;49385:1;49390:12;49387:2;:15;;;;:::i;49303:637::-;49444:9;49455:1;49444:12:::0;49440:500:::2;;49473:67;49489:5;:14;;;49504:5;:17;;;49522:1;49527:12;49524:2;:15;;;;:::i;49440:500::-;49573:9;49584:1;49573:12:::0;49569:371:::2;;49602:67;49618:5;:14;;;49633:5;:17;;;49651:1;49656:12;49653:2;:15;;;;:::i;49569:371::-;49702:9;49713:1;49702:12:::0;49698:242:::2;;49731:67;49747:5;:14;;;49762:5;:17;;;49780:1;49785:12;49782:2;:15;;;;:::i;49698:242::-;49841:9;49852:2;49841:13:::0;49837:103:::2;;49871:67;49887:5;:14;;;49902:5;:17;;;49920:1;49925:12;49922:2;:15;;;;:::i;49871:67::-;49856:14;::::0;::::2;:82:::0;49837:103:::2;50040:17:::0;;:23:::2;;::::0;50067:1:::2;50040:28;:77:::0;::::2;;;-1:-1:-1::0;50098:19:0::2;::::0;50076:14:::2;::::0;::::2;::::0;:19;:41:::2;50040:77;50039:209;;;-1:-1:-1::0;50169:17:0;;:23:::2;;::::0;50196:1:::2;50169:28;:78:::0;::::2;;;-1:-1:-1::0;50227:20:0::2;::::0;50205:14:::2;::::0;::::2;::::0;:19;:42:::2;50169:78;50035:4202;;;50394:50;;:::i;:::-;50459:32:::0;;;50534:15:::2;::::0;:57:::2;::::0;-1:-1:-1;;;50534:57:0;;-1:-1:-1;;;;;201:32:1;;;50534:57:0::2;::::0;::::2;183:51:1::0;50534:15:0;;::::2;::::0;:42:::2;::::0;156:18:1;;50534:57:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50506:25;::::0;;::::2;:85:::0;;;;50643:64:::2;::::0;-1:-1:-1;;16717:2:1;16713:15;;;16709:53;50643:64:0;;::::2;16697:66:1::0;;;;50674:15:0::2;16779:12:1::0;;;16772:28;50690:16:0::2;16816:12:1::0;;;16809:28;16853:12;;50643:64:0::2;::::0;;-1:-1:-1;;50643:64:0;;::::2;::::0;;;;;;50633:75;;50643:64:::2;50633:75:::0;;::::2;::::0;50606:19;;::::2;:103:::0;50807:11:::2;::::0;50836:17;;50854:14;;::::2;::::0;50807:76;;-1:-1:-1;;;50807:76:0;;50628:81:::2;::::0;-1:-1:-1;;;;;50807:11:0;;::::2;::::0;:28:::2;::::0;:76:::2;::::0;50836:17;;50854:14;50606:12;;50807:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50765:5;:17;;50764:119;;;;;;;;51057:15;;;;;;;;;-1:-1:-1::0;;;;;51057:15:0::2;-1:-1:-1::0;;;;;51057:30:0::2;;51088:13;51102:5;51110;:17;;;51057:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51246:118;;;;;;;;51260:5;:14;;;:19;;;51246:118;;;;51301:19;;51290:8;:30;;;;:::i;:::-;51246:118;;;;51341:21;;51330:8;:32;;;;:::i;:::-;51246:118;;::::0;51229:5:::2;:14;;:135;;;;51379:15;;;;;;;;;-1:-1:-1::0;;;;;51379:15:0::2;-1:-1:-1::0;;;;;51379:27:0::2;;51407:13;51422:5;51429;:14;;;51379:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51502:15;;;;;;;;;-1:-1:-1::0;;;;;51502:15:0::2;-1:-1:-1::0;;;;;51502:39:0::2;;51542:13;51557:5;51564:11;;;;;;;;;-1:-1:-1::0;;;;;51564:11:0::2;-1:-1:-1::0;;;;;51564:23:0::2;;51588:5;:17;;;:20;;;51564:45;;;;;;;;;;;;;2039:25:1::0;;2027:2;2012:18;;1893:177;51564:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51502:108;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51745:55;51761:5;:14;;;51776:5;:17;;;51794:1;51796:3;51745:15;:55::i;:::-;51730:14;::::0;::::2;:70:::0;;;51861:17:::2;::::0;::::2;::::0;51830:55:::2;::::0;51730:70;51879:1:::2;51881:3;51830:15;:55::i;:::-;51815:14;::::0;::::2;:70:::0;;;51946:17:::2;::::0;::::2;::::0;51915:55:::2;::::0;51815:70;51964:1:::2;51966:3;51915:15;:55::i;:::-;51900:14;::::0;::::2;:70:::0;;;52031:17:::2;::::0;::::2;::::0;52000:55:::2;::::0;51900:70;52049:1:::2;52051:3;52000:15;:55::i;:::-;51985:14;::::0;::::2;:70:::0;;;52116:17:::2;::::0;::::2;::::0;52085:55:::2;::::0;51985:70;52134:1:::2;52136:3;52085:15;:55::i;:::-;52070:14;::::0;::::2;:70:::0;52230:17;;:23:::2;;::::0;52257:1:::2;52230:28:::0;52226:484:::2;;52304:17:::0;;:25;;52328:1:::2;::::0;52304:17;:25:::2;::::0;52328:1;;52304:25:::2;:::i;:::-;::::0;;-1:-1:-1;52406:17:0;;:20;52429:5:::2;-1:-1:-1::0;52402:289:0::2;;;52535:17:::0;;:20;:28:::2;::::0;52558:5:::2;::::0;52535:28:::2;:::i;:::-;52512:14;::::0;::::2;::::0;:20:::2;;:51:::0;52402:289:::2;;;52643:17:::0;;:20;:24:::2;::::0;52666:1:::2;::::0;52643:24:::2;:::i;:::-;52620:14;::::0;::::2;::::0;:20:::2;;:47:::0;52402:289:::2;52728:17:::0;;:23:::2;;::::0;52755:1:::2;52728:28:::0;52724:540:::2;;52878:17:::0;;:25;;52902:1:::2;::::0;52878:17;:25:::2;::::0;52902:1;;52878:25:::2;:::i;:::-;::::0;;-1:-1:-1;52976:17:0;;:20;52999:5:::2;-1:-1:-1::0;52972:277:0::2;;;53103:17:::0;;:20;:28:::2;::::0;53126:5:::2;::::0;53103:28:::2;:::i;:::-;53078:14;::::0;::::2;::::0;:22:::2;;:53:::0;52972:277:::2;;;53205:17:::0;;:20;:24:::2;::::0;53228:1:::2;::::0;53205:24:::2;:::i;:::-;53180:14;::::0;::::2;::::0;:22:::2;;:49:::0;52972:277:::2;53278:15;;;;;;;;;-1:-1:-1::0;;;;;53278:15:0::2;-1:-1:-1::0;;;;;53278:27:0::2;;53306:13;53321:5;53329;:14;;;53278:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;53561:15:0::2;::::0;:40:::2;::::0;-1:-1:-1;;;53561:40:0;;-1:-1:-1;;;;;201:32:1;;;53561:40:0::2;::::0;::::2;183:51:1::0;53546:12:0::2;::::0;-1:-1:-1;53561:15:0;;::::2;::::0;-1:-1:-1;53561:25:0::2;::::0;156:18:1;;53561:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53699:17:::0;;:20;53546:55;;-1:-1:-1;53723:5:0::2;::::0;53699:22:::2;::::0;53720:1:::2;::::0;53699:22:::2;:::i;:::-;53698:30;;;;:::i;:::-;53808:15;::::0;:48:::2;::::0;-1:-1:-1;;;53808:48:0;;53692:1:::2;:37:::0;;::::2;53680:50:::0;;;::::2;::::0;-1:-1:-1;;;;;53808:15:0::2;::::0;:25:::2;::::0;:48:::2;::::0;53834:13;;53680:50;;53808:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50250:3683;;;50035:4202;;;54079:15;::::0;54130:14:::2;::::0;::::2;::::0;54079:66:::2;::::0;-1:-1:-1;;;54079:66:0;;-1:-1:-1;;;;;54079:15:0;;::::2;::::0;:27:::2;::::0;:66:::2;::::0;54107:13;;54122:5;;54079:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;54160:15:0::2;::::0;54210:14:::2;::::0;;::::2;::::0;54160:65;;-1:-1:-1;;;54160:65:0;;-1:-1:-1;;;;;54160:15:0;;::::2;::::0;-1:-1:-1;54160:27:0::2;::::0;-1:-1:-1;54160:65:0::2;::::0;54188:13;;54203:5;;54160:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50035:4202;54309:15;::::0;:43:::2;::::0;-1:-1:-1;;;54309:43:0;;-1:-1:-1;;;;;54309:15:0;;::::2;::::0;:22:::2;::::0;:43:::2;::::0;54332:13;;54347:4;;54309:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54368:66;54386:5;:14;;;54401:5;:17;;;54419:5;:14;;;54368:66;;;;;;;;:::i;72251:1233::-:0;72508:15;;:34;;-1:-1:-1;;;72508:34:0;;-1:-1:-1;;;;;201:32:1;;;72508:34:0;;;183:51:1;72359:29:0;;;;;;;;72491:14;;72508:15;;;:25;;156:18:1;;72508:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72491:51;;72576:10;72561:11;:25;;72553:105;;;;-1:-1:-1;;;72553:105:0;;28641:2:1;72553: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;;72553:105:0;28439:471:1;72553:105:0;72690:9;72677:10;:22;72669:78;;;;-1:-1:-1;;;72669:78:0;;29117:2:1;72669: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;;72669:78:0;28915:407:1;72669:78:0;72760:16;72779:24;72792:11;72779:10;:24;:::i;:::-;:28;;72806:1;72779:28;:::i;:::-;72760:47;;72849:11;72834:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;72834:27:0;;;;;;;;;;;;;;;;;72820:41;;72896:11;72883:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72872:36;;72955:11;72942:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72919:48;;73002:11;72989:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;72989:25:0;;;;;;;;;;;;;;;;-1:-1:-1;72978:36:0;-1:-1:-1;73032:6:0;73027:450;73048:11;73044:1;:15;73027:450;;;73081:17;73101:15;73115:1;73101:11;:15;:::i;:::-;73148;;:53;;-1:-1:-1;;;73148:53:0;;73081:35;;-1:-1:-1;;;;;;73148:15:0;;:30;;:53;;73179:7;;73081:35;;73148:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73131:11;73143:1;73131:14;;;;;;;;:::i;:::-;;;;;;;;;;:70;73230:15;;:50;;-1:-1:-1;;;73230:50:0;;-1:-1:-1;;;;;73230:15:0;;;;:27;;:50;;73258:7;;73267:12;;73230:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73216:8;73225:1;73216:11;;;;;;;;:::i;:::-;;;;;;;;;;:64;73322:15;;:62;;-1:-1:-1;;;73322:62:0;;-1:-1:-1;;;;;73322:15:0;;;;:39;;:62;;73362:7;;73371:12;;73322:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73296:20;73317:1;73296:23;;;;;;;;:::i;:::-;;;;;;;;;;:88;73414:15;;:50;;-1:-1:-1;;;73414:50:0;;-1:-1:-1;;;;;73414:15:0;;;;:27;;:50;;73442:7;;73451:12;;73414:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73400:8;73409:1;73400:11;;;;;;;;:::i;:::-;;;;;;;;;;:64;-1:-1:-1;73061:3:0;;73027:450;;;;72480:1004;;72251:1233;;;;;;;:::o;33012:116::-;2026:13;:11;:13::i;:::-;33089:19:::1;:31:::0;33012:116::o;32768:114::-;2026:13;:11;:13::i;:::-;32844:19:::1;:30:::0;32768: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;37898:4425::-:0;9192:21;:19;:21::i;:::-;38588::::1;38612:25;:23;:25::i;:::-;38662:15;::::0;:40:::1;::::0;-1:-1:-1;;;38662:40:0;;-1:-1:-1;;;;;201:32:1;;;38662:40:0::1;::::0;::::1;183:51:1::0;38588:49:0;;-1:-1:-1;38648:11:0::1;::::0;38662:15;;::::1;::::0;:25:::1;::::0;156:18:1;;38662:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38756:15;::::0;:64:::1;::::0;-1:-1:-1;;;38756:64:0;;38648:54;;-1:-1:-1;38736:17:0::1;::::0;-1:-1:-1;;;;;38756:15:0;;::::1;::::0;:37:::1;::::0;:64:::1;::::0;38794:13;;38808:11;;38756:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38979:15;::::0;:51:::1;::::0;-1:-1:-1;;;38979:51:0;;38736:84;;-1:-1:-1;38847:15:0::1;::::0;38831:13:::1;::::0;-1:-1:-1;;;;;38979:15:0::1;::::0;:30:::1;::::0;:51:::1;::::0;39010:13;;39025:4;;38979:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38950:80;;39041:33;39060:13;39041:18;:33::i;:::-;39104:6;39114:1;39104:11:::0;39100:168:::1;;39157:15;::::0;:48:::1;::::0;-1:-1:-1;;;39157:48:0;;39141:1:::1;::::0;-1:-1:-1;;;;;;39157:15:0;;::::1;::::0;:25:::1;::::0;:48:::1;::::0;39183:13;;39141:1;;39157:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39100:168;39293:6;39286:4;:13;39278:52;;;::::0;-1:-1:-1;;;39278:52:0;;29936:2:1;39278:52:0::1;::::0;::::1;29918:21:1::0;29975:2;29955:18;;;29948:30;30014:28;29994:18;;;29987:56;30060:18;;39278:52:0::1;29734:350:1::0;39278:52:0::1;39349:13:::0;;:18;39341:55:::1;;;::::0;-1:-1:-1;;;39341:55:0;;30291:2:1;39341:55:0::1;::::0;::::1;30273:21:1::0;30330:2;30310:18;;;30303:30;30369:26;30349:18;;;30342:54;30413:18;;39341:55:0::1;30089:348:1::0;39341:55:0::1;39624:1;39609:12;:16;39601:49;;;;-1:-1:-1::0;;;39601:49:0::1;;;;;;;:::i;:::-;39846:14;39862:23;39887:16;39907:20;:18;:20::i;:::-;39845:82;;;;;;39988:18;40010:1;39988:23:::0;39984:682:::1;;40158:15;::::0;:43:::1;::::0;-1:-1:-1;;;40158:43:0;;-1:-1:-1;;;;;40158:15:0;;::::1;::::0;:25:::1;::::0;:43:::1;::::0;40184:13;;40158:15;;:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;40216:15:0::1;::::0;:61:::1;::::0;-1:-1:-1;;;40216:61:0;;-1:-1:-1;;;;;40216:15:0;;::::1;::::0;-1:-1:-1;40216:29:0::1;::::0;-1:-1:-1;40216:61:0::1;::::0;40246:13;;40261:15:::1;::::0;40216:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39984:682;;;40414:11;40401:9;:24;40393:73;;;::::0;-1:-1:-1;;;40393:73:0;;30931:2:1;40393: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;;40393:73:0::1;30729:400:1::0;40393:73:0::1;40601:15;::::0;-1:-1:-1;;;;;40601:15:0::1;:25;40627:13:::0;40642:11:::1;:9:::0;40601:15;40642:11:::1;:::i;:::-;40601:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39984:682;40863:126;::::0;;::::1;::::0;::::1;::::0;;40876:4:::1;40863:126:::0;;40890:3:::1;40863:126;::::0;::::1;::::0;;;40904:2:::1;40863:126:::0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40863:126:0;;;;;;;;;;41013:93;;;;::::1;::::0;;;;41027:11:::1;::::0;-1:-1:-1;;;41027:41:0;;;;;;2039:25:1;;;40863:126:0;;41013:93;;-1:-1:-1;;;;;41027:11:0::1;:28;2012:18:1::0;;;41027:41:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41013:93:::0;;::::1;;41078:15;:11:::0;41092:1:::1;41078:15;:::i;:::-;41013:93;;;;41103:1;41013:93;;::::0;41000:106:::1;;41117:22;41143:100;;;;;;;;41157:1;41143:100;;;;41180:19;;41169:8;:30;;;;:::i;:::-;41143:100;;;;41220:21;;41209:8;:32;;;;:::i;:::-;41143:100;;::::0;41117:126:::1;;41254:15;;;;;;;;;-1:-1:-1::0;;;;;41254:15:0::1;-1:-1:-1::0;;;;;41254:27:0::1;;41282:13;41297:4;41303:8;41254:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41323:15;;;;;;;;;-1:-1:-1::0;;;;;41323:15:0::1;-1:-1:-1::0;;;;;41323:30:0::1;;41354:13;41368:4;41375:10;41323:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41397:15;;;;;;;;;-1:-1:-1::0;;;;;41397:15:0::1;-1:-1:-1::0;;;;;41397:27:0::1;;41425:13;41440:4;41446:8;41397:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41619:15;;;;;;;;;-1:-1:-1::0;;;;;41619:15:0::1;-1:-1:-1::0;;;;;41619:39:0::1;;41659:13;41674:4;41680:11;;;;;;;;;-1:-1:-1::0;;;;;41680:11:0::1;-1:-1:-1::0;;;;;41680:23:0::1;;41704:10;:13;;;41680:38;;;;;;;;;;;;;2039:25:1::0;;2027:2;2012:18;;1893:177;41680:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41619:100;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;41866:15:0::1;::::0;:40:::1;::::0;-1:-1:-1;;;41866:40:0;;-1:-1:-1;;;;;201:32:1;;;41866:40:0::1;::::0;::::1;183:51:1::0;41851:12:0::1;::::0;-1:-1:-1;41866:15:0;;::::1;::::0;-1:-1:-1;41866:25:0::1;::::0;156:18:1;;41866:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41996:13:::0;;41851:55;;-1:-1:-1;41996:19:0::1;::::0;42010:5:::1;::::0;41996:19:::1;:::i;:::-;42063:15;::::0;:48:::1;::::0;-1:-1:-1;;;42063:48:0;;41990:1:::1;:26:::0;;::::1;41978:39:::0;;;::::1;::::0;-1:-1:-1;;;;;42063:15:0::1;::::0;:25:::1;::::0;:48:::1;::::0;42089:13;;41978:39;;42063:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42199:1;42187:9;:13;42183:70;;;42217:24;:22;:24::i;:::-;42268:47;42286:8;42295:10;42306:8;42268:47;;;;;;;;:::i;:::-;;;;;;;;37972:4351;;;;;;;;;;;9236:20:::0;8630:1;9756:22;;9573:213;33470:116;2026:13;:11;:13::i;:::-;33547:20:::1;:31:::0;33470: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;9272:293:0;8674:1;9406:7;;:19;9398:63;;;;-1:-1:-1;;;9398:63:0;;31697:2:1;9398:63:0;;;31679:21:1;31736:2;31716:18;;;31709:30;31775:33;31755:18;;;31748:61;31826:18;;9398:63:0;31495:355:1;9398:63:0;8674:1;9539:7;:18;9272:293::o;37133:431::-;37445:19;;-1:-1:-1;;;;;37419:22:0;;;;;;:14;:22;;;;;;37401:40;;:15;:40;:::i;:::-;:63;;37393:112;;;;-1:-1:-1;;;37393:112:0;;32057:2:1;37393: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;;37393:112:0;31855:401:1;37393:112:0;-1:-1:-1;;;;;37516:22:0;;;;;:14;:22;;;;;37541:15;37516:40;;37133:431::o;43350:1702::-;43478:25;;:::i;:::-;43586:8;43572:22;;43616:10;43630:1;43616:15;43605:1440;;43674:11;;43657:14;;:28;43653:193;;;43770:11;;43753:14;;43789:4;;43783;;43753:28;;43770:11;43753:28;:::i;:::-;43752:35;;;;:::i;:::-;43751:42;;;;:::i;:::-;43737:11;;:56;;;;:::i;:::-;43720:73;;43605:1440;;43653:193;43830:14;;43816:28;;43605:1440;;;43867:10;43881:1;43867:15;43863:1182;;43931:8;:15;;;43910:11;:18;;;:36;43906:225;;;44066:4;44060;44043:8;:15;;;44022:11;:18;;;:36;;;;:::i;:::-;44021:43;;;;:::i;:::-;44020:50;;;;:::i;:::-;44002:8;:15;;;:68;;;;:::i;:::-;43981:18;;;:89;43863:1182;;43906:225;44111:18;;;;;44093:15;;;:36;43863:1182;;;44152:10;44166:1;44152:15;44148:897;;44217:8;:16;;;44195:11;:19;;;:38;44191:233;;;44357:4;44351;44333:8;:16;;;44311:11;:19;;;:38;;;;:::i;:::-;44310:45;;;;:::i;:::-;44309:52;;;;:::i;:::-;44290:8;:16;;;:71;;;;:::i;:::-;44268:19;;;:93;44148:897;;44191:233;44403:19;;;;;44384:16;;;:38;44148:897;;;44445:10;44459:1;44445:15;44441:604;;44508:8;:14;;;44488:11;:17;;;:34;44484:217;;;44638:4;44632;44616:8;:14;;;44596:11;:17;;;:34;;;;:::i;:::-;44595:41;;;;:::i;:::-;44594:48;;;;:::i;:::-;44577:8;:14;;;:65;;;;:::i;:::-;44557:17;;;:85;44441:604;;44484:217;44682:17;;;;;44665:14;;;:34;44441:604;;;44722:10;44736:1;44722:15;44718:327;;44792:8;:21;;;44765:11;:24;;;:48;44761:273;;;44957:4;44951;44928:8;:21;;;44901:11;:24;;;:48;;;;:::i;:::-;44900:55;;;;:::i;:::-;44899:62;;;;:::i;:::-;44875:8;:21;;;:86;;;;:::i;:::-;44848:24;;;:113;44761:273;;;45008:24;;;;;44984:21;;;:48;44761:273;43350:1702;;;;;;:::o;69119:677::-;69270:20;;69193:4;;69245:9;;69270:25;;:54;;;69322:2;69299:13;:20;:25;69270:54;69266:99;;;-1:-1:-1;69348:5:0;;69119:677;-1:-1:-1;;69119:677:0:o;69266:99::-;69380:6;69375:392;69396:13;:20;69392:1;:24;69375:392;;;69438:11;69452:13;69466:1;69452:16;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;69452:16:0;;-1:-1:-1;;;;69507:11:0;;;;;:26;;-1:-1:-1;;;;;;;;;;69522:11:0;;;;69507:26;69505:29;:71;;;;-1:-1:-1;;;;;;;;;;69564:11:0;;;69562:14;69505:71;:121;;;;-1:-1:-1;;;;;;;;;;69599:11:0;;;;;;:26;;-1:-1:-1;;;;;;;;;;69614:11:0;;;;69599:26;69597:29;69505:121;:178;;;;-1:-1:-1;;;;;;;;;;69656:11:0;;;;;;:26;;-1:-1:-1;;;;;;;;;;69671:11:0;;;;69656:26;69654:29;69505:178;69483:273;;;-1:-1:-1;69735:5:0;;69119:677;-1:-1:-1;;;;69119:677:0:o;69483:273::-;-1:-1:-1;69418:3:0;;69375:392;;;-1:-1:-1;69784:4:0;;69119:677;-1:-1:-1;;;69119:677:0:o;34606:246::-;34668:8;;-1:-1:-1;;;;;34668:8:0;34660:59;;;;-1:-1:-1;;;34660:59:0;;32463:2:1;34660:59:0;;;32445:21:1;32502:2;32482:18;;;32475:30;32541:26;32521:18;;;32514:54;32585:18;;34660:59:0;32261:348:1;34660:59:0;34746:8;;:35;;34731:9;;-1:-1:-1;;;;;34746:8:0;;34767:9;;34731;34746:35;34731:9;34746:35;34767:9;34746:8;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34730:51;;;34800:4;34792:52;;;;-1:-1:-1;;;34792:52:0;;33026:2:1;34792: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;;34792: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://8128bd30507afdcb6d0cf48703936a76bf573ae9340eb3674259f63272316a3c

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  ]

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.