Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
2,226 MSZ
Holders
530
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 MSZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Metastonez
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-28 */ // hevm: flattened sources of src/Metastonez.sol // SPDX-License-Identifier: MIT AND BSD-3-Clause AND GPL-3.0-or-later pragma solidity >=0.8.0 <0.9.0 >=0.8.6 <0.9.0; ////// lib/chainlink/contracts/src/v0.8/VRFRequestIDBase.sol /* pragma solidity ^0.8.0; */ 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)); } } ////// lib/chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol /* pragma solidity ^0.8.0; */ 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); } ////// lib/chainlink/contracts/src/v0.8/VRFConsumerBase.sol /* pragma solidity ^0.8.0; */ /* import "./interfaces/LinkTokenInterface.sol"; */ /* import "./VRFRequestIDBase.sol"; */ /** **************************************************************************** * @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); } } ////// lib/openzeppelin-contracts/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /* pragma solidity ^0.8.0; */ /** * @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; } } ////// lib/openzeppelin-contracts/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /* pragma solidity ^0.8.0; */ /* import "../utils/Context.sol"; */ /** * @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); } } ////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) /* pragma solidity ^0.8.0; */ /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } ////// lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /* pragma solidity ^0.8.0; */ /** * @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); } ////// lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /* pragma solidity ^0.8.0; */ /* import "../../utils/introspection/IERC165.sol"; */ /** * @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; } ////// lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /* pragma solidity ^0.8.0; */ /** * @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); } ////// lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /* pragma solidity ^0.8.0; */ /* import "../IERC721.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); } ////// lib/openzeppelin-contracts/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) /* pragma solidity ^0.8.0; */ /** * @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); } } } } ////// lib/openzeppelin-contracts/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /* pragma solidity ^0.8.0; */ /** * @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); } } ////// lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /* pragma solidity ^0.8.0; */ /* import "./IERC165.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; } } ////// lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) /* pragma solidity ^0.8.0; */ /* import "./IERC721.sol"; */ /* import "./IERC721Receiver.sol"; */ /* import "./extensions/IERC721Metadata.sol"; */ /* import "../../utils/Address.sol"; */ /* import "../../utils/Context.sol"; */ /* import "../../utils/Strings.sol"; */ /* import "../../utils/introspection/ERC165.sol"; */ /** * @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 {} } ////// lib/openzeppelin-contracts/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) /* pragma solidity ^0.8.0; */ /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } ////// lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) /* pragma solidity ^0.8.0; */ /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } ////// src/ERC721Checkpointable.sol /// @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. /* pragma solidity ^0.8.6; */ /* import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; */ /* import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; */ 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; } } ////// src/Metastonez.sol /* pragma solidity ^0.8.0; */ // Base contracts /* import "@openzeppelin/contracts/access/Ownable.sol"; */ /* import "./ERC721Checkpointable.sol"; */ // Chainlink related contracts /* import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; */ /* import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol"; */ // Utilities /* import "@openzeppelin/contracts/utils/Counters.sol"; */ /* import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; */ /* import "@openzeppelin/contracts/utils/Address.sol"; */ /* import "@openzeppelin/contracts/utils/Strings.sol"; */ // MMMMMMMNy+/:-......-:/+yNMMMMMMM // MMMMMMd-....---::---....-mMMMMMM // MMMMMMo.:/oossssssssoo/:.sMMMMMM // MMMMMy//osssss+//+ssssso/+yMMMMM // MMMMNs:..--://....//:--../sNMMMM // MMMMds:......+..../-.....:sdMMMM // MMMMhs:....../..../......:shMMMM // MMMMys:......:://::......:syMMMM // MMMMss:.....:osssso:.....:ssMMMM // MMMNss:.....-:////:-.....:ssNMMM // MMMMys:....-////////-..../syMMMM // MMMMNd/...-osssssssso-...+dNMMMM // MMMMMMo..................sMMMMMM // MMMMMdo-................-sdMMMMM // MMMMMysso+///::::::///+ossyMMMMM // MMMMMNdhyyssssssssssssyyhdNMMMMM contract Metastonez is Ownable, ERC721Checkpointable, VRFConsumerBase { using Counters for Counters.Counter; using Strings for uint256; // Metastonez is structured in several batches. // // A batch represents a range of tokens, where each batch // contains metadata generated with different parameters from other batches. // // Metadata is shuffled locally within each batch using entropy set // during reveal of the tokens. // // All batches are revealed at the same time. struct Batch { // The starting token ID in this batch (inclusive) uint256 startIndex; // The ending token ID in this batch (exclusive) uint256 endIndex; // The hash of the metadata URI bytes32 metadataHash; // The metadata URI (where `keccak256(metadata) == metadataHash`) string metadata; // The price per token in the batch. Batches are priced differently // because they are generated with different parameters. uint256 unitPrice; // The merkle root of the whitelist of the batch. bytes32 merkleRoot; // A bitmap of spent already spent merkle leaves in the whitelist. mapping(uint256 => uint256) spentLeaves; // The entropy used to shuffle the tokens. // Once this is set, all tokens are revealed simultaneously, // given that the metadata URI of the batch has also // been revealed. uint256 entropy; } // Metastonez has three initial batches: // // - The first one, "Genesis", contains a small set of Metastonez // - The second one, "Origins", contains a larger set of Metastonez // - The third one contains a set of 1/1s that will be auctioned off // using a separate mechanism. This batch will be minted by the // auction contract. // // It is possible for the owner to create more batches, e.g. for // collaboration tokens. The ownership of the contract is transferred // to the Metastonez DAO when minting is done. Batch[] public batches; // The batch that is currently (or about to be) minting uint256 public currentBatch = 0; enum MintState { Pause, Whitelist, Public } // The current state of minting // // The contract can be in three states: // - Pause: No one can mint // - Whitelist: Whitelist can mint // - Public: Anyone can mint // // The state can only transition in the following ways: // Pause -> Whitelist -> Public // // After a cycle has been completed the contract is put // back into a paused state and the `currentBatch` // state variable is incremented. // // Accounts can only mint the tokens available in // the current batch (denoted by `currentBatch`). MintState public mintState = MintState.Pause; // The IPFS CID for pre-reveal metadata string public prerevealMetadata; // The address that ether used for mint is sent to. address public immutable beneficiary; // The Chainlink token used for VRF fees. IERC20 public immutable linkToken; // Chainlink VRF key hash bytes32 internal immutable keyHash; // A mapping of Chainlink request IDs to batch IDs mapping(bytes32 => uint256) internal entropyRequests; // Total supply tracking Counters.Counter private _totalSupply; // A list of authorized contracts. // The intention is that the controller of Metastonez will be able to create more // batches in the future. In the case that smart wallets and/or account abstraction // become a prevalent thing, we want to be able to give control of minting // to a separate contract. mapping(address => bool) public authorizedContracts; constructor( address _beneficiary, string memory _prerevealMetadata, bytes32 _linkKeyHash, address _linkAddress, address _linkVrfCoordinatorAddress ) ERC721("MetaStonez", "MSZ") VRFConsumerBase(_linkVrfCoordinatorAddress, _linkAddress) { beneficiary = _beneficiary; prerevealMetadata = _prerevealMetadata; keyHash = _linkKeyHash; linkToken = IERC20(_linkAddress); } /** * @dev Creates a new batch of tokens with given supply, price and metadata. * * The metadata **SHOULD** be an IPFS CID and nothing else. * * Note: It is OK to create a batch without committing the metadata hash, * since the batch can only start minting once the hash is set (which can be set later). */ function createBatch( uint256 supply, bytes32 metadataHash, uint256 unitPrice ) external onlyOwner returns (uint256 batchId) { require( supply > 0, "Metastonez: BATCH_SIZE" ); uint256 startIndex = 0; if (batches.length > 0) { startIndex = batches[batches.length - 1].endIndex; } Batch storage batch = batches.push(); batch.startIndex = startIndex; batch.endIndex = startIndex + supply; batch.metadataHash = metadataHash; batch.unitPrice = unitPrice; return batches.length - 1; } /** * @dev Commits the hash of the metadata for the batch. * * This hash is used to prove that metadata was not shuffled * post-mint and must therefore be committed pre-mint. * * The metadata hash is committed upon batch creation, however * this method is intended to be a failsafe in case the committed * hash was wrong. */ function commitBatchMetadata( uint256 batchId, bytes32 metadataHash ) external onlyOwner { require( currentBatch < batchId || mintState == MintState.Pause, "Metastonez: BATCH_LOCKED" ); Batch storage batch = batches[batchId]; batch.metadataHash = metadataHash; } /** * @dev Reveals metadata for a given batch. * * The hash of the metadata *must* match the hash * committed to the batch before minting began. * * It is possible to reveal metadata _before_ * minting begins, since metadata "leaks" are not * a concern, as in the case of a batch * that is put up for auction. */ function revealBatchMetadata( uint256 batchId, string calldata metadata ) internal { Batch storage batch = batches[batchId]; require( keccak256(abi.encodePacked(metadata)) == batch.metadataHash, "Metastonez: INVALID_METADATA" ); batch.metadata = metadata; } /** * @dev Reveals a batch by revealing the metadata * and requesting shuffling entropy from Chainlink. */ function revealBatch( uint256 batchId, string calldata metadata, uint256 linkFee ) public onlyOwner returns (bytes32 requestId) { require(linkToken.balanceOf(address(this)) >= linkFee, "Metastonez: INSUFFICIENT_LINK"); require(batches[batchId].entropy == 0, "Metastonez: ENTROPY_ALREADY_SET"); revealBatchMetadata(batchId, metadata); requestId = requestRandomness(keyHash, linkFee); entropyRequests[requestId] = batchId; return requestId; } /** * @dev Sets the whitelist merkle root for a batch. * Fails if it is already set. */ function setBatchWhitelist( uint256 batchId, bytes32 merkleRoot ) external onlyOwner { Batch storage batch = batches[batchId]; require( batch.merkleRoot == 0, "Metastonez: WHITELIST_LOCKED" ); batch.merkleRoot = merkleRoot; } function transitionState() external onlyOwner { if (mintState == MintState.Pause) { require( batches.length > 0, "Metastonez: TRANS_NO_BATCHES" ); require( currentBatch <= batches.length - 1, "Metastonez: TRANS_NO_BATCH" ); Batch storage batch = batches[currentBatch]; require( batch.metadataHash != 0, "Metastonez: TRANS_METADATA_HASH" ); mintState = MintState.Whitelist; } else if (mintState == MintState.Whitelist) { mintState = MintState.Public; } else { require( _totalSupply.current() == batches[currentBatch].endIndex, "Metastonez: TRANS_MINTING" ); currentBatch = currentBatch + 1; mintState = MintState.Pause; } } /** * @dev Mints a token in the current batch for a * whitelisted user by submitting a merkle proof. * * Note that it is possible to perform the mint on * behalf of other accounts; given the proof is valid * the minted token will be sent to the account specified * in the parameter of the call. */ function mintWhitelist( uint256 index, address account, uint256 amount, bytes32[] calldata proof ) external payable { // Ensure that minting is enabled require( mintState != MintState.Pause, "Metastonez: MINT_PAUSED" ); // Check that this leaf was not already claimed Batch storage batch = batches[currentBatch]; require( !isClaimed(currentBatch, index), "Metastonez: MINT_ALREADY_CLAIMED" ); // Validate the proof bytes32 node = keccak256(abi.encodePacked(index, account, amount)); require( batch.merkleRoot != 0 && MerkleProof.verify(proof, batch.merkleRoot, node), "Metastonez: INVALID_PROOF" ); // Validate the sent value require(msg.value == batch.unitPrice * amount, "Metastonez: INVALID_VALUE"); // Validate that there are more tokens to mint require(_totalSupply.current() + amount <= batch.endIndex, "Metastonez: SUPPLY_EXHAUSTED"); // Set the leaf as claimed and mint the token _setClaimed(batch, index); for (uint256 i = 0; i < amount; i++) { _safeMint(account, _totalSupply.current()); _totalSupply.increment(); } } /** * @dev Public mint */ function mint() external payable { // Ensure that minting is enabled require( mintState == MintState.Public, "Metastonez: MINT_PAUSED" ); // Ensure caller is either an EOA or an approved contract require( tx.origin == msg.sender || authorizedContracts[msg.sender], "Metastonez: SENDER_NOT_ALLOWED" ); // Validate the sent value Batch storage batch = batches[currentBatch]; require(msg.value == batch.unitPrice, "Metastonez: INVALID_VALUE"); // Validate that there are more tokens to mint require(_totalSupply.current() + 1 <= batch.endIndex, "Metastonez: SUPPLY_EXHAUSTED"); _safeMint(msg.sender, _totalSupply.current()); _totalSupply.increment(); } function fulfillRandomness(bytes32 requestId, uint256 entropy) internal override { uint256 batchId = entropyRequests[requestId]; if (batches[batchId].entropy == 0) { batches[batchId].entropy = entropy; delete entropyRequests[requestId]; } } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "Metastonez: TOKEN_DOESNT_EXIST"); for (uint256 i = 0; i < batches.length; i++) { Batch storage batch = batches[i]; if (tokenId >= batch.startIndex && tokenId < batch.endIndex) { if (batch.entropy == 0 || bytes(batch.metadata).length == 0) { return string(abi.encodePacked("ipfs://", prerevealMetadata)); } require(bytes(batch.metadata).length > 0, "Metastonez: METADATA_UNREVEALED"); uint256 shuffledTokenId = computeShuffledIndex( uint64(tokenId - batch.startIndex), uint64(batch.endIndex - batch.startIndex), keccak256(abi.encode(batch.entropy)) ) + batch.startIndex; return string(abi.encodePacked("ipfs://", batch.metadata, "/", shuffledTokenId.toString(), ".json")); } } } function totalSupply() public view returns (uint256) { return _totalSupply.current(); } /** * @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; } /** * @dev Checks if a whitelist spot has already been used for * a given batch ID and whitelist index. */ function isClaimed( uint256 batchId, uint256 index ) public view returns (bool) { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; uint256 claimedWord = batches[batchId].spentLeaves[claimedWordIndex]; uint256 mask = (1 << claimedBitIndex); return claimedWord & mask == mask; } /** * @dev Mark a whitelist spot as claimed for a given batch. */ function _setClaimed( Batch storage batch, uint256 index ) private { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; batch.spentLeaves[claimedWordIndex] = batch.spentLeaves[claimedWordIndex] | (1 << claimedBitIndex); } /** * @dev Authorize a contract to mint. */ function authorizeContract(address contractAddress) public onlyOwner { authorizedContracts[contractAddress] = true; } /** * @dev Forbid a contract that has previously been authorized to mint. */ function forbidContract(address contractAddress) public onlyOwner { authorizedContracts[contractAddress] = false; } /** * @dev Withdraw all eth from the contract */ function withdraw() public { Address.sendValue(payable(beneficiary), address(this).balance); } /** * @dev Withdraw all of a token from the contract */ function withdrawToken(address tokenAddress) public onlyOwner { IERC20 token = IERC20(tokenAddress); token.transferFrom( address(this), beneficiary, token.balanceOf(address(this)) ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"string","name":"_prerevealMetadata","type":"string"},{"internalType":"bytes32","name":"_linkKeyHash","type":"bytes32"},{"internalType":"address","name":"_linkAddress","type":"address"},{"internalType":"address","name":"_linkVrfCoordinatorAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"authorizeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"batches","outputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"},{"internalType":"bytes32","name":"metadataHash","type":"bytes32"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"entropy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"batchId","type":"uint256"},{"internalType":"bytes32","name":"metadataHash","type":"bytes32"}],"name":"commitBatchMetadata","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"bytes32","name":"metadataHash","type":"bytes32"},{"internalType":"uint256","name":"unitPrice","type":"uint256"}],"name":"createBatch","outputs":[{"internalType":"uint256","name":"batchId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"forbidContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"enum Metastonez.MintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","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":"prerevealMetadata","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":"uint256","name":"batchId","type":"uint256"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256","name":"linkFee","type":"uint256"}],"name":"revealBatch","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":"uint256","name":"batchId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setBatchWhitelist","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":[],"name":"transitionState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"votesToDelegate","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040526000600d55600e805460ff191690553480156200002157600080fd5b5060405162005a8238038062005a8283398101604081905262000044916200023e565b80826040518060400160405280600a81526020016926b2ba30a9ba37b732bd60b11b8152506040518060400160405280600381526020016226a9ad60e91b8152506200009f620000996200012760201b60201c565b6200012b565b8151620000b49060019060208501906200017b565b508051620000ca9060029060208401906200017b565b5050506001600160601b0319606092831b811660a05290821b81166080529086901b1660c05283516200010590600f9060208701906200017b565b50506101009190915260601b6001600160601b03191660e05250620003b39050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001899062000360565b90600052602060002090601f016020900481019282620001ad5760008555620001f8565b82601f10620001c857805160ff1916838001178555620001f8565b82800160010185558215620001f8579182015b82811115620001f8578251825591602001919060010190620001db565b50620002069291506200020a565b5090565b5b808211156200020657600081556001016200020b565b80516001600160a01b03811681146200023957600080fd5b919050565b600080600080600060a086880312156200025757600080fd5b620002628662000221565b602087810151919650906001600160401b03808211156200028257600080fd5b818901915089601f8301126200029757600080fd5b815181811115620002ac57620002ac6200039d565b604051601f8201601f19908116603f01168101908382118183101715620002d757620002d76200039d565b816040528281528c86848701011115620002f057600080fd5b600093505b82841015620003145784840186015181850187015292850192620002f5565b82841115620003265760008684830101525b80995050505050505060408601519250620003446060870162000221565b9150620003546080870162000221565b90509295509295909350565b600181811c908216806200037557607f821691505b602082108114156200039757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c60c05160601c60e05160601c61010051615662620004206000396000612fef01526000818161056d0152612e8e0152600081816104c4015281816111dc01526120160152600081816121550152613cde01526000613ca201526156626000f3fe6080604052600436106103295760003560e01c806376cd940e116101a5578063b4b5ea57116100ec578063e430c33611610095578063e985e9c51161006f578063e985e9c5146109c0578063f1127ed814610a16578063f2fde38b14610a95578063f364c90c14610ab557600080fd5b8063e430c3361461094c578063e7a324dc1461096c578063e9580e91146109a057600080fd5b8063c3cda520116100c6578063c3cda520146108dc578063c87b56dd146108fc578063d5b9221b1461091c57600080fd5b8063b4b5ea5714610875578063b88d4fde14610895578063c051e38a146108b557600080fd5b806395d89b411161014e578063a05c281511610128578063a05c28151461080d578063a22cb46514610822578063b32c4d8d1461084257600080fd5b806395d89b411461079f5780639adab764146107b45780639c87be01146107ed57600080fd5b8063894760691161017f57806389476069146107345780638da5cb5b1461075457806394985ddd1461077f57600080fd5b806376cd940e146106b4578063782d6fe1146106ca5780637ecebe001461070757600080fd5b806342842e0e116102745780635c19a95c1161021d5780636e70de82116101f75780636e70de82146106225780636fcfff451461063757806370a082311461067f578063715018a61461069f57600080fd5b80635c19a95c146105c25780636352211e146105e257806367561d931461060257600080fd5b806357970e931161024e57806357970e931461055b578063585bbd611461058f578063587cde1e146105a257600080fd5b806342842e0e146104fb57806352438e541461051b578063534d36cc1461053b57600080fd5b806318160ddd116102d6578063313ce567116102b0578063313ce5671461048b57806338af3eed146104b25780633ccfd60b146104e657600080fd5b806318160ddd1461041457806320606b701461043757806323b872dd1461046b57600080fd5b8063081812fc11610307578063081812fc146103a7578063095ea7b3146103ec5780631249c58b1461040c57600080fd5b806301ffc9a71461032e578063059f16631461036357806306fdde0314610385575b600080fd5b34801561033a57600080fd5b5061034e610349366004614c5f565b610ad5565b60405190151581526020015b60405180910390f35b34801561036f57600080fd5b5061038361037e366004614c3d565b610bba565b005b34801561039157600080fd5b5061039a610cc8565b60405161035a91906150f5565b3480156103b357600080fd5b506103c76103c2366004614c99565b610d5a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161035a565b3480156103f857600080fd5b50610383610407366004614b61565b610e1a565b610383610f73565b34801561042057600080fd5b50610429611140565b60405190815260200161035a565b34801561044357600080fd5b506104297f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561047757600080fd5b506103836104863660046149f4565b611150565b34801561049757600080fd5b506104a0600081565b60405160ff909116815260200161035a565b3480156104be57600080fd5b506103c77f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f257600080fd5b506103836111d7565b34801561050757600080fd5b506103836105163660046149f4565b611203565b34801561052757600080fd5b506103836105363660046149a6565b61121e565b34801561054757600080fd5b50610383610556366004614c3d565b6112d1565b34801561056757600080fd5b506103c77f000000000000000000000000000000000000000000000000000000000000000081565b61038361059d366004614ccb565b6113ba565b3480156105ae57600080fd5b506103c76105bd3660046149a6565b6116a3565b3480156105ce57600080fd5b506103836105dd3660046149a6565b6116e2565b3480156105ee57600080fd5b506103c76105fd366004614c99565b61170a565b34801561060e57600080fd5b5061038361061d3660046149a6565b6117a2565b34801561062e57600080fd5b50610383611858565b34801561064357600080fd5b5061066a6106523660046149a6565b60096020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161035a565b34801561068b57600080fd5b5061042961069a3660046149a6565b611b3d565b3480156106ab57600080fd5b50610383611bf1565b3480156106c057600080fd5b50610429600d5481565b3480156106d657600080fd5b506106ea6106e5366004614b61565b611c62565b6040516bffffffffffffffffffffffff909116815260200161035a565b34801561071357600080fd5b506104296107223660046149a6565b600a6020526000908152604090205481565b34801561074057600080fd5b5061038361074f3660046149a6565b611f5f565b34801561076057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166103c7565b34801561078b57600080fd5b5061038361079a366004614c3d565b61213d565b3480156107ab57600080fd5b5061039a6121d0565b3480156107c057600080fd5b506107d46107cf366004614e10565b6121df565b60405167ffffffffffffffff909116815260200161035a565b3480156107f957600080fd5b50610429610808366004614d62565b612430565b34801561081957600080fd5b5061039a612598565b34801561082e57600080fd5b5061038361083d366004614b2a565b612626565b34801561084e57600080fd5b5061086261085d366004614c99565b612631565b60405161035a9796959493929190615108565b34801561088157600080fd5b506106ea6108903660046149a6565b61270b565b3480156108a157600080fd5b506103836108b0366004614a30565b6127a8565b3480156108c157600080fd5b50600e546108cf9060ff1681565b60405161035a91906150b4565b3480156108e857600080fd5b506103836108f7366004614b8b565b612836565b34801561090857600080fd5b5061039a610917366004614c99565b612bcb565b34801561092857600080fd5b5061034e6109373660046149a6565b60126020526000908152604090205460ff1681565b34801561095857600080fd5b50610429610967366004614d8e565b612df6565b34801561097857600080fd5b506104297fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b3480156109ac57600080fd5b506106ea6109bb3660046149a6565b613030565b3480156109cc57600080fd5b5061034e6109db3660046149c1565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a2257600080fd5b50610a6c610a31366004614beb565b600860209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b6040805163ffffffff90931683526bffffffffffffffffffffffff90911660208301520161035a565b348015610aa157600080fd5b50610383610ab03660046149a6565b61305c565b348015610ac157600080fd5b5061034e610ad0366004614c3d565b613155565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b6857507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610bb457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b81600d541080610c4c57506000600e5460ff166002811115610c4a57610c4a615475565b145b610c985760405162461bcd60e51b815260206004820152601860248201527f4d65746173746f6e657a3a2042415443485f4c4f434b454400000000000000006044820152606401610c1d565b6000600c8381548110610cad57610cad6154a4565b60009182526020909120600260089092020101919091555050565b606060018054610cd790615313565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0390615313565b8015610d505780601f10610d2557610100808354040283529160200191610d50565b820191906000526020600020905b815481529060010190602001808311610d3357829003601f168201915b5050505050905090565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610df15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c1d565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610e258261170a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ec95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c1d565b3373ffffffffffffffffffffffffffffffffffffffff82161480610ef25750610ef281336109db565b610f645760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c1d565b610f6e83836131be565b505050565b6002600e5460ff166002811115610f8c57610f8c615475565b14610fd95760405162461bcd60e51b815260206004820152601760248201527f4d65746173746f6e657a3a204d494e545f5041555345440000000000000000006044820152606401610c1d565b32331480610ff657503360009081526012602052604090205460ff165b6110425760405162461bcd60e51b815260206004820152601e60248201527f4d65746173746f6e657a3a2053454e4445525f4e4f545f414c4c4f57454400006044820152606401610c1d565b6000600c600d5481548110611059576110596154a4565b90600052602060002090600802019050806004015434146110bc5760405162461bcd60e51b815260206004820152601960248201527f4d65746173746f6e657a3a20494e56414c49445f56414c5545000000000000006044820152606401610c1d565b60018101546011546110cf90600161514c565b111561111d5760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a20535550504c595f455848415553544544000000006044820152606401610c1d565b61112f3361112a60115490565b61325e565b61113d601180546001019055565b50565b600061114b60115490565b905090565b61115a3382613278565b6111cc5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c1d565b610f6e8383836133ca565b6112017f000000000000000000000000000000000000000000000000000000000000000047613608565b565b610f6e838383604051806020016040528060008152506127a8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b73ffffffffffffffffffffffffffffffffffffffff16600090815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b6000600c838154811061134d5761134d6154a4565b9060005260206000209060080201905080600501546000801b146113b35760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a2057484954454c4953545f4c4f434b4544000000006044820152606401610c1d565b6005015550565b6000600e5460ff1660028111156113d3576113d3615475565b14156114215760405162461bcd60e51b815260206004820152601760248201527f4d65746173746f6e657a3a204d494e545f5041555345440000000000000000006044820152606401610c1d565b6000600c600d5481548110611438576114386154a4565b90600052602060002090600802019050611454600d5487613155565b156114a15760405162461bcd60e51b815260206004820181905260248201527f4d65746173746f6e657a3a204d494e545f414c52454144595f434c41494d45446044820152606401610c1d565b604080516020808201899052606088901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168284015260548083018890528351808403909101815260749092019092528051910120600582015415801590611546575061154684848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060058401548361372e565b6115925760405162461bcd60e51b815260206004820152601960248201527f4d65746173746f6e657a3a20494e56414c49445f50524f4f46000000000000006044820152606401610c1d565b8482600401546115a29190615228565b34146115f05760405162461bcd60e51b815260206004820152601960248201527f4d65746173746f6e657a3a20494e56414c49445f56414c5545000000000000006044820152606401610c1d565b8160010154856115ff60115490565b611609919061514c565b11156116575760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a20535550504c595f455848415553544544000000006044820152606401610c1d565b6116618288613744565b60005b85811015611699576116798761112a60115490565b611687601180546001019055565b8061169181615361565b915050611664565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526007602052604081205490911680156116d957806116db565b825b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166117005750335b61113d3382613785565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610bb45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c1d565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b73ffffffffffffffffffffffffffffffffffffffff16600090815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b6000600e5460ff1660028111156118d8576118d8615475565b1415611a3957600c5461192d5760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a205452414e535f4e4f5f42415443484553000000006044820152606401610c1d565b600c5461193c90600190615265565b600d54111561198d5760405162461bcd60e51b815260206004820152601a60248201527f4d65746173746f6e657a3a205452414e535f4e4f5f42415443480000000000006044820152606401610c1d565b6000600c600d54815481106119a4576119a46154a4565b9060005260206000209060080201905080600201546000801b1415611a0b5760405162461bcd60e51b815260206004820152601f60248201527f4d65746173746f6e657a3a205452414e535f4d455441444154415f48415348006044820152606401610c1d565b50600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600e5460ff166002811115611a5257611a52615475565b1415611a8557600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055565b600c600d5481548110611a9a57611a9a6154a4565b906000526020600020906008020160010154611ab560115490565b14611b025760405162461bcd60e51b815260206004820152601960248201527f4d65746173746f6e657a3a205452414e535f4d494e54494e47000000000000006044820152606401610c1d565b600d54611b1090600161514c565b600d55600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600073ffffffffffffffffffffffffffffffffffffffff8216611bc85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c1d565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b611201600061382a565b6000438210611cd95760405162461bcd60e51b815260206004820152603760248201527f455243373231436865636b706f696e7461626c653a3a6765745072696f72566f60448201527f7465733a206e6f74207965742064657465726d696e65640000000000000000006064820152608401610c1d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205463ffffffff1680611d14576000915050610bb4565b73ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081208491611d4660018561527c565b63ffffffff90811682526020820192909252604001600020541611611dcc5773ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812090611d9660018461527c565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169150610bb49050565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020908152604080832083805290915290205463ffffffff16831015611e14576000915050610bb4565b600080611e2260018461527c565b90505b8163ffffffff168163ffffffff161115611f075760006002611e47848461527c565b611e5191906151ea565b611e5b908361527c565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260086020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff1691810191909152919250871415611edb57602001519450610bb49350505050565b805163ffffffff16871115611ef257819350611f00565b611efd60018361527c565b92505b5050611e25565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611fc65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201819052829173ffffffffffffffffffffffffffffffffffffffff8316916323b872dd917f00000000000000000000000000000000000000000000000000000000000000009084906370a082319060240160206040518083038186803b15801561205957600080fd5b505afa15801561206d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120919190614cb2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401602060405180830381600087803b15801561210557600080fd5b505af1158015612119573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6e9190614c20565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146121c25760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610c1d565b6121cc828261389f565b5050565b606060028054610cd790615313565b60008267ffffffffffffffff168467ffffffffffffffff16106122445760405162461bcd60e51b815260206004820152601960248201527f537761704f724e6f743a20494e56414c49445f504152414d53000000000000006044820152606401610c1d565b60005b60188160ff16101561242757600084848360405160200161229792919091825260f81b7fff0000000000000000000000000000000000000000000000000000000000000016602082015260210190565b6040516020818303038152906040528051906020012060001c6122ba91906153ce565b9050600085876122ca828561518c565b6122d491906152a1565b6122de91906153ce565b905060008167ffffffffffffffff168867ffffffffffffffff16116123035781612305565b875b9050600086856123176101008561520d565b6040516020016123849392919092835260f89190911b7fff0000000000000000000000000000000000000000000000000000000000000016602083015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016602182015260290190565b6040516020818303038152906040528051906020012090506000816008610100856123af91906153ce565b6123b9919061520d565b67ffffffffffffffff16602081106123d3576123d36154a4565b1a9050600060026123e56008866153ce565b67ffffffffffffffff168360ff16901c6123ff91906153f5565b905060ff81161561240e57849a505b505050505050808061241f9061539a565b915050612247565b50929392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146124985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b600084116124e85760405162461bcd60e51b815260206004820152601660248201527f4d65746173746f6e657a3a2042415443485f53495a45000000000000000000006044820152606401610c1d565b600c546000901561252857600c805461250390600190615265565b81548110612513576125136154a4565b90600052602060002090600802016001015490505b600c80546001810182556000919091526008027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70181815561256a868361514c565b6001808301919091556002820186905560048201859055600c5461258e9190615265565b9695505050505050565b600f80546125a590615313565b80601f01602080910402602001604051908101604052809291908181526020018280546125d190615313565b801561261e5780601f106125f35761010080835404028352916020019161261e565b820191906000526020600020905b81548152906001019060200180831161260157829003601f168201915b505050505081565b6121cc33838361391a565b600c818154811061264157600080fd5b906000526020600020906008020160009150905080600001549080600101549080600201549080600301805461267690615313565b80601f01602080910402602001604051908101604052809291908181526020018280546126a290615313565b80156126ef5780601f106126c4576101008083540402835291602001916126ef565b820191906000526020600020905b8154815290600101906020018083116126d257829003601f168201915b5050505050908060040154908060050154908060070154905087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081205463ffffffff16806127435760006116db565b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604081209061277460018461527c565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169392505050565b6127b23383613278565b6128245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c1d565b61283084848484613a2e565b50505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866612861610cc8565b8051906020012061286f4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c084015273ffffffffffffffffffffffffffffffffffffffff8b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401909252815191909301207f1901000000000000000000000000000000000000000000000000000000000000610160830152610162820183905261018282018190529192506000906101a201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156129e1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612a955760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964207369676e6174757265000000000000000000006064820152608401610c1d565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120805491612ac683615361565b919050558914612b3e5760405162461bcd60e51b815260206004820152603260248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964206e6f6e636500000000000000000000000000006064820152608401610c1d565b87421115612bb45760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a207369676e61747572652065787069726564000000000000000000006064820152608401610c1d565b612bbe818b613785565b505050505b505050505050565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16612c3f5760405162461bcd60e51b815260206004820152601e60248201527f4d65746173746f6e657a3a20544f4b454e5f444f45534e545f455849535400006044820152606401610c1d565b60005b600c54811015612df0576000600c8281548110612c6157612c616154a4565b9060005260206000209060080201905080600001548410158015612c885750806001015484105b15612ddd5760078101541580612cac5750806003018054612ca890615313565b1590505b15612cdb57600f604051602001612cc39190614f67565b60405160208183030381529060405292505050919050565b6000816003018054612cec90615313565b905011612d3b5760405162461bcd60e51b815260206004820152601f60248201527f4d65746173746f6e657a3a204d455441444154415f554e52455645414c4544006044820152606401610c1d565b8054600090612d90612d4d8288615265565b84546001860154612d5e9190615265565b8560070154604051602001612d7591815260200190565b604051602081830303815290604052805190602001206121df565b67ffffffffffffffff16612da4919061514c565b905081600301612db382613ab7565b604051602001612dc4929190614f99565b6040516020818303038152906040529350505050919050565b5080612de881615361565b915050612c42565b50919050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314612e5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015612ee557600080fd5b505afa158015612ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1d9190614cb2565b1015612f6b5760405162461bcd60e51b815260206004820152601d60248201527f4d65746173746f6e657a3a20494e53554646494349454e545f4c494e4b0000006044820152606401610c1d565b600c8581548110612f7e57612f7e6154a4565b906000526020600020906008020160070154600014612fdf5760405162461bcd60e51b815260206004820152601f60248201527f4d65746173746f6e657a3a20454e54524f50595f414c52454144595f534554006044820152606401610c1d565b612fea858585613be9565b6130147f000000000000000000000000000000000000000000000000000000000000000083613c9e565b600081815260106020526040902086905590505b949350505050565b6000610bb461303e83611b3d565b6040518060600160405280603d81526020016155b9603d9139613e36565b60005473ffffffffffffffffffffffffffffffffffffffff1633146130c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b73ffffffffffffffffffffffffffffffffffffffff811661314c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c1d565b61113d8161382a565b600080613164610100846151d6565b90506000613174610100856153ba565b90506000600c868154811061318b5761318b6154a4565b60009182526020808320958352600660089092029095010190935250604090912054600190911b90811614905092915050565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906132188261170a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6121cc828260405180602001604052806000815250613e6e565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1661330f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c1d565b600061331a8361170a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061338957508373ffffffffffffffffffffffffffffffffffffffff1661337184610d5a565b73ffffffffffffffffffffffffffffffffffffffff16145b80613028575073ffffffffffffffffffffffffffffffffffffffff80821660009081526006602090815260408083209388168352929052205460ff16613028565b8273ffffffffffffffffffffffffffffffffffffffff166133ea8261170a565b73ffffffffffffffffffffffffffffffffffffffff16146134735760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610c1d565b73ffffffffffffffffffffffffffffffffffffffff82166134fb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c1d565b613506838383613ef7565b6135116000826131be565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805460019290613547908490615265565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061358290849061514c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b804710156136585760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c1d565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146136b2576040519150601f19603f3d011682016040523d82523d6000602084013e6136b7565b606091505b5050905080610f6e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c1d565b60008261373b8584613f13565b14949350505050565b6000613752610100836151d6565b90506000613762610100846153ba565b6000928352600690940160205250604090208054600190931b9290921790915550565b6000613790836116a3565b73ffffffffffffffffffffffffffffffffffffffff84811660008181526007602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4600061381d84613030565b9050612830828483613fbf565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260106020526040902054600c8054829081106138c2576138c26154a4565b90600052602060002090600802016007015460001415610f6e5781600c82815481106138f0576138f06154a4565b60009182526020808320600760089093020191909101929092559384526010905250506040812055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c1d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613a398484846133ca565b613a45848484846141e4565b6128305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c1d565b606081613af757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613b215780613b0b81615361565b9150613b1a9050600a836151d6565b9150613afb565b60008167ffffffffffffffff811115613b3c57613b3c6154d3565b6040519080825280601f01601f191660200182016040528015613b66576020820181803683370190505b5090505b841561302857613b7b600183615265565b9150613b88600a866153ba565b613b9390603061514c565b60f81b818381518110613ba857613ba86154a4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613be2600a866151d6565b9450613b6a565b6000600c8481548110613bfe57613bfe6154a4565b9060005260206000209060080201905080600201548383604051602001613c26929190614f57565b6040516020818303038152906040528051906020012014613c895760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a20494e56414c49445f4d45544144415441000000006044820152606401610c1d565b613c976003820184846148ae565b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000000000000000000000000000000000000000000084866000604051602001613d1b929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613d4893929190615076565b602060405180830381600087803b158015613d6257600080fd5b505af1158015613d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9a9190614c20565b506000838152600b6020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a090910190925281519183019190912093879052919052613df690600161514c565b6000858152600b60205260409020556130288482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6000816c010000000000000000000000008410613e665760405162461bcd60e51b8152600401610c1d91906150f5565b509192915050565b613e7883836143c6565b613e8560008484846141e4565b610f6e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c1d565b610f6e613f03846116a3565b613f0c846116a3565b6001613fbf565b600081815b8451811015613fb7576000858281518110613f3557613f356154a4565b60200260200101519050808311613f77576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613fa4565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080613faf81615361565b915050613f18565b509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561400957506000816bffffffffffffffffffffffff16115b15610f6e5773ffffffffffffffffffffffffffffffffffffffff8316156140fb5773ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604081205463ffffffff1690816140635760006140c2565b73ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604081209061409460018561527c565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b905060006140e982856040518060600160405280603781526020016155f660379139614560565b90506140f7868484846145ac565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615610f6e5773ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604081205463ffffffff1690816141505760006141af565b73ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081209061418160018561527c565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b905060006141d6828560405180606001604052806036815260200161553f6036913961482f565b9050612bc3858484846145ac565b600073ffffffffffffffffffffffffffffffffffffffff84163b156143be576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061425b903390899088908890600401615037565b602060405180830381600087803b15801561427557600080fd5b505af19250505080156142c3575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526142c091810190614c7c565b60015b614373573d8080156142f1576040519150601f19603f3d011682016040523d82523d6000602084013e6142f6565b606091505b50805161436b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c1d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050613028565b506001613028565b73ffffffffffffffffffffffffffffffffffffffff82166144295760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c1d565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff161561449b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c1d565b6144a760008383613ef7565b73ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906144dd90849061514c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff16111582906145a15760405162461bcd60e51b8152600401610c1d91906150f5565b5061302883856152c2565b60006145d04360405180608001604052806044815260200161557560449139614886565b905060008463ffffffff16118015614637575073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812063ffffffff83169161461b60018861527c565b63ffffffff908116825260208201929092526040016000205416145b156146cd5773ffffffffffffffffffffffffffffffffffffffff85166000908152600860205260408120839161466e60018861527c565b63ffffffff168152602081019190915260400160002080546bffffffffffffffffffffffff92909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff9092169190911790556147c8565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000908152600882528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691161791909117905561476f846001615164565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b604080516bffffffffffffffffffffffff80861682528416602082015273ffffffffffffffffffffffffffffffffffffffff8716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b60008061483c84866151af565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff161015839061487d5760405162461bcd60e51b8152600401610c1d91906150f5565b50949350505050565b6000816401000000008410613e665760405162461bcd60e51b8152600401610c1d91906150f5565b8280546148ba90615313565b90600052602060002090601f0160209004810192826148dc5760008555614940565b82601f10614913578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614940565b82800160010185558215614940579182015b82811115614940578235825591602001919060010190614925565b5061494c929150614950565b5090565b5b8082111561494c5760008155600101614951565b803573ffffffffffffffffffffffffffffffffffffffff8116811461498957600080fd5b919050565b803567ffffffffffffffff8116811461498957600080fd5b6000602082840312156149b857600080fd5b6116db82614965565b600080604083850312156149d457600080fd5b6149dd83614965565b91506149eb60208401614965565b90509250929050565b600080600060608486031215614a0957600080fd5b614a1284614965565b9250614a2060208501614965565b9150604084013590509250925092565b60008060008060808587031215614a4657600080fd5b614a4f85614965565b9350614a5d60208601614965565b925060408501359150606085013567ffffffffffffffff80821115614a8157600080fd5b818701915087601f830112614a9557600080fd5b813581811115614aa757614aa76154d3565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715614aed57614aed6154d3565b816040528281528a6020848701011115614b0657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215614b3d57600080fd5b614b4683614965565b91506020830135614b5681615502565b809150509250929050565b60008060408385031215614b7457600080fd5b614b7d83614965565b946020939093013593505050565b60008060008060008060c08789031215614ba457600080fd5b614bad87614965565b95506020870135945060408701359350606087013560ff81168114614bd157600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215614bfe57600080fd5b614c0783614965565b9150602083013563ffffffff81168114614b5657600080fd5b600060208284031215614c3257600080fd5b81516116db81615502565b60008060408385031215614c5057600080fd5b50508035926020909101359150565b600060208284031215614c7157600080fd5b81356116db81615510565b600060208284031215614c8e57600080fd5b81516116db81615510565b600060208284031215614cab57600080fd5b5035919050565b600060208284031215614cc457600080fd5b5051919050565b600080600080600060808688031215614ce357600080fd5b85359450614cf360208701614965565b935060408601359250606086013567ffffffffffffffff80821115614d1757600080fd5b818801915088601f830112614d2b57600080fd5b813581811115614d3a57600080fd5b8960208260051b8501011115614d4f57600080fd5b9699959850939650602001949392505050565b600080600060608486031215614d7757600080fd5b505081359360208301359350604090920135919050565b60008060008060608587031215614da457600080fd5b84359350602085013567ffffffffffffffff80821115614dc357600080fd5b818701915087601f830112614dd757600080fd5b813581811115614de657600080fd5b886020828501011115614df857600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215614e2557600080fd5b614e2e8461498e565b9250614a206020850161498e565b60008151808452614e548160208601602086016152e7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c9080831680614ea057607f831692505b6020808410821415614edb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b818015614eef5760018114614f1e57614f4b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614f4b565b60008881526020902060005b86811015614f435781548b820152908501908301614f2a565b505084890196505b50505050505092915050565b8183823760009101908152919050565b7f697066733a2f2f00000000000000000000000000000000000000000000000000815260006116db6007830184614e86565b7f697066733a2f2f0000000000000000000000000000000000000000000000000081526000614fcb6007830185614e86565b7f2f00000000000000000000000000000000000000000000000000000000000000815283516150018160018401602088016152e7565b7f2e6a736f6e00000000000000000000000000000000000000000000000000000060019290910191820152600601949350505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261258e6080830184614e3c565b73ffffffffffffffffffffffffffffffffffffffff841681528260208201526060604082015260006150ab6060830184614e3c565b95945050505050565b60208101600383106150ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6020815260006116db6020830184614e3c565b87815286602082015285604082015260e06060820152600061512d60e0830187614e3c565b60808301959095525060a081019290925260c090910152949350505050565b6000821982111561515f5761515f615417565b500190565b600063ffffffff80831681851680830382111561518357615183615417565b01949350505050565b600067ffffffffffffffff80831681851680830382111561518357615183615417565b60006bffffffffffffffffffffffff80831681851680830382111561518357615183615417565b6000826151e5576151e5615446565b500490565b600063ffffffff8084168061520157615201615446565b92169190910492915050565b600067ffffffffffffffff8084168061520157615201615446565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561526057615260615417565b500290565b60008282101561527757615277615417565b500390565b600063ffffffff8381169083168181101561529957615299615417565b039392505050565b600067ffffffffffffffff8381169083168181101561529957615299615417565b60006bffffffffffffffffffffffff8381169083168181101561529957615299615417565b60005b838110156153025781810151838201526020016152ea565b838111156128305750506000910152565b600181811c9082168061532757607f821691505b60208210811415612df0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561539357615393615417565b5060010190565b600060ff821660ff8114156153b1576153b1615417565b60010192915050565b6000826153c9576153c9615446565b500690565b600067ffffffffffffffff808416806153e9576153e9615446565b92169190910692915050565b600060ff83168061540857615408615446565b8060ff84160691505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461113d57600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461113d57600080fdfe455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f7773455243373231436865636b706f696e7461626c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473455243373231436865636b706f696e7461626c653a3a766f746573546f44656c65676174653a20616d6f756e7420657863656564732039362062697473455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f7773a26469706673582212201d04ea3bdc10e20368a9c55172444df95d392f7e4eac3e820925aa8e97cbcc9164736f6c63430008070033000000000000000000000000dafd368df40b8c0a8c117c02fc9c863bc6082ab500000000000000000000000000000000000000000000000000000000000000a0aa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000000000000000000000000000000000000000002e516d633236546363684a39564c64667a71553975377459725564703862744161706e5257714d666a3863366f4d6f000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103295760003560e01c806376cd940e116101a5578063b4b5ea57116100ec578063e430c33611610095578063e985e9c51161006f578063e985e9c5146109c0578063f1127ed814610a16578063f2fde38b14610a95578063f364c90c14610ab557600080fd5b8063e430c3361461094c578063e7a324dc1461096c578063e9580e91146109a057600080fd5b8063c3cda520116100c6578063c3cda520146108dc578063c87b56dd146108fc578063d5b9221b1461091c57600080fd5b8063b4b5ea5714610875578063b88d4fde14610895578063c051e38a146108b557600080fd5b806395d89b411161014e578063a05c281511610128578063a05c28151461080d578063a22cb46514610822578063b32c4d8d1461084257600080fd5b806395d89b411461079f5780639adab764146107b45780639c87be01146107ed57600080fd5b8063894760691161017f57806389476069146107345780638da5cb5b1461075457806394985ddd1461077f57600080fd5b806376cd940e146106b4578063782d6fe1146106ca5780637ecebe001461070757600080fd5b806342842e0e116102745780635c19a95c1161021d5780636e70de82116101f75780636e70de82146106225780636fcfff451461063757806370a082311461067f578063715018a61461069f57600080fd5b80635c19a95c146105c25780636352211e146105e257806367561d931461060257600080fd5b806357970e931161024e57806357970e931461055b578063585bbd611461058f578063587cde1e146105a257600080fd5b806342842e0e146104fb57806352438e541461051b578063534d36cc1461053b57600080fd5b806318160ddd116102d6578063313ce567116102b0578063313ce5671461048b57806338af3eed146104b25780633ccfd60b146104e657600080fd5b806318160ddd1461041457806320606b701461043757806323b872dd1461046b57600080fd5b8063081812fc11610307578063081812fc146103a7578063095ea7b3146103ec5780631249c58b1461040c57600080fd5b806301ffc9a71461032e578063059f16631461036357806306fdde0314610385575b600080fd5b34801561033a57600080fd5b5061034e610349366004614c5f565b610ad5565b60405190151581526020015b60405180910390f35b34801561036f57600080fd5b5061038361037e366004614c3d565b610bba565b005b34801561039157600080fd5b5061039a610cc8565b60405161035a91906150f5565b3480156103b357600080fd5b506103c76103c2366004614c99565b610d5a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161035a565b3480156103f857600080fd5b50610383610407366004614b61565b610e1a565b610383610f73565b34801561042057600080fd5b50610429611140565b60405190815260200161035a565b34801561044357600080fd5b506104297f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561047757600080fd5b506103836104863660046149f4565b611150565b34801561049757600080fd5b506104a0600081565b60405160ff909116815260200161035a565b3480156104be57600080fd5b506103c77f000000000000000000000000dafd368df40b8c0a8c117c02fc9c863bc6082ab581565b3480156104f257600080fd5b506103836111d7565b34801561050757600080fd5b506103836105163660046149f4565b611203565b34801561052757600080fd5b506103836105363660046149a6565b61121e565b34801561054757600080fd5b50610383610556366004614c3d565b6112d1565b34801561056757600080fd5b506103c77f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca81565b61038361059d366004614ccb565b6113ba565b3480156105ae57600080fd5b506103c76105bd3660046149a6565b6116a3565b3480156105ce57600080fd5b506103836105dd3660046149a6565b6116e2565b3480156105ee57600080fd5b506103c76105fd366004614c99565b61170a565b34801561060e57600080fd5b5061038361061d3660046149a6565b6117a2565b34801561062e57600080fd5b50610383611858565b34801561064357600080fd5b5061066a6106523660046149a6565b60096020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161035a565b34801561068b57600080fd5b5061042961069a3660046149a6565b611b3d565b3480156106ab57600080fd5b50610383611bf1565b3480156106c057600080fd5b50610429600d5481565b3480156106d657600080fd5b506106ea6106e5366004614b61565b611c62565b6040516bffffffffffffffffffffffff909116815260200161035a565b34801561071357600080fd5b506104296107223660046149a6565b600a6020526000908152604090205481565b34801561074057600080fd5b5061038361074f3660046149a6565b611f5f565b34801561076057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166103c7565b34801561078b57600080fd5b5061038361079a366004614c3d565b61213d565b3480156107ab57600080fd5b5061039a6121d0565b3480156107c057600080fd5b506107d46107cf366004614e10565b6121df565b60405167ffffffffffffffff909116815260200161035a565b3480156107f957600080fd5b50610429610808366004614d62565b612430565b34801561081957600080fd5b5061039a612598565b34801561082e57600080fd5b5061038361083d366004614b2a565b612626565b34801561084e57600080fd5b5061086261085d366004614c99565b612631565b60405161035a9796959493929190615108565b34801561088157600080fd5b506106ea6108903660046149a6565b61270b565b3480156108a157600080fd5b506103836108b0366004614a30565b6127a8565b3480156108c157600080fd5b50600e546108cf9060ff1681565b60405161035a91906150b4565b3480156108e857600080fd5b506103836108f7366004614b8b565b612836565b34801561090857600080fd5b5061039a610917366004614c99565b612bcb565b34801561092857600080fd5b5061034e6109373660046149a6565b60126020526000908152604090205460ff1681565b34801561095857600080fd5b50610429610967366004614d8e565b612df6565b34801561097857600080fd5b506104297fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b3480156109ac57600080fd5b506106ea6109bb3660046149a6565b613030565b3480156109cc57600080fd5b5061034e6109db3660046149c1565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a2257600080fd5b50610a6c610a31366004614beb565b600860209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b6040805163ffffffff90931683526bffffffffffffffffffffffff90911660208301520161035a565b348015610aa157600080fd5b50610383610ab03660046149a6565b61305c565b348015610ac157600080fd5b5061034e610ad0366004614c3d565b613155565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b6857507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610bb457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b81600d541080610c4c57506000600e5460ff166002811115610c4a57610c4a615475565b145b610c985760405162461bcd60e51b815260206004820152601860248201527f4d65746173746f6e657a3a2042415443485f4c4f434b454400000000000000006044820152606401610c1d565b6000600c8381548110610cad57610cad6154a4565b60009182526020909120600260089092020101919091555050565b606060018054610cd790615313565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0390615313565b8015610d505780601f10610d2557610100808354040283529160200191610d50565b820191906000526020600020905b815481529060010190602001808311610d3357829003601f168201915b5050505050905090565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610df15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c1d565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610e258261170a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ec95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c1d565b3373ffffffffffffffffffffffffffffffffffffffff82161480610ef25750610ef281336109db565b610f645760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c1d565b610f6e83836131be565b505050565b6002600e5460ff166002811115610f8c57610f8c615475565b14610fd95760405162461bcd60e51b815260206004820152601760248201527f4d65746173746f6e657a3a204d494e545f5041555345440000000000000000006044820152606401610c1d565b32331480610ff657503360009081526012602052604090205460ff165b6110425760405162461bcd60e51b815260206004820152601e60248201527f4d65746173746f6e657a3a2053454e4445525f4e4f545f414c4c4f57454400006044820152606401610c1d565b6000600c600d5481548110611059576110596154a4565b90600052602060002090600802019050806004015434146110bc5760405162461bcd60e51b815260206004820152601960248201527f4d65746173746f6e657a3a20494e56414c49445f56414c5545000000000000006044820152606401610c1d565b60018101546011546110cf90600161514c565b111561111d5760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a20535550504c595f455848415553544544000000006044820152606401610c1d565b61112f3361112a60115490565b61325e565b61113d601180546001019055565b50565b600061114b60115490565b905090565b61115a3382613278565b6111cc5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c1d565b610f6e8383836133ca565b6112017f000000000000000000000000dafd368df40b8c0a8c117c02fc9c863bc6082ab547613608565b565b610f6e838383604051806020016040528060008152506127a8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b73ffffffffffffffffffffffffffffffffffffffff16600090815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b6000600c838154811061134d5761134d6154a4565b9060005260206000209060080201905080600501546000801b146113b35760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a2057484954454c4953545f4c4f434b4544000000006044820152606401610c1d565b6005015550565b6000600e5460ff1660028111156113d3576113d3615475565b14156114215760405162461bcd60e51b815260206004820152601760248201527f4d65746173746f6e657a3a204d494e545f5041555345440000000000000000006044820152606401610c1d565b6000600c600d5481548110611438576114386154a4565b90600052602060002090600802019050611454600d5487613155565b156114a15760405162461bcd60e51b815260206004820181905260248201527f4d65746173746f6e657a3a204d494e545f414c52454144595f434c41494d45446044820152606401610c1d565b604080516020808201899052606088901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168284015260548083018890528351808403909101815260749092019092528051910120600582015415801590611546575061154684848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060058401548361372e565b6115925760405162461bcd60e51b815260206004820152601960248201527f4d65746173746f6e657a3a20494e56414c49445f50524f4f46000000000000006044820152606401610c1d565b8482600401546115a29190615228565b34146115f05760405162461bcd60e51b815260206004820152601960248201527f4d65746173746f6e657a3a20494e56414c49445f56414c5545000000000000006044820152606401610c1d565b8160010154856115ff60115490565b611609919061514c565b11156116575760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a20535550504c595f455848415553544544000000006044820152606401610c1d565b6116618288613744565b60005b85811015611699576116798761112a60115490565b611687601180546001019055565b8061169181615361565b915050611664565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526007602052604081205490911680156116d957806116db565b825b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166117005750335b61113d3382613785565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610bb45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c1d565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b73ffffffffffffffffffffffffffffffffffffffff16600090815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b6000600e5460ff1660028111156118d8576118d8615475565b1415611a3957600c5461192d5760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a205452414e535f4e4f5f42415443484553000000006044820152606401610c1d565b600c5461193c90600190615265565b600d54111561198d5760405162461bcd60e51b815260206004820152601a60248201527f4d65746173746f6e657a3a205452414e535f4e4f5f42415443480000000000006044820152606401610c1d565b6000600c600d54815481106119a4576119a46154a4565b9060005260206000209060080201905080600201546000801b1415611a0b5760405162461bcd60e51b815260206004820152601f60248201527f4d65746173746f6e657a3a205452414e535f4d455441444154415f48415348006044820152606401610c1d565b50600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600e5460ff166002811115611a5257611a52615475565b1415611a8557600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055565b600c600d5481548110611a9a57611a9a6154a4565b906000526020600020906008020160010154611ab560115490565b14611b025760405162461bcd60e51b815260206004820152601960248201527f4d65746173746f6e657a3a205452414e535f4d494e54494e47000000000000006044820152606401610c1d565b600d54611b1090600161514c565b600d55600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600073ffffffffffffffffffffffffffffffffffffffff8216611bc85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c1d565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b611201600061382a565b6000438210611cd95760405162461bcd60e51b815260206004820152603760248201527f455243373231436865636b706f696e7461626c653a3a6765745072696f72566f60448201527f7465733a206e6f74207965742064657465726d696e65640000000000000000006064820152608401610c1d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205463ffffffff1680611d14576000915050610bb4565b73ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081208491611d4660018561527c565b63ffffffff90811682526020820192909252604001600020541611611dcc5773ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812090611d9660018461527c565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169150610bb49050565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020908152604080832083805290915290205463ffffffff16831015611e14576000915050610bb4565b600080611e2260018461527c565b90505b8163ffffffff168163ffffffff161115611f075760006002611e47848461527c565b611e5191906151ea565b611e5b908361527c565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260086020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff1691810191909152919250871415611edb57602001519450610bb49350505050565b805163ffffffff16871115611ef257819350611f00565b611efd60018361527c565b92505b5050611e25565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611fc65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201819052829173ffffffffffffffffffffffffffffffffffffffff8316916323b872dd917f000000000000000000000000dafd368df40b8c0a8c117c02fc9c863bc6082ab59084906370a082319060240160206040518083038186803b15801561205957600080fd5b505afa15801561206d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120919190614cb2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401602060405180830381600087803b15801561210557600080fd5b505af1158015612119573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6e9190614c20565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795216146121c25760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610c1d565b6121cc828261389f565b5050565b606060028054610cd790615313565b60008267ffffffffffffffff168467ffffffffffffffff16106122445760405162461bcd60e51b815260206004820152601960248201527f537761704f724e6f743a20494e56414c49445f504152414d53000000000000006044820152606401610c1d565b60005b60188160ff16101561242757600084848360405160200161229792919091825260f81b7fff0000000000000000000000000000000000000000000000000000000000000016602082015260210190565b6040516020818303038152906040528051906020012060001c6122ba91906153ce565b9050600085876122ca828561518c565b6122d491906152a1565b6122de91906153ce565b905060008167ffffffffffffffff168867ffffffffffffffff16116123035781612305565b875b9050600086856123176101008561520d565b6040516020016123849392919092835260f89190911b7fff0000000000000000000000000000000000000000000000000000000000000016602083015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016602182015260290190565b6040516020818303038152906040528051906020012090506000816008610100856123af91906153ce565b6123b9919061520d565b67ffffffffffffffff16602081106123d3576123d36154a4565b1a9050600060026123e56008866153ce565b67ffffffffffffffff168360ff16901c6123ff91906153f5565b905060ff81161561240e57849a505b505050505050808061241f9061539a565b915050612247565b50929392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146124985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b600084116124e85760405162461bcd60e51b815260206004820152601660248201527f4d65746173746f6e657a3a2042415443485f53495a45000000000000000000006044820152606401610c1d565b600c546000901561252857600c805461250390600190615265565b81548110612513576125136154a4565b90600052602060002090600802016001015490505b600c80546001810182556000919091526008027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70181815561256a868361514c565b6001808301919091556002820186905560048201859055600c5461258e9190615265565b9695505050505050565b600f80546125a590615313565b80601f01602080910402602001604051908101604052809291908181526020018280546125d190615313565b801561261e5780601f106125f35761010080835404028352916020019161261e565b820191906000526020600020905b81548152906001019060200180831161260157829003601f168201915b505050505081565b6121cc33838361391a565b600c818154811061264157600080fd5b906000526020600020906008020160009150905080600001549080600101549080600201549080600301805461267690615313565b80601f01602080910402602001604051908101604052809291908181526020018280546126a290615313565b80156126ef5780601f106126c4576101008083540402835291602001916126ef565b820191906000526020600020905b8154815290600101906020018083116126d257829003601f168201915b5050505050908060040154908060050154908060070154905087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081205463ffffffff16806127435760006116db565b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604081209061277460018461527c565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169392505050565b6127b23383613278565b6128245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c1d565b61283084848484613a2e565b50505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866612861610cc8565b8051906020012061286f4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c084015273ffffffffffffffffffffffffffffffffffffffff8b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401909252815191909301207f1901000000000000000000000000000000000000000000000000000000000000610160830152610162820183905261018282018190529192506000906101a201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156129e1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612a955760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964207369676e6174757265000000000000000000006064820152608401610c1d565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120805491612ac683615361565b919050558914612b3e5760405162461bcd60e51b815260206004820152603260248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964206e6f6e636500000000000000000000000000006064820152608401610c1d565b87421115612bb45760405162461bcd60e51b815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a207369676e61747572652065787069726564000000000000000000006064820152608401610c1d565b612bbe818b613785565b505050505b505050505050565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16612c3f5760405162461bcd60e51b815260206004820152601e60248201527f4d65746173746f6e657a3a20544f4b454e5f444f45534e545f455849535400006044820152606401610c1d565b60005b600c54811015612df0576000600c8281548110612c6157612c616154a4565b9060005260206000209060080201905080600001548410158015612c885750806001015484105b15612ddd5760078101541580612cac5750806003018054612ca890615313565b1590505b15612cdb57600f604051602001612cc39190614f67565b60405160208183030381529060405292505050919050565b6000816003018054612cec90615313565b905011612d3b5760405162461bcd60e51b815260206004820152601f60248201527f4d65746173746f6e657a3a204d455441444154415f554e52455645414c4544006044820152606401610c1d565b8054600090612d90612d4d8288615265565b84546001860154612d5e9190615265565b8560070154604051602001612d7591815260200190565b604051602081830303815290604052805190602001206121df565b67ffffffffffffffff16612da4919061514c565b905081600301612db382613ab7565b604051602001612dc4929190614f99565b6040516020818303038152906040529350505050919050565b5080612de881615361565b915050612c42565b50919050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314612e5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282907f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015612ee557600080fd5b505afa158015612ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1d9190614cb2565b1015612f6b5760405162461bcd60e51b815260206004820152601d60248201527f4d65746173746f6e657a3a20494e53554646494349454e545f4c494e4b0000006044820152606401610c1d565b600c8581548110612f7e57612f7e6154a4565b906000526020600020906008020160070154600014612fdf5760405162461bcd60e51b815260206004820152601f60248201527f4d65746173746f6e657a3a20454e54524f50595f414c52454144595f534554006044820152606401610c1d565b612fea858585613be9565b6130147faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af44583613c9e565b600081815260106020526040902086905590505b949350505050565b6000610bb461303e83611b3d565b6040518060600160405280603d81526020016155b9603d9139613e36565b60005473ffffffffffffffffffffffffffffffffffffffff1633146130c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c1d565b73ffffffffffffffffffffffffffffffffffffffff811661314c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c1d565b61113d8161382a565b600080613164610100846151d6565b90506000613174610100856153ba565b90506000600c868154811061318b5761318b6154a4565b60009182526020808320958352600660089092029095010190935250604090912054600190911b90811614905092915050565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906132188261170a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6121cc828260405180602001604052806000815250613e6e565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1661330f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c1d565b600061331a8361170a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061338957508373ffffffffffffffffffffffffffffffffffffffff1661337184610d5a565b73ffffffffffffffffffffffffffffffffffffffff16145b80613028575073ffffffffffffffffffffffffffffffffffffffff80821660009081526006602090815260408083209388168352929052205460ff16613028565b8273ffffffffffffffffffffffffffffffffffffffff166133ea8261170a565b73ffffffffffffffffffffffffffffffffffffffff16146134735760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610c1d565b73ffffffffffffffffffffffffffffffffffffffff82166134fb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c1d565b613506838383613ef7565b6135116000826131be565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805460019290613547908490615265565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061358290849061514c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b804710156136585760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c1d565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146136b2576040519150601f19603f3d011682016040523d82523d6000602084013e6136b7565b606091505b5050905080610f6e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c1d565b60008261373b8584613f13565b14949350505050565b6000613752610100836151d6565b90506000613762610100846153ba565b6000928352600690940160205250604090208054600190931b9290921790915550565b6000613790836116a3565b73ffffffffffffffffffffffffffffffffffffffff84811660008181526007602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4600061381d84613030565b9050612830828483613fbf565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260106020526040902054600c8054829081106138c2576138c26154a4565b90600052602060002090600802016007015460001415610f6e5781600c82815481106138f0576138f06154a4565b60009182526020808320600760089093020191909101929092559384526010905250506040812055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c1d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613a398484846133ca565b613a45848484846141e4565b6128305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c1d565b606081613af757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613b215780613b0b81615361565b9150613b1a9050600a836151d6565b9150613afb565b60008167ffffffffffffffff811115613b3c57613b3c6154d3565b6040519080825280601f01601f191660200182016040528015613b66576020820181803683370190505b5090505b841561302857613b7b600183615265565b9150613b88600a866153ba565b613b9390603061514c565b60f81b818381518110613ba857613ba86154a4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613be2600a866151d6565b9450613b6a565b6000600c8481548110613bfe57613bfe6154a4565b9060005260206000209060080201905080600201548383604051602001613c26929190614f57565b6040516020818303038152906040528051906020012014613c895760405162461bcd60e51b815260206004820152601c60248201527f4d65746173746f6e657a3a20494e56414c49445f4d45544144415441000000006044820152606401610c1d565b613c976003820184846148ae565b5050505050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795284866000604051602001613d1b929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613d4893929190615076565b602060405180830381600087803b158015613d6257600080fd5b505af1158015613d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9a9190614c20565b506000838152600b6020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a090910190925281519183019190912093879052919052613df690600161514c565b6000858152600b60205260409020556130288482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6000816c010000000000000000000000008410613e665760405162461bcd60e51b8152600401610c1d91906150f5565b509192915050565b613e7883836143c6565b613e8560008484846141e4565b610f6e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c1d565b610f6e613f03846116a3565b613f0c846116a3565b6001613fbf565b600081815b8451811015613fb7576000858281518110613f3557613f356154a4565b60200260200101519050808311613f77576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613fa4565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080613faf81615361565b915050613f18565b509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561400957506000816bffffffffffffffffffffffff16115b15610f6e5773ffffffffffffffffffffffffffffffffffffffff8316156140fb5773ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604081205463ffffffff1690816140635760006140c2565b73ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604081209061409460018561527c565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b905060006140e982856040518060600160405280603781526020016155f660379139614560565b90506140f7868484846145ac565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615610f6e5773ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604081205463ffffffff1690816141505760006141af565b73ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081209061418160018561527c565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b905060006141d6828560405180606001604052806036815260200161553f6036913961482f565b9050612bc3858484846145ac565b600073ffffffffffffffffffffffffffffffffffffffff84163b156143be576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061425b903390899088908890600401615037565b602060405180830381600087803b15801561427557600080fd5b505af19250505080156142c3575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526142c091810190614c7c565b60015b614373573d8080156142f1576040519150601f19603f3d011682016040523d82523d6000602084013e6142f6565b606091505b50805161436b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c1d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050613028565b506001613028565b73ffffffffffffffffffffffffffffffffffffffff82166144295760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c1d565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff161561449b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c1d565b6144a760008383613ef7565b73ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906144dd90849061514c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff16111582906145a15760405162461bcd60e51b8152600401610c1d91906150f5565b5061302883856152c2565b60006145d04360405180608001604052806044815260200161557560449139614886565b905060008463ffffffff16118015614637575073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812063ffffffff83169161461b60018861527c565b63ffffffff908116825260208201929092526040016000205416145b156146cd5773ffffffffffffffffffffffffffffffffffffffff85166000908152600860205260408120839161466e60018861527c565b63ffffffff168152602081019190915260400160002080546bffffffffffffffffffffffff92909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff9092169190911790556147c8565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000908152600882528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691161791909117905561476f846001615164565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b604080516bffffffffffffffffffffffff80861682528416602082015273ffffffffffffffffffffffffffffffffffffffff8716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b60008061483c84866151af565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff161015839061487d5760405162461bcd60e51b8152600401610c1d91906150f5565b50949350505050565b6000816401000000008410613e665760405162461bcd60e51b8152600401610c1d91906150f5565b8280546148ba90615313565b90600052602060002090601f0160209004810192826148dc5760008555614940565b82601f10614913578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614940565b82800160010185558215614940579182015b82811115614940578235825591602001919060010190614925565b5061494c929150614950565b5090565b5b8082111561494c5760008155600101614951565b803573ffffffffffffffffffffffffffffffffffffffff8116811461498957600080fd5b919050565b803567ffffffffffffffff8116811461498957600080fd5b6000602082840312156149b857600080fd5b6116db82614965565b600080604083850312156149d457600080fd5b6149dd83614965565b91506149eb60208401614965565b90509250929050565b600080600060608486031215614a0957600080fd5b614a1284614965565b9250614a2060208501614965565b9150604084013590509250925092565b60008060008060808587031215614a4657600080fd5b614a4f85614965565b9350614a5d60208601614965565b925060408501359150606085013567ffffffffffffffff80821115614a8157600080fd5b818701915087601f830112614a9557600080fd5b813581811115614aa757614aa76154d3565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715614aed57614aed6154d3565b816040528281528a6020848701011115614b0657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215614b3d57600080fd5b614b4683614965565b91506020830135614b5681615502565b809150509250929050565b60008060408385031215614b7457600080fd5b614b7d83614965565b946020939093013593505050565b60008060008060008060c08789031215614ba457600080fd5b614bad87614965565b95506020870135945060408701359350606087013560ff81168114614bd157600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215614bfe57600080fd5b614c0783614965565b9150602083013563ffffffff81168114614b5657600080fd5b600060208284031215614c3257600080fd5b81516116db81615502565b60008060408385031215614c5057600080fd5b50508035926020909101359150565b600060208284031215614c7157600080fd5b81356116db81615510565b600060208284031215614c8e57600080fd5b81516116db81615510565b600060208284031215614cab57600080fd5b5035919050565b600060208284031215614cc457600080fd5b5051919050565b600080600080600060808688031215614ce357600080fd5b85359450614cf360208701614965565b935060408601359250606086013567ffffffffffffffff80821115614d1757600080fd5b818801915088601f830112614d2b57600080fd5b813581811115614d3a57600080fd5b8960208260051b8501011115614d4f57600080fd5b9699959850939650602001949392505050565b600080600060608486031215614d7757600080fd5b505081359360208301359350604090920135919050565b60008060008060608587031215614da457600080fd5b84359350602085013567ffffffffffffffff80821115614dc357600080fd5b818701915087601f830112614dd757600080fd5b813581811115614de657600080fd5b886020828501011115614df857600080fd5b95986020929092019750949560400135945092505050565b600080600060608486031215614e2557600080fd5b614e2e8461498e565b9250614a206020850161498e565b60008151808452614e548160208601602086016152e7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c9080831680614ea057607f831692505b6020808410821415614edb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b818015614eef5760018114614f1e57614f4b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614f4b565b60008881526020902060005b86811015614f435781548b820152908501908301614f2a565b505084890196505b50505050505092915050565b8183823760009101908152919050565b7f697066733a2f2f00000000000000000000000000000000000000000000000000815260006116db6007830184614e86565b7f697066733a2f2f0000000000000000000000000000000000000000000000000081526000614fcb6007830185614e86565b7f2f00000000000000000000000000000000000000000000000000000000000000815283516150018160018401602088016152e7565b7f2e6a736f6e00000000000000000000000000000000000000000000000000000060019290910191820152600601949350505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261258e6080830184614e3c565b73ffffffffffffffffffffffffffffffffffffffff841681528260208201526060604082015260006150ab6060830184614e3c565b95945050505050565b60208101600383106150ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6020815260006116db6020830184614e3c565b87815286602082015285604082015260e06060820152600061512d60e0830187614e3c565b60808301959095525060a081019290925260c090910152949350505050565b6000821982111561515f5761515f615417565b500190565b600063ffffffff80831681851680830382111561518357615183615417565b01949350505050565b600067ffffffffffffffff80831681851680830382111561518357615183615417565b60006bffffffffffffffffffffffff80831681851680830382111561518357615183615417565b6000826151e5576151e5615446565b500490565b600063ffffffff8084168061520157615201615446565b92169190910492915050565b600067ffffffffffffffff8084168061520157615201615446565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561526057615260615417565b500290565b60008282101561527757615277615417565b500390565b600063ffffffff8381169083168181101561529957615299615417565b039392505050565b600067ffffffffffffffff8381169083168181101561529957615299615417565b60006bffffffffffffffffffffffff8381169083168181101561529957615299615417565b60005b838110156153025781810151838201526020016152ea565b838111156128305750506000910152565b600181811c9082168061532757607f821691505b60208210811415612df0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561539357615393615417565b5060010190565b600060ff821660ff8114156153b1576153b1615417565b60010192915050565b6000826153c9576153c9615446565b500690565b600067ffffffffffffffff808416806153e9576153e9615446565b92169190910692915050565b600060ff83168061540857615408615446565b8060ff84160691505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461113d57600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461113d57600080fdfe455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f7773455243373231436865636b706f696e7461626c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473455243373231436865636b706f696e7461626c653a3a766f746573546f44656c65676174653a20616d6f756e7420657863656564732039362062697473455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f7773a26469706673582212201d04ea3bdc10e20368a9c55172444df95d392f7e4eac3e820925aa8e97cbcc9164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dafd368df40b8c0a8c117c02fc9c863bc6082ab500000000000000000000000000000000000000000000000000000000000000a0aa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000000000000000000000000000000000000000002e516d633236546363684a39564c64667a71553975377459725564703862744161706e5257714d666a3863366f4d6f000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _beneficiary (address): 0xDaFD368dF40b8c0A8c117C02fc9C863bC6082ab5
Arg [1] : _prerevealMetadata (string): Qmc26TcchJ9VLdfzqU9u7tYrUdp8btAapnRWqMfj8c6oMo
Arg [2] : _linkKeyHash (bytes32): 0xaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
Arg [3] : _linkAddress (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [4] : _linkVrfCoordinatorAddress (address): 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000dafd368df40b8c0a8c117c02fc9c863bc6082ab5
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : aa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
Arg [3] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [4] : 000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952
Arg [5] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [6] : 516d633236546363684a39564c64667a71553975377459725564703862744161
Arg [7] : 706e5257714d666a3863366f4d6f000000000000000000000000000000000000
Deployed Bytecode Sourcemap
70214:14747:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40702:305;;;;;;;;;;-1:-1:-1;40702:305:0;;;;;:::i;:::-;;:::i;:::-;;;14992:14:1;;14985:22;14967:41;;14955:2;14940:18;40702:305:0;;;;;;;;75629:325;;;;;;;;;;-1:-1:-1;75629:325:0;;;;;:::i;:::-;;:::i;:::-;;41647:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43206:221::-;;;;;;;;;;-1:-1:-1;43206:221:0;;;;;:::i;:::-;;:::i;:::-;;;13440:42:1;13428:55;;;13410:74;;13398:2;13383:18;43206:221:0;13264:226:1;42729:411:0;;;;;;;;;;-1:-1:-1;42729:411:0;;;;;:::i;:::-;;:::i;80094:753::-;;;:::i;82067:93::-;;;;;;;;;;;;;:::i;:::-;;;15165:25:1;;;15153:2;15138:18;82067:93:0;15019:177:1;59818:131:0;;;;;;;;;;;;59869:80;59818:131;;43956:339;;;;;;;;;;-1:-1:-1;43956:339:0;;;;;:::i;:::-;;:::i;59175:34::-;;;;;;;;;;;;59208:1;59175:34;;;;;35343:4:1;35331:17;;;35313:36;;35301:2;35286:18;59175:34:0;35171:184:1;73128:36:0;;;;;;;;;;;;;;;84560:102;;;;;;;;;;;;;:::i;44366:185::-;;;;;;;;;;-1:-1:-1;44366:185:0;;;;;:::i;:::-;;:::i;84371:123::-;;;;;;;;;;-1:-1:-1;84371:123:0;;;;;:::i;:::-;;:::i;77381:288::-;;;;;;;;;;-1:-1:-1;77381:288:0;;;;;:::i;:::-;;:::i;73216:33::-;;;;;;;;;;;;;;;78824:1227;;;;;;:::i;:::-;;:::i;61257:187::-;;;;;;;;;;-1:-1:-1;61257:187:0;;;;;:::i;:::-;;:::i;62133:164::-;;;;;;;;;;-1:-1:-1;62133:164:0;;;;;:::i;:::-;;:::i;41341:239::-;;;;;;;;;;-1:-1:-1;41341:239:0;;;;;:::i;:::-;;:::i;84152:125::-;;;;;;;;;;-1:-1:-1;84152:125:0;;;;;:::i;:::-;;:::i;77675:810::-;;;;;;;;;;;;;:::i;59697:48::-;;;;;;;;;;-1:-1:-1;59697:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34644:10:1;34632:23;;;34614:42;;34602:2;34587:18;59697:48:0;34470:192:1;41071:208:0;;;;;;;;;;-1:-1:-1;41071:208:0;;;;;:::i;:::-;;:::i;15752:103::-;;;;;;;;;;;;;:::i;72281:31::-;;;;;;;;;;;;;;;;64527:1237;;;;;;;;;;-1:-1:-1;64527:1237:0;;;;;:::i;:::-;;:::i;:::-;;;35534:26:1;35522:39;;;35504:58;;35492:2;35477:18;64527:1237:0;35360:208:1;60250:41:0;;;;;;;;;;-1:-1:-1;60250:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;84735:223;;;;;;;;;;-1:-1:-1;84735:223:0;;;;;:::i;:::-;;:::i;15101:87::-;;;;;;;;;;-1:-1:-1;15147:7:0;15174:6;;;15101:87;;12865:210;;;;;;;;;;-1:-1:-1;12865:210:0;;;;;:::i;:::-;;:::i;41816:104::-;;;;;;;;;;;;;:::i;82410:825::-;;;;;;;;;;-1:-1:-1;82410:825:0;;;;;:::i;:::-;;:::i;:::-;;;35140:18:1;35128:31;;;35110:50;;35098:2;35083:18;82410:825:0;34966:200:1;74660:599:0;;;;;;;;;;-1:-1:-1;74660:599:0;;;;;:::i;:::-;;:::i;73035:31::-;;;;;;;;;;;;;:::i;43499:155::-;;;;;;;;;;-1:-1:-1;43499:155:0;;;;;:::i;:::-;;:::i;72195:22::-;;;;;;;;;;-1:-1:-1;72195:22:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;63874:222::-;;;;;;;;;;-1:-1:-1;63874:222:0;;;;;:::i;:::-;;:::i;44622:328::-;;;;;;;;;;-1:-1:-1;44622:328:0;;;;;:::i;:::-;;:::i;72941:44::-;;;;;;;;;;-1:-1:-1;72941:44:0;;;;;;;;;;;;;;;:::i;62731:942::-;;;;;;;;;;-1:-1:-1;62731:942:0;;;;;:::i;:::-;;:::i;81131:931::-;;;;;;;;;;-1:-1:-1;81131:931:0;;;;;:::i;:::-;;:::i;73829:51::-;;;;;;;;;;-1:-1:-1;73829:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;76759:513;;;;;;;;;;-1:-1:-1;76759:513:0;;;;;:::i;:::-;;:::i;60043:126::-;;;;;;;;;;;;60098:71;60043:126;;60847:192;;;;;;;;;;-1:-1:-1;60847:192:0;;;;;:::i;:::-;;:::i;43725:164::-;;;;;;;;;;-1:-1:-1;43725:164:0;;;;;:::i;:::-;43846:25;;;;43822:4;43846:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43725:164;59560:68;;;;;;;;;;-1:-1:-1;59560:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34867:10:1;34855:23;;;34837:42;;34927:26;34915:39;;;34910:2;34895:18;;34888:67;34810:18;59560:68:0;34667:294:1;16010:201:0;;;;;;;;;;-1:-1:-1;16010:201:0;;;;;:::i;:::-;;:::i;83363:365::-;;;;;;;;;;-1:-1:-1;83363:365:0;;;;;:::i;:::-;;:::i;40702:305::-;40804:4;40841:40;;;40856:25;40841:40;;:105;;-1:-1:-1;40898:48:0;;;40913:33;40898:48;40841:105;:158;;;-1:-1:-1;38972:25:0;38957:40;;;;40963:36;40821:178;40702:305;-1:-1:-1;;40702:305:0:o;75629:325::-;15147:7;15174:6;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;;;;;;;;;75782:7:::1;75767:12;;:22;:54;;;-1:-1:-1::0;75806:15:0::1;75793:9;::::0;::::1;;:28;::::0;::::1;;;;;;:::i;:::-;;75767:54;75751:112;;;::::0;-1:-1:-1;;;75751:112:0;;30501:2:1;75751:112:0::1;::::0;::::1;30483:21:1::0;30540:2;30520:18;;;30513:30;30579:26;30559:18;;;30552:54;30623:18;;75751:112:0::1;30299:348:1::0;75751:112:0::1;75870:19;75892:7;75900;75892:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;75915:18:::1;75892:16;::::0;;::::1;;75915:18;:33:::0;;;;-1:-1:-1;;75629:325:0:o;41647:100::-;41701:13;41734:5;41727:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41647:100;:::o;43206:221::-;43282:7;46549:16;;;:7;:16;;;;;;:30;:16;43302:73;;;;-1:-1:-1;;;43302:73:0;;28251:2:1;43302:73:0;;;28233:21:1;28290:2;28270:18;;;28263:30;28329:34;28309:18;;;28302:62;28400:14;28380:18;;;28373:42;28432:19;;43302:73:0;28049:408:1;43302:73:0;-1:-1:-1;43395:24:0;;;;:15;:24;;;;;;;;;43206:221::o;42729:411::-;42810:13;42826:23;42841:7;42826:14;:23::i;:::-;42810:39;;42874:5;42868:11;;:2;:11;;;;42860:57;;;;-1:-1:-1;;;42860:57:0;;30099:2:1;42860:57:0;;;30081:21:1;30138:2;30118:18;;;30111:30;30177:34;30157:18;;;30150:62;30248:3;30228:18;;;30221:31;30269:19;;42860:57:0;29897:397:1;42860:57:0;13854:10;42952:21;;;;;:62;;-1:-1:-1;42977:37:0;42994:5;13854:10;43725:164;:::i;42977:37::-;42930:168;;;;-1:-1:-1;;;42930:168:0;;25216:2:1;42930:168:0;;;25198:21:1;25255:2;25235:18;;;25228:30;25294:34;25274:18;;;25267:62;25365:26;25345:18;;;25338:54;25409:19;;42930:168:0;25014:420:1;42930:168:0;43111:21;43120:2;43124:7;43111:8;:21::i;:::-;42799:341;42729:411;;:::o;80094:753::-;80202:16;80189:9;;;;:29;;;;;;;;:::i;:::-;;80173:86;;;;-1:-1:-1;;;80173:86:0;;30854:2:1;80173:86:0;;;30836:21:1;30893:2;30873:18;;;30866:30;30932:25;30912:18;;;30905:53;30975:18;;80173:86:0;30652:347:1;80173:86:0;80347:9;80360:10;80347:23;;:58;;-1:-1:-1;80394:10:0;80374:31;;;;:19;:31;;;;;;;;80347:58;80331:122;;;;-1:-1:-1;;;80331:122:0;;27174:2:1;80331:122:0;;;27156:21:1;27213:2;27193:18;;;27186:30;27252:32;27232:18;;;27225:60;27302:18;;80331:122:0;26972:354:1;80331:122:0;80494:19;80516:7;80524:12;;80516:21;;;;;;;;:::i;:::-;;;;;;;;;;;80494:43;;80565:5;:15;;;80552:9;:28;80544:66;;;;-1:-1:-1;;;80544:66:0;;32048:2:1;80544:66:0;;;32030:21:1;32087:2;32067:18;;;32060:30;32126:27;32106:18;;;32099:55;32171:18;;80544:66:0;31846:349:1;80544:66:0;80709:14;;;;80679:12;54793:14;80679:26;;80704:1;80679:26;:::i;:::-;:44;;80671:85;;;;-1:-1:-1;;;80671:85:0;;19825:2:1;80671:85:0;;;19807:21:1;19864:2;19844:18;;;19837:30;19903;19883:18;;;19876:58;19951:18;;80671:85:0;19623:352:1;80671:85:0;80765:45;80775:10;80787:22;:12;54793:14;;54701:114;80787:22;80765:9;:45::i;:::-;80817:24;:12;54912:19;;54930:1;54912:19;;;54823:127;80817:24;80127:720;80094:753::o;82067:93::-;82111:7;82133:22;:12;54793:14;;54701:114;82133:22;82126:29;;82067:93;:::o;43956:339::-;44151:41;13854:10;44184:7;44151:18;:41::i;:::-;44143:103;;;;-1:-1:-1;;;44143:103:0;;31206:2:1;44143:103:0;;;31188:21:1;31245:2;31225:18;;;31218:30;31284:34;31264:18;;;31257:62;31355:19;31335:18;;;31328:47;31392:19;;44143:103:0;31004:413:1;44143:103:0;44259:28;44269:4;44275:2;44279:7;44259:9;:28::i;84560:102::-;84594:62;84620:11;84634:21;84594:17;:62::i;:::-;84560:102::o;44366:185::-;44504:39;44521:4;44527:2;44531:7;44504:39;;;;;;;;;;;;:16;:39::i;84371:123::-;15147:7;15174:6;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;28462:356:1;15313:68:0;84444:36:::1;;84483:5;84444:36:::0;;;:19:::1;:36;::::0;;;;:44;;;::::1;::::0;;84371:123::o;77381:288::-;15147:7;15174:6;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;28462:356:1;15313:68:0;77499:19:::1;77521:7;77529;77521:16;;;;;;;;:::i;:::-;;;;;;;;;;;77499:38;;77560:5;:16;;;77580:1;77560:21:::0;::::1;;77544:83;;;::::0;-1:-1:-1;;;77544:83:0;;26817:2:1;77544:83:0::1;::::0;::::1;26799:21:1::0;26856:2;26836:18;;;26829:30;26895;26875:18;;;26868:58;26943:18;;77544:83:0::1;26615:352:1::0;77544:83:0::1;77634:16;;:29:::0;-1:-1:-1;77381:288:0:o;78824:1227::-;79051:15;79038:9;;;;:28;;;;;;;;:::i;:::-;;;79022:85;;;;-1:-1:-1;;;79022:85:0;;30854:2:1;79022:85:0;;;30836:21:1;30893:2;30873:18;;;30866:30;30932:25;30912:18;;;30905:53;30975:18;;79022:85:0;30652:347:1;79022:85:0;79169:19;79191:7;79199:12;;79191:21;;;;;;;;:::i;:::-;;;;;;;;;;;79169:43;;79236:30;79246:12;;79260:5;79236:9;:30::i;:::-;79235:31;79219:97;;;;-1:-1:-1;;;79219:97:0;;33474:2:1;79219:97:0;;;33456:21:1;;;33493:18;;;33486:30;33552:34;33532:18;;;33525:62;33604:18;;79219:97:0;33272:356:1;79219:97:0;79377:40;;;;;;;13050:19:1;;;13107:2;13103:15;;;13120:66;13099:88;13085:12;;;13078:110;13204:12;;;;13197:28;;;79377:40:0;;;;;;;;;;13241:12:1;;;;79377:40:0;;;79367:51;;;;;79441:16;;;;:21;;;;:74;;;79466:49;79485:5;;79466:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;79492:16:0;;;;79510:4;79466:18;:49::i;:::-;79425:133;;;;-1:-1:-1;;;79425:133:0;;20182:2:1;79425:133:0;;;20164:21:1;20221:2;20201:18;;;20194:30;20260:27;20240:18;;;20233:55;20305:18;;79425:133:0;19980:349:1;79425:133:0;79638:6;79620:5;:15;;;:24;;;;:::i;:::-;79607:9;:37;79599:75;;;;-1:-1:-1;;;79599:75:0;;32048:2:1;79599:75:0;;;32030:21:1;32087:2;32067:18;;;32060:30;32126:27;32106:18;;;32099:55;32171:18;;79599:75:0;31846:349:1;79599:75:0;79778:5;:14;;;79768:6;79743:22;:12;54793:14;;54701:114;79743:22;:31;;;;:::i;:::-;:49;;79735:90;;;;-1:-1:-1;;;79735:90:0;;19825:2:1;79735:90:0;;;19807:21:1;19864:2;19844:18;;;19837:30;19903;19883:18;;;19876:58;19951:18;;79735:90:0;19623:352:1;79735:90:0;79885:25;79897:5;79904;79885:11;:25::i;:::-;79922:9;79917:129;79941:6;79937:1;:10;79917:129;;;79963:42;79973:7;79982:22;:12;54793:14;;54701:114;79963:42;80014:24;:12;54912:19;;54930:1;54912:19;;;54823:127;80014:24;79949:3;;;;:::i;:::-;;;;79917:129;;;;78976:1075;;78824:1227;;;;;:::o;61257:187::-;61354:21;;;;61316:7;61354:21;;;:10;:21;;;;;;61316:7;;61354:21;61393;;:43;;61429:7;61393:43;;;61417:9;61393:43;61386:50;61257:187;-1:-1:-1;;;61257:187:0:o;62133:164::-;62192:23;;;62188:51;;-1:-1:-1;62229:10:0;62188:51;62257:32;62267:10;62279:9;62257;:32::i;41341:239::-;41413:7;41449:16;;;:7;:16;;;;;;;;41484:19;41476:73;;;;-1:-1:-1;;;41476:73:0;;26052:2:1;41476:73:0;;;26034:21:1;26091:2;26071:18;;;26064:30;26130:34;26110:18;;;26103:62;26201:11;26181:18;;;26174:39;26230:19;;41476:73:0;25850:405:1;84152:125:0;15147:7;15174:6;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;28462:356:1;15313:68:0;84228:36:::1;;;::::0;;;:19:::1;:36;::::0;;;;:43;;;::::1;84267:4;84228:43;::::0;;84152:125::o;77675:810::-;15147:7;15174:6;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;28462:356:1;15313:68:0;77745:15:::1;77732:9;::::0;::::1;;:28;::::0;::::1;;;;;;:::i;:::-;;77728:752;;;77789:7;:14:::0;77771:86:::1;;;::::0;-1:-1:-1;;;77771:86:0;;18267:2:1;77771:86:0::1;::::0;::::1;18249:21:1::0;18306:2;18286:18;;;18279:30;18345;18325:18;;;18318:58;18393:18;;77771:86:0::1;18065:352:1::0;77771:86:0::1;77900:7;:14:::0;:18:::1;::::0;77917:1:::1;::::0;77900:18:::1;:::i;:::-;77884:12;;:34;;77866:100;;;::::0;-1:-1:-1;;;77866:100:0;;26462:2:1;77866:100:0::1;::::0;::::1;26444:21:1::0;26501:2;26481:18;;;26474:30;26540:28;26520:18;;;26513:56;26586:18;;77866:100:0::1;26260:350:1::0;77866:100:0::1;77975:19;77997:7;78005:12;;77997:21;;;;;;;;:::i;:::-;;;;;;;;;;;77975:43;;78045:5;:18;;;78067:1;78045:23:::0;::::1;;;78027:94;;;::::0;-1:-1:-1;;;78027:94:0;;33114:2:1;78027:94:0::1;::::0;::::1;33096:21:1::0;33153:2;33133:18;;;33126:30;33192:33;33172:18;;;33165:61;33243:18;;78027:94:0::1;32912:355:1::0;78027:94:0::1;-1:-1:-1::0;78132:9:0::1;:31:::0;;;::::1;78144:19;78132:31;::::0;;84560:102::o;77728:752::-:1;78194:19;78181:9;::::0;::::1;;:32;::::0;::::1;;;;;;:::i;:::-;;78177:303;;;78224:9;:28:::0;;;::::1;78236:16;78224:28;::::0;;84560:102::o;78177:303::-:1;78319:7;78327:12;;78319:21;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;78293:22;:12;54793:14:::0;;54701:114;78293:22:::1;:56;78275:121;;;::::0;-1:-1:-1;;;78275:121:0;;32760:2:1;78275:121:0::1;::::0;::::1;32742:21:1::0;32799:2;32779:18;;;32772:30;32838:27;32818:18;;;32811:55;32883:18;;78275:121:0::1;32558:349:1::0;78275:121:0::1;78420:12;::::0;:16:::1;::::0;78435:1:::1;78420:16;:::i;:::-;78405:12;:31:::0;78445:9:::1;:27:::0;;;::::1;::::0;;77675:810::o;41071:208::-;41143:7;41171:19;;;41163:74;;;;-1:-1:-1;;;41163:74:0;;25641:2:1;41163:74:0;;;25623:21:1;25680:2;25660:18;;;25653:30;25719:34;25699:18;;;25692:62;25790:12;25770:18;;;25763:40;25820:19;;41163:74:0;25439:406:1;41163:74:0;-1:-1:-1;41255:16:0;;;;;;:9;:16;;;;;;;41071:208::o;15752:103::-;15147:7;15174:6;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;28462:356:1;15313:68:0;15817:30:::1;15844:1;15817:18;:30::i;64527:1237::-:0;64609:6;64650:12;64636:11;:26;64628:94;;;;-1:-1:-1;;;64628:94:0;;31624:2:1;64628:94:0;;;31606:21:1;31663:2;31643:18;;;31636:30;31702:34;31682:18;;;31675:62;31773:25;31753:18;;;31746:53;31816:19;;64628:94:0;31422:419:1;64628:94:0;64757:23;;;64735:19;64757:23;;;:14;:23;;;;;;;;64795:17;64791:58;;64836:1;64829:8;;;;;64791:58;64909:20;;;;;;;:11;:20;;;;;64961:11;;64930:16;64945:1;64930:12;:16;:::i;:::-;64909:38;;;;;;;;;;;;;;;-1:-1:-1;64909:38:0;:48;;:63;64905:147;;64996:20;;;;;;;:11;:20;;;;;;65017:16;65032:1;65017:12;:16;:::i;:::-;64996:38;;;;;;;;;;;;;-1:-1:-1;64996:38:0;:44;;;;;;;-1:-1:-1;64989:51:0;;-1:-1:-1;64989:51:0;64905:147;65113:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;65109:88:0;;;65184:1;65177:8;;;;;65109:88;65209:12;;65251:16;65266:1;65251:12;:16;:::i;:::-;65236:31;;65278:428;65293:5;65285:13;;:5;:13;;;65278:428;;;65315:13;65357:1;65340:13;65348:5;65340;:13;:::i;:::-;65339:19;;;;:::i;:::-;65331:27;;:5;:27;:::i;:::-;65423:20;;;65400;65423;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;65400:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;65423:28;;-1:-1:-1;65470:27:0;;65466:229;;;65525:8;;;;-1:-1:-1;65518:15:0;;-1:-1:-1;;;;65518:15:0;65466:229;65559:12;;:26;;;-1:-1:-1;65555:140:0;;;65614:6;65606:14;;65555:140;;;65669:10;65678:1;65669:6;:10;:::i;:::-;65661:18;;65555:140;65300:406;;65278:428;;;-1:-1:-1;65723:20:0;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;;;;;-1:-1:-1;;64527:1237:0;;;;:::o;84735:223::-;15147:7;15174:6;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;28462:356:1;15313:68:0;84915:30:::1;::::0;;;;84881:4:::1;84915:30;::::0;::::1;13410:74:1::0;;;84826:12:0;;84846:18:::1;::::0;::::1;::::0;::::1;::::0;84895:11:::1;::::0;84846:18;;84915:15:::1;::::0;13383:18:1;;84915:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84846:106;::::0;;::::1;::::0;;;;;;13707:42:1;13776:15;;;84846:106:0::1;::::0;::::1;13758:34:1::0;13828:15;;;;13808:18;;;13801:43;13860:18;;;13853:34;13670:18;;84846:106:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12865:210::-:0;12958:10;:28;12972:14;12958:28;;12950:72;;;;-1:-1:-1;;;12950:72:0;;29739:2:1;12950:72:0;;;29721:21:1;29778:2;29758:18;;;29751:30;29817:33;29797:18;;;29790:61;29868:18;;12950:72:0;29537:355:1;12950:72:0;13029:40;13047:9;13058:10;13029:17;:40::i;:::-;12865:210;;:::o;41816:104::-;41872:13;41905:7;41898:14;;;;;:::i;82410:825::-;82543:6;82577:10;82569:18;;:5;:18;;;82561:56;;;;-1:-1:-1;;;82561:56:0;;29385:2:1;82561:56:0;;;29367:21:1;29424:2;29404:18;;;29397:30;29463:27;29443:18;;;29436:55;29508:18;;82561:56:0;29183:349:1;82561:56:0;82639:18;82626:583;82685:2;82670:12;:17;;;82626:583;;;82727:12;82806:10;82781:4;82787:12;82764:36;;;;;;;;10111:19:1;;;10168:3;10164:16;10182:66;10160:89;10155:2;10146:12;;10139:111;10275:2;10266:12;;9958:326;82764:36:0;;;;;;;;;;;;;82754:47;;;;;;82749:53;;82742:74;;;;:::i;:::-;82727:89;-1:-1:-1;82825:11:0;82870:10;82861:5;82840:18;82870:10;82727:89;82840:18;:::i;:::-;:26;;;;:::i;:::-;82839:41;;;;:::i;:::-;82825:55;;82889:15;82915:4;82907:12;;:5;:12;;;:27;;82930:4;82907:27;;;82922:5;82907:27;82889:45;-1:-1:-1;82943:14:0;82997:4;83003:12;83017:14;83028:3;82889:45;83017:14;:::i;:::-;82980:52;;;;;;;;;10468:19:1;;;10525:3;10521:16;;;;10539:66;10517:89;10512:2;10503:12;;10496:111;10645:3;10641:16;10659:66;10637:89;10632:2;10623:12;;10616:111;10752:2;10743:12;;10289:472;82980:52:0;;;;;;;;;;;;;82960:81;;;;;;82943:98;;83050:9;83068:6;83094:1;83087:3;83076:8;:14;;;;:::i;:::-;83075:20;;;;:::i;:::-;83068:28;;;;;;;;;:::i;:::-;;;-1:-1:-1;83106:9:0;83144:1;83127:12;83138:1;83127:8;:12;:::i;:::-;83119:21;;:3;:21;;;;83118:27;;;;:::i;:::-;83106:39;-1:-1:-1;83160:7:0;;;;83156:46;;83188:4;83180:12;;83156:46;82718:491;;;;;;82696:14;;;;;:::i;:::-;;;;82626:583;;;-1:-1:-1;83224:5:0;;82410:825;-1:-1:-1;;;82410:825:0:o;74660:599::-;74801:15;15174:6;;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;28462:356:1;15313:68:0;74853:1:::1;74844:6;:10;74828:66;;;::::0;-1:-1:-1;;;74828:66:0;;22125:2:1;74828:66:0::1;::::0;::::1;22107:21:1::0;22164:2;22144:18;;;22137:30;22203:24;22183:18;;;22176:52;22245:18;;74828:66:0::1;21923:346:1::0;74828:66:0::1;74936:7;:14:::0;74903:18:::1;::::0;74936;74932:90:::1;;74978:7;74986:14:::0;;:18:::1;::::0;75003:1:::1;::::0;74986:18:::1;:::i;:::-;74978:27;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;;74965:49;;74932:90;75052:7;:14:::0;;::::1;::::0;::::1;::::0;;75030:19:::1;75052:14:::0;;;;::::1;;::::0;::::1;75073:29:::0;;;75126:19:::1;75139:6:::0;75092:10;75126:19:::1;:::i;:::-;75109:14;::::0;;::::1;:36:::0;;;;75152:18:::1;::::0;::::1;:33:::0;;;75192:15:::1;::::0;::::1;:27:::0;;;75235:7:::1;:14:::0;:18:::1;::::0;75109:14;75235:18:::1;:::i;:::-;75228:25:::0;74660:599;-1:-1:-1;;;;;;74660:599:0:o;73035:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43499:155::-;43594:52;13854:10;43627:8;43637;43594:18;:52::i;72195:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63874:222::-;63980:23;;;63939:6;63980:23;;;:14;:23;;;;;;;;64021:16;:67;;64087:1;64021:67;;;64040:20;;;;;;;:11;:20;;;;;;64061:16;64076:1;64061:12;:16;:::i;:::-;64040:38;;;;;;;;;;;;;-1:-1:-1;64040:38:0;:44;;;;;;;64014:74;-1:-1:-1;;;63874:222:0:o;44622:328::-;44797:41;13854:10;44830:7;44797:18;:41::i;:::-;44789:103;;;;-1:-1:-1;;;44789:103:0;;31206:2:1;44789:103:0;;;31188:21:1;31245:2;31225:18;;;31218:30;31284:34;31264:18;;;31257:62;31355:19;31335:18;;;31328:47;31392:19;;44789:103:0;31004:413:1;44789:103:0;44903:39;44917:4;44923:2;44927:7;44936:5;44903:13;:39::i;:::-;44622:328;;;;:::o;62731:942::-;62914:23;59869:80;63008:6;:4;:6::i;:::-;62992:24;;;;;;63018:12;68939:9;;68813:178;63018:12;62964:82;;;;;;;15877:25:1;;;;15918:18;;;15911:34;;;;15961:18;;;15954:34;;;;63040:4:0;16004:18:1;;;;15997:83;;;;62964:82:0;;;;;;;;;;15849:19:1;;;62964:82:0;;62940:117;;;;;;60098:71;63099:57;;;15432:25:1;15505:42;15493:55;;15473:18;;;15466:83;15565:18;;;15558:34;;;15608:18;;;;15601:34;;;63099:57:0;;;;;;;;;;15404:19:1;;;63099:57:0;;;63089:68;;;;;;;11314:66:1;63195:57:0;;;11302:79:1;11397:11;;;11390:27;;;11433:12;;;11426:28;;;62940:117:0;;-1:-1:-1;;;11470:12:1;;63195:57:0;;;;;;;;;;;;;63185:68;;63195:57;63185:68;;;;63264:17;63284:26;;;;;;;;;17016:25:1;;;17089:4;17077:17;;17057:18;;;17050:45;;;;17111:18;;;17104:34;;;17154:18;;;17147:34;;;63185:68:0;;-1:-1:-1;63264:17:0;63284:26;;16988:19:1;;63284:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63284:26:0;;;;;;-1:-1:-1;;63329:23:0;;;63321:90;;;;-1:-1:-1;;;63321:90:0;;23595:2:1;63321:90:0;;;23577:21:1;23634:2;23614:18;;;23607:30;23673:34;23653:18;;;23646:62;23744:24;23724:18;;;23717:52;23786:19;;63321:90:0;23393:418:1;63321:90:0;63439:17;;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;63430:5;:28;63422:91;;;;-1:-1:-1;;;63422:91:0;;21706:2:1;63422:91:0;;;21688:21:1;21745:2;21725:18;;;21718:30;21784:34;21764:18;;;21757:62;21855:20;21835:18;;;21828:48;21893:19;;63422:91:0;21504:414:1;63422:91:0;63551:6;63532:15;:25;;63524:92;;;;-1:-1:-1;;;63524:92:0;;18624:2:1;63524:92:0;;;18606:21:1;18663:2;18643:18;;;18636:30;18702:34;18682:18;;;18675:62;18773:24;18753:18;;;18746:52;18815:19;;63524:92:0;18422:418:1;63524:92:0;63634:31;63644:9;63655;63634;:31::i;:::-;63627:38;;;;62731:942;;;;;;;:::o;81131:931::-;46525:4;46549:16;;;:7;:16;;;;;;81196:13;;46549:30;:16;81218:59;;;;-1:-1:-1;;;81218:59:0;;19047:2:1;81218:59:0;;;19029:21:1;19086:2;19066:18;;;19059:30;19125:32;19105:18;;;19098:60;19175:18;;81218:59:0;18845:354:1;81218:59:0;81291:9;81286:772;81310:7;:14;81306:18;;81286:772;;;81340:19;81362:7;81370:1;81362:10;;;;;;;;:::i;:::-;;;;;;;;;;;81340:32;;81396:5;:16;;;81385:7;:27;;:55;;;;;81426:5;:14;;;81416:7;:24;81385:55;81381:670;;;81457:13;;;;:18;;:55;;;81485:5;:14;;81479:28;;;;;:::i;:::-;:33;;-1:-1:-1;81457:55:0;81453:147;;;81569:17;81541:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;81527:61;;;;81131:931;;;:::o;81453:147::-;81651:1;81626:5;:14;;81620:28;;;;;:::i;:::-;;;:32;81612:76;;;;-1:-1:-1;;;81612:76:0;;29025:2:1;81612:76:0;;;29007:21:1;29064:2;29044:18;;;29037:30;29103:33;29083:18;;;29076:61;29154:18;;81612:76:0;28823:355:1;81612:76:0;81911:16;;81701:23;;81727:181;81767:26;81911:16;81767:7;:26;:::i;:::-;81831:16;;81814:14;;;;:33;;81831:16;81814:33;:::i;:::-;81882:5;:13;;;81871:25;;;;;;15165::1;;15153:2;15138:18;;15019:177;81871:25:0;;;;;;;;;;;;;81861:36;;;;;;81727:20;:181::i;:::-;:200;;;;;;:::i;:::-;81701:226;;81982:5;:14;;82003:26;:15;:24;:26::i;:::-;81954:85;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81940:100;;;;;81131:931;;;:::o;81381:670::-;-1:-1:-1;81326:3:0;;;;:::i;:::-;;;;81286:772;;;;81131:931;;;:::o;76759:513::-;76901:17;15174:6;;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;28462:356:1;15313:68:0;76938:34:::1;::::0;;;;76966:4:::1;76938:34;::::0;::::1;13410:74:1::0;76976:7:0;;76938:9:::1;:19;;::::0;::::1;::::0;13383:18:1;;76938:34:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;76930:87;;;::::0;-1:-1:-1;;;76930:87:0;;32402:2:1;76930:87:0::1;::::0;::::1;32384:21:1::0;32441:2;32421:18;;;32414:30;32480:31;32460:18;;;32453:59;32529:18;;76930:87:0::1;32200:353:1::0;76930:87:0::1;77032:7;77040;77032:16;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;77060:1;77032:29;77024:73;;;::::0;-1:-1:-1;;;77024:73:0;;22881:2:1;77024:73:0::1;::::0;::::1;22863:21:1::0;22920:2;22900:18;;;22893:30;22959:33;22939:18;;;22932:61;23010:18;;77024:73:0::1;22679:355:1::0;77024:73:0::1;77104:38;77124:7;77133:8;;77104:19;:38::i;:::-;77163:35;77181:7;77190;77163:17;:35::i;:::-;77205:26;::::0;;;:15:::1;:26;::::0;;;;:36;;;77151:47;-1:-1:-1;15392:1:0::1;76759:513:::0;;;;;;:::o;60847:192::-;60912:6;60938:93;60945:20;60955:9;60945;:20::i;:::-;60938:93;;;;;;;;;;;;;;;;;:6;:93::i;16010:201::-;15147:7;15174:6;15321:23;15174:6;13854:10;15321:23;15313:68;;;;-1:-1:-1;;;15313:68:0;;28664:2:1;15313:68:0;;;28646:21:1;;;28683:18;;;28676:30;28742:34;28722:18;;;28715:62;28794:18;;15313:68:0;28462:356:1;15313:68:0;16099:22:::1;::::0;::::1;16091:73;;;::::0;-1:-1:-1;;;16091:73:0;;20536:2:1;16091:73:0::1;::::0;::::1;20518:21:1::0;20575:2;20555:18;;;20548:30;20614:34;20594:18;;;20587:62;20685:8;20665:18;;;20658:36;20711:19;;16091:73:0::1;20334:402:1::0;16091:73:0::1;16175:28;16194:8;16175:18;:28::i;83363:365::-:0;83465:4;;83508:11;83516:3;83508:5;:11;:::i;:::-;83481:38;-1:-1:-1;83526:23:0;83552:11;83560:3;83552:5;:11;:::i;:::-;83526:37;;83570:19;83592:7;83600;83592:16;;;;;;;;:::i;:::-;;;;;;;;;:46;;;:28;:16;;;;;;;:28;:46;;;-1:-1:-1;83592:46:0;;;;;83661:1;:20;;;83696:18;;;:26;;-1:-1:-1;83363:365:0;;;;:::o;50606:174::-;50681:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;50735:23;50681:24;50735:14;:23::i;:::-;50726:46;;;;;;;;;;;;50606:174;;:::o;47444:110::-;47520:26;47530:2;47534:7;47520:26;;;;;;;;;;;;:9;:26::i;46754:348::-;46847:4;46549:16;;;:7;:16;;;;;;:30;:16;46864:73;;;;-1:-1:-1;;;46864:73:0;;24803:2:1;46864:73:0;;;24785:21:1;24842:2;24822:18;;;24815:30;24881:34;24861:18;;;24854:62;24952:14;24932:18;;;24925:42;24984:19;;46864:73:0;24601:408:1;46864:73:0;46948:13;46964:23;46979:7;46964:14;:23::i;:::-;46948:39;;47017:5;47006:16;;:7;:16;;;:51;;;;47050:7;47026:31;;:20;47038:7;47026:11;:20::i;:::-;:31;;;47006:51;:87;;;-1:-1:-1;43846:25:0;;;;43822:4;43846:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;47061:32;43725:164;49863:625;50022:4;49995:31;;:23;50010:7;49995:14;:23::i;:::-;:31;;;49987:81;;;;-1:-1:-1;;;49987:81:0;;20943:2:1;49987:81:0;;;20925:21:1;20982:2;20962:18;;;20955:30;21021:34;21001:18;;;20994:62;21092:7;21072:18;;;21065:35;21117:19;;49987:81:0;20741:401:1;49987:81:0;50087:16;;;50079:65;;;;-1:-1:-1;;;50079:65:0;;22476:2:1;50079:65:0;;;22458:21:1;22515:2;22495:18;;;22488:30;22554:34;22534:18;;;22527:62;22625:6;22605:18;;;22598:34;22649:19;;50079:65:0;22274:400:1;50079:65:0;50157:39;50178:4;50184:2;50188:7;50157:20;:39::i;:::-;50261:29;50278:1;50282:7;50261:8;:29::i;:::-;50303:15;;;;;;;:9;:15;;;;;:20;;50322:1;;50303:15;:20;;50322:1;;50303:20;:::i;:::-;;;;-1:-1:-1;;50334:13:0;;;;;;;:9;:13;;;;;:18;;50351:1;;50334:13;:18;;50351:1;;50334:18;:::i;:::-;;;;-1:-1:-1;;50363:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;50402:27;;50363:16;;50402:27;;;;;;;42799:341;42729:411;;:::o;29793:317::-;29908:6;29883:21;:31;;29875:73;;;;-1:-1:-1;;;29875:73:0;;24445:2:1;29875:73:0;;;24427:21:1;24484:2;24464:18;;;24457:30;24523:31;24503:18;;;24496:59;24572:18;;29875:73:0;24243:353:1;29875:73:0;29962:12;29980:9;:14;;30002:6;29980:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29961:52;;;30032:7;30024:78;;;;-1:-1:-1;;;30024:78:0;;24018:2:1;30024:78:0;;;24000:21:1;24057:2;24037:18;;;24030:30;24096:34;24076:18;;;24069:62;24167:28;24147:18;;;24140:56;24213:19;;30024:78:0;23816:422:1;56215:190:0;56340:4;56393;56364:25;56377:5;56384:4;56364:12;:25::i;:::-;:33;;56215:190;-1:-1:-1;;;;56215:190:0:o;83811:280::-;83898:24;83925:11;83933:3;83925:5;:11;:::i;:::-;83898:38;-1:-1:-1;83943:23:0;83969:11;83977:3;83969:5;:11;:::i;:::-;84025:35;;;;:17;;;;:35;;-1:-1:-1;84025:35:0;;;;;84064:1;:20;;;84025:60;;;;83987:98;;;-1:-1:-1;83811:280:0:o;65772:492::-;65974:23;66000:20;66010:9;66000;:20::i;:::-;66033:21;;;;;;;;:10;:21;;;;;;:33;;;;;;;;;;;;;66084:54;;65974:46;;-1:-1:-1;66033:33:0;66084:54;;;;;;66033:21;66084:54;66151:13;66167:26;66183:9;66167:15;:26::i;:::-;66151:42;;66206:50;66221:15;66238:9;66249:6;66206:14;:50::i;16371:191::-;16445:16;16464:6;;;16481:17;;;;;;;;;;16514:40;;16464:6;;;;;;;16514:40;;16445:16;16514:40;16434:128;16371:191;:::o;80853:272::-;80941:15;80959:26;;;:15;:26;;;;;;80996:7;:16;;80959:26;;80996:16;;;;;;:::i;:::-;;;;;;;;;;;:24;;;81024:1;80996:29;80992:128;;;81063:7;81036;81044;81036:16;;;;;;;;:::i;:::-;;;;;;;;;:24;:16;;;;;:24;;;;:34;;;;81086:26;;;:15;:26;;-1:-1:-1;;81086:26:0;;;81079:33;80853:272::o;50922:315::-;51077:8;51068:17;;:5;:17;;;;51060:55;;;;-1:-1:-1;;;51060:55:0;;23241:2:1;51060:55:0;;;23223:21:1;23280:2;23260:18;;;23253:30;23319:27;23299:18;;;23292:55;23364:18;;51060:55:0;23039:349:1;51060:55:0;51126:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;51188:41;;14967::1;;;51188::0;;14940:18:1;51188:41:0;;;;;;;50922:315;;;:::o;45832:::-;45989:28;45999:4;46005:2;46009:7;45989:9;:28::i;:::-;46036:48;46059:4;46065:2;46069:7;46078:5;46036:22;:48::i;:::-;46028:111;;;;-1:-1:-1;;;46028:111:0;;19406:2:1;46028:111:0;;;19388:21:1;19445:2;19425:18;;;19418:30;19484:34;19464:18;;;19457:62;19555:20;19535:18;;;19528:48;19593:19;;46028:111:0;19204:414:1;36180:723:0;36236:13;36457:10;36453:53;;-1:-1:-1;;36484:10:0;;;;;;;;;;;;;;;;;;36180:723::o;36453:53::-;36531:5;36516:12;36572:78;36579:9;;36572:78;;36605:8;;;;:::i;:::-;;-1:-1:-1;36628:10:0;;-1:-1:-1;36636:2:0;36628:10;;:::i;:::-;;;36572:78;;;36660:19;36692:6;36682:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36682:17:0;;36660:39;;36710:154;36717:10;;36710:154;;36744:11;36754:1;36744:11;;:::i;:::-;;-1:-1:-1;36813:10:0;36821:2;36813:5;:10;:::i;:::-;36800:24;;:2;:24;:::i;:::-;36787:39;;36770:6;36777;36770:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;36841:11:0;36850:2;36841:11;;:::i;:::-;;;36710:154;;76316:315;76427:19;76449:7;76457;76449:16;;;;;;;;:::i;:::-;;;;;;;;;;;76427:38;;76529:5;:18;;;76515:8;;76498:26;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76488:37;;;;;;:59;76472:121;;;;-1:-1:-1;;;76472:121:0;;27894:2:1;76472:121:0;;;27876:21:1;27933:2;27913:18;;;27906:30;27972;27952:18;;;27945:58;28020:18;;76472:121:0;27692:352:1;76472:121:0;76600:25;:14;;;76617:8;;76600:25;:::i;:::-;;76420:211;76316:315;;;:::o;10982:1034::-;11059:17;11085:4;:20;;;11106:14;11122:4;11139:8;9812:1;11128:43;;;;;;;;16265:25:1;;;16321:2;16306:18;;16299:34;16253:2;16238:18;;16091:248;11128:43:0;;;;;;;;;;;;;11085:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11407:15:0;11490:16;;;:6;:16;;;;;;;;;1208:51;;;;;16575:25:1;;;16616:18;;;16609:34;;;11483:4:0;16659:18:1;;;16652:83;16751:18;;;;16744:34;;;1208:51:0;;;;;;;;;;16547:19:1;;;;1208:51:0;;;1198:62;;;;;;;;;11944:16;;;;;;;:20;;11963:1;11944:20;:::i;:::-;11925:16;;;;:6;:16;;;;;:39;11978:32;11932:8;12002:7;1778:41;;;;;;;9611:19:1;;;;9646:12;;;9639:28;;;;1778:41:0;;;;;;;;;9683:12:1;;;;1778:41:0;;1768:52;;;;;;1658:168;68204:164;68282:6;68320:12;68313:5;68309:9;;68301:32;;;;-1:-1:-1;;;68301:32:0;;;;;;;;:::i;:::-;-1:-1:-1;68358:1:0;;68204:164;-1:-1:-1;;68204:164:0:o;47781:321::-;47911:18;47917:2;47921:7;47911:5;:18::i;:::-;47962:54;47993:1;47997:2;48001:7;48010:5;47962:22;:54::i;:::-;47940:154;;;;-1:-1:-1;;;47940:154:0;;19406:2:1;47940:154:0;;;19388:21:1;19445:2;19425:18;;;19418:30;19484:34;19464:18;;;19457:62;19555:20;19535:18;;;19528:48;19593:19;;47940:154:0;19204:414:1;61617:368:0;61928:49;61943:15;61953:4;61943:9;:15::i;:::-;61960:13;61970:2;61960:9;:13::i;:::-;61975:1;61928:14;:49::i;56767:701::-;56850:7;56893:4;56850:7;56908:523;56932:5;:12;56928:1;:16;56908:523;;;56966:20;56989:5;56995:1;56989:8;;;;;;;;:::i;:::-;;;;;;;56966:31;;57032:12;57016;:28;57012:408;;57169:44;;;;;;9611:19:1;;;9646:12;;;9639:28;;;9683:12;;57169:44:0;;;;;;;;;;;;57159:55;;;;;;57144:70;;57012:408;;;57359:44;;;;;;9611:19:1;;;9646:12;;;9639:28;;;9683:12;;57359:44:0;;;;;;;;;;;;57349:55;;;;;;57334:70;;57012:408;-1:-1:-1;56946:3:0;;;;:::i;:::-;;;;56908:523;;;-1:-1:-1;57448:12:0;56767:701;-1:-1:-1;;;56767:701:0:o;66272:1003::-;66411:6;66401:16;;:6;:16;;;;:30;;;;;66430:1;66421:6;:10;;;66401:30;66397:871;;;66452:20;;;;66448:397;;66512:22;;;66493:16;66512:22;;;:14;:22;;;;;;;;;66572:13;:60;;66631:1;66572:60;;;66588:19;;;;;;;:11;:19;;;;;;66608:13;66620:1;66608:9;:13;:::i;:::-;66588:34;;;;;;;;;;;;;-1:-1:-1;66588:34:0;:40;;;;;;66572:60;66553:79;;66651:16;66670:83;66676:9;66687:6;66670:83;;;;;;;;;;;;;;;;;:5;:83::i;:::-;66651:102;;66772:57;66789:6;66797:9;66808;66819;66772:16;:57::i;:::-;66474:371;;;66448:397;66865:20;;;;66861:396;;66925:22;;;66906:16;66925:22;;;:14;:22;;;;;;;;;66985:13;:60;;67044:1;66985:60;;;67001:19;;;;;;;:11;:19;;;;;;67021:13;67033:1;67021:9;:13;:::i;:::-;67001:34;;;;;;;;;;;;;-1:-1:-1;67001:34:0;:40;;;;;;66985:60;66966:79;;67064:16;67083:82;67089:9;67100:6;67083:82;;;;;;;;;;;;;;;;;:5;:82::i;:::-;67064:101;;67184:57;67201:6;67209:9;67220;67231;67184:16;:57::i;51802:799::-;51957:4;51978:13;;;28794:20;28842:8;51974:620;;52014:72;;;;;:36;;;;;;:72;;13854:10;;52065:4;;52071:7;;52080:5;;52014:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52014:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52010:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52256:13:0;;52252:272;;52299:60;;-1:-1:-1;;;52299:60:0;;19406:2:1;52299:60:0;;;19388:21:1;19445:2;19425:18;;;19418:30;19484:34;19464:18;;;19457:62;19555:20;19535:18;;;19528:48;19593:19;;52299:60:0;19204:414:1;52252:272:0;52474:6;52468:13;52459:6;52455:2;52451:15;52444:38;52010:529;52137:51;;52147:41;52137:51;;-1:-1:-1;52130:58:0;;51974:620;-1:-1:-1;52578:4:0;52571:11;;48438:439;48518:16;;;48510:61;;;;-1:-1:-1;;;48510:61:0;;27533:2:1;48510:61:0;;;27515:21:1;;;27552:18;;;27545:30;27611:34;27591:18;;;27584:62;27663:18;;48510:61:0;27331:356:1;48510:61:0;46525:4;46549:16;;;:7;:16;;;;;;:30;:16;:30;48582:58;;;;-1:-1:-1;;;48582:58:0;;21349:2:1;48582:58:0;;;21331:21:1;21388:2;21368:18;;;21361:30;21427;21407:18;;;21400:58;21475:18;;48582:58:0;21147:352:1;48582:58:0;48653:45;48682:1;48686:2;48690:7;48653:20;:45::i;:::-;48711:13;;;;;;;:9;:13;;;;;:18;;48728:1;;48711:13;:18;;48728:1;;48711:18;:::i;:::-;;;;-1:-1:-1;;48740:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;48779:33;;48740:16;;;48779:33;;48740:16;;48779:33;12865:210;;:::o;68606:199::-;68726:6;68758:1;68753:6;;:1;:6;;;;68761:12;68745:29;;;;;-1:-1:-1;;;68745:29:0;;;;;;;;:::i;:::-;-1:-1:-1;68792:5:0;68796:1;68792;:5;:::i;67283:741::-;67446:18;67467:129;67488:12;67467:129;;;;;;;;;;;;;;;;;:6;:129::i;:::-;67446:150;;67628:1;67613:12;:16;;;:85;;;;-1:-1:-1;67633:22:0;;;;;;;:11;:22;;;;;:65;;;;67656:16;67671:1;67656:12;:16;:::i;:::-;67633:40;;;;;;;;;;;;;;;-1:-1:-1;67633:40:0;:50;;:65;67613:85;67609:339;;;67715:22;;;;;;;:11;:22;;;;;67764:8;;67738:16;67753:1;67738:12;:16;:::i;:::-;67715:40;;;;;;;;;;;;;-1:-1:-1;67715:40:0;:57;;;;;;;;;;;;;;;;;;;67609:339;;;67844:33;;;;;;;;;;;;;;;;;;;;;;;;;67805:22;;;-1:-1:-1;67805:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;67920:16;67828:12;67805:72;67920:16;:::i;:::-;67892:25;;;;;;;:14;:25;;;;;:44;;;;;;;;;;;;;;;67609:339;67965:51;;;35755:26:1;35808:15;;;35790:34;;35860:15;;35855:2;35840:18;;35833:43;67965:51:0;;;;;;35718:18:1;67965:51:0;;;;;;;67435:589;67283:741;;;;:::o;68376:222::-;68496:6;;68526:5;68530:1;68526;:5;:::i;:::-;68515:16;;68555:1;68550:6;;:1;:6;;;;68558:12;68542:29;;;;;-1:-1:-1;;;68542:29:0;;;;;;;;:::i;:::-;-1:-1:-1;68589:1:0;68376:222;-1:-1:-1;;;;68376:222:0:o;68032:164::-;68110:6;68148:12;68141:5;68137:9;;68129:32;;;;-1:-1:-1;;;68129:32:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:171::-;282:20;;342:18;331:30;;321:41;;311:69;;376:1;373;366:12;391:186;450:6;503:2;491:9;482:7;478:23;474:32;471:52;;;519:1;516;509:12;471:52;542:29;561:9;542:29;:::i;582:260::-;650:6;658;711:2;699:9;690:7;686:23;682:32;679:52;;;727:1;724;717:12;679:52;750:29;769:9;750:29;:::i;:::-;740:39;;798:38;832:2;821:9;817:18;798:38;:::i;:::-;788:48;;582:260;;;;;:::o;847:328::-;924:6;932;940;993:2;981:9;972:7;968:23;964:32;961:52;;;1009:1;1006;999:12;961:52;1032:29;1051:9;1032:29;:::i;:::-;1022:39;;1080:38;1114:2;1103:9;1099:18;1080:38;:::i;:::-;1070:48;;1165:2;1154:9;1150:18;1137:32;1127:42;;847:328;;;;;:::o;1180:1197::-;1275:6;1283;1291;1299;1352:3;1340:9;1331:7;1327:23;1323:33;1320:53;;;1369:1;1366;1359:12;1320:53;1392:29;1411:9;1392:29;:::i;:::-;1382:39;;1440:38;1474:2;1463:9;1459:18;1440:38;:::i;:::-;1430:48;;1525:2;1514:9;1510:18;1497:32;1487:42;;1580:2;1569:9;1565:18;1552:32;1603:18;1644:2;1636:6;1633:14;1630:34;;;1660:1;1657;1650:12;1630:34;1698:6;1687:9;1683:22;1673:32;;1743:7;1736:4;1732:2;1728:13;1724:27;1714:55;;1765:1;1762;1755:12;1714:55;1801:2;1788:16;1823:2;1819;1816:10;1813:36;;;1829:18;;:::i;:::-;1963:2;1957:9;2025:4;2017:13;;1868:66;2013:22;;;2037:2;2009:31;2005:40;1993:53;;;2061:18;;;2081:22;;;2058:46;2055:72;;;2107:18;;:::i;:::-;2147:10;2143:2;2136:22;2182:2;2174:6;2167:18;2222:7;2217:2;2212;2208;2204:11;2200:20;2197:33;2194:53;;;2243:1;2240;2233:12;2194:53;2299:2;2294;2290;2286:11;2281:2;2273:6;2269:15;2256:46;2344:1;2339:2;2334;2326:6;2322:15;2318:24;2311:35;2365:6;2355:16;;;;;;;1180:1197;;;;;;;:::o;2382:315::-;2447:6;2455;2508:2;2496:9;2487:7;2483:23;2479:32;2476:52;;;2524:1;2521;2514:12;2476:52;2547:29;2566:9;2547:29;:::i;:::-;2537:39;;2626:2;2615:9;2611:18;2598:32;2639:28;2661:5;2639:28;:::i;:::-;2686:5;2676:15;;;2382:315;;;;;:::o;2702:254::-;2770:6;2778;2831:2;2819:9;2810:7;2806:23;2802:32;2799:52;;;2847:1;2844;2837:12;2799:52;2870:29;2889:9;2870:29;:::i;:::-;2860:39;2946:2;2931:18;;;;2918:32;;-1:-1:-1;;;2702:254:1:o;2961:618::-;3063:6;3071;3079;3087;3095;3103;3156:3;3144:9;3135:7;3131:23;3127:33;3124:53;;;3173:1;3170;3163:12;3124:53;3196:29;3215:9;3196:29;:::i;:::-;3186:39;;3272:2;3261:9;3257:18;3244:32;3234:42;;3323:2;3312:9;3308:18;3295:32;3285:42;;3377:2;3366:9;3362:18;3349:32;3421:4;3414:5;3410:16;3403:5;3400:27;3390:55;;3441:1;3438;3431:12;3390:55;2961:618;;;;-1:-1:-1;2961:618:1;;3516:3;3501:19;;3488:33;;3568:3;3553:19;;;3540:33;;-1:-1:-1;2961:618:1;-1:-1:-1;;2961:618:1:o;3584:350::-;3651:6;3659;3712:2;3700:9;3691:7;3687:23;3683:32;3680:52;;;3728:1;3725;3718:12;3680:52;3751:29;3770:9;3751:29;:::i;:::-;3741:39;;3830:2;3819:9;3815:18;3802:32;3874:10;3867:5;3863:22;3856:5;3853:33;3843:61;;3900:1;3897;3890:12;3939:245;4006:6;4059:2;4047:9;4038:7;4034:23;4030:32;4027:52;;;4075:1;4072;4065:12;4027:52;4107:9;4101:16;4126:28;4148:5;4126:28;:::i;4189:248::-;4257:6;4265;4318:2;4306:9;4297:7;4293:23;4289:32;4286:52;;;4334:1;4331;4324:12;4286:52;-1:-1:-1;;4357:23:1;;;4427:2;4412:18;;;4399:32;;-1:-1:-1;4189:248:1:o;4442:245::-;4500:6;4553:2;4541:9;4532:7;4528:23;4524:32;4521:52;;;4569:1;4566;4559:12;4521:52;4608:9;4595:23;4627:30;4651:5;4627:30;:::i;4692:249::-;4761:6;4814:2;4802:9;4793:7;4789:23;4785:32;4782:52;;;4830:1;4827;4820:12;4782:52;4862:9;4856:16;4881:30;4905:5;4881:30;:::i;4946:180::-;5005:6;5058:2;5046:9;5037:7;5033:23;5029:32;5026:52;;;5074:1;5071;5064:12;5026:52;-1:-1:-1;5097:23:1;;4946:180;-1:-1:-1;4946:180:1:o;5131:184::-;5201:6;5254:2;5242:9;5233:7;5229:23;5225:32;5222:52;;;5270:1;5267;5260:12;5222:52;-1:-1:-1;5293:16:1;;5131:184;-1:-1:-1;5131:184:1:o;5320:826::-;5433:6;5441;5449;5457;5465;5518:3;5506:9;5497:7;5493:23;5489:33;5486:53;;;5535:1;5532;5525:12;5486:53;5571:9;5558:23;5548:33;;5600:38;5634:2;5623:9;5619:18;5600:38;:::i;:::-;5590:48;;5685:2;5674:9;5670:18;5657:32;5647:42;;5740:2;5729:9;5725:18;5712:32;5763:18;5804:2;5796:6;5793:14;5790:34;;;5820:1;5817;5810:12;5790:34;5858:6;5847:9;5843:22;5833:32;;5903:7;5896:4;5892:2;5888:13;5884:27;5874:55;;5925:1;5922;5915:12;5874:55;5965:2;5952:16;5991:2;5983:6;5980:14;5977:34;;;6007:1;6004;5997:12;5977:34;6060:7;6055:2;6045:6;6042:1;6038:14;6034:2;6030:23;6026:32;6023:45;6020:65;;;6081:1;6078;6071:12;6020:65;5320:826;;;;-1:-1:-1;5320:826:1;;-1:-1:-1;6112:2:1;6104:11;;6134:6;5320:826;-1:-1:-1;;;5320:826:1:o;6404:316::-;6481:6;6489;6497;6550:2;6538:9;6529:7;6525:23;6521:32;6518:52;;;6566:1;6563;6556:12;6518:52;-1:-1:-1;;6589:23:1;;;6659:2;6644:18;;6631:32;;-1:-1:-1;6710:2:1;6695:18;;;6682:32;;6404:316;-1:-1:-1;6404:316:1:o;6725:728::-;6814:6;6822;6830;6838;6891:2;6879:9;6870:7;6866:23;6862:32;6859:52;;;6907:1;6904;6897:12;6859:52;6943:9;6930:23;6920:33;;7004:2;6993:9;6989:18;6976:32;7027:18;7068:2;7060:6;7057:14;7054:34;;;7084:1;7081;7074:12;7054:34;7122:6;7111:9;7107:22;7097:32;;7167:7;7160:4;7156:2;7152:13;7148:27;7138:55;;7189:1;7186;7179:12;7138:55;7229:2;7216:16;7255:2;7247:6;7244:14;7241:34;;;7271:1;7268;7261:12;7241:34;7316:7;7311:2;7302:6;7298:2;7294:15;7290:24;7287:37;7284:57;;;7337:1;7334;7327:12;7284:57;6725:728;;7368:2;7360:11;;;;;-1:-1:-1;7390:6:1;;7443:2;7428:18;7415:32;;-1:-1:-1;6725:728:1;-1:-1:-1;;;6725:728:1:o;7711:324::-;7786:6;7794;7802;7855:2;7843:9;7834:7;7830:23;7826:32;7823:52;;;7871:1;7868;7861:12;7823:52;7894:28;7912:9;7894:28;:::i;:::-;7884:38;;7941:37;7974:2;7963:9;7959:18;7941:37;:::i;8040:316::-;8081:3;8119:5;8113:12;8146:6;8141:3;8134:19;8162:63;8218:6;8211:4;8206:3;8202:14;8195:4;8188:5;8184:16;8162:63;:::i;:::-;8270:2;8258:15;8275:66;8254:88;8245:98;;;;8345:4;8241:109;;8040:316;-1:-1:-1;;8040:316:1:o;8361:1088::-;8446:12;;8411:3;;8501:1;8521:18;;;;8574;;;;8601:61;;8655:4;8647:6;8643:17;8633:27;;8601:61;8681:2;8729;8721:6;8718:14;8698:18;8695:38;8692:218;;;8766:77;8763:1;8756:88;8867:4;8864:1;8857:15;8895:4;8892:1;8885:15;8692:218;8926:18;8953:162;;;;9129:1;9124:319;;;;8919:524;;8953:162;9001:66;8990:9;8986:82;8981:3;8974:95;9098:6;9093:3;9089:16;9082:23;;8953:162;;9124:319;35960:1;35953:14;;;35997:4;35984:18;;9218:1;9232:165;9246:6;9243:1;9240:13;9232:165;;;9324:14;;9311:11;;;9304:35;9367:16;;;;9261:10;;9232:165;;;9236:3;;9426:6;9421:3;9417:16;9410:23;;8919:524;;;;;;;8361:1088;;;;:::o;10766:273::-;10951:6;10943;10938:3;10925:33;10907:3;10977:16;;11002:13;;;10977:16;10766:273;-1:-1:-1;10766:273:1:o;11493:337::-;11752:9;11747:3;11740:22;11722:3;11778:46;11821:1;11816:3;11812:11;11804:6;11778:46;:::i;11835:815::-;12344:9;12339:3;12332:22;12314:3;12373:46;12416:1;12411:3;12407:11;12399:6;12373:46;:::i;:::-;12439:3;12435:2;12428:15;12472:6;12466:13;12488:60;12541:6;12537:1;12533:2;12529:10;12522:4;12514:6;12510:17;12488:60;:::i;:::-;12610:7;12606:1;12567:15;;;;12598:10;;;12591:27;12642:1;12634:10;;11835:815;-1:-1:-1;;;;11835:815:1:o;13898:511::-;14092:4;14121:42;14202:2;14194:6;14190:15;14179:9;14172:34;14254:2;14246:6;14242:15;14237:2;14226:9;14222:18;14215:43;;14294:6;14289:2;14278:9;14274:18;14267:34;14337:3;14332:2;14321:9;14317:18;14310:31;14358:45;14398:3;14387:9;14383:19;14375:6;14358:45;:::i;14414:408::-;14629:42;14621:6;14617:55;14606:9;14599:74;14709:6;14704:2;14693:9;14689:18;14682:34;14752:2;14747;14736:9;14732:18;14725:30;14580:4;14772:44;14812:2;14801:9;14797:18;14789:6;14772:44;:::i;:::-;14764:52;14414:408;-1:-1:-1;;;;;14414:408:1:o;17437:399::-;17583:2;17568:18;;17616:1;17605:13;;17595:201;;17652:77;17649:1;17642:88;17753:4;17750:1;17743:15;17781:4;17778:1;17771:15;17595:201;17805:25;;;17437:399;:::o;17841:219::-;17990:2;17979:9;17972:21;17953:4;18010:44;18050:2;18039:9;18035:18;18027:6;18010:44;:::i;33815:650::-;34132:6;34121:9;34114:25;34175:6;34170:2;34159:9;34155:18;34148:34;34218:6;34213:2;34202:9;34198:18;34191:34;34261:3;34256:2;34245:9;34241:18;34234:31;34095:4;34282:45;34322:3;34311:9;34307:19;34299:6;34282:45;:::i;:::-;34358:3;34343:19;;34336:35;;;;-1:-1:-1;34402:3:1;34387:19;;34380:35;;;;34446:3;34431:19;;;34424:35;34274:53;33815:650;-1:-1:-1;;;;33815:650:1:o;36013:128::-;36053:3;36084:1;36080:6;36077:1;36074:13;36071:39;;;36090:18;;:::i;:::-;-1:-1:-1;36126:9:1;;36013:128::o;36146:228::-;36185:3;36213:10;36250:2;36247:1;36243:10;36280:2;36277:1;36273:10;36311:3;36307:2;36303:12;36298:3;36295:21;36292:47;;;36319:18;;:::i;:::-;36355:13;;36146:228;-1:-1:-1;;;;36146:228:1:o;36379:236::-;36418:3;36446:18;36491:2;36488:1;36484:10;36521:2;36518:1;36514:10;36552:3;36548:2;36544:12;36539:3;36536:21;36533:47;;;36560:18;;:::i;36620:244::-;36659:3;36687:26;36740:2;36737:1;36733:10;36770:2;36767:1;36763:10;36801:3;36797:2;36793:12;36788:3;36785:21;36782:47;;;36809:18;;:::i;36869:120::-;36909:1;36935;36925:35;;36940:18;;:::i;:::-;-1:-1:-1;36974:9:1;;36869:120::o;36994:191::-;37033:1;37059:10;37096:2;37093:1;37089:10;37118:3;37108:37;;37125:18;;:::i;:::-;37163:10;;37159:20;;;;;36994:191;-1:-1:-1;;36994:191:1:o;37190:199::-;37229:1;37255:18;37300:2;37297:1;37293:10;37322:3;37312:37;;37329:18;;:::i;37394:228::-;37434:7;37560:1;37492:66;37488:74;37485:1;37482:81;37477:1;37470:9;37463:17;37459:105;37456:131;;;37567:18;;:::i;:::-;-1:-1:-1;37607:9:1;;37394:228::o;37627:125::-;37667:4;37695:1;37692;37689:8;37686:34;;;37700:18;;:::i;:::-;-1:-1:-1;37737:9:1;;37627:125::o;37757:221::-;37796:4;37825:10;37885;;;;37855;;37907:12;;;37904:38;;;37922:18;;:::i;:::-;37959:13;;37757:221;-1:-1:-1;;;37757:221:1:o;37983:229::-;38022:4;38051:18;38119:10;;;;38089;;38141:12;;;38138:38;;;38156:18;;:::i;38217:237::-;38256:4;38285:26;38361:10;;;;38331;;38383:12;;;38380:38;;;38398:18;;:::i;38459:258::-;38531:1;38541:113;38555:6;38552:1;38549:13;38541:113;;;38631:11;;;38625:18;38612:11;;;38605:39;38577:2;38570:10;38541:113;;;38672:6;38669:1;38666:13;38663:48;;;-1:-1:-1;;38707:1:1;38689:16;;38682:27;38459:258::o;38722:437::-;38801:1;38797:12;;;;38844;;;38865:61;;38919:4;38911:6;38907:17;38897:27;;38865:61;38972:2;38964:6;38961:14;38941:18;38938:38;38935:218;;;39009:77;39006:1;38999:88;39110:4;39107:1;39100:15;39138:4;39135:1;39128:15;39164:195;39203:3;39234:66;39227:5;39224:77;39221:103;;;39304:18;;:::i;:::-;-1:-1:-1;39351:1:1;39340:13;;39164:195::o;39364:175::-;39401:3;39445:4;39438:5;39434:16;39474:4;39465:7;39462:17;39459:43;;;39482:18;;:::i;:::-;39531:1;39518:15;;39364:175;-1:-1:-1;;39364:175:1:o;39544:112::-;39576:1;39602;39592:35;;39607:18;;:::i;:::-;-1:-1:-1;39641:9:1;;39544:112::o;39661:191::-;39692:1;39718:18;39763:2;39760:1;39756:10;39785:3;39775:37;;39792:18;;:::i;:::-;39830:10;;39826:20;;;;;39661:191;-1:-1:-1;;39661:191:1:o;39857:157::-;39887:1;39921:4;39918:1;39914:12;39945:3;39935:37;;39952:18;;:::i;:::-;40004:3;39997:4;39994:1;39990:12;39986:22;39981:27;;;39857:157;;;;:::o;40019:184::-;40071:77;40068:1;40061:88;40168:4;40165:1;40158:15;40192:4;40189:1;40182:15;40208:184;40260:77;40257:1;40250:88;40357:4;40354:1;40347:15;40381:4;40378:1;40371:15;40397:184;40449:77;40446:1;40439:88;40546:4;40543:1;40536:15;40570:4;40567:1;40560:15;40586:184;40638:77;40635:1;40628:88;40735:4;40732:1;40725:15;40759:4;40756:1;40749:15;40775:184;40827:77;40824:1;40817:88;40924:4;40921:1;40914:15;40948:4;40945:1;40938:15;40964:118;41050:5;41043:13;41036:21;41029:5;41026:32;41016:60;;41072:1;41069;41062:12;41087:177;41172:66;41165:5;41161:78;41154:5;41151:89;41141:117;;41254:1;41251;41244:12
Swarm Source
ipfs://1d04ea3bdc10e20368a9c55172444df95d392f7e4eac3e820925aa8e97cbcc91
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.