ETH Price: $3,957.07 (+1.55%)

Token

BlockchainCuties (BC)
 

Overview

Max Total Supply

125,010 BC

Holders

5,083 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Balance
39 BC

Value
$0.00
0x5bd602edaa3038b764d62dd4be600d91d66dc7d1
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Token migration announcement. BlockchainCuties token contract has migrated to 0xafee04257f9ef008bc4a66e3fcf247680f3c787e .

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BlockchainCutiesCore

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-04-25
*/

pragma solidity ^0.4.20;

/// BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain.
/// https://blockchaincuties.co/


/// @title defined the interface that will be referenced in main Cutie contract
contract GeneMixerInterface {
    /// @dev simply a boolean to indicate this is the contract we expect to be
    function isGeneMixer() external pure returns (bool);

    /// @dev given genes of cutie 1 & 2, return a genetic combination - may have a random factor
    /// @param genes1 genes of mom
    /// @param genes2 genes of dad
    /// @return the genes that are supposed to be passed down the child
    function mixGenes(uint256 genes1, uint256 genes2) public view returns (uint256);

    function canBreed(uint40 momId, uint256 genes1, uint40 dadId, uint256 genes2) public view returns (bool);
}



/// @author https://BlockChainArchitect.iocontract Bank is CutiePluginBase
contract PluginInterface
{
    /// @dev simply a boolean to indicate this is the contract we expect to be
    function isPluginInterface() public pure returns (bool);

    function onRemove() public;

    /// @dev Begins new feature.
    /// @param _cutieId - ID of token to auction, sender must be owner.
    /// @param _parameter - arbitrary parameter
    /// @param _seller - Old owner, if not the message sender
    function run(
        uint40 _cutieId,
        uint256 _parameter,
        address _seller
    ) 
    public
    payable;

    /// @dev Begins new feature, approved and signed by COO.
    /// @param _cutieId - ID of token to auction, sender must be owner.
    /// @param _parameter - arbitrary parameter
    function runSigned(
        uint40 _cutieId,
        uint256 _parameter,
        address _owner
    )
    external
    payable;

    function withdraw() public;
}



/// @title Auction Market for Blockchain Cuties.
/// @author https://BlockChainArchitect.io
contract MarketInterface 
{
    function withdrawEthFromBalance() external;    

    function createAuction(uint40 _cutieId, uint128 _startPrice, uint128 _endPrice, uint40 _duration, address _seller) public payable;

    function bid(uint40 _cutieId) public payable;

    function cancelActiveAuctionWhenPaused(uint40 _cutieId) public;

	function getAuctionInfo(uint40 _cutieId)
        public
        view
        returns
    (
        address seller,
        uint128 startPrice,
        uint128 endPrice,
        uint40 duration,
        uint40 startedAt,
        uint128 featuringFee
    );
}



/// @title BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain.
/// @author https://BlockChainArchitect.io
/// @dev This is the BlockchainCuties configuration. It can be changed redeploying another version.
contract ConfigInterface
{
    function isConfig() public pure returns (bool);

    function getCooldownIndexFromGeneration(uint16 _generation) public view returns (uint16);
    
    function getCooldownEndTimeFromIndex(uint16 _cooldownIndex) public view returns (uint40);

    function getCooldownIndexCount() public view returns (uint256);
    
    function getBabyGen(uint16 _momGen, uint16 _dadGen) public pure returns (uint16);

    function getTutorialBabyGen(uint16 _dadGen) public pure returns (uint16);

    function getBreedingFee(uint40 _momId, uint40 _dadId) public pure returns (uint256);
}



/// @dev Note: the ERC-165 identifier for this interface is 0xf0b9e5ba
interface ERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. This function MUST use 50,000 gas or less. Return of other
    ///  than the magic value MUST result in the transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _from The sending address 
    /// @param _tokenId The NFT identifier which is being transfered
    /// @param data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);
}


/// @title BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain.
/// @author https://BlockChainArchitect.io
/// @dev This is the main BlockchainCuties contract. For separated logical sections the code is divided in 
// several separately-instantiated sibling contracts that handle auctions and the genetic combination algorithm. 
// By keeping auctions separate it is possible to upgrade them without disrupting the main contract that tracks
// the ownership of the cutie. The genetic combination algorithm is kept separate so that all of the rest of the 
// code can be open-sourced.
// The contracts:
//
//      - BlockchainCuties: The fundamental code, including main data storage, constants and data types, as well as
//             internal functions for managing these items ans ERC-721 implementation.
//             Various addresses and constraints for operations can be executed only by specific roles - 
//             Owner, Operator and Parties.
//             Methods for interacting with additional features (Plugins).
//             The methods for breeding and keeping track of breeding offers, relies on external genetic combination 
//             contract.
//             Public methods for auctioning or bidding or breeding. 
//
//      - SaleMarket and BreedingMarket: The actual auction functionality is handled in two sibling contracts - one
//             for sales and one for breeding. Auction creation and bidding is mostly mediated through this side of 
//             the core contract.
//
//      - Effects: Contracts allow to use item effects on cuties, implemented as plugins. Items are not stored in 
//             blockchain to not overload Ethereum network. Operator generates signatures, and Plugins check it
//             and perform effect.
//
//      - ItemMarket: Plugin contract used to transfer money from buyer to seller.
//
//      - Bank: Plugin contract used to receive payments for payed features.

contract BlockchainCutiesCore /*is ERC721, CutieCoreInterface*/
{
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external pure returns (string _name) 
    {
        return "BlockchainCuties"; 
    }

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external pure returns (string _symbol)
    {
        return "BC";
    }
    
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external pure returns (bool)
    {
        return
            interfaceID == 0x6466353c || 
            interfaceID == bytes4(keccak256('supportsInterface(bytes4)'));
    }

    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @dev The Birth event is fired as soon as a new cutie is created. This
    ///  is any time a cutie comes into existence through the giveBirth method, as well as
    ///  when a new gen0 cutie is created.
    event Birth(address indexed owner, uint40 cutieId, uint40 momId, uint40 dadId, uint256 genes);

    /// @dev This struct represents a blockchain Cutie. It was ensured that struct fits well into
    ///  exactly two 256-bit words. The order of the members in this structure
    ///  matters because of the Ethereum byte-packing rules.
    ///  Reference: http://solidity.readthedocs.io/en/develop/miscellaneous.html
    struct Cutie
    {
        // The Cutie's genetic code is in these 256-bits. Cutie's genes never change.
        uint256 genes;

        // The timestamp from the block when this cutie was created.
        uint40 birthTime;

        // The minimum timestamp after which the cutie can start breeding
        // again.
        uint40 cooldownEndTime;

        // The cutie's parents ID is set to 0 for gen0 cuties.
        // Because of using 32-bit unsigned integers the limit is 4 billion cuties. 
        // Current Ethereum annual limit is about 500 million transactions.
        uint40 momId;
        uint40 dadId;

        // Set the index in the cooldown array (see below) that means
        // the current cooldown duration for this Cutie. Starts at 0
        // for gen0 cats, and is initialized to floor(generation/2) for others.
        // Incremented by one for each successful breeding, regardless
        // of being cutie mom or cutie dad.
        uint16 cooldownIndex;

        // The "generation number" of the cutie. Cutioes minted by the contract
        // for sale are called "gen0" with generation number of 0. All other cuties' 
        // generation number is the larger of their parents' two generation
        // numbers, plus one (i.e. max(mom.generation, dad.generation) + 1)
        uint16 generation;

        // Some optional data used by external contracts
        // Cutie struct is 2x256 bits long.
        uint64 optional;
    }

    /// @dev An array containing the Cutie struct for all Cuties in existence. The ID
    ///  of each cutie is actually an index into this array. ID 0 is the parent 
    /// of all generation 0 cats, and both parents to itself. It is an invalid genetic code.
    Cutie[] public cuties;

    /// @dev A mapping from cutie IDs to the address that owns them. All cuties have
    ///  some valid owner address, even gen0 cuties are created with a non-zero owner.
    mapping (uint40 => address) public cutieIndexToOwner;

    // @dev A mapping from owner address to count of tokens that address owns.
    //  Used internally inside balanceOf() to resolve ownership count.
    mapping (address => uint256) ownershipTokenCount;

    /// @dev A mapping from CutieIDs to an address that has been approved to call
    ///  transferFrom(). A Cutie can have one approved address for transfer
    ///  at any time. A zero value means that there is no outstanding approval.
    mapping (uint40 => address) public cutieIndexToApproved;

    /// @dev A mapping from CutieIDs to an address that has been approved to use
    ///  this Cutie for breeding via breedWith(). A Cutie can have one approved
    ///  address for breeding at any time. A zero value means that there is no outstanding approval.
    mapping (uint40 => address) public sireAllowedToAddress;


    /// @dev The address of the Market contract used to sell cuties. This
    ///  contract used both peer-to-peer sales and the gen0 sales that are
    ///  initiated each 15 minutes.
    MarketInterface public saleMarket;

    /// @dev The address of a custom Market subclassed contract used for breeding
    ///  auctions. Is to be separated from saleMarket as the actions taken on success
    ///  after a sales and breeding auction are quite different.
    MarketInterface public breedingMarket;


    // Modifiers to check that inputs can be safely stored with a certain
    // number of bits.
    modifier canBeStoredIn40Bits(uint256 _value) {
        require(_value <= 0xFFFFFFFFFF);
        _;
    }    

    /// @notice Returns the total number of Cuties in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() external view returns (uint256)
    {
        return cuties.length - 1;
    }

    /// @notice Returns the total number of Cuties in existence.
    /// @dev Required for ERC-721 compliance.
    function _totalSupply() internal view returns (uint256)
    {
        return cuties.length - 1;
    }
    
    // Internal utility functions assume that their input arguments
    // are valid. Public methods sanitize their inputs and follow
    // the required logic.

    /// @dev Checks if a given address is the current owner of a certain Cutie.
    /// @param _claimant the address we are validating against.
    /// @param _cutieId cutie id, only valid when > 0
    function _isOwner(address _claimant, uint40 _cutieId) internal view returns (bool)
    {
        return cutieIndexToOwner[_cutieId] == _claimant;
    }

    /// @dev Checks if a given address currently has transferApproval for a certain Cutie.
    /// @param _claimant the address we are confirming the cutie is approved for.
    /// @param _cutieId cutie id, only valid when > 0
    function _approvedFor(address _claimant, uint40 _cutieId) internal view returns (bool)
    {
        return cutieIndexToApproved[_cutieId] == _claimant;
    }

    /// @dev Marks an address as being approved for transferFrom(), overwriting any previous
    ///  approval. Setting _approved to address(0) clears all transfer approval.
    ///  NOTE: _approve() does NOT send the Approval event. This is done on purpose:
    ///  _approve() and transferFrom() are used together for putting Cuties on auction. 
    ///  There is no value in spamming the log with Approval events in that case.
    function _approve(uint40 _cutieId, address _approved) internal
    {
        cutieIndexToApproved[_cutieId] = _approved;
    }

    /// @notice Returns the number of Cuties owned by a specific address.
    /// @param _owner The owner address to check.
    /// @dev Required for ERC-721 compliance
    function balanceOf(address _owner) external view returns (uint256 count)
    {
        return ownershipTokenCount[_owner];
    }

    /// @notice Transfers a Cutie to another address. When transferring to a smart
    ///  contract, ensure that it is aware of ERC-721 (or
    ///  BlockchainCuties specifically), otherwise the Cutie may be lost forever.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _cutieId The ID of the Cutie to transfer.
    /// @dev Required for ERC-721 compliance.
    function transfer(address _to, uint256 _cutieId) external whenNotPaused canBeStoredIn40Bits(_cutieId)
    {
        // You can only send your own cutie.
        require(_isOwner(msg.sender, uint40(_cutieId)));

        // Reassign ownership, clear pending approvals, emit Transfer event.
        _transfer(msg.sender, _to, uint40(_cutieId));
    }

    /// @notice Grant another address the right to transfer a perticular Cutie via transferFrom().
    /// This flow is preferred for transferring NFTs to contracts.
    /// @param _to The address to be granted transfer approval. Pass address(0) to clear all approvals.
    /// @param _cutieId The ID of the Cutie that can be transferred if this call succeeds.
    /// @dev Required for ERC-721 compliance.
    function approve(address _to, uint256 _cutieId) external whenNotPaused canBeStoredIn40Bits(_cutieId)
    {
        // Only cutie's owner can grant transfer approval.
        require(_isOwner(msg.sender, uint40(_cutieId)));

        // Registering approval replaces any previous approval.
        _approve(uint40(_cutieId), _to);

        // Emit approval event.
        emit Approval(msg.sender, _to, _cutieId);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address.
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) 
        external whenNotPaused canBeStoredIn40Bits(_tokenId)
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_to != address(saleMarket));
        require(_to != address(breedingMarket));
       
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender));
        require(_isOwner(_from, uint40(_tokenId)));

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, uint40(_tokenId));
        ERC721TokenReceiver (_to).onERC721Received(_from, _tokenId, data);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to ""
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) 
        external whenNotPaused canBeStoredIn40Bits(_tokenId)
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_to != address(saleMarket));
        require(_to != address(breedingMarket));
       
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender));
        require(_isOwner(_from, uint40(_tokenId)));

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, uint40(_tokenId));
    }

    /// @notice Transfer a Cutie owned by another address, for which the calling address
    ///  has been granted transfer approval by the owner.
    /// @param _from The address that owns the Cutie to be transfered.
    /// @param _to Any address, including the caller address, can take ownership of the Cutie.
    /// @param _tokenId The ID of the Cutie to be transferred.
    /// @dev Required for ERC-721 compliance.
    function transferFrom(address _from, address _to, uint256 _tokenId) 
        external whenNotPaused canBeStoredIn40Bits(_tokenId) 
    {
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender));
        require(_isOwner(_from, uint40(_tokenId)));

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, uint40(_tokenId));
    }

    /// @notice Returns the address currently assigned ownership of a given Cutie.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _cutieId)
        external
        view
        canBeStoredIn40Bits(_cutieId)
        returns (address owner)
    {
        owner = cutieIndexToOwner[uint40(_cutieId)];

        require(owner != address(0));
    }

    /// @notice Returns the nth Cutie assigned to an address, with n specified by the
    ///  _index argument.
    /// @param _owner The owner of the Cuties we are interested in.
    /// @param _index The zero-based index of the cutie within the owner's list of cuties.
    ///  Must be less than balanceOf(_owner).
    /// @dev This method must not be called by smart contract code. It will almost
    ///  certainly blow past the block gas limit once there are a large number of
    ///  Cuties in existence. Exists only to allow off-chain queries of ownership.
    ///  Optional method for ERC-721.
    function tokenOfOwnerByIndex(address _owner, uint256 _index)
        external
        view
        returns (uint256 cutieId)
    {
        uint40 count = 0;
        for (uint40 i = 1; i <= _totalSupply(); ++i) {
            if (cutieIndexToOwner[i] == _owner) {
                if (count == _index) {
                    return i;
                } else {
                    count++;
                }
            }
        }
        revert();
    }

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external pure returns (uint256)
    {
        return _index;
    }

    /// @dev A mapping from Cuties owner (account) to an address that has been approved to call
    ///  transferFrom() for all cuties, owned by owner.
    ///  Only one approved address is permitted for each account for transfer
    ///  at any time. A zero value means there is no outstanding approval.
    mapping (address => address) public addressToApprovedAll;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all your asset.
    /// @dev Emits the ApprovalForAll event
    /// @param _operator Address to add to the set of authorized operators.
    /// @param _approved True if the operators is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external
    {
        if (_approved)
        {
            addressToApprovedAll[msg.sender] = _operator;
        }
        else
        {
            delete addressToApprovedAll[msg.sender];
        }
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) 
        external view canBeStoredIn40Bits(_tokenId) 
        returns (address)
    {
        require(_tokenId <= _totalSupply());

        if (cutieIndexToApproved[uint40(_tokenId)] != address(0))
        {
            return cutieIndexToApproved[uint40(_tokenId)];
        }

        address owner = cutieIndexToOwner[uint40(_tokenId)];
        return addressToApprovedAll[owner];
    }

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool)
    {
        return addressToApprovedAll[_owner] == _operator;
    }

    function _isApprovedForAll(address _owner, address _operator) internal view returns (bool)
    {
        return addressToApprovedAll[_owner] == _operator;
    }

    ConfigInterface public config;

    /// @dev Update the address of the config contract.
    /// @param _address An address of a ConfigInterface contract instance to be used from this point forward.
    function setConfigAddress(address _address) public onlyOwner
    {
        ConfigInterface candidateContract = ConfigInterface(_address);

        require(candidateContract.isConfig());

        // Set the new contract address
        config = candidateContract;
    }

    function getCooldownIndexFromGeneration(uint16 _generation) internal view returns (uint16)
    {
        return config.getCooldownIndexFromGeneration(_generation);
    }

    /// @dev An internal method that creates a new cutie and stores it. This
    ///  method does not check anything and should only be called when the
    ///  input data is valid for sure. Will generate both a Birth event
    ///  and a Transfer event.
    /// @param _momId The cutie ID of the mom of this cutie (zero for gen0)
    /// @param _dadId The cutie ID of the dad of this cutie (zero for gen0)
    /// @param _generation The generation number of this cutie, must be computed by caller.
    /// @param _genes The cutie's genetic code.
    /// @param _owner The initial owner of this cutie, must be non-zero (except for the unCutie, ID 0)
    function _createCutie(
        uint40 _momId,
        uint40 _dadId,
        uint16 _generation,
        uint16 _cooldownIndex,
        uint256 _genes,
        address _owner,
        uint40 _birthTime
    )
        internal
        returns (uint40)
    {
        Cutie memory _cutie = Cutie({
            genes: _genes, 
            birthTime: _birthTime, 
            cooldownEndTime: 0, 
            momId: _momId, 
            dadId: _dadId, 
            cooldownIndex: _cooldownIndex, 
            generation: _generation,
            optional: 0
        });
        uint256 newCutieId256 = cuties.push(_cutie) - 1;

        // Check if id can fit into 40 bits
        require(newCutieId256 <= 0xFFFFFFFFFF);

        uint40 newCutieId = uint40(newCutieId256);

        // emit the birth event
        emit Birth(_owner, newCutieId, _cutie.momId, _cutie.dadId, _cutie.genes);

        // This will assign ownership, as well as emit the Transfer event as
        // per ERC721 draft
        _transfer(0, _owner, newCutieId);

        return newCutieId;
    }
  
    /// @notice Returns all the relevant information about a certain cutie.
    /// @param _id The ID of the cutie of interest.
    function getCutie(uint40 _id)
        external
        view
        returns (
        uint256 genes,
        uint40 birthTime,
        uint40 cooldownEndTime,
        uint40 momId,
        uint40 dadId,
        uint16 cooldownIndex,
        uint16 generation
    ) {
        Cutie storage cutie = cuties[_id];

        genes = cutie.genes;
        birthTime = cutie.birthTime;
        cooldownEndTime = cutie.cooldownEndTime;
        momId = cutie.momId;
        dadId = cutie.dadId;
        cooldownIndex = cutie.cooldownIndex;
        generation = cutie.generation;
    }    
    
    /// @dev Assigns ownership of a particular Cutie to an address.
    function _transfer(address _from, address _to, uint40 _cutieId) internal {
        // since the number of cuties is capped to 2^40
        // there is no way to overflow this
        ownershipTokenCount[_to]++;
        // transfer ownership
        cutieIndexToOwner[_cutieId] = _to;
        // When creating new cuties _from is 0x0, but we cannot account that address.
        if (_from != address(0)) {
            ownershipTokenCount[_from]--;
            // once the cutie is transferred also clear breeding allowances
            delete sireAllowedToAddress[_cutieId];
            // clear any previously approved ownership exchange
            delete cutieIndexToApproved[_cutieId];
        }
        // Emit the transfer event.
        emit Transfer(_from, _to, _cutieId);
    }

    /// @dev For transferring a cutie owned by this contract to the specified address.
    ///  Used to rescue lost cuties. (There is no "proper" flow where this contract
    ///  should be the owner of any Cutie. This function exists for us to reassign
    ///  the ownership of Cuties that users may have accidentally sent to our address.)
    /// @param _cutieId - ID of cutie
    /// @param _recipient - Address to send the cutie to
    function restoreCutieToAddress(uint40 _cutieId, address _recipient) public onlyOperator whenNotPaused {
        require(_isOwner(this, _cutieId));
        _transfer(this, _recipient, _cutieId);
    }

    address ownerAddress;
    address operatorAddress;

    bool public paused = false;

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

    function setOwner(address _newOwner) public onlyOwner
    {
        require(_newOwner != address(0));

        ownerAddress = _newOwner;
    }

    modifier onlyOperator() {
        require(msg.sender == operatorAddress || msg.sender == ownerAddress);
        _;
    }

    function setOperator(address _newOperator) public onlyOwner {
        require(_newOperator != address(0));

        operatorAddress = _newOperator;
    }

    modifier whenNotPaused()
    {
        require(!paused);
        _;
    }

    modifier whenPaused
    {
        require(paused);
        _;
    }

    function pause() public onlyOwner whenNotPaused
    {
        paused = true;
    }

    string public metadataUrlPrefix = "https://blockchaincuties.co/cutie/";
    string public metadataUrlSuffix = ".svg";

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string infoUrl)
    {
        return 
            concat(toSlice(metadataUrlPrefix), 
                toSlice(concat(toSlice(uintToString(_tokenId)), toSlice(metadataUrlSuffix))));
    }

    function setMetadataUrl(string _metadataUrlPrefix, string _metadataUrlSuffix) public onlyOwner
    {
        metadataUrlPrefix = _metadataUrlPrefix;
        metadataUrlSuffix = _metadataUrlSuffix;
    }


    mapping(address => PluginInterface) public plugins;
    PluginInterface[] public pluginsArray;
    mapping(uint40 => address) public usedSignes;
    uint40 public minSignId;

    event GenesChanged(uint40 indexed cutieId, uint256 oldValue, uint256 newValue);
    event CooldownEndTimeChanged(uint40 indexed cutieId, uint40 oldValue, uint40 newValue);
    event CooldownIndexChanged(uint40 indexed cutieId, uint16 ololdValue, uint16 newValue);
    event GenerationChanged(uint40 indexed cutieId, uint16 oldValue, uint16 newValue);
    event OptionalChanged(uint40 indexed cutieId, uint64 oldValue, uint64 newValue);
    event SignUsed(uint40 signId, address sender);
    event MinSignSet(uint40 signId);

    /// @dev Sets the reference to the plugin contract.
    /// @param _address - Address of plugin contract.
    function addPlugin(address _address) public onlyOwner
    {
        PluginInterface candidateContract = PluginInterface(_address);

        // verify that a contract is what we expect
        require(candidateContract.isPluginInterface());

        // Set the new contract address
        plugins[_address] = candidateContract;
        pluginsArray.push(candidateContract);
    }

    /// @dev Remove plugin and calls onRemove to cleanup
    function removePlugin(address _address) public onlyOwner
    {
        plugins[_address].onRemove();
        delete plugins[_address];

        uint256 kindex = 0;
        while (kindex < pluginsArray.length)
        {
            if (address(pluginsArray[kindex]) == _address)
            {
                pluginsArray[kindex] = pluginsArray[pluginsArray.length-1];
                pluginsArray.length--;
            }
            else
            {
                kindex++;
            }
        }
    }

    /// @dev Put a cutie up for plugin feature.
    function runPlugin(
        address _pluginAddress,
        uint40 _cutieId,
        uint256 _parameter
    )
        public
        whenNotPaused
        payable
    {
        // If cutie is already on any auction or in adventure, this will throw
        // because it will be owned by the other contract.
        // If _cutieId is 0, then cutie is not used on this feature.
        require(_cutieId == 0 || _isOwner(msg.sender, _cutieId));
        require(address(plugins[_pluginAddress]) != address(0));
        if (_cutieId > 0)
        {
            _approve(_cutieId, _pluginAddress);
        }

        // Plugin contract throws if inputs are invalid and clears
        // transfer after escrowing the cutie.
        plugins[_pluginAddress].run.value(msg.value)(
            _cutieId,
            _parameter,
            msg.sender
        );
    }

    /// @dev Called from plugin contract when using items as effect
    function getGenes(uint40 _id)
        public
        view
        returns (
        uint256 genes
    )
    {
        Cutie storage cutie = cuties[_id];
        genes = cutie.genes;
    }

    /// @dev Called from plugin contract when using items as effect
    function changeGenes(
        uint40 _cutieId,
        uint256 _genes)
        public
        whenNotPaused
    {
        // if caller is registered plugin contract
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.genes != _genes)
        {
            emit GenesChanged(_cutieId, cutie.genes, _genes);
            cutie.genes = _genes;
        }
    }

    function getCooldownEndTime(uint40 _id)
        public
        view
        returns (
        uint40 cooldownEndTime
    ) {
        Cutie storage cutie = cuties[_id];

        cooldownEndTime = cutie.cooldownEndTime;
    }

    function changeCooldownEndTime(
        uint40 _cutieId,
        uint40 _cooldownEndTime)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.cooldownEndTime != _cooldownEndTime)
        {
            emit CooldownEndTimeChanged(_cutieId, cutie.cooldownEndTime, _cooldownEndTime);
            cutie.cooldownEndTime = _cooldownEndTime;
        }
    }

    function getCooldownIndex(uint40 _id)
        public
        view
        returns (
        uint16 cooldownIndex
    ) {
        Cutie storage cutie = cuties[_id];

        cooldownIndex = cutie.cooldownIndex;
    }

    function changeCooldownIndex(
        uint40 _cutieId,
        uint16 _cooldownIndex)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.cooldownIndex != _cooldownIndex)
        {
            emit CooldownIndexChanged(_cutieId, cutie.cooldownIndex, _cooldownIndex);
            cutie.cooldownIndex = _cooldownIndex;
        }
    }

    function changeGeneration(
        uint40 _cutieId,
        uint16 _generation)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.generation != _generation)
        {
            emit GenerationChanged(_cutieId, cutie.generation, _generation);
            cutie.generation = _generation;
        }
    }

    function getGeneration(uint40 _id)
        public
        view
        returns (uint16 generation)
    {
        Cutie storage cutie = cuties[_id];
        generation = cutie.generation;
    }

    function changeOptional(
        uint40 _cutieId,
        uint64 _optional)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.optional != _optional)
        {
            emit OptionalChanged(_cutieId, cutie.optional, _optional);
            cutie.optional = _optional;
        }
    }

    function getOptional(uint40 _id)
        public
        view
        returns (uint64 optional)
    {
        Cutie storage cutie = cuties[_id];
        optional = cutie.optional;
    }

    /// @dev Common function to be used also in backend
    function hashArguments(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter)
        public pure returns (bytes32 msgHash)
    {
        msgHash = keccak256(_pluginAddress, _signId, _cutieId, _value, _parameter);
    }

    /// @dev Common function to be used also in backend
    function getSigner(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
        )
        public pure returns (address)
    {
        bytes32 msgHash = hashArguments(_pluginAddress, _signId, _cutieId, _value, _parameter);
        return ecrecover(msgHash, _v, _r, _s);
    }

    /// @dev Common function to be used also in backend
    function isValidSignature(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
        )
        public
        view
        returns (bool)
    {
        return getSigner(_pluginAddress, _signId, _cutieId, _value, _parameter, _v, _r, _s) == operatorAddress;
    }

    /// @dev Put a cutie up for plugin feature with signature.
    ///  Can be used for items equip, item sales and other features.
    ///  Signatures are generated by Operator role.
    function runPluginSigned(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    )
        public
        whenNotPaused
        payable
    {
        // If cutie is already on any auction or in adventure, this will throw
        // as it will be owned by the other contract.
        // If _cutieId is 0, then cutie is not used on this feature.
        require(_cutieId == 0 || _isOwner(msg.sender, _cutieId));
    
        require(address(plugins[_pluginAddress]) != address(0));    

        require (usedSignes[_signId] == address(0));
        require (_signId >= minSignId);
        // value can also be zero for free calls
        require (_value <= msg.value);

        require (isValidSignature(_pluginAddress, _signId, _cutieId, _value, _parameter, _v, _r, _s));
        
        usedSignes[_signId] = msg.sender;
        emit SignUsed(_signId, msg.sender);

        // Plugin contract throws if inputs are invalid and clears
        // transfer after escrowing the cutie.
        plugins[_pluginAddress].runSigned.value(_value)(
            _cutieId,
            _parameter,
            msg.sender
        );
    }

    /// @dev Sets minimal signId, than can be used.
    ///       All unused signatures less than signId will be cancelled on off-chain server
    ///       and unused items will be transfered back to owner.
    function setMinSign(uint40 _newMinSignId)
        public
        onlyOperator
    {
        require (_newMinSignId > minSignId);
        minSignId = _newMinSignId;
        emit MinSignSet(minSignId);
    }


    event BreedingApproval(address indexed _owner, address indexed _approved, uint256 _tokenId);

    // Set in case the core contract is broken and an upgrade is required
    address public upgradedContractAddress;

    function isCutieCore() pure public returns (bool) { return true; }

    /// @notice Creates the main BlockchainCuties smart contract instance.
    function BlockchainCutiesCore() public
    {
        // Starts paused.
        paused = true;

        // the creator of the contract is the initial owner
        ownerAddress = msg.sender;

        // the creator of the contract is also the initial operator
        operatorAddress = msg.sender;

        // start with the mythical cutie 0 - so there are no generation-0 parent issues
        _createCutie(0, 0, 0, 0, uint256(-1), address(0), 0);
    }

    event ContractUpgrade(address newContract);

    /// @dev Aimed to mark the smart contract as upgraded if there is a crucial
    ///  bug. This keeps track of the new contract and indicates that the new address is set. 
    /// Updating to the new contract address is up to the clients. (This contract will
    ///  be paused indefinitely if such an upgrade takes place.)
    /// @param _newAddress new address
    function setUpgradedAddress(address _newAddress) public onlyOwner whenPaused
    {
        require(_newAddress != address(0));
        upgradedContractAddress = _newAddress;
        emit ContractUpgrade(upgradedContractAddress);
    }

    /// @dev Import cuties from previous version of Core contract.
    /// @param _oldAddress Old core contract address
    /// @param _fromIndex (inclusive)
    /// @param _toIndex (inclusive)
    function migrate(address _oldAddress, uint40 _fromIndex, uint40 _toIndex) public onlyOwner whenPaused
    {
        require(_totalSupply() + 1 == _fromIndex);

        BlockchainCutiesCore old = BlockchainCutiesCore(_oldAddress);

        for (uint40 i = _fromIndex; i <= _toIndex; i++)
        {
            uint256 genes;
            uint40 birthTime;
            uint40 cooldownEndTime;
            uint40 momId;
            uint40 dadId;
            uint16 cooldownIndex;
            uint16 generation;            
            (genes, birthTime, cooldownEndTime, momId, dadId, cooldownIndex, generation) = old.getCutie(i);

            Cutie memory _cutie = Cutie({
                genes: genes, 
                birthTime: birthTime, 
                cooldownEndTime: cooldownEndTime, 
                momId: momId, 
                dadId: dadId, 
                cooldownIndex: cooldownIndex, 
                generation: generation,
                optional: 0
            });
            cuties.push(_cutie);
        }
    }

    /// @dev Import cuties from previous version of Core contract (part 2).
    /// @param _oldAddress Old core contract address
    /// @param _fromIndex (inclusive)
    /// @param _toIndex (inclusive)
    function migrate2(address _oldAddress, uint40 _fromIndex, uint40 _toIndex, address saleAddress, address breedingAddress) public onlyOwner whenPaused
    {
        BlockchainCutiesCore old = BlockchainCutiesCore(_oldAddress);
        MarketInterface oldSaleMarket = MarketInterface(saleAddress);
        MarketInterface oldBreedingMarket = MarketInterface(breedingAddress);

        for (uint40 i = _fromIndex; i <= _toIndex; i++)
        {
            address owner = old.ownerOf(i);

            if (owner == saleAddress)
            {
                (owner,,,,,) = oldSaleMarket.getAuctionInfo(i);
            }

            if (owner == breedingAddress)
            {
                (owner,,,,,) = oldBreedingMarket.getAuctionInfo(i);
            }
            _transfer(0, owner, i);
        }
    }

    /// @dev Override unpause so it requires upgradedContractAddress not set, because then the contract was upgraded.
    function unpause() public onlyOwner whenPaused
    {
        require(upgradedContractAddress == address(0));

        paused = false;
    }

    // Counts the number of cuties the contract owner has created.
    uint40 public promoCutieCreatedCount;
    uint40 public gen0CutieCreatedCount;
    uint40 public gen0Limit = 50000;
    uint40 public promoLimit = 5000;

    /// @dev Creates a new gen0 cutie with the given genes and
    ///  creates an auction for it.
    function createGen0Auction(uint256 _genes, uint128 startPrice, uint128 endPrice, uint40 duration) public onlyOperator
    {
        require(gen0CutieCreatedCount < gen0Limit);
        uint40 cutieId = _createCutie(0, 0, 0, 0, _genes, address(this), uint40(now));
        _approve(cutieId, saleMarket);

        saleMarket.createAuction(
            cutieId,
            startPrice,
            endPrice,
            duration,
            address(this)
        );

        gen0CutieCreatedCount++;
    }

    function createPromoCutie(uint256 _genes, address _owner) public onlyOperator
    {
        require(promoCutieCreatedCount < promoLimit);
        if (_owner == address(0)) {
             _owner = operatorAddress;
        }
        promoCutieCreatedCount++;
        gen0CutieCreatedCount++;
        _createCutie(0, 0, 0, 0, _genes, _owner, uint40(now));
    }

    /// @dev Put a cutie up for auction to be dad.
    ///  Performs checks to ensure the cutie can be dad, then
    ///  delegates to reverse auction.
    ///  Optional money amount can be sent to contract to feature auction.
    ///  Pricea are available on web.
    function createBreedingAuction(
        uint40 _cutieId,
        uint128 _startPrice,
        uint128 _endPrice,
        uint40 _duration
    )
        public
        whenNotPaused
        payable
    {
        // Auction contract checks input sizes
        // If cutie is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_isOwner(msg.sender, _cutieId));
        require(canBreed(_cutieId));
        _approve(_cutieId, breedingMarket);
        // breeding auction function is called if inputs are invalid and clears
        // transfer and sire approval after escrowing the cutie.
        breedingMarket.createAuction.value(msg.value)(
            _cutieId,
            _startPrice,
            _endPrice,
            _duration,
            msg.sender
        );
    }

    /// @dev Sets the reference to the breeding auction.
    /// @param _breedingAddress - Address of breeding market contract.
    /// @param _saleAddress - Address of sale market contract.
    function setMarketAddress(address _breedingAddress, address _saleAddress) public onlyOwner
    {
        //require(address(breedingMarket) == address(0));
        //require(address(saleMarket) == address(0));

        breedingMarket = MarketInterface(_breedingAddress);
        saleMarket = MarketInterface(_saleAddress);
    }

    /// @dev Completes a breeding auction by bidding.
    ///  Immediately breeds the winning mom with the dad on auction.
    /// @param _dadId - ID of the dad on auction.
    /// @param _momId - ID of the mom owned by the bidder.
    function bidOnBreedingAuction(
        uint40 _dadId,
        uint40 _momId
    )
        public
        payable
        whenNotPaused
        returns (uint256)
    {
        // Auction contract checks input sizes
        require(_isOwner(msg.sender, _momId));
        require(canBreed(_momId));
        require(_canMateViaMarketplace(_momId, _dadId));
        // Take breeding fee
        uint256 fee = getBreedingFee(_momId, _dadId);
        require(msg.value >= fee);

        // breeding auction will throw if the bid fails.
        breedingMarket.bid.value(msg.value - fee)(_dadId);
        return _breedWith(_momId, _dadId);
    }

    /// @dev Put a cutie up for auction.
    ///  Does some ownership trickery for creating auctions in one transaction.
    ///  Optional money amount can be sent to contract to feature auction.
    ///  Pricea are available on web.
    function createSaleAuction(
        uint40 _cutieId,
        uint128 _startPrice,
        uint128 _endPrice,
        uint40 _duration
    )
        public
        whenNotPaused
        payable
    {
        // Auction contract checks input sizes
        // If cutie is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_isOwner(msg.sender, _cutieId));
        _approve(_cutieId, saleMarket);
        // Sale auction throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the cutie.
        saleMarket.createAuction.value(msg.value)(
            _cutieId,
            _startPrice,
            _endPrice,
            _duration,
            msg.sender
        );
    }

    /// @dev The address of the sibling contract that is used to implement the genetic combination algorithm.
    GeneMixerInterface geneMixer;

    /// @dev Check if dad has authorized breeding with the mom. True if both dad
    ///  and mom have the same owner, or if the dad has given breeding permission to
    ///  the mom's owner (via approveBreeding()).
    function _isBreedingPermitted(uint40 _dadId, uint40 _momId) internal view returns (bool)
    {
        address momOwner = cutieIndexToOwner[_momId];
        address dadOwner = cutieIndexToOwner[_dadId];

        // Breeding is approved if they have same owner, or if the mom's owner was given
        // permission to breed with the dad.
        return (momOwner == dadOwner || sireAllowedToAddress[_dadId] == momOwner);
    }

    /// @dev Update the address of the genetic contract.
    /// @param _address An address of a GeneMixer contract instance to be used from this point forward.
    function setGeneMixerAddress(address _address) public onlyOwner
    {
        GeneMixerInterface candidateContract = GeneMixerInterface(_address);

        require(candidateContract.isGeneMixer());

        // Set the new contract address
        geneMixer = candidateContract;
    }

    /// @dev Checks that a given cutie is able to breed. Requires that the
    ///  current cooldown is finished (for dads)
    function _canBreed(Cutie _cutie) internal view returns (bool)
    {
        return _cutie.cooldownEndTime <= now;
    }

    /// @notice Grants approval to another user to sire with one of your Cuties.
    /// @param _addr The address that will be able to sire with your Cutie. Set to
    ///  address(0) to clear all breeding approvals for this Cutie.
    /// @param _dadId A Cutie that you own that _addr will now be able to dad with.
    function approveBreeding(address _addr, uint40 _dadId) public whenNotPaused
    {
        require(_isOwner(msg.sender, _dadId));
        sireAllowedToAddress[_dadId] = _addr;
        emit BreedingApproval(msg.sender, _addr, _dadId);
    }

    /// @dev Set the cooldownEndTime for the given Cutie, based on its current cooldownIndex.
    ///  Also increments the cooldownIndex (unless it has hit the cap).
    /// @param _cutie A reference to the Cutie in storage which needs its timer started.
    function _triggerCooldown(uint40 _cutieId, Cutie storage _cutie) internal
    {
        // Compute the end of the cooldown time, based on current cooldownIndex
        uint40 oldValue = _cutie.cooldownIndex;
        _cutie.cooldownEndTime = config.getCooldownEndTimeFromIndex(_cutie.cooldownIndex);
        emit CooldownEndTimeChanged(_cutieId, oldValue, _cutie.cooldownEndTime);

        // Increment the breeding count.
        if (_cutie.cooldownIndex + 1 < config.getCooldownIndexCount()) {
            uint16 oldValue2 = _cutie.cooldownIndex;
            _cutie.cooldownIndex++;
            emit CooldownIndexChanged(_cutieId, oldValue2, _cutie.cooldownIndex);
        }
    }

    /// @notice Checks that a certain cutie is not
    ///  in the middle of a breeding cooldown and is able to breed.
    /// @param _cutieId reference the id of the cutie, any user can inquire about it
    function canBreed(uint40 _cutieId)
        public
        view
        returns (bool)
    {
        require(_cutieId > 0);
        Cutie storage cutie = cuties[_cutieId];
        return _canBreed(cutie);
    }

    /// @dev Check if given mom and dad are a valid mating pair.
    function _canPairMate(
        Cutie storage _mom,
        uint40 _momId,
        Cutie storage _dad,
        uint40 _dadId
    )
        private
        view
        returns(bool)
    {
        // A Cutie can't breed with itself.
        if (_dadId == _momId) { 
            return false; 
        }

        // Cuties can't breed with their parents.
        if (_mom.momId == _dadId) {
            return false;
        }
        if (_mom.dadId == _dadId) {
            return false;
        }

        if (_dad.momId == _momId) {
            return false;
        }
        if (_dad.dadId == _momId) {
            return false;
        }

        // We can short circuit the sibling check (below) if either cat is
        // gen zero (has a mom ID of zero).
        if (_dad.momId == 0) {
            return true;
        }
        if (_mom.momId == 0) {
            return true;
        }

        // Cuties can't breed with full or half siblings.
        if (_dad.momId == _mom.momId) {
            return false;
        }
        if (_dad.momId == _mom.dadId) {
            return false;
        }
        if (_dad.dadId == _mom.momId) {
            return false;
        }
        if (_dad.dadId == _mom.dadId) {
            return false;
        }

        if (geneMixer.canBreed(_momId, _mom.genes, _dadId, _dad.genes)) {
            return true;
        }
        return false;
    }

    /// @notice Checks to see if two cuties can breed together (checks both
    ///  ownership and breeding approvals, but does not check if both cuties are ready for
    ///  breeding).
    /// @param _momId The ID of the proposed mom.
    /// @param _dadId The ID of the proposed dad.
    function canBreedWith(uint40 _momId, uint40 _dadId)
        public
        view
        returns(bool)
    {
        require(_momId > 0);
        require(_dadId > 0);
        Cutie storage mom = cuties[_momId];
        Cutie storage dad = cuties[_dadId];
        return _canPairMate(mom, _momId, dad, _dadId) && _isBreedingPermitted(_dadId, _momId);
    }
    
    /// @dev Internal check to see if a given dad and mom are a valid mating pair for
    ///  breeding via market (this method doesn't check ownership and if mating is allowed).
    function _canMateViaMarketplace(uint40 _momId, uint40 _dadId)
        internal
        view
        returns (bool)
    {
        Cutie storage mom = cuties[_momId];
        Cutie storage dad = cuties[_dadId];
        return _canPairMate(mom, _momId, dad, _dadId);
    }

    function getBreedingFee(uint40 _momId, uint40 _dadId)
        public
        view
        returns (uint256)
    {
        return config.getBreedingFee(_momId, _dadId);
    }


    /// @notice Breed cuties that you own, or for which you
    ///  have previously been given Breeding approval. Will either make your cutie give birth, or will
    ///  fail.
    /// @param _momId The ID of the Cutie acting as mom (will end up give birth if successful)
    /// @param _dadId The ID of the Cutie acting as dad (will begin its breeding cooldown if successful)
    function breedWith(uint40 _momId, uint40 _dadId) 
        public
        whenNotPaused
        payable
        returns (uint40)
    {
        // Caller must own the mom.
        require(_isOwner(msg.sender, _momId));

        // Neither dad nor mom can be on auction during
        // breeding.
        // For mom: The caller of this function can't be the owner of the mom
        //   because the owner of a Cutie on auction is the auction house, and the
        //   auction house will never call breedWith().
        // For dad: Similarly, a dad on auction will be owned by the auction house
        //   and the act of transferring ownership will have cleared any outstanding
        //   breeding approval.
        // Thus we don't need check if either cutie
        // is on auction.

        // Check that mom and dad are both owned by caller, or that the dad
        // has given breeding permission to caller (i.e. mom's owner).
        // Will fail for _dadId = 0
        require(_isBreedingPermitted(_dadId, _momId));

        // Check breeding fee
        require(getBreedingFee(_momId, _dadId) <= msg.value);

        // Grab a reference to the potential mom
        Cutie storage mom = cuties[_momId];

        // Make sure mom's cooldown isn't active, or in the middle of a breeding cooldown
        require(_canBreed(mom));

        // Grab a reference to the potential dad
        Cutie storage dad = cuties[_dadId];

        // Make sure dad cooldown isn't active, or in the middle of a breeding cooldown
        require(_canBreed(dad));

        // Test that these cuties are a valid mating pair.
        require(_canPairMate(
            mom,
            _momId,
            dad,
            _dadId
        ));

        return _breedWith(_momId, _dadId);
    }

    /// @dev Internal utility function to start breeding, assumes that all breeding
    ///  requirements have been checked.
    function _breedWith(uint40 _momId, uint40 _dadId) internal returns (uint40)
    {
        // Grab a reference to the Cuties from storage.
        Cutie storage dad = cuties[_dadId];
        Cutie storage mom = cuties[_momId];

        // Trigger the cooldown for both parents.
        _triggerCooldown(_dadId, dad);
        _triggerCooldown(_momId, mom);

        // Clear breeding permission for both parents.
        delete sireAllowedToAddress[_momId];
        delete sireAllowedToAddress[_dadId];

        // Check that the mom is a valid cutie.
        require(mom.birthTime != 0);

        // Determine the higher generation number of the two parents
        uint16 babyGen = config.getBabyGen(mom.generation, dad.generation);

        // Call the gene mixing operation.
        uint256 childGenes = geneMixer.mixGenes(mom.genes, dad.genes);

        // Make the new cutie
        address owner = cutieIndexToOwner[_momId];
        uint40 cutieId = _createCutie(_momId, _dadId, babyGen, getCooldownIndexFromGeneration(babyGen), childGenes, owner, mom.cooldownEndTime);

        // return the new cutie's ID
        return cutieId;
    }

    mapping(address => uint40) isTutorialPetUsed;

    /// @dev Completes a breeding tutorial cutie (non existing in blockchain)
    ///  with auction by bidding. Immediately breeds with dad on auction.
    /// @param _dadId - ID of the dad on auction.
    function bidOnBreedingAuctionTutorial(
        uint40 _dadId
    )
        public
        payable
        whenNotPaused
        returns (uint)
    {
        require(isTutorialPetUsed[msg.sender] == 0);

        // Take breeding fee
        uint256 fee = getBreedingFee(0, _dadId);
        require(msg.value >= fee);

        // breeding auction will throw if the bid fails.
        breedingMarket.bid.value(msg.value - fee)(_dadId);

        // Grab a reference to the Cuties from storage.
        Cutie storage dad = cuties[_dadId];

        // Trigger the cooldown for parent.
        _triggerCooldown(_dadId, dad);

        // Clear breeding permission for parent.
        delete sireAllowedToAddress[_dadId];

        uint16 babyGen = config.getTutorialBabyGen(dad.generation);

        // tutorial pet genome is zero
        uint256 childGenes = geneMixer.mixGenes(0x0, dad.genes);

        // tutorial pet id is zero
        uint40 cutieId = _createCutie(0, _dadId, babyGen, getCooldownIndexFromGeneration(babyGen), childGenes, msg.sender, 12);

        isTutorialPetUsed[msg.sender] = cutieId;

        // return the new cutie's ID
        return cutieId;
    }

    address party1address;
    address party2address;
    address party3address;
    address party4address;
    address party5address;

    /// @dev Setup project owners
    function setParties(address _party1, address _party2, address _party3, address _party4, address _party5) public onlyOwner
    {
        require(_party1 != address(0));
        require(_party2 != address(0));
        require(_party3 != address(0));
        require(_party4 != address(0));
        require(_party5 != address(0));

        party1address = _party1;
        party2address = _party2;
        party3address = _party3;
        party4address = _party4;
        party5address = _party5;
    }

    /// @dev Reject all Ether which is not from game contracts from being sent here.
    function() external payable {
        require(
            msg.sender == address(saleMarket) ||
            msg.sender == address(breedingMarket) ||
            address(plugins[msg.sender]) != address(0)
        );
    }

    /// @dev The balance transfer from the market and plugins contract
    /// to the CutieCore contract.
    function withdrawBalances() external
    {
        require(
            msg.sender == ownerAddress || 
            msg.sender == operatorAddress);

        saleMarket.withdrawEthFromBalance();
        breedingMarket.withdrawEthFromBalance();
        for (uint32 i = 0; i < pluginsArray.length; ++i)        
        {
            pluginsArray[i].withdraw();
        }
    }

    /// @dev The balance transfer from CutieCore contract to project owners
    function withdrawEthFromBalance() external
    {
        require(
            msg.sender == party1address ||
            msg.sender == party2address ||
            msg.sender == party3address ||
            msg.sender == party4address ||
            msg.sender == party5address ||
            msg.sender == ownerAddress || 
            msg.sender == operatorAddress);

        require(party1address != 0);
        require(party2address != 0);
        require(party3address != 0);
        require(party4address != 0);
        require(party5address != 0);

        uint256 total = address(this).balance;

        party1address.transfer(total*105/1000);
        party2address.transfer(total*105/1000);
        party3address.transfer(total*140/1000);
        party4address.transfer(total*140/1000);
        party5address.transfer(total*510/1000);
    }

/*
 * @title String & slice utility library for Solidity contracts.
 * @author Nick Johnson <[email protected]>
 *
 * @dev Functionality in this library is largely implemented using an
 *      abstraction called a 'slice'. A slice represents a part of a string -
 *      anything from the entire string to a single character, or even no
 *      characters at all (a 0-length slice). Since a slice only has to specify
 *      an offset and a length, copying and manipulating slices is a lot less
 *      expensive than copying and manipulating the strings they reference.
 *
 *      To further reduce gas costs, most functions on slice that need to return
 *      a slice modify the original one instead of allocating a new one; for
 *      instance, `s.split(".")` will return the text up to the first '.',
 *      modifying s to only contain the remainder of the string after the '.'.
 *      In situations where you do not want to modify the original slice, you
 *      can make a copy first with `.copy()`, for example:
 *      `s.copy().split(".")`. Try and avoid using this idiom in loops; since
 *      Solidity has no memory management, it will result in allocating many
 *      short-lived slices that are later discarded.
 *
 *      Functions that return two slices come in two versions: a non-allocating
 *      version that takes the second slice as an argument, modifying it in
 *      place, and an allocating version that allocates and returns the second
 *      slice; see `nextRune` for example.
 *
 *      Functions that have to copy string data will return strings rather than
 *      slices; these can be cast back to slices for further processing if
 *      required.
 *
 *      For convenience, some functions are provided with non-modifying
 *      variants that create a new slice and return both; for instance,
 *      `s.splitNew('.')` leaves s unmodified, and returns two values
 *      corresponding to the left and right parts of the string.
 */

    struct slice
    {
        uint _len;
        uint _ptr;
    }

    /*
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string self) internal pure returns (slice)
    {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    function memcpy(uint dest, uint src, uint len) private pure
    {
        // Copy word-length chunks while possible
        for(; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    /*
     * @dev Returns a newly allocated string containing the concatenation of
     *      `self` and `other`.
     * @param self The first slice to concatenate.
     * @param other The second slice to concatenate.
     * @return The concatenation of the two strings.
     */
    function concat(slice self, slice other) internal pure returns (string)
    {
        string memory ret = new string(self._len + other._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }
        memcpy(retptr, self._ptr, self._len);
        memcpy(retptr + self._len, other._ptr, other._len);
        return ret;
    }


    function uintToString(uint256 a) internal pure returns (string result)
    {
        string memory r = "";
        do
        {
            uint b = a % 10;
            a /= 10;

            string memory c = "";

            if (b == 0) c = "0";
            else if (b == 1) c = "1";
            else if (b == 2) c = "2";
            else if (b == 3) c = "3";
            else if (b == 4) c = "4";
            else if (b == 5) c = "5";
            else if (b == 6) c = "6";
            else if (b == 7) c = "7";
            else if (b == 8) c = "8";
            else if (b == 9) c = "9";

            r = concat(toSlice(c), toSlice(r));
        }
        while (a > 0);
        result = r;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"gen0CutieCreatedCount","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_cutieId","type":"uint40"}],"name":"canBreed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_party1","type":"address"},{"name":"_party2","type":"address"},{"name":"_party3","type":"address"},{"name":"_party4","type":"address"},{"name":"_party5","type":"address"}],"name":"setParties","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_cutieId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradedContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressToApprovedAll","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"cutieIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dadId","type":"uint40"}],"name":"bidOnBreedingAuctionTutorial","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"_owner","type":"address"}],"name":"createPromoCutie","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCooldownIndex","outputs":[{"name":"cooldownIndex","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"cutieId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getOptional","outputs":[{"name":"optional","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newMinSignId","type":"uint40"}],"name":"setMinSign","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_breedingAddress","type":"address"},{"name":"_saleAddress","type":"address"}],"name":"setMarketAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"isValidSignature","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"plugins","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isCutieCore","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_startPrice","type":"uint128"},{"name":"_endPrice","type":"uint128"},{"name":"_duration","type":"uint40"}],"name":"createSaleAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"sireAllowedToAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"breedingMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_generation","type":"uint16"}],"name":"changeGeneration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setUpgradedAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_cutieId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"getBreedingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_optional","type":"uint64"}],"name":"changeOptional","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEthFromBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_startPrice","type":"uint128"},{"name":"_endPrice","type":"uint128"},{"name":"_duration","type":"uint40"}],"name":"createBreedingAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"config","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_metadataUrlPrefix","type":"string"},{"name":"_metadataUrlSuffix","type":"string"}],"name":"setMetadataUrl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_oldAddress","type":"address"},{"name":"_fromIndex","type":"uint40"},{"name":"_toIndex","type":"uint40"},{"name":"saleAddress","type":"address"},{"name":"breedingAddress","type":"address"}],"name":"migrate2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setConfigAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_cutieId","type":"uint40"},{"name":"_parameter","type":"uint256"}],"name":"runPlugin","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"promoLimit","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minSignId","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"getSigner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getGenes","outputs":[{"name":"genes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"runPluginSigned","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getGeneration","outputs":[{"name":"generation","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"startPrice","type":"uint128"},{"name":"endPrice","type":"uint128"},{"name":"duration","type":"uint40"}],"name":"createGen0Auction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removePlugin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_recipient","type":"address"}],"name":"restoreCutieToAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_cutieId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"cutieIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOperator","type":"address"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"usedSignes","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"}],"name":"hashArguments","outputs":[{"name":"msgHash","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"breedWith","outputs":[{"name":"","type":"uint40"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cuties","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint40"},{"name":"cooldownEndTime","type":"uint40"},{"name":"momId","type":"uint40"},{"name":"dadId","type":"uint40"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"},{"name":"optional","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_cooldownEndTime","type":"uint40"}],"name":"changeCooldownEndTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"metadataUrlPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"infoUrl","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_cooldownIndex","type":"uint16"}],"name":"changeCooldownIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"metadataUrlSuffix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addPlugin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"canBreedWith","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"promoCutieCreatedCount","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_genes","type":"uint256"}],"name":"changeGenes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setGeneMixerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCutie","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint40"},{"name":"cooldownEndTime","type":"uint40"},{"name":"momId","type":"uint40"},{"name":"dadId","type":"uint40"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gen0Limit","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldAddress","type":"address"},{"name":"_fromIndex","type":"uint40"},{"name":"_toIndex","type":"uint40"}],"name":"migrate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"pluginsArray","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dadId","type":"uint40"},{"name":"_momId","type":"uint40"}],"name":"bidOnBreedingAuction","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCooldownEndTime","outputs":[{"name":"cooldownEndTime","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_dadId","type":"uint40"}],"name":"approveBreeding","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":false,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"momId","type":"uint40"},{"indexed":false,"name":"dadId","type":"uint40"},{"indexed":false,"name":"genes","type":"uint256"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint256"},{"indexed":false,"name":"newValue","type":"uint256"}],"name":"GenesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint40"},{"indexed":false,"name":"newValue","type":"uint40"}],"name":"CooldownEndTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"ololdValue","type":"uint16"},{"indexed":false,"name":"newValue","type":"uint16"}],"name":"CooldownIndexChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint16"},{"indexed":false,"name":"newValue","type":"uint16"}],"name":"GenerationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint64"},{"indexed":false,"name":"newValue","type":"uint64"}],"name":"OptionalChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"signId","type":"uint40"},{"indexed":false,"name":"sender","type":"address"}],"name":"SignUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"signId","type":"uint40"}],"name":"MinSignSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"BreedingApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]

60606040818152600a805460a060020a60ff02191690555190810160405280602281526020017f68747470733a2f2f626c6f636b636861696e6375746965732e636f2f6375746981526020017f652f000000000000000000000000000000000000000000000000000000000000815250600b90805162000084929160200190620004e0565b5060408051908101604052600481527f2e737667000000000000000000000000000000000000000000000000000000006020820152600c908051620000ce929160200190620004e0565b506011805469ffffffffff0000000000191666c350000000000017605060020a64ffffffffff0219166b13880000000000000000000017905534156200011357600080fd5b600a805460098054600160a060020a033316600160a060020a0319918216811790925560a060020a60ff02199092167401000000000000000000000000000000000000000017919091161790556200018260008080806000198180640100000000620047076200018982021704565b5062000620565b60006200019562000565565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e082018190528054919450600191808301620001fe8382620005a9565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff92909216780100000000000000000000000000000000000000000000000002600160c060020a039092169190911790555003915064ffffffffff8211156200035257600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a2620003db6000878364010000000062004975620003e982021704565b9a9950505050505050505050565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a03191690911790558316156200048c57600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200052357805160ff191683800117855562000553565b8280016001018555821562000553579182015b828111156200055357825182559160200191906001019062000536565b5062000561929150620005dd565b5090565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b815481835581811511620005d857600202816002028360005260206000209182019101620005d89190620005fd565b505050565b620005fa91905b80821115620005615760008155600101620005e4565b90565b620005fa91905b8082111562000561576000808255600182015560020162000604565b61551e80620006306000396000f3006060604052600436106103ac5763ffffffff60e060020a60003504166219a46b811461040857806301ffc9a71461043557806305910b911461047e57806306fdde031461049b578063081812fc1461052557806308ba7ee714610557578063095ea7b31461058e5780630da2e088146105b05780630dca63e8146105c357806310e9678b146105e257806313af4035146105ff57806318160ddd1461061e5780631bbfce0e14610643578063210fcbf61461065557806323b872dd146106775780632917f1621461069f5780632f745c59146106d35780633e6d4e12146106f55780633f4ba83a1461072f57806340a92f0f1461074257806342842e0e1461075f578063430c73c51461078757806345c7a092146107ac5780634b12e643146107f65780634d6a813a146108155780634f6ccce71461082857806350bc6bba1461083e578063551799131461086b5780635a390a5f146108885780635a3f88f01461089b5780635c975abb146108bf5780635f24f6fe146108d25780636352211e146108f157806366dc860a146109075780636c2959361461092a5780636ccbb0ab1461095457806370a0823114610967578063776247c41461098657806378a6c6d21461099957806379502c55146109c657806379edfa7d146109d9578063839daf1d14610a6c57806383a12de914610aaa5780638456cb5914610ac9578063887e0c0714610adc578063889231c114610afd5780638f9a57ef14610b1057806394e50e7a14610b2357806395d89b4114610b6d578063999d394714610b805780639ad73f2014610b9d5780639c91ae2014610bdc5780639de8302f14610bf9578063a22cb46514610c2b578063a4d95b6414610c4f578063a86ee74614610c6e578063a9059cbb14610c97578063b1d9549714610cb9578063b3ab15fb14610cd6578063b5113bf614610cf5578063b88d4fde14610d12578063bdad811214610d49578063c30bc5ef14610d87578063c44f217414610d9f578063c479142114610e16578063c7047fa714610e39578063c87b56dd14610e4c578063cf7e69f814610e62578063d4d6d36614610e86578063d8867fc814610e99578063d997933f14610eb8578063e09ef83e14610edb578063e1af915d14610eee578063e205842414610f0e578063e33607da14610f2d578063e39bdfab14610f40578063e515a4d114610fab578063e985e9c514610fbe578063edc9f18214610fe3578063f3ca087314611012578063f3cb180514611028578063f6dfcff714611040578063fb43b2a21461105d575b60055433600160a060020a03908116911614806103d7575060065433600160a060020a039081169116145b806103fb5750600160a060020a033381166000908152600d60205260409020541615155b151561040657600080fd5b005b341561041357600080fd5b61041b611086565b60405164ffffffffff909116815260200160405180910390f35b341561044057600080fd5b61046a7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516611093565b604051901515815260200160405180910390f35b341561048957600080fd5b61046a64ffffffffff60043516611155565b34156104a657600080fd5b6104ae61122e565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156104ea5780820151838201526020016104d2565b50505050905090810190601f1680156105175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053057600080fd5b61053b600435611270565b604051600160a060020a03909116815260200160405180910390f35b341561056257600080fd5b610406600160a060020a0360043581169060243581169060443581169060643581169060843516611325565b341561059957600080fd5b610406600160a060020a0360043516602435611408565b34156105bb57600080fd5b61053b61149d565b34156105ce57600080fd5b61053b600160a060020a03600435166114b5565b34156105ed57600080fd5b61053b64ffffffffff600435166114d0565b341561060a57600080fd5b610406600160a060020a03600435166114eb565b341561062957600080fd5b61063161153d565b60405190815260200160405180910390f35b61063164ffffffffff60043516611547565b341561066057600080fd5b610406600435600160a060020a03602435166117a0565b341561068257600080fd5b610406600160a060020a03600435811690602435166044356118c2565b34156106aa57600080fd5b6106bc64ffffffffff60043516611937565b60405161ffff909116815260200160405180910390f35b34156106de57600080fd5b610631600160a060020a0360043516602435611976565b341561070057600080fd5b61071264ffffffffff600435166119f5565b60405167ffffffffffffffff909116815260200160405180910390f35b341561073a57600080fd5b610406611a3a565b341561074d57600080fd5b61040664ffffffffff60043516611aac565b341561076a57600080fd5b610406600160a060020a0360043581169060243516604435611b57565b341561079257600080fd5b610406600160a060020a0360043581169060243516611bed565b34156107b757600080fd5b61046a600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435611c36565b341561080157600080fd5b61053b600160a060020a0360043516611c6c565b341561082057600080fd5b61046a611c87565b341561083357600080fd5b61063160043561126d565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516611c8c565b341561087657600080fd5b61053b64ffffffffff60043516611d67565b341561089357600080fd5b61053b611d82565b34156108a657600080fd5b61040664ffffffffff6004351661ffff60243516611d91565b34156108ca57600080fd5b61046a611ea2565b34156108dd57600080fd5b610406600160a060020a0360043516611eb2565b34156108fc57600080fd5b61053b600435611f78565b341561091257600080fd5b61063164ffffffffff60043581169060243516611fbb565b341561093557600080fd5b61040664ffffffffff6004351667ffffffffffffffff60243516612031565b341561095f57600080fd5b610406612159565b341561097257600080fd5b610631600160a060020a03600435166122c0565b341561099157600080fd5b6104066122db565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516612533565b34156109d157600080fd5b61053b61260b565b34156109e457600080fd5b61040660046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061261a95505050505050565b3415610a7757600080fd5b610406600160a060020a0360043581169064ffffffffff602435811691604435909116906064358116906084351661265c565b3415610ab557600080fd5b610406600160a060020a0360043516612886565b3415610ad457600080fd5b610406612928565b610406600160a060020a036004351664ffffffffff60243516604435612980565b3415610b0857600080fd5b61041b612a8e565b3415610b1b57600080fd5b61041b612aa2565b3415610b2e57600080fd5b61053b600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612aaf565b3415610b7857600080fd5b6104ae612b30565b3415610b8b57600080fd5b61063164ffffffffff60043516612b71565b610406600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612ba2565b3415610be757600080fd5b6106bc64ffffffffff60043516612d91565b3415610c0457600080fd5b6104066004356001608060020a036024358116906044351664ffffffffff60643516612dd0565b3415610c3657600080fd5b610406600160a060020a03600435166024351515612f0a565b3415610c5a57600080fd5b610406600160a060020a0360043516612fb8565b3415610c7957600080fd5b61040664ffffffffff60043516600160a060020a0360243516613125565b3415610ca257600080fd5b610406600160a060020a0360043516602435613192565b3415610cc457600080fd5b61053b64ffffffffff600435166131dc565b3415610ce157600080fd5b610406600160a060020a03600435166131f7565b3415610d0057600080fd5b61053b64ffffffffff60043516613249565b3415610d1d57600080fd5b610406600160a060020a0360048035821691602480359091169160443591606435908101910135613264565b3415610d5457600080fd5b610631600160a060020a036004351664ffffffffff602435811690604435166001608060020a03606435166084356133db565b61041b64ffffffffff60043581169060243516613478565b3415610daa57600080fd5b610db5600435613688565b60405197885264ffffffffff9687166020890152948616604080890191909152938616606088015291909416608086015261ffff93841660a086015290921660c084015267ffffffffffffffff1660e0830152610100909101905180910390f35b3415610e2157600080fd5b61040664ffffffffff60043581169060243516613709565b3415610e4457600080fd5b6104ae61381a565b3415610e5757600080fd5b6104ae6004356138b8565b3415610e6d57600080fd5b61040664ffffffffff6004351661ffff602435166139f0565b3415610e9157600080fd5b6104ae613aff565b3415610ea457600080fd5b610406600160a060020a0360043516613b6a565b3415610ec357600080fd5b61046a64ffffffffff60043581169060243516613c56565b3415610ee657600080fd5b61041b613cea565b3415610ef957600080fd5b61040664ffffffffff60043516602435613d14565b3415610f1957600080fd5b610406600160a060020a0360043516613dd0565b3415610f3857600080fd5b61053b613e72565b3415610f4b57600080fd5b610f5d64ffffffffff60043516613e81565b60405196875264ffffffffff958616602088015293851660408088019190915292851660608701529316608085015261ffff92831660a0850152911660c083015260e0909101905180910390f35b3415610fb657600080fd5b61041b613f0b565b3415610fc957600080fd5b61046a600160a060020a0360043581169060243516613f21565b3415610fee57600080fd5b610406600160a060020a036004351664ffffffffff60243581169060443516613f43565b341561101d57600080fd5b61053b600435614230565b61063164ffffffffff60043581169060243516614258565b341561104b57600080fd5b61041b64ffffffffff60043516614347565b341561106857600080fd5b610406600160a060020a036004351664ffffffffff6024351661438b565b60115464ffffffffff1681565b60007f6466353c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198316148061114f57506040517f737570706f727473496e74657266616365286279746573342900000000000000815260190160405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b92915050565b60008064ffffffffff831681901161116c57600080fd5b6000805464ffffffffff851690811061118157fe5b906000526020600020906002020190506112258161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b91505b50919050565b61123661537d565b60408051908101604052601081527f426c6f636b636861696e43757469657300000000000000000000000000000000602082015290505b90565b6000808264ffffffffff81111561128657600080fd5b61128e61153d565b84111561129a57600080fd5b64ffffffffff8416600090815260036020526040902054600160a060020a0316156112e65764ffffffffff8416600090815260036020526040902054600160a060020a0316925061131e565b64ffffffffff8416600090815260016020908152604080832054600160a060020a039081168085526007909352922054909116935091505b5050919050565b60095433600160a060020a0390811691161461134057600080fd5b600160a060020a038516151561135557600080fd5b600160a060020a038416151561136a57600080fd5b600160a060020a038316151561137f57600080fd5b600160a060020a038216151561139457600080fd5b600160a060020a03811615156113a957600080fd5b60148054600160a060020a0319908116600160a060020a03978816179091556015805482169587169590951790945560168054851693861693909317909255601780548416918516919091179055601880549092169216919091179055565b600a5460a060020a900460ff161561141f57600080fd5b8064ffffffffff81111561143257600080fd5b61143c3383614448565b151561144757600080fd5b611451828461446f565b82600160a060020a031633600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405190815260200160405180910390a3505050565b601054650100000000009004600160a060020a031681565b600760205260009081526040902054600160a060020a031681565b600360205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461150657600080fd5b600160a060020a038116151561151b57600080fd5b60098054600160a060020a031916600160a060020a0392909216919091179055565b6000546000190190565b600080600080600080600a60149054906101000a900460ff1615151561156c57600080fd5b600160a060020a03331660009081526013602052604090205464ffffffffff161561159657600080fd5b6115a1600088611fbb565b945034859010156115b157600080fd5b600654600160a060020a031663c170fd54348790038960405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561160257600080fd5b5af1151561160f57600080fd5b5050505060008764ffffffffff1681548110151561162957fe5b9060005260206000209060020201935061164387856144a6565b64ffffffffff8716600090815260046020526040908190208054600160a060020a03191690556008546001860154600160a060020a039091169163656e8d6f9160b060020a900461ffff16905160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156116c657600080fd5b5af115156116d357600080fd5b50505060405180516012548654919550600160a060020a03169150638d8b1b889060009060405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561173257600080fd5b5af1151561173f57600080fd5b5050506040518051905091506117646000888561175b8761469d565b8633600c614707565b33600160a060020a03166000908152601360205260409020805464ffffffffff191664ffffffffff929092169182179055979650505050505050565b600a5433600160a060020a03908116911614806117cb575060095433600160a060020a039081169116145b15156117d657600080fd5b601154601054605060020a90910464ffffffffff908116790100000000000000000000000000000000000000000000000000909204161061181657600080fd5b600160a060020a03811615156118345750600a54600160a060020a03165b60108054600164ffffffffff790100000000000000000000000000000000000000000000000000808404821683018216027fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179092556011805480831690930190911664ffffffffff199092169190911790556118bd6000808080868642614707565b505050565b600a5460a060020a900460ff16156118d957600080fd5b8064ffffffffff8111156118ec57600080fd5b6118f6338361494e565b8061190657506119068433613f21565b151561191157600080fd5b61191b8483614448565b151561192657600080fd5b611931848484614975565b50505050565b60008060008364ffffffffff1681548110151561195057fe5b600091825260209091206002909102016001015460a060020a900461ffff169392505050565b60008060015b61198461153d565b64ffffffffff8216116119e85764ffffffffff8116600090815260016020526040902054600160a060020a03868116911614156119e057838264ffffffffff1614156119d9578064ffffffffff1692506119ed565b6001909101905b60010161197c565b600080fd5b505092915050565b60008060008364ffffffffff16815481101515611a0e57fe5b600091825260209091206002909102016001015460c060020a900467ffffffffffffffff169392505050565b60095433600160a060020a03908116911614611a5557600080fd5b600a5460a060020a900460ff161515611a6d57600080fd5b601054650100000000009004600160a060020a031615611a8c57600080fd5b600a805474ff000000000000000000000000000000000000000019169055565b600a5433600160a060020a0390811691161480611ad7575060095433600160a060020a039081169116145b1515611ae257600080fd5b60105464ffffffffff90811690821611611afb57600080fd5b6010805464ffffffffff191664ffffffffff83811691909117918290557f61adbe79b14a8cd89d2e6b327307808e258e0e9a9da800e5c9c5cf5b20efc91c911660405164ffffffffff909116815260200160405180910390a150565b600a5460a060020a900460ff1615611b6e57600080fd5b8064ffffffffff811115611b8157600080fd5b600160a060020a0383161515611b9657600080fd5b30600160a060020a031683600160a060020a031614151515611bb757600080fd5b600554600160a060020a0384811691161415611bd257600080fd5b600654600160a060020a03848116911614156118ec57600080fd5b60095433600160a060020a03908116911614611c0857600080fd5b60068054600160a060020a03938416600160a060020a03199182161790915560058054929093169116179055565b600a54600090600160a060020a0316611c558a8a8a8a8a8a8a8a612aaf565b600160a060020a0316149998505050505050505050565b600d60205260009081526040902054600160a060020a031681565b600190565b600a5460a060020a900460ff1615611ca357600080fd5b611cad3385614448565b1515611cb857600080fd5b600554611ccf908590600160a060020a031661446f565b600554600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b5af11515611d5d57600080fd5b5050505050505050565b600460205260009081526040902054600160a060020a031681565b600654600160a060020a031681565b600a5460009060a060020a900460ff1615611dab57600080fd5b600160a060020a033381166000908152600d6020526040902054161515611dd157600080fd5b6000805464ffffffffff8516908110611de657fe5b60009182526020909120600290910201600181015490915061ffff83811660b060020a90920416146118bd57600181015464ffffffffff8416907f253c1885cda0cc3462691396c0720f0b8d26a408db39c442f6cba580aa2bacbe9060b060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660b060020a0277ffff0000000000000000000000000000000000000000000019909116179055505050565b600a5460a060020a900460ff1681565b60095433600160a060020a03908116911614611ecd57600080fd5b600a5460a060020a900460ff161515611ee557600080fd5b600160a060020a0381161515611efa57600080fd5b6010805478ffffffffffffffffffffffffffffffffffffffff0000000000191665010000000000600160a060020a03848116820292909217928390557f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305920416604051600160a060020a03909116815260200160405180910390a150565b60008164ffffffffff811115611f8d57600080fd5b64ffffffffff8316600090815260016020526040902054600160a060020a0316915081151561122857600080fd5b600854600090600160a060020a03166366dc860a848460405160e060020a63ffffffff851602815264ffffffffff928316600482015291166024820152604401602060405180830381600087803b151561201457600080fd5b5af1151561202157600080fd5b5050506040518051949350505050565b600a5460009060a060020a900460ff161561204b57600080fd5b600160a060020a033381166000908152600d602052604090205416151561207157600080fd5b6000805464ffffffffff851690811061208657fe5b60009182526020909120600290910201600181015490915067ffffffffffffffff83811660c060020a90920416146118bd57600181015464ffffffffff8416907f0e4fadd6d53b262b076fce73fbf5c344b680a42f10f095326782f42d56b9beb29060c060020a900467ffffffffffffffff168460405167ffffffffffffffff9283168152911660208201526040908101905180910390a260018101805467ffffffffffffffff841660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff909116179055505050565b60095460009033600160a060020a03908116911614806121875750600a5433600160a060020a039081169116145b151561219257600080fd5b600554600160a060020a031663776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156121d157600080fd5b5af115156121de57600080fd5b5050600654600160a060020a0316905063776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561222157600080fd5b5af1151561222e57600080fd5b505050600090505b600e5463ffffffff821610156122bd57600e805463ffffffff831690811061225a57fe5b600091825260209091200154600160a060020a0316633ccfd60b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156122a257600080fd5b5af115156122af57600080fd5b505050806001019050612236565b50565b600160a060020a031660009081526002602052604090205490565b60145460009033600160a060020a0390811691161480612309575060155433600160a060020a039081169116145b80612322575060165433600160a060020a039081169116145b8061233b575060175433600160a060020a039081169116145b80612354575060185433600160a060020a039081169116145b8061236d575060095433600160a060020a039081169116145b806123865750600a5433600160a060020a039081169116145b151561239157600080fd5b601454600160a060020a031615156123a857600080fd5b601554600160a060020a031615156123bf57600080fd5b601654600160a060020a031615156123d657600080fd5b601754600160a060020a031615156123ed57600080fd5b601854600160a060020a0316151561240457600080fd5b50601454600160a060020a033081163191166108fc6103e860698402049081150290604051600060405180830381858888f19350505050151561244657600080fd5b601554600160a060020a03166103e8606983020480156108fc0290604051600060405180830381858888f19350505050151561248157600080fd5b601654600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124bc57600080fd5b601754600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124f757600080fd5b601854600160a060020a03166103e86101fe83020480156108fc0290604051600060405180830381858888f1935050505015156122bd57600080fd5b600a5460a060020a900460ff161561254a57600080fd5b6125543385614448565b151561255f57600080fd5b61256884611155565b151561257357600080fd5b60065461258a908590600160a060020a031661446f565b600654600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b600854600160a060020a031681565b60095433600160a060020a0390811691161461263557600080fd5b600b82805161264892916020019061538f565b50600c8180516118bd92916020019061538f565b600954600090819081908190819033600160a060020a0390811691161461268257600080fd5b600a5460a060020a900460ff16151561269a57600080fd5b8994508693508592508891505b64ffffffffff8089169083161161287a5784600160a060020a0316636352211e8360405160e060020a63ffffffff841602815264ffffffffff9091166004820152602401602060405180830381600087803b151561270457600080fd5b5af1151561271157600080fd5b50505060405180519050905086600160a060020a031681600160a060020a031614156127c05783600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561278357600080fd5b5af1151561279057600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b85600160a060020a031681600160a060020a031614156128635782600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561282657600080fd5b5af1151561283357600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b61286f60008284614975565b6001909101906126a7565b50505050505050505050565b60095460009033600160a060020a039081169116146128a457600080fd5b5080600160a060020a03811663dcb31b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156128e357600080fd5b5af115156128f057600080fd5b50505060405180519050151561290557600080fd5b60088054600160a060020a031916600160a060020a039290921691909117905550565b60095433600160a060020a0390811691161461294357600080fd5b600a5460a060020a900460ff161561295a57600080fd5b600a805474ff0000000000000000000000000000000000000000191660a060020a179055565b600a5460a060020a900460ff161561299757600080fd5b64ffffffffff821615806129b057506129b03383614448565b15156129bb57600080fd5b600160a060020a038381166000908152600d60205260409020541615156129e157600080fd5b60008264ffffffffff1611156129fb576129fb828461446f565b600160a060020a038084166000908152600d602052604090819020549091169063a055d4559034908590859033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612a7857600080fd5b5af11515612a8557600080fd5b50505050505050565b601154605060020a900464ffffffffff1681565b60105464ffffffffff1681565b600080612abf8a8a8a8a8a6133db565b90506001818686866040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515612b1957600080fd5b5050602060405103519a9950505050505050505050565b612b3861537d565b60408051908101604052600281527f42430000000000000000000000000000000000000000000000000000000000006020820152905090565b60008060008364ffffffffff16815481101515612b8a57fe5b60009182526020909120600290910201549392505050565b600a5460a060020a900460ff1615612bb957600080fd5b64ffffffffff86161580612bd25750612bd23387614448565b1515612bdd57600080fd5b600160a060020a038881166000908152600d6020526040902054161515612c0357600080fd5b64ffffffffff87166000908152600f6020526040902054600160a060020a031615612c2d57600080fd5b60105464ffffffffff9081169088161015612c4757600080fd5b346001608060020a0386161115612c5d57600080fd5b612c6d8888888888888888611c36565b1515612c7857600080fd5b64ffffffffff87166000908152600f6020526040908190208054600160a060020a03191633600160a060020a038116919091179091557f3b213e544d7183ac9b8a682aa7ad1d52d0b2c05c7aba9bf7bc025d7b3847b63e918991905164ffffffffff9092168252600160a060020a031660208201526040908101905180910390a1600160a060020a038089166000908152600d6020526040908190205490911690639652713e9087908990889033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612d7657600080fd5b5af11515612d8357600080fd5b505050505050505050505050565b60008060008364ffffffffff16815481101515612daa57fe5b600091825260209091206002909102016001015460b060020a900461ffff169392505050565b600a5460009033600160a060020a0390811691161480612dfe575060095433600160a060020a039081169116145b1515612e0957600080fd5b60115464ffffffffff6501000000000082048116911610612e2957600080fd5b612e3a600080600080893042614707565b600554909150612e54908290600160a060020a031661446f565b600554600160a060020a031663c1d1faf3828686863060405160e060020a63ffffffff881602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a401600060405180830381600087803b1515612ed557600080fd5b5af11515612ee257600080fd5b50506011805464ffffffffff8082166001011664ffffffffff19909116179055505050505050565b8015612f445733600160a060020a0390811660009081526007602052604090208054600160a060020a031916918416919091179055612f6b565b600160a060020a03331660009081526007602052604090208054600160a060020a03191690555b81600160a060020a031633600160a060020a03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051901515815260200160405180910390a35050565b60095460009033600160a060020a03908116911614612fd657600080fd5b600160a060020a038083166000908152600d6020526040908190205490911690631195236990518163ffffffff1660e060020a028152600401600060405180830381600087803b151561302857600080fd5b5af1151561303557600080fd5b50505050600160a060020a0381166000908152600d602052604081208054600160a060020a03191690555b600e548110156131215781600160a060020a0316600e8281548110151561308357fe5b600091825260209091200154600160a060020a0316141561311857600e805460001981019081106130b057fe5b600091825260209091200154600e8054600160a060020a0390921691839081106130d657fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600e80549061311290600019830161540d565b5061311c565b6001015b613060565b5050565b600a5433600160a060020a0390811691161480613150575060095433600160a060020a039081169116145b151561315b57600080fd5b600a5460a060020a900460ff161561317257600080fd5b61317c3083614448565b151561318757600080fd5b613121308284614975565b600a5460a060020a900460ff16156131a957600080fd5b8064ffffffffff8111156131bc57600080fd5b6131c63383614448565b15156131d157600080fd5b6118bd338484614975565b600160205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461321257600080fd5b600160a060020a038116151561322757600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600f60205260009081526040902054600160a060020a031681565b600a5460a060020a900460ff161561327b57600080fd5b8264ffffffffff81111561328e57600080fd5b600160a060020a03851615156132a357600080fd5b30600160a060020a031685600160a060020a0316141515156132c457600080fd5b600554600160a060020a03868116911614156132df57600080fd5b600654600160a060020a03868116911614156132fa57600080fd5b613304338561494e565b8061331457506133148633613f21565b151561331f57600080fd5b6133298685614448565b151561333457600080fd5b61333f868686614975565b84600160a060020a031663f0b9e5ba8786868660405160e060020a63ffffffff8716028152600160a060020a0385166004820190815260248201859052606060448301908152606483018490529091608401848480828437820191505095505050505050602060405180830381600087803b15156133bc57600080fd5b5af115156133c957600080fd5b50505060405180515050505050505050565b60008585858585604051600160a060020a03959095166c0100000000000000000000000002855264ffffffffff9384167b0100000000000000000000000000000000000000000000000000000090810260148701529290931690910260198401526001608060020a031670010000000000000000000000000000000002601e830152602e820152604e016040518091039020905095945050505050565b600a546000908190819060a060020a900460ff161561349657600080fd5b6134a03386614448565b15156134ab57600080fd5b6134b58486614a6b565b15156134c057600080fd5b346134cb8686611fbb565b11156134d657600080fd5b6000805464ffffffffff87169081106134eb57fe5b9060005260206000209060020201915061358f8261010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561359a57600080fd5b6000805464ffffffffff86169081106135af57fe5b906000526020600020906002020190506136538161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561365e57600080fd5b61366a82868387614ad4565b151561367557600080fd5b61367f8585614d2a565b95945050505050565b600080548290811061369657fe5b60009182526020909120600290910201805460019091015490915064ffffffffff80821691650100000000008104821691605060020a8204811691607860020a81049091169061ffff60a060020a820481169160b060020a81049091169067ffffffffffffffff60c060020a9091041688565b600a5460009060a060020a900460ff161561372357600080fd5b600160a060020a033381166000908152600d602052604090205416151561374957600080fd5b6000805464ffffffffff851690811061375e57fe5b60009182526020909120600290910201600181015490915064ffffffffff8381166501000000000090920416146118bd57600181015464ffffffffff808516917fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b38189165010000000000909104168460405164ffffffffff9283168152911660208201526040908101905180910390a260018101805464ffffffffff8416650100000000000269ffffffffff000000000019909116179055505050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b820191906000526020600020905b81548152906001019060200180831161389357829003601f168201915b505050505081565b6138c061537d565b61114f613966600b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b820191906000526020600020905b81548152906001019060200180831161393f57829003601f168201915b5050505050614f32565b6139eb61397861397d61397887614f5a565b614f32565b6139eb600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b615270565b600a5460009060a060020a900460ff1615613a0a57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613a3057600080fd5b6000805464ffffffffff8516908110613a4557fe5b60009182526020909120600290910201600181015490915061ffff83811660a060020a90920416146118bd57600181015464ffffffffff8416907f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef2749060a060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660a060020a0275ffff000000000000000000000000000000000000000019909116179055505050565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b60095460009033600160a060020a03908116911614613b8857600080fd5b5080600160a060020a0381166394a892336040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613bc757600080fd5b5af11515613bd457600080fd5b505050604051805190501515613be957600080fd5b600160a060020a038281166000908152600d602052604090208054600160a060020a031916918316919091179055600e805460018101613c29838261540d565b5060009182526020909120018054600160a060020a031916600160a060020a039290921691909117905550565b6000808064ffffffffff8516819011613c6e57600080fd5b600064ffffffffff851611613c8257600080fd5b6000805464ffffffffff8716908110613c9757fe5b9060005260206000209060020201915060008464ffffffffff16815481101515613cbd57fe5b90600052602060002090600202019050613cd982868387614ad4565b801561367f575061367f8486614a6b565b601054790100000000000000000000000000000000000000000000000000900464ffffffffff1681565b600a5460009060a060020a900460ff1615613d2e57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613d5457600080fd5b6000805464ffffffffff8516908110613d6957fe5b906000526020600020906002020190508181600001541415156118bd578264ffffffffff167fbecce9a2928a6d9bbe3755bd02387af9dbe05d1ecfa05028c33d7245e24a860c82600001548460405191825260208201526040908101905180910390a25550565b60095460009033600160a060020a03908116911614613dee57600080fd5b5080600160a060020a0381166390da7c3c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613e2d57600080fd5b5af11515613e3a57600080fd5b505050604051805190501515613e4f57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600554600160a060020a031681565b60008060008060008060008060008964ffffffffff16815481101515613ea357fe5b600091825260209091206002909102018054600190910154909a64ffffffffff8083169b5065010000000000830481169a50605060020a830481169950607860020a830416975061ffff60a060020a83048116975060b060020a909204909116945092505050565b60115465010000000000900464ffffffffff1681565b600160a060020a03918216600090815260076020526040902054821691161490565b6000806000806000806000806000613f59615431565b60095433600160a060020a03908116911614613f7457600080fd5b600a5460a060020a900460ff161515613f8c57600080fd5b8b64ffffffffff16613f9c61153d565b60010114613fa957600080fd5b8c99508b98505b64ffffffffff808c16908a16116142215789600160a060020a031663e39bdfab8a60405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160e060405180830381600087803b151561400d57600080fd5b5af1151561401a57600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051969e50949c50929a50909850965094509092506101009050604051908101604052808981526020018864ffffffffff1681526020018764ffffffffff1681526020018664ffffffffff1681526020018564ffffffffff1681526020018461ffff1681526020018361ffff168152602001600067ffffffffffffffff168152509050600080548060010182816140db9190615475565b6000928352602090922083916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001918201805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790559a909a019950613fb09050565b50505050505050505050505050565b600e80548290811061423e57fe5b600091825260209091200154600160a060020a0316905081565b600a54600090819060a060020a900460ff161561427457600080fd5b61427e3384614448565b151561428957600080fd5b61429283611155565b151561429d57600080fd5b6142a783856152dc565b15156142b257600080fd5b6142bc8385611fbb565b905034819010156142cc57600080fd5b600654600160a060020a031663c170fd54348390038660405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561431d57600080fd5b5af1151561432a57600080fd5b505050506143388385614d2a565b64ffffffffff16949350505050565b60008060008364ffffffffff1681548110151561436057fe5b600091825260209091206002909102016001015465010000000000900464ffffffffff169392505050565b600a5460a060020a900460ff16156143a257600080fd5b6143ac3382614448565b15156143b757600080fd5b64ffffffffff8116600090815260046020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907fe53f1ce10d7caafaafcb8d2857c06db87da891294ba914f8436e31b905e1e0e79084905164ffffffffff909116815260200160405180910390a35050565b600042826040015164ffffffffff16111592915050565b64ffffffffff16600090815260016020526040902054600160a060020a0391821691161490565b64ffffffffff9190911660009081526003602052604090208054600160a060020a031916600160a060020a03909216919091179055565b600181015460085460a060020a90910461ffff1690600090600160a060020a03166306347def8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b151561450657600080fd5b5af1151561451357600080fd5b505050604051805160018501805469ffffffffff000000000019166501000000000064ffffffffff9384168102919091179182905587831693507fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b3818928692919091041660405164ffffffffff9283168152911660208201526040908101905180910390a2600854600160a060020a031663732606fc6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156145d657600080fd5b5af115156145e357600080fd5b505050604051805160018086015461ffff60a060020a9091048116909101161015905061193157506001808301805461ffff60a060020a80830482169485018216810275ffff000000000000000000000000000000000000000019909316929092179283905564ffffffffff8716927f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef27492859291041660405161ffff9283168152911660208201526040908101905180910390a250505050565b600854600090600160a060020a0316635757dcdf8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156146eb57600080fd5b5af115156146f857600080fd5b50505060405180519392505050565b6000614711615431565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e0820181905280549194506001918083016147788382615475565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555003915064ffffffffff8211156148c757600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a261494060008783614975565b9a9950505050505050505050565b64ffffffffff16600090815260036020526040902054600160a060020a0391821691161490565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a0319169091179055831615614a1757600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b64ffffffffff8082166000908152600160205260408082205492851682528120549091600160a060020a0390811691168082148061367f575064ffffffffff8516600090815260046020526040902054600160a060020a03908116908316149250505092915050565b60008364ffffffffff168264ffffffffff161415614af457506000614d22565b600185015464ffffffffff838116605060020a909204161415614b1957506000614d22565b600185015464ffffffffff838116607860020a909204161415614b3e57506000614d22565b600183015464ffffffffff858116605060020a909204161415614b6357506000614d22565b600183015464ffffffffff858116607860020a909204161415614b8857506000614d22565b6001830154605060020a900464ffffffffff161515614ba957506001614d22565b6001850154605060020a900464ffffffffff161515614bca57506001614d22565b60018581015490840154605060020a9182900464ffffffffff90811692909104161415614bf957506000614d22565b60018086015490840154605060020a900464ffffffffff908116607860020a909204161415614c2a57506000614d22565b60018086015490840154607860020a900464ffffffffff908116605060020a909204161415614c5b57506000614d22565b60018581015490840154607860020a9182900464ffffffffff90811692909104161415614c8a57506000614d22565b60125485548454600160a060020a039092169163c868a569918791869060405160e060020a63ffffffff871602815264ffffffffff94851660048201526024810193909352921660448201526064810191909152608401602060405180830381600087803b1515614cfa57600080fd5b5af11515614d0757600080fd5b5050506040518051905015614d1e57506001614d22565b5060005b949350505050565b6000806000806000806000808864ffffffffff16815481101515614d4a57fe5b9060005260206000209060020201955060008964ffffffffff16815481101515614d7057fe5b90600052602060002090600202019450614d8a88876144a6565b614d9489866144a6565b64ffffffffff808a166000908152600460205260408082208054600160a060020a03199081169091558b841683529120805490911690556001860154161515614ddc57600080fd5b60085460018681015490880154600160a060020a0390921691631af97fb79161ffff60b060020a91829004811692919091041660405160e060020a63ffffffff851602815261ffff928316600482015291166024820152604401602060405180830381600087803b1515614e4f57600080fd5b5af11515614e5c57600080fd5b505050604051805160125487548954929750600160a060020a039091169250638d8b1b889160405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b1515614ebc57600080fd5b5af11515614ec957600080fd5b505050604051805164ffffffffff8b16600090815260016020526040902054909450600160a060020a03169250614f259050898986614f078161469d565b60018a01548890889065010000000000900464ffffffffff16614707565b9998505050505050505050565b614f3a6154a1565b602082016040805190810160405280845181526020019190915292915050565b614f6261537d565b614f6a61537d565b6000614f7461537d565b60206040519081016040526000815292505b600a808604950691506020604051908101604052600081529050811515614fe25760408051908101604052600181527f300000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600114156150265760408051908101604052600181527f310000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816002141561506a5760408051908101604052600181527f320000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600314156150ae5760408051908101604052600181527f330000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600414156150f25760408051908101604052600181527f340000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600514156151365760408051908101604052600181527f350000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816006141561517a5760408051908101604052600181527f360000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600714156151be5760408051908101604052600181527f370000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600814156152025760408051908101604052600181527f380000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600914156152425760408051908101604052600181527f3900000000000000000000000000000000000000000000000000000000000000602082015290505b61525761524e82614f32565b6139eb85614f32565b9250600085111561526757614f86565b50909392505050565b61527861537d565b61528061537d565b600083518551016040518059106152945750595b818152601f19601f8301168101602001604052905091506020820190506152c18186602001518751615338565b6152d48551820185602001518651615338565b509392505050565b6000806000808564ffffffffff168154811015156152f657fe5b9060005260206000209060020201915060008464ffffffffff1681548110151561531c57fe5b9060005260206000209060020201905061367f82868387614ad4565b60005b6020821061535e578251845260208401935060208301925060208203915061533b565b6001826020036101000a03905080198351168185511617909352505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153d057805160ff19168380011785556153fd565b828001600101855582156153fd579182015b828111156153fd5782518255916020019190600101906153e2565b506154099291506154b8565b5090565b8154818355818115116118bd576000838152602090206118bd9181019083016154b8565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b8154818355818115116118bd576002028160020283600052602060002091820191016118bd91906154d2565b604080519081016040526000808252602082015290565b61126d91905b8082111561540957600081556001016154be565b61126d91905b8082111561540957600080825560018201556002016154d85600a165627a7a72305820fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b0029

Deployed Bytecode

0x6060604052600436106103ac5763ffffffff60e060020a60003504166219a46b811461040857806301ffc9a71461043557806305910b911461047e57806306fdde031461049b578063081812fc1461052557806308ba7ee714610557578063095ea7b31461058e5780630da2e088146105b05780630dca63e8146105c357806310e9678b146105e257806313af4035146105ff57806318160ddd1461061e5780631bbfce0e14610643578063210fcbf61461065557806323b872dd146106775780632917f1621461069f5780632f745c59146106d35780633e6d4e12146106f55780633f4ba83a1461072f57806340a92f0f1461074257806342842e0e1461075f578063430c73c51461078757806345c7a092146107ac5780634b12e643146107f65780634d6a813a146108155780634f6ccce71461082857806350bc6bba1461083e578063551799131461086b5780635a390a5f146108885780635a3f88f01461089b5780635c975abb146108bf5780635f24f6fe146108d25780636352211e146108f157806366dc860a146109075780636c2959361461092a5780636ccbb0ab1461095457806370a0823114610967578063776247c41461098657806378a6c6d21461099957806379502c55146109c657806379edfa7d146109d9578063839daf1d14610a6c57806383a12de914610aaa5780638456cb5914610ac9578063887e0c0714610adc578063889231c114610afd5780638f9a57ef14610b1057806394e50e7a14610b2357806395d89b4114610b6d578063999d394714610b805780639ad73f2014610b9d5780639c91ae2014610bdc5780639de8302f14610bf9578063a22cb46514610c2b578063a4d95b6414610c4f578063a86ee74614610c6e578063a9059cbb14610c97578063b1d9549714610cb9578063b3ab15fb14610cd6578063b5113bf614610cf5578063b88d4fde14610d12578063bdad811214610d49578063c30bc5ef14610d87578063c44f217414610d9f578063c479142114610e16578063c7047fa714610e39578063c87b56dd14610e4c578063cf7e69f814610e62578063d4d6d36614610e86578063d8867fc814610e99578063d997933f14610eb8578063e09ef83e14610edb578063e1af915d14610eee578063e205842414610f0e578063e33607da14610f2d578063e39bdfab14610f40578063e515a4d114610fab578063e985e9c514610fbe578063edc9f18214610fe3578063f3ca087314611012578063f3cb180514611028578063f6dfcff714611040578063fb43b2a21461105d575b60055433600160a060020a03908116911614806103d7575060065433600160a060020a039081169116145b806103fb5750600160a060020a033381166000908152600d60205260409020541615155b151561040657600080fd5b005b341561041357600080fd5b61041b611086565b60405164ffffffffff909116815260200160405180910390f35b341561044057600080fd5b61046a7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516611093565b604051901515815260200160405180910390f35b341561048957600080fd5b61046a64ffffffffff60043516611155565b34156104a657600080fd5b6104ae61122e565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156104ea5780820151838201526020016104d2565b50505050905090810190601f1680156105175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053057600080fd5b61053b600435611270565b604051600160a060020a03909116815260200160405180910390f35b341561056257600080fd5b610406600160a060020a0360043581169060243581169060443581169060643581169060843516611325565b341561059957600080fd5b610406600160a060020a0360043516602435611408565b34156105bb57600080fd5b61053b61149d565b34156105ce57600080fd5b61053b600160a060020a03600435166114b5565b34156105ed57600080fd5b61053b64ffffffffff600435166114d0565b341561060a57600080fd5b610406600160a060020a03600435166114eb565b341561062957600080fd5b61063161153d565b60405190815260200160405180910390f35b61063164ffffffffff60043516611547565b341561066057600080fd5b610406600435600160a060020a03602435166117a0565b341561068257600080fd5b610406600160a060020a03600435811690602435166044356118c2565b34156106aa57600080fd5b6106bc64ffffffffff60043516611937565b60405161ffff909116815260200160405180910390f35b34156106de57600080fd5b610631600160a060020a0360043516602435611976565b341561070057600080fd5b61071264ffffffffff600435166119f5565b60405167ffffffffffffffff909116815260200160405180910390f35b341561073a57600080fd5b610406611a3a565b341561074d57600080fd5b61040664ffffffffff60043516611aac565b341561076a57600080fd5b610406600160a060020a0360043581169060243516604435611b57565b341561079257600080fd5b610406600160a060020a0360043581169060243516611bed565b34156107b757600080fd5b61046a600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435611c36565b341561080157600080fd5b61053b600160a060020a0360043516611c6c565b341561082057600080fd5b61046a611c87565b341561083357600080fd5b61063160043561126d565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516611c8c565b341561087657600080fd5b61053b64ffffffffff60043516611d67565b341561089357600080fd5b61053b611d82565b34156108a657600080fd5b61040664ffffffffff6004351661ffff60243516611d91565b34156108ca57600080fd5b61046a611ea2565b34156108dd57600080fd5b610406600160a060020a0360043516611eb2565b34156108fc57600080fd5b61053b600435611f78565b341561091257600080fd5b61063164ffffffffff60043581169060243516611fbb565b341561093557600080fd5b61040664ffffffffff6004351667ffffffffffffffff60243516612031565b341561095f57600080fd5b610406612159565b341561097257600080fd5b610631600160a060020a03600435166122c0565b341561099157600080fd5b6104066122db565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516612533565b34156109d157600080fd5b61053b61260b565b34156109e457600080fd5b61040660046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061261a95505050505050565b3415610a7757600080fd5b610406600160a060020a0360043581169064ffffffffff602435811691604435909116906064358116906084351661265c565b3415610ab557600080fd5b610406600160a060020a0360043516612886565b3415610ad457600080fd5b610406612928565b610406600160a060020a036004351664ffffffffff60243516604435612980565b3415610b0857600080fd5b61041b612a8e565b3415610b1b57600080fd5b61041b612aa2565b3415610b2e57600080fd5b61053b600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612aaf565b3415610b7857600080fd5b6104ae612b30565b3415610b8b57600080fd5b61063164ffffffffff60043516612b71565b610406600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612ba2565b3415610be757600080fd5b6106bc64ffffffffff60043516612d91565b3415610c0457600080fd5b6104066004356001608060020a036024358116906044351664ffffffffff60643516612dd0565b3415610c3657600080fd5b610406600160a060020a03600435166024351515612f0a565b3415610c5a57600080fd5b610406600160a060020a0360043516612fb8565b3415610c7957600080fd5b61040664ffffffffff60043516600160a060020a0360243516613125565b3415610ca257600080fd5b610406600160a060020a0360043516602435613192565b3415610cc457600080fd5b61053b64ffffffffff600435166131dc565b3415610ce157600080fd5b610406600160a060020a03600435166131f7565b3415610d0057600080fd5b61053b64ffffffffff60043516613249565b3415610d1d57600080fd5b610406600160a060020a0360048035821691602480359091169160443591606435908101910135613264565b3415610d5457600080fd5b610631600160a060020a036004351664ffffffffff602435811690604435166001608060020a03606435166084356133db565b61041b64ffffffffff60043581169060243516613478565b3415610daa57600080fd5b610db5600435613688565b60405197885264ffffffffff9687166020890152948616604080890191909152938616606088015291909416608086015261ffff93841660a086015290921660c084015267ffffffffffffffff1660e0830152610100909101905180910390f35b3415610e2157600080fd5b61040664ffffffffff60043581169060243516613709565b3415610e4457600080fd5b6104ae61381a565b3415610e5757600080fd5b6104ae6004356138b8565b3415610e6d57600080fd5b61040664ffffffffff6004351661ffff602435166139f0565b3415610e9157600080fd5b6104ae613aff565b3415610ea457600080fd5b610406600160a060020a0360043516613b6a565b3415610ec357600080fd5b61046a64ffffffffff60043581169060243516613c56565b3415610ee657600080fd5b61041b613cea565b3415610ef957600080fd5b61040664ffffffffff60043516602435613d14565b3415610f1957600080fd5b610406600160a060020a0360043516613dd0565b3415610f3857600080fd5b61053b613e72565b3415610f4b57600080fd5b610f5d64ffffffffff60043516613e81565b60405196875264ffffffffff958616602088015293851660408088019190915292851660608701529316608085015261ffff92831660a0850152911660c083015260e0909101905180910390f35b3415610fb657600080fd5b61041b613f0b565b3415610fc957600080fd5b61046a600160a060020a0360043581169060243516613f21565b3415610fee57600080fd5b610406600160a060020a036004351664ffffffffff60243581169060443516613f43565b341561101d57600080fd5b61053b600435614230565b61063164ffffffffff60043581169060243516614258565b341561104b57600080fd5b61041b64ffffffffff60043516614347565b341561106857600080fd5b610406600160a060020a036004351664ffffffffff6024351661438b565b60115464ffffffffff1681565b60007f6466353c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198316148061114f57506040517f737570706f727473496e74657266616365286279746573342900000000000000815260190160405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b92915050565b60008064ffffffffff831681901161116c57600080fd5b6000805464ffffffffff851690811061118157fe5b906000526020600020906002020190506112258161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b91505b50919050565b61123661537d565b60408051908101604052601081527f426c6f636b636861696e43757469657300000000000000000000000000000000602082015290505b90565b6000808264ffffffffff81111561128657600080fd5b61128e61153d565b84111561129a57600080fd5b64ffffffffff8416600090815260036020526040902054600160a060020a0316156112e65764ffffffffff8416600090815260036020526040902054600160a060020a0316925061131e565b64ffffffffff8416600090815260016020908152604080832054600160a060020a039081168085526007909352922054909116935091505b5050919050565b60095433600160a060020a0390811691161461134057600080fd5b600160a060020a038516151561135557600080fd5b600160a060020a038416151561136a57600080fd5b600160a060020a038316151561137f57600080fd5b600160a060020a038216151561139457600080fd5b600160a060020a03811615156113a957600080fd5b60148054600160a060020a0319908116600160a060020a03978816179091556015805482169587169590951790945560168054851693861693909317909255601780548416918516919091179055601880549092169216919091179055565b600a5460a060020a900460ff161561141f57600080fd5b8064ffffffffff81111561143257600080fd5b61143c3383614448565b151561144757600080fd5b611451828461446f565b82600160a060020a031633600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405190815260200160405180910390a3505050565b601054650100000000009004600160a060020a031681565b600760205260009081526040902054600160a060020a031681565b600360205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461150657600080fd5b600160a060020a038116151561151b57600080fd5b60098054600160a060020a031916600160a060020a0392909216919091179055565b6000546000190190565b600080600080600080600a60149054906101000a900460ff1615151561156c57600080fd5b600160a060020a03331660009081526013602052604090205464ffffffffff161561159657600080fd5b6115a1600088611fbb565b945034859010156115b157600080fd5b600654600160a060020a031663c170fd54348790038960405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561160257600080fd5b5af1151561160f57600080fd5b5050505060008764ffffffffff1681548110151561162957fe5b9060005260206000209060020201935061164387856144a6565b64ffffffffff8716600090815260046020526040908190208054600160a060020a03191690556008546001860154600160a060020a039091169163656e8d6f9160b060020a900461ffff16905160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156116c657600080fd5b5af115156116d357600080fd5b50505060405180516012548654919550600160a060020a03169150638d8b1b889060009060405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561173257600080fd5b5af1151561173f57600080fd5b5050506040518051905091506117646000888561175b8761469d565b8633600c614707565b33600160a060020a03166000908152601360205260409020805464ffffffffff191664ffffffffff929092169182179055979650505050505050565b600a5433600160a060020a03908116911614806117cb575060095433600160a060020a039081169116145b15156117d657600080fd5b601154601054605060020a90910464ffffffffff908116790100000000000000000000000000000000000000000000000000909204161061181657600080fd5b600160a060020a03811615156118345750600a54600160a060020a03165b60108054600164ffffffffff790100000000000000000000000000000000000000000000000000808404821683018216027fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179092556011805480831690930190911664ffffffffff199092169190911790556118bd6000808080868642614707565b505050565b600a5460a060020a900460ff16156118d957600080fd5b8064ffffffffff8111156118ec57600080fd5b6118f6338361494e565b8061190657506119068433613f21565b151561191157600080fd5b61191b8483614448565b151561192657600080fd5b611931848484614975565b50505050565b60008060008364ffffffffff1681548110151561195057fe5b600091825260209091206002909102016001015460a060020a900461ffff169392505050565b60008060015b61198461153d565b64ffffffffff8216116119e85764ffffffffff8116600090815260016020526040902054600160a060020a03868116911614156119e057838264ffffffffff1614156119d9578064ffffffffff1692506119ed565b6001909101905b60010161197c565b600080fd5b505092915050565b60008060008364ffffffffff16815481101515611a0e57fe5b600091825260209091206002909102016001015460c060020a900467ffffffffffffffff169392505050565b60095433600160a060020a03908116911614611a5557600080fd5b600a5460a060020a900460ff161515611a6d57600080fd5b601054650100000000009004600160a060020a031615611a8c57600080fd5b600a805474ff000000000000000000000000000000000000000019169055565b600a5433600160a060020a0390811691161480611ad7575060095433600160a060020a039081169116145b1515611ae257600080fd5b60105464ffffffffff90811690821611611afb57600080fd5b6010805464ffffffffff191664ffffffffff83811691909117918290557f61adbe79b14a8cd89d2e6b327307808e258e0e9a9da800e5c9c5cf5b20efc91c911660405164ffffffffff909116815260200160405180910390a150565b600a5460a060020a900460ff1615611b6e57600080fd5b8064ffffffffff811115611b8157600080fd5b600160a060020a0383161515611b9657600080fd5b30600160a060020a031683600160a060020a031614151515611bb757600080fd5b600554600160a060020a0384811691161415611bd257600080fd5b600654600160a060020a03848116911614156118ec57600080fd5b60095433600160a060020a03908116911614611c0857600080fd5b60068054600160a060020a03938416600160a060020a03199182161790915560058054929093169116179055565b600a54600090600160a060020a0316611c558a8a8a8a8a8a8a8a612aaf565b600160a060020a0316149998505050505050505050565b600d60205260009081526040902054600160a060020a031681565b600190565b600a5460a060020a900460ff1615611ca357600080fd5b611cad3385614448565b1515611cb857600080fd5b600554611ccf908590600160a060020a031661446f565b600554600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b5af11515611d5d57600080fd5b5050505050505050565b600460205260009081526040902054600160a060020a031681565b600654600160a060020a031681565b600a5460009060a060020a900460ff1615611dab57600080fd5b600160a060020a033381166000908152600d6020526040902054161515611dd157600080fd5b6000805464ffffffffff8516908110611de657fe5b60009182526020909120600290910201600181015490915061ffff83811660b060020a90920416146118bd57600181015464ffffffffff8416907f253c1885cda0cc3462691396c0720f0b8d26a408db39c442f6cba580aa2bacbe9060b060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660b060020a0277ffff0000000000000000000000000000000000000000000019909116179055505050565b600a5460a060020a900460ff1681565b60095433600160a060020a03908116911614611ecd57600080fd5b600a5460a060020a900460ff161515611ee557600080fd5b600160a060020a0381161515611efa57600080fd5b6010805478ffffffffffffffffffffffffffffffffffffffff0000000000191665010000000000600160a060020a03848116820292909217928390557f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305920416604051600160a060020a03909116815260200160405180910390a150565b60008164ffffffffff811115611f8d57600080fd5b64ffffffffff8316600090815260016020526040902054600160a060020a0316915081151561122857600080fd5b600854600090600160a060020a03166366dc860a848460405160e060020a63ffffffff851602815264ffffffffff928316600482015291166024820152604401602060405180830381600087803b151561201457600080fd5b5af1151561202157600080fd5b5050506040518051949350505050565b600a5460009060a060020a900460ff161561204b57600080fd5b600160a060020a033381166000908152600d602052604090205416151561207157600080fd5b6000805464ffffffffff851690811061208657fe5b60009182526020909120600290910201600181015490915067ffffffffffffffff83811660c060020a90920416146118bd57600181015464ffffffffff8416907f0e4fadd6d53b262b076fce73fbf5c344b680a42f10f095326782f42d56b9beb29060c060020a900467ffffffffffffffff168460405167ffffffffffffffff9283168152911660208201526040908101905180910390a260018101805467ffffffffffffffff841660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff909116179055505050565b60095460009033600160a060020a03908116911614806121875750600a5433600160a060020a039081169116145b151561219257600080fd5b600554600160a060020a031663776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156121d157600080fd5b5af115156121de57600080fd5b5050600654600160a060020a0316905063776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561222157600080fd5b5af1151561222e57600080fd5b505050600090505b600e5463ffffffff821610156122bd57600e805463ffffffff831690811061225a57fe5b600091825260209091200154600160a060020a0316633ccfd60b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156122a257600080fd5b5af115156122af57600080fd5b505050806001019050612236565b50565b600160a060020a031660009081526002602052604090205490565b60145460009033600160a060020a0390811691161480612309575060155433600160a060020a039081169116145b80612322575060165433600160a060020a039081169116145b8061233b575060175433600160a060020a039081169116145b80612354575060185433600160a060020a039081169116145b8061236d575060095433600160a060020a039081169116145b806123865750600a5433600160a060020a039081169116145b151561239157600080fd5b601454600160a060020a031615156123a857600080fd5b601554600160a060020a031615156123bf57600080fd5b601654600160a060020a031615156123d657600080fd5b601754600160a060020a031615156123ed57600080fd5b601854600160a060020a0316151561240457600080fd5b50601454600160a060020a033081163191166108fc6103e860698402049081150290604051600060405180830381858888f19350505050151561244657600080fd5b601554600160a060020a03166103e8606983020480156108fc0290604051600060405180830381858888f19350505050151561248157600080fd5b601654600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124bc57600080fd5b601754600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124f757600080fd5b601854600160a060020a03166103e86101fe83020480156108fc0290604051600060405180830381858888f1935050505015156122bd57600080fd5b600a5460a060020a900460ff161561254a57600080fd5b6125543385614448565b151561255f57600080fd5b61256884611155565b151561257357600080fd5b60065461258a908590600160a060020a031661446f565b600654600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b600854600160a060020a031681565b60095433600160a060020a0390811691161461263557600080fd5b600b82805161264892916020019061538f565b50600c8180516118bd92916020019061538f565b600954600090819081908190819033600160a060020a0390811691161461268257600080fd5b600a5460a060020a900460ff16151561269a57600080fd5b8994508693508592508891505b64ffffffffff8089169083161161287a5784600160a060020a0316636352211e8360405160e060020a63ffffffff841602815264ffffffffff9091166004820152602401602060405180830381600087803b151561270457600080fd5b5af1151561271157600080fd5b50505060405180519050905086600160a060020a031681600160a060020a031614156127c05783600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561278357600080fd5b5af1151561279057600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b85600160a060020a031681600160a060020a031614156128635782600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561282657600080fd5b5af1151561283357600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b61286f60008284614975565b6001909101906126a7565b50505050505050505050565b60095460009033600160a060020a039081169116146128a457600080fd5b5080600160a060020a03811663dcb31b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156128e357600080fd5b5af115156128f057600080fd5b50505060405180519050151561290557600080fd5b60088054600160a060020a031916600160a060020a039290921691909117905550565b60095433600160a060020a0390811691161461294357600080fd5b600a5460a060020a900460ff161561295a57600080fd5b600a805474ff0000000000000000000000000000000000000000191660a060020a179055565b600a5460a060020a900460ff161561299757600080fd5b64ffffffffff821615806129b057506129b03383614448565b15156129bb57600080fd5b600160a060020a038381166000908152600d60205260409020541615156129e157600080fd5b60008264ffffffffff1611156129fb576129fb828461446f565b600160a060020a038084166000908152600d602052604090819020549091169063a055d4559034908590859033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612a7857600080fd5b5af11515612a8557600080fd5b50505050505050565b601154605060020a900464ffffffffff1681565b60105464ffffffffff1681565b600080612abf8a8a8a8a8a6133db565b90506001818686866040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515612b1957600080fd5b5050602060405103519a9950505050505050505050565b612b3861537d565b60408051908101604052600281527f42430000000000000000000000000000000000000000000000000000000000006020820152905090565b60008060008364ffffffffff16815481101515612b8a57fe5b60009182526020909120600290910201549392505050565b600a5460a060020a900460ff1615612bb957600080fd5b64ffffffffff86161580612bd25750612bd23387614448565b1515612bdd57600080fd5b600160a060020a038881166000908152600d6020526040902054161515612c0357600080fd5b64ffffffffff87166000908152600f6020526040902054600160a060020a031615612c2d57600080fd5b60105464ffffffffff9081169088161015612c4757600080fd5b346001608060020a0386161115612c5d57600080fd5b612c6d8888888888888888611c36565b1515612c7857600080fd5b64ffffffffff87166000908152600f6020526040908190208054600160a060020a03191633600160a060020a038116919091179091557f3b213e544d7183ac9b8a682aa7ad1d52d0b2c05c7aba9bf7bc025d7b3847b63e918991905164ffffffffff9092168252600160a060020a031660208201526040908101905180910390a1600160a060020a038089166000908152600d6020526040908190205490911690639652713e9087908990889033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612d7657600080fd5b5af11515612d8357600080fd5b505050505050505050505050565b60008060008364ffffffffff16815481101515612daa57fe5b600091825260209091206002909102016001015460b060020a900461ffff169392505050565b600a5460009033600160a060020a0390811691161480612dfe575060095433600160a060020a039081169116145b1515612e0957600080fd5b60115464ffffffffff6501000000000082048116911610612e2957600080fd5b612e3a600080600080893042614707565b600554909150612e54908290600160a060020a031661446f565b600554600160a060020a031663c1d1faf3828686863060405160e060020a63ffffffff881602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a401600060405180830381600087803b1515612ed557600080fd5b5af11515612ee257600080fd5b50506011805464ffffffffff8082166001011664ffffffffff19909116179055505050505050565b8015612f445733600160a060020a0390811660009081526007602052604090208054600160a060020a031916918416919091179055612f6b565b600160a060020a03331660009081526007602052604090208054600160a060020a03191690555b81600160a060020a031633600160a060020a03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051901515815260200160405180910390a35050565b60095460009033600160a060020a03908116911614612fd657600080fd5b600160a060020a038083166000908152600d6020526040908190205490911690631195236990518163ffffffff1660e060020a028152600401600060405180830381600087803b151561302857600080fd5b5af1151561303557600080fd5b50505050600160a060020a0381166000908152600d602052604081208054600160a060020a03191690555b600e548110156131215781600160a060020a0316600e8281548110151561308357fe5b600091825260209091200154600160a060020a0316141561311857600e805460001981019081106130b057fe5b600091825260209091200154600e8054600160a060020a0390921691839081106130d657fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600e80549061311290600019830161540d565b5061311c565b6001015b613060565b5050565b600a5433600160a060020a0390811691161480613150575060095433600160a060020a039081169116145b151561315b57600080fd5b600a5460a060020a900460ff161561317257600080fd5b61317c3083614448565b151561318757600080fd5b613121308284614975565b600a5460a060020a900460ff16156131a957600080fd5b8064ffffffffff8111156131bc57600080fd5b6131c63383614448565b15156131d157600080fd5b6118bd338484614975565b600160205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461321257600080fd5b600160a060020a038116151561322757600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600f60205260009081526040902054600160a060020a031681565b600a5460a060020a900460ff161561327b57600080fd5b8264ffffffffff81111561328e57600080fd5b600160a060020a03851615156132a357600080fd5b30600160a060020a031685600160a060020a0316141515156132c457600080fd5b600554600160a060020a03868116911614156132df57600080fd5b600654600160a060020a03868116911614156132fa57600080fd5b613304338561494e565b8061331457506133148633613f21565b151561331f57600080fd5b6133298685614448565b151561333457600080fd5b61333f868686614975565b84600160a060020a031663f0b9e5ba8786868660405160e060020a63ffffffff8716028152600160a060020a0385166004820190815260248201859052606060448301908152606483018490529091608401848480828437820191505095505050505050602060405180830381600087803b15156133bc57600080fd5b5af115156133c957600080fd5b50505060405180515050505050505050565b60008585858585604051600160a060020a03959095166c0100000000000000000000000002855264ffffffffff9384167b0100000000000000000000000000000000000000000000000000000090810260148701529290931690910260198401526001608060020a031670010000000000000000000000000000000002601e830152602e820152604e016040518091039020905095945050505050565b600a546000908190819060a060020a900460ff161561349657600080fd5b6134a03386614448565b15156134ab57600080fd5b6134b58486614a6b565b15156134c057600080fd5b346134cb8686611fbb565b11156134d657600080fd5b6000805464ffffffffff87169081106134eb57fe5b9060005260206000209060020201915061358f8261010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561359a57600080fd5b6000805464ffffffffff86169081106135af57fe5b906000526020600020906002020190506136538161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561365e57600080fd5b61366a82868387614ad4565b151561367557600080fd5b61367f8585614d2a565b95945050505050565b600080548290811061369657fe5b60009182526020909120600290910201805460019091015490915064ffffffffff80821691650100000000008104821691605060020a8204811691607860020a81049091169061ffff60a060020a820481169160b060020a81049091169067ffffffffffffffff60c060020a9091041688565b600a5460009060a060020a900460ff161561372357600080fd5b600160a060020a033381166000908152600d602052604090205416151561374957600080fd5b6000805464ffffffffff851690811061375e57fe5b60009182526020909120600290910201600181015490915064ffffffffff8381166501000000000090920416146118bd57600181015464ffffffffff808516917fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b38189165010000000000909104168460405164ffffffffff9283168152911660208201526040908101905180910390a260018101805464ffffffffff8416650100000000000269ffffffffff000000000019909116179055505050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b820191906000526020600020905b81548152906001019060200180831161389357829003601f168201915b505050505081565b6138c061537d565b61114f613966600b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b820191906000526020600020905b81548152906001019060200180831161393f57829003601f168201915b5050505050614f32565b6139eb61397861397d61397887614f5a565b614f32565b6139eb600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b615270565b600a5460009060a060020a900460ff1615613a0a57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613a3057600080fd5b6000805464ffffffffff8516908110613a4557fe5b60009182526020909120600290910201600181015490915061ffff83811660a060020a90920416146118bd57600181015464ffffffffff8416907f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef2749060a060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660a060020a0275ffff000000000000000000000000000000000000000019909116179055505050565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b60095460009033600160a060020a03908116911614613b8857600080fd5b5080600160a060020a0381166394a892336040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613bc757600080fd5b5af11515613bd457600080fd5b505050604051805190501515613be957600080fd5b600160a060020a038281166000908152600d602052604090208054600160a060020a031916918316919091179055600e805460018101613c29838261540d565b5060009182526020909120018054600160a060020a031916600160a060020a039290921691909117905550565b6000808064ffffffffff8516819011613c6e57600080fd5b600064ffffffffff851611613c8257600080fd5b6000805464ffffffffff8716908110613c9757fe5b9060005260206000209060020201915060008464ffffffffff16815481101515613cbd57fe5b90600052602060002090600202019050613cd982868387614ad4565b801561367f575061367f8486614a6b565b601054790100000000000000000000000000000000000000000000000000900464ffffffffff1681565b600a5460009060a060020a900460ff1615613d2e57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613d5457600080fd5b6000805464ffffffffff8516908110613d6957fe5b906000526020600020906002020190508181600001541415156118bd578264ffffffffff167fbecce9a2928a6d9bbe3755bd02387af9dbe05d1ecfa05028c33d7245e24a860c82600001548460405191825260208201526040908101905180910390a25550565b60095460009033600160a060020a03908116911614613dee57600080fd5b5080600160a060020a0381166390da7c3c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613e2d57600080fd5b5af11515613e3a57600080fd5b505050604051805190501515613e4f57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600554600160a060020a031681565b60008060008060008060008060008964ffffffffff16815481101515613ea357fe5b600091825260209091206002909102018054600190910154909a64ffffffffff8083169b5065010000000000830481169a50605060020a830481169950607860020a830416975061ffff60a060020a83048116975060b060020a909204909116945092505050565b60115465010000000000900464ffffffffff1681565b600160a060020a03918216600090815260076020526040902054821691161490565b6000806000806000806000806000613f59615431565b60095433600160a060020a03908116911614613f7457600080fd5b600a5460a060020a900460ff161515613f8c57600080fd5b8b64ffffffffff16613f9c61153d565b60010114613fa957600080fd5b8c99508b98505b64ffffffffff808c16908a16116142215789600160a060020a031663e39bdfab8a60405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160e060405180830381600087803b151561400d57600080fd5b5af1151561401a57600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051969e50949c50929a50909850965094509092506101009050604051908101604052808981526020018864ffffffffff1681526020018764ffffffffff1681526020018664ffffffffff1681526020018564ffffffffff1681526020018461ffff1681526020018361ffff168152602001600067ffffffffffffffff168152509050600080548060010182816140db9190615475565b6000928352602090922083916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001918201805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790559a909a019950613fb09050565b50505050505050505050505050565b600e80548290811061423e57fe5b600091825260209091200154600160a060020a0316905081565b600a54600090819060a060020a900460ff161561427457600080fd5b61427e3384614448565b151561428957600080fd5b61429283611155565b151561429d57600080fd5b6142a783856152dc565b15156142b257600080fd5b6142bc8385611fbb565b905034819010156142cc57600080fd5b600654600160a060020a031663c170fd54348390038660405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561431d57600080fd5b5af1151561432a57600080fd5b505050506143388385614d2a565b64ffffffffff16949350505050565b60008060008364ffffffffff1681548110151561436057fe5b600091825260209091206002909102016001015465010000000000900464ffffffffff169392505050565b600a5460a060020a900460ff16156143a257600080fd5b6143ac3382614448565b15156143b757600080fd5b64ffffffffff8116600090815260046020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907fe53f1ce10d7caafaafcb8d2857c06db87da891294ba914f8436e31b905e1e0e79084905164ffffffffff909116815260200160405180910390a35050565b600042826040015164ffffffffff16111592915050565b64ffffffffff16600090815260016020526040902054600160a060020a0391821691161490565b64ffffffffff9190911660009081526003602052604090208054600160a060020a031916600160a060020a03909216919091179055565b600181015460085460a060020a90910461ffff1690600090600160a060020a03166306347def8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b151561450657600080fd5b5af1151561451357600080fd5b505050604051805160018501805469ffffffffff000000000019166501000000000064ffffffffff9384168102919091179182905587831693507fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b3818928692919091041660405164ffffffffff9283168152911660208201526040908101905180910390a2600854600160a060020a031663732606fc6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156145d657600080fd5b5af115156145e357600080fd5b505050604051805160018086015461ffff60a060020a9091048116909101161015905061193157506001808301805461ffff60a060020a80830482169485018216810275ffff000000000000000000000000000000000000000019909316929092179283905564ffffffffff8716927f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef27492859291041660405161ffff9283168152911660208201526040908101905180910390a250505050565b600854600090600160a060020a0316635757dcdf8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156146eb57600080fd5b5af115156146f857600080fd5b50505060405180519392505050565b6000614711615431565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e0820181905280549194506001918083016147788382615475565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555003915064ffffffffff8211156148c757600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a261494060008783614975565b9a9950505050505050505050565b64ffffffffff16600090815260036020526040902054600160a060020a0391821691161490565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a0319169091179055831615614a1757600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b64ffffffffff8082166000908152600160205260408082205492851682528120549091600160a060020a0390811691168082148061367f575064ffffffffff8516600090815260046020526040902054600160a060020a03908116908316149250505092915050565b60008364ffffffffff168264ffffffffff161415614af457506000614d22565b600185015464ffffffffff838116605060020a909204161415614b1957506000614d22565b600185015464ffffffffff838116607860020a909204161415614b3e57506000614d22565b600183015464ffffffffff858116605060020a909204161415614b6357506000614d22565b600183015464ffffffffff858116607860020a909204161415614b8857506000614d22565b6001830154605060020a900464ffffffffff161515614ba957506001614d22565b6001850154605060020a900464ffffffffff161515614bca57506001614d22565b60018581015490840154605060020a9182900464ffffffffff90811692909104161415614bf957506000614d22565b60018086015490840154605060020a900464ffffffffff908116607860020a909204161415614c2a57506000614d22565b60018086015490840154607860020a900464ffffffffff908116605060020a909204161415614c5b57506000614d22565b60018581015490840154607860020a9182900464ffffffffff90811692909104161415614c8a57506000614d22565b60125485548454600160a060020a039092169163c868a569918791869060405160e060020a63ffffffff871602815264ffffffffff94851660048201526024810193909352921660448201526064810191909152608401602060405180830381600087803b1515614cfa57600080fd5b5af11515614d0757600080fd5b5050506040518051905015614d1e57506001614d22565b5060005b949350505050565b6000806000806000806000808864ffffffffff16815481101515614d4a57fe5b9060005260206000209060020201955060008964ffffffffff16815481101515614d7057fe5b90600052602060002090600202019450614d8a88876144a6565b614d9489866144a6565b64ffffffffff808a166000908152600460205260408082208054600160a060020a03199081169091558b841683529120805490911690556001860154161515614ddc57600080fd5b60085460018681015490880154600160a060020a0390921691631af97fb79161ffff60b060020a91829004811692919091041660405160e060020a63ffffffff851602815261ffff928316600482015291166024820152604401602060405180830381600087803b1515614e4f57600080fd5b5af11515614e5c57600080fd5b505050604051805160125487548954929750600160a060020a039091169250638d8b1b889160405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b1515614ebc57600080fd5b5af11515614ec957600080fd5b505050604051805164ffffffffff8b16600090815260016020526040902054909450600160a060020a03169250614f259050898986614f078161469d565b60018a01548890889065010000000000900464ffffffffff16614707565b9998505050505050505050565b614f3a6154a1565b602082016040805190810160405280845181526020019190915292915050565b614f6261537d565b614f6a61537d565b6000614f7461537d565b60206040519081016040526000815292505b600a808604950691506020604051908101604052600081529050811515614fe25760408051908101604052600181527f300000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600114156150265760408051908101604052600181527f310000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816002141561506a5760408051908101604052600181527f320000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600314156150ae5760408051908101604052600181527f330000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600414156150f25760408051908101604052600181527f340000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600514156151365760408051908101604052600181527f350000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816006141561517a5760408051908101604052600181527f360000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600714156151be5760408051908101604052600181527f370000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600814156152025760408051908101604052600181527f380000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600914156152425760408051908101604052600181527f3900000000000000000000000000000000000000000000000000000000000000602082015290505b61525761524e82614f32565b6139eb85614f32565b9250600085111561526757614f86565b50909392505050565b61527861537d565b61528061537d565b600083518551016040518059106152945750595b818152601f19601f8301168101602001604052905091506020820190506152c18186602001518751615338565b6152d48551820185602001518651615338565b509392505050565b6000806000808564ffffffffff168154811015156152f657fe5b9060005260206000209060020201915060008464ffffffffff1681548110151561531c57fe5b9060005260206000209060020201905061367f82868387614ad4565b60005b6020821061535e578251845260208401935060208301925060208203915061533b565b6001826020036101000a03905080198351168185511617909352505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153d057805160ff19168380011785556153fd565b828001600101855582156153fd579182015b828111156153fd5782518255916020019190600101906153e2565b506154099291506154b8565b5090565b8154818355818115116118bd576000838152602090206118bd9181019083016154b8565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b8154818355818115116118bd576002028160020283600052602060002091820191016118bd91906154d2565b604080519081016040526000808252602082015290565b61126d91905b8082111561540957600081556001016154be565b61126d91905b8082111561540957600080825560018201556002016154d85600a165627a7a72305820fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b0029

Swarm Source

bzzr://fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b
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.