ETH Price: $4,086.95 (+4.87%)

Token

Ghostbusters: Afterlife Collectibles (GBAC)
 

Overview

Max Total Supply

3,051 GBAC

Holders

1,318

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
ethanpierse.eth
Balance
2 GBAC
0x786c9ad06d8da4663a837ca89d3db1f5f8a326ed
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

This project is a collaboration between the Big Head Club team, filmmaker Jason Reitman (Ghostbusters: Afterlife director/writer), and Gil Kenan (Ghostbusters: Afterlife writer).

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MiniStayPuft

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 10 : MiniStayPuft.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./interfaces/IERC721.sol";
import "./interfaces/IERC721Enumerable.sol";
import "./interfaces/IERC721Metadata.sol";
import "./interfaces/IERC721Receiver.sol";
import "./interfaces/IERC165.sol";

import "./IGBATrapsPartial.sol";
import "./Ownable.sol";

import "./GBAWhitelist.sol";

/// @author Andrew Parker
/// @title Ghost Busters: Afterlife Mini Stay Puft NFT contract
contract MiniStayPuft is IERC721, IERC721Metadata, IERC165, Ownable{

    enum Phase{Init,PreReserve,Reserve,Final} // Launch phase
    struct Reservation{
        uint24 block;       // Using uint24 to store block number is fine for the next 2.2 years
        uint16[] tokens;    // TokenIDs reserved by person
    }
    bool paused = true;                 // Sale pause state
    bool unpausable;                    // Unpausable
    uint startTime;                     // Timestamp of when preReserve phase started (adjusts when paused/unpaused)
    uint pauseTime;                     // Timestamp of pause
    uint16 tokenCount;                  // Total tokens minted and reserved. (not including caught mobs)

    uint16 tokensGiven;                     // Total number of giveaway token's minted
    uint16 constant TOKENS_GIVEAWAY = 200;  // Max number of giveaway tokens

    uint constant PRICE_MINT = 0.08 ether;    // Mint cost

    string __uriBase;       // Metadata URI base
    string __uriSuffix;     // Metadata URI suffix

    uint constant COOLDOWN = 10;            // Min interval in blocks to reserve
    uint16 constant TRANSACTION_LIMIT = 10; // Max tokens reservable in one transaction

    mapping(address => Reservation) reservations;       // Mapping of buyer to reservations
    mapping(address => uint8) whitelistReserveCount;    // Mapping of how many times listees have preReserved
    uint8 constant WHITELIST_RESERVE_LIMIT = 2;         // Limit of how many tokens a listee can preReserve
    uint constant PRESALE_LIMIT = 2000;                 // Max number of tokens that can be preReserved
    uint presaleCount;                                  // Number of tokens that have been preReserved


    event Pause(bool _pause,uint _startTime,uint _pauseTime);
    event Reserve(address indexed reservist, uint indexed tokenId);
    event Claim(address indexed reservist, uint indexed tokenId);

    //MOB VARS
    address trapContract;   // Address of Traps contract
    address whitelist;      // Address of Whitelist contract

    uint16 constant SALE_MAX = 10000;       // Max number of tokens that can be sold
    uint16[4] mobTokenIds;                  // Partial IDs of current mobs. 4th slot is highest id (used to detect mob end)
    uint16 constant TOTAL_MOB_COUNT = 500;  // Total number of mobs that will exist

    uint constant MOB_OFFSET = 100000;      // TokenId offset for mobs

    bool mobReleased = false;               // Has mob been released
    bytes32 mobHash;                        // Current mob data


    mapping(address => uint256) internal balances;                      // Mapping of balances (not including active mobs)
    mapping (uint256 => address) internal allowance;                    // Mapping of allowances
    mapping (address => mapping (address => bool)) internal authorised; // Mapping of token allowances

    mapping(uint256 => address) owners;  // Mapping of owners (not including active mobs)

    uint[] tokens;      // Array of tokenIds (not including active mobs)

    mapping (bytes4 => bool) internal supportedInterfaces;


    constructor(string memory _uriBase, string memory _uriSuffix, address _trapContract, address _whitelist){

        supportedInterfaces[0x80ac58cd] = true; //ERC721
        supportedInterfaces[0x5b5e139f] = true; //ERC721Metadata
        supportedInterfaces[0x01ffc9a7] = true; //ERC165

        mobTokenIds[0] = 1;
        mobTokenIds[1] = 2;
        mobTokenIds[2] = 3;
        mobTokenIds[3] = 3;

        trapContract = _trapContract;
        whitelist = _whitelist;

        __uriBase = _uriBase;
        __uriSuffix = _uriSuffix;

        //Init mobHash segments
        mobHash =
            shiftBytes(bytes32(uint(0)),0) ^ // Random data that changes every tx to even out gas costs
            shiftBytes(bytes32(uint(1)),1) ^ // Number of owners to base ownership calcs on for mob 0
            shiftBytes(bytes32(uint(1)),2) ^ // Number of owners to base ownership calcs on for mob 1
            shiftBytes(bytes32(uint(1)),3) ^ // Number of owners to base ownership calcs on for mob 2
            shiftBytes(bytes32(uint(0)),4);  // Location data for calculating ownership of all mobs
    }

    /// Mint-Reserve State
    /// @notice Get struct properties of reservation mapping for given address, as well as preReserve count.
    /// @dev Combined these to lower compiled contract size (Spurious Dragon).
    /// @param _tokenOwner Address of reservation data to check
    /// @return _whitelistReserveCount Number of times address has pre-reserved
    /// @return blockNumber Block number of last reservation
    /// @return tokenIds Array of reserved, unclaimed tokens
    function mintReserveState(address _tokenOwner)  public view returns(uint8 _whitelistReserveCount, uint24 blockNumber, uint16[] memory tokenIds){
        return (whitelistReserveCount[_tokenOwner],reservations[_tokenOwner].block,reservations[_tokenOwner].tokens);
    }

    /// Contract State
    /// @notice View function for various contract state properties
    /// @dev Combined these to lower compiled contract size (Spurious Dragon).
    /// @return _tokenCount Number of tokens reserved or minted (not including mobs)
    /// @return _phase Current launch phase
    /// @return mobMax Uint used to calculate IDs and number if mobs in circulation.
    function contractState() public view returns(uint _tokenCount, Phase _phase, uint mobMax){
        return (tokenCount,phase(),mobTokenIds[3]);
    }



    /// Pre-Reserve
    /// @notice Pre-reserve tokens during Pre-Reserve phase if whitelisted. Max 2 per address. Must pay mint fee
    /// @param merkleProof Merkle proof for your address in the whitelist
    /// @param _count Number of tokens to reserve
    function preReserve(bytes32[] memory merkleProof, uint8 _count) external payable{
        require(!paused,"paused");
        require(phase() == Phase.PreReserve,"phase");
        require(msg.value >= PRICE_MINT * _count,"PRICE_MINT");
        require(whitelistReserveCount[msg.sender] + _count <= WHITELIST_RESERVE_LIMIT,"whitelistReserveCount");
        require(presaleCount + _count < PRESALE_LIMIT,"PRESALE_LIMIT");
        require(GBAWhitelist(whitelist).isWhitelisted(merkleProof,msg.sender),"whitelist");

        whitelistReserveCount[msg.sender] += _count;
        presaleCount += _count;
        _reserve(_count,msg.sender,true);
    }


    /// Mint Giveaway
    /// @notice Mint tokens for giveaway
    /// @param numTokens Number of tokens to mint
    function mintGiveaway(uint16 numTokens) public onlyOwner {
        require(tokensGiven + numTokens <= TOKENS_GIVEAWAY,"tokensGiven");
        require(tokenCount + numTokens <= SALE_MAX,"SALE_MAX");
        for(uint i = 0; i < numTokens; i++){
            tokensGiven++;
            _mint(msg.sender,++tokenCount);
        }
    }

    /// Withdraw All
    /// @notice Withdraw all Eth from mint fees
    function withdrawAll() public onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

    /// Reserve
    /// @notice Reserve tokens. Max 10 per tx, one tx per 10 blocks. Can't be called by contracts. Must be in Reserve phase. Must pay mint fee.
    /// @param _count Number of tokens to reserve
    /// @dev requires tx.origin == msg.sender
    function reserve(uint16 _count) public payable{
        require(msg.sender == tx.origin,"origin");
        require(!paused,"paused");
        require(phase() == Phase.Reserve,"phase");
        require(_count <= TRANSACTION_LIMIT,"TRANSACTION_LIMIT");
        require(msg.value >= uint(_count) * PRICE_MINT,"PRICE MINT");

        _reserve(_count,msg.sender,false);
    }


    /// Internal Reserve
    /// @notice Does the work in both Reserve and PreReserve
    /// @param _count Number of tokens being reserved
    /// @param _to Address that is reserving
    /// @param ignoreCooldown Don't revert for cooldown.Used in pre-reserve
    function _reserve(uint16 _count, address _to, bool ignoreCooldown) internal{
        require(tokenCount + _count <= SALE_MAX, "SALE_MAX");
        require(ignoreCooldown ||
            reservations[_to].block == 0 || block.number >= uint(reservations[_to].block) + COOLDOWN
        ,"COOLDOWN");

        for(uint16 i = 0; i < _count; i++){
            reservations[address(_to)].tokens.push(++tokenCount);

            emit Reserve(_to,tokenCount);
        }
        reservations[_to].block = uint24(block.number);

    }


    /// Claim
    /// @notice Mint reserved tokens
    /// @param reservist Address with reserved tokens.
    /// @param _count Number of reserved tokens mint.
    /// @dev Allows anyone to call claim for anyone else. Will mint to the address that made the reservations.
    function claim(address reservist, uint _count) public{
        require(!paused,"paused");
        require(
            phase() == Phase.Final
        ,"phase");

        require( reservations[reservist].tokens.length >= _count, "_count");
        for(uint i = 0; i < _count; i++){
            uint tokenId = uint(reservations[reservist].tokens[reservations[reservist].tokens.length - 1]);
            reservations[reservist].tokens.pop();
            _mint(reservist,tokenId);
            emit Claim(reservist,tokenId);
        }

        updateMobStart();
        updateMobFinish();
    }


    /// Mint
    /// @notice Mint unreserved tokens. Must pay mint fee.
    /// @param _count Number of reserved tokens mint.
    function mint(uint _count) public payable{
        require(!paused,"paused");
        require(
            phase() == Phase.Final
        ,"phase");
        require(msg.value >= _count * PRICE_MINT,"PRICE");

        require(tokenCount + uint16(_count) <= SALE_MAX,"SALE_MAX");

        for(uint i = 0; i < _count; i++){
            _mint(msg.sender,uint(++tokenCount));
        }

        updateMobStart();
        updateMobFinish();
    }


    /// Update URI
    /// @notice Update URI base and suffix
    /// @param _uriBase URI base
    /// @param _uriSuffix URI suffix
    /// @dev Pushing size limits (Spurious Dragon), so rather than having an explicit lock function, it can be implicit by renouncing ownership.
    function updateURI(string memory _uriBase, string memory _uriSuffix) public onlyOwner{
        __uriBase   = _uriBase;
        __uriSuffix = _uriSuffix;
    }


    /// Phase
    /// @notice Internal function to calculate current Phase
    /// @return Phase (enum value)
    function phase() internal view returns(Phase){
        uint _startTime = startTime;
        if(_startTime == 0){
            return Phase.Init;
        }else if(block.timestamp <= _startTime + 2 hours){
            return Phase.PreReserve;
        }else if(block.timestamp <= _startTime + 2 hours + 1 days && tokenCount < SALE_MAX){
            return Phase.Reserve;
        }else{
            return Phase.Final;
        }
    }

    /// Pause State
    /// @notice Get current pause state
    /// @return _paused Contract is paused
    /// @return _startTime Start timestamp of Cat phase (adjusted for pauses)
    /// @return _pauseTime Timestamp of pause
    function pauseState() view public returns(bool _paused,uint _startTime,uint _pauseTime){
        return (paused,startTime,pauseTime);
    }


    /// Disable pause
    /// @notice Disable mint pausability
    function disablePause() public onlyOwner{
        if(paused) togglePause();
        unpausable = true;
    }

    /// Toggle pause
    /// @notice Toggle pause on/off
    function togglePause() public onlyOwner{
        if(startTime == 0){
            startTime = block.timestamp;
            paused = false;
            emit Pause(false,startTime,pauseTime);
            return;
        }
        require(!unpausable,"unpausable");

        bool _pause = !paused;
        if(_pause){
            pauseTime = block.timestamp;
        }else if(pauseTime != 0){
            startTime += block.timestamp - pauseTime;
            delete pauseTime;
        }
        paused = _pause;
        emit Pause(_pause,startTime,pauseTime);
    }


    /// Get Mob Owner
    /// @notice Internal func to calculate the owner of a given mob for a given mob hash
    /// @param _mobIndex Index of mob to check (0-2)
    /// @param _mobHash Mob hash to base calcs off
    /// @return Address of the calculated owner
    function getMobOwner(uint _mobIndex, bytes32 _mobHash) internal view returns(address){
        bytes32 mobModulo = extractBytes(_mobHash, _mobIndex + 1);
        bytes32 locationHash = extractBytes(_mobHash,4);

        uint hash = uint(keccak256(abi.encodePacked(locationHash,_mobIndex,mobModulo)));
        uint index = hash % uint(mobModulo);

        address _owner = owners[tokens[index]];

        if(mobReleased){
            return _owner;
        }else{
            return address(0);
        }
    }

    /// Get Mob Token ID (internal)
    /// @notice Internal func to calculate mob token ID given an index
    /// @dev Doesn't check invalid vals, inferred by places where its used and saves gas
    /// @param _mobIndex Index of mob to calculate
    /// @return tokenId of mob
    function _getMobTokenId(uint _mobIndex) internal view returns(uint){
        return MOB_OFFSET+uint(mobTokenIds[_mobIndex]);
    }

    /// Get Mob Token ID
    /// @notice Calculate mob token ID given an index
    /// @dev Doesn't fail for _mobIndex = 3, because of Spurious Dragon and because it doesnt matter
    /// @param _mobIndex Index of mob to calculate
    /// @return tokenId of mob
    function getMobTokenId(uint _mobIndex) public view returns(uint){
        uint tokenId = _getMobTokenId(_mobIndex);
        require(tokenId != MOB_OFFSET,"no token");
        return tokenId;
    }

    /// Extract Bytes
    /// @notice Get the nth 4-byte chunk from a bytes32
    /// @param data Data to extract bytes from
    /// @param index Index of chunk
    function extractBytes(bytes32 data, uint index) internal pure returns(bytes32){
        uint inset = 32 * ( 7 -  index );
        uint outset = 32 * index;
        return ((data  << outset) >> outset) >> inset;
    }

    /// Extract Bytes
    /// @notice Bit shift a bytes32 for XOR packing
    /// @param data Data to bit shift
    /// @param index How many 4-byte segments to shift it by
    function shiftBytes(bytes32 data, uint index) internal pure returns(bytes32){
        uint inset = 32 * ( 7 -  index );
        return data << inset;
    }

    /// Release Mob
    /// @notice Start Mob
    function releaseMob() public onlyOwner{
        require(!mobReleased,"released");
        require(tokens.length > 0, "no mint");

        mobReleased = true;

        bytes32 _mobHash = mobHash;                                         //READ
        uint eliminationBlock = block.number - (block.number % 245) - 10;    //READ

        bytes32 updateHash  = extractBytes(keccak256(abi.encodePacked(_mobHash)),0);

        bytes32 mobModulo = bytes32(tokens.length);
        bytes32 destinationHash = extractBytes( blockhash(eliminationBlock),4) ;

        bytes32 newMobHash =    shiftBytes(updateHash,0) ^                                                //WRITE
                                shiftBytes(mobModulo,1) ^
                                shiftBytes(mobModulo,2) ^
                                shiftBytes(mobModulo,3) ^
                                shiftBytes(destinationHash,4);

        for(uint i = 0; i < 3; i++){
            uint _tokenId = _getMobTokenId(i);                                       //READ x 3
            emit Transfer(address(0),getMobOwner(i,newMobHash),_tokenId);           //EMIT x 3 max
        }

        mobHash = newMobHash;
    }

    /// Update Mobs Start
    /// @notice Internal - Emits all the events sending mobs to 0. First part of mobs moving
    function updateMobStart() internal{
        if(!mobReleased || mobTokenIds[3] == 0) return;

        //BURN THEM
        bytes32 _mobHash = mobHash;                                         //READ
        for(uint i = 0; i < 3; i++){
            uint _tokenId = _getMobTokenId(i);                                       //READ x 3
            if(_tokenId != MOB_OFFSET){
                emit Transfer(getMobOwner(i,_mobHash),address(0),_tokenId);           //READx3, EMIT x 3 max
            }
        }
    }

    /// Update Mobs Finish
    /// @notice Internal - Calculates mob owners and emits events sending to them. Second part of mobs moving
    function updateMobFinish() internal {
        if(!mobReleased) {
            require(gasleft() > 100000,"gas failsafe");
            return;
        }
        if(mobTokenIds[3] == 0) return;

        require(gasleft() > 64500,"gas failsafe");

        bytes32 _mobHash = mobHash;                                         //READ
        uint eliminationBlock = block.number - (block.number % 245) - 10;    //READ

        bytes32 updateHash  = extractBytes(keccak256(abi.encodePacked(_mobHash)),0);

        bytes32 mobModulo0 = extractBytes(_mobHash,1);
        bytes32 mobModulo1 = extractBytes(_mobHash,2);
        bytes32 mobModulo2 = extractBytes(_mobHash,3);

        bytes32 destinationHash = extractBytes( blockhash(eliminationBlock),4);

        bytes32 newMobHash = shiftBytes(updateHash,0) ^
                                shiftBytes(mobModulo0,1) ^
                                shiftBytes(mobModulo1,2) ^
                                shiftBytes(mobModulo2,3) ^
                                shiftBytes(destinationHash,4);

        mobHash = newMobHash; //WRITE

        for(uint i = 0; i < 3; i++){
            uint _tokenId = _getMobTokenId(i);                                       //READ x 3
            if(_tokenId != MOB_OFFSET){
                emit Transfer(address(0),getMobOwner(i,newMobHash),_tokenId);         //READx3, EMIT x 3 max
            }
        }
    }


    /// Update Catch Mob
    /// @notice Catch a mob that's in your wallet
    /// @param _mobIndex Index of mob to catch
    /// @dev Mints real token and updates mobs
    function catchMob(uint _mobIndex) public {
        IGBATrapsPartial(trapContract).useTrap(msg.sender);

        require(_mobIndex < 3,"mobIndex");
        bytes32 _mobHash = mobHash;
        address mobOwner = getMobOwner(_mobIndex,_mobHash);
        require(msg.sender == mobOwner,"owner");

        updateMobStart();   //Kill all mobs

        bytes32 updateHash  = extractBytes(_mobHash,0);

        bytes32[3] memory mobModulo;

        for(uint i = 0; i < 3; i++){
            mobModulo[i] = extractBytes(_mobHash,i + 1);
        }

        uint mobTokenId = _getMobTokenId(_mobIndex);                //READ

        //Mint real one
        _mint(msg.sender,mobTokenId+MOB_OFFSET);

        bool mintNewMob = true;
        if(mobTokenIds[3] < TOTAL_MOB_COUNT){
            mobTokenIds[_mobIndex] =  ++mobTokenIds[3];
        }else{
            mintNewMob = false;

            //if final 3
            mobTokenIds[3]++;
            mobTokenIds[_mobIndex] = 0;

            if(mobTokenIds[3] == TOTAL_MOB_COUNT + 3){
                //if final mob, clear last slot to identify end condition
                delete mobTokenIds[3];
            }
        }

        mobModulo[_mobIndex] = bytes32(tokens.length);

        uint eliminationBlock = block.number - (block.number % 245) - 10;    //READ
        bytes32 destinationHash = extractBytes( blockhash(eliminationBlock),4);

        mobHash = shiftBytes(updateHash,0) ^                       //WRITE
                    shiftBytes(mobModulo[0],1) ^
                    shiftBytes(mobModulo[1],2) ^
                    shiftBytes(mobModulo[2],3) ^
                    shiftBytes(destinationHash,4);

        updateMobFinish(); //release mobs
    }

    /// Mint (internal)
    /// @notice Mints real tokens as per ERC721
    /// @param _to Address to mint it for
    /// @param _tokenId Token to mint
    function _mint(address _to,uint _tokenId) internal{
        emit Transfer(address(0), _to, _tokenId);

        owners[_tokenId] =_to;
        balances[_to]++;
        tokens.push(_tokenId);
    }

    /// Is Valid Token (internal)
    /// @notice Checks if given tokenId exists (Doesn't apply to mobs)
    /// @param _tokenId TokenId to check
    function isValidToken(uint256 _tokenId) internal view returns(bool){
        return owners[_tokenId] != address(0);
    }

    /// Require Valid (internal)
    /// @notice Reverts if given token doesn't exist
    function requireValid(uint _tokenId) internal view{
        require(isValidToken(_tokenId),"valid");
    }

    /// Balance Of
    /// @notice ERC721 balanceOf func, includes active mobs
    function balanceOf(address _owner) external override view returns (uint256){
        uint _balance = balances[_owner];
        bytes32 _mobHash = mobHash;
        for(uint i = 0; i < 3; i++){
            if(getMobOwner(i, _mobHash) == _owner){
                _balance++;
            }
        }
        return _balance;
    }

    /// Owner Of
    /// @notice ERC721 ownerOf func, includes active mobs
    function ownerOf(uint256 _tokenId) public override view returns(address){
        bytes32 _mobHash = mobHash;
        for(uint i = 0; i < 3; i++){
            if(_getMobTokenId(i) == _tokenId){
                address owner = getMobOwner(i,_mobHash);
                require(owner != address(0),"invalid");
                return owner;
            }
        }
        requireValid(_tokenId);
        return owners[_tokenId];
    }

    /// Approve
    /// @notice ERC721 function
    function approve(address _approved, uint256 _tokenId)  external override{
        address _owner = owners[_tokenId];
        require( _owner == msg.sender                    //Require Sender Owns Token
            || authorised[_owner][msg.sender]                //  or is approved for all.
            ,"permission");
        emit Approval(_owner, _approved, _tokenId);
        allowance[_tokenId] = _approved;
    }

    /// Get Approved
    /// @notice ERC721 function
    function getApproved(uint256 _tokenId) external view override returns (address) {
//        require(isValidToken(_tokenId),"invalid");
        requireValid(_tokenId);
        return allowance[_tokenId];
    }

    /// Is Approved For All
    /// @notice ERC721 function
    function isApprovedForAll(address _owner, address _operator) external view override returns (bool) {
        return authorised[_owner][_operator];
    }

    /// Set Approval For All
    /// @notice ERC721 function
    function setApprovalForAll(address _operator, bool _approved) external override {
        emit ApprovalForAll(msg.sender,_operator, _approved);
        authorised[msg.sender][_operator] = _approved;
    }

    /// Transfer From
    /// @notice ERC721 function
    /// @dev Fails for mobs
    function transferFrom(address _from, address _to, uint256 _tokenId) public override {
        requireValid(_tokenId);

        //Check Transferable
        //There is a token validity check in ownerOf
        address _owner = owners[_tokenId];

        require ( _owner == msg.sender             //Require sender owns token
            //Doing the two below manually instead of referring to the external methods saves gas
            || allowance[_tokenId] == msg.sender      //or is approved for this token
            || authorised[_owner][msg.sender]          //or is approved for all
        ,"permission");
        require(_owner == _from,"owner");
        require(_to != address(0),"zero");

        updateMobStart();

        emit Transfer(_from, _to, _tokenId);

        owners[_tokenId] =_to;

        balances[_from]--;
        balances[_to]++;

        //Reset approved if there is one
        if(allowance[_tokenId] != address(0)){
            delete allowance[_tokenId];
        }

        updateMobFinish();
    }

    /// Safe Transfer From
    /// @notice ERC721 function
    /// @dev Fails for mobs
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) public override {
        transferFrom(_from, _to, _tokenId);

        //Get size of "_to" address, if 0 it's a wallet
        uint32 size;
        assembly {
            size := extcodesize(_to)
        }
        if(size > 0){
            IERC721TokenReceiver receiver = IERC721TokenReceiver(_to);
            require(receiver.onERC721Received(msg.sender,_from,_tokenId,data) == bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")),"receiver");
        }

    }

    /// Safe Transfer From
    /// @notice ERC721 function
    /// @dev Fails for mobs
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external override {
        safeTransferFrom(_from,_to,_tokenId,"");
    }


    /// Name
    /// @notice ERC721 Metadata function
    /// @return _name Name of token
    function name() external pure override returns (string memory _name){
        return "Ghostbusters: Afterlife Collectibles";
    }

    /// Symbol
    /// @notice ERC721 Metadata function
    /// @return _symbol Symbol of token
    function symbol() external pure override returns (string memory _symbol){
        return "GBAC";
    }

    /// Token URI
    /// @notice ERC721 Metadata function (includes active mobs)
    /// @param _tokenId ID of token to check
    /// @return URI (string)
    function tokenURI(uint256 _tokenId) public view  override returns (string memory) {
        ownerOf(_tokenId); //includes validity check

        return string(abi.encodePacked(__uriBase,toString(_tokenId),__uriSuffix));
    }

    /// To String
    /// @notice Converts uint to string
    /// @param value uint to convert
    /// @return String
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }



    // ENUMERABLE FUNCTIONS (not actually needed for compliance but everyone likes totalSupply)
    function totalSupply() public view returns (uint256){
        uint highestMob = mobTokenIds[3];
        if(!mobReleased || highestMob == 0){
            return tokens.length;
        }else if(highestMob < TOTAL_MOB_COUNT){
            return tokens.length + 3;
        }else{
            return tokens.length + 3 - (TOTAL_MOB_COUNT - highestMob);
        }

    }

    function supportsInterface(bytes4 interfaceID) external override view returns (bool){
        return supportedInterfaces[interfaceID];
    }


}

File 2 of 10 : IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface IERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

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

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

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

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

File 3 of 10 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x780e9d63.
interface IERC721Enumerable /* is ERC721 */ {
    /// @notice Count NFTs tracked by this contract
    /// @return A count of valid NFTs tracked by this contract, where each one of
    ///  them has an assigned and queryable owner not equal to the zero address
    function totalSupply() external view returns (uint256);

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

    /// @notice Enumerate NFTs assigned to an owner
    /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
    ///  `_owner` is the zero address, representing invalid NFTs.
    /// @param _owner An address where we are interested in NFTs owned by them
    /// @param _index A counter less than `balanceOf(_owner)`
    /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
    ///   (sort order not specified)
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

File 4 of 10 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface IERC721Metadata /* is ERC721 */ {
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external view returns (string memory _name);

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external view returns (string memory _symbol);

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

File 5 of 10 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface IERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

File 6 of 10 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

File 7 of 10 : IGBATrapsPartial.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @author Andrew Parker
/// @title Ghost Busters: Afterlife Traps NFT contract partial interface
/// @notice For viewer func, and also for MSP because Traps relies on OpenZepp and MSP uses pure 721 implementation.
interface IGBATrapsPartial{
    enum State { Paused, Whitelist, Public, Final}

    function useTrap(address owner) external;

    function tokensClaimed() external view returns(uint);
    function hasMinted(address minter) external view returns(bool);
    function saleStarted() external view returns(bool);
    function whitelistEndTime() external view returns(uint);
    function balanceOf(address _owner) external view returns (uint256);
    function mintState() external view returns(State);
    function countdown() external view returns(uint);
    function totalSupply() external view returns (uint256);
}

File 8 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * OpenZeppelin's Ownable, but without Context, because it saves about 500 bytes
 *   and compiled contract is pushing limits of Spurious Dragon and is unnecessary.

 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(msg.sender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "zero");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 9 of 10 : GBAWhitelist.sol
//SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

/// @author Andrew Parker
/// @title GBA Whitelist NFT Contract
/// @notice Implementation of OpenZeppelin MerkleProof contract for GBA MiniStayPuft and Traps NFTs
contract GBAWhitelist{
    bytes32 merkleRoot;

    /// Constructor
    /// @param _merkleRoot root of merkle tree
    constructor(bytes32 _merkleRoot){
        merkleRoot = _merkleRoot;
    }

    /// Is Whitelisted
    /// @notice Is a given address whitelisted based on proof provided
    /// @param proof Merkle proof
    /// @param claimer address to check
    /// @return Is whitelisted
    function isWhitelisted(bytes32[] memory proof, address claimer) public view returns(bool){
        bytes32 leaf = keccak256(abi.encodePacked(claimer));
        return MerkleProof.verify(proof,merkleRoot,leaf);
    }
}

File 10 of 10 : MerkleProof.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uriBase","type":"string"},{"internalType":"string","name":"_uriSuffix","type":"string"},{"internalType":"address","name":"_trapContract","type":"address"},{"internalType":"address","name":"_whitelist","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reservist","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_pause","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_pauseTime","type":"uint256"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reservist","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Reserve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mobIndex","type":"uint256"}],"name":"catchMob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reservist","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractState","outputs":[{"internalType":"uint256","name":"_tokenCount","type":"uint256"},{"internalType":"enum MiniStayPuft.Phase","name":"_phase","type":"uint8"},{"internalType":"uint256","name":"mobMax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mobIndex","type":"uint256"}],"name":"getMobTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"numTokens","type":"uint16"}],"name":"mintGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOwner","type":"address"}],"name":"mintReserveState","outputs":[{"internalType":"uint8","name":"_whitelistReserveCount","type":"uint8"},{"internalType":"uint24","name":"blockNumber","type":"uint24"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseState","outputs":[{"internalType":"bool","name":"_paused","type":"bool"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_pauseTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"preReserve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"releaseMob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_count","type":"uint16"}],"name":"reserve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriBase","type":"string"},{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600060146101000a81548160ff0219169083151502179055506000600c60006101000a81548160ff0219169083151502179055503480156200004757600080fd5b50604051620068f8380380620068f883398181016040528101906200006d919062000665565b6200007e336200043960201b60201c565b6001601360006380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160136000635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601360006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600060048110620001b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506002600b60016004811062000215577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506003600b60026004811062000278577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506003600b600360048110620002db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600490805190602001906200039a9291906200052c565b508260059080519060200190620003b39291906200052c565b50620003ca6000801b6004620004fd60201b60201c565b620003e1600160001b6003620004fd60201b60201c565b620003f8600160001b6002620004fd60201b60201c565b6200040f600160001b6001620004fd60201b60201c565b620004256000801b6000620004fd60201b60201c565b18181818600d819055505050505062000996565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808260076200050f9190620007c3565b60206200051d919062000762565b90508084901b91505092915050565b8280546200053a9062000872565b90600052602060002090601f0160209004810192826200055e5760008555620005aa565b82601f106200057957805160ff1916838001178555620005aa565b82800160010185558215620005aa579182015b82811115620005a95782518255916020019190600101906200058c565b5b509050620005b99190620005bd565b5090565b5b80821115620005d8576000816000905550600101620005be565b5090565b6000620005f3620005ed846200072c565b62000703565b9050828152602081018484840111156200060c57600080fd5b620006198482856200083c565b509392505050565b60008151905062000632816200097c565b92915050565b600082601f8301126200064a57600080fd5b81516200065c848260208601620005dc565b91505092915050565b600080600080608085870312156200067c57600080fd5b600085015167ffffffffffffffff8111156200069757600080fd5b620006a58782880162000638565b945050602085015167ffffffffffffffff811115620006c357600080fd5b620006d18782880162000638565b9350506040620006e48782880162000621565b9250506060620006f78782880162000621565b91505092959194509250565b60006200070f62000722565b90506200071d8282620008a8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200074a57620007496200093c565b5b62000755826200096b565b9050602081019050919050565b60006200076f8262000832565b91506200077c8362000832565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007b857620007b7620008de565b5b828202905092915050565b6000620007d08262000832565b9150620007dd8362000832565b925082821015620007f357620007f2620008de565b5b828203905092915050565b60006200080b8262000812565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200085c5780820151818401526020810190506200083f565b838111156200086c576000848401525b50505050565b600060028204905060018216806200088b57607f821691505b60208210811415620008a257620008a16200090d565b5b50919050565b620008b3826200096b565b810181811067ffffffffffffffff82111715620008d557620008d46200093c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6200098781620007fe565b81146200099357600080fd5b50565b615f5280620009a66000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063b88d4fde11610095578063d711835111610064578063d711835114610667578063e985e9c514610694578063f2fde38b146106d1578063f67e4a6e146106fa576101e3565b8063b88d4fde146105c1578063c4ae3168146105ea578063c87b56dd14610601578063d00c00ee1461063e576101e3565b806395d89b41116100d157806395d89b4114610528578063a0712d6814610553578063a22cb4651461056f578063aad3ec9614610598576101e3565b8063715018a6146104a257806385209ee0146104b9578063853828b6146104e65780638da5cb5b146104fd576101e3565b80633638a2061161017a5780636352211e116101495780636352211e146103e8578063661df7e91461042557806367cce2b11461043c57806370a0823114610465576101e3565b80633638a2061461034f57806342842e0e1461036b578063584f969a1461039457806361ae5299146103ab576101e3565b80631789e2d8116101b65780631789e2d8146102b657806318160ddd146102df5780631f0808d41461030a57806323b872dd14610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906146a5565b610739565b60405161021c9190614f3a565b60405180910390f35b34801561023157600080fd5b5061023a6107a1565b6040516102479190614f8c565b60405180910390f35b34801561025c57600080fd5b506102776004803603810190610272919061478c565b6107c1565b6040516102849190614ea3565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906145ec565b610807565b005b3480156102c257600080fd5b506102dd60048036038101906102d891906146f7565b6109f0565b005b3480156102eb57600080fd5b506102f4610a97565b604051610301919061530e565b60405180910390f35b610324600480360381019061031f9190614763565b610b81565b005b34801561033257600080fd5b5061034d600480360381019061034891906144e6565b610dae565b005b61036960048036038101906103649190614628565b611240565b005b34801561037757600080fd5b50610392600480360381019061038d91906144e6565b611626565b005b3480156103a057600080fd5b506103a9611646565b005b3480156103b757600080fd5b506103d260048036038101906103cd919061478c565b6116f6565b6040516103df919061530e565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a919061478c565b611753565b60405161041c9190614ea3565b60405180910390f35b34801561043157600080fd5b5061043a61185a565b005b34801561044857600080fd5b50610463600480360381019061045e9190614763565b611ae4565b005b34801561047157600080fd5b5061048c60048036038101906104879190614481565b611ccb565b604051610499919061530e565b60405180910390f35b3480156104ae57600080fd5b506104b7611d8d565b005b3480156104c557600080fd5b506104ce611e0e565b6040516104dd93929190615329565b60405180910390f35b3480156104f257600080fd5b506104fb611e9a565b005b34801561050957600080fd5b50610512611f4f565b60405161051f9190614ea3565b60405180910390f35b34801561053457600080fd5b5061053d611f78565b60405161054a9190614f8c565b60405180910390f35b61056d6004803603810190610568919061478c565b611fb5565b005b34801561057b57600080fd5b50610596600480360381019061059191906145b0565b6121f0565b005b3480156105a457600080fd5b506105bf60048036038101906105ba91906145ec565b6122ed565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190614535565b61269d565b005b3480156105f657600080fd5b506105ff6127fb565b005b34801561060d57600080fd5b506106286004803603810190610623919061478c565b6129ec565b6040516106359190614f8c565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061478c565b612a2d565b005b34801561067357600080fd5b5061067c6130c5565b60405161068b93929190614f55565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b691906144aa565b6130ea565b6040516106c89190614f3a565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614481565b61317e565b005b34801561070657600080fd5b50610721600480360381019061071c9190614481565b61326f565b60405161073093929190615360565b60405180910390f35b600060136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060604051806060016040528060248152602001615ef960249139905090565b60006107cc826133dc565b600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006011600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806108ff5750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61093e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109359061506e565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a482600f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff16610a0f611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c9061528e565b60405180910390fd5b8160049080519060200190610a7b929190614199565b508060059080519060200190610a92929190614199565b505050565b600080600b600360048110610ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff169050600c60009054906101000a900460ff161580610b115750600081145b15610b2457601280549050915050610b7e565b6101f461ffff16811015610b4c576003601280549050610b449190615553565b915050610b7e565b806101f461ffff16610b5e919061566b565b6003601280549050610b709190615553565b610b7a919061566b565b9150505b90565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be69061524e565b60405180910390fd5b600060149054906101000a900460ff1615610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c369061526e565b60405180910390fd5b60026003811115610c79577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b610c81613427565b6003811115610cb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf0906152ce565b60405180910390fd5b600a61ffff168161ffff161115610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c906151ae565b60405180910390fd5b67011c37937e0800008161ffff16610d5d9190615611565b341015610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d969061516e565b60405180910390fd5b610dab813360006134bc565b50565b610db7816133dc565b60006011600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610e8757503373ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610f185750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e9061506e565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc90614fae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c9061502e565b60405180910390fd5b61103d6137d3565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4826011600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061113a906157ae565b9190505550600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061118f90615866565b9190505550600073ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461123257600f600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b61123a6138fa565b50505050565b600060149054906101000a900460ff1615611290576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112879061526e565b60405180910390fd5b600160038111156112ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6112d2613427565b600381111561130a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461134a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611341906152ce565b60405180910390fd5b8060ff1667011c37937e0800006113619190615611565b3410156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a9061508e565b60405180910390fd5b600260ff1681600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661140091906155a9565b60ff161115611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b9061518e565b60405180910390fd5b6107d08160ff166008546114589190615553565b10611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f9061500e565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663debefaa683336040518363ffffffff1660e01b81526004016114f5929190614f0a565b60206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611545919061467c565b611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906150ce565b60405180910390fd5b80600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166115df91906155a9565b92506101000a81548160ff021916908360ff1602179055508060ff166008600082825461160c9190615553565b925050819055506116228160ff163360016134bc565b5050565b6116418383836040518060200160405280600081525061269d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611665611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b29061528e565b60405180910390fd5b600060149054906101000a900460ff16156116d9576116d86127fb565b5b6001600060156101000a81548160ff021916908315150217905550565b60008061170283613b92565b9050620186a081141561174a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117419061512e565b60405180910390fd5b80915050919050565b600080600d54905060005b6003811015611813578361177182613b92565b14156118005760006117838284613c01565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec906152ee565b60405180910390fd5b809350505050611855565b808061180b90615866565b91505061175e565b5061181d836133dc565b6011600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16611879611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c69061528e565b60405180910390fd5b600c60009054906101000a900460ff161561191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906150ae565b60405180910390fd5b600060128054905011611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e9061504e565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506000600d5490506000600a60f54361199a91906158c3565b436119a5919061566b565b6119af919061566b565b905060006119e4836040516020016119c79190614e1a565b604051602081830303815290604052805190602001206000613d1e565b9050600060128054905060001b90506000611a0184406004613d1e565b90506000611a10826004613d61565b611a1b846003613d61565b611a26856002613d61565b611a31866001613d61565b611a3c886000613d61565b18181818905060005b6003811015611ad4576000611a5982613b92565b905080611a668385613c01565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4508080611acc90615866565b915050611a45565b5080600d81905550505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16611b03611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b509061528e565b60405180910390fd5b60c861ffff1681600360029054906101000a900461ffff16611b7b919061551b565b61ffff161115611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb7906152ae565b60405180910390fd5b61271061ffff1681600360009054906101000a900461ffff16611be3919061551b565b61ffff161115611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f906151ee565b60405180910390fd5b60005b8161ffff16811015611cc7576003600281819054906101000a900461ffff1680929190611c579061583b565b91906101000a81548161ffff021916908361ffff16021790555050611cb4336003600081819054906101000a900461ffff16611c929061583b565b91906101000a81548161ffff021916908361ffff160217905561ffff16613d8c565b8080611cbf90615866565b915050611c2b565b5050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600d54905060005b6003811015611d82578473ffffffffffffffffffffffffffffffffffffffff16611d448284613c01565b73ffffffffffffffffffffffffffffffffffffffff161415611d6f578280611d6b90615866565b9350505b8080611d7a90615866565b915050611d1a565b508192505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16611dac611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df99061528e565b60405180910390fd5b611e0c6000613ebc565b565b6000806000600360009054906101000a900461ffff16611e2c613427565b600b600360048110611e67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff168261ffff1692508061ffff169050925092509250909192565b3373ffffffffffffffffffffffffffffffffffffffff16611eb9611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f069061528e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611f4d57600080fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f4742414300000000000000000000000000000000000000000000000000000000815250905090565b600060149054906101000a900460ff1615612005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffc9061526e565b60405180910390fd5b60038081111561203e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b612046613427565b600381111561207e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146120be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b5906152ce565b60405180910390fd5b67011c37937e080000816120d29190615611565b341015612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b906151ce565b60405180910390fd5b61271061ffff1681600360009054906101000a900461ffff16612137919061551b565b61ffff16111561217c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612173906151ee565b60405180910390fd5b60005b818110156121dc576121c9336003600081819054906101000a900461ffff166121a79061583b565b91906101000a81548161ffff021916908361ffff160217905561ffff16613d8c565b80806121d490615866565b91505061217f565b506121e56137d3565b6121ed6138fa565b50565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161224d9190614f3a565b60405180910390a380601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600060149054906101000a900460ff161561233d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123349061526e565b60405180910390fd5b600380811115612376577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b61237e613427565b60038111156123b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906152ce565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050101561247e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612475906150ee565b60405180910390fd5b60005b81811015612688576000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054905061251f919061566b565b81548110612556577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806125f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff021916905590556126308482613d8c565b808473ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d460405160405180910390a350808061268090615866565b915050612481565b506126916137d3565b6126996138fa565b5050565b6126a8848484610dae565b6000833b905060008163ffffffff1611156127f45760008490507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b81526004016127419493929190614ebe565b602060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279391906146ce565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e99061510e565b60405180910390fd5b505b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff1661281a611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128679061528e565b60405180910390fd5b600060015414156128e1574260018190555060008060146101000a81548160ff0219169083151502179055507f8408a369f8baeb88bf8ea365dcc7894594ee453d2e8f058c060538e41580071260006001546002546040516128d493929190614f55565b60405180910390a16129ea565b600060159054906101000a900460ff1615612931576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129289061522e565b60405180910390fd5b60008060149054906101000a900460ff161590508015612957574260028190555061298f565b60006002541461298e576002544261296f919061566b565b600160008282546129809190615553565b925050819055506002600090555b5b80600060146101000a81548160ff0219169083151502179055507f8408a369f8baeb88bf8ea365dcc7894594ee453d2e8f058c060538e415800712816001546002546040516129e093929190614f55565b60405180910390a1505b565b60606129f782611753565b506004612a0383613f80565b6005604051602001612a1793929190614e72565b6040516020818303038152906040529050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355cc5186336040518263ffffffff1660e01b8152600401612a889190614ea3565b600060405180830381600087803b158015612aa257600080fd5b505af1158015612ab6573d6000803e3d6000fd5b5050505060038110612afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af490614fce565b60405180910390fd5b6000600d5490506000612b108383613c01565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7790614fae565b60405180910390fd5b612b886137d3565b6000612b95836000613d1e565b9050612b9f61421f565b60005b6003811015612c1657612bc185600183612bbc9190615553565b613d1e565b828260038110612bfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508080612c0e90615866565b915050612ba2565b506000612c2286613b92565b9050612c3c33620186a083612c379190615553565b613d8c565b6000600190506101f461ffff16600b600360048110612c84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff161015612d8557600b600360048110612ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6010918282040191900660020281819054906101000a900461ffff16612d089061583b565b91906101000a81548161ffff021916908361ffff1602179055600b8860048110612d5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550612f34565b60009050600b600360048110612dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6010918282040191900660020281819054906101000a900461ffff1680929190612ded9061583b565b91906101000a81548161ffff021916908361ffff160217905550506000600b8860048110612e44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060036101f4612e78919061551b565b61ffff16600b600360048110612eb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff161415612f3357600b600360048110612f16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81549061ffff02191690555b5b60128054905060001b838860038110612f76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250506000600a60f543612f9091906158c3565b43612f9b919061566b565b612fa5919061566b565b90506000612fb582406004613d1e565b9050612fc2816004613d61565b61300b86600260038110612fff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516003613d61565b61305487600160038110613048577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516002613d61565b61309d88600060038110613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516001613d61565b6130a88a6000613d61565b18181818600d819055506130ba6138fa565b505050505050505050565b60008060008060149054906101000a900460ff16600154600254925092509250909192565b6000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1661319d611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146131f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ea9061528e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a9061502e565b60405180910390fd5b61326c81613ebc565b50565b6000806060600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff16600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101808054806020026020016040519081016040528092919081815260200182805480156133c857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161338f5790505b505050505090509250925092509193909250565b6133e58161412d565b613424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341b9061520e565b60405180910390fd5b50565b600080600154905060008114156134425760009150506134b9565b611c20816134509190615553565b42116134605760019150506134b9565b62015180611c20826134729190615553565b61347c9190615553565b42111580156134a4575061271061ffff16600360009054906101000a900461ffff1661ffff16105b156134b35760029150506134b9565b60039150505b90565b61271061ffff1683600360009054906101000a900461ffff166134df919061551b565b61ffff161115613524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351b906151ee565b60405180910390fd5b808061358657506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16145b806135f35750600a600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff166135ef9190615553565b4310155b613632576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136299061514e565b60405180910390fd5b60005b8361ffff168161ffff16101561376e57600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016003600081819054906101000a900461ffff166136a39061583b565b91906101000a81548161ffff021916908361ffff160217905590806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff160217905550600360009054906101000a900461ffff1661ffff168373ffffffffffffffffffffffffffffffffffffffff167f61c8427ca14788cf50e420fe4b1e41be1ab20530a3f48bb547315dc91e62b9c160405160405180910390a380806137669061583b565b915050613635565b5043600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548162ffffff021916908362ffffff160217905550505050565b600c60009054906101000a900460ff16158061384757506000600b600360048110613827577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16145b15613851576138f8565b6000600d54905060005b60038110156138f557600061386f82613b92565b9050620186a081146138e15780600073ffffffffffffffffffffffffffffffffffffffff1661389e8486613c01565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5080806138ed90615866565b91505061385b565b50505b565b600c60009054906101000a900460ff1661395857620186a05a11613953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394a90614fee565b60405180910390fd5b613b90565b6000600b600360048110613995577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1614156139be57613b90565b61fbf45a11613a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f990614fee565b60405180910390fd5b6000600d5490506000600a60f543613a1a91906158c3565b43613a25919061566b565b613a2f919061566b565b90506000613a6483604051602001613a479190614e1a565b604051602081830303815290604052805190602001206000613d1e565b90506000613a73846001613d1e565b90506000613a82856002613d1e565b90506000613a91866003613d1e565b90506000613aa186406004613d1e565b90506000613ab0826004613d61565b613abb846003613d61565b613ac6866002613d61565b613ad1886001613d61565b613adc8a6000613d61565b18181818905080600d8190555060005b6003811015613b86576000613b0082613b92565b9050620186a08114613b725780613b178385613c01565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b508080613b7e90615866565b915050613aec565b5050505050505050505b565b6000600b8260048110613bce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16620186a0613bfa9190615553565b9050919050565b600080613c1a83600186613c159190615553565b613d1e565b90506000613c29846004613d1e565b90506000818684604051602001613c4293929190614e35565b6040516020818303038152906040528051906020012060001c905060008360001c82613c6e91906158c3565b905060006011600060128481548110613cb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60009054906101000a900460ff1615613d0e578095505050505050613d18565b6000955050505050505b92915050565b600080826007613d2e919061566b565b6020613d3a9190615611565b90506000836020613d4b9190615611565b905081818287901b901c901c9250505092915050565b600080826007613d71919061566b565b6020613d7d9190615611565b90508084901b91505092915050565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4816011600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190613e8a90615866565b919050555060128190806001815401808255809150506001900390600052602060002001600090919091909150555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415613fc8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614128565b600082905060005b60008214613ffa578080613fe390615866565b915050600a82613ff391906155e0565b9150613fd0565b60008167ffffffffffffffff81111561403c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561406e5781602001600182028036833780820191505090505b5090505b6000851461412157600182614087919061566b565b9150600a8561409691906158c3565b60306140a29190615553565b60f81b8183815181106140de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561411a91906155e0565b9450614072565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166011600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b8280546141a5906157d8565b90600052602060002090601f0160209004810192826141c7576000855561420e565b82601f106141e057805160ff191683800117855561420e565b8280016001018555821561420e579182015b8281111561420d5782518255916020019190600101906141f2565b5b50905061421b9190614241565b5090565b6040518060600160405280600390602082028036833780820191505090505090565b5b8082111561425a576000816000905550600101614242565b5090565b600061427161426c846153c3565b61539e565b9050808382526020820190508285602086028201111561429057600080fd5b60005b858110156142c057816142a688826143af565b845260208401935060208301925050600181019050614293565b5050509392505050565b60006142dd6142d8846153ef565b61539e565b9050828152602081018484840111156142f557600080fd5b61430084828561576c565b509392505050565b600061431b61431684615420565b61539e565b90508281526020810184848401111561433357600080fd5b61433e84828561576c565b509392505050565b60008135905061435581615e57565b92915050565b600082601f83011261436c57600080fd5b813561437c84826020860161425e565b91505092915050565b60008135905061439481615e6e565b92915050565b6000815190506143a981615e6e565b92915050565b6000813590506143be81615e85565b92915050565b6000813590506143d381615e9c565b92915050565b6000815190506143e881615e9c565b92915050565b600082601f8301126143ff57600080fd5b813561440f8482602086016142ca565b91505092915050565b600082601f83011261442957600080fd5b8135614439848260208601614308565b91505092915050565b60008135905061445181615eb3565b92915050565b60008135905061446681615eca565b92915050565b60008135905061447b81615ee1565b92915050565b60006020828403121561449357600080fd5b60006144a184828501614346565b91505092915050565b600080604083850312156144bd57600080fd5b60006144cb85828601614346565b92505060206144dc85828601614346565b9150509250929050565b6000806000606084860312156144fb57600080fd5b600061450986828701614346565b935050602061451a86828701614346565b925050604061452b86828701614457565b9150509250925092565b6000806000806080858703121561454b57600080fd5b600061455987828801614346565b945050602061456a87828801614346565b935050604061457b87828801614457565b925050606085013567ffffffffffffffff81111561459857600080fd5b6145a4878288016143ee565b91505092959194509250565b600080604083850312156145c357600080fd5b60006145d185828601614346565b92505060206145e285828601614385565b9150509250929050565b600080604083850312156145ff57600080fd5b600061460d85828601614346565b925050602061461e85828601614457565b9150509250929050565b6000806040838503121561463b57600080fd5b600083013567ffffffffffffffff81111561465557600080fd5b6146618582860161435b565b92505060206146728582860161446c565b9150509250929050565b60006020828403121561468e57600080fd5b600061469c8482850161439a565b91505092915050565b6000602082840312156146b757600080fd5b60006146c5848285016143c4565b91505092915050565b6000602082840312156146e057600080fd5b60006146ee848285016143d9565b91505092915050565b6000806040838503121561470a57600080fd5b600083013567ffffffffffffffff81111561472457600080fd5b61473085828601614418565b925050602083013567ffffffffffffffff81111561474d57600080fd5b61475985828601614418565b9150509250929050565b60006020828403121561477557600080fd5b600061478384828501614442565b91505092915050565b60006020828403121561479e57600080fd5b60006147ac84828501614457565b91505092915050565b60006147c183836148bf565b60208301905092915050565b60006147d98383614dc7565b60208301905092915050565b6147ee8161569f565b82525050565b60006147ff82615486565b61480981856154cc565b935061481483615451565b8060005b8381101561484557815161482c88826147b5565b9750614837836154b2565b925050600181019050614818565b5085935050505092915050565b600061485d82615491565b61486781856154dd565b935061487283615461565b8060005b838110156148a357815161488a88826147cd565b9750614895836154bf565b925050600181019050614876565b5085935050505092915050565b6148b9816156b1565b82525050565b6148c8816156bd565b82525050565b6148df6148da826156bd565b6158af565b82525050565b60006148f08261549c565b6148fa81856154ee565b935061490a81856020860161577b565b614913816159df565b840191505092915050565b6149278161575a565b82525050565b6000614938826154a7565b61494281856154ff565b935061495281856020860161577b565b61495b816159df565b840191505092915050565b6000614971826154a7565b61497b8185615510565b935061498b81856020860161577b565b80840191505092915050565b600081546149a4816157d8565b6149ae8186615510565b945060018216600081146149c957600181146149da57614a0d565b60ff19831686528186019350614a0d565b6149e385615471565b60005b83811015614a05578154818901526001820191506020810190506149e6565b838801955050505b50505092915050565b6000614a236005836154ff565b9150614a2e826159f0565b602082019050919050565b6000614a466008836154ff565b9150614a5182615a19565b602082019050919050565b6000614a69600c836154ff565b9150614a7482615a42565b602082019050919050565b6000614a8c600d836154ff565b9150614a9782615a6b565b602082019050919050565b6000614aaf6004836154ff565b9150614aba82615a94565b602082019050919050565b6000614ad26007836154ff565b9150614add82615abd565b602082019050919050565b6000614af5600a836154ff565b9150614b0082615ae6565b602082019050919050565b6000614b18600a836154ff565b9150614b2382615b0f565b602082019050919050565b6000614b3b6008836154ff565b9150614b4682615b38565b602082019050919050565b6000614b5e6009836154ff565b9150614b6982615b61565b602082019050919050565b6000614b816006836154ff565b9150614b8c82615b8a565b602082019050919050565b6000614ba46008836154ff565b9150614baf82615bb3565b602082019050919050565b6000614bc76008836154ff565b9150614bd282615bdc565b602082019050919050565b6000614bea6008836154ff565b9150614bf582615c05565b602082019050919050565b6000614c0d600a836154ff565b9150614c1882615c2e565b602082019050919050565b6000614c306015836154ff565b9150614c3b82615c57565b602082019050919050565b6000614c536011836154ff565b9150614c5e82615c80565b602082019050919050565b6000614c766005836154ff565b9150614c8182615ca9565b602082019050919050565b6000614c996008836154ff565b9150614ca482615cd2565b602082019050919050565b6000614cbc6005836154ff565b9150614cc782615cfb565b602082019050919050565b6000614cdf600a836154ff565b9150614cea82615d24565b602082019050919050565b6000614d026006836154ff565b9150614d0d82615d4d565b602082019050919050565b6000614d256006836154ff565b9150614d3082615d76565b602082019050919050565b6000614d486009836154ff565b9150614d5382615d9f565b602082019050919050565b6000614d6b600b836154ff565b9150614d7682615dc8565b602082019050919050565b6000614d8e6005836154ff565b9150614d9982615df1565b602082019050919050565b6000614db16007836154ff565b9150614dbc82615e1a565b602082019050919050565b614dd081615706565b82525050565b614ddf81615734565b82525050565b614dee81615743565b82525050565b614e05614e0082615743565b6158b9565b82525050565b614e148161574d565b82525050565b6000614e2682846148ce565b60208201915081905092915050565b6000614e4182866148ce565b602082019150614e518285614df4565b602082019150614e6182846148ce565b602082019150819050949350505050565b6000614e7e8286614997565b9150614e8a8285614966565b9150614e968284614997565b9150819050949350505050565b6000602082019050614eb860008301846147e5565b92915050565b6000608082019050614ed360008301876147e5565b614ee060208301866147e5565b614eed6040830185614de5565b8181036060830152614eff81846148e5565b905095945050505050565b60006040820190508181036000830152614f2481856147f4565b9050614f3360208301846147e5565b9392505050565b6000602082019050614f4f60008301846148b0565b92915050565b6000606082019050614f6a60008301866148b0565b614f776020830185614de5565b614f846040830184614de5565b949350505050565b60006020820190508181036000830152614fa6818461492d565b905092915050565b60006020820190508181036000830152614fc781614a16565b9050919050565b60006020820190508181036000830152614fe781614a39565b9050919050565b6000602082019050818103600083015261500781614a5c565b9050919050565b6000602082019050818103600083015261502781614a7f565b9050919050565b6000602082019050818103600083015261504781614aa2565b9050919050565b6000602082019050818103600083015261506781614ac5565b9050919050565b6000602082019050818103600083015261508781614ae8565b9050919050565b600060208201905081810360008301526150a781614b0b565b9050919050565b600060208201905081810360008301526150c781614b2e565b9050919050565b600060208201905081810360008301526150e781614b51565b9050919050565b6000602082019050818103600083015261510781614b74565b9050919050565b6000602082019050818103600083015261512781614b97565b9050919050565b6000602082019050818103600083015261514781614bba565b9050919050565b6000602082019050818103600083015261516781614bdd565b9050919050565b6000602082019050818103600083015261518781614c00565b9050919050565b600060208201905081810360008301526151a781614c23565b9050919050565b600060208201905081810360008301526151c781614c46565b9050919050565b600060208201905081810360008301526151e781614c69565b9050919050565b6000602082019050818103600083015261520781614c8c565b9050919050565b6000602082019050818103600083015261522781614caf565b9050919050565b6000602082019050818103600083015261524781614cd2565b9050919050565b6000602082019050818103600083015261526781614cf5565b9050919050565b6000602082019050818103600083015261528781614d18565b9050919050565b600060208201905081810360008301526152a781614d3b565b9050919050565b600060208201905081810360008301526152c781614d5e565b9050919050565b600060208201905081810360008301526152e781614d81565b9050919050565b6000602082019050818103600083015261530781614da4565b9050919050565b60006020820190506153236000830184614de5565b92915050565b600060608201905061533e6000830186614de5565b61534b602083018561491e565b6153586040830184614de5565b949350505050565b60006060820190506153756000830186614e0b565b6153826020830185614dd6565b81810360408301526153948184614852565b9050949350505050565b60006153a86153b9565b90506153b4828261580a565b919050565b6000604051905090565b600067ffffffffffffffff8211156153de576153dd6159b0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561540a576154096159b0565b5b615413826159df565b9050602081019050919050565b600067ffffffffffffffff82111561543b5761543a6159b0565b5b615444826159df565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061552682615706565b915061553183615706565b92508261ffff03821115615548576155476158f4565b5b828201905092915050565b600061555e82615743565b915061556983615743565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561559e5761559d6158f4565b5b828201905092915050565b60006155b48261574d565b91506155bf8361574d565b92508260ff038211156155d5576155d46158f4565b5b828201905092915050565b60006155eb82615743565b91506155f683615743565b92508261560657615605615923565b5b828204905092915050565b600061561c82615743565b915061562783615743565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156605761565f6158f4565b5b828202905092915050565b600061567682615743565b915061568183615743565b925082821015615694576156936158f4565b5b828203905092915050565b60006156aa82615714565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061570182615e43565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615765826156f3565b9050919050565b82818337600083830152505050565b60005b8381101561579957808201518184015260208101905061577e565b838111156157a8576000848401525b50505050565b60006157b982615743565b915060008214156157cd576157cc6158f4565b5b600182039050919050565b600060028204905060018216806157f057607f821691505b6020821081141561580457615803615981565b5b50919050565b615813826159df565b810181811067ffffffffffffffff82111715615832576158316159b0565b5b80604052505050565b600061584682615706565b915061ffff82141561585b5761585a6158f4565b5b600182019050919050565b600061587182615743565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156158a4576158a36158f4565b5b600182019050919050565b6000819050919050565b6000819050919050565b60006158ce82615743565b91506158d983615743565b9250826158e9576158e8615923565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6f776e6572000000000000000000000000000000000000000000000000000000600082015250565b7f6d6f62496e646578000000000000000000000000000000000000000000000000600082015250565b7f676173206661696c736166650000000000000000000000000000000000000000600082015250565b7f50524553414c455f4c494d495400000000000000000000000000000000000000600082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f6e6f206d696e7400000000000000000000000000000000000000000000000000600082015250565b7f7065726d697373696f6e00000000000000000000000000000000000000000000600082015250565b7f50524943455f4d494e5400000000000000000000000000000000000000000000600082015250565b7f72656c6561736564000000000000000000000000000000000000000000000000600082015250565b7f77686974656c6973740000000000000000000000000000000000000000000000600082015250565b7f5f636f756e740000000000000000000000000000000000000000000000000000600082015250565b7f7265636569766572000000000000000000000000000000000000000000000000600082015250565b7f6e6f20746f6b656e000000000000000000000000000000000000000000000000600082015250565b7f434f4f4c444f574e000000000000000000000000000000000000000000000000600082015250565b7f5052494345204d494e5400000000000000000000000000000000000000000000600082015250565b7f77686974656c69737452657365727665436f756e740000000000000000000000600082015250565b7f5452414e53414354494f4e5f4c494d4954000000000000000000000000000000600082015250565b7f5052494345000000000000000000000000000000000000000000000000000000600082015250565b7f53414c455f4d4158000000000000000000000000000000000000000000000000600082015250565b7f76616c6964000000000000000000000000000000000000000000000000000000600082015250565b7f756e7061757361626c6500000000000000000000000000000000000000000000600082015250565b7f6f726967696e0000000000000000000000000000000000000000000000000000600082015250565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b7f6f6e6c794f776e65720000000000000000000000000000000000000000000000600082015250565b7f746f6b656e73476976656e000000000000000000000000000000000000000000600082015250565b7f7068617365000000000000000000000000000000000000000000000000000000600082015250565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60048110615e5457615e53615952565b5b50565b615e608161569f565b8114615e6b57600080fd5b50565b615e77816156b1565b8114615e8257600080fd5b50565b615e8e816156bd565b8114615e9957600080fd5b50565b615ea5816156c7565b8114615eb057600080fd5b50565b615ebc81615706565b8114615ec757600080fd5b50565b615ed381615743565b8114615ede57600080fd5b50565b615eea8161574d565b8114615ef557600080fd5b5056fe47686f7374627573746572733a2041667465726c69666520436f6c6c65637469626c6573a264697066735822122013af6d30c9c26238f72ede5380ce35fc56259be8874c53677dd0eded2eb5d56264736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009540ea4bc7d8df2ef8ed68110cdbf4171d42af5b0000000000000000000000008d01ddca9613fd28cc7d258e3324f12abbcee440000000000000000000000000000000000000000000000000000000000000000c504c414345484f4c4445522f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2f504c414345484f4c4445520000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101e35760003560e01c8063715018a611610102578063b88d4fde11610095578063d711835111610064578063d711835114610667578063e985e9c514610694578063f2fde38b146106d1578063f67e4a6e146106fa576101e3565b8063b88d4fde146105c1578063c4ae3168146105ea578063c87b56dd14610601578063d00c00ee1461063e576101e3565b806395d89b41116100d157806395d89b4114610528578063a0712d6814610553578063a22cb4651461056f578063aad3ec9614610598576101e3565b8063715018a6146104a257806385209ee0146104b9578063853828b6146104e65780638da5cb5b146104fd576101e3565b80633638a2061161017a5780636352211e116101495780636352211e146103e8578063661df7e91461042557806367cce2b11461043c57806370a0823114610465576101e3565b80633638a2061461034f57806342842e0e1461036b578063584f969a1461039457806361ae5299146103ab576101e3565b80631789e2d8116101b65780631789e2d8146102b657806318160ddd146102df5780631f0808d41461030a57806323b872dd14610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906146a5565b610739565b60405161021c9190614f3a565b60405180910390f35b34801561023157600080fd5b5061023a6107a1565b6040516102479190614f8c565b60405180910390f35b34801561025c57600080fd5b506102776004803603810190610272919061478c565b6107c1565b6040516102849190614ea3565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906145ec565b610807565b005b3480156102c257600080fd5b506102dd60048036038101906102d891906146f7565b6109f0565b005b3480156102eb57600080fd5b506102f4610a97565b604051610301919061530e565b60405180910390f35b610324600480360381019061031f9190614763565b610b81565b005b34801561033257600080fd5b5061034d600480360381019061034891906144e6565b610dae565b005b61036960048036038101906103649190614628565b611240565b005b34801561037757600080fd5b50610392600480360381019061038d91906144e6565b611626565b005b3480156103a057600080fd5b506103a9611646565b005b3480156103b757600080fd5b506103d260048036038101906103cd919061478c565b6116f6565b6040516103df919061530e565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a919061478c565b611753565b60405161041c9190614ea3565b60405180910390f35b34801561043157600080fd5b5061043a61185a565b005b34801561044857600080fd5b50610463600480360381019061045e9190614763565b611ae4565b005b34801561047157600080fd5b5061048c60048036038101906104879190614481565b611ccb565b604051610499919061530e565b60405180910390f35b3480156104ae57600080fd5b506104b7611d8d565b005b3480156104c557600080fd5b506104ce611e0e565b6040516104dd93929190615329565b60405180910390f35b3480156104f257600080fd5b506104fb611e9a565b005b34801561050957600080fd5b50610512611f4f565b60405161051f9190614ea3565b60405180910390f35b34801561053457600080fd5b5061053d611f78565b60405161054a9190614f8c565b60405180910390f35b61056d6004803603810190610568919061478c565b611fb5565b005b34801561057b57600080fd5b50610596600480360381019061059191906145b0565b6121f0565b005b3480156105a457600080fd5b506105bf60048036038101906105ba91906145ec565b6122ed565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190614535565b61269d565b005b3480156105f657600080fd5b506105ff6127fb565b005b34801561060d57600080fd5b506106286004803603810190610623919061478c565b6129ec565b6040516106359190614f8c565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061478c565b612a2d565b005b34801561067357600080fd5b5061067c6130c5565b60405161068b93929190614f55565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b691906144aa565b6130ea565b6040516106c89190614f3a565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614481565b61317e565b005b34801561070657600080fd5b50610721600480360381019061071c9190614481565b61326f565b60405161073093929190615360565b60405180910390f35b600060136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060604051806060016040528060248152602001615ef960249139905090565b60006107cc826133dc565b600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006011600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806108ff5750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61093e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109359061506e565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a482600f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff16610a0f611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c9061528e565b60405180910390fd5b8160049080519060200190610a7b929190614199565b508060059080519060200190610a92929190614199565b505050565b600080600b600360048110610ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff169050600c60009054906101000a900460ff161580610b115750600081145b15610b2457601280549050915050610b7e565b6101f461ffff16811015610b4c576003601280549050610b449190615553565b915050610b7e565b806101f461ffff16610b5e919061566b565b6003601280549050610b709190615553565b610b7a919061566b565b9150505b90565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be69061524e565b60405180910390fd5b600060149054906101000a900460ff1615610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c369061526e565b60405180910390fd5b60026003811115610c79577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b610c81613427565b6003811115610cb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf0906152ce565b60405180910390fd5b600a61ffff168161ffff161115610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c906151ae565b60405180910390fd5b67011c37937e0800008161ffff16610d5d9190615611565b341015610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d969061516e565b60405180910390fd5b610dab813360006134bc565b50565b610db7816133dc565b60006011600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610e8757503373ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610f185750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e9061506e565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc90614fae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c9061502e565b60405180910390fd5b61103d6137d3565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4826011600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061113a906157ae565b9190505550600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061118f90615866565b9190505550600073ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461123257600f600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b61123a6138fa565b50505050565b600060149054906101000a900460ff1615611290576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112879061526e565b60405180910390fd5b600160038111156112ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6112d2613427565b600381111561130a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461134a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611341906152ce565b60405180910390fd5b8060ff1667011c37937e0800006113619190615611565b3410156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a9061508e565b60405180910390fd5b600260ff1681600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661140091906155a9565b60ff161115611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b9061518e565b60405180910390fd5b6107d08160ff166008546114589190615553565b10611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f9061500e565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663debefaa683336040518363ffffffff1660e01b81526004016114f5929190614f0a565b60206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611545919061467c565b611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906150ce565b60405180910390fd5b80600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166115df91906155a9565b92506101000a81548160ff021916908360ff1602179055508060ff166008600082825461160c9190615553565b925050819055506116228160ff163360016134bc565b5050565b6116418383836040518060200160405280600081525061269d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611665611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b29061528e565b60405180910390fd5b600060149054906101000a900460ff16156116d9576116d86127fb565b5b6001600060156101000a81548160ff021916908315150217905550565b60008061170283613b92565b9050620186a081141561174a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117419061512e565b60405180910390fd5b80915050919050565b600080600d54905060005b6003811015611813578361177182613b92565b14156118005760006117838284613c01565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec906152ee565b60405180910390fd5b809350505050611855565b808061180b90615866565b91505061175e565b5061181d836133dc565b6011600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16611879611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c69061528e565b60405180910390fd5b600c60009054906101000a900460ff161561191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906150ae565b60405180910390fd5b600060128054905011611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e9061504e565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506000600d5490506000600a60f54361199a91906158c3565b436119a5919061566b565b6119af919061566b565b905060006119e4836040516020016119c79190614e1a565b604051602081830303815290604052805190602001206000613d1e565b9050600060128054905060001b90506000611a0184406004613d1e565b90506000611a10826004613d61565b611a1b846003613d61565b611a26856002613d61565b611a31866001613d61565b611a3c886000613d61565b18181818905060005b6003811015611ad4576000611a5982613b92565b905080611a668385613c01565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4508080611acc90615866565b915050611a45565b5080600d81905550505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16611b03611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b509061528e565b60405180910390fd5b60c861ffff1681600360029054906101000a900461ffff16611b7b919061551b565b61ffff161115611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb7906152ae565b60405180910390fd5b61271061ffff1681600360009054906101000a900461ffff16611be3919061551b565b61ffff161115611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f906151ee565b60405180910390fd5b60005b8161ffff16811015611cc7576003600281819054906101000a900461ffff1680929190611c579061583b565b91906101000a81548161ffff021916908361ffff16021790555050611cb4336003600081819054906101000a900461ffff16611c929061583b565b91906101000a81548161ffff021916908361ffff160217905561ffff16613d8c565b8080611cbf90615866565b915050611c2b565b5050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600d54905060005b6003811015611d82578473ffffffffffffffffffffffffffffffffffffffff16611d448284613c01565b73ffffffffffffffffffffffffffffffffffffffff161415611d6f578280611d6b90615866565b9350505b8080611d7a90615866565b915050611d1a565b508192505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16611dac611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df99061528e565b60405180910390fd5b611e0c6000613ebc565b565b6000806000600360009054906101000a900461ffff16611e2c613427565b600b600360048110611e67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff168261ffff1692508061ffff169050925092509250909192565b3373ffffffffffffffffffffffffffffffffffffffff16611eb9611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f069061528e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611f4d57600080fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f4742414300000000000000000000000000000000000000000000000000000000815250905090565b600060149054906101000a900460ff1615612005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffc9061526e565b60405180910390fd5b60038081111561203e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b612046613427565b600381111561207e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146120be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b5906152ce565b60405180910390fd5b67011c37937e080000816120d29190615611565b341015612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b906151ce565b60405180910390fd5b61271061ffff1681600360009054906101000a900461ffff16612137919061551b565b61ffff16111561217c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612173906151ee565b60405180910390fd5b60005b818110156121dc576121c9336003600081819054906101000a900461ffff166121a79061583b565b91906101000a81548161ffff021916908361ffff160217905561ffff16613d8c565b80806121d490615866565b91505061217f565b506121e56137d3565b6121ed6138fa565b50565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161224d9190614f3a565b60405180910390a380601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600060149054906101000a900460ff161561233d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123349061526e565b60405180910390fd5b600380811115612376577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b61237e613427565b60038111156123b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906152ce565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050101561247e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612475906150ee565b60405180910390fd5b60005b81811015612688576000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054905061251f919061566b565b81548110612556577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806125f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff021916905590556126308482613d8c565b808473ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d460405160405180910390a350808061268090615866565b915050612481565b506126916137d3565b6126996138fa565b5050565b6126a8848484610dae565b6000833b905060008163ffffffff1611156127f45760008490507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b81526004016127419493929190614ebe565b602060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279391906146ce565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e99061510e565b60405180910390fd5b505b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff1661281a611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128679061528e565b60405180910390fd5b600060015414156128e1574260018190555060008060146101000a81548160ff0219169083151502179055507f8408a369f8baeb88bf8ea365dcc7894594ee453d2e8f058c060538e41580071260006001546002546040516128d493929190614f55565b60405180910390a16129ea565b600060159054906101000a900460ff1615612931576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129289061522e565b60405180910390fd5b60008060149054906101000a900460ff161590508015612957574260028190555061298f565b60006002541461298e576002544261296f919061566b565b600160008282546129809190615553565b925050819055506002600090555b5b80600060146101000a81548160ff0219169083151502179055507f8408a369f8baeb88bf8ea365dcc7894594ee453d2e8f058c060538e415800712816001546002546040516129e093929190614f55565b60405180910390a1505b565b60606129f782611753565b506004612a0383613f80565b6005604051602001612a1793929190614e72565b6040516020818303038152906040529050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355cc5186336040518263ffffffff1660e01b8152600401612a889190614ea3565b600060405180830381600087803b158015612aa257600080fd5b505af1158015612ab6573d6000803e3d6000fd5b5050505060038110612afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af490614fce565b60405180910390fd5b6000600d5490506000612b108383613c01565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7790614fae565b60405180910390fd5b612b886137d3565b6000612b95836000613d1e565b9050612b9f61421f565b60005b6003811015612c1657612bc185600183612bbc9190615553565b613d1e565b828260038110612bfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508080612c0e90615866565b915050612ba2565b506000612c2286613b92565b9050612c3c33620186a083612c379190615553565b613d8c565b6000600190506101f461ffff16600b600360048110612c84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff161015612d8557600b600360048110612ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6010918282040191900660020281819054906101000a900461ffff16612d089061583b565b91906101000a81548161ffff021916908361ffff1602179055600b8860048110612d5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550612f34565b60009050600b600360048110612dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6010918282040191900660020281819054906101000a900461ffff1680929190612ded9061583b565b91906101000a81548161ffff021916908361ffff160217905550506000600b8860048110612e44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060036101f4612e78919061551b565b61ffff16600b600360048110612eb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff161415612f3357600b600360048110612f16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81549061ffff02191690555b5b60128054905060001b838860038110612f76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250506000600a60f543612f9091906158c3565b43612f9b919061566b565b612fa5919061566b565b90506000612fb582406004613d1e565b9050612fc2816004613d61565b61300b86600260038110612fff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516003613d61565b61305487600160038110613048577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516002613d61565b61309d88600060038110613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516001613d61565b6130a88a6000613d61565b18181818600d819055506130ba6138fa565b505050505050505050565b60008060008060149054906101000a900460ff16600154600254925092509250909192565b6000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1661319d611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146131f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ea9061528e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a9061502e565b60405180910390fd5b61326c81613ebc565b50565b6000806060600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff16600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101808054806020026020016040519081016040528092919081815260200182805480156133c857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161338f5790505b505050505090509250925092509193909250565b6133e58161412d565b613424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341b9061520e565b60405180910390fd5b50565b600080600154905060008114156134425760009150506134b9565b611c20816134509190615553565b42116134605760019150506134b9565b62015180611c20826134729190615553565b61347c9190615553565b42111580156134a4575061271061ffff16600360009054906101000a900461ffff1661ffff16105b156134b35760029150506134b9565b60039150505b90565b61271061ffff1683600360009054906101000a900461ffff166134df919061551b565b61ffff161115613524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351b906151ee565b60405180910390fd5b808061358657506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16145b806135f35750600a600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff166135ef9190615553565b4310155b613632576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136299061514e565b60405180910390fd5b60005b8361ffff168161ffff16101561376e57600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016003600081819054906101000a900461ffff166136a39061583b565b91906101000a81548161ffff021916908361ffff160217905590806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff160217905550600360009054906101000a900461ffff1661ffff168373ffffffffffffffffffffffffffffffffffffffff167f61c8427ca14788cf50e420fe4b1e41be1ab20530a3f48bb547315dc91e62b9c160405160405180910390a380806137669061583b565b915050613635565b5043600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548162ffffff021916908362ffffff160217905550505050565b600c60009054906101000a900460ff16158061384757506000600b600360048110613827577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16145b15613851576138f8565b6000600d54905060005b60038110156138f557600061386f82613b92565b9050620186a081146138e15780600073ffffffffffffffffffffffffffffffffffffffff1661389e8486613c01565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5080806138ed90615866565b91505061385b565b50505b565b600c60009054906101000a900460ff1661395857620186a05a11613953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394a90614fee565b60405180910390fd5b613b90565b6000600b600360048110613995577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1614156139be57613b90565b61fbf45a11613a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f990614fee565b60405180910390fd5b6000600d5490506000600a60f543613a1a91906158c3565b43613a25919061566b565b613a2f919061566b565b90506000613a6483604051602001613a479190614e1a565b604051602081830303815290604052805190602001206000613d1e565b90506000613a73846001613d1e565b90506000613a82856002613d1e565b90506000613a91866003613d1e565b90506000613aa186406004613d1e565b90506000613ab0826004613d61565b613abb846003613d61565b613ac6866002613d61565b613ad1886001613d61565b613adc8a6000613d61565b18181818905080600d8190555060005b6003811015613b86576000613b0082613b92565b9050620186a08114613b725780613b178385613c01565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b508080613b7e90615866565b915050613aec565b5050505050505050505b565b6000600b8260048110613bce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16620186a0613bfa9190615553565b9050919050565b600080613c1a83600186613c159190615553565b613d1e565b90506000613c29846004613d1e565b90506000818684604051602001613c4293929190614e35565b6040516020818303038152906040528051906020012060001c905060008360001c82613c6e91906158c3565b905060006011600060128481548110613cb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60009054906101000a900460ff1615613d0e578095505050505050613d18565b6000955050505050505b92915050565b600080826007613d2e919061566b565b6020613d3a9190615611565b90506000836020613d4b9190615611565b905081818287901b901c901c9250505092915050565b600080826007613d71919061566b565b6020613d7d9190615611565b90508084901b91505092915050565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4816011600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190613e8a90615866565b919050555060128190806001815401808255809150506001900390600052602060002001600090919091909150555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415613fc8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614128565b600082905060005b60008214613ffa578080613fe390615866565b915050600a82613ff391906155e0565b9150613fd0565b60008167ffffffffffffffff81111561403c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561406e5781602001600182028036833780820191505090505b5090505b6000851461412157600182614087919061566b565b9150600a8561409691906158c3565b60306140a29190615553565b60f81b8183815181106140de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561411a91906155e0565b9450614072565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166011600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b8280546141a5906157d8565b90600052602060002090601f0160209004810192826141c7576000855561420e565b82601f106141e057805160ff191683800117855561420e565b8280016001018555821561420e579182015b8281111561420d5782518255916020019190600101906141f2565b5b50905061421b9190614241565b5090565b6040518060600160405280600390602082028036833780820191505090505090565b5b8082111561425a576000816000905550600101614242565b5090565b600061427161426c846153c3565b61539e565b9050808382526020820190508285602086028201111561429057600080fd5b60005b858110156142c057816142a688826143af565b845260208401935060208301925050600181019050614293565b5050509392505050565b60006142dd6142d8846153ef565b61539e565b9050828152602081018484840111156142f557600080fd5b61430084828561576c565b509392505050565b600061431b61431684615420565b61539e565b90508281526020810184848401111561433357600080fd5b61433e84828561576c565b509392505050565b60008135905061435581615e57565b92915050565b600082601f83011261436c57600080fd5b813561437c84826020860161425e565b91505092915050565b60008135905061439481615e6e565b92915050565b6000815190506143a981615e6e565b92915050565b6000813590506143be81615e85565b92915050565b6000813590506143d381615e9c565b92915050565b6000815190506143e881615e9c565b92915050565b600082601f8301126143ff57600080fd5b813561440f8482602086016142ca565b91505092915050565b600082601f83011261442957600080fd5b8135614439848260208601614308565b91505092915050565b60008135905061445181615eb3565b92915050565b60008135905061446681615eca565b92915050565b60008135905061447b81615ee1565b92915050565b60006020828403121561449357600080fd5b60006144a184828501614346565b91505092915050565b600080604083850312156144bd57600080fd5b60006144cb85828601614346565b92505060206144dc85828601614346565b9150509250929050565b6000806000606084860312156144fb57600080fd5b600061450986828701614346565b935050602061451a86828701614346565b925050604061452b86828701614457565b9150509250925092565b6000806000806080858703121561454b57600080fd5b600061455987828801614346565b945050602061456a87828801614346565b935050604061457b87828801614457565b925050606085013567ffffffffffffffff81111561459857600080fd5b6145a4878288016143ee565b91505092959194509250565b600080604083850312156145c357600080fd5b60006145d185828601614346565b92505060206145e285828601614385565b9150509250929050565b600080604083850312156145ff57600080fd5b600061460d85828601614346565b925050602061461e85828601614457565b9150509250929050565b6000806040838503121561463b57600080fd5b600083013567ffffffffffffffff81111561465557600080fd5b6146618582860161435b565b92505060206146728582860161446c565b9150509250929050565b60006020828403121561468e57600080fd5b600061469c8482850161439a565b91505092915050565b6000602082840312156146b757600080fd5b60006146c5848285016143c4565b91505092915050565b6000602082840312156146e057600080fd5b60006146ee848285016143d9565b91505092915050565b6000806040838503121561470a57600080fd5b600083013567ffffffffffffffff81111561472457600080fd5b61473085828601614418565b925050602083013567ffffffffffffffff81111561474d57600080fd5b61475985828601614418565b9150509250929050565b60006020828403121561477557600080fd5b600061478384828501614442565b91505092915050565b60006020828403121561479e57600080fd5b60006147ac84828501614457565b91505092915050565b60006147c183836148bf565b60208301905092915050565b60006147d98383614dc7565b60208301905092915050565b6147ee8161569f565b82525050565b60006147ff82615486565b61480981856154cc565b935061481483615451565b8060005b8381101561484557815161482c88826147b5565b9750614837836154b2565b925050600181019050614818565b5085935050505092915050565b600061485d82615491565b61486781856154dd565b935061487283615461565b8060005b838110156148a357815161488a88826147cd565b9750614895836154bf565b925050600181019050614876565b5085935050505092915050565b6148b9816156b1565b82525050565b6148c8816156bd565b82525050565b6148df6148da826156bd565b6158af565b82525050565b60006148f08261549c565b6148fa81856154ee565b935061490a81856020860161577b565b614913816159df565b840191505092915050565b6149278161575a565b82525050565b6000614938826154a7565b61494281856154ff565b935061495281856020860161577b565b61495b816159df565b840191505092915050565b6000614971826154a7565b61497b8185615510565b935061498b81856020860161577b565b80840191505092915050565b600081546149a4816157d8565b6149ae8186615510565b945060018216600081146149c957600181146149da57614a0d565b60ff19831686528186019350614a0d565b6149e385615471565b60005b83811015614a05578154818901526001820191506020810190506149e6565b838801955050505b50505092915050565b6000614a236005836154ff565b9150614a2e826159f0565b602082019050919050565b6000614a466008836154ff565b9150614a5182615a19565b602082019050919050565b6000614a69600c836154ff565b9150614a7482615a42565b602082019050919050565b6000614a8c600d836154ff565b9150614a9782615a6b565b602082019050919050565b6000614aaf6004836154ff565b9150614aba82615a94565b602082019050919050565b6000614ad26007836154ff565b9150614add82615abd565b602082019050919050565b6000614af5600a836154ff565b9150614b0082615ae6565b602082019050919050565b6000614b18600a836154ff565b9150614b2382615b0f565b602082019050919050565b6000614b3b6008836154ff565b9150614b4682615b38565b602082019050919050565b6000614b5e6009836154ff565b9150614b6982615b61565b602082019050919050565b6000614b816006836154ff565b9150614b8c82615b8a565b602082019050919050565b6000614ba46008836154ff565b9150614baf82615bb3565b602082019050919050565b6000614bc76008836154ff565b9150614bd282615bdc565b602082019050919050565b6000614bea6008836154ff565b9150614bf582615c05565b602082019050919050565b6000614c0d600a836154ff565b9150614c1882615c2e565b602082019050919050565b6000614c306015836154ff565b9150614c3b82615c57565b602082019050919050565b6000614c536011836154ff565b9150614c5e82615c80565b602082019050919050565b6000614c766005836154ff565b9150614c8182615ca9565b602082019050919050565b6000614c996008836154ff565b9150614ca482615cd2565b602082019050919050565b6000614cbc6005836154ff565b9150614cc782615cfb565b602082019050919050565b6000614cdf600a836154ff565b9150614cea82615d24565b602082019050919050565b6000614d026006836154ff565b9150614d0d82615d4d565b602082019050919050565b6000614d256006836154ff565b9150614d3082615d76565b602082019050919050565b6000614d486009836154ff565b9150614d5382615d9f565b602082019050919050565b6000614d6b600b836154ff565b9150614d7682615dc8565b602082019050919050565b6000614d8e6005836154ff565b9150614d9982615df1565b602082019050919050565b6000614db16007836154ff565b9150614dbc82615e1a565b602082019050919050565b614dd081615706565b82525050565b614ddf81615734565b82525050565b614dee81615743565b82525050565b614e05614e0082615743565b6158b9565b82525050565b614e148161574d565b82525050565b6000614e2682846148ce565b60208201915081905092915050565b6000614e4182866148ce565b602082019150614e518285614df4565b602082019150614e6182846148ce565b602082019150819050949350505050565b6000614e7e8286614997565b9150614e8a8285614966565b9150614e968284614997565b9150819050949350505050565b6000602082019050614eb860008301846147e5565b92915050565b6000608082019050614ed360008301876147e5565b614ee060208301866147e5565b614eed6040830185614de5565b8181036060830152614eff81846148e5565b905095945050505050565b60006040820190508181036000830152614f2481856147f4565b9050614f3360208301846147e5565b9392505050565b6000602082019050614f4f60008301846148b0565b92915050565b6000606082019050614f6a60008301866148b0565b614f776020830185614de5565b614f846040830184614de5565b949350505050565b60006020820190508181036000830152614fa6818461492d565b905092915050565b60006020820190508181036000830152614fc781614a16565b9050919050565b60006020820190508181036000830152614fe781614a39565b9050919050565b6000602082019050818103600083015261500781614a5c565b9050919050565b6000602082019050818103600083015261502781614a7f565b9050919050565b6000602082019050818103600083015261504781614aa2565b9050919050565b6000602082019050818103600083015261506781614ac5565b9050919050565b6000602082019050818103600083015261508781614ae8565b9050919050565b600060208201905081810360008301526150a781614b0b565b9050919050565b600060208201905081810360008301526150c781614b2e565b9050919050565b600060208201905081810360008301526150e781614b51565b9050919050565b6000602082019050818103600083015261510781614b74565b9050919050565b6000602082019050818103600083015261512781614b97565b9050919050565b6000602082019050818103600083015261514781614bba565b9050919050565b6000602082019050818103600083015261516781614bdd565b9050919050565b6000602082019050818103600083015261518781614c00565b9050919050565b600060208201905081810360008301526151a781614c23565b9050919050565b600060208201905081810360008301526151c781614c46565b9050919050565b600060208201905081810360008301526151e781614c69565b9050919050565b6000602082019050818103600083015261520781614c8c565b9050919050565b6000602082019050818103600083015261522781614caf565b9050919050565b6000602082019050818103600083015261524781614cd2565b9050919050565b6000602082019050818103600083015261526781614cf5565b9050919050565b6000602082019050818103600083015261528781614d18565b9050919050565b600060208201905081810360008301526152a781614d3b565b9050919050565b600060208201905081810360008301526152c781614d5e565b9050919050565b600060208201905081810360008301526152e781614d81565b9050919050565b6000602082019050818103600083015261530781614da4565b9050919050565b60006020820190506153236000830184614de5565b92915050565b600060608201905061533e6000830186614de5565b61534b602083018561491e565b6153586040830184614de5565b949350505050565b60006060820190506153756000830186614e0b565b6153826020830185614dd6565b81810360408301526153948184614852565b9050949350505050565b60006153a86153b9565b90506153b4828261580a565b919050565b6000604051905090565b600067ffffffffffffffff8211156153de576153dd6159b0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561540a576154096159b0565b5b615413826159df565b9050602081019050919050565b600067ffffffffffffffff82111561543b5761543a6159b0565b5b615444826159df565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061552682615706565b915061553183615706565b92508261ffff03821115615548576155476158f4565b5b828201905092915050565b600061555e82615743565b915061556983615743565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561559e5761559d6158f4565b5b828201905092915050565b60006155b48261574d565b91506155bf8361574d565b92508260ff038211156155d5576155d46158f4565b5b828201905092915050565b60006155eb82615743565b91506155f683615743565b92508261560657615605615923565b5b828204905092915050565b600061561c82615743565b915061562783615743565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156605761565f6158f4565b5b828202905092915050565b600061567682615743565b915061568183615743565b925082821015615694576156936158f4565b5b828203905092915050565b60006156aa82615714565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061570182615e43565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615765826156f3565b9050919050565b82818337600083830152505050565b60005b8381101561579957808201518184015260208101905061577e565b838111156157a8576000848401525b50505050565b60006157b982615743565b915060008214156157cd576157cc6158f4565b5b600182039050919050565b600060028204905060018216806157f057607f821691505b6020821081141561580457615803615981565b5b50919050565b615813826159df565b810181811067ffffffffffffffff82111715615832576158316159b0565b5b80604052505050565b600061584682615706565b915061ffff82141561585b5761585a6158f4565b5b600182019050919050565b600061587182615743565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156158a4576158a36158f4565b5b600182019050919050565b6000819050919050565b6000819050919050565b60006158ce82615743565b91506158d983615743565b9250826158e9576158e8615923565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6f776e6572000000000000000000000000000000000000000000000000000000600082015250565b7f6d6f62496e646578000000000000000000000000000000000000000000000000600082015250565b7f676173206661696c736166650000000000000000000000000000000000000000600082015250565b7f50524553414c455f4c494d495400000000000000000000000000000000000000600082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f6e6f206d696e7400000000000000000000000000000000000000000000000000600082015250565b7f7065726d697373696f6e00000000000000000000000000000000000000000000600082015250565b7f50524943455f4d494e5400000000000000000000000000000000000000000000600082015250565b7f72656c6561736564000000000000000000000000000000000000000000000000600082015250565b7f77686974656c6973740000000000000000000000000000000000000000000000600082015250565b7f5f636f756e740000000000000000000000000000000000000000000000000000600082015250565b7f7265636569766572000000000000000000000000000000000000000000000000600082015250565b7f6e6f20746f6b656e000000000000000000000000000000000000000000000000600082015250565b7f434f4f4c444f574e000000000000000000000000000000000000000000000000600082015250565b7f5052494345204d494e5400000000000000000000000000000000000000000000600082015250565b7f77686974656c69737452657365727665436f756e740000000000000000000000600082015250565b7f5452414e53414354494f4e5f4c494d4954000000000000000000000000000000600082015250565b7f5052494345000000000000000000000000000000000000000000000000000000600082015250565b7f53414c455f4d4158000000000000000000000000000000000000000000000000600082015250565b7f76616c6964000000000000000000000000000000000000000000000000000000600082015250565b7f756e7061757361626c6500000000000000000000000000000000000000000000600082015250565b7f6f726967696e0000000000000000000000000000000000000000000000000000600082015250565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b7f6f6e6c794f776e65720000000000000000000000000000000000000000000000600082015250565b7f746f6b656e73476976656e000000000000000000000000000000000000000000600082015250565b7f7068617365000000000000000000000000000000000000000000000000000000600082015250565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60048110615e5457615e53615952565b5b50565b615e608161569f565b8114615e6b57600080fd5b50565b615e77816156b1565b8114615e8257600080fd5b50565b615e8e816156bd565b8114615e9957600080fd5b50565b615ea5816156c7565b8114615eb057600080fd5b50565b615ebc81615706565b8114615ec757600080fd5b50565b615ed381615743565b8114615ede57600080fd5b50565b615eea8161574d565b8114615ef557600080fd5b5056fe47686f7374627573746572733a2041667465726c69666520436f6c6c65637469626c6573a264697066735822122013af6d30c9c26238f72ede5380ce35fc56259be8874c53677dd0eded2eb5d56264736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009540ea4bc7d8df2ef8ed68110cdbf4171d42af5b0000000000000000000000008d01ddca9613fd28cc7d258e3324f12abbcee440000000000000000000000000000000000000000000000000000000000000000c504c414345484f4c4445522f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2f504c414345484f4c4445520000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uriBase (string): PLACEHOLDER/
Arg [1] : _uriSuffix (string): /PLACEHOLDER
Arg [2] : _trapContract (address): 0x9540eA4bC7d8DF2Ef8ED68110CDBf4171D42aF5B
Arg [3] : _whitelist (address): 0x8D01ddCA9613FD28Cc7D258E3324F12aBbCeE440

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000009540ea4bc7d8df2ef8ed68110cdbf4171d42af5b
Arg [3] : 0000000000000000000000008d01ddca9613fd28cc7d258e3324f12abbcee440
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 504c414345484f4c4445522f0000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 2f504c414345484f4c4445520000000000000000000000000000000000000000


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

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