Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Whitelist Mint | 15643436 | 827 days ago | IN | 0.16 ETH | 0.00194126 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TwitterscanPass
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; import "./@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; import "./@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol"; import "./@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import "./@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; import "./@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "./@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; import "./@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; interface IERC721R { event Refund( address indexed _sender, uint256 indexed _tokenId, uint256 _amount ); function refund(uint256[] calldata tokenIds) external; function getRefundPrice(uint256 tokenId) external view returns (uint256); function getRefundGuaranteeEndTime() external view returns (uint256); function isRefundGuaranteeActive() external view returns (bool); } struct Conf{ uint wlSize; //5000 uint wlCount; //wl already mint uint wlPrice; //0.08 uint begin; //whiteList begin mint time uint publicBegin;//public begin mint time uint publicPrice; //0.5 uint refundStartId;//6500 address refundAddress; //Address which refunded NFTs will be sent to address withdrawTo; //withdraw to this address } contract TwitterscanPass is Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721URIStorageUpgradeable, PausableUpgradeable, AccessControlUpgradeable,IERC721R { using CountersUpgradeable for CountersUpgradeable.Counter; bytes32 public wlMerkleRoot; bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); uint internal constant wlMax = 2; //uint internal constant publicMax=5; uint private _entered; modifier nonReentrant { require(_entered == 0, "reentrant"); _entered = 1; _; _entered = 0; } CountersUpgradeable.Counter private _tokenIdCounter; string public _baseTokenURI; uint public collectionSize; Conf public conf; mapping (address => uint) public whitelistClaimNum; //address =>claim num mapping(uint256 => bool) public hasRefunded; // users can search if the NFT has been refunded //mapping(uint256 => bool) public hasRevokedRefund; // users can revoke refund capability for e.g staking, airdrops mapping (address => uint) public publicClaimNum; //address =>claim num mapping (address =>mapping (uint => bool)) private enableRefund; //address =>tokenId => enable refund function initialize(address gov) initializer public { __ERC721_init("Twitterscan Pass", "TSP"); __ERC721Enumerable_init(); __ERC721URIStorage_init(); __Pausable_init(); __AccessControl_init(); collectionSize = 10000; conf.wlSize = 5000; conf.wlPrice = 0.08 ether; conf.begin = 1664506800; conf.publicBegin = 1664766000;//public begin mint time conf.publicPrice = 0.5 ether; conf.refundStartId = 6500; conf.refundAddress = msg.sender; conf.withdrawTo = msg.sender; _grantRole(DEFAULT_ADMIN_ROLE, gov); _grantRole(PAUSER_ROLE, gov); _grantRole(MINTER_ROLE, gov); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; //"ipfs://abc/" } function setBaseURI(string calldata baseURI) external onlyRole(DEFAULT_ADMIN_ROLE) { _baseTokenURI = baseURI; } function setConf(Conf calldata conf_) external onlyRole(DEFAULT_ADMIN_ROLE){ //only test contract conf = conf_; } function setWlMerkleRoot(bytes32 root) external onlyRole(DEFAULT_ADMIN_ROLE) { wlMerkleRoot = root; } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function safeMint(address to, string memory uri) public onlyRole(MINTER_ROLE) { require(totalSupply()+1 <= collectionSize,"reached max"); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function whitelistMint (uint vol,bytes32[] calldata _merkleProof) public whenNotPaused payable{ require(conf.begin<=block.timestamp,"Not begin"); uint claimed = whitelistClaimNum[msg.sender]; require((claimed+vol)<=wlMax, "Address claim max <= 2"); require(totalSupply() + vol <= collectionSize, "reached max supply"); require(conf.wlCount + vol <= conf.wlSize,"reached whitelist size"); conf.wlCount += vol; bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProofUpgradeable.verify(_merkleProof, wlMerkleRoot, leaf),"Invalid Proof." ); whitelistClaimNum[msg.sender] = claimed + vol; __batchMint(msg.sender,vol); refundIfOver(conf.wlPrice*vol); } function publicMint (uint vol) public whenNotPaused payable{ require(conf.publicBegin<=block.timestamp,"Not begin"); uint claimed = publicClaimNum[msg.sender]; require((claimed+vol) <= 5, "Address claim max <= 5"); require(totalSupply() + vol <= collectionSize, "reached max supply"); publicClaimNum[msg.sender] = claimed + vol; uint256 tokenIdStart = _tokenIdCounter.current(); __batchMint(msg.sender,vol); for (uint i=0; i<vol;i++){ enableRefund[msg.sender][tokenIdStart+i] = true; } refundIfOver(conf.publicPrice*vol); } function __batchMint(address to,uint vol) internal { uint256 tokenId = _tokenIdCounter.current(); for (uint i=0;i<vol;i++){ _safeMint(to, tokenId); tokenId++; } _tokenIdCounter.set(tokenId); } function batchMints(address[] calldata tos, uint256[] calldata vols) public whenNotPaused onlyRole(MINTER_ROLE) { require(tos.length == vols.length, "length do not match"); uint256 tokenId = _tokenIdCounter.current(); for(uint i=0; i<tos.length; i++){ for (uint j=0;j<vols[i];j++){ _safeMint(tos[i], tokenId); tokenId++; } } _tokenIdCounter.set(tokenId); require(tokenId<collectionSize,"over max supply"); } function batchMint(address to,uint vol) public whenNotPaused onlyRole(MINTER_ROLE){ require(totalSupply() + vol <= collectionSize, "reached max supply"); __batchMint(to,vol); } function refundIfOver(uint256 price_) private nonReentrant{ require(msg.value >= price_, "Need to send more ETH."); if (msg.value > price_) { payable(msg.sender).transfer(msg.value - price_); } } function withdraw() external onlyRole(DEFAULT_ADMIN_ROLE) nonReentrant { require(block.timestamp>getRefundGuaranteeEndTime(),"after public end"); (bool success, ) = conf.withdrawTo.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721Upgradeable, ERC721EnumerableUpgradeable) { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function _burn(uint256 tokenId) internal override(ERC721Upgradeable, ERC721URIStorageUpgradeable) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721Upgradeable, ERC721URIStorageUpgradeable) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721Upgradeable, ERC721EnumerableUpgradeable, AccessControlUpgradeable) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev Refunds all tokenIds, sends them to refund address and sends caller corresponding ETH * * Requirements: * * - The caller must own all token ids * - The token must be refundable - check `canBeRefunded`. */ function refund(uint256[] calldata tokenIds) external override { require(isRefundGuaranteeActive(), "Expired"); uint256 refundAmount = 0; for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; require(msg.sender == ownerOf(tokenId), "Not owner"); //require(!hasRevokedRefund[tokenId], "Revoked"); require(!hasRefunded[tokenId], "Refunded"); require(tokenId>=conf.refundStartId,"Not allow refund"); require(enableRefund[msg.sender][tokenId],"not init holder"); hasRefunded[tokenId] = true; enableRefund[msg.sender][tokenId] = false; transferFrom(msg.sender, conf.refundAddress, tokenId); refundAmount += conf.publicPrice; emit Refund(msg.sender, tokenId, conf.publicPrice); } payable(msg.sender).transfer(refundAmount); } function getRefundPrice(uint256 tokenId) public view override returns (uint256) { if (tokenId>=conf.refundStartId) return conf.publicPrice; else return 0; } function canBeRefunded(address refunder,uint256 tokenId) public view returns (bool) { return tokenId>conf.refundStartId && isRefundGuaranteeActive() && enableRefund[refunder][tokenId]; } function getRefundGuaranteeEndTime() public view override returns (uint256) { return conf.publicBegin + 5 days; } function isRefundGuaranteeActive() public view override returns (bool) { return (conf.publicBegin <block.timestamp && block.timestamp < conf.publicBegin + 5 days); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControlUpgradeable.sol"; import "../utils/ContextUpgradeable.sol"; import "../utils/StringsUpgradeable.sol"; import "../utils/introspection/ERC165Upgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721Upgradeable.sol"; import "./IERC721ReceiverUpgradeable.sol"; import "./extensions/IERC721MetadataUpgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../utils/StringsUpgradeable.sol"; import "../../utils/introspection/ERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; }
// SPDX-License-Identifier: MIT // 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 IERC721ReceiverUpgradeable { /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721Upgradeable.sol"; import "./IERC721EnumerableUpgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable { function __ERC721Enumerable_init() internal onlyInitializing { } function __ERC721Enumerable_init_unchained() internal onlyInitializing { } // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC721Upgradeable) returns (bool) { return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721Upgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721EnumerableUpgradeable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721Upgradeable.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721Upgradeable.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[46] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; import "../ERC721Upgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorageUpgradeable is Initializable, ERC721Upgradeable { function __ERC721URIStorage_init() internal onlyInitializing { } function __ERC721URIStorage_init_unchained() internal onlyInitializing { } using StringsUpgradeable for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721EnumerableUpgradeable is IERC721Upgradeable { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function set(Counter storage counter,uint256 value) internal { counter._value = value; } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProofUpgradeable { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // 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 IERC165Upgradeable { /** * @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); }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
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":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"vol","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"vols","type":"uint256[]"}],"name":"batchMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"refunder","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"canBeRefunded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"conf","outputs":[{"internalType":"uint256","name":"wlSize","type":"uint256"},{"internalType":"uint256","name":"wlCount","type":"uint256"},{"internalType":"uint256","name":"wlPrice","type":"uint256"},{"internalType":"uint256","name":"begin","type":"uint256"},{"internalType":"uint256","name":"publicBegin","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"uint256","name":"refundStartId","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"},{"internalType":"address","name":"withdrawTo","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":[],"name":"getRefundGuaranteeEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRefundPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hasRefunded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gov","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":[],"name":"isRefundGuaranteeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicClaimNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vol","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"wlSize","type":"uint256"},{"internalType":"uint256","name":"wlCount","type":"uint256"},{"internalType":"uint256","name":"wlPrice","type":"uint256"},{"internalType":"uint256","name":"begin","type":"uint256"},{"internalType":"uint256","name":"publicBegin","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"uint256","name":"refundStartId","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"},{"internalType":"address","name":"withdrawTo","type":"address"}],"internalType":"struct Conf","name":"conf_","type":"tuple"}],"name":"setConf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setWlMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vol","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613b48806100206000396000f3fe6080604052600436106102ae5760003560e01c806370a0823111610175578063c4d66de8116100dc578063d539139311610095578063e985e9c51161006f578063e985e9c5146108b2578063eb5be779146108fb578063faf762bd14610929578063fc3b941f1461093e57600080fd5b8063d53913931461084e578063d547741f14610870578063e63ab1e91461089057600080fd5b8063c4d66de8146107b1578063c4ea0845146107d1578063c87b56dd146107e6578063cfc86f7b14610806578063d204c45e1461081b578063d2cab0561461083b57600080fd5b8063a217fddf1161012e578063a217fddf146106dd578063a22cb465146106f2578063aa613df514610712578063b88d4fde14610732578063c1ae256d14610752578063c23fcdef1461078057600080fd5b806370a08231146106335780638456cb59146106535780638ab5a402146106685780638ac1e1611461068857806391d14854146106a857806395d89b41146106c857600080fd5b80633a2f18031161021957806345c0f533116101d257806345c0f5331461058d5780634f6ccce7146105a457806354c06aee146105c457806355f804b3146105db5780635c975abb146105fb5780636352211e1461061357600080fd5b80633a2f1803146104e35780633a4a2a01146105035780633ccfd60b146105235780633f4ba83a1461053857806342842e0e1461054d57806343508b051461056d57600080fd5b806323b872dd1161026b57806323b872dd1461041f578063248a9ca31461043f5780632db11544146104705780632f2ff15d146104835780632f745c59146104a357806336568abe146104c357600080fd5b806301ffc9a7146102b357806306fdde03146102e8578063081812fc1461030a578063095ea7b314610342578063177927291461036457806318160ddd14610400575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004613015565b61095e565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd61096f565b6040516102df919061308a565b34801561031657600080fd5b5061032a61032536600461309d565b610a01565b6040516001600160a01b0390911681526020016102df565b34801561034e57600080fd5b5061036261035d3660046130cb565b610a28565b005b34801561037057600080fd5b5061016454610165546101665461016754610168546101695461016a5461016b5461016c546103b098979695949392916001600160a01b03908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c08401526001600160a01b0390811660e084015216610100820152610120016102df565b34801561040c57600080fd5b506099545b6040519081526020016102df565b34801561042b57600080fd5b5061036261043a3660046130f7565b610b42565b34801561044b57600080fd5b5061041161045a36600461309d565b600090815261012d602052604090206001015490565b61036261047e36600461309d565b610b73565b34801561048f57600080fd5b5061036261049e366004613138565b610cf3565b3480156104af57600080fd5b506104116104be3660046130cb565b610d19565b3480156104cf57600080fd5b506103626104de366004613138565b610daf565b3480156104ef57600080fd5b506103626104fe3660046131b4565b610e2d565b34801561050f57600080fd5b5061041161051e36600461309d565b610f89565b34801561052f57600080fd5b50610362610fa7565b34801561054457600080fd5b506103626110df565b34801561055957600080fd5b506103626105683660046130f7565b611102565b34801561057957600080fd5b506103626105883660046130cb565b61111d565b34801561059957600080fd5b506104116101635481565b3480156105b057600080fd5b506104116105bf36600461309d565b61117d565b3480156105d057600080fd5b5061041161015f5481565b3480156105e757600080fd5b506103626105f6366004613220565b611210565b34801561060757600080fd5b5060fb5460ff166102d3565b34801561061f57600080fd5b5061032a61062e36600461309d565b61122f565b34801561063f57600080fd5b5061041161064e366004613292565b61128f565b34801561065f57600080fd5b50610362611315565b34801561067457600080fd5b506103626106833660046132af565b611335565b34801561069457600080fd5b506103626106a336600461309d565b61134e565b3480156106b457600080fd5b506102d36106c3366004613138565b611360565b3480156106d457600080fd5b506102fd61138c565b3480156106e957600080fd5b50610411600081565b3480156106fe57600080fd5b5061036261070d3660046132c8565b61139b565b34801561071e57600080fd5b5061036261072d3660046132fb565b6113a6565b34801561073e57600080fd5b5061036261074d3660046133c9565b611631565b34801561075e57600080fd5b5061041161076d366004613292565b61016d6020526000908152604090205481565b34801561078c57600080fd5b506102d361079b36600461309d565b61016e6020526000908152604090205460ff1681565b3480156107bd57600080fd5b506103626107cc366004613292565b611663565b3480156107dd57600080fd5b506102d3611879565b3480156107f257600080fd5b506102fd61080136600461309d565b6118a4565b34801561081257600080fd5b506102fd6118af565b34801561082757600080fd5b50610362610836366004613449565b61193e565b6103626108493660046134ad565b6119d5565b34801561085a57600080fd5b50610411600080516020613af383398151915281565b34801561087c57600080fd5b5061036261088b366004613138565b611c25565b34801561089c57600080fd5b50610411600080516020613ad383398151915281565b3480156108be57600080fd5b506102d36108cd3660046134f9565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b34801561090757600080fd5b50610411610916366004613292565b61016f6020526000908152604090205481565b34801561093557600080fd5b50610411611c4b565b34801561094a57600080fd5b506102d36109593660046130cb565b611c5f565b600061096982611cae565b92915050565b60606065805461097e90613527565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90613527565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c82611cd3565b506000908152606960205260409020546001600160a01b031690565b6000610a338261122f565b9050806001600160a01b0316836001600160a01b031603610aa55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610ac15750610ac181336108cd565b610b335760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610a9c565b610b3d8383611d32565b505050565b610b4c3382611da0565b610b685760405162461bcd60e51b8152600401610a9c9061355b565b610b3d838383611e1f565b610b7b611fc6565b61016854421015610bba5760405162461bcd60e51b81526020600482015260096024820152682737ba103132b3b4b760b91b6044820152606401610a9c565b33600090815261016f60205260409020546005610bd783836135bf565b1115610c1e5760405162461bcd60e51b81526020600482015260166024820152754164647265737320636c61696d206d6178203c3d203560501b6044820152606401610a9c565b6101635482610c2c60995490565b610c3691906135bf565b1115610c545760405162461bcd60e51b8152600401610a9c906135d7565b610c5e82826135bf565b33600081815261016f60205260409020919091556101615490610c81908461200e565b60005b83811015610cda5733600090815261017060205260408120600191610ca984866135bf565b81526020810191909152604001600020805460ff191691151591909117905580610cd281613603565b915050610c84565b5061016954610b3d90610cee90859061361c565b61205d565b600082815261012d6020526040902060010154610d0f81612130565b610b3d838361213a565b6000610d248361128f565b8210610d865760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a9c565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b6001600160a01b0381163314610e1f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a9c565b610e2982826121c1565b5050565b610e35611fc6565b600080516020613af3833981519152610e4d81612130565b838214610e925760405162461bcd60e51b81526020600482015260136024820152720d8cadccee8d040c8de40dcdee840dac2e8c6d606b1b6044820152606401610a9c565b6000610e9e6101615490565b905060005b85811015610f315760005b858583818110610ec057610ec061363b565b90506020020135811015610f1e57610efe888884818110610ee357610ee361363b565b9050602002016020810190610ef89190613292565b84612229565b82610f0881613603565b9350508080610f1690613603565b915050610eae565b5080610f2981613603565b915050610ea3565b50610f3d610161829055565b610163548110610f815760405162461bcd60e51b815260206004820152600f60248201526e6f766572206d617820737570706c7960881b6044820152606401610a9c565b505050505050565b61016a546000908210610f9f5750506101695490565b506000919050565b6000610fb281612130565b6101605415610fef5760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610a9c565b600161016055610ffd611c4b565b421161103e5760405162461bcd60e51b815260206004820152601060248201526f18599d195c881c1d589b1a58c8195b9960821b6044820152606401610a9c565b61016c546040516000916001600160a01b03169047908381818185875af1925050503d806000811461108c576040519150601f19603f3d011682016040523d82523d6000602084013e611091565b606091505b50509050806110d55760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a9c565b5050600061016055565b600080516020613ad38339815191526110f781612130565b6110ff612243565b50565b610b3d83838360405180602001604052806000815250611631565b611125611fc6565b600080516020613af383398151915261113d81612130565b610163548261114b60995490565b61115591906135bf565b11156111735760405162461bcd60e51b8152600401610a9c906135d7565b610b3d838361200e565b600061118860995490565b82106111eb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a9c565b609982815481106111fe576111fe61363b565b90600052602060002001549050919050565b600061121b81612130565b610162611229838583613697565b50505050565b6000818152606760205260408120546001600160a01b0316806109695760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a9c565b60006001600160a01b0382166112f95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a9c565b506001600160a01b031660009081526068602052604090205490565b600080516020613ad383398151915261132d81612130565b6110ff612295565b600061134081612130565b816101646112298282613784565b600061135981612130565b5061015f55565b600091825261012d602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606066805461097e90613527565b610e293383836122d2565b6113ae611879565b6113e45760405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b6044820152606401610a9c565b6000805b828110156116035760008484838181106114045761140461363b565b9050602002013590506114168161122f565b6001600160a01b0316336001600160a01b0316146114625760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610a9c565b600081815261016e602052604090205460ff16156114ad5760405162461bcd60e51b81526020600482015260086024820152671499599d5b99195960c21b6044820152606401610a9c565b61016a548110156114f35760405162461bcd60e51b815260206004820152601060248201526f139bdd08185b1b1bddc81c99599d5b9960821b6044820152606401610a9c565b3360009081526101706020908152604080832084845290915290205460ff166115505760405162461bcd60e51b815260206004820152600f60248201526e3737ba1034b734ba103437b63232b960891b6044820152606401610a9c565b600081815261016e60209081526040808320805460ff199081166001179091553380855261017084528285208686529093529220805490921690915561016b546115a491906001600160a01b031683610b42565b610169546115b290846135bf565b61016954604051908152909350819033907f73f04af9dcc582a923ec15d3eea990fe34adabfff2879e28d44572e01a54abb69060200160405180910390a350806115fb81613603565b9150506113e8565b50604051339082156108fc029083906000818181858888f19350505050158015611229573d6000803e3d6000fd5b61163b3383611da0565b6116575760405162461bcd60e51b8152600401610a9c9061355b565b611229848484846123a0565b600054610100900460ff16158080156116835750600054600160ff909116105b8061169d5750303b15801561169d575060005460ff166001145b6117005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a9c565b6000805460ff191660011790558015611723576000805461ff0019166101001790555b6117706040518060400160405280601081526020016f547769747465727363616e205061737360801b8152506040518060400160405280600381526020016205453560ec1b8152506123d3565b611778612404565b611780612404565b61178861242b565b611790612404565b612710610163556113886101645567011c37937e080000610166556363365bb06101675563633a5030610168556706f05b59d3b200006101695561196461016a5561016b8054336001600160a01b0319918216811790925561016c8054909116909117905561180060008361213a565b611818600080516020613ad38339815191528361213a565b611830600080516020613af38339815191528361213a565b8015610e29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6000426101646004015410801561189f57506101685461189c90620697806135bf565b42105b905090565b60606109698261245a565b61016280546118bd90613527565b80601f01602080910402602001604051908101604052809291908181526020018280546118e990613527565b80156119365780601f1061190b57610100808354040283529160200191611936565b820191906000526020600020905b81548152906001019060200180831161191957829003601f168201915b505050505081565b600080516020613af383398151915261195681612130565b610163546099546119689060016135bf565b11156119a45760405162461bcd60e51b815260206004820152600b60248201526a0e4cac2c6d0cac840dac2f60ab1b6044820152606401610a9c565b60006119b06101615490565b90506119c161016180546001019055565b6119cb8482612229565b6112298184612555565b6119dd611fc6565b61016754421015611a1c5760405162461bcd60e51b81526020600482015260096024820152682737ba103132b3b4b760b91b6044820152606401610a9c565b33600090815261016d60205260409020546002611a3985836135bf565b1115611a805760405162461bcd60e51b815260206004820152601660248201527520b2323932b9b99031b630b4b69036b0bc101e1e901960511b6044820152606401610a9c565b6101635484611a8e60995490565b611a9891906135bf565b1115611ab65760405162461bcd60e51b8152600401610a9c906135d7565b6101645461016554611ac99086906135bf565b1115611b105760405162461bcd60e51b8152602060048201526016602482015275726561636865642077686974656c6973742073697a6560501b6044820152606401610a9c565b836101646001016000828254611b2691906135bf565b90915550506040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611ba68484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505061015f5491508490506125e8565b611be35760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210283937b7b31760911b6044820152606401610a9c565b611bed85836135bf565b33600081815261016d6020526040902091909155611c0b908661200e565b61016654611c1e90610cee90879061361c565b5050505050565b600082815261012d6020526040902060010154611c4181612130565b610b3d83836121c1565b6101685460009061189f90620697806135bf565b61016a5460009082118015611c775750611c77611879565b8015611ca757506001600160a01b03831660009081526101706020908152604080832085845290915290205460ff165b9392505050565b60006001600160e01b03198216637965db0b60e01b14806109695750610969826125fe565b6000818152606760205260409020546001600160a01b03166110ff5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a9c565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d678261122f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611dac8361122f565b9050806001600160a01b0316846001600160a01b03161480611df357506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b80611e175750836001600160a01b0316611e0c84610a01565b6001600160a01b0316145b949350505050565b826001600160a01b0316611e328261122f565b6001600160a01b031614611e965760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a9c565b6001600160a01b038216611ef85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a9c565b611f03838383612623565b611f0e600082611d32565b6001600160a01b0383166000908152606860205260408120805460019290611f379084906137f5565b90915550506001600160a01b0382166000908152606860205260408120805460019290611f659084906135bf565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60fb5460ff161561200c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a9c565b565b600061201a6101615490565b905060005b82811015612051576120318483612229565b8161203b81613603565b925050808061204990613603565b91505061201f565b50610b3d610161829055565b610160541561209a5760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610a9c565b600161016055348111156120e95760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610a9c565b8034111561212757336108fc6120ff83346137f5565b6040518115909202916000818181858888f193505050501580156110d5573d6000803e3d6000fd5b50600061016055565b6110ff8133612636565b6121448282611360565b610e2957600082815261012d602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561217d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6121cb8282611360565b15610e2957600082815261012d602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610e2982826040518060200160405280600081525061269a565b61224b6126cd565b60fb805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61229d611fc6565b60fb805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122783390565b816001600160a01b0316836001600160a01b0316036123335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a9c565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6123ab848484611e1f565b6123b784848484612716565b6112295760405162461bcd60e51b8152600401610a9c9061380c565b600054610100900460ff166123fa5760405162461bcd60e51b8152600401610a9c9061385e565b610e298282612817565b600054610100900460ff1661200c5760405162461bcd60e51b8152600401610a9c9061385e565b600054610100900460ff166124525760405162461bcd60e51b8152600401610a9c9061385e565b61200c612857565b606061246582611cd3565b600082815260c960205260408120805461247e90613527565b80601f01602080910402602001604051908101604052809291908181526020018280546124aa90613527565b80156124f75780601f106124cc576101008083540402835291602001916124f7565b820191906000526020600020905b8154815290600101906020018083116124da57829003601f168201915b50505050509050600061250861288a565b9050805160000361251a575092915050565b81511561254c5780826040516020016125349291906138a9565b60405160208183030381529060405292505050919050565b611e178461289a565b6000828152606760205260409020546001600160a01b03166125d05760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610a9c565b600082815260c960205260409020610b3d82826138d8565b6000826125f58584612900565b14949350505050565b60006001600160e01b0319821663780e9d6360e01b148061096957506109698261294d565b61262b611fc6565b610b3d83838361299d565b6126408282611360565b610e2957612658816001600160a01b03166014612a55565b612663836020612a55565b604051602001612674929190613998565b60408051601f198184030181529082905262461bcd60e51b8252610a9c9160040161308a565b6126a48383612bf1565b6126b16000848484612716565b610b3d5760405162461bcd60e51b8152600401610a9c9061380c565b60fb5460ff1661200c5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a9c565b60006001600160a01b0384163b1561280c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061275a903390899088908890600401613a0d565b6020604051808303816000875af1925050508015612795575060408051601f3d908101601f1916820190925261279291810190613a4a565b60015b6127f2573d8080156127c3576040519150601f19603f3d011682016040523d82523d6000602084013e6127c8565b606091505b5080516000036127ea5760405162461bcd60e51b8152600401610a9c9061380c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e17565b506001949350505050565b600054610100900460ff1661283e5760405162461bcd60e51b8152600401610a9c9061385e565b606561284a83826138d8565b506066610b3d82826138d8565b600054610100900460ff1661287e5760405162461bcd60e51b8152600401610a9c9061385e565b60fb805460ff19169055565b6060610162805461097e90613527565b60606128a582611cd3565b60006128af61288a565b905060008151116128cf5760405180602001604052806000815250611ca7565b806128d984612d3f565b6040516020016128ea9291906138a9565b6040516020818303038152906040529392505050565b600081815b845181101561294557612931828683815181106129245761292461363b565b6020026020010151612e40565b91508061293d81613603565b915050612905565b509392505050565b60006001600160e01b031982166380ac58cd60e01b148061297e57506001600160e01b03198216635b5e139f60e01b145b8061096957506301ffc9a760e01b6001600160e01b0319831614610969565b6001600160a01b0383166129f8576129f381609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b612a1b565b816001600160a01b0316836001600160a01b031614612a1b57612a1b8382612e6f565b6001600160a01b038216612a3257610b3d81612f0c565b826001600160a01b0316826001600160a01b031614610b3d57610b3d8282612fbb565b60606000612a6483600261361c565b612a6f9060026135bf565b67ffffffffffffffff811115612a8757612a8761333d565b6040519080825280601f01601f191660200182016040528015612ab1576020820181803683370190505b509050600360fc1b81600081518110612acc57612acc61363b565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612afb57612afb61363b565b60200101906001600160f81b031916908160001a9053506000612b1f84600261361c565b612b2a9060016135bf565b90505b6001811115612ba2576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612b5e57612b5e61363b565b1a60f81b828281518110612b7457612b7461363b565b60200101906001600160f81b031916908160001a90535060049490941c93612b9b81613a67565b9050612b2d565b508315611ca75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a9c565b6001600160a01b038216612c475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a9c565b6000818152606760205260409020546001600160a01b031615612cac5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a9c565b612cb860008383612623565b6001600160a01b0382166000908152606860205260408120805460019290612ce19084906135bf565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081600003612d665750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612d905780612d7a81613603565b9150612d899050600a83613a94565b9150612d6a565b60008167ffffffffffffffff811115612dab57612dab61333d565b6040519080825280601f01601f191660200182016040528015612dd5576020820181803683370190505b5090505b8415611e1757612dea6001836137f5565b9150612df7600a86613aa8565b612e029060306135bf565b60f81b818381518110612e1757612e1761363b565b60200101906001600160f81b031916908160001a905350612e39600a86613a94565b9450612dd9565b6000818310612e5c576000828152602084905260409020611ca7565b6000838152602083905260409020611ca7565b60006001612e7c8461128f565b612e8691906137f5565b600083815260986020526040902054909150808214612ed9576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b609954600090612f1e906001906137f5565b6000838152609a602052604081205460998054939450909284908110612f4657612f4661363b565b906000526020600020015490508060998381548110612f6757612f6761363b565b6000918252602080832090910192909255828152609a90915260408082208490558582528120556099805480612f9f57612f9f613abc565b6001900381819060005260206000200160009055905550505050565b6000612fc68361128f565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b6001600160e01b0319811681146110ff57600080fd5b60006020828403121561302757600080fd5b8135611ca781612fff565b60005b8381101561304d578181015183820152602001613035565b838111156112295750506000910152565b60008151808452613076816020860160208601613032565b601f01601f19169290920160200192915050565b602081526000611ca7602083018461305e565b6000602082840312156130af57600080fd5b5035919050565b6001600160a01b03811681146110ff57600080fd5b600080604083850312156130de57600080fd5b82356130e9816130b6565b946020939093013593505050565b60008060006060848603121561310c57600080fd5b8335613117816130b6565b92506020840135613127816130b6565b929592945050506040919091013590565b6000806040838503121561314b57600080fd5b82359150602083013561315d816130b6565b809150509250929050565b60008083601f84011261317a57600080fd5b50813567ffffffffffffffff81111561319257600080fd5b6020830191508360208260051b85010111156131ad57600080fd5b9250929050565b600080600080604085870312156131ca57600080fd5b843567ffffffffffffffff808211156131e257600080fd5b6131ee88838901613168565b9096509450602087013591508082111561320757600080fd5b5061321487828801613168565b95989497509550505050565b6000806020838503121561323357600080fd5b823567ffffffffffffffff8082111561324b57600080fd5b818501915085601f83011261325f57600080fd5b81358181111561326e57600080fd5b86602082850101111561328057600080fd5b60209290920196919550909350505050565b6000602082840312156132a457600080fd5b8135611ca7816130b6565b600061012082840312156132c257600080fd5b50919050565b600080604083850312156132db57600080fd5b82356132e6816130b6565b91506020830135801515811461315d57600080fd5b6000806020838503121561330e57600080fd5b823567ffffffffffffffff81111561332557600080fd5b61333185828601613168565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561336e5761336e61333d565b604051601f8501601f19908116603f011681019082821181831017156133965761339661333d565b816040528093508581528686860111156133af57600080fd5b858560208301376000602087830101525050509392505050565b600080600080608085870312156133df57600080fd5b84356133ea816130b6565b935060208501356133fa816130b6565b925060408501359150606085013567ffffffffffffffff81111561341d57600080fd5b8501601f8101871361342e57600080fd5b61343d87823560208401613353565b91505092959194509250565b6000806040838503121561345c57600080fd5b8235613467816130b6565b9150602083013567ffffffffffffffff81111561348357600080fd5b8301601f8101851361349457600080fd5b6134a385823560208401613353565b9150509250929050565b6000806000604084860312156134c257600080fd5b83359250602084013567ffffffffffffffff8111156134e057600080fd5b6134ec86828701613168565b9497909650939450505050565b6000806040838503121561350c57600080fd5b8235613517816130b6565b9150602083013561315d816130b6565b600181811c9082168061353b57607f821691505b6020821081036132c257634e487b7160e01b600052602260045260246000fd5b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156135d2576135d26135a9565b500190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b600060018201613615576136156135a9565b5060010190565b6000816000190483118215151615613636576136366135a9565b500290565b634e487b7160e01b600052603260045260246000fd5b601f821115610b3d57600081815260208120601f850160051c810160208610156136785750805b601f850160051c820191505b81811015610f8157828155600101613684565b67ffffffffffffffff8311156136af576136af61333d565b6136c3836136bd8354613527565b83613651565b6000601f8411600181146136f757600085156136df5750838201355b600019600387901b1c1916600186901b178355611c1e565b600083815260209020601f19861690835b828110156137285786850135825560209485019460019092019101613708565b50868210156137455760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008135610969816130b6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813581556020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c082013560068201556137dc6137d360e08401613757565b60078301613764565b610e296137ec6101008401613757565b60088301613764565b600082821015613807576138076135a9565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600083516138bb818460208801613032565b8351908301906138cf818360208801613032565b01949350505050565b815167ffffffffffffffff8111156138f2576138f261333d565b613906816139008454613527565b84613651565b602080601f83116001811461393b57600084156139235750858301515b600019600386901b1c1916600185901b178555610f81565b600085815260208120601f198616915b8281101561396a5788860151825594840194600190910190840161394b565b50858210156139885787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516139d0816017850160208801613032565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613a01816028840160208801613032565b01602801949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a409083018461305e565b9695505050505050565b600060208284031215613a5c57600080fd5b8151611ca781612fff565b600081613a7657613a766135a9565b506000190190565b634e487b7160e01b600052601260045260246000fd5b600082613aa357613aa3613a7e565b500490565b600082613ab757613ab7613a7e565b500690565b634e487b7160e01b600052603160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220f3ef5a4fd68f83817f81048ec89793c1bf47f7596bcb6faab7ce86d3a73e423a64736f6c634300080f0033
Deployed Bytecode
0x6080604052600436106102ae5760003560e01c806370a0823111610175578063c4d66de8116100dc578063d539139311610095578063e985e9c51161006f578063e985e9c5146108b2578063eb5be779146108fb578063faf762bd14610929578063fc3b941f1461093e57600080fd5b8063d53913931461084e578063d547741f14610870578063e63ab1e91461089057600080fd5b8063c4d66de8146107b1578063c4ea0845146107d1578063c87b56dd146107e6578063cfc86f7b14610806578063d204c45e1461081b578063d2cab0561461083b57600080fd5b8063a217fddf1161012e578063a217fddf146106dd578063a22cb465146106f2578063aa613df514610712578063b88d4fde14610732578063c1ae256d14610752578063c23fcdef1461078057600080fd5b806370a08231146106335780638456cb59146106535780638ab5a402146106685780638ac1e1611461068857806391d14854146106a857806395d89b41146106c857600080fd5b80633a2f18031161021957806345c0f533116101d257806345c0f5331461058d5780634f6ccce7146105a457806354c06aee146105c457806355f804b3146105db5780635c975abb146105fb5780636352211e1461061357600080fd5b80633a2f1803146104e35780633a4a2a01146105035780633ccfd60b146105235780633f4ba83a1461053857806342842e0e1461054d57806343508b051461056d57600080fd5b806323b872dd1161026b57806323b872dd1461041f578063248a9ca31461043f5780632db11544146104705780632f2ff15d146104835780632f745c59146104a357806336568abe146104c357600080fd5b806301ffc9a7146102b357806306fdde03146102e8578063081812fc1461030a578063095ea7b314610342578063177927291461036457806318160ddd14610400575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004613015565b61095e565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd61096f565b6040516102df919061308a565b34801561031657600080fd5b5061032a61032536600461309d565b610a01565b6040516001600160a01b0390911681526020016102df565b34801561034e57600080fd5b5061036261035d3660046130cb565b610a28565b005b34801561037057600080fd5b5061016454610165546101665461016754610168546101695461016a5461016b5461016c546103b098979695949392916001600160a01b03908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c08401526001600160a01b0390811660e084015216610100820152610120016102df565b34801561040c57600080fd5b506099545b6040519081526020016102df565b34801561042b57600080fd5b5061036261043a3660046130f7565b610b42565b34801561044b57600080fd5b5061041161045a36600461309d565b600090815261012d602052604090206001015490565b61036261047e36600461309d565b610b73565b34801561048f57600080fd5b5061036261049e366004613138565b610cf3565b3480156104af57600080fd5b506104116104be3660046130cb565b610d19565b3480156104cf57600080fd5b506103626104de366004613138565b610daf565b3480156104ef57600080fd5b506103626104fe3660046131b4565b610e2d565b34801561050f57600080fd5b5061041161051e36600461309d565b610f89565b34801561052f57600080fd5b50610362610fa7565b34801561054457600080fd5b506103626110df565b34801561055957600080fd5b506103626105683660046130f7565b611102565b34801561057957600080fd5b506103626105883660046130cb565b61111d565b34801561059957600080fd5b506104116101635481565b3480156105b057600080fd5b506104116105bf36600461309d565b61117d565b3480156105d057600080fd5b5061041161015f5481565b3480156105e757600080fd5b506103626105f6366004613220565b611210565b34801561060757600080fd5b5060fb5460ff166102d3565b34801561061f57600080fd5b5061032a61062e36600461309d565b61122f565b34801561063f57600080fd5b5061041161064e366004613292565b61128f565b34801561065f57600080fd5b50610362611315565b34801561067457600080fd5b506103626106833660046132af565b611335565b34801561069457600080fd5b506103626106a336600461309d565b61134e565b3480156106b457600080fd5b506102d36106c3366004613138565b611360565b3480156106d457600080fd5b506102fd61138c565b3480156106e957600080fd5b50610411600081565b3480156106fe57600080fd5b5061036261070d3660046132c8565b61139b565b34801561071e57600080fd5b5061036261072d3660046132fb565b6113a6565b34801561073e57600080fd5b5061036261074d3660046133c9565b611631565b34801561075e57600080fd5b5061041161076d366004613292565b61016d6020526000908152604090205481565b34801561078c57600080fd5b506102d361079b36600461309d565b61016e6020526000908152604090205460ff1681565b3480156107bd57600080fd5b506103626107cc366004613292565b611663565b3480156107dd57600080fd5b506102d3611879565b3480156107f257600080fd5b506102fd61080136600461309d565b6118a4565b34801561081257600080fd5b506102fd6118af565b34801561082757600080fd5b50610362610836366004613449565b61193e565b6103626108493660046134ad565b6119d5565b34801561085a57600080fd5b50610411600080516020613af383398151915281565b34801561087c57600080fd5b5061036261088b366004613138565b611c25565b34801561089c57600080fd5b50610411600080516020613ad383398151915281565b3480156108be57600080fd5b506102d36108cd3660046134f9565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b34801561090757600080fd5b50610411610916366004613292565b61016f6020526000908152604090205481565b34801561093557600080fd5b50610411611c4b565b34801561094a57600080fd5b506102d36109593660046130cb565b611c5f565b600061096982611cae565b92915050565b60606065805461097e90613527565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90613527565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c82611cd3565b506000908152606960205260409020546001600160a01b031690565b6000610a338261122f565b9050806001600160a01b0316836001600160a01b031603610aa55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610ac15750610ac181336108cd565b610b335760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610a9c565b610b3d8383611d32565b505050565b610b4c3382611da0565b610b685760405162461bcd60e51b8152600401610a9c9061355b565b610b3d838383611e1f565b610b7b611fc6565b61016854421015610bba5760405162461bcd60e51b81526020600482015260096024820152682737ba103132b3b4b760b91b6044820152606401610a9c565b33600090815261016f60205260409020546005610bd783836135bf565b1115610c1e5760405162461bcd60e51b81526020600482015260166024820152754164647265737320636c61696d206d6178203c3d203560501b6044820152606401610a9c565b6101635482610c2c60995490565b610c3691906135bf565b1115610c545760405162461bcd60e51b8152600401610a9c906135d7565b610c5e82826135bf565b33600081815261016f60205260409020919091556101615490610c81908461200e565b60005b83811015610cda5733600090815261017060205260408120600191610ca984866135bf565b81526020810191909152604001600020805460ff191691151591909117905580610cd281613603565b915050610c84565b5061016954610b3d90610cee90859061361c565b61205d565b600082815261012d6020526040902060010154610d0f81612130565b610b3d838361213a565b6000610d248361128f565b8210610d865760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a9c565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b6001600160a01b0381163314610e1f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a9c565b610e2982826121c1565b5050565b610e35611fc6565b600080516020613af3833981519152610e4d81612130565b838214610e925760405162461bcd60e51b81526020600482015260136024820152720d8cadccee8d040c8de40dcdee840dac2e8c6d606b1b6044820152606401610a9c565b6000610e9e6101615490565b905060005b85811015610f315760005b858583818110610ec057610ec061363b565b90506020020135811015610f1e57610efe888884818110610ee357610ee361363b565b9050602002016020810190610ef89190613292565b84612229565b82610f0881613603565b9350508080610f1690613603565b915050610eae565b5080610f2981613603565b915050610ea3565b50610f3d610161829055565b610163548110610f815760405162461bcd60e51b815260206004820152600f60248201526e6f766572206d617820737570706c7960881b6044820152606401610a9c565b505050505050565b61016a546000908210610f9f5750506101695490565b506000919050565b6000610fb281612130565b6101605415610fef5760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610a9c565b600161016055610ffd611c4b565b421161103e5760405162461bcd60e51b815260206004820152601060248201526f18599d195c881c1d589b1a58c8195b9960821b6044820152606401610a9c565b61016c546040516000916001600160a01b03169047908381818185875af1925050503d806000811461108c576040519150601f19603f3d011682016040523d82523d6000602084013e611091565b606091505b50509050806110d55760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a9c565b5050600061016055565b600080516020613ad38339815191526110f781612130565b6110ff612243565b50565b610b3d83838360405180602001604052806000815250611631565b611125611fc6565b600080516020613af383398151915261113d81612130565b610163548261114b60995490565b61115591906135bf565b11156111735760405162461bcd60e51b8152600401610a9c906135d7565b610b3d838361200e565b600061118860995490565b82106111eb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a9c565b609982815481106111fe576111fe61363b565b90600052602060002001549050919050565b600061121b81612130565b610162611229838583613697565b50505050565b6000818152606760205260408120546001600160a01b0316806109695760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a9c565b60006001600160a01b0382166112f95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a9c565b506001600160a01b031660009081526068602052604090205490565b600080516020613ad383398151915261132d81612130565b6110ff612295565b600061134081612130565b816101646112298282613784565b600061135981612130565b5061015f55565b600091825261012d602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606066805461097e90613527565b610e293383836122d2565b6113ae611879565b6113e45760405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b6044820152606401610a9c565b6000805b828110156116035760008484838181106114045761140461363b565b9050602002013590506114168161122f565b6001600160a01b0316336001600160a01b0316146114625760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610a9c565b600081815261016e602052604090205460ff16156114ad5760405162461bcd60e51b81526020600482015260086024820152671499599d5b99195960c21b6044820152606401610a9c565b61016a548110156114f35760405162461bcd60e51b815260206004820152601060248201526f139bdd08185b1b1bddc81c99599d5b9960821b6044820152606401610a9c565b3360009081526101706020908152604080832084845290915290205460ff166115505760405162461bcd60e51b815260206004820152600f60248201526e3737ba1034b734ba103437b63232b960891b6044820152606401610a9c565b600081815261016e60209081526040808320805460ff199081166001179091553380855261017084528285208686529093529220805490921690915561016b546115a491906001600160a01b031683610b42565b610169546115b290846135bf565b61016954604051908152909350819033907f73f04af9dcc582a923ec15d3eea990fe34adabfff2879e28d44572e01a54abb69060200160405180910390a350806115fb81613603565b9150506113e8565b50604051339082156108fc029083906000818181858888f19350505050158015611229573d6000803e3d6000fd5b61163b3383611da0565b6116575760405162461bcd60e51b8152600401610a9c9061355b565b611229848484846123a0565b600054610100900460ff16158080156116835750600054600160ff909116105b8061169d5750303b15801561169d575060005460ff166001145b6117005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a9c565b6000805460ff191660011790558015611723576000805461ff0019166101001790555b6117706040518060400160405280601081526020016f547769747465727363616e205061737360801b8152506040518060400160405280600381526020016205453560ec1b8152506123d3565b611778612404565b611780612404565b61178861242b565b611790612404565b612710610163556113886101645567011c37937e080000610166556363365bb06101675563633a5030610168556706f05b59d3b200006101695561196461016a5561016b8054336001600160a01b0319918216811790925561016c8054909116909117905561180060008361213a565b611818600080516020613ad38339815191528361213a565b611830600080516020613af38339815191528361213a565b8015610e29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6000426101646004015410801561189f57506101685461189c90620697806135bf565b42105b905090565b60606109698261245a565b61016280546118bd90613527565b80601f01602080910402602001604051908101604052809291908181526020018280546118e990613527565b80156119365780601f1061190b57610100808354040283529160200191611936565b820191906000526020600020905b81548152906001019060200180831161191957829003601f168201915b505050505081565b600080516020613af383398151915261195681612130565b610163546099546119689060016135bf565b11156119a45760405162461bcd60e51b815260206004820152600b60248201526a0e4cac2c6d0cac840dac2f60ab1b6044820152606401610a9c565b60006119b06101615490565b90506119c161016180546001019055565b6119cb8482612229565b6112298184612555565b6119dd611fc6565b61016754421015611a1c5760405162461bcd60e51b81526020600482015260096024820152682737ba103132b3b4b760b91b6044820152606401610a9c565b33600090815261016d60205260409020546002611a3985836135bf565b1115611a805760405162461bcd60e51b815260206004820152601660248201527520b2323932b9b99031b630b4b69036b0bc101e1e901960511b6044820152606401610a9c565b6101635484611a8e60995490565b611a9891906135bf565b1115611ab65760405162461bcd60e51b8152600401610a9c906135d7565b6101645461016554611ac99086906135bf565b1115611b105760405162461bcd60e51b8152602060048201526016602482015275726561636865642077686974656c6973742073697a6560501b6044820152606401610a9c565b836101646001016000828254611b2691906135bf565b90915550506040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611ba68484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505061015f5491508490506125e8565b611be35760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210283937b7b31760911b6044820152606401610a9c565b611bed85836135bf565b33600081815261016d6020526040902091909155611c0b908661200e565b61016654611c1e90610cee90879061361c565b5050505050565b600082815261012d6020526040902060010154611c4181612130565b610b3d83836121c1565b6101685460009061189f90620697806135bf565b61016a5460009082118015611c775750611c77611879565b8015611ca757506001600160a01b03831660009081526101706020908152604080832085845290915290205460ff165b9392505050565b60006001600160e01b03198216637965db0b60e01b14806109695750610969826125fe565b6000818152606760205260409020546001600160a01b03166110ff5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a9c565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d678261122f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611dac8361122f565b9050806001600160a01b0316846001600160a01b03161480611df357506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b80611e175750836001600160a01b0316611e0c84610a01565b6001600160a01b0316145b949350505050565b826001600160a01b0316611e328261122f565b6001600160a01b031614611e965760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a9c565b6001600160a01b038216611ef85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a9c565b611f03838383612623565b611f0e600082611d32565b6001600160a01b0383166000908152606860205260408120805460019290611f379084906137f5565b90915550506001600160a01b0382166000908152606860205260408120805460019290611f659084906135bf565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60fb5460ff161561200c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a9c565b565b600061201a6101615490565b905060005b82811015612051576120318483612229565b8161203b81613603565b925050808061204990613603565b91505061201f565b50610b3d610161829055565b610160541561209a5760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610a9c565b600161016055348111156120e95760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610a9c565b8034111561212757336108fc6120ff83346137f5565b6040518115909202916000818181858888f193505050501580156110d5573d6000803e3d6000fd5b50600061016055565b6110ff8133612636565b6121448282611360565b610e2957600082815261012d602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561217d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6121cb8282611360565b15610e2957600082815261012d602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610e2982826040518060200160405280600081525061269a565b61224b6126cd565b60fb805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61229d611fc6565b60fb805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122783390565b816001600160a01b0316836001600160a01b0316036123335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a9c565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6123ab848484611e1f565b6123b784848484612716565b6112295760405162461bcd60e51b8152600401610a9c9061380c565b600054610100900460ff166123fa5760405162461bcd60e51b8152600401610a9c9061385e565b610e298282612817565b600054610100900460ff1661200c5760405162461bcd60e51b8152600401610a9c9061385e565b600054610100900460ff166124525760405162461bcd60e51b8152600401610a9c9061385e565b61200c612857565b606061246582611cd3565b600082815260c960205260408120805461247e90613527565b80601f01602080910402602001604051908101604052809291908181526020018280546124aa90613527565b80156124f75780601f106124cc576101008083540402835291602001916124f7565b820191906000526020600020905b8154815290600101906020018083116124da57829003601f168201915b50505050509050600061250861288a565b9050805160000361251a575092915050565b81511561254c5780826040516020016125349291906138a9565b60405160208183030381529060405292505050919050565b611e178461289a565b6000828152606760205260409020546001600160a01b03166125d05760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610a9c565b600082815260c960205260409020610b3d82826138d8565b6000826125f58584612900565b14949350505050565b60006001600160e01b0319821663780e9d6360e01b148061096957506109698261294d565b61262b611fc6565b610b3d83838361299d565b6126408282611360565b610e2957612658816001600160a01b03166014612a55565b612663836020612a55565b604051602001612674929190613998565b60408051601f198184030181529082905262461bcd60e51b8252610a9c9160040161308a565b6126a48383612bf1565b6126b16000848484612716565b610b3d5760405162461bcd60e51b8152600401610a9c9061380c565b60fb5460ff1661200c5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a9c565b60006001600160a01b0384163b1561280c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061275a903390899088908890600401613a0d565b6020604051808303816000875af1925050508015612795575060408051601f3d908101601f1916820190925261279291810190613a4a565b60015b6127f2573d8080156127c3576040519150601f19603f3d011682016040523d82523d6000602084013e6127c8565b606091505b5080516000036127ea5760405162461bcd60e51b8152600401610a9c9061380c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e17565b506001949350505050565b600054610100900460ff1661283e5760405162461bcd60e51b8152600401610a9c9061385e565b606561284a83826138d8565b506066610b3d82826138d8565b600054610100900460ff1661287e5760405162461bcd60e51b8152600401610a9c9061385e565b60fb805460ff19169055565b6060610162805461097e90613527565b60606128a582611cd3565b60006128af61288a565b905060008151116128cf5760405180602001604052806000815250611ca7565b806128d984612d3f565b6040516020016128ea9291906138a9565b6040516020818303038152906040529392505050565b600081815b845181101561294557612931828683815181106129245761292461363b565b6020026020010151612e40565b91508061293d81613603565b915050612905565b509392505050565b60006001600160e01b031982166380ac58cd60e01b148061297e57506001600160e01b03198216635b5e139f60e01b145b8061096957506301ffc9a760e01b6001600160e01b0319831614610969565b6001600160a01b0383166129f8576129f381609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b612a1b565b816001600160a01b0316836001600160a01b031614612a1b57612a1b8382612e6f565b6001600160a01b038216612a3257610b3d81612f0c565b826001600160a01b0316826001600160a01b031614610b3d57610b3d8282612fbb565b60606000612a6483600261361c565b612a6f9060026135bf565b67ffffffffffffffff811115612a8757612a8761333d565b6040519080825280601f01601f191660200182016040528015612ab1576020820181803683370190505b509050600360fc1b81600081518110612acc57612acc61363b565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612afb57612afb61363b565b60200101906001600160f81b031916908160001a9053506000612b1f84600261361c565b612b2a9060016135bf565b90505b6001811115612ba2576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612b5e57612b5e61363b565b1a60f81b828281518110612b7457612b7461363b565b60200101906001600160f81b031916908160001a90535060049490941c93612b9b81613a67565b9050612b2d565b508315611ca75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a9c565b6001600160a01b038216612c475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a9c565b6000818152606760205260409020546001600160a01b031615612cac5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a9c565b612cb860008383612623565b6001600160a01b0382166000908152606860205260408120805460019290612ce19084906135bf565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081600003612d665750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612d905780612d7a81613603565b9150612d899050600a83613a94565b9150612d6a565b60008167ffffffffffffffff811115612dab57612dab61333d565b6040519080825280601f01601f191660200182016040528015612dd5576020820181803683370190505b5090505b8415611e1757612dea6001836137f5565b9150612df7600a86613aa8565b612e029060306135bf565b60f81b818381518110612e1757612e1761363b565b60200101906001600160f81b031916908160001a905350612e39600a86613a94565b9450612dd9565b6000818310612e5c576000828152602084905260409020611ca7565b6000838152602083905260409020611ca7565b60006001612e7c8461128f565b612e8691906137f5565b600083815260986020526040902054909150808214612ed9576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b609954600090612f1e906001906137f5565b6000838152609a602052604081205460998054939450909284908110612f4657612f4661363b565b906000526020600020015490508060998381548110612f6757612f6761363b565b6000918252602080832090910192909255828152609a90915260408082208490558582528120556099805480612f9f57612f9f613abc565b6001900381819060005260206000200160009055905550505050565b6000612fc68361128f565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b6001600160e01b0319811681146110ff57600080fd5b60006020828403121561302757600080fd5b8135611ca781612fff565b60005b8381101561304d578181015183820152602001613035565b838111156112295750506000910152565b60008151808452613076816020860160208601613032565b601f01601f19169290920160200192915050565b602081526000611ca7602083018461305e565b6000602082840312156130af57600080fd5b5035919050565b6001600160a01b03811681146110ff57600080fd5b600080604083850312156130de57600080fd5b82356130e9816130b6565b946020939093013593505050565b60008060006060848603121561310c57600080fd5b8335613117816130b6565b92506020840135613127816130b6565b929592945050506040919091013590565b6000806040838503121561314b57600080fd5b82359150602083013561315d816130b6565b809150509250929050565b60008083601f84011261317a57600080fd5b50813567ffffffffffffffff81111561319257600080fd5b6020830191508360208260051b85010111156131ad57600080fd5b9250929050565b600080600080604085870312156131ca57600080fd5b843567ffffffffffffffff808211156131e257600080fd5b6131ee88838901613168565b9096509450602087013591508082111561320757600080fd5b5061321487828801613168565b95989497509550505050565b6000806020838503121561323357600080fd5b823567ffffffffffffffff8082111561324b57600080fd5b818501915085601f83011261325f57600080fd5b81358181111561326e57600080fd5b86602082850101111561328057600080fd5b60209290920196919550909350505050565b6000602082840312156132a457600080fd5b8135611ca7816130b6565b600061012082840312156132c257600080fd5b50919050565b600080604083850312156132db57600080fd5b82356132e6816130b6565b91506020830135801515811461315d57600080fd5b6000806020838503121561330e57600080fd5b823567ffffffffffffffff81111561332557600080fd5b61333185828601613168565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561336e5761336e61333d565b604051601f8501601f19908116603f011681019082821181831017156133965761339661333d565b816040528093508581528686860111156133af57600080fd5b858560208301376000602087830101525050509392505050565b600080600080608085870312156133df57600080fd5b84356133ea816130b6565b935060208501356133fa816130b6565b925060408501359150606085013567ffffffffffffffff81111561341d57600080fd5b8501601f8101871361342e57600080fd5b61343d87823560208401613353565b91505092959194509250565b6000806040838503121561345c57600080fd5b8235613467816130b6565b9150602083013567ffffffffffffffff81111561348357600080fd5b8301601f8101851361349457600080fd5b6134a385823560208401613353565b9150509250929050565b6000806000604084860312156134c257600080fd5b83359250602084013567ffffffffffffffff8111156134e057600080fd5b6134ec86828701613168565b9497909650939450505050565b6000806040838503121561350c57600080fd5b8235613517816130b6565b9150602083013561315d816130b6565b600181811c9082168061353b57607f821691505b6020821081036132c257634e487b7160e01b600052602260045260246000fd5b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156135d2576135d26135a9565b500190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b600060018201613615576136156135a9565b5060010190565b6000816000190483118215151615613636576136366135a9565b500290565b634e487b7160e01b600052603260045260246000fd5b601f821115610b3d57600081815260208120601f850160051c810160208610156136785750805b601f850160051c820191505b81811015610f8157828155600101613684565b67ffffffffffffffff8311156136af576136af61333d565b6136c3836136bd8354613527565b83613651565b6000601f8411600181146136f757600085156136df5750838201355b600019600387901b1c1916600186901b178355611c1e565b600083815260209020601f19861690835b828110156137285786850135825560209485019460019092019101613708565b50868210156137455760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008135610969816130b6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813581556020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c082013560068201556137dc6137d360e08401613757565b60078301613764565b610e296137ec6101008401613757565b60088301613764565b600082821015613807576138076135a9565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600083516138bb818460208801613032565b8351908301906138cf818360208801613032565b01949350505050565b815167ffffffffffffffff8111156138f2576138f261333d565b613906816139008454613527565b84613651565b602080601f83116001811461393b57600084156139235750858301515b600019600386901b1c1916600185901b178555610f81565b600085815260208120601f198616915b8281101561396a5788860151825594840194600190910190840161394b565b50858210156139885787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516139d0816017850160208801613032565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613a01816028840160208801613032565b01602801949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a409083018461305e565b9695505050505050565b600060208284031215613a5c57600080fd5b8151611ca781612fff565b600081613a7657613a766135a9565b506000190190565b634e487b7160e01b600052601260045260246000fd5b600082613aa357613aa3613a7e565b500490565b600082613ab757613ab7613a7e565b500690565b634e487b7160e01b600052603160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220f3ef5a4fd68f83817f81048ec89793c1bf47f7596bcb6faab7ce86d3a73e423a64736f6c634300080f0033
Deployed Bytecode Sourcemap
1560:8821:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8168:253;;;;;;;;;;-1:-1:-1;8168:253:18;;;;;:::i;:::-;;:::i;:::-;;;565:14:19;;558:22;540:41;;528:2;513:18;8168:253:18;;;;;;;;2931:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4407:167::-;;;;;;;;;;-1:-1:-1;4407:167:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:19;;;1674:51;;1662:2;1647:18;4407:167:4;1528:203:19;3928:418:4;;;;;;;;;;-1:-1:-1;3928:418:4;;;;;:::i;:::-;;:::i;:::-;;2336:16:18;;;;;;;;;;-1:-1:-1;2336:16:18;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2336:16:18;;;;;;;;;;;2563:25:19;;;2619:2;2604:18;;2597:34;;;;2647:18;;;2640:34;;;;2705:2;2690:18;;2683:34;;;;2748:3;2733:19;;2726:35;;;;2792:3;2777:19;;2770:35;2836:3;2821:19;;2814:35;-1:-1:-1;;;;;2924:15:19;;;2918:3;2903:19;;2896:44;2977:15;2971:3;2956:19;;2949:44;2550:3;2535:19;2336:16:18;2192:807:19;1935:111:7;;;;;;;;;;-1:-1:-1;2022:10:7;:17;1935:111;;;3150:25:19;;;3138:2;3123:18;1935:111:7;3004:177:19;5084:327:4;;;;;;;;;;-1:-1:-1;5084:327:4;;;;;:::i;:::-;;:::i;4721:129:0:-;;;;;;;;;;-1:-1:-1;4721:129:0;;;;;:::i;:::-;4795:7;4821:12;;;:6;:12;;;;;:22;;;;4721:129;5317:619:18;;;;;;:::i;:::-;;:::i;5146:145:0:-;;;;;;;;;;-1:-1:-1;5146:145:0;;;;;:::i;:::-;;:::i;1600:264:7:-;;;;;;;;;;-1:-1:-1;1600:264:7;;;;;:::i;:::-;;:::i;6255:214:0:-;;;;;;;;;;-1:-1:-1;6255:214:0;;;;;:::i;:::-;;:::i;6210:515:18:-;;;;;;;;;;-1:-1:-1;6210:515:18;;;;;:::i;:::-;;:::i;9611:224::-;;;;;;;;;;-1:-1:-1;9611:224:18;;;;;:::i;:::-;;:::i;7178:288::-;;;;;;;;;;;;;:::i;4157:75::-;;;;;;;;;;;;;:::i;5477:179:4:-;;;;;;;;;;-1:-1:-1;5477:179:4;;;;;:::i;:::-;;:::i;6732:196:18:-;;;;;;;;;;-1:-1:-1;6732:196:18;;;;;:::i;:::-;;:::i;2304:26::-;;;;;;;;;;;;;;;;2118:241:7;;;;;;;;;;-1:-1:-1;2118:241:7;;;;;:::i;:::-;;:::i;1804:27:18:-;;;;;;;;;;;;;;;;3694:123;;;;;;;;;;-1:-1:-1;3694:123:18;;;;;:::i;:::-;;:::i;1858:84:3:-;;;;;;;;;;-1:-1:-1;1928:7:3;;;;1858:84;;2651:218:4;;;;;;;;;;-1:-1:-1;2651:218:4;;;;;:::i;:::-;;:::i;2390:204::-;;;;;;;;;;-1:-1:-1;2390:204:4;;;;;:::i;:::-;;:::i;4080:71:18:-;;;;;;;;;;;;;:::i;3824:130::-;;;;;;;;;;-1:-1:-1;3824:130:18;;;;;:::i;:::-;;:::i;3960:113::-;;;;;;;;;;-1:-1:-1;3960:113:18;;;;;:::i;:::-;;:::i;3203:145:0:-;;;;;;;;;;-1:-1:-1;3203:145:0;;;;;:::i;:::-;;:::i;3093:102:4:-;;;;;;;;;;;;;:::i;2324:49:0:-;;;;;;;;;;-1:-1:-1;2324:49:0;2369:4;2324:49;;4641:153:4;;;;;;;;;;-1:-1:-1;4641:153:4;;;;;:::i;:::-;;:::i;8683:920:18:-;;;;;;;;;;-1:-1:-1;8683:920:18;;;;;:::i;:::-;;:::i;5722:315:4:-;;;;;;;;;;-1:-1:-1;5722:315:4;;;;;:::i;:::-;;:::i;2358:51:18:-;;;;;;;;;;-1:-1:-1;2358:51:18;;;;;:::i;:::-;;;;;;;;;;;;;;2439:43;;;;;;;;;;-1:-1:-1;2439:43:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;2849:702;;;;;;;;;;-1:-1:-1;2849:702:18;;;;;:::i;:::-;;:::i;10201:177::-;;;;;;;;;;;;;:::i;7951:211::-;;;;;;;;;;-1:-1:-1;7951:211:18;;;;;:::i;:::-;;:::i;2271:27::-;;;;;;;;;;;;;:::i;4238:309::-;;;;;;;;;;-1:-1:-1;4238:309:18;;;;;:::i;:::-;;:::i;4554:758::-;;;;;;:::i;:::-;;:::i;1905:62::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1905:62:18;;5571:147:0;;;;;;;;;;-1:-1:-1;5571:147:0;;;;;:::i;:::-;;:::i;1837:62:18:-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1837:62:18;;4860:162:4;;;;;;;;;;-1:-1:-1;4860:162:4;;;;;:::i;:::-;-1:-1:-1;;;;;4980:25:4;;;4957:4;4980:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4860:162;2657:48:18;;;;;;;;;;-1:-1:-1;2657:48:18;;;;;:::i;:::-;;;;;;;;;;;;;;10070:125;;;;;;;;;;;;;:::i;9841:222::-;;;;;;;;;;-1:-1:-1;9841:222:18;;;;;:::i;:::-;;:::i;8168:253::-;8351:4;8378:36;8402:11;8378:23;:36::i;:::-;8371:43;8168:253;-1:-1:-1;;8168:253:18:o;2931:98:4:-;2985:13;3017:5;3010:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2931:98;:::o;4407:167::-;4483:7;4502:23;4517:7;4502:14;:23::i;:::-;-1:-1:-1;4543:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4543:24:4;;4407:167::o;3928:418::-;4008:13;4024:34;4050:7;4024:25;:34::i;:::-;4008:50;;4082:5;-1:-1:-1;;;;;4076:11:4;:2;-1:-1:-1;;;;;4076:11:4;;4068:57;;;;-1:-1:-1;;;4068:57:4;;11039:2:19;4068:57:4;;;11021:21:19;11078:2;11058:18;;;11051:30;11117:34;11097:18;;;11090:62;-1:-1:-1;;;11168:18:19;;;11161:31;11209:19;;4068:57:4;;;;;;;;;929:10:12;-1:-1:-1;;;;;4157:21:4;;;;:62;;-1:-1:-1;4182:37:4;4199:5;929:10:12;4860:162:4;:::i;4182:37::-;4136:171;;;;-1:-1:-1;;;4136:171:4;;11441:2:19;4136:171:4;;;11423:21:19;11480:2;11460:18;;;11453:30;11519:34;11499:18;;;11492:62;11590:32;11570:18;;;11563:60;11640:19;;4136:171:4;11239:426:19;4136:171:4;4318:21;4327:2;4331:7;4318:8;:21::i;:::-;3998:348;3928:418;;:::o;5084:327::-;5273:41;929:10:12;5306:7:4;5273:18;:41::i;:::-;5265:100;;;;-1:-1:-1;;;5265:100:4;;;;;;;:::i;:::-;5376:28;5386:4;5392:2;5396:7;5376:9;:28::i;5317:619:18:-;1482:19:3;:17;:19::i;:::-;5394:16:18;;5412:15:::1;-1:-1:-1::0;5394:33:18::1;5386:54;;;::::0;-1:-1:-1;;;5386:54:18;;12287:2:19;5386:54:18::1;::::0;::::1;12269:21:19::0;12326:1;12306:18;;;12299:29;-1:-1:-1;;;12344:18:19;;;12337:39;12393:18;;5386:54:18::1;12085:332:19::0;5386:54:18::1;5480:10;5450:12;5465:26:::0;;;:14:::1;:26;::::0;;;;;5526:1:::1;5510:11;5518:3:::0;5465:26;5510:11:::1;:::i;:::-;5509:18;;5501:53;;;::::0;-1:-1:-1;;;5501:53:18;;12889:2:19;5501:53:18::1;::::0;::::1;12871:21:19::0;12928:2;12908:18;;;12901:30;-1:-1:-1;;;12947:18:19;;;12940:52;13009:18;;5501:53:18::1;12687:346:19::0;5501:53:18::1;5595:14;;5588:3;5572:13;2022:10:7::0;:17;;1935:111;5572:13:18::1;:19;;;;:::i;:::-;:37;;5564:68;;;;-1:-1:-1::0;;;5564:68:18::1;;;;;;;:::i;:::-;5671:13;5681:3:::0;5671:7;:13:::1;:::i;:::-;5657:10;5642:26;::::0;;;:14:::1;:26;::::0;;;;:42;;;;5717:15:::1;951:14:13::0;;5752:27:18::1;::::0;5775:3;5752:11:::1;:27::i;:::-;5794:6;5789:97;5806:3;5804:1;:5;5789:97;;;5841:10;5828:24;::::0;;;:12:::1;:24;::::0;;;;5871:4:::1;::::0;5853:14:::1;5866:1:::0;5853:12;:14:::1;:::i;:::-;5828:40:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;5828:40:18;:47;;-1:-1:-1;;5828:47:18::1;::::0;::::1;;::::0;;;::::1;::::0;;5810:3;::::1;::::0;::::1;:::i;:::-;;;;5789:97;;;-1:-1:-1::0;5908:16:18;;5895:34:::1;::::0;5908:20:::1;::::0;5925:3;;5908:20:::1;:::i;:::-;5895:12;:34::i;5146:145:0:-:0;4795:7;4821:12;;;:6;:12;;;;;:22;;;2802:16;2813:4;2802:10;:16::i;:::-;5259:25:::1;5270:4;5276:7;5259:10;:25::i;1600:264:7:-:0;1697:7;1732:34;1760:5;1732:27;:34::i;:::-;1724:5;:42;1716:98;;;;-1:-1:-1;;;1716:98:7;;13900:2:19;1716:98:7;;;13882:21:19;13939:2;13919:18;;;13912:30;13978:34;13958:18;;;13951:62;-1:-1:-1;;;14029:18:19;;;14022:41;14080:19;;1716:98:7;13698:407:19;1716:98:7;-1:-1:-1;;;;;;1831:19:7;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1600:264::o;6255:214:0:-;-1:-1:-1;;;;;6350:23:0;;929:10:12;6350:23:0;6342:83;;;;-1:-1:-1;;;6342:83:0;;14312:2:19;6342:83:0;;;14294:21:19;14351:2;14331:18;;;14324:30;14390:34;14370:18;;;14363:62;-1:-1:-1;;;14441:18:19;;;14434:45;14496:19;;6342:83:0;14110:411:19;6342:83:0;6436:26;6448:4;6454:7;6436:11;:26::i;:::-;6255:214;;:::o;6210:515:18:-;1482:19:3;:17;:19::i;:::-;-1:-1:-1;;;;;;;;;;;2802:16:0::1;2813:4;2802:10;:16::i;:::-;6340:25:18::0;;::::2;6332:57;;;::::0;-1:-1:-1;;;6332:57:18;;14728:2:19;6332:57:18::2;::::0;::::2;14710:21:19::0;14767:2;14747:18;;;14740:30;-1:-1:-1;;;14786:18:19;;;14779:49;14845:18;;6332:57:18::2;14526:343:19::0;6332:57:18::2;6399:15;6417:25;:15;951:14:13::0;;859:114;6417:25:18::2;6399:43;;6456:6;6452:170;6466:12:::0;;::::2;6452:170;;;6503:6;6498:114;6514:4;;6519:1;6514:7;;;;;;;:::i;:::-;;;;;;;6512:1;:9;6498:114;;;6544:26;6554:3;;6558:1;6554:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6562:7;6544:9;:26::i;:::-;6588:9:::0;::::2;::::0;::::2;:::i;:::-;;;;6522:3;;;;;:::i;:::-;;;;6498:114;;;-1:-1:-1::0;6480:3:18;::::2;::::0;::::2;:::i;:::-;;;;6452:170;;;-1:-1:-1::0;6631:28:18::2;:15;6651:7:::0;1431:22:13;;1359:102;6631:28:18::2;6685:14;;6677:7;:22;6669:49;;;::::0;-1:-1:-1;;;6669:49:18;;15208:2:19;6669:49:18::2;::::0;::::2;15190:21:19::0;15247:2;15227:18;;;15220:30;-1:-1:-1;;;15266:18:19;;;15259:45;15321:18;;6669:49:18::2;15006:339:19::0;6669:49:18::2;6322:403;1511:1:3::1;6210:515:18::0;;;;:::o;9611:224::-;9718:18;;9682:7;;9709:27;;9705:123;;-1:-1:-1;;9768:16:18;;;9611:224::o;9705:123::-;-1:-1:-1;9827:1:18;;9611:224;-1:-1:-1;9611:224:18:o;7178:288::-;2369:4:0;2802:16;2369:4;2802:10;:16::i;:::-;2120:8:18::1;::::0;:13;2112:35:::1;;;::::0;-1:-1:-1;;;2112:35:18;;15552:2:19;2112:35:18::1;::::0;::::1;15534:21:19::0;15591:1;15571:18;;;15564:29;-1:-1:-1;;;15609:18:19;;;15602:39;15658:18;;2112:35:18::1;15350:332:19::0;2112:35:18::1;2168:1;2157:8;:12:::0;7283:27:::2;:25;:27::i;:::-;7267:15;:43;7259:71;;;::::0;-1:-1:-1;;;7259:71:18;;15889:2:19;7259:71:18::2;::::0;::::2;15871:21:19::0;15928:2;15908:18;;;15901:30;-1:-1:-1;;;15947:18:19;;;15940:46;16003:18;;7259:71:18::2;15687:340:19::0;7259:71:18::2;7359:15:::0;;:54:::2;::::0;7341:12:::2;::::0;-1:-1:-1;;;;;7359:15:18::2;::::0;7387:21:::2;::::0;7341:12;7359:54;7341:12;7359:54;7387:21;7359:15;:54:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7340:73;;;7431:7;7423:36;;;::::0;-1:-1:-1;;;7423:36:18;;16444:2:19;7423:36:18::2;::::0;::::2;16426:21:19::0;16483:2;16463:18;;;16456:30;-1:-1:-1;;;16502:18:19;;;16495:46;16558:18;;7423:36:18::2;16242:340:19::0;7423:36:18::2;-1:-1:-1::0;;2201:1:18::1;2190:8;:12:::0;7178:288::o;4157:75::-;-1:-1:-1;;;;;;;;;;;2802:16:0;2813:4;2802:10;:16::i;:::-;4215:10:18::1;:8;:10::i;:::-;4157:75:::0;:::o;5477:179:4:-;5610:39;5627:4;5633:2;5637:7;5610:39;;;;;;;;;;;;:16;:39::i;6732:196:18:-;1482:19:3;:17;:19::i;:::-;-1:-1:-1;;;;;;;;;;;2802:16:0::1;2813:4;2802:10;:16::i;:::-;6855:14:18::2;;6848:3;6832:13;2022:10:7::0;:17;;1935:111;6832:13:18::2;:19;;;;:::i;:::-;:37;;6824:68;;;;-1:-1:-1::0;;;6824:68:18::2;;;;;;;:::i;:::-;6902:19;6914:2;6917:3;6902:11;:19::i;2118:241:7:-:0;2193:7;2228:41;2022:10;:17;;1935:111;2228:41;2220:5;:49;2212:106;;;;-1:-1:-1;;;2212:106:7;;16789:2:19;2212:106:7;;;16771:21:19;16828:2;16808:18;;;16801:30;16867:34;16847:18;;;16840:62;-1:-1:-1;;;16918:18:19;;;16911:42;16970:19;;2212:106:7;16587:408:19;2212:106:7;2335:10;2346:5;2335:17;;;;;;;;:::i;:::-;;;;;;;;;2328:24;;2118:241;;;:::o;3694:123:18:-;2369:4:0;2802:16;2369:4;2802:10;:16::i;:::-;3787:13:18::1;:23;3803:7:::0;;3787:13;:23:::1;:::i;:::-;;3694:123:::0;;;:::o;2651:218:4:-;2723:7;2758:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2758:16:4;;2784:56;;;;-1:-1:-1;;;2784:56:4;;19260:2:19;2784:56:4;;;19242:21:19;19299:2;19279:18;;;19272:30;-1:-1:-1;;;19318:18:19;;;19311:54;19382:18;;2784:56:4;19058:348:19;2390:204:4;2462:7;-1:-1:-1;;;;;2489:19:4;;2481:73;;;;-1:-1:-1;;;2481:73:4;;19613:2:19;2481:73:4;;;19595:21:19;19652:2;19632:18;;;19625:30;19691:34;19671:18;;;19664:62;-1:-1:-1;;;19742:18:19;;;19735:39;19791:19;;2481:73:4;19411:405:19;2481:73:4;-1:-1:-1;;;;;;2571:16:4;;;;;:9;:16;;;;;;;2390:204::o;4080:71:18:-;-1:-1:-1;;;;;;;;;;;2802:16:0;2813:4;2802:10;:16::i;:::-;4136:8:18::1;:6;:8::i;3824:130::-:0;2369:4:0;2802:16;2369:4;2802:10;:16::i;:::-;3942:5:18;3935:4:::1;:12;3942:5:::0;3935:4;:12:::1;:::i;3960:113::-:0;2369:4:0;2802:16;2369:4;2802:10;:16::i;:::-;-1:-1:-1;4047:12:18::1;:19:::0;3960:113::o;3203:145:0:-;3289:4;3312:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;3312:29:0;;;;;;;;;;;;;;;3203:145::o;3093:102:4:-;3149:13;3181:7;3174:14;;;;;:::i;4641:153::-;4735:52;929:10:12;4768:8:4;4778;4735:18;:52::i;8683:920:18:-;8764:25;:23;:25::i;:::-;8756:45;;;;-1:-1:-1;;;8756:45:18;;21168:2:19;8756:45:18;;;21150:21:19;21207:1;21187:18;;;21180:29;-1:-1:-1;;;21225:18:19;;;21218:37;21272:18;;8756:45:18;20966:330:19;8756:45:18;8811:20;8850:9;8845:700;8865:19;;;8845:700;;;8905:15;8923:8;;8932:1;8923:11;;;;;;;:::i;:::-;;;;;;;8905:29;;8970:16;8978:7;8970;:16::i;:::-;-1:-1:-1;;;;;8956:30:18;:10;-1:-1:-1;;;;;8956:30:18;;8948:52;;;;-1:-1:-1;;;8948:52:18;;21503:2:19;8948:52:18;;;21485:21:19;21542:1;21522:18;;;21515:29;-1:-1:-1;;;21560:18:19;;;21553:39;21609:18;;8948:52:18;21301:332:19;8948:52:18;9085:20;;;;:11;:20;;;;;;;;9084:21;9076:42;;;;-1:-1:-1;;;9076:42:18;;21840:2:19;9076:42:18;;;21822:21:19;21879:1;21859:18;;;21852:29;-1:-1:-1;;;21897:18:19;;;21890:38;21945:18;;9076:42:18;21638:331:19;9076:42:18;9149:18;;9140:27;;;9132:55;;;;-1:-1:-1;;;9132:55:18;;22176:2:19;9132:55:18;;;22158:21:19;22215:2;22195:18;;;22188:30;-1:-1:-1;;;22234:18:19;;;22227:46;22290:18;;9132:55:18;21974:340:19;9132:55:18;9222:10;9209:24;;;;:12;:24;;;;;;;;:33;;;;;;;;;;;9201:60;;;;-1:-1:-1;;;9201:60:18;;22521:2:19;9201:60:18;;;22503:21:19;22560:2;22540:18;;;22533:30;-1:-1:-1;;;22579:18:19;;;22572:45;22634:18;;9201:60:18;22319:339:19;9201:60:18;9275:20;;;;:11;:20;;;;;;;;:27;;-1:-1:-1;;9275:27:18;;;9298:4;9275:27;;;;9329:10;9316:24;;;:12;:24;;;;;:33;;;;;;;;:41;;;;;;;;9396:18;;9371:53;;9329:10;-1:-1:-1;;;;;9396:18:18;9287:7;9371:12;:53::i;:::-;9454:16;;9438:32;;;;:::i;:::-;9517:16;;9489:45;;3150:25:19;;;9438:32:18;;-1:-1:-1;9508:7:18;;9496:10;;9489:45;;3138:2:19;3123:18;9489:45:18;;;;;;;-1:-1:-1;8886:3:18;;;;:::i;:::-;;;;8845:700;;;-1:-1:-1;9554:42:18;;9562:10;;9554:42;;;;;9583:12;;9554:42;;;;9583:12;9562:10;9554:42;;;;;;;;;;;;;;;;;;;5722:315:4;5890:41;929:10:12;5923:7:4;5890:18;:41::i;:::-;5882:100;;;;-1:-1:-1;;;5882:100:4;;;;;;;:::i;:::-;5992:38;6006:4;6012:2;6016:7;6025:4;5992:13;:38::i;2849:702:18:-;3111:19:2;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:2;;3212:1;3197:12;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:2;1476:19:11;:23;;;3219:66:2;;-1:-1:-1;3268:12:2;;;;;:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:2;;22865:2:19;3157:201:2;;;22847:21:19;22904:2;22884:18;;;22877:30;22943:34;22923:18;;;22916:62;-1:-1:-1;;;22994:18:19;;;22987:44;23048:19;;3157:201:2;22663:410:19;3157:201:2;3368:12;:16;;-1:-1:-1;;3368:16:2;3383:1;3368:16;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;3428:20:2;;;;;3394:65;2911:40:18::1;;;;;;;;;;;;;;-1:-1:-1::0;;;2911:40:18::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;2911:40:18::1;;::::0;:13:::1;:40::i;:::-;2961:25;:23;:25::i;:::-;2996;:23;:25::i;:::-;3031:17;:15;:17::i;:::-;3058:22;:20;:22::i;:::-;3107:5;3090:14;:22:::0;3136:4:::1;3122;:18:::0;3165:10:::1;3150:12:::0;:25;3198:10:::1;3185::::0;:23;3237:10:::1;3218:16:::0;:29;3300:9:::1;3281:16:::0;:28;3340:4:::1;3319:18:::0;:25;3354:18;:31;;3375:10:::1;-1:-1:-1::0;;;;;;3354:31:18;;::::1;::::0;::::1;::::0;;;3395:15;:28;;;;::::1;::::0;;::::1;::::0;;3433:35:::1;-1:-1:-1::0;3464:3:18;3433:10:::1;:35::i;:::-;3478:28;-1:-1:-1::0;;;;;;;;;;;3502:3:18::1;3478:10;:28::i;:::-;3516;-1:-1:-1::0;;;;;;;;;;;3540:3:18::1;3516:10;:28::i;:::-;3483:14:2::0;3479:99;;;3529:5;3513:21;;-1:-1:-1;;3513:21:2;;;3553:14;;-1:-1:-1;23230:36:19;;3553:14:2;;23218:2:19;23203:18;3553:14:2;;;;;;;3101:483;2849:702:18;:::o;10201:177::-;10266:4;10308:15;10290:4;:16;;;:33;:80;;;;-1:-1:-1;10345:16:18;;:25;;10364:6;10345:25;:::i;:::-;10327:15;:43;10290:80;10282:89;;10201:177;:::o;7951:211::-;8096:13;8132:23;8147:7;8132:14;:23::i;2271:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4238:309::-;-1:-1:-1;;;;;;;;;;;2802:16:0;2813:4;2802:10;:16::i;:::-;4353:14:18::1;::::0;2022:10:7;:17;4334:15:18::1;::::0;4348:1:::1;4334:15;:::i;:::-;:33;;4326:56;;;::::0;-1:-1:-1;;;4326:56:18;;23479:2:19;4326:56:18::1;::::0;::::1;23461:21:19::0;23518:2;23498:18;;;23491:30;-1:-1:-1;;;23537:18:19;;;23530:41;23588:18;;4326:56:18::1;23277:335:19::0;4326:56:18::1;4392:15;4410:25;:15;951:14:13::0;;859:114;4410:25:18::1;4392:43;;4445:27;:15;1070:19:13::0;;1088:1;1070:19;;;981:127;4445:27:18::1;4482:22;4492:2;4496:7;4482:9;:22::i;:::-;4514:26;4527:7;4536:3;4514:12;:26::i;4554:758::-:0;1482:19:3;:17;:19::i;:::-;4666:10:18;;4678:15:::1;-1:-1:-1::0;4666:27:18::1;4658:48;;;::::0;-1:-1:-1;;;4658:48:18;;12287:2:19;4658:48:18::1;::::0;::::1;12269:21:19::0;12326:1;12306:18;;;12299:29;-1:-1:-1;;;12344:18:19;;;12337:39;12393:18;;4658:48:18::1;12085:332:19::0;4658:48:18::1;4749:10;4716:12;4731:29:::0;;;:17:::1;:29;::::0;;;;;2004:1:::1;4779:11;4787:3:::0;4731:29;4779:11:::1;:::i;:::-;4778:20;;4770:55;;;::::0;-1:-1:-1;;;4770:55:18;;23819:2:19;4770:55:18::1;::::0;::::1;23801:21:19::0;23858:2;23838:18;;;23831:30;-1:-1:-1;;;23877:18:19;;;23870:52;23939:18;;4770:55:18::1;23617:346:19::0;4770:55:18::1;4866:14;;4859:3;4843:13;2022:10:7::0;:17;;1935:111;4843:13:18::1;:19;;;;:::i;:::-;:37;;4835:68;;;;-1:-1:-1::0;;;4835:68:18::1;;;;;;;:::i;:::-;4943:4;:11:::0;4921:12;;:18:::1;::::0;4936:3;;4921:18:::1;:::i;:::-;:33;;4913:67;;;::::0;-1:-1:-1;;;4913:67:18;;24170:2:19;4913:67:18::1;::::0;::::1;24152:21:19::0;24209:2;24189:18;;;24182:30;-1:-1:-1;;;24228:18:19;;;24221:52;24290:18;;4913:67:18::1;23968:346:19::0;4913:67:18::1;5006:3;4990:4;:12;;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;5044:28:18::1;::::0;-1:-1:-1;;5061:10:18::1;24468:2:19::0;24464:15;24460:53;5044:28:18::1;::::0;::::1;24448:66:19::0;5019:12:18::1;::::0;24530::19;;5044:28:18::1;;;;;;;;;;;;5034:39;;;;;;5019:54;;5091:63;5121:12;;5091:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;5135:12:18::1;::::0;;-1:-1:-1;5149:4:18;;-1:-1:-1;5091:29:18::1;:63::i;:::-;5083:90;;;::::0;-1:-1:-1;;;5083:90:18;;24755:2:19;5083:90:18::1;::::0;::::1;24737:21:19::0;24794:2;24774:18;;;24767:30;-1:-1:-1;;;24813:18:19;;;24806:44;24867:18;;5083:90:18::1;24553:338:19::0;5083:90:18::1;5215:13;5225:3:::0;5215:7;:13:::1;:::i;:::-;5201:10;5183:29;::::0;;;:17:::1;:29;::::0;;;;:45;;;;5238:27:::1;::::0;5261:3;5238:11:::1;:27::i;:::-;5288:12:::0;;5275:30:::1;::::0;5288:16:::1;::::0;5301:3;;5288:16:::1;:::i;5275:30::-;4648:664;;4554:758:::0;;;:::o;5571:147:0:-;4795:7;4821:12;;;:6;:12;;;;;:22;;;2802:16;2813:4;2802:10;:16::i;:::-;5685:26:::1;5697:4;5703:7;5685:11;:26::i;10070:125:18:-:0;10163:16;;10137:7;;10163:25;;10182:6;10163:25;:::i;9841:222::-;9962:18;;9919:4;;9954:26;;:67;;;;;9996:25;:23;:25::i;:::-;9954:102;;;;-1:-1:-1;;;;;;10025:22:18;;;;;;:12;:22;;;;;;;;:31;;;;;;;;;;;9954:102;9935:121;9841:222;-1:-1:-1;;;9841:222:18:o;2903:213:0:-;2988:4;-1:-1:-1;;;;;;3011:58:0;;-1:-1:-1;;;3011:58:0;;:98;;;3073:36;3097:11;3073:23;:36::i;12173:133:4:-;7571:4;7594:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7594:16:4;12246:53;;;;-1:-1:-1;;;12246:53:4;;19260:2:19;12246:53:4;;;19242:21:19;19299:2;19279:18;;;19272:30;-1:-1:-1;;;19318:18:19;;;19311:54;19382:18;;12246:53:4;19058:348:19;11464:182:4;11538:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11538:29:4;-1:-1:-1;;;;;11538:29:4;;;;;;;;:24;;11591:34;11538:24;11591:25;:34::i;:::-;-1:-1:-1;;;;;11582:57:4;;;;;;;;;;;11464:182;;:::o;7789:272::-;7882:4;7898:13;7914:34;7940:7;7914:25;:34::i;:::-;7898:50;;7977:5;-1:-1:-1;;;;;7966:16:4;:7;-1:-1:-1;;;;;7966:16:4;;:52;;;-1:-1:-1;;;;;;4980:25:4;;;4957:4;4980:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7986:32;7966:87;;;;8046:7;-1:-1:-1;;;;;8022:31:4;:20;8034:7;8022:11;:20::i;:::-;-1:-1:-1;;;;;8022:31:4;;7966:87;7958:96;7789:272;-1:-1:-1;;;;7789:272:4:o;10736:616::-;10901:4;-1:-1:-1;;;;;10863:42:4;:34;10889:7;10863:25;:34::i;:::-;-1:-1:-1;;;;;10863:42:4;;10855:92;;;;-1:-1:-1;;;10855:92:4;;25098:2:19;10855:92:4;;;25080:21:19;25137:2;25117:18;;;25110:30;25176:34;25156:18;;;25149:62;-1:-1:-1;;;25227:18:19;;;25220:35;25272:19;;10855:92:4;24896:401:19;10855:92:4;-1:-1:-1;;;;;10965:16:4;;10957:65;;;;-1:-1:-1;;;10957:65:4;;25504:2:19;10957:65:4;;;25486:21:19;25543:2;25523:18;;;25516:30;25582:34;25562:18;;;25555:62;-1:-1:-1;;;25633:18:19;;;25626:34;25677:19;;10957:65:4;25302:400:19;10957:65:4;11033:39;11054:4;11060:2;11064:7;11033:20;:39::i;:::-;11134:29;11151:1;11155:7;11134:8;:29::i;:::-;-1:-1:-1;;;;;11174:15:4;;;;;;:9;:15;;;;;:20;;11193:1;;11174:15;:20;;11193:1;;11174:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11204:13:4;;;;;;:9;:13;;;;;:18;;11221:1;;11204:13;:18;;11221:1;;11204:18;:::i;:::-;;;;-1:-1:-1;;11232:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11232:21:4;-1:-1:-1;;;;;11232:21:4;;;;;;;;;11269:27;;11232:16;;11269:27;;;;;;;3998:348;3928:418;;:::o;2010:106:3:-;1928:7;;;;2079:9;2071:38;;;;-1:-1:-1;;;2071:38:3;;26039:2:19;2071:38:3;;;26021:21:19;26078:2;26058:18;;;26051:30;-1:-1:-1;;;26097:18:19;;;26090:46;26153:18;;2071:38:3;25837:340:19;2071:38:3;2010:106::o;5943:261:18:-;6004:15;6022:25;:15;951:14:13;;859:114;6022:25:18;6004:43;;6062:6;6057:94;6073:3;6071:1;:5;6057:94;;;6095:22;6105:2;6109:7;6095:9;:22::i;:::-;6131:9;;;;:::i;:::-;;;;6077:3;;;;;:::i;:::-;;;;6057:94;;;-1:-1:-1;6160:28:18;:15;6180:7;1431:22:13;;1359:102;6939:231:18;2120:8;;:13;2112:35;;;;-1:-1:-1;;;2112:35:18;;15552:2:19;2112:35:18;;;15534:21:19;15591:1;15571:18;;;15564:29;-1:-1:-1;;;15609:18:19;;;15602:39;15658:18;;2112:35:18;15350:332:19;2112:35:18;2168:1;2157:8;:12;7015:9:::1;:19:::0;-1:-1:-1;7015:19:18::1;7007:54;;;::::0;-1:-1:-1;;;7007:54:18;;26384:2:19;7007:54:18::1;::::0;::::1;26366:21:19::0;26423:2;26403:18;;;26396:30;-1:-1:-1;;;26442:18:19;;;26435:52;26504:18;;7007:54:18::1;26182:346:19::0;7007:54:18::1;7087:6;7075:9;:18;7071:93;;;7113:10;7105:48;7134:18;7146:6:::0;7134:9:::1;:18;:::i;:::-;7105:48;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;7071:93;-1:-1:-1::0;2201:1:18;2190:8;:12;6939:231::o;3642:103:0:-;3708:30;3719:4;929:10:12;3708::0;:30::i;7804:233::-;7887:22;7895:4;7901:7;7887;:22::i;:::-;7882:149;;7925:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;7925:29:0;;;;;;;;;:36;;-1:-1:-1;;7925:36:0;7957:4;7925:36;;;8007:12;929:10:12;;850:96;8007:12:0;-1:-1:-1;;;;;7980:40:0;7998:7;-1:-1:-1;;;;;7980:40:0;7992:4;7980:40;;;;;;;;;;7804:233;;:::o;8208:234::-;8291:22;8299:4;8305:7;8291;:22::i;:::-;8287:149;;;8361:5;8329:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;8329:29:0;;;;;;;;;;:37;;-1:-1:-1;;8329:37:0;;;8385:40;929:10:12;;8329:12:0;;8385:40;;8361:5;8385:40;8208:234;;:::o;8391:108:4:-;8466:26;8476:2;8480:7;8466:26;;;;;;;;;;;;:9;:26::i;2676:117:3:-;1729:16;:14;:16::i;:::-;2734:7:::1;:15:::0;;-1:-1:-1;;2734:15:3::1;::::0;;2764:22:::1;929:10:12::0;2773:12:3::1;2764:22;::::0;-1:-1:-1;;;;;1692:32:19;;;1674:51;;1662:2;1647:18;2764:22:3::1;;;;;;;2676:117::o:0;2429:115::-;1482:19;:17;:19::i;:::-;2488:7:::1;:14:::0;;-1:-1:-1;;2488:14:3::1;2498:4;2488:14;::::0;;2517:20:::1;2524:12;929:10:12::0;;850:96;11782:307:4;11932:8;-1:-1:-1;;;;;11923:17:4;:5;-1:-1:-1;;;;;11923:17:4;;11915:55;;;;-1:-1:-1;;;11915:55:4;;26735:2:19;11915:55:4;;;26717:21:19;26774:2;26754:18;;;26747:30;26813:27;26793:18;;;26786:55;26858:18;;11915:55:4;26533:349:19;11915:55:4;-1:-1:-1;;;;;11980:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11980:46:4;;;;;;;;;;12041:41;;540::19;;;12041::4;;513:18:19;12041:41:4;;;;;;;11782:307;;;:::o;6898:305::-;7048:28;7058:4;7064:2;7068:7;7048:9;:28::i;:::-;7094:47;7117:4;7123:2;7127:7;7136:4;7094:22;:47::i;:::-;7086:110;;;;-1:-1:-1;;;7086:110:4;;;;;;;:::i;1605:149::-;4910:13:2;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:2;;;;;;;:::i;:::-;1708:39:4::1;1732:5;1739:7;1708:23;:39::i;586:68:7:-:0;4910:13:2;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:2;;;;;;;:::i;1063:97:3:-;4910:13:2;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:2;;;;;;;:::i;:::-;1126:27:3::1;:25;:27::i;747:608:8:-:0;820:13;845:23;860:7;845:14;:23::i;:::-;879;905:19;;;:10;:19;;;;;879:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;934:18;955:10;:8;:10::i;:::-;934:31;;1044:4;1038:18;1060:1;1038:23;1034:70;;-1:-1:-1;1084:9:8;747:608;-1:-1:-1;;747:608:8:o;1034:70::-;1206:23;;:27;1202:106;;1280:4;1286:9;1263:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1249:48;;;;747:608;;;:::o;1202:106::-;1325:23;1340:7;1325:14;:23::i;1502:214::-;7571:4:4;7594:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7594:16:4;1593:75:8;;;;-1:-1:-1;;;1593:75:8;;28395:2:19;1593:75:8;;;28377:21:19;28434:2;28414:18;;;28407:30;28473:34;28453:18;;;28446:62;-1:-1:-1;;;28524:18:19;;;28517:44;28578:19;;1593:75:8;28193:410:19;1593:75:8;1678:19;;;;:10;:19;;;;;:31;1700:9;1678:19;:31;:::i;1164:184:15:-;1285:4;1337;1308:25;1321:5;1328:4;1308:12;:25::i;:::-;:33;;1164:184;-1:-1:-1;;;;1164:184:15:o;1266:255:7:-;1390:4;-1:-1:-1;;;;;;1413:61:7;;-1:-1:-1;;;1413:61:7;;:101;;;1478:36;1502:11;1478:23;:36::i;7473:243:18:-;1482:19:3;:17;:19::i;:::-;7664:45:18::1;7691:4;7697:2;7701:7;7664:26;:45::i;4026:514:0:-:0;4114:22;4122:4;4128:7;4114;:22::i;:::-;4109:425;;4297:52;4336:7;-1:-1:-1;;;;;4297:52:0;4346:2;4297:30;:52::i;:::-;4420:49;4459:4;4466:2;4420:30;:49::i;:::-;4204:287;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4204:287:0;;;;;;;;;;-1:-1:-1;;;4152:371:0;;;;;;;:::i;8720:309:4:-;8844:18;8850:2;8854:7;8844:5;:18::i;:::-;8893:53;8924:1;8928:2;8932:7;8941:4;8893:22;:53::i;:::-;8872:150;;;;-1:-1:-1;;;8872:150:4;;;;;;;:::i;2188:106:3:-;1928:7;;;;2246:41;;;;-1:-1:-1;;;2246:41:3;;30958:2:19;2246:41:3;;;30940:21:19;30997:2;30977:18;;;30970:30;-1:-1:-1;;;31016:18:19;;;31009:50;31076:18;;2246:41:3;30756:344:19;12858:853:4;13007:4;-1:-1:-1;;;;;13027:13:4;;1476:19:11;:23;13023:682:4;;13062:82;;-1:-1:-1;;;13062:82:4;;-1:-1:-1;;;;;13062:47:4;;;;;:82;;929:10:12;;13124:4:4;;13130:7;;13139:4;;13062:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13062:82:4;;;;;;;;-1:-1:-1;;13062:82:4;;;;;;;;;;;;:::i;:::-;;;13058:595;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13322:6;:13;13339:1;13322:18;13318:321;;13364:60;;-1:-1:-1;;;13364:60:4;;;;;;;:::i;13318:321::-;13591:6;13585:13;13576:6;13572:2;13568:15;13561:38;13058:595;-1:-1:-1;;;;;;13194:62:4;-1:-1:-1;;;13194:62:4;;-1:-1:-1;13187:69:4;;13023:682;-1:-1:-1;13690:4:4;12858:853;;;;;;:::o;1760:160::-;4910:13:2;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:2;;;;;;;:::i;:::-;1873:5:4::1;:13;1881:5:::0;1873;:13:::1;:::i;:::-;-1:-1:-1::0;1896:7:4::1;:17;1906:7:::0;1896;:17:::1;:::i;1166:95:3:-:0;4910:13:2;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:2;;;;;;;:::i;:::-;1239:7:3::1;:15:::0;;-1:-1:-1;;1239:15:3::1;::::0;;1166:95::o;3560:128:18:-;3620:13;3652;3645:20;;;;;:::i;3261:276:4:-;3334:13;3359:23;3374:7;3359:14;:23::i;:::-;3393:21;3417:10;:8;:10::i;:::-;3393:34;;3468:1;3450:7;3444:21;:25;:86;;;;;;;;;;;;;;;;;3496:7;3505:18;:7;:16;:18::i;:::-;3479:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3437:93;3261:276;-1:-1:-1;;;3261:276:4:o;2002:290:15:-;2085:7;2127:4;2085:7;2141:116;2165:5;:12;2161:1;:16;2141:116;;;2213:33;2223:12;2237:5;2243:1;2237:8;;;;;;;;:::i;:::-;;;;;;;2213:9;:33::i;:::-;2198:48;-1:-1:-1;2179:3:15;;;;:::i;:::-;;;;2141:116;;;-1:-1:-1;2273:12:15;2002:290;-1:-1:-1;;;2002:290:15:o;1987:344:4:-;2111:4;-1:-1:-1;;;;;;2146:51:4;;-1:-1:-1;;;2146:51:4;;:126;;-1:-1:-1;;;;;;;2213:59:4;;-1:-1:-1;;;2213:59:4;2146:126;:178;;;-1:-1:-1;;;;;;;;;;1168:51:16;;;2288:36:4;1060:166:16;2955:572:7;-1:-1:-1;;;;;3154:18:7;;3150:183;;3188:40;3220:7;4347:10;:17;;4320:24;;;;:15;:24;;;;;:44;;;4374:24;;;;;;;;;;;;4244:161;3188:40;3150:183;;;3257:2;-1:-1:-1;;;;;3249:10:7;:4;-1:-1:-1;;;;;3249:10:7;;3245:88;;3275:47;3308:4;3314:7;3275:32;:47::i;:::-;-1:-1:-1;;;;;3346:16:7;;3342:179;;3378:45;3415:7;3378:36;:45::i;3342:179::-;3450:4;-1:-1:-1;;;;;3444:10:7;:2;-1:-1:-1;;;;;3444:10:7;;3440:81;;3470:40;3498:2;3502:7;3470:27;:40::i;1663:441:14:-;1738:13;1763:19;1795:10;1799:6;1795:1;:10;:::i;:::-;:14;;1808:1;1795:14;:::i;:::-;1785:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1785:25:14;;1763:47;;-1:-1:-1;;;1820:6:14;1827:1;1820:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1820:15:14;;;;;;;;;-1:-1:-1;;;1845:6:14;1852:1;1845:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1845:15:14;;;;;;;;-1:-1:-1;1875:9:14;1887:10;1891:6;1887:1;:10;:::i;:::-;:14;;1900:1;1887:14;:::i;:::-;1875:26;;1870:132;1907:1;1903;:5;1870:132;;;-1:-1:-1;;;1954:5:14;1962:3;1954:11;1941:25;;;;;;;:::i;:::-;;;;1929:6;1936:1;1929:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;1929:37:14;;;;;;;;-1:-1:-1;1990:1:14;1980:11;;;;;1910:3;;;:::i;:::-;;;1870:132;;;-1:-1:-1;2019:10:14;;2011:55;;;;-1:-1:-1;;;2011:55:14;;32196:2:19;2011:55:14;;;32178:21:19;;;32215:18;;;32208:30;32274:34;32254:18;;;32247:62;32326:18;;2011:55:14;31994:356:19;9351:427:4;-1:-1:-1;;;;;9430:16:4;;9422:61;;;;-1:-1:-1;;;9422:61:4;;32557:2:19;9422:61:4;;;32539:21:19;;;32576:18;;;32569:30;32635:34;32615:18;;;32608:62;32687:18;;9422:61:4;32355:356:19;9422:61:4;7571:4;7594:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7594:16:4;:30;9493:58;;;;-1:-1:-1;;;9493:58:4;;32918:2:19;9493:58:4;;;32900:21:19;32957:2;32937:18;;;32930:30;32996;32976:18;;;32969:58;33044:18;;9493:58:4;32716:352:19;9493:58:4;9562:45;9591:1;9595:2;9599:7;9562:20;:45::i;:::-;-1:-1:-1;;;;;9618:13:4;;;;;;:9;:13;;;;;:18;;9635:1;;9618:13;:18;;9635:1;;9618:18;:::i;:::-;;;;-1:-1:-1;;9646:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9646:21:4;-1:-1:-1;;;;;9646:21:4;;;;;;;;9683:33;;9646:16;;;9683:33;;9646:16;;9683:33;6255:214:0;;:::o;403:703:14:-;459:13;676:5;685:1;676:10;672:51;;-1:-1:-1;;702:10:14;;;;;;;;;;;;-1:-1:-1;;;702:10:14;;;;;403:703::o;672:51::-;747:5;732:12;786:75;793:9;;786:75;;818:8;;;;:::i;:::-;;-1:-1:-1;840:10:14;;-1:-1:-1;848:2:14;840:10;;:::i;:::-;;;786:75;;;870:19;902:6;892:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;892:17:14;;870:39;;919:150;926:10;;919:150;;952:11;962:1;952:11;;:::i;:::-;;-1:-1:-1;1020:10:14;1028:2;1020:5;:10;:::i;:::-;1007:24;;:2;:24;:::i;:::-;994:39;;977:6;984;977:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;977:56:14;;;;;;;;-1:-1:-1;1047:11:14;1056:2;1047:11;;:::i;:::-;;;919:150;;8065:147:15;8128:7;8158:1;8154;:5;:51;;8286:13;8377:15;;;8412:4;8405:15;;;8458:4;8442:21;;8154:51;;;8286:13;8377:15;;;8412:4;8405:15;;;8458:4;8442:21;;8162:20;8218:261;5022:981:7;5284:22;5345:1;5309:33;5337:4;5309:27;:33::i;:::-;:37;;;;:::i;:::-;5356:18;5377:26;;;:17;:26;;;;;;5284:62;;-1:-1:-1;5507:28:7;;;5503:323;;-1:-1:-1;;;;;5573:18:7;;5551:19;5573:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5622:30;;;;;;:44;;;5738:30;;:17;:30;;;;;:43;;;5503:323;-1:-1:-1;5919:26:7;;;;:17;:26;;;;;;;;5912:33;;;-1:-1:-1;;;;;5962:18:7;;;;;:12;:18;;;;;:34;;;;;;;5955:41;5022:981::o;6291:1061::-;6565:10;:17;6540:22;;6565:21;;6585:1;;6565:21;:::i;:::-;6596:18;6617:24;;;:15;:24;;;;;;6985:10;:26;;6540:46;;-1:-1:-1;6617:24:7;;6540:46;;6985:26;;;;;;:::i;:::-;;;;;;;;;6963:48;;7047:11;7022:10;7033;7022:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;7126:28;;;:15;:28;;;;;;;:41;;;7295:24;;;;;7288:31;7329:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6362:990;;;6291:1061;:::o;3821:228::-;3905:14;3922:31;3950:2;3922:27;:31::i;:::-;-1:-1:-1;;;;;3963:16:7;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;4007:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3821:228:7:o;14:131:19:-;-1:-1:-1;;;;;;88:32:19;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:19;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:19;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:19:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:19;;1343:180;-1:-1:-1;1343:180:19:o;1736:131::-;-1:-1:-1;;;;;1811:31:19;;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:19:o;3186:456::-;3263:6;3271;3279;3332:2;3320:9;3311:7;3307:23;3303:32;3300:52;;;3348:1;3345;3338:12;3300:52;3387:9;3374:23;3406:31;3431:5;3406:31;:::i;:::-;3456:5;-1:-1:-1;3513:2:19;3498:18;;3485:32;3526:33;3485:32;3526:33;:::i;:::-;3186:456;;3578:7;;-1:-1:-1;;;3632:2:19;3617:18;;;;3604:32;;3186:456::o;4014:315::-;4082:6;4090;4143:2;4131:9;4122:7;4118:23;4114:32;4111:52;;;4159:1;4156;4149:12;4111:52;4195:9;4182:23;4172:33;;4255:2;4244:9;4240:18;4227:32;4268:31;4293:5;4268:31;:::i;:::-;4318:5;4308:15;;;4014:315;;;;;:::o;4334:367::-;4397:8;4407:6;4461:3;4454:4;4446:6;4442:17;4438:27;4428:55;;4479:1;4476;4469:12;4428:55;-1:-1:-1;4502:20:19;;4545:18;4534:30;;4531:50;;;4577:1;4574;4567:12;4531:50;4614:4;4606:6;4602:17;4590:29;;4674:3;4667:4;4657:6;4654:1;4650:14;4642:6;4638:27;4634:38;4631:47;4628:67;;;4691:1;4688;4681:12;4628:67;4334:367;;;;;:::o;4706:773::-;4828:6;4836;4844;4852;4905:2;4893:9;4884:7;4880:23;4876:32;4873:52;;;4921:1;4918;4911:12;4873:52;4961:9;4948:23;4990:18;5031:2;5023:6;5020:14;5017:34;;;5047:1;5044;5037:12;5017:34;5086:70;5148:7;5139:6;5128:9;5124:22;5086:70;:::i;:::-;5175:8;;-1:-1:-1;5060:96:19;-1:-1:-1;5263:2:19;5248:18;;5235:32;;-1:-1:-1;5279:16:19;;;5276:36;;;5308:1;5305;5298:12;5276:36;;5347:72;5411:7;5400:8;5389:9;5385:24;5347:72;:::i;:::-;4706:773;;;;-1:-1:-1;5438:8:19;-1:-1:-1;;;;4706:773:19:o;5484:592::-;5555:6;5563;5616:2;5604:9;5595:7;5591:23;5587:32;5584:52;;;5632:1;5629;5622:12;5584:52;5672:9;5659:23;5701:18;5742:2;5734:6;5731:14;5728:34;;;5758:1;5755;5748:12;5728:34;5796:6;5785:9;5781:22;5771:32;;5841:7;5834:4;5830:2;5826:13;5822:27;5812:55;;5863:1;5860;5853:12;5812:55;5903:2;5890:16;5929:2;5921:6;5918:14;5915:34;;;5945:1;5942;5935:12;5915:34;5990:7;5985:2;5976:6;5972:2;5968:15;5964:24;5961:37;5958:57;;;6011:1;6008;6001:12;5958:57;6042:2;6034:11;;;;;6064:6;;-1:-1:-1;5484:592:19;;-1:-1:-1;;;;5484:592:19:o;6081:247::-;6140:6;6193:2;6181:9;6172:7;6168:23;6164:32;6161:52;;;6209:1;6206;6199:12;6161:52;6248:9;6235:23;6267:31;6292:5;6267:31;:::i;6333:191::-;6416:6;6469:3;6457:9;6448:7;6444:23;6440:33;6437:53;;;6486:1;6483;6476:12;6437:53;-1:-1:-1;6509:9:19;6333:191;-1:-1:-1;6333:191:19:o;6529:416::-;6594:6;6602;6655:2;6643:9;6634:7;6630:23;6626:32;6623:52;;;6671:1;6668;6661:12;6623:52;6710:9;6697:23;6729:31;6754:5;6729:31;:::i;:::-;6779:5;-1:-1:-1;6836:2:19;6821:18;;6808:32;6878:15;;6871:23;6859:36;;6849:64;;6909:1;6906;6899:12;6950:437;7036:6;7044;7097:2;7085:9;7076:7;7072:23;7068:32;7065:52;;;7113:1;7110;7103:12;7065:52;7153:9;7140:23;7186:18;7178:6;7175:30;7172:50;;;7218:1;7215;7208:12;7172:50;7257:70;7319:7;7310:6;7299:9;7295:22;7257:70;:::i;:::-;7346:8;;7231:96;;-1:-1:-1;6950:437:19;-1:-1:-1;;;;6950:437:19:o;7392:127::-;7453:10;7448:3;7444:20;7441:1;7434:31;7484:4;7481:1;7474:15;7508:4;7505:1;7498:15;7524:631;7588:5;7618:18;7659:2;7651:6;7648:14;7645:40;;;7665:18;;:::i;:::-;7740:2;7734:9;7708:2;7794:15;;-1:-1:-1;;7790:24:19;;;7816:2;7786:33;7782:42;7770:55;;;7840:18;;;7860:22;;;7837:46;7834:72;;;7886:18;;:::i;:::-;7926:10;7922:2;7915:22;7955:6;7946:15;;7985:6;7977;7970:22;8025:3;8016:6;8011:3;8007:16;8004:25;8001:45;;;8042:1;8039;8032:12;8001:45;8092:6;8087:3;8080:4;8072:6;8068:17;8055:44;8147:1;8140:4;8131:6;8123;8119:19;8115:30;8108:41;;;;7524:631;;;;;:::o;8160:794::-;8255:6;8263;8271;8279;8332:3;8320:9;8311:7;8307:23;8303:33;8300:53;;;8349:1;8346;8339:12;8300:53;8388:9;8375:23;8407:31;8432:5;8407:31;:::i;:::-;8457:5;-1:-1:-1;8514:2:19;8499:18;;8486:32;8527:33;8486:32;8527:33;:::i;:::-;8579:7;-1:-1:-1;8633:2:19;8618:18;;8605:32;;-1:-1:-1;8688:2:19;8673:18;;8660:32;8715:18;8704:30;;8701:50;;;8747:1;8744;8737:12;8701:50;8770:22;;8823:4;8815:13;;8811:27;-1:-1:-1;8801:55:19;;8852:1;8849;8842:12;8801:55;8875:73;8940:7;8935:2;8922:16;8917:2;8913;8909:11;8875:73;:::i;:::-;8865:83;;;8160:794;;;;;;;:::o;8959:585::-;9037:6;9045;9098:2;9086:9;9077:7;9073:23;9069:32;9066:52;;;9114:1;9111;9104:12;9066:52;9153:9;9140:23;9172:31;9197:5;9172:31;:::i;:::-;9222:5;-1:-1:-1;9278:2:19;9263:18;;9250:32;9305:18;9294:30;;9291:50;;;9337:1;9334;9327:12;9291:50;9360:22;;9413:4;9405:13;;9401:27;-1:-1:-1;9391:55:19;;9442:1;9439;9432:12;9391:55;9465:73;9530:7;9525:2;9512:16;9507:2;9503;9499:11;9465:73;:::i;:::-;9455:83;;;8959:585;;;;;:::o;9549:505::-;9644:6;9652;9660;9713:2;9701:9;9692:7;9688:23;9684:32;9681:52;;;9729:1;9726;9719:12;9681:52;9765:9;9752:23;9742:33;;9826:2;9815:9;9811:18;9798:32;9853:18;9845:6;9842:30;9839:50;;;9885:1;9882;9875:12;9839:50;9924:70;9986:7;9977:6;9966:9;9962:22;9924:70;:::i;:::-;9549:505;;10013:8;;-1:-1:-1;9898:96:19;;-1:-1:-1;;;;9549:505:19:o;10059:388::-;10127:6;10135;10188:2;10176:9;10167:7;10163:23;10159:32;10156:52;;;10204:1;10201;10194:12;10156:52;10243:9;10230:23;10262:31;10287:5;10262:31;:::i;:::-;10312:5;-1:-1:-1;10369:2:19;10354:18;;10341:32;10382:33;10341:32;10382:33;:::i;10452:380::-;10531:1;10527:12;;;;10574;;;10595:61;;10649:4;10641:6;10637:17;10627:27;;10595:61;10702:2;10694:6;10691:14;10671:18;10668:38;10665:161;;10748:10;10743:3;10739:20;10736:1;10729:31;10783:4;10780:1;10773:15;10811:4;10808:1;10801:15;11670:410;11872:2;11854:21;;;11911:2;11891:18;;;11884:30;11950:34;11945:2;11930:18;;11923:62;-1:-1:-1;;;12016:2:19;12001:18;;11994:44;12070:3;12055:19;;11670:410::o;12422:127::-;12483:10;12478:3;12474:20;12471:1;12464:31;12514:4;12511:1;12504:15;12538:4;12535:1;12528:15;12554:128;12594:3;12625:1;12621:6;12618:1;12615:13;12612:39;;;12631:18;;:::i;:::-;-1:-1:-1;12667:9:19;;12554:128::o;13038:342::-;13240:2;13222:21;;;13279:2;13259:18;;;13252:30;-1:-1:-1;;;13313:2:19;13298:18;;13291:48;13371:2;13356:18;;13038:342::o;13385:135::-;13424:3;13445:17;;;13442:43;;13465:18;;:::i;:::-;-1:-1:-1;13512:1:19;13501:13;;13385:135::o;13525:168::-;13565:7;13631:1;13627;13623:6;13619:14;13616:1;13613:21;13608:1;13601:9;13594:17;13590:45;13587:71;;;13638:18;;:::i;:::-;-1:-1:-1;13678:9:19;;13525:168::o;14874:127::-;14935:10;14930:3;14926:20;14923:1;14916:31;14966:4;14963:1;14956:15;14990:4;14987:1;14980:15;17126:545;17228:2;17223:3;17220:11;17217:448;;;17264:1;17289:5;17285:2;17278:17;17334:4;17330:2;17320:19;17404:2;17392:10;17388:19;17385:1;17381:27;17375:4;17371:38;17440:4;17428:10;17425:20;17422:47;;;-1:-1:-1;17463:4:19;17422:47;17518:2;17513:3;17509:12;17506:1;17502:20;17496:4;17492:31;17482:41;;17573:82;17591:2;17584:5;17581:13;17573:82;;;17636:17;;;17617:1;17606:13;17573:82;;17847:1206;17971:18;17966:3;17963:27;17960:53;;;17993:18;;:::i;:::-;18022:94;18112:3;18072:38;18104:4;18098:11;18072:38;:::i;:::-;18066:4;18022:94;:::i;:::-;18142:1;18167:2;18162:3;18159:11;18184:1;18179:616;;;;18839:1;18856:3;18853:93;;;-1:-1:-1;18912:19:19;;;18899:33;18853:93;-1:-1:-1;;17804:1:19;17800:11;;;17796:24;17792:29;17782:40;17828:1;17824:11;;;17779:57;18959:78;;18152:895;;18179:616;17073:1;17066:14;;;17110:4;17097:18;;-1:-1:-1;;18215:17:19;;;18316:9;18338:229;18352:7;18349:1;18346:14;18338:229;;;18441:19;;;18428:33;18413:49;;18548:4;18533:20;;;;18501:1;18489:14;;;;18368:12;18338:229;;;18342:3;18595;18586:7;18583:16;18580:159;;;18719:1;18715:6;18709:3;18703;18700:1;18696:11;18692:21;18688:34;18684:39;18671:9;18666:3;18662:19;18649:33;18645:79;18637:6;18630:95;18580:159;;;18782:1;18776:3;18773:1;18769:11;18765:19;18759:4;18752:33;18152:895;;17847:1206;;;:::o;19821:176::-;19866:11;19918:3;19905:17;19931:31;19956:5;19931:31;:::i;20002:195::-;20106:11;;-1:-1:-1;;;;;;20102:54:19;-1:-1:-1;;;;;20158:31:19;;;;20099:91;;;;20086:105;;20002:195::o;20202:759::-;20359:5;20346:19;20340:4;20333:33;20420:2;20413:5;20409:14;20396:28;20392:1;20386:4;20382:12;20375:50;20479:2;20472:5;20468:14;20455:28;20451:1;20445:4;20441:12;20434:50;20538:2;20531:5;20527:14;20514:28;20510:1;20504:4;20500:12;20493:50;20597:3;20590:5;20586:15;20573:29;20569:1;20563:4;20559:12;20552:51;20657:3;20650:5;20646:15;20633:29;20629:1;20623:4;20619:12;20612:51;20717:3;20710:5;20706:15;20693:29;20689:1;20683:4;20679:12;20672:51;20732:107;20794:44;20833:3;20826:5;20822:15;20794:44;:::i;:::-;20790:1;20784:4;20780:12;20732:107;:::i;:::-;20848;20910:44;20949:3;20942:5;20938:15;20910:44;:::i;:::-;20906:1;20900:4;20896:12;20848:107;:::i;25707:125::-;25747:4;25775:1;25772;25769:8;25766:34;;;25780:18;;:::i;:::-;-1:-1:-1;25817:9:19;;25707:125::o;26887:414::-;27089:2;27071:21;;;27128:2;27108:18;;;27101:30;27167:34;27162:2;27147:18;;27140:62;-1:-1:-1;;;27233:2:19;27218:18;;27211:48;27291:3;27276:19;;26887:414::o;27306:407::-;27508:2;27490:21;;;27547:2;27527:18;;;27520:30;27586:34;27581:2;27566:18;;27559:62;-1:-1:-1;;;27652:2:19;27637:18;;27630:41;27703:3;27688:19;;27306:407::o;27718:470::-;27897:3;27935:6;27929:13;27951:53;27997:6;27992:3;27985:4;27977:6;27973:17;27951:53;:::i;:::-;28067:13;;28026:16;;;;28089:57;28067:13;28026:16;28123:4;28111:17;;28089:57;:::i;:::-;28162:20;;27718:470;-1:-1:-1;;;;27718:470:19:o;28608:1352::-;28734:3;28728:10;28761:18;28753:6;28750:30;28747:56;;;28783:18;;:::i;:::-;28812:97;28902:6;28862:38;28894:4;28888:11;28862:38;:::i;:::-;28856:4;28812:97;:::i;:::-;28964:4;;29028:2;29017:14;;29045:1;29040:663;;;;29747:1;29764:6;29761:89;;;-1:-1:-1;29816:19:19;;;29810:26;29761:89;-1:-1:-1;;17804:1:19;17800:11;;;17796:24;17792:29;17782:40;17828:1;17824:11;;;17779:57;29863:81;;29010:944;;29040:663;17073:1;17066:14;;;17110:4;17097:18;;-1:-1:-1;;29076:20:19;;;29194:236;29208:7;29205:1;29202:14;29194:236;;;29297:19;;;29291:26;29276:42;;29389:27;;;;29357:1;29345:14;;;;29224:19;;29194:236;;;29198:3;29458:6;29449:7;29446:19;29443:201;;;29519:19;;;29513:26;-1:-1:-1;;29602:1:19;29598:14;;;29614:3;29594:24;29590:37;29586:42;29571:58;29556:74;;29443:201;-1:-1:-1;;;;;29690:1:19;29674:14;;;29670:22;29657:36;;-1:-1:-1;28608:1352:19:o;29965:786::-;30376:25;30371:3;30364:38;30346:3;30431:6;30425:13;30447:62;30502:6;30497:2;30492:3;30488:12;30481:4;30473:6;30469:17;30447:62;:::i;:::-;-1:-1:-1;;;30568:2:19;30528:16;;;30560:11;;;30553:40;30618:13;;30640:63;30618:13;30689:2;30681:11;;30674:4;30662:17;;30640:63;:::i;:::-;30723:17;30742:2;30719:26;;29965:786;-1:-1:-1;;;;29965:786:19:o;31105:489::-;-1:-1:-1;;;;;31374:15:19;;;31356:34;;31426:15;;31421:2;31406:18;;31399:43;31473:2;31458:18;;31451:34;;;31521:3;31516:2;31501:18;;31494:31;;;31299:4;;31542:46;;31568:19;;31560:6;31542:46;:::i;:::-;31534:54;31105:489;-1:-1:-1;;;;;;31105:489:19:o;31599:249::-;31668:6;31721:2;31709:9;31700:7;31696:23;31692:32;31689:52;;;31737:1;31734;31727:12;31689:52;31769:9;31763:16;31788:30;31812:5;31788:30;:::i;31853:136::-;31892:3;31920:5;31910:39;;31929:18;;:::i;:::-;-1:-1:-1;;;31965:18:19;;31853:136::o;33073:127::-;33134:10;33129:3;33125:20;33122:1;33115:31;33165:4;33162:1;33155:15;33189:4;33186:1;33179:15;33205:120;33245:1;33271;33261:35;;33276:18;;:::i;:::-;-1:-1:-1;33310:9:19;;33205:120::o;33330:112::-;33362:1;33388;33378:35;;33393:18;;:::i;:::-;-1:-1:-1;33427:9:19;;33330:112::o;33447:127::-;33508:10;33503:3;33499:20;33496:1;33489:31;33539:4;33536:1;33529:15;33563:4;33560:1;33553:15
Swarm Source
ipfs://f3ef5a4fd68f83817f81048ec89793c1bf47f7596bcb6faab7ce86d3a73e423a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.