Contract 0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xb0d405bb43f927784c5de15e1e6d0e2737975650c102d9205b3f34747440bdc7Safe Transfer Fr...94750582021-10-27 7:19:028 secs ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0xe25f8687135d563bdcc83c51d7dc7e5650341bee485b63384e9237bc71eaaea2Safe Transfer Fr...94750522021-10-27 7:18:4426 secs ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0x635a4730e48c282fea366c414c60cf0a543775e44d7ca78ea3c2c2f079b75407Safe Transfer Fr...94750512021-10-27 7:18:4129 secs ago0x3eb5caef584e4cfd3358275c06422e2fae3d1228 IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216614252.25
0x796485586461c786ae9ddc5eb5fe2d356a53841756b085cda3a33a43fe6d8fe7Safe Transfer Fr...94750472021-10-27 7:18:2941 secs ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0xd041b54d7e1830f329a100659c391c06a913f9a61050970ba7f76251e2cd680eSafe Transfer Fr...94750422021-10-27 7:18:1456 secs ago0x3eb5caef584e4cfd3358275c06422e2fae3d1228 IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216614252.25
0x59713118319e2f6e26b6c319e63f87e7b42596986762be32d7db37137533286dSafe Transfer Fr...94750402021-10-27 7:18:081 min ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0x1a604a073f9b5c071b13209b2f8ca5deacd050e83c7c8c76a7e1f8c504a830e4Safe Transfer Fr...94750342021-10-27 7:17:501 min ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000188912252.25
0xca637f0403e9a71771bfae8a6f43c613b806bc47d76eee21c69cea206dad1cebSafe Transfer Fr...94750322021-10-27 7:17:441 min ago0x3eb5caef584e4cfd3358275c06422e2fae3d1228 IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216614252.25
0xd4ff62eab6530035f4f84dbaee9610038adfdfb07564767dc0317241c543b017Safe Transfer Fr...94750282021-10-27 7:17:321 min ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0xae410e4ee447d4366add0c0a8df783bd6adff3e154616550c91e07e9d482aabdSafe Transfer Fr...94750232021-10-27 7:17:171 min ago0x3eb5caef584e4cfd3358275c06422e2fae3d1228 IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216614252.25
0x684a04df3bf229009f3642f1139057214383539320ade6dd5de7e351de775b60Safe Transfer Fr...94750232021-10-27 7:17:171 min ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0x2dbdb1fd9f11737ff5e47d4a674c91ce53b6e8a6311e5c72d5cca91d8cc4ee37Safe Transfer Fr...94750172021-10-27 7:16:592 mins ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0xfb4e6e7a9fc31707db47c346110dbfa3be48c1ffd540009b9d8af872938b694cSafe Transfer Fr...94750152021-10-27 7:16:532 mins ago0x3eb5caef584e4cfd3358275c06422e2fae3d1228 IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216614252.25
0xadf706473315baa43648bbd57eedd663ef55ed4ad8d8f8edfe4092322558be6cSafe Transfer Fr...94750112021-10-27 7:16:412 mins ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0x89ebf5d0856b59f05b70dde950705923bbb383a3b8b495859fa7481c2758d893Safe Transfer Fr...94750062021-10-27 7:16:262 mins ago0x3eb5caef584e4cfd3358275c06422e2fae3d1228 IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216614252.25
0x6af6447f62e2071ae79a2d4c4f1ff0430d60f9a739ec8e92d66f8f9b48d9e095Safe Transfer Fr...94750052021-10-27 7:16:232 mins ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0x15b7e772b5058ab5a9e8f92c5c6b863798850d4b8d80ad3ed0d0730a2aa7e73dSafe Transfer Fr...94749992021-10-27 7:16:053 mins ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0x6ec57e1c6a7fc9beaf8678539c19025ba7f820c76ff0ad659ee995c12b14f9a0Safe Transfer Fr...94749942021-10-27 7:15:503 mins ago0x3eb5caef584e4cfd3358275c06422e2fae3d1228 IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216614252.25
0x6da8cef8c40ffced3f36b56e1dab35b2ff6e2312a3067eede1998ffe849137ecSafe Transfer Fr...94749932021-10-27 7:15:473 mins ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0xc1273a2970c1cb2542b6ef9c83392ce5cee474086e847054a9337815669bf708Safe Transfer Fr...94749872021-10-27 7:15:293 mins ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000188912252.25
0x9e5d4f99919c530957fcd67bda64201f5ceb538ab6eb94685b874cbf3b422f68Safe Transfer Fr...94749842021-10-27 7:15:203 mins ago0x3eb5caef584e4cfd3358275c06422e2fae3d1228 IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216614252.25
0x78f969ea0f2e2c60bbe34a0d1c871e09f1bcab795caaf60132cf0343d135d58cSafe Transfer Fr...94749812021-10-27 7:15:113 mins ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000188912252.25
0x39249327bc87b9a926af4e5792224f3d6ffd223f1014609c4b7baeef06e95f78Safe Transfer Fr...94749752021-10-27 7:14:534 mins ago0x3eb5caef584e4cfd3358275c06422e2fae3d1228 IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216614252.25
0xd419b44d13561de63925d3c349a01b25e919798ae8e900d7f499ed2aef14a1ddSafe Transfer Fr...94749752021-10-27 7:14:534 mins ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
0x20ec4168b0eda205d1a5a9f9aeef5e53e15bd045f29ca774bb1e19f0494e8d90Safe Transfer Fr...94749692021-10-27 7:14:354 mins ago0xb6a100143a8d4052ef8a0b1cd7eb1d2e94ef236c IN  0x2db741cb625fb388c27050e6a5eb2dd9bcd9b6a20 HT0.000216587252.25
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VerifyPackage

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, BSD-2-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-07-21
*/

pragma solidity ^0.7.0;
// pragma abicoder v2;

// SPDX-License-Identifier: SimPL-2.0



interface Card {
   
   
    function setBenifitAddress(address payable newBenifitAddress)
        external;
    
    function setBenifitFee(uint256 newBenifitFee)
        external;
    
   
    function setBurnLockDuration(uint256 duration)
        external;
    
    function setPackage(address package, bool enable)
        external;
    
    function mint(address to, uint256 cardIdPre) external;
    
    function batchMint(address to, uint256[] memory cardIdPres) external;
    
    function burn(uint256 cardId) external;
    
    function burnForSlot(uint256[] memory cardIds) external;
    
    function withdraw() external;
    
    function tokenURI(uint256 cardId)
        external view returns(string memory);
}

interface Shop {
  
    function setQuantityMax(uint256 max) external ;

    function calcCardType(bytes memory seed)
    external view ;

    function addCardType(uint16 cardType) external;

    function addCardTypes(uint16[] memory cts) external;

    function setCardTypes(uint16[] memory cts) external;

    function removeCardType(uint256 index) external;

    // must be high -> low
    function removeCardTypes(uint256[] memory indexs)
    external;

    function removeAllCardTypes()
    external;

  

    function stopShop() external;

    function onOpenPackage(address to, uint256 packageId, bytes32 bh)
    external returns(uint256[] memory);

    function getRarityWeights(uint256 packageId)
    external view  returns(uint256[] memory);
}

interface IBlockhashMgr {
    function request(uint256 blockNumber) external;
    function request(uint256[] memory blockNumbers) external;
    
    function getBlockhash(uint256 blockNumber) external returns(bytes32);
}


library Util {
    bytes4 internal constant ERC721_RECEIVER_RETURN = 0x150b7a02;
    bytes4 internal constant ERC721_RECEIVER_EX_RETURN = 0x0f7b88e3;
    
    uint256 public constant UDENO = 10 ** 10;
    int256 public constant SDENO = 10 ** 10;
    
    uint256 public constant COMMON_LV1 = 0;//非比寻常
    uint256 public constant COMMON_LV2 = 1;//炉火纯青
    uint256 public constant COMMON_LV3 = 2;//惊世骇俗
    uint256 public constant COMMON_LV4 = 3;//登峰造极
    uint256 public constant COMMON_LV5 = 4;//出神入化
    
    bytes public constant BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
    
    function randomUint(bytes memory seed, uint256 min, uint256 max)
        internal pure returns(uint256) {
        
        if (min >= max) {
            return min;
        }
        
        uint256 number = uint256(keccak256(seed));
        return number % (max - min + 1) + min;
    }
    
    function randomInt(bytes memory seed, int256 min, int256 max)
        internal pure returns(int256) {
        
        if (min >= max) {
            return min;
        }
        
        int256 number = int256(keccak256(seed));
        return number % (max - min + 1) + min;
    }
    
    function randomWeight(bytes memory seed, uint256[] memory weights,
        uint256 totalWeight) internal pure returns(uint256) {
        
        uint256 number = Util.randomUint(seed, 1, totalWeight);
        
        for (uint256 i = weights.length - 1; i != 0; --i) {
            if (number <= weights[i]) {
                return i;
            }
            
            number -= weights[i];
        }
        
        return 0;
    }
    
    function randomProb(bytes memory seed, uint256 nume, uint256 deno)
        internal pure returns(bool) {
        
        uint256 rand = Util.randomUint(seed, 1, deno);
        return rand <= nume;
    }
    
    function base64Encode(bytes memory bs) internal pure returns(string memory) {
        uint256 remain = bs.length % 3;
        uint256 length = bs.length / 3 * 4;
        bytes memory result = new bytes(length + (remain != 0 ? 4 : 0) + (3 - remain) % 3);
        
        uint256 i = 0;
        uint256 j = 0;
        while (i != length) {
            result[i++] = Util.BASE64_CHARS[uint8(bs[j] >> 2)];
            result[i++] = Util.BASE64_CHARS[uint8((bs[j] & 0x03) << 4 | bs[j + 1] >> 4)];
            result[i++] = Util.BASE64_CHARS[uint8((bs[j + 1] & 0x0f) << 2 | bs[j + 2] >> 6)];
            result[i++] = Util.BASE64_CHARS[uint8(bs[j + 2] & 0x3f)];
            
            j += 3;
        }
        
        if (remain != 0) {
            result[i++] = Util.BASE64_CHARS[uint8(bs[j] >> 2)];
            
            if (remain == 2) {
                result[i++] = Util.BASE64_CHARS[uint8((bs[j] & 0x03) << 4 | bs[j + 1] >> 4)];
                result[i++] = Util.BASE64_CHARS[uint8((bs[j + 1] & 0x0f) << 2)];
                result[i++] = Util.BASE64_CHARS[0];
                result[i++] = 0x3d;
            } else {
                result[i++] = Util.BASE64_CHARS[uint8((bs[j] & 0x03) << 4)];
                result[i++] = Util.BASE64_CHARS[0];
                result[i++] = Util.BASE64_CHARS[0];
                result[i++] = 0x3d;
                result[i++] = 0x3d;
            }
        }
        
        return string(result);
    }
}

library Address {

    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns(bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solium-disable-next-line security/no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}
library String {
    function equals(string memory a, string memory b)
        internal pure returns(bool) {
        
        bytes memory ba = bytes(a);
        bytes memory bb = bytes(b);
        
        uint256 la = ba.length;
        uint256 lb = bb.length;
        
        for (uint256 i = 0; i != la && i != lb; ++i) {
            if (ba[i] != bb[i]) {
                return false;
            }
        }
        
        return la == lb;
    }
    
    function concat(string memory a, string memory b)
        internal pure returns(string memory) {
            
        bytes memory ba = bytes(a);
        bytes memory bb = bytes(b);
        bytes memory bc = new bytes(ba.length + bb.length);
        
        uint256 bal = ba.length;
        uint256 bbl = bb.length;
        uint256 k = 0;
        
        for (uint256 i = 0; i != bal; ++i) {
            bc[k++] = ba[i];
        }
        for (uint256 i = 0; i != bbl; ++i) {
            bc[k++] = bb[i];
        }
        
        return string(bc);
    }
}

abstract contract ContractOwner {
    address public contractOwner = msg.sender;
    
    modifier ContractOwnerOnly {
        require(msg.sender == contractOwner, "contract owner only");
        _;
    }
}

contract Manager is ContractOwner {
    mapping(string => address) public members;
    
    mapping(address => mapping(string => bool)) public userPermits;//地址是否有某个权限

    
    function setMember(string memory name, address member)
        external ContractOwnerOnly {
        
        members[name] = member;
    }
    
    function setUserPermit(address user, string memory permit,
        bool enable) external ContractOwnerOnly {
        
        userPermits[user][permit] = enable;
    }
    
    function getTimestamp() external view returns(uint256) {
        return block.timestamp;
    }
}


abstract contract Member is ContractOwner {
    //检查权限
    modifier CheckPermit(string memory permit) {
        require(manager.userPermits(msg.sender, permit),
            "no permit");
        _;
    }
    
    Manager public manager;
    
    function setManager(address addr) external ContractOwnerOnly {
        manager = Manager(addr);
    }
}

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);
}

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 memory data) external payable;

    /// @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 payable;

    /// @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 payable;

    /// @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 payable;

    /// @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);
    
}

interface IERC721Metadata /* is ERC721 */ {
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external view returns (string memory);
    
    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external view returns (string memory);
    
    /// @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".
    /// {"name":"","description":"","image":""}
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

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 memory _data) external returns(bytes4);
}

interface IERC721TokenReceiverEx is IERC721TokenReceiver {
    // bytes4(keccak256("onERC721ExReceived(address,address,uint256[],bytes)")) = 0x0f7b88e3
    function onERC721ExReceived(address operator, address from,
        uint256[] memory tokenIds, bytes memory data)
        external returns(bytes4);
}

abstract contract ERC721 is IERC165, IERC721, IERC721Metadata {
    using Address for address;
    
    /*
     * bytes4(keccak256("supportsInterface(bytes4)")) == 0x01ffc9a7
     */
    bytes4 private constant INTERFACE_ID_ERC165 = 0x01ffc9a7;
    
    /*
     *     bytes4(keccak256("balanceOf(address)")) == 0x70a08231
     *     bytes4(keccak256("ownerOf(uint256)")) == 0x6352211e
     *     bytes4(keccak256("approve(address,uint256)")) == 0x095ea7b3
     *     bytes4(keccak256("getApproved(uint256)")) == 0x081812fc
     *     bytes4(keccak256("setApprovalForAll(address,bool)")) == 0xa22cb465
     *     bytes4(keccak256("isApprovedForAll(address,address)")) == 0xe985e9c5
     *     bytes4(keccak256("transferFrom(address,address,uint256)")) == 0x23b872dd
     *     bytes4(keccak256("safeTransferFrom(address,address,uint256)")) == 0x42842e0e
     *     bytes4(keccak256("safeTransferFrom(address,address,uint256,bytes)")) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant INTERFACE_ID_ERC721 = 0x80ac58cd;
    
    bytes4 private constant INTERFACE_ID_ERC721Metadata = 0x5b5e139f;
    
    string public override name;
    string public override symbol;
    
    mapping(address => uint256[]) internal ownerTokens;
    mapping(uint256 => uint256) internal tokenIndexs;
    mapping(uint256 => address) internal tokenOwners;
    
    mapping(uint256 => address) internal tokenApprovals;
    mapping(address => mapping(address => bool)) internal approvalForAlls;
    
    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }
    
    function balanceOf(address owner) external view override returns(uint256) {
        require(owner != address(0), "owner is zero address");
        return ownerTokens[owner].length;
    }
    
    // [startIndex, endIndex)
    function tokensOf(address owner, uint256 startIndex, uint256 endIndex)
        external view returns(uint256[] memory) {
        
        require(owner != address(0), "owner is zero address");
        
        uint256[] storage tokens = ownerTokens[owner];
        if (endIndex == 0) {
            return tokens;
        }
        
        require(startIndex < endIndex, "invalid index");
        
        uint256[] memory result = new uint256[](endIndex - startIndex);
        for (uint256 i = startIndex; i != endIndex; ++i) {
            result[i] = tokens[i];
        }
        
        return result;
    }
    
    function ownerOf(uint256 tokenId)
        external view override returns(address) {
        
        address owner = tokenOwners[tokenId];
        require(owner != address(0), "nobody own the token");
        return owner;
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId)
            external payable override {
        
        safeTransferFrom(from, to, tokenId, "");
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId,
        bytes memory data) public payable override {
        
        _transferFrom(from, to, tokenId);
        
        if (to.isContract()) {
            require(IERC721TokenReceiver(to)
                .onERC721Received(msg.sender, from, tokenId, data)
                == Util.ERC721_RECEIVER_RETURN,
                "onERC721Received() return invalid");
        }
    }
    
    function transferFrom(address from, address to, uint256 tokenId)
        external payable override {
        
        _transferFrom(from, to, tokenId);
    }
    
    function _transferFrom(address from, address to, uint256 tokenId)
        internal {
        
        require(from != address(0), "from is zero address");
        require(to != address(0), "to is zero address");
        
        require(from == tokenOwners[tokenId], "from must be owner");
        
        require(msg.sender == from
            || msg.sender == tokenApprovals[tokenId]
            || approvalForAlls[from][msg.sender],
            "sender must be owner or approvaled");
        
        if (tokenApprovals[tokenId] != address(0)) {
            delete tokenApprovals[tokenId];
        }
        
        _removeTokenFrom(from, tokenId);
        _addTokenTo(to, tokenId);
        
        emit Transfer(from, to, tokenId);
    }
    
    // ensure everything is ok before call it
    function _removeTokenFrom(address from, uint256 tokenId) internal {
        uint256 index = tokenIndexs[tokenId];
        
        uint256[] storage tokens = ownerTokens[from];
        uint256 indexLast = tokens.length - 1;
        
        // save gas
        // if (index != indexLast) {
            uint256 tokenIdLast = tokens[indexLast];
            tokens[index] = tokenIdLast;
            tokenIndexs[tokenIdLast] = index;
        // }
        
        tokens.pop();
        
        // delete tokenIndexs[tokenId]; // save gas
        delete tokenOwners[tokenId];
    }
    
    // ensure everything is ok before call it
    function _addTokenTo(address to, uint256 tokenId) internal {
        uint256[] storage tokens = ownerTokens[to];
        tokenIndexs[tokenId] = tokens.length;
        tokens.push(tokenId);
        
        tokenOwners[tokenId] = to;
    }
    
    function approve(address to, uint256 tokenId)
        external payable override {
        
        address owner = tokenOwners[tokenId];
        
        require(msg.sender == owner
            || approvalForAlls[owner][msg.sender],
            "sender must be owner or approved for all"
        );
        
        tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }
    
    function setApprovalForAll(address to, bool approved) external override {
        approvalForAlls[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }
    
    function getApproved(uint256 tokenId)
        external view override returns(address) {
        
        require(tokenOwners[tokenId] != address(0),
            "nobody own then token");
        
        return tokenApprovals[tokenId];
    }
    
    function isApprovedForAll(address owner, address operator)
        external view override returns(bool) {
        
        return approvalForAlls[owner][operator];
    }
    
    function supportsInterface(bytes4 interfaceID)
        external pure override returns(bool) {
        
        return interfaceID == INTERFACE_ID_ERC165
            || interfaceID == INTERFACE_ID_ERC721
            || interfaceID == INTERFACE_ID_ERC721Metadata;
    }
}

abstract contract ERC721Ex is ERC721, Member {
    using Address for address;
    
    uint256 public constant NFT_SIGN_BIT = 1 << 255;
    
    uint256 public totalSupply = 0;
    
    string public uriPrefix = "http://api.dgqxyc.com/";
    
    function _mint(address to, uint256 tokenId) internal {
        _addTokenTo(to, tokenId);
        
        ++totalSupply;
        
        emit Transfer(address(0), to, tokenId);
    }
    
    function _burn(uint256 tokenId) internal {
        address owner = tokenOwners[tokenId];
        _removeTokenFrom(owner, tokenId);
        
        if (tokenApprovals[tokenId] != address(0)) {
            delete tokenApprovals[tokenId];
        }
        
        emit Transfer(owner, address(0), tokenId);
    }
    
    function safeBatchTransferFrom(address from, address to,
        uint256[] memory tokenIds) external {
        
        safeBatchTransferFrom(from, to, tokenIds, "");
    }
    
    function safeBatchTransferFrom(address from, address to,
        uint256[] memory tokenIds, bytes memory data) public {
        
        batchTransferFrom(from, to, tokenIds);
        
        if (to.isContract()) {
            require(IERC721TokenReceiverEx(to)
                .onERC721ExReceived(msg.sender, from, tokenIds, data)
                == Util.ERC721_RECEIVER_EX_RETURN,
                "onERC721ExReceived() return invalid");
        }
    }
    
    function batchTransferFrom(address from, address to,
        uint256[] memory tokenIds) public {
        
        require(from != address(0), "from is zero address");
        require(to != address(0), "to is zero address");
        
        uint256 length = tokenIds.length;
        address sender = msg.sender;
        
        bool approval = from == sender || approvalForAlls[from][sender];
        
        for (uint256 i = 0; i != length; ++i) {
            uint256 tokenId = tokenIds[i];
			
            require(from == tokenOwners[tokenId], "from must be owner");
            require(approval || sender == tokenApprovals[tokenId],
                "sender must be owner or approvaled");
            
            if (tokenApprovals[tokenId] != address(0)) {
                delete tokenApprovals[tokenId];
            }
            
            _removeTokenFrom(from, tokenId);
            _addTokenTo(to, tokenId);
            
            emit Transfer(from, to, tokenId);
        }
    }
    
    function setUriPrefix(string memory prefix)
        external CheckPermit("Config") {
        
        uriPrefix = prefix;
    }
}

contract VerifyPackage is ERC721Ex {
    using String for string;

    struct ShopInfo {
        uint256 id;
        bool enabled;
    }

    struct PackageInfo {
        uint256 blockNumber;
        Shop shop;
    }


    event buyPackage(address indexed owner,uint256 indexed packageId,uint256 padding);

    mapping(uint256 => PackageInfo) public packageInfos;

    uint256 public quantityMin = 1;
    uint256 public quantityMax = 50;

    mapping(address => ShopInfo) public shopInfos;
    uint256 public shopCount;

    constructor(string memory _name, string memory _symbol)
    ERC721(_name, _symbol) {
    }

    function setShop(address addr, bool enable)
    external CheckPermit("Config") {

        ShopInfo storage si = shopInfos[addr];

        if (si.id == 0) {
            si.id = ++shopCount;
        }

        si.enabled = enable;
    }

    function setQuantityMin(uint256 min)
    external CheckPermit("Config") {

        quantityMin = min;
    }

    function setQuantityMax(uint256 max)
    external CheckPermit("Config") {

        quantityMax = max;
    }

    function mint(address to, uint256 tokenAmount,
        uint256 quantity, uint256 padding) external {

        //商店必须已经开发
        require(shopInfos[msg.sender].enabled, "shop not enabled");

        //购买数量限制
        require(quantity >= quantityMin && quantity <= quantityMax,
            "invalid quantity");

        uint256 shopId = shopInfos[msg.sender].id;

        //57896044645618044378943439807197668129736038552744381623420416922679116824577
        //1+shopId+单价+数量+padding+时间+总供应量
        uint256 packageId = NFT_SIGN_BIT | (uint256(uint32(shopId)) << 224) |
        (uint256(uint64(tokenAmount)) << 160) | (uint256(uint16(quantity)) << 144) |
        (uint256(uint40(padding)) << 104) | (block.timestamp << 64) |
        (uint64(totalSupply + 1));

        PackageInfo storage pi = packageInfos[packageId];

        pi.blockNumber = block.number + 1;
        IBlockhashMgr(manager.members("blockhashMgr"))
            .request(pi.blockNumber);

        pi.shop = Shop(msg.sender);

        emit buyPackage(to,packageId,padding);

        _mint(to, packageId);
    }
    
    //open package 
    function open(uint256 packageId) external {
        require(msg.sender == tokenOwners[packageId],
            "you not own this package");
            
        _burn(packageId);//销毁
        
        PackageInfo storage pi = packageInfos[packageId];
        
        bytes32 bh = IBlockhashMgr(manager.members("blockhashMgr"))
            .getBlockhash(pi.blockNumber);

        //这个实现没有
        uint256[] memory cardIdPres = pi.shop.onOpenPackage(
            msg.sender, packageId, bh);
        
        Card card = Card(manager.members("card"));
        uint256 length = cardIdPres.length;
        //铸造卡片
        for (uint256 i = 0; i != length; ++i) {
            card.mint(msg.sender, cardIdPres[i]);
        }

        //开包后删除
        delete packageInfos[packageId];
    }
    
    function batchOpen(uint256 packageId) external {
        require(msg.sender == tokenOwners[packageId],
            "you not own this package");
            
        _burn(packageId);
        
        PackageInfo storage pi = packageInfos[packageId];
        
        bytes32 bh = IBlockhashMgr(manager.members("blockhashMgr"))
            .getBlockhash(pi.blockNumber);
            
        uint256[] memory cardIdPres = pi.shop.onOpenPackage(
            msg.sender, packageId, bh);
        
        Card(manager.members("card")).batchMint(msg.sender, cardIdPres);
        
        delete packageInfos[packageId];
    }



    function tokenURI(uint256 packageId)
    external view override returns(string memory) {

        PackageInfo storage pi = packageInfos[packageId];

        bytes memory bs = abi.encodePacked(packageId);

        uint256[] memory rarityWeights = pi.shop.getRarityWeights(packageId);

        uint256 length = rarityWeights.length;
        uint256 rarityWeightTotal = 0;
        for (uint256 i = 0; i != length; ++i) {
            rarityWeightTotal += rarityWeights[i];
        }

        uint256 weightMax = ~uint16(0);

        for (uint256 i = 0; i != length; ++i) {
            bs = abi.encodePacked(bs, uint16(rarityWeights[i]
            * weightMax / rarityWeightTotal));
        }

        return uriPrefix.concat("package/").concat(Util.base64Encode(bs));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"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":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"packageId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"padding","type":"uint256"}],"name":"buyPackage","type":"event"},{"inputs":[],"name":"NFT_SIGN_BIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","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":"packageId","type":"uint256"}],"name":"batchOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"manager","outputs":[{"internalType":"contract Manager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"padding","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"packageId","type":"uint256"}],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"packageInfos","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"contract Shop","name":"shop","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quantityMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quantityMin","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":"tokenIds","type":"uint256[]"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setQuantityMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"min","type":"uint256"}],"name":"setQuantityMin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setShop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shopCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shopInfos","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"packageId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"tokensOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"payable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405233600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006009556040518060400160405280601681526020017f687474703a2f2f6170692e6467717879632e636f6d2f00000000000000000000815250600a90805190602001906200009792919062000291565b506001600c556032600d55348015620000af57600080fd5b5060405162005d1b38038062005d1b83398181016040526040811015620000d557600080fd5b8101908080516040519392919084640100000000821115620000f657600080fd5b838201915060208201858111156200010d57600080fd5b82518660018202830111640100000000821117156200012b57600080fd5b8083526020830192505050908051906020019080838360005b838110156200016157808201518184015260208101905062000144565b50505050905090810190601f1680156200018f5780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084640100000000821115620001b357600080fd5b83820191506020820185811115620001ca57600080fd5b8251866001820283011164010000000082111715620001e857600080fd5b8083526020830192505050908051906020019080838360005b838110156200021e57808201518184015260208101905062000201565b50505050905090810190601f1680156200024c5780820380516001836020036101000a031916815260200191505b50604052505050818181600090805190602001906200026d92919062000291565b5080600190805190602001906200028692919062000291565b505050505062000347565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620002c9576000855562000315565b82601f10620002e457805160ff191683800117855562000315565b8280016001018555821562000315579182015b8281111562000314578251825591602001919060010190620002f7565b5b50905062000324919062000328565b5090565b5b808211156200034357600081600090555060010162000329565b5090565b6159c480620003576000396000f3fe6080604052600436106102045760003560e01c8063690e7c0911610118578063c79d9ff6116100a0578063d9991a911161006f578063d9991a9114611034578063e10f024d1461106f578063e4d724181461109a578063e985e9c5146110f7578063f3993d111461117e57610204565b8063c79d9ff614610e82578063c87b56dd14610eee578063ce606ee014610fa2578063d0ebdbe714610fe357610204565b806391c7b215116100e757806391c7b21514610be657806395d89b4114610c21578063a22cb46514610cb1578063a647e8ec14610d0e578063b88d4fde14610d7d57610204565b8063690e7c0914610a1057806370a0823114610a4b578063735c4fe014610ab05780637ec4a65914610b1e57610204565b806323185dc91161019b57806342842e0e1161016a57806342842e0e14610841578063481c6a75146108af57806362b99ad4146108f057806363486854146109805780636352211e146109ab57610204565b806323185dc91461055257806323b872dd1461060c578063273fbf171461067a57806328cfbd46146106a557610204565b8063095ea7b3116101d7578063095ea7b3146104735780630a747ed5146104c15780630b0387f7146104ec57806318160ddd1461052757610204565b806301ffc9a714610209578063034601ec1461027957806306fdde031461037e578063081812fc1461040e575b600080fd5b34801561021557600080fd5b506102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611283565b60405180821515815260200191505060405180910390f35b34801561028557600080fd5b5061037c6004803603606081101561029c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156102f957600080fd5b82018360208201111561030b57600080fd5b8035906020019184602083028401116401000000008311171561032d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611372565b005b34801561038a57600080fd5b50610393611392565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103d35780820151818401526020810190506103b8565b50505050905090810190601f1680156104005780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041a57600080fd5b506104476004803603602081101561043157600080fd5b8101908080359060200190929190505050611430565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104bf6004803603604081101561048957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611542565b005b3480156104cd57600080fd5b506104d6611741565b6040518082815260200191505060405180910390f35b3480156104f857600080fd5b506105256004803603602081101561050f57600080fd5b8101908080359060200190929190505050611747565b005b34801561053357600080fd5b5061053c61192b565b6040518082815260200191505060405180910390f35b34801561055e57600080fd5b506105b56004803603606081101561057557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611931565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105f85780820151818401526020810190506105dd565b505050509050019250505060405180910390f35b6106786004803603606081101561062257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b91565b005b34801561068657600080fd5b5061068f611ba1565b6040518082815260200191505060405180910390f35b3480156106b157600080fd5b5061083f600480360360808110156106c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561072557600080fd5b82018360208201111561073757600080fd5b8035906020019184602083028401116401000000008311171561075957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156107b957600080fd5b8201836020820111156107cb57600080fd5b803590602001918460018302840111640100000000831117156107ed57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ba7565b005b6108ad6004803603606081101561085757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611df1565b005b3480156108bb57600080fd5b506108c4611e11565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156108fc57600080fd5b50610905611e37565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561094557808201518184015260208101905061092a565b50505050905090810190601f1680156109725780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561098c57600080fd5b50610995611ed5565b6040518082815260200191505060405180910390f35b3480156109b757600080fd5b506109e4600480360360208110156109ce57600080fd5b8101908080359060200190929190505050611edb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a1c57600080fd5b50610a4960048036036020811015610a3357600080fd5b8101908080359060200190929190505050611fc0565b005b348015610a5757600080fd5b50610a9a60048036036020811015610a6e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612586565b6040518082815260200191505060405180910390f35b348015610abc57600080fd5b50610aff60048036036020811015610ad357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612674565b6040518083815260200182151581526020019250505060405180910390f35b348015610b2a57600080fd5b50610be460048036036020811015610b4157600080fd5b8101908080359060200190640100000000811115610b5e57600080fd5b820183602082011115610b7057600080fd5b80359060200191846001830284011164010000000083111715610b9257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506126a5565b005b348015610bf257600080fd5b50610c1f60048036036020811015610c0957600080fd5b8101908080359060200190929190505050612899565b005b348015610c2d57600080fd5b50610c36612a7d565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c76578082015181840152602081019050610c5b565b50505050905090810190601f168015610ca35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610cbd57600080fd5b50610d0c60048036036040811015610cd457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612b1b565b005b348015610d1a57600080fd5b50610d7b60048036036080811015610d3157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050612c1a565b005b610e8060048036036080811015610d9357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610dfa57600080fd5b820183602082011115610e0c57600080fd5b80359060200191846001830284011164010000000083111715610e2e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061302d565b005b348015610e8e57600080fd5b50610ebb60048036036020811015610ea557600080fd5b8101908080359060200190929190505050613236565b604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b348015610efa57600080fd5b50610f2760048036036020811015610f1157600080fd5b810190808035906020019092919050505061327a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f67578082015181840152602081019050610f4c565b50505050905090810190601f168015610f945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610fae57600080fd5b50610fb76135fd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610fef57600080fd5b506110326004803603602081101561100657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613623565b005b34801561104057600080fd5b5061106d6004803603602081101561105757600080fd5b810190808035906020019092919050505061372a565b005b34801561107b57600080fd5b50611084613cfb565b6040518082815260200191505060405180910390f35b3480156110a657600080fd5b506110f5600480360360408110156110bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613d1f565b005b34801561110357600080fd5b506111666004803603604081101561111a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f82565b60405180821515815260200191505060405180910390f35b34801561118a57600080fd5b50611281600480360360608110156111a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156111fe57600080fd5b82018360208201111561121057600080fd5b8035906020019184602083028401116401000000008311171561123257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050614016565b005b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061131c57506380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061136b5750635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b61138d83838360405180602001604052806000815250611ba7565b505050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114285780601f106113fd57610100808354040283529160200191611428565b820191906000526020600020905b81548152906001019060200180831161140b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6e6f626f6479206f776e207468656e20746f6b656e000000000000000000000081525060200191505060405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061163a5750600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61168f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806159046028913960400191505060405180910390fd5b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600f5481565b6040518060400160405280600681526020017f436f6e6669670000000000000000000000000000000000000000000000000000815250600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dd13a9533836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561182857808201518184015260208101905061180d565b50505050905090810190601f1680156118555780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561187357600080fd5b505afa158015611887573d6000803e3d6000fd5b505050506040513d602081101561189d57600080fd5b8101908080519060200190929190505050611920576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207065726d6974000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81600d819055505050565b60095481565b6060600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6f776e6572206973207a65726f2061646472657373000000000000000000000081525060200191505060405180910390fd5b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000831415611a7a5780805480602002602001604051908101604052809291908181526020018280548015611a6d57602002820191906000526020600020905b815481526020019060010190808311611a59575b5050505050915050611b8a565b828410611aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c696420696e6465780000000000000000000000000000000000000081525060200191505060405180910390fd5b600084840367ffffffffffffffff81118015611b0a57600080fd5b50604051908082528060200260200182016040528015611b395781602001602082028036833780820191505090505b50905060008590505b848114611b8357828181548110611b5557fe5b9060005260206000200154828281518110611b6c57fe5b602002602001018181525050806001019050611b42565b5080925050505b9392505050565b611b9c838383614502565b505050565b600d5481565b611bb2848484614016565b611bd18373ffffffffffffffffffffffffffffffffffffffff166149ac565b15611deb57630f7b88e360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff16630f7b88e3338786866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611cab578082015181840152602081019050611c90565b50505050905001838103825284818151815260200191508051906020019080838360005b83811015611cea578082015181840152602081019050611ccf565b50505050905090810190601f168015611d175780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611d3a57600080fd5b505af1158015611d4e573d6000803e3d6000fd5b505050506040513d6020811015611d6457600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611dea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061596c6023913960400191505060405180910390fd5b5b50505050565b611e0c8383836040518060200160405280600081525061302d565b505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ecd5780601f10611ea257610100808354040283529160200191611ecd565b820191906000526020600020905b815481529060010190602001808311611eb057829003601f168201915b505050505081565b600c5481565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fb7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f626f6479206f776e2074686520746f6b656e00000000000000000000000081525060200191505060405180910390fd5b80915050919050565b6004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612094576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f796f75206e6f74206f776e2074686973207061636b616765000000000000000081525060200191505060405180910390fd5b61209d816149bf565b6000600b600083815260200190815260200160002090506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636957a0b26040518163ffffffff1660e01b815260040180806020018281038252600c8152602001807f626c6f636b686173684d6772000000000000000000000000000000000000000081525060200191505060206040518083038186803b15801561215a57600080fd5b505afa15801561216e573d6000803e3d6000fd5b505050506040513d602081101561218457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663e9413d3883600001546040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156121eb57600080fd5b505af11580156121ff573d6000803e3d6000fd5b505050506040513d602081101561221557600080fd5b8101908080519060200190929190505050905060008260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbc428143386856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b1580156122c757600080fd5b505af11580156122db573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561230557600080fd5b810190808051604051939291908464010000000082111561232557600080fd5b8382019150602082018581111561233b57600080fd5b825186602082028301116401000000008211171561235857600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561238f578082015181840152602081019050612374565b5050505090500160405250505090506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636957a0b26040518163ffffffff1660e01b81526004018080602001828103825260048152602001807f636172640000000000000000000000000000000000000000000000000000000081525060200191505060206040518083038186803b15801561244457600080fd5b505afa158015612458573d6000803e3d6000fd5b505050506040513d602081101561246e57600080fd5b8101908080519060200190929190505050905060008251905060005b818114612538578273ffffffffffffffffffffffffffffffffffffffff166340c10f19338684815181106124ba57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561251557600080fd5b505af1158015612529573d6000803e3d6000fd5b5050505080600101905061248a565b50600b60008781526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561262a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6f776e6572206973207a65726f2061646472657373000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600e6020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b6040518060400160405280600681526020017f436f6e6669670000000000000000000000000000000000000000000000000000815250600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dd13a9533836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561278657808201518184015260208101905061276b565b50505050905090810190601f1680156127b35780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b1580156127d157600080fd5b505afa1580156127e5573d6000803e3d6000fd5b505050506040513d60208110156127fb57600080fd5b810190808051906020019092919050505061287e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207065726d6974000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81600a9080519060200190612894929190615815565b505050565b6040518060400160405280600681526020017f436f6e6669670000000000000000000000000000000000000000000000000000815250600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dd13a9533836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561297a57808201518184015260208101905061295f565b50505050905090810190601f1680156129a75780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b1580156129c557600080fd5b505afa1580156129d9573d6000803e3d6000fd5b505050506040513d60208110156129ef57600080fd5b8101908080519060200190929190505050612a72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207065726d6974000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81600c819055505050565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b135780601f10612ae857610100808354040283529160200191612b13565b820191906000526020600020905b815481529060010190602001808311612af657829003601f168201915b505050505081565b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16612cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f73686f70206e6f7420656e61626c65640000000000000000000000000000000081525060200191505060405180910390fd5b600c548210158015612cf05750600d548211155b612d62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f696e76616c6964207175616e746974790000000000000000000000000000000081525060200191505060405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600060016009540167ffffffffffffffff16604042901b60688564ffffffffff16901b60908761ffff16901b60a08967ffffffffffffffff16901b60e08763ffffffff16901b7f800000000000000000000000000000000000000000000000000000000000000017171717171790506000600b60008381526020019081526020016000209050600143018160000181905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636957a0b26040518163ffffffff1660e01b815260040180806020018281038252600c8152602001807f626c6f636b686173684d6772000000000000000000000000000000000000000081525060200191505060206040518083038186803b158015612edf57600080fd5b505afa158015612ef3573d6000803e3d6000fd5b505050506040513d6020811015612f0957600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663d845a4b382600001546040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612f7057600080fd5b505af1158015612f84573d6000803e3d6000fd5b50505050338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818773ffffffffffffffffffffffffffffffffffffffff167f5e9d306e34030b48ae5cedc3cb43bc49314da1e680487d7316242c13282b05d5866040518082815260200191505060405180910390a36130248783614aff565b50505050505050565b613038848484614502565b6130578373ffffffffffffffffffffffffffffffffffffffff166149ac565b156132305763150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613130578082015181840152602081019050613115565b50505050905090810190601f16801561315d5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561317f57600080fd5b505af1158015613193573d6000803e3d6000fd5b505050506040513d60208110156131a957600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461322f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158e36021913960400191505060405180910390fd5b5b50505050565b600b6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b60606000600b6000848152602001908152602001600020905060008360405160200180828152602001915050604051602081830303815290604052905060008260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e81fb33f866040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561332e57600080fd5b505afa158015613342573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561336c57600080fd5b810190808051604051939291908464010000000082111561338c57600080fd5b838201915060208201858111156133a257600080fd5b82518660208202830111640100000000821117156133bf57600080fd5b8083526020830192505050908051906020019060200280838360005b838110156133f65780820151818401526020810190506133db565b5050505090500160405250505090506000815190506000805b8281146134395783818151811061342257fe5b60200260200101518201915080600101905061340f565b506000801961ffff16905060005b8381146134f35785838387848151811061345d57fe5b6020026020010151028161346d57fe5b046040516020018083805190602001908083835b602083106134a45780518252602082019150602081019050602083039250613481565b6001836020036101000a0380198251168184511680821785525050505050509050018261ffff1660f01b8152600201925050506040516020818303038152906040529550806001019050613447565b506135f061350086614b79565b6135e26040518060400160405280600881526020017f7061636b6167652f000000000000000000000000000000000000000000000000815250600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135cf5780601f106135a4576101008083540402835291602001916135cf565b820191906000526020600020905b8154815290600101906020018083116135b257829003601f168201915b50505050506154cd90919063ffffffff16565b6154cd90919063ffffffff16565b9650505050505050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146136e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f636f6e7472616374206f776e6572206f6e6c790000000000000000000000000081525060200191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146137fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f796f75206e6f74206f776e2074686973207061636b616765000000000000000081525060200191505060405180910390fd5b613807816149bf565b6000600b600083815260200190815260200160002090506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636957a0b26040518163ffffffff1660e01b815260040180806020018281038252600c8152602001807f626c6f636b686173684d6772000000000000000000000000000000000000000081525060200191505060206040518083038186803b1580156138c457600080fd5b505afa1580156138d8573d6000803e3d6000fd5b505050506040513d60208110156138ee57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663e9413d3883600001546040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561395557600080fd5b505af1158015613969573d6000803e3d6000fd5b505050506040513d602081101561397f57600080fd5b8101908080519060200190929190505050905060008260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbc428143386856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015613a3157600080fd5b505af1158015613a45573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015613a6f57600080fd5b8101908080516040519392919084640100000000821115613a8f57600080fd5b83820191506020820185811115613aa557600080fd5b8251866020820283011164010000000082111715613ac257600080fd5b8083526020830192505050908051906020019060200280838360005b83811015613af9578082015181840152602081019050613ade565b505050509050016040525050509050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636957a0b26040518163ffffffff1660e01b81526004018080602001828103825260048152602001807f636172640000000000000000000000000000000000000000000000000000000081525060200191505060206040518083038186803b158015613bac57600080fd5b505afa158015613bc0573d6000803e3d6000fd5b505050506040513d6020811015613bd657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16634684d7e933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015613c72578082015181840152602081019050613c57565b505050509050019350505050600060405180830381600087803b158015613c9857600080fd5b505af1158015613cac573d6000803e3d6000fd5b50505050600b60008581526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055505050505050565b7f800000000000000000000000000000000000000000000000000000000000000081565b6040518060400160405280600681526020017f436f6e6669670000000000000000000000000000000000000000000000000000815250600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dd13a9533836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613e00578082015181840152602081019050613de5565b50505050905090810190601f168015613e2d5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015613e4b57600080fd5b505afa158015613e5f573d6000803e3d6000fd5b505050506040513d6020811015613e7557600080fd5b8101908080519060200190929190505050613ef8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207065726d6974000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541415613f6057600f6000815460010191905081905581600001819055505b828160010160006101000a81548160ff02191690831515021790555050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156140b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f66726f6d206973207a65726f206164647265737300000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561415c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f746f206973207a65726f2061646472657373000000000000000000000000000081525060200191505060405180910390fd5b600081519050600033905060008173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806142295750600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905060005b8381146144f957600085828151811061424357fe5b602002602001015190506004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614614321576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f66726f6d206d757374206265206f776e6572000000000000000000000000000081525060200191505060405180910390fd5b828061438b57506005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b6143e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158c16022913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461447e576005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b6144888882615624565b6144928782615737565b808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45080600101905061422e565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156145a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f66726f6d206973207a65726f206164647265737300000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614648576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f746f206973207a65726f2061646472657373000000000000000000000000000081525060200191505060405180910390fd5b6004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461471c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f66726f6d206d757374206265206f776e6572000000000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806147b457506005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806148455750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61489a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158c16022913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614938576005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b6149428382615624565b61494c8282615737565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080823b905060008111915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614a018183615624565b600073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a9f576005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b81600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b614b098282615737565b60096000815460010191905081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606060006003835181614b8857fe5b069050600060046003855181614b9a57fe5b04029050600060038360030381614bad57fe5b066000841415614bbe576000614bc1565b60045b60ff1683010167ffffffffffffffff81118015614bdd57600080fd5b506040519080825280601f01601f191660200182016040528015614c105781602001600182028036833780820191505090505b5090506000805b838214614f655760405180606001604052806040815260200161592c604091396002888381518110614c4557fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff1681518110614c8457fe5b602001015160f81c60f81b838380600101945081518110614ca157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161592c604091396004886001840181518110614cfa57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c6004600360f81b8a8581518110614d3c57fe5b602001015160f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1760f81c60ff1681518110614d7d57fe5b602001015160f81c60f81b838380600101945081518110614d9a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161592c604091396006886002840181518110614df357fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c6002600f60f81b8a6001860181518110614e3857fe5b602001015160f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1760f81c60ff1681518110614e7957fe5b602001015160f81c60f81b838380600101945081518110614e9657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161592c60409139603f60f81b886002840181518110614ef257fe5b602001015160f81c60f81b1660f81c60ff1681518110614f0e57fe5b602001015160f81c60f81b838380600101945081518110614f2b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600381019050614c17565b600085146154c05760405180606001604052806040815260200161592c604091396002888381518110614f9457fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff1681518110614fd357fe5b602001015160f81c60f81b838380600101945081518110614ff057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060028514156152985760405180606001604052806040815260200161592c60409139600488600184018151811061505257fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c6004600360f81b8a858151811061509457fe5b602001015160f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b1760f81c60ff16815181106150d557fe5b602001015160f81c60f81b8383806001019450815181106150f257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161592c604091396002600f60f81b89600185018151811061515057fe5b602001015160f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b60f81c60ff168151811061519057fe5b602001015160f81c60f81b8383806001019450815181106151ad57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161592c6040913960008151811061520157fe5b602001015160f81c60f81b83838060010194508151811061521e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350603d60f81b83838060010194508151811061526457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506154bf565b60405180606001604052806040815260200161592c604091396004600360f81b8984815181106152c457fe5b602001015160f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b60f81c60ff168151811061530457fe5b602001015160f81c60f81b83838060010194508151811061532157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161592c6040913960008151811061537557fe5b602001015160f81c60f81b83838060010194508151811061539257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060405180606001604052806040815260200161592c604091396000815181106153e657fe5b602001015160f81c60f81b83838060010194508151811061540357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350603d60f81b83838060010194508151811061544957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350603d60f81b83838060010194508151811061548f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b5b8295505050505050919050565b6060600083905060008390506000815183510167ffffffffffffffff811180156154f657600080fd5b506040519080825280601f01601f1916602001820160405280156155295781602001600182028036833780820191505090505b5090506000835190506000835190506000805b8381146155a65786818151811061554f57fe5b602001015160f81c60f81b85838060010194508151811061556c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080600101905061553c565b5060005b828114615614578581815181106155bd57fe5b602001015160f81c60f81b8583806001019450815181106155da57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060010190506155aa565b5083965050505050505092915050565b6000600360008381526020019081526020016000205490506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600060018280549050039050600082828154811061569957fe5b90600052602060002001549050808385815481106156b357fe5b9060005260206000200181905550836003600083815260200190815260200160002081905550828054806156e357fe5b600190038181906000526020600020016000905590556004600086815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055505050505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508080549050600360008481526020019081526020016000208190555080829080600181540180825580915050600190039060005260206000200160009091909190915055826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261584b5760008555615892565b82601f1061586457805160ff1916838001178555615892565b82800160010185558215615892579182015b82811115615891578251825591602001919060010190615876565b5b50905061589f91906158a3565b5090565b5b808211156158bc5760008160009055506001016158a4565b509056fe73656e646572206d757374206265206f776e6572206f7220617070726f76616c65646f6e455243373231526563656976656428292072657475726e20696e76616c696473656e646572206d757374206265206f776e6572206f7220617070726f76656420666f7220616c6c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6f6e4552433732314578526563656976656428292072657475726e20696e76616c6964a264697066735822122020971254a844a48ad9421dec38abf9e8a691ecc5151df0b40b3f3a22972a98c864736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d4b756e6746755061636b6167650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034b46500000000000000000000000000000000000000000000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d4b756e6746755061636b6167650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034b46500000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): KungFuPackage
Arg [1] : _symbol (string): KFP

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [3] : 4b756e6746755061636b61676500000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4b46500000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

26258:4616:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23350:273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24420:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18093:27;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22905:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22286:406;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26774:24;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27278:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23780:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18840:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20380:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26682:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24608:466;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19727:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8520:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23823:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26645:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19481:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28583:835;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18608:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26722:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;26120:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27159:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18127:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22704:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27397:1153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19915:453;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26585:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;30079:792;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7470:41;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;8555:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29430:637;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23720:47;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26907:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23165:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25086:1022;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23350:273;23437:4;17042:10;23486:19;;23471:34;;;:11;:34;;;;:85;;;;17993:10;23537:19;;23522:34;;;:11;:34;;;;23471:85;:144;;;;18070:10;23588:27;;23573:42;;;:11;:42;;;;23471:144;23464:151;;23350:273;;;:::o;24420:176::-;24543:45;24565:4;24571:2;24575:8;24543:45;;;;;;;;;;;;:21;:45::i;:::-;24420:176;;;:::o;18093:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22905:248::-;22983:7;23053:1;23021:34;;:11;:20;23033:7;23021:20;;;;;;;;;;;;;;;;;;;;;:34;;;;23013:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23122:14;:23;23137:7;23122:23;;;;;;;;;;;;;;;;;;;;;23115:30;;22905:248;;;:::o;22286:406::-;22388:13;22404:11;:20;22416:7;22404:20;;;;;;;;;;;;;;;;;;;;;22388:36;;22467:5;22453:19;;:10;:19;;;:70;;;;22489:15;:22;22505:5;22489:22;;;;;;;;;;;;;;;:34;22512:10;22489:34;;;;;;;;;;;;;;;;;;;;;;;;;22453:70;22445:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22638:2;22612:14;:23;22627:7;22612:23;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;22676:7;22672:2;22656:28;;22665:5;22656:28;;;;;;;;;;;;22286:406;;;:::o;26774:24::-;;;;:::o;27278:111::-;8360:148;;;;;;;;;;;;;;;;;8422:7;;;;;;;;;;;:19;;;8442:10;8454:6;8422:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8414:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27378:3:::1;27364:11;:17;;;;27278:111:::0;;:::o;23780:30::-;;;;:::o;18840:629::-;18942:16;19006:1;18989:19;;:5;:19;;;;18981:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19055:24;19082:11;:18;19094:5;19082:18;;;;;;;;;;;;;;;19055:45;;19127:1;19115:8;:13;19111:59;;;19152:6;19145:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19111:59;19211:8;19198:10;:21;19190:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19258:23;19309:10;19298:8;:21;19284:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19258:62;;19336:9;19348:10;19336:22;;19331:97;19365:8;19360:1;:13;19331:97;;19407:6;19414:1;19407:9;;;;;;;;;;;;;;;;19395:6;19402:1;19395:9;;;;;;;;;;;;;:21;;;;;19375:3;;;;;19331:97;;;;19455:6;19448:13;;;;18840:629;;;;;;:::o;20380:161::-;20501:32;20515:4;20521:2;20525:7;20501:13;:32::i;:::-;20380:161;;;:::o;26682:31::-;;;;:::o;24608:466::-;24748:37;24766:4;24772:2;24776:8;24748:17;:37::i;:::-;24810:15;:2;:13;;;:15::i;:::-;24806:261;;;2011:10;24968:30;;24850:148;;;24873:2;24850:63;;;24914:10;24926:4;24932:8;24942:4;24850:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:148;;;;24842:213;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24806:261;24608:466;;;;:::o;19727:176::-;19856:39;19873:4;19879:2;19883:7;19856:39;;;;;;;;;;;;:16;:39::i;:::-;19727:176;;;:::o;8520:22::-;;;;;;;;;;;;;:::o;23823:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26645:30::-;;;;:::o;19481:234::-;19555:7;19585:13;19601:11;:20;19613:7;19601:20;;;;;;;;;;;;;;;;;;;;;19585:36;;19657:1;19640:19;;:5;:19;;;;19632:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19702:5;19695:12;;;19481:234;;;:::o;28583:835::-;28658:11;:22;28670:9;28658:22;;;;;;;;;;;;;;;;;;;;;28644:36;;:10;:36;;;28636:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28747:16;28753:9;28747:5;:16::i;:::-;28792:22;28817:12;:23;28830:9;28817:23;;;;;;;;;;;28792:48;;28861:10;28888:7;;;;;;;;;;;:15;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28874:73;;;28948:2;:14;;;28874:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28861:102;;29006:27;29036:2;:7;;;;;;;;;;;;:21;;;29072:10;29084:9;29095:2;29036:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29006:92;;29119:9;29136:7;;;;;;;;;;;:15;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29119:41;;29171:14;29188:10;:17;29171:34;;29245:9;29240:101;29265:6;29260:1;:11;29240:101;;29293:4;:9;;;29303:10;29315;29326:1;29315:13;;;;;;;;;;;;;;29293:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29273:3;;;;;29240:101;;;;29387:12;:23;29400:9;29387:23;;;;;;;;;;;;29380:30;;;;;;;;;;;;;;;;;;;;;;;28583:835;;;;;;:::o;18608:189::-;18673:7;18718:1;18701:19;;:5;:19;;;;18693:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18764:11;:18;18776:5;18764:18;;;;;;;;;;;;;;;:25;;;;18757:32;;18608:189;;;:::o;26722:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26120:131::-;8360:148;;;;;;;;;;;;;;;;;8422:7;;;;;;;;;;;:19;;;8442:10;8454:6;8422:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8414:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26237:6:::1;26225:9;:18;;;;;;;;;;;;:::i;:::-;;26120:131:::0;;:::o;27159:111::-;8360:148;;;;;;;;;;;;;;;;;8422:7;;;;;;;;;;;:19;;;8442:10;8454:6;8422:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8414:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27259:3:::1;27245:11;:17;;;;27159:111:::0;;:::o;18127:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22704:189::-;22821:8;22787:15;:27;22803:10;22787:27;;;;;;;;;;;;;;;:31;22815:2;22787:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;22872:2;22845:40;;22860:10;22845:40;;;22876:8;22845:40;;;;;;;;;;;;;;;;;;;;22704:189;;:::o;27397:1153::-;27554:9;:21;27564:10;27554:21;;;;;;;;;;;;;;;:29;;;;;;;;;;;;27546:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27667:11;;27655:8;:23;;:50;;;;;27694:11;;27682:8;:23;;27655:50;27647:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27752:14;27769:9;:21;27779:10;27769:21;;;;;;;;;;;;;;;:24;;;27752:41;;27957:17;28215:1;28201:11;;:15;27977:241;;28178:2;28159:15;:21;;28151:3;28138:7;28123:24;;:31;;28106:3;28092:8;28077:25;;:32;;28069:3;28052:11;28037:28;;:35;;28020:3;28008:6;27993:23;;:30;;23759:8;27977:47;:96;:133;:178;:204;:241;27957:261;;28231:22;28256:12;:23;28269:9;28256:23;;;;;;;;;;;28231:48;;28324:1;28309:12;:16;28292:2;:14;;:33;;;;28350:7;;;;;;;;;;;:15;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28336:68;;;28405:2;:14;;;28336:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28448:10;28433:2;:7;;;:26;;;;;;;;;;;;;;;;;;28491:9;28488:2;28477:32;;;28501:7;28477:32;;;;;;;;;;;;;;;;;;28522:20;28528:2;28532:9;28522:5;:20::i;:::-;27397:1153;;;;;;;:::o;19915:453::-;20057:32;20071:4;20077:2;20081:7;20057:13;:32::i;:::-;20114:15;:2;:13;;;:15::i;:::-;20110:251;;;1941:10;20267:27;;20154:140;;;20175:2;20154:59;;;20214:10;20226:4;20232:7;20241:4;20154:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:140;;;;20146:203;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20110:251;19915:453;;;;:::o;26585:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30079:792::-;30152:13;30180:22;30205:12;:23;30218:9;30205:23;;;;;;;;;;;30180:48;;30241:15;30276:9;30259:27;;;;;;;;;;;;;;;;;;;;;;;;;30241:45;;30299:30;30332:2;:7;;;;;;;;;;;;:24;;;30357:9;30332:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30299:68;;30380:14;30397:13;:20;30380:37;;30428:25;30473:9;30468:102;30493:6;30488:1;:11;30468:102;;30542:13;30556:1;30542:16;;;;;;;;;;;;;;30521:37;;;;30501:3;;;;;30468:102;;;;30582:17;30610:1;30602:10;30582:30;;;;30630:9;30625:161;30650:6;30645:1;:11;30625:161;;30700:2;30755:17;30743:9;30711:13;30725:1;30711:16;;;;;;;;;;;;;;:41;:61;;;;;;30683:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30678:96;;30658:3;;;;;30625:161;;;;30805:58;30841:21;30859:2;30841:17;:21::i;:::-;30805:28;;;;;;;;;;;;;;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:35;;:58;;;;:::i;:::-;30798:65;;;;;;;;30079:792;;;:::o;7470:41::-;;;;;;;;;;;;;:::o;8555:103::-;7584:13;;;;;;;;;;;7570:27;;:10;:27;;;7562:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8645:4:::1;8627:7;;:23;;;;;;;;;;;;;;;;;;8555:103:::0;:::o;29430:637::-;29510:11;:22;29522:9;29510:22;;;;;;;;;;;;;;;;;;;;;29496:36;;:10;:36;;;29488:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29599:16;29605:9;29599:5;:16::i;:::-;29636:22;29661:12;:23;29674:9;29661:23;;;;;;;;;;;29636:48;;29705:10;29732:7;;;;;;;;;;;:15;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29718:73;;;29792:2;:14;;;29718:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29705:102;;29832:27;29862:2;:7;;;;;;;;;;;;:21;;;29898:10;29910:9;29921:2;29862:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29832:92;;29950:7;;;;;;;;;;;:15;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29945:39;;;29985:10;29997;29945:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30036:12;:23;30049:9;30036:23;;;;;;;;;;;;30029:30;;;;;;;;;;;;;;;;;;;;;;;29430:637;;;;:::o;23720:47::-;23759:8;23720:47;:::o;26907:244::-;8360:148;;;;;;;;;;;;;;;;;8422:7;;;;;;;;;;;:19;;;8442:10;8454:6;8422:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8414:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27000:19:::1;27022:9;:15;27032:4;27022:15;;;;;;;;;;;;;;;27000:37;;27063:1;27054:2;:5;;;:10;27050:62;;;27091:9;;27089:11;;;;;;;;;;27081:2;:5;;:19;;;;27050:62;27137:6;27124:2;:10;;;:19;;;;;;;;;;;;;;;;;;8499:1;26907:244:::0;;;:::o;23165:173::-;23264:4;23298:15;:22;23314:5;23298:22;;;;;;;;;;;;;;;:32;23321:8;23298:32;;;;;;;;;;;;;;;;;;;;;;;;;23291:39;;23165:173;;;;:::o;25086:1022::-;25227:1;25211:18;;:4;:18;;;;25203:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25287:1;25273:16;;:2;:16;;;;25265:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25333:14;25350:8;:15;25333:32;;25376:14;25393:10;25376:27;;25424:13;25448:6;25440:14;;:4;:14;;;:47;;;;25458:15;:21;25474:4;25458:21;;;;;;;;;;;;;;;:29;25480:6;25458:29;;;;;;;;;;;;;;;;;;;;;;;;;25440:47;25424:63;;25513:9;25508:593;25533:6;25528:1;:11;25508:593;;25561:15;25579:8;25588:1;25579:11;;;;;;;;;;;;;;25561:29;;25626:11;:20;25638:7;25626:20;;;;;;;;;;;;;;;;;;;;;25618:28;;:4;:28;;;25610:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25692:8;:45;;;;25714:14;:23;25729:7;25714:23;;;;;;;;;;;;;;;;;;;;;25704:33;;:6;:33;;;25692:45;25684:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25861:1;25826:37;;:14;:23;25841:7;25826:23;;;;;;;;;;;;;;;;;;;;;:37;;;25822:108;;25891:14;:23;25906:7;25891:23;;;;;;;;;;;;25884:30;;;;;;;;;;;25822:108;25958:31;25975:4;25981:7;25958:16;:31::i;:::-;26004:24;26016:2;26020:7;26004:11;:24::i;:::-;26081:7;26077:2;26062:27;;26071:4;26062:27;;;;;;;;;;;;25508:593;25541:3;;;;;25508:593;;;;25086:1022;;;;;;:::o;20553:765::-;20682:1;20666:18;;:4;:18;;;;20658:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20742:1;20728:16;;:2;:16;;;;20720:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20804:11;:20;20816:7;20804:20;;;;;;;;;;;;;;;;;;;;;20796:28;;:4;:28;;;20788:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20890:4;20876:18;;:10;:18;;;:72;;;;20925:14;:23;20940:7;20925:23;;;;;;;;;;;;;;;;;;;;;20911:37;;:10;:37;;;20876:72;:122;;;;20965:15;:21;20981:4;20965:21;;;;;;;;;;;;;;;:33;20987:10;20965:33;;;;;;;;;;;;;;;;;;;;;;;;;20876:122;20868:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21110:1;21075:37;;:14;:23;21090:7;21075:23;;;;;;;;;;;;;;;;;;;;;:37;;;21071:100;;21136:14;:23;21151:7;21136:23;;;;;;;;;;;;21129:30;;;;;;;;;;;21071:100;21191:31;21208:4;21214:7;21191:16;:31::i;:::-;21233:24;21245:2;21249:7;21233:11;:24::i;:::-;21302:7;21298:2;21283:27;;21292:4;21283:27;;;;;;;;;;;;20553:765;;;:::o;5725:634::-;5784:4;5801:12;6316:7;6304:20;6296:28;;6350:1;6343:4;:8;6336:15;;;5725:634;;;:::o;24087:321::-;24139:13;24155:11;:20;24167:7;24155:20;;;;;;;;;;;;;;;;;;;;;24139:36;;24186:32;24203:5;24210:7;24186:16;:32::i;:::-;24278:1;24243:37;;:14;:23;24258:7;24243:23;;;;;;;;;;;;;;;;;;;;;:37;;;24239:100;;24304:14;:23;24319:7;24304:23;;;;;;;;;;;;24297:30;;;;;;;;;;;24239:100;24392:7;24388:1;24364:36;;24373:5;24364:36;;;;;;;;;;;;24087:321;;:::o;23886:189::-;23950:24;23962:2;23966:7;23950:11;:24::i;:::-;23997:11;;23995:13;;;;;;;;;;;24059:7;24055:2;24034:33;;24051:1;24034:33;;;;;;;;;;;;23886:189;;:::o;3846:1484::-;3907:13;3933:14;3962:1;3950:2;:9;:13;;;;;;3933:30;;3974:14;4007:1;4003;3991:2;:9;:13;;;;;;:17;3974:34;;4019:19;4099:1;4089:6;4085:1;:10;4084:16;;;;;;4071:1;4061:6;:11;;:19;;4079:1;4061:19;;;4075:1;4061:19;4051:30;;:6;:30;:49;4041:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4019:82;;4122:9;4146;4170:389;4182:6;4177:1;:11;4170:389;;4219:17;;;;;;;;;;;;;;;;;4252:1;4243:2;4246:1;4243:5;;;;;;;;;;;;;;;;:10;;;;;4237:17;;4219:36;;;;;;;;;;;;;;;;;;4205:6;4212:3;;;;;;4205:11;;;;;;;;;;;:50;;;;;;;;;;;4284:17;;;;;;;;;;;;;;;;;4343:1;4330:2;4337:1;4333;:5;4330:9;;;;;;;;;;;;;;;;:14;;;;;4326:1;4317:4;4309:12;;:2;4312:1;4309:5;;;;;;;;;;;;;;;;:12;4308:19;;;;;:36;4302:43;;4284:62;;;;;;;;;;;;;;;;;;4270:6;4277:3;;;;;;4270:11;;;;;;;;;;;:76;;;;;;;;;;;4375:17;;;;;;;;;;;;;;;;;4438:1;4425:2;4432:1;4428;:5;4425:9;;;;;;;;;;;;;;;;:14;;;;;4421:1;4412:4;4400:16;;:2;4407:1;4403;:5;4400:9;;;;;;;;;;;;;;;;:16;4399:23;;;;;:40;4393:47;;4375:66;;;;;;;;;;;;;;;;;;4361:6;4368:3;;;;;;4361:11;;;;;;;;;;;:80;;;;;;;;;;;4470:17;;;;;;;;;;;;;;;;;4506:4;4494:16;;:2;4501:1;4497;:5;4494:9;;;;;;;;;;;;;;;;:16;4488:23;;4470:42;;;;;;;;;;;;;;;;;;4456:6;4463:3;;;;;;4456:11;;;;;;;;;;;:56;;;;;;;;;;;4546:1;4541:6;;;;4170:389;;;4593:1;4583:6;:11;4579:702;;4625:17;;;;;;;;;;;;;;;;;4658:1;4649:2;4652:1;4649:5;;;;;;;;;;;;;;;;:10;;;;;4643:17;;4625:36;;;;;;;;;;;;;;;;;;4611:6;4618:3;;;;;;4611:11;;;;;;;;;;;:50;;;;;;;;;;;4704:1;4694:6;:11;4690:580;;;4740:17;;;;;;;;;;;;;;;;;4799:1;4786:2;4793:1;4789;:5;4786:9;;;;;;;;;;;;;;;;:14;;;;;4782:1;4773:4;4765:12;;:2;4768:1;4765:5;;;;;;;;;;;;;;;;:12;4764:19;;;;;:36;4758:43;;4740:62;;;;;;;;;;;;;;;;;;4726:6;4733:3;;;;;;4726:11;;;;;;;;;;;:76;;;;;;;;;;;4835:17;;;;;;;;;;;;;;;;;4881:1;4872:4;4860:16;;:2;4867:1;4863;:5;4860:9;;;;;;;;;;;;;;;;:16;4859:23;;;;;4853:30;;4835:49;;;;;;;;;;;;;;;;;;4821:6;4828:3;;;;;;4821:11;;;;;;;;;;;:63;;;;;;;;;;;4917:17;;;;;;;;;;;;;;;;;4935:1;4917:20;;;;;;;;;;;;;;;;4903:6;4910:3;;;;;;4903:11;;;;;;;;;;;:34;;;;;;;;;;;4970:4;4956:18;;:6;4963:3;;;;;;4956:11;;;;;;;;;;;:18;;;;;;;;;;;4690:580;;;5029:17;;;;;;;;;;;;;;;;;5071:1;5062:4;5054:12;;:2;5057:1;5054:5;;;;;;;;;;;;;;;;:12;5053:19;;;;;5047:26;;5029:45;;;;;;;;;;;;;;;;;;5015:6;5022:3;;;;;;5015:11;;;;;;;;;;;:59;;;;;;;;;;;5107:17;;;;;;;;;;;;;;;;;5125:1;5107:20;;;;;;;;;;;;;;;;5093:6;5100:3;;;;;;5093:11;;;;;;;;;;;:34;;;;;;;;;;;5160:17;;;;;;;;;;;;;;;;;5178:1;5160:20;;;;;;;;;;;;;;;;5146:6;5153:3;;;;;;5146:11;;;;;;;;;;;:34;;;;;;;;;;;5213:4;5199:18;;:6;5206:3;;;;;;5199:11;;;;;;;;;;;:18;;;;;;;;;;;5250:4;5236:18;;:6;5243:3;;;;;;5236:11;;;;;;;;;;;:18;;;;;;;;;;;4690:580;4579:702;5315:6;5301:21;;;;;;;3846:1484;;;:::o;6847:577::-;6928:13;6968:15;6992:1;6968:26;;7005:15;7029:1;7005:26;;7042:15;7082:2;:9;7070:2;:9;:21;7060:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7042:50;;7113:11;7127:2;:9;7113:23;;7147:11;7161:2;:9;7147:23;;7181:9;7220;7215:77;7240:3;7235:1;:8;7215:77;;7275:2;7278:1;7275:5;;;;;;;;;;;;;;;;7265:2;7268:3;;;;;;7265:7;;;;;;;;;;;:15;;;;;;;;;;;7245:3;;;;;7215:77;;;;7307:9;7302:77;7327:3;7322:1;:8;7302:77;;7362:2;7365:1;7362:5;;;;;;;;;;;;;;;;7352:2;7355:3;;;;;;7352:7;;;;;;;;;;;:15;;;;;;;;;;;7332:3;;;;;7302:77;;;;7413:2;7399:17;;;;;;;;6847:577;;;;:::o;21377:594::-;21454:13;21470:11;:20;21482:7;21470:20;;;;;;;;;;;;21454:36;;21511:24;21538:11;:17;21550:4;21538:17;;;;;;;;;;;;;;;21511:44;;21566:17;21602:1;21586:6;:13;;;;:17;21566:37;;21687:19;21709:6;21716:9;21709:17;;;;;;;;;;;;;;;;21687:39;;21757:11;21741:6;21748:5;21741:13;;;;;;;;;;;;;;;:27;;;;21810:5;21783:11;:24;21795:11;21783:24;;;;;;;;;;;:32;;;;21850:6;:12;;;;;;;;;;;;;;;;;;;;;;;;21943:11;:20;21955:7;21943:20;;;;;;;;;;;;21936:27;;;;;;;;;;;21377:594;;;;;;:::o;22030:244::-;22100:24;22127:11;:15;22139:2;22127:15;;;;;;;;;;;;;;;22100:42;;22176:6;:13;;;;22153:11;:20;22165:7;22153:20;;;;;;;;;;;:36;;;;22200:6;22212:7;22200:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22264:2;22241:11;:20;22253:7;22241:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;22030:244;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://20971254a844a48ad9421dec38abf9e8a691ecc5151df0b40b3f3a22972a98c8
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading