NFTs in this token contract that are listed below the threshold price will be burned. The burn schedule can be seen on the official website and on Twitter.
ERC-721
NFT
Overview
Max Total Supply
3,163 Kai
Holders
1,489
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 KaiLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KaijuKongz
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-18 */ pragma solidity ^0.8.9; // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @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; } // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.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 AccessControl is Context, IAccessControl, ERC165 { 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, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).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 `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 ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.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. */ 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. */ 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`. */ 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. * * [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. */ 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. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Creator: Chiru Labs /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than the 2**64 - 1 (max value of uint64) of supply */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variables (e.g. number preSale minted). // Please pack into 64 bits. uint64 aux; } uint256 internal currentIndex = 0; uint256 internal totalBurned = 0; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Skips the zero index. * This method must be called before any mints (e.g. in the consturctor). */ function _initOneIndexed() internal { require(!_exists(0), "ERC721A: 0 index already occupied."); currentIndex = 1; totalBurned = 1; _ownerships[0].burned = true; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex - totalBurned; } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenByIndex(uint256 index) public view override returns (uint256) { uint256 numMintedSoFar = currentIndex; uint256 tokenIdsIdx = 0; for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (!ownership.burned) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } require(false, 'ERC721A: global index out of bounds'); return 0; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = currentIndex; uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (ownership.burned) { currOwnershipAddr = address(0); } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert('ERC721A: unable to get token of owner by index'); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number burned query for the zero address'); return uint256(_addressData[owner].numberBurned); } function _getAux(address owner) internal view returns (uint64) { require(owner != address(0), 'ERC721A: aux query for the zero address'); return _addressData[owner].aux; } function _setAux(address owner, uint64 aux) internal { require(owner != address(0), 'ERC721A: aux query for the zero address'); _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); for (uint256 curr = tokenId; ; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0) && !ownership.burned) { return ownership; } } revert('ERC721A: unable to determine the owner of token'); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 { _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 { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), 'ERC721A: token already minted'); require(quantity > 0, 'ERC721A: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; } _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; } // Keep track of who burnt the token, and when is it burned. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); totalBurned++; } /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: caller is not owner nor approved'); _burn(tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract KaijuKongz is ERC721A, Ownable, AccessControlEnumerable { uint256 constant public legendarySupply = 9; uint256 constant public teamSupply = 30; uint256 public maxTotalSupply = 3333; uint256 public pricePerToken = 0.065 ether; uint256 public tokensBurned = 0; bool public promoTokensMinted = false; bool public tradeActive = false; enum SaleState{ CLOSED, PRIVATE, PUBLIC } SaleState public saleState = SaleState.CLOSED; bytes32 private merkleRootGroup1; bytes32 private merkleRootGroup2; uint8 private maxTokenWlGroup1 = 1; uint8 private maxTokenWlGroup2 = 2; uint8 private maxTokenPublic = 5; uint256 private disableBurnTime = 518400; mapping(address => uint256) presaleMinted; mapping(address => uint256) publicMinted; string _baseTokenURI; address _burnerAddress; uint256 deployedTime; constructor() ERC721A("KaijuKongz", "Kai") { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); deployedTime = block.timestamp; } function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) public override { require(tradeActive, "Trade is not active"); super.safeTransferFrom(_from, _to, _tokenId, data); } function safeTransferFrom(address _from, address _to, uint256 _tokenId) public override { require(tradeActive, "Trade is not active"); super.safeTransferFrom(_from, _to, _tokenId); } function transferFrom(address _from, address _to, uint256 _tokenId) public override { require(tradeActive, "Trade is not active"); super.transferFrom(_from, _to, _tokenId); } function setTradeState(bool tradeState) public { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set trade state"); tradeActive = tradeState; } function setPrice(uint256 newPrice) public { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set price"); pricePerToken = newPrice; } function withdraw() public onlyOwner { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot withdraw"); payable(owner()).transfer(address(this).balance); } function setSaleState(SaleState newState) public { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot alter sale state"); saleState = newState; } function setMerkleRoot(bytes32 newRootGroup1, bytes32 newRootGroup2) public { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set merkle root"); merkleRootGroup1 = newRootGroup1; merkleRootGroup2 = newRootGroup2; } function promoMint() public onlyOwner { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot mint team tokens"); require(!promoTokensMinted, "Promo tokens have already been minted"); _safeMint(owner(), legendarySupply + teamSupply); promoTokensMinted = true; } function presale(uint256 amount, bytes32[] calldata proof) public payable { require (saleState == SaleState.PRIVATE, "Sale state should be private"); require(totalSupply() < maxTotalSupply, "Max supply reached"); require(promoTokensMinted, "Promo tokens should be minted in advance"); bool isValidGroup1 = MerkleProof.verify(proof, merkleRootGroup1, keccak256(abi.encodePacked(msg.sender))); bool isValidGroup2 = MerkleProof.verify(proof, merkleRootGroup2, keccak256(abi.encodePacked(msg.sender))); require(isValidGroup1 || isValidGroup2, "You are not in the valid whitelist"); uint256 amountAllowed = isValidGroup1 ? maxTokenWlGroup1 : maxTokenWlGroup2; require(amount + presaleMinted[msg.sender] <= amountAllowed, "Your token amount reached out max"); require(presaleMinted[msg.sender] < amountAllowed, "You've already minted all"); uint256 amountToPay = amount * pricePerToken; require(amountToPay <= msg.value, "Provided not enough Ether for purchase"); presaleMinted[msg.sender] += amount; _safeMint(_msgSender(), amount); } function publicsale(uint256 amount) public payable { require (saleState == SaleState.PUBLIC, "Sale state should be public"); require(promoTokensMinted, "Promo tokens should be minted in advance"); require(totalSupply() < maxTotalSupply, "Max supply reached"); require(amount + publicMinted[msg.sender] <= maxTokenPublic, "Your token amount reached out max"); uint256 amountToPay = amount * pricePerToken; require(amountToPay <= msg.value, "Provided not enough Ether for purchase"); publicMinted[msg.sender] += amount; _safeMint(_msgSender(), amount); } function burnMany(uint256[] calldata tokenIds) public { require(_msgSender() == _burnerAddress, "Only burner can burn tokens"); uint256 nowTime = block.timestamp; require(nowTime - deployedTime <= disableBurnTime, "Burn is available only for 6 days"); for (uint256 i; i < tokenIds.length; i++) { _burn(tokenIds[i]); } maxTotalSupply -= tokenIds.length; tokensBurned += tokenIds.length; } function setBurnerAddress(address burnerAddress) public { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Caller cannot set burn address"); _burnerAddress = burnerAddress; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, AccessControlEnumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legendarySupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"promoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"promoTokensMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicsale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"_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":[],"name":"saleState","outputs":[{"internalType":"enum KaijuKongz.SaleState","name":"","type":"uint8"}],"stateMutability":"view","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":[{"internalType":"address","name":"burnerAddress","type":"address"}],"name":"setBurnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newRootGroup1","type":"bytes32"},{"internalType":"bytes32","name":"newRootGroup2","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum KaijuKongz.SaleState","name":"newState","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"tradeState","type":"bool"}],"name":"setTradeState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"tokensBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260008080556001819055610d05600b5566e6ed27d6668000600c55600d55600e805462ffffff1990811690915560118054909116620502011790556207e9006012553480156200005357600080fd5b50604080518082018252600a81526925b0b4b53aa5b7b733bd60b11b6020808301918252835180850190945260038452624b616960e81b908401528151919291620000a191600291620002aa565b508051620000b7906003906020840190620002aa565b505050620000d4620000ce620000eb60201b60201c565b620000ef565b620000e160003362000141565b426017556200038d565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200014d828262000151565b5050565b6200016882826200019460201b62001d1b1760201c565b6000828152600a602090815260409091206200018f91839062001da162000238821b17901c565b505050565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff166200014d5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001f43390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006200024f836001600160a01b03841662000258565b90505b92915050565b6000818152600183016020526040812054620002a15750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000252565b50600062000252565b828054620002b89062000350565b90600052602060002090601f016020900481019282620002dc576000855562000327565b82601f10620002f757805160ff191683800117855562000327565b8280016001018555821562000327579182015b82811115620003275782518255916020019190600101906200030a565b506200033592915062000339565b5090565b5b808211156200033557600081556001016200033a565b600181811c908216806200036557607f821691505b602082108114156200038757634e487b7160e01b600052602260045260246000fd5b50919050565b613864806200039d6000396000f3fe6080604052600436106102885760003560e01c80636fbf3e8e1161015a578063a22cb465116100c1578063cf3234601161007a578063cf32346014610787578063d547741f146107a7578063e7873b58146107c7578063e985e9c5146107dd578063f2fde38b14610826578063f6252c5a1461084657600080fd5b8063a22cb465146106df578063b88d4fde146106ff578063c13bd95c1461071f578063c87b56dd14610732578063ca15c87314610752578063cb82b4be1461077257600080fd5b80639010d07c116101135780639010d07c1461063557806391b7f5ed1461065557806391d148541461067557806395d89b41146106955780639df806d6146106aa578063a217fddf146106ca57600080fd5b80636fbf3e8e1461059757806370a08231146105ac578063715018a6146105cc57806375edcbe0146105e15780637b1b1de6146106015780638da5cb5b1461061757600080fd5b806336568abe116101fe57806355f804b3116101b757806355f804b3146104d15780635882128d146104f15780635a67de07146105105780635d8cc32c14610530578063603f4d521461054a5780636352211e1461057757600080fd5b806336568abe1461041c5780633ccfd60b1461043c5780633f780f001461045157806342842e0e1461047157806342966c68146104915780634f6ccce7146104b157600080fd5b806323b872dd1161025057806323b872dd14610361578063248a9ca3146103815780632ab4d052146103b15780632cfac6ec146103c75780632f2ff15d146103dc5780632f745c59146103fc57600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806318160ddd1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004612fae565b610859565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761086a565b6040516102b99190613023565b3480156102f057600080fd5b506103046102ff366004613036565b6108fc565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c61033736600461306b565b61098a565b005b34801561034a57600080fd5b50610353610aa2565b6040519081526020016102b9565b34801561036d57600080fd5b5061033c61037c366004613095565b610ab9565b34801561038d57600080fd5b5061035361039c366004613036565b60009081526009602052604090206001015490565b3480156103bd57600080fd5b50610353600b5481565b3480156103d357600080fd5b50610353601e81565b3480156103e857600080fd5b5061033c6103f73660046130d1565b610aeb565b34801561040857600080fd5b5061035361041736600461306b565b610b11565b34801561042857600080fd5b5061033c6104373660046130d1565b610ca0565b34801561044857600080fd5b5061033c610d1e565b34801561045d57600080fd5b5061033c61046c36600461310d565b610dcd565b34801561047d57600080fd5b5061033c61048c366004613095565b610e37565b34801561049d57600080fd5b5061033c6104ac366004613036565b610e69565b3480156104bd57600080fd5b506103536104cc366004613036565b610f27565b3480156104dd57600080fd5b5061033c6104ec36600461313e565b611014565b3480156104fd57600080fd5b50600e546102ad90610100900460ff1681565b34801561051c57600080fd5b5061033c61052b3660046131ee565b611051565b34801561053c57600080fd5b50600e546102ad9060ff1681565b34801561055657600080fd5b50600e5461056a9062010000900460ff1681565b6040516102b99190613225565b34801561058357600080fd5b50610304610592366004613036565b6110d3565b3480156105a357600080fd5b50610353600981565b3480156105b857600080fd5b506103536105c736600461324d565b6110e5565b3480156105d857600080fd5b5061033c611176565b3480156105ed57600080fd5b5061033c6105fc366004613268565b6111ac565b34801561060d57600080fd5b50610353600c5481565b34801561062357600080fd5b506008546001600160a01b0316610304565b34801561064157600080fd5b50610304610650366004613268565b611207565b34801561066157600080fd5b5061033c610670366004613036565b611226565b34801561068157600080fd5b506102ad6106903660046130d1565b611275565b3480156106a157600080fd5b506102d76112a0565b3480156106b657600080fd5b5061033c6106c536600461324d565b6112af565b3480156106d657600080fd5b50610353600081565b3480156106eb57600080fd5b5061033c6106fa36600461328a565b611328565b34801561070b57600080fd5b5061033c61071a3660046132b4565b6113ed565b61033c61072d366004613399565b61145d565b34801561073e57600080fd5b506102d761074d366004613036565b61179d565b34801561075e57600080fd5b5061035361076d366004613036565b611867565b34801561077e57600080fd5b5061033c61187e565b34801561079357600080fd5b5061033c6107a23660046133e4565b611995565b3480156107b357600080fd5b5061033c6107c23660046130d1565b611adb565b3480156107d357600080fd5b50610353600d5481565b3480156107e957600080fd5b506102ad6107f8366004613425565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561083257600080fd5b5061033c61084136600461324d565b611b01565b61033c610854366004613036565b611b99565b600061086482611db6565b92915050565b6060600280546108799061344f565b80601f01602080910402602001604051908101604052809291908181526020018280546108a59061344f565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b600061090782611ddb565b61096e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610995826110d3565b9050806001600160a01b0316836001600160a01b03161415610a045760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610965565b336001600160a01b0382161480610a205750610a2081336107f8565b610a925760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610965565b610a9d838383611e06565b505050565b6000600154600054610ab491906134a0565b905090565b600e54610100900460ff16610ae05760405162461bcd60e51b8152600401610965906134b7565b610a9d838383611e62565b600082815260096020526040902060010154610b078133611e6d565b610a9d8383611ed1565b6000610b1c836110e5565b8210610b755760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610965565b600080549080805b83811015610c4057600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215610be257805192505b806040015115610bf157600092505b876001600160a01b0316836001600160a01b03161415610c2d5786841415610c1f5750935061086492505050565b83610c29816134e4565b9450505b5080610c38816134e4565b915050610b7d565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610965565b6001600160a01b0381163314610d105760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610965565b610d1a8282611ef3565b5050565b6008546001600160a01b03163314610d485760405162461bcd60e51b8152600401610965906134ff565b610d53600033611275565b610d915760405162461bcd60e51b815260206004820152600f60248201526e43616e6e6f7420776974686472617760881b6044820152606401610965565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610dca573d6000803e3d6000fd5b50565b610dd8600033611275565b610e1d5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742073657420747261646520737461746560501b6044820152606401610965565b600e80549115156101000261ff0019909216919091179055565b600e54610100900460ff16610e5e5760405162461bcd60e51b8152600401610965906134b7565b610a9d838383611f15565b6000610e7482611f30565b80519091506000906001600160a01b0316336001600160a01b03161480610eab575033610ea0846108fc565b6001600160a01b0316145b80610ebd57508151610ebd90336107f8565b905080610f1e5760405162461bcd60e51b815260206004820152602960248201527f455243373231413a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610965565b610a9d83612039565b6000805481805b82811015610fbf57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290610fac5785831415610f9e5750949350505050565b82610fa8816134e4565b9350505b5080610fb7816134e4565b915050610f2e565b5060405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610965565b6008546001600160a01b0316331461103e5760405162461bcd60e51b8152600401610965906134ff565b8051610d1a906015906020840190612eff565b61105c600033611275565b6110a85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420616c7465722073616c652073746174650000000000000000006044820152606401610965565b600e805482919062ff00001916620100008360028111156110cb576110cb61320f565b021790555050565b60006110de82611f30565b5192915050565b60006001600160a01b0382166111515760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610965565b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111a05760405162461bcd60e51b8152600401610965906134ff565b6111aa60006121e3565b565b6111b7600033611275565b6111fc5760405162461bcd60e51b815260206004820152601660248201527510d85b9b9bdd081cd95d081b595c9adb19481c9bdbdd60521b6044820152606401610965565b600f91909155601055565b6000828152600a6020526040812061121f9083612235565b9392505050565b611231600033611275565b6112705760405162461bcd60e51b815260206004820152601060248201526f43616e6e6f742073657420707269636560801b6044820152606401610965565b600c55565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600380546108799061344f565b6112ba600033611275565b6113065760405162461bcd60e51b815260206004820152601e60248201527f43616c6c65722063616e6e6f7420736574206275726e206164647265737300006044820152606401610965565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163314156113815760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610965565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e54610100900460ff166114145760405162461bcd60e51b8152600401610965906134b7565b61145685858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061224192505050565b5050505050565b6001600e5462010000900460ff16600281111561147c5761147c61320f565b146114c95760405162461bcd60e51b815260206004820152601c60248201527f53616c652073746174652073686f756c642062652070726976617465000000006044820152606401610965565b600b546114d4610aa2565b106115165760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610965565b600e5460ff166115385760405162461bcd60e51b815260040161096590613534565b60006115b083838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b6040516020818303038152906040528051906020012061227a565b90506000611613848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050611595565b9050818061161e5750805b6116755760405162461bcd60e51b815260206004820152602260248201527f596f7520617265206e6f7420696e207468652076616c69642077686974656c696044820152611cdd60f21b6064820152608401610965565b60008261168c57601154610100900460ff16611693565b60115460ff165b3360009081526013602052604090205460ff91909116915081906116b7908861357c565b11156116d55760405162461bcd60e51b815260040161096590613594565b3360009081526013602052604090205481116117335760405162461bcd60e51b815260206004820152601960248201527f596f7527766520616c7265616479206d696e74656420616c6c000000000000006044820152606401610965565b6000600c548761174391906135d5565b9050348111156117655760405162461bcd60e51b8152600401610965906135f4565b336000908152601360205260408120805489929061178490849061357c565b9091555061179490503388612290565b50505050505050565b60606117a882611ddb565b61180c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610965565b60006118166122aa565b90506000815111611836576040518060200160405280600081525061121f565b80611840846122b9565b60405160200161185192919061363a565b6040516020818303038152906040529392505050565b6000818152600a60205260408120610864906123be565b6008546001600160a01b031633146118a85760405162461bcd60e51b8152600401610965906134ff565b6118b3600033611275565b6118ff5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e74207465616d20746f6b656e730000000000000000006044820152606401610965565b600e5460ff16156119605760405162461bcd60e51b815260206004820152602560248201527f50726f6d6f20746f6b656e73206861766520616c7265616479206265656e206d6044820152641a5b9d195960da1b6064820152608401610965565b6119866119756008546001600160a01b031690565b611981601e600961357c565b612290565b600e805460ff19166001179055565b6016546001600160a01b0316336001600160a01b0316146119f85760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206275726e65722063616e206275726e20746f6b656e7300000000006044820152606401610965565b601254601754429190611a0b90836134a0565b1115611a635760405162461bcd60e51b815260206004820152602160248201527f4275726e20697320617661696c61626c65206f6e6c7920666f722036206461796044820152607360f81b6064820152608401610965565b60005b82811015611aa157611a8f848483818110611a8357611a83613669565b90506020020135612039565b80611a99816134e4565b915050611a66565b5082829050600b6000828254611ab791906134a0565b9091555050600d8054839190600090611ad190849061357c565b9091555050505050565b600082815260096020526040902060010154611af78133611e6d565b610a9d8383611ef3565b6008546001600160a01b03163314611b2b5760405162461bcd60e51b8152600401610965906134ff565b6001600160a01b038116611b905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610965565b610dca816121e3565b6002600e5462010000900460ff166002811115611bb857611bb861320f565b14611c055760405162461bcd60e51b815260206004820152601b60248201527f53616c652073746174652073686f756c64206265207075626c696300000000006044820152606401610965565b600e5460ff16611c275760405162461bcd60e51b815260040161096590613534565b600b54611c32610aa2565b10611c745760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610965565b601154336000908152601460205260409020546201000090910460ff1690611c9c908361357c565b1115611cba5760405162461bcd60e51b815260040161096590613594565b6000600c5482611cca91906135d5565b905034811115611cec5760405162461bcd60e51b8152600401610965906135f4565b3360009081526014602052604081208054849290611d0b90849061357c565b90915550610d1a90503383612290565b611d258282611275565b610d1a5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611d5d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061121f836001600160a01b0384166123c8565b60006001600160e01b03198216635a05180f60e01b1480610864575061086482612417565b6000805482108015610864575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a9d83838361243c565b611e778282611275565b610d1a57611e8f816001600160a01b03166014612734565b611e9a836020612734565b604051602001611eab92919061367f565b60408051601f198184030181529082905262461bcd60e51b825261096591600401613023565b611edb8282611d1b565b6000828152600a60205260409020610a9d9082611da1565b611efd82826128cf565b6000828152600a60205260409020610a9d9082612936565b610a9d838383604051806020016040528060008152506113ed565b6040805160608101825260008082526020820181905291810191909152611f5682611ddb565b611fb55760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610965565b815b600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521580159061201a57508060400151155b15612026579392505050565b5080612031816136f4565b915050611fb7565b600061204482611f30565b90506120566000838360000151611e06565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094529184208054600160e01b949096166001600160e01b031990961695909517600160a01b42909216919091021760ff60e01b1916919091179092559061211a90849061357c565b6000818152600460205260409020549091506001600160a01b031661218e5761214281611ddb565b1561218e57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b815160405184916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4600180549060006121d9836134e4565b9190505550505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061121f838361294b565b61224c84848461243c565b61225884848484612975565b6122745760405162461bcd60e51b81526004016109659061370b565b50505050565b6000826122878584612a82565b14949350505050565b610d1a828260405180602001604052806000815250612af6565b6060601580546108799061344f565b6060816122dd5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561230757806122f1816134e4565b91506123009050600a83613774565b91506122e1565b6000816001600160401b0381111561232157612321613128565b6040519080825280601f01601f19166020018201604052801561234b576020820181803683370190505b5090505b84156123b6576123606001836134a0565b915061236d600a86613788565b61237890603061357c565b60f81b81838151811061238d5761238d613669565b60200101906001600160f81b031916908160001a9053506123af600a86613774565b945061234f565b949350505050565b6000610864825490565b600081815260018301602052604081205461240f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610864565b506000610864565b60006001600160e01b03198216637965db0b60e01b1480610864575061086482612b03565b600061244782611f30565b80519091506000906001600160a01b0316336001600160a01b0316148061247e575033612473846108fc565b6001600160a01b0316145b806124905750815161249090336107f8565b9050806124fa5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610965565b846001600160a01b031682600001516001600160a01b03161461256e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610965565b6001600160a01b0384166125d25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610965565b6125e26000848460000151611e06565b6001600160a01b03808616600090815260056020908152604080832080546000196001600160401b0380831691909101811667ffffffffffffffff1992831617909255948916808552828520805480841660019081018516919098161790558885526004909352908320805442909216600160a01b026001600160e01b03199092169092171790559061267690859061357c565b6000818152600460205260409020549091506001600160a01b03166126ea5761269e81611ddb565b156126ea57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b606060006127438360026135d5565b61274e90600261357c565b6001600160401b0381111561276557612765613128565b6040519080825280601f01601f19166020018201604052801561278f576020820181803683370190505b509050600360fc1b816000815181106127aa576127aa613669565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106127d9576127d9613669565b60200101906001600160f81b031916908160001a90535060006127fd8460026135d5565b61280890600161357c565b90505b6001811115612880576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061283c5761283c613669565b1a60f81b82828151811061285257612852613669565b60200101906001600160f81b031916908160001a90535060049490941c93612879816136f4565b905061280b565b50831561121f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610965565b6128d98282611275565b15610d1a5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061121f836001600160a01b038416612b6e565b600082600001828154811061296257612962613669565b9060005260206000200154905092915050565b60006001600160a01b0384163b15612a7757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129b990339089908890889060040161379c565b602060405180830381600087803b1580156129d357600080fd5b505af1925050508015612a03575060408051601f3d908101601f19168201909252612a00918101906137d9565b60015b612a5d573d808015612a31576040519150601f19603f3d011682016040523d82523d6000602084013e612a36565b606091505b508051612a555760405162461bcd60e51b81526004016109659061370b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506123b6565b506001949350505050565b600081815b8451811015612aee576000858281518110612aa457612aa4613669565b60200260200101519050808311612aca5760008381526020829052604090209250612adb565b600081815260208490526040902092505b5080612ae6816134e4565b915050612a87565b509392505050565b610a9d8383836001612c61565b60006001600160e01b031982166380ac58cd60e01b1480612b3457506001600160e01b03198216635b5e139f60e01b145b80612b4f57506001600160e01b0319821663780e9d6360e01b145b8061086457506301ffc9a760e01b6001600160e01b0319831614610864565b60008181526001830160205260408120548015612c57576000612b926001836134a0565b8554909150600090612ba6906001906134a0565b9050818114612c0b576000866000018281548110612bc657612bc6613669565b9060005260206000200154905080876000018481548110612be957612be9613669565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612c1c57612c1c6137f6565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610864565b6000915050610864565b6000546001600160a01b038516612cc45760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610965565b612ccd81611ddb565b15612d1a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610965565b60008411612d7b5760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610965565b6001600160a01b03851660009081526005602052604081208054869290612dac9084906001600160401b031661380c565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b038716600090815260056020526040902080548793509091600891612e069185916801000000000000000090041661380c565b82546001600160401b039182166101009390930a9283029282021916919091179091556000838152600460205260408120805442909316600160a01b026001600160e01b03199093166001600160a01b038a1617929092179091558291505b85811015612ef45760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612ed457612eb86000888488612975565b612ed45760405162461bcd60e51b81526004016109659061370b565b81612ede816134e4565b9250508080612eec906134e4565b915050612e65565b50600081905561272c565b828054612f0b9061344f565b90600052602060002090601f016020900481019282612f2d5760008555612f73565b82601f10612f4657805160ff1916838001178555612f73565b82800160010185558215612f73579182015b82811115612f73578251825591602001919060010190612f58565b50612f7f929150612f83565b5090565b5b80821115612f7f5760008155600101612f84565b6001600160e01b031981168114610dca57600080fd5b600060208284031215612fc057600080fd5b813561121f81612f98565b60005b83811015612fe6578181015183820152602001612fce565b838111156122745750506000910152565b6000815180845261300f816020860160208601612fcb565b601f01601f19169290920160200192915050565b60208152600061121f6020830184612ff7565b60006020828403121561304857600080fd5b5035919050565b80356001600160a01b038116811461306657600080fd5b919050565b6000806040838503121561307e57600080fd5b6130878361304f565b946020939093013593505050565b6000806000606084860312156130aa57600080fd5b6130b38461304f565b92506130c16020850161304f565b9150604084013590509250925092565b600080604083850312156130e457600080fd5b823591506130f46020840161304f565b90509250929050565b8035801515811461306657600080fd5b60006020828403121561311f57600080fd5b61121f826130fd565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561315057600080fd5b81356001600160401b038082111561316757600080fd5b818401915084601f83011261317b57600080fd5b81358181111561318d5761318d613128565b604051601f8201601f19908116603f011681019083821181831017156131b5576131b5613128565b816040528281528760208487010111156131ce57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561320057600080fd5b81356003811061121f57600080fd5b634e487b7160e01b600052602160045260246000fd5b602081016003831061324757634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561325f57600080fd5b61121f8261304f565b6000806040838503121561327b57600080fd5b50508035926020909101359150565b6000806040838503121561329d57600080fd5b6132a68361304f565b91506130f4602084016130fd565b6000806000806000608086880312156132cc57600080fd5b6132d58661304f565b94506132e36020870161304f565b93506040860135925060608601356001600160401b038082111561330657600080fd5b818801915088601f83011261331a57600080fd5b81358181111561332957600080fd5b89602082850101111561333b57600080fd5b9699959850939650602001949392505050565b60008083601f84011261336057600080fd5b5081356001600160401b0381111561337757600080fd5b6020830191508360208260051b850101111561339257600080fd5b9250929050565b6000806000604084860312156133ae57600080fd5b8335925060208401356001600160401b038111156133cb57600080fd5b6133d78682870161334e565b9497909650939450505050565b600080602083850312156133f757600080fd5b82356001600160401b0381111561340d57600080fd5b6134198582860161334e565b90969095509350505050565b6000806040838503121561343857600080fd5b6134418361304f565b91506130f46020840161304f565b600181811c9082168061346357607f821691505b6020821081141561348457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156134b2576134b261348a565b500390565b6020808252601390820152725472616465206973206e6f742061637469766560681b604082015260600190565b60006000198214156134f8576134f861348a565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f50726f6d6f20746f6b656e732073686f756c64206265206d696e74656420696e60408201526720616476616e636560c01b606082015260800190565b6000821982111561358f5761358f61348a565b500190565b60208082526021908201527f596f757220746f6b656e20616d6f756e742072656163686564206f7574206d616040820152600f60fb1b606082015260800190565b60008160001904831182151516156135ef576135ef61348a565b500290565b60208082526026908201527f50726f7669646564206e6f7420656e6f75676820457468657220666f7220707560408201526572636861736560d01b606082015260800190565b6000835161364c818460208801612fcb565b835190830190613660818360208801612fcb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516136b7816017850160208801612fcb565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516136e8816028840160208801612fcb565b01602801949350505050565b6000816137035761370361348a565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826137835761378361375e565b500490565b6000826137975761379761375e565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137cf90830184612ff7565b9695505050505050565b6000602082840312156137eb57600080fd5b815161121f81612f98565b634e487b7160e01b600052603160045260246000fd5b60006001600160401b038083168185168083038211156136605761366061348a56fea2646970667358221220fa5aee91f5733441a3fd59e62fd3ecfc7d19ee5a896a39400d6a83499cb199d564736f6c63430008090033
Deployed Bytecode
0x6080604052600436106102885760003560e01c80636fbf3e8e1161015a578063a22cb465116100c1578063cf3234601161007a578063cf32346014610787578063d547741f146107a7578063e7873b58146107c7578063e985e9c5146107dd578063f2fde38b14610826578063f6252c5a1461084657600080fd5b8063a22cb465146106df578063b88d4fde146106ff578063c13bd95c1461071f578063c87b56dd14610732578063ca15c87314610752578063cb82b4be1461077257600080fd5b80639010d07c116101135780639010d07c1461063557806391b7f5ed1461065557806391d148541461067557806395d89b41146106955780639df806d6146106aa578063a217fddf146106ca57600080fd5b80636fbf3e8e1461059757806370a08231146105ac578063715018a6146105cc57806375edcbe0146105e15780637b1b1de6146106015780638da5cb5b1461061757600080fd5b806336568abe116101fe57806355f804b3116101b757806355f804b3146104d15780635882128d146104f15780635a67de07146105105780635d8cc32c14610530578063603f4d521461054a5780636352211e1461057757600080fd5b806336568abe1461041c5780633ccfd60b1461043c5780633f780f001461045157806342842e0e1461047157806342966c68146104915780634f6ccce7146104b157600080fd5b806323b872dd1161025057806323b872dd14610361578063248a9ca3146103815780632ab4d052146103b15780632cfac6ec146103c75780632f2ff15d146103dc5780632f745c59146103fc57600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806318160ddd1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004612fae565b610859565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761086a565b6040516102b99190613023565b3480156102f057600080fd5b506103046102ff366004613036565b6108fc565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c61033736600461306b565b61098a565b005b34801561034a57600080fd5b50610353610aa2565b6040519081526020016102b9565b34801561036d57600080fd5b5061033c61037c366004613095565b610ab9565b34801561038d57600080fd5b5061035361039c366004613036565b60009081526009602052604090206001015490565b3480156103bd57600080fd5b50610353600b5481565b3480156103d357600080fd5b50610353601e81565b3480156103e857600080fd5b5061033c6103f73660046130d1565b610aeb565b34801561040857600080fd5b5061035361041736600461306b565b610b11565b34801561042857600080fd5b5061033c6104373660046130d1565b610ca0565b34801561044857600080fd5b5061033c610d1e565b34801561045d57600080fd5b5061033c61046c36600461310d565b610dcd565b34801561047d57600080fd5b5061033c61048c366004613095565b610e37565b34801561049d57600080fd5b5061033c6104ac366004613036565b610e69565b3480156104bd57600080fd5b506103536104cc366004613036565b610f27565b3480156104dd57600080fd5b5061033c6104ec36600461313e565b611014565b3480156104fd57600080fd5b50600e546102ad90610100900460ff1681565b34801561051c57600080fd5b5061033c61052b3660046131ee565b611051565b34801561053c57600080fd5b50600e546102ad9060ff1681565b34801561055657600080fd5b50600e5461056a9062010000900460ff1681565b6040516102b99190613225565b34801561058357600080fd5b50610304610592366004613036565b6110d3565b3480156105a357600080fd5b50610353600981565b3480156105b857600080fd5b506103536105c736600461324d565b6110e5565b3480156105d857600080fd5b5061033c611176565b3480156105ed57600080fd5b5061033c6105fc366004613268565b6111ac565b34801561060d57600080fd5b50610353600c5481565b34801561062357600080fd5b506008546001600160a01b0316610304565b34801561064157600080fd5b50610304610650366004613268565b611207565b34801561066157600080fd5b5061033c610670366004613036565b611226565b34801561068157600080fd5b506102ad6106903660046130d1565b611275565b3480156106a157600080fd5b506102d76112a0565b3480156106b657600080fd5b5061033c6106c536600461324d565b6112af565b3480156106d657600080fd5b50610353600081565b3480156106eb57600080fd5b5061033c6106fa36600461328a565b611328565b34801561070b57600080fd5b5061033c61071a3660046132b4565b6113ed565b61033c61072d366004613399565b61145d565b34801561073e57600080fd5b506102d761074d366004613036565b61179d565b34801561075e57600080fd5b5061035361076d366004613036565b611867565b34801561077e57600080fd5b5061033c61187e565b34801561079357600080fd5b5061033c6107a23660046133e4565b611995565b3480156107b357600080fd5b5061033c6107c23660046130d1565b611adb565b3480156107d357600080fd5b50610353600d5481565b3480156107e957600080fd5b506102ad6107f8366004613425565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561083257600080fd5b5061033c61084136600461324d565b611b01565b61033c610854366004613036565b611b99565b600061086482611db6565b92915050565b6060600280546108799061344f565b80601f01602080910402602001604051908101604052809291908181526020018280546108a59061344f565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b600061090782611ddb565b61096e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610995826110d3565b9050806001600160a01b0316836001600160a01b03161415610a045760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610965565b336001600160a01b0382161480610a205750610a2081336107f8565b610a925760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610965565b610a9d838383611e06565b505050565b6000600154600054610ab491906134a0565b905090565b600e54610100900460ff16610ae05760405162461bcd60e51b8152600401610965906134b7565b610a9d838383611e62565b600082815260096020526040902060010154610b078133611e6d565b610a9d8383611ed1565b6000610b1c836110e5565b8210610b755760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610965565b600080549080805b83811015610c4057600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215610be257805192505b806040015115610bf157600092505b876001600160a01b0316836001600160a01b03161415610c2d5786841415610c1f5750935061086492505050565b83610c29816134e4565b9450505b5080610c38816134e4565b915050610b7d565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610965565b6001600160a01b0381163314610d105760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610965565b610d1a8282611ef3565b5050565b6008546001600160a01b03163314610d485760405162461bcd60e51b8152600401610965906134ff565b610d53600033611275565b610d915760405162461bcd60e51b815260206004820152600f60248201526e43616e6e6f7420776974686472617760881b6044820152606401610965565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610dca573d6000803e3d6000fd5b50565b610dd8600033611275565b610e1d5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742073657420747261646520737461746560501b6044820152606401610965565b600e80549115156101000261ff0019909216919091179055565b600e54610100900460ff16610e5e5760405162461bcd60e51b8152600401610965906134b7565b610a9d838383611f15565b6000610e7482611f30565b80519091506000906001600160a01b0316336001600160a01b03161480610eab575033610ea0846108fc565b6001600160a01b0316145b80610ebd57508151610ebd90336107f8565b905080610f1e5760405162461bcd60e51b815260206004820152602960248201527f455243373231413a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610965565b610a9d83612039565b6000805481805b82811015610fbf57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290610fac5785831415610f9e5750949350505050565b82610fa8816134e4565b9350505b5080610fb7816134e4565b915050610f2e565b5060405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610965565b6008546001600160a01b0316331461103e5760405162461bcd60e51b8152600401610965906134ff565b8051610d1a906015906020840190612eff565b61105c600033611275565b6110a85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420616c7465722073616c652073746174650000000000000000006044820152606401610965565b600e805482919062ff00001916620100008360028111156110cb576110cb61320f565b021790555050565b60006110de82611f30565b5192915050565b60006001600160a01b0382166111515760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610965565b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111a05760405162461bcd60e51b8152600401610965906134ff565b6111aa60006121e3565b565b6111b7600033611275565b6111fc5760405162461bcd60e51b815260206004820152601660248201527510d85b9b9bdd081cd95d081b595c9adb19481c9bdbdd60521b6044820152606401610965565b600f91909155601055565b6000828152600a6020526040812061121f9083612235565b9392505050565b611231600033611275565b6112705760405162461bcd60e51b815260206004820152601060248201526f43616e6e6f742073657420707269636560801b6044820152606401610965565b600c55565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600380546108799061344f565b6112ba600033611275565b6113065760405162461bcd60e51b815260206004820152601e60248201527f43616c6c65722063616e6e6f7420736574206275726e206164647265737300006044820152606401610965565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163314156113815760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610965565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e54610100900460ff166114145760405162461bcd60e51b8152600401610965906134b7565b61145685858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061224192505050565b5050505050565b6001600e5462010000900460ff16600281111561147c5761147c61320f565b146114c95760405162461bcd60e51b815260206004820152601c60248201527f53616c652073746174652073686f756c642062652070726976617465000000006044820152606401610965565b600b546114d4610aa2565b106115165760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610965565b600e5460ff166115385760405162461bcd60e51b815260040161096590613534565b60006115b083838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b6040516020818303038152906040528051906020012061227a565b90506000611613848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050611595565b9050818061161e5750805b6116755760405162461bcd60e51b815260206004820152602260248201527f596f7520617265206e6f7420696e207468652076616c69642077686974656c696044820152611cdd60f21b6064820152608401610965565b60008261168c57601154610100900460ff16611693565b60115460ff165b3360009081526013602052604090205460ff91909116915081906116b7908861357c565b11156116d55760405162461bcd60e51b815260040161096590613594565b3360009081526013602052604090205481116117335760405162461bcd60e51b815260206004820152601960248201527f596f7527766520616c7265616479206d696e74656420616c6c000000000000006044820152606401610965565b6000600c548761174391906135d5565b9050348111156117655760405162461bcd60e51b8152600401610965906135f4565b336000908152601360205260408120805489929061178490849061357c565b9091555061179490503388612290565b50505050505050565b60606117a882611ddb565b61180c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610965565b60006118166122aa565b90506000815111611836576040518060200160405280600081525061121f565b80611840846122b9565b60405160200161185192919061363a565b6040516020818303038152906040529392505050565b6000818152600a60205260408120610864906123be565b6008546001600160a01b031633146118a85760405162461bcd60e51b8152600401610965906134ff565b6118b3600033611275565b6118ff5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e74207465616d20746f6b656e730000000000000000006044820152606401610965565b600e5460ff16156119605760405162461bcd60e51b815260206004820152602560248201527f50726f6d6f20746f6b656e73206861766520616c7265616479206265656e206d6044820152641a5b9d195960da1b6064820152608401610965565b6119866119756008546001600160a01b031690565b611981601e600961357c565b612290565b600e805460ff19166001179055565b6016546001600160a01b0316336001600160a01b0316146119f85760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206275726e65722063616e206275726e20746f6b656e7300000000006044820152606401610965565b601254601754429190611a0b90836134a0565b1115611a635760405162461bcd60e51b815260206004820152602160248201527f4275726e20697320617661696c61626c65206f6e6c7920666f722036206461796044820152607360f81b6064820152608401610965565b60005b82811015611aa157611a8f848483818110611a8357611a83613669565b90506020020135612039565b80611a99816134e4565b915050611a66565b5082829050600b6000828254611ab791906134a0565b9091555050600d8054839190600090611ad190849061357c565b9091555050505050565b600082815260096020526040902060010154611af78133611e6d565b610a9d8383611ef3565b6008546001600160a01b03163314611b2b5760405162461bcd60e51b8152600401610965906134ff565b6001600160a01b038116611b905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610965565b610dca816121e3565b6002600e5462010000900460ff166002811115611bb857611bb861320f565b14611c055760405162461bcd60e51b815260206004820152601b60248201527f53616c652073746174652073686f756c64206265207075626c696300000000006044820152606401610965565b600e5460ff16611c275760405162461bcd60e51b815260040161096590613534565b600b54611c32610aa2565b10611c745760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610965565b601154336000908152601460205260409020546201000090910460ff1690611c9c908361357c565b1115611cba5760405162461bcd60e51b815260040161096590613594565b6000600c5482611cca91906135d5565b905034811115611cec5760405162461bcd60e51b8152600401610965906135f4565b3360009081526014602052604081208054849290611d0b90849061357c565b90915550610d1a90503383612290565b611d258282611275565b610d1a5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611d5d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061121f836001600160a01b0384166123c8565b60006001600160e01b03198216635a05180f60e01b1480610864575061086482612417565b6000805482108015610864575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a9d83838361243c565b611e778282611275565b610d1a57611e8f816001600160a01b03166014612734565b611e9a836020612734565b604051602001611eab92919061367f565b60408051601f198184030181529082905262461bcd60e51b825261096591600401613023565b611edb8282611d1b565b6000828152600a60205260409020610a9d9082611da1565b611efd82826128cf565b6000828152600a60205260409020610a9d9082612936565b610a9d838383604051806020016040528060008152506113ed565b6040805160608101825260008082526020820181905291810191909152611f5682611ddb565b611fb55760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610965565b815b600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521580159061201a57508060400151155b15612026579392505050565b5080612031816136f4565b915050611fb7565b600061204482611f30565b90506120566000838360000151611e06565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094529184208054600160e01b949096166001600160e01b031990961695909517600160a01b42909216919091021760ff60e01b1916919091179092559061211a90849061357c565b6000818152600460205260409020549091506001600160a01b031661218e5761214281611ddb565b1561218e57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b815160405184916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4600180549060006121d9836134e4565b9190505550505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061121f838361294b565b61224c84848461243c565b61225884848484612975565b6122745760405162461bcd60e51b81526004016109659061370b565b50505050565b6000826122878584612a82565b14949350505050565b610d1a828260405180602001604052806000815250612af6565b6060601580546108799061344f565b6060816122dd5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561230757806122f1816134e4565b91506123009050600a83613774565b91506122e1565b6000816001600160401b0381111561232157612321613128565b6040519080825280601f01601f19166020018201604052801561234b576020820181803683370190505b5090505b84156123b6576123606001836134a0565b915061236d600a86613788565b61237890603061357c565b60f81b81838151811061238d5761238d613669565b60200101906001600160f81b031916908160001a9053506123af600a86613774565b945061234f565b949350505050565b6000610864825490565b600081815260018301602052604081205461240f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610864565b506000610864565b60006001600160e01b03198216637965db0b60e01b1480610864575061086482612b03565b600061244782611f30565b80519091506000906001600160a01b0316336001600160a01b0316148061247e575033612473846108fc565b6001600160a01b0316145b806124905750815161249090336107f8565b9050806124fa5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610965565b846001600160a01b031682600001516001600160a01b03161461256e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610965565b6001600160a01b0384166125d25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610965565b6125e26000848460000151611e06565b6001600160a01b03808616600090815260056020908152604080832080546000196001600160401b0380831691909101811667ffffffffffffffff1992831617909255948916808552828520805480841660019081018516919098161790558885526004909352908320805442909216600160a01b026001600160e01b03199092169092171790559061267690859061357c565b6000818152600460205260409020549091506001600160a01b03166126ea5761269e81611ddb565b156126ea57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b606060006127438360026135d5565b61274e90600261357c565b6001600160401b0381111561276557612765613128565b6040519080825280601f01601f19166020018201604052801561278f576020820181803683370190505b509050600360fc1b816000815181106127aa576127aa613669565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106127d9576127d9613669565b60200101906001600160f81b031916908160001a90535060006127fd8460026135d5565b61280890600161357c565b90505b6001811115612880576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061283c5761283c613669565b1a60f81b82828151811061285257612852613669565b60200101906001600160f81b031916908160001a90535060049490941c93612879816136f4565b905061280b565b50831561121f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610965565b6128d98282611275565b15610d1a5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061121f836001600160a01b038416612b6e565b600082600001828154811061296257612962613669565b9060005260206000200154905092915050565b60006001600160a01b0384163b15612a7757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129b990339089908890889060040161379c565b602060405180830381600087803b1580156129d357600080fd5b505af1925050508015612a03575060408051601f3d908101601f19168201909252612a00918101906137d9565b60015b612a5d573d808015612a31576040519150601f19603f3d011682016040523d82523d6000602084013e612a36565b606091505b508051612a555760405162461bcd60e51b81526004016109659061370b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506123b6565b506001949350505050565b600081815b8451811015612aee576000858281518110612aa457612aa4613669565b60200260200101519050808311612aca5760008381526020829052604090209250612adb565b600081815260208490526040902092505b5080612ae6816134e4565b915050612a87565b509392505050565b610a9d8383836001612c61565b60006001600160e01b031982166380ac58cd60e01b1480612b3457506001600160e01b03198216635b5e139f60e01b145b80612b4f57506001600160e01b0319821663780e9d6360e01b145b8061086457506301ffc9a760e01b6001600160e01b0319831614610864565b60008181526001830160205260408120548015612c57576000612b926001836134a0565b8554909150600090612ba6906001906134a0565b9050818114612c0b576000866000018281548110612bc657612bc6613669565b9060005260206000200154905080876000018481548110612be957612be9613669565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612c1c57612c1c6137f6565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610864565b6000915050610864565b6000546001600160a01b038516612cc45760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610965565b612ccd81611ddb565b15612d1a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610965565b60008411612d7b5760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610965565b6001600160a01b03851660009081526005602052604081208054869290612dac9084906001600160401b031661380c565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b038716600090815260056020526040902080548793509091600891612e069185916801000000000000000090041661380c565b82546001600160401b039182166101009390930a9283029282021916919091179091556000838152600460205260408120805442909316600160a01b026001600160e01b03199093166001600160a01b038a1617929092179091558291505b85811015612ef45760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612ed457612eb86000888488612975565b612ed45760405162461bcd60e51b81526004016109659061370b565b81612ede816134e4565b9250508080612eec906134e4565b915050612e65565b50600081905561272c565b828054612f0b9061344f565b90600052602060002090601f016020900481019282612f2d5760008555612f73565b82601f10612f4657805160ff1916838001178555612f73565b82800160010185558215612f73579182015b82811115612f73578251825591602001919060010190612f58565b50612f7f929150612f83565b5090565b5b80821115612f7f5760008155600101612f84565b6001600160e01b031981168114610dca57600080fd5b600060208284031215612fc057600080fd5b813561121f81612f98565b60005b83811015612fe6578181015183820152602001612fce565b838111156122745750506000910152565b6000815180845261300f816020860160208601612fcb565b601f01601f19169290920160200192915050565b60208152600061121f6020830184612ff7565b60006020828403121561304857600080fd5b5035919050565b80356001600160a01b038116811461306657600080fd5b919050565b6000806040838503121561307e57600080fd5b6130878361304f565b946020939093013593505050565b6000806000606084860312156130aa57600080fd5b6130b38461304f565b92506130c16020850161304f565b9150604084013590509250925092565b600080604083850312156130e457600080fd5b823591506130f46020840161304f565b90509250929050565b8035801515811461306657600080fd5b60006020828403121561311f57600080fd5b61121f826130fd565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561315057600080fd5b81356001600160401b038082111561316757600080fd5b818401915084601f83011261317b57600080fd5b81358181111561318d5761318d613128565b604051601f8201601f19908116603f011681019083821181831017156131b5576131b5613128565b816040528281528760208487010111156131ce57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561320057600080fd5b81356003811061121f57600080fd5b634e487b7160e01b600052602160045260246000fd5b602081016003831061324757634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561325f57600080fd5b61121f8261304f565b6000806040838503121561327b57600080fd5b50508035926020909101359150565b6000806040838503121561329d57600080fd5b6132a68361304f565b91506130f4602084016130fd565b6000806000806000608086880312156132cc57600080fd5b6132d58661304f565b94506132e36020870161304f565b93506040860135925060608601356001600160401b038082111561330657600080fd5b818801915088601f83011261331a57600080fd5b81358181111561332957600080fd5b89602082850101111561333b57600080fd5b9699959850939650602001949392505050565b60008083601f84011261336057600080fd5b5081356001600160401b0381111561337757600080fd5b6020830191508360208260051b850101111561339257600080fd5b9250929050565b6000806000604084860312156133ae57600080fd5b8335925060208401356001600160401b038111156133cb57600080fd5b6133d78682870161334e565b9497909650939450505050565b600080602083850312156133f757600080fd5b82356001600160401b0381111561340d57600080fd5b6134198582860161334e565b90969095509350505050565b6000806040838503121561343857600080fd5b6134418361304f565b91506130f46020840161304f565b600181811c9082168061346357607f821691505b6020821081141561348457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156134b2576134b261348a565b500390565b6020808252601390820152725472616465206973206e6f742061637469766560681b604082015260600190565b60006000198214156134f8576134f861348a565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f50726f6d6f20746f6b656e732073686f756c64206265206d696e74656420696e60408201526720616476616e636560c01b606082015260800190565b6000821982111561358f5761358f61348a565b500190565b60208082526021908201527f596f757220746f6b656e20616d6f756e742072656163686564206f7574206d616040820152600f60fb1b606082015260800190565b60008160001904831182151516156135ef576135ef61348a565b500290565b60208082526026908201527f50726f7669646564206e6f7420656e6f75676820457468657220666f7220707560408201526572636861736560d01b606082015260800190565b6000835161364c818460208801612fcb565b835190830190613660818360208801612fcb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516136b7816017850160208801612fcb565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516136e8816028840160208801612fcb565b01602801949350505050565b6000816137035761370361348a565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826137835761378361375e565b500490565b6000826137975761379761375e565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137cf90830184612ff7565b9695505050505050565b6000602082840312156137eb57600080fd5b815161121f81612f98565b634e487b7160e01b600052603160045260246000fd5b60006001600160401b038083168185168083038211156136605761366061348a56fea2646970667358221220fa5aee91f5733441a3fd59e62fd3ecfc7d19ee5a896a39400d6a83499cb199d564736f6c63430008090033
Deployed Bytecode Sourcemap
72516:5844:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78172:185;;;;;;;;;;-1:-1:-1;78172:185:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;78172:185:0;;;;;;;;59038:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;60599:214::-;;;;;;;;;;-1:-1:-1;60599:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;60599:214:0;1528:203:1;60120:413:0;;;;;;;;;;-1:-1:-1;60120:413:0;;;;;:::i;:::-;;:::i;:::-;;54305:114;;;;;;;;;;;;;:::i;:::-;;;2319:25:1;;;2307:2;2292:18;54305:114:0;2173:177:1;74035:193:0;;;;;;;;;;-1:-1:-1;74035:193:0;;;;;:::i;:::-;;:::i;15143:131::-;;;;;;;;;;-1:-1:-1;15143:131:0;;;;;:::i;:::-;15217:7;15244:12;;;:6;:12;;;;;:22;;;;15143:131;72686:36;;;;;;;;;;;;;;;;72638:39;;;;;;;;;;;;72675:2;72638:39;;15536:147;;;;;;;;;;-1:-1:-1;15536:147:0;;;;;:::i;:::-;;:::i;55571:923::-;;;;;;;;;;-1:-1:-1;55571:923:0;;;;;:::i;:::-;;:::i;16584:218::-;;;;;;;;;;-1:-1:-1;16584:218:0;;;;;:::i;:::-;;:::i;74588:182::-;;;;;;;;;;;;;:::i;74236:173::-;;;;;;;;;;-1:-1:-1;74236:173:0;;;;;:::i;:::-;;:::i;73826:201::-;;;;;;;;;;-1:-1:-1;73826:201:0;;;;;:::i;:::-;;:::i;69179:428::-;;;;;;;;;;-1:-1:-1;69179:428:0;;;;;:::i;:::-;;:::i;54712:559::-;;;;;;;;;;-1:-1:-1;54712:559:0;;;;;:::i;:::-;;:::i;78062:102::-;;;;;;;;;;-1:-1:-1;78062:102:0;;;;;:::i;:::-;;:::i;72860:31::-;;;;;;;;;;-1:-1:-1;72860:31:0;;;;;;;;;;;74778:172;;;;;;;;;;-1:-1:-1;74778:172:0;;;;;:::i;:::-;;:::i;72816:37::-;;;;;;;;;;-1:-1:-1;72816:37:0;;;;;;;;72951:45;;;;;;;;;;-1:-1:-1;72951:45:0;;;;;;;;;;;;;;;;;;:::i;58847:124::-;;;;;;;;;;-1:-1:-1;58847:124:0;;;;;:::i;:::-;;:::i;72588:43::-;;;;;;;;;;;;72630:1;72588:43;;57002:221;;;;;;;;;;-1:-1:-1;57002:221:0;;;;;:::i;:::-;;:::i;2497:103::-;;;;;;;;;;;;;:::i;74958:251::-;;;;;;;;;;-1:-1:-1;74958:251:0;;;;;:::i;:::-;;:::i;72729:42::-;;;;;;;;;;;;;;;;1846:87;;;;;;;;;;-1:-1:-1;1919:6:0;;-1:-1:-1;;;;;1919:6:0;1846:87;;32467:153;;;;;;;;;;-1:-1:-1;32467:153:0;;;;;:::i;:::-;;:::i;74417:163::-;;;;;;;;;;-1:-1:-1;74417:163:0;;;;;:::i;:::-;;:::i;14012:147::-;;;;;;;;;;-1:-1:-1;14012:147:0;;;;;:::i;:::-;;:::i;59207:104::-;;;;;;;;;;;;;:::i;77738:196::-;;;;;;;;;;-1:-1:-1;77738:196:0;;;;;:::i;:::-;;:::i;13103:49::-;;;;;;;;;;-1:-1:-1;13103:49:0;13148:4;13103:49;;60885:288;;;;;;;;;;-1:-1:-1;60885:288:0;;;;;:::i;:::-;;:::i;73590:228::-;;;;;;;;;;-1:-1:-1;73590:228:0;;;;;:::i;:::-;;:::i;75524:1127::-;;;;;;:::i;:::-;;:::i;59382:334::-;;;;;;;;;;-1:-1:-1;59382:334:0;;;;;:::i;:::-;;:::i;32794:142::-;;;;;;;;;;-1:-1:-1;32794:142:0;;;;;:::i;:::-;;:::i;75217:299::-;;;;;;;;;;;;;:::i;77280:450::-;;;;;;;;;;-1:-1:-1;77280:450:0;;;;;:::i;:::-;;:::i;15928:149::-;;;;;;;;;;-1:-1:-1;15928:149:0;;;;;:::i;:::-;;:::i;72778:31::-;;;;;;;;;;;;;;;;61244:164;;;;;;;;;;-1:-1:-1;61244:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;61365:25:0;;;61341:4;61365:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;61244:164;2755:201;;;;;;;;;;-1:-1:-1;2755:201:0;;;;;:::i;:::-;;:::i;76659:613::-;;;;;;:::i;:::-;;:::i;78172:185::-;78291:4;78313:36;78337:11;78313:23;:36::i;:::-;78306:43;78172:185;-1:-1:-1;;78172:185:0:o;59038:100::-;59092:13;59125:5;59118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59038:100;:::o;60599:214::-;60667:7;60695:16;60703:7;60695;:16::i;:::-;60687:74;;;;-1:-1:-1;;;60687:74:0;;9422:2:1;60687:74:0;;;9404:21:1;9461:2;9441:18;;;9434:30;9500:34;9480:18;;;9473:62;-1:-1:-1;;;9551:18:1;;;9544:43;9604:19;;60687:74:0;;;;;;;;;-1:-1:-1;60781:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;60781:24:0;;60599:214::o;60120:413::-;60193:13;60209:24;60225:7;60209:15;:24::i;:::-;60193:40;;60258:5;-1:-1:-1;;;;;60252:11:0;:2;-1:-1:-1;;;;;60252:11:0;;;60244:58;;;;-1:-1:-1;;;60244:58:0;;9836:2:1;60244:58:0;;;9818:21:1;9875:2;9855:18;;;9848:30;9914:34;9894:18;;;9887:62;-1:-1:-1;;;9965:18:1;;;9958:32;10007:19;;60244:58:0;9634:398:1;60244:58:0;736:10;-1:-1:-1;;;;;60337:21:0;;;;:62;;-1:-1:-1;60362:37:0;60379:5;736:10;61244:164;:::i;60362:37::-;60315:169;;;;-1:-1:-1;;;60315:169:0;;10239:2:1;60315:169:0;;;10221:21:1;10278:2;10258:18;;;10251:30;10317:34;10297:18;;;10290:62;10388:27;10368:18;;;10361:55;10433:19;;60315:169:0;10037:421:1;60315:169:0;60497:28;60506:2;60510:7;60519:5;60497:8;:28::i;:::-;60182:351;60120:413;;:::o;54305:114::-;54358:7;54400:11;;54385:12;;:26;;;;:::i;:::-;54378:33;;54305:114;:::o;74035:193::-;74136:11;;;;;;;74128:43;;;;-1:-1:-1;;;74128:43:0;;;;;;;:::i;:::-;74180:40;74199:5;74206:3;74211:8;74180:18;:40::i;15536:147::-;15217:7;15244:12;;;:6;:12;;;;;:22;;;13594:30;13605:4;736:10;13594;:30::i;:::-;15650:25:::1;15661:4;15667:7;15650:10;:25::i;55571:923::-:0;55660:7;55696:16;55706:5;55696:9;:16::i;:::-;55688:5;:24;55680:71;;;;-1:-1:-1;;;55680:71:0;;11275:2:1;55680:71:0;;;11257:21:1;11314:2;11294:18;;;11287:30;11353:34;11333:18;;;11326:62;-1:-1:-1;;;11404:18:1;;;11397:32;11446:19;;55680:71:0;11073:398:1;55680:71:0;55762:22;55787:12;;;55762:22;;55893:527;55917:14;55913:1;:18;55893:527;;;55953:31;55987:14;;;:11;:14;;;;;;;;;55953:48;;;;;;;;;-1:-1:-1;;;;;55953:48:0;;;;;-1:-1:-1;;;55953:48:0;;-1:-1:-1;;;;;55953:48:0;;;;;;;;-1:-1:-1;;;55953:48:0;;;;;;;;;;;;;56020:28;56016:103;;56089:14;;;-1:-1:-1;56016:103:0;56137:9;:16;;;56133:87;;;56202:1;56174:30;;56133:87;56259:5;-1:-1:-1;;;;;56238:26:0;:17;-1:-1:-1;;;;;56238:26:0;;56234:175;;;56304:5;56289:11;:20;56285:77;;;-1:-1:-1;56341:1:0;-1:-1:-1;56334:8:0;;-1:-1:-1;;;56334:8:0;56285:77;56380:13;;;;:::i;:::-;;;;56234:175;-1:-1:-1;55933:3:0;;;;:::i;:::-;;;;55893:527;;;-1:-1:-1;56430:56:0;;-1:-1:-1;;;56430:56:0;;11818:2:1;56430:56:0;;;11800:21:1;11857:2;11837:18;;;11830:30;11896:34;11876:18;;;11869:62;-1:-1:-1;;;11947:18:1;;;11940:44;12001:19;;56430:56:0;11616:410:1;16584:218:0;-1:-1:-1;;;;;16680:23:0;;736:10;16680:23;16672:83;;;;-1:-1:-1;;;16672:83:0;;12233:2:1;16672:83:0;;;12215:21:1;12272:2;12252:18;;;12245:30;12311:34;12291:18;;;12284:62;-1:-1:-1;;;12362:18:1;;;12355:45;12417:19;;16672:83:0;12031:411:1;16672:83:0;16768:26;16780:4;16786:7;16768:11;:26::i;:::-;16584:218;;:::o;74588:182::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;74642:41:::1;13148:4;736:10:::0;14012:147;:::i;74642:41::-:1;74634:69;;;::::0;-1:-1:-1;;;74634:69:0;;13010:2:1;74634:69:0::1;::::0;::::1;12992:21:1::0;13049:2;13029:18;;;13022:30;-1:-1:-1;;;13068:18:1;;;13061:45;13123:18;;74634:69:0::1;12808:339:1::0;74634:69:0::1;1919:6:::0;;74714:48:::1;::::0;-1:-1:-1;;;;;1919:6:0;;;;74740:21:::1;74714:48:::0;::::1;;;::::0;::::1;::::0;;;74740:21;1919:6;74714:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;74588:182::o:0;74236:173::-;74300:41;13148:4;736:10;14012:147;:::i;74300:41::-;74292:76;;;;-1:-1:-1;;;74292:76:0;;13354:2:1;74292:76:0;;;13336:21:1;13393:2;13373:18;;;13366:30;-1:-1:-1;;;13412:18:1;;;13405:52;13474:18;;74292:76:0;13152:346:1;74292:76:0;74377:11;:24;;;;;;;-1:-1:-1;;74377:24:0;;;;;;;;;74236:173::o;73826:201::-;73931:11;;;;;;;73923:43;;;;-1:-1:-1;;;73923:43:0;;;;;;;:::i;:::-;73975:44;73998:5;74005:3;74010:8;73975:22;:44::i;69179:428::-;69236:35;69274:20;69286:7;69274:11;:20::i;:::-;69349:18;;69236:58;;-1:-1:-1;69307:22:0;;-1:-1:-1;;;;;69333:34:0;736:10;-1:-1:-1;;;;;69333:34:0;;:87;;;-1:-1:-1;736:10:0;69384:20;69396:7;69384:11;:20::i;:::-;-1:-1:-1;;;;;69384:36:0;;69333:87;:154;;;-1:-1:-1;69454:18:0;;69437:50;;736:10;61244:164;:::i;69437:50::-;69307:181;;69509:17;69501:71;;;;-1:-1:-1;;;69501:71:0;;13705:2:1;69501:71:0;;;13687:21:1;13744:2;13724:18;;;13717:30;13783:34;13763:18;;;13756:62;-1:-1:-1;;;13834:18:1;;;13827:39;13883:19;;69501:71:0;13503:405:1;69501:71:0;69585:14;69591:7;69585:5;:14::i;54712:559::-;54779:7;54824:12;;54779:7;;54881:300;54905:14;54901:1;:18;54881:300;;;54941:31;54975:14;;;:11;:14;;;;;;;;;54941:48;;;;;;;;;-1:-1:-1;;;;;54941:48:0;;;;-1:-1:-1;;;54941:48:0;;-1:-1:-1;;;;;54941:48:0;;;;;;;;-1:-1:-1;;;54941:48:0;;;;;;;;;;;;;;55004:166;;55065:5;55050:11;:20;55046:77;;;-1:-1:-1;55102:1:0;54712:559;-1:-1:-1;;;;54712:559:0:o;55046:77::-;55141:13;;;;:::i;:::-;;;;55004:166;-1:-1:-1;54921:3:0;;;;:::i;:::-;;;;54881:300;;;-1:-1:-1;55191:53:0;;-1:-1:-1;;;55191:53:0;;14115:2:1;55191:53:0;;;14097:21:1;14154:2;14134:18;;;14127:30;14193:34;14173:18;;;14166:62;-1:-1:-1;;;14244:18:1;;;14237:33;14287:19;;55191:53:0;13913:399:1;78062:102:0;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;78133:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;74778:172::-:0;74844:41;13148:4;736:10;14012:147;:::i;74844:41::-;74836:77;;;;-1:-1:-1;;;74836:77:0;;14519:2:1;74836:77:0;;;14501:21:1;14558:2;14538:18;;;14531:30;14597:25;14577:18;;;14570:53;14640:18;;74836:77:0;14317:347:1;74836:77:0;74922:9;:20;;74934:8;;74922:9;-1:-1:-1;;74922:20:0;;74934:8;74922:9;:20;;;;;;;:::i;:::-;;;;;;74778:172;:::o;58847:124::-;58911:7;58938:20;58950:7;58938:11;:20::i;:::-;:25;;58847:124;-1:-1:-1;;58847:124:0:o;57002:221::-;57066:7;-1:-1:-1;;;;;57094:19:0;;57086:75;;;;-1:-1:-1;;;57086:75:0;;14871:2:1;57086:75:0;;;14853:21:1;14910:2;14890:18;;;14883:30;14949:34;14929:18;;;14922:62;-1:-1:-1;;;15000:18:1;;;14993:41;15051:19;;57086:75:0;14669:407:1;57086:75:0;-1:-1:-1;;;;;;57187:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;57187:27:0;;57002:221::o;2497:103::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;2562:30:::1;2589:1;2562:18;:30::i;:::-;2497:103::o:0;74958:251::-;75051:41;13148:4;736:10;14012:147;:::i;75051:41::-;75043:76;;;;-1:-1:-1;;;75043:76:0;;15283:2:1;75043:76:0;;;15265:21:1;15322:2;15302:18;;;15295:30;-1:-1:-1;;;15341:18:1;;;15334:52;15403:18;;75043:76:0;15081:346:1;75043:76:0;75128:16;:32;;;;75169:16;:32;74958:251::o;32467:153::-;32557:7;32584:18;;;:12;:18;;;;;:28;;32606:5;32584:21;:28::i;:::-;32577:35;32467:153;-1:-1:-1;;;32467:153:0:o;74417:163::-;74477:41;13148:4;736:10;14012:147;:::i;74477:41::-;74469:70;;;;-1:-1:-1;;;74469:70:0;;15634:2:1;74469:70:0;;;15616:21:1;15673:2;15653:18;;;15646:30;-1:-1:-1;;;15692:18:1;;;15685:46;15748:18;;74469:70:0;15432:340:1;74469:70:0;74548:13;:24;74417:163::o;14012:147::-;14098:4;14122:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14122:29:0;;;;;;;;;;;;;;;14012:147::o;59207:104::-;59263:13;59296:7;59289:14;;;;;:::i;77738:196::-;77811:41;13148:4;736:10;14012:147;:::i;77811:41::-;77803:84;;;;-1:-1:-1;;;77803:84:0;;15979:2:1;77803:84:0;;;15961:21:1;16018:2;15998:18;;;15991:30;16057:32;16037:18;;;16030:60;16107:18;;77803:84:0;15777:354:1;77803:84:0;77896:14;:30;;-1:-1:-1;;;;;;77896:30:0;-1:-1:-1;;;;;77896:30:0;;;;;;;;;;77738:196::o;60885:288::-;-1:-1:-1;;;;;60980:24:0;;736:10;60980:24;;60972:63;;;;-1:-1:-1;;;60972:63:0;;16338:2:1;60972:63:0;;;16320:21:1;16377:2;16357:18;;;16350:30;16416:28;16396:18;;;16389:56;16462:18;;60972:63:0;16136:350:1;60972:63:0;736:10;61048:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;61048:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;61048:53:0;;;;;;;;;;61117:48;;540:41:1;;;61048:42:0;;736:10;61117:48;;513:18:1;61117:48:0;;;;;;;60885:288;;:::o;73590:228::-;73716:11;;;;;;;73708:43;;;;-1:-1:-1;;;73708:43:0;;;;;;;:::i;:::-;73760:50;73783:5;73790:3;73795:8;73805:4;;73760:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73760:22:0;;-1:-1:-1;;;73760:50:0:i;:::-;73590:228;;;;;:::o;75524:1127::-;75629:17;75616:9;;;;;;;;:30;;;;;;;:::i;:::-;;75607:72;;;;-1:-1:-1;;;75607:72:0;;16693:2:1;75607:72:0;;;16675:21:1;16732:2;16712:18;;;16705:30;16771;16751:18;;;16744:58;16819:18;;75607:72:0;16491:352:1;75607:72:0;75712:14;;75696:13;:11;:13::i;:::-;:30;75688:61;;;;-1:-1:-1;;;75688:61:0;;17050:2:1;75688:61:0;;;17032:21:1;17089:2;17069:18;;;17062:30;-1:-1:-1;;;17108:18:1;;;17101:48;17166:18;;75688:61:0;16848:342:1;75688:61:0;75766:17;;;;75758:70;;;;-1:-1:-1;;;75758:70:0;;;;;;;:::i;:::-;75837:18;75858:84;75877:5;;75858:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75884:16:0;;75912:28;;-1:-1:-1;;75929:10:0;17753:2:1;17749:15;17745:53;75912:28:0;;;17733:66:1;75884:16:0;;-1:-1:-1;17815:12:1;;;-1:-1:-1;75912:28:0;;;;;;;;;;;;;75902:39;;;;;;75858:18;:84::i;:::-;75837:105;;75951:18;75972:84;75991:5;;75972:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75998:16:0;;76026:28;;-1:-1:-1;;76043:10:0;17753:2:1;17749:15;17745:53;76026:28:0;;;17733:66:1;75998:16:0;;-1:-1:-1;17815:12:1;;;-1:-1:-1;76026:28:0;17604:229:1;75972:84:0;75951:105;;76073:13;:30;;;;76090:13;76073:30;76065:77;;;;-1:-1:-1;;;76065:77:0;;18040:2:1;76065:77:0;;;18022:21:1;18079:2;18059:18;;;18052:30;18118:34;18098:18;;;18091:62;-1:-1:-1;;;18169:18:1;;;18162:32;18211:19;;76065:77:0;17838:398:1;76065:77:0;76153:21;76177:13;:51;;76212:16;;;;;;;76177:51;;;76193:16;;;;76177:51;76268:10;76254:25;;;;:13;:25;;;;;;76153:75;;;;;;-1:-1:-1;76153:75:0;;76245:34;;:6;:34;:::i;:::-;:51;;76237:97;;;;-1:-1:-1;;;76237:97:0;;;;;;;:::i;:::-;76365:10;76351:25;;;;:13;:25;;;;;;:41;-1:-1:-1;76343:79:0;;;;-1:-1:-1;;;76343:79:0;;18978:2:1;76343:79:0;;;18960:21:1;19017:2;18997:18;;;18990:30;19056:27;19036:18;;;19029:55;19101:18;;76343:79:0;18776:349:1;76343:79:0;76431:19;76462:13;;76453:6;:22;;;;:::i;:::-;76431:44;;76507:9;76492:11;:24;;76484:75;;;;-1:-1:-1;;;76484:75:0;;;;;;;:::i;:::-;76582:10;76568:25;;;;:13;:25;;;;;:35;;76597:6;;76568:25;:35;;76597:6;;76568:35;:::i;:::-;;;;-1:-1:-1;76612:31:0;;-1:-1:-1;736:10:0;76636:6;76612:9;:31::i;:::-;75598:1053;;;;75524:1127;;;:::o;59382:334::-;59455:13;59489:16;59497:7;59489;:16::i;:::-;59481:76;;;;-1:-1:-1;;;59481:76:0;;19912:2:1;59481:76:0;;;19894:21:1;19951:2;19931:18;;;19924:30;19990:34;19970:18;;;19963:62;-1:-1:-1;;;20041:18:1;;;20034:45;20096:19;;59481:76:0;19710:411:1;59481:76:0;59570:21;59594:10;:8;:10::i;:::-;59570:34;;59646:1;59628:7;59622:21;:25;:86;;;;;;;;;;;;;;;;;59674:7;59683:18;:7;:16;:18::i;:::-;59657:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59615:93;59382:334;-1:-1:-1;;;59382:334:0:o;32794:142::-;32874:7;32901:18;;;:12;:18;;;;;:27;;:25;:27::i;75217:299::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;75272:41:::1;13148:4;736:10:::0;14012:147;:::i;75272:41::-:1;75264:77;;;::::0;-1:-1:-1;;;75264:77:0;;20803:2:1;75264:77:0::1;::::0;::::1;20785:21:1::0;20842:2;20822:18;;;20815:30;20881:25;20861:18;;;20854:53;20924:18;;75264:77:0::1;20601:347:1::0;75264:77:0::1;75359:17;::::0;::::1;;75358:18;75350:68;;;::::0;-1:-1:-1;;;75350:68:0;;21155:2:1;75350:68:0::1;::::0;::::1;21137:21:1::0;21194:2;21174:18;;;21167:30;21233:34;21213:18;;;21206:62;-1:-1:-1;;;21284:18:1;;;21277:35;21329:19;;75350:68:0::1;20953:401:1::0;75350:68:0::1;75427:48;75437:7;1919:6:::0;;-1:-1:-1;;;;;1919:6:0;;1846:87;75437:7:::1;75446:28;72675:2;72630:1;75446:28;:::i;:::-;75427:9;:48::i;:::-;75484:17;:24:::0;;-1:-1:-1;;75484:24:0::1;75504:4;75484:24;::::0;;75217:299::o;77280:450::-;77367:14;;-1:-1:-1;;;;;77367:14:0;736:10;-1:-1:-1;;;;;77351:30:0;;77343:70;;;;-1:-1:-1;;;77343:70:0;;21561:2:1;77343:70:0;;;21543:21:1;21600:2;21580:18;;;21573:30;21639:29;21619:18;;;21612:57;21686:18;;77343:70:0;21359:351:1;77343:70:0;77498:15;;77482:12;;77440:15;;77498;77472:22;;77440:15;77472:22;:::i;:::-;:41;;77464:87;;;;-1:-1:-1;;;77464:87:0;;21917:2:1;77464:87:0;;;21899:21:1;21956:2;21936:18;;;21929:30;21995:34;21975:18;;;21968:62;-1:-1:-1;;;22046:18:1;;;22039:31;22087:19;;77464:87:0;21715:397:1;77464:87:0;77565:9;77560:81;77576:19;;;77560:81;;;77613:18;77619:8;;77628:1;77619:11;;;;;;;:::i;:::-;;;;;;;77613:5;:18::i;:::-;77597:3;;;;:::i;:::-;;;;77560:81;;;;77667:8;;:15;;77649:14;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;77691:12:0;:31;;77707:8;;77691:12;;;:31;;77707:8;;77691:31;:::i;:::-;;;;-1:-1:-1;;;;;77280:450:0:o;15928:149::-;15217:7;15244:12;;;:6;:12;;;;;:22;;;13594:30;13605:4;736:10;13594;:30::i;:::-;16043:26:::1;16055:4;16061:7;16043:11;:26::i;2755:201::-:0;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2844:22:0;::::1;2836:73;;;::::0;-1:-1:-1;;;2836:73:0;;22451:2:1;2836:73:0::1;::::0;::::1;22433:21:1::0;22490:2;22470:18;;;22463:30;22529:34;22509:18;;;22502:62;-1:-1:-1;;;22580:18:1;;;22573:36;22626:19;;2836:73:0::1;22249:402:1::0;2836:73:0::1;2920:28;2939:8;2920:18;:28::i;76659:613::-:0;76741:16;76728:9;;;;;;;;:29;;;;;;;:::i;:::-;;76719:70;;;;-1:-1:-1;;;76719:70:0;;22858:2:1;76719:70:0;;;22840:21:1;22897:2;22877:18;;;22870:30;22936:29;22916:18;;;22909:57;22983:18;;76719:70:0;22656:351:1;76719:70:0;76806:17;;;;76798:70;;;;-1:-1:-1;;;76798:70:0;;;;;;;:::i;:::-;76901:14;;76885:13;:11;:13::i;:::-;:30;76877:61;;;;-1:-1:-1;;;76877:61:0;;17050:2:1;76877:61:0;;;17032:21:1;17089:2;17069:18;;;17062:30;-1:-1:-1;;;17108:18:1;;;17101:48;17166:18;;76877:61:0;16848:342:1;76877:61:0;76992:14;;76977:10;76964:24;;;;:12;:24;;;;;;76992:14;;;;;;;76955:33;;:6;:33;:::i;:::-;:51;;76947:97;;;;-1:-1:-1;;;76947:97:0;;;;;;;:::i;:::-;77053:19;77084:13;;77075:6;:22;;;;:::i;:::-;77053:44;;77129:9;77114:11;:24;;77106:75;;;;-1:-1:-1;;;77106:75:0;;;;;;;:::i;:::-;77203:10;77190:24;;;;:12;:24;;;;;:34;;77218:6;;77190:24;:34;;77218:6;;77190:34;:::i;:::-;;;;-1:-1:-1;77233:31:0;;-1:-1:-1;736:10:0;77257:6;77233:9;:31::i;18085:238::-;18169:22;18177:4;18183:7;18169;:22::i;:::-;18164:152;;18208:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18208:29:0;;;;;;;;;:36;;-1:-1:-1;;18208:36:0;18240:4;18208:36;;;18291:12;736:10;;656:98;18291:12;-1:-1:-1;;;;;18264:40:0;18282:7;-1:-1:-1;;;;;18264:40:0;18276:4;18264:40;;;;;;;;;;18085:238;;:::o;26476:152::-;26546:4;26570:50;26575:3;-1:-1:-1;;;;;26595:23:0;;26570:4;:50::i;31654:214::-;31739:4;-1:-1:-1;;;;;;31763:57:0;;-1:-1:-1;;;31763:57:0;;:97;;;31824:36;31848:11;31824:23;:36::i;62590:143::-;62647:4;62681:12;;62671:7;:22;:54;;;;-1:-1:-1;;62698:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;62698:27:0;;;;62697:28;;62590:143::o;69725:196::-;69840:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;69840:29:0;-1:-1:-1;;;;;69840:29:0;;;;;;;;;69885:28;;69840:24;;69885:28;;;;;;;69725:196;;;:::o;61475:170::-;61609:28;61619:4;61625:2;61629:7;61609:9;:28::i;14449:505::-;14538:22;14546:4;14552:7;14538;:22::i;:::-;14533:414;;14726:41;14754:7;-1:-1:-1;;;;;14726:41:0;14764:2;14726:19;:41::i;:::-;14840:38;14868:4;14875:2;14840:19;:38::i;:::-;14631:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14631:270:0;;;;;;;;;;-1:-1:-1;;;14577:358:0;;;;;;;:::i;33029:169::-;33117:31;33134:4;33140:7;33117:16;:31::i;:::-;33159:18;;;;:12;:18;;;;;:31;;33182:7;33159:22;:31::i;33292:174::-;33381:32;33399:4;33405:7;33381:17;:32::i;:::-;33424:18;;;;:12;:18;;;;;:34;;33450:7;33424:25;:34::i;61716:185::-;61854:39;61871:4;61877:2;61881:7;61854:39;;;;;;;;;;;;:16;:39::i;58292:493::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;58395:16:0;58403:7;58395;:16::i;:::-;58387:71;;;;-1:-1:-1;;;58387:71:0;;24005:2:1;58387:71:0;;;23987:21:1;24044:2;24024:18;;;24017:30;24083:34;24063:18;;;24056:62;-1:-1:-1;;;24134:18:1;;;24127:40;24184:19;;58387:71:0;23803:406:1;58387:71:0;58491:7;58471:237;58525:31;58559:17;;;:11;:17;;;;;;;;;58525:51;;;;;;;;;-1:-1:-1;;;;;58525:51:0;;;;;-1:-1:-1;;;58525:51:0;;-1:-1:-1;;;;;58525:51:0;;;;;;;;-1:-1:-1;;;58525:51:0;;;;;;;;;;;;;58595:28;;;;:49;;;58628:9;:16;;;58627:17;58595:49;58591:106;;;58672:9;58292:493;-1:-1:-1;;;58292:493:0:o;58591:106::-;-1:-1:-1;58502:6:0;;;;:::i;:::-;;;;58471:237;;67379:1617;67439:35;67477:20;67489:7;67477:11;:20::i;:::-;67439:58;-1:-1:-1;67640:49:0;67657:1;67661:7;67670:13;:18;;;67640:8;:49::i;:::-;67907:18;;-1:-1:-1;;;;;67894:32:0;;;;;;;:12;:32;;;;;;;;:45;;-1:-1:-1;;67894:45:0;;-1:-1:-1;;;;;67894:45:0;;;-1:-1:-1;;67894:45:0;;;;;;;67967:18;;67954:32;;;;;;;:50;;-1:-1:-1;;;;67954:50:0;;-1:-1:-1;;;67954:50:0;;;;;;-1:-1:-1;67954:50:0;;;;;;;;;;;;68126:18;;68098:20;;;:11;:20;;;;;;:46;;-1:-1:-1;;;68098:46:0;;;;-1:-1:-1;;;;;;68155:61:0;;;;;;;-1:-1:-1;;;68200:15:0;68155:61;;;;;;;;-1:-1:-1;;;;68227:34:0;;;;;;;;67894:32;68524:11;;68098:20;;68524:11;:::i;:::-;68591:1;68550:24;;;:11;:24;;;;;:29;68502:33;;-1:-1:-1;;;;;;68550:29:0;68546:275;;68614:20;68622:11;68614:7;:20::i;:::-;68610:200;;;68687:18;;;68655:24;;;:11;:24;;;;;;;;:50;;68766:28;;;;-1:-1:-1;;;;;68724:70:0;-1:-1:-1;;;68724:70:0;-1:-1:-1;;;;;;68724:70:0;;;-1:-1:-1;;;;;68655:50:0;;;68724:70;;;;;;;68610:200;68847:18;;68838:49;;68879:7;;68875:1;;-1:-1:-1;;;;;68838:49:0;;;;;;68875:1;;68838:49;68975:11;:13;;;:11;:13;;;:::i;:::-;;;;;;67428:1568;;67379:1617;:::o;3116:191::-;3209:6;;;-1:-1:-1;;;;;3226:17:0;;;-1:-1:-1;;;;;;3226:17:0;;;;;;;3259:40;;3209:6;;;3226:17;3209:6;;3259:40;;3190:16;;3259:40;3179:128;3116:191;:::o;27772:158::-;27846:7;27897:22;27901:3;27913:5;27897:3;:22::i;61972:363::-;62139:28;62149:4;62155:2;62159:7;62139:9;:28::i;:::-;62200:48;62223:4;62229:2;62233:7;62242:5;62200:22;:48::i;:::-;62178:149;;;;-1:-1:-1;;;62178:149:0;;;;;;;:::i;:::-;61972:363;;;;:::o;34296:190::-;34421:4;34474;34445:25;34458:5;34465:4;34445:12;:25::i;:::-;:33;;34296:190;-1:-1:-1;;;;34296:190:0:o;62741:104::-;62810:27;62820:2;62824:8;62810:27;;;;;;;;;;;;:9;:27::i;77942:112::-;78002:13;78033;78026:20;;;;;:::i;7713:723::-;7769:13;7990:10;7986:53;;-1:-1:-1;;8017:10:0;;;;;;;;;;;;-1:-1:-1;;;8017:10:0;;;;;7713:723::o;7986:53::-;8064:5;8049:12;8105:78;8112:9;;8105:78;;8138:8;;;;:::i;:::-;;-1:-1:-1;8161:10:0;;-1:-1:-1;8169:2:0;8161:10;;:::i;:::-;;;8105:78;;;8193:19;8225:6;-1:-1:-1;;;;;8215:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8215:17:0;;8193:39;;8243:154;8250:10;;8243:154;;8277:11;8287:1;8277:11;;:::i;:::-;;-1:-1:-1;8346:10:0;8354:2;8346:5;:10;:::i;:::-;8333:24;;:2;:24;:::i;:::-;8320:39;;8303:6;8310;8303:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8303:56:0;;;;;;;;-1:-1:-1;8374:11:0;8383:2;8374:11;;:::i;:::-;;;8243:154;;;8421:6;7713:723;-1:-1:-1;;;;7713:723:0:o;27301:117::-;27364:7;27391:19;27399:3;22785:18;;22702:109;20391:414;20454:4;22584:19;;;:12;;;:19;;;;;;20471:327;;-1:-1:-1;20514:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;20697:18;;20675:19;;;:12;;;:19;;;;;;:40;;;;20730:11;;20471:327;-1:-1:-1;20781:5:0;20774:12;;13716:204;13801:4;-1:-1:-1;;;;;;13825:47:0;;-1:-1:-1;;;13825:47:0;;:87;;;13876:36;13900:11;13876:23;:36::i;65283:1867::-;65398:35;65436:20;65448:7;65436:11;:20::i;:::-;65511:18;;65398:58;;-1:-1:-1;65469:22:0;;-1:-1:-1;;;;;65495:34:0;736:10;-1:-1:-1;;;;;65495:34:0;;:87;;;-1:-1:-1;736:10:0;65546:20;65558:7;65546:11;:20::i;:::-;-1:-1:-1;;;;;65546:36:0;;65495:87;:154;;;-1:-1:-1;65616:18:0;;65599:50;;736:10;61244:164;:::i;65599:50::-;65469:181;;65671:17;65663:80;;;;-1:-1:-1;;;65663:80:0;;25767:2:1;65663:80:0;;;25749:21:1;25806:2;25786:18;;;25779:30;25845:34;25825:18;;;25818:62;-1:-1:-1;;;25896:18:1;;;25889:48;25954:19;;65663:80:0;25565:414:1;65663:80:0;65786:4;-1:-1:-1;;;;;65764:26:0;:13;:18;;;-1:-1:-1;;;;;65764:26:0;;65756:77;;;;-1:-1:-1;;;65756:77:0;;26186:2:1;65756:77:0;;;26168:21:1;26225:2;26205:18;;;26198:30;26264:34;26244:18;;;26237:62;-1:-1:-1;;;26315:18:1;;;26308:36;26361:19;;65756:77:0;25984:402:1;65756:77:0;-1:-1:-1;;;;;65852:16:0;;65844:66;;;;-1:-1:-1;;;65844:66:0;;26593:2:1;65844:66:0;;;26575:21:1;26632:2;26612:18;;;26605:30;26671:34;26651:18;;;26644:62;-1:-1:-1;;;26722:18:1;;;26715:35;26767:19;;65844:66:0;26391:401:1;65844:66:0;66031:49;66048:1;66052:7;66061:13;:18;;;66031:8;:49::i;:::-;-1:-1:-1;;;;;66285:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;;66285:31:0;;;;;;;;;-1:-1:-1;;66285:31:0;;;;;;;66331:16;;;;;;;;;:29;;;;;66315:1;66331:29;;;;;;;;;;;;66384:20;;;:11;:20;;;;;;:30;;66470:15;66425:61;;;-1:-1:-1;;;66425:61:0;-1:-1:-1;;;;;;66425:61:0;;;;;;;;;66285:18;66748:11;;66396:7;;66748:11;:::i;:::-;66815:1;66774:24;;;:11;:24;;;;;:29;66726:33;;-1:-1:-1;;;;;;66774:29:0;66770:275;;66838:20;66846:11;66838:7;:20::i;:::-;66834:200;;;66911:18;;;66879:24;;;:11;:24;;;;;;;;:50;;66990:28;;;;-1:-1:-1;;;;;66948:70:0;-1:-1:-1;;;66948:70:0;-1:-1:-1;;;;;;66948:70:0;;;-1:-1:-1;;;;;66879:50:0;;;66948:70;;;;;;;66834:200;67081:7;67077:2;-1:-1:-1;;;;;67062:27:0;67071:4;-1:-1:-1;;;;;67062:27:0;;;;;;;;;;;67100:42;65387:1763;;;65283:1867;;;:::o;9014:451::-;9089:13;9115:19;9147:10;9151:6;9147:1;:10;:::i;:::-;:14;;9160:1;9147:14;:::i;:::-;-1:-1:-1;;;;;9137:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9137:25:0;;9115:47;;-1:-1:-1;;;9173:6:0;9180:1;9173:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;9173:15:0;;;;;;;;;-1:-1:-1;;;9199:6:0;9206:1;9199:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;9199:15:0;;;;;;;;-1:-1:-1;9230:9:0;9242:10;9246:6;9242:1;:10;:::i;:::-;:14;;9255:1;9242:14;:::i;:::-;9230:26;;9225:135;9262:1;9258;:5;9225:135;;;-1:-1:-1;;;9310:5:0;9318:3;9310:11;9297:25;;;;;;;:::i;:::-;;;;9285:6;9292:1;9285:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;9285:37:0;;;;;;;;-1:-1:-1;9347:1:0;9337:11;;;;;9265:3;;;:::i;:::-;;;9225:135;;;-1:-1:-1;9378:10:0;;9370:55;;;;-1:-1:-1;;;9370:55:0;;26999:2:1;9370:55:0;;;26981:21:1;;;27018:18;;;27011:30;27077:34;27057:18;;;27050:62;27129:18;;9370:55:0;26797:356:1;18455:239:0;18539:22;18547:4;18553:7;18539;:22::i;:::-;18535:152;;;18610:5;18578:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18578:29:0;;;;;;;;;;:37;;-1:-1:-1;;18578:37:0;;;18635:40;736:10;;18578:12;;18635:40;;18610:5;18635:40;18455:239;;:::o;26804:158::-;26877:4;26901:53;26909:3;-1:-1:-1;;;;;26929:23:0;;26901:7;:53::i;23165:120::-;23232:7;23259:3;:11;;23271:5;23259:18;;;;;;;;:::i;:::-;;;;;;;;;23252:25;;23165:120;;;;:::o;70486:804::-;70641:4;-1:-1:-1;;;;;70662:13:0;;44579:19;:23;70658:625;;70698:72;;-1:-1:-1;;;70698:72:0;;-1:-1:-1;;;;;70698:36:0;;;;;:72;;736:10;;70749:4;;70755:7;;70764:5;;70698:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70698:72:0;;;;;;;;-1:-1:-1;;70698:72:0;;;;;;;;;;;;:::i;:::-;;;70694:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70944:13:0;;70940:273;;70987:61;;-1:-1:-1;;;70987:61:0;;;;;;;:::i;70940:273::-;71163:6;71157:13;71148:6;71144:2;71140:15;71133:38;70694:534;-1:-1:-1;;;;;;70821:55:0;-1:-1:-1;;;70821:55:0;;-1:-1:-1;70814:62:0;;70658:625;-1:-1:-1;71267:4:0;70486:804;;;;;;:::o;34848:675::-;34931:7;34974:4;34931:7;34989:497;35013:5;:12;35009:1;:16;34989:497;;;35047:20;35070:5;35076:1;35070:8;;;;;;;;:::i;:::-;;;;;;;35047:31;;35113:12;35097;:28;35093:382;;35599:13;35649:15;;;35685:4;35678:15;;;35732:4;35716:21;;35225:57;;35093:382;;;35599:13;35649:15;;;35685:4;35678:15;;;35732:4;35716:21;;35402:57;;35093:382;-1:-1:-1;35027:3:0;;;;:::i;:::-;;;;34989:497;;;-1:-1:-1;35503:12:0;34848:675;-1:-1:-1;;;34848:675:0:o;63208:163::-;63331:32;63337:2;63341:8;63351:5;63358:4;63331:5;:32::i;56566:372::-;56668:4;-1:-1:-1;;;;;;56705:40:0;;-1:-1:-1;;;56705:40:0;;:105;;-1:-1:-1;;;;;;;56762:48:0;;-1:-1:-1;;;56762:48:0;56705:105;:172;;;-1:-1:-1;;;;;;;56827:50:0;;-1:-1:-1;;;56827:50:0;56705:172;:225;;;-1:-1:-1;;;;;;;;;;11168:40:0;;;56894:36;11059:157;20981:1420;21047:4;21186:19;;;:12;;;:19;;;;;;21222:15;;21218:1176;;21597:21;21621:14;21634:1;21621:10;:14;:::i;:::-;21670:18;;21597:38;;-1:-1:-1;21650:17:0;;21670:22;;21691:1;;21670:22;:::i;:::-;21650:42;;21726:13;21713:9;:26;21709:405;;21760:17;21780:3;:11;;21792:9;21780:22;;;;;;;;:::i;:::-;;;;;;;;;21760:42;;21934:9;21905:3;:11;;21917:13;21905:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;22019:23;;;:12;;;:23;;;;;:36;;;21709:405;22195:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;22290:3;:12;;:19;22303:5;22290:19;;;;;;;;;;;22283:26;;;22333:4;22326:11;;;;;;;21218:1176;22377:5;22370:12;;;;;63630:1399;63769:20;63792:12;-1:-1:-1;;;;;63823:16:0;;63815:62;;;;-1:-1:-1;;;63815:62:0;;28240:2:1;63815:62:0;;;28222:21:1;28279:2;28259:18;;;28252:30;28318:34;28298:18;;;28291:62;-1:-1:-1;;;28369:18:1;;;28362:31;28410:19;;63815:62:0;28038:397:1;63815:62:0;64022:21;64030:12;64022:7;:21::i;:::-;64021:22;64013:64;;;;-1:-1:-1;;;64013:64:0;;28642:2:1;64013:64:0;;;28624:21:1;28681:2;28661:18;;;28654:30;28720:31;28700:18;;;28693:59;28769:18;;64013:64:0;28440:353:1;64013:64:0;64107:1;64096:8;:12;64088:65;;;;-1:-1:-1;;;64088:65:0;;29000:2:1;64088:65:0;;;28982:21:1;29039:2;29019:18;;;29012:30;29078:34;29058:18;;;29051:62;-1:-1:-1;;;29129:18:1;;;29122:38;29177:19;;64088:65:0;28798:404:1;64088:65:0;-1:-1:-1;;;;;64240:16:0;;;;;;:12;:16;;;;;:44;;64275:8;;64240:16;:44;;64275:8;;-1:-1:-1;;;;;64240:44:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;64240:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;64295:16:0;;-1:-1:-1;64295:16:0;;;:12;:16;;;;;:49;;64335:8;;-1:-1:-1;64295:16:0;;:29;;:49;;64335:8;;64295:49;;;;;:::i;:::-;;;-1:-1:-1;;;;;64295:49:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64357:25:0;;;:11;:25;;;;;:35;;64453:15;64403:66;;;-1:-1:-1;;;64403:66:0;-1:-1:-1;;;;;;64403:66:0;;;-1:-1:-1;;;;;64357:35:0;;64403:66;;;;;;;;64369:12;;-1:-1:-1;64530:381:0;64554:8;64550:1;:12;64530:381;;;64589:38;;64614:12;;-1:-1:-1;;;;;64589:38:0;;;64606:1;;64589:38;;64606:1;;64589:38;64646:4;64642:229;;;64701:59;64732:1;64736:2;64740:12;64754:5;64701:22;:59::i;:::-;64671:184;;;;-1:-1:-1;;;64671:184:0;;;;;;;:::i;:::-;64885:14;;;;:::i;:::-;;;;64564:3;;;;;:::i;:::-;;;;64530:381;;;-1:-1:-1;64923:12:0;:27;;;64961:60;61972:363;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;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:1;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:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1: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:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;3055:254::-;3123:6;3131;3184:2;3172:9;3163:7;3159:23;3155:32;3152:52;;;3200:1;3197;3190:12;3152:52;3236:9;3223:23;3213:33;;3265:38;3299:2;3288:9;3284:18;3265:38;:::i;:::-;3255:48;;3055:254;;;;;:::o;3314:160::-;3379:20;;3435:13;;3428:21;3418:32;;3408:60;;3464:1;3461;3454:12;3479:180;3535:6;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3627:26;3643:9;3627:26;:::i;3664:127::-;3725:10;3720:3;3716:20;3713:1;3706:31;3756:4;3753:1;3746:15;3780:4;3777:1;3770:15;3796:922;3865:6;3918:2;3906:9;3897:7;3893:23;3889:32;3886:52;;;3934:1;3931;3924:12;3886:52;3974:9;3961:23;-1:-1:-1;;;;;4044:2:1;4036:6;4033:14;4030:34;;;4060:1;4057;4050:12;4030:34;4098:6;4087:9;4083:22;4073:32;;4143:7;4136:4;4132:2;4128:13;4124:27;4114:55;;4165:1;4162;4155:12;4114:55;4201:2;4188:16;4223:2;4219;4216:10;4213:36;;;4229:18;;:::i;:::-;4304:2;4298:9;4272:2;4358:13;;-1:-1:-1;;4354:22:1;;;4378:2;4350:31;4346:40;4334:53;;;4402:18;;;4422:22;;;4399:46;4396:72;;;4448:18;;:::i;:::-;4488:10;4484:2;4477:22;4523:2;4515:6;4508:18;4563:7;4558:2;4553;4549;4545:11;4541:20;4538:33;4535:53;;;4584:1;4581;4574:12;4535:53;4640:2;4635;4631;4627:11;4622:2;4614:6;4610:15;4597:46;4685:1;4663:15;;;4680:2;4659:24;4652:35;;;;-1:-1:-1;4667:6:1;3796:922;-1:-1:-1;;;;;3796:922:1:o;4723:270::-;4796:6;4849:2;4837:9;4828:7;4824:23;4820:32;4817:52;;;4865:1;4862;4855:12;4817:52;4904:9;4891:23;4943:1;4936:5;4933:12;4923:40;;4959:1;4956;4949:12;4998:127;5059:10;5054:3;5050:20;5047:1;5040:31;5090:4;5087:1;5080:15;5114:4;5111:1;5104:15;5130:342;5276:2;5261:18;;5309:1;5298:13;;5288:144;;5354:10;5349:3;5345:20;5342:1;5335:31;5389:4;5386:1;5379:15;5417:4;5414:1;5407:15;5288:144;5441:25;;;5130:342;:::o;5477:186::-;5536:6;5589:2;5577:9;5568:7;5564:23;5560:32;5557:52;;;5605:1;5602;5595:12;5557:52;5628:29;5647:9;5628:29;:::i;5668:248::-;5736:6;5744;5797:2;5785:9;5776:7;5772:23;5768:32;5765:52;;;5813:1;5810;5803:12;5765:52;-1:-1:-1;;5836:23:1;;;5906:2;5891:18;;;5878:32;;-1:-1:-1;5668:248:1:o;6174:254::-;6239:6;6247;6300:2;6288:9;6279:7;6275:23;6271:32;6268:52;;;6316:1;6313;6306:12;6268:52;6339:29;6358:9;6339:29;:::i;:::-;6329:39;;6387:35;6418:2;6407:9;6403:18;6387:35;:::i;6433:808::-;6530:6;6538;6546;6554;6562;6615:3;6603:9;6594:7;6590:23;6586:33;6583:53;;;6632:1;6629;6622:12;6583:53;6655:29;6674:9;6655:29;:::i;:::-;6645:39;;6703:38;6737:2;6726:9;6722:18;6703:38;:::i;:::-;6693:48;;6788:2;6777:9;6773:18;6760:32;6750:42;;6843:2;6832:9;6828:18;6815:32;-1:-1:-1;;;;;6907:2:1;6899:6;6896:14;6893:34;;;6923:1;6920;6913:12;6893:34;6961:6;6950:9;6946:22;6936:32;;7006:7;6999:4;6995:2;6991:13;6987:27;6977:55;;7028:1;7025;7018:12;6977:55;7068:2;7055:16;7094:2;7086:6;7083:14;7080:34;;;7110:1;7107;7100:12;7080:34;7155:7;7150:2;7141:6;7137:2;7133:15;7129:24;7126:37;7123:57;;;7176:1;7173;7166:12;7123:57;6433:808;;;;-1:-1:-1;6433:808:1;;-1:-1:-1;7207:2:1;7199:11;;7229:6;6433:808;-1:-1:-1;;;6433:808:1:o;7246:367::-;7309:8;7319:6;7373:3;7366:4;7358:6;7354:17;7350:27;7340:55;;7391:1;7388;7381:12;7340:55;-1:-1:-1;7414:20:1;;-1:-1:-1;;;;;7446:30:1;;7443:50;;;7489:1;7486;7479:12;7443:50;7526:4;7518:6;7514:17;7502:29;;7586:3;7579:4;7569:6;7566:1;7562:14;7554:6;7550:27;7546:38;7543:47;7540:67;;;7603:1;7600;7593:12;7540:67;7246:367;;;;;:::o;7618:505::-;7713:6;7721;7729;7782:2;7770:9;7761:7;7757:23;7753:32;7750:52;;;7798:1;7795;7788:12;7750:52;7834:9;7821:23;7811:33;;7895:2;7884:9;7880:18;7867:32;-1:-1:-1;;;;;7914:6:1;7911:30;7908:50;;;7954:1;7951;7944:12;7908:50;7993:70;8055:7;8046:6;8035:9;8031:22;7993:70;:::i;:::-;7618:505;;8082:8;;-1:-1:-1;7967:96:1;;-1:-1:-1;;;;7618:505:1:o;8128:437::-;8214:6;8222;8275:2;8263:9;8254:7;8250:23;8246:32;8243:52;;;8291:1;8288;8281:12;8243:52;8331:9;8318:23;-1:-1:-1;;;;;8356:6:1;8353:30;8350:50;;;8396:1;8393;8386:12;8350:50;8435:70;8497:7;8488:6;8477:9;8473:22;8435:70;:::i;:::-;8524:8;;8409:96;;-1:-1:-1;8128:437:1;-1:-1:-1;;;;8128:437:1:o;8570:260::-;8638:6;8646;8699:2;8687:9;8678:7;8674:23;8670:32;8667:52;;;8715:1;8712;8705:12;8667:52;8738:29;8757:9;8738:29;:::i;:::-;8728:39;;8786:38;8820:2;8809:9;8805:18;8786:38;:::i;8835:380::-;8914:1;8910:12;;;;8957;;;8978:61;;9032:4;9024:6;9020:17;9010:27;;8978:61;9085:2;9077:6;9074:14;9054:18;9051:38;9048:161;;;9131:10;9126:3;9122:20;9119:1;9112:31;9166:4;9163:1;9156:15;9194:4;9191:1;9184:15;9048:161;;8835:380;;;:::o;10463:127::-;10524:10;10519:3;10515:20;10512:1;10505:31;10555:4;10552:1;10545:15;10579:4;10576:1;10569:15;10595:125;10635:4;10663:1;10660;10657:8;10654:34;;;10668:18;;:::i;:::-;-1:-1:-1;10705:9:1;;10595:125::o;10725:343::-;10927:2;10909:21;;;10966:2;10946:18;;;10939:30;-1:-1:-1;;;11000:2:1;10985:18;;10978:49;11059:2;11044:18;;10725:343::o;11476:135::-;11515:3;-1:-1:-1;;11536:17:1;;11533:43;;;11556:18;;:::i;:::-;-1:-1:-1;11603:1:1;11592:13;;11476:135::o;12447:356::-;12649:2;12631:21;;;12668:18;;;12661:30;12727:34;12722:2;12707:18;;12700:62;12794:2;12779:18;;12447:356::o;17195:404::-;17397:2;17379:21;;;17436:2;17416:18;;;17409:30;17475:34;17470:2;17455:18;;17448:62;-1:-1:-1;;;17541:2:1;17526:18;;17519:38;17589:3;17574:19;;17195:404::o;18241:128::-;18281:3;18312:1;18308:6;18305:1;18302:13;18299:39;;;18318:18;;:::i;:::-;-1:-1:-1;18354:9:1;;18241:128::o;18374:397::-;18576:2;18558:21;;;18615:2;18595:18;;;18588:30;18654:34;18649:2;18634:18;;18627:62;-1:-1:-1;;;18720:2:1;18705:18;;18698:31;18761:3;18746:19;;18374:397::o;19130:168::-;19170:7;19236:1;19232;19228:6;19224:14;19221:1;19218:21;19213:1;19206:9;19199:17;19195:45;19192:71;;;19243:18;;:::i;:::-;-1:-1:-1;19283:9:1;;19130:168::o;19303:402::-;19505:2;19487:21;;;19544:2;19524:18;;;19517:30;19583:34;19578:2;19563:18;;19556:62;-1:-1:-1;;;19649:2:1;19634:18;;19627:36;19695:3;19680:19;;19303:402::o;20126:470::-;20305:3;20343:6;20337:13;20359:53;20405:6;20400:3;20393:4;20385:6;20381:17;20359:53;:::i;:::-;20475:13;;20434:16;;;;20497:57;20475:13;20434:16;20531:4;20519:17;;20497:57;:::i;:::-;20570:20;;20126:470;-1:-1:-1;;;;20126:470:1:o;22117:127::-;22178:10;22173:3;22169:20;22166:1;22159:31;22209:4;22206:1;22199:15;22233:4;22230:1;22223:15;23012:786;23423:25;23418:3;23411:38;23393:3;23478:6;23472:13;23494:62;23549:6;23544:2;23539:3;23535:12;23528:4;23520:6;23516:17;23494:62;:::i;:::-;-1:-1:-1;;;23615:2:1;23575:16;;;23607:11;;;23600:40;23665:13;;23687:63;23665:13;23736:2;23728:11;;23721:4;23709:17;;23687:63;:::i;:::-;23770:17;23789:2;23766:26;;23012:786;-1:-1:-1;;;;23012:786:1:o;24214:136::-;24253:3;24281:5;24271:39;;24290:18;;:::i;:::-;-1:-1:-1;;;24326:18:1;;24214:136::o;24771:415::-;24973:2;24955:21;;;25012:2;24992:18;;;24985:30;25051:34;25046:2;25031:18;;25024:62;-1:-1:-1;;;25117:2:1;25102:18;;25095:49;25176:3;25161:19;;24771:415::o;25191:127::-;25252:10;25247:3;25243:20;25240:1;25233:31;25283:4;25280:1;25273:15;25307:4;25304:1;25297:15;25323:120;25363:1;25389;25379:35;;25394:18;;:::i;:::-;-1:-1:-1;25428:9:1;;25323:120::o;25448:112::-;25480:1;25506;25496:35;;25511:18;;:::i;:::-;-1:-1:-1;25545:9:1;;25448:112::o;27158:489::-;-1:-1:-1;;;;;27427:15:1;;;27409:34;;27479:15;;27474:2;27459:18;;27452:43;27526:2;27511:18;;27504:34;;;27574:3;27569:2;27554:18;;27547:31;;;27352:4;;27595:46;;27621:19;;27613:6;27595:46;:::i;:::-;27587:54;27158:489;-1:-1:-1;;;;;;27158:489:1:o;27652:249::-;27721:6;27774:2;27762:9;27753:7;27749:23;27745:32;27742:52;;;27790:1;27787;27780:12;27742:52;27822:9;27816:16;27841:30;27865:5;27841:30;:::i;27906:127::-;27967:10;27962:3;27958:20;27955:1;27948:31;27998:4;27995:1;27988:15;28022:4;28019:1;28012:15;29207:236;29246:3;-1:-1:-1;;;;;29319:2:1;29316:1;29312:10;29349:2;29346:1;29342:10;29380:3;29376:2;29372:12;29367:3;29364:21;29361:47;;;29388:18;;:::i
Swarm Source
ipfs://fa5aee91f5733441a3fd59e62fd3ecfc7d19ee5a896a39400d6a83499cb199d5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.