Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
44 JCCPIX
Holders
44
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 JCCPIXLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
JCCPixieVoucher
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-17 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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); } // File: @openzeppelin/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); } } // File: contracts/MerkleProof.sol pragma solidity ^0.8.9; /** * @dev These functions deal with verification of Merkle trees (hash trees), */ 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. */ using Strings for uint256; function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(i.toString(), computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(i.toString(), proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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); } } } } // File: @openzeppelin/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); } // File: @openzeppelin/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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/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); } // File: contracts/PublicPrivateVoucherMinter.sol pragma solidity ^0.8.9; abstract contract PublicPrivateVoucherMinter is Ownable { // event to log mint detail event MinterCreated(address _address); event PublicMint (address _address, uint256 _amount, uint256 _value); event PrivateMint(address _address, uint256 id, uint256 _amount, uint256 _value); event VoucherMint(address _address, uint256 id, uint256 _amount, uint256 _value); event ProjectMint(address _address, uint256 _amount, string _reason); struct MinterConfig { bool isPublicMintActive; // can call publicMint only when isPublicMintActive is true bool isPrivateMintActive; // can call privateMint only when isPrivateMintActive is true bool isVoucherMintActive; // can call voucherMint only when isVoucherMintActive is true uint256 publicMintPrice; // price for publicMint uint256 privateMintPrice; // price for privateMint uint256 maxPublicMintAmount; // maximum amount per publicMint transaction uint256 maxPrivateMintAmount; // maximum amount per privateMint transaction uint256 maxTotalSupply; // maximum supply uint256 maxPrivateMintSupply; // maximum supply for private round } // Sale counter uint256 public totalPublicSold; uint256 public totalPrivateSold; uint256 public totalVoucherClaimed; uint256 public totalVoucherIssued; uint256 public totalProjectMint; address public beneficiary; bytes32 private _merkleRoot; uint256 private _proofLength; // a mapping from voucher/whitelised Id to the amount used mapping(uint256 => uint256) private _amountUsed; // Operator address private _operator; // address of operator who can set parameter of this contract MinterConfig public minterConfig; constructor (MinterConfig memory config, address payable _beneficiary) { setMinterConfig(config); setBeneficiary(_beneficiary); setOperator(_msgSender()); } function setMinterConfig(MinterConfig memory config) public onlyOwner { minterConfig = config; } /// @notice Recipient of revenues function setBeneficiary(address payable _beneficiary) public onlyOwner { require(_beneficiary != address(0), "Not the zero address"); beneficiary = _beneficiary; } /** @dev Called by after all limited have been put in place; must perform all contract-specific sale logic, e.g. ERC721 minting. @param to The recipient of the item(s). @param amount The number of items allowed to be purchased **/ function _mintTo(address to, uint256 amount) internal virtual; function toggleZeroPublicMintActive() external onlyOwnerAndOperator { minterConfig.isPublicMintActive = !minterConfig.isPublicMintActive; } function toggleZeroPrivateMintActive() external onlyOwnerAndOperator { minterConfig.isPrivateMintActive = !minterConfig.isPrivateMintActive; } function togglePublicMintActive() external onlyOwnerAndOperator { require (minterConfig.publicMintPrice > 0, "Public Mint Price is zero"); minterConfig.isPublicMintActive = !minterConfig.isPublicMintActive; } function togglePrivateMintActive() external onlyOwnerAndOperator { require (minterConfig.privateMintPrice > 0, "Private Mint Price is zero"); minterConfig.isPrivateMintActive = !minterConfig.isPrivateMintActive; } function toggleVoucherMintActive() external onlyOwnerAndOperator { minterConfig.isVoucherMintActive = !minterConfig.isVoucherMintActive; } function totalSold() external view returns (uint256) { return totalPublicSold + totalPrivateSold + totalVoucherClaimed; } // set maxTotalSupply function setMaxTotalSupply(uint256 supply) external onlyOwnerAndOperator { minterConfig.maxTotalSupply = supply; } // set parameter for public mint function setPublicMintDetail(uint256 price, uint256 amount) external onlyOwnerAndOperator { require(!minterConfig.isPublicMintActive, "Public mint is active"); minterConfig.publicMintPrice = price; minterConfig.maxPublicMintAmount = amount; } // set parameter for private mint function setPrivateMintDetail(uint256 price, uint256 amount, uint256 supply) external onlyOwnerAndOperator { require(!minterConfig.isPrivateMintActive, "Private mint is active"); minterConfig.privateMintPrice = price; minterConfig.maxPrivateMintAmount = amount; minterConfig.maxPrivateMintSupply = supply; } // set parameter for voucher/private mint function setVoucherDetail(bytes32 merkleRoot, uint256 proofLength, uint256 voucherAmount) external onlyOwnerAndOperator { _merkleRoot = merkleRoot; _proofLength = proofLength; totalVoucherIssued = voucherAmount; } function publicMint(uint256 amount) public payable { require(minterConfig.isPublicMintActive,"Public mint is closed"); require(amount > 0,"Amount is zero"); require(amount <= minterConfig.maxPublicMintAmount,"Amount is greater than maximum"); require(totalProjectMint + totalPublicSold + totalPrivateSold + totalVoucherIssued + amount <= minterConfig.maxTotalSupply,"Exceed maxTotalSupply"); require(minterConfig.publicMintPrice * amount <= msg.value, "Insufficient fund"); address to = _msgSender(); _mintTo(to, amount); totalPublicSold += amount; emit PublicMint(to, amount, msg.value); } function privateMint( uint256 amount, uint256 whitelistedId, uint256 whitelistedAmount, bytes32[] calldata proof ) public payable { require(minterConfig.isPrivateMintActive,"Private mint is closed"); address to = _msgSender(); bytes32 hash = keccak256(abi.encodePacked(whitelistedId, address(this), 'W', to, whitelistedAmount)); require(proof.length == _proofLength,"Invalid whitelisted detail"); require(MerkleProof.verify(proof, _merkleRoot, hash),"Invalid whitelisted detail"); require(_amountUsed[whitelistedId] == 0, "Whielisted has been used"); if (whitelistedAmount == 0) { require(amount <= minterConfig.maxPrivateMintAmount,"Amount is greater than maximum"); } else { require(amount <= whitelistedAmount,"Amount is greater than maximum"); } require(amount > 0,"Amount is zero"); require(totalPrivateSold + amount <= minterConfig.maxPrivateMintSupply,"Exceed maxPrivateMintSupply"); require(minterConfig.privateMintPrice * amount <= msg.value, "Insufficient fund"); _mintTo(to, amount); _amountUsed[whitelistedId] = amount; totalPrivateSold += amount; emit PrivateMint(to, whitelistedId, amount, msg.value); } function voucherMint( uint256 amount, uint256 voucherId, uint256 voucherAmount, uint256 voucherPrice, bytes32[] calldata proof) public payable { require(minterConfig.isVoucherMintActive,"Voucher mint is closed"); address to = _msgSender(); bytes32 hash = keccak256(abi.encodePacked(voucherId, address(this), 'V', to, voucherAmount, voucherPrice)); require(proof.length == _proofLength,"Invalid whitelisted detail"); require(MerkleProof.verify(proof, _merkleRoot, hash),"Invalid voucher detail"); require(_amountUsed[voucherId] + amount <= voucherAmount,"Ammount is greater than voucher"); require(amount > 0,"Amount is zero"); require(voucherPrice * amount <= msg.value, "Insufficient fund"); _mintTo(to, amount); _amountUsed[voucherId] += amount; totalVoucherClaimed += amount; emit VoucherMint(to, voucherId, amount, msg.value); } function _projectMint(address to, uint256 amount, string memory reason) internal { _mintTo(to, amount); totalProjectMint += amount; emit ProjectMint(to, amount, reason); } function getAmountUsed(uint256 voucherId) external view returns (uint256) { return _amountUsed[voucherId]; } ////////////////////////////////////////////////////////////////////////////////////// // Function to withdraw fund from contract ///// function withdraw() external onlyOwner { uint256 _balance = address(this).balance; Address.sendValue(payable(beneficiary), _balance); } function withdraw(uint256 balance) external onlyOwner { Address.sendValue(payable(beneficiary), balance); } function transferERC20(IERC20 token) external onlyOwner { uint256 balance = token.balanceOf(address(this)); token.transfer(beneficiary, balance); } function transferERC20(IERC20 token, uint256 amount) external onlyOwner { token.transfer(beneficiary, amount); } function donate() external payable { // thank you } // set Operator function setOperator(address operator) public onlyOwner { require(operator != address(0), "Not the zero address"); _operator = operator; } function minterStatus() public view returns ( bool isPublicMintActive_, bool isPrivateMintActive_, bool isVoucherMintActive_, uint256 publicMintPrice_, uint256 privateMintPrice_, uint256 maxPublicMintAmount_, uint256 maxPrivateMintAmount_, uint256 maxTotalSupply_, uint256 maxPrivateMintSupply_, uint256 totalPublicSold_, uint256 totalPrivateSold_, uint256 totalVoucherClaimed_, uint256 totalVoucherIssued_, uint256 totalProjectMint_ ) { isPublicMintActive_ = minterConfig.isPublicMintActive; isPrivateMintActive_ = minterConfig.isPrivateMintActive; isVoucherMintActive_ = minterConfig.isVoucherMintActive; publicMintPrice_ = minterConfig.publicMintPrice; privateMintPrice_ = minterConfig.privateMintPrice; maxPublicMintAmount_ = minterConfig.maxPublicMintAmount; maxPrivateMintAmount_ = minterConfig.maxPrivateMintAmount; maxTotalSupply_ = minterConfig.maxTotalSupply; maxPrivateMintSupply_ = minterConfig.maxPrivateMintSupply; totalPublicSold_ = totalPublicSold; totalPrivateSold_ = totalPrivateSold; totalVoucherClaimed_ = totalVoucherClaimed; totalVoucherIssued_ = totalVoucherIssued; totalProjectMint_ = totalProjectMint; } /** * @dev Throws if called by any account other than the operator. */ modifier onlyOwnerAndOperator() { require( _msgSender() == owner() || _msgSender() == _operator, "Caller is not the operator"); _; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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; } } // File: contracts/ERC721S.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * A modification of openzeppelin ERC721 for a small, sequential mint, non-burnable collection * that implement IERC721, IERC721Metadata, and IERCEnumberable. * The assumption for this contract are: * - Token will be mint in sequential order * - The total number of token can be pack in 2**32-1 */ contract ERC721S is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenDetail { // The address of the owner. address owner; // Mapping from TokenID to index in _allToken list uint32 allTokensIndex; // Mapping from TokenID to index in _ownedTokens list uint32 ownedTokensIndex; // Reserved for other used; uint32 reserved; } // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to token Detail mapping(uint256 => TokenDetail) private _tokenDetail; // 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; // Mapping from owner to list of owned token IDs mapping(address => uint32[]) private _ownedTokens; // Array with all token ids, used for enumeration uint32[] private _allTokens; // Id of the fist token minted uint32 private _currentIndex; /** * @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_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint32) { return 1; } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * Returns the total amount of tokens burned in the contract. */ function _totalBurned() internal view returns (uint256) { unchecked { return _totalMinted() - _allTokens.length; } } /** * @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 || interfaceId == type(IERC721Enumerable).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 _ownedTokens[owner].length; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _tokenDetail[tokenId].owner; 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 overridden 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 = ERC721S.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 _tokenDetail[tokenId].owner != 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 = ERC721S.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints new token and transfers it to `to`. * * Requirements: * * - 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) internal virtual { _safeMint(to, ""); } /** * @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, bytes memory _data) internal virtual { uint256 tokenId = uint256(_currentIndex); _mint(to); 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) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); uint32 tokenId = _currentIndex; _beforeTokenTransfer(address(0), to, tokenId); uint32[] storage toTokenList = _ownedTokens[to]; TokenDetail storage tokenDetail = _tokenDetail[tokenId]; tokenDetail.owner = to; tokenDetail.ownedTokensIndex = uint32(toTokenList.length); tokenDetail.allTokensIndex = uint32(_allTokens.length); toTokenList.push(tokenId); _allTokens.push(tokenId); _currentIndex += 1; 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 = ERC721S.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); TokenDetail storage tokenDetail = _tokenDetail[tokenId]; uint32[] storage fromTokenList = _ownedTokens[owner]; // _removeTokenFromOwnerEnumeration(owner, tokenId); uint32 tokenIndex = tokenDetail.ownedTokensIndex; uint32 lastToken = fromTokenList[fromTokenList.length - 1]; if (lastToken != uint32(tokenId)) { fromTokenList[tokenIndex] = lastToken; _tokenDetail[lastToken].ownedTokensIndex = tokenIndex; } fromTokenList.pop(); // _removeTokenFromALLTokensEnumeration uint32 lastAllToken = _allTokens[_allTokens.length - 1]; uint32 allTokensIndex = tokenDetail.allTokensIndex; _allTokens[allTokensIndex] = lastAllToken; _tokenDetail[lastAllToken].allTokensIndex = allTokensIndex; tokenDetail.owner = address(0); tokenDetail.allTokensIndex = 0; tokenDetail.ownedTokensIndex = 0; _allTokens.pop(); 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(ERC721S.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); _tokenDetail[tokenId].owner = to; // _removeTokenFromOwnerEnumeration(from, tokenId); uint32[] storage fromTokenList = _ownedTokens[from]; TokenDetail storage tokenDetail = _tokenDetail[tokenId]; uint32 tokenIndex = tokenDetail.ownedTokensIndex; uint32 lastToken = fromTokenList[fromTokenList.length - 1]; fromTokenList[tokenIndex] = lastToken; _tokenDetail[lastToken].ownedTokensIndex = tokenIndex; fromTokenList.pop(); // _addTokenToOwnerEnumeration(to, tokenId); uint32[] storage toTokenList = _ownedTokens[to]; tokenDetail.ownedTokensIndex = uint32(toTokenList.length); toTokenList.push(uint32(tokenId)); 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(ERC721S.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 See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256) { require(index < ERC721S.balanceOf(owner), "Owner index out of bounds"); return uint256(_ownedTokens[owner][index]); } function ownedBy(address owner) external view returns (uint256[] memory) { uint256 balance = balanceOf(owner); uint256[] memory tokens = new uint256[](balance); uint32[] storage ownedTokens = _ownedTokens[owner]; for (uint256 i; i < balance; i++) { tokens[i] = uint256(ownedTokens[i]); } return tokens; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual returns (uint256) { require(index < ERC721S.totalSupply(), "Global index out of bounds"); return uint256(_allTokens[index]); } /** * @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 {} /** * @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 {} } // File: contracts/JCCPixieVoucher.sol pragma solidity >=0.8.10 <0.9.0; contract JCCPixieVoucher is ERC721S, PublicPrivateVoucherMinter, Pausable { using Strings for uint256; // Variable uint256 public maxSupply = 999; string public baseURI; string public notRevealedURI = "https://assets.jokercharlie.com/jccpixie/default.json"; string public baseExtension = ".json"; bool public revealed; constructor (address payable beneficiary) ERC721S("JCCPixie Voucher", "JCCPIX") PublicPrivateVoucherMinter( PublicPrivateVoucherMinter.MinterConfig({ isPublicMintActive : false, // can call publicMint only when isPublicMintActive is true isPrivateMintActive: true, // can call privateMint only when isPrivateMintActive is true isVoucherMintActive: false, // can call voucherMint only when isVoucherMintActive is true publicMintPrice: 0 ether, // price for publicMint privateMintPrice: 0 ether, // price for privateMint maxPublicMintAmount: 1, // maximum amount per publicMint transaction maxPrivateMintAmount: 1, // default maximum amount per privateMint transaction maxTotalSupply: 999, // maximum supply maxPrivateMintSupply: 999 // maximum supply for previate mint }), beneficiary ) { require(beneficiary != address(0), "Not the zero address"); } function reveal() external onlyOwner { revealed = true; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function _mintTo(address to, uint256 amount) internal override { // require(!paused(), "Mint is paused"); // Already checks in _beforeTokenTransfer require(totalSupply() + amount <= maxSupply, "Max supply limit exceed"); for (uint256 i; i < amount; i++) { _safeMint(to); } } // TokenURI related functions function setBaseTokenURI(string calldata uri) external onlyOwner { baseURI = uri; } function setNotRevealedURI(string calldata uri) external onlyOwner { notRevealedURI = uri; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function baseTokenURI(uint256 tokenId) public view returns (string memory) { string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token"); if (revealed == false) { return notRevealedURI; } else { return baseTokenURI(tokenId); } } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { require(!paused(), "Contract is paused"); super._beforeTokenTransfer(from, to, tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"beneficiary","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":false,"internalType":"address","name":"_address","type":"address"}],"name":"MinterCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"PrivateMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"_reason","type":"string"}],"name":"ProjectMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"PublicMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"VoucherMint","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"voucherId","type":"uint256"}],"name":"getAmountUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minterConfig","outputs":[{"internalType":"bool","name":"isPublicMintActive","type":"bool"},{"internalType":"bool","name":"isPrivateMintActive","type":"bool"},{"internalType":"bool","name":"isVoucherMintActive","type":"bool"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"},{"internalType":"uint256","name":"privateMintPrice","type":"uint256"},{"internalType":"uint256","name":"maxPublicMintAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintAmount","type":"uint256"},{"internalType":"uint256","name":"maxTotalSupply","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minterStatus","outputs":[{"internalType":"bool","name":"isPublicMintActive_","type":"bool"},{"internalType":"bool","name":"isPrivateMintActive_","type":"bool"},{"internalType":"bool","name":"isVoucherMintActive_","type":"bool"},{"internalType":"uint256","name":"publicMintPrice_","type":"uint256"},{"internalType":"uint256","name":"privateMintPrice_","type":"uint256"},{"internalType":"uint256","name":"maxPublicMintAmount_","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintAmount_","type":"uint256"},{"internalType":"uint256","name":"maxTotalSupply_","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintSupply_","type":"uint256"},{"internalType":"uint256","name":"totalPublicSold_","type":"uint256"},{"internalType":"uint256","name":"totalPrivateSold_","type":"uint256"},{"internalType":"uint256","name":"totalVoucherClaimed_","type":"uint256"},{"internalType":"uint256","name":"totalVoucherIssued_","type":"uint256"},{"internalType":"uint256","name":"totalProjectMint_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ownedBy","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"whitelistedId","type":"uint256"},{"internalType":"uint256","name":"whitelistedAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isPublicMintActive","type":"bool"},{"internalType":"bool","name":"isPrivateMintActive","type":"bool"},{"internalType":"bool","name":"isVoucherMintActive","type":"bool"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"},{"internalType":"uint256","name":"privateMintPrice","type":"uint256"},{"internalType":"uint256","name":"maxPublicMintAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintAmount","type":"uint256"},{"internalType":"uint256","name":"maxTotalSupply","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintSupply","type":"uint256"}],"internalType":"struct PublicPrivateVoucherMinter.MinterConfig","name":"config","type":"tuple"}],"name":"setMinterConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setPrivateMintDetail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setPublicMintDetail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"proofLength","type":"uint256"},{"internalType":"uint256","name":"voucherAmount","type":"uint256"}],"name":"setVoucherDetail","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":[],"name":"togglePrivateMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleVoucherMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleZeroPrivateMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleZeroPublicMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalPrivateSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalProjectMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVoucherClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVoucherIssued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"transferERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"voucherId","type":"uint256"},{"internalType":"uint256","name":"voucherAmount","type":"uint256"},{"internalType":"uint256","name":"voucherPrice","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"voucherMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6103e7601a5560e060405260356080818152906200469360a039601c9062000028908262000550565b50604080518082019091526005815264173539b7b760d91b6020820152601d9062000054908262000550565b503480156200006257600080fd5b50604051620046c8380380620046c883398101604081905262000085916200061c565b604051806101200160405280600015158152602001600115158152602001600015158152602001600081526020016000815260200160018152602001600181526020016103e781526020016103e7815250816040518060400160405280601081526020016f2521a1a834bc34b2902b37bab1b432b960811b815250604051806040016040528060068152602001650948686a092b60d31b815250816000908162000130919062000550565b5060016200013f828262000550565b50506007805463ffffffff19166001179055506200015d33620001ed565b62000168826200024c565b62000173816200030f565b6200017e33620003dd565b50506019805460ff191690556001600160a01b038116620001e65760405162461bcd60e51b815260206004820152601460248201527f4e6f7420746865207a65726f206164647265737300000000000000000000000060448201526064015b60405180910390fd5b506200064e565b600780546001600160a01b03838116640100000000818102600160201b600160c01b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546001600160a01b03640100000000909104163314620002a05760405162461bcd60e51b81526020600482018190526024820152600080516020620046738339815191526044820152606401620001dd565b8051601280546020840151604085015161ffff1990921693151561ff0019169390931761010093151584021762ff0000191662010000911515919091021790556060820151601355608082015160145560a082015160155560c082015160165560e08201516017550151601855565b6007546001600160a01b03640100000000909104163314620003635760405162461bcd60e51b81526020600482018190526024820152600080516020620046738339815191526044820152606401620001dd565b6001600160a01b038116620003bb5760405162461bcd60e51b815260206004820152601460248201527f4e6f7420746865207a65726f20616464726573730000000000000000000000006044820152606401620001dd565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03640100000000909104163314620004315760405162461bcd60e51b81526020600482018190526024820152600080516020620046738339815191526044820152606401620001dd565b6001600160a01b038116620004895760405162461bcd60e51b815260206004820152601460248201527f4e6f7420746865207a65726f20616464726573730000000000000000000000006044820152606401620001dd565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004d657607f821691505b602082108103620004f757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200054b57600081815260208120601f850160051c81016020861015620005265750805b601f850160051c820191505b81811015620005475782815560010162000532565b5050505b505050565b81516001600160401b038111156200056c576200056c620004ab565b62000584816200057d8454620004c1565b84620004fd565b602080601f831160018114620005bc5760008415620005a35750858301515b600019600386901b1c1916600185901b17855562000547565b600085815260208120601f198616915b82811015620005ed57888601518255948401946001909101908401620005cc565b50858210156200060c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200062f57600080fd5b81516001600160a01b03811681146200064757600080fd5b9392505050565b614015806200065e6000396000f3fe6080604052600436106103ad5760003560e01c806370a08231116101e7578063b3ab15fb1161010d578063dd2d5601116100a0578063f2c4ce1e1161006f578063f2c4ce1e14610b50578063f2fde38b14610b70578063f7448a3114610b90578063fb5e28f314610bb057600080fd5b8063dd2d560114610adb578063e51b759314610af1578063e985e9c514610b07578063ed88c68e1461042b57600080fd5b8063c6682862116100dc578063c668286214610a70578063c87b56dd14610a85578063d1d6b73914610aa5578063d5abeb0114610ac557600080fd5b8063b3ab15fb146109ee578063b837764414610a0e578063b88d4fde14610a3b578063bacdd19814610a5b57600080fd5b80639106d7ba11610185578063a475b5dd11610154578063a475b5dd1461098f578063a689a914146109a4578063b23b6bdd146109c4578063b2ad32e5146109d957600080fd5b80639106d7ba1461092557806395d89b411461093a578063a22cb4651461094f578063a2a71c351461096f57600080fd5b806376527485116101c157806376527485146108b95780638456cb59146108ce5780638da5cb5b146108e35780638e909e0b146108f857600080fd5b806370a082311461086f578063715018a61461088f57806372250380146108a457600080fd5b80632f745c59116102d757806342842e0e1161026a578063518302271161023957806351830227146108085780635c975abb146108225780636352211e1461083a5780636c0360eb1461085a57600080fd5b806342842e0e146107885780634319ff2f146107a85780634df30e97146107c85780634f6ccce7146107e857600080fd5b80633ccfd60b116102a65780633ccfd60b1461072b5780633f04fba4146107405780633f3e4c11146107535780633f4ba83a1461077357600080fd5b80632f745c59146106375780632f8dccbc1461065757806330176e13146106eb57806338af3eed1461070b57600080fd5b806318160ddd1161034f57806323b872dd1161031e57806323b872dd1461051b5780632db115441461053b5780632e1a7d4d1461054e5780632ecd28ab1461056e57600080fd5b806318160ddd146104ba5780631c31f710146104cf5780631d891fa9146104ef57806323b826ca1461050557600080fd5b806306fdde031161038b57806306fdde031461042d578063081812fc1461044f578063095ea7b31461048757806314bb6daf146104a757600080fd5b806301ffc9a7146103b257806302817219146103e75780630475a4701461040b575b600080fd5b3480156103be57600080fd5b506103d26103cd3660046134d5565b610bc5565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103fd600a5481565b6040519081526020016103de565b34801561041757600080fd5b5061042b6104263660046134f2565b610c32565b005b34801561043957600080fd5b50610442610cf0565b6040516103de919061356e565b34801561045b57600080fd5b5061046f61046a366004613581565b610d82565b6040516001600160a01b0390911681526020016103de565b34801561049357600080fd5b5061042b6104a23660046135af565b610e17565b61042b6104b5366004613627565b610f2c565b3480156104c657600080fd5b506006546103fd565b3480156104db57600080fd5b5061042b6104ea366004613691565b6111d9565b3480156104fb57600080fd5b506103fd600c5481565b34801561051157600080fd5b506103fd600b5481565b34801561052757600080fd5b5061042b6105363660046136ae565b611277565b61042b610549366004613581565b6112a8565b34801561055a57600080fd5b5061042b610569366004613581565b611451565b34801561057a57600080fd5b506105c7601254601354601454601554601654601754601854600854600954600a54600b54600c5460ff808d169d6101008e0482169d6201000090049091169b9a99989796959493929190565b604080519e15158f529c151560208f01529a15159b8d019b909b5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526101008701526101208601526101408501526101608401526101808301919091526101a08201526101c0016103de565b34801561064357600080fd5b506103fd6106523660046135af565b611499565b34801561066357600080fd5b5060125460135460145460155460165460175460185461069f9660ff808216976101008304821697620100009093049091169590949193909289565b604080519915158a5297151560208a0152951515968801969096526060870193909352608086019190915260a085015260c084015260e0830191909152610100820152610120016103de565b3480156106f757600080fd5b5061042b6107063660046136ef565b611548565b34801561071757600080fd5b50600d5461046f906001600160a01b031681565b34801561073757600080fd5b5061042b611584565b61042b61074e366004613761565b6115cb565b34801561075f57600080fd5b5061042b61076e366004613581565b6118d7565b34801561077f57600080fd5b5061042b611932565b34801561079457600080fd5b5061042b6107a33660046136ae565b61196b565b3480156107b457600080fd5b5061042b6107c336600461384c565b611986565b3480156107d457600080fd5b5061042b6107e33660046134f2565b611a24565b3480156107f457600080fd5b506103fd610803366004613581565b611a88565b34801561081457600080fd5b50601e546103d29060ff1681565b34801561082e57600080fd5b5060195460ff166103d2565b34801561084657600080fd5b5061046f610855366004613581565b611b1e565b34801561086657600080fd5b50610442611b95565b34801561087b57600080fd5b506103fd61088a366004613691565b611c23565b34801561089b57600080fd5b5061042b611caa565b3480156108b057600080fd5b50610442611ce3565b3480156108c557600080fd5b5061042b611cf0565b3480156108da57600080fd5b5061042b611da9565b3480156108ef57600080fd5b5061046f611de0565b34801561090457600080fd5b506103fd610913366004613581565b60009081526010602052604090205490565b34801561093157600080fd5b506103fd611df7565b34801561094657600080fd5b50610442611e1b565b34801561095b57600080fd5b5061042b61096a3660046138dc565b611e2a565b34801561097b57600080fd5b5061042b61098a366004613915565b611e39565b34801561099b57600080fd5b5061042b611ee5565b3480156109b057600080fd5b506104426109bf366004613581565b611f23565b3480156109d057600080fd5b5061042b611f84565b3480156109e557600080fd5b5061042b611ff7565b3480156109fa57600080fd5b5061042b610a09366004613691565b61206c565b348015610a1a57600080fd5b50610a2e610a29366004613691565b61210a565b6040516103de9190613937565b348015610a4757600080fd5b5061042b610a5636600461397b565b6121f9565b348015610a6757600080fd5b5061042b612231565b348015610a7c57600080fd5b50610442612287565b348015610a9157600080fd5b50610442610aa0366004613581565b612294565b348015610ab157600080fd5b5061042b610ac0366004613691565b6123c2565b348015610ad157600080fd5b506103fd601a5481565b348015610ae757600080fd5b506103fd60085481565b348015610afd57600080fd5b506103fd60095481565b348015610b1357600080fd5b506103d2610b22366004613a3f565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b348015610b5c57600080fd5b5061042b610b6b3660046136ef565b6124d6565b348015610b7c57600080fd5b5061042b610b8b366004613691565b612512565b348015610b9c57600080fd5b5061042b610bab3660046135af565b6125af565b348015610bbc57600080fd5b5061042b612617565b60006001600160e01b031982166380ac58cd60e01b1480610bf657506001600160e01b03198216635b5e139f60e01b145b80610c1157506001600160e01b0319821663780e9d6360e01b145b80610c2c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b610c3a611de0565b6001600160a01b0316336001600160a01b03161480610c6c57506011546001600160a01b0316336001600160a01b0316145b610c915760405162461bcd60e51b8152600401610c8890613a6d565b60405180910390fd5b601254610100900460ff1615610ce25760405162461bcd60e51b815260206004820152601660248201527550726976617465206d696e742069732061637469766560501b6044820152606401610c88565b601492909255601655601855565b606060008054610cff90613aa4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2b90613aa4565b8015610d785780601f10610d4d57610100808354040283529160200191610d78565b820191906000526020600020905b815481529060010190602001808311610d5b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610dfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c88565b506000908152600360205260409020546001600160a01b031690565b6000610e2282611b1e565b9050806001600160a01b0316836001600160a01b031603610e8f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c88565b336001600160a01b0382161480610eab5750610eab8133610b22565b610f1d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c88565b610f2783836126bc565b505050565b60125462010000900460ff16610f7d5760405162461bcd60e51b8152602060048201526016602482015275159bdd58da195c881b5a5b9d081a5cc818db1bdcd95960521b6044820152606401610c88565b60408051602080820188905230606090811b6bffffffffffffffffffffffff1990811684860152602b60f91b6054850152339182901b1660558401526069830188905260898084018890528451808503909101815260a99093019093528151910120600f5483146110005760405162461bcd60e51b8152600401610c8890613ade565b61104184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e54915084905061272a565b6110865760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d9bdd58da195c8819195d185a5b60521b6044820152606401610c88565b60008781526010602052604090205486906110a2908a90613b2b565b11156110f05760405162461bcd60e51b815260206004820152601f60248201527f416d6d6f756e742069732067726561746572207468616e20766f7563686572006044820152606401610c88565b600088116111105760405162461bcd60e51b8152600401610c8890613b3e565b3461111b8987613b66565b11156111395760405162461bcd60e51b8152600401610c8890613b85565b61114382896127eb565b600087815260106020526040812080548a9290611161908490613b2b565b9250508190555087600a600082825461117a9190613b2b565b9091555050604080516001600160a01b0384168152602081018990529081018990523460608201527f9f62b4b30c37c0fa5a560150558db2f99f732dff3cf5b42687e97b1cae65df199060800160405180910390a15050505050505050565b336111e2611de0565b6001600160a01b0316146112085760405162461bcd60e51b8152600401610c8890613bb0565b6001600160a01b0381166112555760405162461bcd60e51b81526020600482015260146024820152734e6f7420746865207a65726f206164647265737360601b6044820152606401610c88565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6112813382612876565b61129d5760405162461bcd60e51b8152600401610c8890613be5565b610f2783838361296d565b60125460ff166112f25760405162461bcd60e51b8152602060048201526015602482015274141d589b1a58c81b5a5b9d081a5cc818db1bdcd959605a1b6044820152606401610c88565b600081116113125760405162461bcd60e51b8152600401610c8890613b3e565b6015548111156113345760405162461bcd60e51b8152600401610c8890613c36565b60126005015481600b54600954600854600c546113519190613b2b565b61135b9190613b2b565b6113659190613b2b565b61136f9190613b2b565b11156113b55760405162461bcd60e51b8152602060048201526015602482015274457863656564206d6178546f74616c537570706c7960581b6044820152606401610c88565b60135434906113c5908390613b66565b11156113e35760405162461bcd60e51b8152600401610c8890613b85565b336113ee81836127eb565b81600860008282546114009190613b2b565b9091555050604080516001600160a01b038316815260208101849052348183015290517f819f7e30541f2ed7e36c92ce039f5eb2d66b7dc094b33f416910e8fde56b80dc9181900360600190a15050565b3361145a611de0565b6001600160a01b0316146114805760405162461bcd60e51b8152600401610c8890613bb0565b600d54611496906001600160a01b031682612c9c565b50565b60006114a483611c23565b82106114f25760405162461bcd60e51b815260206004820152601960248201527f4f776e657220696e646578206f7574206f6620626f756e6473000000000000006044820152606401610c88565b6001600160a01b038316600090815260056020526040902080548390811061151c5761151c613c6d565b6000918252602090912060088204015460079091166004026101000a900463ffffffff16905092915050565b33611551611de0565b6001600160a01b0316146115775760405162461bcd60e51b8152600401610c8890613bb0565b601b610f27828483613cd1565b3361158d611de0565b6001600160a01b0316146115b35760405162461bcd60e51b8152600401610c8890613bb0565b600d544790611496906001600160a01b031682612c9c565b601254610100900460ff1661161b5760405162461bcd60e51b8152602060048201526016602482015275141c9a5d985d19481b5a5b9d081a5cc818db1bdcd95960521b6044820152606401610c88565b60408051602080820187905230606090811b6bffffffffffffffffffffffff1990811684860152605760f81b6054850152339182901b16605584015260698084018890528451808503909101815260899093019093528151910120600f5483146116975760405162461bcd60e51b8152600401610c8890613ade565b6116d884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e54915084905061272a565b6116f45760405162461bcd60e51b8152600401610c8890613ade565b600086815260106020526040902054156117505760405162461bcd60e51b815260206004820152601860248201527f576869656c697374656420686173206265656e207573656400000000000000006044820152606401610c88565b8460000361177f5760165487111561177a5760405162461bcd60e51b8152600401610c8890613c36565b61179f565b8487111561179f5760405162461bcd60e51b8152600401610c8890613c36565b600087116117bf5760405162461bcd60e51b8152600401610c8890613b3e565b6018546009546117d0908990613b2b565b111561181e5760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178507269766174654d696e74537570706c7900000000006044820152606401610c88565b601454349061182e908990613b66565b111561184c5760405162461bcd60e51b8152600401610c8890613b85565b61185682886127eb565b600086815260106020526040812088905560098054899290611879908490613b2b565b9091555050604080516001600160a01b0384168152602081018890529081018890523460608201527fea42e12d368267aa3744b225140b462e261f7bf081e5d5dbc006a74520064b909060800160405180910390a150505050505050565b6118df611de0565b6001600160a01b0316336001600160a01b0316148061191157506011546001600160a01b0316336001600160a01b0316145b61192d5760405162461bcd60e51b8152600401610c8890613a6d565b601755565b3361193b611de0565b6001600160a01b0316146119615760405162461bcd60e51b8152600401610c8890613bb0565b611969612db5565b565b610f27838383604051806020016040528060008152506121f9565b3361198f611de0565b6001600160a01b0316146119b55760405162461bcd60e51b8152600401610c8890613bb0565b8051601280546020840151604085015161ffff1990921693151561ff0019169390931761010093151584021762ff0000191662010000911515919091021790556060820151601355608082015160145560a082015160155560c082015160165560e08201516017550151601855565b611a2c611de0565b6001600160a01b0316336001600160a01b03161480611a5e57506011546001600160a01b0316336001600160a01b0316145b611a7a5760405162461bcd60e51b8152600401610c8890613a6d565b600e92909255600f55600b55565b6000611a9360065490565b8210611ae15760405162461bcd60e51b815260206004820152601a60248201527f476c6f62616c20696e646578206f7574206f6620626f756e64730000000000006044820152606401610c88565b60068281548110611af457611af4613c6d565b6000918252602090912060088204015460079091166004026101000a900463ffffffff1692915050565b6000818152600260205260408120546001600160a01b031680610c2c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c88565b601b8054611ba290613aa4565b80601f0160208091040260200160405190810160405280929190818152602001828054611bce90613aa4565b8015611c1b5780601f10611bf057610100808354040283529160200191611c1b565b820191906000526020600020905b815481529060010190602001808311611bfe57829003601f168201915b505050505081565b60006001600160a01b038216611c8e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c88565b506001600160a01b031660009081526005602052604090205490565b33611cb3611de0565b6001600160a01b031614611cd95760405162461bcd60e51b8152600401610c8890613bb0565b6119696000612e48565b601c8054611ba290613aa4565b611cf8611de0565b6001600160a01b0316336001600160a01b03161480611d2a57506011546001600160a01b0316336001600160a01b0316145b611d465760405162461bcd60e51b8152600401610c8890613a6d565b601354611d955760405162461bcd60e51b815260206004820152601960248201527f5075626c6963204d696e74205072696365206973207a65726f000000000000006044820152606401610c88565b6012805460ff19811660ff90911615179055565b33611db2611de0565b6001600160a01b031614611dd85760405162461bcd60e51b8152600401610c8890613bb0565b611969612ea8565b60075464010000000090046001600160a01b031690565b6000600a54600954600854611e0c9190613b2b565b611e169190613b2b565b905090565b606060018054610cff90613aa4565b611e35338383612f23565b5050565b611e41611de0565b6001600160a01b0316336001600160a01b03161480611e7357506011546001600160a01b0316336001600160a01b0316145b611e8f5760405162461bcd60e51b8152600401610c8890613a6d565b60125460ff1615611eda5760405162461bcd60e51b81526020600482015260156024820152745075626c6963206d696e742069732061637469766560581b6044820152606401610c88565b601391909155601555565b33611eee611de0565b6001600160a01b031614611f145760405162461bcd60e51b8152600401610c8890613bb0565b601e805460ff19166001179055565b60606000611f2f612ff1565b90506000815111611f4f5760405180602001604052806000815250611f7d565b80611f5984613000565b601d604051602001611f6d93929190613d92565b6040516020818303038152906040525b9392505050565b611f8c611de0565b6001600160a01b0316336001600160a01b03161480611fbe57506011546001600160a01b0316336001600160a01b0316145b611fda5760405162461bcd60e51b8152600401610c8890613a6d565b6012805461ff001981166101009182900460ff1615909102179055565b611fff611de0565b6001600160a01b0316336001600160a01b0316148061203157506011546001600160a01b0316336001600160a01b0316145b61204d5760405162461bcd60e51b8152600401610c8890613a6d565b6012805462ff0000198116620100009182900460ff1615909102179055565b33612075611de0565b6001600160a01b03161461209b5760405162461bcd60e51b8152600401610c8890613bb0565b6001600160a01b0381166120e85760405162461bcd60e51b81526020600482015260146024820152734e6f7420746865207a65726f206164647265737360601b6044820152606401610c88565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061211783611c23565b905060008167ffffffffffffffff811115612134576121346137c2565b60405190808252806020026020018201604052801561215d578160200160208202803683370190505b506001600160a01b03851660009081526005602052604081209192505b838110156121ef5781818154811061219457612194613c6d565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff168382815181106121d2576121d2613c6d565b6020908102919091010152806121e781613e32565b91505061217a565b5090949350505050565b6122033383612876565b61221f5760405162461bcd60e51b8152600401610c8890613be5565b61222b84848484613101565b50505050565b612239611de0565b6001600160a01b0316336001600160a01b0316148061226b57506011546001600160a01b0316336001600160a01b0316145b611d955760405162461bcd60e51b8152600401610c8890613a6d565b601d8054611ba290613aa4565b6000818152600260205260409020546060906001600160a01b03166123135760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c88565b601e5460ff1615156000036123b457601c805461232f90613aa4565b80601f016020809104026020016040519081016040528092919081815260200182805461235b90613aa4565b80156123a85780601f1061237d576101008083540402835291602001916123a8565b820191906000526020600020905b81548152906001019060200180831161238b57829003601f168201915b50505050509050919050565b610c2c82611f23565b919050565b336123cb611de0565b6001600160a01b0316146123f15760405162461bcd60e51b8152600401610c8890613bb0565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245c9190613e4b565b600d5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af11580156124b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f279190613e64565b336124df611de0565b6001600160a01b0316146125055760405162461bcd60e51b8152600401610c8890613bb0565b601c610f27828483613cd1565b3361251b611de0565b6001600160a01b0316146125415760405162461bcd60e51b8152600401610c8890613bb0565b6001600160a01b0381166125a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c88565b61149681612e48565b336125b8611de0565b6001600160a01b0316146125de5760405162461bcd60e51b8152600401610c8890613bb0565b600d5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401612493565b61261f611de0565b6001600160a01b0316336001600160a01b0316148061265157506011546001600160a01b0316336001600160a01b0316145b61266d5760405162461bcd60e51b8152600401610c8890613a6d565b601454611fda5760405162461bcd60e51b815260206004820152601a60248201527f50726976617465204d696e74205072696365206973207a65726f0000000000006044820152606401610c88565b600081815260036020526040902080546001600160a01b0319166001600160a01b03841690811790915581906126f182611b1e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815b85518110156127e057600086828151811061274c5761274c613c6d565b602002602001015190508083116127975761276682613000565b838260405160200161277a93929190613e81565b6040516020818303038152906040528051906020012092506127cd565b6127a082613000565b81846040516020016127b493929190613e81565b6040516020818303038152906040528051906020012092505b50806127d881613e32565b91505061272f565b509092149392505050565b601a54816127f860065490565b6128029190613b2b565b11156128505760405162461bcd60e51b815260206004820152601760248201527f4d617820737570706c79206c696d6974206578636565640000000000000000006044820152606401610c88565b60005b81811015610f275761286483613134565b8061286e81613e32565b915050612853565b6000818152600260205260408120546001600160a01b03166128ef5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c88565b60006128fa83611b1e565b9050806001600160a01b0316846001600160a01b0316148061294157506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b806129655750836001600160a01b031661295a84610d82565b6001600160a01b0316145b949350505050565b826001600160a01b031661298082611b1e565b6001600160a01b0316146129e45760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c88565b6001600160a01b038216612a465760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c88565b612a5183838361314d565b612a5c6000826126bc565b600081815260026020818152604080842080546001600160a01b0319166001600160a01b038881169190911780835590891686526005845291852086865293909252825492939192600160c01b90910463ffffffff1691908490612ac290600190613ea8565b81548110612ad257612ad2613c6d565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16905080848363ffffffff1681548110612b1357612b13613c6d565b600091825260208083206008830401805460079093166004026101000a63ffffffff8181021990941695841602949094179093558381168252600290925260409020805463ffffffff60c01b1916600160c01b928516929092029190911790558354849080612b8457612b84613ebb565b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055600060056000886001600160a01b03166001600160a01b03168152602001908152602001600020905080805490508460000160186101000a81548163ffffffff021916908363ffffffff160217905550808690806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908363ffffffff16021790555085876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050565b80471015612cec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c88565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d39576040519150601f19603f3d011682016040523d82523d6000602084013e612d3e565b606091505b5050905080610f275760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c88565b60195460ff16612dfe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c88565b6019805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600780546001600160a01b03838116640100000000818102640100000000600160c01b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60195460ff1615612eee5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c88565b6019805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e2b3390565b816001600160a01b0316836001600160a01b031603612f845760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c88565b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060601b8054610cff90613aa4565b6060816000036130275750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613051578061303b81613e32565b915061304a9050600a83613ee7565b915061302b565b60008167ffffffffffffffff81111561306c5761306c6137c2565b6040519080825280601f01601f191660200182016040528015613096576020820181803683370190505b5090505b8415612965576130ab600183613ea8565b91506130b8600a86613efb565b6130c3906030613b2b565b60f81b8183815181106130d8576130d8613c6d565b60200101906001600160f81b031916908160001a9053506130fa600a86613ee7565b945061309a565b61310c84848461296d565b61311884848484613195565b61222b5760405162461bcd60e51b8152600401610c8890613f0f565b6114968160405180602001604052806000815250613296565b60195460ff1615610f275760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b6044820152606401610c88565b60006001600160a01b0384163b1561328b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906131d9903390899088908890600401613f61565b6020604051808303816000875af1925050508015613214575060408051601f3d908101601f1916820190925261321191810190613f9e565b60015b613271573d808015613242576040519150601f19603f3d011682016040523d82523d6000602084013e613247565b606091505b5080516000036132695760405162461bcd60e51b8152600401610c8890613f0f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612965565b506001949350505050565b60075463ffffffff166132a8836132d1565b6132b56000848385613195565b610f275760405162461bcd60e51b8152600401610c8890613f0f565b6001600160a01b0381166133275760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c88565b60075463ffffffff1661333c6000838361314d565b6001600160a01b038216600081815260056020908152604080832063ffffffff8087168086526002855292852080546001600160a01b031981168817825583548316600160c01b02600167ffffffff0000000160a01b031990911690971796909617808755600680548316600160a01b0263ffffffff60a01b199092169190911787558254600181810185558488529587206008808304909101805460046007948516810261010090810a808b0290890219909316929092179092558454808a018655948a529184047ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01805494841690910290910a9586029584021990921694909417905582549195949161345491859116613fbb565b92506101000a81548163ffffffff021916908363ffffffff1602179055508263ffffffff16846001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461222b565b6001600160e01b03198116811461149657600080fd5b6000602082840312156134e757600080fd5b8135611f7d816134bf565b60008060006060848603121561350757600080fd5b505081359360208301359350604090920135919050565b60005b83811015613539578181015183820152602001613521565b50506000910152565b6000815180845261355a81602086016020860161351e565b601f01601f19169290920160200192915050565b602081526000611f7d6020830184613542565b60006020828403121561359357600080fd5b5035919050565b6001600160a01b038116811461149657600080fd5b600080604083850312156135c257600080fd5b82356135cd8161359a565b946020939093013593505050565b60008083601f8401126135ed57600080fd5b50813567ffffffffffffffff81111561360557600080fd5b6020830191508360208260051b850101111561362057600080fd5b9250929050565b60008060008060008060a0878903121561364057600080fd5b86359550602087013594506040870135935060608701359250608087013567ffffffffffffffff81111561367357600080fd5b61367f89828a016135db565b979a9699509497509295939492505050565b6000602082840312156136a357600080fd5b8135611f7d8161359a565b6000806000606084860312156136c357600080fd5b83356136ce8161359a565b925060208401356136de8161359a565b929592945050506040919091013590565b6000806020838503121561370257600080fd5b823567ffffffffffffffff8082111561371a57600080fd5b818501915085601f83011261372e57600080fd5b81358181111561373d57600080fd5b86602082850101111561374f57600080fd5b60209290920196919550909350505050565b60008060008060006080868803121561377957600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156137a557600080fd5b6137b1888289016135db565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b604051610120810167ffffffffffffffff811182821017156137fc576137fc6137c2565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561382b5761382b6137c2565b604052919050565b801515811461149657600080fd5b80356123bd81613833565b6000610120828403121561385f57600080fd5b6138676137d8565b61387083613841565b815261387e60208401613841565b602082015261388f60408401613841565b6040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508091505092915050565b600080604083850312156138ef57600080fd5b82356138fa8161359a565b9150602083013561390a81613833565b809150509250929050565b6000806040838503121561392857600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561396f57835183529284019291840191600101613953565b50909695505050505050565b6000806000806080858703121561399157600080fd5b843561399c8161359a565b93506020858101356139ad8161359a565b935060408601359250606086013567ffffffffffffffff808211156139d157600080fd5b818801915088601f8301126139e557600080fd5b8135818111156139f7576139f76137c2565b613a09601f8201601f19168501613802565b91508082528984828501011115613a1f57600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215613a5257600080fd5b8235613a5d8161359a565b9150602083013561390a8161359a565b6020808252601a908201527f43616c6c6572206973206e6f7420746865206f70657261746f72000000000000604082015260600190565b600181811c90821680613ab857607f821691505b602082108103613ad857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f496e76616c69642077686974656c69737465642064657461696c000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c2c57610c2c613b15565b6020808252600e908201526d416d6f756e74206973207a65726f60901b604082015260600190565b6000816000190483118215151615613b8057613b80613b15565b500290565b602080825260119082015270125b9cdd59999a58da595b9d08199d5b99607a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f416d6f756e742069732067726561746572207468616e206d6178696d756d0000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b601f821115610f2757600081815260208120601f850160051c81016020861015613caa5750805b601f850160051c820191505b81811015613cc957828155600101613cb6565b505050505050565b67ffffffffffffffff831115613ce957613ce96137c2565b613cfd83613cf78354613aa4565b83613c83565b6000601f841160018114613d315760008515613d195750838201355b600019600387901b1c1916600186901b178355613d8b565b600083815260209020601f19861690835b82811015613d625786850135825560209485019460019092019101613d42565b5086821015613d7f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b600084516020613da58285838a0161351e565b855191840191613db88184848a0161351e565b8554920191600090613dc981613aa4565b60018281168015613de15760018114613df657613e22565b60ff1984168752821515830287019450613e22565b896000528560002060005b84811015613e1a57815489820152908301908701613e01565b505082870194505b50929a9950505050505050505050565b600060018201613e4457613e44613b15565b5060010190565b600060208284031215613e5d57600080fd5b5051919050565b600060208284031215613e7657600080fd5b8151611f7d81613833565b60008451613e9381846020890161351e565b91909101928352506020820152604001919050565b81810381811115610c2c57610c2c613b15565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613ef657613ef6613ed1565b500490565b600082613f0a57613f0a613ed1565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f9490830184613542565b9695505050505050565b600060208284031215613fb057600080fd5b8151611f7d816134bf565b63ffffffff818116838216019080821115613fd857613fd8613b15565b509291505056fea26469706673582212204b39dcddba6a3fdc163248fe2304bd96c0a462a89ecb97b86a248bf83c5f507564736f6c634300081000334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657268747470733a2f2f6173736574732e6a6f6b6572636861726c69652e636f6d2f6a636370697869652f64656661756c742e6a736f6e00000000000000000000000073b83358b626d6c574cbb150a728282a947859eb
Deployed Bytecode
0x6080604052600436106103ad5760003560e01c806370a08231116101e7578063b3ab15fb1161010d578063dd2d5601116100a0578063f2c4ce1e1161006f578063f2c4ce1e14610b50578063f2fde38b14610b70578063f7448a3114610b90578063fb5e28f314610bb057600080fd5b8063dd2d560114610adb578063e51b759314610af1578063e985e9c514610b07578063ed88c68e1461042b57600080fd5b8063c6682862116100dc578063c668286214610a70578063c87b56dd14610a85578063d1d6b73914610aa5578063d5abeb0114610ac557600080fd5b8063b3ab15fb146109ee578063b837764414610a0e578063b88d4fde14610a3b578063bacdd19814610a5b57600080fd5b80639106d7ba11610185578063a475b5dd11610154578063a475b5dd1461098f578063a689a914146109a4578063b23b6bdd146109c4578063b2ad32e5146109d957600080fd5b80639106d7ba1461092557806395d89b411461093a578063a22cb4651461094f578063a2a71c351461096f57600080fd5b806376527485116101c157806376527485146108b95780638456cb59146108ce5780638da5cb5b146108e35780638e909e0b146108f857600080fd5b806370a082311461086f578063715018a61461088f57806372250380146108a457600080fd5b80632f745c59116102d757806342842e0e1161026a578063518302271161023957806351830227146108085780635c975abb146108225780636352211e1461083a5780636c0360eb1461085a57600080fd5b806342842e0e146107885780634319ff2f146107a85780634df30e97146107c85780634f6ccce7146107e857600080fd5b80633ccfd60b116102a65780633ccfd60b1461072b5780633f04fba4146107405780633f3e4c11146107535780633f4ba83a1461077357600080fd5b80632f745c59146106375780632f8dccbc1461065757806330176e13146106eb57806338af3eed1461070b57600080fd5b806318160ddd1161034f57806323b872dd1161031e57806323b872dd1461051b5780632db115441461053b5780632e1a7d4d1461054e5780632ecd28ab1461056e57600080fd5b806318160ddd146104ba5780631c31f710146104cf5780631d891fa9146104ef57806323b826ca1461050557600080fd5b806306fdde031161038b57806306fdde031461042d578063081812fc1461044f578063095ea7b31461048757806314bb6daf146104a757600080fd5b806301ffc9a7146103b257806302817219146103e75780630475a4701461040b575b600080fd5b3480156103be57600080fd5b506103d26103cd3660046134d5565b610bc5565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103fd600a5481565b6040519081526020016103de565b34801561041757600080fd5b5061042b6104263660046134f2565b610c32565b005b34801561043957600080fd5b50610442610cf0565b6040516103de919061356e565b34801561045b57600080fd5b5061046f61046a366004613581565b610d82565b6040516001600160a01b0390911681526020016103de565b34801561049357600080fd5b5061042b6104a23660046135af565b610e17565b61042b6104b5366004613627565b610f2c565b3480156104c657600080fd5b506006546103fd565b3480156104db57600080fd5b5061042b6104ea366004613691565b6111d9565b3480156104fb57600080fd5b506103fd600c5481565b34801561051157600080fd5b506103fd600b5481565b34801561052757600080fd5b5061042b6105363660046136ae565b611277565b61042b610549366004613581565b6112a8565b34801561055a57600080fd5b5061042b610569366004613581565b611451565b34801561057a57600080fd5b506105c7601254601354601454601554601654601754601854600854600954600a54600b54600c5460ff808d169d6101008e0482169d6201000090049091169b9a99989796959493929190565b604080519e15158f529c151560208f01529a15159b8d019b909b5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526101008701526101208601526101408501526101608401526101808301919091526101a08201526101c0016103de565b34801561064357600080fd5b506103fd6106523660046135af565b611499565b34801561066357600080fd5b5060125460135460145460155460165460175460185461069f9660ff808216976101008304821697620100009093049091169590949193909289565b604080519915158a5297151560208a0152951515968801969096526060870193909352608086019190915260a085015260c084015260e0830191909152610100820152610120016103de565b3480156106f757600080fd5b5061042b6107063660046136ef565b611548565b34801561071757600080fd5b50600d5461046f906001600160a01b031681565b34801561073757600080fd5b5061042b611584565b61042b61074e366004613761565b6115cb565b34801561075f57600080fd5b5061042b61076e366004613581565b6118d7565b34801561077f57600080fd5b5061042b611932565b34801561079457600080fd5b5061042b6107a33660046136ae565b61196b565b3480156107b457600080fd5b5061042b6107c336600461384c565b611986565b3480156107d457600080fd5b5061042b6107e33660046134f2565b611a24565b3480156107f457600080fd5b506103fd610803366004613581565b611a88565b34801561081457600080fd5b50601e546103d29060ff1681565b34801561082e57600080fd5b5060195460ff166103d2565b34801561084657600080fd5b5061046f610855366004613581565b611b1e565b34801561086657600080fd5b50610442611b95565b34801561087b57600080fd5b506103fd61088a366004613691565b611c23565b34801561089b57600080fd5b5061042b611caa565b3480156108b057600080fd5b50610442611ce3565b3480156108c557600080fd5b5061042b611cf0565b3480156108da57600080fd5b5061042b611da9565b3480156108ef57600080fd5b5061046f611de0565b34801561090457600080fd5b506103fd610913366004613581565b60009081526010602052604090205490565b34801561093157600080fd5b506103fd611df7565b34801561094657600080fd5b50610442611e1b565b34801561095b57600080fd5b5061042b61096a3660046138dc565b611e2a565b34801561097b57600080fd5b5061042b61098a366004613915565b611e39565b34801561099b57600080fd5b5061042b611ee5565b3480156109b057600080fd5b506104426109bf366004613581565b611f23565b3480156109d057600080fd5b5061042b611f84565b3480156109e557600080fd5b5061042b611ff7565b3480156109fa57600080fd5b5061042b610a09366004613691565b61206c565b348015610a1a57600080fd5b50610a2e610a29366004613691565b61210a565b6040516103de9190613937565b348015610a4757600080fd5b5061042b610a5636600461397b565b6121f9565b348015610a6757600080fd5b5061042b612231565b348015610a7c57600080fd5b50610442612287565b348015610a9157600080fd5b50610442610aa0366004613581565b612294565b348015610ab157600080fd5b5061042b610ac0366004613691565b6123c2565b348015610ad157600080fd5b506103fd601a5481565b348015610ae757600080fd5b506103fd60085481565b348015610afd57600080fd5b506103fd60095481565b348015610b1357600080fd5b506103d2610b22366004613a3f565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b348015610b5c57600080fd5b5061042b610b6b3660046136ef565b6124d6565b348015610b7c57600080fd5b5061042b610b8b366004613691565b612512565b348015610b9c57600080fd5b5061042b610bab3660046135af565b6125af565b348015610bbc57600080fd5b5061042b612617565b60006001600160e01b031982166380ac58cd60e01b1480610bf657506001600160e01b03198216635b5e139f60e01b145b80610c1157506001600160e01b0319821663780e9d6360e01b145b80610c2c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b610c3a611de0565b6001600160a01b0316336001600160a01b03161480610c6c57506011546001600160a01b0316336001600160a01b0316145b610c915760405162461bcd60e51b8152600401610c8890613a6d565b60405180910390fd5b601254610100900460ff1615610ce25760405162461bcd60e51b815260206004820152601660248201527550726976617465206d696e742069732061637469766560501b6044820152606401610c88565b601492909255601655601855565b606060008054610cff90613aa4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2b90613aa4565b8015610d785780601f10610d4d57610100808354040283529160200191610d78565b820191906000526020600020905b815481529060010190602001808311610d5b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610dfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c88565b506000908152600360205260409020546001600160a01b031690565b6000610e2282611b1e565b9050806001600160a01b0316836001600160a01b031603610e8f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c88565b336001600160a01b0382161480610eab5750610eab8133610b22565b610f1d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c88565b610f2783836126bc565b505050565b60125462010000900460ff16610f7d5760405162461bcd60e51b8152602060048201526016602482015275159bdd58da195c881b5a5b9d081a5cc818db1bdcd95960521b6044820152606401610c88565b60408051602080820188905230606090811b6bffffffffffffffffffffffff1990811684860152602b60f91b6054850152339182901b1660558401526069830188905260898084018890528451808503909101815260a99093019093528151910120600f5483146110005760405162461bcd60e51b8152600401610c8890613ade565b61104184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e54915084905061272a565b6110865760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d9bdd58da195c8819195d185a5b60521b6044820152606401610c88565b60008781526010602052604090205486906110a2908a90613b2b565b11156110f05760405162461bcd60e51b815260206004820152601f60248201527f416d6d6f756e742069732067726561746572207468616e20766f7563686572006044820152606401610c88565b600088116111105760405162461bcd60e51b8152600401610c8890613b3e565b3461111b8987613b66565b11156111395760405162461bcd60e51b8152600401610c8890613b85565b61114382896127eb565b600087815260106020526040812080548a9290611161908490613b2b565b9250508190555087600a600082825461117a9190613b2b565b9091555050604080516001600160a01b0384168152602081018990529081018990523460608201527f9f62b4b30c37c0fa5a560150558db2f99f732dff3cf5b42687e97b1cae65df199060800160405180910390a15050505050505050565b336111e2611de0565b6001600160a01b0316146112085760405162461bcd60e51b8152600401610c8890613bb0565b6001600160a01b0381166112555760405162461bcd60e51b81526020600482015260146024820152734e6f7420746865207a65726f206164647265737360601b6044820152606401610c88565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6112813382612876565b61129d5760405162461bcd60e51b8152600401610c8890613be5565b610f2783838361296d565b60125460ff166112f25760405162461bcd60e51b8152602060048201526015602482015274141d589b1a58c81b5a5b9d081a5cc818db1bdcd959605a1b6044820152606401610c88565b600081116113125760405162461bcd60e51b8152600401610c8890613b3e565b6015548111156113345760405162461bcd60e51b8152600401610c8890613c36565b60126005015481600b54600954600854600c546113519190613b2b565b61135b9190613b2b565b6113659190613b2b565b61136f9190613b2b565b11156113b55760405162461bcd60e51b8152602060048201526015602482015274457863656564206d6178546f74616c537570706c7960581b6044820152606401610c88565b60135434906113c5908390613b66565b11156113e35760405162461bcd60e51b8152600401610c8890613b85565b336113ee81836127eb565b81600860008282546114009190613b2b565b9091555050604080516001600160a01b038316815260208101849052348183015290517f819f7e30541f2ed7e36c92ce039f5eb2d66b7dc094b33f416910e8fde56b80dc9181900360600190a15050565b3361145a611de0565b6001600160a01b0316146114805760405162461bcd60e51b8152600401610c8890613bb0565b600d54611496906001600160a01b031682612c9c565b50565b60006114a483611c23565b82106114f25760405162461bcd60e51b815260206004820152601960248201527f4f776e657220696e646578206f7574206f6620626f756e6473000000000000006044820152606401610c88565b6001600160a01b038316600090815260056020526040902080548390811061151c5761151c613c6d565b6000918252602090912060088204015460079091166004026101000a900463ffffffff16905092915050565b33611551611de0565b6001600160a01b0316146115775760405162461bcd60e51b8152600401610c8890613bb0565b601b610f27828483613cd1565b3361158d611de0565b6001600160a01b0316146115b35760405162461bcd60e51b8152600401610c8890613bb0565b600d544790611496906001600160a01b031682612c9c565b601254610100900460ff1661161b5760405162461bcd60e51b8152602060048201526016602482015275141c9a5d985d19481b5a5b9d081a5cc818db1bdcd95960521b6044820152606401610c88565b60408051602080820187905230606090811b6bffffffffffffffffffffffff1990811684860152605760f81b6054850152339182901b16605584015260698084018890528451808503909101815260899093019093528151910120600f5483146116975760405162461bcd60e51b8152600401610c8890613ade565b6116d884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e54915084905061272a565b6116f45760405162461bcd60e51b8152600401610c8890613ade565b600086815260106020526040902054156117505760405162461bcd60e51b815260206004820152601860248201527f576869656c697374656420686173206265656e207573656400000000000000006044820152606401610c88565b8460000361177f5760165487111561177a5760405162461bcd60e51b8152600401610c8890613c36565b61179f565b8487111561179f5760405162461bcd60e51b8152600401610c8890613c36565b600087116117bf5760405162461bcd60e51b8152600401610c8890613b3e565b6018546009546117d0908990613b2b565b111561181e5760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178507269766174654d696e74537570706c7900000000006044820152606401610c88565b601454349061182e908990613b66565b111561184c5760405162461bcd60e51b8152600401610c8890613b85565b61185682886127eb565b600086815260106020526040812088905560098054899290611879908490613b2b565b9091555050604080516001600160a01b0384168152602081018890529081018890523460608201527fea42e12d368267aa3744b225140b462e261f7bf081e5d5dbc006a74520064b909060800160405180910390a150505050505050565b6118df611de0565b6001600160a01b0316336001600160a01b0316148061191157506011546001600160a01b0316336001600160a01b0316145b61192d5760405162461bcd60e51b8152600401610c8890613a6d565b601755565b3361193b611de0565b6001600160a01b0316146119615760405162461bcd60e51b8152600401610c8890613bb0565b611969612db5565b565b610f27838383604051806020016040528060008152506121f9565b3361198f611de0565b6001600160a01b0316146119b55760405162461bcd60e51b8152600401610c8890613bb0565b8051601280546020840151604085015161ffff1990921693151561ff0019169390931761010093151584021762ff0000191662010000911515919091021790556060820151601355608082015160145560a082015160155560c082015160165560e08201516017550151601855565b611a2c611de0565b6001600160a01b0316336001600160a01b03161480611a5e57506011546001600160a01b0316336001600160a01b0316145b611a7a5760405162461bcd60e51b8152600401610c8890613a6d565b600e92909255600f55600b55565b6000611a9360065490565b8210611ae15760405162461bcd60e51b815260206004820152601a60248201527f476c6f62616c20696e646578206f7574206f6620626f756e64730000000000006044820152606401610c88565b60068281548110611af457611af4613c6d565b6000918252602090912060088204015460079091166004026101000a900463ffffffff1692915050565b6000818152600260205260408120546001600160a01b031680610c2c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c88565b601b8054611ba290613aa4565b80601f0160208091040260200160405190810160405280929190818152602001828054611bce90613aa4565b8015611c1b5780601f10611bf057610100808354040283529160200191611c1b565b820191906000526020600020905b815481529060010190602001808311611bfe57829003601f168201915b505050505081565b60006001600160a01b038216611c8e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c88565b506001600160a01b031660009081526005602052604090205490565b33611cb3611de0565b6001600160a01b031614611cd95760405162461bcd60e51b8152600401610c8890613bb0565b6119696000612e48565b601c8054611ba290613aa4565b611cf8611de0565b6001600160a01b0316336001600160a01b03161480611d2a57506011546001600160a01b0316336001600160a01b0316145b611d465760405162461bcd60e51b8152600401610c8890613a6d565b601354611d955760405162461bcd60e51b815260206004820152601960248201527f5075626c6963204d696e74205072696365206973207a65726f000000000000006044820152606401610c88565b6012805460ff19811660ff90911615179055565b33611db2611de0565b6001600160a01b031614611dd85760405162461bcd60e51b8152600401610c8890613bb0565b611969612ea8565b60075464010000000090046001600160a01b031690565b6000600a54600954600854611e0c9190613b2b565b611e169190613b2b565b905090565b606060018054610cff90613aa4565b611e35338383612f23565b5050565b611e41611de0565b6001600160a01b0316336001600160a01b03161480611e7357506011546001600160a01b0316336001600160a01b0316145b611e8f5760405162461bcd60e51b8152600401610c8890613a6d565b60125460ff1615611eda5760405162461bcd60e51b81526020600482015260156024820152745075626c6963206d696e742069732061637469766560581b6044820152606401610c88565b601391909155601555565b33611eee611de0565b6001600160a01b031614611f145760405162461bcd60e51b8152600401610c8890613bb0565b601e805460ff19166001179055565b60606000611f2f612ff1565b90506000815111611f4f5760405180602001604052806000815250611f7d565b80611f5984613000565b601d604051602001611f6d93929190613d92565b6040516020818303038152906040525b9392505050565b611f8c611de0565b6001600160a01b0316336001600160a01b03161480611fbe57506011546001600160a01b0316336001600160a01b0316145b611fda5760405162461bcd60e51b8152600401610c8890613a6d565b6012805461ff001981166101009182900460ff1615909102179055565b611fff611de0565b6001600160a01b0316336001600160a01b0316148061203157506011546001600160a01b0316336001600160a01b0316145b61204d5760405162461bcd60e51b8152600401610c8890613a6d565b6012805462ff0000198116620100009182900460ff1615909102179055565b33612075611de0565b6001600160a01b03161461209b5760405162461bcd60e51b8152600401610c8890613bb0565b6001600160a01b0381166120e85760405162461bcd60e51b81526020600482015260146024820152734e6f7420746865207a65726f206164647265737360601b6044820152606401610c88565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061211783611c23565b905060008167ffffffffffffffff811115612134576121346137c2565b60405190808252806020026020018201604052801561215d578160200160208202803683370190505b506001600160a01b03851660009081526005602052604081209192505b838110156121ef5781818154811061219457612194613c6d565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff168382815181106121d2576121d2613c6d565b6020908102919091010152806121e781613e32565b91505061217a565b5090949350505050565b6122033383612876565b61221f5760405162461bcd60e51b8152600401610c8890613be5565b61222b84848484613101565b50505050565b612239611de0565b6001600160a01b0316336001600160a01b0316148061226b57506011546001600160a01b0316336001600160a01b0316145b611d955760405162461bcd60e51b8152600401610c8890613a6d565b601d8054611ba290613aa4565b6000818152600260205260409020546060906001600160a01b03166123135760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c88565b601e5460ff1615156000036123b457601c805461232f90613aa4565b80601f016020809104026020016040519081016040528092919081815260200182805461235b90613aa4565b80156123a85780601f1061237d576101008083540402835291602001916123a8565b820191906000526020600020905b81548152906001019060200180831161238b57829003601f168201915b50505050509050919050565b610c2c82611f23565b919050565b336123cb611de0565b6001600160a01b0316146123f15760405162461bcd60e51b8152600401610c8890613bb0565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245c9190613e4b565b600d5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af11580156124b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f279190613e64565b336124df611de0565b6001600160a01b0316146125055760405162461bcd60e51b8152600401610c8890613bb0565b601c610f27828483613cd1565b3361251b611de0565b6001600160a01b0316146125415760405162461bcd60e51b8152600401610c8890613bb0565b6001600160a01b0381166125a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c88565b61149681612e48565b336125b8611de0565b6001600160a01b0316146125de5760405162461bcd60e51b8152600401610c8890613bb0565b600d5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401612493565b61261f611de0565b6001600160a01b0316336001600160a01b0316148061265157506011546001600160a01b0316336001600160a01b0316145b61266d5760405162461bcd60e51b8152600401610c8890613a6d565b601454611fda5760405162461bcd60e51b815260206004820152601a60248201527f50726976617465204d696e74205072696365206973207a65726f0000000000006044820152606401610c88565b600081815260036020526040902080546001600160a01b0319166001600160a01b03841690811790915581906126f182611b1e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815b85518110156127e057600086828151811061274c5761274c613c6d565b602002602001015190508083116127975761276682613000565b838260405160200161277a93929190613e81565b6040516020818303038152906040528051906020012092506127cd565b6127a082613000565b81846040516020016127b493929190613e81565b6040516020818303038152906040528051906020012092505b50806127d881613e32565b91505061272f565b509092149392505050565b601a54816127f860065490565b6128029190613b2b565b11156128505760405162461bcd60e51b815260206004820152601760248201527f4d617820737570706c79206c696d6974206578636565640000000000000000006044820152606401610c88565b60005b81811015610f275761286483613134565b8061286e81613e32565b915050612853565b6000818152600260205260408120546001600160a01b03166128ef5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c88565b60006128fa83611b1e565b9050806001600160a01b0316846001600160a01b0316148061294157506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b806129655750836001600160a01b031661295a84610d82565b6001600160a01b0316145b949350505050565b826001600160a01b031661298082611b1e565b6001600160a01b0316146129e45760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c88565b6001600160a01b038216612a465760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c88565b612a5183838361314d565b612a5c6000826126bc565b600081815260026020818152604080842080546001600160a01b0319166001600160a01b038881169190911780835590891686526005845291852086865293909252825492939192600160c01b90910463ffffffff1691908490612ac290600190613ea8565b81548110612ad257612ad2613c6d565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16905080848363ffffffff1681548110612b1357612b13613c6d565b600091825260208083206008830401805460079093166004026101000a63ffffffff8181021990941695841602949094179093558381168252600290925260409020805463ffffffff60c01b1916600160c01b928516929092029190911790558354849080612b8457612b84613ebb565b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055600060056000886001600160a01b03166001600160a01b03168152602001908152602001600020905080805490508460000160186101000a81548163ffffffff021916908363ffffffff160217905550808690806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908363ffffffff16021790555085876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050565b80471015612cec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c88565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d39576040519150601f19603f3d011682016040523d82523d6000602084013e612d3e565b606091505b5050905080610f275760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c88565b60195460ff16612dfe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c88565b6019805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600780546001600160a01b03838116640100000000818102640100000000600160c01b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60195460ff1615612eee5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c88565b6019805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e2b3390565b816001600160a01b0316836001600160a01b031603612f845760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c88565b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060601b8054610cff90613aa4565b6060816000036130275750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613051578061303b81613e32565b915061304a9050600a83613ee7565b915061302b565b60008167ffffffffffffffff81111561306c5761306c6137c2565b6040519080825280601f01601f191660200182016040528015613096576020820181803683370190505b5090505b8415612965576130ab600183613ea8565b91506130b8600a86613efb565b6130c3906030613b2b565b60f81b8183815181106130d8576130d8613c6d565b60200101906001600160f81b031916908160001a9053506130fa600a86613ee7565b945061309a565b61310c84848461296d565b61311884848484613195565b61222b5760405162461bcd60e51b8152600401610c8890613f0f565b6114968160405180602001604052806000815250613296565b60195460ff1615610f275760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b6044820152606401610c88565b60006001600160a01b0384163b1561328b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906131d9903390899088908890600401613f61565b6020604051808303816000875af1925050508015613214575060408051601f3d908101601f1916820190925261321191810190613f9e565b60015b613271573d808015613242576040519150601f19603f3d011682016040523d82523d6000602084013e613247565b606091505b5080516000036132695760405162461bcd60e51b8152600401610c8890613f0f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612965565b506001949350505050565b60075463ffffffff166132a8836132d1565b6132b56000848385613195565b610f275760405162461bcd60e51b8152600401610c8890613f0f565b6001600160a01b0381166133275760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c88565b60075463ffffffff1661333c6000838361314d565b6001600160a01b038216600081815260056020908152604080832063ffffffff8087168086526002855292852080546001600160a01b031981168817825583548316600160c01b02600167ffffffff0000000160a01b031990911690971796909617808755600680548316600160a01b0263ffffffff60a01b199092169190911787558254600181810185558488529587206008808304909101805460046007948516810261010090810a808b0290890219909316929092179092558454808a018655948a529184047ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01805494841690910290910a9586029584021990921694909417905582549195949161345491859116613fbb565b92506101000a81548163ffffffff021916908363ffffffff1602179055508263ffffffff16846001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461222b565b6001600160e01b03198116811461149657600080fd5b6000602082840312156134e757600080fd5b8135611f7d816134bf565b60008060006060848603121561350757600080fd5b505081359360208301359350604090920135919050565b60005b83811015613539578181015183820152602001613521565b50506000910152565b6000815180845261355a81602086016020860161351e565b601f01601f19169290920160200192915050565b602081526000611f7d6020830184613542565b60006020828403121561359357600080fd5b5035919050565b6001600160a01b038116811461149657600080fd5b600080604083850312156135c257600080fd5b82356135cd8161359a565b946020939093013593505050565b60008083601f8401126135ed57600080fd5b50813567ffffffffffffffff81111561360557600080fd5b6020830191508360208260051b850101111561362057600080fd5b9250929050565b60008060008060008060a0878903121561364057600080fd5b86359550602087013594506040870135935060608701359250608087013567ffffffffffffffff81111561367357600080fd5b61367f89828a016135db565b979a9699509497509295939492505050565b6000602082840312156136a357600080fd5b8135611f7d8161359a565b6000806000606084860312156136c357600080fd5b83356136ce8161359a565b925060208401356136de8161359a565b929592945050506040919091013590565b6000806020838503121561370257600080fd5b823567ffffffffffffffff8082111561371a57600080fd5b818501915085601f83011261372e57600080fd5b81358181111561373d57600080fd5b86602082850101111561374f57600080fd5b60209290920196919550909350505050565b60008060008060006080868803121561377957600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156137a557600080fd5b6137b1888289016135db565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b604051610120810167ffffffffffffffff811182821017156137fc576137fc6137c2565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561382b5761382b6137c2565b604052919050565b801515811461149657600080fd5b80356123bd81613833565b6000610120828403121561385f57600080fd5b6138676137d8565b61387083613841565b815261387e60208401613841565b602082015261388f60408401613841565b6040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508091505092915050565b600080604083850312156138ef57600080fd5b82356138fa8161359a565b9150602083013561390a81613833565b809150509250929050565b6000806040838503121561392857600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561396f57835183529284019291840191600101613953565b50909695505050505050565b6000806000806080858703121561399157600080fd5b843561399c8161359a565b93506020858101356139ad8161359a565b935060408601359250606086013567ffffffffffffffff808211156139d157600080fd5b818801915088601f8301126139e557600080fd5b8135818111156139f7576139f76137c2565b613a09601f8201601f19168501613802565b91508082528984828501011115613a1f57600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215613a5257600080fd5b8235613a5d8161359a565b9150602083013561390a8161359a565b6020808252601a908201527f43616c6c6572206973206e6f7420746865206f70657261746f72000000000000604082015260600190565b600181811c90821680613ab857607f821691505b602082108103613ad857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f496e76616c69642077686974656c69737465642064657461696c000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c2c57610c2c613b15565b6020808252600e908201526d416d6f756e74206973207a65726f60901b604082015260600190565b6000816000190483118215151615613b8057613b80613b15565b500290565b602080825260119082015270125b9cdd59999a58da595b9d08199d5b99607a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f416d6f756e742069732067726561746572207468616e206d6178696d756d0000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b601f821115610f2757600081815260208120601f850160051c81016020861015613caa5750805b601f850160051c820191505b81811015613cc957828155600101613cb6565b505050505050565b67ffffffffffffffff831115613ce957613ce96137c2565b613cfd83613cf78354613aa4565b83613c83565b6000601f841160018114613d315760008515613d195750838201355b600019600387901b1c1916600186901b178355613d8b565b600083815260209020601f19861690835b82811015613d625786850135825560209485019460019092019101613d42565b5086821015613d7f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b600084516020613da58285838a0161351e565b855191840191613db88184848a0161351e565b8554920191600090613dc981613aa4565b60018281168015613de15760018114613df657613e22565b60ff1984168752821515830287019450613e22565b896000528560002060005b84811015613e1a57815489820152908301908701613e01565b505082870194505b50929a9950505050505050505050565b600060018201613e4457613e44613b15565b5060010190565b600060208284031215613e5d57600080fd5b5051919050565b600060208284031215613e7657600080fd5b8151611f7d81613833565b60008451613e9381846020890161351e565b91909101928352506020820152604001919050565b81810381811115610c2c57610c2c613b15565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613ef657613ef6613ed1565b500490565b600082613f0a57613f0a613ed1565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f9490830184613542565b9695505050505050565b600060208284031215613fb057600080fd5b8151611f7d816134bf565b63ffffffff818116838216019080821115613fd857613fd8613b15565b509291505056fea26469706673582212204b39dcddba6a3fdc163248fe2304bd96c0a462a89ecb97b86a248bf83c5f507564736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000073b83358b626d6c574cbb150a728282a947859eb
-----Decoded View---------------
Arg [0] : beneficiary (address): 0x73b83358b626d6c574Cbb150A728282A947859eb
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000073b83358b626d6c574cbb150a728282a947859eb
Deployed Bytecode Sourcemap
61992:3479:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45952:373;;;;;;;;;;-1:-1:-1;45952:373:0;;;;;:::i;:::-;;:::i;:::-;;;661:14:1;;654:22;636:41;;624:2;609:18;45952:373:0;;;;;;;;24044:34;;;;;;;;;;;;;;;;;;;834:25:1;;;822:2;807:18;24044:34:0;688:177:1;27120:348:0;;;;;;;;;;-1:-1:-1;27120:348:0;;;;;:::i;:::-;;:::i;:::-;;46986:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48541:219::-;;;;;;;;;;-1:-1:-1;48541:219:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2296:32:1;;;2278:51;;2266:2;2251:18;48541:219:0;2132:203:1;48067:408:0;;;;;;;;;;-1:-1:-1;48067:408:0;;;;;:::i;:::-;;:::i;29941:1076::-;;;;;;:::i;:::-;;:::i;60360:105::-;;;;;;;;;;-1:-1:-1;60440:10:0;:17;60360:105;;24936:186;;;;;;;;;;-1:-1:-1;24936:186:0;;;;;:::i;:::-;;:::i;24125:31::-;;;;;;;;;;;;;;;;24085:33;;;;;;;;;;;;;;;;49289:303;;;;;;;;;;-1:-1:-1;49289:303:0;;;;;:::i;:::-;;:::i;27776:712::-;;;;;;:::i;:::-;;:::i;31707:141::-;;;;;;;;;;-1:-1:-1;31707:141:0;;;;;:::i;:::-;;:::i;32483:1445::-;;;;;;;;;;;;33104:12;:31;33304:28;;33367:29;;33431:32;;33498:33;;33566:27;;33628:33;;33696:15;;33746:16;;33797:19;;33851:18;;33904:16;;33104:31;;;;;;33170:32;;;;;33237;;;;;;;33304:28;33367:29;33431:32;33498:33;33566:27;33628:33;33696:15;33746:16;33797:19;33851:18;33904:16;32483:1445;;;;;5127:14:1;;5120:22;5102:41;;5186:14;;5179:22;5174:2;5159:18;;5152:50;470:13;;463:21;5235:18;;;451:34;;;;5285:2;5270:18;;5263:34;;;;5328:3;5313:19;;5306:35;;;;5372:3;5357:19;;5350:35;;;;5416:3;5401:19;;5394:35;;;;5460:3;5445:19;;5438:35;5504:3;5489:19;;5482:35;5548:3;5533:19;;5526:35;5592:3;5577:19;;5570:36;5637:3;5622:19;;5615:36;5682:3;5667:19;;5660:36;;;;5727:3;5712:19;;5705:36;5089:3;5074:19;32483:1445:0;4605:1142:1;59632:239:0;;;;;;;;;;-1:-1:-1;59632:239:0;;;;;:::i;:::-;;:::i;24526:32::-;;;;;;;;;;-1:-1:-1;24526:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6130:14:1;;6123:22;6105:41;;6189:14;;6182:22;6177:2;6162:18;;6155:50;6248:14;;6241:22;6221:18;;;6214:50;;;;6295:2;6280:18;;6273:34;;;;6338:3;6323:19;;6316:35;;;;6382:3;6367:19;;6360:35;6426:3;6411:19;;6404:35;6470:3;6455:19;;6448:35;;;;6514:3;6499:19;;6492:35;6092:3;6077:19;24526:32:0;5752:781:1;64224:120:0;;;;;;;;;;-1:-1:-1;64224:120:0;;;;;:::i;:::-;;:::i;24165:26::-;;;;;;;;;;-1:-1:-1;24165:26:0;;;;-1:-1:-1;;;;;24165:26:0;;;31521:174;;;;;;;;;;;;;:::i;28496:1437::-;;;;;;:::i;:::-;;:::i;26616:128::-;;;;;;;;;;-1:-1:-1;26616:128:0;;;;;:::i;:::-;;:::i;63755:67::-;;;;;;;;;;;;;:::i;49663:151::-;;;;;;;;;;-1:-1:-1;49663:151:0;;;;;:::i;:::-;;:::i;24771:118::-;;;;;;;;;;-1:-1:-1;24771:118:0;;;;;:::i;:::-;;:::i;27523:245::-;;;;;;;;;;-1:-1:-1;27523:245:0;;;;;:::i;:::-;;:::i;60542:207::-;;;;;;;;;;-1:-1:-1;60542:207:0;;;;;:::i;:::-;;:::i;62367:20::-;;;;;;;;;;-1:-1:-1;62367:20:0;;;;;;;;20477:86;;;;;;;;;;-1:-1:-1;20548:7:0;;;;20477:86;;46669:250;;;;;;;;;;-1:-1:-1;46669:250:0;;;;;:::i;:::-;;:::i;62191:21::-;;;;;;;;;;;;;:::i;46389:218::-;;;;;;;;;;-1:-1:-1;46389:218:0;;;;;:::i;:::-;;:::i;18528:103::-;;;;;;;;;;;;;:::i;62219:86::-;;;;;;;;;;;;;:::i;25803:231::-;;;;;;;;;;;;;:::i;63684:63::-;;;;;;;;;;;;;:::i;17877:87::-;;;;;;;;;;;;;:::i;31240:122::-;;;;;;;;;;-1:-1:-1;31240:122:0;;;;;:::i;:::-;31305:7;31332:22;;;:11;:22;;;;;;;31240:122;26446:135;;;;;;;;;;;;;:::i;47155:104::-;;;;;;;;;;;;;:::i;48832:155::-;;;;;;;;;;-1:-1:-1;48832:155:0;;;;;:::i;:::-;;:::i;26791:282::-;;;;;;;;;;-1:-1:-1;26791:282:0;;;;;:::i;:::-;;:::i;63581:95::-;;;;;;;;;;;;;:::i;64606:294::-;;;;;;;;;;-1:-1:-1;64606:294:0;;;;;:::i;:::-;;:::i;25631:164::-;;;;;;;;;;;;;:::i;26286:152::-;;;;;;;;;;;;;:::i;32314:161::-;;;;;;;;;;-1:-1:-1;32314:161:0;;;;;:::i;:::-;;:::i;59879:403::-;;;;;;;;;;-1:-1:-1;59879:403:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49885:285::-;;;;;;;;;;-1:-1:-1;49885:285:0;;;;;:::i;:::-;;:::i;25462:161::-;;;;;;;;;;;;;:::i;62320:38::-;;;;;;;;;;;;;:::i;64908:324::-;;;;;;;;;;-1:-1:-1;64908:324:0;;;;;:::i;:::-;;:::i;31860:186::-;;;;;;;;;;-1:-1:-1;31860:186:0;;;;;:::i;:::-;;:::i;62148:30::-;;;;;;;;;;;;;;;;23965;;;;;;;;;;;;;;;;24002:31;;;;;;;;;;;;;;;;49058:164;;;;;;;;;;-1:-1:-1;49058:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;49179:25:0;;;49155:4;49179:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;49058:164;64352:130;;;;;;;;;;-1:-1:-1;64352:130:0;;;;;:::i;:::-;;:::i;18786:201::-;;;;;;;;;;-1:-1:-1;18786:201:0;;;;;:::i;:::-;;:::i;32062:142::-;;;;;;;;;;-1:-1:-1;32062:142:0;;;;;:::i;:::-;;:::i;26042:236::-;;;;;;;;;;;;;:::i;45952:373::-;46054:4;-1:-1:-1;;;;;;46091:40:0;;-1:-1:-1;;;46091:40:0;;:105;;-1:-1:-1;;;;;;;46148:48:0;;-1:-1:-1;;;46148:48:0;46091:105;:172;;;-1:-1:-1;;;;;;;46213:50:0;;-1:-1:-1;;;46213:50:0;46091:172;:226;;;-1:-1:-1;;;;;;;;;;42967:40:0;;;46281:36;46071:246;45952:373;-1:-1:-1;;45952:373:0:o;27120:348::-;34092:7;:5;:7::i;:::-;-1:-1:-1;;;;;34076:23:0;16681:10;-1:-1:-1;;;;;34076:23:0;;:52;;;-1:-1:-1;34119:9:0;;-1:-1:-1;;;;;34119:9:0;16681:10;-1:-1:-1;;;;;34103:25:0;;34076:52;34067:92;;;;-1:-1:-1;;;34067:92:0;;;;;;;:::i;:::-;;;;;;;;;27247:12:::1;:32:::0;::::1;::::0;::::1;;;27246:33;27238:68;;;::::0;-1:-1:-1;;;27238:68:0;;14065:2:1;27238:68:0::1;::::0;::::1;14047:21:1::0;14104:2;14084:18;;;14077:30;-1:-1:-1;;;14123:18:1;;;14116:52;14185:18;;27238:68:0::1;13863:346:1::0;27238:68:0::1;27317:29:::0;:37;;;;27365:33;:42;27418:33;:42;27120:348::o;46986:100::-;47040:13;47073:5;47066:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46986:100;:::o;48541:219::-;48617:7;51726:21;;;:12;:21;;;;;:27;-1:-1:-1;;;;;51726:27:0;48637:73;;;;-1:-1:-1;;;48637:73:0;;14801:2:1;48637:73:0;;;14783:21:1;14840:2;14820:18;;;14813:30;14879:34;14859:18;;;14852:62;-1:-1:-1;;;14930:18:1;;;14923:42;14982:19;;48637:73:0;14599:408:1;48637:73:0;-1:-1:-1;48728:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;48728:24:0;;48541:219::o;48067:408::-;48148:13;48164:24;48180:7;48164:15;:24::i;:::-;48148:40;;48213:5;-1:-1:-1;;;;;48207:11:0;:2;-1:-1:-1;;;;;48207:11:0;;48199:57;;;;-1:-1:-1;;;48199:57:0;;15214:2:1;48199:57:0;;;15196:21:1;15253:2;15233:18;;;15226:30;15292:34;15272:18;;;15265:62;-1:-1:-1;;;15343:18:1;;;15336:31;15384:19;;48199:57:0;15012:397:1;48199:57:0;16681:10;-1:-1:-1;;;;;48289:21:0;;;;:62;;-1:-1:-1;48314:37:0;48331:5;16681:10;49058:164;:::i;48314:37::-;48267:168;;;;-1:-1:-1;;;48267:168:0;;15616:2:1;48267:168:0;;;15598:21:1;15655:2;15635:18;;;15628:30;15694:34;15674:18;;;15667:62;15765:26;15745:18;;;15738:54;15809:19;;48267:168:0;15414:420:1;48267:168:0;48446:21;48455:2;48459:7;48446:8;:21::i;:::-;48137:338;48067:408;;:::o;29941:1076::-;30132:12;:32;;;;;;30124:66;;;;-1:-1:-1;;;30124:66:0;;16041:2:1;30124:66:0;;;16023:21:1;16080:2;16060:18;;;16053:30;-1:-1:-1;;;16099:18:1;;;16092:52;16161:18;;30124:66:0;15839:346:1;30124:66:0;30264:81;;;;;;;16532:19:1;;;30300:4:0;16639:2:1;16635:15;;;-1:-1:-1;;16631:24:1;;;16617:12;;;16610:46;-1:-1:-1;;;16672:12:1;;;16665:25;16681:10:0;16724:15:1;;;;16720:24;16706:12;;;16699:46;16761:12;;;16754:28;;;16798:13;;;;16791:29;;;30264:81:0;;;;;;;;;;16836:13:1;;;;30264:81:0;;;30254:92;;;;;30389:12;;30373:28;;30365:66;;;;-1:-1:-1;;;30365:66:0;;;;;;;:::i;:::-;30450:44;30469:5;;30450:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30476:11:0;;;-1:-1:-1;30489:4:0;;-1:-1:-1;30450:18:0;:44::i;:::-;30442:78;;;;-1:-1:-1;;;30442:78:0;;17417:2:1;30442:78:0;;;17399:21:1;17456:2;17436:18;;;17429:30;-1:-1:-1;;;17475:18:1;;;17468:52;17537:18;;30442:78:0;17215:346:1;30442:78:0;30547:22;;;;:11;:22;;;;;;30582:13;;30547:31;;30572:6;;30547:31;:::i;:::-;:48;;30539:91;;;;-1:-1:-1;;;30539:91:0;;18030:2:1;30539:91:0;;;18012:21:1;18069:2;18049:18;;;18042:30;18108:33;18088:18;;;18081:61;18159:18;;30539:91:0;17828:355:1;30539:91:0;30690:1;30681:6;:10;30673:36;;;;-1:-1:-1;;;30673:36:0;;;;;;;:::i;:::-;30761:9;30736:21;30751:6;30736:12;:21;:::i;:::-;:34;;30728:64;;;;-1:-1:-1;;;30728:64:0;;;;;;;:::i;:::-;30813:19;30821:2;30825:6;30813:7;:19::i;:::-;30853:22;;;;:11;:22;;;;;:32;;30879:6;;30853:22;:32;;30879:6;;30853:32;:::i;:::-;;;;;;;;30927:6;30904:19;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;30957:45:0;;;-1:-1:-1;;;;;19299:32:1;;19281:51;;19363:2;19348:18;;19341:34;;;19391:18;;;19384:34;;;30992:9:0;19449:2:1;19434:18;;19427:34;30957:45:0;;19268:3:1;19253:19;30957:45:0;;;;;;;30111:906;;29941:1076;;;;;;:::o;24936:186::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25026:26:0;::::1;25018:59;;;::::0;-1:-1:-1;;;25018:59:0;;20035:2:1;25018:59:0::1;::::0;::::1;20017:21:1::0;20074:2;20054:18;;;20047:30;-1:-1:-1;;;20093:18:1;;;20086:50;20153:18;;25018:59:0::1;19833:344:1::0;25018:59:0::1;25088:11;:26:::0;;-1:-1:-1;;;;;;25088:26:0::1;-1:-1:-1::0;;;;;25088:26:0;;;::::1;::::0;;;::::1;::::0;;24936:186::o;49289:303::-;49450:41;16681:10;49483:7;49450:18;:41::i;:::-;49442:103;;;;-1:-1:-1;;;49442:103:0;;;;;;;:::i;:::-;49556:28;49566:4;49572:2;49576:7;49556:9;:28::i;27776:712::-;27846:12;:31;;;27838:64;;;;-1:-1:-1;;;27838:64:0;;20802:2:1;27838:64:0;;;20784:21:1;20841:2;20821:18;;;20814:30;-1:-1:-1;;;20860:18:1;;;20853:51;20921:18;;27838:64:0;20600:345:1;27838:64:0;27930:1;27921:6;:10;27913:36;;;;-1:-1:-1;;;27913:36:0;;;;;;;:::i;:::-;27978:32;;27968:42;;;27960:84;;;;-1:-1:-1;;;27960:84:0;;;;;;;:::i;:::-;28158:12;:27;;;28148:6;28127:18;;28108:16;;28090:15;;28071:16;;:34;;;;:::i;:::-;:53;;;;:::i;:::-;:74;;;;:::i;:::-;:83;;;;:::i;:::-;:114;;28063:147;;;;-1:-1:-1;;;28063:147:0;;21511:2:1;28063:147:0;;;21493:21:1;21550:2;21530:18;;;21523:30;-1:-1:-1;;;21569:18:1;;;21562:51;21630:18;;28063:147:0;21309:345:1;28063:147:0;28229:28;;28270:9;;28229:37;;28260:6;;28229:37;:::i;:::-;:50;;28221:80;;;;-1:-1:-1;;;28221:80:0;;;;;;;:::i;:::-;16681:10;28360:19;16681:10;28372:6;28360:7;:19::i;:::-;28417:6;28398:15;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;28447:33:0;;;-1:-1:-1;;;;;21879:32:1;;21861:51;;21943:2;21928:18;;21921:34;;;28470:9:0;21971:18:1;;;21964:34;28447:33:0;;;;;;;21849:2:1;28447:33:0;;;27827:661;27776:712;:::o;31707:141::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;31818:11:::1;::::0;31792:48:::1;::::0;-1:-1:-1;;;;;31818:11:0::1;31832:7:::0;31792:17:::1;:48::i;:::-;31707:141:::0;:::o;59632:239::-;59720:7;59756:24;59774:5;59756:17;:24::i;:::-;59748:5;:32;59740:70;;;;-1:-1:-1;;;59740:70:0;;22211:2:1;59740:70:0;;;22193:21:1;22250:2;22230:18;;;22223:30;22289:27;22269:18;;;22262:55;22334:18;;59740:70:0;22009:349:1;59740:70:0;-1:-1:-1;;;;;59836:19:0;;;;;;:12;:19;;;;;:26;;59856:5;;59836:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59632:239:0;;;;:::o;64224:120::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;64323:7:::1;:13;64333:3:::0;;64323:7;:13:::1;:::i;31521:174::-:0;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;31664:11:::1;::::0;31598:21:::1;::::0;31638:49:::1;::::0;-1:-1:-1;;;;;31664:11:0::1;31598:21:::0;31638:17:::1;:49::i;28496:1437::-:0;28678:12;:32;;;;;;28670:66;;;;-1:-1:-1;;;28670:66:0;;24755:2:1;28670:66:0;;;24737:21:1;24794:2;24774:18;;;24767:30;-1:-1:-1;;;24813:18:1;;;24806:52;24875:18;;28670:66:0;24553:346:1;28670:66:0;28810:75;;;;;;;25218:19:1;;;28850:4:0;25325:2:1;25321:15;;;-1:-1:-1;;25317:24:1;;;25303:12;;;25296:46;-1:-1:-1;;;25358:12:1;;;25351:25;16681:10:0;25410:15:1;;;;25406:24;25392:12;;;25385:46;25447:12;;;;25440:28;;;28810:75:0;;;;;;;;;;25484:13:1;;;;28810:75:0;;;28800:86;;;;;28921:12;;28905:28;;28897:66;;;;-1:-1:-1;;;28897:66:0;;;;;;;:::i;:::-;28982:44;29001:5;;28982:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29008:11:0;;;-1:-1:-1;29021:4:0;;-1:-1:-1;28982:18:0;:44::i;:::-;28974:82;;;;-1:-1:-1;;;28974:82:0;;;;;;;:::i;:::-;29075:26;;;;:11;:26;;;;;;:31;29067:68;;;;-1:-1:-1;;;29067:68:0;;25710:2:1;29067:68:0;;;25692:21:1;25749:2;25729:18;;;25722:30;25788:26;25768:18;;;25761:54;25832:18;;29067:68:0;25508:348:1;29067:68:0;29166:17;29187:1;29166:22;29162:310;;29235:33;;29225:43;;;29217:85;;;;-1:-1:-1;;;29217:85:0;;;;;;;:::i;:::-;29162:310;;;29381:17;29371:6;:27;;29363:69;;;;-1:-1:-1;;;29363:69:0;;;;;;;:::i;:::-;29499:1;29490:6;:10;29482:36;;;;-1:-1:-1;;;29482:36:0;;;;;;;:::i;:::-;29566:33;;29537:16;;:25;;29556:6;;29537:25;:::i;:::-;:62;;29529:101;;;;-1:-1:-1;;;29529:101:0;;26063:2:1;29529:101:0;;;26045:21:1;26102:2;26082:18;;;26075:30;26141:29;26121:18;;;26114:57;26188:18;;29529:101:0;25861:351:1;29529:101:0;29649:29;;29691:9;;29649:38;;29681:6;;29649:38;:::i;:::-;:51;;29641:81;;;;-1:-1:-1;;;29641:81:0;;;;;;;:::i;:::-;29735:19;29743:2;29747:6;29735:7;:19::i;:::-;29783:26;;;;:11;:26;;;;;:35;;;29829:16;:26;;29812:6;;29783:26;29829;;29812:6;;29829:26;:::i;:::-;;;;-1:-1:-1;;29873:49:0;;;-1:-1:-1;;;;;19299:32:1;;19281:51;;19363:2;19348:18;;19341:34;;;19391:18;;;19384:34;;;29912:9:0;19449:2:1;19434:18;;19427:34;29873:49:0;;19268:3:1;19253:19;29873:49:0;;;;;;;28657:1276;;28496:1437;;;;;:::o;26616:128::-;34092:7;:5;:7::i;:::-;-1:-1:-1;;;;;34076:23:0;16681:10;-1:-1:-1;;;;;34076:23:0;;:52;;;-1:-1:-1;34119:9:0;;-1:-1:-1;;;;;34119:9:0;16681:10;-1:-1:-1;;;;;34103:25:0;;34076:52;34067:92;;;;-1:-1:-1;;;34067:92:0;;;;;;;:::i;:::-;26700:27;:36;26616:128::o;63755:67::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;63804:10:::1;:8;:10::i;:::-;63755:67::o:0;49663:151::-;49767:39;49784:4;49790:2;49794:7;49767:39;;;;;;;;;;;;:16;:39::i;24771:118::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;24860:21;;:12:::1;:21:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;24860:21:0;;;;::::1;;-1:-1:-1::0;;24860:21:0;;;;;::::1;::::0;::::1;;::::0;::::1;;-1:-1:-1::0;;24860:21:0::1;::::0;;::::1;;::::0;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;24771:118::o;27523:245::-;34092:7;:5;:7::i;:::-;-1:-1:-1;;;;;34076:23:0;16681:10;-1:-1:-1;;;;;34076:23:0;;:52;;;-1:-1:-1;34119:9:0;;-1:-1:-1;;;;;34119:9:0;16681:10;-1:-1:-1;;;;;34103:25:0;;34076:52;34067:92;;;;-1:-1:-1;;;34067:92:0;;;;;;;:::i;:::-;27654:11:::1;:24:::0;;;;27689:12:::1;:26:::0;27726:18:::1;:34:::0;27523:245::o;60542:207::-;60609:7;60645:21;60440:10;:17;;60360:105;60645:21;60637:5;:29;60629:68;;;;-1:-1:-1;;;60629:68:0;;26419:2:1;60629:68:0;;;26401:21:1;26458:2;26438:18;;;26431:30;26497:28;26477:18;;;26470:56;26543:18;;60629:68:0;26217:350:1;60629:68:0;60723:10;60734:5;60723:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60542:207:0:o;46669:250::-;46741:7;46777:21;;;:12;:21;;;;;:27;-1:-1:-1;;;;;46777:27:0;;46815:73;;;;-1:-1:-1;;;46815:73:0;;26774:2:1;46815:73:0;;;26756:21:1;26813:2;26793:18;;;26786:30;26852:34;26832:18;;;26825:62;-1:-1:-1;;;26903:18:1;;;26896:39;26952:19;;46815:73:0;26572:405:1;62191:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46389:218::-;46461:7;-1:-1:-1;;;;;46489:19:0;;46481:74;;;;-1:-1:-1;;;46481:74:0;;27184:2:1;46481:74:0;;;27166:21:1;27223:2;27203:18;;;27196:30;27262:34;27242:18;;;27235:62;-1:-1:-1;;;27313:18:1;;;27306:40;27363:19;;46481:74:0;26982:406:1;46481:74:0;-1:-1:-1;;;;;;46573:19:0;;;;;:12;:19;;;;;:26;;46389:218::o;18528:103::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;18593:30:::1;18620:1;18593:18;:30::i;62219:86::-:0;;;;;;;:::i;25803:231::-;34092:7;:5;:7::i;:::-;-1:-1:-1;;;;;34076:23:0;16681:10;-1:-1:-1;;;;;34076:23:0;;:52;;;-1:-1:-1;34119:9:0;;-1:-1:-1;;;;;34119:9:0;16681:10;-1:-1:-1;;;;;34103:25:0;;34076:52;34067:92;;;;-1:-1:-1;;;34067:92:0;;;;;;;:::i;:::-;25887:28;;25878:71:::1;;;::::0;-1:-1:-1;;;25878:71:0;;27595:2:1;25878:71:0::1;::::0;::::1;27577:21:1::0;27634:2;27614:18;;;27607:30;27673:27;27653:18;;;27646:55;27718:18;;25878:71:0::1;27393:349:1::0;25878:71:0::1;25995:12;:31:::0;;-1:-1:-1;;25960:66:0;::::1;25995:31;::::0;;::::1;25994:32;25960:66;::::0;;25803:231::o;63684:63::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;63731:8:::1;:6;:8::i;17877:87::-:0;17950:6;;;;;-1:-1:-1;;;;;17950:6:0;;17877:87::o;26446:135::-;26490:7;26554:19;;26535:16;;26517:15;;:34;;;;:::i;:::-;:56;;;;:::i;:::-;26510:63;;26446:135;:::o;47155:104::-;47211:13;47244:7;47237:14;;;;;:::i;48832:155::-;48927:52;16681:10;48960:8;48970;48927:18;:52::i;:::-;48832:155;;:::o;26791:282::-;34092:7;:5;:7::i;:::-;-1:-1:-1;;;;;34076:23:0;16681:10;-1:-1:-1;;;;;34076:23:0;;:52;;;-1:-1:-1;34119:9:0;;-1:-1:-1;;;;;34119:9:0;16681:10;-1:-1:-1;;;;;34103:25:0;;34076:52;34067:92;;;;-1:-1:-1;;;34067:92:0;;;;;;;:::i;:::-;26901:12:::1;:31:::0;::::1;;26900:32;26892:66;;;::::0;-1:-1:-1;;;26892:66:0;;27949:2:1;26892:66:0::1;::::0;::::1;27931:21:1::0;27988:2;27968:18;;;27961:30;-1:-1:-1;;;28007:18:1;;;28000:51;28068:18;;26892:66:0::1;27747:345:1::0;26892:66:0::1;26969:28:::0;:36;;;;27016:32;:41;26791:282::o;63581:95::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;63653:8:::1;:15:::0;;-1:-1:-1;;63653:15:0::1;63664:4;63653:15;::::0;;63581:95::o;64606:294::-;64666:13;64692:28;64723:10;:8;:10::i;:::-;64692:41;;64782:1;64757:14;64751:28;:32;:141;;;;;;;;;;;;;;;;;64823:14;64839:18;:7;:16;:18::i;:::-;64859:13;64806:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64751:141;64744:148;64606:294;-1:-1:-1;;;64606:294:0:o;25631:164::-;34092:7;:5;:7::i;:::-;-1:-1:-1;;;;;34076:23:0;16681:10;-1:-1:-1;;;;;34076:23:0;;:52;;;-1:-1:-1;34119:9:0;;-1:-1:-1;;;;;34119:9:0;16681:10;-1:-1:-1;;;;;34103:25:0;;34076:52;34067:92;;;;-1:-1:-1;;;34067:92:0;;;;;;;:::i;:::-;25755:12:::1;:32:::0;;-1:-1:-1;;25719:68:0;::::1;25755:32;::::0;;;::::1;;;25754:33;25719:68:::0;;::::1;;::::0;;25631:164::o;26286:152::-;34092:7;:5;:7::i;:::-;-1:-1:-1;;;;;34076:23:0;16681:10;-1:-1:-1;;;;;34076:23:0;;:52;;;-1:-1:-1;34119:9:0;;-1:-1:-1;;;;;34119:9:0;16681:10;-1:-1:-1;;;;;34103:25:0;;34076:52;34067:92;;;;-1:-1:-1;;;34067:92:0;;;;;;;:::i;:::-;26398:12:::1;:32:::0;;-1:-1:-1;;26362:68:0;::::1;26398:32:::0;;;;::::1;;;26397:33;26362:68:::0;;::::1;;::::0;;26286:152::o;32314:161::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32389:22:0;::::1;32381:55;;;::::0;-1:-1:-1;;;32381:55:0;;20035:2:1;32381:55:0::1;::::0;::::1;20017:21:1::0;20074:2;20054:18;;;20047:30;-1:-1:-1;;;20093:18:1;;;20086:50;20153:18;;32381:55:0::1;19833:344:1::0;32381:55:0::1;32447:9;:20:::0;;-1:-1:-1;;;;;;32447:20:0::1;-1:-1:-1::0;;;;;32447:20:0;;;::::1;::::0;;;::::1;::::0;;32314:161::o;59879:403::-;59934:16;59971:15;59989:16;59999:5;59989:9;:16::i;:::-;59971:34;;60016:23;60056:7;60042:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60042:22:0;-1:-1:-1;;;;;;60106:19:0;;60075:28;60106:19;;;:12;:19;;;;;60016:48;;-1:-1:-1;60138:96:0;60158:7;60154:1;:11;60138:96;;;60207:11;60219:1;60207:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;60199:23;;60187:6;60194:1;60187:9;;;;;;;;:::i;:::-;;;;;;;;;;:35;60167:3;;;;:::i;:::-;;;;60138:96;;;-1:-1:-1;60268:6:0;;59879:403;-1:-1:-1;;;;59879:403:0:o;49885:285::-;50017:41;16681:10;50050:7;50017:18;:41::i;:::-;50009:103;;;;-1:-1:-1;;;50009:103:0;;;;;;;:::i;:::-;50123:39;50137:4;50143:2;50147:7;50156:5;50123:13;:39::i;:::-;49885:285;;;;:::o;25462:161::-;34092:7;:5;:7::i;:::-;-1:-1:-1;;;;;34076:23:0;16681:10;-1:-1:-1;;;;;34076:23:0;;:52;;;-1:-1:-1;34119:9:0;;-1:-1:-1;;;;;34119:9:0;16681:10;-1:-1:-1;;;;;34103:25:0;;34076:52;34067:92;;;;-1:-1:-1;;;34067:92:0;;;;;;;:::i;62320:38::-;;;;;;;:::i;64908:324::-;51702:4;51726:21;;;:12;:21;;;;;:27;64981:13;;-1:-1:-1;;;;;51726:27:0;65007:75;;;;-1:-1:-1;;;65007:75:0;;29700:2:1;65007:75:0;;;29682:21:1;29739:2;29719:18;;;29712:30;29778:34;29758:18;;;29751:62;-1:-1:-1;;;29829:18:1;;;29822:45;29884:19;;65007:75:0;29498:411:1;65007:75:0;65097:8;;;;:17;;:8;:17;65093:132;;65138:14;65131:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64908:324;;;:::o;65093:132::-;65192:21;65205:7;65192:12;:21::i;65093:132::-;64908:324;;;:::o;31860:186::-;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;31953:30:::1;::::0;-1:-1:-1;;;31953:30:0;;31977:4:::1;31953:30;::::0;::::1;2278:51:1::0;31935:15:0::1;::::0;-1:-1:-1;;;;;31953:15:0;::::1;::::0;::::1;::::0;2251:18:1;;31953:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32009:11;::::0;31994:36:::1;::::0;-1:-1:-1;;;31994:36:0;;-1:-1:-1;;;;;32009:11:0;;::::1;31994:36;::::0;::::1;30277:51:1::0;30344:18;;;30337:34;;;31935:48:0;;-1:-1:-1;31994:14:0;::::1;::::0;::::1;::::0;30250:18:1;;31994:36:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;64352:130::-:0;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;64454:14:::1;:20;64471:3:::0;;64454:14;:20:::1;:::i;18786:201::-:0;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18875:22:0;::::1;18867:73;;;::::0;-1:-1:-1;;;18867:73:0;;30834:2:1;18867:73:0::1;::::0;::::1;30816:21:1::0;30873:2;30853:18;;;30846:30;30912:34;30892:18;;;30885:62;-1:-1:-1;;;30963:18:1;;;30956:36;31009:19;;18867:73:0::1;30632:402:1::0;18867:73:0::1;18951:28;18970:8;18951:18;:28::i;32062:142::-:0;16681:10;18097:7;:5;:7::i;:::-;-1:-1:-1;;;;;18097:23:0;;18089:68;;;;-1:-1:-1;;;18089:68:0;;;;;;;:::i;:::-;32168:11:::1;::::0;32153:35:::1;::::0;-1:-1:-1;;;32153:35:0;;-1:-1:-1;;;;;32168:11:0;;::::1;32153:35;::::0;::::1;30277:51:1::0;30344:18;;;30337:34;;;32153:14:0;;::::1;::::0;::::1;::::0;30250:18:1;;32153:35:0::1;30103:274:1::0;26042:236:0;34092:7;:5;:7::i;:::-;-1:-1:-1;;;;;34076:23:0;16681:10;-1:-1:-1;;;;;34076:23:0;;:52;;;-1:-1:-1;34119:9:0;;-1:-1:-1;;;;;34119:9:0;16681:10;-1:-1:-1;;;;;34103:25:0;;34076:52;34067:92;;;;-1:-1:-1;;;34067:92:0;;;;;;;:::i;:::-;26127:29;;26118:73:::1;;;::::0;-1:-1:-1;;;26118:73:0;;31241:2:1;26118:73:0::1;::::0;::::1;31223:21:1::0;31280:2;31260:18;;;31253:30;31319:28;31299:18;;;31292:56;31365:18;;26118:73:0::1;31039:350:1::0;57630:175:0;57705:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;57705:29:0;-1:-1:-1;;;;;57705:29:0;;;;;;;;:24;;57759;57705;57759:15;:24::i;:::-;-1:-1:-1;;;;;57750:47:0;;;;;;;;;;;57630:175;;:::o;5559:818::-;5650:4;5690;5650;5705:551;5729:5;:12;5725:1;:16;5705:551;;;5763:20;5786:5;5792:1;5786:8;;;;;;;;:::i;:::-;;;;;;;5763:31;;5829:12;5813;:28;5809:436;;5983:12;:1;:10;:12::i;:::-;5997;6011;5966:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5956:69;;;;;;5941:84;;5809:436;;;6187:12;:1;:10;:12::i;:::-;6201;6215;6170:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6160:69;;;;;;6145:84;;5809:436;-1:-1:-1;5743:3:0;;;;:::i;:::-;;;;5705:551;;;-1:-1:-1;6349:20:0;;;;5559:818;-1:-1:-1;;;5559:818:0:o;63834:341::-;64047:9;;64037:6;64021:13;60440:10;:17;;60360:105;64021:13;:22;;;;:::i;:::-;:35;;64013:71;;;;-1:-1:-1;;;64013:71:0;;32053:2:1;64013:71:0;;;32035:21:1;32092:2;32072:18;;;32065:30;32131:25;32111:18;;;32104:53;32174:18;;64013:71:0;31851:347:1;64013:71:0;64100:9;64095:73;64115:6;64111:1;:10;64095:73;;;64143:13;64153:2;64143:9;:13::i;:::-;64123:3;;;;:::i;:::-;;;;64095:73;;51942:349;52035:4;51726:21;;;:12;:21;;;;;:27;-1:-1:-1;;;;;51726:27:0;52052:73;;;;-1:-1:-1;;;52052:73:0;;32405:2:1;52052:73:0;;;32387:21:1;32444:2;32424:18;;;32417:30;32483:34;32463:18;;;32456:62;-1:-1:-1;;;32534:18:1;;;32527:42;32586:19;;52052:73:0;32203:408:1;52052:73:0;52136:13;52152:24;52168:7;52152:15;:24::i;:::-;52136:40;;52206:5;-1:-1:-1;;;;;52195:16:0;:7;-1:-1:-1;;;;;52195:16:0;;:52;;;-1:-1:-1;;;;;;49179:25:0;;;49155:4;49179:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;52215:32;52195:87;;;;52275:7;-1:-1:-1;;;;;52251:31:0;:20;52263:7;52251:11;:20::i;:::-;-1:-1:-1;;;;;52251:31:0;;52195:87;52187:96;51942:349;-1:-1:-1;;;;51942:349:0:o;56262:1250::-;56388:4;-1:-1:-1;;;;;56360:32:0;:24;56376:7;56360:15;:24::i;:::-;-1:-1:-1;;;;;56360:32:0;;56352:82;;;;-1:-1:-1;;;56352:82:0;;32818:2:1;56352:82:0;;;32800:21:1;32857:2;32837:18;;;32830:30;32896:34;32876:18;;;32869:62;-1:-1:-1;;;32947:18:1;;;32940:35;32992:19;;56352:82:0;32616:401:1;56352:82:0;-1:-1:-1;;;;;56453:16:0;;56445:65;;;;-1:-1:-1;;;56445:65:0;;33224:2:1;56445:65:0;;;33206:21:1;33263:2;33243:18;;;33236:30;33302:34;33282:18;;;33275:62;-1:-1:-1;;;33353:18:1;;;33346:34;33397:19;;56445:65:0;33022:400:1;56445:65:0;56523:39;56544:4;56550:2;56554:7;56523:20;:39::i;:::-;56627:29;56644:1;56648:7;56627:8;:29::i;:::-;56669:21;;;;:12;:21;;;;;;;;:32;;-1:-1:-1;;;;;;56669:32:0;-1:-1:-1;;;;;56669:32:0;;;;;;;;;;56820:18;;;;;:12;:18;;;;;56883:21;;;;;;;57007:20;;56820:18;;56669:21;;-1:-1:-1;;;56935:28:0;;;;;;56669:21;56820:18;;57007:24;;-1:-1:-1;;57007:24:0;:::i;:::-;56993:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;56974:58;;57071:9;57043:13;57057:10;57043:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;:25;;;;;;:37;;;;;;;;;;;;;;;;;;;;;57091:23;;;;;:12;:23;;;;;;:53;;-1:-1:-1;;;;57091:53:0;-1:-1:-1;;;57091:53:0;;;;;;;;;;;;;57155:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57241:28;57272:12;:16;57285:2;-1:-1:-1;;;;;57272:16:0;-1:-1:-1;;;;;57272:16:0;;;;;;;;;;;;57241:47;;57337:11;:18;;;;57299:11;:28;;;:57;;;;;;;;;;;;;;;;;;57367:11;57391:7;57367:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57445:7;57441:2;-1:-1:-1;;;;;57426:27:0;57435:4;-1:-1:-1;;;;;57426:27:0;;;;;;;;;;;56341:1171;;;;;56262:1250;;;:::o;8882:317::-;8997:6;8972:21;:31;;8964:73;;;;-1:-1:-1;;;8964:73:0;;33894:2:1;8964:73:0;;;33876:21:1;33933:2;33913:18;;;33906:30;33972:31;33952:18;;;33945:59;34021:18;;8964:73:0;33692:353:1;8964:73:0;9051:12;9069:9;-1:-1:-1;;;;;9069:14:0;9091:6;9069:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9050:52;;;9121:7;9113:78;;;;-1:-1:-1;;;9113:78:0;;34462:2:1;9113:78:0;;;34444:21:1;34501:2;34481:18;;;34474:30;34540:34;34520:18;;;34513:62;34611:28;34591:18;;;34584:56;34657:19;;9113:78:0;34260:422:1;21536:120:0;20548:7;;;;21072:41;;;;-1:-1:-1;;;21072:41:0;;34889:2:1;21072:41:0;;;34871:21:1;34928:2;34908:18;;;34901:30;-1:-1:-1;;;34947:18:1;;;34940:50;35007:18;;21072:41:0;34687:344:1;21072:41:0;21595:7:::1;:15:::0;;-1:-1:-1;;21595:15:0::1;::::0;;21626:22:::1;16681:10:::0;21635:12:::1;21626:22;::::0;-1:-1:-1;;;;;2296:32:1;;;2278:51;;2266:2;2251:18;21626:22:0::1;;;;;;;21536:120::o:0;19147:191::-;19240:6;;;-1:-1:-1;;;;;19257:17:0;;;19240:6;19257:17;;;-1:-1:-1;;;;;;19257:17:0;;;;;;19290:40;;19240:6;;;;;;;;19290:40;;19221:16;;19290:40;19210:128;19147:191;:::o;21277:118::-;20548:7;;;;20802:9;20794:38;;;;-1:-1:-1;;;20794:38:0;;35238:2:1;20794:38:0;;;35220:21:1;35277:2;35257:18;;;35250:30;-1:-1:-1;;;35296:18:1;;;35289:46;35352:18;;20794:38:0;35036:340:1;20794:38:0;21337:7:::1;:14:::0;;-1:-1:-1;;21337:14:0::1;21347:4;21337:14;::::0;;21367:20:::1;21374:12;16681:10:::0;;16601:98;57947:281;58068:8;-1:-1:-1;;;;;58059:17:0;:5;-1:-1:-1;;;;;58059:17:0;;58051:55;;;;-1:-1:-1;;;58051:55:0;;35583:2:1;58051:55:0;;;35565:21:1;35622:2;35602:18;;;35595:30;35661:27;35641:18;;;35634:55;35706:18;;58051:55:0;35381:349:1;58051:55:0;-1:-1:-1;;;;;58117:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;58117:46:0;;;;;;;;;;58179:41;;636::1;;;58179::0;;609:18:1;58179:41:0;;;;;;;57947:281;;;:::o;64490:108::-;64550:13;64583:7;64576:14;;;;;:::i;3244:723::-;3300:13;3521:5;3530:1;3521:10;3517:53;;-1:-1:-1;;3548:10:0;;;;;;;;;;;;-1:-1:-1;;;3548:10:0;;;;;3244:723::o;3517:53::-;3595:5;3580:12;3636:78;3643:9;;3636:78;;3669:8;;;;:::i;:::-;;-1:-1:-1;3692:10:0;;-1:-1:-1;3700:2:0;3692:10;;:::i;:::-;;;3636:78;;;3724:19;3756:6;3746:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3746:17:0;;3724:39;;3774:154;3781:10;;3774:154;;3808:11;3818:1;3808:11;;:::i;:::-;;-1:-1:-1;3877:10:0;3885:2;3877:5;:10;:::i;:::-;3864:24;;:2;:24;:::i;:::-;3851:39;;3834:6;3841;3834:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3834:56:0;;;;;;;;-1:-1:-1;3905:11:0;3914:2;3905:11;;:::i;:::-;;;3774:154;;51052:272;51166:28;51176:4;51182:2;51186:7;51166:9;:28::i;:::-;51213:48;51236:4;51242:2;51246:7;51255:5;51213:22;:48::i;:::-;51205:111;;;;-1:-1:-1;;;51205:111:0;;;;;;;:::i;52597:84::-;52656:17;52666:2;52656:17;;;;;;;;;;;;:9;:17::i;65240:222::-;20548:7;;;;65358:9;65350:40;;;;-1:-1:-1;;;65350:40:0;;36730:2:1;65350:40:0;;;36712:21:1;36769:2;36749:18;;;36742:30;-1:-1:-1;;;36788:18:1;;;36781:48;36846:18;;65350:40:0;36528:342:1;58793:756:0;58905:4;-1:-1:-1;;;;;58926:13:0;;7916:19;:23;58922:620;;58962:72;;-1:-1:-1;;;58962:72:0;;-1:-1:-1;;;;;58962:36:0;;;;;:72;;16681:10;;59013:4;;59019:7;;59028:5;;58962:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58962:72:0;;;;;;;;-1:-1:-1;;58962:72:0;;;;;;;;;;;;:::i;:::-;;;58958:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59204:6;:13;59221:1;59204:18;59200:272;;59247:60;;-1:-1:-1;;;59247:60:0;;;;;;;:::i;59200:272::-;59422:6;59416:13;59407:6;59403:2;59399:15;59392:38;58958:529;-1:-1:-1;;;;;;59085:51:0;-1:-1:-1;;;59085:51:0;;-1:-1:-1;59078:58:0;;58922:620;-1:-1:-1;59526:4:0;58793:756;;;;;;:::o;52908:312::-;53013:13;;;;53038:9;53044:2;53038:5;:9::i;:::-;53080:54;53111:1;53115:2;53119:7;53128:5;53080:22;:54::i;:::-;53058:154;;;;-1:-1:-1;;;53058:154:0;;;;;;;:::i;53556:763::-;-1:-1:-1;;;;;53619:16:0;;53611:61;;;;-1:-1:-1;;;53611:61:0;;37825:2:1;53611:61:0;;;37807:21:1;;;37844:18;;;37837:30;37903:34;37883:18;;;37876:62;37955:18;;53611:61:0;37623:356:1;53611:61:0;53710:13;;;;53736:45;53693:14;53769:2;53710:13;53736:20;:45::i;:::-;-1:-1:-1;;;;;53825:16:0;;53794:28;53825:16;;;:12;:16;;;;;;;;53886:21;;;;;;;:12;:21;;;;;53920:22;;-1:-1:-1;;;;;;53920:22:0;;;;;;53999:18;;53961:57;;-1:-1:-1;;;53961:57:0;-1:-1:-1;;;;;;53961:57:0;;;;;;;;;;;;;54065:10;:17;;54029:54;;-1:-1:-1;;;54029:54:0;-1:-1:-1;;;;54029:54:0;;;;;;;;;54096:25;;53920:22;54096:25;;;;;;;;;;;;;;;;;;;;;;;;;;;53920:22;54096:25;;;;;;;;;;;;;;;;;;;;54132:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54185:18;;53825:16;;53886:21;53794:28;54185:18;;53920:22;;54185:18;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54246:7;54221:33;;54242:2;-1:-1:-1;;;;;54221:33:0;54238:1;-1:-1:-1;;;;;54221:33:0;;;;;;;;;;;54267:44;48067:408;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;870:316::-;947:6;955;963;1016:2;1004:9;995:7;991:23;987:32;984:52;;;1032:1;1029;1022:12;984:52;-1:-1:-1;;1055:23:1;;;1125:2;1110:18;;1097:32;;-1:-1:-1;1176:2:1;1161:18;;;1148:32;;870:316;-1:-1:-1;870:316:1:o;1191:250::-;1276:1;1286:113;1300:6;1297:1;1294:13;1286:113;;;1376:11;;;1370:18;1357:11;;;1350:39;1322:2;1315:10;1286:113;;;-1:-1:-1;;1433:1:1;1415:16;;1408:27;1191:250::o;1446:271::-;1488:3;1526:5;1520:12;1553:6;1548:3;1541:19;1569:76;1638:6;1631:4;1626:3;1622:14;1615:4;1608:5;1604:16;1569:76;:::i;:::-;1699:2;1678:15;-1:-1:-1;;1674:29:1;1665:39;;;;1706:4;1661:50;;1446:271;-1:-1:-1;;1446:271:1:o;1722:220::-;1871:2;1860:9;1853:21;1834:4;1891:45;1932:2;1921:9;1917:18;1909:6;1891:45;:::i;1947:180::-;2006:6;2059:2;2047:9;2038:7;2034:23;2030:32;2027:52;;;2075:1;2072;2065:12;2027:52;-1:-1:-1;2098:23:1;;1947:180;-1:-1:-1;1947:180:1:o;2340:131::-;-1:-1:-1;;;;;2415:31:1;;2405:42;;2395:70;;2461:1;2458;2451:12;2476:315;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2660:9;2647:23;2679:31;2704:5;2679:31;:::i;:::-;2729:5;2781:2;2766:18;;;;2753:32;;-1:-1:-1;;;2476:315:1:o;2796:367::-;2859:8;2869:6;2923:3;2916:4;2908:6;2904:17;2900:27;2890:55;;2941:1;2938;2931:12;2890:55;-1:-1:-1;2964:20:1;;3007:18;2996:30;;2993:50;;;3039:1;3036;3029:12;2993:50;3076:4;3068:6;3064:17;3052:29;;3136:3;3129:4;3119:6;3116:1;3112:14;3104:6;3100:27;3096:38;3093:47;3090:67;;;3153:1;3150;3143:12;3090:67;2796:367;;;;;:::o;3168:711::-;3290:6;3298;3306;3314;3322;3330;3383:3;3371:9;3362:7;3358:23;3354:33;3351:53;;;3400:1;3397;3390:12;3351:53;3436:9;3423:23;3413:33;;3493:2;3482:9;3478:18;3465:32;3455:42;;3544:2;3533:9;3529:18;3516:32;3506:42;;3595:2;3584:9;3580:18;3567:32;3557:42;;3650:3;3639:9;3635:19;3622:33;3678:18;3670:6;3667:30;3664:50;;;3710:1;3707;3700:12;3664:50;3749:70;3811:7;3802:6;3791:9;3787:22;3749:70;:::i;:::-;3168:711;;;;-1:-1:-1;3168:711:1;;-1:-1:-1;3168:711:1;;3838:8;;3168:711;-1:-1:-1;;;3168:711:1:o;3884:255::-;3951:6;4004:2;3992:9;3983:7;3979:23;3975:32;3972:52;;;4020:1;4017;4010:12;3972:52;4059:9;4046:23;4078:31;4103:5;4078:31;:::i;4144:456::-;4221:6;4229;4237;4290:2;4278:9;4269:7;4265:23;4261:32;4258:52;;;4306:1;4303;4296:12;4258:52;4345:9;4332:23;4364:31;4389:5;4364:31;:::i;:::-;4414:5;-1:-1:-1;4471:2:1;4456:18;;4443:32;4484:33;4443:32;4484:33;:::i;:::-;4144:456;;4536:7;;-1:-1:-1;;;4590:2:1;4575:18;;;;4562:32;;4144:456::o;6538:592::-;6609:6;6617;6670:2;6658:9;6649:7;6645:23;6641:32;6638:52;;;6686:1;6683;6676:12;6638:52;6726:9;6713:23;6755:18;6796:2;6788:6;6785:14;6782:34;;;6812:1;6809;6802:12;6782:34;6850:6;6839:9;6835:22;6825:32;;6895:7;6888:4;6884:2;6880:13;6876:27;6866:55;;6917:1;6914;6907:12;6866:55;6957:2;6944:16;6983:2;6975:6;6972:14;6969:34;;;6999:1;6996;6989:12;6969:34;7044:7;7039:2;7030:6;7026:2;7022:15;7018:24;7015:37;7012:57;;;7065:1;7062;7055:12;7012:57;7096:2;7088:11;;;;;7118:6;;-1:-1:-1;6538:592:1;;-1:-1:-1;;;;6538:592:1:o;7135:642::-;7248:6;7256;7264;7272;7280;7333:3;7321:9;7312:7;7308:23;7304:33;7301:53;;;7350:1;7347;7340:12;7301:53;7386:9;7373:23;7363:33;;7443:2;7432:9;7428:18;7415:32;7405:42;;7494:2;7483:9;7479:18;7466:32;7456:42;;7549:2;7538:9;7534:18;7521:32;7576:18;7568:6;7565:30;7562:50;;;7608:1;7605;7598:12;7562:50;7647:70;7709:7;7700:6;7689:9;7685:22;7647:70;:::i;:::-;7135:642;;;;-1:-1:-1;7135:642:1;;-1:-1:-1;7736:8:1;;7621:96;7135:642;-1:-1:-1;;;7135:642:1:o;7782:127::-;7843:10;7838:3;7834:20;7831:1;7824:31;7874:4;7871:1;7864:15;7898:4;7895:1;7888:15;7914:252;7986:2;7980:9;8028:3;8016:16;;8062:18;8047:34;;8083:22;;;8044:62;8041:88;;;8109:18;;:::i;:::-;8145:2;8138:22;7914:252;:::o;8171:275::-;8242:2;8236:9;8307:2;8288:13;;-1:-1:-1;;8284:27:1;8272:40;;8342:18;8327:34;;8363:22;;;8324:62;8321:88;;;8389:18;;:::i;:::-;8425:2;8418:22;8171:275;;-1:-1:-1;8171:275:1:o;8451:118::-;8537:5;8530:13;8523:21;8516:5;8513:32;8503:60;;8559:1;8556;8549:12;8574:128;8639:20;;8668:28;8639:20;8668:28;:::i;8707:842::-;8795:6;8848:3;8836:9;8827:7;8823:23;8819:33;8816:53;;;8865:1;8862;8855:12;8816:53;8891:22;;:::i;:::-;8936:26;8952:9;8936:26;:::i;:::-;8929:5;8922:41;8995:35;9026:2;9015:9;9011:18;8995:35;:::i;:::-;8990:2;8983:5;8979:14;8972:59;9063:35;9094:2;9083:9;9079:18;9063:35;:::i;:::-;9058:2;9051:5;9047:14;9040:59;9159:2;9148:9;9144:18;9131:32;9126:2;9119:5;9115:14;9108:56;9225:3;9214:9;9210:19;9197:33;9191:3;9184:5;9180:15;9173:58;9292:3;9281:9;9277:19;9264:33;9258:3;9251:5;9247:15;9240:58;9359:3;9348:9;9344:19;9331:33;9325:3;9318:5;9314:15;9307:58;9426:3;9415:9;9411:19;9398:33;9392:3;9385:5;9381:15;9374:58;9451:3;9514:2;9503:9;9499:18;9486:32;9481:2;9474:5;9470:14;9463:56;;9538:5;9528:15;;;8707:842;;;;:::o;10127:382::-;10192:6;10200;10253:2;10241:9;10232:7;10228:23;10224:32;10221:52;;;10269:1;10266;10259:12;10221:52;10308:9;10295:23;10327:31;10352:5;10327:31;:::i;:::-;10377:5;-1:-1:-1;10434:2:1;10419:18;;10406:32;10447:30;10406:32;10447:30;:::i;:::-;10496:7;10486:17;;;10127:382;;;;;:::o;10514:248::-;10582:6;10590;10643:2;10631:9;10622:7;10618:23;10614:32;10611:52;;;10659:1;10656;10649:12;10611:52;-1:-1:-1;;10682:23:1;;;10752:2;10737:18;;;10724:32;;-1:-1:-1;10514:248:1:o;10767:632::-;10938:2;10990:21;;;11060:13;;10963:18;;;11082:22;;;10909:4;;10938:2;11161:15;;;;11135:2;11120:18;;;10909:4;11204:169;11218:6;11215:1;11212:13;11204:169;;;11279:13;;11267:26;;11348:15;;;;11313:12;;;;11240:1;11233:9;11204:169;;;-1:-1:-1;11390:3:1;;10767:632;-1:-1:-1;;;;;;10767:632:1:o;11404:1108::-;11499:6;11507;11515;11523;11576:3;11564:9;11555:7;11551:23;11547:33;11544:53;;;11593:1;11590;11583:12;11544:53;11632:9;11619:23;11651:31;11676:5;11651:31;:::i;:::-;11701:5;-1:-1:-1;11725:2:1;11764:18;;;11751:32;11792:33;11751:32;11792:33;:::i;:::-;11844:7;-1:-1:-1;11898:2:1;11883:18;;11870:32;;-1:-1:-1;11953:2:1;11938:18;;11925:32;11976:18;12006:14;;;12003:34;;;12033:1;12030;12023:12;12003:34;12071:6;12060:9;12056:22;12046:32;;12116:7;12109:4;12105:2;12101:13;12097:27;12087:55;;12138:1;12135;12128:12;12087:55;12174:2;12161:16;12196:2;12192;12189:10;12186:36;;;12202:18;;:::i;:::-;12244:53;12287:2;12268:13;;-1:-1:-1;;12264:27:1;12260:36;;12244:53;:::i;:::-;12231:66;;12320:2;12313:5;12306:17;12360:7;12355:2;12350;12346;12342:11;12338:20;12335:33;12332:53;;;12381:1;12378;12371:12;12332:53;12436:2;12431;12427;12423:11;12418:2;12411:5;12407:14;12394:45;12480:1;12475:2;12470;12463:5;12459:14;12455:23;12448:34;;12501:5;12491:15;;;;;11404:1108;;;;;;;:::o;12782:388::-;12850:6;12858;12911:2;12899:9;12890:7;12886:23;12882:32;12879:52;;;12927:1;12924;12917:12;12879:52;12966:9;12953:23;12985:31;13010:5;12985:31;:::i;:::-;13035:5;-1:-1:-1;13092:2:1;13077:18;;13064:32;13105:33;13064:32;13105:33;:::i;13508:350::-;13710:2;13692:21;;;13749:2;13729:18;;;13722:30;13788:28;13783:2;13768:18;;13761:56;13849:2;13834:18;;13508:350::o;14214:380::-;14293:1;14289:12;;;;14336;;;14357:61;;14411:4;14403:6;14399:17;14389:27;;14357:61;14464:2;14456:6;14453:14;14433:18;14430:38;14427:161;;14510:10;14505:3;14501:20;14498:1;14491:31;14545:4;14542:1;14535:15;14573:4;14570:1;14563:15;14427:161;;14214:380;;;:::o;16860:350::-;17062:2;17044:21;;;17101:2;17081:18;;;17074:30;17140:28;17135:2;17120:18;;17113:56;17201:2;17186:18;;16860:350::o;17566:127::-;17627:10;17622:3;17618:20;17615:1;17608:31;17658:4;17655:1;17648:15;17682:4;17679:1;17672:15;17698:125;17763:9;;;17784:10;;;17781:36;;;17797:18;;:::i;18188:338::-;18390:2;18372:21;;;18429:2;18409:18;;;18402:30;-1:-1:-1;;;18463:2:1;18448:18;;18441:44;18517:2;18502:18;;18188:338::o;18531:168::-;18571:7;18637:1;18633;18629:6;18625:14;18622:1;18619:21;18614:1;18607:9;18600:17;18596:45;18593:71;;;18644:18;;:::i;:::-;-1:-1:-1;18684:9:1;;18531:168::o;18704:341::-;18906:2;18888:21;;;18945:2;18925:18;;;18918:30;-1:-1:-1;;;18979:2:1;18964:18;;18957:47;19036:2;19021:18;;18704:341::o;19472:356::-;19674:2;19656:21;;;19693:18;;;19686:30;19752:34;19747:2;19732:18;;19725:62;19819:2;19804:18;;19472:356::o;20182:413::-;20384:2;20366:21;;;20423:2;20403:18;;;20396:30;20462:34;20457:2;20442:18;;20435:62;-1:-1:-1;;;20528:2:1;20513:18;;20506:47;20585:3;20570:19;;20182:413::o;20950:354::-;21152:2;21134:21;;;21191:2;21171:18;;;21164:30;21230:32;21225:2;21210:18;;21203:60;21295:2;21280:18;;20950:354::o;22363:127::-;22424:10;22419:3;22415:20;22412:1;22405:31;22455:4;22452:1;22445:15;22479:4;22476:1;22469:15;22621:545;22723:2;22718:3;22715:11;22712:448;;;22759:1;22784:5;22780:2;22773:17;22829:4;22825:2;22815:19;22899:2;22887:10;22883:19;22880:1;22876:27;22870:4;22866:38;22935:4;22923:10;22920:20;22917:47;;;-1:-1:-1;22958:4:1;22917:47;23013:2;23008:3;23004:12;23001:1;22997:20;22991:4;22987:31;22977:41;;23068:82;23086:2;23079:5;23076:13;23068:82;;;23131:17;;;23112:1;23101:13;23068:82;;;23072:3;;;22621:545;;;:::o;23342:1206::-;23466:18;23461:3;23458:27;23455:53;;;23488:18;;:::i;:::-;23517:94;23607:3;23567:38;23599:4;23593:11;23567:38;:::i;:::-;23561:4;23517:94;:::i;:::-;23637:1;23662:2;23657:3;23654:11;23679:1;23674:616;;;;24334:1;24351:3;24348:93;;;-1:-1:-1;24407:19:1;;;24394:33;24348:93;-1:-1:-1;;23299:1:1;23295:11;;;23291:24;23287:29;23277:40;23323:1;23319:11;;;23274:57;24454:78;;23647:895;;23674:616;22568:1;22561:14;;;22605:4;22592:18;;-1:-1:-1;;23710:17:1;;;23811:9;23833:229;23847:7;23844:1;23841:14;23833:229;;;23936:19;;;23923:33;23908:49;;24043:4;24028:20;;;;23996:1;23984:14;;;;23863:12;23833:229;;;23837:3;24090;24081:7;24078:16;24075:159;;;24214:1;24210:6;24204:3;24198;24195:1;24191:11;24187:21;24183:34;24179:39;24166:9;24161:3;24157:19;24144:33;24140:79;24132:6;24125:95;24075:159;;;24277:1;24271:3;24268:1;24264:11;24260:19;24254:4;24247:33;23647:895;;;23342:1206;;;:::o;28097:1256::-;28321:3;28359:6;28353:13;28385:4;28398:64;28455:6;28450:3;28445:2;28437:6;28433:15;28398:64;:::i;:::-;28525:13;;28484:16;;;;28547:68;28525:13;28484:16;28582:15;;;28547:68;:::i;:::-;28704:13;;28637:20;;;28677:1;;28742:36;28704:13;28742:36;:::i;:::-;28797:1;28814:18;;;28841:141;;;;28996:1;28991:337;;;;28807:521;;28841:141;-1:-1:-1;;28876:24:1;;28862:39;;28953:16;;28946:24;28932:39;;28921:51;;;-1:-1:-1;28841:141:1;;28991:337;29022:6;29019:1;29012:17;29070:2;29067:1;29057:16;29095:1;29109:169;29123:8;29120:1;29117:15;29109:169;;;29205:14;;29190:13;;;29183:37;29248:16;;;;29140:10;;29109:169;;;29113:3;;29309:8;29302:5;29298:20;29291:27;;28807:521;-1:-1:-1;29344:3:1;;28097:1256;-1:-1:-1;;;;;;;;;;28097:1256:1:o;29358:135::-;29397:3;29418:17;;;29415:43;;29438:18;;:::i;:::-;-1:-1:-1;29485:1:1;29474:13;;29358:135::o;29914:184::-;29984:6;30037:2;30025:9;30016:7;30012:23;30008:32;30005:52;;;30053:1;30050;30043:12;30005:52;-1:-1:-1;30076:16:1;;29914:184;-1:-1:-1;29914:184:1:o;30382:245::-;30449:6;30502:2;30490:9;30481:7;30477:23;30473:32;30470:52;;;30518:1;30515;30508:12;30470:52;30550:9;30544:16;30569:28;30591:5;30569:28;:::i;31394:452::-;31581:3;31619:6;31613:13;31635:66;31694:6;31689:3;31682:4;31674:6;31670:17;31635:66;:::i;:::-;31723:16;;;;31748:21;;;-1:-1:-1;31796:4:1;31785:16;;31778:32;31837:2;31826:14;;31394:452;-1:-1:-1;31394:452:1:o;33427:128::-;33494:9;;;33515:11;;;33512:37;;;33529:18;;:::i;33560:127::-;33621:10;33616:3;33612:20;33609:1;33602:31;33652:4;33649:1;33642:15;33676:4;33673:1;33666:15;35735:127;35796:10;35791:3;35787:20;35784:1;35777:31;35827:4;35824:1;35817:15;35851:4;35848:1;35841:15;35867:120;35907:1;35933;35923:35;;35938:18;;:::i;:::-;-1:-1:-1;35972:9:1;;35867:120::o;35992:112::-;36024:1;36050;36040:35;;36055:18;;:::i;:::-;-1:-1:-1;36089:9:1;;35992:112::o;36109:414::-;36311:2;36293:21;;;36350:2;36330:18;;;36323:30;36389:34;36384:2;36369:18;;36362:62;-1:-1:-1;;;36455:2:1;36440:18;;36433:48;36513:3;36498:19;;36109:414::o;36875:489::-;-1:-1:-1;;;;;37144:15:1;;;37126:34;;37196:15;;37191:2;37176:18;;37169:43;37243:2;37228:18;;37221:34;;;37291:3;37286:2;37271:18;;37264:31;;;37069:4;;37312:46;;37338:19;;37330:6;37312:46;:::i;:::-;37304:54;36875:489;-1:-1:-1;;;;;;36875:489:1:o;37369:249::-;37438:6;37491:2;37479:9;37470:7;37466:23;37462:32;37459:52;;;37507:1;37504;37497:12;37459:52;37539:9;37533:16;37558:30;37582:5;37558:30;:::i;37984:172::-;38051:10;38081;;;38093;;;38077:27;;38116:11;;;38113:37;;;38130:18;;:::i;:::-;38113:37;37984:172;;;;:::o
Swarm Source
ipfs://4b39dcddba6a3fdc163248fe2304bd96c0a462a89ecb97b86a248bf83c5f5075
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.