ETH Price: $3,276.48 (-1.91%)

Token

MetaStonez: Origins (OSZ)
 

Overview

Max Total Supply

2,122 OSZ

Holders

630

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
passme.eth
Balance
3 OSZ
0x2227de445dbfd90712c48bcd74d492ccca1cb242
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MetaStonezNFT

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-11
*/

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.0;

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)



// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)



/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)



/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);

  function approve(address spender, uint256 value) external returns (bool success);

  function balanceOf(address owner) external view returns (uint256 balance);

  function decimals() external view returns (uint8 decimalPlaces);

  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

  function increaseApproval(address spender, uint256 subtractedValue) external;

  function name() external view returns (string memory tokenName);

  function symbol() external view returns (string memory tokenSymbol);

  function totalSupply() external view returns (uint256 totalTokensIssued);

  function transfer(address to, uint256 value) external returns (bool success);

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  ) external returns (bool success);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool success);
}

contract VRFRequestIDBase {
  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  ) internal pure returns (uint256) {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constuctor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {
  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
  function fulfillRandomness(bytes32 requestId, uint256 randomness) internal virtual;

  /**
   * @dev In order to keep backwards compatibility we have kept the user
   * seed field around. We remove the use of it because given that the blockhash
   * enters later, it overrides whatever randomness the used seed provides.
   * Given that it adds no security, and can easily lead to misunderstandings,
   * we have removed it from usage and can now provide a simpler API.
   */
  uint256 private constant USER_SEED_PLACEHOLDER = 0;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface internal immutable LINK;
  address private immutable vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 => uint256) /* keyHash */ /* nonce */
    private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(address _vrfCoordinator, address _link) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}

interface IDelegatedMintable {
  function mint(address recipient, uint256 tokenId) external;
  function mintMany(address recipient, uint256 tokenIdStart, uint256 count) external;
  function totalSupply() external view returns(uint256);
}
/// @title Vote checkpointing for an ERC-721 token

// LICENSE
// ERC721Checkpointable.sol uses and modifies part of Compound Lab's Comp.sol:
// https://github.com/compound-finance/compound-protocol/blob/ae4388e780a8d596d97619d9704a931a2752c2bc/contracts/Governance/Comp.sol
//
// Comp.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
// With modifications by Nounders DAO.
// Additional slight modification by Metastonez (see note below).
//
// Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
//
// MODIFICATIONS
// Checkpointing logic from Comp.sol has been used with the following modifications:
// - `delegates` is renamed to `_delegates` and is set to private
// - `delegates` is a public function that uses the `_delegates` mapping look-up, but unlike
//   Comp.sol, returns the delegator's own address if there is no delegate.
//   This avoids the delegator needing to "delegate to self" with an additional transaction
// - `_transferTokens()` is renamed `_beforeTokenTransfer()` and adapted to hook into OpenZeppelin's ERC721 hooks.
//
// METASTONEZ MODIFICATIONS
// - Uses base ERC721 from OZ instead of the modified version of ERC721Enumerable made by Nounders DAO.



// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)



// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)



// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)



/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)



/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)





/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)



/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)





/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


abstract contract ERC721Checkpointable is ERC721 {
    /// @notice Defines decimals as per ERC-20 convention to make integrations with 3rd party governance platforms easier
    uint8 public constant decimals = 0;

    /// @notice A record of each accounts delegate
    mapping(address => address) private _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

    /**
     * @notice The votes a delegator can delegate, which is the current balance of the delegator.
     * @dev Used when calling `_delegate()`
     */
    function votesToDelegate(address delegator) public view returns (uint96) {
        return safe96(balanceOf(delegator), "ERC721Checkpointable::votesToDelegate: amount exceeds 96 bits");
    }

    /**
     * @notice Overrides the standard `Comp.sol` delegates mapping to return
     * the delegator's own address if they haven't delegated.
     * This avoids having to delegate to oneself.
     */
    function delegates(address delegator) public view returns (address) {
        address current = _delegates[delegator];
        return current == address(0) ? delegator : current;
    }

    /**
     * @notice Adapted from `_transferTokens()` in `Comp.sol` to update delegate votes.
     * @dev hooks into OpenZeppelin's `ERC721._transfer`
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override {
        super._beforeTokenTransfer(from, to, tokenId);

        /// @notice Differs from `_transferTokens()` to use `delegates` override method to simulate auto-delegation
        _moveDelegates(delegates(from), delegates(to), 1);
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        if (delegatee == address(0)) delegatee = msg.sender;
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        bytes32 domainSeparator = keccak256(
            abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this))
        );
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "ERC721Checkpointable::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "ERC721Checkpointable::delegateBySig: invalid nonce");
        require(block.timestamp <= expiry, "ERC721Checkpointable::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint256 blockNumber) public view returns (uint96) {
        require(blockNumber < block.number, "ERC721Checkpointable::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        /// @notice differs from `_delegate()` in `Comp.sol` to use `delegates` override method to simulate auto-delegation
        address currentDelegate = delegates(delegator);

        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        uint96 amount = votesToDelegate(delegator);

        _moveDelegates(currentDelegate, delegatee, amount);
    }

    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint96 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint96 srcRepNew = sub96(srcRepOld, amount, "ERC721Checkpointable::_moveDelegates: amount underflows");
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint96 dstRepNew = add96(dstRepOld, amount, "ERC721Checkpointable::_moveDelegates: amount overflows");
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint96 oldVotes,
        uint96 newVotes
    ) internal {
        uint32 blockNumber = safe32(
            block.number,
            "ERC721Checkpointable::_writeCheckpoint: block number exceeds 32 bits"
        );

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    function add96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function getChainId() internal view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

contract MetaStonezNFT is Ownable, ERC721Checkpointable, IDelegatedMintable, VRFConsumerBase {
  using Strings for uint256;

  /**
   * @notice You are not authorized to mint.
   */
  error NotAuthorized();

  /**
   * @notice There are no more tokens left.
   */
  error SupplyExhausted();

  /**
   * @notice You tried to change the supply or metadata after they were frozen.
   */
  error Frozen();

  /**
   * @notice You tried to interact with a token that does not exist.
   */
  error NonexistentToken();

  /**
   * @notice You tried to set the shuffling entropy after it was already set.
   */
  error EntropyAlreadySet();

  /**
   * @notice The total number of tokens in existence.
   */
  uint256 public totalSupply;
  /**
   * @notice The maximum number of tokens that can ever exist.
   * Note that this number can be changed *unless* the contract is frozen (see below).
   */
  uint256 public maxSupply;

  /**
   * @notice Whether or not the metadata and supply have been frozen.
   */
  bool public frozen;
  /**
   * @notice An index of contracts that are allowed to mint new tokens.
   */
  mapping(address => bool) public minters;

  /**
   * @notice Prereveal metadata.
   * Note that this can be changed *unless* the contract is frozen (see above).
   */
  string public prerevealURI;
  /**
   * @notice Token metadata base URI.
   * Note that this can be changed *unless* the contract is frozen (see above).
   */
  string public baseURI;
  /**
   * @notice Network-specific Chainlink key hash.
   */
  bytes32 public LINK_KEY_HASH;
  /**
   * @notice Entropy used for shuffling token IDs.
   */
  uint256 public entropy;

  constructor(
    string memory _name,
    string memory _symbol,
    uint256 _maxSupply,
    bytes32 _LINK_KEY_HASH,
    address _LINK_ADDRESS,
    address _LINK_VRF_COORDINATOR_ADDRESS
  )
    ERC721(_name, _symbol)
    VRFConsumerBase(_LINK_VRF_COORDINATOR_ADDRESS, _LINK_ADDRESS)
  {
    maxSupply = _maxSupply;
    LINK_KEY_HASH = _LINK_KEY_HASH;
  }

  /**
   * @notice Mints a new token.
   *
   * New tokens can only be minted by authorized contracts, and only up to
   * a specified maximum supply.
   * Minting **cannot** be paused. Minting contracts should implement this
   * functionality if desired.
   */
  function mint(address recipient, uint256 tokenId) external override {
    if (!minters[msg.sender]) {
      revert NotAuthorized();
    }

    totalSupply += 1;
    if (totalSupply > maxSupply) {
      revert SupplyExhausted();
    }

    _safeMint(recipient, tokenId);
  }

  /**
   * @notice Mints new tokens.
   *
   * New tokens can only be minted by authorized contracts, and only up to
   * a specified maximum supply.
   * Minting **cannot** be paused. Minting contracts should implement this
   * functionality if desired.
   */ 
  function mintMany(address recipient, uint256 tokenIdStart, uint256 count) external override {
    if (!minters[msg.sender]) {
      revert NotAuthorized();
    }

    totalSupply += count;
    if (totalSupply > maxSupply) {
      revert SupplyExhausted();
    }

    for (uint256 i = 0; i < count; i++) {
      _safeMint(recipient, tokenIdStart + i);
    }
  }

  /**
   * @notice Adds or removes a minter contract.
   */
  function approveMinter(address minter, bool approve) external onlyOwner {
    minters[minter] = approve;
  }

  /**
   * @notice Sets the URI to the prereveal metadata.
   */
  function setPrerevealURI(string calldata newPrerevealURI) external onlyOwner {
    if (frozen) {
      revert Frozen();
    }

    prerevealURI = newPrerevealURI;
  }

  /**
   * @notice Sets base URI of token metadata. **Forward slash is automatically inserted.**
   */
  function setBaseURI(string calldata newBaseURI) external onlyOwner {
    if (frozen) {
      revert Frozen();
    }

    baseURI = newBaseURI;
  }

  /**
   * @notice Sets the maximum supply to the current total supply.
   */
  function shrinkMaxSupply() external onlyOwner {
    if (frozen) {
      revert Frozen();
    }

    maxSupply = totalSupply;
  }

  /**
   * @notice Freezes metadata and max supply.
   */
  function freezeSupplyAndMetadata() external onlyOwner {
    frozen = true;
  }

  /**
   * @notice Set the entropy used to shuffle the token IDs.
   */
  function setEntropy(
    uint256 _entropy
  ) external onlyOwner {
    if (entropy != 0) {
      revert EntropyAlreadySet();
    }

    entropy = _entropy;
  }

  /**
   * @notice Reveal the metadata
   */
  function reveal(
    string calldata newBaseURI,
    uint256 linkFee
  ) external onlyOwner returns (bytes32 requestId) {
    if (entropy != 0) {
      revert EntropyAlreadySet();
    }
    baseURI = newBaseURI;

    return requestRandomness(LINK_KEY_HASH, linkFee);
  }

  function fulfillRandomness(bytes32, uint256 _entropy) internal override {
    entropy = _entropy;
  }

  /**
   * @notice Get the metadata URI of a token.
   */
  function tokenURI(uint256 tokenId) public view override returns (string memory) {
    if (!_exists(tokenId)) {
      revert NonexistentToken();
    }

    if (entropy == 0 || bytes(baseURI).length == 0) {
      return prerevealURI;
    }

    return string(
      abi.encodePacked(
        baseURI,
        "/",
        uint256(
          computeShuffledIndex(
            uint64(tokenId),
            uint64(maxSupply),
            keccak256(abi.encode(entropy))
          )
        ).toString(),
        ".json"
      )
    );
  }

  /**
   * @dev An implementation of the swap-or-not algorithm based on
   * the implementation in the [Eth2 consesus spec](https://github.com/ethereum/consensus-specs/blob/v0.12.2/specs/phase0/beacon-chain.md#compute_shuffled_index)
   */
  function computeShuffledIndex(
    uint64 index,
    uint64 indexCount,
    bytes32 seed
  )
    public
    pure
    returns (uint64)
  {
    require(index < indexCount, "SwapOrNot: INVALID_PARAMS");

    for (
      uint8 currentRound = 0;
      currentRound < 24;
      currentRound++
    ) {
      uint64 pivot = uint64(uint(keccak256(abi.encodePacked(seed, currentRound)))) % indexCount;
      uint64 flip = (pivot + indexCount - index) % indexCount;
      uint64 position = index > flip ? index : flip;
      bytes32 source = keccak256(
        abi.encodePacked(seed, currentRound, position / 256)
      );
      uint8 byt = uint8(source[(position % 256) / 8]);
      uint8 bit = (byt >> (position % 8)) % 2;

      if (bit > 0) {
        index = flip;
      }
    }

    return index;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"bytes32","name":"_LINK_KEY_HASH","type":"bytes32"},{"internalType":"address","name":"_LINK_ADDRESS","type":"address"},{"internalType":"address","name":"_LINK_VRF_COORDINATOR_ADDRESS","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EntropyAlreadySet","type":"error"},{"inputs":[],"name":"Frozen","type":"error"},{"inputs":[],"name":"NonexistentToken","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"SupplyExhausted","type":"error"},{"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":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LINK_KEY_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bool","name":"approve","type":"bool"}],"name":"approveMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"index","type":"uint64"},{"internalType":"uint64","name":"indexCount","type":"uint64"},{"internalType":"bytes32","name":"seed","type":"bytes32"}],"name":"computeShuffledIndex","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entropy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeSupplyAndMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenIdStart","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prerevealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"},{"internalType":"uint256","name":"linkFee","type":"uint256"}],"name":"reveal","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_entropy","type":"uint256"}],"name":"setEntropy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newPrerevealURI","type":"string"}],"name":"setPrerevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shrinkMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"votesToDelegate","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b506040516200456538038062004565833981016040819052620000349162000277565b80828787620000433362000097565b815162000058906001906020850190620000e7565b5080516200006e906002906020840190620000e7565b5050506001600160a01b0391821660a052166080525050600d9190915560125550620003559050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000f59062000318565b90600052602060002090601f01602090048101928262000119576000855562000164565b82601f106200013457805160ff191683800117855562000164565b8280016001018555821562000164579182015b828111156200016457825182559160200191906001019062000147565b506200017292915062000176565b5090565b5b8082111562000172576000815560010162000177565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001b557600080fd5b81516001600160401b0380821115620001d257620001d26200018d565b604051601f8301601f19908116603f01168101908282118183101715620001fd57620001fd6200018d565b816040528381526020925086838588010111156200021a57600080fd5b600091505b838210156200023e57858201830151818301840152908201906200021f565b83821115620002505760008385830101525b9695505050505050565b80516001600160a01b03811681146200027257600080fd5b919050565b60008060008060008060c087890312156200029157600080fd5b86516001600160401b0380821115620002a957600080fd5b620002b78a838b01620001a3565b97506020890151915080821115620002ce57600080fd5b50620002dd89828a01620001a3565b9550506040870151935060608701519250620002fc608088016200025a565b91506200030c60a088016200025a565b90509295509295509295565b600181811c908216806200032d57607f821691505b602082108114156200034f57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516141e3620003826000396000818161176101526127820152600061274601526141e36000f3fe608060405234801561001057600080fd5b50600436106103155760003560e01c806370a08231116101a7578063c3cda520116100ee578063e7a324dc11610097578063f1127ed811610071578063f1127ed814610715578063f2fde38b14610787578063f46eccc41461079a57600080fd5b8063e7a324dc14610692578063e9580e91146106b9578063e985e9c5146106cc57600080fd5b8063d5abeb01116100c8578063d5abeb0114610678578063d62280b214610681578063dfbc63e21461068957600080fd5b8063c3cda5201461063f578063c87b56dd14610652578063cdcfb01a1461066557600080fd5b806394985ddd11610150578063a22cb4651161012a578063a22cb46514610606578063b4b5ea5714610619578063b88d4fde1461062c57600080fd5b806394985ddd146105bf57806395d89b41146105d25780639adab764146105da57600080fd5b80637ecebe00116101815780637ecebe00146105795780638870d061146105995780638da5cb5b146105a157600080fd5b806370a082311461052e578063715018a614610541578063782d6fe11461054957600080fd5b8063313ce5671161026b5780635c19a95c116102145780636c0360eb116101ee5780636c0360eb146104d85780636fcfff45146104e0578063708b47301461051b57600080fd5b80635c19a95c146104aa5780635ee4e7a2146104bd5780636352211e146104c557600080fd5b806347ce07cc1161024557806347ce07cc1461047b57806355f804b314610484578063587cde1e1461049757600080fd5b8063313ce5671461043b57806340c10f191461045557806342842e0e1461046857600080fd5b8063095ea7b3116102cd57806323b872dd116102a757806323b872dd1461040257806328dadb8f1461041557806328f836f21461042857600080fd5b8063095ea7b3146103b157806318160ddd146103c457806320606b70146103db57600080fd5b806306fdde03116102fe57806306fdde031461034f578063078eef2814610364578063081812fc1461037957600080fd5b806301ffc9a71461031a578063054f7d9c14610342575b600080fd5b61032d6103283660046136b1565b6107bd565b60405190151581526020015b60405180910390f35b600e5461032d9060ff1681565b6103576108a2565b6040516103399190613744565b6103776103723660046137a0565b610934565b005b61038c6103873660046137e2565b6109ee565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610339565b6103776103bf366004613824565b610aae565b6103cd600c5481565b604051908152602001610339565b6103cd7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b61037761041036600461384e565b610c02565b61037761042336600461388a565b610c89565b6103776104363660046138cb565b610d5d565b610443600081565b60405160ff9091168152602001610339565b610377610463366004613824565b610e1a565b61037761047636600461384e565b610ec7565b6103cd60135481565b6103776104923660046137a0565b610ee2565b61038c6104a5366004613902565b610f92565b6103776104b8366004613902565b610fd1565b610377610ffc565b61038c6104d33660046137e2565b611090565b610357611128565b6105066104ee366004613902565b60096020526000908152604090205463ffffffff1681565b60405163ffffffff9091168152602001610339565b6103cd61052936600461391d565b6111b6565b6103cd61053c366004613902565b611279565b61037761132d565b61055c610557366004613824565b6113a0565b6040516bffffffffffffffffffffffff9091168152602001610339565b6103cd610587366004613902565b600a6020526000908152604090205481565b61037761169d565b60005473ffffffffffffffffffffffffffffffffffffffff1661038c565b6103776105cd366004613969565b611749565b6103576117d4565b6105ed6105e83660046139a3565b6117e3565b60405167ffffffffffffffff9091168152602001610339565b6103776106143660046138cb565b611a34565b61055c610627366004613902565b611a3f565b61037761063a3660046139fe565b611adc565b61037761064d366004613af8565b611b64565b6103576106603660046137e2565b611ef9565b6103776106733660046137e2565b61207b565b6103cd600d5481565b610357612121565b6103cd60125481565b6103cd7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b61055c6106c7366004613902565b61212e565b61032d6106da366004613b58565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b61075e610723366004613b8b565b600860209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b6040805163ffffffff90931683526bffffffffffffffffffffffff909116602083015201610339565b610377610795366004613902565b61215a565b61032d6107a8366004613902565b600f6020526000908152604090205460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061085057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061089c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600180546108b190613bc0565b80601f01602080910402602001604051908101604052809291908181526020018280546108dd90613bc0565b801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600e5460ff16156109dd576040517fa8cab3d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109e9601083836135cc565b505050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610a855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610997565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610ab982611090565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610997565b3373ffffffffffffffffffffffffffffffffffffffff82161480610b865750610b8681336106da565b610bf85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610997565b6109e98383612253565b610c0c33826122f3565b610c7e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610997565b6109e9838383612445565b336000908152600f602052604090205460ff16610cd2576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c6000828254610ce49190613c43565b9091555050600d54600c541115610d27576040517fed227a6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610d5757610d4584610d408386613c43565b612683565b80610d4f81613c5b565b915050610d2a565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dc45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b336000908152600f602052604090205460ff16610e63576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600c6000828254610e769190613c43565b9091555050600d54600c541115610eb9576040517fed227a6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ec38282612683565b5050565b6109e983838360405180602001604052806000815250611adc565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b600e5460ff1615610f86576040517fa8cab3d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109e9601183836135cc565b73ffffffffffffffffffffffffffffffffffffffff8082166000908152600760205260408120549091168015610fc85780610fca565b825b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116610fef5750335b610ff9338261269d565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff168061089c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610997565b6011805461113590613bc0565b80601f016020809104026020016040519081016040528092919081815260200182805461116190613bc0565b80156111ae5780601f10611183576101008083540402835291602001916111ae565b820191906000526020600020905b81548152906001019060200180831161119157829003601f168201915b505050505081565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461121e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b60135415611258576040517f411354e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611264601185856135cc565b5061127160125483612742565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff82166113045760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610997565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b61139e60006128cb565b565b60004382106114175760405162461bcd60e51b815260206004820152603760248201527f455243373231436865636b706f696e7461626c653a3a6765745072696f72566f60448201527f7465733a206e6f74207965742064657465726d696e65640000000000000000006064820152608401610997565b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205463ffffffff168061145257600091505061089c565b73ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081208491611484600185613c94565b63ffffffff9081168252602082019290925260400160002054161161150a5773ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260408120906114d4600184613c94565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff16915061089c9050565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020908152604080832083805290915290205463ffffffff1683101561155257600091505061089c565b600080611560600184613c94565b90505b8163ffffffff168163ffffffff16111561164557600060026115858484613c94565b61158f9190613ce8565b6115999083613c94565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260086020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff16918101919091529192508714156116195760200151945061089c9350505050565b805163ffffffff168711156116305781935061163e565b61163b600183613c94565b92505b5050611563565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b600e5460ff1615611741576040517fa8cab3d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c54600d55565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146117ce5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610997565b60135550565b6060600280546108b190613bc0565b60008267ffffffffffffffff168467ffffffffffffffff16106118485760405162461bcd60e51b815260206004820152601960248201527f537761704f724e6f743a20494e56414c49445f504152414d53000000000000006044820152606401610997565b60005b60188160ff161015611a2b57600084848360405160200161189b92919091825260f81b7fff0000000000000000000000000000000000000000000000000000000000000016602082015260210190565b6040516020818303038152906040528051906020012060001c6118be9190613d0b565b9050600085876118ce8285613d32565b6118d89190613d5e565b6118e29190613d0b565b905060008167ffffffffffffffff168867ffffffffffffffff16116119075781611909565b875b90506000868561191b61010085613d7f565b6040516020016119889392919092835260f89190911b7fff0000000000000000000000000000000000000000000000000000000000000016602083015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016602182015260290190565b6040516020818303038152906040528051906020012090506000816008610100856119b39190613d0b565b6119bd9190613d7f565b67ffffffffffffffff16602081106119d7576119d7613d9a565b1a9050600060026119e9600886613d0b565b67ffffffffffffffff168360ff16901c611a039190613dc9565b905060ff811615611a1257849a505b5050505050508080611a2390613deb565b91505061184b565b50929392505050565b610ec3338383612940565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081205463ffffffff1680611a77576000610fca565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040812090611aa8600184613c94565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169392505050565b611ae633836122f3565b611b585760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610997565b610d5784848484612a54565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611b8f6108a2565b80519060200120611b9d4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c084015273ffffffffffffffffffffffffffffffffffffffff8b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401909252815191909301207f1901000000000000000000000000000000000000000000000000000000000000610160830152610162820183905261018282018190529192506000906101a201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611d0f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611dc35760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964207369676e6174757265000000000000000000006064820152608401610997565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120805491611df483613c5b565b919050558914611e6c5760405162461bcd60e51b815260206004820152603260248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964206e6f6e636500000000000000000000000000006064820152608401610997565b87421115611ee25760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a207369676e61747572652065787069726564000000000000000000006064820152608401610997565b611eec818b61269d565b505050505b505050505050565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611f57576040517fb1d04f0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6013541580611f72575060118054611f6e90613bc0565b1590505b156120095760108054611f8490613bc0565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb090613bc0565b8015611ffd5780601f10611fd257610100808354040283529160200191611ffd565b820191906000526020600020905b815481529060010190602001808311611fe057829003601f168201915b50505050509050919050565b601161205461204584600d5460135460405160200161202a91815260200190565b604051602081830303815290604052805190602001206117e3565b67ffffffffffffffff16612add565b604051602001612065929190613e27565b6040516020818303038152906040529050919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b6013541561211c576040517f411354e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601355565b6010805461113590613bc0565b600061089c61213c83611279565b6040518060600160405280603d815260200161413a603d9139612c0f565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b73ffffffffffffffffffffffffffffffffffffffff811661224a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610997565b610ff9816128cb565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906122ad82611090565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1661238a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610997565b600061239583611090565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240457508373ffffffffffffffffffffffffffffffffffffffff166123ec846109ee565b73ffffffffffffffffffffffffffffffffffffffff16145b80611271575073ffffffffffffffffffffffffffffffffffffffff80821660009081526006602090815260408083209388168352929052205460ff16611271565b8273ffffffffffffffffffffffffffffffffffffffff1661246582611090565b73ffffffffffffffffffffffffffffffffffffffff16146124ee5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610997565b73ffffffffffffffffffffffffffffffffffffffff82166125765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610997565b612581838383612c47565b61258c600082612253565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602052604081208054600192906125c2908490613f5d565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906125fd908490613c43565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610ec3828260405180602001604052806000815250612c63565b60006126a883610f92565b73ffffffffffffffffffffffffffffffffffffffff84811660008181526007602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a460006127358461212e565b9050610d57828483612cec565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f0000000000000000000000000000000000000000000000000000000000000000848660006040516020016127bf929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016127ec93929190613f74565b6020604051808303816000875af115801561280b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282f9190613fa9565b506000838152600b6020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a09091019092528151918301919091209387905291905261288b906001613c43565b6000858152600b60205260409020556112718482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129bc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610997565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612a5f848484612445565b612a6b84848484612f11565b610d575760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610997565b606081612b1d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612b475780612b3181613c5b565b9150612b409050600a83613fc6565b9150612b21565b60008167ffffffffffffffff811115612b6257612b626139cf565b6040519080825280601f01601f191660200182016040528015612b8c576020820181803683370190505b5090505b841561127157612ba1600183613f5d565b9150612bae600a86613fda565b612bb9906030613c43565b60f81b818381518110612bce57612bce613d9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c08600a86613fc6565b9450612b90565b6000816c010000000000000000000000008410612c3f5760405162461bcd60e51b81526004016109979190613744565b509192915050565b6109e9612c5384610f92565b612c5c84610f92565b6001612cec565b612c6d83836130e4565b612c7a6000848484612f11565b6109e95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610997565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d3657506000816bffffffffffffffffffffffff16115b156109e95773ffffffffffffffffffffffffffffffffffffffff831615612e285773ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604081205463ffffffff169081612d90576000612def565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812090612dc1600185613c94565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b90506000612e1682856040518060600160405280603781526020016141776037913961327e565b9050612e24868484846132ca565b5050505b73ffffffffffffffffffffffffffffffffffffffff8216156109e95773ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604081205463ffffffff169081612e7d576000612edc565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812090612eae600185613c94565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b90506000612f0382856040518060600160405280603681526020016140c06036913961354d565b9050611ef1858484846132ca565b600073ffffffffffffffffffffffffffffffffffffffff84163b156130dc576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612f88903390899088908890600401613fee565b6020604051808303816000875af1925050508015612fe1575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612fde91810190614037565b60015b613091573d80801561300f576040519150601f19603f3d011682016040523d82523d6000602084013e613014565b606091505b5080516130895760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610997565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611271565b506001611271565b73ffffffffffffffffffffffffffffffffffffffff82166131475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610997565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156131b95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610997565b6131c560008383612c47565b73ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906131fb908490613c43565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff16111582906132bf5760405162461bcd60e51b81526004016109979190613744565b506112718385614054565b60006132ee436040518060800160405280604481526020016140f6604491396135a4565b905060008463ffffffff16118015613355575073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812063ffffffff831691613339600188613c94565b63ffffffff908116825260208201929092526040016000205416145b156133eb5773ffffffffffffffffffffffffffffffffffffffff85166000908152600860205260408120839161338c600188613c94565b63ffffffff168152602081019190915260400160002080546bffffffffffffffffffffffff92909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff9092169190911790556134e6565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000908152600882528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691161791909117905561348d846001614079565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b604080516bffffffffffffffffffffffff80861682528416602082015273ffffffffffffffffffffffffffffffffffffffff8716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b60008061355a8486614098565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff161015839061359b5760405162461bcd60e51b81526004016109979190613744565b50949350505050565b6000816401000000008410612c3f5760405162461bcd60e51b81526004016109979190613744565b8280546135d890613bc0565b90600052602060002090601f0160209004810192826135fa576000855561365e565b82601f10613631578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561365e565b8280016001018555821561365e579182015b8281111561365e578235825591602001919060010190613643565b5061366a92915061366e565b5090565b5b8082111561366a576000815560010161366f565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ff957600080fd5b6000602082840312156136c357600080fd5b8135610fca81613683565b60005b838110156136e95781810151838201526020016136d1565b83811115610d575750506000910152565b600081518084526137128160208601602086016136ce565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610fca60208301846136fa565b60008083601f84011261376957600080fd5b50813567ffffffffffffffff81111561378157600080fd5b60208301915083602082850101111561379957600080fd5b9250929050565b600080602083850312156137b357600080fd5b823567ffffffffffffffff8111156137ca57600080fd5b6137d685828601613757565b90969095509350505050565b6000602082840312156137f457600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461381f57600080fd5b919050565b6000806040838503121561383757600080fd5b613840836137fb565b946020939093013593505050565b60008060006060848603121561386357600080fd5b61386c846137fb565b925061387a602085016137fb565b9150604084013590509250925092565b60008060006060848603121561389f57600080fd5b6138a8846137fb565b95602085013595506040909401359392505050565b8015158114610ff957600080fd5b600080604083850312156138de57600080fd5b6138e7836137fb565b915060208301356138f7816138bd565b809150509250929050565b60006020828403121561391457600080fd5b610fca826137fb565b60008060006040848603121561393257600080fd5b833567ffffffffffffffff81111561394957600080fd5b61395586828701613757565b909790965060209590950135949350505050565b6000806040838503121561397c57600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461381f57600080fd5b6000806000606084860312156139b857600080fd5b6139c18461398b565b925061387a6020850161398b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060008060808587031215613a1457600080fd5b613a1d856137fb565b9350613a2b602086016137fb565b925060408501359150606085013567ffffffffffffffff80821115613a4f57600080fd5b818701915087601f830112613a6357600080fd5b813581811115613a7557613a756139cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715613abb57613abb6139cf565b816040528281528a6020848701011115613ad457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060008060c08789031215613b1157600080fd5b613b1a876137fb565b95506020870135945060408701359350606087013560ff81168114613b3e57600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215613b6b57600080fd5b613b74836137fb565b9150613b82602084016137fb565b90509250929050565b60008060408385031215613b9e57600080fd5b613ba7836137fb565b9150602083013563ffffffff811681146138f757600080fd5b600181811c90821680613bd457607f821691505b60208210811415613c0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613c5657613c56613c14565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8d57613c8d613c14565b5060010190565b600063ffffffff83811690831681811015613cb157613cb1613c14565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff80841680613cff57613cff613cb9565b92169190910492915050565b600067ffffffffffffffff80841680613d2657613d26613cb9565b92169190910692915050565b600067ffffffffffffffff808316818516808303821115613d5557613d55613c14565b01949350505050565b600067ffffffffffffffff83811690831681811015613cb157613cb1613c14565b600067ffffffffffffffff80841680613cff57613cff613cb9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680613ddc57613ddc613cb9565b8060ff84160691505092915050565b600060ff821660ff811415613e0257613e02613c14565b60010192915050565b60008151613e1d8185602086016136ce565b9290920192915050565b600080845481600182811c915080831680613e4357607f831692505b6020808410821415613e7c577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613e905760018114613ebf57613eec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613eec565b60008b81526020902060005b86811015613ee45781548b820152908501908301613ecb565b505084890196505b505050505050613f54613f2b613f25837f2f00000000000000000000000000000000000000000000000000000000000000815260010190565b86613e0b565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b600082821015613f6f57613f6f613c14565b500390565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000613f5460608301846136fa565b600060208284031215613fbb57600080fd5b8151610fca816138bd565b600082613fd557613fd5613cb9565b500490565b600082613fe957613fe9613cb9565b500690565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261402d60808301846136fa565b9695505050505050565b60006020828403121561404957600080fd5b8151610fca81613683565b60006bffffffffffffffffffffffff83811690831681811015613cb157613cb1613c14565b600063ffffffff808316818516808303821115613d5557613d55613c14565b60006bffffffffffffffffffffffff808316818516808303821115613d5557613d55613c1456fe455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f7773455243373231436865636b706f696e7461626c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473455243373231436865636b706f696e7461626c653a3a766f746573546f44656c65676174653a20616d6f756e7420657863656564732039362062697473455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f7773a26469706673582212209814a71c587e6deb4d23886504260c89453cb7ad4502fcda41c5244aadcadc8364736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001853aa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795200000000000000000000000000000000000000000000000000000000000000134d65746153746f6e657a3a204f726967696e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f535a0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103155760003560e01c806370a08231116101a7578063c3cda520116100ee578063e7a324dc11610097578063f1127ed811610071578063f1127ed814610715578063f2fde38b14610787578063f46eccc41461079a57600080fd5b8063e7a324dc14610692578063e9580e91146106b9578063e985e9c5146106cc57600080fd5b8063d5abeb01116100c8578063d5abeb0114610678578063d62280b214610681578063dfbc63e21461068957600080fd5b8063c3cda5201461063f578063c87b56dd14610652578063cdcfb01a1461066557600080fd5b806394985ddd11610150578063a22cb4651161012a578063a22cb46514610606578063b4b5ea5714610619578063b88d4fde1461062c57600080fd5b806394985ddd146105bf57806395d89b41146105d25780639adab764146105da57600080fd5b80637ecebe00116101815780637ecebe00146105795780638870d061146105995780638da5cb5b146105a157600080fd5b806370a082311461052e578063715018a614610541578063782d6fe11461054957600080fd5b8063313ce5671161026b5780635c19a95c116102145780636c0360eb116101ee5780636c0360eb146104d85780636fcfff45146104e0578063708b47301461051b57600080fd5b80635c19a95c146104aa5780635ee4e7a2146104bd5780636352211e146104c557600080fd5b806347ce07cc1161024557806347ce07cc1461047b57806355f804b314610484578063587cde1e1461049757600080fd5b8063313ce5671461043b57806340c10f191461045557806342842e0e1461046857600080fd5b8063095ea7b3116102cd57806323b872dd116102a757806323b872dd1461040257806328dadb8f1461041557806328f836f21461042857600080fd5b8063095ea7b3146103b157806318160ddd146103c457806320606b70146103db57600080fd5b806306fdde03116102fe57806306fdde031461034f578063078eef2814610364578063081812fc1461037957600080fd5b806301ffc9a71461031a578063054f7d9c14610342575b600080fd5b61032d6103283660046136b1565b6107bd565b60405190151581526020015b60405180910390f35b600e5461032d9060ff1681565b6103576108a2565b6040516103399190613744565b6103776103723660046137a0565b610934565b005b61038c6103873660046137e2565b6109ee565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610339565b6103776103bf366004613824565b610aae565b6103cd600c5481565b604051908152602001610339565b6103cd7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b61037761041036600461384e565b610c02565b61037761042336600461388a565b610c89565b6103776104363660046138cb565b610d5d565b610443600081565b60405160ff9091168152602001610339565b610377610463366004613824565b610e1a565b61037761047636600461384e565b610ec7565b6103cd60135481565b6103776104923660046137a0565b610ee2565b61038c6104a5366004613902565b610f92565b6103776104b8366004613902565b610fd1565b610377610ffc565b61038c6104d33660046137e2565b611090565b610357611128565b6105066104ee366004613902565b60096020526000908152604090205463ffffffff1681565b60405163ffffffff9091168152602001610339565b6103cd61052936600461391d565b6111b6565b6103cd61053c366004613902565b611279565b61037761132d565b61055c610557366004613824565b6113a0565b6040516bffffffffffffffffffffffff9091168152602001610339565b6103cd610587366004613902565b600a6020526000908152604090205481565b61037761169d565b60005473ffffffffffffffffffffffffffffffffffffffff1661038c565b6103776105cd366004613969565b611749565b6103576117d4565b6105ed6105e83660046139a3565b6117e3565b60405167ffffffffffffffff9091168152602001610339565b6103776106143660046138cb565b611a34565b61055c610627366004613902565b611a3f565b61037761063a3660046139fe565b611adc565b61037761064d366004613af8565b611b64565b6103576106603660046137e2565b611ef9565b6103776106733660046137e2565b61207b565b6103cd600d5481565b610357612121565b6103cd60125481565b6103cd7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b61055c6106c7366004613902565b61212e565b61032d6106da366004613b58565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b61075e610723366004613b8b565b600860209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b6040805163ffffffff90931683526bffffffffffffffffffffffff909116602083015201610339565b610377610795366004613902565b61215a565b61032d6107a8366004613902565b600f6020526000908152604090205460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061085057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061089c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600180546108b190613bc0565b80601f01602080910402602001604051908101604052809291908181526020018280546108dd90613bc0565b801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600e5460ff16156109dd576040517fa8cab3d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109e9601083836135cc565b505050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610a855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610997565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610ab982611090565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610997565b3373ffffffffffffffffffffffffffffffffffffffff82161480610b865750610b8681336106da565b610bf85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610997565b6109e98383612253565b610c0c33826122f3565b610c7e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610997565b6109e9838383612445565b336000908152600f602052604090205460ff16610cd2576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c6000828254610ce49190613c43565b9091555050600d54600c541115610d27576040517fed227a6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610d5757610d4584610d408386613c43565b612683565b80610d4f81613c5b565b915050610d2a565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dc45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b336000908152600f602052604090205460ff16610e63576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600c6000828254610e769190613c43565b9091555050600d54600c541115610eb9576040517fed227a6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ec38282612683565b5050565b6109e983838360405180602001604052806000815250611adc565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b600e5460ff1615610f86576040517fa8cab3d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109e9601183836135cc565b73ffffffffffffffffffffffffffffffffffffffff8082166000908152600760205260408120549091168015610fc85780610fca565b825b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116610fef5750335b610ff9338261269d565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff168061089c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610997565b6011805461113590613bc0565b80601f016020809104026020016040519081016040528092919081815260200182805461116190613bc0565b80156111ae5780601f10611183576101008083540402835291602001916111ae565b820191906000526020600020905b81548152906001019060200180831161119157829003601f168201915b505050505081565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461121e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b60135415611258576040517f411354e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611264601185856135cc565b5061127160125483612742565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff82166113045760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610997565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b61139e60006128cb565b565b60004382106114175760405162461bcd60e51b815260206004820152603760248201527f455243373231436865636b706f696e7461626c653a3a6765745072696f72566f60448201527f7465733a206e6f74207965742064657465726d696e65640000000000000000006064820152608401610997565b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205463ffffffff168061145257600091505061089c565b73ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081208491611484600185613c94565b63ffffffff9081168252602082019290925260400160002054161161150a5773ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260408120906114d4600184613c94565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff16915061089c9050565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020908152604080832083805290915290205463ffffffff1683101561155257600091505061089c565b600080611560600184613c94565b90505b8163ffffffff168163ffffffff16111561164557600060026115858484613c94565b61158f9190613ce8565b6115999083613c94565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260086020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff16918101919091529192508714156116195760200151945061089c9350505050565b805163ffffffff168711156116305781935061163e565b61163b600183613c94565b92505b5050611563565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b600e5460ff1615611741576040517fa8cab3d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c54600d55565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795216146117ce5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610997565b60135550565b6060600280546108b190613bc0565b60008267ffffffffffffffff168467ffffffffffffffff16106118485760405162461bcd60e51b815260206004820152601960248201527f537761704f724e6f743a20494e56414c49445f504152414d53000000000000006044820152606401610997565b60005b60188160ff161015611a2b57600084848360405160200161189b92919091825260f81b7fff0000000000000000000000000000000000000000000000000000000000000016602082015260210190565b6040516020818303038152906040528051906020012060001c6118be9190613d0b565b9050600085876118ce8285613d32565b6118d89190613d5e565b6118e29190613d0b565b905060008167ffffffffffffffff168867ffffffffffffffff16116119075781611909565b875b90506000868561191b61010085613d7f565b6040516020016119889392919092835260f89190911b7fff0000000000000000000000000000000000000000000000000000000000000016602083015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016602182015260290190565b6040516020818303038152906040528051906020012090506000816008610100856119b39190613d0b565b6119bd9190613d7f565b67ffffffffffffffff16602081106119d7576119d7613d9a565b1a9050600060026119e9600886613d0b565b67ffffffffffffffff168360ff16901c611a039190613dc9565b905060ff811615611a1257849a505b5050505050508080611a2390613deb565b91505061184b565b50929392505050565b610ec3338383612940565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081205463ffffffff1680611a77576000610fca565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040812090611aa8600184613c94565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169392505050565b611ae633836122f3565b611b585760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610997565b610d5784848484612a54565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611b8f6108a2565b80519060200120611b9d4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c084015273ffffffffffffffffffffffffffffffffffffffff8b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401909252815191909301207f1901000000000000000000000000000000000000000000000000000000000000610160830152610162820183905261018282018190529192506000906101a201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611d0f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611dc35760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964207369676e6174757265000000000000000000006064820152608401610997565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120805491611df483613c5b565b919050558914611e6c5760405162461bcd60e51b815260206004820152603260248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964206e6f6e636500000000000000000000000000006064820152608401610997565b87421115611ee25760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a207369676e61747572652065787069726564000000000000000000006064820152608401610997565b611eec818b61269d565b505050505b505050505050565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611f57576040517fb1d04f0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6013541580611f72575060118054611f6e90613bc0565b1590505b156120095760108054611f8490613bc0565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb090613bc0565b8015611ffd5780601f10611fd257610100808354040283529160200191611ffd565b820191906000526020600020905b815481529060010190602001808311611fe057829003601f168201915b50505050509050919050565b601161205461204584600d5460135460405160200161202a91815260200190565b604051602081830303815290604052805190602001206117e3565b67ffffffffffffffff16612add565b604051602001612065929190613e27565b6040516020818303038152906040529050919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b6013541561211c576040517f411354e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601355565b6010805461113590613bc0565b600061089c61213c83611279565b6040518060600160405280603d815260200161413a603d9139612c0f565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610997565b73ffffffffffffffffffffffffffffffffffffffff811661224a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610997565b610ff9816128cb565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906122ad82611090565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1661238a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610997565b600061239583611090565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240457508373ffffffffffffffffffffffffffffffffffffffff166123ec846109ee565b73ffffffffffffffffffffffffffffffffffffffff16145b80611271575073ffffffffffffffffffffffffffffffffffffffff80821660009081526006602090815260408083209388168352929052205460ff16611271565b8273ffffffffffffffffffffffffffffffffffffffff1661246582611090565b73ffffffffffffffffffffffffffffffffffffffff16146124ee5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610997565b73ffffffffffffffffffffffffffffffffffffffff82166125765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610997565b612581838383612c47565b61258c600082612253565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602052604081208054600192906125c2908490613f5d565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906125fd908490613c43565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610ec3828260405180602001604052806000815250612c63565b60006126a883610f92565b73ffffffffffffffffffffffffffffffffffffffff84811660008181526007602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a460006127358461212e565b9050610d57828483612cec565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952848660006040516020016127bf929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016127ec93929190613f74565b6020604051808303816000875af115801561280b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282f9190613fa9565b506000838152600b6020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a09091019092528151918301919091209387905291905261288b906001613c43565b6000858152600b60205260409020556112718482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129bc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610997565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612a5f848484612445565b612a6b84848484612f11565b610d575760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610997565b606081612b1d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612b475780612b3181613c5b565b9150612b409050600a83613fc6565b9150612b21565b60008167ffffffffffffffff811115612b6257612b626139cf565b6040519080825280601f01601f191660200182016040528015612b8c576020820181803683370190505b5090505b841561127157612ba1600183613f5d565b9150612bae600a86613fda565b612bb9906030613c43565b60f81b818381518110612bce57612bce613d9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c08600a86613fc6565b9450612b90565b6000816c010000000000000000000000008410612c3f5760405162461bcd60e51b81526004016109979190613744565b509192915050565b6109e9612c5384610f92565b612c5c84610f92565b6001612cec565b612c6d83836130e4565b612c7a6000848484612f11565b6109e95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610997565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d3657506000816bffffffffffffffffffffffff16115b156109e95773ffffffffffffffffffffffffffffffffffffffff831615612e285773ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604081205463ffffffff169081612d90576000612def565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812090612dc1600185613c94565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b90506000612e1682856040518060600160405280603781526020016141776037913961327e565b9050612e24868484846132ca565b5050505b73ffffffffffffffffffffffffffffffffffffffff8216156109e95773ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604081205463ffffffff169081612e7d576000612edc565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812090612eae600185613c94565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b90506000612f0382856040518060600160405280603681526020016140c06036913961354d565b9050611ef1858484846132ca565b600073ffffffffffffffffffffffffffffffffffffffff84163b156130dc576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612f88903390899088908890600401613fee565b6020604051808303816000875af1925050508015612fe1575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612fde91810190614037565b60015b613091573d80801561300f576040519150601f19603f3d011682016040523d82523d6000602084013e613014565b606091505b5080516130895760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610997565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611271565b506001611271565b73ffffffffffffffffffffffffffffffffffffffff82166131475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610997565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156131b95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610997565b6131c560008383612c47565b73ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906131fb908490613c43565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff16111582906132bf5760405162461bcd60e51b81526004016109979190613744565b506112718385614054565b60006132ee436040518060800160405280604481526020016140f6604491396135a4565b905060008463ffffffff16118015613355575073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812063ffffffff831691613339600188613c94565b63ffffffff908116825260208201929092526040016000205416145b156133eb5773ffffffffffffffffffffffffffffffffffffffff85166000908152600860205260408120839161338c600188613c94565b63ffffffff168152602081019190915260400160002080546bffffffffffffffffffffffff92909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff9092169190911790556134e6565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000908152600882528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691161791909117905561348d846001614079565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b604080516bffffffffffffffffffffffff80861682528416602082015273ffffffffffffffffffffffffffffffffffffffff8716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b60008061355a8486614098565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff161015839061359b5760405162461bcd60e51b81526004016109979190613744565b50949350505050565b6000816401000000008410612c3f5760405162461bcd60e51b81526004016109979190613744565b8280546135d890613bc0565b90600052602060002090601f0160209004810192826135fa576000855561365e565b82601f10613631578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561365e565b8280016001018555821561365e579182015b8281111561365e578235825591602001919060010190613643565b5061366a92915061366e565b5090565b5b8082111561366a576000815560010161366f565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ff957600080fd5b6000602082840312156136c357600080fd5b8135610fca81613683565b60005b838110156136e95781810151838201526020016136d1565b83811115610d575750506000910152565b600081518084526137128160208601602086016136ce565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610fca60208301846136fa565b60008083601f84011261376957600080fd5b50813567ffffffffffffffff81111561378157600080fd5b60208301915083602082850101111561379957600080fd5b9250929050565b600080602083850312156137b357600080fd5b823567ffffffffffffffff8111156137ca57600080fd5b6137d685828601613757565b90969095509350505050565b6000602082840312156137f457600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461381f57600080fd5b919050565b6000806040838503121561383757600080fd5b613840836137fb565b946020939093013593505050565b60008060006060848603121561386357600080fd5b61386c846137fb565b925061387a602085016137fb565b9150604084013590509250925092565b60008060006060848603121561389f57600080fd5b6138a8846137fb565b95602085013595506040909401359392505050565b8015158114610ff957600080fd5b600080604083850312156138de57600080fd5b6138e7836137fb565b915060208301356138f7816138bd565b809150509250929050565b60006020828403121561391457600080fd5b610fca826137fb565b60008060006040848603121561393257600080fd5b833567ffffffffffffffff81111561394957600080fd5b61395586828701613757565b909790965060209590950135949350505050565b6000806040838503121561397c57600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461381f57600080fd5b6000806000606084860312156139b857600080fd5b6139c18461398b565b925061387a6020850161398b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060008060808587031215613a1457600080fd5b613a1d856137fb565b9350613a2b602086016137fb565b925060408501359150606085013567ffffffffffffffff80821115613a4f57600080fd5b818701915087601f830112613a6357600080fd5b813581811115613a7557613a756139cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715613abb57613abb6139cf565b816040528281528a6020848701011115613ad457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060008060c08789031215613b1157600080fd5b613b1a876137fb565b95506020870135945060408701359350606087013560ff81168114613b3e57600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215613b6b57600080fd5b613b74836137fb565b9150613b82602084016137fb565b90509250929050565b60008060408385031215613b9e57600080fd5b613ba7836137fb565b9150602083013563ffffffff811681146138f757600080fd5b600181811c90821680613bd457607f821691505b60208210811415613c0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613c5657613c56613c14565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8d57613c8d613c14565b5060010190565b600063ffffffff83811690831681811015613cb157613cb1613c14565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff80841680613cff57613cff613cb9565b92169190910492915050565b600067ffffffffffffffff80841680613d2657613d26613cb9565b92169190910692915050565b600067ffffffffffffffff808316818516808303821115613d5557613d55613c14565b01949350505050565b600067ffffffffffffffff83811690831681811015613cb157613cb1613c14565b600067ffffffffffffffff80841680613cff57613cff613cb9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680613ddc57613ddc613cb9565b8060ff84160691505092915050565b600060ff821660ff811415613e0257613e02613c14565b60010192915050565b60008151613e1d8185602086016136ce565b9290920192915050565b600080845481600182811c915080831680613e4357607f831692505b6020808410821415613e7c577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613e905760018114613ebf57613eec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613eec565b60008b81526020902060005b86811015613ee45781548b820152908501908301613ecb565b505084890196505b505050505050613f54613f2b613f25837f2f00000000000000000000000000000000000000000000000000000000000000815260010190565b86613e0b565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b600082821015613f6f57613f6f613c14565b500390565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000613f5460608301846136fa565b600060208284031215613fbb57600080fd5b8151610fca816138bd565b600082613fd557613fd5613cb9565b500490565b600082613fe957613fe9613cb9565b500690565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261402d60808301846136fa565b9695505050505050565b60006020828403121561404957600080fd5b8151610fca81613683565b60006bffffffffffffffffffffffff83811690831681811015613cb157613cb1613c14565b600063ffffffff808316818516808303821115613d5557613d55613c14565b60006bffffffffffffffffffffffff808316818516808303821115613d5557613d55613c1456fe455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f7773455243373231436865636b706f696e7461626c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473455243373231436865636b706f696e7461626c653a3a766f746573546f44656c65676174653a20616d6f756e7420657863656564732039362062697473455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f7773a26469706673582212209814a71c587e6deb4d23886504260c89453cb7ad4502fcda41c5244aadcadc8364736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001853aa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795200000000000000000000000000000000000000000000000000000000000000134d65746153746f6e657a3a204f726967696e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f535a0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): MetaStonez: Origins
Arg [1] : _symbol (string): OSZ
Arg [2] : _maxSupply (uint256): 6227
Arg [3] : _LINK_KEY_HASH (bytes32): 0xaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
Arg [4] : _LINK_ADDRESS (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [5] : _LINK_VRF_COORDINATOR_ADDRESS (address): 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001853
Arg [3] : aa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
Arg [4] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [5] : 000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [7] : 4d65746153746f6e657a3a204f726967696e7300000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 4f535a0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

60498:6740:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37380:305;;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;37380:305:0;;;;;;;;61543:18;;;;;;;;;38325:100;;;:::i;:::-;;;;;;;:::i;64043:172::-;;;;;;:::i;:::-;;:::i;:::-;;39884:221;;;;;;:::i;:::-;;:::i;:::-;;;2600:42:1;2588:55;;;2570:74;;2558:2;2543:18;39884:221:0;2424:226:1;39407:411:0;;;;;;:::i;:::-;;:::i;61230:26::-;;;;;;;;;3261:25:1;;;3249:2;3234:18;61230:26:0;3115:177:1;51318:131:0;;51369:80;51318:131;;40634:339;;;;;;:::i;:::-;;:::i;63417:373::-;;;;;;:::i;:::-;;:::i;63859:110::-;;;;;;:::i;:::-;;:::i;50675:34::-;;50708:1;50675:34;;;;;4754:4:1;4742:17;;;4724:36;;4712:2;4697:18;50675:34:0;4582:184:1;62856:284:0;;;;;;:::i;:::-;;:::i;41044:185::-;;;;;;:::i;:::-;;:::i;62183:22::-;;;;;;64327:152;;;;;;:::i;:::-;;:::i;52757:187::-;;;;;;:::i;:::-;;:::i;53633:164::-;;;;;;:::i;:::-;;:::i;64767:80::-;;;:::i;38019:239::-;;;;;;:::i;:::-;;:::i;61993:21::-;;;:::i;51197:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5136:10:1;5124:23;;;5106:42;;5094:2;5079:18;51197:48:0;4962:192:1;65149:280:0;;;;;;:::i;:::-;;:::i;37749:208::-;;;;;;:::i;:::-;;:::i;2518:103::-;;;:::i;56027:1237::-;;;;;;:::i;:::-;;:::i;:::-;;;5817:26:1;5805:39;;;5787:58;;5775:2;5760:18;56027:1237:0;5643:208:1;51750:41:0;;;;;;:::i;:::-;;;;;;;;;;;;;;64566:134;;;:::i;1867:87::-;1913:7;1940:6;;;1867:87;;17676:210;;;;;;:::i;:::-;;:::i;38494:104::-;;;:::i;66410:825::-;;;;;;:::i;:::-;;:::i;:::-;;;6788:18:1;6776:31;;;6758:50;;6746:2;6731:18;66410:825:0;6614:200:1;40177:155:0;;;;;;:::i;:::-;;:::i;55374:222::-;;;;;;:::i;:::-;;:::i;41300:328::-;;;;;;:::i;:::-;;:::i;54231:942::-;;;;;;:::i;:::-;;:::i;65605:555::-;;;;;;:::i;:::-;;:::i;64928:167::-;;;;;;:::i;:::-;;:::i;61427:24::-;;;;;;61828:26;;;:::i;62084:28::-;;;;;;51543:126;;51598:71;51543:126;;52347:192;;;;;;:::i;:::-;;:::i;40403:164::-;;;;;;:::i;:::-;40524:25;;;;40500:4;40524:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40403:164;51060:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9653:10:1;9641:23;;;9623:42;;9713:26;9701:39;;;9696:2;9681:18;;9674:67;9596:18;51060:68:0;9453:294:1;2776:201:0;;;;;;:::i;:::-;;:::i;61653:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37380:305;37482:4;37519:40;;;37534:25;37519:40;;:105;;-1:-1:-1;37576:48:0;;;37591:33;37576:48;37519:105;:158;;;-1:-1:-1;36113:25:0;36098:40;;;;37641:36;37499:178;37380:305;-1:-1:-1;;37380:305:0:o;38325:100::-;38379:13;38412:5;38405:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38325:100;:::o;64043:172::-;1913:7;1940:6;2087:23;1940:6;814:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;10396:2:1;2079:68:0;;;10378:21:1;;;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;10526:18;;2079:68:0;;;;;;;;;64131:6:::1;::::0;::::1;;64127:44;;;64155:8;;;;;;;;;;;;;;64127:44;64179:30;:12;64194:15:::0;;64179:30:::1;:::i;:::-;;64043:172:::0;;:::o;39884:221::-;39960:7;43227:16;;;:7;:16;;;;;;:30;:16;39980:73;;;;-1:-1:-1;;;39980:73:0;;10757:2:1;39980:73:0;;;10739:21:1;10796:2;10776:18;;;10769:30;10835:34;10815:18;;;10808:62;10906:14;10886:18;;;10879:42;10938:19;;39980:73:0;10555:408:1;39980:73:0;-1:-1:-1;40073:24:0;;;;:15;:24;;;;;;;;;39884:221::o;39407:411::-;39488:13;39504:23;39519:7;39504:14;:23::i;:::-;39488:39;;39552:5;39546:11;;:2;:11;;;;39538:57;;;;-1:-1:-1;;;39538:57:0;;11170:2:1;39538:57:0;;;11152:21:1;11209:2;11189:18;;;11182:30;11248:34;11228:18;;;11221:62;11319:3;11299:18;;;11292:31;11340:19;;39538:57:0;10968:397:1;39538:57:0;814:10;39630:21;;;;;:62;;-1:-1:-1;39655:37:0;39672:5;814:10;40403:164;:::i;39655:37::-;39608:168;;;;-1:-1:-1;;;39608:168:0;;11572:2:1;39608:168:0;;;11554:21:1;11611:2;11591:18;;;11584:30;11650:34;11630:18;;;11623:62;11721:26;11701:18;;;11694:54;11765:19;;39608:168:0;11370:420:1;39608:168:0;39789:21;39798:2;39802:7;39789:8;:21::i;40634:339::-;40829:41;814:10;40862:7;40829:18;:41::i;:::-;40821:103;;;;-1:-1:-1;;;40821:103:0;;11997:2:1;40821:103:0;;;11979:21:1;12036:2;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12146:19;12126:18;;;12119:47;12183:19;;40821:103:0;11795:413:1;40821:103:0;40937:28;40947:4;40953:2;40957:7;40937:9;:28::i;63417:373::-;63529:10;63521:19;;;;:7;:19;;;;;;;;63516:65;;63558:15;;;;;;;;;;;;;;63516:65;63604:5;63589:11;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;63634:9:0;;63620:11;;:23;63616:70;;;63661:17;;;;;;;;;;;;;;63616:70;63699:9;63694:91;63718:5;63714:1;:9;63694:91;;;63739:38;63749:9;63760:16;63775:1;63760:12;:16;:::i;:::-;63739:9;:38::i;:::-;63725:3;;;;:::i;:::-;;;;63694:91;;;;63417:373;;;:::o;63859:110::-;1913:7;1940:6;2087:23;1940:6;814:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;10396:2:1;2079:68:0;;;10378:21:1;;;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;10526:18;;2079:68:0;10194:356:1;2079:68:0;63938:15:::1;::::0;;;::::1;;::::0;;;:7:::1;:15;::::0;;;;:25;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;63859:110::o;62856:284::-;62944:10;62936:19;;;;:7;:19;;;;;;;;62931:65;;62973:15;;;;;;;;;;;;;;62931:65;63019:1;63004:11;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;63045:9:0;;63031:11;;:23;63027:70;;;63072:17;;;;;;;;;;;;;;63027:70;63105:29;63115:9;63126:7;63105:9;:29::i;:::-;62856:284;;:::o;41044:185::-;41182:39;41199:4;41205:2;41209:7;41182:39;;;;;;;;;;;;:16;:39::i;64327:152::-;1913:7;1940:6;2087:23;1940:6;814:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;10396:2:1;2079:68:0;;;10378:21:1;;;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;10526:18;;2079:68:0;10194:356:1;2079:68:0;64405:6:::1;::::0;::::1;;64401:44;;;64429:8;;;;;;;;;;;;;;64401:44;64453:20;:7;64463:10:::0;;64453:20:::1;:::i;52757:187::-:0;52854:21;;;;52816:7;52854:21;;;:10;:21;;;;;;52816:7;;52854:21;52893;;:43;;52929:7;52893:43;;;52917:9;52893:43;52886:50;52757:187;-1:-1:-1;;;52757:187:0:o;53633:164::-;53692:23;;;53688:51;;-1:-1:-1;53729:10:0;53688:51;53757:32;53767:10;53779:9;53757;:32::i;:::-;53633:164;:::o;64767:80::-;1913:7;1940:6;2087:23;1940:6;814:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;10396:2:1;2079:68:0;;;10378:21:1;;;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;10526:18;;2079:68:0;10194:356:1;2079:68:0;64828:6:::1;:13:::0;;;::::1;64837:4;64828:13;::::0;;64767:80::o;38019:239::-;38091:7;38127:16;;;:7;:16;;;;;;;;38162:19;38154:73;;;;-1:-1:-1;;;38154:73:0;;12937:2:1;38154:73:0;;;12919:21:1;12976:2;12956:18;;;12949:30;13015:34;12995:18;;;12988:62;13086:11;13066:18;;;13059:39;13115:19;;38154:73:0;12735:405:1;61993:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65149:280::-;65253:17;1940:6;;2087:23;1940:6;814:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;10396:2:1;2079:68:0;;;10378:21:1;;;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;10526:18;;2079:68:0;10194:356:1;2079:68:0;65283:7:::1;::::0;:12;65279:61:::1;;65313:19;;;;;;;;;;;;;;65279:61;65346:20;:7;65356:10:::0;;65346:20:::1;:::i;:::-;;65382:41;65400:13;;65415:7;65382:17;:41::i;:::-;65375:48:::0;65149:280;-1:-1:-1;;;;65149:280:0:o;37749:208::-;37821:7;37849:19;;;37841:74;;;;-1:-1:-1;;;37841:74:0;;13347:2:1;37841:74:0;;;13329:21:1;13386:2;13366:18;;;13359:30;13425:34;13405:18;;;13398:62;13496:12;13476:18;;;13469:40;13526:19;;37841:74:0;13145:406:1;37841:74:0;-1:-1:-1;37933:16:0;;;;;;:9;:16;;;;;;;37749:208::o;2518:103::-;1913:7;1940:6;2087:23;1940:6;814:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;10396:2:1;2079:68:0;;;10378:21:1;;;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;10526:18;;2079:68:0;10194:356:1;2079:68:0;2583:30:::1;2610:1;2583:18;:30::i;:::-;2518:103::o:0;56027:1237::-;56109:6;56150:12;56136:11;:26;56128:94;;;;-1:-1:-1;;;56128:94:0;;13758:2:1;56128:94:0;;;13740:21:1;13797:2;13777:18;;;13770:30;13836:34;13816:18;;;13809:62;13907:25;13887:18;;;13880:53;13950:19;;56128:94:0;13556:419:1;56128:94:0;56257:23;;;56235:19;56257:23;;;:14;:23;;;;;;;;56295:17;56291:58;;56336:1;56329:8;;;;;56291:58;56409:20;;;;;;;:11;:20;;;;;56461:11;;56430:16;56445:1;56430:12;:16;:::i;:::-;56409:38;;;;;;;;;;;;;;;-1:-1:-1;56409:38:0;:48;;:63;56405:147;;56496:20;;;;;;;:11;:20;;;;;;56517:16;56532:1;56517:12;:16;:::i;:::-;56496:38;;;;;;;;;;;;;-1:-1:-1;56496:38:0;:44;;;;;;;-1:-1:-1;56489:51:0;;-1:-1:-1;56489:51:0;56405:147;56613:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;56609:88:0;;;56684:1;56677:8;;;;;56609:88;56709:12;;56751:16;56766:1;56751:12;:16;:::i;:::-;56736:31;;56778:428;56793:5;56785:13;;:5;:13;;;56778:428;;;56815:13;56857:1;56840:13;56848:5;56840;:13;:::i;:::-;56839:19;;;;:::i;:::-;56831:27;;:5;:27;:::i;:::-;56923:20;;;56900;56923;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;56900:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;56923:28;;-1:-1:-1;56970:27:0;;56966:229;;;57025:8;;;;-1:-1:-1;57018:15:0;;-1:-1:-1;;;;57018:15:0;56966:229;57059:12;;:26;;;-1:-1:-1;57055:140:0;;;57114:6;57106:14;;57055:140;;;57169:10;57178:1;57169:6;:10;:::i;:::-;57161:18;;57055:140;56800:406;;56778:428;;;-1:-1:-1;57223:20:0;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;;;;;-1:-1:-1;;56027:1237:0;;;;:::o;64566:134::-;1913:7;1940:6;2087:23;1940:6;814:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;10396:2:1;2079:68:0;;;10378:21:1;;;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;10526:18;;2079:68:0;10194:356:1;2079:68:0;64623:6:::1;::::0;::::1;;64619:44;;;64647:8;;;;;;;;;;;;;;64619:44;64683:11;::::0;64671:9:::1;:23:::0;64566:134::o;17676:210::-;17769:10;:28;17783:14;17769:28;;17761:72;;;;-1:-1:-1;;;17761:72:0;;14793:2:1;17761:72:0;;;14775:21:1;14832:2;14812:18;;;14805:30;14871:33;14851:18;;;14844:61;14922:18;;17761:72:0;14591:355:1;17761:72:0;65514:7;:18;-1:-1:-1;62856:284:0:o;38494:104::-;38550:13;38583:7;38576:14;;;;;:::i;66410:825::-;66543:6;66577:10;66569:18;;:5;:18;;;66561:56;;;;-1:-1:-1;;;66561:56:0;;15153:2:1;66561:56:0;;;15135:21:1;15192:2;15172:18;;;15165:30;15231:27;15211:18;;;15204:55;15276:18;;66561:56:0;14951:349:1;66561:56:0;66639:18;66626:583;66685:2;66670:12;:17;;;66626:583;;;66727:12;66806:10;66781:4;66787:12;66764:36;;;;;;;;15458:19:1;;;15515:3;15511:16;15529:66;15507:89;15502:2;15493:12;;15486:111;15622:2;15613:12;;15305:326;66764:36:0;;;;;;;;;;;;;66754:47;;;;;;66749:53;;66742:74;;;;:::i;:::-;66727:89;-1:-1:-1;66825:11:0;66870:10;66861:5;66840:18;66870:10;66727:89;66840:18;:::i;:::-;:26;;;;:::i;:::-;66839:41;;;;:::i;:::-;66825:55;;66889:15;66915:4;66907:12;;:5;:12;;;:27;;66930:4;66907:27;;;66922:5;66907:27;66889:45;-1:-1:-1;66943:14:0;66997:4;67003:12;67017:14;67028:3;66889:45;67017:14;:::i;:::-;66980:52;;;;;;;;;16690:19:1;;;16747:3;16743:16;;;;16761:66;16739:89;16734:2;16725:12;;16718:111;16867:3;16863:16;16881:66;16859:89;16854:2;16845:12;;16838:111;16974:2;16965:12;;16511:472;66980:52:0;;;;;;;;;;;;;66960:81;;;;;;66943:98;;67050:9;67068:6;67094:1;67087:3;67076:8;:14;;;;:::i;:::-;67075:20;;;;:::i;:::-;67068:28;;;;;;;;;:::i;:::-;;;-1:-1:-1;67106:9:0;67144:1;67127:12;67138:1;67127:8;:12;:::i;:::-;67119:21;;:3;:21;;;;67118:27;;;;:::i;:::-;67106:39;-1:-1:-1;67160:7:0;;;;67156:46;;67188:4;67180:12;;67156:46;66718:491;;;;;;66696:14;;;;;:::i;:::-;;;;66626:583;;;-1:-1:-1;67224:5:0;;66410:825;-1:-1:-1;;;66410:825:0:o;40177:155::-;40272:52;814:10;40305:8;40315;40272:18;:52::i;55374:222::-;55480:23;;;55439:6;55480:23;;;:14;:23;;;;;;;;55521:16;:67;;55587:1;55521:67;;;55540:20;;;;;;;:11;:20;;;;;;55561:16;55576:1;55561:12;:16;:::i;:::-;55540:38;;;;;;;;;;;;;-1:-1:-1;55540:38:0;:44;;;;;;;55514:74;-1:-1:-1;;;55374:222:0:o;41300:328::-;41475:41;814:10;41508:7;41475:18;:41::i;:::-;41467:103;;;;-1:-1:-1;;;41467:103:0;;11997:2:1;41467:103:0;;;11979:21:1;12036:2;12016:18;;;12009:30;12075:34;12055:18;;;12048:62;12146:19;12126:18;;;12119:47;12183:19;;41467:103:0;11795:413:1;41467:103:0;41581:39;41595:4;41601:2;41605:7;41614:5;41581:13;:39::i;54231:942::-;54414:23;51369:80;54508:6;:4;:6::i;:::-;54492:24;;;;;;54518:12;60439:9;;60313:178;54518:12;54464:82;;;;;;;17750:25:1;;;;17791:18;;;17784:34;;;;17834:18;;;17827:34;;;;54540:4:0;17877:18:1;;;;17870:83;;;;54464:82:0;;;;;;;;;;17722:19:1;;;54464:82:0;;54440:117;;;;;;51598:71;54599:57;;;18195:25:1;18268:42;18256:55;;18236:18;;;18229:83;18328:18;;;18321:34;;;18371:18;;;;18364:34;;;54599:57:0;;;;;;;;;;18167:19:1;;;54599:57:0;;;54589:68;;;;;;;18679:66:1;54695:57:0;;;18667:79:1;18762:11;;;18755:27;;;18798:12;;;18791:28;;;54440:117:0;;-1:-1:-1;;;18835:12:1;;54695:57:0;;;;;;;;;;;;;54685:68;;54695:57;54685:68;;;;54764:17;54784:26;;;;;;;;;19085:25:1;;;19158:4;19146:17;;19126:18;;;19119:45;;;;19180:18;;;19173:34;;;19223:18;;;19216:34;;;54685:68:0;;-1:-1:-1;54764:17:0;54784:26;;19057:19:1;;54784:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54784:26:0;;;;;;-1:-1:-1;;54829:23:0;;;54821:90;;;;-1:-1:-1;;;54821:90:0;;19463:2:1;54821:90:0;;;19445:21:1;19502:2;19482:18;;;19475:30;19541:34;19521:18;;;19514:62;19612:24;19592:18;;;19585:52;19654:19;;54821:90:0;19261:418:1;54821:90:0;54939:17;;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;54930:5;:28;54922:91;;;;-1:-1:-1;;;54922:91:0;;19886:2:1;54922:91:0;;;19868:21:1;19925:2;19905:18;;;19898:30;19964:34;19944:18;;;19937:62;20035:20;20015:18;;;20008:48;20073:19;;54922:91:0;19684:414:1;54922:91:0;55051:6;55032:15;:25;;55024:92;;;;-1:-1:-1;;;55024:92:0;;20305:2:1;55024:92:0;;;20287:21:1;20344:2;20324:18;;;20317:30;20383:34;20363:18;;;20356:62;20454:24;20434:18;;;20427:52;20496:19;;55024:92:0;20103:418:1;55024:92:0;55134:31;55144:9;55155;55134;:31::i;:::-;55127:38;;;;54231:942;;;;;;;:::o;65605:555::-;43203:4;43227:16;;;:7;:16;;;;;;65670:13;;43227:30;:16;65692:65;;65731:18;;;;;;;;;;;;;;65692:65;65769:7;;:12;;:42;;;65791:7;65785:21;;;;;:::i;:::-;:26;;-1:-1:-1;65769:42:0;65765:84;;;65829:12;65822:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65605:555;;;:::o;65765:84::-;65906:7;65938:182;65958:140;66000:7;66030:9;;66076:7;;66065:19;;;;;;3261:25:1;;3249:2;3234:18;;3115:177;66065:19:0;;;;;;;;;;;;;66055:30;;;;;;65958:20;:140::i;:::-;65938:171;;:180;:182::i;:::-;65879:268;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65857:297;;65605:555;;;:::o;64928:167::-;1913:7;1940:6;2087:23;1940:6;814:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;10396:2:1;2079:68:0;;;10378:21:1;;;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;10526:18;;2079:68:0;10194:356:1;2079:68:0;65006:7:::1;::::0;:12;65002:61:::1;;65036:19;;;;;;;;;;;;;;65002:61;65071:7;:18:::0;64928:167::o;61828:26::-;;;;;;;:::i;52347:192::-;52412:6;52438:93;52445:20;52455:9;52445;:20::i;:::-;52438:93;;;;;;;;;;;;;;;;;:6;:93::i;2776:201::-;1913:7;1940:6;2087:23;1940:6;814:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;10396:2:1;2079:68:0;;;10378:21:1;;;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;10526:18;;2079:68:0;10194:356:1;2079:68:0;2865:22:::1;::::0;::::1;2857:73;;;::::0;-1:-1:-1;;;2857:73:0;;22834:2:1;2857:73:0::1;::::0;::::1;22816:21:1::0;22873:2;22853:18;;;22846:30;22912:34;22892:18;;;22885:62;22983:8;22963:18;;;22956:36;23009:19;;2857:73:0::1;22632:402:1::0;2857:73:0::1;2941:28;2960:8;2941:18;:28::i;47284:174::-:0;47359:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;47413:23;47359:24;47413:14;:23::i;:::-;47404:46;;;;;;;;;;;;47284:174;;:::o;43432:348::-;43525:4;43227:16;;;:7;:16;;;;;;:30;:16;43542:73;;;;-1:-1:-1;;;43542:73:0;;23241:2:1;43542:73:0;;;23223:21:1;23280:2;23260:18;;;23253:30;23319:34;23299:18;;;23292:62;23390:14;23370:18;;;23363:42;23422:19;;43542:73:0;23039:408:1;43542:73:0;43626:13;43642:23;43657:7;43642:14;:23::i;:::-;43626:39;;43695:5;43684:16;;:7;:16;;;:51;;;;43728:7;43704:31;;:20;43716:7;43704:11;:20::i;:::-;:31;;;43684:51;:87;;;-1:-1:-1;40524:25:0;;;;40500:4;40524:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;43739:32;40403:164;46541:625;46700:4;46673:31;;:23;46688:7;46673:14;:23::i;:::-;:31;;;46665:81;;;;-1:-1:-1;;;46665:81:0;;23654:2:1;46665:81:0;;;23636:21:1;23693:2;23673:18;;;23666:30;23732:34;23712:18;;;23705:62;23803:7;23783:18;;;23776:35;23828:19;;46665:81:0;23452:401:1;46665:81:0;46765:16;;;46757:65;;;;-1:-1:-1;;;46757:65:0;;24060:2:1;46757:65:0;;;24042:21:1;24099:2;24079:18;;;24072:30;24138:34;24118:18;;;24111:62;24209:6;24189:18;;;24182:34;24233:19;;46757:65:0;23858:400:1;46757:65:0;46835:39;46856:4;46862:2;46866:7;46835:20;:39::i;:::-;46939:29;46956:1;46960:7;46939:8;:29::i;:::-;46981:15;;;;;;;:9;:15;;;;;:20;;47000:1;;46981:15;:20;;47000:1;;46981:20;:::i;:::-;;;;-1:-1:-1;;47012:13:0;;;;;;;:9;:13;;;;;:18;;47029:1;;47012:13;:18;;47029:1;;47012:18;:::i;:::-;;;;-1:-1:-1;;47041:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;47080:27;;47041:16;;47080:27;;;;;;;64179:30:::1;64043:172:::0;;:::o;44122:110::-;44198:26;44208:2;44212:7;44198:26;;;;;;;;;;;;:9;:26::i;57272:492::-;57474:23;57500:20;57510:9;57500;:20::i;:::-;57533:21;;;;;;;;:10;:21;;;;;;:33;;;;;;;;;;;;;57584:54;;57474:46;;-1:-1:-1;57533:33:0;57584:54;;;;;;57533:21;57584:54;57651:13;57667:26;57683:9;57667:15;:26::i;:::-;57651:42;;57706:50;57721:15;57738:9;57749:6;57706:14;:50::i;15793:1034::-;15870:17;15896:4;:20;;;15917:14;15933:4;15950:8;14623:1;15939:43;;;;;;;;24567:25:1;;;24623:2;24608:18;;24601:34;24555:2;24540:18;;24393:248;15939:43:0;;;;;;;;;;;;;15896:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;16218:15:0;16301:16;;;:6;:16;;;;;;;;;7431:51;;;;;26567:25:1;;;26608:18;;;26601:34;;;16294:4:0;26651:18:1;;;26644:83;26743:18;;;;26736:34;;;7431:51:0;;;;;;;;;;26539:19:1;;;;7431:51:0;;;7421:62;;;;;;;;;16755:16;;;;;;;:20;;16774:1;16755:20;:::i;:::-;16736:16;;;;:6;:16;;;;;:39;16789:32;16743:8;16813:7;8001:41;;;;;;;26938:19:1;;;;26973:12;;;26966:28;;;;8001:41:0;;;;;;;;;27010:12:1;;;;8001:41:0;;7991:52;;;;;;7881:168;3137:191;3211:16;3230:6;;;3247:17;;;;;;;;;;3280:40;;3230:6;;;;;;;3280:40;;3211:16;3280:40;3200:128;3137:191;:::o;47600:315::-;47755:8;47746:17;;:5;:17;;;;47738:55;;;;-1:-1:-1;;;47738:55:0;;25523:2:1;47738:55:0;;;25505:21:1;25562:2;25542:18;;;25535:30;25601:27;25581:18;;;25574:55;25646:18;;47738:55:0;25321:349:1;47738:55:0;47804:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;47866:41;;586::1;;;47866::0;;559:18:1;47866:41:0;;;;;;;47600:315;;;:::o;42510:::-;42667:28;42677:4;42683:2;42687:7;42667:9;:28::i;:::-;42714:48;42737:4;42743:2;42747:7;42756:5;42714:22;:48::i;:::-;42706:111;;;;-1:-1:-1;;;42706:111:0;;25877:2:1;42706:111:0;;;25859:21:1;25916:2;25896:18;;;25889:30;25955:34;25935:18;;;25928:62;26026:20;26006:18;;;25999:48;26064:19;;42706:111:0;25675:414:1;3619:723:0;3675:13;3896:10;3892:53;;-1:-1:-1;;3923:10:0;;;;;;;;;;;;;;;;;;3619:723::o;3892:53::-;3970:5;3955:12;4011:78;4018:9;;4011:78;;4044:8;;;;:::i;:::-;;-1:-1:-1;4067:10:0;;-1:-1:-1;4075:2:0;4067:10;;:::i;:::-;;;4011:78;;;4099:19;4131:6;4121:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4121:17:0;;4099:39;;4149:154;4156:10;;4149:154;;4183:11;4193:1;4183:11;;:::i;:::-;;-1:-1:-1;4252:10:0;4260:2;4252:5;:10;:::i;:::-;4239:24;;:2;:24;:::i;:::-;4226:39;;4209:6;4216;4209:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;4280:11:0;4289:2;4280:11;;:::i;:::-;;;4149:154;;59704:164;59782:6;59820:12;59813:5;59809:9;;59801:32;;;;-1:-1:-1;;;59801:32:0;;;;;;;;:::i;:::-;-1:-1:-1;59858:1:0;;59704:164;-1:-1:-1;;59704:164:0:o;53117:368::-;53428:49;53443:15;53453:4;53443:9;:15::i;:::-;53460:13;53470:2;53460:9;:13::i;:::-;53475:1;53428:14;:49::i;44459:321::-;44589:18;44595:2;44599:7;44589:5;:18::i;:::-;44640:54;44671:1;44675:2;44679:7;44688:5;44640:22;:54::i;:::-;44618:154;;;;-1:-1:-1;;;44618:154:0;;25877:2:1;44618:154:0;;;25859:21:1;25916:2;25896:18;;;25889:30;25955:34;25935:18;;;25928:62;26026:20;26006:18;;;25999:48;26064:19;;44618:154:0;25675:414:1;57772:1003:0;57911:6;57901:16;;:6;:16;;;;:30;;;;;57930:1;57921:6;:10;;;57901:30;57897:871;;;57952:20;;;;57948:397;;58012:22;;;57993:16;58012:22;;;:14;:22;;;;;;;;;58072:13;:60;;58131:1;58072:60;;;58088:19;;;;;;;:11;:19;;;;;;58108:13;58120:1;58108:9;:13;:::i;:::-;58088:34;;;;;;;;;;;;;-1:-1:-1;58088:34:0;:40;;;;;;58072:60;58053:79;;58151:16;58170:83;58176:9;58187:6;58170:83;;;;;;;;;;;;;;;;;:5;:83::i;:::-;58151:102;;58272:57;58289:6;58297:9;58308;58319;58272:16;:57::i;:::-;57974:371;;;57948:397;58365:20;;;;58361:396;;58425:22;;;58406:16;58425:22;;;:14;:22;;;;;;;;;58485:13;:60;;58544:1;58485:60;;;58501:19;;;;;;;:11;:19;;;;;;58521:13;58533:1;58521:9;:13;:::i;:::-;58501:34;;;;;;;;;;;;;-1:-1:-1;58501:34:0;:40;;;;;;58485:60;58466:79;;58564:16;58583:82;58589:9;58600:6;58583:82;;;;;;;;;;;;;;;;;:5;:82::i;:::-;58564:101;;58684:57;58701:6;58709:9;58720;58731;58684:16;:57::i;48480:799::-;48635:4;48656:13;;;28204:20;28252:8;48652:620;;48692:72;;;;;:36;;;;;;:72;;814:10;;48743:4;;48749:7;;48758:5;;48692:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48692:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48688:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48934:13:0;;48930:272;;48977:60;;-1:-1:-1;;;48977:60:0;;25877:2:1;48977:60:0;;;25859:21:1;25916:2;25896:18;;;25889:30;25955:34;25935:18;;;25928:62;26026:20;26006:18;;;25999:48;26064:19;;48977:60:0;25675:414:1;48930:272:0;49152:6;49146:13;49137:6;49133:2;49129:15;49122:38;48688:529;48815:51;;48825:41;48815:51;;-1:-1:-1;48808:58:0;;48652:620;-1:-1:-1;49256:4:0;49249:11;;45116:439;45196:16;;;45188:61;;;;-1:-1:-1;;;45188:61:0;;28017:2:1;45188:61:0;;;27999:21:1;;;28036:18;;;28029:30;28095:34;28075:18;;;28068:62;28147:18;;45188:61:0;27815:356:1;45188:61:0;43203:4;43227:16;;;:7;:16;;;;;;:30;:16;:30;45260:58;;;;-1:-1:-1;;;45260:58:0;;28378:2:1;45260:58:0;;;28360:21:1;28417:2;28397:18;;;28390:30;28456;28436:18;;;28429:58;28504:18;;45260:58:0;28176:352:1;45260:58:0;45331:45;45360:1;45364:2;45368:7;45331:20;:45::i;:::-;45389:13;;;;;;;:9;:13;;;;;:18;;45406:1;;45389:13;:18;;45406:1;;45389:18;:::i;:::-;;;;-1:-1:-1;;45418:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;45457:33;;45418:16;;;45457:33;;45418:16;;45457:33;62856:284;;:::o;60106:199::-;60226:6;60258:1;60253:6;;:1;:6;;;;60261:12;60245:29;;;;;-1:-1:-1;;;60245:29:0;;;;;;;;:::i;:::-;-1:-1:-1;60292:5:0;60296:1;60292;:5;:::i;58783:741::-;58946:18;58967:129;58988:12;58967:129;;;;;;;;;;;;;;;;;:6;:129::i;:::-;58946:150;;59128:1;59113:12;:16;;;:85;;;;-1:-1:-1;59133:22:0;;;;;;;:11;:22;;;;;:65;;;;59156:16;59171:1;59156:12;:16;:::i;:::-;59133:40;;;;;;;;;;;;;;;-1:-1:-1;59133:40:0;:50;;:65;59113:85;59109:339;;;59215:22;;;;;;;:11;:22;;;;;59264:8;;59238:16;59253:1;59238:12;:16;:::i;:::-;59215:40;;;;;;;;;;;;;-1:-1:-1;59215:40:0;:57;;;;;;;;;;;;;;;;;;;59109:339;;;59344:33;;;;;;;;;;;;;;;;;;;;;;;;;59305:22;;;-1:-1:-1;59305:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;59420:16;59328:12;59305:72;59420:16;:::i;:::-;59392:25;;;;;;;:14;:25;;;;;:44;;;;;;;;;;;;;;;59109:339;59465:51;;;29190:26:1;29243:15;;;29225:34;;29295:15;;29290:2;29275:18;;29268:43;59465:51:0;;;;;;29153:18:1;59465:51:0;;;;;;;58935:589;58783:741;;;;:::o;59876:222::-;59996:6;;60026:5;60030:1;60026;:5;:::i;:::-;60015:16;;60055:1;60050:6;;:1;:6;;;;60058:12;60042:29;;;;;-1:-1:-1;;;60042:29:0;;;;;;;;:::i;:::-;-1:-1:-1;60089:1:0;59876:222;-1:-1:-1;;;;59876:222:0:o;59532:164::-;59610:6;59648:12;59641:5;59637:9;;59629:32;;;;-1:-1:-1;;;59629:32:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:328::-;954:3;992:5;986:12;1019:6;1014:3;1007:19;1035:63;1091:6;1084:4;1079:3;1075:14;1068:4;1061:5;1057:16;1035:63;:::i;:::-;1143:2;1131:15;1148:66;1127:88;1118:98;;;;1218:4;1114:109;;901:328;-1:-1:-1;;901:328:1:o;1234:231::-;1383:2;1372:9;1365:21;1346:4;1403:56;1455:2;1444:9;1440:18;1432:6;1403:56;:::i;1470:348::-;1522:8;1532:6;1586:3;1579:4;1571:6;1567:17;1563:27;1553:55;;1604:1;1601;1594:12;1553:55;-1:-1:-1;1627:20:1;;1670:18;1659:30;;1656:50;;;1702:1;1699;1692:12;1656:50;1739:4;1731:6;1727:17;1715:29;;1791:3;1784:4;1775:6;1767;1763:19;1759:30;1756:39;1753:59;;;1808:1;1805;1798:12;1753:59;1470:348;;;;;:::o;1823:411::-;1894:6;1902;1955:2;1943:9;1934:7;1930:23;1926:32;1923:52;;;1971:1;1968;1961:12;1923:52;2011:9;1998:23;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2115:59;2166:7;2157:6;2146:9;2142:22;2115:59;:::i;:::-;2193:8;;2089:85;;-1:-1:-1;1823:411:1;-1:-1:-1;;;;1823:411:1:o;2239:180::-;2298:6;2351:2;2339:9;2330:7;2326:23;2322:32;2319:52;;;2367:1;2364;2357:12;2319:52;-1:-1:-1;2390:23:1;;2239:180;-1:-1:-1;2239:180:1:o;2655:196::-;2723:20;;2783:42;2772:54;;2762:65;;2752:93;;2841:1;2838;2831:12;2752:93;2655:196;;;:::o;2856:254::-;2924:6;2932;2985:2;2973:9;2964:7;2960:23;2956:32;2953:52;;;3001:1;2998;2991:12;2953:52;3024:29;3043:9;3024:29;:::i;:::-;3014:39;3100:2;3085:18;;;;3072:32;;-1:-1:-1;;;2856:254:1:o;3479:328::-;3556:6;3564;3572;3625:2;3613:9;3604:7;3600:23;3596:32;3593:52;;;3641:1;3638;3631:12;3593:52;3664:29;3683:9;3664:29;:::i;:::-;3654:39;;3712:38;3746:2;3735:9;3731:18;3712:38;:::i;:::-;3702:48;;3797:2;3786:9;3782:18;3769:32;3759:42;;3479:328;;;;;:::o;3812:322::-;3889:6;3897;3905;3958:2;3946:9;3937:7;3933:23;3929:32;3926:52;;;3974:1;3971;3964:12;3926:52;3997:29;4016:9;3997:29;:::i;:::-;3987:39;4073:2;4058:18;;4045:32;;-1:-1:-1;4124:2:1;4109:18;;;4096:32;;3812:322;-1:-1:-1;;;3812:322:1:o;4139:118::-;4225:5;4218:13;4211:21;4204:5;4201:32;4191:60;;4247:1;4244;4237:12;4262:315;4327:6;4335;4388:2;4376:9;4367:7;4363:23;4359:32;4356:52;;;4404:1;4401;4394:12;4356:52;4427:29;4446:9;4427:29;:::i;:::-;4417:39;;4506:2;4495:9;4491:18;4478:32;4519:28;4541:5;4519:28;:::i;:::-;4566:5;4556:15;;;4262:315;;;;;:::o;4771:186::-;4830:6;4883:2;4871:9;4862:7;4858:23;4854:32;4851:52;;;4899:1;4896;4889:12;4851:52;4922:29;4941:9;4922:29;:::i;5159:479::-;5239:6;5247;5255;5308:2;5296:9;5287:7;5283:23;5279:32;5276:52;;;5324:1;5321;5314:12;5276:52;5364:9;5351:23;5397:18;5389:6;5386:30;5383:50;;;5429:1;5426;5419:12;5383:50;5468:59;5519:7;5510:6;5499:9;5495:22;5468:59;:::i;:::-;5546:8;;5442:85;;-1:-1:-1;5628:2:1;5613:18;;;;5600:32;;5159:479;-1:-1:-1;;;;5159:479:1:o;5856:248::-;5924:6;5932;5985:2;5973:9;5964:7;5960:23;5956:32;5953:52;;;6001:1;5998;5991:12;5953:52;-1:-1:-1;;6024:23:1;;;6094:2;6079:18;;;6066:32;;-1:-1:-1;5856:248:1:o;6109:171::-;6176:20;;6236:18;6225:30;;6215:41;;6205:69;;6270:1;6267;6260:12;6285:324;6360:6;6368;6376;6429:2;6417:9;6408:7;6404:23;6400:32;6397:52;;;6445:1;6442;6435:12;6397:52;6468:28;6486:9;6468:28;:::i;:::-;6458:38;;6515:37;6548:2;6537:9;6533:18;6515:37;:::i;6819:184::-;6871:77;6868:1;6861:88;6968:4;6965:1;6958:15;6992:4;6989:1;6982:15;7008:1197;7103:6;7111;7119;7127;7180:3;7168:9;7159:7;7155:23;7151:33;7148:53;;;7197:1;7194;7187:12;7148:53;7220:29;7239:9;7220:29;:::i;:::-;7210:39;;7268:38;7302:2;7291:9;7287:18;7268:38;:::i;:::-;7258:48;;7353:2;7342:9;7338:18;7325:32;7315:42;;7408:2;7397:9;7393:18;7380:32;7431:18;7472:2;7464:6;7461:14;7458:34;;;7488:1;7485;7478:12;7458:34;7526:6;7515:9;7511:22;7501:32;;7571:7;7564:4;7560:2;7556:13;7552:27;7542:55;;7593:1;7590;7583:12;7542:55;7629:2;7616:16;7651:2;7647;7644:10;7641:36;;;7657:18;;:::i;:::-;7791:2;7785:9;7853:4;7845:13;;7696:66;7841:22;;;7865:2;7837:31;7833:40;7821:53;;;7889:18;;;7909:22;;;7886:46;7883:72;;;7935:18;;:::i;:::-;7975:10;7971:2;7964:22;8010:2;8002:6;7995:18;8050:7;8045:2;8040;8036;8032:11;8028:20;8025:33;8022:53;;;8071:1;8068;8061:12;8022:53;8127:2;8122;8118;8114:11;8109:2;8101:6;8097:15;8084:46;8172:1;8167:2;8162;8154:6;8150:15;8146:24;8139:35;8193:6;8183:16;;;;;;;7008:1197;;;;;;;:::o;8210:618::-;8312:6;8320;8328;8336;8344;8352;8405:3;8393:9;8384:7;8380:23;8376:33;8373:53;;;8422:1;8419;8412:12;8373:53;8445:29;8464:9;8445:29;:::i;:::-;8435:39;;8521:2;8510:9;8506:18;8493:32;8483:42;;8572:2;8561:9;8557:18;8544:32;8534:42;;8626:2;8615:9;8611:18;8598:32;8670:4;8663:5;8659:16;8652:5;8649:27;8639:55;;8690:1;8687;8680:12;8639:55;8210:618;;;;-1:-1:-1;8210:618:1;;8765:3;8750:19;;8737:33;;8817:3;8802:19;;;8789:33;;-1:-1:-1;8210:618:1;-1:-1:-1;;8210:618:1:o;8833:260::-;8901:6;8909;8962:2;8950:9;8941:7;8937:23;8933:32;8930:52;;;8978:1;8975;8968:12;8930:52;9001:29;9020:9;9001:29;:::i;:::-;8991:39;;9049:38;9083:2;9072:9;9068:18;9049:38;:::i;:::-;9039:48;;8833:260;;;;;:::o;9098:350::-;9165:6;9173;9226:2;9214:9;9205:7;9201:23;9197:32;9194:52;;;9242:1;9239;9232:12;9194:52;9265:29;9284:9;9265:29;:::i;:::-;9255:39;;9344:2;9333:9;9329:18;9316:32;9388:10;9381:5;9377:22;9370:5;9367:33;9357:61;;9414:1;9411;9404:12;9752:437;9831:1;9827:12;;;;9874;;;9895:61;;9949:4;9941:6;9937:17;9927:27;;9895:61;10002:2;9994:6;9991:14;9971:18;9968:38;9965:218;;;10039:77;10036:1;10029:88;10140:4;10137:1;10130:15;10168:4;10165:1;10158:15;9965:218;;9752:437;;;:::o;12213:184::-;12265:77;12262:1;12255:88;12362:4;12359:1;12352:15;12386:4;12383:1;12376:15;12402:128;12442:3;12473:1;12469:6;12466:1;12463:13;12460:39;;;12479:18;;:::i;:::-;-1:-1:-1;12515:9:1;;12402:128::o;12535:195::-;12574:3;12605:66;12598:5;12595:77;12592:103;;;12675:18;;:::i;:::-;-1:-1:-1;12722:1:1;12711:13;;12535:195::o;13980:221::-;14019:4;14048:10;14108;;;;14078;;14130:12;;;14127:38;;;14145:18;;:::i;:::-;14182:13;;13980:221;-1:-1:-1;;;13980:221:1:o;14206:184::-;14258:77;14255:1;14248:88;14355:4;14352:1;14345:15;14379:4;14376:1;14369:15;14395:191;14434:1;14460:10;14497:2;14494:1;14490:10;14519:3;14509:37;;14526:18;;:::i;:::-;14564:10;;14560:20;;;;;14395:191;-1:-1:-1;;14395:191:1:o;15636:::-;15667:1;15693:18;15738:2;15735:1;15731:10;15760:3;15750:37;;15767:18;;:::i;:::-;15805:10;;15801:20;;;;;15636:191;-1:-1:-1;;15636:191:1:o;15832:236::-;15871:3;15899:18;15944:2;15941:1;15937:10;15974:2;15971:1;15967:10;16005:3;16001:2;15997:12;15992:3;15989:21;15986:47;;;16013:18;;:::i;:::-;16049:13;;15832:236;-1:-1:-1;;;;15832:236:1:o;16073:229::-;16112:4;16141:18;16209:10;;;;16179;;16231:12;;;16228:38;;;16246:18;;:::i;16307:199::-;16346:1;16372:18;16417:2;16414:1;16410:10;16439:3;16429:37;;16446:18;;:::i;16988:184::-;17040:77;17037:1;17030:88;17137:4;17134:1;17127:15;17161:4;17158:1;17151:15;17177:157;17207:1;17241:4;17238:1;17234:12;17265:3;17255:37;;17272:18;;:::i;:::-;17324:3;17317:4;17314:1;17310:12;17306:22;17301:27;;;17177:157;;;;:::o;17339:175::-;17376:3;17420:4;17413:5;17409:16;17449:4;17440:7;17437:17;17434:43;;;17457:18;;:::i;:::-;17506:1;17493:15;;17339:175;-1:-1:-1;;17339:175:1:o;20771:185::-;20813:3;20851:5;20845:12;20866:52;20911:6;20906:3;20899:4;20892:5;20888:16;20866:52;:::i;:::-;20934:16;;;;;20771:185;-1:-1:-1;;20771:185:1:o;21079:1548::-;21457:3;21486:1;21519:6;21513:13;21549:3;21571:1;21599:9;21595:2;21591:18;21581:28;;21659:2;21648:9;21644:18;21681;21671:61;;21725:4;21717:6;21713:17;21703:27;;21671:61;21751:2;21799;21791:6;21788:14;21768:18;21765:38;21762:222;;;21838:77;21833:3;21826:90;21939:4;21936:1;21929:15;21969:4;21964:3;21957:17;21762:222;22000:18;22027:162;;;;22203:1;22198:320;;;;21993:525;;22027:162;22075:66;22064:9;22060:82;22055:3;22048:95;22172:6;22167:3;22163:16;22156:23;;22027:162;;22198:320;20599:1;20592:14;;;20636:4;20623:18;;22293:1;22307:165;22321:6;22318:1;22315:13;22307:165;;;22399:14;;22386:11;;;22379:35;22442:16;;;;22336:10;;22307:165;;;22311:3;;22501:6;22496:3;22492:16;22485:23;;21993:525;;;;;;;22534:87;22559:61;22585:34;22615:3;20729;20717:16;;20758:1;20749:11;;20652:114;22585:34;22577:6;22559:61;:::i;:::-;21033:7;21021:20;;21066:1;21057:11;;20961:113;22534:87;22527:94;21079:1548;-1:-1:-1;;;;;21079:1548:1:o;24263:125::-;24303:4;24331:1;24328;24325:8;24322:34;;;24336:18;;:::i;:::-;-1:-1:-1;24373:9:1;;24263:125::o;24646:420::-;24861:42;24853:6;24849:55;24838:9;24831:74;24941:6;24936:2;24925:9;24921:18;24914:34;24984:2;24979;24968:9;24964:18;24957:30;24812:4;25004:56;25056:2;25045:9;25041:18;25033:6;25004:56;:::i;25071:245::-;25138:6;25191:2;25179:9;25170:7;25166:23;25162:32;25159:52;;;25207:1;25204;25197:12;25159:52;25239:9;25233:16;25258:28;25280:5;25258:28;:::i;26094:120::-;26134:1;26160;26150:35;;26165:18;;:::i;:::-;-1:-1:-1;26199:9:1;;26094:120::o;26219:112::-;26251:1;26277;26267:35;;26282:18;;:::i;:::-;-1:-1:-1;26316:9:1;;26219:112::o;27033:523::-;27227:4;27256:42;27337:2;27329:6;27325:15;27314:9;27307:34;27389:2;27381:6;27377:15;27372:2;27361:9;27357:18;27350:43;;27429:6;27424:2;27413:9;27409:18;27402:34;27472:3;27467:2;27456:9;27452:18;27445:31;27493:57;27545:3;27534:9;27530:19;27522:6;27493:57;:::i;:::-;27485:65;27033:523;-1:-1:-1;;;;;;27033:523:1:o;27561:249::-;27630:6;27683:2;27671:9;27662:7;27658:23;27654:32;27651:52;;;27699:1;27696;27689:12;27651:52;27731:9;27725:16;27750:30;27774:5;27750:30;:::i;28533:237::-;28572:4;28601:26;28677:10;;;;28647;;28699:12;;;28696:38;;;28714:18;;:::i;28775:228::-;28814:3;28842:10;28879:2;28876:1;28872:10;28909:2;28906:1;28902:10;28940:3;28936:2;28932:12;28927:3;28924:21;28921:47;;;28948:18;;:::i;29322:244::-;29361:3;29389:26;29442:2;29439:1;29435:10;29472:2;29469:1;29465:10;29503:3;29499:2;29495:12;29490:3;29487:21;29484:47;;;29511:18;;:::i

Swarm Source

ipfs://9814a71c587e6deb4d23886504260c89453cb7ad4502fcda41c5244aadcadc83
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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