Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
eLOCKS
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-19 */ /* //SPDX-License-Identifier: BUSL-1.1 Copyright 2024 Guru Network [email protected] Copyright 2024 Equalizer Exchange Business Source License 1.1 License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved. "Business Source License" is a trademark of MariaDB Corporation Ab. ----------------------------------------------------------------------------- Parameters Licensor: Guru Network & Equalizer Exchange Licensed Work: eLOCKS, eLockerRoom, eLOCK, Art & Solidity Smart Contracts, eLOCKS NFT, Artwork, Metadata, tangible or intangible parts, or parts of, or any software or property derived therefrom. The Licensed Work is (c) 2024 Guru Network and the Licensed Work is (c) 2024 Equalizer Exchange Additional Use Grant: Any uses listed and defined at any Self-addressed transactions on Ethereum Mainnet from 0x167d87a906da361a10061fe42bbe89451c2ee584 with explicit expression of Additional Use Grant Change Date: The earlier of 2028-12-31 or a date specified at any Self-addressed transactions on Ethereum Mainnet from 0x167d87a906da361a10061fe42bbe89451c2ee584 with explicit expression of Change Date Change License: GNU General Public License v2.0 or later ----------------------------------------------------------------------------- Terms The Licensor hereby grants you the right to copy, modify, create derivative works, redistribute, and make non-production use of the Licensed Work. The Licensor may make an Additional Use Grant, above, permitting limited production use. Effective on the Change Date, or the seventh anniversary of the first publicly available distribution of a specific version of the Licensed Work under this License, whichever comes first, the Licensor hereby grants you rights under the terms of the Change License, and the rights granted in the paragraph above terminate. If your use of the Licensed Work does not comply with the requirements currently in effect as described in this License, you must purchase a commercial license from the Licensor, its affiliated entities, or authorized resellers, or you must refrain from using the Licensed Work. All copies of the original and modified Licensed Work, and derivative works of the Licensed Work, are subject to this License. This License applies separately for each version of the Licensed Work and the Change Date may vary for each version of the Licensed Work released by Licensor. You must conspicuously display this License on each original or modified copy of the Licensed Work. If you receive the Licensed Work in original or modified form from a third party, the terms and conditions set forth in this License apply to your use of that work. Any use of the Licensed Work in violation of this License will automatically terminate your rights under this License for the current and all other versions of the Licensed Work. This License does not grant you any right in any trademark or logo of Licensor or its affiliates (provided that you may use a trademark or logo of Licensor as expressly required by this License). TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND TITLE. MariaDB hereby grants you permission to use this License’s text to license your works, and to refer to it using the trademark "Business Source License", as long as you comply with the Covenants of Licensor below. ----------------------------------------------------------------------------- Covenants of Licensor In consideration of the right to use this License’s text and the "Business Source License" name and trademark, Licensor covenants to MariaDB, and to all other recipients of the licensed work to be provided by Licensor: 1. To specify as the Change License the GPL Version 2.0 or any later version, or a license that is compatible with GPL Version 2.0 or a later version, where "compatible" means that software provided under the Change License can be included in a program with software provided under GPL Version 2.0 or a later version. Licensor may specify additional Change Licenses without limitation. 2. To either: (a) specify an additional grant of rights to use that does not impose any additional restriction on the right granted in this License, as the Additional Use Grant; or (b) insert the text "None". 3. To specify a Change Date. 4. Not to modify this License in any other way. ----------------------------------------------------------------------------- Notice The Business Source License (this document, or the "License") is not an Open Source license. However, the Licensed Work will eventually be made available under an Open Source License, as stated in this License. ----------------------------------------------------------------------------- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ----------------------------------------------------------------------------- FFFFF TTTTTTT M M GGGGG U U RRRRR U U FF TTT M M M M G U U RR R U U FFFFF TTT M M M G GGG U U RRRRR U U FF TTT M M M O G G U U RR R U U FF TTT M M GGGGG UUUU RR RRR UUUU https://eliteness.network Contact us at: https://discord.com/invite/QpyfMarNrV https://t.me/FTM1337 Community Mediums: https://medium.com/@ftm1337 https://twitter.com/ftm1337 */ pragma solidity 0.8.9; interface IERC20 { function balanceOf(address) external view returns (uint256); function totalSupply() external view returns (uint256); function decimals() external view returns (uint256); function symbol() external view returns (string memory); function name() external view returns (string memory); function approve(address, uint) external returns (bool); function transfer(address, uint) external returns (bool); function transferFrom(address, address, uint) external returns (bool); } // File: @openzeppelin/contracts-/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts-/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (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`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } interface IPair is IERC20 { function token0() external view returns (address); function token1() external view returns (address); function metadata() external view returns (uint256 dec0, uint256 dec1, uint256 r0, uint256 r1, bool st, address t0, address t1); function claimFees() external returns (uint,uint); } interface IVoter { function gauges(address pool) external view returns(IGauge); function factory() external view returns(IFactory); } interface IFactory { function isPair(address) external view returns (bool); } interface IGauge is IPair { function rewardTokens(uint) external view returns(IERC20); function rewardsListLength() external view returns (uint); function depositAll() external; function withdrawAll() external; function getReward(address, IERC20[] memory) external; } interface IeLocker { struct Referral { address agent; uint percent; } function pool() external view returns(IPair); function expiry() external view returns (uint256); function totalSupply() external view returns(uint); function gauge() external view returns(IGauge); function earner() external view returns(address); function apr() external view returns(uint); function tvl() external view returns(uint); function allEarnings() external view returns(IERC20[] memory, uint[] memory, uint[] memory, string[] memory); function referral() external view returns(Referral memory); function claimableFees() external view returns(uint, uint); function claimableRewards() external view returns(uint[] memory); function initialize(IPair _lp, uint _expiry, Referral memory _ref) external; function relock(uint _amt, uint _date) external; function increaseAmount(uint _amt) external; function extendDate(uint _date) external; } interface IArt { function _tokenURI(uint _tokenId) external view returns (string memory output); function _lockInfo(uint _lockID) external view returns (address[7] memory, uint[11] memory, uint[] memory, IERC20[] memory _rt, uint[] memory _ra, uint[] memory _rd, string[] memory _rs, IeLocker.Referral memory, string[4] memory _str); } interface ITvlGuru { function getAssetPrice(address asset) external view returns (uint256); } interface IAprGuru { function getApr(address rewarder) external view returns (uint256); } contract Clone { function clone(address implementation) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "Cl0"); } } // File: @openzeppelin/contracts-/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } pragma solidity 0.8.9; /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } } contract Guard { /// @dev reentrancy guard bool internal _locked; modifier guarded() { require(!_locked, "No re-entrancy"); _locked = true; _; _locked = false; } } contract eLOCKS is Guard, Clone, IERC721 { /// @dev ERC165 interface ID of ERC165 bytes4 internal constant ERC165_INTERFACE_ID = 0x01ffc9a7; /// @dev ERC165 interface ID of ERC721 bytes4 internal constant ERC721_INTERFACE_ID = 0x80ac58cd; /// @dev ERC165 interface ID of ERC721Metadata bytes4 internal constant ERC721_METADATA_INTERFACE_ID = 0x5b5e139f; /// @dev Mapping of interface id to bool about whether or not it's supported mapping(bytes4 => bool) internal supportedInterfaces; IArt public art; IVoter public voter; IFactory public factory; ITvlGuru public TvlGuru; IAprGuru public AprGuru; address public admin; address public feeSynthesizer; /// @dev Current count of token uint internal tokenId; IeLocker public design; mapping(uint => IeLocker) public lockers; mapping(uint => IeLocker.Referral) public referrals; event LockCreated(address indexed by, address indexed to, address indexed pool, uint amount, uint expiry, address agent, uint percent); function initialize(IeLocker _design, IArt _art, IVoter _vtr) external { require(admin == address(0), "!reinit"); art = _art; design = _design; voter = _vtr; factory = _vtr.factory(); supportedInterfaces[ERC165_INTERFACE_ID] = true; supportedInterfaces[ERC721_INTERFACE_ID] = true; supportedInterfaces[ERC721_METADATA_INTERFACE_ID] = true; admin = msg.sender; feeSynthesizer = msg.sender; // mint-ish emit Transfer(address(0), address(this), tokenId); // burn-ish emit Transfer(address(this), address(0), tokenId); } /*/////////////////////////////////////////////////////////////// METADATA & STORAGE //////////////////////////////////////////////////////////////*/ function name() public pure returns(string memory) { return unicode"eLOCKS: Yield-Paying Liquidity Lockers 🔐"; } function symbol() public pure returns(string memory) { return "eLOCKS"; } /// @dev Returns current token URI metadata /// @param _tokenId Token ID to fetch URI for. function tokenURI(uint _tokenId) external view returns (string memory) { return art._tokenURI(_tokenId); } /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ /// @dev Mapping from NFT ID to the address that owns it. mapping(uint => address) internal idToOwner; /// @dev Mapping from owner address to count of his tokens. mapping(address => uint) internal ownerToNFTokenCount; /// @dev Returns the address of the owner of the NFT. /// @param _tokenId The identifier for an NFT. function ownerOf(uint _tokenId) public view returns (address) { return idToOwner[_tokenId]; } /// @dev Returns the number of NFTs owned by `_owner`. /// Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid. /// @param _owner Address for whom to query the balance. function _balance(address _owner) internal view returns (uint) { return ownerToNFTokenCount[_owner]; } /// @dev Returns the number of NFTs owned by `_owner`. /// Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid. /// @param _owner Address for whom to query the balance. function balanceOf(address _owner) external view returns (uint) { return _balance(_owner); } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ /// @dev Mapping from NFT ID to approved address. mapping(uint => address) internal idToApprovals; /// @dev Mapping from owner address to mapping of operator addresses. mapping(address => mapping(address => bool)) internal ownerToOperators; mapping(uint => uint) public ownership_change; /// @dev Get the approved address for a single NFT. /// @param _tokenId ID of the NFT to query the approval of. function getApproved(uint _tokenId) external view returns (address) { return idToApprovals[_tokenId]; } /// @dev Checks if `_operator` is an approved operator for `_owner`. /// @param _owner The address that owns the NFTs. /// @param _operator The address that acts on behalf of the owner. function isApprovedForAll(address _owner, address _operator) external view returns (bool) { return (ownerToOperators[_owner])[_operator]; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ /// @dev Set or reaffirm the approved address for an NFT. The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner. /// Throws if `_tokenId` is not a valid NFT. (NOTE: This is not written the EIP) /// Throws if `_approved` is the current owner. (NOTE: This is not written the EIP) /// @param _approved Address to be approved for the given NFT ID. /// @param _tokenId ID of the token to be approved. function approve(address _approved, uint _tokenId) public { address owner = idToOwner[_tokenId]; // Throws if `_tokenId` is not a valid NFT require(owner != address(0)); // Throws if `_approved` is the current owner require(_approved != owner); // Check requirements bool senderIsOwner = (idToOwner[_tokenId] == msg.sender); bool senderIsApprovedForAll = (ownerToOperators[owner])[msg.sender]; require(senderIsOwner || senderIsApprovedForAll); // Set the approval idToApprovals[_tokenId] = _approved; emit Approval(owner, _approved, _tokenId); } /// @dev Enables or disables approval for a third party ("operator") to manage all of /// `msg.sender`'s assets. It also emits the ApprovalForAll event. /// Throws if `_operator` is the `msg.sender`. (NOTE: This is not written the EIP) /// @notice This works even if sender doesn't own any tokens at the time. /// @param _operator Address to add to the set of authorized operators. /// @param _approved True if the operators is approved, false to revoke approval. function setApprovalForAll(address _operator, bool _approved) external { // Throws if `_operator` is the `msg.sender` assert(_operator != msg.sender); ownerToOperators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /* TRANSFER FUNCTIONS */ /// @dev Clear an approval of a given address /// Throws if `_owner` is not the current owner. function _clearApproval(address _owner, uint _tokenId) internal { // Throws if `_owner` is not the current owner assert(idToOwner[_tokenId] == _owner); if (idToApprovals[_tokenId] != address(0)) { // Reset approvals idToApprovals[_tokenId] = address(0); } } /// @dev Returns whether the given spender can transfer a given token ID /// @param _spender address of the spender to query /// @param _tokenId uint ID of the token to be transferred /// @return bool whether the msg.sender is approved for the given token ID, is an operator of the owner, or is the owner of the token function _isApprovedOrOwner(address _spender, uint _tokenId) internal view returns (bool) { address owner = idToOwner[_tokenId]; bool spenderIsOwner = owner == _spender; bool spenderIsApproved = _spender == idToApprovals[_tokenId]; bool spenderIsApprovedForAll = (ownerToOperators[owner])[_spender]; return spenderIsOwner || spenderIsApproved || spenderIsApprovedForAll; } function isApprovedOrOwner(address _spender, uint _tokenId) external view returns (bool) { return _isApprovedOrOwner(_spender, _tokenId); } /// @dev Exeute transfer of a NFT. /// Throws unless `msg.sender` is the current owner, an authorized operator, or the approved /// address for this NFT. (NOTE: `msg.sender` not allowed in internal function so pass `_sender`.) /// Throws if `_to` is the zero address. /// Throws if `_from` is not the current owner. /// Throws if `_tokenId` is not a valid NFT. function _transferFrom( address _from, address _to, uint _tokenId, address _sender ) internal { require(_isApprovedOrOwner(_sender, _tokenId)); // Clear approval. Throws if `_from` is not the current owner _clearApproval(_from, _tokenId); // Remove NFT. Throws if `_tokenId` is not a valid NFT _removeTokenFrom(_from, _tokenId); // Add NFT _addTokenTo(_to, _tokenId); // Set the block of ownership transfer (for Flash NFT protection) ownership_change[_tokenId] = block.number; // Log the transfer emit Transfer(_from, _to, _tokenId); } /// @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. /// Throws if `_from` is not the current owner. /// Throws if `_to` is the zero address. /// Throws if `_tokenId` is not a valid NFT. /// @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else /// they maybe be permanently lost. /// @param _from The current owner of the NFT. /// @param _to The new owner. /// @param _tokenId The NFT to transfer. function transferFrom( address _from, address _to, uint _tokenId ) external { _transferFrom(_from, _to, _tokenId, msg.sender); } /// @dev Transfers the ownership of an NFT from one address to another address. /// Throws unless `msg.sender` is the current owner, an authorized operator, or the /// approved address for this NFT. /// Throws if `_from` is not the current owner. /// Throws if `_to` is the zero address. /// Throws if `_tokenId` is not a valid NFT. /// If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if /// the return value is not `bytes4(keccak256("onERC721Received(address,address,uint,bytes)"))`. /// @param _from The current owner of the NFT. /// @param _to The new owner. /// @param _tokenId The NFT to transfer. function safeTransferFrom( address _from, address _to, uint _tokenId ) external { safeTransferFrom(_from, _to, _tokenId, ""); } 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. uint size; assembly { size := extcodesize(account) } return size > 0; } /// @dev Transfers the ownership of an NFT from one address to another address. /// Throws unless `msg.sender` is the current owner, an authorized operator, or the /// approved address for this NFT. /// Throws if `_from` is not the current owner. /// Throws if `_to` is the zero address. /// Throws if `_tokenId` is not a valid NFT. /// If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if /// the return value is not `bytes4(keccak256("onERC721Received(address,address,uint,bytes)"))`. /// @param _from The current owner of the NFT. /// @param _to The new owner. /// @param _tokenId The NFT to transfer. /// @param _data Additional data with no specified format, sent in call to `_to`. function safeTransferFrom( address _from, address _to, uint _tokenId, bytes memory _data ) public { _transferFrom(_from, _to, _tokenId, msg.sender); if (_isContract(_to)) { // Throws if transfer destination is a contract which does not implement 'onERC721Received' try IERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) returns (bytes4 response) { if (response != IERC721Receiver(_to).onERC721Received.selector) { revert("ERC721: ERC721Receiver rejected tokens"); } } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ /// @dev Interface identification is specified in ERC-165. /// @param _interfaceID Id of the interface function supportsInterface(bytes4 _interfaceID) external view returns (bool) { return supportedInterfaces[_interfaceID]; } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ /// @dev Mapping from owner address to mapping of index to tokenIds mapping(address => mapping(uint => uint)) internal ownerToNFTokenIdList; /// @dev Mapping from NFT ID to index of owner mapping(uint => uint) internal tokenToOwnerIndex; /// @dev Get token by index function tokenOfOwnerByIndex(address _owner, uint _tokenIndex) external view returns (uint) { return ownerToNFTokenIdList[_owner][_tokenIndex]; } /// @dev Add a NFT to an index mapping to a given address /// @param _to address of the receiver /// @param _tokenId uint ID Of the token to be added function _addTokenToOwnerList(address _to, uint _tokenId) internal { uint current_count = _balance(_to); ownerToNFTokenIdList[_to][current_count] = _tokenId; tokenToOwnerIndex[_tokenId] = current_count; } /// @dev Add a NFT to a given address /// Throws if `_tokenId` is owned by someone. function _addTokenTo(address _to, uint _tokenId) internal { // Throws if `_tokenId` is owned by someone assert(idToOwner[_tokenId] == address(0)); // Change the owner idToOwner[_tokenId] = _to; // Update owner token index tracking _addTokenToOwnerList(_to, _tokenId); // Change count tracking ownerToNFTokenCount[_to] += 1; } /// @dev Function to mint tokens /// Throws if `_to` is zero address. /// Throws if `_tokenId` is owned by someone. /// @param _to The address that will receive the minted tokens. /// @param _tokenId The token id to mint. /// @return A boolean that indicates if the operation was successful. function _mint(address _to, uint _tokenId) internal returns (bool) { // Throws if `_to` is zero address assert(_to != address(0)); // Add NFT. Throws if `_tokenId` is owned by someone _addTokenTo(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); return true; } /// @dev Remove a NFT from an index mapping to a given address /// @param _from address of the sender /// @param _tokenId uint ID Of the token to be removed function _removeTokenFromOwnerList(address _from, uint _tokenId) internal { // Delete uint current_count = _balance(_from) - 1; uint current_index = tokenToOwnerIndex[_tokenId]; if (current_count == current_index) { // update ownerToNFTokenIdList ownerToNFTokenIdList[_from][current_count] = 0; // update tokenToOwnerIndex tokenToOwnerIndex[_tokenId] = 0; } else { uint lastTokenId = ownerToNFTokenIdList[_from][current_count]; // Add // update ownerToNFTokenIdList ownerToNFTokenIdList[_from][current_index] = lastTokenId; // update tokenToOwnerIndex tokenToOwnerIndex[lastTokenId] = current_index; // Delete // update ownerToNFTokenIdList ownerToNFTokenIdList[_from][current_count] = 0; // update tokenToOwnerIndex tokenToOwnerIndex[_tokenId] = 0; } } /// @dev Remove a NFT from a given address /// Throws if `_from` is not the current owner. function _removeTokenFrom(address _from, uint _tokenId) internal { // Throws if `_from` is not the current owner assert(idToOwner[_tokenId] == _from); // Change the owner idToOwner[_tokenId] = address(0); // Update owner token index tracking _removeTokenFromOwnerList(_from, _tokenId); // Change count tracking ownerToNFTokenCount[_from] -= 1; } function _burn(uint _tokenId) internal { require(_isApprovedOrOwner(msg.sender, _tokenId), "caller is not owner nor approved"); address owner = ownerOf(_tokenId); // Clear approval approve(address(0), _tokenId); // Remove token _removeTokenFrom(msg.sender, _tokenId); emit Transfer(owner, address(0), _tokenId); } /*/////////////////////////////////////////////////////////////// CREATE LOCKS //////////////////////////////////////////////////////////////*/ function _createLockFor(IPair _lp, uint _amt, uint _exp, address _to, IeLocker.Referral memory _ref) internal returns(IeLocker _locker, uint _ID) { ++tokenId; _ID = tokenId; _mint(_to, _ID); require(_lp.transferFrom(msg.sender, address(this), _amt), "CT1"); _locker = IeLocker(clone(address(design))); _locker.initialize(_lp, _exp, _ref); require(_lp.approve(address(_locker), _amt), "CA1"); _locker.increaseAmount(_amt); lockers[_ID]=_locker; referrals[_ID] = _ref; emit LockCreated(msg.sender,_to,address(_lp),_amt,_exp,_ref.agent,_ref.percent); } function createLock(IPair _lp, uint _amt, uint _exp) external guarded returns(IeLocker _locker, uint _ID) { return _createLockFor(_lp, _amt, _exp, msg.sender, IeLocker.Referral({agent:address(0),percent:0})); } function createLockFor(IPair _lp, uint _amt, uint _exp, address _to) external guarded returns(IeLocker _locker, uint _ID) { return _createLockFor(_lp, _amt, _exp, _to, IeLocker.Referral({agent:address(0),percent:0})); } function createLockWithReferral(IPair _lp, uint _amt, uint _exp, IeLocker.Referral memory _ref) external guarded returns(IeLocker _locker, uint _ID) { return _createLockFor(_lp, _amt, _exp, msg.sender, _ref); } function createLockWithReferralFor(IPair _lp, uint _amt, uint _exp, address _to, IeLocker.Referral memory _ref) external guarded returns(IeLocker _locker, uint _ID) { return _createLockFor(_lp, _amt, _exp, _to, _ref); } /*/////////////////////////////////////////////////////////////// ADMIN FUNCTIONS //////////////////////////////////////////////////////////////*/ function setAdmin(address _new_admin) external { require(msg.sender == admin); admin = _new_admin; } function setArt(IArt _art) external { require(msg.sender == admin); art = _art; } function setDesign(IeLocker _design) external { require(msg.sender == admin); design = _design; } function setTvlGuru(ITvlGuru _t) external { require(msg.sender == admin); TvlGuru = _t; } function setAprGuru(IAprGuru _a) external { require(msg.sender == admin); AprGuru = _a; } function setFeeSynthesizer(address _fs) external { require(msg.sender == admin && _fs!=address(0)); feeSynthesizer = _fs; } /*/////////////////////////////////////////////////////////////// HELPER VIEW FUNCTIONS //////////////////////////////////////////////////////////////*/ function totalSupply() public view returns (uint) { return(tokenId); } function tokensOfOwner(address _usr) public view returns (uint[] memory) { uint _tbal = _balance(_usr); uint[] memory _ra = new uint[](_tbal); for(uint i;i<_tbal;i++) { _ra[i] = ownerToNFTokenIdList[_usr][i]; } return _ra; } function lockedAssets(uint _lockID) public view returns (IPair, uint, uint) { IeLocker _locker = lockers[_lockID]; return (_locker.pool() , _locker.totalSupply(), _locker.expiry()); } function lockInfo(uint _lockID) public view returns ( address[7] memory, uint[11] memory, uint[] memory, IERC20[] memory _rt, uint[] memory _ra, uint[] memory _rd, string[] memory _rs, IeLocker.Referral memory, string[4] memory _str ) { return art._lockInfo(_lockID); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"},{"indexed":false,"internalType":"address","name":"agent","type":"address"},{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"LockCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AprGuru","outputs":[{"internalType":"contract IAprGuru","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TvlGuru","outputs":[{"internalType":"contract ITvlGuru","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"art","outputs":[{"internalType":"contract IArt","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IPair","name":"_lp","type":"address"},{"internalType":"uint256","name":"_amt","type":"uint256"},{"internalType":"uint256","name":"_exp","type":"uint256"}],"name":"createLock","outputs":[{"internalType":"contract IeLocker","name":"_locker","type":"address"},{"internalType":"uint256","name":"_ID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPair","name":"_lp","type":"address"},{"internalType":"uint256","name":"_amt","type":"uint256"},{"internalType":"uint256","name":"_exp","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"createLockFor","outputs":[{"internalType":"contract IeLocker","name":"_locker","type":"address"},{"internalType":"uint256","name":"_ID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPair","name":"_lp","type":"address"},{"internalType":"uint256","name":"_amt","type":"uint256"},{"internalType":"uint256","name":"_exp","type":"uint256"},{"components":[{"internalType":"address","name":"agent","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"}],"internalType":"struct IeLocker.Referral","name":"_ref","type":"tuple"}],"name":"createLockWithReferral","outputs":[{"internalType":"contract IeLocker","name":"_locker","type":"address"},{"internalType":"uint256","name":"_ID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPair","name":"_lp","type":"address"},{"internalType":"uint256","name":"_amt","type":"uint256"},{"internalType":"uint256","name":"_exp","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"components":[{"internalType":"address","name":"agent","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"}],"internalType":"struct IeLocker.Referral","name":"_ref","type":"tuple"}],"name":"createLockWithReferralFor","outputs":[{"internalType":"contract IeLocker","name":"_locker","type":"address"},{"internalType":"uint256","name":"_ID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"design","outputs":[{"internalType":"contract IeLocker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeSynthesizer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IeLocker","name":"_design","type":"address"},{"internalType":"contract IArt","name":"_art","type":"address"},{"internalType":"contract IVoter","name":"_vtr","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"lockInfo","outputs":[{"internalType":"address[7]","name":"","type":"address[7]"},{"internalType":"uint256[11]","name":"","type":"uint256[11]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"contract IERC20[]","name":"_rt","type":"address[]"},{"internalType":"uint256[]","name":"_ra","type":"uint256[]"},{"internalType":"uint256[]","name":"_rd","type":"uint256[]"},{"internalType":"string[]","name":"_rs","type":"string[]"},{"components":[{"internalType":"address","name":"agent","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"}],"internalType":"struct IeLocker.Referral","name":"","type":"tuple"},{"internalType":"string[4]","name":"_str","type":"string[4]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"lockedAssets","outputs":[{"internalType":"contract IPair","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockers","outputs":[{"internalType":"contract IeLocker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownership_change","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"referrals","outputs":[{"internalType":"address","name":"agent","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAprGuru","name":"_a","type":"address"}],"name":"setAprGuru","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IArt","name":"_art","type":"address"}],"name":"setArt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IeLocker","name":"_design","type":"address"}],"name":"setDesign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fs","type":"address"}],"name":"setFeeSynthesizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITvlGuru","name":"_t","type":"address"}],"name":"setTvlGuru","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenIndex","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_usr","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"contract IVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612836806100206000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80636f54883711610146578063b88d4fde116100c3578063cf5aee9411610087578063cf5aee9414610642578063de58c02b14610655578063e6b1a3ae14610668578063e985e9c51461067b578063f6e4db6b146106b7578063f851a440146106ca57600080fd5b8063b88d4fde146105be578063c0c53b8b146105d1578063c45a0155146105e4578063c87b56dd146105f7578063cc026af31461060a57600080fd5b806380b7c92b1161010a57806380b7c92b146105235780638462151c1461055657806393f502061461057657806395d89b4114610589578063a22cb465146105ab57600080fd5b80636f548837146104a1578063704b6c02146104c157806370a08231146104d457806372fe6c11146104e7578063809aab92146104fa57600080fd5b80632aa94314116101d457806346c96aac1161019857806346c96aac146103f85780634d03c0481461040b5780635b1a4c241461043d5780636352211e14610465578063650e15051461048e57600080fd5b80632aa94314146103765780632f745c5914610389578063301bd28e146103bf57806342842e0e146103d2578063430c2081146103e557600080fd5b80631521229d1161021b5780631521229d1461031857806315fea8961461032b57806318160ddd1461033e57806323b872dd146103505780632474ca0c1461036357600080fd5b806301ffc9a71461025857806306870a261461029a57806306fdde03146102c5578063081812fc146102da578063095ea7b314610303575b600080fd5b610285610266366004611a85565b6001600160e01b03191660009081526001602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6008546102ad906001600160a01b031681565b6040516001600160a01b039091168152602001610291565b6102cd6106dd565b6040516102919190611afa565b6102ad6102e8366004611b0d565b6000908152600f60205260409020546001600160a01b031690565b610316610311366004611b3b565b6106fd565b005b610316610326366004611b67565b6107e6565b610316610339366004611b67565b61081f565b6009545b604051908152602001610291565b61031661035e366004611b84565b61086c565b610316610371366004611b67565b61087d565b6005546102ad906001600160a01b031681565b610342610397366004611b3b565b6001600160a01b03919091166000908152601260209081526040808320938352929052205490565b6002546102ad906001600160a01b031681565b6103166103e0366004611b84565b6108b6565b6102856103f3366004611b3b565b6108d1565b6003546102ad906001600160a01b031681565b61041e610419366004611bc5565b6108e4565b604080516001600160a01b039093168352602083019190915201610291565b61045061044b366004611b0d565b61095d565b60405161029199989796959493929190611d40565b6102ad610473366004611b0d565b6000908152600d60205260409020546001600160a01b031690565b61041e61049c366004611e29565b610a42565b6103426104af366004611b0d565b60116020526000908152604090205481565b6103166104cf366004611b67565b610ab1565b6103426104e2366004611b67565b610aea565b6103166104f5366004611b67565b610b0a565b6102ad610508366004611b0d565b600b602052600090815260409020546001600160a01b031681565b61041e610531366004611b0d565b600c60205260009081526040902080546001909101546001600160a01b039091169082565b610569610564366004611b67565b610b43565b6040516102919190611e5e565b600a546102ad906001600160a01b031681565b604080518082019091526006815265654c4f434b5360d01b60208201526102cd565b6103166105b9366004611e7f565b610c17565b6103166105cc366004611f50565b610c9c565b6103166105df366004611fff565b610e47565b6004546102ad906001600160a01b031681565b6102cd610605366004611b0d565b611040565b61061d610618366004611b0d565b6110c1565b604080516001600160a01b039094168452602084019290925290820152606001610291565b61041e610650366004612085565b61123e565b6006546102ad906001600160a01b031681565b610316610676366004611b67565b61127e565b6102856106893660046120ce565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b61041e6106c53660046120fc565b6112b7565b6007546102ad906001600160a01b031681565b60606040518060600160405280602b81526020016127b6602b9139905090565b6000818152600d60205260409020546001600160a01b03168061071f57600080fd5b806001600160a01b0316836001600160a01b0316141561073e57600080fd5b6000828152600d60209081526040808320546001600160a01b0385811685526010845282852033808752945291909320549216149060ff16818061077f5750805b61078857600080fd5b6000848152600f602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b6007546001600160a01b031633146107fd57600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314801561084157506001600160a01b03811615155b61084a57600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6108788383833361130f565b505050565b6007546001600160a01b0316331461089457600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61087883838360405180602001604052806000815250610c9c565b60006108dd838361137c565b9392505050565b60008054819060ff16156109135760405162461bcd60e51b815260040161090a90612158565b60405180910390fd5b6000805460ff191660011781556040805180820190915281815260208101919091526109469087908790879087906113e2565b6000805460ff191690559097909650945050505050565b610965611a08565b61096d611a26565b606080606080606061099b604051806040016040528060006001600160a01b03168152602001600081525090565b6109a3611a45565b60025460405163169a1ed360e01b8152600481018c90526001600160a01b039091169063169a1ed39060240160006040518083038186803b1580156109e757600080fd5b505afa1580156109fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a2391908101906124de565b9850985098509850985098509850985098509193959799909294969850565b60008054819060ff1615610a685760405162461bcd60e51b815260040161090a90612158565b6000805460ff19166001178155604080518082019091528181526020810191909152610a9b9086908690869033906113e2565b6000805460ff1916905590969095509350505050565b6007546001600160a01b03163314610ac857600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600e60205260408120545b92915050565b6007546001600160a01b03163314610b2157600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60606000610b66836001600160a01b03166000908152600e602052604090205490565b905060008167ffffffffffffffff811115610b8357610b83611eb8565b604051908082528060200260200182016040528015610bac578160200160208202803683370190505b50905060005b82811015610c0f576001600160a01b03851660009081526012602090815260408083208484529091529020548251839083908110610bf257610bf2612610565b602090810291909101015280610c078161263c565b915050610bb2565b509392505050565b6001600160a01b038216331415610c3057610c30612657565b3360008181526010602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ca88484843361130f565b823b15610e4157604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610ce190339088908790879060040161266d565b602060405180830381600087803b158015610cfb57600080fd5b505af1925050508015610d2b575060408051601f3d908101601f19168201909252610d28918101906126aa565b60015b610dd0573d808015610d59576040519150601f19603f3d011682016040523d82523d6000602084013e610d5e565b606091505b508051610dc85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161090a565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610e3f5760405162461bcd60e51b815260206004820152602660248201527f4552433732313a2045524337323152656365697665722072656a656374656420604482015265746f6b656e7360d01b606482015260840161090a565b505b50505050565b6007546001600160a01b031615610e8a5760405162461bcd60e51b8152602060048201526007602482015266085c995a5b9a5d60ca1b604482015260640161090a565b600280546001600160a01b038085166001600160a01b031992831617909255600a80548684169083161790556003805492841692909116821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015610efb57600080fd5b505afa158015610f0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3391906126c7565b600480546001600160a01b03929092166001600160a01b0319928316179055600160208190527fb45820386466a8e01597d6e1efaf8f11ba4467972de5ca6c1f8aa3544ac2888e805460ff1990811683179091557fb8349d7b7b0b2b924bf96f90971cda8c7ac1ea4cde292a182bd2a203eef6c5d08054821683179055635b5e139f60e01b60009081527fce9309d5fe1c6050fdfde39d28ca0616e34393306d1cba1a247c40f9ef5c5d0980549092169092179055600780548316339081179091556008805490931617909155600954604051909130916000805160206127e1833981519152908290a460095460405160009030906000805160206127e1833981519152908390a4505050565b60025460405163468bf38960e11b8152600481018390526060916001600160a01b031690638d17e7129060240160006040518083038186803b15801561108557600080fd5b505afa158015611099573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b0491908101906126e4565b6000818152600b602090815260408083205481516316f0115b60e01b81529151849384936001600160a01b039093169283926316f0115b92600480840193919291829003018186803b15801561111657600080fd5b505afa15801561112a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114e91906126c7565b816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561118757600080fd5b505afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf9190612719565b826001600160a01b031663e184c9be6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190612719565b935093509350509193909250565b60008054819060ff16156112645760405162461bcd60e51b815260040161090a90612158565b6000805460ff1916600117905561094686868633876113e2565b6007546001600160a01b0316331461129557600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008054819060ff16156112dd5760405162461bcd60e51b815260040161090a90612158565b6000805460ff191660011790556112f787878787876113e2565b6000805460ff19169055909890975095505050505050565b611319818361137c565b61132257600080fd5b61132c84836116ef565b6113368483611756565b61134083836117d7565b6000828152601160205260408082204390555183916001600160a01b0380871692908816916000805160206127e183398151915291a450505050565b6000818152600d6020908152604080832054600f8352818420546001600160a01b039182168086526010855283862088841680885295529285205492938085149392909116149060ff1682806113cf5750815b806113d75750805b979650505050505050565b6000806009600081546113f49061263c565b9091555050600954611406848261186d565b506040516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b038816906323b872dd90606401602060405180830381600087803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148d9190612732565b6114bf5760405162461bcd60e51b815260206004820152600360248201526243543160e81b604482015260640161090a565b600a546114d4906001600160a01b03166118be565b60405163376ac91b60e11b81529092506001600160a01b03831690636ed5923690611507908a908990889060040161274f565b600060405180830381600087803b15801561152157600080fd5b505af1158015611535573d6000803e3d6000fd5b505060405163095ea7b360e01b81526001600160a01b038581166004830152602482018a90528a16925063095ea7b39150604401602060405180830381600087803b15801561158357600080fd5b505af1158015611597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bb9190612732565b6115ed5760405162461bcd60e51b815260206004820152600360248201526243413160e81b604482015260640161090a565b604051630aa2b75d60e11b8152600481018790526001600160a01b038316906315456eba90602401600060405180830381600087803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b5050506000828152600b6020908152604080832080546001600160a01b038881166001600160a01b031992831617909255600c845293829020885181549083169516851781558884015160019190910181905582518c81529384018b905291830193909352606082015289821692509086169033907fa2973f98fe80268b96929cc5beeda180b5a8ce274e34f44fe7692f7d9768c9ba9060800160405180910390a49550959350505050565b6000818152600d60205260409020546001600160a01b0383811691161461171857611718612657565b6000818152600f60205260409020546001600160a01b031615611752576000818152600f6020526040902080546001600160a01b03191690555b5050565b6000818152600d60205260409020546001600160a01b0383811691161461177f5761177f612657565b6000818152600d6020526040902080546001600160a01b03191690556117a58282611948565b6001600160a01b0382166000908152600e602052604081208054600192906117ce908490612786565b90915550505050565b6000818152600d60205260409020546001600160a01b0316156117fc576117fc612657565b6000818152600d6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600e808452828520805460128652848720818852865284872088905587875260138652938620939093559084529091528054600192906117ce90849061279d565b60006001600160a01b03831661188557611885612657565b61188f83836117d7565b60405182906001600160a01b038516906000906000805160206127e1833981519152908290a450600192915050565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b0381166119435760405162461bcd60e51b81526020600482015260036024820152620436c360ec1b604482015260640161090a565b919050565b6001600160a01b0382166000908152600e602052604081205461196d90600190612786565b600083815260136020526040902054909150808214156119bd576001600160a01b038416600090815260126020908152604080832085845282528083208390558583526013909152812055610e41565b6001600160a01b039390931660009081526012602090815260408083209383529281528282208054868452848420819055835260139091528282209490945592839055908252812055565b6040518060e001604052806007906020820280368337509192915050565b604051806101600160405280600b906020820280368337509192915050565b60405180608001604052806004905b6060815260200190600190039081611a545790505090565b6001600160e01b031981168114611a8257600080fd5b50565b600060208284031215611a9757600080fd5b81356108dd81611a6c565b60005b83811015611abd578181015183820152602001611aa5565b83811115610e415750506000910152565b60008151808452611ae6816020860160208601611aa2565b601f01601f19169290920160200192915050565b6020815260006108dd6020830184611ace565b600060208284031215611b1f57600080fd5b5035919050565b6001600160a01b0381168114611a8257600080fd5b60008060408385031215611b4e57600080fd5b8235611b5981611b26565b946020939093013593505050565b600060208284031215611b7957600080fd5b81356108dd81611b26565b600080600060608486031215611b9957600080fd5b8335611ba481611b26565b92506020840135611bb481611b26565b929592945050506040919091013590565b60008060008060808587031215611bdb57600080fd5b8435611be681611b26565b935060208501359250604085013591506060850135611c0481611b26565b939692955090935050565b8060005b600b811015610e41578151845260209384019390910190600101611c13565b600081518084526020808501945080840160005b83811015611c6257815187529582019590820190600101611c46565b509495945050505050565b600081518084526020808501945080840160005b83811015611c625781516001600160a01b031687529582019590820190600101611c81565b600081518084526020808501808196508360051b8101915082860160005b85811015611cee578284038952611cdc848351611ace565b98850198935090840190600101611cc4565b5091979650505050505050565b600082608081018360005b6004811015611d35578383038752611d1f838351611ace565b6020978801979093509190910190600101611d06565b509095945050505050565b6000610340828c835b6007811015611d715781516001600160a01b0316835260209283019290910190600101611d49565b505050611d8160e084018c611c0f565b80610240840152611d948184018b611c32565b9050828103610260840152611da9818a611c6d565b9050828103610280840152611dbe8189611c32565b90508281036102a0840152611dd38188611c32565b90508281036102c0840152611de88187611ca6565b85516001600160a01b03166102e085015260208601516103008501529050828103610320840152611e198185611cfb565b9c9b505050505050505050505050565b600080600060608486031215611e3e57600080fd5b8335611e4981611b26565b95602085013595506040909401359392505050565b6020815260006108dd6020830184611c32565b8015158114611a8257600080fd5b60008060408385031215611e9257600080fd5b8235611e9d81611b26565b91506020830135611ead81611e71565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611ef157611ef1611eb8565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611f2057611f20611eb8565b604052919050565b600067ffffffffffffffff821115611f4257611f42611eb8565b50601f01601f191660200190565b60008060008060808587031215611f6657600080fd5b8435611f7181611b26565b93506020850135611f8181611b26565b925060408501359150606085013567ffffffffffffffff811115611fa457600080fd5b8501601f81018713611fb557600080fd5b8035611fc8611fc382611f28565b611ef7565b818152886020838501011115611fdd57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060006060848603121561201457600080fd5b833561201f81611b26565b9250602084013561202f81611b26565b9150604084013561203f81611b26565b809150509250925092565b60006040828403121561205c57600080fd5b612064611ece565b9050813561207181611b26565b808252506020820135602082015292915050565b60008060008060a0858703121561209b57600080fd5b84356120a681611b26565b935060208501359250604085013591506120c3866060870161204a565b905092959194509250565b600080604083850312156120e157600080fd5b82356120ec81611b26565b91506020830135611ead81611b26565b600080600080600060c0868803121561211457600080fd5b853561211f81611b26565b94506020860135935060408601359250606086013561213d81611b26565b915061214c876080880161204a565b90509295509295909350565b6020808252600e908201526d4e6f2072652d656e7472616e637960901b604082015260600190565b600082601f83011261219157600080fd5b60405160e0810181811067ffffffffffffffff821117156121b4576121b4611eb8565b6040528060e08401858111156121c957600080fd5b845b818110156121ec5780516121de81611b26565b8352602092830192016121cb565b509195945050505050565b600082601f83011261220857600080fd5b60405161016080820182811067ffffffffffffffff8211171561222d5761222d611eb8565b6040528301818582111561224057600080fd5b845b828110156121ec578051825260209182019101612242565b600067ffffffffffffffff82111561227457612274611eb8565b5060051b60200190565b600082601f83011261228f57600080fd5b8151602061229f611fc38361225a565b82815260059290921b840181019181810190868411156122be57600080fd5b8286015b848110156122d957805183529183019183016122c2565b509695505050505050565b600082601f8301126122f557600080fd5b81516020612305611fc38361225a565b82815260059290921b8401810191818101908684111561232457600080fd5b8286015b848110156122d957805161233b81611b26565b8352918301918301612328565b600082601f83011261235957600080fd5b8151612367611fc382611f28565b81815284602083860101111561237c57600080fd5b61238d826020830160208701611aa2565b949350505050565b600082601f8301126123a657600080fd5b815160206123b6611fc38361225a565b82815260059290921b840181019181810190868411156123d557600080fd5b8286015b848110156122d957805167ffffffffffffffff8111156123f95760008081fd5b6124078986838b0101612348565b8452509183019183016123d9565b60006040828403121561242757600080fd5b61242f611ece565b9050815161243c81611b26565b808252506020820151602082015292915050565b600082601f83011261246157600080fd5b6040516080810167ffffffffffffffff828210818311171561248557612485611eb8565b81604052829150608085018681111561249d57600080fd5b855b818110156124d2578051838111156124b75760008081fd5b6124c389828a01612348565b8552506020938401930161249f565b50929695505050505050565b60008060008060008060008060006103408a8c0312156124fd57600080fd5b6125078b8b612180565b98506125168b60e08c016121f7565b97506102408a015167ffffffffffffffff8082111561253457600080fd5b6125408d838e0161227e565b98506102608c015191508082111561255757600080fd5b6125638d838e016122e4565b97506102808c015191508082111561257a57600080fd5b6125868d838e0161227e565b96506102a08c015191508082111561259d57600080fd5b6125a98d838e0161227e565b95506102c08c01519150808211156125c057600080fd5b6125cc8d838e01612395565b94506125dc8d6102e08e01612415565b93506103208c01519150808211156125f357600080fd5b506126008c828d01612450565b9150509295985092959850929598565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561265057612650612626565b5060010190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126a090830184611ace565b9695505050505050565b6000602082840312156126bc57600080fd5b81516108dd81611a6c565b6000602082840312156126d957600080fd5b81516108dd81611b26565b6000602082840312156126f657600080fd5b815167ffffffffffffffff81111561270d57600080fd5b61238d84828501612348565b60006020828403121561272b57600080fd5b5051919050565b60006020828403121561274457600080fd5b81516108dd81611e71565b6001600160a01b0384168152602081018390526080810161238d604083018480516001600160a01b03168252602090810151910152565b60008282101561279857612798612626565b500390565b600082198211156127b0576127b0612626565b50019056fe654c4f434b533a205969656c642d506179696e67204c6971756964697479204c6f636b65727320f09f9490ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212206b6e644e1bf6cd039303f8775ccc7576ff032fb6b3a0261f90a180697b6700c664736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c80636f54883711610146578063b88d4fde116100c3578063cf5aee9411610087578063cf5aee9414610642578063de58c02b14610655578063e6b1a3ae14610668578063e985e9c51461067b578063f6e4db6b146106b7578063f851a440146106ca57600080fd5b8063b88d4fde146105be578063c0c53b8b146105d1578063c45a0155146105e4578063c87b56dd146105f7578063cc026af31461060a57600080fd5b806380b7c92b1161010a57806380b7c92b146105235780638462151c1461055657806393f502061461057657806395d89b4114610589578063a22cb465146105ab57600080fd5b80636f548837146104a1578063704b6c02146104c157806370a08231146104d457806372fe6c11146104e7578063809aab92146104fa57600080fd5b80632aa94314116101d457806346c96aac1161019857806346c96aac146103f85780634d03c0481461040b5780635b1a4c241461043d5780636352211e14610465578063650e15051461048e57600080fd5b80632aa94314146103765780632f745c5914610389578063301bd28e146103bf57806342842e0e146103d2578063430c2081146103e557600080fd5b80631521229d1161021b5780631521229d1461031857806315fea8961461032b57806318160ddd1461033e57806323b872dd146103505780632474ca0c1461036357600080fd5b806301ffc9a71461025857806306870a261461029a57806306fdde03146102c5578063081812fc146102da578063095ea7b314610303575b600080fd5b610285610266366004611a85565b6001600160e01b03191660009081526001602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6008546102ad906001600160a01b031681565b6040516001600160a01b039091168152602001610291565b6102cd6106dd565b6040516102919190611afa565b6102ad6102e8366004611b0d565b6000908152600f60205260409020546001600160a01b031690565b610316610311366004611b3b565b6106fd565b005b610316610326366004611b67565b6107e6565b610316610339366004611b67565b61081f565b6009545b604051908152602001610291565b61031661035e366004611b84565b61086c565b610316610371366004611b67565b61087d565b6005546102ad906001600160a01b031681565b610342610397366004611b3b565b6001600160a01b03919091166000908152601260209081526040808320938352929052205490565b6002546102ad906001600160a01b031681565b6103166103e0366004611b84565b6108b6565b6102856103f3366004611b3b565b6108d1565b6003546102ad906001600160a01b031681565b61041e610419366004611bc5565b6108e4565b604080516001600160a01b039093168352602083019190915201610291565b61045061044b366004611b0d565b61095d565b60405161029199989796959493929190611d40565b6102ad610473366004611b0d565b6000908152600d60205260409020546001600160a01b031690565b61041e61049c366004611e29565b610a42565b6103426104af366004611b0d565b60116020526000908152604090205481565b6103166104cf366004611b67565b610ab1565b6103426104e2366004611b67565b610aea565b6103166104f5366004611b67565b610b0a565b6102ad610508366004611b0d565b600b602052600090815260409020546001600160a01b031681565b61041e610531366004611b0d565b600c60205260009081526040902080546001909101546001600160a01b039091169082565b610569610564366004611b67565b610b43565b6040516102919190611e5e565b600a546102ad906001600160a01b031681565b604080518082019091526006815265654c4f434b5360d01b60208201526102cd565b6103166105b9366004611e7f565b610c17565b6103166105cc366004611f50565b610c9c565b6103166105df366004611fff565b610e47565b6004546102ad906001600160a01b031681565b6102cd610605366004611b0d565b611040565b61061d610618366004611b0d565b6110c1565b604080516001600160a01b039094168452602084019290925290820152606001610291565b61041e610650366004612085565b61123e565b6006546102ad906001600160a01b031681565b610316610676366004611b67565b61127e565b6102856106893660046120ce565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b61041e6106c53660046120fc565b6112b7565b6007546102ad906001600160a01b031681565b60606040518060600160405280602b81526020016127b6602b9139905090565b6000818152600d60205260409020546001600160a01b03168061071f57600080fd5b806001600160a01b0316836001600160a01b0316141561073e57600080fd5b6000828152600d60209081526040808320546001600160a01b0385811685526010845282852033808752945291909320549216149060ff16818061077f5750805b61078857600080fd5b6000848152600f602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b6007546001600160a01b031633146107fd57600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314801561084157506001600160a01b03811615155b61084a57600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6108788383833361130f565b505050565b6007546001600160a01b0316331461089457600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61087883838360405180602001604052806000815250610c9c565b60006108dd838361137c565b9392505050565b60008054819060ff16156109135760405162461bcd60e51b815260040161090a90612158565b60405180910390fd5b6000805460ff191660011781556040805180820190915281815260208101919091526109469087908790879087906113e2565b6000805460ff191690559097909650945050505050565b610965611a08565b61096d611a26565b606080606080606061099b604051806040016040528060006001600160a01b03168152602001600081525090565b6109a3611a45565b60025460405163169a1ed360e01b8152600481018c90526001600160a01b039091169063169a1ed39060240160006040518083038186803b1580156109e757600080fd5b505afa1580156109fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a2391908101906124de565b9850985098509850985098509850985098509193959799909294969850565b60008054819060ff1615610a685760405162461bcd60e51b815260040161090a90612158565b6000805460ff19166001178155604080518082019091528181526020810191909152610a9b9086908690869033906113e2565b6000805460ff1916905590969095509350505050565b6007546001600160a01b03163314610ac857600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600e60205260408120545b92915050565b6007546001600160a01b03163314610b2157600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60606000610b66836001600160a01b03166000908152600e602052604090205490565b905060008167ffffffffffffffff811115610b8357610b83611eb8565b604051908082528060200260200182016040528015610bac578160200160208202803683370190505b50905060005b82811015610c0f576001600160a01b03851660009081526012602090815260408083208484529091529020548251839083908110610bf257610bf2612610565b602090810291909101015280610c078161263c565b915050610bb2565b509392505050565b6001600160a01b038216331415610c3057610c30612657565b3360008181526010602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ca88484843361130f565b823b15610e4157604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610ce190339088908790879060040161266d565b602060405180830381600087803b158015610cfb57600080fd5b505af1925050508015610d2b575060408051601f3d908101601f19168201909252610d28918101906126aa565b60015b610dd0573d808015610d59576040519150601f19603f3d011682016040523d82523d6000602084013e610d5e565b606091505b508051610dc85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161090a565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610e3f5760405162461bcd60e51b815260206004820152602660248201527f4552433732313a2045524337323152656365697665722072656a656374656420604482015265746f6b656e7360d01b606482015260840161090a565b505b50505050565b6007546001600160a01b031615610e8a5760405162461bcd60e51b8152602060048201526007602482015266085c995a5b9a5d60ca1b604482015260640161090a565b600280546001600160a01b038085166001600160a01b031992831617909255600a80548684169083161790556003805492841692909116821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015610efb57600080fd5b505afa158015610f0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3391906126c7565b600480546001600160a01b03929092166001600160a01b0319928316179055600160208190527fb45820386466a8e01597d6e1efaf8f11ba4467972de5ca6c1f8aa3544ac2888e805460ff1990811683179091557fb8349d7b7b0b2b924bf96f90971cda8c7ac1ea4cde292a182bd2a203eef6c5d08054821683179055635b5e139f60e01b60009081527fce9309d5fe1c6050fdfde39d28ca0616e34393306d1cba1a247c40f9ef5c5d0980549092169092179055600780548316339081179091556008805490931617909155600954604051909130916000805160206127e1833981519152908290a460095460405160009030906000805160206127e1833981519152908390a4505050565b60025460405163468bf38960e11b8152600481018390526060916001600160a01b031690638d17e7129060240160006040518083038186803b15801561108557600080fd5b505afa158015611099573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b0491908101906126e4565b6000818152600b602090815260408083205481516316f0115b60e01b81529151849384936001600160a01b039093169283926316f0115b92600480840193919291829003018186803b15801561111657600080fd5b505afa15801561112a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114e91906126c7565b816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561118757600080fd5b505afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf9190612719565b826001600160a01b031663e184c9be6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190612719565b935093509350509193909250565b60008054819060ff16156112645760405162461bcd60e51b815260040161090a90612158565b6000805460ff1916600117905561094686868633876113e2565b6007546001600160a01b0316331461129557600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008054819060ff16156112dd5760405162461bcd60e51b815260040161090a90612158565b6000805460ff191660011790556112f787878787876113e2565b6000805460ff19169055909890975095505050505050565b611319818361137c565b61132257600080fd5b61132c84836116ef565b6113368483611756565b61134083836117d7565b6000828152601160205260408082204390555183916001600160a01b0380871692908816916000805160206127e183398151915291a450505050565b6000818152600d6020908152604080832054600f8352818420546001600160a01b039182168086526010855283862088841680885295529285205492938085149392909116149060ff1682806113cf5750815b806113d75750805b979650505050505050565b6000806009600081546113f49061263c565b9091555050600954611406848261186d565b506040516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b038816906323b872dd90606401602060405180830381600087803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148d9190612732565b6114bf5760405162461bcd60e51b815260206004820152600360248201526243543160e81b604482015260640161090a565b600a546114d4906001600160a01b03166118be565b60405163376ac91b60e11b81529092506001600160a01b03831690636ed5923690611507908a908990889060040161274f565b600060405180830381600087803b15801561152157600080fd5b505af1158015611535573d6000803e3d6000fd5b505060405163095ea7b360e01b81526001600160a01b038581166004830152602482018a90528a16925063095ea7b39150604401602060405180830381600087803b15801561158357600080fd5b505af1158015611597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bb9190612732565b6115ed5760405162461bcd60e51b815260206004820152600360248201526243413160e81b604482015260640161090a565b604051630aa2b75d60e11b8152600481018790526001600160a01b038316906315456eba90602401600060405180830381600087803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b5050506000828152600b6020908152604080832080546001600160a01b038881166001600160a01b031992831617909255600c845293829020885181549083169516851781558884015160019190910181905582518c81529384018b905291830193909352606082015289821692509086169033907fa2973f98fe80268b96929cc5beeda180b5a8ce274e34f44fe7692f7d9768c9ba9060800160405180910390a49550959350505050565b6000818152600d60205260409020546001600160a01b0383811691161461171857611718612657565b6000818152600f60205260409020546001600160a01b031615611752576000818152600f6020526040902080546001600160a01b03191690555b5050565b6000818152600d60205260409020546001600160a01b0383811691161461177f5761177f612657565b6000818152600d6020526040902080546001600160a01b03191690556117a58282611948565b6001600160a01b0382166000908152600e602052604081208054600192906117ce908490612786565b90915550505050565b6000818152600d60205260409020546001600160a01b0316156117fc576117fc612657565b6000818152600d6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600e808452828520805460128652848720818852865284872088905587875260138652938620939093559084529091528054600192906117ce90849061279d565b60006001600160a01b03831661188557611885612657565b61188f83836117d7565b60405182906001600160a01b038516906000906000805160206127e1833981519152908290a450600192915050565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b0381166119435760405162461bcd60e51b81526020600482015260036024820152620436c360ec1b604482015260640161090a565b919050565b6001600160a01b0382166000908152600e602052604081205461196d90600190612786565b600083815260136020526040902054909150808214156119bd576001600160a01b038416600090815260126020908152604080832085845282528083208390558583526013909152812055610e41565b6001600160a01b039390931660009081526012602090815260408083209383529281528282208054868452848420819055835260139091528282209490945592839055908252812055565b6040518060e001604052806007906020820280368337509192915050565b604051806101600160405280600b906020820280368337509192915050565b60405180608001604052806004905b6060815260200190600190039081611a545790505090565b6001600160e01b031981168114611a8257600080fd5b50565b600060208284031215611a9757600080fd5b81356108dd81611a6c565b60005b83811015611abd578181015183820152602001611aa5565b83811115610e415750506000910152565b60008151808452611ae6816020860160208601611aa2565b601f01601f19169290920160200192915050565b6020815260006108dd6020830184611ace565b600060208284031215611b1f57600080fd5b5035919050565b6001600160a01b0381168114611a8257600080fd5b60008060408385031215611b4e57600080fd5b8235611b5981611b26565b946020939093013593505050565b600060208284031215611b7957600080fd5b81356108dd81611b26565b600080600060608486031215611b9957600080fd5b8335611ba481611b26565b92506020840135611bb481611b26565b929592945050506040919091013590565b60008060008060808587031215611bdb57600080fd5b8435611be681611b26565b935060208501359250604085013591506060850135611c0481611b26565b939692955090935050565b8060005b600b811015610e41578151845260209384019390910190600101611c13565b600081518084526020808501945080840160005b83811015611c6257815187529582019590820190600101611c46565b509495945050505050565b600081518084526020808501945080840160005b83811015611c625781516001600160a01b031687529582019590820190600101611c81565b600081518084526020808501808196508360051b8101915082860160005b85811015611cee578284038952611cdc848351611ace565b98850198935090840190600101611cc4565b5091979650505050505050565b600082608081018360005b6004811015611d35578383038752611d1f838351611ace565b6020978801979093509190910190600101611d06565b509095945050505050565b6000610340828c835b6007811015611d715781516001600160a01b0316835260209283019290910190600101611d49565b505050611d8160e084018c611c0f565b80610240840152611d948184018b611c32565b9050828103610260840152611da9818a611c6d565b9050828103610280840152611dbe8189611c32565b90508281036102a0840152611dd38188611c32565b90508281036102c0840152611de88187611ca6565b85516001600160a01b03166102e085015260208601516103008501529050828103610320840152611e198185611cfb565b9c9b505050505050505050505050565b600080600060608486031215611e3e57600080fd5b8335611e4981611b26565b95602085013595506040909401359392505050565b6020815260006108dd6020830184611c32565b8015158114611a8257600080fd5b60008060408385031215611e9257600080fd5b8235611e9d81611b26565b91506020830135611ead81611e71565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611ef157611ef1611eb8565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611f2057611f20611eb8565b604052919050565b600067ffffffffffffffff821115611f4257611f42611eb8565b50601f01601f191660200190565b60008060008060808587031215611f6657600080fd5b8435611f7181611b26565b93506020850135611f8181611b26565b925060408501359150606085013567ffffffffffffffff811115611fa457600080fd5b8501601f81018713611fb557600080fd5b8035611fc8611fc382611f28565b611ef7565b818152886020838501011115611fdd57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060006060848603121561201457600080fd5b833561201f81611b26565b9250602084013561202f81611b26565b9150604084013561203f81611b26565b809150509250925092565b60006040828403121561205c57600080fd5b612064611ece565b9050813561207181611b26565b808252506020820135602082015292915050565b60008060008060a0858703121561209b57600080fd5b84356120a681611b26565b935060208501359250604085013591506120c3866060870161204a565b905092959194509250565b600080604083850312156120e157600080fd5b82356120ec81611b26565b91506020830135611ead81611b26565b600080600080600060c0868803121561211457600080fd5b853561211f81611b26565b94506020860135935060408601359250606086013561213d81611b26565b915061214c876080880161204a565b90509295509295909350565b6020808252600e908201526d4e6f2072652d656e7472616e637960901b604082015260600190565b600082601f83011261219157600080fd5b60405160e0810181811067ffffffffffffffff821117156121b4576121b4611eb8565b6040528060e08401858111156121c957600080fd5b845b818110156121ec5780516121de81611b26565b8352602092830192016121cb565b509195945050505050565b600082601f83011261220857600080fd5b60405161016080820182811067ffffffffffffffff8211171561222d5761222d611eb8565b6040528301818582111561224057600080fd5b845b828110156121ec578051825260209182019101612242565b600067ffffffffffffffff82111561227457612274611eb8565b5060051b60200190565b600082601f83011261228f57600080fd5b8151602061229f611fc38361225a565b82815260059290921b840181019181810190868411156122be57600080fd5b8286015b848110156122d957805183529183019183016122c2565b509695505050505050565b600082601f8301126122f557600080fd5b81516020612305611fc38361225a565b82815260059290921b8401810191818101908684111561232457600080fd5b8286015b848110156122d957805161233b81611b26565b8352918301918301612328565b600082601f83011261235957600080fd5b8151612367611fc382611f28565b81815284602083860101111561237c57600080fd5b61238d826020830160208701611aa2565b949350505050565b600082601f8301126123a657600080fd5b815160206123b6611fc38361225a565b82815260059290921b840181019181810190868411156123d557600080fd5b8286015b848110156122d957805167ffffffffffffffff8111156123f95760008081fd5b6124078986838b0101612348565b8452509183019183016123d9565b60006040828403121561242757600080fd5b61242f611ece565b9050815161243c81611b26565b808252506020820151602082015292915050565b600082601f83011261246157600080fd5b6040516080810167ffffffffffffffff828210818311171561248557612485611eb8565b81604052829150608085018681111561249d57600080fd5b855b818110156124d2578051838111156124b75760008081fd5b6124c389828a01612348565b8552506020938401930161249f565b50929695505050505050565b60008060008060008060008060006103408a8c0312156124fd57600080fd5b6125078b8b612180565b98506125168b60e08c016121f7565b97506102408a015167ffffffffffffffff8082111561253457600080fd5b6125408d838e0161227e565b98506102608c015191508082111561255757600080fd5b6125638d838e016122e4565b97506102808c015191508082111561257a57600080fd5b6125868d838e0161227e565b96506102a08c015191508082111561259d57600080fd5b6125a98d838e0161227e565b95506102c08c01519150808211156125c057600080fd5b6125cc8d838e01612395565b94506125dc8d6102e08e01612415565b93506103208c01519150808211156125f357600080fd5b506126008c828d01612450565b9150509295985092959850929598565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561265057612650612626565b5060010190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126a090830184611ace565b9695505050505050565b6000602082840312156126bc57600080fd5b81516108dd81611a6c565b6000602082840312156126d957600080fd5b81516108dd81611b26565b6000602082840312156126f657600080fd5b815167ffffffffffffffff81111561270d57600080fd5b61238d84828501612348565b60006020828403121561272b57600080fd5b5051919050565b60006020828403121561274457600080fd5b81516108dd81611e71565b6001600160a01b0384168152602081018390526080810161238d604083018480516001600160a01b03168252602090810151910152565b60008282101561279857612798612626565b500390565b600082198211156127b0576127b0612626565b50019056fe654c4f434b533a205969656c642d506179696e67204c6971756964697479204c6f636b65727320f09f9490ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212206b6e644e1bf6cd039303f8775ccc7576ff032fb6b3a0261f90a180697b6700c664736f6c63430008090033
Deployed Bytecode Sourcemap
17575:20113:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30170:127;;;;;;:::i;:::-;-1:-1:-1;;;;;;30259:33:0;30241:4;30259:33;;;:19;:33;;;;;;;;;30170:127;;;;565:14:1;;558:22;540:41;;528:2;513:18;30170:127:0;;;;;;;;18237:29;;;;;-1:-1:-1;;;;;18237:29:0;;;;;;-1:-1:-1;;;;;756:32:1;;;738:51;;726:2;711:18;18237:29:0;592:203:1;19345:120:0;;;:::i;:::-;;;;;;;:::i;21644:108::-;;;;;;:::i;:::-;21703:7;21724:23;;;:13;:23;;;;;;-1:-1:-1;;;;;21724:23:0;;21644:108;22799:583;;;;;;:::i;:::-;;:::i;:::-;;36334:97;;;;;;:::i;:::-;;:::i;36538:131::-;;;;;;:::i;:::-;;:::i;36854:75::-;36916:7;;36854:75;;;2858:25:1;;;2846:2;2831:18;36854:75:0;2712:177:1;26968:144:0;;;;;;:::i;:::-;;:::i;36224:105::-;;;;;;:::i;:::-;;:::i;18157:23::-;;;;;-1:-1:-1;;;;;18157:23:0;;;30760:150;;;;;;:::i;:::-;-1:-1:-1;;;;;30864:28:0;;;;30846:4;30864:28;;;:20;:28;;;;;;;;:41;;;;;;;;;30760:150;18088:15;;;;;-1:-1:-1;;;;;18088:15:0;;;27807:143;;;;;;:::i;:::-;;:::i;25287:144::-;;;;;;:::i;:::-;;:::i;18107:19::-;;;;;-1:-1:-1;;;;;18107:19:0;;;35162:224;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5040:32:1;;;5022:51;;5104:2;5089:18;;5082:34;;;;4995:18;35162:224:0;4832:290:1;37380:303:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;20280:98::-;;;;;;:::i;:::-;20333:7;20354:19;;;:9;:19;;;;;;-1:-1:-1;;;;;20354:19:0;;20280:98;34942:215;;;;;;:::i;:::-;;:::i;21477:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;36017:108;;;;;;:::i;:::-;;:::i;20945:97::-;;;;;;:::i;:::-;;:::i;36436:::-;;;;;;:::i;:::-;;:::i;18359:40::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;18359:40:0;;;18403:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18403:51:0;;;;;;36934:245;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18333:22::-;;;;;-1:-1:-1;;;;;18333:22:0;;;19470:78;19528:15;;;;;;;;;;;;-1:-1:-1;;;19528:15:0;;;;19470:78;;23873:274;;;;;;:::i;:::-;;:::i;29063:824::-;;;;;;:::i;:::-;;:::i;18604:560::-;;;;;;:::i;:::-;;:::i;18130:23::-;;;;;-1:-1:-1;;;;;18130:23:0;;;19648:111;;;;;;:::i;:::-;;:::i;37184:191::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;14579:32:1;;;14561:51;;14643:2;14628:18;;14621:34;;;;14671:18;;;14664:34;14549:2;14534:18;37184:191:0;14346:358:1;35391:215:0;;;;;;:::i;:::-;;:::i;18184:23::-;;;;;-1:-1:-1;;;;;18184:23:0;;;36130:89;;;;;;:::i;:::-;;:::i;21949:144::-;;;;;;:::i;:::-;-1:-1:-1;;;;;22052:24:0;;;22033:4;22052:24;;;:16;:24;;;;;;;;22051:37;;;;;;;;;;;;;;;21949:144;35611:224;;;;;;:::i;:::-;;:::i;18213:20::-;;;;;-1:-1:-1;;;;;18213:20:0;;;19345:120;19381:13;19401:59;;;;;;;;;;;;;;;;;;;19345:120;:::o;22799:583::-;22862:13;22878:19;;;:9;:19;;;;;;-1:-1:-1;;;;;22878:19:0;22956;22948:28;;;;;;23051:5;-1:-1:-1;;;;;23038:18:0;:9;-1:-1:-1;;;;;23038:18:0;;;23030:27;;;;;;23087:18;23109:19;;;:9;:19;;;;;;;;;-1:-1:-1;;;;;23179:23:0;;;;;:16;:23;;;;;23132:10;23178:37;;;;;;;;;;23109:19;;:33;;23178:37;;23109:33;;23228:39;;;23245:22;23228:39;23220:48;;;;;;23296:23;;;;:13;:23;;;;;;:35;;-1:-1:-1;;;;;;23296:35:0;-1:-1:-1;;;;;23296:35:0;;;;;;;;;23341:36;;23296:23;;23341:36;;;;;;;22857:525;;;22799:583;;:::o;36334:97::-;36403:5;;-1:-1:-1;;;;;36403:5:0;36389:10;:19;36381:28;;;;;;36414:7;:12;;-1:-1:-1;;;;;;36414:12:0;-1:-1:-1;;;;;36414:12:0;;;;;;;;;;36334:97::o;36538:131::-;36614:5;;-1:-1:-1;;;;;36614:5:0;36600:10;:19;:38;;;;-1:-1:-1;;;;;;36623:15:0;;;;36600:38;36592:47;;;;;;36644:14;:20;;-1:-1:-1;;;;;;36644:20:0;-1:-1:-1;;;;;36644:20:0;;;;;;;;;;36538:131::o;26968:144::-;27060:47;27074:5;27081:3;27086:8;27096:10;27060:13;:47::i;:::-;26968:144;;;:::o;36224:105::-;36297:5;;-1:-1:-1;;;;;36297:5:0;36283:10;:19;36275:28;;;;;;36308:6;:16;;-1:-1:-1;;;;;;36308:16:0;-1:-1:-1;;;;;36308:16:0;;;;;;;;;;36224:105::o;27807:143::-;27903:42;27920:5;27927:3;27932:8;27903:42;;;;;;;;;;;;:16;:42::i;25287:144::-;25370:4;25388:38;25407:8;25417;25388:18;:38::i;:::-;25381:45;25287:144;-1:-1:-1;;;25287:144:0:o;35162:224::-;35256:16;17492:7;;35256:16;;17492:7;;17491:8;17483:35;;;;-1:-1:-1;;;17483:35:0;;;;;;;:::i;:::-;;;;;;;;;17523:7;:14;;-1:-1:-1;;17523:14:0;17533:4;17523:14;;;35333:47:::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;35296:85:::1;::::0;35311:3;;35316:4;;35322;;35328:3;;35296:14:::1;:85::i;:::-;17558:5:::0;17548:15;;-1:-1:-1;;17548:15:0;;;35289:92;;;;-1:-1:-1;35162:224:0;-1:-1:-1;;;;;35162:224:0:o;37380:303::-;37437:17;;:::i;:::-;37459:15;;:::i;:::-;37479:13;37497:19;37521:17;37543;37565:19;37589:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;37589:24:0;37618:21;;:::i;:::-;37656:3;;:22;;-1:-1:-1;;;37656:22:0;;;;;2858:25:1;;;-1:-1:-1;;;;;37656:3:0;;;;:13;;2831:18:1;;37656:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37656:22:0;;;;;;;;;;;;:::i;:::-;37649:29;;;;;;;;;;;;;;;;;;37380:303;;;;;;;;;;;:::o;34942:215::-;35020:16;17492:7;;35020:16;;17492:7;;17491:8;17483:35;;;;-1:-1:-1;;;17483:35:0;;;;;;;:::i;:::-;17523:7;:14;;-1:-1:-1;;17523:14:0;17533:4;17523:14;;;35104:47:::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;35060:92:::1;::::0;35075:3;;35080:4;;35086;;35092:10:::1;::::0;35060:14:::1;:92::i;:::-;17558:5:::0;17548:15;;-1:-1:-1;;17548:15:0;;;35053:99;;;;-1:-1:-1;34942:215:0;-1:-1:-1;;;;34942:215:0:o;36017:108::-;36091:5;;-1:-1:-1;;;;;36091:5:0;36077:10;:19;36069:28;;;;;;36102:5;:18;;-1:-1:-1;;;;;;36102:18:0;-1:-1:-1;;;;;36102:18:0;;;;;;;;;;36017:108::o;20945:97::-;-1:-1:-1;;;;;20683:27:0;;21003:4;20683:27;;;:19;:27;;;;;;21021:16;21014:23;20945:97;-1:-1:-1;;20945:97:0:o;36436:::-;36505:5;;-1:-1:-1;;;;;36505:5:0;36491:10;:19;36483:28;;;;;;36516:7;:12;;-1:-1:-1;;;;;;36516:12:0;-1:-1:-1;;;;;36516:12:0;;;;;;;;;;36436:97::o;36934:245::-;36992:13;37012:10;37025:14;37034:4;-1:-1:-1;;;;;20683:27:0;20665:4;20683:27;;;:19;:27;;;;;;;20608:107;37025:14;37012:27;;37044:17;37075:5;37064:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37064:17:0;;37044:37;;37090:6;37086:74;37099:5;37097:1;:7;37086:74;;;-1:-1:-1;;;;;37125:26:0;;;;;;:20;:26;;;;;;;;:29;;;;;;;;;37116:6;;:3;;37152:1;;37116:6;;;;;;:::i;:::-;;;;;;;;;;:38;37105:3;;;;:::i;:::-;;;;37086:74;;;-1:-1:-1;37171:3:0;36934:245;-1:-1:-1;;;36934:245:0:o;23873:274::-;-1:-1:-1;;;;;24004:23:0;;24017:10;24004:23;;23997:31;;;;:::i;:::-;24050:10;24033:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;24033:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;24033:51:0;;;;;;;;;;24094:48;;540:41:1;;;24033:39:0;;24050:10;24094:48;;513:18:1;24094:48:0;;;;;;;23873:274;;:::o;29063:824::-;29180:47;29194:5;29201:3;29206:8;29216:10;29180:13;:47::i;:::-;28235:20;;28271:8;29234:649;;29362:73;;-1:-1:-1;;;29362:73:0;;-1:-1:-1;;;;;29362:37:0;;;;;:73;;29400:10;;29412:5;;29419:8;;29429:5;;29362:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29362:73:0;;;;;;;;-1:-1:-1;;29362:73:0;;;;;;;;;;;;:::i;:::-;;;29358:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29658:13:0;;29654:218;;29692:60;;-1:-1:-1;;;29692:60:0;;26504:2:1;29692:60:0;;;26486:21:1;26543:2;26523:18;;;26516:30;26582:34;26562:18;;;26555:62;-1:-1:-1;;;26633:18:1;;;26626:48;26691:19;;29692:60:0;26302:414:1;29654:218:0;29840:6;29834:13;29825:6;29821:2;29817:15;29810:38;29358:520;-1:-1:-1;;;;;;29476:58:0;;-1:-1:-1;;;29476:58:0;29472:137;;29550:48;;-1:-1:-1;;;29550:48:0;;26923:2:1;29550:48:0;;;26905:21:1;26962:2;26942:18;;;26935:30;27001:34;26981:18;;;26974:62;-1:-1:-1;;;27052:18:1;;;27045:36;27098:19;;29550:48:0;26721:402:1;29472:137:0;29436:179;29358:520;29063:824;;;;:::o;18604:560::-;18688:5;;-1:-1:-1;;;;;18688:5:0;:19;18680:39;;;;-1:-1:-1;;;18680:39:0;;27330:2:1;18680:39:0;;;27312:21:1;27369:1;27349:18;;;27342:29;-1:-1:-1;;;27387:18:1;;;27380:37;27434:18;;18680:39:0;27128:330:1;18680:39:0;18724:3;:10;;-1:-1:-1;;;;;18724:10:0;;;-1:-1:-1;;;;;;18724:10:0;;;;;;;18739:6;:16;;;;;;;;;;;18760:5;:12;;;;;;;;;;;;;18787:14;;;-1:-1:-1;;;18787:14:0;;;;:12;;:14;;;;;;;;;;;;;;;18760:12;18787:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18777:7;:24;;-1:-1:-1;;;;;18777:24:0;;;;-1:-1:-1;;;;;;18777:24:0;;;;;;;18806:40;;;;;:47;;-1:-1:-1;;18806:47:0;;;;;;;;18858:40;:47;;;;;;;;-1:-1:-1;;;18777:7:0;18910:49;;;;:56;;;;;;;;;;18971:5;:18;;;;18979:10;18971:18;;;;;;18994:14;:27;;;;;;;;;19082:7;;18806:40;19046:44;19082:7;;19075:4;;-1:-1:-1;;;;;;;;;;;19046:44:0;18777:7;;19046:44;19151:7;;19115:44;;19147:1;;19132:4;;-1:-1:-1;;;;;;;;;;;19115:44:0;19147:1;;19115:44;18604:560;;;:::o;19648:111::-;19731:3;;:23;;-1:-1:-1;;;19731:23:0;;;;;2858:25:1;;;19704:13:0;;-1:-1:-1;;;;;19731:3:0;;:13;;2831:18:1;;19731:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19731:23:0;;;;;;;;;;;;:::i;37184:191::-;37241:5;37284:16;;;:7;:16;;;;;;;;;37313:14;;-1:-1:-1;;;37313:14:0;;;;37241:5;;;;-1:-1:-1;;;;;37284:16:0;;;;;;37313:12;;:14;;;;;37284:16;;37313:14;;;;;;37284:16;37313:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37330:7;-1:-1:-1;;;;;37330:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37353:7;-1:-1:-1;;;;;37353:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37305:65;;;;;;;37184:191;;;;;:::o;35391:215::-;35512:16;17492:7;;35512:16;;17492:7;;17491:8;17483:35;;;;-1:-1:-1;;;17483:35:0;;;;;;;:::i;:::-;17523:7;:14;;-1:-1:-1;;17523:14:0;17533:4;17523:14;;;35552:49:::1;35567:3:::0;35572:4;35578;35584:10:::1;35596:4:::0;35552:14:::1;:49::i;36130:89::-:0;36193:5;;-1:-1:-1;;;;;36193:5:0;36179:10;:19;36171:28;;;;;;36204:3;:10;;-1:-1:-1;;;;;;36204:10:0;-1:-1:-1;;;;;36204:10:0;;;;;;;;;;36130:89::o;35611:224::-;35748:16;17492:7;;35748:16;;17492:7;;17491:8;17483:35;;;;-1:-1:-1;;;17483:35:0;;;;;;;:::i;:::-;17523:7;:14;;-1:-1:-1;;17523:14:0;17533:4;17523:14;;;35788:42:::1;35803:3:::0;35808:4;35814;35820:3;35825:4;35788:14:::1;:42::i;:::-;17558:5:::0;17548:15;;-1:-1:-1;;17548:15:0;;;35781:49;;;;-1:-1:-1;35611:224:0;-1:-1:-1;;;;;;35611:224:0:o;25834:584::-;25955:37;25974:7;25983:8;25955:18;:37::i;:::-;25947:46;;;;;;26063:31;26078:5;26085:8;26063:14;:31::i;:::-;26157:33;26174:5;26181:8;26157:16;:33::i;:::-;26209:26;26221:3;26226:8;26209:11;:26::i;:::-;26309;;;;:16;:26;;;;;;26338:12;26309:41;;26383:30;26326:8;;-1:-1:-1;;;;;26383:30:0;;;;;;;;-1:-1:-1;;;;;;;;;;;26383:30:0;;25834:584;;;;:::o;24893:389::-;24977:4;25004:19;;;:9;:19;;;;;;;;;25109:13;:23;;;;;;-1:-1:-1;;;;;25004:19:0;;;25169:23;;;:16;:23;;;;;25050:17;;;25168:35;;;;;;;;;25004:19;;25050:17;;;;25109:23;;;;25097:35;;25168;;25050:17;;25215:35;;;25233:17;25215:35;:62;;;;25254:23;25215:62;25208:69;24893:389;-1:-1:-1;;;;;;;24893:389:0:o;34353:584::-;34471:16;34489:8;34506:7;;34504:9;;;;;:::i;:::-;;;;-1:-1:-1;;34524:7:0;;34536:15;34542:3;34524:7;34536:5;:15::i;:::-;-1:-1:-1;34564:49:0;;-1:-1:-1;;;34564:49:0;;34581:10;34564:49;;;28775:34:1;34601:4:0;28825:18:1;;;28818:43;28877:18;;;28870:34;;;-1:-1:-1;;;;;34564:16:0;;;;;28710:18:1;;34564:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34556:65;;;;-1:-1:-1;;;34556:65:0;;29367:2:1;34556:65:0;;;29349:21:1;29406:1;29386:18;;;29379:29;-1:-1:-1;;;29424:18:1;;;29417:33;29467:18;;34556:65:0;29165:326:1;34556:65:0;34659:6;;34645:22;;-1:-1:-1;;;;;34659:6:0;34645:5;:22::i;:::-;34673:35;;-1:-1:-1;;;34673:35:0;;34626:42;;-1:-1:-1;;;;;;34673:18:0;;;;;:35;;34692:3;;34697:4;;34703;;34673:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34721:35:0;;-1:-1:-1;;;34721:35:0;;-1:-1:-1;;;;;5040:32:1;;;34721:35:0;;;5022:51:1;5089:18;;;5082:34;;;34721:11:0;;;-1:-1:-1;34721:11:0;;-1:-1:-1;4995:18:1;;34721:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34713:51;;;;-1:-1:-1;;;34713:51:0;;30132:2:1;34713:51:0;;;30114:21:1;30171:1;30151:18;;;30144:29;-1:-1:-1;;;30189:18:1;;;30182:33;30232:18;;34713:51:0;29930:326:1;34713:51:0;34769:28;;-1:-1:-1;;;34769:28:0;;;;;2858:25:1;;;-1:-1:-1;;;;;34769:22:0;;;;;2831:18:1;;34769:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34802:12:0;;;;:7;:12;;;;;;;;:20;;-1:-1:-1;;;;;34802:20:0;;;-1:-1:-1;;;;;;34802:20:0;;;;;;;34827:9;:14;;;;;;:21;;;;;;;;;;;;;;;;;-1:-1:-1;34827:21:0;;;;;;;34858:74;;30492:25:1;;;30533:18;;;30526:34;;;30576:18;;;30569:60;;;;30660:2;30645:18;;30638:34;34858:74:0;;;;-1:-1:-1;34858:74:0;;;;34870:10;;34858:74;;30479:3:1;30464:19;34858:74:0;;;;;;;34353:584;;;;;;;;:::o;24283:279::-;24409:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;24409:29:0;;;:19;;:29;24402:37;;;;:::i;:::-;24483:1;24448:23;;;:13;:23;;;;;;-1:-1:-1;;;;;24448:23:0;:37;24444:114;;24550:1;24516:23;;;:13;:23;;;;;:36;;-1:-1:-1;;;;;;24516:36:0;;;24444:114;24283:279;;:::o;33456:371::-;33582:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;33582:28:0;;;:19;;:28;33575:36;;;;:::i;:::-;33669:1;33639:19;;;:9;:19;;;;;:32;;-1:-1:-1;;;;;;33639:32:0;;;33716:42;33742:5;33649:8;33716:25;:42::i;:::-;-1:-1:-1;;;;;33791:26:0;;;;;;:19;:26;;;;;:31;;33821:1;;33791:26;:31;;33821:1;;33791:31;:::i;:::-;;;;-1:-1:-1;;;;33456:371:0:o;31386:351::-;31534:1;31503:19;;;:9;:19;;;;;;-1:-1:-1;;;;;31503:19:0;:33;31496:41;;;;:::i;:::-;31565:19;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;31565:25:0;-1:-1:-1;;;;;31565:25:0;;;;;;;;20683:27;;;:19;:27;;;;;;;;31184:20;:25;;;;;:40;;;;;;;;:51;;;31240:27;;;:17;:27;;;;;:43;;;;31703:24;;;;;;:29;;-1:-1:-1;;31565:19:0;31703:29;;-1:-1:-1;;31703:29:0;:::i;32056:288::-;32117:4;-1:-1:-1;;;;;32173:17:0;;32166:25;;;;:::i;:::-;32252:26;32264:3;32269:8;32252:11;:26::i;:::-;32288:35;;32314:8;;-1:-1:-1;;;;;32288:35:0;;;32305:1;;-1:-1:-1;;;;;;;;;;;32288:35:0;32305:1;;32288:35;-1:-1:-1;32335:4:0;32056:288;;;;:::o;14312:439::-;14369:16;14424:4;14418:11;-1:-1:-1;;;14441:3:0;14434:79;14551:14;14545:4;14541:25;14534:4;14529:3;14525:14;14518:49;-1:-1:-1;;;14588:4:0;14583:3;14579:14;14572:90;14694:4;14689:3;14686:1;14679:20;14667:32;-1:-1:-1;;;;;;;14716:22:0;;14708:38;;;;-1:-1:-1;;;14708:38:0;;31148:2:1;14708:38:0;;;31130:21:1;31187:1;31167:18;;;31160:29;-1:-1:-1;;;31205:18:1;;;31198:33;31248:18;;14708:38:0;30946:326:1;14708:38:0;14312:439;;;:::o;32512:839::-;-1:-1:-1;;;;;20683:27:0;;32604:18;20683:27;;;:19;:27;;;;;;32625:19;;32643:1;;32625:19;:::i;:::-;32649:18;32670:27;;;:17;:27;;;;;;32604:40;;-1:-1:-1;32708:30:0;;;32704:643;;;-1:-1:-1;;;;;32781:27:0;;32826:1;32781:27;;;:20;:27;;;;;;;;:42;;;;;;;;:46;;;32865:27;;;:17;:27;;;;;:31;32704:643;;;-1:-1:-1;;;;;32933:27:0;;;;32914:16;32933:27;;;:20;:27;;;;;;;;:42;;;;;;;;;;;33029;;;;;;:56;;;33123:30;;:17;:30;;;;;;:46;;;;33226;;;;33310:27;;;;;:31;32512:839::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;800:258::-;872:1;882:113;896:6;893:1;890:13;882:113;;;972:11;;;966:18;953:11;;;946:39;918:2;911:10;882:113;;;1013:6;1010:1;1007:13;1004:48;;;-1:-1:-1;;1048:1:1;1030:16;;1023:27;800:258::o;1063:::-;1105:3;1143:5;1137:12;1170:6;1165:3;1158:19;1186:63;1242:6;1235:4;1230:3;1226:14;1219:4;1212:5;1208:16;1186:63;:::i;:::-;1303:2;1282:15;-1:-1:-1;;1278:29:1;1269:39;;;;1310:4;1265:50;;1063:258;-1:-1:-1;;1063:258:1:o;1326:220::-;1475:2;1464:9;1457:21;1438:4;1495:45;1536:2;1525:9;1521:18;1513:6;1495:45;:::i;1551:180::-;1610:6;1663:2;1651:9;1642:7;1638:23;1634:32;1631:52;;;1679:1;1676;1669:12;1631:52;-1:-1:-1;1702:23:1;;1551:180;-1:-1:-1;1551:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2192:263::-;2267:6;2320:2;2308:9;2299:7;2295:23;2291:32;2288:52;;;2336:1;2333;2326:12;2288:52;2375:9;2362:23;2394:31;2419:5;2394:31;:::i;2894:456::-;2971:6;2979;2987;3040:2;3028:9;3019:7;3015:23;3011:32;3008:52;;;3056:1;3053;3046:12;3008:52;3095:9;3082:23;3114:31;3139:5;3114:31;:::i;:::-;3164:5;-1:-1:-1;3221:2:1;3206:18;;3193:32;3234:33;3193:32;3234:33;:::i;:::-;2894:456;;3286:7;;-1:-1:-1;;;3340:2:1;3325:18;;;;3312:32;;2894:456::o;4289:538::-;4388:6;4396;4404;4412;4465:3;4453:9;4444:7;4440:23;4436:33;4433:53;;;4482:1;4479;4472:12;4433:53;4521:9;4508:23;4540:31;4565:5;4540:31;:::i;:::-;4590:5;-1:-1:-1;4642:2:1;4627:18;;4614:32;;-1:-1:-1;4693:2:1;4678:18;;4665:32;;-1:-1:-1;4749:2:1;4734:18;;4721:32;4762:33;4721:32;4762:33;:::i;:::-;4289:538;;;;-1:-1:-1;4289:538:1;;-1:-1:-1;;4289:538:1:o;5127:326::-;5220:5;5243:1;5253:194;5267:4;5264:1;5261:11;5253:194;;;5326:13;;5314:26;;5363:4;5387:12;;;;5422:15;;;;5287:1;5280:9;5253:194;;5458:435;5511:3;5549:5;5543:12;5576:6;5571:3;5564:19;5602:4;5631:2;5626:3;5622:12;5615:19;;5668:2;5661:5;5657:14;5689:1;5699:169;5713:6;5710:1;5707:13;5699:169;;;5774:13;;5762:26;;5808:12;;;;5843:15;;;;5735:1;5728:9;5699:169;;;-1:-1:-1;5884:3:1;;5458:435;-1:-1:-1;;;;;5458:435:1:o;5898:469::-;5959:3;5997:5;5991:12;6024:6;6019:3;6012:19;6050:4;6079:2;6074:3;6070:12;6063:19;;6116:2;6109:5;6105:14;6137:1;6147:195;6161:6;6158:1;6155:13;6147:195;;;6226:13;;-1:-1:-1;;;;;6222:39:1;6210:52;;6282:12;;;;6317:15;;;;6258:1;6176:9;6147:195;;6372:616;6424:3;6462:5;6456:12;6489:6;6484:3;6477:19;6515:4;6556:2;6551:3;6547:12;6581:11;6608;6601:18;;6658:6;6655:1;6651:14;6644:5;6640:26;6628:38;;6700:2;6693:5;6689:14;6721:1;6731:231;6745:6;6742:1;6739:13;6731:231;;;6816:5;6810:4;6806:16;6801:3;6794:29;6844:38;6877:4;6868:6;6862:13;6844:38;:::i;:::-;6940:12;;;;6836:46;-1:-1:-1;6905:15:1;;;;6767:1;6760:9;6731:231;;;-1:-1:-1;6978:4:1;;6372:616;-1:-1:-1;;;;;;;6372:616:1:o;7173:475::-;7221:3;7252;7306;7299:5;7295:15;7333:5;7356:1;7366:256;7380:4;7377:1;7374:11;7366:256;;;7449:5;7443:4;7439:16;7434:3;7427:29;7477:38;7510:4;7501:6;7495:13;7477:38;:::i;:::-;7538:4;7600:12;;;;7469:46;;-1:-1:-1;7565:15:1;;;;;7400:1;7393:9;7366:256;;;-1:-1:-1;7638:4:1;;7173:475;-1:-1:-1;;;;;7173:475:1:o;7653:2054::-;8462:4;8491:3;8514:9;8571:6;8462:4;8605:220;8619:4;8616:1;8613:11;8605:220;;;8682:13;;-1:-1:-1;;;;;8678:39:1;8666:52;;8741:4;8765:12;;;;8800:15;;;;8714:1;8632:9;8605:220;;;8609:3;;;8834:53;8882:3;8871:9;8867:19;8859:6;8834:53;:::i;:::-;8924:2;8918:3;8907:9;8903:19;8896:31;8950:56;9002:2;8991:9;8987:18;8979:6;8950:56;:::i;:::-;8936:70;;9055:9;9047:6;9043:22;9037:3;9026:9;9022:19;9015:51;9089:52;9134:6;9126;9089:52;:::i;:::-;9075:66;;9190:9;9182:6;9178:22;9172:3;9161:9;9157:19;9150:51;9224:44;9261:6;9253;9224:44;:::i;:::-;9210:58;;9317:9;9309:6;9305:22;9299:3;9288:9;9284:19;9277:51;9351:44;9388:6;9380;9351:44;:::i;:::-;9337:58;;9444:9;9436:6;9432:22;9426:3;9415:9;9411:19;9404:51;9478:43;9514:6;9506;9478:43;:::i;:::-;7071:12;;-1:-1:-1;;;;;7067:38:1;9580:3;9565:19;;7055:51;7155:4;7144:16;;7138:23;7122:14;;;7115:47;9464:57;-1:-1:-1;9634:9:1;9626:6;9622:22;9616:3;9605:9;9601:19;9594:51;9662:39;9694:6;9686;9662:39;:::i;:::-;9654:47;7653:2054;-1:-1:-1;;;;;;;;;;;;7653:2054:1:o;9712:396::-;9802:6;9810;9818;9871:2;9859:9;9850:7;9846:23;9842:32;9839:52;;;9887:1;9884;9877:12;9839:52;9926:9;9913:23;9945:31;9970:5;9945:31;:::i;:::-;9995:5;10047:2;10032:18;;10019:32;;-1:-1:-1;10098:2:1;10083:18;;;10070:32;;9712:396;-1:-1:-1;;;9712:396:1:o;10884:261::-;11063:2;11052:9;11045:21;11026:4;11083:56;11135:2;11124:9;11120:18;11112:6;11083:56;:::i;11150:118::-;11236:5;11229:13;11222:21;11215:5;11212:32;11202:60;;11258:1;11255;11248:12;11273:382;11338:6;11346;11399:2;11387:9;11378:7;11374:23;11370:32;11367:52;;;11415:1;11412;11405:12;11367:52;11454:9;11441:23;11473:31;11498:5;11473:31;:::i;:::-;11523:5;-1:-1:-1;11580:2:1;11565:18;;11552:32;11593:30;11552:32;11593:30;:::i;:::-;11642:7;11632:17;;;11273:382;;;;;:::o;11660:127::-;11721:10;11716:3;11712:20;11709:1;11702:31;11752:4;11749:1;11742:15;11776:4;11773:1;11766:15;11792:257;11864:4;11858:11;;;11896:17;;11943:18;11928:34;;11964:22;;;11925:62;11922:88;;;11990:18;;:::i;:::-;12026:4;12019:24;11792:257;:::o;12054:275::-;12125:2;12119:9;12190:2;12171:13;;-1:-1:-1;;12167:27:1;12155:40;;12225:18;12210:34;;12246:22;;;12207:62;12204:88;;;12272:18;;:::i;:::-;12308:2;12301:22;12054:275;;-1:-1:-1;12054:275:1:o;12334:186::-;12382:4;12415:18;12407:6;12404:30;12401:56;;;12437:18;;:::i;:::-;-1:-1:-1;12503:2:1;12482:15;-1:-1:-1;;12478:29:1;12509:4;12474:40;;12334:186::o;12525:1016::-;12620:6;12628;12636;12644;12697:3;12685:9;12676:7;12672:23;12668:33;12665:53;;;12714:1;12711;12704:12;12665:53;12753:9;12740:23;12772:31;12797:5;12772:31;:::i;:::-;12822:5;-1:-1:-1;12879:2:1;12864:18;;12851:32;12892:33;12851:32;12892:33;:::i;:::-;12944:7;-1:-1:-1;12998:2:1;12983:18;;12970:32;;-1:-1:-1;13053:2:1;13038:18;;13025:32;13080:18;13069:30;;13066:50;;;13112:1;13109;13102:12;13066:50;13135:22;;13188:4;13180:13;;13176:27;-1:-1:-1;13166:55:1;;13217:1;13214;13207:12;13166:55;13253:2;13240:16;13278:48;13294:31;13322:2;13294:31;:::i;:::-;13278:48;:::i;:::-;13349:2;13342:5;13335:17;13389:7;13384:2;13379;13375;13371:11;13367:20;13364:33;13361:53;;;13410:1;13407;13400:12;13361:53;13465:2;13460;13456;13452:11;13447:2;13440:5;13436:14;13423:45;13509:1;13504:2;13499;13492:5;13488:14;13484:23;13477:34;13530:5;13520:15;;;;;12525:1016;;;;;;;:::o;13546:571::-;13665:6;13673;13681;13734:2;13722:9;13713:7;13709:23;13705:32;13702:52;;;13750:1;13747;13740:12;13702:52;13789:9;13776:23;13808:31;13833:5;13808:31;:::i;:::-;13858:5;-1:-1:-1;13915:2:1;13900:18;;13887:32;13928:33;13887:32;13928:33;:::i;:::-;13980:7;-1:-1:-1;14039:2:1;14024:18;;14011:32;14052:33;14011:32;14052:33;:::i;:::-;14104:7;14094:17;;;13546:571;;;;;:::o;14709:356::-;14764:5;14812:4;14800:9;14795:3;14791:19;14787:30;14784:50;;;14830:1;14827;14820:12;14784:50;14852:22;;:::i;:::-;14843:31;;14911:9;14898:23;14930:33;14955:7;14930:33;:::i;:::-;14986:7;14979:5;14972:22;;15054:2;15043:9;15039:18;15026:32;15021:2;15014:5;15010:14;15003:56;14709:356;;;;:::o;15070:513::-;15194:6;15202;15210;15218;15271:3;15259:9;15250:7;15246:23;15242:33;15239:53;;;15288:1;15285;15278:12;15239:53;15327:9;15314:23;15346:31;15371:5;15346:31;:::i;:::-;15396:5;-1:-1:-1;15448:2:1;15433:18;;15420:32;;-1:-1:-1;15499:2:1;15484:18;;15471:32;;-1:-1:-1;15522:55:1;15569:7;15564:2;15549:18;;15522:55;:::i;:::-;15512:65;;15070:513;;;;;;;:::o;16076:388::-;16144:6;16152;16205:2;16193:9;16184:7;16180:23;16176:32;16173:52;;;16221:1;16218;16211:12;16173:52;16260:9;16247:23;16279:31;16304:5;16279:31;:::i;:::-;16329:5;-1:-1:-1;16386:2:1;16371:18;;16358:32;16399:33;16358:32;16399:33;:::i;16469:655::-;16602:6;16610;16618;16626;16634;16687:3;16675:9;16666:7;16662:23;16658:33;16655:53;;;16704:1;16701;16694:12;16655:53;16743:9;16730:23;16762:31;16787:5;16762:31;:::i;:::-;16812:5;-1:-1:-1;16864:2:1;16849:18;;16836:32;;-1:-1:-1;16915:2:1;16900:18;;16887:32;;-1:-1:-1;16971:2:1;16956:18;;16943:32;16984:33;16943:32;16984:33;:::i;:::-;17036:7;-1:-1:-1;17062:56:1;17110:7;17104:3;17089:19;;17062:56;:::i;:::-;17052:66;;16469:655;;;;;;;;:::o;17129:338::-;17331:2;17313:21;;;17370:2;17350:18;;;17343:30;-1:-1:-1;;;17404:2:1;17389:18;;17382:44;17458:2;17443:18;;17129:338::o;17472:727::-;17533:5;17586:3;17579:4;17571:6;17567:17;17563:27;17553:55;;17604:1;17601;17594:12;17553:55;17637:2;17631:9;17679:3;17671:6;17667:16;17749:6;17737:10;17734:22;17713:18;17701:10;17698:34;17695:62;17692:88;;;17760:18;;:::i;:::-;17796:2;17789:22;17831:6;17872:3;17860:16;;17888:15;;;17885:35;;;17916:1;17913;17906:12;17885:35;17940:6;17955:214;17971:6;17966:3;17963:15;17955:214;;;18046:3;18040:10;18063:31;18088:5;18063:31;:::i;:::-;18107:18;;18154:4;18145:14;;;;17988;17955:214;;;-1:-1:-1;18187:6:1;;17472:727;-1:-1:-1;;;;;17472:727:1:o;18204:672::-;18265:5;18318:3;18311:4;18303:6;18299:17;18295:27;18285:55;;18336:1;18333;18326:12;18285:55;18369:2;18363:9;18391:3;18433:2;18425:6;18421:15;18502:6;18490:10;18487:22;18466:18;18454:10;18451:34;18448:62;18445:88;;;18513:18;;:::i;:::-;18549:2;18542:22;18613:15;;18584:6;18640:15;;;18637:35;;;18668:1;18665;18658:12;18637:35;18692:6;18707:139;18723:6;18718:3;18715:15;18707:139;;;18791:10;;18779:23;;18831:4;18822:14;;;;18740;18707:139;;18881:183;18941:4;18974:18;18966:6;18963:30;18960:56;;;18996:18;;:::i;:::-;-1:-1:-1;19041:1:1;19037:14;19053:4;19033:25;;18881:183::o;19069:659::-;19134:5;19187:3;19180:4;19172:6;19168:17;19164:27;19154:55;;19205:1;19202;19195:12;19154:55;19234:6;19228:13;19260:4;19284:60;19300:43;19340:2;19300:43;:::i;19284:60::-;19378:15;;;19464:1;19460:10;;;;19448:23;;19444:32;;;19409:12;;;;19488:15;;;19485:35;;;19516:1;19513;19506:12;19485:35;19552:2;19544:6;19540:15;19564:135;19580:6;19575:3;19572:15;19564:135;;;19646:10;;19634:23;;19677:12;;;;19597;;19564:135;;;-1:-1:-1;19717:5:1;19069:659;-1:-1:-1;;;;;;19069:659:1:o;19733:742::-;19806:5;19859:3;19852:4;19844:6;19840:17;19836:27;19826:55;;19877:1;19874;19867:12;19826:55;19906:6;19900:13;19932:4;19956:60;19972:43;20012:2;19972:43;:::i;19956:60::-;20050:15;;;20136:1;20132:10;;;;20120:23;;20116:32;;;20081:12;;;;20160:15;;;20157:35;;;20188:1;20185;20178:12;20157:35;20224:2;20216:6;20212:15;20236:210;20252:6;20247:3;20244:15;20236:210;;;20325:3;20319:10;20342:31;20367:5;20342:31;:::i;:::-;20386:18;;20424:12;;;;20269;;20236:210;;20480:429;20534:5;20587:3;20580:4;20572:6;20568:17;20564:27;20554:55;;20605:1;20602;20595:12;20554:55;20634:6;20628:13;20665:48;20681:31;20709:2;20681:31;:::i;20665:48::-;20738:2;20729:7;20722:19;20784:3;20777:4;20772:2;20764:6;20760:15;20756:26;20753:35;20750:55;;;20801:1;20798;20791:12;20750:55;20814:64;20875:2;20868:4;20859:7;20855:18;20848:4;20840:6;20836:17;20814:64;:::i;:::-;20896:7;20480:429;-1:-1:-1;;;;20480:429:1:o;20914:896::-;20978:5;21031:3;21024:4;21016:6;21012:17;21008:27;20998:55;;21049:1;21046;21039:12;20998:55;21078:6;21072:13;21104:4;21128:60;21144:43;21184:2;21144:43;:::i;21128:60::-;21222:15;;;21308:1;21304:10;;;;21292:23;;21288:32;;;21253:12;;;;21332:15;;;21329:35;;;21360:1;21357;21350:12;21329:35;21396:2;21388:6;21384:15;21408:373;21424:6;21419:3;21416:15;21408:373;;;21503:3;21497:10;21539:18;21526:11;21523:35;21520:125;;;21599:1;21628:2;21624;21617:14;21520:125;21670:68;21734:3;21729:2;21715:11;21707:6;21703:24;21699:33;21670:68;:::i;:::-;21658:81;;-1:-1:-1;21759:12:1;;;;21441;;21408:373;;21815:353;21881:5;21929:4;21917:9;21912:3;21908:19;21904:30;21901:50;;;21947:1;21944;21937:12;21901:50;21969:22;;:::i;:::-;21960:31;;22021:9;22015:16;22040:33;22065:7;22040:33;:::i;:::-;22096:7;22089:5;22082:22;;22157:2;22146:9;22142:18;22136:25;22131:2;22124:5;22120:14;22113:49;21815:353;;;;:::o;22173:885::-;22233:5;22286:3;22279:4;22271:6;22267:17;22263:27;22253:55;;22304:1;22301;22294:12;22253:55;22337:2;22331:9;22379:3;22371:6;22367:16;22402:18;22470:6;22458:10;22455:22;22450:2;22438:10;22435:18;22432:46;22429:72;;;22481:18;;:::i;:::-;22521:10;22517:2;22510:22;22552:6;22541:17;;22593:3;22585:6;22581:16;22620:3;22612:6;22609:15;22606:35;;;22637:1;22634;22627:12;22606:35;22661:6;22676:352;22692:6;22687:3;22684:15;22676:352;;;22773:3;22767:10;22809:2;22796:11;22793:19;22790:109;;;22853:1;22882:2;22878;22871:14;22790:109;22924:59;22979:3;22965:11;22957:6;22953:24;22924:59;:::i;:::-;22912:72;;-1:-1:-1;23013:4:1;23004:14;;;;22709;22676:352;;;-1:-1:-1;23046:6:1;;22173:885;-1:-1:-1;;;;;;22173:885:1:o;23063:1950::-;23458:6;23466;23474;23482;23490;23498;23506;23514;23522;23575:3;23563:9;23554:7;23550:23;23546:33;23543:53;;;23592:1;23589;23582:12;23543:53;23615:55;23662:7;23651:9;23615:55;:::i;:::-;23605:65;;23689;23746:7;23740:3;23729:9;23725:19;23689:65;:::i;:::-;23679:75;;23798:3;23787:9;23783:19;23777:26;23822:18;23863:2;23855:6;23852:14;23849:34;;;23879:1;23876;23869:12;23849:34;23902:72;23966:7;23957:6;23946:9;23942:22;23902:72;:::i;:::-;23892:82;;24020:3;24009:9;24005:19;23999:26;23983:42;;24050:2;24040:8;24037:16;24034:36;;;24066:1;24063;24056:12;24034:36;24089:82;24163:7;24152:8;24141:9;24137:24;24089:82;:::i;:::-;24079:92;;24217:3;24206:9;24202:19;24196:26;24180:42;;24247:2;24237:8;24234:16;24231:36;;;24263:1;24260;24253:12;24231:36;24286:74;24352:7;24341:8;24330:9;24326:24;24286:74;:::i;:::-;24276:84;;24406:3;24395:9;24391:19;24385:26;24369:42;;24436:2;24426:8;24423:16;24420:36;;;24452:1;24449;24442:12;24420:36;24475:74;24541:7;24530:8;24519:9;24515:24;24475:74;:::i;:::-;24465:84;;24595:3;24584:9;24580:19;24574:26;24558:42;;24625:2;24615:8;24612:16;24609:36;;;24641:1;24638;24631:12;24609:36;24664:73;24729:7;24718:8;24707:9;24703:24;24664:73;:::i;:::-;24654:83;;24756:67;24815:7;24809:3;24798:9;24794:19;24756:67;:::i;:::-;24746:77;;24869:3;24858:9;24854:19;24848:26;24832:42;;24899:2;24889:8;24886:16;24883:36;;;24915:1;24912;24905:12;24883:36;;24938:69;24999:7;24988:8;24977:9;24973:24;24938:69;:::i;:::-;24928:79;;;23063:1950;;;;;;;;;;;:::o;25018:127::-;25079:10;25074:3;25070:20;25067:1;25060:31;25110:4;25107:1;25100:15;25134:4;25131:1;25124:15;25150:127;25211:10;25206:3;25202:20;25199:1;25192:31;25242:4;25239:1;25232:15;25266:4;25263:1;25256:15;25282:135;25321:3;-1:-1:-1;;25342:17:1;;25339:43;;;25362:18;;:::i;:::-;-1:-1:-1;25409:1:1;25398:13;;25282:135::o;25422:127::-;25483:10;25478:3;25474:20;25471:1;25464:31;25514:4;25511:1;25504:15;25538:4;25535:1;25528:15;25554:489;-1:-1:-1;;;;;25823:15:1;;;25805:34;;25875:15;;25870:2;25855:18;;25848:43;25922:2;25907:18;;25900:34;;;25970:3;25965:2;25950:18;;25943:31;;;25748:4;;25991:46;;26017:19;;26009:6;25991:46;:::i;:::-;25983:54;25554:489;-1:-1:-1;;;;;;25554:489:1:o;26048:249::-;26117:6;26170:2;26158:9;26149:7;26145:23;26141:32;26138:52;;;26186:1;26183;26176:12;26138:52;26218:9;26212:16;26237:30;26261:5;26237:30;:::i;27463:267::-;27549:6;27602:2;27590:9;27581:7;27577:23;27573:32;27570:52;;;27618:1;27615;27608:12;27570:52;27650:9;27644:16;27669:31;27694:5;27669:31;:::i;27735:337::-;27815:6;27868:2;27856:9;27847:7;27843:23;27839:32;27836:52;;;27884:1;27881;27874:12;27836:52;27917:9;27911:16;27950:18;27942:6;27939:30;27936:50;;;27982:1;27979;27972:12;27936:50;28005:61;28058:7;28049:6;28038:9;28034:22;28005:61;:::i;28346:184::-;28416:6;28469:2;28457:9;28448:7;28444:23;28440:32;28437:52;;;28485:1;28482;28475:12;28437:52;-1:-1:-1;28508:16:1;;28346:184;-1:-1:-1;28346:184:1:o;28915:245::-;28982:6;29035:2;29023:9;29014:7;29010:23;29006:32;29003:52;;;29051:1;29048;29041:12;29003:52;29083:9;29077:16;29102:28;29124:5;29102:28;:::i;29496:429::-;-1:-1:-1;;;;;29780:32:1;;29762:51;;29844:2;29829:18;;29822:34;;;29749:3;29734:19;;29865:54;29915:2;29900:18;;29892:6;7071:12;;-1:-1:-1;;;;;7067:38:1;7055:51;;7155:4;7144:16;;;7138:23;7122:14;;7115:47;6993:175;30683:125;30723:4;30751:1;30748;30745:8;30742:34;;;30756:18;;:::i;:::-;-1:-1:-1;30793:9:1;;30683:125::o;30813:128::-;30853:3;30884:1;30880:6;30877:1;30874:13;30871:39;;;30890:18;;:::i;:::-;-1:-1:-1;30926:9:1;;30813:128::o
Swarm Source
ipfs://6b6e644e1bf6cd039303f8775ccc7576ff032fb6b3a0261f90a180697b6700c6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.