Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 445 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Purchase And App... | 19545296 | 381 days ago | IN | 0 ETH | 0.01123912 | ||||
Purchase And App... | 19536500 | 383 days ago | IN | 0 ETH | 0.01085052 | ||||
Mint With Awoo | 19524558 | 384 days ago | IN | 0 ETH | 0.00940306 | ||||
Mint With Awoo | 19504661 | 387 days ago | IN | 0 ETH | 0.00469438 | ||||
Mint With Awoo | 19504641 | 387 days ago | IN | 0 ETH | 0.00620454 | ||||
Purchase And App... | 19387807 | 404 days ago | IN | 0 ETH | 0.02520759 | ||||
Purchase And App... | 19386576 | 404 days ago | IN | 0 ETH | 0.03915214 | ||||
Purchase And App... | 19265956 | 421 days ago | IN | 0 ETH | 0.0140525 | ||||
Mint With Awoo | 18587730 | 516 days ago | IN | 0 ETH | 0.00872987 | ||||
Purchase And App... | 18369663 | 546 days ago | IN | 0 ETH | 0.0023114 | ||||
Purchase And App... | 18368036 | 546 days ago | IN | 0 ETH | 0.00226993 | ||||
Purchase And App... | 18367578 | 546 days ago | IN | 0 ETH | 0.00223366 | ||||
Purchase And App... | 18350917 | 549 days ago | IN | 0 ETH | 0.00200345 | ||||
Purchase And App... | 18344638 | 550 days ago | IN | 0 ETH | 0.00242008 | ||||
Purchase And App... | 18344637 | 550 days ago | IN | 0 ETH | 0.00205446 | ||||
Purchase And App... | 18338869 | 550 days ago | IN | 0 ETH | 0.00298332 | ||||
Purchase And App... | 18200897 | 570 days ago | IN | 0 ETH | 0.00305006 | ||||
Purchase And App... | 18104645 | 583 days ago | IN | 0 ETH | 0.0037333 | ||||
Purchase And App... | 18094083 | 585 days ago | IN | 0 ETH | 0.00529787 | ||||
Purchase And App... | 18080308 | 587 days ago | IN | 0 ETH | 0.00589196 | ||||
Purchase And App... | 17568686 | 658 days ago | IN | 0 ETH | 0.00530413 | ||||
Purchase And App... | 17557415 | 660 days ago | IN | 0 ETH | 0.00538997 | ||||
Purchase And App... | 17545162 | 662 days ago | IN | 0 ETH | 0.00566348 | ||||
Purchase And App... | 17541625 | 662 days ago | IN | 0 ETH | 0.00644064 | ||||
Purchase And App... | 17538718 | 663 days ago | IN | 0 ETH | 0.00716436 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AwooStoreV2
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-07 */ // File: contracts/AwooModels.sol pragma solidity 0.8.12; struct AccrualDetails{ address ContractAddress; uint256[] TokenIds; uint256[] Accruals; uint256 TotalAccrued; } struct ClaimDetails{ address ContractAddress; uint32[] TokenIds; } struct SupportedContractDetails{ address ContractAddress; uint256 BaseRate; bool Active; } // File: contracts/IAwooClaimingV2.sol pragma solidity 0.8.12; interface IAwooClaimingV2{ function overrideTokenAccrualBaseRate(address contractAddress, uint32 tokenId, uint256 newBaseRate) external; function claim(address holder, ClaimDetails[] calldata requestedClaims) external; } // File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/IAwooToken.sol pragma solidity 0.8.12; interface IAwooToken is IERC20 { function increaseVirtualBalance(address account, uint256 amount) external; function mint(address account, uint256 amount) external; function balanceOfVirtual(address account) external view returns(uint256); function spendVirtualAwoo(bytes32 hash, bytes memory sig, string calldata nonce, address account, uint256 amount) external; } // File: @openzeppelin/[email protected]/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: @openzeppelin/[email protected]/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/[email protected]/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: contracts/OwnerAdminGuard.sol pragma solidity 0.8.12; contract OwnerAdminGuard is Ownable { address[2] private _admins; bool private _adminsSet; /// @notice Allows the owner to specify two addresses allowed to administer this contract /// @param admins A 2 item array of addresses function setAdmins(address[2] calldata admins) public { require(admins[0] != address(0) && admins[1] != address(0), "Invalid admin address"); _admins = admins; _adminsSet = true; } function _isOwnerOrAdmin(address addr) internal virtual view returns(bool){ return addr == owner() || ( _adminsSet && ( addr == _admins[0] || addr == _admins[1] ) ); } modifier onlyOwnerOrAdmin() { require(_isOwnerOrAdmin(msg.sender), "Not an owner or admin"); _; } } // File: contracts/AuthorizedCallerGuard.sol pragma solidity 0.8.12; contract AuthorizedCallerGuard is OwnerAdminGuard { /// @dev Keeps track of which contracts are explicitly allowed to interact with certain super contract functionality mapping(address => bool) public authorizedContracts; event AuthorizedContractAdded(address contractAddress, address addedBy); event AuthorizedContractRemoved(address contractAddress, address removedBy); /// @notice Allows the owner or an admin to authorize another contract to override token accruals on an individual token level /// @param contractAddress The authorized contract address function addAuthorizedContract(address contractAddress) public onlyOwnerOrAdmin { require(_isContract(contractAddress), "Invalid contractAddress"); authorizedContracts[contractAddress] = true; emit AuthorizedContractAdded(contractAddress, _msgSender()); } /// @notice Allows the owner or an admin to remove an authorized contract /// @param contractAddress The contract address which should have its authorization revoked function removeAuthorizedContract(address contractAddress) public onlyOwnerOrAdmin { authorizedContracts[contractAddress] = false; emit AuthorizedContractRemoved(contractAddress, _msgSender()); } /// @dev Derived from @openzeppelin/contracts/utils/Address.sol function _isContract(address account) internal virtual view returns (bool) { if(account == address(0)) return false; // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } function _isAuthorizedContract(address addr) internal virtual view returns(bool){ return authorizedContracts[addr]; } modifier onlyAuthorizedCaller() { require(_isOwnerOrAdmin(_msgSender()) || _isAuthorizedContract(_msgSender()), "Sender is not authorized"); _; } modifier onlyAuthorizedContract() { require(_isAuthorizedContract(_msgSender()), "Sender is not authorized"); _; } } // File: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/[email protected]/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/[email protected]/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: @openzeppelin/[email protected]/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: contracts/IAwooMintableCollection.sol pragma solidity 0.8.12; interface IAwooMintableCollection is IERC1155 { struct TokenDetail { bool SoftLimit; bool Active; } struct TokenCount { uint256 TokenId; uint256 Count; } function supportsInterface(bytes4 interfaceId) external view returns (bool); function mint(address to, uint256 id, uint256 qty) external; function mintBatch(address to, uint256[] memory ids, uint256[] memory quantities) external; function burn(address from, uint256 id, uint256 qty) external; function tokensOfOwner(address owner) external view returns (TokenCount[] memory); function totalMinted(uint256 id) external view returns(uint256); function totalSupply(uint256 id) external view returns (uint256); function exists(uint256 id) external view returns (bool); function addToken(TokenDetail calldata tokenDetail, string memory tokenUri) external returns(uint256); function setTokenUri(uint256 id, string memory tokenUri) external; function setTokenActive(uint256 id, bool active) external; function setBaseUri(string memory baseUri) external; } // File: @openzeppelin/[email protected]/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/[email protected]/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: @openzeppelin/[email protected]/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/[email protected]/token/ERC1155/extensions/ERC1155Supply.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } } } // File: contracts/AwooCollection.sol pragma solidity 0.8.12; contract AwooCollection is IAwooMintableCollection, ERC1155Supply, AuthorizedCallerGuard { using Strings for uint256; string public constant name = "Awoo Items"; string public constant symbol = "AWOOI"; uint16 public currentTokenId; bool public isActive; /// @notice Maps the tokenId of a specific mintable item to the details that define that item mapping(uint256 => TokenDetail) public tokenDetails; /// @notice Keeps track of the number of tokens that were burned to support "Soft" limits /// @dev Soft limits are the number of tokens available at any given time, so if 1 is burned, another can be minted mapping(uint256 => uint256) public tokenBurnCounts; /// @dev Allows us to have token-specific metadata uris that will override the baseUri mapping(uint256 => string) private _tokenUris; event TokenUriUpdated(uint256 indexed id, string newUri, address updatedBy); constructor(address awooStoreAddress, string memory baseUri) ERC1155(baseUri){ // Allow the Awoo Store contract to interact with this contract to faciliate minting and burning addAuthorizedContract(awooStoreAddress); } /// @dev See {IERC165-supportsInterface}. function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, IAwooMintableCollection) returns (bool) { return super.supportsInterface(interfaceId) || interfaceId == type(IAwooMintableCollection).interfaceId || interfaceId == type(IERC1155).interfaceId || interfaceId == ERC1155Supply.totalSupply.selector || interfaceId == ERC1155Supply.exists.selector; } /// @notice Allows authorized contracts to mints tokens to the specified recipient /// @param to The recipient address /// @param id The Id of the specific token to mint /// @param qty The number of specified tokens that should be minted function mint(address to, uint256 id, uint256 qty ) external whenActive onlyAuthorizedContract { _mint(to, id, qty, ""); } /// @notice Allows authorized contracts to mint multiple different tokens to the specified recipient /// @param to The recipient address /// @param ids The Ids of the specific tokens to mint /// @param quantities The number of each of the specified tokens that should be minted function mintBatch(address to, uint256[] memory ids, uint256[] memory quantities ) external whenActive onlyAuthorizedContract { _mintBatch(to, ids, quantities, ""); } /// @notice Burns the specified number of tokens. /// @notice Only the holder or an approved operator is authorized to burn /// @notice Operator approvals must have been explicitly allowed by the token holder /// @param from The account from which the specified tokens will be burned /// @param id The Id of the tokens that will be burned /// @param qty The number of specified tokens that will be burned function burn(address from, uint256 id, uint256 qty) external { require(exists(id), "Query for non-existent id"); require(from == _msgSender() || isApprovedForAll(from, _msgSender()), "Not owner or approved"); _burn(from, id, qty); } /// @notice Burns the specified number of each of the specified tokens. /// @notice Only the holder or an approved operator is authorized to burn /// @notice Operator approvals must have been explicitly allowed by the token holder /// @param from The account from which the specified tokens will be burned /// @param ids The Ids of the tokens that will be burned /// @param quantities The number of each of the specified tokens that will be burned function burnBatch(address from, uint256[] memory ids, uint256[] memory quantities) external { require(from == _msgSender() || isApprovedForAll(from, _msgSender()), "Not owner or approved"); for(uint256 i; i < ids.length; i++){ require(exists(ids[i]), "Query for non-existent id"); } _burnBatch(from, ids, quantities); } /// @notice Returns the metadata uri for the specified token /// @dev By default, token-specific uris are given preference /// @param id The id of the token for which the uri should be returned /// @return A uri string function uri(uint256 id) public view override returns (string memory) { require(exists(id), "Query for non-existent id"); return bytes(_tokenUris[id]).length > 0 ? _tokenUris[id] : string.concat(ERC1155.uri(id), id.toString(), ".json"); } /// @notice Returns the number of each token held by the specified owner address /// @param owner The address of the token owner/holder /// @return An array of Tuple(uint256,uint256) indicating the number of tokens held function tokensOfOwner(address owner) external view returns (TokenCount[] memory) { TokenCount[] memory ownerTokenCounts = new TokenCount[](currentTokenId); for(uint256 i = 1; i <= currentTokenId; i++){ uint256 count = balanceOf(owner, i); ownerTokenCounts[i-1] = TokenCount(i, count); } return ownerTokenCounts; } /// @notice Returns the total number of tokens minted for the specified token id /// @dev For tokens that have a soft limit, the number of burned tokens is included /// so the result is based on the total number of tokens minted, regardless of whether /// or not they were subsequently burned /// @param id The id of the token to query /// @return A uint256 value indicating the total number of tokens minted and burned for the specified token id function totalMinted(uint256 id) isValidTokenId(id) external view returns(uint256) { TokenDetail memory tokenDetail = tokenDetails[id]; if(tokenDetail.SoftLimit){ return ERC1155Supply.totalSupply(id); } else { return (ERC1155Supply.totalSupply(id) + tokenBurnCounts[id]); } } /// @notice Returns the current number of tokens that were minted and not burned /// @param id The id of the token to query /// @return A uint256 value indicating the number of tokens which have not been burned function totalSupply(uint256 id) public view virtual override(ERC1155Supply,IAwooMintableCollection) returns (uint256) { return ERC1155Supply.totalSupply(id); } /// @notice Determines whether or not the specified token id is valid and at least 1 has been minted /// @param id The id of the token to validate /// @return A boolean value indicating the existence of the specified token id function exists(uint256 id) public view virtual override(ERC1155Supply,IAwooMintableCollection) returns (bool) { return ERC1155Supply.exists(id); } /// @notice Allows authorized individuals or contracts to add new tokens that can be minted /// @param tokenDetail An object describing the token being added /// @param tokenUri The specific uri to use for the token being added /// @return A uint256 value representing the id of the token function addToken(TokenDetail calldata tokenDetail, string memory tokenUri) external isAuthorized returns(uint256){ currentTokenId++; if(bytes(tokenUri).length > 0) { _tokenUris[currentTokenId] = tokenUri; } tokenDetails[currentTokenId] = tokenDetail; return currentTokenId; } /// @notice Allows authorized individuals or contracts to set the base metadata uri /// @dev It is assumed that the baseUri value will end with / /// @param baseUri The uri to use as the base for all tokens that don't have a token-specific uri function setBaseUri(string memory baseUri) external isAuthorized { _setURI(baseUri); } /// @notice Allows authorized individuals or contracts to set the base metadata uri on a per token level /// @param id The id of the token /// @param tokenUri The uri to use for the specified token id function setTokenUri(uint256 id, string memory tokenUri) external isAuthorized isValidTokenId(id) { _tokenUris[id] = tokenUri; emit TokenUriUpdated(id, tokenUri, _msgSender()); } /// @notice Allows authorized individuals or contracts to activate/deactivate minting of the specified token id /// @param id The id of the token /// @param active A boolean value indicating whether or not minting is allowed for this token function setTokenActive(uint256 id, bool active) external isAuthorized isValidTokenId(id) { tokenDetails[id].Active = active; } /// @notice Allows authorized individuals to activate/deactivate minting of all tokens /// @param active A boolean value indicating whether or not minting is allowed function setActive(bool active) external onlyOwnerOrAdmin { isActive = active; } function rescueEth() external onlyOwner { require(payable(owner()).send(address(this).balance)); } /// @dev Hook to allows us to count the burned tokens even if they're just transferred to the zero address function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { tokenBurnCounts[ids[i]] += amounts[i]; } } } modifier whenActive(){ require(isActive, "Minting inactive"); _; } modifier isValidTokenId(uint256 id) { require(id <= currentTokenId, "Invalid tokenId"); _; } modifier isValidTokenIds(uint256[] memory ids){ for(uint256 i = 0; i < ids.length; i++){ require(ids[i] <= currentTokenId, "Invalid tokenId"); } _; } modifier isAuthorized() { require(_isAuthorizedContract(_msgSender()) || _isOwnerOrAdmin(_msgSender()), "Unauthorized"); _; } } // File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (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 tokenId); /** * @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/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/AwooStoreV2.sol pragma solidity 0.8.12; contract AwooStoreV2 is OwnerAdminGuard { struct AwooSpendApproval { bytes32 Hash; bytes Sig; string Nonce; } enum PaymentType { AWOO, ETHER, AWOO_AND_ETHER, FREE } struct UpgradeDetail { uint8 ApplicableCollectionId; bool UpgradeItem; bool Stackable; uint256 UpgradeBaseAccrualRate; } struct ItemDetail { uint16 TotalAvailable; uint16 PerAddressLimit; uint16 PerTransactionLimit; PaymentType PmtType; bool Burnable; bool NonMintable; bool Active; IAwooMintableCollection.TokenDetail TokenDetails; UpgradeDetail UpgradeDetails; string MetadataUri; uint256 TokenId; uint256 EtherPrice; uint256 AWOOPrice; } address payable public withdrawAddress; IAwooToken public awooContract; IAwooClaimingV2 public awooClaimingContract; IAwooMintableCollection public awooMintableCollectionContract; bool public storeActive; /// @dev Helps us track the supported ERC721Enumerable contracts so we can refer to them by their /// "id" to save a bit of gas uint8 public collectionCount; /// @dev Helps us track the available items so we can refer to them by their "id" to save a bit of gas uint16 public itemCount; /// @notice Maps the supported ERC721Enumerable contracts to their Ids mapping(uint8 => address) public collectionIdAddressMap; /// @notice Maps the available items to their Ids mapping(uint16 => ItemDetail) public itemIdDetailMap; /// @notice Maps the number of purchased (not minted) items mapping(uint16 => uint256) public purchasedItemCount; /// @notice Maps item ownership counts // owner => (itemId, count). This is only relevant for items that weren't minted mapping(address => mapping(uint16 => uint256)) public ownedItemCountsByOwner; /// @notice Keeps track of how many of each token has been minted by a particular address // owner => (itemId, count) mapping(address => mapping(uint16 => uint256)) public mintedItemCountsByAddress; /// @notice Keeps track of "upgrade" item applications // itemId => (collectionId, applicationTokenIds) mapping(uint16 => mapping(uint8 => uint256[])) public itemApplications; /// @notice Keeps track of "upgrade" items by the collection that they were applied to // collectionId => (tokenId, (itemId => count)) mapping(uint8 => mapping(uint32 => mapping(uint16 => uint256))) public tokenAppliedItemCountsByCollection; /// @notice A method that tells us that an "upgrade" item was applied so we can do some cool stuff event UpgradeItemApplied( uint16 itemId, address applicationCollectionAddress, uint256 appliedToTokenId ); // ;) event NonMintableItemUsed(uint16 itemId, address usedBy, uint256 qty); event ItemPurchased(uint16 itemId, address purchasedBy, uint256 qty); constructor( address payable withdrawAddr, IAwooToken awooTokenContract, IAwooClaimingV2 claimingContract ) { require(withdrawAddr != address(0), "Invalid address"); withdrawAddress = withdrawAddr; awooContract = awooTokenContract; awooClaimingContract = claimingContract; } /// @notice Allows the specified item to be minted with AWOO /// @param itemId The id of the item to mint /// @param qty The number of items to mint /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC function mintWithAwoo( uint16 itemId, uint256 qty, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims ) public whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = _validateItem(itemId, PaymentType.AWOO); require(!item.NonMintable, "Specified item is not mintable"); _validateRequestedQuantity(itemId, item, qty); _ensureAvailablity(item, itemId, qty); _claimAwoo(requestedClaims); awooContract.spendVirtualAwoo( approval.Hash, approval.Sig, approval.Nonce, _msgSender(), qty * item.AWOOPrice ); awooMintableCollectionContract.mint(_msgSender(), item.TokenId, qty); mintedItemCountsByAddress[_msgSender()][itemId] += qty; } /// @notice Allows the specified item to be minted with Ether /// @param itemId The id of the item to mint /// @param qty The number of items to mint function mintWithEth(uint16 itemId, uint256 qty) public payable whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = _validateItem(itemId, PaymentType.ETHER); require(!item.NonMintable, "Specified item is not mintable"); _validateRequestedQuantity(itemId, item, qty); _ensureAvailablity(item, itemId, qty); _validateEtherValue(item, qty); awooMintableCollectionContract.mint(_msgSender(), item.TokenId, qty); mintedItemCountsByAddress[_msgSender()][itemId] += qty; } /// @notice Allows the specified item to be minted with both AWOO and Ether, if the item supports that /// @param itemId The id of the item to mint /// @param qty The number of items to mint /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC function mintWithEthAndAwoo( uint16 itemId, uint256 qty, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims ) public payable whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = _validateItem( itemId, PaymentType.AWOO_AND_ETHER ); require(!item.NonMintable, "Specified item is not mintable"); _validateRequestedQuantity(itemId, item, qty); _ensureAvailablity(item, itemId, qty); _validateEtherValue(item, qty); _claimAwoo(requestedClaims); awooContract.spendVirtualAwoo( approval.Hash, approval.Sig, approval.Nonce, _msgSender(), qty * item.AWOOPrice ); awooMintableCollectionContract.mint(_msgSender(), item.TokenId, qty); mintedItemCountsByAddress[_msgSender()][itemId] += qty; } /// @notice Allows the specified item to be purchased with AWOO /// @param itemId The id of the item to purchase /// @param qty The number of items to purchase /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC function purchaseWithAwoo( uint16 itemId, uint256 qty, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims ) public whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = _validateItem(itemId, PaymentType.AWOO); _validateRequestedQuantity(itemId, item, qty); _ensureAvailablity(item, itemId, qty); _claimAwoo(requestedClaims); awooContract.spendVirtualAwoo( approval.Hash, approval.Sig, approval.Nonce, _msgSender(), qty * item.AWOOPrice ); purchasedItemCount[itemId] += qty; ownedItemCountsByOwner[_msgSender()][itemId] += qty; emit ItemPurchased(itemId, _msgSender(), qty); } /// @notice Allows the specified item to be purchased with Ether /// @param itemId The id of the item to purchase /// @param qty The numbers of items to purchase function purchaseWithEth(uint16 itemId, uint256 qty) public payable whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = _validateItem(itemId, PaymentType.ETHER); _validateRequestedQuantity(itemId, item, qty); _ensureAvailablity(item, itemId, qty); _validateEtherValue(item, qty); purchasedItemCount[itemId] += qty; ownedItemCountsByOwner[_msgSender()][itemId] += qty; emit ItemPurchased(itemId, _msgSender(), qty); } /// @notice Allows the specified item to be purchased with AWOO and Ether, if the item allows it /// @param itemId The id of the item to purchase /// @param qty The number of items to purchase /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC function purchaseWithEthAndAwoo( uint16 itemId, uint256 qty, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims ) public payable whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = _validateItem( itemId, PaymentType.AWOO_AND_ETHER ); _validateRequestedQuantity(itemId, item, qty); _ensureAvailablity(item, itemId, qty); _validateEtherValue(item, qty); _claimAwoo(requestedClaims); awooContract.spendVirtualAwoo( approval.Hash, approval.Sig, approval.Nonce, _msgSender(), qty * item.AWOOPrice ); purchasedItemCount[itemId] += qty; ownedItemCountsByOwner[_msgSender()][itemId] += qty; emit ItemPurchased(itemId, _msgSender(), qty); } /// @notice Allows the specified item to be purchased with AWOO and applied to the specified tokens /// @param itemId The id of the item to purchase /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC /// @param applicationTokenIds An array of supported token ids to apply the purchased items to function purchaseAndApplyWithAwoo( uint16 itemId, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims, uint32[] calldata applicationTokenIds ) public whenStoreActive { ItemDetail memory item = _validateItem(itemId, PaymentType.AWOO); _validateRequestedQuantity(itemId, item, applicationTokenIds.length); _ensureAvailablity(item, itemId, applicationTokenIds.length); _claimAwoo(requestedClaims); awooContract.spendVirtualAwoo( approval.Hash, approval.Sig, approval.Nonce, _msgSender(), applicationTokenIds.length * item.AWOOPrice ); purchasedItemCount[itemId] += applicationTokenIds.length; _applyItem(itemId, applicationTokenIds); } /// @notice Allows the specified item to be purchased with Ether and applied to the specified tokens /// @param itemId The id of the item to purchase /// @param applicationTokenIds An array of supported token ids to apply the purchased items to function purchaseAndApplyWithEth( uint16 itemId, uint32[] calldata applicationTokenIds ) public payable whenStoreActive { ItemDetail memory item = _validateItem(itemId, PaymentType.ETHER); _validateRequestedQuantity(itemId, item, applicationTokenIds.length); _validateEtherValue(item, applicationTokenIds.length); _ensureAvailablity(item, itemId, applicationTokenIds.length); purchasedItemCount[itemId] += applicationTokenIds.length; _applyItem(itemId, applicationTokenIds); } /// @notice Allows the specified item to be purchased with AWOO and Ether and applied /// @param itemId The id of the item to purchase /// @param approval An object containing the signed message details authorizing us to spend the holders AWOO /// @param requestedClaims An optional array of ClaimDetails so we can automagically claim the necessary /// amount of AWOO, as specified through NFC /// @param applicationTokenIds An array of supported token ids to apply the purchased items to function purchaseAndApplyWithEthAndAwoo( uint16 itemId, AwooSpendApproval calldata approval, ClaimDetails[] calldata requestedClaims, uint32[] calldata applicationTokenIds ) public payable whenStoreActive { ItemDetail memory item = _validateItem( itemId, PaymentType.AWOO_AND_ETHER ); _validateRequestedQuantity(itemId, item, applicationTokenIds.length); _validateEtherValue(item, applicationTokenIds.length); _ensureAvailablity(item, itemId, applicationTokenIds.length); _claimAwoo(requestedClaims); awooContract.spendVirtualAwoo( approval.Hash, approval.Sig, approval.Nonce, _msgSender(), applicationTokenIds.length * item.AWOOPrice ); purchasedItemCount[itemId] += applicationTokenIds.length; _applyItem(itemId, applicationTokenIds); } // TODO: Add the free mint/purchase functionality (V2) /// @notice Applies the specified item to the list of "upgradeable" tokens /// @param itemId The id of the item to apply /// @param applicationTokenIds An array of token ids to which the specified item will be applied function applyOwnedItem( uint16 itemId, uint32[] calldata applicationTokenIds ) public whenStoreActive { ItemDetail memory item = _getItem(itemId); require( applicationTokenIds.length <= ownedItemCountsByOwner[_msgSender()][itemId], "Exceeds owned quantity" ); for (uint256 i; i < applicationTokenIds.length; i++) { _applyItem(item, itemId, applicationTokenIds[i]); } if (item.Burnable) { ownedItemCountsByOwner[_msgSender()][itemId] -= applicationTokenIds .length; } } /// @notice Allows the holder of a non-mintable item to "use" it for something (TBA) cool /// @param itemId The id of the item to use /// @param qty The number of items to use function useOwnedItem(uint16 itemId, uint256 qty) public whenStoreActive nonZeroQuantity(qty) { ItemDetail memory item = _getItem(itemId); require(item.Active, "Inactive item"); require( qty <= ownedItemCountsByOwner[_msgSender()][itemId], "Exceeds owned quantity" ); if (item.Burnable) { ownedItemCountsByOwner[_msgSender()][itemId] -= qty; } emit NonMintableItemUsed(itemId, _msgSender(), qty); } /// @notice Applies the specified item to the list of "upgradeable" tokens, and burns the item if applicable /// @dev Tokens can only be burned if the holder has explicitly allowed us to do so /// @param itemId The id of the item to apply /// @param applicationTokenIds An array of token ids to which the specified item will be applied function applyMintedItem( uint16 itemId, uint32[] calldata applicationTokenIds ) public whenStoreActive { ItemDetail memory item = _getItem(itemId); require(!item.NonMintable, "Specified item is not mintable"); require( applicationTokenIds.length <= awooMintableCollectionContract.balanceOf( _msgSender(), item.TokenId ), "Invalid application qty" ); for (uint256 i; i < applicationTokenIds.length; i++) { _applyItem(item, itemId, applicationTokenIds[i]); } if (item.Burnable) { awooMintableCollectionContract.burn( _msgSender(), item.TokenId, applicationTokenIds.length ); } } function _applyItem(uint16 itemId, uint32[] calldata applicationTokenIds) private { ItemDetail memory item = _getItem(itemId); for (uint256 i; i < applicationTokenIds.length; i++) { _applyItem(item, itemId, applicationTokenIds[i]); } } function _applyItem( ItemDetail memory item, uint16 itemId, uint32 applicationTokenId ) private { require(item.UpgradeDetails.UpgradeItem, "Item cannot be applied"); require(item.Active, "Inactive item"); address collectionAddress = collectionIdAddressMap[ item.UpgradeDetails.ApplicableCollectionId ]; // Items can only be applied to "upgradable" tokens held by the same account require( _msgSender() == ERC721Enumerable(collectionAddress).ownerOf(applicationTokenId), "Invalid application tokenId" ); // Don't allow the item to be applied mutiple times to the same token unless the item is stackable if (!item.UpgradeDetails.Stackable) { require( tokenAppliedItemCountsByCollection[ item.UpgradeDetails.ApplicableCollectionId ][applicationTokenId][itemId] == 0, "Specified item already applied" ); } // If the item should change the base AWOO accrual rate of the item that it is being applied to, do that // now if (item.UpgradeDetails.UpgradeBaseAccrualRate > 0) { awooClaimingContract.overrideTokenAccrualBaseRate( collectionAddress, applicationTokenId, item.UpgradeDetails.UpgradeBaseAccrualRate ); } tokenAppliedItemCountsByCollection[ item.UpgradeDetails.ApplicableCollectionId ][applicationTokenId][itemId] += 1; itemApplications[itemId][item.UpgradeDetails.ApplicableCollectionId] .push(applicationTokenId); // Tell NFC that we applied this upgrade so it can do some fun stuff emit UpgradeItemApplied(itemId, collectionAddress, applicationTokenId); } function _claimAwoo(ClaimDetails[] calldata requestedClaims) private { if (requestedClaims.length > 0) { awooClaimingContract.claim(_msgSender(), requestedClaims); } } function getItemApplications(uint16 itemId, uint8 applicableCollectionId) external view returns (uint256 count, uint256[] memory appliedToTokenIds) { count = itemApplications[itemId][applicableCollectionId].length; appliedToTokenIds = itemApplications[itemId][applicableCollectionId]; } /// @notice Allows authorized individuals to add supported ERC721Enumerable collections function addCollection(address collectionAddress) external onlyOwnerOrAdmin returns (uint8 collectionId) { collectionId = ++collectionCount; collectionIdAddressMap[collectionId] = collectionAddress; } /// @notice Allows authorized individuals to remove supported ERC721Enumerable collections function removeCollection(uint8 collectionId) external onlyOwnerOrAdmin { require(collectionId <= collectionCount, "Invalid collectionId"); delete collectionIdAddressMap[collectionId]; collectionCount--; } /// @notice Allows authorized individuals to add new items function addItem(ItemDetail memory item, uint16 purchasedQty) external onlyOwnerOrAdmin returns (uint16) { _validateItem(item); if (!item.NonMintable && item.TokenId == 0) { uint256 tokenId = awooMintableCollectionContract.addToken( item.TokenDetails, item.MetadataUri ); item.TokenId = tokenId; } itemIdDetailMap[++itemCount] = item; purchasedItemCount[itemCount] = purchasedQty; return itemCount; } /// @notice Allows authorized individuals to update an existing item function updateItem( uint16 itemId, ItemDetail memory newItem ) external onlyOwnerOrAdmin { _validateItem(newItem); ItemDetail memory existingItem = _getItem(itemId); require( existingItem.NonMintable == newItem.NonMintable, "Item mintability cannot change" ); require( newItem.TotalAvailable <= _availableQty(existingItem, itemId), "Total exceeds available quantity" ); if (!existingItem.NonMintable) { newItem.TokenId = existingItem.TokenId; if ( bytes(newItem.MetadataUri).length != bytes(existingItem.MetadataUri).length || keccak256(abi.encodePacked(newItem.MetadataUri)) != keccak256(abi.encodePacked(existingItem.MetadataUri)) ) { awooMintableCollectionContract.setTokenUri( existingItem.TokenId, newItem.MetadataUri ); } if (newItem.Active != existingItem.Active) { awooMintableCollectionContract.setTokenActive( existingItem.TokenId, newItem.Active ); } } itemIdDetailMap[itemId] = newItem; } function _validateRequestedQuantity( uint16 itemId, ItemDetail memory item, uint256 requestedQty ) private view { require( _isWithinTransactionLimit(item, requestedQty), "Exceeds transaction limit" ); require( _isWithinAddressLimit(itemId, item, requestedQty, _msgSender()), "Exceeds address limit" ); } function _ensureAvailablity( ItemDetail memory item, uint16 itemId, uint256 requestedQty ) private view { require( requestedQty <= _availableQty(item, itemId), "Exceeds available quantity" ); } function availableQty(uint16 itemId) public view returns (uint256) { ItemDetail memory item = _getItem(itemId); return _availableQty(item, itemId); } function _availableQty(ItemDetail memory item, uint16 itemId) private view returns (uint256) { uint256 mintedCount; // If the item is mintable, get the minted quantity from the ERC-1155 contract. // The minted count includes the quantity that was burned if the item does not have a soft limit if (!item.NonMintable) { mintedCount = awooMintableCollectionContract.totalMinted( item.TokenId ); } return item.TotalAvailable - mintedCount - purchasedItemCount[itemId]; } /// @notice Determines if the requested quantity is within the per-transaction limit defined by this item function _isWithinTransactionLimit( ItemDetail memory item, uint256 requestedQty ) private pure returns (bool) { if (item.PerTransactionLimit > 0) { return requestedQty <= item.PerTransactionLimit; } return true; } /// @notice Determines if the requested quantity is within the per-address limit defined by this item function _isWithinAddressLimit( uint16 itemId, ItemDetail memory item, uint256 requestedQty, address recipient ) private view returns (bool) { if (item.PerAddressLimit > 0) { uint256 tokenCountByOwner = item.NonMintable ? ownedItemCountsByOwner[recipient][itemId] : ownedItemCountsByOwner[recipient][itemId] + mintedItemCountsByAddress[recipient][itemId]; return tokenCountByOwner + requestedQty <= item.PerAddressLimit; } return true; } /// @notice Returns an array of tokenIds and application counts to indicate how many of the specified items /// were applied to the specified tokenIds function checkItemTokenApplicationStatus( uint8 collectionId, uint16 itemId, uint256[] calldata tokenIds ) external view returns (uint256[] memory, uint256[] memory) { uint256[] memory checkedTokenIds = new uint256[](tokenIds.length); uint256[] memory applicationCounts = new uint256[](tokenIds.length); for (uint256 i; i < tokenIds.length; i++) { uint32 tokenId = uint32(tokenIds[i]); checkedTokenIds[i] = tokenId; applicationCounts[i] = tokenAppliedItemCountsByCollection[ collectionId ][tokenId][itemId]; } return (checkedTokenIds, applicationCounts); } function _validateEtherValue(ItemDetail memory item, uint256 qty) private { require(msg.value == item.EtherPrice * qty, "Incorrect amount"); } function _getItem(uint16 itemId) private view returns (ItemDetail memory item) { require(itemId <= itemCount, "Invalid itemId"); item = itemIdDetailMap[itemId]; } function _validateItem(uint16 itemId, PaymentType paymentType) private view returns (ItemDetail memory item) { item = _getItem(itemId); require(item.Active, "Inactive item"); require(item.PmtType == paymentType, "Invalid item for payment type"); } function _validateItem(ItemDetail memory item) private view { require(item.TotalAvailable > 0, "Total available cannot be zero"); require( !(item.UpgradeDetails.Stackable && item.PerAddressLimit == 1), "Invalid per-address limit" ); if (!item.NonMintable) { require( bytes(item.MetadataUri).length > 0, "Item requires a metadata uri" ); } if (item.UpgradeDetails.UpgradeItem) { require( item.UpgradeDetails.ApplicableCollectionId <= collectionCount, "Invalid applicableCollectionId" ); } else { require( item.UpgradeDetails.ApplicableCollectionId == 0, "Invalid applicableCollectionId" ); } if (item.PmtType == PaymentType.ETHER) { require(item.EtherPrice > 0, "Invalid ether price"); require(item.AWOOPrice == 0, "Invalid AWOO price"); } else if (item.PmtType == PaymentType.AWOO) { require(item.EtherPrice == 0, "Invalid ether price"); require( item.AWOOPrice == ((item.AWOOPrice / 1e18) * 1e18), "Invalid AWOO price" ); } else if (item.PmtType == PaymentType.AWOO_AND_ETHER) { require(item.EtherPrice > 0, "Invalid ether price"); require( item.AWOOPrice == ((item.AWOOPrice / 1e18) * 1e18), "Invalid AWOO price" ); } // free else { revert("Not implemented, yet"); } } /// @notice Allows authorized individuals to swap out claiming contract function setAwooClaimingContract(IAwooClaimingV2 awooClaiming) external onlyOwnerOrAdmin { awooClaimingContract = IAwooClaimingV2(awooClaiming); } /// @notice Allows authorized individuals to swap out the ERC-1155 collection contract, if absolutely necessary function setAwooCollection(IAwooMintableCollection awooCollectionContract) external onlyOwnerOrAdmin { awooMintableCollectionContract = awooCollectionContract; } /// @notice Allows authorized individuals to swap out the ERC-20 AWOO contract, if absolutely necessary function setAwooTokenContract(IAwooToken awooTokenContract) external onlyOwnerOrAdmin { awooContract = awooTokenContract; } /// @notice Allows authorized individuals to activate/deactivate this contract function setActive(bool active) external onlyOwnerOrAdmin { if (active) { require( address(awooMintableCollectionContract) != address(0), "Awoo collection has not been set" ); } storeActive = active; } /// @notice Allows authorized individuals to activate/deactivate specific items function setItemActive(uint16 itemId, bool isActive) external onlyOwnerOrAdmin { require(itemId > 0 && itemId <= itemCount, "Invalid Item Id"); itemIdDetailMap[itemId].Active = isActive; } /// @notice Allows authorized individuals to specify which address Ether and other arbitrary ERC-20 tokens /// should be sent to during withdraw function setWithdrawAddress(address payable addr) external onlyOwnerOrAdmin { require(addr != address(0), "Invalid address"); withdrawAddress = addr; } function withdraw(uint256 amount) external onlyOwnerOrAdmin { require(amount <= address(this).balance, "Amount exceeds balance"); require(payable(withdrawAddress).send(amount), "Sending failed"); } /// @dev Any random ERC-20 tokens sent to this contract will be locked forever, unless we rescue them function rescueArbitraryERC20(IERC20 token) external { uint256 balance = token.balanceOf(address(this)); require(balance > 0, "Contract has no balance"); require( token.transfer(payable(withdrawAddress), balance), "Transfer failed" ); } modifier nonZeroQuantity(uint256 qty) { require(qty > 0, "Quantity cannot be zero"); _; } modifier whenStoreActive() { require(storeActive, "Awoo Store is not active"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address payable","name":"withdrawAddr","type":"address"},{"internalType":"contract IAwooToken","name":"awooTokenContract","type":"address"},{"internalType":"contract IAwooClaimingV2","name":"claimingContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"itemId","type":"uint16"},{"indexed":false,"internalType":"address","name":"purchasedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ItemPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"itemId","type":"uint16"},{"indexed":false,"internalType":"address","name":"usedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"NonMintableItemUsed","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":"uint16","name":"itemId","type":"uint16"},{"indexed":false,"internalType":"address","name":"applicationCollectionAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"appliedToTokenId","type":"uint256"}],"name":"UpgradeItemApplied","type":"event"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"}],"name":"addCollection","outputs":[{"internalType":"uint8","name":"collectionId","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"TotalAvailable","type":"uint16"},{"internalType":"uint16","name":"PerAddressLimit","type":"uint16"},{"internalType":"uint16","name":"PerTransactionLimit","type":"uint16"},{"internalType":"enum AwooStoreV2.PaymentType","name":"PmtType","type":"uint8"},{"internalType":"bool","name":"Burnable","type":"bool"},{"internalType":"bool","name":"NonMintable","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"},{"components":[{"internalType":"bool","name":"SoftLimit","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"}],"internalType":"struct IAwooMintableCollection.TokenDetail","name":"TokenDetails","type":"tuple"},{"components":[{"internalType":"uint8","name":"ApplicableCollectionId","type":"uint8"},{"internalType":"bool","name":"UpgradeItem","type":"bool"},{"internalType":"bool","name":"Stackable","type":"bool"},{"internalType":"uint256","name":"UpgradeBaseAccrualRate","type":"uint256"}],"internalType":"struct AwooStoreV2.UpgradeDetail","name":"UpgradeDetails","type":"tuple"},{"internalType":"string","name":"MetadataUri","type":"string"},{"internalType":"uint256","name":"TokenId","type":"uint256"},{"internalType":"uint256","name":"EtherPrice","type":"uint256"},{"internalType":"uint256","name":"AWOOPrice","type":"uint256"}],"internalType":"struct AwooStoreV2.ItemDetail","name":"item","type":"tuple"},{"internalType":"uint16","name":"purchasedQty","type":"uint16"}],"name":"addItem","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"applyMintedItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"applyOwnedItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"}],"name":"availableQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"awooClaimingContract","outputs":[{"internalType":"contract IAwooClaimingV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"awooContract","outputs":[{"internalType":"contract IAwooToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"awooMintableCollectionContract","outputs":[{"internalType":"contract IAwooMintableCollection","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"collectionId","type":"uint8"},{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"checkItemTokenApplicationStatus","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"collectionIdAddressMap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint8","name":"applicableCollectionId","type":"uint8"}],"name":"getItemApplications","outputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256[]","name":"appliedToTokenIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"itemApplications","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"itemIdDetailMap","outputs":[{"internalType":"uint16","name":"TotalAvailable","type":"uint16"},{"internalType":"uint16","name":"PerAddressLimit","type":"uint16"},{"internalType":"uint16","name":"PerTransactionLimit","type":"uint16"},{"internalType":"enum AwooStoreV2.PaymentType","name":"PmtType","type":"uint8"},{"internalType":"bool","name":"Burnable","type":"bool"},{"internalType":"bool","name":"NonMintable","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"},{"components":[{"internalType":"bool","name":"SoftLimit","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"}],"internalType":"struct IAwooMintableCollection.TokenDetail","name":"TokenDetails","type":"tuple"},{"components":[{"internalType":"uint8","name":"ApplicableCollectionId","type":"uint8"},{"internalType":"bool","name":"UpgradeItem","type":"bool"},{"internalType":"bool","name":"Stackable","type":"bool"},{"internalType":"uint256","name":"UpgradeBaseAccrualRate","type":"uint256"}],"internalType":"struct AwooStoreV2.UpgradeDetail","name":"UpgradeDetails","type":"tuple"},{"internalType":"string","name":"MetadataUri","type":"string"},{"internalType":"uint256","name":"TokenId","type":"uint256"},{"internalType":"uint256","name":"EtherPrice","type":"uint256"},{"internalType":"uint256","name":"AWOOPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStoreV2.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"}],"name":"mintWithAwoo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStoreV2.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"}],"name":"mintWithEthAndAwoo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"mintedItemCountsByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"ownedItemCountsByOwner","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":"uint16","name":"itemId","type":"uint16"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStoreV2.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"purchaseAndApplyWithAwoo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"purchaseAndApplyWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStoreV2.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"},{"internalType":"uint32[]","name":"applicationTokenIds","type":"uint32[]"}],"name":"purchaseAndApplyWithEthAndAwoo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStoreV2.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"}],"name":"purchaseWithAwoo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"purchaseWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"},{"components":[{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes","name":"Sig","type":"bytes"},{"internalType":"string","name":"Nonce","type":"string"}],"internalType":"struct AwooStoreV2.AwooSpendApproval","name":"approval","type":"tuple"},{"components":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"uint32[]","name":"TokenIds","type":"uint32[]"}],"internalType":"struct ClaimDetails[]","name":"requestedClaims","type":"tuple[]"}],"name":"purchaseWithEthAndAwoo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"purchasedItemCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"collectionId","type":"uint8"}],"name":"removeCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"rescueArbitraryERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[2]","name":"admins","type":"address[2]"}],"name":"setAdmins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAwooClaimingV2","name":"awooClaiming","type":"address"}],"name":"setAwooClaimingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAwooMintableCollection","name":"awooCollectionContract","type":"address"}],"name":"setAwooCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAwooToken","name":"awooTokenContract","type":"address"}],"name":"setAwooTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setItemActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"tokenAppliedItemCountsByCollection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"components":[{"internalType":"uint16","name":"TotalAvailable","type":"uint16"},{"internalType":"uint16","name":"PerAddressLimit","type":"uint16"},{"internalType":"uint16","name":"PerTransactionLimit","type":"uint16"},{"internalType":"enum AwooStoreV2.PaymentType","name":"PmtType","type":"uint8"},{"internalType":"bool","name":"Burnable","type":"bool"},{"internalType":"bool","name":"NonMintable","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"},{"components":[{"internalType":"bool","name":"SoftLimit","type":"bool"},{"internalType":"bool","name":"Active","type":"bool"}],"internalType":"struct IAwooMintableCollection.TokenDetail","name":"TokenDetails","type":"tuple"},{"components":[{"internalType":"uint8","name":"ApplicableCollectionId","type":"uint8"},{"internalType":"bool","name":"UpgradeItem","type":"bool"},{"internalType":"bool","name":"Stackable","type":"bool"},{"internalType":"uint256","name":"UpgradeBaseAccrualRate","type":"uint256"}],"internalType":"struct AwooStoreV2.UpgradeDetail","name":"UpgradeDetails","type":"tuple"},{"internalType":"string","name":"MetadataUri","type":"string"},{"internalType":"uint256","name":"TokenId","type":"uint256"},{"internalType":"uint256","name":"EtherPrice","type":"uint256"},{"internalType":"uint256","name":"AWOOPrice","type":"uint256"}],"internalType":"struct AwooStoreV2.ItemDetail","name":"newItem","type":"tuple"}],"name":"updateItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"itemId","type":"uint16"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"useOwnedItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620059e7380380620059e7833981016040819052620000349162000141565b6200003f33620000d8565b6001600160a01b0383166200008c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b600380546001600160a01b0394851661010002610100600160a81b0319909116179055600480549284166001600160a01b03199384161790556005805491909316911617905562000195565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200013e57600080fd5b50565b6000806000606084860312156200015757600080fd5b8351620001648162000128565b6020850151909350620001778162000128565b60408501519092506200018a8162000128565b809150509250925092565b61584280620001a56000396000f3fe6080604052600436106102f25760003560e01c80636bfb0d011161018f578063c6a03067116100e1578063e4b064bc1161008a578063f2fde38b11610064578063f2fde38b146108fe578063f4aabcaa1461091e578063f563d82e1461094b57600080fd5b8063e4b064bc146108b8578063ebd0f2b7146108d8578063eddf7586146108eb57600080fd5b8063d57f966b116100bb578063d57f966b14610845578063d684dbd814610878578063d7f0cbdc1461089857600080fd5b8063c6a03067146107e5578063c71ab3c514610805578063d22a092a1461082557600080fd5b8063a174e77a11610143578063b76b39a41161011d578063b76b39a414610777578063bb1e3a6314610797578063bc1f793f146107c557600080fd5b8063a174e77a14610712578063a235ea2714610744578063acec338a1461075757600080fd5b80638bbf9ef6116101745780638bbf9ef61461068d5780638da5cb5b146106bb5780639ab19977146106d957600080fd5b80636bfb0d0114610630578063715018a61461067857600080fd5b80633218d7bb1161024857806347f2e27a116101fc5780635ce628b0116101d65780635ce628b0146105b25780635f3002ba146105f057806361700ef31461061057600080fd5b806347f2e27a1461053d5780634fcd3a711461057f5780635433d3501461059257600080fd5b8063397089051161022d57806339708905146104d25780633ab1a494146104e5578063405402c21461050557600080fd5b80633218d7bb1461049257806336bd4b4a146104b257600080fd5b806320be2759116102aa5780632f531568116102845780632f531568146104245780632fcc503b1461045257806330c8d9df1461047257600080fd5b806320be2759146103c457806325609d6f146103e45780632e1a7d4d1461040457600080fd5b80630d9014e7116102db5780630d9014e71461032c5780631581b6001461037f57806315e32e08146103a457600080fd5b80630604c672146102f75780630a6f94fc1461030c575b600080fd5b61030a610305366004614898565b610983565b005b34801561031857600080fd5b5061030a6103273660046148c2565b610bb8565b34801561033857600080fd5b506103626103473660046148fb565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561038b57600080fd5b506003546103629061010090046001600160a01b031681565b3480156103b057600080fd5b5061030a6103bf36600461492b565b610c7f565b3480156103d057600080fd5b50600454610362906001600160a01b031681565b3480156103f057600080fd5b50600554610362906001600160a01b031681565b34801561041057600080fd5b5061030a61041f366004614948565b610d0e565b34801561043057600080fd5b5061044461043f366004614961565b610e2f565b604051908152602001610376565b34801561045e57600080fd5b5061030a61046d3660046148fb565b610e4e565b34801561047e57600080fd5b5061030a61048d36600461492b565b610f96565b34801561049e57600080fd5b5061030a6104ad3660046149da565b611025565b3480156104be57600080fd5b5061030a6104cd36600461492b565b6112ec565b61030a6104e0366004614898565b6114a7565b3480156104f157600080fd5b5061030a61050036600461492b565b611644565b34801561051157600080fd5b50610444610520366004614a5f565b600a60209081526000928352604080842090915290825290205481565b34801561054957600080fd5b5060065461056f9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610376565b61030a61058d3660046149da565b61172e565b34801561059e57600080fd5b5061030a6105ad366004614a94565b61186a565b3480156105be57600080fd5b506104446105cd366004614afb565b600d60209081526000938452604080852082529284528284209052825290205481565b3480156105fc57600080fd5b5061030a61060b366004614a94565b611b13565b34801561061c57600080fd5b5061030a61062b366004614b57565b611c66565b34801561063c57600080fd5b5060065461066590760100000000000000000000000000000000000000000000900461ffff1681565b60405161ffff9091168152602001610376565b34801561068457600080fd5b5061030a611d90565b34801561069957600080fd5b506106ad6106a8366004614b8e565b611df6565b604051610376929190614c2a565b3480156106c757600080fd5b506000546001600160a01b0316610362565b3480156106e557600080fd5b506106f96106f4366004614961565b611f43565b6040516103769d9c9b9a99989796959493929190614cfd565b34801561071e57600080fd5b5061073261072d36600461492b565b6120b3565b60405160ff9091168152602001610376565b61030a610752366004614dfa565b61219b565b34801561076357600080fd5b5061030a610772366004614e9f565b61230d565b34801561078357600080fd5b506106656107923660046151bb565b61240a565b3480156107a357600080fd5b506107b76107b2366004615200565b61285f565b60405161037692919061522a565b3480156107d157600080fd5b5061030a6107e0366004614898565b6128d8565b3480156107f157600080fd5b5061030a610800366004615243565b612ac5565b34801561081157600080fd5b5061030a61082036600461492b565b613061565b34801561083157600080fd5b50610444610840366004615291565b6130f0565b34801561085157600080fd5b50600654610732907501000000000000000000000000000000000000000000900460ff1681565b34801561088457600080fd5b5061030a6108933660046149da565b61312e565b3480156108a457600080fd5b50600654610362906001600160a01b031681565b3480156108c457600080fd5b5061030a6108d3366004614dfa565b613351565b61030a6108e6366004614a94565b6133d5565b61030a6108f93660046149da565b6134a2565b34801561090a57600080fd5b5061030a61091936600461492b565b61358c565b34801561092a57600080fd5b50610444610939366004614961565b60096020526000908152604090205481565b34801561095757600080fd5b50610444610966366004614a5f565b600b60209081526000928352604080842090915290825290205481565b60065474010000000000000000000000000000000000000000900460ff166109f25760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064015b60405180910390fd5b8060008111610a435760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b6000610a5084600161366b565b90508060a0015115610aa45760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c65000060448201526064016109e9565b610aaf8482856137d1565b610aba818585613884565b610ac481846138dd565b6006546001600160a01b031663156e29f6336101408401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260448101869052606401600060405180830381600087803b158015610b4157600080fd5b505af1158015610b55573d6000803e3d6000fd5b5050505082600b6000610b653390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008661ffff1661ffff1681526020019081526020016000206000828254610bad91906152fc565b909155505050505050565b6000610bc7602083018361492b565b6001600160a01b031614158015610bf757506000610beb604083016020840161492b565b6001600160a01b031614155b610c435760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e2061646472657373000000000000000000000060448201526064016109e9565b610c50600182600261478a565b5050600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610c883361393c565b610cd45760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610d173361393c565b610d635760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b47811115610db35760405162461bcd60e51b815260206004820152601660248201527f416d6f756e7420657863656564732062616c616e63650000000000000000000060448201526064016109e9565b6003546040516101009091046001600160a01b0316906108fc8315029083906000818181858888f19350505050610e2c5760405162461bcd60e51b815260206004820152600e60248201527f53656e64696e67206661696c656400000000000000000000000000000000000060448201526064016109e9565b50565b600080610e3b8361398d565b9050610e478184613c8c565b9392505050565b610e573361393c565b610ea35760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b60065460ff750100000000000000000000000000000000000000000090910481169082161115610f155760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420636f6c6c656374696f6e496400000000000000000000000060448201526064016109e9565b60ff808216600090815260076020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556006805475010000000000000000000000000000000000000000009004909116906015610f7a83615343565b91906101000a81548160ff021916908360ff1602179055505050565b610f9f3361393c565b610feb5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60065474010000000000000000000000000000000000000000900460ff1661108f5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b83600081116110e05760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b60006110ed87600061366b565b90508060a00151156111415760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c65000060448201526064016109e9565b61114c8782886137d1565b611157818888613884565b6111618484613d64565b6004546001600160a01b0316636cce000c8635611181602089018961537e565b61118e60408b018b61537e565b3361018089015161119f908f6153e3565b6040518863ffffffff1660e01b81526004016111c19796959493929190615469565b600060405180830381600087803b1580156111db57600080fd5b505af11580156111ef573d6000803e3d6000fd5b50506006546001600160a01b0316915063156e29f69050336101408401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260448101899052606401600060405180830381600087803b15801561127257600080fd5b505af1158015611286573d6000803e3d6000fd5b5050505085600b60006112963390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008961ffff1661ffff16815260200190815260200160002060008282546112de91906152fc565b909155505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561134c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137091906154b6565b9050600081116113c25760405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420686173206e6f2062616c616e636500000000000000000060448201526064016109e9565b6003546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b0390811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af1158015611433573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145791906154cf565b6114a35760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016109e9565b5050565b60065474010000000000000000000000000000000000000000900460ff166115115760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b80600081116115625760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b600061156f84600161366b565b905061157c8482856137d1565b611587818585613884565b61159181846138dd565b61ffff8416600090815260096020526040812080548592906115b49084906152fc565b9091555050336000908152600a6020908152604080832061ffff88168452909152812080548592906115e79084906152fc565b909155507f2f9a7de3ca4aab8e8af63604a57dc780bc4f02cc676ca60829584a081630d4f7905084335b6040805161ffff90931683526001600160a01b03909116602083015281018590526060015b60405180910390a150505050565b61164d3361393c565b6116995760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b6001600160a01b0381166116ef5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642061646472657373000000000000000000000000000000000060448201526064016109e9565b600380546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b60065474010000000000000000000000000000000000000000900460ff166117985760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b83600081116117e95760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b60006117f687600261366b565b90508060a001511561184a5760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c65000060448201526064016109e9565b6118558782886137d1565b611860818888613884565b61115781876138dd565b60065474010000000000000000000000000000000000000000900460ff166118d45760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b60006118df8461398d565b90508060a00151156119335760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c65000060448201526064016109e9565b6006546001600160a01b031662fdd58e336101408401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156119ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cf91906154b6565b821115611a1e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206170706c69636174696f6e2071747900000000000000000060448201526064016109e9565b60005b82811015611a6c57611a5a8286868685818110611a4057611a40615314565b9050602002016020810190611a5591906154ec565b613dd2565b80611a6481615507565b915050611a21565b50806080015115611b0d576006546001600160a01b031663f5298aca3361014084015160405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039092166004830152602482015260448101859052606401600060405180830381600087803b158015611af457600080fd5b505af1158015611b08573d6000803e3d6000fd5b505050505b50505050565b60065474010000000000000000000000000000000000000000900460ff16611b7d5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b6000611b888461398d565b336000908152600a6020908152604080832061ffff89168452909152902054909150821115611bf95760405162461bcd60e51b815260206004820152601660248201527f45786365656473206f776e6564207175616e746974790000000000000000000060448201526064016109e9565b60005b82811015611c2d57611c1b8286868685818110611a4057611a40615314565b80611c2581615507565b915050611bfc565b50806080015115611b0d57336000908152600a6020908152604080832061ffff8816845290915281208054849290610bad908490615540565b611c6f3361393c565b611cbb5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b60008261ffff16118015611cf3575060065461ffff760100000000000000000000000000000000000000000000909104811690831611155b611d3f5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964204974656d204964000000000000000000000000000000000060448201526064016109e9565b61ffff909116600090815260086020526040902080549115156901000000000000000000027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff909216919091179055565b6000546001600160a01b03163314611dea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e9565b611df46000614183565b565b60608060008367ffffffffffffffff811115611e1457611e14614ebc565b604051908082528060200260200182016040528015611e3d578160200160208202803683370190505b50905060008467ffffffffffffffff811115611e5b57611e5b614ebc565b604051908082528060200260200182016040528015611e84578160200160208202803683370190505b50905060005b85811015611f35576000878783818110611ea657611ea6615314565b9050602002013590508063ffffffff16848381518110611ec857611ec8615314565b60209081029190910181019190915260ff8b166000908152600d8252604080822063ffffffff85168352835280822061ffff8d16835290925220548351849084908110611f1757611f17615314565b60209081029190910101525080611f2d81615507565b915050611e8a565b509097909650945050505050565b600860209081526000918252604091829020805483518085018552600183015460ff818116151583526101009182900481161515838701528651608081018852600286015480831682529283048216151596810196909652620100009182900481161515968601969096526003840154606086015260048401805461ffff80861698938604811697640100000000870490911696660100000000000087048516966701000000000000008104861696680100000000000000008204871696690100000000000000000090920490911694909361201e90615557565b80601f016020809104026020016040519081016040528092919081815260200182805461204a90615557565b80156120975780601f1061206c57610100808354040283529160200191612097565b820191906000526020600020905b81548152906001019060200180831161207a57829003601f168201915b505050505090806005015490806006015490806007015490508d565b60006120be3361393c565b61210a5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b60068054601590612136907501000000000000000000000000000000000000000000900460ff166155a5565b825460ff8083166101009490940a84810291021990911617909255600090815260076020526040902080546001600160a01b039094167fffffffffffffffffffffffff0000000000000000000000000000000000000000909416939093179092555090565b60065474010000000000000000000000000000000000000000900460ff166122055760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b600061221287600261366b565b905061221f8782846137d1565b61222981836138dd565b612234818884613884565b61223e8585613d64565b6004546001600160a01b0316636cce000c873561225e60208a018a61537e565b61226b60408c018c61537e565b3361018089015161227c908b6153e3565b6040518863ffffffff1660e01b815260040161229e9796959493929190615469565b600060405180830381600087803b1580156122b857600080fd5b505af11580156122cc573d6000803e3d6000fd5b5050505061ffff8716600090815260096020526040812080548492906122f39084906152fc565b9091555061230490508784846141eb565b50505050505050565b6123163361393c565b6123625760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b80156123c0576006546001600160a01b03166123c05760405162461bcd60e51b815260206004820181905260248201527f41776f6f20636f6c6c656374696f6e20686173206e6f74206265656e2073657460448201526064016109e9565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60006124153361393c565b6124615760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b61246a83614233565b8260a0015115801561247f5750610140830151155b156125225760065460e08401516101208501516040517f4d451c070000000000000000000000000000000000000000000000000000000081526000936001600160a01b031692634d451c07926124d7926004016155c5565b6020604051808303816000875af11580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a91906154b6565b610140850152505b82600860006006601681819054906101000a900461ffff16612543906155ed565b825461ffff9182166101009390930a8381029083021990911617909255825260208083019390935260409182016000208451815494860151938601518316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff94841662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009096169190931617939093179182168117835560608401519183917fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff90911617660100000000000083600381111561264e5761264e614c58565b02179055506080820151815460a084015160c08501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff909216670100000000000000931515939093027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16929092176801000000000000000092151592909202919091177fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1669010000000000000000009115159190910217815560e082015180516001830180546020938401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009182169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169390931761010093151584021790915581850151805160028601805483870151604085015160ff9094169190951617931515909402929092177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000921515929092029190911790915560600151600383015561012083015180516127f492600485019201906147f8565b50610140820151600582015561016082015160068083019190915561018090920151600790910155805461ffff760100000000000000000000000000000000000000000000918290048116600090815260096020526040902085821690559154041690505b92915050565b61ffff82166000908152600c6020908152604080832060ff8516845282529182902080548351818402810184019094528084529260609290919084908301828280156128ca57602002820191906000526020600020905b8154815260200190600101908083116128b6575b505050505090509250929050565b60065474010000000000000000000000000000000000000000900460ff166129425760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b80600081116129935760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b600061299e8461398d565b90508060c001516129f15760405162461bcd60e51b815260206004820152600d60248201527f496e616374697665206974656d0000000000000000000000000000000000000060448201526064016109e9565b336000908152600a6020908152604080832061ffff88168452909152902054831115612a5f5760405162461bcd60e51b815260206004820152601660248201527f45786365656473206f776e6564207175616e746974790000000000000000000060448201526064016109e9565b806080015115612a9d57336000908152600a6020908152604080832061ffff8816845290915281208054859290612a97908490615540565b90915550505b7fc68ba7141922ca20ef9c8258cf01daf81a40fc9c6333c4489bd9a9bfcfcfa5888433611611565b612ace3361393c565b612b1a5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b612b2381614233565b6000612b2e8361398d565b90508160a0015115158160a00151151514612b8b5760405162461bcd60e51b815260206004820152601e60248201527f4974656d206d696e746162696c6974792063616e6e6f74206368616e6765000060448201526064016109e9565b612b958184613c8c565b825161ffff161115612be95760405162461bcd60e51b815260206004820181905260248201527f546f74616c206578636565647320617661696c61626c65207175616e7469747960448201526064016109e9565b8060a00151612d9857610140808201519083015261012080820151519083015151141580612c6d5750806101200151604051602001612c28919061560f565b60405160208183030381529060405280519060200120826101200151604051602001612c54919061560f565b6040516020818303038152906040528051906020012014155b15612cfa576006546101408201516101208401516040517f57f7789e0000000000000000000000000000000000000000000000000000000081526001600160a01b03909316926357f7789e92612cc792909160040161562b565b600060405180830381600087803b158015612ce157600080fd5b505af1158015612cf5573d6000803e3d6000fd5b505050505b8060c0015115158260c00151151514612d985760065461014082015160c08401516040517fffc54ea40000000000000000000000000000000000000000000000000000000081526004810192909252151560248201526001600160a01b039091169063ffc54ea490604401600060405180830381600087803b158015612d7f57600080fd5b505af1158015612d93573d6000803e3d6000fd5b505050505b61ffff8084166000908152600860209081526040918290208551815492870151938701518516640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff94861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090941691909516179190911791821683178155606085015185939192909183917fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff9091167fffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff909116176601000000000000836003811115612e9257612e92614c58565b02179055506080820151815460a084015160c08501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff909216670100000000000000931515939093027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16929092176801000000000000000092151592909202919091177fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1669010000000000000000009115159190910217815560e082015180516001830180546020938401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009182169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169390931761010093151584021790915581850151805160028601805483870151604085015160ff9094169190951617931515909402929092177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100009215159290920291909117909155606001516003830155610120830151805161303892600485019201906147f8565b506101408201516005820155610160820151600682015561018090910151600790910155505050565b61306a3361393c565b6130b65760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600c602052826000526040600020602052816000526040600020818154811061311857600080fd5b9060005260206000200160009250925050505481565b60065474010000000000000000000000000000000000000000900460ff166131985760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b83600081116131e95760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b60006131f687600061366b565b90506132038782886137d1565b61320e818888613884565b6132188484613d64565b6004546001600160a01b0316636cce000c8635613238602089018961537e565b61324560408b018b61537e565b33610180890151613256908f6153e3565b6040518863ffffffff1660e01b81526004016132789796959493929190615469565b600060405180830381600087803b15801561329257600080fd5b505af11580156132a6573d6000803e3d6000fd5b5050505061ffff8716600090815260096020526040812080548892906132cd9084906152fc565b9091555050336000908152600a6020908152604080832061ffff8b168452909152812080548892906133009084906152fc565b90915550506040805161ffff8916815233602082015280820188905290517f2f9a7de3ca4aab8e8af63604a57dc780bc4f02cc676ca60829584a081630d4f79181900360600190a150505050505050565b60065474010000000000000000000000000000000000000000900460ff166133bb5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b60006133c887600061366b565b90506122298782846137d1565b60065474010000000000000000000000000000000000000000900460ff1661343f5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b600061344c84600161366b565b90506134598482846137d1565b61346381836138dd565b61346e818584613884565b61ffff8416600090815260096020526040812080548492906134919084906152fc565b90915550611b0d90508484846141eb565b60065474010000000000000000000000000000000000000000900460ff1661350c5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b836000811161355d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b600061356a87600261366b565b90506135778782886137d1565b613582818888613884565b61320e81876138dd565b6000546001600160a01b031633146135e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e9565b6001600160a01b0381166136625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109e9565b610e2c81614183565b604080516101a081018252600080825260208083018290528284018290526060808401839052608080850184905260a0850184905260c085018490528551808701875284815280840185905260e086015285519081018652838152918201839052938101829052808401829052610100830152610120820192909252610140810182905261016081018290526101808101919091526137098361398d565b90508060c0015161375c5760405162461bcd60e51b815260206004820152600d60248201527f496e616374697665206974656d0000000000000000000000000000000000000060448201526064016109e9565b81600381111561376e5761376e614c58565b8160600151600381111561378457613784614c58565b146128595760405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964206974656d20666f72207061796d656e74207479706500000060448201526064016109e9565b6137db82826146a2565b6138275760405162461bcd60e51b815260206004820152601960248201527f45786365656473207472616e73616374696f6e206c696d69740000000000000060448201526064016109e9565b613833838383336146ce565b61387f5760405162461bcd60e51b815260206004820152601560248201527f457863656564732061646472657373206c696d6974000000000000000000000060448201526064016109e9565b505050565b61388e8383613c8c565b81111561387f5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320617661696c61626c65207175616e7469747900000000000060448201526064016109e9565b808261016001516138ee91906153e3565b34146114a35760405162461bcd60e51b815260206004820152601060248201527f496e636f727265637420616d6f756e740000000000000000000000000000000060448201526064016109e9565b600080546001600160a01b0383811691161480612859575060035460ff16801561285957506001546001600160a01b03838116911614806128595750506002546001600160a01b0390811691161490565b604080516101a081018252600080825260208083018290528284018290526060808401839052608080850184905260a0850184905260c085018490528551808701875284815280840185905260e0860152855190810186528381529182018390529381018290528084018290526101008301526101208201929092526101408101829052610160810182905261018081019190915260065461ffff76010000000000000000000000000000000000000000000090910481169083161115613a965760405162461bcd60e51b815260206004820152600e60248201527f496e76616c6964206974656d496400000000000000000000000000000000000060448201526064016109e9565b61ffff82811660009081526008602090815260409182902082516101a0810184528154808616825262010000810486169382019390935264010000000083049094169284019290925260608301906601000000000000900460ff166003811115613b0257613b02614c58565b6003811115613b1357613b13614c58565b8152815460ff6701000000000000008204811615156020808501919091526801000000000000000083048216151560408086019190915269010000000000000000009093048216151560608086019190915283518085018552600187015480851615158252610100908190048516151582850152608080880192909252855191820186526002880154808616835290810485161515938201939093526201000090920490921615159281019290925260038401549082015260a082015260048201805460c090920191613be590615557565b80601f0160208091040260200160405190810160405280929190818152602001828054613c1190615557565b8015613c5e5780601f10613c3357610100808354040283529160200191613c5e565b820191906000526020600020905b815481529060010190602001808311613c4157829003601f168201915b5050505050815260200160058201548152602001600682015481526020016007820154815250509050919050565b6000808360a00151613d2d576006546101408501516040517f9d7f4ebf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691639d7f4ebf91613ce99160040190815260200190565b602060405180830381865afa158015613d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d2a91906154b6565b90505b61ffff80841660009081526009602052604090205485519091613d5291849116615540565b613d5c9190615540565b949350505050565b80156114a3576005546001600160a01b031663070ffee33384846040518463ffffffff1660e01b8152600401613d9c93929190615644565b600060405180830381600087803b158015613db657600080fd5b505af1158015613dca573d6000803e3d6000fd5b505050505050565b82610100015160200151613e285760405162461bcd60e51b815260206004820152601660248201527f4974656d2063616e6e6f74206265206170706c6965640000000000000000000060448201526064016109e9565b8260c00151613e795760405162461bcd60e51b815260206004820152600d60248201527f496e616374697665206974656d0000000000000000000000000000000000000060448201526064016109e9565b6101008301515160ff16600090815260076020526040908190205490517f6352211e00000000000000000000000000000000000000000000000000000000815263ffffffff831660048201526001600160a01b03909116908190636352211e90602401602060405180830381865afa158015613ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f1d91906157b4565b6001600160a01b0316336001600160a01b031614613f7d5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206170706c69636174696f6e20746f6b656e4964000000000060448201526064016109e9565b8361010001516040015161400e576101008401515160ff166000908152600d6020908152604080832063ffffffff86168452825280832061ffff871684529091529020541561400e5760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d20616c7265616479206170706c696564000060448201526064016109e9565b61010084015160600151156140b357600554610100850151606001516040517f88730d1e0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015263ffffffff8616602483015260448201929092529116906388730d1e90606401600060405180830381600087803b15801561409a57600080fd5b505af11580156140ae573d6000803e3d6000fd5b505050505b6101008401515160ff166000908152600d6020908152604080832063ffffffff86168452825280832061ffff8716845290915281208054600192906140f99084906152fc565b909155505061ffff83166000818152600c602090815260408083206101008901515160ff168452825280832080546001810182559084529282902063ffffffff8716930183905580519384526001600160a01b038516918401919091528201527f44c309fb21ce6956879f0e32aac00d6b2949bddf851b0e1e6255a019c60d522f90606001611636565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006141f68461398d565b905060005b8281101561422c5761421a8286868685818110611a4057611a40615314565b8061422481615507565b9150506141fb565b5050505050565b805161ffff166142855760405162461bcd60e51b815260206004820152601e60248201527f546f74616c20617661696c61626c652063616e6e6f74206265207a65726f000060448201526064016109e9565b8061010001516040015180156142a35750806020015161ffff166001145b156142f05760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207065722d61646472657373206c696d69740000000000000060448201526064016109e9565b8060a0015161434f576000816101200151511161434f5760405162461bcd60e51b815260206004820152601c60248201527f4974656d2072657175697265732061206d65746164617461207572690000000060448201526064016109e9565b80610100015160200151156143db576006546101008201515160ff75010000000000000000000000000000000000000000009092048216911611156143d65760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206170706c696361626c65436f6c6c656374696f6e4964000060448201526064016109e9565b614432565b6101008101515160ff16156144325760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206170706c696361626c65436f6c6c656374696f6e4964000060448201526064016109e9565b60018160600151600381111561444a5761444a614c58565b14156144f8576000816101600151116144a55760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642065746865722070726963650000000000000000000000000060448201526064016109e9565b61018081015115610e2c5760405162461bcd60e51b815260206004820152601260248201527f496e76616c69642041574f4f207072696365000000000000000000000000000060448201526064016109e9565b60008160600151600381111561451057614510614c58565b14156145e757610160810151156145695760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642065746865722070726963650000000000000000000000000060448201526064016109e9565b670de0b6b3a764000081610180015161458291906157d1565b61459490670de0b6b3a76400006153e3565b81610180015114610e2c5760405162461bcd60e51b815260206004820152601260248201527f496e76616c69642041574f4f207072696365000000000000000000000000000060448201526064016109e9565b6002816060015160038111156145ff576145ff614c58565b141561465a576000816101600151116145695760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642065746865722070726963650000000000000000000000000060448201526064016109e9565b60405162461bcd60e51b815260206004820152601460248201527f4e6f7420696d706c656d656e7465642c2079657400000000000000000000000060448201526064016109e9565b604082015160009061ffff16156146c55750604082015161ffff16811115612859565b50600192915050565b602083015160009061ffff161561477f5760008460a00151614736576001600160a01b0383166000818152600b6020908152604080832061ffff8b1680855290835281842054948452600a835281842090845290915290205461473191906152fc565b61475f565b6001600160a01b0383166000908152600a6020908152604080832061ffff8a1684529091529020545b602086015190915061ffff1661477585836152fc565b1115915050613d5c565b506001949350505050565b82600281019282156147e8579160200282015b828111156147e85781547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384351617825560209092019160019091019061479d565b506147f492915061486c565b5090565b82805461480490615557565b90600052602060002090601f01602090048101928261482657600085556147e8565b82601f1061483f57805160ff19168380011785556147e8565b828001600101855582156147e8579182015b828111156147e8578251825591602001919060010190614851565b5b808211156147f4576000815560010161486d565b803561ffff8116811461489357600080fd5b919050565b600080604083850312156148ab57600080fd5b6148b483614881565b946020939093013593505050565b6000604082840312156148d457600080fd5b826040830111156148e457600080fd5b50919050565b803560ff8116811461489357600080fd5b60006020828403121561490d57600080fd5b610e47826148ea565b6001600160a01b0381168114610e2c57600080fd5b60006020828403121561493d57600080fd5b8135610e4781614916565b60006020828403121561495a57600080fd5b5035919050565b60006020828403121561497357600080fd5b610e4782614881565b6000606082840312156148e457600080fd5b60008083601f8401126149a057600080fd5b50813567ffffffffffffffff8111156149b857600080fd5b6020830191508360208260051b85010111156149d357600080fd5b9250929050565b6000806000806000608086880312156149f257600080fd5b6149fb86614881565b945060208601359350604086013567ffffffffffffffff80821115614a1f57600080fd5b614a2b89838a0161497c565b94506060880135915080821115614a4157600080fd5b50614a4e8882890161498e565b969995985093965092949392505050565b60008060408385031215614a7257600080fd5b8235614a7d81614916565b9150614a8b60208401614881565b90509250929050565b600080600060408486031215614aa957600080fd5b614ab284614881565b9250602084013567ffffffffffffffff811115614ace57600080fd5b614ada8682870161498e565b9497909650939450505050565b803563ffffffff8116811461489357600080fd5b600080600060608486031215614b1057600080fd5b614b19846148ea565b9250614b2760208501614ae7565b9150614b3560408501614881565b90509250925092565b8015158114610e2c57600080fd5b803561489381614b3e565b60008060408385031215614b6a57600080fd5b614b7383614881565b91506020830135614b8381614b3e565b809150509250929050565b60008060008060608587031215614ba457600080fd5b614bad856148ea565b9350614bbb60208601614881565b9250604085013567ffffffffffffffff811115614bd757600080fd5b614be38782880161498e565b95989497509550505050565b600081518084526020808501945080840160005b83811015614c1f57815187529582019590820190600101614c03565b509495945050505050565b604081526000614c3d6040830185614bef565b8281036020840152614c4f8185614bef565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60005b83811015614ca2578181015183820152602001614c8a565b83811115611b0d5750506000910152565b60008151808452614ccb816020860160208601614c87565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b61ffff8e16815261ffff8d16602082015261ffff8c166040820152600060048c10614d51577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8b6060830152614d65608083018c15159052565b89151560a083015288151560c08301528751151560e083015260208801511515610100830152865160ff16610120830152602087015115156101408301526040870151151561016083015260608701516101808301526102206101a0830152614dd2610220830187614cb3565b6101c0830195909552506101e0810192909252610200909101529a9950505050505050505050565b60008060008060008060808789031215614e1357600080fd5b614e1c87614881565b9550602087013567ffffffffffffffff80821115614e3957600080fd5b614e458a838b0161497c565b96506040890135915080821115614e5b57600080fd5b614e678a838b0161498e565b90965094506060890135915080821115614e8057600080fd5b50614e8d89828a0161498e565b979a9699509497509295939492505050565b600060208284031215614eb157600080fd5b8135610e4781614b3e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614f0f57614f0f614ebc565b60405290565b80356004811061489357600080fd5b600060408284031215614f3657600080fd5b6040516040810181811067ffffffffffffffff82111715614f5957614f59614ebc565b6040529050808235614f6a81614b3e565b81526020830135614f7a81614b3e565b6020919091015292915050565b600060808284031215614f9957600080fd5b6040516080810181811067ffffffffffffffff82111715614fbc57614fbc614ebc565b604052905080614fcb836148ea565b81526020830135614fdb81614b3e565b60208201526040830135614fee81614b3e565b6040820152606092830135920191909152919050565b600082601f83011261501557600080fd5b813567ffffffffffffffff8082111561503057615030614ebc565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561507657615076614ebc565b8160405283815286602085880101111561508f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061022082840312156150c257600080fd5b6150ca614eeb565b90506150d582614881565b81526150e360208301614881565b60208201526150f460408301614881565b604082015261510560608301614f15565b606082015261511660808301614b4c565b608082015261512760a08301614b4c565b60a082015261513860c08301614b4c565b60c082015261514a8360e08401614f24565b60e082015261012061515e84828501614f87565b6101008301526101a083013567ffffffffffffffff81111561517f57600080fd5b61518b85828601615004565b8284015250506101c08201356101408201526101e082013561016082015261020082013561018082015292915050565b600080604083850312156151ce57600080fd5b823567ffffffffffffffff8111156151e557600080fd5b6151f1858286016150af565b925050614a8b60208401614881565b6000806040838503121561521357600080fd5b61521c83614881565b9150614a8b602084016148ea565b828152604060208201526000613d5c6040830184614bef565b6000806040838503121561525657600080fd5b61525f83614881565b9150602083013567ffffffffffffffff81111561527b57600080fd5b615287858286016150af565b9150509250929050565b6000806000606084860312156152a657600080fd5b6152af84614881565b92506152bd602085016148ea565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561530f5761530f6152cd565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff821680615356576153566152cd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126153b357600080fd5b83018035915067ffffffffffffffff8211156153ce57600080fd5b6020019150368190038213156149d357600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561541b5761541b6152cd565b500290565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815260a06020820152600061548360a08301888a615420565b8281036040840152615496818789615420565b6001600160a01b0395909516606084015250506080015295945050505050565b6000602082840312156154c857600080fd5b5051919050565b6000602082840312156154e157600080fd5b8151610e4781614b3e565b6000602082840312156154fe57600080fd5b610e4782614ae7565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615539576155396152cd565b5060010190565b600082821015615552576155526152cd565b500390565b600181811c9082168061556b57607f821691505b602082108114156148e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060ff821660ff8114156155bc576155bc6152cd565b60010192915050565b825115158152602080840151151590820152606060408201526000613d5c6060830184614cb3565b600061ffff80831681811415615605576156056152cd565b6001019392505050565b60008251615621818460208701614c87565b9190910192915050565b828152604060208201526000613d5c6040830184614cb3565b6001600160a01b03848116825260406020808401829052838201859052600092606091828601600588811b880185018a885b8b8110156157a2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b840301855281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18e36030181126156d757600080fd5b8d01838a0181356156e781614916565b8916855281880135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261572057600080fd5b8201803567ffffffffffffffff81111561573957600080fd5b80881b360384131561574a57600080fd5b868a018d9052918290528a860192508801906000905b8082101561578d5763ffffffff61577684614ae7565b168452928901929189019160019190910190615760565b50505094860194925090850190600101615676565b50909c9b505050505050505050505050565b6000602082840312156157c657600080fd5b8151610e4781614916565b600082615807577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220b90355c79836f90542d0c8d33752921b152610b8194df56cbf80d2a34371348e64736f6c634300080c00330000000000000000000000005e697c6f5cbebd6ca17bde80d684c226a1e223be000000000000000000000000ffe844169bfc6da1b87c9157f684e18e7f1663ad00000000000000000000000045b959c5409b780bbdccd7c090038038093fcb0d
Deployed Bytecode
0x6080604052600436106102f25760003560e01c80636bfb0d011161018f578063c6a03067116100e1578063e4b064bc1161008a578063f2fde38b11610064578063f2fde38b146108fe578063f4aabcaa1461091e578063f563d82e1461094b57600080fd5b8063e4b064bc146108b8578063ebd0f2b7146108d8578063eddf7586146108eb57600080fd5b8063d57f966b116100bb578063d57f966b14610845578063d684dbd814610878578063d7f0cbdc1461089857600080fd5b8063c6a03067146107e5578063c71ab3c514610805578063d22a092a1461082557600080fd5b8063a174e77a11610143578063b76b39a41161011d578063b76b39a414610777578063bb1e3a6314610797578063bc1f793f146107c557600080fd5b8063a174e77a14610712578063a235ea2714610744578063acec338a1461075757600080fd5b80638bbf9ef6116101745780638bbf9ef61461068d5780638da5cb5b146106bb5780639ab19977146106d957600080fd5b80636bfb0d0114610630578063715018a61461067857600080fd5b80633218d7bb1161024857806347f2e27a116101fc5780635ce628b0116101d65780635ce628b0146105b25780635f3002ba146105f057806361700ef31461061057600080fd5b806347f2e27a1461053d5780634fcd3a711461057f5780635433d3501461059257600080fd5b8063397089051161022d57806339708905146104d25780633ab1a494146104e5578063405402c21461050557600080fd5b80633218d7bb1461049257806336bd4b4a146104b257600080fd5b806320be2759116102aa5780632f531568116102845780632f531568146104245780632fcc503b1461045257806330c8d9df1461047257600080fd5b806320be2759146103c457806325609d6f146103e45780632e1a7d4d1461040457600080fd5b80630d9014e7116102db5780630d9014e71461032c5780631581b6001461037f57806315e32e08146103a457600080fd5b80630604c672146102f75780630a6f94fc1461030c575b600080fd5b61030a610305366004614898565b610983565b005b34801561031857600080fd5b5061030a6103273660046148c2565b610bb8565b34801561033857600080fd5b506103626103473660046148fb565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561038b57600080fd5b506003546103629061010090046001600160a01b031681565b3480156103b057600080fd5b5061030a6103bf36600461492b565b610c7f565b3480156103d057600080fd5b50600454610362906001600160a01b031681565b3480156103f057600080fd5b50600554610362906001600160a01b031681565b34801561041057600080fd5b5061030a61041f366004614948565b610d0e565b34801561043057600080fd5b5061044461043f366004614961565b610e2f565b604051908152602001610376565b34801561045e57600080fd5b5061030a61046d3660046148fb565b610e4e565b34801561047e57600080fd5b5061030a61048d36600461492b565b610f96565b34801561049e57600080fd5b5061030a6104ad3660046149da565b611025565b3480156104be57600080fd5b5061030a6104cd36600461492b565b6112ec565b61030a6104e0366004614898565b6114a7565b3480156104f157600080fd5b5061030a61050036600461492b565b611644565b34801561051157600080fd5b50610444610520366004614a5f565b600a60209081526000928352604080842090915290825290205481565b34801561054957600080fd5b5060065461056f9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610376565b61030a61058d3660046149da565b61172e565b34801561059e57600080fd5b5061030a6105ad366004614a94565b61186a565b3480156105be57600080fd5b506104446105cd366004614afb565b600d60209081526000938452604080852082529284528284209052825290205481565b3480156105fc57600080fd5b5061030a61060b366004614a94565b611b13565b34801561061c57600080fd5b5061030a61062b366004614b57565b611c66565b34801561063c57600080fd5b5060065461066590760100000000000000000000000000000000000000000000900461ffff1681565b60405161ffff9091168152602001610376565b34801561068457600080fd5b5061030a611d90565b34801561069957600080fd5b506106ad6106a8366004614b8e565b611df6565b604051610376929190614c2a565b3480156106c757600080fd5b506000546001600160a01b0316610362565b3480156106e557600080fd5b506106f96106f4366004614961565b611f43565b6040516103769d9c9b9a99989796959493929190614cfd565b34801561071e57600080fd5b5061073261072d36600461492b565b6120b3565b60405160ff9091168152602001610376565b61030a610752366004614dfa565b61219b565b34801561076357600080fd5b5061030a610772366004614e9f565b61230d565b34801561078357600080fd5b506106656107923660046151bb565b61240a565b3480156107a357600080fd5b506107b76107b2366004615200565b61285f565b60405161037692919061522a565b3480156107d157600080fd5b5061030a6107e0366004614898565b6128d8565b3480156107f157600080fd5b5061030a610800366004615243565b612ac5565b34801561081157600080fd5b5061030a61082036600461492b565b613061565b34801561083157600080fd5b50610444610840366004615291565b6130f0565b34801561085157600080fd5b50600654610732907501000000000000000000000000000000000000000000900460ff1681565b34801561088457600080fd5b5061030a6108933660046149da565b61312e565b3480156108a457600080fd5b50600654610362906001600160a01b031681565b3480156108c457600080fd5b5061030a6108d3366004614dfa565b613351565b61030a6108e6366004614a94565b6133d5565b61030a6108f93660046149da565b6134a2565b34801561090a57600080fd5b5061030a61091936600461492b565b61358c565b34801561092a57600080fd5b50610444610939366004614961565b60096020526000908152604090205481565b34801561095757600080fd5b50610444610966366004614a5f565b600b60209081526000928352604080842090915290825290205481565b60065474010000000000000000000000000000000000000000900460ff166109f25760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064015b60405180910390fd5b8060008111610a435760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b6000610a5084600161366b565b90508060a0015115610aa45760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c65000060448201526064016109e9565b610aaf8482856137d1565b610aba818585613884565b610ac481846138dd565b6006546001600160a01b031663156e29f6336101408401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260448101869052606401600060405180830381600087803b158015610b4157600080fd5b505af1158015610b55573d6000803e3d6000fd5b5050505082600b6000610b653390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008661ffff1661ffff1681526020019081526020016000206000828254610bad91906152fc565b909155505050505050565b6000610bc7602083018361492b565b6001600160a01b031614158015610bf757506000610beb604083016020840161492b565b6001600160a01b031614155b610c435760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e2061646472657373000000000000000000000060448201526064016109e9565b610c50600182600261478a565b5050600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610c883361393c565b610cd45760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610d173361393c565b610d635760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b47811115610db35760405162461bcd60e51b815260206004820152601660248201527f416d6f756e7420657863656564732062616c616e63650000000000000000000060448201526064016109e9565b6003546040516101009091046001600160a01b0316906108fc8315029083906000818181858888f19350505050610e2c5760405162461bcd60e51b815260206004820152600e60248201527f53656e64696e67206661696c656400000000000000000000000000000000000060448201526064016109e9565b50565b600080610e3b8361398d565b9050610e478184613c8c565b9392505050565b610e573361393c565b610ea35760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b60065460ff750100000000000000000000000000000000000000000090910481169082161115610f155760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420636f6c6c656374696f6e496400000000000000000000000060448201526064016109e9565b60ff808216600090815260076020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556006805475010000000000000000000000000000000000000000009004909116906015610f7a83615343565b91906101000a81548160ff021916908360ff1602179055505050565b610f9f3361393c565b610feb5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60065474010000000000000000000000000000000000000000900460ff1661108f5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b83600081116110e05760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b60006110ed87600061366b565b90508060a00151156111415760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c65000060448201526064016109e9565b61114c8782886137d1565b611157818888613884565b6111618484613d64565b6004546001600160a01b0316636cce000c8635611181602089018961537e565b61118e60408b018b61537e565b3361018089015161119f908f6153e3565b6040518863ffffffff1660e01b81526004016111c19796959493929190615469565b600060405180830381600087803b1580156111db57600080fd5b505af11580156111ef573d6000803e3d6000fd5b50506006546001600160a01b0316915063156e29f69050336101408401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260448101899052606401600060405180830381600087803b15801561127257600080fd5b505af1158015611286573d6000803e3d6000fd5b5050505085600b60006112963390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008961ffff1661ffff16815260200190815260200160002060008282546112de91906152fc565b909155505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561134c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137091906154b6565b9050600081116113c25760405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420686173206e6f2062616c616e636500000000000000000060448201526064016109e9565b6003546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b0390811660048301526024820183905283169063a9059cbb906044016020604051808303816000875af1158015611433573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145791906154cf565b6114a35760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016109e9565b5050565b60065474010000000000000000000000000000000000000000900460ff166115115760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b80600081116115625760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b600061156f84600161366b565b905061157c8482856137d1565b611587818585613884565b61159181846138dd565b61ffff8416600090815260096020526040812080548592906115b49084906152fc565b9091555050336000908152600a6020908152604080832061ffff88168452909152812080548592906115e79084906152fc565b909155507f2f9a7de3ca4aab8e8af63604a57dc780bc4f02cc676ca60829584a081630d4f7905084335b6040805161ffff90931683526001600160a01b03909116602083015281018590526060015b60405180910390a150505050565b61164d3361393c565b6116995760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b6001600160a01b0381166116ef5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642061646472657373000000000000000000000000000000000060448201526064016109e9565b600380546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b60065474010000000000000000000000000000000000000000900460ff166117985760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b83600081116117e95760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b60006117f687600261366b565b90508060a001511561184a5760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c65000060448201526064016109e9565b6118558782886137d1565b611860818888613884565b61115781876138dd565b60065474010000000000000000000000000000000000000000900460ff166118d45760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b60006118df8461398d565b90508060a00151156119335760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d206973206e6f74206d696e7461626c65000060448201526064016109e9565b6006546001600160a01b031662fdd58e336101408401516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156119ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cf91906154b6565b821115611a1e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206170706c69636174696f6e2071747900000000000000000060448201526064016109e9565b60005b82811015611a6c57611a5a8286868685818110611a4057611a40615314565b9050602002016020810190611a5591906154ec565b613dd2565b80611a6481615507565b915050611a21565b50806080015115611b0d576006546001600160a01b031663f5298aca3361014084015160405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039092166004830152602482015260448101859052606401600060405180830381600087803b158015611af457600080fd5b505af1158015611b08573d6000803e3d6000fd5b505050505b50505050565b60065474010000000000000000000000000000000000000000900460ff16611b7d5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b6000611b888461398d565b336000908152600a6020908152604080832061ffff89168452909152902054909150821115611bf95760405162461bcd60e51b815260206004820152601660248201527f45786365656473206f776e6564207175616e746974790000000000000000000060448201526064016109e9565b60005b82811015611c2d57611c1b8286868685818110611a4057611a40615314565b80611c2581615507565b915050611bfc565b50806080015115611b0d57336000908152600a6020908152604080832061ffff8816845290915281208054849290610bad908490615540565b611c6f3361393c565b611cbb5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b60008261ffff16118015611cf3575060065461ffff760100000000000000000000000000000000000000000000909104811690831611155b611d3f5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964204974656d204964000000000000000000000000000000000060448201526064016109e9565b61ffff909116600090815260086020526040902080549115156901000000000000000000027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff909216919091179055565b6000546001600160a01b03163314611dea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e9565b611df46000614183565b565b60608060008367ffffffffffffffff811115611e1457611e14614ebc565b604051908082528060200260200182016040528015611e3d578160200160208202803683370190505b50905060008467ffffffffffffffff811115611e5b57611e5b614ebc565b604051908082528060200260200182016040528015611e84578160200160208202803683370190505b50905060005b85811015611f35576000878783818110611ea657611ea6615314565b9050602002013590508063ffffffff16848381518110611ec857611ec8615314565b60209081029190910181019190915260ff8b166000908152600d8252604080822063ffffffff85168352835280822061ffff8d16835290925220548351849084908110611f1757611f17615314565b60209081029190910101525080611f2d81615507565b915050611e8a565b509097909650945050505050565b600860209081526000918252604091829020805483518085018552600183015460ff818116151583526101009182900481161515838701528651608081018852600286015480831682529283048216151596810196909652620100009182900481161515968601969096526003840154606086015260048401805461ffff80861698938604811697640100000000870490911696660100000000000087048516966701000000000000008104861696680100000000000000008204871696690100000000000000000090920490911694909361201e90615557565b80601f016020809104026020016040519081016040528092919081815260200182805461204a90615557565b80156120975780601f1061206c57610100808354040283529160200191612097565b820191906000526020600020905b81548152906001019060200180831161207a57829003601f168201915b505050505090806005015490806006015490806007015490508d565b60006120be3361393c565b61210a5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b60068054601590612136907501000000000000000000000000000000000000000000900460ff166155a5565b825460ff8083166101009490940a84810291021990911617909255600090815260076020526040902080546001600160a01b039094167fffffffffffffffffffffffff0000000000000000000000000000000000000000909416939093179092555090565b60065474010000000000000000000000000000000000000000900460ff166122055760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b600061221287600261366b565b905061221f8782846137d1565b61222981836138dd565b612234818884613884565b61223e8585613d64565b6004546001600160a01b0316636cce000c873561225e60208a018a61537e565b61226b60408c018c61537e565b3361018089015161227c908b6153e3565b6040518863ffffffff1660e01b815260040161229e9796959493929190615469565b600060405180830381600087803b1580156122b857600080fd5b505af11580156122cc573d6000803e3d6000fd5b5050505061ffff8716600090815260096020526040812080548492906122f39084906152fc565b9091555061230490508784846141eb565b50505050505050565b6123163361393c565b6123625760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b80156123c0576006546001600160a01b03166123c05760405162461bcd60e51b815260206004820181905260248201527f41776f6f20636f6c6c656374696f6e20686173206e6f74206265656e2073657460448201526064016109e9565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60006124153361393c565b6124615760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b61246a83614233565b8260a0015115801561247f5750610140830151155b156125225760065460e08401516101208501516040517f4d451c070000000000000000000000000000000000000000000000000000000081526000936001600160a01b031692634d451c07926124d7926004016155c5565b6020604051808303816000875af11580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a91906154b6565b610140850152505b82600860006006601681819054906101000a900461ffff16612543906155ed565b825461ffff9182166101009390930a8381029083021990911617909255825260208083019390935260409182016000208451815494860151938601518316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff94841662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009096169190931617939093179182168117835560608401519183917fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff90911617660100000000000083600381111561264e5761264e614c58565b02179055506080820151815460a084015160c08501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff909216670100000000000000931515939093027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16929092176801000000000000000092151592909202919091177fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1669010000000000000000009115159190910217815560e082015180516001830180546020938401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009182169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169390931761010093151584021790915581850151805160028601805483870151604085015160ff9094169190951617931515909402929092177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000921515929092029190911790915560600151600383015561012083015180516127f492600485019201906147f8565b50610140820151600582015561016082015160068083019190915561018090920151600790910155805461ffff760100000000000000000000000000000000000000000000918290048116600090815260096020526040902085821690559154041690505b92915050565b61ffff82166000908152600c6020908152604080832060ff8516845282529182902080548351818402810184019094528084529260609290919084908301828280156128ca57602002820191906000526020600020905b8154815260200190600101908083116128b6575b505050505090509250929050565b60065474010000000000000000000000000000000000000000900460ff166129425760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b80600081116129935760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b600061299e8461398d565b90508060c001516129f15760405162461bcd60e51b815260206004820152600d60248201527f496e616374697665206974656d0000000000000000000000000000000000000060448201526064016109e9565b336000908152600a6020908152604080832061ffff88168452909152902054831115612a5f5760405162461bcd60e51b815260206004820152601660248201527f45786365656473206f776e6564207175616e746974790000000000000000000060448201526064016109e9565b806080015115612a9d57336000908152600a6020908152604080832061ffff8816845290915281208054859290612a97908490615540565b90915550505b7fc68ba7141922ca20ef9c8258cf01daf81a40fc9c6333c4489bd9a9bfcfcfa5888433611611565b612ace3361393c565b612b1a5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b612b2381614233565b6000612b2e8361398d565b90508160a0015115158160a00151151514612b8b5760405162461bcd60e51b815260206004820152601e60248201527f4974656d206d696e746162696c6974792063616e6e6f74206368616e6765000060448201526064016109e9565b612b958184613c8c565b825161ffff161115612be95760405162461bcd60e51b815260206004820181905260248201527f546f74616c206578636565647320617661696c61626c65207175616e7469747960448201526064016109e9565b8060a00151612d9857610140808201519083015261012080820151519083015151141580612c6d5750806101200151604051602001612c28919061560f565b60405160208183030381529060405280519060200120826101200151604051602001612c54919061560f565b6040516020818303038152906040528051906020012014155b15612cfa576006546101408201516101208401516040517f57f7789e0000000000000000000000000000000000000000000000000000000081526001600160a01b03909316926357f7789e92612cc792909160040161562b565b600060405180830381600087803b158015612ce157600080fd5b505af1158015612cf5573d6000803e3d6000fd5b505050505b8060c0015115158260c00151151514612d985760065461014082015160c08401516040517fffc54ea40000000000000000000000000000000000000000000000000000000081526004810192909252151560248201526001600160a01b039091169063ffc54ea490604401600060405180830381600087803b158015612d7f57600080fd5b505af1158015612d93573d6000803e3d6000fd5b505050505b61ffff8084166000908152600860209081526040918290208551815492870151938701518516640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff94861662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090941691909516179190911791821683178155606085015185939192909183917fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff9091167fffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff909116176601000000000000836003811115612e9257612e92614c58565b02179055506080820151815460a084015160c08501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff909216670100000000000000931515939093027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16929092176801000000000000000092151592909202919091177fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1669010000000000000000009115159190910217815560e082015180516001830180546020938401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009182169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169390931761010093151584021790915581850151805160028601805483870151604085015160ff9094169190951617931515909402929092177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100009215159290920291909117909155606001516003830155610120830151805161303892600485019201906147f8565b506101408201516005820155610160820151600682015561018090910151600790910155505050565b61306a3361393c565b6130b65760405162461bcd60e51b815260206004820152601560248201527f4e6f7420616e206f776e6572206f722061646d696e000000000000000000000060448201526064016109e9565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600c602052826000526040600020602052816000526040600020818154811061311857600080fd5b9060005260206000200160009250925050505481565b60065474010000000000000000000000000000000000000000900460ff166131985760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b83600081116131e95760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b60006131f687600061366b565b90506132038782886137d1565b61320e818888613884565b6132188484613d64565b6004546001600160a01b0316636cce000c8635613238602089018961537e565b61324560408b018b61537e565b33610180890151613256908f6153e3565b6040518863ffffffff1660e01b81526004016132789796959493929190615469565b600060405180830381600087803b15801561329257600080fd5b505af11580156132a6573d6000803e3d6000fd5b5050505061ffff8716600090815260096020526040812080548892906132cd9084906152fc565b9091555050336000908152600a6020908152604080832061ffff8b168452909152812080548892906133009084906152fc565b90915550506040805161ffff8916815233602082015280820188905290517f2f9a7de3ca4aab8e8af63604a57dc780bc4f02cc676ca60829584a081630d4f79181900360600190a150505050505050565b60065474010000000000000000000000000000000000000000900460ff166133bb5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b60006133c887600061366b565b90506122298782846137d1565b60065474010000000000000000000000000000000000000000900460ff1661343f5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b600061344c84600161366b565b90506134598482846137d1565b61346381836138dd565b61346e818584613884565b61ffff8416600090815260096020526040812080548492906134919084906152fc565b90915550611b0d90508484846141eb565b60065474010000000000000000000000000000000000000000900460ff1661350c5760405162461bcd60e51b815260206004820152601860248201527f41776f6f2053746f7265206973206e6f7420616374697665000000000000000060448201526064016109e9565b836000811161355d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064016109e9565b600061356a87600261366b565b90506135778782886137d1565b613582818888613884565b61320e81876138dd565b6000546001600160a01b031633146135e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e9565b6001600160a01b0381166136625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109e9565b610e2c81614183565b604080516101a081018252600080825260208083018290528284018290526060808401839052608080850184905260a0850184905260c085018490528551808701875284815280840185905260e086015285519081018652838152918201839052938101829052808401829052610100830152610120820192909252610140810182905261016081018290526101808101919091526137098361398d565b90508060c0015161375c5760405162461bcd60e51b815260206004820152600d60248201527f496e616374697665206974656d0000000000000000000000000000000000000060448201526064016109e9565b81600381111561376e5761376e614c58565b8160600151600381111561378457613784614c58565b146128595760405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964206974656d20666f72207061796d656e74207479706500000060448201526064016109e9565b6137db82826146a2565b6138275760405162461bcd60e51b815260206004820152601960248201527f45786365656473207472616e73616374696f6e206c696d69740000000000000060448201526064016109e9565b613833838383336146ce565b61387f5760405162461bcd60e51b815260206004820152601560248201527f457863656564732061646472657373206c696d6974000000000000000000000060448201526064016109e9565b505050565b61388e8383613c8c565b81111561387f5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320617661696c61626c65207175616e7469747900000000000060448201526064016109e9565b808261016001516138ee91906153e3565b34146114a35760405162461bcd60e51b815260206004820152601060248201527f496e636f727265637420616d6f756e740000000000000000000000000000000060448201526064016109e9565b600080546001600160a01b0383811691161480612859575060035460ff16801561285957506001546001600160a01b03838116911614806128595750506002546001600160a01b0390811691161490565b604080516101a081018252600080825260208083018290528284018290526060808401839052608080850184905260a0850184905260c085018490528551808701875284815280840185905260e0860152855190810186528381529182018390529381018290528084018290526101008301526101208201929092526101408101829052610160810182905261018081019190915260065461ffff76010000000000000000000000000000000000000000000090910481169083161115613a965760405162461bcd60e51b815260206004820152600e60248201527f496e76616c6964206974656d496400000000000000000000000000000000000060448201526064016109e9565b61ffff82811660009081526008602090815260409182902082516101a0810184528154808616825262010000810486169382019390935264010000000083049094169284019290925260608301906601000000000000900460ff166003811115613b0257613b02614c58565b6003811115613b1357613b13614c58565b8152815460ff6701000000000000008204811615156020808501919091526801000000000000000083048216151560408086019190915269010000000000000000009093048216151560608086019190915283518085018552600187015480851615158252610100908190048516151582850152608080880192909252855191820186526002880154808616835290810485161515938201939093526201000090920490921615159281019290925260038401549082015260a082015260048201805460c090920191613be590615557565b80601f0160208091040260200160405190810160405280929190818152602001828054613c1190615557565b8015613c5e5780601f10613c3357610100808354040283529160200191613c5e565b820191906000526020600020905b815481529060010190602001808311613c4157829003601f168201915b5050505050815260200160058201548152602001600682015481526020016007820154815250509050919050565b6000808360a00151613d2d576006546101408501516040517f9d7f4ebf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691639d7f4ebf91613ce99160040190815260200190565b602060405180830381865afa158015613d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d2a91906154b6565b90505b61ffff80841660009081526009602052604090205485519091613d5291849116615540565b613d5c9190615540565b949350505050565b80156114a3576005546001600160a01b031663070ffee33384846040518463ffffffff1660e01b8152600401613d9c93929190615644565b600060405180830381600087803b158015613db657600080fd5b505af1158015613dca573d6000803e3d6000fd5b505050505050565b82610100015160200151613e285760405162461bcd60e51b815260206004820152601660248201527f4974656d2063616e6e6f74206265206170706c6965640000000000000000000060448201526064016109e9565b8260c00151613e795760405162461bcd60e51b815260206004820152600d60248201527f496e616374697665206974656d0000000000000000000000000000000000000060448201526064016109e9565b6101008301515160ff16600090815260076020526040908190205490517f6352211e00000000000000000000000000000000000000000000000000000000815263ffffffff831660048201526001600160a01b03909116908190636352211e90602401602060405180830381865afa158015613ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f1d91906157b4565b6001600160a01b0316336001600160a01b031614613f7d5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206170706c69636174696f6e20746f6b656e4964000000000060448201526064016109e9565b8361010001516040015161400e576101008401515160ff166000908152600d6020908152604080832063ffffffff86168452825280832061ffff871684529091529020541561400e5760405162461bcd60e51b815260206004820152601e60248201527f537065636966696564206974656d20616c7265616479206170706c696564000060448201526064016109e9565b61010084015160600151156140b357600554610100850151606001516040517f88730d1e0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015263ffffffff8616602483015260448201929092529116906388730d1e90606401600060405180830381600087803b15801561409a57600080fd5b505af11580156140ae573d6000803e3d6000fd5b505050505b6101008401515160ff166000908152600d6020908152604080832063ffffffff86168452825280832061ffff8716845290915281208054600192906140f99084906152fc565b909155505061ffff83166000818152600c602090815260408083206101008901515160ff168452825280832080546001810182559084529282902063ffffffff8716930183905580519384526001600160a01b038516918401919091528201527f44c309fb21ce6956879f0e32aac00d6b2949bddf851b0e1e6255a019c60d522f90606001611636565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006141f68461398d565b905060005b8281101561422c5761421a8286868685818110611a4057611a40615314565b8061422481615507565b9150506141fb565b5050505050565b805161ffff166142855760405162461bcd60e51b815260206004820152601e60248201527f546f74616c20617661696c61626c652063616e6e6f74206265207a65726f000060448201526064016109e9565b8061010001516040015180156142a35750806020015161ffff166001145b156142f05760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207065722d61646472657373206c696d69740000000000000060448201526064016109e9565b8060a0015161434f576000816101200151511161434f5760405162461bcd60e51b815260206004820152601c60248201527f4974656d2072657175697265732061206d65746164617461207572690000000060448201526064016109e9565b80610100015160200151156143db576006546101008201515160ff75010000000000000000000000000000000000000000009092048216911611156143d65760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206170706c696361626c65436f6c6c656374696f6e4964000060448201526064016109e9565b614432565b6101008101515160ff16156144325760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206170706c696361626c65436f6c6c656374696f6e4964000060448201526064016109e9565b60018160600151600381111561444a5761444a614c58565b14156144f8576000816101600151116144a55760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642065746865722070726963650000000000000000000000000060448201526064016109e9565b61018081015115610e2c5760405162461bcd60e51b815260206004820152601260248201527f496e76616c69642041574f4f207072696365000000000000000000000000000060448201526064016109e9565b60008160600151600381111561451057614510614c58565b14156145e757610160810151156145695760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642065746865722070726963650000000000000000000000000060448201526064016109e9565b670de0b6b3a764000081610180015161458291906157d1565b61459490670de0b6b3a76400006153e3565b81610180015114610e2c5760405162461bcd60e51b815260206004820152601260248201527f496e76616c69642041574f4f207072696365000000000000000000000000000060448201526064016109e9565b6002816060015160038111156145ff576145ff614c58565b141561465a576000816101600151116145695760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642065746865722070726963650000000000000000000000000060448201526064016109e9565b60405162461bcd60e51b815260206004820152601460248201527f4e6f7420696d706c656d656e7465642c2079657400000000000000000000000060448201526064016109e9565b604082015160009061ffff16156146c55750604082015161ffff16811115612859565b50600192915050565b602083015160009061ffff161561477f5760008460a00151614736576001600160a01b0383166000818152600b6020908152604080832061ffff8b1680855290835281842054948452600a835281842090845290915290205461473191906152fc565b61475f565b6001600160a01b0383166000908152600a6020908152604080832061ffff8a1684529091529020545b602086015190915061ffff1661477585836152fc565b1115915050613d5c565b506001949350505050565b82600281019282156147e8579160200282015b828111156147e85781547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384351617825560209092019160019091019061479d565b506147f492915061486c565b5090565b82805461480490615557565b90600052602060002090601f01602090048101928261482657600085556147e8565b82601f1061483f57805160ff19168380011785556147e8565b828001600101855582156147e8579182015b828111156147e8578251825591602001919060010190614851565b5b808211156147f4576000815560010161486d565b803561ffff8116811461489357600080fd5b919050565b600080604083850312156148ab57600080fd5b6148b483614881565b946020939093013593505050565b6000604082840312156148d457600080fd5b826040830111156148e457600080fd5b50919050565b803560ff8116811461489357600080fd5b60006020828403121561490d57600080fd5b610e47826148ea565b6001600160a01b0381168114610e2c57600080fd5b60006020828403121561493d57600080fd5b8135610e4781614916565b60006020828403121561495a57600080fd5b5035919050565b60006020828403121561497357600080fd5b610e4782614881565b6000606082840312156148e457600080fd5b60008083601f8401126149a057600080fd5b50813567ffffffffffffffff8111156149b857600080fd5b6020830191508360208260051b85010111156149d357600080fd5b9250929050565b6000806000806000608086880312156149f257600080fd5b6149fb86614881565b945060208601359350604086013567ffffffffffffffff80821115614a1f57600080fd5b614a2b89838a0161497c565b94506060880135915080821115614a4157600080fd5b50614a4e8882890161498e565b969995985093965092949392505050565b60008060408385031215614a7257600080fd5b8235614a7d81614916565b9150614a8b60208401614881565b90509250929050565b600080600060408486031215614aa957600080fd5b614ab284614881565b9250602084013567ffffffffffffffff811115614ace57600080fd5b614ada8682870161498e565b9497909650939450505050565b803563ffffffff8116811461489357600080fd5b600080600060608486031215614b1057600080fd5b614b19846148ea565b9250614b2760208501614ae7565b9150614b3560408501614881565b90509250925092565b8015158114610e2c57600080fd5b803561489381614b3e565b60008060408385031215614b6a57600080fd5b614b7383614881565b91506020830135614b8381614b3e565b809150509250929050565b60008060008060608587031215614ba457600080fd5b614bad856148ea565b9350614bbb60208601614881565b9250604085013567ffffffffffffffff811115614bd757600080fd5b614be38782880161498e565b95989497509550505050565b600081518084526020808501945080840160005b83811015614c1f57815187529582019590820190600101614c03565b509495945050505050565b604081526000614c3d6040830185614bef565b8281036020840152614c4f8185614bef565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60005b83811015614ca2578181015183820152602001614c8a565b83811115611b0d5750506000910152565b60008151808452614ccb816020860160208601614c87565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b61ffff8e16815261ffff8d16602082015261ffff8c166040820152600060048c10614d51577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8b6060830152614d65608083018c15159052565b89151560a083015288151560c08301528751151560e083015260208801511515610100830152865160ff16610120830152602087015115156101408301526040870151151561016083015260608701516101808301526102206101a0830152614dd2610220830187614cb3565b6101c0830195909552506101e0810192909252610200909101529a9950505050505050505050565b60008060008060008060808789031215614e1357600080fd5b614e1c87614881565b9550602087013567ffffffffffffffff80821115614e3957600080fd5b614e458a838b0161497c565b96506040890135915080821115614e5b57600080fd5b614e678a838b0161498e565b90965094506060890135915080821115614e8057600080fd5b50614e8d89828a0161498e565b979a9699509497509295939492505050565b600060208284031215614eb157600080fd5b8135610e4781614b3e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614f0f57614f0f614ebc565b60405290565b80356004811061489357600080fd5b600060408284031215614f3657600080fd5b6040516040810181811067ffffffffffffffff82111715614f5957614f59614ebc565b6040529050808235614f6a81614b3e565b81526020830135614f7a81614b3e565b6020919091015292915050565b600060808284031215614f9957600080fd5b6040516080810181811067ffffffffffffffff82111715614fbc57614fbc614ebc565b604052905080614fcb836148ea565b81526020830135614fdb81614b3e565b60208201526040830135614fee81614b3e565b6040820152606092830135920191909152919050565b600082601f83011261501557600080fd5b813567ffffffffffffffff8082111561503057615030614ebc565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561507657615076614ebc565b8160405283815286602085880101111561508f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061022082840312156150c257600080fd5b6150ca614eeb565b90506150d582614881565b81526150e360208301614881565b60208201526150f460408301614881565b604082015261510560608301614f15565b606082015261511660808301614b4c565b608082015261512760a08301614b4c565b60a082015261513860c08301614b4c565b60c082015261514a8360e08401614f24565b60e082015261012061515e84828501614f87565b6101008301526101a083013567ffffffffffffffff81111561517f57600080fd5b61518b85828601615004565b8284015250506101c08201356101408201526101e082013561016082015261020082013561018082015292915050565b600080604083850312156151ce57600080fd5b823567ffffffffffffffff8111156151e557600080fd5b6151f1858286016150af565b925050614a8b60208401614881565b6000806040838503121561521357600080fd5b61521c83614881565b9150614a8b602084016148ea565b828152604060208201526000613d5c6040830184614bef565b6000806040838503121561525657600080fd5b61525f83614881565b9150602083013567ffffffffffffffff81111561527b57600080fd5b615287858286016150af565b9150509250929050565b6000806000606084860312156152a657600080fd5b6152af84614881565b92506152bd602085016148ea565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561530f5761530f6152cd565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff821680615356576153566152cd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126153b357600080fd5b83018035915067ffffffffffffffff8211156153ce57600080fd5b6020019150368190038213156149d357600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561541b5761541b6152cd565b500290565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815260a06020820152600061548360a08301888a615420565b8281036040840152615496818789615420565b6001600160a01b0395909516606084015250506080015295945050505050565b6000602082840312156154c857600080fd5b5051919050565b6000602082840312156154e157600080fd5b8151610e4781614b3e565b6000602082840312156154fe57600080fd5b610e4782614ae7565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615539576155396152cd565b5060010190565b600082821015615552576155526152cd565b500390565b600181811c9082168061556b57607f821691505b602082108114156148e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060ff821660ff8114156155bc576155bc6152cd565b60010192915050565b825115158152602080840151151590820152606060408201526000613d5c6060830184614cb3565b600061ffff80831681811415615605576156056152cd565b6001019392505050565b60008251615621818460208701614c87565b9190910192915050565b828152604060208201526000613d5c6040830184614cb3565b6001600160a01b03848116825260406020808401829052838201859052600092606091828601600588811b880185018a885b8b8110156157a2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b840301855281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18e36030181126156d757600080fd5b8d01838a0181356156e781614916565b8916855281880135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261572057600080fd5b8201803567ffffffffffffffff81111561573957600080fd5b80881b360384131561574a57600080fd5b868a018d9052918290528a860192508801906000905b8082101561578d5763ffffffff61577684614ae7565b168452928901929189019160019190910190615760565b50505094860194925090850190600101615676565b50909c9b505050505050505050505050565b6000602082840312156157c657600080fd5b8151610e4781614916565b600082615807577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220b90355c79836f90542d0c8d33752921b152610b8194df56cbf80d2a34371348e64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005e697c6f5cbebd6ca17bde80d684c226a1e223be000000000000000000000000ffe844169bfc6da1b87c9157f684e18e7f1663ad00000000000000000000000045b959c5409b780bbdccd7c090038038093fcb0d
-----Decoded View---------------
Arg [0] : withdrawAddr (address): 0x5E697C6f5cBEBD6ca17BDE80d684c226A1e223BE
Arg [1] : awooTokenContract (address): 0xFfE844169bFc6dA1B87c9157f684E18E7F1663aD
Arg [2] : claimingContract (address): 0x45b959c5409B780bbdCCD7c090038038093fcb0d
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000005e697c6f5cbebd6ca17bde80d684c226a1e223be
Arg [1] : 000000000000000000000000ffe844169bfc6da1b87c9157f684e18e7f1663ad
Arg [2] : 00000000000000000000000045b959c5409b780bbdccd7c090038038093fcb0d
Deployed Bytecode Sourcemap
88341:31353:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93294:590;;;;;;:::i;:::-;;:::i;:::-;;9955:212;;;;;;;;;;-1:-1:-1;9955:212:0;;;;;:::i;:::-;;:::i;89841:55::-;;;;;;;;;;-1:-1:-1;89841:55:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;89841:55:0;;;;;;-1:-1:-1;;;;;1203:55:1;;;1185:74;;1173:2;1158:18;89841:55:0;;;;;;;;89216:38;;;;;;;;;;-1:-1:-1;89216:38:0;;;;;;;-1:-1:-1;;;;;89216:38:0;;;117260:198;;;;;;;;;;-1:-1:-1;117260:198:0;;;;;:::i;:::-;;:::i;89261:30::-;;;;;;;;;;-1:-1:-1;89261:30:0;;;;-1:-1:-1;;;;;89261:30:0;;;89298:43;;;;;;;;;;-1:-1:-1;89298:43:0;;;;-1:-1:-1;;;;;89298:43:0;;;118817:220;;;;;;;;;;-1:-1:-1;118817:220:0;;;;;:::i;:::-;;:::i;111671:172::-;;;;;;;;;;-1:-1:-1;111671:172:0;;;;;:::i;:::-;;:::i;:::-;;;3032:25:1;;;3020:2;3005:18;111671:172:0;2886:177:1;108618:237:0;;;;;;;;;;-1:-1:-1;108618:237:0;;;;;:::i;:::-;;:::i;117575:160::-;;;;;;;;;;-1:-1:-1;117575:160:0;;;;;:::i;:::-;;:::i;92265:856::-;;;;;;;;;;-1:-1:-1;92265:856:0;;;;;:::i;:::-;;:::i;119152:305::-;;;;;;;;;;-1:-1:-1;119152:305:0;;;;;:::i;:::-;;:::i;96779:539::-;;;;;;:::i;:::-;;:::i;118612:197::-;;;;;;;;;;-1:-1:-1;118612:197:0;;;;;:::i;:::-;;:::i;90278:85::-;;;;;;;;;;-1:-1:-1;90278:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;89418:23;;;;;;;;;;-1:-1:-1;89418:23:0;;;;;;;;;;;;;;6021:14:1;;6014:22;5996:41;;5984:2;5969:18;89418:23:0;5856:187:1;94372:958:0;;;;;;:::i;:::-;;:::i;104483:873::-;;;;;;;;;;-1:-1:-1;104483:873:0;;;;;:::i;:::-;;:::i;90935:114::-;;;;;;;;;;-1:-1:-1;90935:114:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102729:650;;;;;;;;;;-1:-1:-1;102729:650:0;;;;;:::i;:::-;;:::i;118213:236::-;;;;;;;;;;-1:-1:-1;118213:236:0;;;;;:::i;:::-;;:::i;89733:23::-;;;;;;;;;;-1:-1:-1;89733:23:0;;;;;;;;;;;;;;7829:6:1;7817:19;;;7799:38;;7787:2;7772:18;89733:23:0;7655:188:1;8809:103:0;;;;;;;;;;;;;:::i;113731:713::-;;;;;;;;;;-1:-1:-1;113731:713:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;8158:87::-;;;;;;;;;;-1:-1:-1;8204:7:0;8231:6;-1:-1:-1;;;;;8231:6:0;8158:87;;89960:52;;;;;;;;;;-1:-1:-1;89960:52:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;108259:255::-;;;;;;;;;;-1:-1:-1;108259:255:0;;;;;:::i;:::-;;:::i;:::-;;;12617:4:1;12605:17;;;12587:36;;12575:2;12560:18;108259:255:0;12445:184:1;101457:969:0;;;;;;:::i;:::-;;:::i;117827:293::-;;;;;;;;;;-1:-1:-1;117827:293:0;;;;;:::i;:::-;;:::i;108927:568::-;;;;;;;;;;-1:-1:-1;108927:568:0;;;;;:::i;:::-;;:::i;107817:341::-;;;;;;;;;;-1:-1:-1;107817:341:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;103578:541::-;;;;;;;;;;-1:-1:-1;103578:541:0;;;;;:::i;:::-;;:::i;109577:1368::-;;;;;;;;;;-1:-1:-1;109577:1368:0;;;;;:::i;:::-;;:::i;116952:183::-;;;;;;;;;;-1:-1:-1;116952:183:0;;;;;:::i;:::-;;:::i;90711:70::-;;;;;;;;;;-1:-1:-1;90711:70:0;;;;;:::i;:::-;;:::i;89588:28::-;;;;;;;;;;-1:-1:-1;89588:28:0;;;;;;;;;;;95787:807;;;;;;;;;;-1:-1:-1;95787:807:0;;;;;:::i;:::-;;:::i;89348:61::-;;;;;;;;;;-1:-1:-1;89348:61:0;;;;-1:-1:-1;;;;;89348:61:0;;;99258:844;;;;;;;;;;-1:-1:-1;99258:844:0;;;;;:::i;:::-;;:::i;100370:560::-;;;;;;:::i;:::-;;:::i;97808:909::-;;;;;;:::i;:::-;;:::i;9067:201::-;;;;;;;;;;-1:-1:-1;9067:201:0;;;;;:::i;:::-;;:::i;90086:52::-;;;;;;;;;;-1:-1:-1;90086:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;90500:88;;;;;;;;;;-1:-1:-1;90500:88:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;93294:590;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;;;;;;;;;93426:3:::1;119528:1;119522:3;:7;119514:43;;;::::0;-1:-1:-1;;;119514:43:0;;20988:2:1;119514:43:0::1;::::0;::::1;20970:21:1::0;21027:2;21007:18;;;21000:30;21066:25;21046:18;;;21039:53;21109:18;;119514:43:0::1;20786:347:1::0;119514:43:0::1;93447:22:::2;93472:40;93486:6;93494:17;93472:13;:40::i;:::-;93447:65;;93532:4;:16;;;93531:17;93523:60;;;::::0;-1:-1:-1;;;93523:60:0;;21340:2:1;93523:60:0::2;::::0;::::2;21322:21:1::0;21379:2;21359:18;;;21352:30;21418:32;21398:18;;;21391:60;21468:18;;93523:60:0::2;21138:354:1::0;93523:60:0::2;93596:45;93623:6;93631:4;93637:3;93596:26;:45::i;:::-;93652:37;93671:4;93677:6;93685:3;93652:18;:37::i;:::-;93700:30;93720:4;93726:3;93700:19;:30::i;:::-;93743;::::0;-1:-1:-1;;;;;93743:30:0::2;:35;6956:10:::0;93793:12:::2;::::0;::::2;::::0;93743:68:::2;::::0;;::::2;::::0;;;;;;-1:-1:-1;;;;;21717:55:1;;;93743:68:0::2;::::0;::::2;21699:74:1::0;21789:18;;;21782:34;21832:18;;;21825:34;;;21672:18;;93743:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;93873:3;93822:25;:39;93848:12;6956:10:::0;;6876:98;93848:12:::2;-1:-1:-1::0;;;;;93822:39:0::2;-1:-1:-1::0;;;;;93822:39:0::2;;;;;;;;;;;;:47;93862:6;93822:47;;;;;;;;;;;;;;;;:54;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;93294:590:0:o;9955:212::-;10049:1;10028:9;;;;:6;:9;:::i;:::-;-1:-1:-1;;;;;10028:23:0;;;:50;;;;-1:-1:-1;10076:1:0;10055:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10055:23:0;;;10028:50;10020:84;;;;-1:-1:-1;;;10020:84:0;;22583:2:1;10020:84:0;;;22565:21:1;22622:2;22602:18;;;22595:30;22661:23;22641:18;;;22634:51;22702:18;;10020:84:0;22381:345:1;10020:84:0;10115:16;:7;10125:6;10115:16;;:::i;:::-;-1:-1:-1;;10142:10:0;:17;;;;10155:4;10142:17;;;9955:212::o;117260:198::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;117395:30:::1;:55:::0;;;::::1;-1:-1:-1::0;;;;;117395:55:0;;;::::1;::::0;;;::::1;::::0;;117260:198::o;118817:220::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;118906:21:::1;118896:6;:31;;118888:66;;;::::0;-1:-1:-1;;;118888:66:0;;23283:2:1;118888:66:0::1;::::0;::::1;23265:21:1::0;23322:2;23302:18;;;23295:30;23361:24;23341:18;;;23334:52;23403:18;;118888:66:0::1;23081:346:1::0;118888:66:0::1;118981:15;::::0;118973:37:::1;::::0;118981:15:::1;::::0;;::::1;-1:-1:-1::0;;;;;118981:15:0::1;::::0;118973:37:::1;::::0;::::1;;::::0;;;::::1;::::0;;;;118981:15;118973:37;::::1;;;;;;118965:64;;;::::0;-1:-1:-1;;;118965:64:0;;23634:2:1;118965:64:0::1;::::0;::::1;23616:21:1::0;23673:2;23653:18;;;23646:30;23712:16;23692:18;;;23685:44;23746:18;;118965:64:0::1;23432:338:1::0;118965:64:0::1;118817:220:::0;:::o;111671:172::-;111729:7;111749:22;111774:16;111783:6;111774:8;:16::i;:::-;111749:41;;111808:27;111822:4;111828:6;111808:13;:27::i;:::-;111801:34;111671:172;-1:-1:-1;;;111671:172:0:o;108618:237::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;108725:15:::1;::::0;::::1;::::0;;;::::1;::::0;::::1;108709:31:::0;;::::1;;;108701:64;;;::::0;-1:-1:-1;;;108701:64:0;;23977:2:1;108701:64:0::1;::::0;::::1;23959:21:1::0;24016:2;23996:18;;;23989:30;24055:22;24035:18;;;24028:50;24095:18;;108701:64:0::1;23775:344:1::0;108701:64:0::1;108783:36;::::0;;::::1;;::::0;;;:22:::1;:36;::::0;;;;108776:43;;;::::1;::::0;;108830:15:::1;:17:::0;;;;::::1;::::0;;::::1;::::0;:15:::1;:17;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;108618:237:::0;:::o;117575:160::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;117695:12:::1;:32:::0;;;::::1;-1:-1:-1::0;;;;;117695:32:0;;;::::1;::::0;;;::::1;::::0;;117575:160::o;92265:856::-;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;92475:3:::1;119528:1;119522:3;:7;119514:43;;;::::0;-1:-1:-1;;;119514:43:0;;20988:2:1;119514:43:0::1;::::0;::::1;20970:21:1::0;21027:2;21007:18;;;21000:30;21066:25;21046:18;;;21039:53;21109:18;;119514:43:0::1;20786:347:1::0;119514:43:0::1;92491:22:::2;92516:39;92530:6;92538:16;92516:13;:39::i;:::-;92491:64;;92575:4;:16;;;92574:17;92566:60;;;::::0;-1:-1:-1;;;92566:60:0;;21340:2:1;92566:60:0::2;::::0;::::2;21322:21:1::0;21379:2;21359:18;;;21352:30;21418:32;21398:18;;;21391:60;21468:18;;92566:60:0::2;21138:354:1::0;92566:60:0::2;92639:45;92666:6;92674:4;92680:3;92639:26;:45::i;:::-;92695:37;92714:4;92720:6;92728:3;92695:18;:37::i;:::-;92745:27;92756:15;;92745:10;:27::i;:::-;92783:12;::::0;-1:-1:-1;;;;;92783:12:0::2;:29;92827:13:::0;::::2;92855:12;;::::0;::::2;92827:8:::0;92855:12:::2;:::i;:::-;92882:14;;::::0;::::2;:8:::0;:14:::2;:::i;:::-;6956:10:::0;92944:14:::2;::::0;::::2;::::0;92938:20:::2;::::0;:3;:20:::2;:::i;:::-;92783:186;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;92980:30:0::2;::::0;-1:-1:-1;;;;;92980:30:0::2;::::0;-1:-1:-1;92980:35:0::2;::::0;-1:-1:-1;6956:10:0;93030:12:::2;::::0;::::2;::::0;92980:68:::2;::::0;;::::2;::::0;;;;;;-1:-1:-1;;;;;21717:55:1;;;92980:68:0::2;::::0;::::2;21699:74:1::0;21789:18;;;21782:34;21832:18;;;21825:34;;;21672:18;;92980:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;93110:3;93059:25;:39;93085:12;6956:10:::0;;6876:98;93085:12:::2;-1:-1:-1::0;;;;;93059:39:0::2;-1:-1:-1::0;;;;;93059:39:0::2;;;;;;;;;;;;:47;93099:6;93059:47;;;;;;;;;;;;;;;;:54;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;92265:856:0:o;119152:305::-;119234:30;;;;;119258:4;119234:30;;;1185:74:1;119216:15:0;;-1:-1:-1;;;;;119234:15:0;;;;;1158:18:1;;119234:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119216:48;;119295:1;119285:7;:11;119277:47;;;;-1:-1:-1;;;119277:47:0;;27195:2:1;119277:47:0;;;27177:21:1;27234:2;27214:18;;;27207:30;27273:25;27253:18;;;27246:53;27316:18;;119277:47:0;26993:347:1;119277:47:0;119380:15;;119357:49;;;;;119380:15;;;;-1:-1:-1;;;;;119380:15:0;;;119357:49;;;27527:74:1;27617:18;;;27610:34;;;119357:14:0;;;;;27500:18:1;;119357:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119335:114;;;;-1:-1:-1;;;119335:114:0;;28107:2:1;119335:114:0;;;28089:21:1;28146:2;28126:18;;;28119:30;28185:17;28165:18;;;28158:45;28220:18;;119335:114:0;27905:339:1;119335:114:0;119205:252;119152:305;:::o;96779:539::-;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;96915:3:::1;119528:1;119522:3;:7;119514:43;;;::::0;-1:-1:-1;;;119514:43:0;;20988:2:1;119514:43:0::1;::::0;::::1;20970:21:1::0;21027:2;21007:18;;;21000:30;21066:25;21046:18;;;21039:53;21109:18;;119514:43:0::1;20786:347:1::0;119514:43:0::1;96936:22:::2;96961:40;96975:6;96983:17;96961:13;:40::i;:::-;96936:65;;97012:45;97039:6;97047:4;97053:3;97012:26;:45::i;:::-;97068:37;97087:4;97093:6;97101:3;97068:18;:37::i;:::-;97116:30;97136:4;97142:3;97116:19;:30::i;:::-;97159:26;::::0;::::2;;::::0;;;:18:::2;:26;::::0;;;;:33;;97189:3;;97159:26;:33:::2;::::0;97189:3;;97159:33:::2;:::i;:::-;::::0;;;-1:-1:-1;;6956:10:0;97203:36:::2;::::0;;;:22:::2;:36;::::0;;;;;;;:44:::2;::::0;::::2;::::0;;;;;;;:51;;97251:3;;97203:36;:51:::2;::::0;97251:3;;97203:51:::2;:::i;:::-;::::0;;;-1:-1:-1;97270:40:0::2;::::0;-1:-1:-1;97284:6:0;6956:10;97292:12:::2;97270:40;::::0;;28479:6:1;28467:19;;;28449:38;;-1:-1:-1;;;;;28523:55:1;;;28518:2;28503:18;;28496:83;28595:18;;28588:34;;;28437:2;28422:18;97270:40:0::2;;;;;;;;96925:393;119682:1:::1;96779:539:::0;;:::o;118612:197::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;-1:-1:-1;;;;;118730:18:0;::::1;118722:46;;;::::0;-1:-1:-1;;;118722:46:0;;28835:2:1;118722:46:0::1;::::0;::::1;28817:21:1::0;28874:2;28854:18;;;28847:30;28913:17;28893:18;;;28886:45;28948:18;;118722:46:0::1;28633:339:1::0;118722:46:0::1;118779:15;:22:::0;;-1:-1:-1;;;;;118779:22:0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;118612:197::o;94372:958::-;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;94596:3:::1;119528:1;119522:3;:7;119514:43;;;::::0;-1:-1:-1;;;119514:43:0;;20988:2:1;119514:43:0::1;::::0;::::1;20970:21:1::0;21027:2;21007:18;;;21000:30;21066:25;21046:18;;;21039:53;21109:18;;119514:43:0::1;20786:347:1::0;119514:43:0::1;94612:22:::2;94637:86;94665:6;94686:26;94637:13;:86::i;:::-;94612:111;;94743:4;:16;;;94742:17;94734:60;;;::::0;-1:-1:-1;;;94734:60:0;;21340:2:1;94734:60:0::2;::::0;::::2;21322:21:1::0;21379:2;21359:18;;;21352:30;21418:32;21398:18;;;21391:60;21468:18;;94734:60:0::2;21138:354:1::0;94734:60:0::2;94805:45;94832:6;94840:4;94846:3;94805:26;:45::i;:::-;94861:37;94880:4;94886:6;94894:3;94861:18;:37::i;:::-;94909:30;94929:4;94935:3;94909:19;:30::i;104483:873::-:0;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;104621:22:::1;104646:16;104655:6;104646:8;:16::i;:::-;104621:41;;104682:4;:16;;;104681:17;104673:60;;;::::0;-1:-1:-1;;;104673:60:0;;21340:2:1;104673:60:0::1;::::0;::::1;21322:21:1::0;21379:2;21359:18;;;21352:30;21418:32;21398:18;;;21391:60;21468:18;;104673:60:0::1;21138:354:1::0;104673:60:0::1;104813:30;::::0;-1:-1:-1;;;;;104813:30:0::1;:40;6956:10:::0;104911:12:::1;::::0;::::1;::::0;104813:129:::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;27545:55:1;;;104813:129:0::1;::::0;::::1;27527:74:1::0;27617:18;;;27610:34;27500:18;;104813:129:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104766:176:::0;::::1;;104744:249;;;::::0;-1:-1:-1;;;104744:249:0;;29481:2:1;104744:249:0::1;::::0;::::1;29463:21:1::0;29520:2;29500:18;;;29493:30;29559:25;29539:18;;;29532:53;29602:18;;104744:249:0::1;29279:347:1::0;104744:249:0::1;105011:9;105006:128;105022:30:::0;;::::1;105006:128;;;105074:48;105085:4;105091:6;105099:19;;105119:1;105099:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;105074:10;:48::i;:::-;105054:3:::0;::::1;::::0;::::1;:::i;:::-;;;;105006:128;;;;105150:4;:13;;;105146:203;;;105180:30;::::0;-1:-1:-1;;;;;105180:30:0::1;:35;6956:10:::0;105265:12:::1;::::0;::::1;::::0;105180:157:::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;21717:55:1;;;105180:157:0::1;::::0;::::1;21699:74:1::0;21789:18;;;21782:34;21832:18;;;21825:34;;;21672:18;;105180:157:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;105146:203;104610:746;104483:873:::0;;;:::o;102729:650::-;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;102866:22:::1;102891:16;102900:6;102891:8;:16::i;:::-;6956:10:::0;102987:36:::1;::::0;;;:22:::1;:36;::::0;;;;;;;:44:::1;::::0;::::1;::::0;;;;;;;;102866:41;;-1:-1:-1;102940:91:0;::::1;;102918:163;;;::::0;-1:-1:-1;;;102918:163:0;;30222:2:1;102918:163:0::1;::::0;::::1;30204:21:1::0;30261:2;30241:18;;;30234:30;30300:24;30280:18;;;30273:52;30342:18;;102918:163:0::1;30020:346:1::0;102918:163:0::1;103099:9;103094:128;103110:30:::0;;::::1;103094:128;;;103162:48;103173:4;103179:6;103187:19;;103207:1;103187:22;;;;;;;:::i;103162:48::-;103142:3:::0;::::1;::::0;::::1;:::i;:::-;;;;103094:128;;;;103238:4;:13;;;103234:138;;;6956:10:::0;103268:36:::1;::::0;;;:22:::1;:36;::::0;;;;;;;:44:::1;::::0;::::1;::::0;;;;;;;:92;;103316:19;;103268:36;:92:::1;::::0;103316:19;;103268:92:::1;:::i;118213:236::-:0;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;118343:1:::1;118334:6;:10;;;:33;;;;-1:-1:-1::0;118358:9:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;118348:19:::0;;::::1;;;118334:33;118326:61;;;::::0;-1:-1:-1;;;118326:61:0;;30703:2:1;118326:61:0::1;::::0;::::1;30685:21:1::0;30742:2;30722:18;;;30715:30;30781:17;30761:18;;;30754:45;30816:18;;118326:61:0::1;30501:339:1::0;118326:61:0::1;118400:23;::::0;;::::1;;::::0;;;:15:::1;:23;::::0;;;;:41;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;118213:236::o;8809:103::-;8204:7;8231:6;-1:-1:-1;;;;;8231:6:0;6956:10;8378:23;8370:68;;;;-1:-1:-1;;;8370:68:0;;31047:2:1;8370:68:0;;;31029:21:1;;;31066:18;;;31059:30;31125:34;31105:18;;;31098:62;31177:18;;8370:68:0;30845:356:1;8370:68:0;8874:30:::1;8901:1;8874:18;:30::i;:::-;8809:103::o:0;113731:713::-;113893:16;;113940:32;113989:8;113975:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;113975:30:0;-1:-1:-1;113940:65:0;-1:-1:-1;114016:34:0;114067:8;114053:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114053:30:0;;114016:67;;114101:9;114096:285;114112:19;;;114096:285;;;114153:14;114177:8;;114186:1;114177:11;;;;;;;:::i;:::-;;;;;;;114153:36;;114227:7;114206:28;;:15;114222:1;114206:18;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;;114272:80;;;;;;;:34;:80;;;;;;:89;;;;;;;;;;:97;;;;;;;;;;114249:20;;:17;;114267:1;;114249:20;;;;;;:::i;:::-;;;;;;;;;;:120;-1:-1:-1;114133:3:0;;;;:::i;:::-;;;;114096:285;;;-1:-1:-1;114401:15:0;;;;-1:-1:-1;113731:713:0;-1:-1:-1;;;;;113731:713:0:o;89960:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;108259:255::-;108371:18;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;108424:15:::1;108422:17:::0;;108424:15:::1;::::0;108422:17:::1;::::0;;;::::1;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;;::::0;;::::1;;::::0;;;-1:-1:-1;108450:36:0;;;:22:::1;:36;::::0;;;;:56;;-1:-1:-1;;;;;108450:56:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;108422:17:0;108259:255::o;101457:969::-;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;101714:22:::1;101739:86;101767:6;101788:26;101739:13;:86::i;:::-;101714:111:::0;-1:-1:-1;101836:68:0::1;101863:6:::0;101714:111;101877:19;101836:26:::1;:68::i;:::-;101915:53;101935:4:::0;101941:19;101915::::1;:53::i;:::-;101979:60;101998:4:::0;102004:6;102012:19;101979:18:::1;:60::i;:::-;102052:27;102063:15;;102052:10;:27::i;:::-;102090:12;::::0;-1:-1:-1;;;;;102090:12:0::1;:29;102134:13:::0;::::1;102162:12;;::::0;::::1;102134:8:::0;102162:12:::1;:::i;:::-;102189:14;;::::0;::::1;:8:::0;:14:::1;:::i;:::-;6956:10:::0;102274:14:::1;::::0;::::1;::::0;102245:43:::1;::::0;:19;:43:::1;:::i;:::-;102090:209;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;102312:26:0::1;::::0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:56;;102342:19;;102312:26;:56:::1;::::0;102342:19;;102312:56:::1;:::i;:::-;::::0;;;-1:-1:-1;102379:39:0::1;::::0;-1:-1:-1;102390:6:0;102398:19;;102379:10:::1;:39::i;:::-;101703:723;101457:969:::0;;;;;;:::o;117827:293::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;117900:6:::1;117896:186;;;117957:30;::::0;-1:-1:-1;;;;;117957:30:0::1;117923:147;;;::::0;-1:-1:-1;;;117923:147:0;;32030:2:1;117923:147:0::1;::::0;::::1;32012:21:1::0;;;32049:18;;;32042:30;32108:34;32088:18;;;32081:62;32160:18;;117923:147:0::1;31828:356:1::0;117923:147:0::1;118092:11;:20:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;117827:293::o;108927:568::-;109051:6;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;109075:19:::1;109089:4;109075:13;:19::i;:::-;109112:4;:16;;;109111:17;:38;;;;-1:-1:-1::0;109132:12:0::1;::::0;::::1;::::0;:17;109111:38:::1;109107:251;;;109184:30;::::0;109242:17:::1;::::0;::::1;::::0;109278:16:::1;::::0;::::1;::::0;109184:125:::1;::::0;;;;109166:15:::1;::::0;-1:-1:-1;;;;;109184:30:0::1;::::0;:39:::1;::::0;:125:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;109324:12;::::0;::::1;:22:::0;-1:-1:-1;109107:251:0::1;109401:4;109370:15;:28;109388:9;;109386:11;;;;;;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;;::::0;;;109370:28;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;109370:28:0;:35;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;:28;;:35;;;;;;;;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;109370:35: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;;::::1;::::0;::::1;::::0;;;-1:-1:-1;109370:35: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;;::::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;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;109370:35: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;109435:9;;109416:44:::1;109435:9:::0;;;;::::1;::::0;::::1;-1:-1:-1::0;109416:29:0;;;:18:::1;:29;::::0;;;;:44;;::::1;::::0;;109478:9;;::::1;;::::0;-1:-1:-1;10527:1:0::1;108927:568:::0;;;;:::o;107817:341::-;108016:24;;;107941:13;108016:24;;;:16;:24;;;;;;;;:48;;;;;;;;;;;:55;;108082:68;;;;;;;;;;;;;;;108016:55;107956:34;;108082:68;;108016:48;:55;;108082:68;;108016:48;:55;108082:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107817:341;;;;;:::o;103578:541::-;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;103694:3:::1;119528:1;119522:3;:7;119514:43;;;::::0;-1:-1:-1;;;119514:43:0;;20988:2:1;119514:43:0::1;::::0;::::1;20970:21:1::0;21027:2;21007:18;;;21000:30;21066:25;21046:18;;;21039:53;21109:18;;119514:43:0::1;20786:347:1::0;119514:43:0::1;103715:22:::2;103740:16;103749:6;103740:8;:16::i;:::-;103715:41;;103775:4;:11;;;103767:37;;;::::0;-1:-1:-1;;;103767:37:0;;32970:2:1;103767:37:0::2;::::0;::::2;32952:21:1::0;33009:2;32989:18;;;32982:30;33048:15;33028:18;;;33021:43;33081:18;;103767:37:0::2;32768:337:1::0;103767:37:0::2;6956:10:::0;103844:36:::2;::::0;;;:22:::2;:36;::::0;;;;;;;:44:::2;::::0;::::2;::::0;;;;;;;;103837:51;::::2;;103815:123;;;::::0;-1:-1:-1;;;103815:123:0;;30222:2:1;103815:123:0::2;::::0;::::2;30204:21:1::0;30261:2;30241:18;;;30234:30;30300:24;30280:18;;;30273:52;30342:18;;103815:123:0::2;30020:346:1::0;103815:123:0::2;103955:4;:13;;;103951:97;;;6956:10:::0;103985:36:::2;::::0;;;:22:::2;:36;::::0;;;;;;;:44:::2;::::0;::::2;::::0;;;;;;;:51;;104033:3;;103985:36;:51:::2;::::0;104033:3;;103985:51:::2;:::i;:::-;::::0;;;-1:-1:-1;;103951:97:0::2;104065:46;104085:6:::0;6956:10;104093:12:::2;6876:98:::0;109577:1368;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;109701:22:::1;109715:7;109701:13;:22::i;:::-;109734:30;109767:16;109776:6;109767:8;:16::i;:::-;109734:49;;109844:7;:19;;;109816:47;;:12;:24;;;:47;;;109794:127;;;::::0;-1:-1:-1;;;109794:127:0;;33312:2:1;109794:127:0::1;::::0;::::1;33294:21:1::0;33351:2;33331:18;;;33324:30;33390:32;33370:18;;;33363:60;33440:18;;109794:127:0::1;33110:354:1::0;109794:127:0::1;109980:35;109994:12;110008:6;109980:13;:35::i;:::-;109954:22:::0;;:61:::1;;;;109932:143;;;::::0;-1:-1:-1;;;109932:143:0;;33671:2:1;109932:143:0::1;::::0;::::1;33653:21:1::0;;;33690:18;;;33683:30;33749:34;33729:18;;;33722:62;33801:18;;109932:143:0::1;33469:356:1::0;109932:143:0::1;110093:12;:24;;;110088:804;;110152:20;::::0;;::::1;::::0;110134:15;;::::1;:38:::0;110271:24:::1;::::0;;::::1;::::0;110265:38;110217:19;;::::1;::::0;110211:33;:92:::1;;::::0;:235:::1;;;110420:12;:24;;;110403:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;110393:53;;;;;;110351:7;:19;;;110334:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;110324:48;;;;;;:122;;110211:235;110189:454;;;110481:30;::::0;110546:20:::1;::::0;::::1;::::0;110589:19:::1;::::0;::::1;::::0;110481:146:::1;::::0;;;;-1:-1:-1;;;;;110481:30:0;;::::1;::::0;:42:::1;::::0;:146:::1;::::0;110546:20;;110481:146:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;110189:454;110681:12;:19;;;110663:37;;:7;:14;;;:37;;;110659:222;;110721:30;::::0;110789:20:::1;::::0;::::1;::::0;110832:14:::1;::::0;::::1;::::0;110721:144:::1;::::0;;;;::::1;::::0;::::1;34575:25:1::0;;;;34643:14;34636:22;34616:18;;;34609:50;-1:-1:-1;;;;;110721:30:0;;::::1;::::0;:45:::1;::::0;34548:18:1;;110721:144:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;110659:222;110904:23;::::0;;::::1;;::::0;;;:15:::1;:23;::::0;;;;;;;;:33;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;110930:7;;110904:23;;:33;;:23;;:33;;;;;;;;;;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;110904:33: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;;::::1;::::0;::::1;::::0;;;-1:-1:-1;110904:33: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;;::::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;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;110904:33: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:-1:-1;;;109577:1368:0:o;116952:183::-;10463:27;10479:10;10463:15;:27::i;:::-;10455:61;;;;-1:-1:-1;;;10455:61:0;;22933:2:1;10455:61:0;;;22915:21:1;22972:2;22952:18;;;22945:30;23011:23;22991:18;;;22984:51;23052:18;;10455:61:0;22731:345:1;10455:61:0;117075:20:::1;:52:::0;;;::::1;-1:-1:-1::0;;;;;117075:52:0;;;::::1;::::0;;;::::1;::::0;;116952:183::o;90711:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;95787:807::-;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;96001:3:::1;119528:1;119522:3;:7;119514:43;;;::::0;-1:-1:-1;;;119514:43:0;;20988:2:1;119514:43:0::1;::::0;::::1;20970:21:1::0;21027:2;21007:18;;;21000:30;21066:25;21046:18;;;21039:53;21109:18;;119514:43:0::1;20786:347:1::0;119514:43:0::1;96017:22:::2;96042:39;96056:6;96064:16;96042:13;:39::i;:::-;96017:64;;96092:45;96119:6;96127:4;96133:3;96092:26;:45::i;:::-;96148:37;96167:4;96173:6;96181:3;96148:18;:37::i;:::-;96198:27;96209:15;;96198:10;:27::i;:::-;96236:12;::::0;-1:-1:-1;;;;;96236:12:0::2;:29;96280:13:::0;::::2;96308:12;;::::0;::::2;96280:8:::0;96308:12:::2;:::i;:::-;96335:14;;::::0;::::2;:8:::0;:14:::2;:::i;:::-;6956:10:::0;96397:14:::2;::::0;::::2;::::0;96391:20:::2;::::0;:3;:20:::2;:::i;:::-;96236:186;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;96435:26:0::2;::::0;::::2;;::::0;;;:18:::2;:26;::::0;;;;:33;;96465:3;;96435:26;:33:::2;::::0;96465:3;;96435:33:::2;:::i;:::-;::::0;;;-1:-1:-1;;6956:10:0;96479:36:::2;::::0;;;:22:::2;:36;::::0;;;;;;;:44:::2;::::0;::::2;::::0;;;;;;;:51;;96527:3;;96479:36;:51:::2;::::0;96527:3;;96479:51:::2;:::i;:::-;::::0;;;-1:-1:-1;;96546:40:0::2;::::0;;28479:6:1;28467:19;;28449:38;;6956:10:0;28518:2:1;28503:18;;28496:83;28595:18;;;28588:34;;;96546:40:0;;::::2;::::0;;;;28437:2:1;96546:40:0;;::::2;96006:588;119682:1:::1;95787:807:::0;;;;;:::o;99258:844::-;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;99501:22:::1;99526:39;99540:6;99548:16;99526:13;:39::i;:::-;99501:64:::0;-1:-1:-1;99576:68:0::1;99603:6:::0;99501:64;99617:19;99576:26:::1;:68::i;100370:560::-:0;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;100524:22:::1;100549:40;100563:6;100571:17;100549:13;:40::i;:::-;100524:65:::0;-1:-1:-1;100600:68:0::1;100627:6:::0;100524:65;100641:19;100600:26:::1;:68::i;:::-;100679:53;100699:4:::0;100705:19;100679::::1;:53::i;:::-;100743:60;100762:4:::0;100768:6;100776:19;100743:18:::1;:60::i;:::-;100816:26;::::0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:56;;100846:19;;100816:26;:56:::1;::::0;100846:19;;100816:56:::1;:::i;:::-;::::0;;;-1:-1:-1;100883:39:0::1;::::0;-1:-1:-1;100894:6:0;100902:19;;100883:10:::1;:39::i;97808:909::-:0;119631:11;;;;;;;119623:48;;;;-1:-1:-1;;;119623:48:0;;20635:2:1;119623:48:0;;;20617:21:1;20674:2;20654:18;;;20647:30;20713:26;20693:18;;;20686:54;20757:18;;119623:48:0;20433:348:1;119623:48:0;98036:3:::1;119528:1;119522:3;:7;119514:43;;;::::0;-1:-1:-1;;;119514:43:0;;20988:2:1;119514:43:0::1;::::0;::::1;20970:21:1::0;21027:2;21007:18;;;21000:30;21066:25;21046:18;;;21039:53;21109:18;;119514:43:0::1;20786:347:1::0;119514:43:0::1;98052:22:::2;98077:86;98105:6;98126:26;98077:13;:86::i;:::-;98052:111;;98174:45;98201:6;98209:4;98215:3;98174:26;:45::i;:::-;98230:37;98249:4;98255:6;98263:3;98230:18;:37::i;:::-;98278:30;98298:4;98304:3;98278:19;:30::i;9067:201::-:0;8204:7;8231:6;-1:-1:-1;;;;;8231:6:0;6956:10;8378:23;8370:68;;;;-1:-1:-1;;;8370:68:0;;31047:2:1;8370:68:0;;;31029:21:1;;;31066:18;;;31059:30;31125:34;31105:18;;;31098:62;31177:18;;8370:68:0;30845:356:1;8370:68:0;-1:-1:-1;;;;;9156:22:0;::::1;9148:73;;;::::0;-1:-1:-1;;;9148:73:0;;34872:2:1;9148:73:0::1;::::0;::::1;34854:21:1::0;34911:2;34891:18;;;34884:30;34950:34;34930:18;;;34923:62;35021:8;35001:18;;;34994:36;35047:19;;9148:73:0::1;34670:402:1::0;9148:73:0::1;9232:28;9251:8;9232:18;:28::i;114841:311::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;115000:16:0;115009:6;115000:8;:16::i;:::-;114993:23;;115035:4;:11;;;115027:37;;;;-1:-1:-1;;;115027:37:0;;32970:2:1;115027:37:0;;;32952:21:1;33009:2;32989:18;;;32982:30;33048:15;33028:18;;;33021:43;33081:18;;115027:37:0;32768:337:1;115027:37:0;115099:11;115083:27;;;;;;;;:::i;:::-;:4;:12;;;:27;;;;;;;;:::i;:::-;;115075:69;;;;-1:-1:-1;;;115075:69:0;;35279:2:1;115075:69:0;;;35261:21:1;35318:2;35298:18;;;35291:30;35357:31;35337:18;;;35330:59;35406:18;;115075:69:0;35077:353:1;110953:428:0;111130:45;111156:4;111162:12;111130:25;:45::i;:::-;111108:120;;;;-1:-1:-1;;;111108:120:0;;35637:2:1;111108:120:0;;;35619:21:1;35676:2;35656:18;;;35649:30;35715:27;35695:18;;;35688:55;35760:18;;111108:120:0;35435:349:1;111108:120:0;111261:63;111283:6;111291:4;111297:12;6956:10;111261:21;:63::i;:::-;111239:134;;;;-1:-1:-1;;;111239:134:0;;35991:2:1;111239:134:0;;;35973:21:1;36030:2;36010:18;;;36003:30;36069:23;36049:18;;;36042:51;36110:18;;111239:134:0;35789:345:1;111239:134:0;110953:428;;;:::o;111389:274::-;111574:27;111588:4;111594:6;111574:13;:27::i;:::-;111558:12;:43;;111536:119;;;;-1:-1:-1;;;111536:119:0;;36341:2:1;111536:119:0;;;36323:21:1;36380:2;36360:18;;;36353:30;36419:28;36399:18;;;36392:56;36465:18;;111536:119:0;36139:350:1;114452:156:0;114576:3;114558:4;:15;;;:21;;;;:::i;:::-;114545:9;:34;114537:63;;;;-1:-1:-1;;;114537:63:0;;36696:2:1;114537:63:0;;;36678:21:1;36735:2;36715:18;;;36708:30;36774:18;36754;;;36747:46;36810:18;;114537:63:0;36494:340:1;10175:233:0;10244:4;8231:6;;-1:-1:-1;;;;;10267:15:0;;;8231:6;;10267:15;;:133;;-1:-1:-1;10301:10:0;;;;:88;;;;-1:-1:-1;10342:7:0;:10;-1:-1:-1;;;;;10334:18:0;;;10342:10;;10334:18;;:40;;-1:-1:-1;;10364:10:0;;-1:-1:-1;;;;;10364:10:0;;;10356:18;;;;10175:233::o;114616:217::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114756:9:0;;;;;;;;;114746:19;;;;;114738:46;;;;-1:-1:-1;;;114738:46:0;;37041:2:1;114738:46:0;;;37023:21:1;37080:2;37060:18;;;37053:30;37119:16;37099:18;;;37092:44;37153:18;;114738:46:0;36839:338:1;114738:46:0;114802:23;;;;;;;;:15;:23;;;;;;;;;114795:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114616:217;;;:::o;111851:602::-;111962:7;111987:19;112219:4;:16;;;112214:152;;112266:30;;112327:12;;;;112266:88;;;;;-1:-1:-1;;;;;112266:30:0;;;;:42;;:88;;;;3032:25:1;;;3020:2;3005:18;;2886:177;112266:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;112252:102;;112214:152;112419:26;;;;;;;;:18;:26;;;;;;112383:19;;112419:26;;112383:33;;112405:11;;112383:33;;:::i;:::-;:62;;;;:::i;:::-;112376:69;111851:602;-1:-1:-1;;;;111851:602:0:o;107606:203::-;107690:26;;107686:116;;107733:20;;-1:-1:-1;;;;;107733:20:0;:26;6956:10;107774:15;;107733:57;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107606:203;;:::o;105666:1932::-;105813:4;:19;;;:31;;;105805:66;;;;-1:-1:-1;;;105805:66:0;;39861:2:1;105805:66:0;;;39843:21:1;39900:2;39880:18;;;39873:30;39939:24;39919:18;;;39912:52;39981:18;;105805:66:0;39659:346:1;105805:66:0;105890:4;:11;;;105882:37;;;;-1:-1:-1;;;105882:37:0;;32970:2:1;105882:37:0;;;32952:21:1;33009:2;32989:18;;;32982:30;33048:15;33028:18;;;33021:43;33081:18;;105882:37:0;32768:337:1;105882:37:0;105995:19;;;;:42;105958:90;;105930:25;105958:90;;;:22;:90;;;;;;;;106200:63;;;;;40185:10:1;40173:23;;106200:63:0;;;40155:42:1;-1:-1:-1;;;;;105958:90:0;;;;;;106200:43;;40128:18:1;;106200:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;106167:96:0;6956:10;-1:-1:-1;;;;;106167:96:0;;106145:173;;;;-1:-1:-1;;;106145:173:0;;40691:2:1;106145:173:0;;;40673:21:1;40730:2;40710:18;;;40703:30;40769:29;40749:18;;;40742:57;40816:18;;106145:173:0;40489:351:1;106145:173:0;106444:4;:19;;;:29;;;106439:306;;106573:19;;;;:42;106516:118;;;;;;:34;:118;;;;;;;;:138;;;;;;;;;;:146;;;;;;;;;;;:151;106490:243;;;;-1:-1:-1;;;106490:243:0;;41047:2:1;106490:243:0;;;41029:21:1;41086:2;41066:18;;;41059:30;41125:32;41105:18;;;41098:60;41175:18;;106490:243:0;40845:354:1;106490:243:0;106891:19;;;;:42;;;:46;106887:277;;106954:20;;;107095:19;;;:42;;;106954:198;;;;;-1:-1:-1;;;;;41422:55:1;;;106954:198:0;;;41404:74:1;41526:10;41514:23;;41494:18;;;41487:51;41554:18;;;41547:34;;;;106954:20:0;;;:49;;41377:18:1;;106954:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106887:277;107225:19;;;;:42;107176:102;;;;;;:34;:102;;;;;;;;:122;;;;;;;;;;:130;;;;;;;;;;:135;;107310:1;;107176:102;:135;;107310:1;;107176:135;:::i;:::-;;;;-1:-1:-1;;107322:24:0;;;;;;;:16;:24;;;;;;;;107347:19;;;;:42;107322:68;;;;;;;;;:107;;;;;;;;;;;;;;;;;;;;;;107525:65;;41791:38:1;;;-1:-1:-1;;;;;41865:55:1;;41845:18;;;41838:83;;;;41937:18;;41930:51;107525:65:0;;41779:2:1;41764:18;107525:65:0;41592:395:1;9428:191:0;9502:16;9521:6;;-1:-1:-1;;;;;9538:17:0;;;;;;;;;;9571:40;;9521:6;;;;;;;9571:40;;9502:16;9571:40;9491:128;9428:191;:::o;105364:294::-;105471:22;105496:16;105505:6;105496:8;:16::i;:::-;105471:41;;105528:9;105523:128;105539:30;;;105523:128;;;105591:48;105602:4;105608:6;105616:19;;105636:1;105616:22;;;;;;;:::i;105591:48::-;105571:3;;;;:::i;:::-;;;;105523:128;;;;105460:198;105364:294;;;:::o;115160:1707::-;115239:19;;:23;;115231:66;;;;-1:-1:-1;;;115231:66:0;;42194:2:1;115231:66:0;;;42176:21:1;42233:2;42213:18;;;42206:30;42272:32;42252:18;;;42245:60;42322:18;;115231:66:0;41992:354:1;115231:66:0;115332:4;:19;;;:29;;;:58;;;;;115365:4;:20;;;:25;;115389:1;115365:25;115332:58;115330:61;115308:136;;;;-1:-1:-1;;;115308:136:0;;42553:2:1;115308:136:0;;;42535:21:1;42592:2;42572:18;;;42565:30;42631:27;42611:18;;;42604:55;42676:18;;115308:136:0;42351:349:1;115308:136:0;115462:4;:16;;;115457:174;;115554:1;115527:4;:16;;;115521:30;:34;115495:124;;;;-1:-1:-1;;;115495:124:0;;42907:2:1;115495:124:0;;;42889:21:1;42946:2;42926:18;;;42919:30;42985;42965:18;;;42958:58;43033:18;;115495:124:0;42705:352:1;115495:124:0;115647:4;:19;;;:31;;;115643:389;;;115767:15;;;115721:19;;;:42;115767:15;;;;;;;115721:61;;;;115695:153;;;;-1:-1:-1;;;115695:153:0;;43264:2:1;115695:153:0;;;43246:21:1;43303:2;43283:18;;;43276:30;43342:32;43322:18;;;43315:60;43392:18;;115695:153:0;43062:354:1;115695:153:0;115643:389;;;115907:19;;;;:42;:47;;;115881:139;;;;-1:-1:-1;;;115881:139:0;;43264:2:1;115881:139:0;;;43246:21:1;43303:2;43283:18;;;43276:30;43342:32;43322:18;;;43315:60;43392:18;;115881:139:0;43062:354:1;115881:139:0;116064:17;116048:4;:12;;;:33;;;;;;;;:::i;:::-;;116044:816;;;116124:1;116106:4;:15;;;:19;116098:51;;;;-1:-1:-1;;;116098:51:0;;43623:2:1;116098:51:0;;;43605:21:1;43662:2;43642:18;;;43635:30;43701:21;43681:18;;;43674:49;43740:18;;116098:51:0;43421:343:1;116098:51:0;116172:14;;;;:19;116164:50;;;;-1:-1:-1;;;116164:50:0;;43971:2:1;116164:50:0;;;43953:21:1;44010:2;43990:18;;;43983:30;44049:20;44029:18;;;44022:48;44087:18;;116164:50:0;43769:342:1;116044:816:0;116252:16;116236:4;:12;;;:32;;;;;;;;:::i;:::-;;116232:628;;;116293:15;;;;:20;116285:52;;;;-1:-1:-1;;;116285:52:0;;43623:2:1;116285:52:0;;;43605:21:1;43662:2;43642:18;;;43635:30;43701:21;43681:18;;;43674:49;43740:18;;116285:52:0;43421:343:1;116285:52:0;116415:4;116398;:14;;;:21;;;;:::i;:::-;116397:30;;116423:4;116397:30;:::i;:::-;116378:4;:14;;;:50;116352:130;;;;-1:-1:-1;;;116352:130:0;;43971:2:1;116352:130:0;;;43953:21:1;44010:2;43990:18;;;43983:30;44049:20;44029:18;;;44022:48;44087:18;;116352:130:0;43769:342:1;116232:628:0;116520:26;116504:4;:12;;;:42;;;;;;;;:::i;:::-;;116500:360;;;116589:1;116571:4;:15;;;:19;116563:51;;;;-1:-1:-1;;;116563:51:0;;43623:2:1;116563:51:0;;;43605:21:1;43662:2;43642:18;;;43635:30;43701:21;43681:18;;;43674:49;43740:18;;116563:51:0;43421:343:1;116500:360:0;116818:30;;-1:-1:-1;;;116818:30:0;;44597:2:1;116818:30:0;;;44579:21:1;44636:2;44616:18;;;44609:30;44675:22;44655:18;;;44648:50;44715:18;;116818:30:0;44395:344:1;112572:282:0;112721:24;;;;112700:4;;112721:28;;;112717:108;;-1:-1:-1;112789:24:0;;;;112773:40;;;;;112766:47;;112717:108;-1:-1:-1;112842:4:0;112572:282;;;;:::o;112969:593::-;113166:20;;;;113145:4;;113166:24;;;113162:371;;113207:25;113235:4;:16;;;:206;;-1:-1:-1;;;;;113397:36:0;;;;;;:25;:36;;;;;;;;:44;;;;;;;;;;;;;113332:33;;;:22;:33;;;;;:41;;;;;;;;;:109;;113397:44;113332:109;:::i;:::-;113235:206;;;-1:-1:-1;;;;;113271:33:0;;;;;;:22;:33;;;;;;;;:41;;;;;;;;;;;113235:206;113501:20;;;;113207:234;;-1:-1:-1;113465:56:0;;:32;113485:12;113207:234;113465:32;:::i;:::-;:56;;113458:63;;;;;113162:371;-1:-1:-1;113550:4:0;112969:593;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:252::-;245:6;253;306:2;294:9;285:7;281:23;277:32;274:52;;;322:1;319;312:12;274:52;345:28;363:9;345:28;:::i;:::-;335:38;420:2;405:18;;;;392:32;;-1:-1:-1;;;178:252:1:o;435:251::-;519:6;572:2;560:9;551:7;547:23;543:32;540:52;;;588:1;585;578:12;540:52;627:7;622:2;611:9;607:18;604:31;601:51;;;648:1;645;638:12;601:51;-1:-1:-1;671:9:1;435:251;-1:-1:-1;435:251:1:o;691:156::-;757:20;;817:4;806:16;;796:27;;786:55;;837:1;834;827:12;852:182;909:6;962:2;950:9;941:7;937:23;933:32;930:52;;;978:1;975;968:12;930:52;1001:27;1018:9;1001:27;:::i;1517:179::-;-1:-1:-1;;;;;1621:5:1;1617:54;1610:5;1607:65;1597:93;;1686:1;1683;1676:12;1701:304;1792:6;1845:2;1833:9;1824:7;1820:23;1816:32;1813:52;;;1861:1;1858;1851:12;1813:52;1900:9;1887:23;1919:56;1969:5;1919:56;:::i;2512:180::-;2571:6;2624:2;2612:9;2603:7;2599:23;2595:32;2592:52;;;2640:1;2637;2630:12;2592:52;-1:-1:-1;2663:23:1;;2512:180;-1:-1:-1;2512:180:1:o;2697:184::-;2755:6;2808:2;2796:9;2787:7;2783:23;2779:32;2776:52;;;2824:1;2821;2814:12;2776:52;2847:28;2865:9;2847:28;:::i;3363:165::-;3433:5;3478:2;3469:6;3464:3;3460:16;3456:25;3453:45;;;3494:1;3491;3484:12;3533:388;3617:8;3627:6;3681:3;3674:4;3666:6;3662:17;3658:27;3648:55;;3699:1;3696;3689:12;3648:55;-1:-1:-1;3722:20:1;;3765:18;3754:30;;3751:50;;;3797:1;3794;3787:12;3751:50;3834:4;3826:6;3822:17;3810:29;;3894:3;3887:4;3877:6;3874:1;3870:14;3862:6;3858:27;3854:38;3851:47;3848:67;;;3911:1;3908;3901:12;3848:67;3533:388;;;;;:::o;3926:904::-;4105:6;4113;4121;4129;4137;4190:3;4178:9;4169:7;4165:23;4161:33;4158:53;;;4207:1;4204;4197:12;4158:53;4230:28;4248:9;4230:28;:::i;:::-;4220:38;;4305:2;4294:9;4290:18;4277:32;4267:42;;4360:2;4349:9;4345:18;4332:32;4383:18;4424:2;4416:6;4413:14;4410:34;;;4440:1;4437;4430:12;4410:34;4463:77;4532:7;4523:6;4512:9;4508:22;4463:77;:::i;:::-;4453:87;;4593:2;4582:9;4578:18;4565:32;4549:48;;4622:2;4612:8;4609:16;4606:36;;;4638:1;4635;4628:12;4606:36;;4677:93;4762:7;4751:8;4740:9;4736:24;4677:93;:::i;:::-;3926:904;;;;-1:-1:-1;3926:904:1;;-1:-1:-1;4789:8:1;;4651:119;3926:904;-1:-1:-1;;;3926:904:1:o;5411:344::-;5478:6;5486;5539:2;5527:9;5518:7;5514:23;5510:32;5507:52;;;5555:1;5552;5545:12;5507:52;5594:9;5581:23;5613:56;5663:5;5613:56;:::i;:::-;5688:5;-1:-1:-1;5712:37:1;5745:2;5730:18;;5712:37;:::i;:::-;5702:47;;5411:344;;;;;:::o;6048:529::-;6141:6;6149;6157;6210:2;6198:9;6189:7;6185:23;6181:32;6178:52;;;6226:1;6223;6216:12;6178:52;6249:28;6267:9;6249:28;:::i;:::-;6239:38;;6328:2;6317:9;6313:18;6300:32;6355:18;6347:6;6344:30;6341:50;;;6387:1;6384;6377:12;6341:50;6426:91;6509:7;6500:6;6489:9;6485:22;6426:91;:::i;:::-;6048:529;;6536:8;;-1:-1:-1;6400:117:1;;-1:-1:-1;;;;6048:529:1:o;6582:163::-;6649:20;;6709:10;6698:22;;6688:33;;6678:61;;6735:1;6732;6725:12;6750:326;6823:6;6831;6839;6892:2;6880:9;6871:7;6867:23;6863:32;6860:52;;;6908:1;6905;6898:12;6860:52;6931:27;6948:9;6931:27;:::i;:::-;6921:37;;6977;7010:2;6999:9;6995:18;6977:37;:::i;:::-;6967:47;;7033:37;7066:2;7055:9;7051:18;7033:37;:::i;:::-;7023:47;;6750:326;;;;;:::o;7081:118::-;7167:5;7160:13;7153:21;7146:5;7143:32;7133:60;;7189:1;7186;7179:12;7204:128;7269:20;;7298:28;7269:20;7298:28;:::i;7337:313::-;7401:6;7409;7462:2;7450:9;7441:7;7437:23;7433:32;7430:52;;;7478:1;7475;7468:12;7430:52;7501:28;7519:9;7501:28;:::i;:::-;7491:38;;7579:2;7568:9;7564:18;7551:32;7592:28;7614:5;7592:28;:::i;:::-;7639:5;7629:15;;;7337:313;;;;;:::o;7848:600::-;7949:6;7957;7965;7973;8026:2;8014:9;8005:7;8001:23;7997:32;7994:52;;;8042:1;8039;8032:12;7994:52;8065:27;8082:9;8065:27;:::i;:::-;8055:37;;8111;8144:2;8133:9;8129:18;8111:37;:::i;:::-;8101:47;;8199:2;8188:9;8184:18;8171:32;8226:18;8218:6;8215:30;8212:50;;;8258:1;8255;8248:12;8212:50;8297:91;8380:7;8371:6;8360:9;8356:22;8297:91;:::i;:::-;7848:600;;;;-1:-1:-1;8407:8:1;-1:-1:-1;;;;7848:600:1:o;8453:435::-;8506:3;8544:5;8538:12;8571:6;8566:3;8559:19;8597:4;8626:2;8621:3;8617:12;8610:19;;8663:2;8656:5;8652:14;8684:1;8694:169;8708:6;8705:1;8702:13;8694:169;;;8769:13;;8757:26;;8803:12;;;;8838:15;;;;8730:1;8723:9;8694:169;;;-1:-1:-1;8879:3:1;;8453:435;-1:-1:-1;;;;;8453:435:1:o;8893:465::-;9150:2;9139:9;9132:21;9113:4;9176:56;9228:2;9217:9;9213:18;9205:6;9176:56;:::i;:::-;9280:9;9272:6;9268:22;9263:2;9252:9;9248:18;9241:50;9308:44;9345:6;9337;9308:44;:::i;:::-;9300:52;8893:465;-1:-1:-1;;;;;8893:465:1:o;9363:184::-;9415:77;9412:1;9405:88;9512:4;9509:1;9502:15;9536:4;9533:1;9526:15;10055:258;10127:1;10137:113;10151:6;10148:1;10145:13;10137:113;;;10227:11;;;10221:18;10208:11;;;10201:39;10173:2;10166:10;10137:113;;;10268:6;10265:1;10262:13;10259:48;;;-1:-1:-1;;10303:1:1;10285:16;;10278:27;10055:258::o;10318:317::-;10360:3;10398:5;10392:12;10425:6;10420:3;10413:19;10441:63;10497:6;10490:4;10485:3;10481:14;10474:4;10467:5;10463:16;10441:63;:::i;:::-;10549:2;10537:15;10554:66;10533:88;10524:98;;;;10624:4;10520:109;;10318:317;-1:-1:-1;;10318:317:1:o;10640:1523::-;11250:6;11242;11238:19;11227:9;11220:38;11306:6;11298;11294:19;11289:2;11278:9;11274:18;11267:47;11362:6;11354;11350:19;11345:2;11334:9;11330:18;11323:47;11201:4;11400:1;11392:6;11389:13;11379:201;;11436:77;11433:1;11426:88;11537:4;11534:1;11527:15;11565:4;11562:1;11555:15;11379:201;11616:6;11611:2;11600:9;11596:18;11589:34;11632:44;11671:3;11660:9;11656:19;11648:6;5830:13;5823:21;5811:34;;5760:91;11632:44;5830:13;;5823:21;11724:3;11709:19;;5811:34;5830:13;;5823:21;11777:3;11762:19;;5811:34;9643:12;;9636:20;9629:28;11844:3;11829:19;;9617:41;9721:4;9710:16;;9704:23;9697:31;9690:39;9674:14;;;9667:63;9824:12;;9838:4;9820:23;11913:3;11898:19;;9808:36;9907:4;9896:16;;9890:23;9883:31;9876:39;9860:14;;;9853:63;9979:4;9968:16;;9962:23;9955:31;9948:39;9932:14;;;9925:63;10037:4;10026:16;;10020:23;10004:14;;;9997:47;11955:3;11949;11938:9;11934:19;11927:32;11976:46;12017:3;12006:9;12002:19;11994:6;11976:46;:::i;:::-;12053:3;12038:19;;12031:36;;;;-1:-1:-1;12098:3:1;12083:19;;12076:36;;;;12143:3;12128:19;;;12121:36;11968:54;10640:1523;-1:-1:-1;;;;;;;;;;10640:1523:1:o;12634:1171::-;12839:6;12847;12855;12863;12871;12879;12932:3;12920:9;12911:7;12907:23;12903:33;12900:53;;;12949:1;12946;12939:12;12900:53;12972:28;12990:9;12972:28;:::i;:::-;12962:38;;13051:2;13040:9;13036:18;13023:32;13074:18;13115:2;13107:6;13104:14;13101:34;;;13131:1;13128;13121:12;13101:34;13154:77;13223:7;13214:6;13203:9;13199:22;13154:77;:::i;:::-;13144:87;;13284:2;13273:9;13269:18;13256:32;13240:48;;13313:2;13303:8;13300:16;13297:36;;;13329:1;13326;13319:12;13297:36;13368:93;13453:7;13442:8;13431:9;13427:24;13368:93;:::i;:::-;13480:8;;-1:-1:-1;13342:119:1;-1:-1:-1;13568:2:1;13553:18;;13540:32;;-1:-1:-1;13584:16:1;;;13581:36;;;13613:1;13610;13603:12;13581:36;;13652:93;13737:7;13726:8;13715:9;13711:24;13652:93;:::i;:::-;12634:1171;;;;-1:-1:-1;12634:1171:1;;-1:-1:-1;12634:1171:1;;13764:8;;12634:1171;-1:-1:-1;;;12634:1171:1:o;13810:241::-;13866:6;13919:2;13907:9;13898:7;13894:23;13890:32;13887:52;;;13935:1;13932;13925:12;13887:52;13974:9;13961:23;13993:28;14015:5;13993:28;:::i;14056:184::-;14108:77;14105:1;14098:88;14205:4;14202:1;14195:15;14229:4;14226:1;14219:15;14245:250;14312:2;14306:9;14354:6;14342:19;;14391:18;14376:34;;14412:22;;;14373:62;14370:88;;;14438:18;;:::i;:::-;14474:2;14467:22;14245:250;:::o;14500:152::-;14577:20;;14626:1;14616:12;;14606:40;;14642:1;14639;14632:12;14657:620;14715:5;14763:4;14751:9;14746:3;14742:19;14738:30;14735:50;;;14781:1;14778;14771:12;14735:50;14814:4;14808:11;14858:4;14850:6;14846:17;14929:6;14917:10;14914:22;14893:18;14881:10;14878:34;14875:62;14872:88;;;14940:18;;:::i;:::-;14976:4;14969:24;15011:6;-1:-1:-1;15011:6:1;15041:23;;15073:30;15041:23;15073:30;:::i;:::-;15112:23;;15187:2;15172:18;;15159:32;15200:30;15159:32;15200:30;:::i;:::-;15258:2;15246:15;;;;15239:32;14657:620;;-1:-1:-1;;14657:620:1:o;15282:754::-;15342:5;15390:4;15378:9;15373:3;15369:19;15365:30;15362:50;;;15408:1;15405;15398:12;15362:50;15441:2;15435:9;15483:4;15475:6;15471:17;15554:6;15542:10;15539:22;15518:18;15506:10;15503:34;15500:62;15497:88;;;15565:18;;:::i;:::-;15601:2;15594:22;15634:6;-1:-1:-1;15634:6:1;15664:27;15681:9;15664:27;:::i;:::-;15656:6;15649:43;15744:2;15733:9;15729:18;15716:32;15757:30;15779:7;15757:30;:::i;:::-;15815:2;15803:15;;15796:32;15880:2;15865:18;;15852:32;15893:30;15852:32;15893:30;:::i;:::-;15951:2;15939:15;;15932:32;16025:2;16010:18;;;15997:32;15980:15;;15973:57;;;;15282:754;;-1:-1:-1;15282:754:1:o;16041:778::-;16084:5;16137:3;16130:4;16122:6;16118:17;16114:27;16104:55;;16155:1;16152;16145:12;16104:55;16191:6;16178:20;16217:18;16254:2;16250;16247:10;16244:36;;;16260:18;;:::i;:::-;16394:2;16388:9;16456:4;16448:13;;16299:66;16444:22;;;16468:2;16440:31;16436:40;16424:53;;;16492:18;;;16512:22;;;16489:46;16486:72;;;16538:18;;:::i;:::-;16578:10;16574:2;16567:22;16613:2;16605:6;16598:18;16659:3;16652:4;16647:2;16639:6;16635:15;16631:26;16628:35;16625:55;;;16676:1;16673;16666:12;16625:55;16740:2;16733:4;16725:6;16721:17;16714:4;16706:6;16702:17;16689:54;16787:1;16780:4;16775:2;16767:6;16763:15;16759:26;16752:37;16807:6;16798:15;;;;;;16041:778;;;;:::o;16824:1263::-;16881:5;16929:6;16917:9;16912:3;16908:19;16904:32;16901:52;;;16949:1;16946;16939:12;16901:52;16971:17;;:::i;:::-;16962:26;;17011:28;17029:9;17011:28;:::i;:::-;17004:5;16997:43;17072:37;17105:2;17094:9;17090:18;17072:37;:::i;:::-;17067:2;17060:5;17056:14;17049:61;17142:37;17175:2;17164:9;17160:18;17142:37;:::i;:::-;17137:2;17130:5;17126:14;17119:61;17212:47;17255:2;17244:9;17240:18;17212:47;:::i;:::-;17207:2;17200:5;17196:14;17189:71;17293:36;17324:3;17313:9;17309:19;17293:36;:::i;:::-;17287:3;17280:5;17276:15;17269:61;17363:36;17394:3;17383:9;17379:19;17363:36;:::i;:::-;17357:3;17350:5;17346:15;17339:61;17433:36;17464:3;17453:9;17449:19;17433:36;:::i;:::-;17427:3;17420:5;17416:15;17409:61;17503:55;17554:3;17548;17537:9;17533:19;17503:55;:::i;:::-;17497:3;17490:5;17486:15;17479:80;17578:3;17617:56;17669:3;17664:2;17653:9;17649:18;17617:56;:::i;:::-;17608:6;17601:5;17597:18;17590:84;17725:6;17714:9;17710:22;17697:36;17756:18;17748:6;17745:30;17742:50;;;17788:1;17785;17778:12;17742:50;17824:46;17866:3;17857:6;17846:9;17842:22;17824:46;:::i;:::-;17819:2;17812:5;17808:14;17801:70;;;17935:3;17924:9;17920:19;17907:33;17898:6;17891:5;17887:18;17880:61;18005:3;17994:9;17990:19;17977:33;17968:6;17961:5;17957:18;17950:61;18075:3;18064:9;18060:19;18047:33;18038:6;18031:5;18027:18;18020:61;16824:1263;;;;:::o;18092:423::-;18187:6;18195;18248:2;18236:9;18227:7;18223:23;18219:32;18216:52;;;18264:1;18261;18254:12;18216:52;18304:9;18291:23;18337:18;18329:6;18326:30;18323:50;;;18369:1;18366;18359:12;18323:50;18392:61;18445:7;18436:6;18425:9;18421:22;18392:61;:::i;:::-;18382:71;;;18472:37;18505:2;18494:9;18490:18;18472:37;:::i;18520:254::-;18585:6;18593;18646:2;18634:9;18625:7;18621:23;18617:32;18614:52;;;18662:1;18659;18652:12;18614:52;18685:28;18703:9;18685:28;:::i;:::-;18675:38;;18732:36;18764:2;18753:9;18749:18;18732:36;:::i;18779:332::-;18986:6;18975:9;18968:25;19029:2;19024;19013:9;19009:18;19002:30;18949:4;19049:56;19101:2;19090:9;19086:18;19078:6;19049:56;:::i;19116:423::-;19211:6;19219;19272:2;19260:9;19251:7;19247:23;19243:32;19240:52;;;19288:1;19285;19278:12;19240:52;19311:28;19329:9;19311:28;:::i;:::-;19301:38;;19390:2;19379:9;19375:18;19362:32;19417:18;19409:6;19406:30;19403:50;;;19449:1;19446;19439:12;19403:50;19472:61;19525:7;19516:6;19505:9;19501:22;19472:61;:::i;:::-;19462:71;;;19116:423;;;;;:::o;19843:322::-;19917:6;19925;19933;19986:2;19974:9;19965:7;19961:23;19957:32;19954:52;;;20002:1;19999;19992:12;19954:52;20025:28;20043:9;20025:28;:::i;:::-;20015:38;;20072:36;20104:2;20093:9;20089:18;20072:36;:::i;:::-;20062:46;;20155:2;20144:9;20140:18;20127:32;20117:42;;19843:322;;;;;:::o;21870:184::-;21922:77;21919:1;21912:88;22019:4;22016:1;22009:15;22043:4;22040:1;22033:15;22059:128;22099:3;22130:1;22126:6;22123:1;22120:13;22117:39;;;22136:18;;:::i;:::-;-1:-1:-1;22172:9:1;;22059:128::o;22192:184::-;22244:77;22241:1;22234:88;22341:4;22338:1;22331:15;22365:4;22362:1;22355:15;24124:238;24161:3;24205:4;24198:5;24194:16;24229:7;24219:41;;24240:18;;:::i;:::-;24289:66;24276:80;;24124:238;-1:-1:-1;;24124:238:1:o;24367:580::-;24444:4;24450:6;24510:11;24497:25;24600:66;24589:8;24573:14;24569:29;24565:102;24545:18;24541:127;24531:155;;24682:1;24679;24672:12;24531:155;24709:33;;24761:20;;;-1:-1:-1;24804:18:1;24793:30;;24790:50;;;24836:1;24833;24826:12;24790:50;24869:4;24857:17;;-1:-1:-1;24900:14:1;24896:27;;;24886:38;;24883:58;;;24937:1;24934;24927:12;25538:228;25578:7;25704:1;25636:66;25632:74;25629:1;25626:81;25621:1;25614:9;25607:17;25603:105;25600:131;;;25711:18;;:::i;:::-;-1:-1:-1;25751:9:1;;25538:228::o;25771:325::-;25859:6;25854:3;25847:19;25911:6;25904:5;25897:4;25892:3;25888:14;25875:43;;25963:1;25956:4;25947:6;25942:3;25938:16;25934:27;25927:38;25829:3;26085:4;26015:66;26010:2;26002:6;25998:15;25994:88;25989:3;25985:98;25981:109;25974:116;;25771:325;;;;:::o;26101:698::-;26400:6;26389:9;26382:25;26443:3;26438:2;26427:9;26423:18;26416:31;26363:4;26470:62;26527:3;26516:9;26512:19;26504:6;26496;26470:62;:::i;:::-;26580:9;26572:6;26568:22;26563:2;26552:9;26548:18;26541:50;26608:49;26650:6;26642;26634;26608:49;:::i;:::-;-1:-1:-1;;;;;26693:55:1;;;;26688:2;26673:18;;26666:83;-1:-1:-1;;26780:3:1;26765:19;26758:35;26600:57;26101:698;-1:-1:-1;;;;;26101:698:1:o;26804:184::-;26874:6;26927:2;26915:9;26906:7;26902:23;26898:32;26895:52;;;26943:1;26940;26933:12;26895:52;-1:-1:-1;26966:16:1;;26804:184;-1:-1:-1;26804:184:1:o;27655:245::-;27722:6;27775:2;27763:9;27754:7;27750:23;27746:32;27743:52;;;27791:1;27788;27781:12;27743:52;27823:9;27817:16;27842:28;27864:5;27842:28;:::i;29631:184::-;29689:6;29742:2;29730:9;29721:7;29717:23;29713:32;29710:52;;;29758:1;29755;29748:12;29710:52;29781:28;29799:9;29781:28;:::i;29820:195::-;29859:3;29890:66;29883:5;29880:77;29877:103;;;29960:18;;:::i;:::-;-1:-1:-1;30007:1:1;29996:13;;29820:195::o;30371:125::-;30411:4;30439:1;30436;30433:8;30430:34;;;30444:18;;:::i;:::-;-1:-1:-1;30481:9:1;;30371:125::o;31206:437::-;31285:1;31281:12;;;;31328;;;31349:61;;31403:4;31395:6;31391:17;31381:27;;31349:61;31456:2;31448:6;31445:14;31425:18;31422:38;31419:218;;;31493:77;31490:1;31483:88;31594:4;31591:1;31584:15;31622:4;31619:1;31612:15;31648:175;31685:3;31729:4;31722:5;31718:16;31758:4;31749:7;31746:17;31743:43;;;31766:18;;:::i;:::-;31815:1;31802:15;;31648:175;-1:-1:-1;;31648:175:1:o;32189:372::-;9643:12;;9636:20;9629:28;9617:41;;9721:4;9710:16;;;9704:23;9697:31;9690:39;9674:14;;;9667:63;32490:2;32485;32474:9;32470:18;32463:30;32387:4;32510:45;32551:2;32540:9;32536:18;32528:6;32510:45;:::i;32566:197::-;32604:3;32632:6;32673:2;32666:5;32662:14;32700:2;32691:7;32688:15;32685:41;;;32706:18;;:::i;:::-;32755:1;32742:15;;32566:197;-1:-1:-1;;;32566:197:1:o;33830:276::-;33961:3;33999:6;33993:13;34015:53;34061:6;34056:3;34049:4;34041:6;34037:17;34015:53;:::i;:::-;34084:16;;;;;33830:276;-1:-1:-1;;33830:276:1:o;34111:291::-;34288:6;34277:9;34270:25;34331:2;34326;34315:9;34311:18;34304:30;34251:4;34351:45;34392:2;34381:9;34377:18;34369:6;34351:45;:::i;37182:2472::-;-1:-1:-1;;;;;37580:15:1;;;37562:34;;37449:2;37615;37633:18;;;37626:30;;;37474:18;;;37691:22;;;37420:4;;37732:2;;37750:18;;;37787:1;37830:15;;;37815:31;;37811:40;;37874:6;37420:4;37908:1717;37922:6;37919:1;37916:13;37908:1717;;;38011:66;37999:9;37991:6;37987:22;37983:95;37978:3;37971:108;38131:6;38118:20;38218:66;38209:6;38193:14;38189:27;38185:100;38165:18;38161:125;38151:153;;38300:1;38297;38290:12;38151:153;38330:31;;38388:15;;;38431:19;;38463:58;38431:19;38463:58;:::i;:::-;38549:16;;38534:32;;38620:14;;;38607:28;38692:14;38688:26;;;38716:66;38684:99;38658:126;;38648:154;;38798:1;38795;38788:12;38648:154;38830:32;;38889:21;;38937:18;38926:30;;38923:50;;;38969:1;38966;38959:12;38923:50;39028:6;39024:2;39020:15;39004:14;39000:36;38993:5;38989:48;38986:68;;;39050:1;39047;39040:12;38986:68;39074:15;;;39067:27;;;39139:22;;;;39183:15;;;;-1:-1:-1;39227:16:1;;;39267:1;;39281:236;39297:6;39292:3;39289:15;39281:236;;;39405:10;39376:27;39394:8;39376:27;:::i;:::-;39372:44;39358:59;;39443:14;;;;39486:17;;;;39323:1;39314:11;;;;;39281:236;;;-1:-1:-1;;;39603:12:1;;;;39540:5;-1:-1:-1;39568:15:1;;;;37944:1;37937:9;37908:1717;;;-1:-1:-1;39642:6:1;;37182:2472;-1:-1:-1;;;;;;;;;;;;37182:2472:1:o;40208:276::-;40278:6;40331:2;40319:9;40310:7;40306:23;40302:32;40299:52;;;40347:1;40344;40337:12;40299:52;40379:9;40373:16;40398:56;40448:5;40398:56;:::i;44116:274::-;44156:1;44182;44172:189;;44217:77;44214:1;44207:88;44318:4;44315:1;44308:15;44346:4;44343:1;44336:15;44172:189;-1:-1:-1;44375:9:1;;44116:274::o
Swarm Source
ipfs://b90355c79836f90542d0c8d33752921b152610b8194df56cbf80d2a34371348e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.