Contract 0xea2e87ff1bc1e52b640452694e2f143f7f8d64be 10

 
Txn Hash
Block
From
To
Value [Txn Fee]
0x95e594007068f64da729c8744cb10f9f0ac4f2f7cfcedc1287bd04ac5d7979b395630012021-07-29 2:10:5620 secs ago0xfcac734fa9fe8c0e6a7670dd250026b012083d04 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00116767
0x038822431001ac98863405681fb8b6a37dc6cdfd64e94b48dc336359f7bd96fc95630012021-07-29 2:10:5620 secs ago0xbc83912741633f603d10b215d8782d98eec4578e IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00014699
0xadc1412476182a973a9fadebf008fd4c4c7a486913ab810a60ed31d41b16813395630012021-07-29 2:10:5620 secs ago0xaded2744c3fd51a54b3de02600c766436f792ccf IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000145765
0x3a5f89c2eab6fb91f98c4e869a78b48224624fc20360728c05b4bcbff359bc6395630002021-07-29 2:10:5323 secs ago0x44c0ed3914aedfd8963591567c9287d28fea397a IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00076912
0xa9e3ae96a829ac7a45604ccb67e5d80aed57183a6fcdb7016d01aa79f2f1d56495629992021-07-29 2:10:5026 secs ago0xc52828b3947a34f02bed9e08295d1ac0ee0eedb7 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xb2bd77b40b4b7f0c7269ac07a5b980d0b91cd1173c590e5a8aed32f3b92f888d95629962021-07-29 2:10:4135 secs ago0x7a4b6db32b3387836a55c0623c134a7b78d4d332 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x41631b1c279bf5dad534d9aa61127fa259b56fed8f7bc277f4a3735cf59694d995629962021-07-29 2:10:4135 secs ago0xbc83912741633f603d10b215d8782d98eec4578e IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00014699
0x70d5b7cd29b7e7d9ac8d9e1a9ecdaac3ef1a0a173691fc086e3368030a0a503b95629962021-07-29 2:10:4135 secs ago0x5af6dd3193d3c1aec5060faed52aebfeae8c98a5 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xf0cd74d1aceb052ce7ee1bfbd062e705810aadca5724612558243fff39a0844f95629952021-07-29 2:10:3541 secs ago0xb737382c0c7bdf4914a6daafc974e10c978270a2 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xee80ed270b811b39d4d3eb2aa70d9a0269e62ba932c5a5f7b650901bd8833dc295629932021-07-29 2:10:2947 secs ago0x83c1416f2dbbb9be7df94f0488b10a496f276b4a IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x5520bb4033a784e8b14a5ffb9d92d30b862da2adfe48bad45390d603e537804c95629912021-07-29 2:10:2353 secs ago0xd74d1f35c9a261744449ea092f1bb5783c7234b6 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000291775
0x7cc8bec8b13abf3ca4c61965e0e2e63f65b6c7b57b6bf286f58d93faf90698e795629892021-07-29 2:10:1759 secs ago0x4cb6764530a998d736a9d69bb44384850fe43a76 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xc9a93042cf45917c476a60b51e3589235d39078503181a28de4ae59c9fd9518e95629872021-07-29 2:10:101 min ago0xbbc78b9c1afcf21d8911518757283769a052ecf8 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00091912
0xe4a83703f7fc2ebdba0bec5bc910362f47512647193d6e2d2f51015cb164232095629872021-07-29 2:10:101 min ago0xe718fd0a02381927d9969631f2cf0909c903fc90 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x6069b05b6ba0d29f97eb2c69afc051e0fb4f31221f0c7bd0a8ca0715a03a05cb95629842021-07-29 2:10:011 min ago0x868b3fa99ef5c0ba82425e73d1dd1ed92522ad5c IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xc1ecf0918dc576d67a38eca1bd468c80ac5d6a6d19146ec5f0c08ace602a7ed495629822021-07-29 2:09:551 min ago0xbc83912741633f603d10b215d8782d98eec4578e IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00014699
0xa4d7804943d499ffb9ae76f7793c99bd42533b4bc4d6750a02463c43fff6853295629812021-07-29 2:09:521 min ago0x99a1a136c54a62530ac55b6dc762139e27228dc3 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0xa891aa722b72ed08a573f17d60c1c3c659981327690299eac183551005c5e77095629802021-07-29 2:09:491 min ago0x9926e5f3ee141d809cdb5dffe3c6ab2157c398fd IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.000676845
0x4d19f161892b9308f10150d6683abc2b6f4c418d9616d16496fdeec2541deb9295629792021-07-29 2:09:461 min ago0x4344bac30cf00b7c4fc2795a37da51b1ef3f5169 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x7e9f4f67ac3a42d663735aa34c646d076420154653377fe96347268adf3169a395629792021-07-29 2:09:461 min ago0x27462d94e98405731fb912b5c7d181bad7e205ed IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x373c05d6952249c75b169c87a91e4c308d81879575321ce8002f8a4572e28e1a95629772021-07-29 2:09:361 min ago0x382603cf6540fd4ae29e3a54eab8d8bd45ff11c8 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00084412
0x7971fa32a82656fd9ffbf08ae124e215010360df5c80568e8779948fd8f8c2be95629772021-07-29 2:09:361 min ago0x28057c06ac3be2bdf014611f7f0157d79680566a IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00091912
0x86e478b8b2144d2a66d112360d2ea48286b5e13799370b0ad907868a9b3a332595629762021-07-29 2:09:331 min ago0x99a1a136c54a62530ac55b6dc762139e27228dc3 IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00091912
0xb2f10b27c532f75f28a1492ae672b492407832efa8ed2d23c0b5fe1f2c10599b95629752021-07-29 2:09:301 min ago0x40ec66991c897967647dbbaa9771569ceccfa6fe IN  0xea2e87ff1bc1e52b640452694e2f143f7f8d64be0 BNB0.00014982
0x6dd90a902f8bbce522fd67eedf79131f957696cd553df3d8579aca70924e22a395629722021-07-29 2:09:171 min ago0x03f891b6a5b405b83405bac96843d411866e505a 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.