Contract 0xea2e87ff1bc1E52b640452694E2F143F7f8D64bE

 
Txn Hash
Block
From
To
Value [Txn Fee]
0x5b02b9d402a79d03eb769b342b69ceb121e302243e70ed67a8ccb937bb39e7b794573802021-07-25 5:40:5814 secs ago0xac9d7336ec3df01596bd3bf20ff53acc66bb4761 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000145825
0x81a23570fb1d445fda5417853f9acde00e35e52408643f3b295994c062ff6e5794573802021-07-25 5:40:5814 secs ago0x61b2bd5d6caebb785d0262fada237cc5f84c2499 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x73e3e1ade1d2844c3b6a1635c76aa285e1f73313bff3a133d86d73e64cf3796294573802021-07-25 5:40:5814 secs ago0x6cec4af419fbba54a446e59a01e8596118ff9450 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000145825
0x4f9b0c658c9ae27bf9189d4e74cc82e42c0e98ce7f00440d42ac48019f9d124d94573792021-07-25 5:40:5517 secs ago0x6d0e90c528cbc04128d7cfc8990cfc4f80fb74db IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000145825
0x221b4538cf2be997cc69944354cea1b388fa5134fc89d3c3da82d793761b45bb94573782021-07-25 5:40:5220 secs ago0x6cbb049c887040c5afafb0429cbe01c9962e8ef1 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xe40502293d05fd3570162a1ba354e8777a1bb8df5062da87d8b6c62cb13b26eb94573752021-07-25 5:40:4329 secs ago0x4e8485e4195cf5b7dd2f9e5b47fcaff2ba701009 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00076912
0x133d399e5800c58bda51d3050299b36cecb98f3f9d133961ef0cae58d40a62c194573742021-07-25 5:40:4032 secs ago0x698e3849cd40f33fc32939b10dbee9a9354a5d17 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00091912
0x8bfec4c995294da8202ce6d817abf5f2ae49de4698b6b83382f9b92a4ed129f494573732021-07-25 5:40:3735 secs ago0x46e54171900499378de66ef577acc33910bd5fc3 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000291775
0x1842d9bb02f4300cec56f34afc30e6cad2b2bdcf1f5d53990d7098e3cd794fac94573732021-07-25 5:40:3735 secs ago0xd4f748ac956c4f4c1427805fb8a1a682139a9699 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000676845
0xd4a21022257861d30d7b00e1b7e3f557c5b878c7b5383f1d17264bf5c2be6f0794573732021-07-25 5:40:3735 secs ago0xbc697c16c7cd44e816bca7e51ba5a2a8f4b9ed59 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000145825
0x01376ee6e065cac54e4080ae040a90f07b350725185070a4e1928ea2274214bc94573732021-07-25 5:40:3735 secs ago0x5425318cc431e76fc8be15593624b362b235281f IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00091912
0x4fee86737f854b5b675e660f8ba9e2e4531795180510dba986888153feef61fb94573722021-07-25 5:40:3438 secs ago0xe6a48fec0ab38e1919dab681cfea8d8b47bdc7f9 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000133415
0x08287b6b921d88b546395b44e5dde4e3aaa5829469b8f73b3e0a28f79c7609e794573722021-07-25 5:40:3438 secs ago0x4bbc13a41ae8182f8f4c2bec52b6c2713804a4fb IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x5f002b5ddce41dbc30c646ab30db3319965f7580062c8e365952d55aef4ea3ab94573702021-07-25 5:40:2844 secs ago0xd53a196ed1cd961966313ed37ff98e7467db79ea IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000145825
0x14873877a7a73829054dee678d2351b5883534098bc82b045e402d568f33822494573682021-07-25 5:40:2250 secs ago0x9016ebb57d71d6b2d70105a1a7178f4cc4710a95 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x0bd2ab018c9afa74faad993fa28b21296b6d4f11e6ead3136a1eda46e6e35efa94573682021-07-25 5:40:2250 secs ago0x2b674ede7e386fb612427025fbe29ff9f16bee82 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x23951c7147c67e7ccfd8caa104faf92e2d0d0857414202fd5fd7db3c827ee67694573682021-07-25 5:40:2250 secs ago0x52c0a0682c184a409012d301c2a241e50b857790 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x071a0ddf725b12833a1c8dee202832f31303352ec13c72ca7987117b424e929a94573672021-07-25 5:40:1953 secs ago0xf82ef21ffb71ce1cae332f6cd535ec453a249d65 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xc7b294d48117df23e97fa31e03b71e586ceaaafd511af63c4df9c59446e8cdeb94573662021-07-25 5:40:1656 secs ago0x6e8c9d4b10d2c95f61e5457634272339acd68860 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000145825
0xceabfbe7d1eb2734f76c1a52146deaae7cf6c58006c85289eda581f5f087694e94573652021-07-25 5:40:1359 secs ago0xccb8c51b6b74b4a909c016917ee890c066b17d78 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xd90eb43cb51cedd407abd1e20bddb7f8af3da2e8fc81f100d0f0b92dc7698e7494573652021-07-25 5:40:1359 secs ago0xbab11adc0cb60f983654d66958002aa4fc2f5f2e IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084406
0x9f3dd30f29241190f3e58bbc5d77b361ae7b6a9afb336f53e428c92ff321caee94573652021-07-25 5:40:1359 secs ago0x5580ba66f8d6dc71adb0ca1d1c6b3d142ff7aaca IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00091912
0xf70e7723fbd948b819458a5650b69922e2c7a4070dd48ab2c9884bb05db840b994573642021-07-25 5:40:101 min ago0xc771c5c28fc2287d441db4847fa611e9353ae423 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xa61e25a8f54b55596e39ad5646fe9c62c718c8f70befb5f206a2b32f0dc8f27d94573632021-07-25 5:40:071 min ago0x6f5d1a6a7aba47b7792bdc83b8249b72002f4187 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084406
0x2f1bd33410cd7d68e896312bfd0f81f643b2db0eea9f89f85971121ad1ee8de694573622021-07-25 5:40:041 min ago0xf4ce277a6b8570df89209cbdee9d7e2be35fb986 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PetCore

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-04-27
*/

pragma solidity ^0.5.0;


library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner, "Ownable: caller is not the owner");
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) external onlyOwner {
    if (newOwner != address(0)) {
      owner = newOwner;
    }
  }

}

contract KRC721 {
    function totalSupply() public view returns (uint256 total);
    function balanceOf(address _owner) public view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) external view returns (address owner);
    function approve(address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    // Events
    event Transfer(address from, address to, uint256 tokenId);
    event Approval(address owner, address approved, uint256 tokenId);

    function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}

interface IGeneScience {

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

interface IKRC20 {
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

interface IPetCore {
    function createPet(address _owner) external;
}


contract PetAccessControl is Ownable {

    // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked
    bool public paused = false;

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

    modifier whenPaused {
        require(paused);
        _;
    }

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

    function unpause() external onlyOwner whenPaused {
        // can't unpause if contract was upgraded
        paused = false;
    }
}

contract PetBase is PetAccessControl {

    /// @dev The Birth event is fired whenever a new pet comes into existence.
    event Birth(address owner, uint256 PetId, uint256 matronId, uint256 sireId, uint256 genes);

    /// @dev Transfer event as defined in current draft of KRC721.
    event Transfer(address from, address to, uint256 tokenId);

    /*** DATA TYPES ***/
    struct Pet {
        // The Pet's genetic code is packed into these 256-bits
        uint256 genes;

        // The timestamp from the block when this pet came into existence.
        uint64 birthTime;

        // The minimum timestamp after which this pet can engage in breeding
        // activities again.
        uint64 cooldownEndBlock;

        uint256 matronId;
        uint256 sireId;

        // Set to the ID of the sire pet for matrons that are pregnant,
        // zero otherwise. A non-zero value here is how we know a pet
        // is pregnant. Used to retrieve the genetic material for the new
        // pet when the birth transpires.
        uint256 siringWithId;

        // Set to the index in the cooldown array that represents
        // the current cooldown duration for this Pet. This starts at zero
        // for gen0 pets, and is initialized to floor(generation/2) for others.
        // Incremented by one for each successful breeding action, regardless
        // of whether this pet is acting as matron or sire.
        uint16 cooldownIndex;

        // The "generation number" of this pet. pets minted by the CP contract
        // for sale are called "gen0" and have a generation number of 0. The
        // generation number of all other pets is the larger of the two generation
        // numbers of their parents, plus one.
        // (i.e. max(matron.generation, sire.generation) + 1)
        uint16 generation;
        
        // The stages of this pet, starts from the junior stage, when feeding on, the pet grows to adulthood and middle-Age
        uint16 stages;
    }

    /*** CONSTANTS ***/

    /// @dev A lookup table indipeting the cooldown duration after any successful
    ///  breeding action, called "pregnancy time" for matrons and "siring cooldown"
    ///  for sires. Designed such that the cooldown roughly doubles each time a pet
    ///  is bred, encouraging owners not to just keep breeding the same pet over
    ///  and over again. Caps out at one week (a pet can breed an unbounded number
    ///  of times, and the maximum cooldown is always seven days).
    uint32[14] public cooldowns = [
        uint32(1 minutes),
        uint32(2 minutes),
        uint32(5 minutes),
        uint32(10 minutes),
        uint32(30 minutes),
        uint32(1 hours),
        uint32(2 hours),
        uint32(4 hours),
        uint32(8 hours),
        uint32(16 hours),
        uint32(1 days),
        uint32(2 days),
        uint32(4 days),
        uint32(7 days)
    ];

    // An approximation of currently how many seconds are in between blocks.
    uint256 public secondsPerBlock = 6;

    /*** STORAGE ***/

    /// @dev An array containing the Pet struct for all pets in existence. The ID
    ///  of each pet is actually an index into this array. Note that ID 0 is a negapet,
    ///  the unPet, the mythical beast that is the parent of all gen0 pets.
    Pet[] pets;

    mapping (uint256 => address) public PetIndexToOwner;

    // Used internally inside balanceOf() to resolve ownership count.
    mapping (address => uint256) ownershipTokenCount;

    /// @dev A mapping from PetIDs to an address that has been approved to call
    ///  transferFrom().
    mapping (uint256 => address) public PetIndexToApproved;

    /// @dev A mapping from PetIDs to an address that has been approved to use
    ///  this Pet for siring via breedWith().
    mapping (uint256 => address) public sireAllowedToAddress;

    SaleClockAuction public saleAuction;

    /// @dev The address of a custom ClockAuction subclassed contract that handles siring
    ///  auctions. Needs to be separate from saleAuction because the actions taken on success
    ///  after a sales and siring auction are quite different.
    SiringClockAuction public siringAuction;

    /// @dev Assigns ownership of a specific Pet to an address.
    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        ownershipTokenCount[_to]++;
        PetIndexToOwner[_tokenId] = _to;
        if (_from != address(0)) {
            ownershipTokenCount[_from]--;
            delete sireAllowedToAddress[_tokenId];
            delete PetIndexToApproved[_tokenId];
        }
        emit Transfer(_from, _to, _tokenId);
    }

    /// @dev An internal method that creates a new Pet and stores it.
    /// @param _matronId The Pet ID of the matron of this pet (zero for gen0)
    /// @param _sireId The Pet ID of the sire of this pet (zero for gen0)
    /// @param _generation The generation number of this pet.
    /// @param _genes The Pet's genetic code.
    /// @param _owner The inital owner of this pet, must be non-zero (except for the unPet, ID 0)
    function _createPet(
        uint256 _matronId,
        uint256 _sireId,
        uint256 _generation,
        uint256 _genes,
        address _owner
    )
        internal
        returns (uint)
    {
        // New Pet starts with the same cooldown as parent gen/2
        uint16 cooldownIndex = uint16(_generation / 2);
        if (cooldownIndex > 13) {
            cooldownIndex = 13;
        }

        Pet memory _Pet = Pet({
            genes: _genes,
            birthTime: uint64(now),
            cooldownEndBlock: 0,
            matronId: uint32(_matronId),
            sireId: uint32(_sireId),
            siringWithId: 0,
            cooldownIndex: cooldownIndex,
            generation: uint16(_generation),
            stages: uint16(1)
        });
        uint256 newpetId = pets.push(_Pet) - 1;

        emit Birth(
            _owner,
            newpetId,
            uint256(_Pet.matronId),
            uint256(_Pet.sireId),
            _Pet.genes
        );

        _transfer(address(0), _owner, newpetId);

        return newpetId;
    }

    function setSecondsPerBlock(uint256 secs) external onlyOwner {
        require(secs < cooldowns[0]);
        secondsPerBlock = secs;
    }
}


contract PetOwnership is PetBase, KRC721 {

    string public constant name = "My DeFi Pet";
    string public constant symbol = "MDP";

    bytes4 constant InterfaceSignature_KRC165 =
        bytes4(keccak256('supportsInterface(bytes4)'));

    bytes4 constant InterfaceSignature_KRC721 =
        bytes4(keccak256('name()')) ^
        bytes4(keccak256('symbol()')) ^
        bytes4(keccak256('totalSupply()')) ^
        bytes4(keccak256('balanceOf(address)')) ^
        bytes4(keccak256('ownerOf(uint256)')) ^
        bytes4(keccak256('approve(address,uint256)')) ^
        bytes4(keccak256('transfer(address,uint256)')) ^
        bytes4(keccak256('transferFrom(address,address,uint256)')) ^
        bytes4(keccak256('tokensOfOwner(address)')) ^
        bytes4(keccak256('tokenMetadata(uint256,string)'));


    function supportsInterface(bytes4 _interfaceID) external view returns (bool)
    {

        return ((_interfaceID == InterfaceSignature_KRC165) || (_interfaceID == InterfaceSignature_KRC721));
    }

    /// @dev Checks if a given address is the current owner of a particular Pet.
    /// @param _claimant the address we are validating against.
    /// @param _tokenId pet id, only valid when > 0
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return PetIndexToOwner[_tokenId] == _claimant;
    }

    /// @dev Checks if a given address currently has transferApproval for a particular Pet.
    /// @param _claimant the address we are confirming pet is approved for.
    /// @param _tokenId pet id, only valid when > 0
    function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return PetIndexToApproved[_tokenId] == _claimant;
    }

    function _approve(uint256 _tokenId, address _approved) internal {
        PetIndexToApproved[_tokenId] = _approved;
    }

    /// @notice Returns the number of pets owned by a specific address.
    /// @param _owner The owner address to check.
    function balanceOf(address _owner) public view returns (uint256 count) {
        return ownershipTokenCount[_owner];
    }

    /// @notice Transfers a Pet to another address
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _tokenId The ID of the Pet to transfer.
    function transfer(
        address _to,
        uint256 _tokenId
    )
        external
        whenNotPaused
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_to != address(saleAuction));
        require(_to != address(siringAuction));

        require(_owns(msg.sender, _tokenId));

        _transfer(msg.sender, _to, _tokenId);
    }

    /// @param _to The address to be granted transfer approval. Pass address(0) to
    ///  clear all approvals.
    /// @param _tokenId The ID of the Pet that can be transferred if this call succeeds.
    function approve(
        address _to,
        uint256 _tokenId
    )
        external
        whenNotPaused
    {
        require(_owns(msg.sender, _tokenId));

        _approve(_tokenId, _to);

        emit Approval(msg.sender, _to, _tokenId);
    }

    /// @param _from The address that owns the Pet to be transfered.
    /// @param _to The address that should take ownership of the Pet. Can be any address,
    ///  including the caller.
    /// @param _tokenId The ID of the Pet to be transferred.
    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
        external
        whenNotPaused
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_approvedFor(msg.sender, _tokenId));
        require(_owns(_from, _tokenId));

        _transfer(_from, _to, _tokenId);
    }

    /// @notice Returns the total number of pets currently in existence.
    function totalSupply() public view returns (uint) {
        return pets.length - 1;
    }

    /// @notice Returns the address currently assigned ownership of a given Pet.
    function ownerOf(uint256 _tokenId)
        external
        view
        returns (address owner)
    {
        owner = PetIndexToOwner[_tokenId];

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

    /// @notice Returns a list of all Pet IDs assigned to an address.
    /// @param _owner The owner whose pets we are interested in.
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ownerTokens) {
        uint256 tokenCount = balanceOf(_owner);

        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 totalpets = totalSupply();
            uint256 resultIndex = 0;

            uint256 petId;

            for (petId = 1; petId <= totalpets; petId++) {
                if (PetIndexToOwner[petId] == _owner) {
                    result[resultIndex] = petId;
                    resultIndex++;
                }
            }

            return result;
        }
    }
}

/// @title A facet of PetCore that manages Pet siring, gestation, and birth.
contract PetBreeding is PetOwnership {
    
    address public dpetToken = 0xfb62AE373acA027177D1c18Ee0862817f9080d08;

    /// @dev The Pregnant event is fired when two pets successfully breed and the pregnancy
    ///  timer begins for the matron.
    event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);

    uint256 public autoBirthFee = 1*10**18; // pet token

    // Keeps track of number of pregnant pets.
    uint256 public pregnantpets;

    address public geneScience;

    function setGeneScienceAddress(address _address) external onlyOwner {
        geneScience = _address;
    }

    /// @dev Checks that a given pet is able to breed. Requires that the
    ///  current cooldown is finished (for sires) and also checks that there is
    ///  no pending pregnancy.
    function _isReadyToBreed(Pet memory _pet) internal view returns (bool) {
        return (_pet.siringWithId == 0) && (_pet.cooldownEndBlock <= uint64(block.number));
    }

    /// @dev Check if a sire has authorized breeding with this matron. True if both sire
    ///  and matron have the same owner, or if the sire has given siring permission to
    ///  the matron's owner (via approveSiring()).
    function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {
        address matronOwner = PetIndexToOwner[_matronId];
        address sireOwner = PetIndexToOwner[_sireId];

        return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);
    }

    /// @dev Set the cooldownEndTime for the given Pet, based on its current cooldownIndex.
    /// @param _pet A reference to the Pet in storage which needs its timer started.
    function _triggerCooldown(Pet storage _pet) internal {
        _pet.cooldownEndBlock = uint64((cooldowns[_pet.cooldownIndex]/secondsPerBlock) + block.number);

        if (_pet.cooldownIndex < 13) {
            _pet.cooldownIndex += 1;
        }
    }

    /// @notice Grants approval to another user to sire with one of your pets.
    /// @param _addr The address that will be able to sire with your Pet. Set to
    ///  address(0) to clear all siring approvals for this Pet.
    /// @param _sireId A Pet that you own that _addr will now be able to sire with.
    function approveSiring(address _addr, uint256 _sireId)
        external
        whenNotPaused
    {
        require(_owns(msg.sender, _sireId));
        sireAllowedToAddress[_sireId] = _addr;
    }

    function setAutoBirthFee(uint256 val) external onlyOwner {
        autoBirthFee = val;
    }

    function _isReadyToGiveBirth(Pet memory _matron) private view returns (bool) {
        return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));
    }

    /// @notice Checks that a given pet is able to breed
    /// @param _PetId reference the id of the pet
    function isReadyToBreed(uint256 _PetId)
        public
        view
        returns (bool)
    {
        require(_PetId > 0);
        Pet storage pet = pets[_PetId];
        return _isReadyToBreed(pet);
    }

    /// @dev Checks whether a Pet is currently pregnant.
    /// @param _PetId reference the id of the pet
    function isPregnant(uint256 _PetId)
        public
        view
        returns (bool)
    {
        require(_PetId > 0);
        return pets[_PetId].siringWithId != 0;
    }

    /// @param _matron A reference to the Pet struct of the potential matron.
    /// @param _matronId The matron's ID.
    /// @param _sire A reference to the Pet struct of the potential sire.
    /// @param _sireId The sire's ID
    function _isValidMatingPair(
        Pet storage _matron,
        uint256 _matronId,
        Pet storage _sire,
        uint256 _sireId
    )
        private
        view
        returns(bool)
    {
        // A Pet can't breed with itself!
        if (_matronId == _sireId) {
            return false;
        }

        // pets can't breed with their parents.
        if (_matron.matronId == _sireId || _matron.sireId == _sireId) {
            return false;
        }
        if (_sire.matronId == _matronId || _sire.sireId == _matronId) {
            return false;
        }

        if (_sire.matronId == 0 || _matron.matronId == 0) {
            return true;
        }

        // pets can't breed with full or half siblings.
        if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {
            return false;
        }
        if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {
            return false;
        }

        return true;
    }

    /// @dev Internal check to see if a given sire and matron are a valid mating pair for
    ///  breeding via auction.
    function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)
        internal
        view
        returns (bool)
    {
        Pet storage matron = pets[_matronId];
        Pet storage sire = pets[_sireId];
        return _isValidMatingPair(matron, _matronId, sire, _sireId);
    }

    /// @param _matronId The ID of the proposed matron.
    /// @param _sireId The ID of the proposed sire.
    function canBreedWith(uint256 _matronId, uint256 _sireId)
        external
        view
        returns(bool)
    {
        require(_matronId > 0);
        require(_sireId > 0);
        Pet storage matron = pets[_matronId];
        Pet storage sire = pets[_sireId];
        return _isValidMatingPair(matron, _matronId, sire, _sireId) &&
            _isSiringPermitted(_sireId, _matronId);
    }

    function _breedWith(uint256 _matronId, uint256 _sireId) internal {
        // Grab a reference to the pets from storage.
        Pet storage sire = pets[_sireId];
        Pet storage matron = pets[_matronId];

        // Mark the matron as pregnant, keeping track of who the sire is.
        matron.siringWithId = uint32(_sireId);

        // Trigger the cooldown for both parents.
        _triggerCooldown(sire);
        _triggerCooldown(matron);

        delete sireAllowedToAddress[_matronId];
        delete sireAllowedToAddress[_sireId];

        pregnantpets++;

        emit Pregnant(PetIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);
    }

    /// @param _matronId The ID of the Pet acting as matron
    /// @param _sireId The ID of the Pet acting as sire
    function breedWithAuto(uint256 _matronId, uint256 _sireId, uint256 _amount)
        external
        whenNotPaused
    {
        // Checks for .
        require(_amount >= autoBirthFee, "Must payment");
        require(IKRC20(dpetToken).transferFrom(msg.sender, address(this), _amount));
        // Caller must own the matron.
        require(_owns(msg.sender, _matronId));
        require(_isSiringPermitted(_sireId, _matronId));

        // Grab a reference to the potential matron
        Pet storage matron = pets[_matronId];

        // Make sure matron isn't pregnant, or in the middle of a siring cooldown
        require(_isReadyToBreed(matron));

        // Grab a reference to the potential sire
        Pet storage sire = pets[_sireId];

        // Make sure sire isn't pregnant, or in the middle of a siring cooldown
        require(_isReadyToBreed(sire));

        require(_isValidMatingPair(
            matron,
            _matronId,
            sire,
            _sireId
        ));

        _breedWith(_matronId, _sireId);
    }

    /// @notice Have a pregnant Pet give birth!
    /// @param _matronId A Pet ready to give birth.
    /// @return The Pet ID of the new pet.
    function giveBirth(uint256 _matronId)
        external
        whenNotPaused
        returns(uint256)
    {
        Pet storage matron = pets[_matronId];

        // Check that the matron is a valid pet.
        require(matron.birthTime != 0, "Invalid pet");

        require(_isReadyToGiveBirth(matron), "Not ready birth");

        uint256 sireId = matron.siringWithId;
        Pet storage sire = pets[sireId];

        uint16 parentGen = matron.generation;
        if (sire.generation > matron.generation) {
            parentGen = sire.generation;
        }

        uint256 childGenes = IGeneScience(geneScience).mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);

        address owner = PetIndexToOwner[_matronId];
        uint256 petId = _createPet(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);

        delete matron.siringWithId;

        pregnantpets--;

        return petId;
    }
}

/// @title Auction Core
contract ClockAuctionBase {
    using SafeMath for uint256;
     
    address public dpetToken = 0xfb62AE373acA027177D1c18Ee0862817f9080d08;

    // Represents an auction on an NFT
    struct Auction {
        // Current owner of NFT
        address seller;
        // Price at beginning of auction
        uint128 startingPrice;
        // Price at end of auction
        uint128 endingPrice;
        // Duration (in seconds) of auction
        uint64 duration;
        // Time when auction started
        uint64 startedAt;
    }

    // Reference to contract tracking NFT ownership
    KRC721 public nonFungibleContract;

    uint256 public ownerCut;
    mapping (uint256 => Auction) tokenIdToAuction;

    event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);
    event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);
    event AuctionCancelled(uint256 tokenId);

    /// @dev Returns true if the claimant owns the token.
    /// @param _claimant - Address claiming to own the token.
    /// @param _tokenId - ID of token whose ownership to verify.
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (nonFungibleContract.ownerOf(_tokenId) == _claimant);
    }

    /// @dev Escrows the NFT, assigning ownership to this contract.
    /// @param _owner - Current owner address of token to escrow.
    /// @param _tokenId - ID of token whose approval to verify.
    function _escrow(address _owner, uint256 _tokenId) internal {
        // it will throw if transfer fails
        nonFungibleContract.transferFrom(_owner, address(this), _tokenId);
    }

    /// @dev Transfers an NFT owned by this contract to another address.
    /// @param _receiver - Address to transfer NFT to.
    /// @param _tokenId - ID of token to transfer.
    function _transfer(address _receiver, uint256 _tokenId) internal {
        nonFungibleContract.transfer(_receiver, _tokenId);
    }

    /// @dev Adds an auction to the list of open auctions.
    /// @param _tokenId The ID of the token to be put on auction.
    /// @param _auction Auction to add.
    function _addAuction(uint256 _tokenId, Auction memory _auction) internal {
        require(_auction.duration >= 1 minutes);

        tokenIdToAuction[_tokenId] = _auction;

        emit AuctionCreated(
            uint256(_tokenId),
            uint256(_auction.startingPrice),
            uint256(_auction.endingPrice),
            uint256(_auction.duration)
        );
    }

    /// @dev Cancels an auction unconditionally.
    function _cancelAuction(uint256 _tokenId, address _seller) internal {
        _removeAuction(_tokenId);
        _transfer(_seller, _tokenId);
        emit AuctionCancelled(_tokenId);
    }

    /// @dev Computes the price and transfers winnings.
    function _bid(uint256 _tokenId, uint256 _bidAmount)
        internal
        returns (uint256)
    {
        // Get a reference to the auction struct
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));

        // Check that the bid is greater than or equal to the current price
        uint256 price = _currentPrice(auction);
        require(_bidAmount >= price);

        address seller = auction.seller;

        // The bid is good! Remove the auction before sending the fees
        // to the sender so we can't have a reentrancy attack.
        _removeAuction(_tokenId);

        if (price > 0) {
            uint256 auctioneerCut = _computeCut(price);
            uint256 sellerProceeds = price - auctioneerCut;

            require(IKRC20(dpetToken).transfer(seller, sellerProceeds));
        }

        uint256 bidExcess = _bidAmount - price;

        require(IKRC20(dpetToken).transfer(msg.sender, bidExcess));

        emit AuctionSuccessful(_tokenId, price, msg.sender);

        return price;
    }

    /// @dev Removes an auction from the list of open auctions.
    /// @param _tokenId - ID of NFT on auction.
    function _removeAuction(uint256 _tokenId) internal {
        delete tokenIdToAuction[_tokenId];
    }

    /// @dev Returns true if the NFT is on auction.
    /// @param _auction - Auction to check.
    function _isOnAuction(Auction storage _auction) internal view returns (bool) {
        return (_auction.startedAt > 0);
    }

    function _currentPrice(Auction storage _auction)
        internal
        view
        returns (uint256)
    {
        uint256 secondsPassed = 0;

        if (now > _auction.startedAt) {
            secondsPassed = now - _auction.startedAt;
        }

        return _computeCurrentPrice(
            _auction.startingPrice,
            _auction.endingPrice,
            _auction.duration,
            secondsPassed
        );
    }

    /// @dev Computes the current price of an auction.
    function _computeCurrentPrice(
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        uint256 _secondsPassed
    )
        internal
        pure
        returns (uint256)
    {
        if (_secondsPassed >= _duration) {
            return _endingPrice;
        } else {
            uint256 totalPriceChange = _endingPrice.sub(_startingPrice);

            uint256 currentPriceChange = totalPriceChange * _secondsPassed / _duration;

            uint256 currentPrice = _startingPrice + currentPriceChange;

            return currentPrice;
        }
    }

    /// @dev Computes owner's cut of a sale.
    /// @param _price - Sale price of NFT.
    function _computeCut(uint256 _price) internal view returns (uint256) {
        return _price * ownerCut / 10000;
    }

}


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev modifier to allow actions only when the contract IS paused
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev modifier to allow actions only when the contract IS NOT paused
   */
  modifier whenPaused {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() external onlyOwner whenNotPaused returns (bool) {
    paused = true;
    emit Pause();
    return true;
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() external onlyOwner whenPaused returns (bool) {
    paused = false;
    emit Unpause();
    return true;
  }
}


/// @title Clock auction for non-fungible tokens.
contract ClockAuction is Pausable, ClockAuctionBase {

    bytes4 constant InterfaceSignature_KRC721 = bytes4(0x9a20483d);

    /// @param _nftAddress - address of a deployed contract implementing
    ///  the Nonfungible Interface.
    /// @param _cut - percent cut the owner takes on each auction, must be
    ///  between 0-10,000.
    constructor(address _nftAddress, uint256 _cut) public {
        require(_cut <= 10000);
        ownerCut = _cut;

        KRC721 candidateContract = KRC721(_nftAddress);
        require(candidateContract.supportsInterface(InterfaceSignature_KRC721));
        nonFungibleContract = candidateContract;
    }

    function withdrawBalance() external onlyOwner {
        address(uint160(owner)).transfer(address(this).balance);
        IKRC20(dpetToken).transfer(owner, getBalance());
    }
    
    function changeCut(uint256 _cut) external onlyOwner {
        require(_cut <= 10000);
        ownerCut = _cut;
    }
    
    function getBalance() view public returns(uint256) {
        return IKRC20(dpetToken).balanceOf(address(this));
    }

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of time to move between starting
    ///  price and ending price (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller
    )
        external
        whenNotPaused
    {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(_owns(msg.sender, _tokenId), "Not PetId owner");
        _escrow(msg.sender, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Bids on an open auction, completing the auction and transferring
    ///  ownership of the NFT if enough KAI is supplied.
    /// @param _tokenId - ID of token to bid on.
    function bid(uint256 _tokenId, uint256 _amount)
        external
        whenNotPaused
    {
        // require(IKRC20(dpetToken).transfer(address(this), _amount));
        // _bid will throw if the bid or funds transfer fails
        _bid(_tokenId, _amount);
        _transfer(msg.sender, _tokenId);
    }

    /// @dev Cancels an auction that hasn't been won yet.
    ///  Returns the NFT to original owner.
    /// @notice This is a state-modifying function that can
    ///  be called while the contract is paused.
    /// @param _tokenId - ID of token on auction
    function cancelAuction(uint256 _tokenId)
        external
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction), "TokenID is a must on auction");
        address seller = auction.seller;
        require(msg.sender == seller);
        _cancelAuction(_tokenId, seller);
    }

    /// @dev Cancels an auction when the contract is paused.
    ///  Only the owner may do this, and NFTs are returned to
    ///  the seller. This should only be used in emergencies.
    /// @param _tokenId - ID of the NFT on auction to cancel.
    function cancelAuctionWhenPaused(uint256 _tokenId)
        whenPaused
        onlyOwner
        external
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction), "TokenID is a must on auction");
        _cancelAuction(_tokenId, auction.seller);
    }

    /// @dev Returns auction info for an NFT on auction.
    /// @param _tokenId - ID of NFT on auction.
    function getAuction(uint256 _tokenId)
        external
        view
        returns
    (
        address seller,
        uint256 startingPrice,
        uint256 endingPrice,
        uint256 duration,
        uint256 startedAt
    ) {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction), "TokenID is a must on auction");
        return (
            auction.seller,
            auction.startingPrice,
            auction.endingPrice,
            auction.duration,
            auction.startedAt
        );
    }

    /// @dev Returns the current price of an auction.
    /// @param _tokenId - ID of the token price we are checking.
    function getCurrentPrice(uint256 _tokenId)
        external
        view
        returns (uint256)
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction), "TokenID is a must on auction");
        return _currentPrice(auction);
    }

}


/// @title Reverse auction modified for siring
/// @notice We omit a fallback function to prevent accidental sends to this contract.
contract SiringClockAuction is ClockAuction {

    bool public isSiringClockAuction = true;

    constructor(address _nftAddr, uint256 _cut) public
        ClockAuction(_nftAddr, _cut) {}

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of auction (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller
    )
        external
    {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Places a bid for siring. Requires the sender
    /// is the PetCore contract because all bid methods
    /// should be wrapped. Also returns the Pet to the
    /// seller rather than the winner.
    function bid(uint256 _tokenId, uint256 _amount)
        external
    {   
        // require(IKRC20(dpetToken).transferFrom(msg.sender, address(this), _amount));
        require(msg.sender == address(nonFungibleContract));
        address seller = tokenIdToAuction[_tokenId].seller;
        // _bid checks that token ID is valid and will throw if bid fails
        _bid(_tokenId, _amount);
        // We transfer the Pet back to the seller, the winner will get
        // the offspring
        _transfer(seller, _tokenId);
    }

}


/// @title Clock auction modified for sale of pets
contract SaleClockAuction is ClockAuction {

    bool public isSaleClockAuction = true;

    // Tracks last 5 sale price of gen0 Pet sales
    uint256 public gen0SaleCount;
    uint256[5] public lastGen0SalePrices;

    constructor(address _nftAddr, uint256 _cut) public
        ClockAuction(_nftAddr, _cut) {}

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of auction (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller
    )
        external
    {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Updates lastSalePrice if seller is the nft contract
    /// Otherwise, works the same as default bid method.
    function bid(uint256 _tokenId, uint256 _amount)
        external
    {
        require(IKRC20(dpetToken).transferFrom(msg.sender, address(this), _amount));

        // _bid verifies token ID size
        address seller = tokenIdToAuction[_tokenId].seller;
        uint256 price = _bid(_tokenId, _amount);
        _transfer(msg.sender, _tokenId);

        // If not a gen0 auction, exit
        if (seller == address(nonFungibleContract)) {
            // Track gen0 sale prices
            lastGen0SalePrices[gen0SaleCount % 5] = price;
            gen0SaleCount++;
        }
    }

    function averageGen0SalePrice() external view returns (uint256) {
        uint256 sum = 0;
        for (uint256 i = 0; i < 5; i++) {
            sum += lastGen0SalePrices[i];
        }
        return sum / 5;
    }

}


/// @title all functions related to creating pets
contract PetMinting is PetBreeding, IPetCore {

    // Counts the number of pets the contract owner has created.
    uint256 public gen0CreatedCount;
    uint256 public gen0Price = 1* 10**18;
    address public stakingContract;
    
    uint256 private nonce;
    
    /**
     * @dev Throws if called by any account other than the staking contract.
     */
    modifier onlyStakingContract() {
        require(msg.sender == stakingContract, "Ownable: caller is not the staking contract");
        _;
    }


    /// @param _owner the future owner of the created pets.
    function createPromoPet(address _owner, uint256 _amount) external  {
        require(_amount >= gen0Price, "INVALID AMOUNT");
        require(IKRC20(dpetToken).transferFrom(msg.sender, address(this), _amount));

        gen0CreatedCount++;
        uint256 genes = _randomPetGenes();
        _createPet(0, 0, 0, genes, _owner);
    }
    
    function createPet(address _owner) external onlyStakingContract {
        gen0CreatedCount++;
        uint256 genes = _randomPetGenes();
        _createPet(0, 0, 0, genes, _owner);
    }
    
    function createGen0Auction(address _owner, uint256 _genes) external onlyOwner {
        gen0CreatedCount++;
        _createPet(0, 0, 0, _genes, _owner);
    }
    
    function updateGen0Price(uint256 _gen0Price) external onlyOwner {
        gen0Price = _gen0Price;
    }
    
    function setStakingContract(address _stakingContract) external onlyOwner {
        stakingContract = _stakingContract;
    }

    function _randomPetGenes() internal returns (uint256) {
        uint256 randomN = uint256(blockhash(block.number));
        uint256 genes = uint256(keccak256(abi.encodePacked(randomN, block.timestamp, nonce))) % (10 **72) + 1*10**71;
        nonce++;
        
        return genes;
    }
}

contract PetCore is PetMinting {
    
    uint256 public amountToAdulthood = 10 * 10**18;
    uint256 public amountToMiddleAge = 15 * 10**18;
    address public siringAuctionAddr;
    address public saleAuctionAddr;


    constructor() public {
        paused = false;

        // start with the mythical pet 0 - so we don't have generation-0 parent issues
        _createPet(0, 0, 0, uint256(-1), address(0));
    }
    
    /// @dev Reject all KAI from being sent here, unless it's from one of the
    ///  two auction contracts.
    function() external payable {
        require(
            msg.sender == address(saleAuction) ||
            msg.sender == address(siringAuction)
        );
    }

    /// @dev Sets the reference to the sale auction.
    /// @param _address - Address of sale contract.
    function setSaleAuctionAddress(address _address) external onlyOwner {
        SaleClockAuction candidateContract = SaleClockAuction(_address);

        require(candidateContract.isSaleClockAuction());

        // Set the new contract address
        saleAuction = candidateContract;
        saleAuctionAddr = _address;
    }

    function setSiringAuctionAddress(address _address) external  onlyOwner {
        SiringClockAuction candidateContract = SiringClockAuction(_address);

        require(candidateContract.isSiringClockAuction());

        // Set the new contract address
        siringAuction = candidateContract;
        siringAuctionAddr = _address;
    }

    function createSaleAuction(
        uint256 _PetId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration
    )
        external
        whenNotPaused
    {
        require(_owns(msg.sender, _PetId), "Not PetId owner");

        require(!isPregnant(_PetId), "Pet is pregnant");
        _approve(_PetId, address(saleAuction));
        saleAuction.createAuction(
            _PetId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender
        );
    }

    function createSiringAuction(
        uint256 _PetId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration
    )
        external
        whenNotPaused
    {
        // Auction contract checks input sizes
        // If Pet is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_owns(msg.sender, _PetId), "Not PetId owner");
        require(isReadyToBreed(_PetId), "Not ready to breed");
        _approve(_PetId, address(siringAuction));
        // Siring auction throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the Pet.
        siringAuction.createAuction(
            _PetId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender
        );
    }

    /// @dev Completes a siring auction by bidding.
    ///  Immediately breeds the winning matron with the sire on auction.
    /// @param _sireId - ID of the sire on auction.
    /// @param _matronId - ID of the matron owned by the bidder.
    function bidOnSiringAuction(
        uint256 _sireId,
        uint256 _matronId,
        uint256 _amount
    )
        external
        whenNotPaused
    {
        require(IKRC20(dpetToken).transferFrom(msg.sender, address(this), _amount));
        // Auction contract checks input sizes
        require(_owns(msg.sender, _matronId), "Not matron owner");
        require(isReadyToBreed(_matronId), "Not ready to breed");
        require(_canBreedWithViaAuction(_matronId, _sireId), "Can't breed with via auction");
        
        // Define the current price of the auction.
        uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);
        require(_amount >= currentPrice + autoBirthFee);

        // // Siring auction will throw if the bid fails.
        require(IKRC20(dpetToken).transfer(siringAuctionAddr, _amount));
        siringAuction.bid(_sireId, _amount);
        _breedWith(uint32(_matronId), uint32(_sireId));
    }

    /// @notice Returns all the relevant information about a specific Pet.
    /// @param _id The ID of the Pet of interest.
    function getPet(uint256 _id)
        public
        view
        returns (
        bool isGestating,
        bool isReady,
        uint256 cooldownIndex,
        uint256 nextActionAt,
        uint256 siringWithId,
        uint256 birthTime,
        uint256 matronId,
        uint256 sireId,
        uint256 generation,
        string memory genes,
        uint256 stages
    ) {
        Pet storage pet = pets[_id];

        isGestating = (pet.siringWithId != 0);
        isReady = (pet.cooldownEndBlock <= block.number);
        cooldownIndex = uint256(pet.cooldownIndex);
        nextActionAt = uint256(pet.cooldownEndBlock);
        siringWithId = uint256(pet.siringWithId);
        birthTime = uint256(pet.birthTime);
        matronId = uint256(pet.matronId);
        sireId = uint256(pet.sireId);
        generation = uint256(pet.generation);
        genes = _uintToStr(pet.genes);
        stages = uint256(pet.stages);
    }
    
    /// @notice feed on a specific Pet.
    /// @param _petId The ID of the Pet of interest.
    /// @param _amount.
    function feedOnPet(uint256 _petId, uint256 _amount) external {
        require(IKRC20(dpetToken).transferFrom(msg.sender, address(this), _amount));
        
        Pet storage pet = pets[_petId];
        if (_amount == amountToAdulthood) {
            require(pet.stages == 1, "INVALID STAGE 1");
            pet.stages += 1;
        }
        
        if (_amount == amountToMiddleAge) {
            require(pet.stages == 2, "INVALID STAGE 2");
            pet.stages += 1;
        }
    }
    
    function setAmountToAdulthood(uint256 _amountToAdulthood) external onlyOwner {
        amountToAdulthood = _amountToAdulthood;
    }
    
    function setAmountToMiddleAge(uint256 _amountToMiddleAge) external onlyOwner {
        amountToMiddleAge = _amountToMiddleAge;
    }
    
    function getBalance() public view returns(uint256) {
        return IKRC20(dpetToken).balanceOf(address(this));
    }
    
    function withdrawBalance() external onlyOwner {
        IKRC20(dpetToken).transfer(owner, getBalance());
    }
    
    function _uintToStr(uint _i) private pure returns (string memory _uintAsString) {
        uint number = _i;
        if (number == 0) {
            return "0";
        }
        uint j = number;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (number != 0) {
            bstr[k--] = byte(uint8(48 + number % 10));
            number /= 10;
        }
        return string(bstr);
    }
}


contract GeneScience is IGeneScience {

    uint256 internal constant maskLast8Bits = uint256(0xff);
    uint256 internal constant maskFirst248Bits = uint256(~0xff);

    /// @dev given a characteristic and 2 genes (unsorted) - returns > 0 if the genes ascended, that's the value
    /// @param trait1 any trait of that characteristic
    /// @param trait2 any trait of that characteristic
    /// @param rand is expected to be a 3 bits number (0~7)
    /// @return -1 if didnt match any ascention, OR a number from 0 to 30 for the ascended trait
    function _ascend(uint8 trait1, uint8 trait2, uint256 rand) internal pure returns(uint8 ascension) {
        ascension = 0;

        uint8 smallT = trait1;
        uint8 bigT = trait2;

        if (smallT > bigT) {
            bigT = trait1;
            smallT = trait2;
        }

        if ((bigT - smallT == 1) && smallT % 2 == 0) {

            // The rand argument is expected to be a random number 0-7.
            // 1st and 2nd tier: 1/4 chance (rand is 0 or 1)
            // 3rd and 4th tier: 1/8 chance (rand is 0)

            // must be at least this much to ascend
            uint256 maxRand;
            if (smallT < 23) maxRand = 1;
            else maxRand = 0;

            if (rand <= maxRand ) {
                ascension = (smallT / 2) + 16;
            }
        }
    }

    /// @dev given a number get a slice of any bits, at certain offset
    /// @param _n a number to be sliced
    /// @param _nbits how many bits long is the new number
    /// @param _offset how many bits to skip
    function _sliceNumber(uint256 _n, uint256 _nbits, uint256 _offset) private pure returns (uint256) {
        // mask is made by shifting left an offset number of times
        uint256 mask = uint256((2**_nbits) - 1) << _offset;
        // AND n with mask, and trim to max of _nbits bits
        return uint256((_n & mask) >> _offset);
    }

    /// @dev Get a 5 bit slice from an input as a number
    /// @param _input bits, encoded as uint
    /// @param _slot from 0 to 50
    function _get5Bits(uint256 _input, uint256 _slot) internal pure returns(uint8) {
        return uint8(_sliceNumber(_input, uint256(5), _slot * 5));
    }

    /// @dev Parse a pet gene and returns all of 12 "trait stack" that makes the characteristics
    /// @param _genes pet gene
    /// @return the 48 traits that composes the genetic code, logically divided in stacks of 4, where only the first trait of each stack may express
    function decode(uint256 _genes) public pure returns(uint8[] memory) {
        uint8[] memory traits = new uint8[](48);
        uint256 i;
        for(i = 0; i < 48; i++) {
            traits[i] = _get5Bits(_genes, i);
        }
        return traits;
    }

    /// @dev Given an array of traits return the number that represent genes
    function encode(uint8[] memory _traits) public pure returns (uint256 _genes) {
        _genes = 0;
        for(uint256 i = 0; i < 48; i++) {
            _genes = _genes << 5;
            // bitwise OR trait with _genes
            _genes = _genes | _traits[47 - i];
        }
        return _genes;
    }

    /// @dev return the expressing traits
    /// @param _genes the long number expressing pet genes
    function expressingTraits(uint256 _genes) public pure returns(uint8[12] memory) {
        uint8[12] memory express;
        for(uint256 i = 0; i < 12; i++) {
            express[i] = _get5Bits(_genes, i * 4);
        }
        return express;
    }

    /// @dev the function as defined in the breeding contract - as defined in CK bible
    function mixGenes(uint256 _genes1, uint256 _genes2, uint256 _targetBlock) public view returns (uint256) {
        // require(block.number > _targetBlock);

        uint256 randomN = uint256(blockhash(_targetBlock));
        uint256 rand;

        if (randomN == 0) {

            _targetBlock = (block.number & maskFirst248Bits) + (_targetBlock & maskLast8Bits);

            // The computation above could result in a block LARGER than the current block,
            // if so, subtract 256.
            if (_targetBlock >= block.number) _targetBlock -= 256;

            randomN = uint256(blockhash(_targetBlock));
        }

        // generate 256 bits of random, using as much entropy as we can from
        // sources that can't change between calls.
        randomN = uint256(keccak256(abi.encodePacked(randomN, _genes1, _genes2, _targetBlock)));
        uint256 randomIndex = 0;

        uint8[] memory genes1Array = decode(_genes1);
        uint8[] memory genes2Array = decode(_genes2);
        // All traits that will belong to baby
        uint8[] memory babyArray = new uint8[](48);
        // A pointer to the trait we are dealing with currently
        uint256 traitPos;
        // Trait swap value holder
        uint8 swap;
        // iterate all 12 characteristics
        for(uint256 i = 0; i < 12; i++) {
            // pick 4 traits for characteristic i
            uint256 j;
            // store the current random value
            // uint256 rand;
            for(j = 3; j >= 1; j--) {
                traitPos = (i * 4) + j;

                rand = _sliceNumber(randomN, 2, randomIndex); // 0~3
                randomIndex += 2;

                // 1/4 of a chance of gene swapping forward towards expressing.
                if (rand == 0) {
                    // do it for parent 1
                    swap = genes1Array[traitPos];
                    genes1Array[traitPos] = genes1Array[traitPos - 1];
                    genes1Array[traitPos - 1] = swap;

                }

                rand = _sliceNumber(randomN, 2, randomIndex); // 0~3
                randomIndex += 2;

                if (rand == 0) {
                    // do it for parent 2
                    swap = genes2Array[traitPos];
                    genes2Array[traitPos] = genes2Array[traitPos - 1];
                    genes2Array[traitPos - 1] = swap;
                }
            }
        }

        // We have 256 - 144 = 112 bits of randomness left at this point. We will use up to
        // four bits for the first slot of each trait (three for the possible ascension, one
        // to pick between mom and dad if the ascension fails, for a total of 48 bits. The other
        // traits use one bit to pick between parents (36 gene pairs, 36 genes), leaving us
        // well within our entropy budget.

        // done shuffling parent genes, now let's decide on choosing trait and if ascending.
        // NOTE: Ascensions ONLY happen in the "top slot" of each characteristic. This saves
        //  gas and also ensures ascensions only happen when they're visible.
        for(traitPos = 0; traitPos < 48; traitPos++) {

            // See if this trait pair should ascend
            uint8 ascendedTrait = 0;

            // There are two checks here. The first is straightforward, only the trait
            // in the first slot can ascend. The first slot is zero mod 4.
            //
            // The second check is more subtle: Only values that are one apart can ascend,
            // which is what we check inside the _ascend method. However, this simple mask
            // and compare is very cheap (9 gas) and will filter out about half of the
            // non-ascending pairs without a function call.
            //
            // The comparison itself just checks that one value is even, and the other
            // is odd.
            if ((traitPos % 4 == 0) && (genes1Array[traitPos] & 1) != (genes2Array[traitPos] & 1)) {
                rand = _sliceNumber(randomN, 3, randomIndex);
                randomIndex += 3;

                ascendedTrait = _ascend(genes1Array[traitPos], genes2Array[traitPos], rand);
            }

            if (ascendedTrait > 0) {
                babyArray[traitPos] = uint8(ascendedTrait);
            } else {
                // did not ascend, pick one of the parent's traits for the baby
                // We use the top bit of rand for this (the bottom three bits were used
                // to check for the ascension itself).
                rand = _sliceNumber(randomN, 1, randomIndex);
                randomIndex += 1;

                if (rand == 0) {
                    babyArray[traitPos] = uint8(genes1Array[traitPos]);
                } else {
                    babyArray[traitPos] = uint8(genes2Array[traitPos]);
                }
            }
        }

        return encode(babyArray);
    }
}

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"approved","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"PetId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"matronId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sireId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"genes","type":"uint256"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"matronId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sireId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cooldownEndBlock","type":"uint256"}],"name":"Pregnant","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PetIndexToApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PetIndexToOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"amountToAdulthood","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"amountToMiddleAge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_sireId","type":"uint256"}],"name":"approveSiring","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"autoBirthFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_sireId","type":"uint256"},{"internalType":"uint256","name":"_matronId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"bidOnSiringAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_matronId","type":"uint256"},{"internalType":"uint256","name":"_sireId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"breedWithAuto","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_matronId","type":"uint256"},{"internalType":"uint256","name":"_sireId","type":"uint256"}],"name":"canBreedWith","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cooldowns","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_genes","type":"uint256"}],"name":"createGen0Auction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"createPet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createPromoPet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_PetId","type":"uint256"},{"internalType":"uint256","name":"_startingPrice","type":"uint256"},{"internalType":"uint256","name":"_endingPrice","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_PetId","type":"uint256"},{"internalType":"uint256","name":"_startingPrice","type":"uint256"},{"internalType":"uint256","name":"_endingPrice","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"createSiringAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dpetToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_petId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"feedOnPet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gen0CreatedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gen0Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"geneScience","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getPet","outputs":[{"internalType":"bool","name":"isGestating","type":"bool"},{"internalType":"bool","name":"isReady","type":"bool"},{"internalType":"uint256","name":"cooldownIndex","type":"uint256"},{"internalType":"uint256","name":"nextActionAt","type":"uint256"},{"internalType":"uint256","name":"siringWithId","type":"uint256"},{"internalType":"uint256","name":"birthTime","type":"uint256"},{"internalType":"uint256","name":"matronId","type":"uint256"},{"internalType":"uint256","name":"sireId","type":"uint256"},{"internalType":"uint256","name":"generation","type":"uint256"},{"internalType":"string","name":"genes","type":"string"},{"internalType":"uint256","name":"stages","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_matronId","type":"uint256"}],"name":"giveBirth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_PetId","type":"uint256"}],"name":"isPregnant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_PetId","type":"uint256"}],"name":"isReadyToBreed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pregnantpets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleAuction","outputs":[{"internalType":"contract SaleClockAuction","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleAuctionAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amountToAdulthood","type":"uint256"}],"name":"setAmountToAdulthood","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amountToMiddleAge","type":"uint256"}],"name":"setAmountToMiddleAge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setAutoBirthFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setGeneScienceAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"secs","type":"uint256"}],"name":"setSecondsPerBlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSiringAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_stakingContract","type":"address"}],"name":"setStakingContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sireAllowedToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"siringAuction","outputs":[{"internalType":"contract SiringClockAuction","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"siringAuctionAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_gen0Price","type":"uint256"}],"name":"updateGen0Price","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6000805460ff60a01b19169055610240604052603c6080908152607860a05261012c60c05261025860e05261070861010052610e1061012052611c2061014052613840610160526170806101805261e1006101a052620151806101c0526202a3006101e052620546006102005262093a80610220526200008490600190600e62000452565b506006600355600b80546001600160a01b03191673fb62ae373aca027177d1c18ee0862817f9080d08179055670de0b6b3a7640000600c819055601055678ac7230489e8000060135567d02ab486cedc0000601455348015620000e657600080fd5b506000805460ff60a01b196001600160a01b031990911633171681556200011c908080600019816001600160e01b036200012316565b5062000568565b600060028404600d61ffff821611156200013b5750600d5b62000145620004f5565b604051806101200160405280868152602001426001600160401b0316815260200160006001600160401b031681526020018963ffffffff1681526020018863ffffffff168152602001600081526020018361ffff1681526020018761ffff168152602001600161ffff16815250905060006001600483908060018154018082558091505090600182039060005260206000209060060201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600201556080820151816003015560a0820151816004015560c08201518160050160006101000a81548161ffff021916908361ffff16021790555060e08201518160050160026101000a81548161ffff021916908361ffff1602179055506101008201518160050160046101000a81548161ffff021916908361ffff16021790555050500390507f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5858284606001518560800151866000015160405180866001600160a01b03166001600160a01b031681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a162000363600086836001600160e01b036200036f16565b98975050505050505050565b6001600160a01b038083166000818152600660209081526040808320805460010190558583526005909152902080546001600160a01b031916909117905583161562000403576001600160a01b038316600090815260066020908152604080832080546000190190558383526008825280832080546001600160a01b03199081169091556007909252909120805490911690555b604080516001600160a01b0380861682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b600283019183908215620004e35791602002820160005b83821115620004af57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000469565b8015620004e15782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620004af565b505b50620004f192915062000541565b5090565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6200056591905b80821115620004f157805463ffffffff1916815560010162000548565b90565b61363380620005786000396000f3fe6080604052600436106103815760003560e01c80636fbde40d116101d1578063a376af0f11610102578063e6cbe351116100a0578063f2fde38b1161006f578063f2fde38b14610d98578063f35f7a2614610dcb578063fcca3daa14610df5578063fee983d614610e0a57610381565b8063e6cbe35114610d44578063ee99205c14610d59578063f1ca941014610d6e578063f2b47d5214610d8357610381565b8063b4a31a07116100dc578063b4a31a0714610ca8578063be61219114610cbd578063d3e6f49f14610ce7578063d58d0e1b14610d1157610381565b8063a376af0f14610c45578063a9059cbb14610c5a578063b0c35c0514610c9357610381565b806388c2a0bf1161016f57806395d89b411161014957806395d89b4114610b8a57806399d5175e14610b9f5780639d6fac6f14610bcf5780639dd373b914610c1257610381565b806388c2a0bf14610b155780638da5cb5b14610b3f57806392f64cce14610b5457610381565b80637a7d4937116101ab5780637a7d493714610a535780637d9b6a1514610a685780638456cb5914610a7d5780638462151c14610a9257610381565b80636fbde40d146109b457806370a08231146109e7578063795e153514610a1a57610381565b8063388d67be116102b65780634dfff04f116102545780635c975abb116102235780635c975abb1461094b5780635fd8c710146109605780636352211e146109755780636bbb0f0e1461099f57610381565b80634dfff04f146107ce5780635663896e1461080757806359d55194146108315780635c295f5a1461092157610381565b806346116e6f1161029057806346116e6f1461070e57806346d22c70146107385780634ad8c938146107685780634b85fd55146107a457610381565b8063388d67be146106a85780633d7d3f5a146106bd5780633f4ba83a146106f957610381565b806314001f4c116103235780631ee12453116102fd5780631ee12453146105f357806321717ebf1461061d57806323b872dd1461063257806324e7a38a1461067557610381565b806314001f4c1461058157806318160ddd146105b45780631940a936146105c957610381565b8063095ea7b31161035f578063095ea7b3146104ba5780630d39f99e146104f35780630f47ec221461052457806312065fe01461055a57610381565b8063012a4d80146103af57806301ffc9a7146103e857806306fdde0314610430575b6009546001600160a01b03163314806103a45750600a546001600160a01b031633145b6103ad57600080fd5b005b3480156103bb57600080fd5b506103ad600480360360408110156103d257600080fd5b506001600160a01b038135169060200135610e34565b3480156103f457600080fd5b5061041c6004803603602081101561040b57600080fd5b50356001600160e01b031916610e9d565b604080519115158252519081900360200190f35b34801561043c57600080fd5b50610445611078565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561047f578181015183820152602001610467565b50505050905090810190601f1680156104ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104c657600080fd5b506103ad600480360360408110156104dd57600080fd5b506001600160a01b03813516906020013561109f565b3480156104ff57600080fd5b5061050861111f565b604080516001600160a01b039092168252519081900360200190f35b34801561053057600080fd5b506103ad6004803603606081101561054757600080fd5b508035906020810135906040013561112e565b34801561056657600080fd5b5061056f61146e565b60408051918252519081900360200190f35b34801561058d57600080fd5b506103ad600480360360208110156105a457600080fd5b50356001600160a01b03166114ea565b3480156105c057600080fd5b5061056f6115db565b3480156105d557600080fd5b5061041c600480360360208110156105ec57600080fd5b50356115e5565b3480156105ff57600080fd5b506103ad6004803603602081101561061657600080fd5b503561161d565b34801561062957600080fd5b5061050861166f565b34801561063e57600080fd5b506103ad6004803603606081101561065557600080fd5b506001600160a01b0381358116916020810135909116906040013561167e565b34801561068157600080fd5b506103ad6004803603602081101561069857600080fd5b50356001600160a01b03166116ef565b3480156106b457600080fd5b5061056f61175e565b3480156106c957600080fd5b506103ad600480360360808110156106e057600080fd5b5080359060208101359060408101359060600135611764565b34801561070557600080fd5b506103ad6118b2565b34801561071a57600080fd5b506105086004803603602081101561073157600080fd5b5035611924565b34801561074457600080fd5b5061041c6004803603604081101561075b57600080fd5b508035906020013561193f565b34801561077457600080fd5b506103ad6004803603608081101561078b57600080fd5b50803590602081013590604081013590606001356119be565b3480156107b057600080fd5b506103ad600480360360208110156107c757600080fd5b5035611af0565b3480156107da57600080fd5b506103ad600480360360408110156107f157600080fd5b506001600160a01b038135169060200135611b42565b34801561081357600080fd5b506103ad6004803603602081101561082a57600080fd5b5035611b9a565b34801561083d57600080fd5b5061085b6004803603602081101561085457600080fd5b5035611c00565b604051808c1515151581526020018b1515151581526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156108dc5781810151838201526020016108c4565b50505050905090810190601f1680156109095780820380516001836020036101000a031916815260200191505b509c5050505050505050505050505060405180910390f35b34801561092d57600080fd5b506105086004803603602081101561094457600080fd5b5035611d26565b34801561095757600080fd5b5061041c611d41565b34801561096c57600080fd5b506103ad611d51565b34801561098157600080fd5b506105086004803603602081101561099857600080fd5b5035611e3c565b3480156109ab57600080fd5b50610508611e5e565b3480156109c057600080fd5b506103ad600480360360208110156109d757600080fd5b50356001600160a01b0316611e6d565b3480156109f357600080fd5b5061056f60048036036020811015610a0a57600080fd5b50356001600160a01b0316611f5e565b348015610a2657600080fd5b506103ad60048036036040811015610a3d57600080fd5b506001600160a01b038135169060200135611f79565b348015610a5f57600080fd5b5061056f612074565b348015610a7457600080fd5b5061056f61207a565b348015610a8957600080fd5b506103ad612080565b348015610a9e57600080fd5b50610ac560048036036020811015610ab557600080fd5b50356001600160a01b03166120f9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b01578181015183820152602001610ae9565b505050509050019250505060405180910390f35b348015610b2157600080fd5b5061056f60048036036020811015610b3857600080fd5b50356121c0565b348015610b4b57600080fd5b50610508612470565b348015610b6057600080fd5b506103ad60048036036060811015610b7757600080fd5b508035906020810135906040013561247f565b348015610b9657600080fd5b50610445612721565b348015610bab57600080fd5b506103ad60048036036040811015610bc257600080fd5b5080359060200135612740565b348015610bdb57600080fd5b50610bf960048036036020811015610bf257600080fd5b5035612904565b6040805163ffffffff9092168252519081900360200190f35b348015610c1e57600080fd5b506103ad60048036036020811015610c3557600080fd5b50356001600160a01b0316612931565b348015610c5157600080fd5b5061056f6129a0565b348015610c6657600080fd5b506103ad60048036036040811015610c7d57600080fd5b506001600160a01b0381351690602001356129a6565b348015610c9f57600080fd5b5061056f612a3a565b348015610cb457600080fd5b5061056f612a40565b348015610cc957600080fd5b506103ad60048036036020811015610ce057600080fd5b5035612a46565b348015610cf357600080fd5b5061041c60048036036020811015610d0a57600080fd5b5035612a98565b348015610d1d57600080fd5b506103ad60048036036020811015610d3457600080fd5b50356001600160a01b0316612b59565b348015610d5057600080fd5b50610508612bc6565b348015610d6557600080fd5b50610508612bd5565b348015610d7a57600080fd5b5061056f612be4565b348015610d8f57600080fd5b50610508612bea565b348015610da457600080fd5b506103ad60048036036020811015610dbb57600080fd5b50356001600160a01b0316612bf9565b348015610dd757600080fd5b5061050860048036036020811015610dee57600080fd5b5035612c74565b348015610e0157600080fd5b50610508612c8f565b348015610e1657600080fd5b506103ad60048036036020811015610e2d57600080fd5b5035612c9e565b6000546001600160a01b03163314610e81576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b600f80546001019055610e98600080808486612cf0565b505050565b604080517f737570706f727473496e74657266616365286279746573342900000000000000815290519081900360190190206000906001600160e01b0319838116911614806110705750604080517f746f6b656e4d657461646174612875696e743235362c737472696e67290000008152815190819003601d01812075746f6b656e734f664f776e657228616464726573732960501b82529151908190036016018120908060256135ba8239604080519182900360250182207f7472616e7366657228616464726573732c75696e743235362900000000000000835281519283900360190183207f617070726f766528616464726573732c75696e74323536290000000000000000845282519384900360180184206f6f776e65724f662875696e743235362960801b855283519485900360100185207162616c616e63654f6628616464726573732960701b865284519586900360120186206c746f74616c537570706c79282960981b8752855196879003600d0187206773796d626f6c282960c01b88528651978890036008018820656e616d65282960d01b89529651978890036006019097206001600160e01b03198d81169190971890971818181818189390931893909318919091169190911490505b90505b919050565b6040518060400160405280600b81526020016a135e481119519a4814195d60aa1b81525081565b600054600160a01b900460ff16156110b657600080fd5b6110c03382612f2e565b6110c957600080fd5b6110d38183612f4e565b604080513381526001600160a01b038416602082015280820183905290517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360600190a15050565b600b546001600160a01b031681565b600054600160a01b900460ff161561114557600080fd5b600b54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561119f57600080fd5b505af11580156111b3573d6000803e3d6000fd5b505050506040513d60208110156111c957600080fd5b50516111d457600080fd5b6111de3383612f2e565b611222576040805162461bcd60e51b815260206004820152601060248201526f2737ba1036b0ba3937b71037bbb732b960811b604482015290519081900360640190fd5b61122b82612a98565b611271576040805162461bcd60e51b8152602060048201526012602482015271139bdd081c9958591e481d1bc8189c99595960721b604482015290519081900360640190fd5b61127b8284612f7c565b6112cc576040805162461bcd60e51b815260206004820152601c60248201527f43616e27742062726565642077697468207669612061756374696f6e00000000604482015290519081900360640190fd5b600a54604080516362ae87ab60e11b81526004810186905290516000926001600160a01b03169163c55d0f56916024808301926020929190829003018186803b15801561131857600080fd5b505afa15801561132c573d6000803e3d6000fd5b505050506040513d602081101561134257600080fd5b5051600c54909150810182101561135857600080fd5b600b546015546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169163a9059cbb9160448083019260209291908290030181600087803b1580156113b157600080fd5b505af11580156113c5573d6000803e3d6000fd5b505050506040513d60208110156113db57600080fd5b50516113e657600080fd5b600a5460408051630b30c8ff60e31b8152600481018790526024810185905290516001600160a01b039092169163598647f89160448082019260009290919082900301818387803b15801561143a57600080fd5b505af115801561144e573d6000803e3d6000fd5b505050506114688363ffffffff168563ffffffff16612fc7565b50505050565b600b54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156114b957600080fd5b505afa1580156114cd573d6000803e3d6000fd5b505050506040513d60208110156114e357600080fd5b5051905090565b6000546001600160a01b03163314611537576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b6000819050806001600160a01b03166376190f8f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561157557600080fd5b505afa158015611589573d6000803e3d6000fd5b505050506040513d602081101561159f57600080fd5b50516115aa57600080fd5b600a80546001600160a01b039283166001600160a01b03199182161790915560158054939092169216919091179055565b6004546000190190565b60008082116115f357600080fd5b6004828154811061160057fe5b906000526020600020906006020160040154600014159050919050565b6000546001600160a01b0316331461166a576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b601055565b600a546001600160a01b031681565b600054600160a01b900460ff161561169557600080fd5b6001600160a01b0382166116a857600080fd5b6001600160a01b0382163014156116be57600080fd5b6116c833826130d4565b6116d157600080fd5b6116db8382612f2e565b6116e457600080fd5b610e988383836130f4565b6000546001600160a01b0316331461173c576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600d5481565b600054600160a01b900460ff161561177b57600080fd5b6117853385612f2e565b6117c8576040805162461bcd60e51b815260206004820152600f60248201526e2737ba102832ba24b21037bbb732b960891b604482015290519081900360640190fd5b6117d1846115e5565b15611815576040805162461bcd60e51b815260206004820152600f60248201526e14195d081a5cc81c1c9959db985b9d608a1b604482015290519081900360640190fd5b60095461182c9085906001600160a01b0316612f4e565b600954604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561189457600080fd5b505af11580156118a8573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633146118ff576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b600054600160a01b900460ff1661191557600080fd5b6000805460ff60a01b19169055565b6008602052600090815260409020546001600160a01b031681565b600080831161194d57600080fd5b6000821161195a57600080fd5b60006004848154811061196957fe5b9060005260206000209060060201905060006004848154811061198857fe5b906000526020600020906006020190506119a4828683876131d6565b80156119b557506119b584866132ac565b95945050505050565b600054600160a01b900460ff16156119d557600080fd5b6119df3385612f2e565b611a22576040805162461bcd60e51b815260206004820152600f60248201526e2737ba102832ba24b21037bbb732b960891b604482015290519081900360640190fd5b611a2b84612a98565b611a71576040805162461bcd60e51b8152602060048201526012602482015271139bdd081c9958591e481d1bc8189c99595960721b604482015290519081900360640190fd5b600a54611a889085906001600160a01b0316612f4e565b600a54604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561189457600080fd5b6000546001600160a01b03163314611b3d576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b600c55565b600054600160a01b900460ff1615611b5957600080fd5b611b633382612f2e565b611b6c57600080fd5b600090815260086020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611be7576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b60015463ffffffff168110611bfb57600080fd5b600355565b6000806000806000806000806000606060008060048d81548110611c2057fe5b906000526020600020906006020190508060040154600014159b50438160010160089054906101000a90046001600160401b03166001600160401b031611159a508060050160009054906101000a900461ffff1661ffff1699508060010160089054906101000a90046001600160401b03166001600160401b03169850806004015497508060010160009054906101000a90046001600160401b03166001600160401b0316965080600201549550806003015494508060050160029054906101000a900461ffff1661ffff169350611cfb8160000154613301565b92508060050160049054906101000a900461ffff1661ffff1691505091939597999b90929496989a50565b6005602052600090815260409020546001600160a01b031681565b600054600160a01b900460ff1681565b6000546001600160a01b03163314611d9e576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b600b546000546001600160a01b039182169163a9059cbb9116611dbf61146e565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e0e57600080fd5b505af1158015611e22573d6000803e3d6000fd5b505050506040513d6020811015611e3857600080fd5b5050565b6000818152600560205260409020546001600160a01b03168061107357600080fd5b6016546001600160a01b031681565b6000546001600160a01b03163314611eba576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b6000819050806001600160a01b03166385b861886040518163ffffffff1660e01b815260040160206040518083038186803b158015611ef857600080fd5b505afa158015611f0c573d6000803e3d6000fd5b505050506040513d6020811015611f2257600080fd5b5051611f2d57600080fd5b600980546001600160a01b039283166001600160a01b03199182161790915560168054939092169216919091179055565b6001600160a01b031660009081526006602052604090205490565b601054811015611fc1576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125108105353d5539560921b604482015290519081900360640190fd5b600b54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561201b57600080fd5b505af115801561202f573d6000803e3d6000fd5b505050506040513d602081101561204557600080fd5b505161205057600080fd5b600f8054600101905560006120636133c5565b905061146860008060008487612cf0565b60035481565b60105481565b6000546001600160a01b031633146120cd576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b600054600160a01b900460ff16156120e457600080fd5b6000805460ff60a01b1916600160a01b179055565b6060600061210683611f5e565b905080612123575050604080516000815260208101909152611073565b60608160405190808252806020026020018201604052801561214f578160200160208202803883390190505b509050600061215c6115db565b9050600060015b8281116121b3576000818152600560205260409020546001600160a01b03888116911614156121ab578084838151811061219957fe5b60209081029190910101526001909101905b600101612163565b8395505050505050611073565b60008054600160a01b900460ff16156121d857600080fd5b6000600483815481106121e757fe5b6000918252602090912060069091020160018101549091506001600160401b0316612247576040805162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a59081c195d60aa1b604482015290519081900360640190fd5b60408051610120810182528254815260018301546001600160401b038082166020840152600160401b90910416918101919091526002820154606082015260038201546080820152600482015460a0820152600582015461ffff80821660c0840152620100008204811660e0840152600160201b909104166101008201526122ce90613448565b612311576040805162461bcd60e51b815260206004820152600f60248201526e09cdee840e4cac2c8f240c4d2e4e8d608b1b604482015290519081900360640190fd5b60008160040154905060006004828154811061232957fe5b6000918252602090912060058086015460069093029091019081015490925061ffff6201000092839004811692909104168110156123725750600581015462010000900461ffff165b600e5484548354600187015460408051630d9f5aed60e01b8152600481019490945260248401929092526000196001600160401b03600160401b909204821601166044830152516000926001600160a01b031691630d9f5aed916064808301926020929190829003018186803b1580156123eb57600080fd5b505afa1580156123ff573d6000803e3d6000fd5b505050506040513d602081101561241557600080fd5b505160008881526005602052604081205460048801549293506001600160a01b03169161244d908a9061ffff60018801168686612cf0565b60006004909801979097555050600d805460001901905550929350505050919050565b6000546001600160a01b031681565b600054600160a01b900460ff161561249657600080fd5b600c548110156124dc576040805162461bcd60e51b815260206004820152600c60248201526b135d5cdd081c185e5b595b9d60a21b604482015290519081900360640190fd5b600b54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561253657600080fd5b505af115801561254a573d6000803e3d6000fd5b505050506040513d602081101561256057600080fd5b505161256b57600080fd5b6125753384612f2e565b61257e57600080fd5b61258882846132ac565b61259157600080fd5b6000600484815481106125a057fe5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160401b0380821695850195909552600160401b9004909316908201526002820154606082015260038201546080820152600482015460a0820152600582015461ffff80821660c0840152620100008204811660e0840152600160201b9091041661010082015290915061263d90613471565b61264657600080fd5b60006004848154811061265557fe5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160401b0380821695850195909552600160401b9004909316908201526002820154606082015260038201546080820152600482015460a0820152600582015461ffff80821660c0840152620100008204811660e0840152600160201b909104166101008201529091506126f290613471565b6126fb57600080fd5b612707828683876131d6565b61271057600080fd5b61271a8585612fc7565b5050505050565b6040518060400160405280600381526020016204d44560ec1b81525081565b600b54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561279a57600080fd5b505af11580156127ae573d6000803e3d6000fd5b505050506040513d60208110156127c457600080fd5b50516127cf57600080fd5b6000600483815481106127de57fe5b90600052602060002090600602019050601354821415612877576005810154600160201b900461ffff1660011461284e576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c4944205354414745203160881b604482015290519081900360640190fd5b60058101805461ffff600160201b80830482166001019091160265ffff00000000199091161790555b601454821415610e98576005810154600160201b900461ffff166002146128d7576040805162461bcd60e51b815260206004820152600f60248201526e24a72b20a624a21029aa20a3a2901960891b604482015290519081900360640190fd5b60058101805461ffff600160201b80830482166001019091160265ffff0000000019909116179055505050565b600181600e811061291157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b6000546001600160a01b0316331461297e576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60135481565b600054600160a01b900460ff16156129bd57600080fd5b6001600160a01b0382166129d057600080fd5b6001600160a01b0382163014156129e657600080fd5b6009546001600160a01b0383811691161415612a0157600080fd5b600a546001600160a01b0383811691161415612a1c57600080fd5b612a263382612f2e565b612a2f57600080fd5b611e383383836130f4565b600c5481565b60145481565b6000546001600160a01b03163314612a93576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b601455565b6000808211612aa657600080fd5b600060048381548110612ab557fe5b6000918252602091829020604080516101208101825260069093029091018054835260018101546001600160401b0380821695850195909552600160401b9004909316908201526002820154606082015260038201546080820152600482015460a0820152600582015461ffff80821660c0840152620100008204811660e0840152600160201b90910416610100820152909150612b5290613471565b9392505050565b6011546001600160a01b03163314612ba25760405162461bcd60e51b815260040180806020018281038252602b81526020018061358f602b913960400191505060405180910390fd5b600f805460010190556000612bb56133c5565b9050610e9860008060008486612cf0565b6009546001600160a01b031681565b6011546001600160a01b031681565b600f5481565b600e546001600160a01b031681565b6000546001600160a01b03163314612c46576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b6001600160a01b03811615612c7157600080546001600160a01b0319166001600160a01b0383161790555b50565b6007602052600090815260409020546001600160a01b031681565b6015546001600160a01b031681565b6000546001600160a01b03163314612ceb576040805162461bcd60e51b815260206004820181905260248201526000805160206135df833981519152604482015290519081900360640190fd5b601355565b600060028404600d61ffff82161115612d075750600d5b612d0f613542565b604051806101200160405280868152602001426001600160401b0316815260200160006001600160401b031681526020018963ffffffff1681526020018863ffffffff168152602001600081526020018361ffff1681526020018761ffff168152602001600161ffff16815250905060006001600483908060018154018082558091505090600182039060005260206000209060060201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600201556080820151816003015560a0820151816004015560c08201518160050160006101000a81548161ffff021916908361ffff16021790555060e08201518160050160026101000a81548161ffff021916908361ffff1602179055506101008201518160050160046101000a81548161ffff021916908361ffff16021790555050500390507f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5858284606001518560800151866000015160405180866001600160a01b03166001600160a01b031681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a1612f22600086836130f4565b98975050505050505050565b6000908152600560205260409020546001600160a01b0391821691161490565b60009182526007602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b60008060048481548110612f8c57fe5b90600052602060002090600602019050600060048481548110612fab57fe5b906000526020600020906006020190506119b5828683876131d6565b600060048281548110612fd657fe5b90600052602060002090600602019050600060048481548110612ff557fe5b906000526020600020906006020190508263ffffffff16816004018190555061301d82613499565b61302681613499565b600084815260086020908152604080832080546001600160a01b031990811690915586845281842080549091169055600d805460019081019091558784526005835292819020549284015481516001600160a01b039094168452918301879052828101869052600160401b9091046001600160401b03166060830152517f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b80916080908290030190a150505050565b6000908152600760205260409020546001600160a01b0391821691161490565b6001600160a01b038083166000818152600660209081526040808320805460010190558583526005909152902080546001600160a01b0319169091179055831615613187576001600160a01b038316600090815260066020908152604080832080546000190190558383526008825280832080546001600160a01b03199081169091556007909252909120805490911690555b604080516001600160a01b0380861682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b6000818414156131e8575060006132a4565b81856002015414806131fd5750818560030154145b1561320a575060006132a4565b838360020154148061321f5750838360030154145b1561322c575060006132a4565b6002830154158061323f57506002850154155b1561324c575060016132a4565b846002015483600201541480613269575084600301548360020154145b15613276575060006132a4565b846002015483600301541480613293575084600301548360030154145b156132a0575060006132a4565b5060015b949350505050565b60008181526005602052604080822054848352908220546001600160a01b039182169116808214806119b557506000858152600860205260409020546001600160a01b03908116908316149250505092915050565b606081806133285750506040805180820190915260018152600360fc1b6020820152611073565b8060005b811561334057600101600a8204915061332c565b6060816040519080825280601f01601f19166020018201604052801561336d576020820181803883390190505b50905060001982015b84156133bb57600a850660300160f81b8282806001900393508151811061339957fe5b60200101906001600160f81b031916908160001a905350600a85049450613376565b5095945050505050565b6012805460408051434060208083019190915242828401526060808301859052835180840390910181526080909201909252805191012060019091019091557d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000090067d0e7d34c64a9c85d4460dbbca87196b61618a4bd2168000000000000000000190565b60008160a00151600014158015611070575050604001516001600160401b034381169116111590565b60008160a001516000148015611070575050604001516001600160401b034381169116111590565b600354600582015443919060019061ffff16600e81106134b557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16816134de57fe5b6001840180546fffffffffffffffff00000000000000001916600160401b93909204939093016001600160401b0316919091021790556005810154600d61ffff9091161015612c7157600501805461ffff8082166001011661ffff19909116179055565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101919091529056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865207374616b696e6720636f6e74726163747472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536294f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a265627a7a72315820d9dc322dc23884a0eda3010b0bcad8e2e3f7f61fdd1e593ba6af9cfbfbfe703f64736f6c63430005110032

Deployed ByteCode Sourcemap

42578:6991:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43214:11;;-1:-1:-1;;;;;43214:11:0;43192:10;:34;;:87;;-1:-1:-1;43265:13:0;;-1:-1:-1;;;;;43265:13:0;43243:10;:36;43192:87;43170:120;;;;;;42578:6991;41854:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41854:161:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41854:161:0;;;;;;;;:::i;10772:202::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10772:202:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10772:202:0;-1:-1:-1;;;;;;10772:202:0;;:::i;:::-;;;;;;;;;;;;;;;;;;9988:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9988:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9988:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12905:263;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12905:263:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12905:263:0;;;;;;;;:::i;15245:69::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15245:69:0;;;:::i;:::-;;;;-1:-1:-1;;;;;15245:69:0;;;;;;;;;;;;;;45783:964;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45783:964:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45783:964:0;;;;;;;;;;;;:::i;48781:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48781:119:0;;;:::i;:::-;;;;;;;;;;;;;;;;43753:345;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43753:345:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43753:345:0;-1:-1:-1;;;;;43753:345:0;;:::i;13886:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13886:91:0;;;:::i;18466:181::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18466:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18466:181:0;;:::i;42027:105::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42027:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42027:105:0;;:::i;7727:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7727:39:0;;;:::i;13431:373::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13431:373:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13431:373:0;;;;;;;;;;;;;;;;;:::i;15732:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15732:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15732:109:0;-1:-1:-1;;;;;15732:109:0;;:::i;15661:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15661:27:0;;;:::i;44106:551::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44106:551:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;44106:551:0;;;;;;;;;;;;;;;;;:::i;3358:133::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3358:133:0;;;:::i;7368:56::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7368:56:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7368:56:0;;:::i;20471:405::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20471:405:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20471:405:0;;;;;;;:::i;44665:864::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44665:864:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;44665:864:0;;;;;;;;;;;;;;;;;:::i;17730:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17730:94:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17730:94:0;;:::i;17519:203::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17519:203:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17519:203:0;;;;;;;;:::i;9788:141::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9788:141:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9788:141:0;;:::i;46882:959::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46882:959:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46882:959:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46882:959:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6883:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6883:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6883:51:0;;:::i;3079:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3079:26:0;;;:::i;48912:112::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48912:112:0;;;:::i;14067:198::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14067:198:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14067:198:0;;:::i;42767:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42767:30:0;;;:::i;43413:332::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43413:332:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43413:332:0;-1:-1:-1;;;;;43413:332:0;;:::i;11976:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11976:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11976:124:0;-1:-1:-1;;;;;11976:124:0;;:::i;41301:339::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41301:339:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41301:339:0;;;;;;;;:::i;6547:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6547:34:0;;;:::i;40867:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40867:36:0;;;:::i;3268:82::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3268:82:0;;;:::i;14410:700::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14410:700:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14410:700:0;-1:-1:-1;;;;;14410:700:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14410:700:0;;;;;;;;;;;;;;;;;22928:958;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22928:958:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22928:958:0;;:::i;652:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;652:20:0;;;:::i;21698:1076::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21698:1076:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21698:1076:0;;;;;;;;;;;;:::i;10038:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10038:37:0;;;:::i;47973:504::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47973:504:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47973:504:0;;;;;;;:::i;6050:410::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6050:410:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6050:410:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;42144:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42144:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42144:126:0;-1:-1:-1;;;;;42144:126:0;;:::i;42622:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42622:46:0;;;:::i;12293:399::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12293:399:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12293:399:0;;;;;;;;:::i;15553:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15553:38:0;;;:::i;42675:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42675:46:0;;;:::i;48635:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48635:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48635:134:0;;:::i;18133:216::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18133:216:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18133:216:0;;:::i;41652:190::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41652:190:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41652:190:0;-1:-1:-1;;;;;41652:190:0;;:::i;7433:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7433:35:0;;;:::i;40910:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40910:30:0;;;:::i;40829:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40829:31:0;;;:::i;15697:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15697:26:0;;;:::i;1209:137::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1209:137:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1209:137:0;-1:-1:-1;;;;;1209:137:0;;:::i;7178:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7178:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7178:54:0;;:::i;42728:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42728:32:0;;;:::i;48489:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48489:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48489:134:0;;:::i;41854:161::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;41943:16;:18;;;;;;41972:35;41943:16;;;41992:6;42000;41972:10;:35::i;:::-;;41854:161;;:::o;10772:202::-;10144:38;;;;;;;;;;;;;;;;10843:4;;-1:-1:-1;;;;;;10876:41:0;;;;;;;10875:90;;-1:-1:-1;10718:42:0;;;;;;;;;;;;;;;;-1:-1:-1;;;10663:35:0;;;;;;;;;;;;;;10593:50;;10663:35;10593:50;;;;;;;;;;;;10535:38;;;;;;;;;;;;;10478:37;;;;;;;;;;;;;-1:-1:-1;;;10429:29:0;;;;;;;;;;;;-1:-1:-1;;;10378:31:0;;;;;;;;;;;;-1:-1:-1;;;10332:26:0;;;;;;;;;;;;-1:-1:-1;;;10291:21:0;;;;;;;;;;;;-1:-1:-1;;;10252:19:0;;;;;;;;;;;;;-1:-1:-1;;;;;;10923:41:0;;;10245:68;;;;:114;;;:165;:214;:271;:329;:399;:454;;;;:516;;;;10923:41;;;;;;;;;-1:-1:-1;10875:90:0;10867:99;;10772:202;;;;:::o;9988:43::-;;;;;;;;;;;;;;-1:-1:-1;;;9988:43:0;;;;:::o;12905:263::-;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;13043:27;13049:10;13061:8;13043:5;:27::i;:::-;13035:36;;;;;;13084:23;13093:8;13103:3;13084:8;:23::i;:::-;13125:35;;;13134:10;13125:35;;-1:-1:-1;;;;;13125:35:0;;;;;;;;;;;;;;;;;;;;;;;12905:263;;:::o;15245:69::-;;;-1:-1:-1;;;;;15245:69:0;;:::o;45783:964::-;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;45970:9;;45963:66;;;-1:-1:-1;;;45963:66:0;;45994:10;45963:66;;;;46014:4;45963:66;;;;;;;;;;;;-1:-1:-1;;;;;45970:9:0;;;;45963:30;;:66;;;;;;;;;;;;;;;45970:9;;45963:66;;;5:2:-1;;;;30:1;27;20:12;5:2;45963:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45963:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45963:66:0;45955:75;;;;;;46097:28;46103:10;46115:9;46097:5;:28::i;:::-;46089:57;;;;;-1:-1:-1;;;46089:57:0;;;;;;;;;;;;-1:-1:-1;;;46089:57:0;;;;;;;;;;;;;;;46165:25;46180:9;46165:14;:25::i;:::-;46157:56;;;;;-1:-1:-1;;;46157:56:0;;;;;;;;;;;;-1:-1:-1;;;46157:56:0;;;;;;;;;;;;;;;46232:43;46256:9;46267:7;46232:23;:43::i;:::-;46224:84;;;;;-1:-1:-1;;;46224:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46405:13;;:38;;;-1:-1:-1;;;46405:38:0;;;;;;;;;;46382:20;;-1:-1:-1;;;;;46405:13:0;;:29;;:38;;;;;;;;;;;;;;:13;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;46405:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46405:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46405:38:0;46488:12;;46405:38;;-1:-1:-1;46473:27:0;;46462:38;;;46454:47;;;;;;46588:9;;46608:17;;46581:54;;;-1:-1:-1;;;46581:54:0;;-1:-1:-1;;;;;46608:17:0;;;46581:54;;;;;;;;;;;;46588:9;;;;;46581:26;;:54;;;;;;;;;;;;;;46588:9;;46581:54;;;5:2:-1;;;;30:1;27;20:12;5:2;46581:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46581:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46581:54:0;46573:63;;;;;;46647:13;;:35;;;-1:-1:-1;;;46647:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46647:13:0;;;;:17;;:35;;;;;:13;;:35;;;;;;;;:13;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;46647:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46647:35:0;;;;46693:46;46711:9;46693:46;;46730:7;46693:46;;:10;:46::i;:::-;3177:1;45783:964;;;:::o;48781:119::-;48857:9;;48850:42;;;-1:-1:-1;;;48850:42:0;;48886:4;48850:42;;;;;;48823:7;;-1:-1:-1;;;;;48857:9:0;;48850:27;;:42;;;;;;;;;;;;;;48857:9;48850:42;;;5:2:-1;;;;30:1;27;20:12;5:2;48850:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48850:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48850:42:0;;-1:-1:-1;48781:119:0;:::o;43753:345::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;43835:36;43893:8;43835:67;;43923:17;-1:-1:-1;;;;;43923:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43923:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43923:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43923:40:0;43915:49;;;;;;44018:13;:33;;-1:-1:-1;;;;;44018:33:0;;;-1:-1:-1;;;;;;44018:33:0;;;;;;;44062:17;:28;;;;;;;;;;;;;;43753:345::o;13886:91::-;13954:4;:11;-1:-1:-1;;13954:15:0;13886:91;:::o;18466:181::-;18550:4;18589:1;18580:6;:10;18572:19;;;;;;18609:4;18614:6;18609:12;;;;;;;;;;;;;;;;;;:25;;;18638:1;18609:30;;18602:37;;18466:181;;;:::o;42027:105::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;42102:9;:22;42027:105::o;7727:39::-;;;-1:-1:-1;;;;;7727:39:0;;:::o;13431:373::-;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;-1:-1:-1;;;;;13598:17:0;;13590:26;;;;;;-1:-1:-1;;;;;13635:20:0;;13650:4;13635:20;;13627:29;;;;;;13675:34;13688:10;13700:8;13675:12;:34::i;:::-;13667:43;;;;;;13729:22;13735:5;13742:8;13729:5;:22::i;:::-;13721:31;;;;;;13765;13775:5;13782:3;13787:8;13765:9;:31::i;15732:109::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;15811:11;:22;;-1:-1:-1;;;;;;15811:22:0;-1:-1:-1;;;;;15811:22:0;;;;;;;;;;15732:109::o;15661:27::-;;;;:::o;44106:551::-;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;44322:25;44328:10;44340:6;44322:5;:25::i;:::-;44314:53;;;;;-1:-1:-1;;;44314:53:0;;;;;;;;;;;;-1:-1:-1;;;44314:53:0;;;;;;;;;;;;;;;44389:18;44400:6;44389:10;:18::i;:::-;44388:19;44380:47;;;;;-1:-1:-1;;;44380:47:0;;;;;;;;;;;;-1:-1:-1;;;44380:47:0;;;;;;;;;;;;;;;44463:11;;44438:38;;44447:6;;-1:-1:-1;;;;;44463:11:0;44438:8;:38::i;:::-;44487:11;;:162;;;-1:-1:-1;;;44487:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;44628:10;44487:162;;;;;;-1:-1:-1;;;;;44487:11:0;;;;:25;;:162;;;;;:11;;:162;;;;;;;;:11;;:162;;;5:2:-1;;;;30:1;27;20:12;5:2;44487:162:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44487:162:0;;;;44106:551;;;;:::o;3358:133::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;3233:6;;-1:-1:-1;;;3233:6:0;;;;3225:15;;;;;;3478:5;3469:14;;-1:-1:-1;;;;3469:14:0;;;3358:133::o;7368:56::-;;;;;;;;;;;;-1:-1:-1;;;;;7368:56:0;;:::o;20471:405::-;20578:4;20620:1;20608:9;:13;20600:22;;;;;;20651:1;20641:7;:11;20633:20;;;;;;20664:18;20685:4;20690:9;20685:15;;;;;;;;;;;;;;;;;;20664:36;;20711:16;20730:4;20735:7;20730:13;;;;;;;;;;;;;;;;;;20711:32;;20761:52;20780:6;20788:9;20799:4;20805:7;20761:18;:52::i;:::-;:107;;;;;20830:38;20849:7;20858:9;20830:18;:38::i;:::-;20754:114;20471:405;-1:-1:-1;;;;;20471:405:0:o;44665:864::-;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;45055:25;45061:10;45073:6;45055:5;:25::i;:::-;45047:53;;;;;-1:-1:-1;;;45047:53:0;;;;;;;;;;;;-1:-1:-1;;;45047:53:0;;;;;;;;;;;;;;;45119:22;45134:6;45119:14;:22::i;:::-;45111:53;;;;;-1:-1:-1;;;45111:53:0;;;;;;;;;;;;-1:-1:-1;;;45111:53:0;;;;;;;;;;;;;;;45200:13;;45175:40;;45184:6;;-1:-1:-1;;;;;45200:13:0;45175:8;:40::i;:::-;45357:13;;:164;;;-1:-1:-1;;;45357:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;45500:10;45357:164;;;;;;-1:-1:-1;;;;;45357:13:0;;;;:27;;:164;;;;;:13;;:164;;;;;;;;:13;;:164;;;5:2:-1;;;;30:1;27;20:12;17730:94:0;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;17798:12;:18;17730:94::o;17519:203::-;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;17639:26;17645:10;17657:7;17639:5;:26::i;:::-;17631:35;;;;;;17677:29;;;;:20;:29;;;;;:37;;-1:-1:-1;;;;;;17677:37:0;-1:-1:-1;;;;;17677:37:0;;;;;;;;;;17519:203::o;9788:141::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;9875:9;:12;;;9868:19;;9860:28;;;;;;9899:15;:22;9788:141::o;46882:959::-;46969:16;46996:12;47019:21;47051:20;47082;47113:17;47141:16;47168:14;47193:18;47222:19;47252:14;47285:15;47303:4;47308:3;47303:9;;;;;;;;;;;;;;;;;;47285:27;;47340:3;:16;;;47360:1;47340:21;;47325:37;;47408:12;47384:3;:20;;;;;;;;;;-1:-1:-1;;;;;47384:20:0;-1:-1:-1;;;;;47384:36:0;;;47373:48;;47456:3;:17;;;;;;;;;;;;47448:26;;47432:42;;47508:3;:20;;;;;;;;;;-1:-1:-1;;;;;47508:20:0;-1:-1:-1;;;;;47500:29:0;47485:44;;47563:3;:16;;;47540:40;;47611:3;:13;;;;;;;;;;-1:-1:-1;;;;;47611:13:0;-1:-1:-1;;;;;47603:22:0;47591:34;;47655:3;:12;;;47636:32;;47696:3;:10;;;47679:28;;47739:3;:14;;;;;;;;;;;;47731:23;;47718:36;;47773:21;47784:3;:9;;;47773:10;:21::i;:::-;47765:29;;47822:3;:10;;;;;;;;;;;;47814:19;;47805:28;;46882:959;;;;;;;;;;;;;;:::o;6883:51::-;;;;;;;;;;;;-1:-1:-1;;;;;6883:51:0;;:::o;3079:26::-;;;-1:-1:-1;;;3079:26:0;;;;;:::o;48912:112::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;48976:9;;;48996:5;-1:-1:-1;;;;;48976:9:0;;;;48969:26;;48996:5;49003:12;:10;:12::i;:::-;48969:47;;;;;;;;;;;;;-1:-1:-1;;;;;48969:47:0;-1:-1:-1;;;;;48969:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48969:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48969:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;48912:112:0:o;14067:198::-;14152:13;14191:25;;;:15;:25;;;;;;-1:-1:-1;;;;;14191:25:0;14237:19;14229:28;;;;;42767:30;;;-1:-1:-1;;;;;42767:30:0;;:::o;43413:332::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;43492:34;43546:8;43492:63;;43576:17;-1:-1:-1;;;;;43576:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43576:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43576:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43576:38:0;43568:47;;;;;;43669:11;:31;;-1:-1:-1;;;;;43669:31:0;;;-1:-1:-1;;;;;;43669:31:0;;;;;;;43711:15;:26;;;;;;;;;;;;;;43413:332::o;11976:124::-;-1:-1:-1;;;;;12065:27:0;12032:13;12065:27;;;:19;:27;;;;;;;11976:124::o;41301:339::-;41398:9;;41387:7;:20;;41379:47;;;;;-1:-1:-1;;;41379:47:0;;;;;;;;;;;;-1:-1:-1;;;41379:47:0;;;;;;;;;;;;;;;41452:9;;41445:66;;;-1:-1:-1;;;41445:66:0;;41476:10;41445:66;;;;41496:4;41445:66;;;;;;;;;;;;-1:-1:-1;;;;;41452:9:0;;;;41445:30;;:66;;;;;;;;;;;;;;;41452:9;;41445:66;;;5:2:-1;;;;30:1;27;20:12;5:2;41445:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41445:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41445:66:0;41437:75;;;;;;41525:16;:18;;;;;;:16;41570:17;:15;:17::i;:::-;41554:33;;41598:34;41609:1;41612;41615;41618:5;41625:6;41598:10;:34::i;6547:::-;;;;:::o;40867:36::-;;;;:::o;3268:82::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;3329:6;:13;;-1:-1:-1;;;;3329:13:0;-1:-1:-1;;;3329:13:0;;;3268:82::o;14410:700::-;14471:28;14512:18;14533:17;14543:6;14533:9;:17::i;:::-;14512:38;-1:-1:-1;14567:15:0;14563:540;;-1:-1:-1;;14606:16:0;;;14620:1;14606:16;;;;;;;;14599:23;;14563:540;14655:23;14695:10;14681:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;14681:25:0;;14655:51;;14721:17;14741:13;:11;:13::i;:::-;14721:33;-1:-1:-1;14769:19:0;14852:1;14839:223;14864:9;14855:5;:18;14839:223;;14907:22;;;;:15;:22;;;;;;-1:-1:-1;;;;;14907:32:0;;;:22;;:32;14903:144;;;14986:5;14964:6;14971:11;14964:19;;;;;;;;;;;;;;;;;:27;15014:13;;;;;14903:144;14875:7;;14839:223;;;15085:6;15078:13;;;;;;;;;22928:958;23024:7;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;23049:18;23070:4;23075:9;23070:15;;;;;;;;;;;;;;;;;;;;;23156:16;;;;23070:15;;-1:-1:-1;;;;;;23156:16:0;23148:45;;;;;-1:-1:-1;;;23148:45:0;;;;;;;;;;;;-1:-1:-1;;;23148:45:0;;;;;;;;;;;;;;;23214:27;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23214:27:0;;;;;;;-1:-1:-1;;;23214:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23214:27:0;;;;;;;;;;:19;:27::i;:::-;23206:55;;;;;-1:-1:-1;;;23206:55:0;;;;;;;;;;;;-1:-1:-1;;;23206:55:0;;;;;;;;;;;;;;;23274:14;23291:6;:19;;;23274:36;;23321:16;23340:4;23345:6;23340:12;;;;;;;;;;;;;;;;23384:17;;;;;23340:12;;;;;;;23416:15;;;;23340:12;;-1:-1:-1;23384:17:0;;;;;;;;;23416:15;;;;:35;-1:-1:-1;23412:95:0;;;-1:-1:-1;23480:15:0;;;;;;;;;23412:95;23553:11;;23575:12;;23589:10;;23553:11;23601:23;;;23540:89;;;-1:-1:-1;;;23540:89:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;23601:23:0;;;;;:27;23540:89;;;;;;23519:18;;-1:-1:-1;;;;;23553:11:0;;23540:34;;:89;;;;;;;;;;;;;;23553:11;23540:89;;;5:2:-1;;;;30:1;27;20:12;5:2;23540:89:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23540:89:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23540:89:0;23642:13;23658:26;;;:15;23540:89;23658:26;;;;;23733:19;;;;23540:89;;-1:-1:-1;;;;;;23658:26:0;;23711:76;;23674:9;;23711:76;23658:26;23754:13;;23711:76;23540:89;23658:26;23711:10;:76::i;:::-;23800:26;23807:19;;;;23800:26;;;;-1:-1:-1;;23839:12:0;:14;;-1:-1:-1;;23839:14:0;;;-1:-1:-1;23695:92:0;;-1:-1:-1;;;;22928:958:0;;;:::o;652:20::-;;;-1:-1:-1;;;;;652:20:0;;:::o;21698:1076::-;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;21875:12;;21864:7;:23;;21856:48;;;;;-1:-1:-1;;;21856:48:0;;;;;;;;;;;;-1:-1:-1;;;21856:48:0;;;;;;;;;;;;;;;21930:9;;21923:66;;;-1:-1:-1;;;21923:66:0;;21954:10;21923:66;;;;21974:4;21923:66;;;;;;;;;;;;-1:-1:-1;;;;;21930:9:0;;;;21923:30;;:66;;;;;;;;;;;;;;;21930:9;;21923:66;;;5:2:-1;;;;30:1;27;20:12;5:2;21923:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21923:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21923:66:0;21915:75;;;;;;22049:28;22055:10;22067:9;22049:5;:28::i;:::-;22041:37;;;;;;22097:38;22116:7;22125:9;22097:18;:38::i;:::-;22089:47;;;;;;22202:18;22223:4;22228:9;22223:15;;;;;;;;;;;;;;;;;22342:23;;;;;;;;22223:15;;;;;;;22342:23;;;;;;;;-1:-1:-1;;;;;22342:23:0;;;;;;;;;;-1:-1:-1;;;22342:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22342:23:0;;;;;;;;22223:15;;-1:-1:-1;22342:23:0;;:15;:23::i;:::-;22334:32;;;;;;22430:16;22449:4;22454:7;22449:13;;;;;;;;;;;;;;;;;22564:21;;;;;;;;22449:13;;;;;;;22564:21;;;;;;;;-1:-1:-1;;;;;22564:21:0;;;;;;;;;;-1:-1:-1;;;22564:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22564:21:0;;;;;;;;22449:13;;-1:-1:-1;22564:21:0;;:15;:21::i;:::-;22556:30;;;;;;22607:115;22640:6;22661:9;22685:4;22704:7;22607:18;:115::i;:::-;22599:124;;;;;;22736:30;22747:9;22758:7;22736:10;:30::i;:::-;3177:1;;21698:1076;;;:::o;10038:37::-;;;;;;;;;;;;;;-1:-1:-1;;;10038:37:0;;;;:::o;47973:504::-;48060:9;;48053:66;;;-1:-1:-1;;;48053:66:0;;48084:10;48053:66;;;;48104:4;48053:66;;;;;;;;;;;;-1:-1:-1;;;;;48060:9:0;;;;48053:30;;:66;;;;;;;;;;;;;;;48060:9;;48053:66;;;5:2:-1;;;;30:1;27;20:12;5:2;48053:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48053:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48053:66:0;48045:75;;;;;;48141:15;48159:4;48164:6;48159:12;;;;;;;;;;;;;;;;;;48141:30;;48197:17;;48186:7;:28;48182:134;;;48239:10;;;;-1:-1:-1;;;48239:10:0;;;;48253:1;48239:15;48231:43;;;;;-1:-1:-1;;;48231:43:0;;;;;;;;;;;;-1:-1:-1;;;48231:43:0;;;;;;;;;;;;;;;48289:10;;;:15;;;-1:-1:-1;;;48289:15:0;;;;;48303:1;48289:15;;;;;-1:-1:-1;;48289:15:0;;;;;;48182:134;48351:17;;48340:7;:28;48336:134;;;48393:10;;;;-1:-1:-1;;;48393:10:0;;;;48407:1;48393:15;48385:43;;;;;-1:-1:-1;;;48385:43:0;;;;;;;;;;;;-1:-1:-1;;;48385:43:0;;;;;;;;;;;;;;;48443:10;;;:15;;;-1:-1:-1;;;48443:15:0;;;;;48457:1;48443:15;;;;;-1:-1:-1;;48443:15:0;;;;;;47973:504;;;:::o;6050:410::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42144:126::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;42228:15;:34;;-1:-1:-1;;;;;;42228:34:0;-1:-1:-1;;;;;42228:34:0;;;;;;;;;;42144:126::o;42622:46::-;;;;:::o;12293:399::-;3159:6;;-1:-1:-1;;;3159:6:0;;;;3158:7;3150:16;;;;;;-1:-1:-1;;;;;12432:17:0;;12424:26;;;;;;-1:-1:-1;;;;;12469:20:0;;12484:4;12469:20;;12461:29;;;;;;12524:11;;-1:-1:-1;;;;;12509:27:0;;;12524:11;;12509:27;;12501:36;;;;;;12571:13;;-1:-1:-1;;;;;12556:29:0;;;12571:13;;12556:29;;12548:38;;;;;;12607:27;12613:10;12625:8;12607:5;:27::i;:::-;12599:36;;;;;;12648;12658:10;12670:3;12675:8;12648:9;:36::i;15553:38::-;;;;:::o;42675:46::-;;;;:::o;48635:134::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;48723:17;:38;48635:134::o;18133:216::-;18221:4;18260:1;18251:6;:10;18243:19;;;;;;18273:15;18291:4;18296:6;18291:12;;;;;;;;;;;;;;;;;18321:20;;;;;;;;18291:12;;;;;;;18321:20;;;;;;;;-1:-1:-1;;;;;18321:20:0;;;;;;;;;;-1:-1:-1;;;18321:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18321:20:0;;;;;;;;18291:12;;-1:-1:-1;18321:20:0;;:15;:20::i;:::-;18314:27;18133:216;-1:-1:-1;;;18133:216:0:o;41652:190::-;41147:15;;-1:-1:-1;;;;;41147:15:0;41133:10;:29;41125:85;;;;-1:-1:-1;;;41125:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41727:16;:18;;;;;;:16;41772:17;:15;:17::i;:::-;41756:33;;41800:34;41811:1;41814;41817;41820:5;41827:6;41800:10;:34::i;7433:35::-;;;-1:-1:-1;;;;;7433:35:0;;:::o;40910:30::-;;;-1:-1:-1;;;;;40910:30:0;;:::o;40829:31::-;;;;:::o;15697:26::-;;;-1:-1:-1;;;;;15697:26:0;;:::o;1209:137::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1284:22:0;;;1280:61;;1317:5;:16;;-1:-1:-1;;;;;;1317:16:0;-1:-1:-1;;;;;1317:16:0;;;;;1280:61;1209:137;:::o;7178:54::-;;;;;;;;;;;;-1:-1:-1;;;;;7178:54:0;;:::o;42728:32::-;;;-1:-1:-1;;;;;42728:32:0;;:::o;48489:134::-;986:5;;-1:-1:-1;;;;;986:5:0;972:10;:19;964:64;;;;;-1:-1:-1;;;964:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;964:64:0;;;;;;;;;;;;;;;48577:17;:38;48489:134::o;8681:1099::-;8878:4;9010:1;8996:15;;9043:2;9027:18;;;;9023:69;;;-1:-1:-1;9078:2:0;9023:69;9104:15;;:::i;:::-;9122:346;;;;;;;;9148:6;9122:346;;;;9187:3;-1:-1:-1;;;;;9122:346:0;;;;;9224:1;-1:-1:-1;;;;;9122:346:0;;;;;9257:9;9122:346;;;;;;9297:7;9122:346;;;;;;9334:1;9122:346;;;;9365:13;9122:346;;;;;;9412:11;9122:346;;;;;;9454:1;9122:346;;;;;9104:364;;9479:16;9516:1;9498:4;9508;9498:15;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;9498:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9498:15:0;;;;;-1:-1:-1;;;;;9498:15:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9498:15:0;;;;;-1:-1:-1;;;;;9498:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;9479:38;;9535:157;9555:6;9576:8;9607:4;:13;;;9644:4;:11;;;9671:4;:10;;;9535:157;;;;-1:-1:-1;;;;;9535:157:0;-1:-1:-1;;;;;9535:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9705:39;9723:1;9727:6;9735:8;9705:9;:39::i;:::-;9764:8;8681:1099;-1:-1:-1;;;;;;;;8681:1099:0:o;11182:145::-;11257:4;11281:25;;;:15;:25;;;;;;-1:-1:-1;;;;;11281:38:0;;;:25;;:38;;11182:145::o;11721:123::-;11796:28;;;;:18;:28;;;;;;:40;;-1:-1:-1;;;;;;11796:40:0;-1:-1:-1;;;;;11796:40:0;;;;;;;;;11721:123::o;20055:298::-;20174:4;20196:18;20217:4;20222:9;20217:15;;;;;;;;;;;;;;;;;;20196:36;;20243:16;20262:4;20267:7;20262:13;;;;;;;;;;;;;;;;;;20243:32;;20293:52;20312:6;20320:9;20331:4;20337:7;20293:18;:52::i;20884:688::-;21015:16;21034:4;21039:7;21034:13;;;;;;;;;;;;;;;;;;21015:32;;21058:18;21079:4;21084:9;21079:15;;;;;;;;;;;;;;;;;;21058:36;;21211:7;21182:37;;:6;:19;;:37;;;;21283:22;21300:4;21283:16;:22::i;:::-;21316:24;21333:6;21316:16;:24::i;:::-;21360:31;;;;:20;:31;;;;;;;;21353:38;;-1:-1:-1;;;;;;21353:38:0;;;;;;21409:29;;;;;;21402:36;;;;;;;21451:12;:14;;-1:-1:-1;21451:14:0;;;;;;21492:26;;;:15;:26;;;;;;;21540:23;;;;21483:81;;-1:-1:-1;;;;;21492:26:0;;;21483:81;;;;;;;;;;;;;;-1:-1:-1;;;21540:23:0;;;-1:-1:-1;;;;;21540:23:0;21483:81;;;;;;;;;;;;;;;20884:688;;;;:::o;11558:155::-;11640:4;11664:28;;;:18;:28;;;;;;-1:-1:-1;;;;;11664:41:0;;;:28;;:41;;11558:155::o;7840:399::-;-1:-1:-1;;;;;7925:24:0;;;;;;;:19;:24;;;;;;;;:26;;;;;;7962:25;;;:15;:25;;;;;:31;;-1:-1:-1;;;;;;7962:31:0;;;;;;8008:19;;;8004:182;;-1:-1:-1;;;;;8044:26:0;;;;;;:19;:26;;;;;;;;:28;;-1:-1:-1;;8044:28:0;;;8094:30;;;:20;:30;;;;;8087:37;;-1:-1:-1;;;;;;8087:37:0;;;;;;8146:18;:28;;;;;;8139:35;;;;;;;8004:182;8201:30;;;-1:-1:-1;;;;;8201:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7840:399;;;:::o;18890:1034::-;19085:4;19167:7;19154:9;:20;19150:65;;;-1:-1:-1;19198:5:0;19191:12;;19150:65;19300:7;19280;:16;;;:27;:56;;;;19329:7;19311;:14;;;:25;19280:56;19276:101;;;-1:-1:-1;19360:5:0;19353:12;;19276:101;19409:9;19391:5;:14;;;:27;:56;;;;19438:9;19422:5;:12;;;:25;19391:56;19387:101;;;-1:-1:-1;19471:5:0;19464:12;;19387:101;19504:14;;;;:19;;:44;;-1:-1:-1;19527:16:0;;;;:21;19504:44;19500:88;;;-1:-1:-1;19572:4:0;19565:11;;19500:88;19679:7;:16;;;19661:5;:14;;;:34;:70;;;;19717:7;:14;;;19699:5;:14;;;:32;19661:70;19657:115;;;-1:-1:-1;19755:5:0;19748:12;;19657:115;19802:7;:16;;;19786:5;:12;;;:32;:66;;;;19838:7;:14;;;19822:5;:12;;;:30;19786:66;19782:111;;;-1:-1:-1;19876:5:0;19869:12;;19782:111;-1:-1:-1;19912:4:0;18890:1034;;;;;;;:::o;16446:309::-;16533:4;16572:26;;;:15;:26;;;;;;;16629:24;;;;;;;-1:-1:-1;;;;;16572:26:0;;;;16629:24;16674;;;;:72;;-1:-1:-1;16702:29:0;;;;:20;:29;;;;;;-1:-1:-1;;;;;16702:29:0;;;:44;;;;16666:81;;;;16446:309;;;;:::o;49036:530::-;49087:27;49141:2;49158:11;49154:54;;-1:-1:-1;;49186:10:0;;;;;;;;;;;;-1:-1:-1;;;49186:10:0;;;;;;49154:54;49227:6;49218;49263:69;49270:6;;49263:69;;49293:5;;49318:2;49313:7;;;;49263:69;;;49342:17;49372:3;49362:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;49362:14:0;87:34:-1;135:17;;-1:-1;49362:14:0;-1:-1:-1;49342:34:0;-1:-1:-1;;;49396:7:0;;49414:115;49421:11;;49414:115;;49486:2;49477:6;:11;49472:2;:16;49461:29;;49449:4;49454:3;;;;;;;49449:9;;;;;;;;;;;:41;-1:-1:-1;;;;;49449:41:0;;;;;;;;-1:-1:-1;49515:2:0;49505:12;;;;49414:115;;;-1:-1:-1;49553:4:0;49036:530;-1:-1:-1;;;;;49036:530:0:o;42278:293::-;42481:5;;;42438:49;;;42379:12;42369:23;42438:49;;;;;;;;42464:15;42438:49;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;42438::0;;;;;;;42428:60;;;;;42523:7;;;;;;;42493;42420:81;;42504:8;42420:92;;42278:293::o;17832:184::-;17903:4;17928:7;:20;;;17952:1;17928:25;;17927:81;;;;-1:-1:-1;;17959:24:0;;;-1:-1:-1;;;;;17994:12:0;17959:48;;;;;;;17832:184::o;16036:172::-;16101:4;16126;:17;;;16147:1;16126:22;16125:75;;;;-1:-1:-1;;16154:21:0;;;-1:-1:-1;;;;;16186:12:0;16154:45;;;;;;;16036:172::o;16942:257::-;17068:15;;17048:18;;;;17087:12;;17068:15;17038:9;;17048:18;;17038:29;;;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;;;17006:21;;;:94;;-1:-1:-1;;17006:94:0;-1:-1:-1;;;17038:45:0;;;;17037:62;;;;-1:-1:-1;;;;;17006:94:0;;;;;;;;17117:18;;;;17138:2;17117:18;;;;:23;17113:79;;;17157:18;;:23;;;;;;17179:1;17157:23;;-1:-1:-1;;17157:23:0;;;;;;16942:257::o;42578:6991::-;;;;;;;;;-1:-1:-1;42578:6991:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://d9dc322dc23884a0eda3010b0bcad8e2e3f7f61fdd1e593ba6af9cfbfbfe703f
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.