ETH Price: $3,289.08 (+1.46%)
Gas: 2 Gwei

Token

Ether Orcs Genesis (Orcs)
 

Overview

Max Total Supply

351 Orcs

Holders

159

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
weslay.eth
Balance
3 Orcs
0xafBa3199e32cA024A34c7bAc82ee432E78f6Bf62
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EtherOrcs

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 3 : EtherOrcs.sol
// SPDX-License-Identifier: Unlicense
pragma solidity 0.8.7;

import "./ERC20.sol";
import "./ERC721.sol"; 

//    ___ _   _               ___            
//  | __| |_| |_  ___ _ _   / _ \ _ _ __ ___
//  | _||  _| ' \/ -_) '_| | (_) | '_/ _(_-<
//  |___|\__|_||_\___|_|    \___/|_| \__/__/
//

interface MetadataHandlerLike {
    function getTokenURI(uint16 id, uint8 body, uint8 helm, uint8 mainhand, uint8 offhand, uint16 level, uint16 zugModifier) external view returns (string memory);
}


contract EtherOrcs is ERC721 {

    /*///////////////////////////////////////////////////////////////
                    Global STATE
    //////////////////////////////////////////////////////////////*/

    uint256 public constant  cooldown = 10 minutes;
    uint256 public constant  startingTime = 1633951800 + 4.5 hours;

    address public migrator;

    bytes32 internal entropySauce;

    ERC20 public zug = ERC20(0xfEE5F54e1070e7eD31Be341e0A5b1E847f6a84Ab);

    mapping (address => bool)     public auth;
    mapping (uint256 => Orc)      public orcs;
    mapping (uint256 => Action)   public activities;
    mapping (Places  => LootPool) public lootPools;

    MetadataHandlerLike metadaHandler;

    function setAddresses(address mig, address meta) external onlyOwner {
        migrator      = mig;
        metadaHandler = MetadataHandlerLike(meta);
    }

    function setAuth(address add, bool isAuth) external onlyOwner {
        auth[add] = isAuth;
    }


    function transferOwnership(address newOwner) external  onlyOwner{
        admin = newOwner;
    }

    function tokenURI(uint256 id) external view returns(string memory) {
        Orc memory orc = orcs[id];
        return metadaHandler.getTokenURI(uint16(id), orc.body, orc.helm, orc.mainhand, orc.offhand, orc.level, orc.zugModifier);
    }

    event ActionMade(address owner, uint256 id, uint256 timestamp, uint8 activity);


    /*///////////////////////////////////////////////////////////////
                DATA STRUCTURES 
    //////////////////////////////////////////////////////////////*/

    struct LootPool { 
        uint8  minLevel; uint8  minLootTier; uint16  cost;   uint16 total;
        uint16 tier_1;   uint16 tier_2;      uint16 tier_3; uint16 tier_4;
    }

    struct Orc { uint8 body; uint8 helm; uint8 mainhand; uint8 offhand; uint16 level; uint16 zugModifier; uint32 lvlProgress; }

    enum   Actions { UNSTAKED, FARMING, TRAINING }
    struct Action  { address owner; uint88 timestamp; Actions action; }

    // These are all the places you can go search for loot
    enum Places { 
        TOWN, DUNGEON, CRYPT, CASTLE, DRAGONS_LAIR, THE_ETHER, 
        TAINTED_KINGDOM, OOZING_DEN, ANCIENT_CHAMBER, ORC_GODS 
    }   

    /*///////////////////////////////////////////////////////////////
                    CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/
    function initialize() public onlyOwner {

        // Here's whats available in each place
        LootPool memory town           = LootPool({ minLevel: 1,  minLootTier:  1, cost:   0, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory dungeon        = LootPool({ minLevel: 3,  minLootTier:  2, cost:   0, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory crypt          = LootPool({ minLevel: 6,  minLootTier:  3, cost:   0, total: 2619, tier_1: 1459, tier_2: 1025, tier_3: 135, tier_4:   0 });
        LootPool memory castle         = LootPool({ minLevel: 15, minLootTier:  4, cost:   0, total: 6000, tier_1: 3300, tier_2: 2400, tier_3: 300, tier_4:   0 });
        LootPool memory dragonsLair    = LootPool({ minLevel: 25, minLootTier:  5, cost:   0, total: 6000, tier_1: 3300, tier_2: 2400, tier_3: 300, tier_4:   0 });
        LootPool memory theEther       = LootPool({ minLevel: 36, minLootTier:  6, cost:   0, total: 3000, tier_1: 1200, tier_2: 1500, tier_3: 300, tier_4:   0 });
        LootPool memory taintedKingdom = LootPool({ minLevel: 15, minLootTier:  4, cost:  50, total:  600, tier_1:  150, tier_2:  150, tier_3: 150, tier_4: 150 });
        LootPool memory oozingDen      = LootPool({ minLevel: 25, minLootTier:  5, cost:  50, total:  600, tier_1:  150, tier_2:  150, tier_3: 150, tier_4: 150 });
        LootPool memory ancientChamber = LootPool({ minLevel: 45, minLootTier:  9, cost: 125, total:  225, tier_1:  225, tier_2:    0, tier_3:   0, tier_4:   0 });
        LootPool memory orcGods        = LootPool({ minLevel: 52, minLootTier: 10, cost: 300, total:   12, tier_1:    0, tier_2:    0, tier_3:   0, tier_4:   0 });

        lootPools[Places.TOWN]            = town;
        lootPools[Places.DUNGEON]         = dungeon;
        lootPools[Places.CRYPT]           = crypt;
        lootPools[Places.CASTLE]          = castle;
        lootPools[Places.DRAGONS_LAIR]    = dragonsLair;
        lootPools[Places.THE_ETHER]       = theEther;
        lootPools[Places.TAINTED_KINGDOM] = taintedKingdom;
        lootPools[Places.OOZING_DEN]      = oozingDen;
        lootPools[Places.ANCIENT_CHAMBER] = ancientChamber;
        lootPools[Places.ORC_GODS]        = orcGods;

        admin = msg.sender;
        auth[msg.sender] = true;

        oldSupply = ERC721(0x7d9d3659dcfbea08a87777c52020BC672deece13).totalSupply();
    }

    /*///////////////////////////////////////////////////////////////
                    MODIFIERS 
    //////////////////////////////////////////////////////////////*/

    modifier noCheaters() {
        uint256 size = 0;
        address acc = msg.sender;
        assembly { size := extcodesize(acc)}

        require(auth[msg.sender] || (msg.sender == tx.origin && size == 0), "you're trying to cheat!");
        _;

        // We'll use the last caller hash to add entropy to next caller
        entropySauce = keccak256(abi.encodePacked(acc, block.coinbase));
    }

    modifier ownerOfOrc(uint256 id) { 
        require(ownerOf[id] == msg.sender || activities[id].owner == msg.sender, "not your orc");
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == admin);
        _;
    }


    /*///////////////////////////////////////////////////////////////
                    PUBLIC FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    function mint() public noCheaters returns (uint256 id) {
        uint256 cost = _getMintingPrice();
        uint256 rand = _rand();

        if (cost > 0) zug.burn(msg.sender, cost);

        return _mintOrc(rand);
    }

    // Craft an identical orc from v1!
    function craft(address owner_, uint256 id, uint8 body, uint8 helm, uint8 mainhand, uint8 offhand, uint16 level, uint32 lvlProgres) public {
        require(msg.sender == migrator);

        _mint(owner_, id);

        uint16 zugModifier = _tier(helm) + _tier(mainhand) + _tier(offhand);
        orcs[uint256(id)] = Orc({body: body, helm: helm, mainhand: mainhand, offhand: offhand, level: level, lvlProgress: lvlProgres, zugModifier:zugModifier});
    }

    function migrationAction(uint256 id, address owner_, Actions action_) public {
        require(msg.sender == migrator);

        _doAction(id, owner_, action_);

        //Add a time bonus
        activities[id].timestamp = uint88(block.timestamp - 120 minutes);
    }

    function doAction(uint256 id, Actions action_) public ownerOfOrc(id) noCheaters {
       _doAction(id, msg.sender, action_);
    }

    function _doAction(uint256 id, address orcOwner, Actions action_) internal {
        Action memory action = activities[id];
        require(action.action != action_, "already doing that");

        // Picking the largest value between block.timestamp, action.timestamp and startingTime
        uint88 timestamp = uint88(block.timestamp > action.timestamp ? block.timestamp : action.timestamp);

        if (action.action == Actions.UNSTAKED)  _transfer(orcOwner, address(this), id);
     
        else {
            if (block.timestamp > action.timestamp) _claim(id);
            timestamp = timestamp > action.timestamp ? timestamp : action.timestamp;
        }

        address owner_ = action_ == Actions.UNSTAKED ? address(0) : orcOwner;
        if (action_ == Actions.UNSTAKED) _transfer(address(this), orcOwner, id);

        activities[id] = Action({owner: owner_, action: action_,timestamp: timestamp});
        emit ActionMade(orcOwner, id, block.timestamp, uint8(action_));
    }

    function doActionWithManyOrcs(uint256[] calldata ids, Actions action_) external {
        for (uint256 index = 0; index < ids.length; index++) {
            _doAction(ids[index], msg.sender, action_);
        }
    }

    function claim(uint256[] calldata ids) external {
        for (uint256 index = 0; index < ids.length; index++) {
            _claim(ids[index]);
        }
    }

    function _claim(uint256 id) internal noCheaters {
        Orc    memory orc    = orcs[id];
        Action memory action = activities[id];

        if(block.timestamp <= action.timestamp) return;

        uint256 timeDiff = uint256(block.timestamp - action.timestamp);

        if (action.action == Actions.FARMING) zug.mint(action.owner, claimableZug(timeDiff, orc.zugModifier));
       
        if (action.action == Actions.TRAINING) {
            uint256 progress = timeDiff * 3000 / 1 days;
            orcs[id].lvlProgress = uint16(progress % 1000);
            orcs[id].level      += uint16(progress / 1000);
        }

        activities[id].timestamp = uint88(block.timestamp);
    }

    function pillage(uint256 id, Places place, bool tryHelm, bool tryMainhand, bool tryOffhand) public ownerOfOrc(id) noCheaters {
        require(block.timestamp >= uint256(activities[id].timestamp), "on cooldown");
        require(place != Places.ORC_GODS,  "You can't pillage the Orc God");

        if(activities[id].timestamp < block.timestamp) _claim(id); // Need to claim to not have equipment reatroactively multiplying

        uint256 rand_ = _rand();
  
        LootPool memory pool = lootPools[place];
        require(orcs[id].level >= uint16(pool.minLevel), "below minimum level");

        if (pool.cost > 0) {
            require(block.timestamp - startingTime > 14 days);
            zug.burn(msg.sender, uint256(pool.cost) * 1 ether);
        } 

        uint8 item;
        if (tryHelm) {
            ( pool, item ) = _getItemFromPool(pool, _randomize(rand_,"HELM", id));
            if (item != 0 ) orcs[id].helm = item;
        }
        if (tryMainhand) {
            ( pool, item ) = _getItemFromPool(pool, _randomize(rand_,"MAINHAND", id));
            if (item != 0 ) orcs[id].mainhand = item;
        }
        if (tryOffhand) {
            ( pool, item ) = _getItemFromPool(pool, _randomize(rand_,"OFFHAND", id));
            if (item != 0 ) orcs[id].offhand = item;
        }

        if (uint(place) > 1) lootPools[place] = pool;

        // Update zug modifier
        Orc memory orc = orcs[id];
        uint16 zugModifier_ = _tier(orc.helm) + _tier(orc.mainhand) + _tier(orc.offhand);

        orcs[id].zugModifier = zugModifier_;

        activities[id].timestamp = uint88(block.timestamp + cooldown);
    } 

    function update(uint256 id) public ownerOfOrc(id) noCheaters {
        require(_tier(orcs[id].mainhand) < 10);
        require(block.timestamp - startingTime >= 14 days);
        
        LootPool memory pool = lootPools[Places.ORC_GODS];
        require(orcs[id].level >= pool.minLevel);

        zug.burn(msg.sender, uint256(pool.cost) * 1 ether);

        _claim(id); // Need to claim to not have equipment reatroactively multiplying

        uint8 item = uint8(lootPools[Places.ORC_GODS].total--);
        orcs[id].zugModifier = 30;
        orcs[id].body = orcs[id].helm = orcs[id].mainhand = orcs[id].offhand = item + 40;
    }

    /*///////////////////////////////////////////////////////////////
                    VIEWERS
    //////////////////////////////////////////////////////////////*/

    function claimable(uint256 id) external view returns (uint256 amount) {
        uint256 timeDiff = block.timestamp > activities[id].timestamp ? uint256(block.timestamp - activities[id].timestamp) : 0;
        amount = activities[id].action == Actions.FARMING ? claimableZug(timeDiff, orcs[id].zugModifier) : timeDiff * 3000 / 1 days;
    }

    function name() external pure returns (string memory) {
        return "Ether Orcs Genesis";
    }

    function symbol() external pure returns (string memory) {
        return "Orcs";
    }


    /*///////////////////////////////////////////////////////////////
                    MINT FUNCTION
    //////////////////////////////////////////////////////////////*/

    function _mintOrc(uint256 rand) internal returns (uint16 id) {
        (uint8 body,uint8 helm,uint8 mainhand,uint8 offhand) = (0,0,0,0);

        {
            // Helpers to get Percentages
            uint256 sevenOnePct   = type(uint16).max / 100 * 71;
            uint256 eightyPct     = type(uint16).max / 100 * 80;
            uint256 nineFivePct   = type(uint16).max / 100 * 95;
            uint256 nineNinePct   = type(uint16).max / 100 * 99;
    
            id = uint16(totalSupply + 1);
    
            // Getting Random traits
            uint16 randBody = uint16(_randomize(rand, "BODY", id));
                   body     = uint8(randBody > nineNinePct ? randBody % 3 + 25 : 
                              randBody > sevenOnePct  ? randBody % 12 + 13 : randBody % 13 + 1 );
    
            uint16 randHelm = uint16(_randomize(rand, "HELM", id));
                   helm     = uint8(randHelm < eightyPct ? 0 : randHelm % 4 + 5);
    
            uint16 randOffhand = uint16(_randomize(rand, "OFFHAND", id));
                   offhand     = uint8(randOffhand < eightyPct ? 0 : randOffhand % 4 + 5);
    
            uint16 randMainhand = uint16(_randomize(rand, "MAINHAND", id));
                   mainhand     = uint8(randMainhand < nineFivePct ? randMainhand % 4 + 1: randMainhand % 4 + 5);
        }

        _mint(msg.sender, id);

        uint16 zugModifier = _tier(helm) + _tier(mainhand) + _tier(offhand);
        orcs[uint256(id)] = Orc({body: body, helm: helm, mainhand: mainhand, offhand: offhand, level: 0, lvlProgress: 0, zugModifier:zugModifier});
    }

    /*///////////////////////////////////////////////////////////////
                    INTERNAL  HELPERS
    //////////////////////////////////////////////////////////////*/

    /// @dev take an available item from a pool
    function _getItemFromPool(LootPool memory pool, uint256 rand) internal pure returns (LootPool memory, uint8 item) {
        uint draw = rand % pool.total--; 

        if (draw > pool.tier_1 + pool.tier_2 + pool.tier_3 && pool.tier_4-- > 0) {
            item = uint8((draw % 4 + 1) + (pool.minLootTier + 3) * 4);     
            return (pool, item);
        }

        if (draw > pool.tier_1 + pool.tier_2 && pool.tier_3-- > 0) {
            item = uint8((draw % 4 + 1) + (pool.minLootTier + 2) * 4);
            return (pool, item);
        }

        if (draw > pool.tier_1 && pool.tier_2-- > 0) {
            item = uint8((draw % 4 + 1) + (pool.minLootTier + 1) * 4);
            return (pool, item);
        }

        if (pool.tier_1-- > 0) {
            item = uint8((draw % 4 + 1) + pool.minLootTier * 4);
            return (pool, item);
        }
    }

    function claimableZug(uint256 timeDiff, uint16 zugModifier) internal pure returns (uint256 zugAmount) {
        zugAmount = timeDiff * (4 + zugModifier) * 1 ether / 1 days;
    }

    /// @dev Convert an id to its tier
    function _tier(uint16 id) internal pure returns (uint16) {
        if (id == 0) return 0;
        return ((id - 1) / 4 );
    }

    /// @dev Create a bit more of randomness
    function _randomize(uint256 rand, string memory val, uint256 spicy) internal pure returns (uint256) {
        return uint256(keccak256(abi.encode(rand, val, spicy)));
    }

    function _rand() internal view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.basefee, block.timestamp, entropySauce)));
    }

    function _getMintingPrice() internal view returns (uint256) {
        uint256 supply = minted + oldSupply;
        if (supply < 1550) return   0;
        if (supply < 2050) return   4 ether;
        if (supply < 2550) return   8 ether;
        if (supply < 3050) return  12 ether;
        if (supply < 3550) return  24 ether;
        if (supply < 4050) return  40 ether;
        if (supply < 4550) return  60 ether;
        if (supply < 5050) return 130 ether;
    }
}

File 2 of 3 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.7;


/// @notice Modern and gas efficient ERC-721 + ERC-20/EIP-2612-like implementation,
/// including the MetaData, and partially, Enumerable extensions.
contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/
    
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    
    event Approval(address indexed owner, address indexed spender, uint256 indexed tokenId);
    
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/
    
    address        implementation_;
    address public admin; //Lame requirement from opensea
    
    /*///////////////////////////////////////////////////////////////
                             ERC-721 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;
    uint256 public oldSupply;
    uint256 public minted;
    
    mapping(address => uint256) public balanceOf;
    
    mapping(uint256 => address) public ownerOf;
        
    mapping(uint256 => address) public getApproved;
 
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                             VIEW FUNCTION
    //////////////////////////////////////////////////////////////*/

    function owner() external view returns (address) {
        return admin;
    }
    
    /*///////////////////////////////////////////////////////////////
                              ERC-20-LIKE LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function transfer(address to, uint256 tokenId) external {
        require(msg.sender == ownerOf[tokenId], "NOT_OWNER");
        
        _transfer(msg.sender, to, tokenId);
        
    }
    
    /*///////////////////////////////////////////////////////////////
                              ERC-721 LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function supportsInterface(bytes4 interfaceId) external pure returns (bool supported) {
        supported = interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f;
    }
    
    function approve(address spender, uint256 tokenId) external {
        address owner_ = ownerOf[tokenId];
        
        require(msg.sender == owner_ || isApprovedForAll[owner_][msg.sender], "NOT_APPROVED");
        
        getApproved[tokenId] = spender;
        
        emit Approval(owner_, spender, tokenId); 
    }
    
    function setApprovalForAll(address operator, bool approved) external {
        isApprovedForAll[msg.sender][operator] = approved;
        
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(address, address to, uint256 tokenId) public {
        address owner_ = ownerOf[tokenId];
        
        require(
            msg.sender == owner_ 
            || msg.sender == getApproved[tokenId]
            || isApprovedForAll[owner_][msg.sender], 
            "NOT_APPROVED"
        );
        
        _transfer(owner_, to, tokenId);
        
    }
    
    function safeTransferFrom(address, address to, uint256 tokenId) external {
        safeTransferFrom(address(0), to, tokenId, "");
    }
    
    function safeTransferFrom(address, address to, uint256 tokenId, bytes memory data) public {
        transferFrom(address(0), to, tokenId); 
        
        if (to.code.length != 0) {
            // selector = `onERC721Received(address,address,uint,bytes)`
            (, bytes memory returned) = to.staticcall(abi.encodeWithSelector(0x150b7a02,
                msg.sender, address(0), tokenId, data));
                
            bytes4 selector = abi.decode(returned, (bytes4));
            
            require(selector == 0x150b7a02, "NOT_ERC721_RECEIVER");
        }
    }
    
    
    /*///////////////////////////////////////////////////////////////
                          INTERNAL UTILS
    //////////////////////////////////////////////////////////////*/

    function _transfer(address from, address to, uint256 tokenId) internal {
        require(ownerOf[tokenId] == from);

        balanceOf[from]--; 
        balanceOf[to]++;
        
        delete getApproved[tokenId];
        
        ownerOf[tokenId] = to;
        emit Transfer(msg.sender, to, tokenId); 

    }

    function _mint(address to, uint256 tokenId) internal { 
        require(ownerOf[tokenId] == address(0), "ALREADY_MINTED");

        uint maxSupply = oldSupply + minted++;
        require(totalSupply++ <= maxSupply, "MAX SUPPLY REACHED");
                
        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to]++;
        }
        
        ownerOf[tokenId] = to;
                
        emit Transfer(address(0), to, tokenId); 
    }
    
    function _burn(uint256 tokenId) internal { 
        address owner_ = ownerOf[tokenId];
        
        require(ownerOf[tokenId] != address(0), "NOT_MINTED");
        
        totalSupply--;
        balanceOf[owner_]--;
        
        delete ownerOf[tokenId];
                
        emit Transfer(owner_, address(0), tokenId); 
    }
}

File 3 of 3 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.7;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// Taken from Solmate: https://github.com/Rari-Capital/solmate

contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public constant name     = "ZUG";
    string public constant symbol   = "ZUG";
    uint8  public constant decimals = 18;

    /*///////////////////////////////////////////////////////////////
                             ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    mapping(address => bool) public isMinter;

    address public ruler;

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    constructor() { ruler = msg.sender;}

    function approve(address spender, uint256 value) external returns (bool) {
        allowance[msg.sender][spender] = value;

        emit Approval(msg.sender, spender, value);

        return true;
    }

    function transfer(address to, uint256 value) external returns (bool) {
        balanceOf[msg.sender] -= value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(msg.sender, to, value);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool) {
        if (allowance[from][msg.sender] != type(uint256).max) {
            allowance[from][msg.sender] -= value;
        }

        balanceOf[from] -= value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(from, to, value);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                             ORC PRIVILEGE
    //////////////////////////////////////////////////////////////*/

    function mint(address to, uint256 value) external {
        require(isMinter[msg.sender], "FORBIDDEN TO MINT");
        _mint(to, value);
    }

    function burn(address from, uint256 value) external {
        require(isMinter[msg.sender], "FORBIDDEN TO BURN");
        _burn(from, value);
    }

    /*///////////////////////////////////////////////////////////////
                         Ruler Function
    //////////////////////////////////////////////////////////////*/

    function setMinter(address minter, bool status) external {
        require(msg.sender == ruler, "NOT ALLOWED TO RULE");

        isMinter[minter] = status;
    }

    function setRuler(address ruler_) external {
        require(msg.sender == ruler ||ruler == address(0), "NOT ALLOWED TO RULE");

        ruler = ruler_;
    }


    /*///////////////////////////////////////////////////////////////
                          INTERNAL UTILS
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 value) internal {
        totalSupply += value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint256 value) internal {
        balanceOf[from] -= value;

        // This is safe because a user won't ever
        // have a balance larger than totalSupply!
        unchecked {
            totalSupply -= value;
        }

        emit Transfer(from, address(0), value);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"activity","type":"uint8"}],"name":"ActionMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activities","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint88","name":"timestamp","type":"uint88"},{"internalType":"enum EtherOrcs.Actions","name":"action","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"auth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"helm","type":"uint8"},{"internalType":"uint8","name":"mainhand","type":"uint8"},{"internalType":"uint8","name":"offhand","type":"uint8"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"uint32","name":"lvlProgres","type":"uint32"}],"name":"craft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum EtherOrcs.Actions","name":"action_","type":"uint8"}],"name":"doAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"enum EtherOrcs.Actions","name":"action_","type":"uint8"}],"name":"doActionWithManyOrcs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum EtherOrcs.Places","name":"","type":"uint8"}],"name":"lootPools","outputs":[{"internalType":"uint8","name":"minLevel","type":"uint8"},{"internalType":"uint8","name":"minLootTier","type":"uint8"},{"internalType":"uint16","name":"cost","type":"uint16"},{"internalType":"uint16","name":"total","type":"uint16"},{"internalType":"uint16","name":"tier_1","type":"uint16"},{"internalType":"uint16","name":"tier_2","type":"uint16"},{"internalType":"uint16","name":"tier_3","type":"uint16"},{"internalType":"uint16","name":"tier_4","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"enum EtherOrcs.Actions","name":"action_","type":"uint8"}],"name":"migrationAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"oldSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"orcs","outputs":[{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"helm","type":"uint8"},{"internalType":"uint8","name":"mainhand","type":"uint8"},{"internalType":"uint8","name":"offhand","type":"uint8"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"uint16","name":"zugModifier","type":"uint16"},{"internalType":"uint32","name":"lvlProgress","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum EtherOrcs.Places","name":"place","type":"uint8"},{"internalType":"bool","name":"tryHelm","type":"bool"},{"internalType":"bool","name":"tryMainhand","type":"bool"},{"internalType":"bool","name":"tryOffhand","type":"bool"}],"name":"pillage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mig","type":"address"},{"internalType":"address","name":"meta","type":"address"}],"name":"setAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"},{"internalType":"bool","name":"isAuth","type":"bool"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"supported","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zug","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052600b80546001600160a01b03191673fee5f54e1070e7ed31be341e0a5b1e847f6a84ab17905534801561003657600080fd5b50614520806100466000396000f3fe608060405234801561001057600080fd5b50600436106102475760003560e01c806376f0d51a1161013b578063a22cb465116100b8578063d1d58b251161007c578063d1d58b25146106df578063e985e9c5146106f2578063e9fb333c14610720578063f2fde38b14610733578063f851a4401461074657600080fd5b8063a22cb46514610670578063a9059cbb14610683578063b88d4fde14610696578063c87b56dd146106a9578063cd5d2118146106bc57600080fd5b806382ab890a116100ff57806382ab890a146105605780638da5cb5b1461057357806390107afe1461058457806395d89b4114610597578063962b2df2146105b757600080fd5b806376f0d51a14610473578063787a08a61461048657806379388c251461048f5780637cd07e47146105455780638129fc1c1461055857600080fd5b806320cc7750116101c95780634f02c4201161018d5780634f02c420146103fb57806352b104a7146104045780636352211e146104175780636ba4c1381461044057806370a082311461045357600080fd5b806320cc7750146103a457806323b872dd146103b757806339518b5e146103ca57806342842e0e146103d557806346350479146103e857600080fd5b8063095ea7b311610210578063095ea7b3146103165780630b44a2181461032b5780630d1657e81461033e5780631249c58b1461039357806318160ddd1461039b57600080fd5b8062f660381461024c57806301ffc9a71461027c578063058508441461029f57806306fdde03146102b6578063081812fc146102ed575b600080fd5b600b5461025f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61028f61028a366004613ed3565b610759565b6040519015158152602001610273565b6102a860035481565b604051908152602001610273565b6040805180820190915260128152714574686572204f7263732047656e6573697360701b60208201525b604051610273919061417c565b61025f6102fb366004613f9f565b6007602052600090815260409020546001600160a01b031681565b610329610324366004613d6d565b610790565b005b610329610339366004613d43565b610875565b61038461034c366004613f9f565b600e602052600090815260409020546001600160a01b03811690600160a01b81046001600160581b031690600160f81b900460ff1683565b60405161027393929190614131565b6102a86108b7565b6102a860025481565b6103296103b2366004613d97565b6109c6565b6103296103c5366004613c5c565b610b29565b6102a86361645f8081565b6103296103e3366004613c5c565b610bdf565b6103296103f6366004614027565b610c00565b6102a860045481565b610329610412366004613e7f565b6113d0565b61025f610425366004613f9f565b6006602052600090815260409020546001600160a01b031681565b61032961044e366004613e3d565b611410565b6102a8610461366004613c0e565b60056020526000908152604090205481565b610329610481366004614004565b61144e565b6102a861025881565b6104f761049d366004613f9f565b600d6020526000908152604090205460ff808216916101008104821691620100008204811691630100000081049091169061ffff600160201b8204811691600160301b81049091169063ffffffff600160401b9091041687565b6040805160ff988916815296881660208801529487169486019490945294909116606084015261ffff908116608084015290921660a082015263ffffffff90911660c082015260e001610273565b60095461025f906001600160a01b031681565b61032961152d565b61032961056e366004613f9f565b61237b565b6001546001600160a01b031661025f565b610329610592366004613c29565b6126ce565b6040805180820190915260048152634f72637360e01b60208201526102e0565b6106226105c5366004613f0d565b600f6020526000908152604090205460ff8082169161010081049091169061ffff620100008204811691600160201b8104821691600160301b8204811691600160401b8104821691600160501b8204811691600160601b90041688565b6040805160ff998a16815298909716602089015261ffff9586169688019690965292841660608701529083166080860152821660a0850152811660c08401521660e082015261010001610273565b61032961067e366004613d43565b612713565b610329610691366004613d6d565b61277f565b6103296106a4366004613c98565b6127e0565b6102e06106b7366004613f9f565b612918565b61028f6106ca366004613c0e565b600c6020526000908152604090205460ff1681565b6102a86106ed366004613f9f565b612a54565b61028f610700366004613c29565b600860209081526000928352604080842090915290825290205460ff1681565b61032961072e366004613fd1565b612b22565b610329610741366004613c0e565b612b8d565b60015461025f906001600160a01b031681565b60006380ac58cd60e01b6001600160e01b03198316148061078a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000818152600660205260409020546001600160a01b0316338114806107d957506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b6108195760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064015b60405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b0316331461088c57600080fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b336000818152600c60205260408120549091803b9160ff16806108e2575033321480156108e2575081155b6108fe5760405162461bcd60e51b81526004016108109061418f565b6000610908612bc6565b90506000610914612ca4565b9050811561098157600b54604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561096857600080fd5b505af115801561097c573d6000803e3d6000fd5b505050505b61098a81612d01565b61ffff169450505080416040516020016109a59291906140b1565b60405160208183030381529060405280519060200120600a81905550505090565b6009546001600160a01b031633146109dd57600080fd5b6109e788886130aa565b60006109f58460ff166131ea565b610a018660ff166131ea565b610a0d8860ff166131ea565b610a17919061426e565b610a21919061426e565b6040805160e08101825260ff998a1681529789166020808a01918252978a16898301908152968a1660608a0190815261ffff96871660808b0190815293871660a08b0190815263ffffffff96871660c08c0190815260009d8e52600d909a5292909b2098518954915197519b51935192519851909516600160401b0263ffffffff60401b19988716600160301b0261ffff60301b1993909716600160201b029290921667ffffffff0000000019938b1663010000000263ff000000199c8c1662010000029c909c1663ffff000019988c166101000261ffff1990931696909b169590951717959095169790971797909717959095169490941793909317169190911790555050565b6000818152600660205260409020546001600160a01b031633811480610b6557506000828152600760205260409020546001600160a01b031633145b80610b9357506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b610bce5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b6044820152606401610810565b610bd9818484613214565b50505050565b610bfb60008383604051806020016040528060008152506127e0565b505050565b60008581526006602052604090205485906001600160a01b0316331480610c3d57506000818152600e60205260409020546001600160a01b031633145b610c595760405162461bcd60e51b8152600401610810906141c6565b336000818152600c6020526040902054813b919060ff1680610c8357503332148015610c83575081155b610c9f5760405162461bcd60e51b81526004016108109061418f565b6000888152600e6020526040902054600160a01b90046001600160581b0316421015610cfb5760405162461bcd60e51b815260206004820152600b60248201526a37b71031b7b7b63237bbb760a91b6044820152606401610810565b6009876009811115610d0f57610d0f61448f565b1415610d5d5760405162461bcd60e51b815260206004820152601d60248201527f596f752063616e27742070696c6c61676520746865204f726320476f640000006044820152606401610810565b6000888152600e602052604090205442600160a01b9091046001600160581b03161015610d8d57610d8d886132f6565b6000610d97612ca4565b90506000600f60008a6009811115610db157610db161448f565b6009811115610dc257610dc261448f565b8152602001908152602001600020604051806101000160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900461ffff1661ffff1661ffff1681526020016000820160049054906101000a900461ffff1661ffff1661ffff1681526020016000820160069054906101000a900461ffff1661ffff1661ffff1681526020016000820160089054906101000a900461ffff1661ffff1661ffff16815260200160008201600a9054906101000a900461ffff1661ffff1661ffff16815260200160008201600c9054906101000a900461ffff1661ffff1661ffff16815250509050806000015160ff1661ffff16600d60008c815260200190815260200160002060000160049054906101000a900461ffff1661ffff161015610f515760405162461bcd60e51b815260206004820152601360248201527218995b1bddc81b5a5b9a5b5d5b481b195d995b606a1b6044820152606401610810565b604081015161ffff161561100c5762127500610f716361645f804261439b565b11610f7b57600080fd5b600b5460408201516001600160a01b0390911690639dc29fac903390610fad9061ffff16670de0b6b3a7640000614330565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610ff357600080fd5b505af1158015611007573d6000803e3d6000fd5b505050505b60008815611073576110448261103f856040518060400160405280600481526020016348454c4d60e01b8152508f613631565b613668565b909250905060ff8116156110735760008b8152600d60205260409020805461ff00191661010060ff8416021790555b87156110d9576110a88261103f8560405180604001604052806008815260200167135052539210539160c21b8152508f613631565b909250905060ff8116156110d95760008b8152600d60205260409020805462ff000019166201000060ff8416021790555b86156111405761110d8261103f856040518060400160405280600781526020016613d1919210539160ca1b8152508f613631565b909250905060ff8116156111405760008b8152600d60205260409020805463ff0000001916630100000060ff8416021790555b60018a60098111156111545761115461448f565b11156112635781600f60008c60098111156111715761117161448f565b60098111156111825761118261448f565b815260208082019290925260409081016000208351815493850151928501516060860151608087015160a088015160c089015160e09099015160ff95861661ffff199099169890981761010095909716949094029590951765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9482169490940261ffff60401b191693909317600160401b918416919091021763ffffffff60501b1916600160501b9483169490940261ffff60601b191693909317600160601b91909216021790555b60008b8152600d60209081526040808320815160e081018352905460ff808216835261010082048116948301949094526201000081048416928201929092526301000000820490921660608301819052600160201b820461ffff9081166080850152600160301b83041660a0840152600160401b90910463ffffffff1660c08301529091906112f1906131ea565b611301836040015160ff166131ea565b611311846020015160ff166131ea565b61131b919061426e565b611325919061426e565b60008e8152600d60205260409020805461ffff60301b1916600160301b61ffff841602179055905061135961025842614294565b60008e8152600e602090815260409182902080546001600160581b0394909416600160a01b02600160a01b600160f81b031990941693909317909255516113ab96508795504194500191506140b19050565b60408051601f198184030181529190528051602090910120600a555050505050505050565b60005b82811015610bd9576113fe8484838181106113f0576113f06144a5565b905060200201353384613841565b8061140881614413565b9150506113d3565b60005b81811015610bfb5761143c838383818110611430576114306144a5565b905060200201356132f6565b8061144681614413565b915050611413565b60008281526006602052604090205482906001600160a01b031633148061148b57506000818152600e60205260409020546001600160a01b031633145b6114a75760405162461bcd60e51b8152600401610810906141c6565b336000818152600c6020526040902054813b919060ff16806114d1575033321480156114d1575081155b6114ed5760405162461bcd60e51b81526004016108109061418f565b6114f8853386613841565b804160405160200161150b9291906140b1565b60408051601f198184030181529190528051602090910120600a555050505050565b6001546001600160a01b0316331461154457600080fd5b6000604051806101000160405280600160ff168152602001600160ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600360ff168152602001600260ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600660ff168152602001600360ff168152602001600061ffff168152602001610a3b61ffff1681526020016105b361ffff16815260200161040161ffff168152602001608761ffff168152602001600061ffff1681525090506000604051806101000160405280600f60ff168152602001600460ff168152602001600061ffff16815260200161177061ffff168152602001610ce461ffff16815260200161096061ffff16815260200161012c61ffff168152602001600061ffff1681525090506000604051806101000160405280601960ff168152602001600560ff168152602001600061ffff16815260200161177061ffff168152602001610ce461ffff16815260200161096061ffff16815260200161012c61ffff168152602001600061ffff1681525090506000604051806101000160405280602460ff168152602001600660ff168152602001600061ffff168152602001610bb861ffff1681526020016104b061ffff1681526020016105dc61ffff16815260200161012c61ffff168152602001600061ffff1681525090506000604051806101000160405280600f60ff168152602001600460ff168152602001603261ffff16815260200161025861ffff168152602001609661ffff168152602001609661ffff168152602001609661ffff168152602001609661ffff1681525090506000604051806101000160405280601960ff168152602001600560ff168152602001603261ffff16815260200161025861ffff168152602001609661ffff168152602001609661ffff168152602001609661ffff168152602001609661ffff1681525090506000604051806101000160405280602d60ff168152602001600960ff168152602001607d61ffff16815260200160e161ffff16815260200160e161ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff1681525090506000604051806101000160405280603460ff168152602001600a60ff16815260200161012c61ffff168152602001600c61ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff16815250905089600f60008060098111156119595761195961448f565b600981111561196a5761196a61448f565b8152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558990600f9060018152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558890600f9060028152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558790600f9060038152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558690600f9060048152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558590600f9060058152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558490600f9060068152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558390600f9060078152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558290600f9060088152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558190600f906009815260208082019290925260409081016000908120845181548686015187860151606089015160808a015160a08b015160c08c015160e0909c015160ff97881661ffff199097169690961761010097909516969096029390931765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9282169290920261ffff60401b191691909117600160401b938216939093029290921763ffffffff60501b1916600160501b9783169790970261ffff60601b191696909617600160601b91909616029490941790935560018054336001600160a01b0319909116811782558452600c835292819020805460ff191690931790925581516318160ddd60e01b81529151737d9d3659dcfbea08a87777c52020bc672deece13926318160ddd926004808301939192829003018186803b15801561233457600080fd5b505afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c9190613fb8565b60035550505050505050505050565b60008181526006602052604090205481906001600160a01b03163314806123b857506000818152600e60205260409020546001600160a01b031633145b6123d45760405162461bcd60e51b8152600401610810906141c6565b336000818152600c6020526040902054813b919060ff16806123fe575033321480156123fe575081155b61241a5760405162461bcd60e51b81526004016108109061418f565b6000848152600d6020526040902054600a9061243e9062010000900460ff166131ea565b61ffff161061244c57600080fd5b6212750061245e6361645f804261439b565b101561246957600080fd5b6040805161010080820183527f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760395460ff8082168085529282041660208085019190915261ffff620100008304811685870152600160201b80840482166060870152600160301b840482166080870152600160401b8404821660a0870152600160501b8404821660c0870152600160601b909304811660e086015260008a8152600d9092529490205492939204909116101561252357600080fd5b600b5460408201516001600160a01b0390911690639dc29fac9033906125559061ffff16670de0b6b3a7640000614330565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561259b57600080fd5b505af11580156125af573d6000803e3d6000fd5b505050506125bc856132f6565b60096000908152600f6020527f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760398054600160201b900461ffff16906004612602836143de565b82546101009290920a61ffff8181021990931691909216919091021790556000878152600d60205260409020805461ffff60301b1916661e00000000000017905590506126508160286142ac565b6000878152600d6020908152604091829020805463ffff00001916630100000060ff9590951694850262ff00001916176201000085021761ffff1916610100850260ff191617909317909255516126ad93508492504191016140b1565b60408051601f198184030181529190528051602090910120600a5550505050565b6001546001600160a01b031633146126e557600080fd5b600980546001600160a01b039384166001600160a01b03199182161790915560108054929093169116179055565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600660205260409020546001600160a01b031633146127d15760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b6044820152606401610810565b6127dc338383613214565b5050565b6127ec60008484610b29565b6001600160a01b0383163b15610bd9576000836001600160a01b031663150b7a02336000868660405160240161282594939291906140f4565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161285e91906140d8565b600060405180830381855afa9150503d8060008114612899576040519150601f19603f3d011682016040523d82523d6000602084013e61289e565b606091505b509150506000818060200190518101906128b89190613ef0565b9050630a85bd0160e11b6001600160e01b03198216146129105760405162461bcd60e51b81526020600482015260136024820152722727aa2fa2a9219b9918afa922a1a2a4ab22a960691b6044820152606401610810565b505050505050565b6000818152600d6020908152604091829020825160e081018452905460ff808216808452610100830482169484018590526201000083048216848701819052630100000084049092166060808601829052600160201b850461ffff90811660808801819052600160301b8704821660a08901819052600160401b90970463ffffffff1660c089015260105499516356259bc560e11b8152918b166004830152602482019490945260448101979097526064870193909352608486015260a485015260c48401919091529290916001600160a01b039091169063ac4b378a9060e40160006040518083038186803b158015612a1157600080fd5b505afa158015612a25573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a4d9190810190613f28565b9392505050565b6000818152600e60205260408120548190600160a01b90046001600160581b03164211612a82576000612aab565b6000838152600e6020526040902054612aab90600160a01b90046001600160581b03164261439b565b905060016000848152600e6020526040902054600160f81b900460ff166002811115612ad957612ad961448f565b14612afd5762015180612aee82610bb8614330565b612af891906142f2565b612a4d565b6000838152600d6020526040902054612a4d908290600160301b900461ffff16613b33565b6009546001600160a01b03163314612b3957600080fd5b612b44838383613841565b612b50611c204261439b565b6000938452600e602052604090932080546001600160581b0394909416600160a01b02600160a01b600160f81b0319909416939093179092555050565b6001546001600160a01b03163314612ba457600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080600354600454612bd99190614294565b905061060e811015612bed57600091505090565b610802811015612c0657673782dace9d90000091505090565b6109f6811015612c1f57676f05b59d3b20000091505090565b610bea811015612c385767a688906bd8b0000091505090565b610dde811015612c525768014d1120d7b160000091505090565b610fd2811015612c6c5768022b1c8c1227a0000091505090565b6111c6811015612c8657680340aad21b3b70000091505090565b6113ba811015612ca05768070c1cc73b00c8000091505090565b5090565b600a546040516bffffffffffffffffffffffff193360601b16602082015242603482018190524860548301526074820152609481019190915260009060b4016040516020818303038152906040528051906020012060001c905090565b60008080808080612d15606461ffff6142d1565b612d20906047614306565b61ffff1690506000606461ffff612d3791906142d1565b612d42906050614306565b61ffff1690506000606461ffff612d5991906142d1565b612d6490605f614306565b61ffff1690506000606461ffff612d7b91906142d1565b612d86906063614306565b61ffff1690506002546001612d9b9190614294565b98506000612dca8b60405180604001604052806004815260200163424f445960e01b8152508c61ffff16613631565b9050818161ffff1611612e1357848161ffff1611612dfd57612ded600d8261442e565b612df890600161426e565b612e29565b612e08600c8261442e565b612df890600d61426e565b612e1e60038261442e565b612e2990601961426e565b98506000612e588c6040518060400160405280600481526020016348454c4d60e01b8152508d61ffff16613631565b9050848161ffff1610612e8057612e7060048261442e565b612e7b90600561426e565b612e83565b60005b98506000612eb58d6040518060400160405280600781526020016613d1919210539160ca1b8152508e61ffff16613631565b9050858161ffff1610612edd57612ecd60048261442e565b612ed890600561426e565b612ee0565b60005b97506000612f138e60405180604001604052806008815260200167135052539210539160c21b8152508f61ffff16613631565b9050858161ffff1610612f3b57612f2b60048261442e565b612f3690600561426e565b612f51565b612f4660048261442e565b612f5190600161426e565b99505050505050505050612f69338661ffff166130aa565b6000612f778260ff166131ea565b612f838460ff166131ea565b612f8f8660ff166131ea565b612f99919061426e565b612fa3919061426e565b6040805160e08101825260ff978816815295871660208088019182529588168783019081529488166060880190815260006080890181815261ffff95861660a08b0190815260c08b018381528d88168452600d909a52949091209851895493519751925191519451985163ffffffff16600160401b0263ffffffff60401b19998716600160301b0261ffff60301b1996909716600160201b029590951667ffffffff0000000019928c1663010000000263ff00000019948d1662010000029490941663ffff000019998d166101000261ffff1990961692909c1691909117939093179690961698909817979097179390931695909517949094179190911617905550919050565b6000818152600660205260409020546001600160a01b0316156131005760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610810565b600480546000918261311183614413565b919050556003546131229190614294565b60028054919250829190600061313783614413565b91905055111561317e5760405162461bcd60e51b81526020600482015260126024820152711350560814d5541413164814915050d2115160721b6044820152606401610810565b6001600160a01b038316600081815260056020908152604080832080546001019055858352600690915280822080546001600160a01b0319168417905551849291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b600061ffff82166131fd57506000919050565b600461320a600184614378565b61078a91906142d1565b6000818152600660205260409020546001600160a01b0384811691161461323a57600080fd5b6001600160a01b038316600090815260056020526040812080549161325e836143fc565b90915550506001600160a01b038216600090815260056020526040812080549161328783614413565b9091555050600081815260076020908152604080832080546001600160a01b0319908116909155600690925280832080546001600160a01b03871693168317905551839233917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b336000818152600c6020526040902054813b919060ff168061332057503332148015613320575081155b61333c5760405162461bcd60e51b81526004016108109061418f565b6000838152600d60209081526040808320815160e081018352905460ff80821683526101008204811683860152620100008204811683850152630100000082048116606080850191909152600160201b830461ffff9081166080860152600160301b84041660a0850152600160401b90920463ffffffff1660c0840152888652600e85528386208451928301855280546001600160a01b0381168452600160a01b81046001600160581b0316968401969096529295949193840191600160f81b90041660028111156134105761341061448f565b60028111156134215761342161448f565b81525050905080602001516001600160581b031642116134425750506135fe565b600081602001516001600160581b03164261345d919061439b565b90506001826040015160028111156134775761347761448f565b141561350457600b54825160a08501516001600160a01b03909216916340c10f1991906134a5908590613b33565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156134eb57600080fd5b505af11580156134ff573d6000803e3d6000fd5b505050505b60028260400151600281111561351c5761351c61448f565b14156135ca5760006201518061353483610bb8614330565b61353e91906142f2565b905061354c6103e88261444f565b6000888152600d60205260409020805463ffffffff60401b191661ffff92909216600160401b029190911790556135856103e8826142f2565b6000888152600d6020526040902080546004906135ae908490600160201b900461ffff1661426e565b92506101000a81548161ffff021916908361ffff160217905550505b5050506000838152600e602052604090208054600160a01b600160f81b031916600160a01b426001600160581b0316021790555b80416040516020016136119291906140b1565b60408051601f198184030181529190528051602090910120600a55505050565b6000838383604051602001613648939291906141ec565b60408051601f198184030181529190528051602090910120949350505050565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018390528401805191929182916136bb826143de565b61ffff9081169091526136cf91168561444f565b90508460c001518560a0015186608001516136ea919061426e565b6136f4919061426e565b61ffff168111801561371f575060e085018051600091613713826143de565b61ffff90811690915216115b1561376d5760208501516137349060036142ac565b61373f90600461434f565b60ff1661374d60048361444f565b613758906001614294565b6137629190614294565b91508492505061383a565b8460a001518560800151613781919061426e565b61ffff16811180156137ac575060c0850180516000916137a0826143de565b61ffff90811690915216115b156137c15760208501516137349060026142ac565b846080015161ffff16811180156137f1575060a0850180516000916137e5826143de565b61ffff90811690915216115b156138065760208501516137349060016142ac565b608085018051600091613818826143de565b61ffff90811690915216111561383857602085015161373f90600461434f565b505b9250929050565b6000838152600e60209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff1660028111156138a0576138a061448f565b60028111156138b1576138b161448f565b90525090508160028111156138c8576138c861448f565b816040015160028111156138de576138de61448f565b14156139215760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e48191bda5b99c81d1a185d60721b6044820152606401610810565b600081602001516001600160581b0316421161394a5781602001516001600160581b031661394c565b425b90506000826040015160028111156139665761396661448f565b141561397c57613977843087613214565b6139c6565b81602001516001600160581b031642111561399a5761399a856132f6565b81602001516001600160581b0316816001600160581b0316116139c15781602001516139c3565b805b90505b6000808460028111156139db576139db61448f565b146139e657846139e9565b60005b905060008460028111156139ff576139ff61448f565b1415613a1057613a10308688613214565b6040518060600160405280826001600160a01b03168152602001836001600160581b03168152602001856002811115613a4b57613a4b61448f565b90526000878152600e602090815260409182902083518154928501516001600160581b0316600160a01b026001600160f81b03199093166001600160a01b03909116179190911780825591830151909182906001600160f81b0316600160f81b836002811115613abd57613abd61448f565b02179055509050507f12e0cc56edd6c3536e9da2076ca9a265cc04a9b2064bc61ebbe5c25ea280c036858742876002811115613afb57613afb61448f565b604080516001600160a01b03909516855260208501939093529183015260ff16606082015260800160405180910390a1505050505050565b600062015180613b4483600461426e565b613b529061ffff1685614330565b613b6490670de0b6b3a7640000614330565b612a4d91906142f2565b80356001600160a01b0381168114613b8557600080fd5b919050565b60008083601f840112613b9c57600080fd5b50813567ffffffffffffffff811115613bb457600080fd5b6020830191508360208260051b850101111561383a57600080fd5b80358015158114613b8557600080fd5b803560038110613b8557600080fd5b8035600a8110613b8557600080fd5b803560ff81168114613b8557600080fd5b600060208284031215613c2057600080fd5b612a4d82613b6e565b60008060408385031215613c3c57600080fd5b613c4583613b6e565b9150613c5360208401613b6e565b90509250929050565b600080600060608486031215613c7157600080fd5b613c7a84613b6e565b9250613c8860208501613b6e565b9150604084013590509250925092565b60008060008060808587031215613cae57600080fd5b613cb785613b6e565b9350613cc560208601613b6e565b925060408501359150606085013567ffffffffffffffff811115613ce857600080fd5b8501601f81018713613cf957600080fd5b8035613d0c613d0782614246565b614215565b818152886020838501011115613d2157600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613d5657600080fd5b613d5f83613b6e565b9150613c5360208401613bcf565b60008060408385031215613d8057600080fd5b613d8983613b6e565b946020939093013593505050565b600080600080600080600080610100898b031215613db457600080fd5b613dbd89613b6e565b975060208901359650613dd260408a01613bfd565b9550613de060608a01613bfd565b9450613dee60808a01613bfd565b9350613dfc60a08a01613bfd565b925060c089013561ffff81168114613e1357600080fd5b915060e089013563ffffffff81168114613e2c57600080fd5b809150509295985092959890939650565b60008060208385031215613e5057600080fd5b823567ffffffffffffffff811115613e6757600080fd5b613e7385828601613b8a565b90969095509350505050565b600080600060408486031215613e9457600080fd5b833567ffffffffffffffff811115613eab57600080fd5b613eb786828701613b8a565b9094509250613eca905060208501613bdf565b90509250925092565b600060208284031215613ee557600080fd5b8135612a4d816144d1565b600060208284031215613f0257600080fd5b8151612a4d816144d1565b600060208284031215613f1f57600080fd5b612a4d82613bee565b600060208284031215613f3a57600080fd5b815167ffffffffffffffff811115613f5157600080fd5b8201601f81018413613f6257600080fd5b8051613f70613d0782614246565b818152856020838501011115613f8557600080fd5b613f968260208301602086016143b2565b95945050505050565b600060208284031215613fb157600080fd5b5035919050565b600060208284031215613fca57600080fd5b5051919050565b600080600060608486031215613fe657600080fd5b83359250613ff660208501613b6e565b9150613eca60408501613bdf565b6000806040838503121561401757600080fd5b82359150613c5360208401613bdf565b600080600080600060a0868803121561403f57600080fd5b8535945061404f60208701613bee565b935061405d60408701613bcf565b925061406b60608701613bcf565b915061407960808701613bcf565b90509295509295909350565b6000815180845261409d8160208601602086016143b2565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b600082516140ea8184602087016143b2565b9190910192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061412790830184614085565b9695505050505050565b6001600160a01b03841681526001600160581b0383166020820152606081016003831061416e57634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b602081526000612a4d6020830184614085565b60208082526017908201527f796f7527726520747279696e6720746f20636865617421000000000000000000604082015260600190565b6020808252600c908201526b6e6f7420796f7572206f726360a01b604082015260600190565b8381526060602082015260006142056060830185614085565b9050826040830152949350505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561423e5761423e6144bb565b604052919050565b600067ffffffffffffffff821115614260576142606144bb565b50601f01601f191660200190565b600061ffff80831681851680830382111561428b5761428b614463565b01949350505050565b600082198211156142a7576142a7614463565b500190565b600060ff821660ff84168060ff038211156142c9576142c9614463565b019392505050565b600061ffff808416806142e6576142e6614479565b92169190910492915050565b60008261430157614301614479565b500490565b600061ffff8083168185168183048111821515161561432757614327614463565b02949350505050565b600081600019048311821515161561434a5761434a614463565b500290565b600060ff821660ff84168160ff048111821515161561437057614370614463565b029392505050565b600061ffff8381169083168181101561439357614393614463565b039392505050565b6000828210156143ad576143ad614463565b500390565b60005b838110156143cd5781810151838201526020016143b5565b83811115610bd95750506000910152565b600061ffff8216806143f2576143f2614463565b6000190192915050565b60008161440b5761440b614463565b506000190190565b600060001982141561442757614427614463565b5060010190565b600061ffff8084168061444357614443614479565b92169190910692915050565b60008261445e5761445e614479565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146144e757600080fd5b5056fea2646970667358221220b8ae9619477876347a6675157992b11ad0e2f636dcc5f65b08fe6106a264797864736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102475760003560e01c806376f0d51a1161013b578063a22cb465116100b8578063d1d58b251161007c578063d1d58b25146106df578063e985e9c5146106f2578063e9fb333c14610720578063f2fde38b14610733578063f851a4401461074657600080fd5b8063a22cb46514610670578063a9059cbb14610683578063b88d4fde14610696578063c87b56dd146106a9578063cd5d2118146106bc57600080fd5b806382ab890a116100ff57806382ab890a146105605780638da5cb5b1461057357806390107afe1461058457806395d89b4114610597578063962b2df2146105b757600080fd5b806376f0d51a14610473578063787a08a61461048657806379388c251461048f5780637cd07e47146105455780638129fc1c1461055857600080fd5b806320cc7750116101c95780634f02c4201161018d5780634f02c420146103fb57806352b104a7146104045780636352211e146104175780636ba4c1381461044057806370a082311461045357600080fd5b806320cc7750146103a457806323b872dd146103b757806339518b5e146103ca57806342842e0e146103d557806346350479146103e857600080fd5b8063095ea7b311610210578063095ea7b3146103165780630b44a2181461032b5780630d1657e81461033e5780631249c58b1461039357806318160ddd1461039b57600080fd5b8062f660381461024c57806301ffc9a71461027c578063058508441461029f57806306fdde03146102b6578063081812fc146102ed575b600080fd5b600b5461025f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61028f61028a366004613ed3565b610759565b6040519015158152602001610273565b6102a860035481565b604051908152602001610273565b6040805180820190915260128152714574686572204f7263732047656e6573697360701b60208201525b604051610273919061417c565b61025f6102fb366004613f9f565b6007602052600090815260409020546001600160a01b031681565b610329610324366004613d6d565b610790565b005b610329610339366004613d43565b610875565b61038461034c366004613f9f565b600e602052600090815260409020546001600160a01b03811690600160a01b81046001600160581b031690600160f81b900460ff1683565b60405161027393929190614131565b6102a86108b7565b6102a860025481565b6103296103b2366004613d97565b6109c6565b6103296103c5366004613c5c565b610b29565b6102a86361645f8081565b6103296103e3366004613c5c565b610bdf565b6103296103f6366004614027565b610c00565b6102a860045481565b610329610412366004613e7f565b6113d0565b61025f610425366004613f9f565b6006602052600090815260409020546001600160a01b031681565b61032961044e366004613e3d565b611410565b6102a8610461366004613c0e565b60056020526000908152604090205481565b610329610481366004614004565b61144e565b6102a861025881565b6104f761049d366004613f9f565b600d6020526000908152604090205460ff808216916101008104821691620100008204811691630100000081049091169061ffff600160201b8204811691600160301b81049091169063ffffffff600160401b9091041687565b6040805160ff988916815296881660208801529487169486019490945294909116606084015261ffff908116608084015290921660a082015263ffffffff90911660c082015260e001610273565b60095461025f906001600160a01b031681565b61032961152d565b61032961056e366004613f9f565b61237b565b6001546001600160a01b031661025f565b610329610592366004613c29565b6126ce565b6040805180820190915260048152634f72637360e01b60208201526102e0565b6106226105c5366004613f0d565b600f6020526000908152604090205460ff8082169161010081049091169061ffff620100008204811691600160201b8104821691600160301b8204811691600160401b8104821691600160501b8204811691600160601b90041688565b6040805160ff998a16815298909716602089015261ffff9586169688019690965292841660608701529083166080860152821660a0850152811660c08401521660e082015261010001610273565b61032961067e366004613d43565b612713565b610329610691366004613d6d565b61277f565b6103296106a4366004613c98565b6127e0565b6102e06106b7366004613f9f565b612918565b61028f6106ca366004613c0e565b600c6020526000908152604090205460ff1681565b6102a86106ed366004613f9f565b612a54565b61028f610700366004613c29565b600860209081526000928352604080842090915290825290205460ff1681565b61032961072e366004613fd1565b612b22565b610329610741366004613c0e565b612b8d565b60015461025f906001600160a01b031681565b60006380ac58cd60e01b6001600160e01b03198316148061078a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000818152600660205260409020546001600160a01b0316338114806107d957506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b6108195760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064015b60405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b0316331461088c57600080fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b336000818152600c60205260408120549091803b9160ff16806108e2575033321480156108e2575081155b6108fe5760405162461bcd60e51b81526004016108109061418f565b6000610908612bc6565b90506000610914612ca4565b9050811561098157600b54604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561096857600080fd5b505af115801561097c573d6000803e3d6000fd5b505050505b61098a81612d01565b61ffff169450505080416040516020016109a59291906140b1565b60405160208183030381529060405280519060200120600a81905550505090565b6009546001600160a01b031633146109dd57600080fd5b6109e788886130aa565b60006109f58460ff166131ea565b610a018660ff166131ea565b610a0d8860ff166131ea565b610a17919061426e565b610a21919061426e565b6040805160e08101825260ff998a1681529789166020808a01918252978a16898301908152968a1660608a0190815261ffff96871660808b0190815293871660a08b0190815263ffffffff96871660c08c0190815260009d8e52600d909a5292909b2098518954915197519b51935192519851909516600160401b0263ffffffff60401b19988716600160301b0261ffff60301b1993909716600160201b029290921667ffffffff0000000019938b1663010000000263ff000000199c8c1662010000029c909c1663ffff000019988c166101000261ffff1990931696909b169590951717959095169790971797909717959095169490941793909317169190911790555050565b6000818152600660205260409020546001600160a01b031633811480610b6557506000828152600760205260409020546001600160a01b031633145b80610b9357506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b610bce5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b6044820152606401610810565b610bd9818484613214565b50505050565b610bfb60008383604051806020016040528060008152506127e0565b505050565b60008581526006602052604090205485906001600160a01b0316331480610c3d57506000818152600e60205260409020546001600160a01b031633145b610c595760405162461bcd60e51b8152600401610810906141c6565b336000818152600c6020526040902054813b919060ff1680610c8357503332148015610c83575081155b610c9f5760405162461bcd60e51b81526004016108109061418f565b6000888152600e6020526040902054600160a01b90046001600160581b0316421015610cfb5760405162461bcd60e51b815260206004820152600b60248201526a37b71031b7b7b63237bbb760a91b6044820152606401610810565b6009876009811115610d0f57610d0f61448f565b1415610d5d5760405162461bcd60e51b815260206004820152601d60248201527f596f752063616e27742070696c6c61676520746865204f726320476f640000006044820152606401610810565b6000888152600e602052604090205442600160a01b9091046001600160581b03161015610d8d57610d8d886132f6565b6000610d97612ca4565b90506000600f60008a6009811115610db157610db161448f565b6009811115610dc257610dc261448f565b8152602001908152602001600020604051806101000160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900461ffff1661ffff1661ffff1681526020016000820160049054906101000a900461ffff1661ffff1661ffff1681526020016000820160069054906101000a900461ffff1661ffff1661ffff1681526020016000820160089054906101000a900461ffff1661ffff1661ffff16815260200160008201600a9054906101000a900461ffff1661ffff1661ffff16815260200160008201600c9054906101000a900461ffff1661ffff1661ffff16815250509050806000015160ff1661ffff16600d60008c815260200190815260200160002060000160049054906101000a900461ffff1661ffff161015610f515760405162461bcd60e51b815260206004820152601360248201527218995b1bddc81b5a5b9a5b5d5b481b195d995b606a1b6044820152606401610810565b604081015161ffff161561100c5762127500610f716361645f804261439b565b11610f7b57600080fd5b600b5460408201516001600160a01b0390911690639dc29fac903390610fad9061ffff16670de0b6b3a7640000614330565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610ff357600080fd5b505af1158015611007573d6000803e3d6000fd5b505050505b60008815611073576110448261103f856040518060400160405280600481526020016348454c4d60e01b8152508f613631565b613668565b909250905060ff8116156110735760008b8152600d60205260409020805461ff00191661010060ff8416021790555b87156110d9576110a88261103f8560405180604001604052806008815260200167135052539210539160c21b8152508f613631565b909250905060ff8116156110d95760008b8152600d60205260409020805462ff000019166201000060ff8416021790555b86156111405761110d8261103f856040518060400160405280600781526020016613d1919210539160ca1b8152508f613631565b909250905060ff8116156111405760008b8152600d60205260409020805463ff0000001916630100000060ff8416021790555b60018a60098111156111545761115461448f565b11156112635781600f60008c60098111156111715761117161448f565b60098111156111825761118261448f565b815260208082019290925260409081016000208351815493850151928501516060860151608087015160a088015160c089015160e09099015160ff95861661ffff199099169890981761010095909716949094029590951765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9482169490940261ffff60401b191693909317600160401b918416919091021763ffffffff60501b1916600160501b9483169490940261ffff60601b191693909317600160601b91909216021790555b60008b8152600d60209081526040808320815160e081018352905460ff808216835261010082048116948301949094526201000081048416928201929092526301000000820490921660608301819052600160201b820461ffff9081166080850152600160301b83041660a0840152600160401b90910463ffffffff1660c08301529091906112f1906131ea565b611301836040015160ff166131ea565b611311846020015160ff166131ea565b61131b919061426e565b611325919061426e565b60008e8152600d60205260409020805461ffff60301b1916600160301b61ffff841602179055905061135961025842614294565b60008e8152600e602090815260409182902080546001600160581b0394909416600160a01b02600160a01b600160f81b031990941693909317909255516113ab96508795504194500191506140b19050565b60408051601f198184030181529190528051602090910120600a555050505050505050565b60005b82811015610bd9576113fe8484838181106113f0576113f06144a5565b905060200201353384613841565b8061140881614413565b9150506113d3565b60005b81811015610bfb5761143c838383818110611430576114306144a5565b905060200201356132f6565b8061144681614413565b915050611413565b60008281526006602052604090205482906001600160a01b031633148061148b57506000818152600e60205260409020546001600160a01b031633145b6114a75760405162461bcd60e51b8152600401610810906141c6565b336000818152600c6020526040902054813b919060ff16806114d1575033321480156114d1575081155b6114ed5760405162461bcd60e51b81526004016108109061418f565b6114f8853386613841565b804160405160200161150b9291906140b1565b60408051601f198184030181529190528051602090910120600a555050505050565b6001546001600160a01b0316331461154457600080fd5b6000604051806101000160405280600160ff168152602001600160ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600360ff168152602001600260ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600660ff168152602001600360ff168152602001600061ffff168152602001610a3b61ffff1681526020016105b361ffff16815260200161040161ffff168152602001608761ffff168152602001600061ffff1681525090506000604051806101000160405280600f60ff168152602001600460ff168152602001600061ffff16815260200161177061ffff168152602001610ce461ffff16815260200161096061ffff16815260200161012c61ffff168152602001600061ffff1681525090506000604051806101000160405280601960ff168152602001600560ff168152602001600061ffff16815260200161177061ffff168152602001610ce461ffff16815260200161096061ffff16815260200161012c61ffff168152602001600061ffff1681525090506000604051806101000160405280602460ff168152602001600660ff168152602001600061ffff168152602001610bb861ffff1681526020016104b061ffff1681526020016105dc61ffff16815260200161012c61ffff168152602001600061ffff1681525090506000604051806101000160405280600f60ff168152602001600460ff168152602001603261ffff16815260200161025861ffff168152602001609661ffff168152602001609661ffff168152602001609661ffff168152602001609661ffff1681525090506000604051806101000160405280601960ff168152602001600560ff168152602001603261ffff16815260200161025861ffff168152602001609661ffff168152602001609661ffff168152602001609661ffff168152602001609661ffff1681525090506000604051806101000160405280602d60ff168152602001600960ff168152602001607d61ffff16815260200160e161ffff16815260200160e161ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff1681525090506000604051806101000160405280603460ff168152602001600a60ff16815260200161012c61ffff168152602001600c61ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff16815250905089600f60008060098111156119595761195961448f565b600981111561196a5761196a61448f565b8152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558990600f9060018152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558890600f9060028152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558790600f9060038152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558690600f9060048152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558590600f9060058152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558490600f9060068152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558390600f9060078152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558290600f9060088152602080820192909252604090810160009081208451815494860151938601516060870151608088015160a089015160c08a015160e0909a015160ff95861661ffff19909a169990991761010095909816949094029690961765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9582169590950261ffff60401b191694909417600160401b918516919091021763ffffffff60501b1916600160501b9584169590950261ffff60601b191694909417600160601b9290931691909102919091179091558190600f906009815260208082019290925260409081016000908120845181548686015187860151606089015160808a015160a08b015160c08c015160e0909c015160ff97881661ffff199097169690961761010097909516969096029390931765ffffffff000019166201000061ffff9384160261ffff60201b191617600160201b918316919091021763ffffffff60301b1916600160301b9282169290920261ffff60401b191691909117600160401b938216939093029290921763ffffffff60501b1916600160501b9783169790970261ffff60601b191696909617600160601b91909616029490941790935560018054336001600160a01b0319909116811782558452600c835292819020805460ff191690931790925581516318160ddd60e01b81529151737d9d3659dcfbea08a87777c52020bc672deece13926318160ddd926004808301939192829003018186803b15801561233457600080fd5b505afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c9190613fb8565b60035550505050505050505050565b60008181526006602052604090205481906001600160a01b03163314806123b857506000818152600e60205260409020546001600160a01b031633145b6123d45760405162461bcd60e51b8152600401610810906141c6565b336000818152600c6020526040902054813b919060ff16806123fe575033321480156123fe575081155b61241a5760405162461bcd60e51b81526004016108109061418f565b6000848152600d6020526040902054600a9061243e9062010000900460ff166131ea565b61ffff161061244c57600080fd5b6212750061245e6361645f804261439b565b101561246957600080fd5b6040805161010080820183527f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760395460ff8082168085529282041660208085019190915261ffff620100008304811685870152600160201b80840482166060870152600160301b840482166080870152600160401b8404821660a0870152600160501b8404821660c0870152600160601b909304811660e086015260008a8152600d9092529490205492939204909116101561252357600080fd5b600b5460408201516001600160a01b0390911690639dc29fac9033906125559061ffff16670de0b6b3a7640000614330565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561259b57600080fd5b505af11580156125af573d6000803e3d6000fd5b505050506125bc856132f6565b60096000908152600f6020527f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760398054600160201b900461ffff16906004612602836143de565b82546101009290920a61ffff8181021990931691909216919091021790556000878152600d60205260409020805461ffff60301b1916661e00000000000017905590506126508160286142ac565b6000878152600d6020908152604091829020805463ffff00001916630100000060ff9590951694850262ff00001916176201000085021761ffff1916610100850260ff191617909317909255516126ad93508492504191016140b1565b60408051601f198184030181529190528051602090910120600a5550505050565b6001546001600160a01b031633146126e557600080fd5b600980546001600160a01b039384166001600160a01b03199182161790915560108054929093169116179055565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600660205260409020546001600160a01b031633146127d15760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b6044820152606401610810565b6127dc338383613214565b5050565b6127ec60008484610b29565b6001600160a01b0383163b15610bd9576000836001600160a01b031663150b7a02336000868660405160240161282594939291906140f4565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161285e91906140d8565b600060405180830381855afa9150503d8060008114612899576040519150601f19603f3d011682016040523d82523d6000602084013e61289e565b606091505b509150506000818060200190518101906128b89190613ef0565b9050630a85bd0160e11b6001600160e01b03198216146129105760405162461bcd60e51b81526020600482015260136024820152722727aa2fa2a9219b9918afa922a1a2a4ab22a960691b6044820152606401610810565b505050505050565b6000818152600d6020908152604091829020825160e081018452905460ff808216808452610100830482169484018590526201000083048216848701819052630100000084049092166060808601829052600160201b850461ffff90811660808801819052600160301b8704821660a08901819052600160401b90970463ffffffff1660c089015260105499516356259bc560e11b8152918b166004830152602482019490945260448101979097526064870193909352608486015260a485015260c48401919091529290916001600160a01b039091169063ac4b378a9060e40160006040518083038186803b158015612a1157600080fd5b505afa158015612a25573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a4d9190810190613f28565b9392505050565b6000818152600e60205260408120548190600160a01b90046001600160581b03164211612a82576000612aab565b6000838152600e6020526040902054612aab90600160a01b90046001600160581b03164261439b565b905060016000848152600e6020526040902054600160f81b900460ff166002811115612ad957612ad961448f565b14612afd5762015180612aee82610bb8614330565b612af891906142f2565b612a4d565b6000838152600d6020526040902054612a4d908290600160301b900461ffff16613b33565b6009546001600160a01b03163314612b3957600080fd5b612b44838383613841565b612b50611c204261439b565b6000938452600e602052604090932080546001600160581b0394909416600160a01b02600160a01b600160f81b0319909416939093179092555050565b6001546001600160a01b03163314612ba457600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080600354600454612bd99190614294565b905061060e811015612bed57600091505090565b610802811015612c0657673782dace9d90000091505090565b6109f6811015612c1f57676f05b59d3b20000091505090565b610bea811015612c385767a688906bd8b0000091505090565b610dde811015612c525768014d1120d7b160000091505090565b610fd2811015612c6c5768022b1c8c1227a0000091505090565b6111c6811015612c8657680340aad21b3b70000091505090565b6113ba811015612ca05768070c1cc73b00c8000091505090565b5090565b600a546040516bffffffffffffffffffffffff193360601b16602082015242603482018190524860548301526074820152609481019190915260009060b4016040516020818303038152906040528051906020012060001c905090565b60008080808080612d15606461ffff6142d1565b612d20906047614306565b61ffff1690506000606461ffff612d3791906142d1565b612d42906050614306565b61ffff1690506000606461ffff612d5991906142d1565b612d6490605f614306565b61ffff1690506000606461ffff612d7b91906142d1565b612d86906063614306565b61ffff1690506002546001612d9b9190614294565b98506000612dca8b60405180604001604052806004815260200163424f445960e01b8152508c61ffff16613631565b9050818161ffff1611612e1357848161ffff1611612dfd57612ded600d8261442e565b612df890600161426e565b612e29565b612e08600c8261442e565b612df890600d61426e565b612e1e60038261442e565b612e2990601961426e565b98506000612e588c6040518060400160405280600481526020016348454c4d60e01b8152508d61ffff16613631565b9050848161ffff1610612e8057612e7060048261442e565b612e7b90600561426e565b612e83565b60005b98506000612eb58d6040518060400160405280600781526020016613d1919210539160ca1b8152508e61ffff16613631565b9050858161ffff1610612edd57612ecd60048261442e565b612ed890600561426e565b612ee0565b60005b97506000612f138e60405180604001604052806008815260200167135052539210539160c21b8152508f61ffff16613631565b9050858161ffff1610612f3b57612f2b60048261442e565b612f3690600561426e565b612f51565b612f4660048261442e565b612f5190600161426e565b99505050505050505050612f69338661ffff166130aa565b6000612f778260ff166131ea565b612f838460ff166131ea565b612f8f8660ff166131ea565b612f99919061426e565b612fa3919061426e565b6040805160e08101825260ff978816815295871660208088019182529588168783019081529488166060880190815260006080890181815261ffff95861660a08b0190815260c08b018381528d88168452600d909a52949091209851895493519751925191519451985163ffffffff16600160401b0263ffffffff60401b19998716600160301b0261ffff60301b1996909716600160201b029590951667ffffffff0000000019928c1663010000000263ff00000019948d1662010000029490941663ffff000019998d166101000261ffff1990961692909c1691909117939093179690961698909817979097179390931695909517949094179190911617905550919050565b6000818152600660205260409020546001600160a01b0316156131005760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610810565b600480546000918261311183614413565b919050556003546131229190614294565b60028054919250829190600061313783614413565b91905055111561317e5760405162461bcd60e51b81526020600482015260126024820152711350560814d5541413164814915050d2115160721b6044820152606401610810565b6001600160a01b038316600081815260056020908152604080832080546001019055858352600690915280822080546001600160a01b0319168417905551849291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b600061ffff82166131fd57506000919050565b600461320a600184614378565b61078a91906142d1565b6000818152600660205260409020546001600160a01b0384811691161461323a57600080fd5b6001600160a01b038316600090815260056020526040812080549161325e836143fc565b90915550506001600160a01b038216600090815260056020526040812080549161328783614413565b9091555050600081815260076020908152604080832080546001600160a01b0319908116909155600690925280832080546001600160a01b03871693168317905551839233917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b336000818152600c6020526040902054813b919060ff168061332057503332148015613320575081155b61333c5760405162461bcd60e51b81526004016108109061418f565b6000838152600d60209081526040808320815160e081018352905460ff80821683526101008204811683860152620100008204811683850152630100000082048116606080850191909152600160201b830461ffff9081166080860152600160301b84041660a0850152600160401b90920463ffffffff1660c0840152888652600e85528386208451928301855280546001600160a01b0381168452600160a01b81046001600160581b0316968401969096529295949193840191600160f81b90041660028111156134105761341061448f565b60028111156134215761342161448f565b81525050905080602001516001600160581b031642116134425750506135fe565b600081602001516001600160581b03164261345d919061439b565b90506001826040015160028111156134775761347761448f565b141561350457600b54825160a08501516001600160a01b03909216916340c10f1991906134a5908590613b33565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156134eb57600080fd5b505af11580156134ff573d6000803e3d6000fd5b505050505b60028260400151600281111561351c5761351c61448f565b14156135ca5760006201518061353483610bb8614330565b61353e91906142f2565b905061354c6103e88261444f565b6000888152600d60205260409020805463ffffffff60401b191661ffff92909216600160401b029190911790556135856103e8826142f2565b6000888152600d6020526040902080546004906135ae908490600160201b900461ffff1661426e565b92506101000a81548161ffff021916908361ffff160217905550505b5050506000838152600e602052604090208054600160a01b600160f81b031916600160a01b426001600160581b0316021790555b80416040516020016136119291906140b1565b60408051601f198184030181529190528051602090910120600a55505050565b6000838383604051602001613648939291906141ec565b60408051601f198184030181529190528051602090910120949350505050565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018390528401805191929182916136bb826143de565b61ffff9081169091526136cf91168561444f565b90508460c001518560a0015186608001516136ea919061426e565b6136f4919061426e565b61ffff168111801561371f575060e085018051600091613713826143de565b61ffff90811690915216115b1561376d5760208501516137349060036142ac565b61373f90600461434f565b60ff1661374d60048361444f565b613758906001614294565b6137629190614294565b91508492505061383a565b8460a001518560800151613781919061426e565b61ffff16811180156137ac575060c0850180516000916137a0826143de565b61ffff90811690915216115b156137c15760208501516137349060026142ac565b846080015161ffff16811180156137f1575060a0850180516000916137e5826143de565b61ffff90811690915216115b156138065760208501516137349060016142ac565b608085018051600091613818826143de565b61ffff90811690915216111561383857602085015161373f90600461434f565b505b9250929050565b6000838152600e60209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff1660028111156138a0576138a061448f565b60028111156138b1576138b161448f565b90525090508160028111156138c8576138c861448f565b816040015160028111156138de576138de61448f565b14156139215760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e48191bda5b99c81d1a185d60721b6044820152606401610810565b600081602001516001600160581b0316421161394a5781602001516001600160581b031661394c565b425b90506000826040015160028111156139665761396661448f565b141561397c57613977843087613214565b6139c6565b81602001516001600160581b031642111561399a5761399a856132f6565b81602001516001600160581b0316816001600160581b0316116139c15781602001516139c3565b805b90505b6000808460028111156139db576139db61448f565b146139e657846139e9565b60005b905060008460028111156139ff576139ff61448f565b1415613a1057613a10308688613214565b6040518060600160405280826001600160a01b03168152602001836001600160581b03168152602001856002811115613a4b57613a4b61448f565b90526000878152600e602090815260409182902083518154928501516001600160581b0316600160a01b026001600160f81b03199093166001600160a01b03909116179190911780825591830151909182906001600160f81b0316600160f81b836002811115613abd57613abd61448f565b02179055509050507f12e0cc56edd6c3536e9da2076ca9a265cc04a9b2064bc61ebbe5c25ea280c036858742876002811115613afb57613afb61448f565b604080516001600160a01b03909516855260208501939093529183015260ff16606082015260800160405180910390a1505050505050565b600062015180613b4483600461426e565b613b529061ffff1685614330565b613b6490670de0b6b3a7640000614330565b612a4d91906142f2565b80356001600160a01b0381168114613b8557600080fd5b919050565b60008083601f840112613b9c57600080fd5b50813567ffffffffffffffff811115613bb457600080fd5b6020830191508360208260051b850101111561383a57600080fd5b80358015158114613b8557600080fd5b803560038110613b8557600080fd5b8035600a8110613b8557600080fd5b803560ff81168114613b8557600080fd5b600060208284031215613c2057600080fd5b612a4d82613b6e565b60008060408385031215613c3c57600080fd5b613c4583613b6e565b9150613c5360208401613b6e565b90509250929050565b600080600060608486031215613c7157600080fd5b613c7a84613b6e565b9250613c8860208501613b6e565b9150604084013590509250925092565b60008060008060808587031215613cae57600080fd5b613cb785613b6e565b9350613cc560208601613b6e565b925060408501359150606085013567ffffffffffffffff811115613ce857600080fd5b8501601f81018713613cf957600080fd5b8035613d0c613d0782614246565b614215565b818152886020838501011115613d2157600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613d5657600080fd5b613d5f83613b6e565b9150613c5360208401613bcf565b60008060408385031215613d8057600080fd5b613d8983613b6e565b946020939093013593505050565b600080600080600080600080610100898b031215613db457600080fd5b613dbd89613b6e565b975060208901359650613dd260408a01613bfd565b9550613de060608a01613bfd565b9450613dee60808a01613bfd565b9350613dfc60a08a01613bfd565b925060c089013561ffff81168114613e1357600080fd5b915060e089013563ffffffff81168114613e2c57600080fd5b809150509295985092959890939650565b60008060208385031215613e5057600080fd5b823567ffffffffffffffff811115613e6757600080fd5b613e7385828601613b8a565b90969095509350505050565b600080600060408486031215613e9457600080fd5b833567ffffffffffffffff811115613eab57600080fd5b613eb786828701613b8a565b9094509250613eca905060208501613bdf565b90509250925092565b600060208284031215613ee557600080fd5b8135612a4d816144d1565b600060208284031215613f0257600080fd5b8151612a4d816144d1565b600060208284031215613f1f57600080fd5b612a4d82613bee565b600060208284031215613f3a57600080fd5b815167ffffffffffffffff811115613f5157600080fd5b8201601f81018413613f6257600080fd5b8051613f70613d0782614246565b818152856020838501011115613f8557600080fd5b613f968260208301602086016143b2565b95945050505050565b600060208284031215613fb157600080fd5b5035919050565b600060208284031215613fca57600080fd5b5051919050565b600080600060608486031215613fe657600080fd5b83359250613ff660208501613b6e565b9150613eca60408501613bdf565b6000806040838503121561401757600080fd5b82359150613c5360208401613bdf565b600080600080600060a0868803121561403f57600080fd5b8535945061404f60208701613bee565b935061405d60408701613bcf565b925061406b60608701613bcf565b915061407960808701613bcf565b90509295509295909350565b6000815180845261409d8160208601602086016143b2565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b600082516140ea8184602087016143b2565b9190910192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061412790830184614085565b9695505050505050565b6001600160a01b03841681526001600160581b0383166020820152606081016003831061416e57634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b602081526000612a4d6020830184614085565b60208082526017908201527f796f7527726520747279696e6720746f20636865617421000000000000000000604082015260600190565b6020808252600c908201526b6e6f7420796f7572206f726360a01b604082015260600190565b8381526060602082015260006142056060830185614085565b9050826040830152949350505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561423e5761423e6144bb565b604052919050565b600067ffffffffffffffff821115614260576142606144bb565b50601f01601f191660200190565b600061ffff80831681851680830382111561428b5761428b614463565b01949350505050565b600082198211156142a7576142a7614463565b500190565b600060ff821660ff84168060ff038211156142c9576142c9614463565b019392505050565b600061ffff808416806142e6576142e6614479565b92169190910492915050565b60008261430157614301614479565b500490565b600061ffff8083168185168183048111821515161561432757614327614463565b02949350505050565b600081600019048311821515161561434a5761434a614463565b500290565b600060ff821660ff84168160ff048111821515161561437057614370614463565b029392505050565b600061ffff8381169083168181101561439357614393614463565b039392505050565b6000828210156143ad576143ad614463565b500390565b60005b838110156143cd5781810151838201526020016143b5565b83811115610bd95750506000910152565b600061ffff8216806143f2576143f2614463565b6000190192915050565b60008161440b5761440b614463565b506000190190565b600060001982141561442757614427614463565b5060010190565b600061ffff8084168061444357614443614479565b92169190910692915050565b60008261445e5761445e614479565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146144e757600080fd5b5056fea2646970667358221220b8ae9619477876347a6675157992b11ad0e2f636dcc5f65b08fe6106a264797864736f6c63430008070033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.