Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,055 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 24221460 | 72 days ago | IN | 0 ETH | 0.00000185 | ||||
| Set Approval For... | 24158065 | 81 days ago | IN | 0 ETH | 0.00000174 | ||||
| Set Approval For... | 23776910 | 135 days ago | IN | 0 ETH | 0.00003336 | ||||
| Set Approval For... | 23776879 | 135 days ago | IN | 0 ETH | 0.00002486 | ||||
| Set Approval For... | 23764173 | 136 days ago | IN | 0 ETH | 0.00000395 | ||||
| Set Approval For... | 23261328 | 207 days ago | IN | 0 ETH | 0.00001157 | ||||
| Set Approval For... | 23077994 | 232 days ago | IN | 0 ETH | 0.00000834 | ||||
| Set Approval For... | 22996548 | 244 days ago | IN | 0 ETH | 0.00013423 | ||||
| Set Approval For... | 22954095 | 250 days ago | IN | 0 ETH | 0.00015068 | ||||
| Set Approval For... | 22485344 | 315 days ago | IN | 0 ETH | 0.00006369 | ||||
| Set Approval For... | 22485342 | 315 days ago | IN | 0 ETH | 0.00006021 | ||||
| Set Approval For... | 22030460 | 379 days ago | IN | 0 ETH | 0.00003162 | ||||
| Safe Transfer Fr... | 22017376 | 381 days ago | IN | 0 ETH | 0.0004105 | ||||
| Transfer From | 22002394 | 383 days ago | IN | 0 ETH | 0.00011467 | ||||
| Set Approval For... | 21903132 | 397 days ago | IN | 0 ETH | 0.00005803 | ||||
| Set Approval For... | 21897443 | 397 days ago | IN | 0 ETH | 0.00005228 | ||||
| Set Approval For... | 21795313 | 412 days ago | IN | 0 ETH | 0.0001672 | ||||
| Set Approval For... | 21794519 | 412 days ago | IN | 0 ETH | 0.00004594 | ||||
| Safe Transfer Fr... | 21794506 | 412 days ago | IN | 0 ETH | 0.00010685 | ||||
| Set Approval For... | 21078105 | 512 days ago | IN | 0 ETH | 0.00045929 | ||||
| Transfer From | 20883876 | 539 days ago | IN | 0 ETH | 0.00086783 | ||||
| Set Approval For... | 20550829 | 585 days ago | IN | 0 ETH | 0.00008588 | ||||
| Transfer From | 20546320 | 586 days ago | IN | 0 ETH | 0.00008149 | ||||
| Set Approval For... | 20546304 | 586 days ago | IN | 0 ETH | 0.00005005 | ||||
| Set Approval For... | 20546301 | 586 days ago | IN | 0 ETH | 0.00004902 |
Latest 17 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 14984702 | 1377 days ago | 1.4 ETH | ||||
| - | 14972535 | 1379 days ago | 1.4 ETH | ||||
| - | 14933094 | 1386 days ago | 1.62 ETH | ||||
| - | 14911672 | 1389 days ago | 1.62 ETH | ||||
| - | 14829543 | 1403 days ago | 9.72 ETH | ||||
| - | 14786580 | 1410 days ago | 2.4 ETH | ||||
| - | 14698854 | 1424 days ago | 1.06 ETH | ||||
| - | 14691840 | 1425 days ago | 0.53 ETH | ||||
| - | 14668162 | 1429 days ago | 0.49 ETH | ||||
| - | 14564656 | 1445 days ago | 0.98 ETH | ||||
| - | 14424279 | 1467 days ago | 0.6 ETH | ||||
| - | 14315646 | 1484 days ago | 1.8 ETH | ||||
| - | 14249455 | 1494 days ago | 5.7 ETH | ||||
| - | 14115307 | 1515 days ago | 27 ETH | ||||
| - | 14030006 | 1528 days ago | 38.7 ETH | ||||
| - | 13972900 | 1537 days ago | 29 ETH | ||||
| - | 13964922 | 1538 days ago | 107.8 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PantheonBusinessClub
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-01-06
*/
/**
██████╗░░█████╗░███╗░░██╗████████╗██╗░░██╗███████╗░█████╗░███╗░░██╗
██╔══██╗██╔══██╗████╗░██║╚══██╔══╝██║░░██║██╔════╝██╔══██╗████╗░██║
██████╔╝███████║██╔██╗██║░░░██║░░░███████║█████╗░░██║░░██║██╔██╗██║
██╔═══╝░██╔══██║██║╚████║░░░██║░░░██╔══██║██╔══╝░░██║░░██║██║╚████║
██║░░░░░██║░░██║██║░╚███║░░░██║░░░██║░░██║███████╗╚█████╔╝██║░╚███║
╚═╝░░░░░╚═╝░░╚═╝╚═╝░░╚══╝░░░╚═╝░░░╚═╝░░╚═╝╚══════╝░╚════╝░╚═╝░░╚══╝
██████╗░██╗░░░██╗░██████╗██╗███╗░░██╗███████╗░██████╗░██████╗ ░█████╗░██╗░░░░░██╗░░░██╗██████╗░
██╔══██╗██║░░░██║██╔════╝██║████╗░██║██╔════╝██╔════╝██╔════╝ ██╔══██╗██║░░░░░██║░░░██║██╔══██╗
██████╦╝██║░░░██║╚█████╗░██║██╔██╗██║█████╗░░╚█████╗░╚█████╗░ ██║░░╚═╝██║░░░░░██║░░░██║██████╦╝
██╔══██╗██║░░░██║░╚═══██╗██║██║╚████║██╔══╝░░░╚═══██╗░╚═══██╗ ██║░░██╗██║░░░░░██║░░░██║██╔══██╗
██████╦╝╚██████╔╝██████╔╝██║██║░╚███║███████╗██████╔╝██████╔╝ ╚█████╔╝███████╗╚██████╔╝██████╦╝
╚═════╝░░╚═════╝░╚═════╝░╚═╝╚═╝░░╚══╝╚══════╝╚═════╝░╚═════╝░ ░╚════╝░╚══════╝░╚═════╝░╚═════╝░
*/
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [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);
}
}
}
}
// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)
pragma solidity ^0.8.0;
/**
* @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 v4.4.1 (utils/structs/EnumerableMap.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for managing an enumerable variant of Solidity's
* https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
* type.
*
* Maps have the following properties:
*
* - Entries are added, removed, and checked for existence in constant time
* (O(1)).
* - Entries are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableMap for EnumerableMap.UintToAddressMap;
*
* // Declare a set state variable
* EnumerableMap.UintToAddressMap private myMap;
* }
* ```
*
* As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
* supported.
*/
library EnumerableMap {
using EnumerableSet for EnumerableSet.Bytes32Set;
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Map type with
// bytes32 keys and values.
// The Map implementation uses private functions, and user-facing
// implementations (such as Uint256ToAddressMap) are just wrappers around
// the underlying Map.
// This means that we can only create new EnumerableMaps for types that fit
// in bytes32.
struct Map {
// Storage of keys
EnumerableSet.Bytes32Set _keys;
mapping(bytes32 => bytes32) _values;
}
/**
* @dev Adds a key-value pair to a map, or updates the value for an existing
* key. O(1).
*
* Returns true if the key was added to the map, that is if it was not
* already present.
*/
function _set(
Map storage map,
bytes32 key,
bytes32 value
) private returns (bool) {
map._values[key] = value;
return map._keys.add(key);
}
/**
* @dev Removes a key-value pair from a map. O(1).
*
* Returns true if the key was removed from the map, that is if it was present.
*/
function _remove(Map storage map, bytes32 key) private returns (bool) {
delete map._values[key];
return map._keys.remove(key);
}
/**
* @dev Returns true if the key is in the map. O(1).
*/
function _contains(Map storage map, bytes32 key) private view returns (bool) {
return map._keys.contains(key);
}
/**
* @dev Returns the number of key-value pairs in the map. O(1).
*/
function _length(Map storage map) private view returns (uint256) {
return map._keys.length();
}
/**
* @dev Returns the key-value pair stored at position `index` in the map. O(1).
*
* Note that there are no guarantees on the ordering of entries inside the
* array, and it may change when more entries are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
bytes32 key = map._keys.at(index);
return (key, map._values[key]);
}
/**
* @dev Tries to returns the value associated with `key`. O(1).
* Does not revert if `key` is not in the map.
*/
function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
bytes32 value = map._values[key];
if (value == bytes32(0)) {
return (_contains(map, key), bytes32(0));
} else {
return (true, value);
}
}
/**
* @dev Returns the value associated with `key`. O(1).
*
* Requirements:
*
* - `key` must be in the map.
*/
function _get(Map storage map, bytes32 key) private view returns (bytes32) {
bytes32 value = map._values[key];
require(value != 0 || _contains(map, key), "EnumerableMap: nonexistent key");
return value;
}
/**
* @dev Same as {_get}, with a custom error message when `key` is not in the map.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {_tryGet}.
*/
function _get(
Map storage map,
bytes32 key,
string memory errorMessage
) private view returns (bytes32) {
bytes32 value = map._values[key];
require(value != 0 || _contains(map, key), errorMessage);
return value;
}
// UintToAddressMap
struct UintToAddressMap {
Map _inner;
}
/**
* @dev Adds a key-value pair to a map, or updates the value for an existing
* key. O(1).
*
* Returns true if the key was added to the map, that is if it was not
* already present.
*/
function set(
UintToAddressMap storage map,
uint256 key,
address value
) internal returns (bool) {
return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the key was removed from the map, that is if it was present.
*/
function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
return _remove(map._inner, bytes32(key));
}
/**
* @dev Returns true if the key is in the map. O(1).
*/
function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
return _contains(map._inner, bytes32(key));
}
/**
* @dev Returns the number of elements in the map. O(1).
*/
function length(UintToAddressMap storage map) internal view returns (uint256) {
return _length(map._inner);
}
/**
* @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
(bytes32 key, bytes32 value) = _at(map._inner, index);
return (uint256(key), address(uint160(uint256(value))));
}
/**
* @dev Tries to returns the value associated with `key`. O(1).
* Does not revert if `key` is not in the map.
*
* _Available since v3.4._
*/
function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
(bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
return (success, address(uint160(uint256(value))));
}
/**
* @dev Returns the value associated with `key`. O(1).
*
* Requirements:
*
* - `key` must be in the map.
*/
function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
return address(uint160(uint256(_get(map._inner, bytes32(key)))));
}
/**
* @dev Same as {get}, with a custom error message when `key` is not in the map.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryGet}.
*/
function get(
UintToAddressMap storage map,
uint256 key,
string memory errorMessage
) internal view returns (address) {
return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
}
}
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Base URI
string private _baseURI = "";
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// Fonction to lock the sale of the NFT
bool public isSecondaryMarketOpen = false;
mapping(address => bool) public whitelistTransfer;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
// Fonction to lock the sale of the NFT or to unlock
function _changeSecondaryMarketState() internal virtual {
isSecondaryMarketOpen = !isSecondaryMarketOpen;
}
// Fonction add or remove address from transfer Whitelist
function _modifyAuthorizedSellers(address[] memory addresses, bool state) internal virtual {
for (uint256 i = 0; i < addresses.length; i++) {
whitelistTransfer[addresses[i]] = state;
}
}
// View Function to check if an adress is present on the map whiteListTransfer
function _isWhitelistTransfer(address addr) internal view virtual returns (bool) {
return whitelistTransfer[addr];
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI_ = baseURI();
return bytes(baseURI_).length > 0 ? string(abi.encodePacked(baseURI_, tokenId.toString())) : "";
}
function baseURI() public view virtual returns (string memory) {
return _baseURI;
}
function _setBaseURI(string memory baseURI_) internal virtual {
_baseURI = baseURI_;
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
//require(isSecondaryMarketOpen == true, "Secondary Market sale is not open");
if (isSecondaryMarketOpen == false){
require(whitelistTransfer[from], "Transfer is not authorized for the Sender : contact the project team to be on the Whitelist");
}
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits a {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)
pragma solidity ^0.8.0;
/**
* @title PaymentSplitter
* @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
* that the Ether will be split in this way, since it is handled transparently by the contract.
*
* The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
* account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
* an amount proportional to the percentage of total shares they were assigned.
*
* `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
* accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
* function.
*
* NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
* tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
* to run tests before sending real value to this contract.
*/
contract PaymentSplitter is Context {
event PayeeAdded(address account, uint256 shares);
event PaymentReleased(address to, uint256 amount);
event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
event PaymentReceived(address from, uint256 amount);
uint256 private _totalShares;
uint256 private _totalReleased;
mapping(address => uint256) private _shares;
mapping(address => uint256) private _released;
address[] private _payees;
mapping(IERC20 => uint256) private _erc20TotalReleased;
mapping(IERC20 => mapping(address => uint256)) private _erc20Released;
/**
* @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
* the matching position in the `shares` array.
*
* All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
* duplicates in `payees`.
*/
constructor(address[] memory payees, uint256[] memory shares_) payable {
require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
require(payees.length > 0, "PaymentSplitter: no payees");
for (uint256 i = 0; i < payees.length; i++) {
_addPayee(payees[i], shares_[i]);
}
}
/**
* @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
* reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
* reliability of the events, and not the actual splitting of Ether.
*
* To learn more about this see the Solidity documentation for
* https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
* functions].
*/
receive() external payable virtual {
emit PaymentReceived(_msgSender(), msg.value);
}
/**
* @dev Getter for the total shares held by payees.
*/
function totalShares() public view returns (uint256) {
return _totalShares;
}
/**
* @dev Getter for the total amount of Ether already released.
*/
function totalReleased() public view returns (uint256) {
return _totalReleased;
}
/**
* @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
* contract.
*/
function totalReleased(IERC20 token) public view returns (uint256) {
return _erc20TotalReleased[token];
}
/**
* @dev Getter for the amount of shares held by an account.
*/
function shares(address account) public view returns (uint256) {
return _shares[account];
}
/**
* @dev Getter for the amount of Ether already released to a payee.
*/
function released(address account) public view returns (uint256) {
return _released[account];
}
/**
* @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
* IERC20 contract.
*/
function released(IERC20 token, address account) public view returns (uint256) {
return _erc20Released[token][account];
}
/**
* @dev Getter for the address of the payee number `index`.
*/
function payee(uint256 index) public view returns (address) {
return _payees[index];
}
/**
* @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
* total shares and their previous withdrawals.
*/
function release(address payable account) public virtual {
require(_shares[account] > 0, "PaymentSplitter: account has no shares");
uint256 totalReceived = address(this).balance + totalReleased();
uint256 payment = _pendingPayment(account, totalReceived, released(account));
require(payment != 0, "PaymentSplitter: account is not due payment");
_released[account] += payment;
_totalReleased += payment;
Address.sendValue(account, payment);
emit PaymentReleased(account, payment);
}
/**
* @dev Can modify the shares own by the team.
* They triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
* total shares and their previous withdrawals.
* After the transfer the new shares are setup
*/
function _modifyShares(address[] memory oldPayees,address[] memory newPayees , uint256[] memory shares_) internal virtual {
// triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the total shares and their previous withdrawals.
for (uint256 i = 0; i < oldPayees.length; i++) {
require(_shares[oldPayees[i]] > 0, "PaymentSplitter: account has no shares");
uint256 totalReceived = address(this).balance + totalReleased();
uint256 payment = _pendingPayment(oldPayees[i], totalReceived, released(oldPayees[i]));
if (payment != 0){
_released[oldPayees[i]] += payment;
_totalReleased += payment;
Address.sendValue(payable(oldPayees[i]), payment);
emit PaymentReleased(oldPayees[i], payment);
}
_released[oldPayees[i]] = 0;
_shares[oldPayees[i]] = 0;
}
// refresh the shares variable to start as a new team shares
_totalShares = 0;
_totalReleased = 0;
// Update des shares for the Payees @dev wants
require(newPayees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
require(newPayees.length > 0, "PaymentSplitter: no payees");
for (uint256 i = 0; i < newPayees.length; i++) {
_addPayee(newPayees[i], shares_[i]);
}
}
/**
* @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
* percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
* contract.
*/
function release(IERC20 token, address account) public virtual {
require(_shares[account] > 0, "PaymentSplitter: account has no shares");
uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
uint256 payment = _pendingPayment(account, totalReceived, released(token, account));
require(payment != 0, "PaymentSplitter: account is not due payment");
_erc20Released[token][account] += payment;
_erc20TotalReleased[token] += payment;
SafeERC20.safeTransfer(token, account, payment);
emit ERC20PaymentReleased(token, account, payment);
}
/**
* @dev internal logic for computing the pending payment of an `account` given the token historical balances and
* already released amounts.
*/
function _pendingPayment(
address account,
uint256 totalReceived,
uint256 alreadyReleased
) private view returns (uint256) {
return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
}
/**
* @dev Add a new payee to the contract.
* @param account The address of the payee to add.
* @param shares_ The number of shares owned by the payee.
*/
function _addPayee(address account, uint256 shares_) private {
require(account != address(0), "PaymentSplitter: account is the zero address");
require(shares_ > 0, "PaymentSplitter: shares are 0");
require(_shares[account] == 0, "PaymentSplitter: account already has shares");
_payees.push(account);
_shares[account] = shares_;
_totalShares = _totalShares + shares_;
emit PayeeAdded(account, shares_);
}
}
// File: contracts/PantheonBusinessClub.sol
pragma solidity ^0.8.0;
/**
* @title Panthéon Business Club contract
* @dev Extends ERC721 Non-Fungible Token Standard basic implementation
*/
contract PantheonBusinessClub is ERC721Enumerable, Ownable, PaymentSplitter {
using SafeMath for uint256;
// The base price is set here.
uint256 public nftPrice = 350000000000000000; // 0.35 ETH
// Repartition of ETH earned
uint256[] private _teamShares = [16, 16, 12, 36, 20];
address[] public _team = [
0x17482Fa6221f7A6c8453901711d6E2cb3C1355E7,
0xa2D23B0C857E802B97c99bD006Bd707139bAef9A,
0x645AEe5D605b09350BA2135EB340759357E0fA20,
0x0EefcD4C37C78eD786971EC822a1DA6977B08EaC,
0x0d9A8d33428bB813Ea81D32B57A632C532057Fd5
];
// Only 20 Pantheon Cards can be purchased per transaction.
uint256 public constant maxNumPurchase = 20;
// Only 8888 total member card will be generated
uint256 public MAX_TOKENS = 8888;
// Number of token allowed for the Presale
uint256 public totalEarlyAccessTokensAllowed = 500;
// List of address whitelisted for the Presale
mapping(address => bool) private earlyAccessAllowList;
// Number max allow during stages
uint256 public stage = 0;
uint256 private stage2 = 2222;
uint256 private stage3 = 3333;
uint256 private stage4 = 4444;
uint256 private stage5 = 5555;
uint256 private stage6 = 6666;
uint256 private stage7 = 7777;
// List of addresse allowed for different stages
mapping(address => bool) private whitelistStage2;
mapping(address => bool) private whitelistStage3;
mapping(address => bool) private whitelistStage4;
mapping(address => bool) private whitelistStage5;
mapping(address => bool) private whitelistStage6;
mapping(address => bool) private whitelistStage7;
// Burn variable true or false if you want people to be able to burn tokens
bool public isBurnEnabled = false;
event ChangeBurnState(bool _isBurnEnabled);
//The hash of the concatented hash string of all the images.
string public provenance = '';
/**
* The state of the sale:
* 0 = closed
* 1 = EA
* 2 = WL2, 3 = WL3, 4 = WL4, 5 = WL5, 6 = WL6, 7 = WL7
* 8 = stage
* 9 = open
*/
uint256 public saleState = 0;
constructor()
ERC721("PantheonBusinessClub", "PBC")
PaymentSplitter(_team, _teamShares)
{
setBaseURI('ipfs://QmaWqGvPUVeBRfEc39RRqZ9Hm91kx4qfZiFgGS6TgPbEe7/');
_safeMint(msg.sender, totalSupply());
}
/**
* Set URL of the NFT
*/
function setBaseURI(string memory baseURI) public onlyOwner {
_setBaseURI(baseURI);
}
/**
* Modify Shares in paymentSplitter
*/
function modifyShares(uint256[] memory shares_) public onlyOwner {
_modifyShares(_team, _team, shares_);
}
/**
* Modify Shares and Team addresses in paymentSplitter
*/
function modifyTeamAndShares(address[] memory oldPayees,address[] memory newPayees , uint256[] memory shares_) public onlyOwner {
_modifyShares(oldPayees, newPayees, shares_);
_team = newPayees;
}
/**
* Lock or unlock the transfer of tokens
*/
function changeSecondaryMarketState() public onlyOwner {
_changeSecondaryMarketState();
}
/**
* Modify authorized transfer whitelist
*/
function modifyAuthorizedSellers(address[] memory addresses, bool state) public onlyOwner {
_modifyAuthorizedSellers(addresses, state);
}
/**
* retrait des eth stockés dans le smart contrat par le contract Owner
*/
function withdraw() public onlyOwner {
uint256 balance = address(this).balance;
payable(msg.sender).transfer(balance);
}
/**
* Set some tokens aside.
*/
function reserveTokens(uint256 number) public onlyOwner {
require(
totalSupply().add(number) <= MAX_TOKENS,
'Reservation would exceed max supply'
);
uint256 i;
for (i = 0; i < number; i++) {
_safeMint(msg.sender, totalSupply() + i);
}
}
/**
* Ability for people to burn their tokens
*/
function burn(uint256 tokenId) external {
require(isBurnEnabled, "Pantheon: burning disabled");
require(
_isApprovedOrOwner(msg.sender, tokenId),
"Pantheon: burn caller is not owner"
);
_burn(tokenId);
totalSupply().sub(1);
}
/**
* Ability for people to burn their tokens
*/
function burnRemainingTokens(uint256 tokenNb) external onlyOwner {
require(MAX_TOKENS - tokenNb >= totalSupply(), 'Invalid state');
MAX_TOKENS = MAX_TOKENS - tokenNb;
}
/**
* Set the state of the sale.
*/
function setSaleState(uint256 newState) public onlyOwner {
require(newState >= 0 && newState <= 9, 'Invalid state');
saleState = newState;
}
function setProvenanceHash(string memory hash) public onlyOwner {
provenance = hash;
}
function setPrice(uint256 value) public onlyOwner {
nftPrice = value;
}
function setStage(uint256 value) public onlyOwner {
stage = value;
}
function setBurnState(bool _isBurnEnabled) external onlyOwner {
isBurnEnabled = _isBurnEnabled;
emit ChangeBurnState(_isBurnEnabled);
}
/**
* Early Access Member list for the presale
*/
function changeEarlyAccessMembers(address[] memory addresses, bool state)
public
onlyOwner
{
for (uint256 i = 0; i < addresses.length; i++) {
earlyAccessAllowList[addresses[i]] = state;
}
}
/**
* Allow users to remove themselves from the whitelist
*/
function removeEarlyAccessMemberHimself()
public
{
require(
earlyAccessAllowList[msg.sender],
'Sender is not on the early access list'
);
earlyAccessAllowList[msg.sender] = false;
}
function isWhitelistTransfer(address addr) public view returns (bool) {
return _isWhitelistTransfer(addr);
}
/**
* Whitelist functions for stages
*/
function changeWhitelistMembersForStage(address[] memory addresses, uint256 stageNumber, bool state)
public
onlyOwner
{
if (stageNumber == 2) {
for (uint256 i = 0; i < addresses.length; i++) {
whitelistStage2[addresses[i]] = state;
}
} else if (stageNumber == 3) {
for (uint256 i = 0; i < addresses.length; i++) {
whitelistStage3[addresses[i]] = state;
}
} else if (stageNumber == 4) {
for (uint256 i = 0; i < addresses.length; i++) {
whitelistStage4[addresses[i]] = state;
}
} else if (stageNumber == 5) {
for (uint256 i = 0; i < addresses.length; i++) {
whitelistStage5[addresses[i]] = state;
}
} else if (stageNumber == 6) {
for (uint256 i = 0; i < addresses.length; i++) {
whitelistStage6[addresses[i]] = state;
}
} else if (stageNumber == 7) {
for (uint256 i = 0; i < addresses.length; i++) {
whitelistStage7[addresses[i]] = state;
}
}
}
function isWhitelistForStage(address addr, uint256 stageNumber) public view returns (bool) {
if (stageNumber == 2) {
return whitelistStage2[addr];
} else if (stageNumber == 3) {
return whitelistStage3[addr];
} else if (stageNumber == 4) {
return whitelistStage4[addr];
} else if (stageNumber == 5) {
return whitelistStage5[addr];
} else if (stageNumber == 6) {
return whitelistStage6[addr];
} else if (stageNumber == 7) {
return whitelistStage7[addr];
}
}
function _checkEarlyAccess(address sender, uint256 numberOfTokens)
internal
view
{
uint256 supply = totalSupply();
if (saleState == 1) {
require(
earlyAccessAllowList[sender],
'Sender is not on the early access list'
);
require(
supply + numberOfTokens <= totalEarlyAccessTokensAllowed,
'Minting would exceed total allowed for early access'
);
} else if (saleState == 2) {
require(
whitelistStage2[sender],
'Sender is not on the Whitelist'
);
require(
supply + numberOfTokens <= stage2,
'Minting would exceed total allowed for early access'
);
} else if (saleState == 3) {
require(
whitelistStage3[sender],
'Sender is not on the Whitelist'
);
require(
supply + numberOfTokens <= stage3,
'Minting would exceed total allowed for early access'
);
} else if (saleState == 4) {
require(
whitelistStage4[sender],
'Sender is not on the Whitelist'
);
require(
supply + numberOfTokens <= stage4,
'Minting would exceed total allowed for early access'
);
} else if (saleState == 5) {
require(
whitelistStage5[sender],
'Sender is not on the early access list'
);
require(
supply + numberOfTokens <= stage5,
'Minting would exceed total allowed for early access'
);
} else if (saleState == 6) {
require(
whitelistStage6[sender],
'Sender is not on the early access list'
);
require(
supply + numberOfTokens <= stage6,
'Minting would exceed total allowed for early access'
);
} else if (saleState == 7) {
require(
whitelistStage7[sender],
'Sender is not on the early access list'
);
require(
supply + numberOfTokens <= stage7,
'Minting would exceed total allowed for early access'
);
}
}
/**
* Verify if we are on the whitelist or not
*/
function checkIfWhitelist(address addr) public view returns (bool) {
return earlyAccessAllowList[addr];
}
/**
* Number of token max you can mint with 1 transaction
* You can make unlimmited number of transactions
*/
function _checkNumberOfTokens(uint256 numberOfTokens) internal pure {
require(
numberOfTokens <= maxNumPurchase,
'Can only mint 20 tokens at a time'
);
}
/**
* Mints an NFT
*/
function mintPBC(uint256 numberOfTokens) public payable {
require(
saleState == 1 || saleState == 2 || saleState == 3 || saleState == 4 || saleState == 5 || saleState == 6 || saleState == 7 || saleState == 8 || saleState == 9,
'Sale must be active to mint'
);
if (saleState == 1 || saleState == 2 || saleState == 3 || saleState == 4 || saleState == 5 || saleState == 6 || saleState == 7) {
_checkEarlyAccess(msg.sender, numberOfTokens);
_checkNumberOfTokens(numberOfTokens);
} else if (saleState == 8) {
_checkNumberOfTokens(numberOfTokens);
require(
totalSupply().add(numberOfTokens) <= stage,
'Purchase would exceed stage supply, confirm with the project team the maximum card available for this stage'
);
} else if (saleState == 9) {
_checkNumberOfTokens(numberOfTokens);
}
require(
totalSupply().add(numberOfTokens) <= MAX_TOKENS,
'Purchase would exceed max supply'
);
require(
nftPrice.mul(numberOfTokens) <= msg.value,
'Ether value sent is not correct'
);
for (uint256 i = 0; i < numberOfTokens; i++) {
uint256 mintIndex = totalSupply();
_safeMint(msg.sender, mintIndex);
}
}
/**
* Mint on wallet list
*/
function mintG(address[] memory addresses, uint256 nbCard) public onlyOwner {
require(
totalSupply().add(addresses.length * nbCard) <= MAX_TOKENS,
'Reservation would exceed max supply'
);
uint256 i;
for (i = 0; i < addresses.length; i++) {
uint256 j;
for (j = 0; j < nbCard; j++) {
uint256 mintIndex = totalSupply();
_safeMint(addresses[i], mintIndex);
}
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":false,"internalType":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"ChangeBurnState","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_team","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenNb","type":"uint256"}],"name":"burnRemainingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"changeEarlyAccessMembers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeSecondaryMarketState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"stageNumber","type":"uint256"},{"internalType":"bool","name":"state","type":"bool"}],"name":"changeWhitelistMembersForStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkIfWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSecondaryMarketOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"stageNumber","type":"uint256"}],"name":"isWhitelistForStage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelistTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNumPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"nbCard","type":"uint256"}],"name":"mintG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPBC","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"modifyAuthorizedSellers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"name":"modifyShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"oldPayees","type":"address[]"},{"internalType":"address[]","name":"newPayees","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"name":"modifyTeamAndShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeEarlyAccessMemberHimself","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"reserveTokens","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":"uint256","name":"","type":"uint256"}],"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":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"setBurnState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newState","type":"uint256"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEarlyAccessTokensAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60a06040819052600060808190526200001b9160029162000bcd565b506007805460ff191690556704db7325476300006015556040805160a08101825260108082526020820152600c9181019190915260246060820152601460808201526200006d90601690600562000c5c565b506040805160a0810182527317482fa6221f7a6c8453901711d6e2cb3c1355e7815273a2d23b0c857e802b97c99bd006bd707139baef9a602082015273645aee5d605b09350ba2135eb340759357e0fa2091810191909152730eefcd4c37c78ed786971ec822a1da6977b08eac6060820152730d9a8d33428bb813ea81d32b57a632c532057fd560808201526200010990601790600562000c9f565b506122b86018556101f46019556000601b8190556108ae601c55610d05601d5561115c601e556115b3601f55611a0a6020908155611e616021556028805460ff191690556040805191820190819052908290526200016b916029919062000bcd565b506000602a553480156200017e57600080fd5b506017805480602002602001604051908101604052809291908181526020018280548015620001d757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620001b8575b505050505060168054806020026020016040519081016040528092919081815260200182805480156200022a57602002820191906000526020600020905b81548152602001906001019080831162000215575b5050604080518082018252601481527f50616e7468656f6e427573696e657373436c756200000000000000000000000060208083019182528351808501909452600384526250424360e81b9084015281519195509193506200029192506000919062000bcd565b508051620002a790600190602084019062000bcd565b505050620002c4620002be620003db60201b60201c565b620003df565b8051825114620002f15760405162461bcd60e51b8152600401620002e89062000f5a565b60405180910390fd5b6000825111620003155760405162461bcd60e51b8152600401620002e89062000ff7565b60005b82518110156200039957620003848382815181106200034757634e487b7160e01b600052603260045260246000fd5b60200260200101518383815181106200037057634e487b7160e01b600052603260045260246000fd5b60200260200101516200043160201b60201c565b806200039081620010d7565b91505062000318565b505050620003c060405180606001604052806036815260200162005e4a6036913962000563565b620003d533620003cf620005b7565b620005bd565b6200110b565b3390565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166200045a5760405162461bcd60e51b8152600401620002e89062000e23565b600081116200047d5760405162461bcd60e51b8152600401620002e8906200102e565b6001600160a01b03821660009081526010602052604090205415620004b65760405162461bcd60e51b8152600401620002e89062000fac565b60128054600181019091557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0384169081179091556000908152601060205260409020819055600e546200052090829062001065565b600e556040517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac9062000557908490849062000db8565b60405180910390a15050565b6200056d620003db565b6001600160a01b031662000580620005e3565b6001600160a01b031614620005a95760405162461bcd60e51b8152600401620002e89062000f25565b620005b481620005f2565b50565b600b5490565b620005df8282604051806020016040528060008152506200060760201b60201c565b5050565b600d546001600160a01b031690565b8051620005df90600290602084019062000bcd565b62000613838362000646565b6200062260008484846200073b565b620006415760405162461bcd60e51b8152600401620002e89062000dd1565b505050565b6001600160a01b0382166200066f5760405162461bcd60e51b8152600401620002e89062000ef0565b6200067a8162000874565b156200069a5760405162461bcd60e51b8152600401620002e89062000e6f565b620006a86000838362000891565b6001600160a01b0382166000908152600460205260408120805460019290620006d390849062001065565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4620005df6000838362000641565b60006200075c846001600160a01b03166200093560201b620022e61760201c565b1562000868576001600160a01b03841663150b7a026200077b620003db565b8786866040518563ffffffff1660e01b81526004016200079f949392919062000d3f565b602060405180830381600087803b158015620007ba57600080fd5b505af1925050508015620007ed575060408051601f3d908101601f19168201909252620007ea9181019062000d0e565b60015b6200084d573d8080156200081e576040519150601f19603f3d011682016040523d82523d6000602084013e62000823565b606091505b508051620008455760405162461bcd60e51b8152600401620002e89062000dd1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506200086c565b5060015b949350505050565b6000908152600360205260409020546001600160a01b0316151590565b620008a98383836200064160201b62000e291760201c565b6001600160a01b038316620008c957620008c38162000966565b620008ef565b816001600160a01b0316836001600160a01b031614620008ef57620008ef8382620009aa565b6001600160a01b0382166200090f57620009098162000a57565b62000641565b826001600160a01b0316826001600160a01b031614620006415762000641828262000b35565b600080826001600160a01b0316803b806020016040519081016040528181526000908060200190933c511192915050565b600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b60006001620009c48462000b8660201b62001e9d1760201c565b620009d0919062001080565b6000838152600a602052604090205490915080821462000a24576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b600b5460009062000a6b9060019062001080565b6000838152600c6020526040812054600b805493945090928490811062000aa257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600b838154811062000ad257634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600c9091526040808220849055858252812055600b80548062000b1957634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000b4d8362000b8660201b62001e9d1760201c565b6001600160a01b0390931660009081526009602090815260408083208684528252808320859055938252600a9052919091209190915550565b60006001600160a01b03821662000bb15760405162461bcd60e51b8152600401620002e89062000ea6565b506001600160a01b031660009081526004602052604090205490565b82805462000bdb906200109a565b90600052602060002090601f01602090048101928262000bff576000855562000c4a565b82601f1062000c1a57805160ff191683800117855562000c4a565b8280016001018555821562000c4a579182015b8281111562000c4a57825182559160200191906001019062000c2d565b5062000c5892915062000cf7565b5090565b82805482825590600052602060002090810192821562000c4a579160200282015b8281111562000c4a578251829060ff1690559160200191906001019062000c7d565b82805482825590600052602060002090810192821562000c4a579160200282015b8281111562000c4a57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000cc0565b5b8082111562000c58576000815560010162000cf8565b60006020828403121562000d20578081fd5b81516001600160e01b03198116811462000d38578182fd5b9392505050565b600060018060a01b0380871683526020818716818501528560408501526080606085015284519150816080850152825b8281101562000d8d5785810182015185820160a00152810162000d6f565b8281111562000d9f578360a084870101525b5050601f01601f19169190910160a00195945050505050565b6001600160a01b03929092168252602082015260400190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602c908201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060408201526b7a65726f206164647265737360a01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526032908201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726040820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960408201526a206861732073686172657360a81b606082015260800190565b6020808252601a908201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604082015260600190565b6020808252601d908201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604082015260600190565b600082198211156200107b576200107b620010f5565b500190565b600082821015620010955762001095620010f5565b500390565b600281046001821680620010af57607f821691505b60208210811415620010d157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620010ee57620010ee620010f5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b614d2f806200111b6000396000f3fe6080604052600436106103b15760003560e01c80634f6ccce7116101e757806391b7f5ed1161010d578063d031370b116100a0578063e985e9c51161006f578063e985e9c514610aa9578063f2fde38b14610ac9578063f47c84c514610ae9578063f9c9816f14610afe576103f8565b8063d031370b14610a3f578063d124b94114610a5f578063d79779b214610a74578063e33b7de314610a94576103f8565b8063b88d4fde116100dc578063b88d4fde146109ca578063c040e6b8146109ea578063c87b56dd146109ff578063ce7c2ac214610a1f576103f8565b806391b7f5ed1461095557806395d89b41146109755780639852595c1461098a578063a22cb465146109aa576103f8565b80636ae2ec2b11610185578063715018a611610154578063715018a6146108eb5780638b83209b146109005780638d8fc898146109205780638da5cb5b14610940576103f8565b80636ae2ec2b146108765780636c0360eb146108965780636c7b4ef8146108ab57806370a08231146108cb576103f8565b8063603f4d52116101c1578063603f4d52146108015780636247bd42146108165780636352211e1461083657806367eaac9d14610856576103f8565b80634f6ccce7146107a157806355f804b3146107c15780635ce289ba146107e1576103f8565b8063204fce94116102d75780633ccfd60b1161026a57806342842e0e1161023957806342842e0e1461072c57806342966c681461074c578063460a0e931461076c57806348b7504414610781576103f8565b80633ccfd60b146106b75780633eb1d777146106cc578063406072a9146106ec57806340627a5d1461070c576103f8565b80632f745c59116102a65780632f745c591461064d57806335edd14a1461066d5780633a98ef39146106825780633bcad4b314610697576103f8565b8063204fce94146105cd57806320fa5f85146105ed57806323b872dd1461060d578063245396e21461062d576103f8565b80630d39fc811161034f57806318160ddd1161031e57806318160ddd14610565578063191655871461057a5780631beaa0dd1461059a5780631e98bcf3146105ad576103f8565b80630d39fc81146104f95780630f7309e81461051b5780631096952314610530578063154da15b14610550576103f8565b8063081812fc1161038b578063081812fc1461046a578063084c408814610497578063092beebe146104b9578063095ea7b3146104d9576103f8565b806301ffc9a7146103fd57806306fdde031461043357806307ebec2714610455576103f8565b366103f8577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706103df610b13565b346040516103ee929190613f14565b60405180910390a1005b600080fd5b34801561040957600080fd5b5061041d610418366004613dc6565b610b17565b60405161042a9190613f6a565b60405180910390f35b34801561043f57600080fd5b50610448610b44565b60405161042a9190613f75565b34801561046157600080fd5b5061041d610bd6565b34801561047657600080fd5b5061048a610485366004613e56565b610bdf565b60405161042a9190613f00565b3480156104a357600080fd5b506104b76104b2366004613e56565b610c2b565b005b3480156104c557600080fd5b5061041d6104d4366004613bcb565b610c90565b3480156104e557600080fd5b506104b76104f4366004613bcb565b610d96565b34801561050557600080fd5b5061050e610e2e565b60405161042a9190614b2f565b34801561052757600080fd5b50610448610e34565b34801561053c57600080fd5b506104b761054b366004613e10565b610ec2565b34801561055c57600080fd5b5061041d610f18565b34801561057157600080fd5b5061050e610f21565b34801561058657600080fd5b506104b7610595366004613a8d565b610f27565b6104b76105a8366004613e56565b611035565b3480156105b957600080fd5b506104b76105c8366004613cbf565b611219565b3480156105d957600080fd5b5061048a6105e8366004613e56565b61130b565b3480156105f957600080fd5b506104b7610608366004613d02565b611335565b34801561061957600080fd5b506104b7610628366004613ae1565b611674565b34801561063957600080fd5b506104b7610648366004613d5b565b6116ac565b34801561065957600080fd5b5061050e610668366004613bcb565b6117ad565b34801561067957600080fd5b506104b76117ff565b34801561068e57600080fd5b5061050e611848565b3480156106a357600080fd5b5061041d6106b2366004613a8d565b61184e565b3480156106c357600080fd5b506104b761186c565b3480156106d857600080fd5b506104b76106e7366004613e56565b6118da565b3480156106f857600080fd5b5061050e610707366004613dfe565b61191e565b34801561071857600080fd5b506104b7610727366004613c7a565b611949565b34801561073857600080fd5b506104b7610747366004613ae1565b611992565b34801561075857600080fd5b506104b7610767366004613e56565b6119ad565b34801561077857600080fd5b5061050e611a11565b34801561078d57600080fd5b506104b761079c366004613dfe565b611a17565b3480156107ad57600080fd5b5061050e6107bc366004613e56565b611bcd565b3480156107cd57600080fd5b506104b76107dc366004613e10565b611c28565b3480156107ed57600080fd5b506104b76107fc366004613d8e565b611c70565b34801561080d57600080fd5b5061050e611cf8565b34801561082257600080fd5b506104b7610831366004613c7a565b611cfe565b34801561084257600080fd5b5061048a610851366004613e56565b611db2565b34801561086257600080fd5b506104b7610871366004613e56565b611de7565b34801561088257600080fd5b5061041d610891366004613a8d565b611e6e565b3480156108a257600080fd5b50610448611e79565b3480156108b757600080fd5b5061041d6108c6366004613a8d565b611e88565b3480156108d757600080fd5b5061050e6108e6366004613a8d565b611e9d565b3480156108f757600080fd5b506104b7611ee1565b34801561090c57600080fd5b5061048a61091b366004613e56565b611f2a565b34801561092c57600080fd5b506104b761093b366004613bf6565b611f68565b34801561094c57600080fd5b5061048a611fc5565b34801561096157600080fd5b506104b7610970366004613e56565b611fd4565b34801561098157600080fd5b50610448612018565b34801561099657600080fd5b5061050e6109a5366004613a8d565b612027565b3480156109b657600080fd5b506104b76109c5366004613b9e565b612042565b3480156109d657600080fd5b506104b76109e5366004613b21565b612054565b3480156109f657600080fd5b5061050e61208d565b348015610a0b57600080fd5b50610448610a1a366004613e56565b612093565b348015610a2b57600080fd5b5061050e610a3a366004613a8d565b612116565b348015610a4b57600080fd5b506104b7610a5a366004613e56565b612131565b348015610a6b57600080fd5b506104b76121d6565b348015610a8057600080fd5b5061050e610a8f366004613a8d565b61221e565b348015610aa057600080fd5b5061050e612239565b348015610ab557600080fd5b5061041d610ac4366004613aa9565b61223f565b348015610ad557600080fd5b506104b7610ae4366004613a8d565b61226d565b348015610af557600080fd5b5061050e6122db565b348015610b0a57600080fd5b5061050e6122e1565b3390565b60006001600160e01b0319821663780e9d6360e01b1480610b3c5750610b3c82612317565b90505b919050565b606060008054610b5390614c14565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7f90614c14565b8015610bcc5780601f10610ba157610100808354040283529160200191610bcc565b820191906000526020600020905b815481529060010190602001808311610baf57829003601f168201915b5050505050905090565b60285460ff1681565b6000610bea82612357565b610c0f5760405162461bcd60e51b8152600401610c06906146b2565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b610c33610b13565b6001600160a01b0316610c44611fc5565b6001600160a01b031614610c6a5760405162461bcd60e51b8152600401610c0690614725565b6009811115610c8b5760405162461bcd60e51b8152600401610c06906146fe565b602a55565b60008160021415610cbd57506001600160a01b03821660009081526022602052604090205460ff16610d90565b8160031415610ce857506001600160a01b03821660009081526023602052604090205460ff16610d90565b8160041415610d1357506001600160a01b03821660009081526024602052604090205460ff16610d90565b8160051415610d3e57506001600160a01b03821660009081526025602052604090205460ff16610d90565b8160061415610d6957506001600160a01b03821660009081526026602052604090205460ff16610d90565b8160071415610d9057506001600160a01b03821660009081526027602052604090205460ff165b92915050565b6000610da182611db2565b9050806001600160a01b0316836001600160a01b03161415610dd55760405162461bcd60e51b8152600401610c069061483d565b806001600160a01b0316610de7610b13565b6001600160a01b03161480610e035750610e0381610ac4610b13565b610e1f5760405162461bcd60e51b8152600401610c0690614558565b610e298383612374565b505050565b60155481565b60298054610e4190614c14565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6d90614c14565b8015610eba5780601f10610e8f57610100808354040283529160200191610eba565b820191906000526020600020905b815481529060010190602001808311610e9d57829003601f168201915b505050505081565b610eca610b13565b6001600160a01b0316610edb611fc5565b6001600160a01b031614610f015760405162461bcd60e51b8152600401610c0690614725565b8051610f14906029906020840190613878565b5050565b60075460ff1681565b600b5490565b6001600160a01b038116600090815260106020526040902054610f5c5760405162461bcd60e51b8152600401610c0690614277565b6000610f66612239565b610f709047614b86565b90506000610f878383610f8286612027565b6123e2565b905080610fa65760405162461bcd60e51b8152600401610c06906144cc565b6001600160a01b03831660009081526011602052604081208054839290610fce908490614b86565b9250508190555080600f6000828254610fe79190614b86565b90915550610ff790508382612428565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051611028929190613f14565b60405180910390a1505050565b602a54600114806110485750602a546002145b806110555750602a546003145b806110625750602a546004145b8061106f5750602a546005145b8061107c5750602a546006145b806110895750602a546007145b806110965750602a546008145b806110a35750602a546009145b6110bf5760405162461bcd60e51b8152600401610c0690614412565b602a54600114806110d25750602a546002145b806110df5750602a546003145b806110ec5750602a546004145b806110f95750602a546005145b806111065750602a546006145b806111135750602a546007145b156111305761112233826124c4565b61112b81612741565b61118b565b602a54600814156111775761114481612741565b601b5461115982611153610f21565b90612762565b111561112b5760405162461bcd60e51b8152600401610c069061487e565b602a546009141561118b5761118b81612741565b60185461119a82611153610f21565b11156111b85760405162461bcd60e51b8152600401610c0690614648565b60155434906111c7908361276e565b11156111e55760405162461bcd60e51b8152600401610c069061437e565b60005b81811015610f145760006111fa610f21565b9050611206338261277a565b508061121181614c4f565b9150506111e8565b611221610b13565b6001600160a01b0316611232611fc5565b6001600160a01b0316146112585760405162461bcd60e51b8152600401610c0690614725565b60185461127382845161126b9190614bb2565b611153610f21565b11156112915760405162461bcd60e51b8152600401610c0690614a7e565b60005b8251811015610e295760005b828110156112f85760006112b2610f21565b90506112e58584815181106112d757634e487b7160e01b600052603260045260246000fd5b60200260200101518261277a565b50806112f081614c4f565b9150506112a0565b508061130381614c4f565b915050611294565b6017818154811061131b57600080fd5b6000918252602090912001546001600160a01b0316905081565b61133d610b13565b6001600160a01b031661134e611fc5565b6001600160a01b0316146113745760405162461bcd60e51b8152600401610c0690614725565b81600214156113f85760005b83518110156113f25781602260008684815181106113ae57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806113ea81614c4f565b915050611380565b50610e29565b81600314156114765760005b83518110156113f257816023600086848151811061143257634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061146e81614c4f565b915050611404565b81600414156114f45760005b83518110156113f25781602460008684815181106114b057634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806114ec81614c4f565b915050611482565b81600514156115725760005b83518110156113f257816025600086848151811061152e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061156a81614c4f565b915050611500565b81600614156115f05760005b83518110156113f25781602660008684815181106115ac57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806115e881614c4f565b91505061157e565b8160071415610e295760005b835181101561166e57816027600086848151811061162a57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061166681614c4f565b9150506115fc565b50505050565b61168561167f610b13565b82612794565b6116a15760405162461bcd60e51b8152600401610c0690614915565b610e29838383612811565b6116b4610b13565b6001600160a01b03166116c5611fc5565b6001600160a01b0316146116eb5760405162461bcd60e51b8152600401610c0690614725565b6117aa601780548060200260200160405190810160405280929190818152602001828054801561174457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611726575b5050505050601780548060200260200160405190810160405280929190818152602001828054801561179f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611781575b505050505083612986565b50565b60006117b883611e9d565b82106117d65760405162461bcd60e51b8152600401610c0690614079565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b611807610b13565b6001600160a01b0316611818611fc5565b6001600160a01b03161461183e5760405162461bcd60e51b8152600401610c0690614725565b611846612d04565b565b600e5490565b6001600160a01b03166000908152601a602052604090205460ff1690565b611874610b13565b6001600160a01b0316611885611fc5565b6001600160a01b0316146118ab5760405162461bcd60e51b8152600401610c0690614725565b6040514790339082156108fc029083906000818181858888f19350505050158015610f14573d6000803e3d6000fd5b6118e2610b13565b6001600160a01b03166118f3611fc5565b6001600160a01b0316146119195760405162461bcd60e51b8152600401610c0690614725565b601b55565b6001600160a01b03918216600090815260146020908152604080832093909416825291909152205490565b611951610b13565b6001600160a01b0316611962611fc5565b6001600160a01b0316146119885760405162461bcd60e51b8152600401610c0690614725565b610f148282612d18565b610e2983838360405180602001604052806000815250612054565b60285460ff166119cf5760405162461bcd60e51b8152600401610c069061400b565b6119d93382612794565b6119f55760405162461bcd60e51b8152600401610c069061475a565b6119fe81612d8d565b610f146001611a0b610f21565b90612e3c565b60195481565b6001600160a01b038116600090815260106020526040902054611a4c5760405162461bcd60e51b8152600401610c0690614277565b6000611a578361221e565b6040516370a0823160e01b81526001600160a01b038516906370a0823190611a83903090600401613f00565b60206040518083038186803b158015611a9b57600080fd5b505afa158015611aaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad39190613e6e565b611add9190614b86565b90506000611af08383610f82878761191e565b905080611b0f5760405162461bcd60e51b8152600401610c06906144cc565b6001600160a01b03808516600090815260146020908152604080832093871683529290529081208054839290611b46908490614b86565b90915550506001600160a01b03841660009081526013602052604081208054839290611b73908490614b86565b90915550611b849050848483612e48565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611bbf929190613f14565b60405180910390a250505050565b6000611bd7610f21565b8210611bf55760405162461bcd60e51b8152600401610c069061499d565b600b8281548110611c1657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b611c30610b13565b6001600160a01b0316611c41611fc5565b6001600160a01b031614611c675760405162461bcd60e51b8152600401610c0690614725565b6117aa81612e9e565b611c78610b13565b6001600160a01b0316611c89611fc5565b6001600160a01b031614611caf5760405162461bcd60e51b8152600401610c0690614725565b6028805460ff19168215151790556040517f25e3c7534f4e40627015c57fddbe7ec01a622a55940963ce7a486112c456948090611ced908390613f6a565b60405180910390a150565b602a5481565b611d06610b13565b6001600160a01b0316611d17611fc5565b6001600160a01b031614611d3d5760405162461bcd60e51b8152600401610c0690614725565b60005b8251811015610e295781601a6000858481518110611d6e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611daa81614c4f565b915050611d40565b6000818152600360205260408120546001600160a01b031680610b3c5760405162461bcd60e51b8152600401610c06906145ff565b611def610b13565b6001600160a01b0316611e00611fc5565b6001600160a01b031614611e265760405162461bcd60e51b8152600401610c0690614725565b611e2e610f21565b81601854611e3c9190614bd1565b1015611e5a5760405162461bcd60e51b8152600401610c06906146fe565b80601854611e689190614bd1565b60185550565b6000610b3c82612eb1565b606060028054610b5390614c14565b60086020526000908152604090205460ff1681565b60006001600160a01b038216611ec55760405162461bcd60e51b8152600401610c06906145b5565b506001600160a01b031660009081526004602052604090205490565b611ee9610b13565b6001600160a01b0316611efa611fc5565b6001600160a01b031614611f205760405162461bcd60e51b8152600401610c0690614725565b6118466000612ecf565b600060128281548110611f4d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b611f70610b13565b6001600160a01b0316611f81611fc5565b6001600160a01b031614611fa75760405162461bcd60e51b8152600401610c0690614725565b611fb2838383612986565b815161166e9060179060208501906138fc565b600d546001600160a01b031690565b611fdc610b13565b6001600160a01b0316611fed611fc5565b6001600160a01b0316146120135760405162461bcd60e51b8152600401610c0690614725565b601555565b606060018054610b5390614c14565b6001600160a01b031660009081526011602052604090205490565b610f1461204d610b13565b8383612f21565b61206561205f610b13565b83612794565b6120815760405162461bcd60e51b8152600401610c0690614915565b61166e84848484612fc4565b601b5481565b606061209e82612357565b6120ba5760405162461bcd60e51b8152600401610c069061479c565b60006120c4611e79565b905060008151116120e4576040518060200160405280600081525061210f565b806120ee84612ff7565b6040516020016120ff929190613ece565b6040516020818303038152906040525b9392505050565b6001600160a01b031660009081526010602052604090205490565b612139610b13565b6001600160a01b031661214a611fc5565b6001600160a01b0316146121705760405162461bcd60e51b8152600401610c0690614725565b60185461217f82611153610f21565b111561219d5760405162461bcd60e51b8152600401610c0690614a7e565b60005b81811015610f14576121c433826121b5610f21565b6121bf9190614b86565b61277a565b806121ce81614c4f565b9150506121a0565b336000908152601a602052604090205460ff166122055760405162461bcd60e51b8152600401610c0690614338565b336000908152601a60205260409020805460ff19169055565b6001600160a01b031660009081526013602052604090205490565b600f5490565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b612275610b13565b6001600160a01b0316612286611fc5565b6001600160a01b0316146122ac5760405162461bcd60e51b8152600401610c0690614725565b6001600160a01b0381166122d25760405162461bcd60e51b8152600401610c06906141b5565b6117aa81612ecf565b60185481565b601481565b600080826001600160a01b0316803b806020016040519081016040528181526000908060200190933c511192915050565b60006001600160e01b031982166380ac58cd60e01b148061234857506001600160e01b03198216635b5e139f60e01b145b80610b3c5750610b3c82613112565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123a982611db2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600e546001600160a01b0384166000908152601060205260408120549091839161240c9086614bb2565b6124169190614b9e565b6124209190614bd1565b949350505050565b804710156124485760405162461bcd60e51b8152600401610c0690614449565b6000826001600160a01b03168260405161246190613efd565b60006040518083038185875af1925050503d806000811461249e576040519150601f19603f3d011682016040523d82523d6000602084013e6124a3565b606091505b5050905080610e295760405162461bcd60e51b8152600401610c06906143b5565b60006124ce610f21565b9050602a5460011415612543576001600160a01b0383166000908152601a602052604090205460ff166125135760405162461bcd60e51b8152600401610c0690614338565b6019546125208383614b86565b111561253e5760405162461bcd60e51b8152600401610c0690614116565b610e29565b602a5460021415612593576001600160a01b03831660009081526022602052604090205460ff166125865760405162461bcd60e51b8152600401610c0690614042565b601c546125208383614b86565b602a54600314156125e3576001600160a01b03831660009081526023602052604090205460ff166125d65760405162461bcd60e51b8152600401610c0690614042565b601d546125208383614b86565b602a5460041415612633576001600160a01b03831660009081526024602052604090205460ff166126265760405162461bcd60e51b8152600401610c0690614042565b601e546125208383614b86565b602a5460051415612683576001600160a01b03831660009081526025602052604090205460ff166126765760405162461bcd60e51b8152600401610c0690614338565b601f546125208383614b86565b602a54600614156126d3576001600160a01b03831660009081526026602052604090205460ff166126c65760405162461bcd60e51b8152600401610c0690614338565b6020546125208383614b86565b602a5460071415610e29576001600160a01b03831660009081526027602052604090205460ff166127165760405162461bcd60e51b8152600401610c0690614338565b6021546127238383614b86565b1115610e295760405162461bcd60e51b8152600401610c0690614116565b60148111156117aa5760405162461bcd60e51b8152600401610c0690614517565b600061210f8284614b86565b600061210f8284614bb2565b610f1482826040518060200160405280600081525061312b565b600061279f82612357565b6127bb5760405162461bcd60e51b8152600401610c0690614480565b60006127c683611db2565b9050806001600160a01b0316846001600160a01b031614806128015750836001600160a01b03166127f684610bdf565b6001600160a01b0316145b806124205750612420818561223f565b826001600160a01b031661282482611db2565b6001600160a01b03161461284a5760405162461bcd60e51b8152600401610c06906141fb565b6001600160a01b0382166128705760405162461bcd60e51b8152600401610c06906142bd565b60075460ff166128b2576001600160a01b03831660009081526008602052604090205460ff166128b25760405162461bcd60e51b8152600401610c0690613f88565b6128bd83838361315e565b6128c8600082612374565b6001600160a01b03831660009081526004602052604081208054600192906128f1908490614bd1565b90915550506001600160a01b038216600090815260046020526040812080546001929061291f908490614b86565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610e29838383610e29565b60005b8351811015612c41576000601060008684815181106129b857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054116129fe5760405162461bcd60e51b8152600401610c0690614277565b6000612a08612239565b612a129047614b86565b90506000612a72868481518110612a3957634e487b7160e01b600052603260045260246000fd5b602002602001015183610f82898781518110612a6557634e487b7160e01b600052603260045260246000fd5b6020026020010151612027565b90508015612b88578060116000888681518110612a9f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254612ad69190614b86565b9250508190555080600f6000828254612aef9190614b86565b92505081905550612b27868481518110612b1957634e487b7160e01b600052603260045260246000fd5b602002602001015182612428565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056868481518110612b6857634e487b7160e01b600052603260045260246000fd5b602002602001015182604051612b7f929190613f14565b60405180910390a15b600060116000888681518110612bae57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060106000888681518110612c0057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555050508080612c3990614c4f565b915050612989565b506000600e819055600f558051825114612c6d5760405162461bcd60e51b8152600401610c06906147eb565b6000825111612c8e5760405162461bcd60e51b8152600401610c0690614ac1565b60005b825181101561166e57612cf2838281518110612cbd57634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110612ce557634e487b7160e01b600052603260045260246000fd5b60200260200101516131e2565b80612cfc81614c4f565b915050612c91565b6007805460ff19811660ff90911615179055565b60005b8251811015610e29578160086000858481518110612d4957634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580612d8581614c4f565b915050612d1b565b6000612d9882611db2565b9050612da68160008461315e565b612db1600083612374565b6001600160a01b0381166000908152600460205260408120805460019290612dda908490614bd1565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4610f1481600084610e29565b600061210f8284614bd1565b610e298363a9059cbb60e01b8484604051602401612e67929190613f14565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613307565b8051610f14906002906020840190613878565b6001600160a01b031660009081526008602052604090205460ff1690565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612f535760405162461bcd60e51b8152600401610c0690614301565b6001600160a01b0383811660008181526006602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190612fb7908590613f6a565b60405180910390a3505050565b612fcf848484612811565b612fdb84848484613396565b61166e5760405162461bcd60e51b8152600401610c06906140c4565b60608161301c57506040805180820190915260018152600360fc1b6020820152610b3f565b8160005b8115613046578061303081614c4f565b915061303f9050600a83614b9e565b9150613020565b60008167ffffffffffffffff81111561306f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613099576020820181803683370190505b5090505b8415612420576130ae600183614bd1565b91506130bb600a86614c6a565b6130c6906030614b86565b60f81b8183815181106130e957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061310b600a86614b9e565b945061309d565b6001600160e01b031981166301ffc9a760e01b14919050565b61313583836134b1565b6131426000848484613396565b610e295760405162461bcd60e51b8152600401610c06906140c4565b613169838383610e29565b6001600160a01b0383166131855761318081613598565b6131a8565b816001600160a01b0316836001600160a01b0316146131a8576131a883826135dc565b6001600160a01b0382166131bf5761253e81613679565b826001600160a01b0316826001600160a01b031614610e2957610e298282613752565b6001600160a01b0382166132085760405162461bcd60e51b8152600401610c0690614169565b600081116132285760405162461bcd60e51b8152600401610c0690614af8565b6001600160a01b0382166000908152601060205260409020541561325e5760405162461bcd60e51b8152600401610c06906149e9565b60128054600181019091557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0384169081179091556000908152601060205260409020819055600e546132c6908290614b86565b600e556040517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac906132fb9084908490613f14565b60405180910390a15050565b600061335c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137969092919063ffffffff16565b805190915015610e29578080602001905181019061337a9190613daa565b610e295760405162461bcd60e51b8152600401610c0690614a34565b60006133aa846001600160a01b03166122e6565b156134a657836001600160a01b031663150b7a026133c6610b13565b8786866040518563ffffffff1660e01b81526004016133e89493929190613f2d565b602060405180830381600087803b15801561340257600080fd5b505af1925050508015613432575060408051601f3d908101601f1916820190925261342f91810190613de2565b60015b61348c573d808015613460576040519150601f19603f3d011682016040523d82523d6000602084013e613465565b606091505b5080516134845760405162461bcd60e51b8152600401610c06906140c4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612420565b506001949350505050565b6001600160a01b0382166134d75760405162461bcd60e51b8152600401610c069061467d565b6134e081612357565b156134fd5760405162461bcd60e51b8152600401610c0690614240565b6135096000838361315e565b6001600160a01b0382166000908152600460205260408120805460019290613532908490614b86565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610f1460008383610e29565b600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b600060016135e984611e9d565b6135f39190614bd1565b6000838152600a6020526040902054909150808214613646576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b600b5460009061368b90600190614bd1565b6000838152600c6020526040812054600b80549394509092849081106136c157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600b83815481106136f057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600c9091526040808220849055858252812055600b80548061373657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061375d83611e9d565b6001600160a01b0390931660009081526009602090815260408083208684528252808320859055938252600a9052919091209190915550565b60606124208484600085856137aa856122e6565b6137c65760405162461bcd60e51b8152600401610c0690614966565b600080866001600160a01b031685876040516137e29190613eb2565b60006040518083038185875af1925050503d806000811461381f576040519150601f19603f3d011682016040523d82523d6000602084013e613824565b606091505b509150915061383482828661383f565b979650505050505050565b6060831561384e57508161210f565b82511561385e5782518084602001fd5b8160405162461bcd60e51b8152600401610c069190613f75565b82805461388490614c14565b90600052602060002090601f0160209004810192826138a657600085556138ec565b82601f106138bf57805160ff19168380011785556138ec565b828001600101855582156138ec579182015b828111156138ec5782518255916020019190600101906138d1565b506138f8929150613951565b5090565b8280548282559060005260206000209081019282156138ec579160200282015b828111156138ec57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061391c565b5b808211156138f85760008155600101613952565b600067ffffffffffffffff83111561398057613980614caa565b613993601f8401601f1916602001614b38565b90508281528383830111156139a757600080fd5b828260208301376000602084830101529392505050565b600082601f8301126139ce578081fd5b813560206139e36139de83614b62565b614b38565b82815281810190858301838502870184018810156139ff578586fd5b855b85811015613a26578135613a1481614cc0565b84529284019290840190600101613a01565b5090979650505050505050565b600082601f830112613a43578081fd5b81356020613a536139de83614b62565b8281528181019085830183850287018401881015613a6f578586fd5b855b85811015613a2657813584529284019290840190600101613a71565b600060208284031215613a9e578081fd5b813561210f81614cc0565b60008060408385031215613abb578081fd5b8235613ac681614cc0565b91506020830135613ad681614cc0565b809150509250929050565b600080600060608486031215613af5578081fd5b8335613b0081614cc0565b92506020840135613b1081614cc0565b929592945050506040919091013590565b60008060008060808587031215613b36578081fd5b8435613b4181614cc0565b93506020850135613b5181614cc0565b925060408501359150606085013567ffffffffffffffff811115613b73578182fd5b8501601f81018713613b83578182fd5b613b9287823560208401613966565b91505092959194509250565b60008060408385031215613bb0578182fd5b8235613bbb81614cc0565b91506020830135613ad681614cd5565b60008060408385031215613bdd578182fd5b8235613be881614cc0565b946020939093013593505050565b600080600060608486031215613c0a578081fd5b833567ffffffffffffffff80821115613c21578283fd5b613c2d878388016139be565b94506020860135915080821115613c42578283fd5b613c4e878388016139be565b93506040860135915080821115613c63578283fd5b50613c7086828701613a33565b9150509250925092565b60008060408385031215613c8c578182fd5b823567ffffffffffffffff811115613ca2578283fd5b613cae858286016139be565b9250506020830135613ad681614cd5565b60008060408385031215613cd1578182fd5b823567ffffffffffffffff811115613ce7578283fd5b613cf3858286016139be565b95602094909401359450505050565b600080600060608486031215613d16578081fd5b833567ffffffffffffffff811115613d2c578182fd5b613d38868287016139be565b935050602084013591506040840135613d5081614cd5565b809150509250925092565b600060208284031215613d6c578081fd5b813567ffffffffffffffff811115613d82578182fd5b61242084828501613a33565b600060208284031215613d9f578081fd5b813561210f81614cd5565b600060208284031215613dbb578081fd5b815161210f81614cd5565b600060208284031215613dd7578081fd5b813561210f81614ce3565b600060208284031215613df3578081fd5b815161210f81614ce3565b60008060408385031215613abb578182fd5b600060208284031215613e21578081fd5b813567ffffffffffffffff811115613e37578182fd5b8201601f81018413613e47578182fd5b61242084823560208401613966565b600060208284031215613e67578081fd5b5035919050565b600060208284031215613e7f578081fd5b5051919050565b60008151808452613e9e816020860160208601614be8565b601f01601f19169290920160200192915050565b60008251613ec4818460208701614be8565b9190910192915050565b60008351613ee0818460208801614be8565b835190830190613ef4818360208801614be8565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f6090830184613e86565b9695505050505050565b901515815260200190565b60006020825261210f6020830184613e86565b6020808252605b908201527f5472616e73666572206973206e6f7420617574686f72697a656420666f72207460408201527f68652053656e646572203a20636f6e74616374207468652070726f6a6563742060608201527f7465616d20746f206265206f6e207468652057686974656c6973740000000000608082015260a00190565b6020808252601a908201527f50616e7468656f6e3a206275726e696e672064697361626c6564000000000000604082015260600190565b6020808252601e908201527f53656e646572206973206e6f74206f6e207468652057686974656c6973740000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526033908201527f4d696e74696e6720776f756c642065786365656420746f74616c20616c6c6f77604082015272656420666f72206561726c792061636365737360681b606082015260800190565b6020808252602c908201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060408201526b7a65726f206164647265737360a01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526026908201527f53656e646572206973206e6f74206f6e20746865206561726c792061636365736040820152651cc81b1a5cdd60d21b606082015260800190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252601b908201527f53616c65206d7573742062652061637469766520746f206d696e740000000000604082015260600190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526021908201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6040820152606560f81b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600d908201526c496e76616c696420737461746560981b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f50616e7468656f6e3a206275726e2063616c6c6572206973206e6f74206f776e60408201526132b960f11b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526032908201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726040820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252606b908201527f507572636861736520776f756c6420657863656564207374616765207375707060408201527f6c792c20636f6e6669726d2077697468207468652070726f6a6563742074656160608201527f6d20746865206d6178696d756d206361726420617661696c61626c6520666f7260808201526a207468697320737461676560a81b60a082015260c00190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960408201526a206861732073686172657360a81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526023908201527f5265736572766174696f6e20776f756c6420657863656564206d617820737570604082015262706c7960e81b606082015260800190565b6020808252601a908201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604082015260600190565b6020808252601d908201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715614b5a57614b5a614caa565b604052919050565b600067ffffffffffffffff821115614b7c57614b7c614caa565b5060209081020190565b60008219821115614b9957614b99614c7e565b500190565b600082614bad57614bad614c94565b500490565b6000816000190483118215151615614bcc57614bcc614c7e565b500290565b600082821015614be357614be3614c7e565b500390565b60005b83811015614c03578181015183820152602001614beb565b8381111561166e5750506000910152565b600281046001821680614c2857607f821691505b60208210811415614c4957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614c6357614c63614c7e565b5060010190565b600082614c7957614c79614c94565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146117aa57600080fd5b80151581146117aa57600080fd5b6001600160e01b0319811681146117aa57600080fdfea26469706673582212207595aa0a4421c3df88a552c218d9cd73dcafa8f426401b1e1e62438d833e393764736f6c63430008000033697066733a2f2f516d615771477650555665425266456333395252715a39486d39316b783471665a694667475336546750624565372f
Deployed Bytecode
0x6080604052600436106103b15760003560e01c80634f6ccce7116101e757806391b7f5ed1161010d578063d031370b116100a0578063e985e9c51161006f578063e985e9c514610aa9578063f2fde38b14610ac9578063f47c84c514610ae9578063f9c9816f14610afe576103f8565b8063d031370b14610a3f578063d124b94114610a5f578063d79779b214610a74578063e33b7de314610a94576103f8565b8063b88d4fde116100dc578063b88d4fde146109ca578063c040e6b8146109ea578063c87b56dd146109ff578063ce7c2ac214610a1f576103f8565b806391b7f5ed1461095557806395d89b41146109755780639852595c1461098a578063a22cb465146109aa576103f8565b80636ae2ec2b11610185578063715018a611610154578063715018a6146108eb5780638b83209b146109005780638d8fc898146109205780638da5cb5b14610940576103f8565b80636ae2ec2b146108765780636c0360eb146108965780636c7b4ef8146108ab57806370a08231146108cb576103f8565b8063603f4d52116101c1578063603f4d52146108015780636247bd42146108165780636352211e1461083657806367eaac9d14610856576103f8565b80634f6ccce7146107a157806355f804b3146107c15780635ce289ba146107e1576103f8565b8063204fce94116102d75780633ccfd60b1161026a57806342842e0e1161023957806342842e0e1461072c57806342966c681461074c578063460a0e931461076c57806348b7504414610781576103f8565b80633ccfd60b146106b75780633eb1d777146106cc578063406072a9146106ec57806340627a5d1461070c576103f8565b80632f745c59116102a65780632f745c591461064d57806335edd14a1461066d5780633a98ef39146106825780633bcad4b314610697576103f8565b8063204fce94146105cd57806320fa5f85146105ed57806323b872dd1461060d578063245396e21461062d576103f8565b80630d39fc811161034f57806318160ddd1161031e57806318160ddd14610565578063191655871461057a5780631beaa0dd1461059a5780631e98bcf3146105ad576103f8565b80630d39fc81146104f95780630f7309e81461051b5780631096952314610530578063154da15b14610550576103f8565b8063081812fc1161038b578063081812fc1461046a578063084c408814610497578063092beebe146104b9578063095ea7b3146104d9576103f8565b806301ffc9a7146103fd57806306fdde031461043357806307ebec2714610455576103f8565b366103f8577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706103df610b13565b346040516103ee929190613f14565b60405180910390a1005b600080fd5b34801561040957600080fd5b5061041d610418366004613dc6565b610b17565b60405161042a9190613f6a565b60405180910390f35b34801561043f57600080fd5b50610448610b44565b60405161042a9190613f75565b34801561046157600080fd5b5061041d610bd6565b34801561047657600080fd5b5061048a610485366004613e56565b610bdf565b60405161042a9190613f00565b3480156104a357600080fd5b506104b76104b2366004613e56565b610c2b565b005b3480156104c557600080fd5b5061041d6104d4366004613bcb565b610c90565b3480156104e557600080fd5b506104b76104f4366004613bcb565b610d96565b34801561050557600080fd5b5061050e610e2e565b60405161042a9190614b2f565b34801561052757600080fd5b50610448610e34565b34801561053c57600080fd5b506104b761054b366004613e10565b610ec2565b34801561055c57600080fd5b5061041d610f18565b34801561057157600080fd5b5061050e610f21565b34801561058657600080fd5b506104b7610595366004613a8d565b610f27565b6104b76105a8366004613e56565b611035565b3480156105b957600080fd5b506104b76105c8366004613cbf565b611219565b3480156105d957600080fd5b5061048a6105e8366004613e56565b61130b565b3480156105f957600080fd5b506104b7610608366004613d02565b611335565b34801561061957600080fd5b506104b7610628366004613ae1565b611674565b34801561063957600080fd5b506104b7610648366004613d5b565b6116ac565b34801561065957600080fd5b5061050e610668366004613bcb565b6117ad565b34801561067957600080fd5b506104b76117ff565b34801561068e57600080fd5b5061050e611848565b3480156106a357600080fd5b5061041d6106b2366004613a8d565b61184e565b3480156106c357600080fd5b506104b761186c565b3480156106d857600080fd5b506104b76106e7366004613e56565b6118da565b3480156106f857600080fd5b5061050e610707366004613dfe565b61191e565b34801561071857600080fd5b506104b7610727366004613c7a565b611949565b34801561073857600080fd5b506104b7610747366004613ae1565b611992565b34801561075857600080fd5b506104b7610767366004613e56565b6119ad565b34801561077857600080fd5b5061050e611a11565b34801561078d57600080fd5b506104b761079c366004613dfe565b611a17565b3480156107ad57600080fd5b5061050e6107bc366004613e56565b611bcd565b3480156107cd57600080fd5b506104b76107dc366004613e10565b611c28565b3480156107ed57600080fd5b506104b76107fc366004613d8e565b611c70565b34801561080d57600080fd5b5061050e611cf8565b34801561082257600080fd5b506104b7610831366004613c7a565b611cfe565b34801561084257600080fd5b5061048a610851366004613e56565b611db2565b34801561086257600080fd5b506104b7610871366004613e56565b611de7565b34801561088257600080fd5b5061041d610891366004613a8d565b611e6e565b3480156108a257600080fd5b50610448611e79565b3480156108b757600080fd5b5061041d6108c6366004613a8d565b611e88565b3480156108d757600080fd5b5061050e6108e6366004613a8d565b611e9d565b3480156108f757600080fd5b506104b7611ee1565b34801561090c57600080fd5b5061048a61091b366004613e56565b611f2a565b34801561092c57600080fd5b506104b761093b366004613bf6565b611f68565b34801561094c57600080fd5b5061048a611fc5565b34801561096157600080fd5b506104b7610970366004613e56565b611fd4565b34801561098157600080fd5b50610448612018565b34801561099657600080fd5b5061050e6109a5366004613a8d565b612027565b3480156109b657600080fd5b506104b76109c5366004613b9e565b612042565b3480156109d657600080fd5b506104b76109e5366004613b21565b612054565b3480156109f657600080fd5b5061050e61208d565b348015610a0b57600080fd5b50610448610a1a366004613e56565b612093565b348015610a2b57600080fd5b5061050e610a3a366004613a8d565b612116565b348015610a4b57600080fd5b506104b7610a5a366004613e56565b612131565b348015610a6b57600080fd5b506104b76121d6565b348015610a8057600080fd5b5061050e610a8f366004613a8d565b61221e565b348015610aa057600080fd5b5061050e612239565b348015610ab557600080fd5b5061041d610ac4366004613aa9565b61223f565b348015610ad557600080fd5b506104b7610ae4366004613a8d565b61226d565b348015610af557600080fd5b5061050e6122db565b348015610b0a57600080fd5b5061050e6122e1565b3390565b60006001600160e01b0319821663780e9d6360e01b1480610b3c5750610b3c82612317565b90505b919050565b606060008054610b5390614c14565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7f90614c14565b8015610bcc5780601f10610ba157610100808354040283529160200191610bcc565b820191906000526020600020905b815481529060010190602001808311610baf57829003601f168201915b5050505050905090565b60285460ff1681565b6000610bea82612357565b610c0f5760405162461bcd60e51b8152600401610c06906146b2565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b610c33610b13565b6001600160a01b0316610c44611fc5565b6001600160a01b031614610c6a5760405162461bcd60e51b8152600401610c0690614725565b6009811115610c8b5760405162461bcd60e51b8152600401610c06906146fe565b602a55565b60008160021415610cbd57506001600160a01b03821660009081526022602052604090205460ff16610d90565b8160031415610ce857506001600160a01b03821660009081526023602052604090205460ff16610d90565b8160041415610d1357506001600160a01b03821660009081526024602052604090205460ff16610d90565b8160051415610d3e57506001600160a01b03821660009081526025602052604090205460ff16610d90565b8160061415610d6957506001600160a01b03821660009081526026602052604090205460ff16610d90565b8160071415610d9057506001600160a01b03821660009081526027602052604090205460ff165b92915050565b6000610da182611db2565b9050806001600160a01b0316836001600160a01b03161415610dd55760405162461bcd60e51b8152600401610c069061483d565b806001600160a01b0316610de7610b13565b6001600160a01b03161480610e035750610e0381610ac4610b13565b610e1f5760405162461bcd60e51b8152600401610c0690614558565b610e298383612374565b505050565b60155481565b60298054610e4190614c14565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6d90614c14565b8015610eba5780601f10610e8f57610100808354040283529160200191610eba565b820191906000526020600020905b815481529060010190602001808311610e9d57829003601f168201915b505050505081565b610eca610b13565b6001600160a01b0316610edb611fc5565b6001600160a01b031614610f015760405162461bcd60e51b8152600401610c0690614725565b8051610f14906029906020840190613878565b5050565b60075460ff1681565b600b5490565b6001600160a01b038116600090815260106020526040902054610f5c5760405162461bcd60e51b8152600401610c0690614277565b6000610f66612239565b610f709047614b86565b90506000610f878383610f8286612027565b6123e2565b905080610fa65760405162461bcd60e51b8152600401610c06906144cc565b6001600160a01b03831660009081526011602052604081208054839290610fce908490614b86565b9250508190555080600f6000828254610fe79190614b86565b90915550610ff790508382612428565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051611028929190613f14565b60405180910390a1505050565b602a54600114806110485750602a546002145b806110555750602a546003145b806110625750602a546004145b8061106f5750602a546005145b8061107c5750602a546006145b806110895750602a546007145b806110965750602a546008145b806110a35750602a546009145b6110bf5760405162461bcd60e51b8152600401610c0690614412565b602a54600114806110d25750602a546002145b806110df5750602a546003145b806110ec5750602a546004145b806110f95750602a546005145b806111065750602a546006145b806111135750602a546007145b156111305761112233826124c4565b61112b81612741565b61118b565b602a54600814156111775761114481612741565b601b5461115982611153610f21565b90612762565b111561112b5760405162461bcd60e51b8152600401610c069061487e565b602a546009141561118b5761118b81612741565b60185461119a82611153610f21565b11156111b85760405162461bcd60e51b8152600401610c0690614648565b60155434906111c7908361276e565b11156111e55760405162461bcd60e51b8152600401610c069061437e565b60005b81811015610f145760006111fa610f21565b9050611206338261277a565b508061121181614c4f565b9150506111e8565b611221610b13565b6001600160a01b0316611232611fc5565b6001600160a01b0316146112585760405162461bcd60e51b8152600401610c0690614725565b60185461127382845161126b9190614bb2565b611153610f21565b11156112915760405162461bcd60e51b8152600401610c0690614a7e565b60005b8251811015610e295760005b828110156112f85760006112b2610f21565b90506112e58584815181106112d757634e487b7160e01b600052603260045260246000fd5b60200260200101518261277a565b50806112f081614c4f565b9150506112a0565b508061130381614c4f565b915050611294565b6017818154811061131b57600080fd5b6000918252602090912001546001600160a01b0316905081565b61133d610b13565b6001600160a01b031661134e611fc5565b6001600160a01b0316146113745760405162461bcd60e51b8152600401610c0690614725565b81600214156113f85760005b83518110156113f25781602260008684815181106113ae57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806113ea81614c4f565b915050611380565b50610e29565b81600314156114765760005b83518110156113f257816023600086848151811061143257634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061146e81614c4f565b915050611404565b81600414156114f45760005b83518110156113f25781602460008684815181106114b057634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806114ec81614c4f565b915050611482565b81600514156115725760005b83518110156113f257816025600086848151811061152e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061156a81614c4f565b915050611500565b81600614156115f05760005b83518110156113f25781602660008684815181106115ac57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806115e881614c4f565b91505061157e565b8160071415610e295760005b835181101561166e57816027600086848151811061162a57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061166681614c4f565b9150506115fc565b50505050565b61168561167f610b13565b82612794565b6116a15760405162461bcd60e51b8152600401610c0690614915565b610e29838383612811565b6116b4610b13565b6001600160a01b03166116c5611fc5565b6001600160a01b0316146116eb5760405162461bcd60e51b8152600401610c0690614725565b6117aa601780548060200260200160405190810160405280929190818152602001828054801561174457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611726575b5050505050601780548060200260200160405190810160405280929190818152602001828054801561179f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611781575b505050505083612986565b50565b60006117b883611e9d565b82106117d65760405162461bcd60e51b8152600401610c0690614079565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b611807610b13565b6001600160a01b0316611818611fc5565b6001600160a01b03161461183e5760405162461bcd60e51b8152600401610c0690614725565b611846612d04565b565b600e5490565b6001600160a01b03166000908152601a602052604090205460ff1690565b611874610b13565b6001600160a01b0316611885611fc5565b6001600160a01b0316146118ab5760405162461bcd60e51b8152600401610c0690614725565b6040514790339082156108fc029083906000818181858888f19350505050158015610f14573d6000803e3d6000fd5b6118e2610b13565b6001600160a01b03166118f3611fc5565b6001600160a01b0316146119195760405162461bcd60e51b8152600401610c0690614725565b601b55565b6001600160a01b03918216600090815260146020908152604080832093909416825291909152205490565b611951610b13565b6001600160a01b0316611962611fc5565b6001600160a01b0316146119885760405162461bcd60e51b8152600401610c0690614725565b610f148282612d18565b610e2983838360405180602001604052806000815250612054565b60285460ff166119cf5760405162461bcd60e51b8152600401610c069061400b565b6119d93382612794565b6119f55760405162461bcd60e51b8152600401610c069061475a565b6119fe81612d8d565b610f146001611a0b610f21565b90612e3c565b60195481565b6001600160a01b038116600090815260106020526040902054611a4c5760405162461bcd60e51b8152600401610c0690614277565b6000611a578361221e565b6040516370a0823160e01b81526001600160a01b038516906370a0823190611a83903090600401613f00565b60206040518083038186803b158015611a9b57600080fd5b505afa158015611aaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad39190613e6e565b611add9190614b86565b90506000611af08383610f82878761191e565b905080611b0f5760405162461bcd60e51b8152600401610c06906144cc565b6001600160a01b03808516600090815260146020908152604080832093871683529290529081208054839290611b46908490614b86565b90915550506001600160a01b03841660009081526013602052604081208054839290611b73908490614b86565b90915550611b849050848483612e48565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611bbf929190613f14565b60405180910390a250505050565b6000611bd7610f21565b8210611bf55760405162461bcd60e51b8152600401610c069061499d565b600b8281548110611c1657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b611c30610b13565b6001600160a01b0316611c41611fc5565b6001600160a01b031614611c675760405162461bcd60e51b8152600401610c0690614725565b6117aa81612e9e565b611c78610b13565b6001600160a01b0316611c89611fc5565b6001600160a01b031614611caf5760405162461bcd60e51b8152600401610c0690614725565b6028805460ff19168215151790556040517f25e3c7534f4e40627015c57fddbe7ec01a622a55940963ce7a486112c456948090611ced908390613f6a565b60405180910390a150565b602a5481565b611d06610b13565b6001600160a01b0316611d17611fc5565b6001600160a01b031614611d3d5760405162461bcd60e51b8152600401610c0690614725565b60005b8251811015610e295781601a6000858481518110611d6e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611daa81614c4f565b915050611d40565b6000818152600360205260408120546001600160a01b031680610b3c5760405162461bcd60e51b8152600401610c06906145ff565b611def610b13565b6001600160a01b0316611e00611fc5565b6001600160a01b031614611e265760405162461bcd60e51b8152600401610c0690614725565b611e2e610f21565b81601854611e3c9190614bd1565b1015611e5a5760405162461bcd60e51b8152600401610c06906146fe565b80601854611e689190614bd1565b60185550565b6000610b3c82612eb1565b606060028054610b5390614c14565b60086020526000908152604090205460ff1681565b60006001600160a01b038216611ec55760405162461bcd60e51b8152600401610c06906145b5565b506001600160a01b031660009081526004602052604090205490565b611ee9610b13565b6001600160a01b0316611efa611fc5565b6001600160a01b031614611f205760405162461bcd60e51b8152600401610c0690614725565b6118466000612ecf565b600060128281548110611f4d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b611f70610b13565b6001600160a01b0316611f81611fc5565b6001600160a01b031614611fa75760405162461bcd60e51b8152600401610c0690614725565b611fb2838383612986565b815161166e9060179060208501906138fc565b600d546001600160a01b031690565b611fdc610b13565b6001600160a01b0316611fed611fc5565b6001600160a01b0316146120135760405162461bcd60e51b8152600401610c0690614725565b601555565b606060018054610b5390614c14565b6001600160a01b031660009081526011602052604090205490565b610f1461204d610b13565b8383612f21565b61206561205f610b13565b83612794565b6120815760405162461bcd60e51b8152600401610c0690614915565b61166e84848484612fc4565b601b5481565b606061209e82612357565b6120ba5760405162461bcd60e51b8152600401610c069061479c565b60006120c4611e79565b905060008151116120e4576040518060200160405280600081525061210f565b806120ee84612ff7565b6040516020016120ff929190613ece565b6040516020818303038152906040525b9392505050565b6001600160a01b031660009081526010602052604090205490565b612139610b13565b6001600160a01b031661214a611fc5565b6001600160a01b0316146121705760405162461bcd60e51b8152600401610c0690614725565b60185461217f82611153610f21565b111561219d5760405162461bcd60e51b8152600401610c0690614a7e565b60005b81811015610f14576121c433826121b5610f21565b6121bf9190614b86565b61277a565b806121ce81614c4f565b9150506121a0565b336000908152601a602052604090205460ff166122055760405162461bcd60e51b8152600401610c0690614338565b336000908152601a60205260409020805460ff19169055565b6001600160a01b031660009081526013602052604090205490565b600f5490565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b612275610b13565b6001600160a01b0316612286611fc5565b6001600160a01b0316146122ac5760405162461bcd60e51b8152600401610c0690614725565b6001600160a01b0381166122d25760405162461bcd60e51b8152600401610c06906141b5565b6117aa81612ecf565b60185481565b601481565b600080826001600160a01b0316803b806020016040519081016040528181526000908060200190933c511192915050565b60006001600160e01b031982166380ac58cd60e01b148061234857506001600160e01b03198216635b5e139f60e01b145b80610b3c5750610b3c82613112565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123a982611db2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600e546001600160a01b0384166000908152601060205260408120549091839161240c9086614bb2565b6124169190614b9e565b6124209190614bd1565b949350505050565b804710156124485760405162461bcd60e51b8152600401610c0690614449565b6000826001600160a01b03168260405161246190613efd565b60006040518083038185875af1925050503d806000811461249e576040519150601f19603f3d011682016040523d82523d6000602084013e6124a3565b606091505b5050905080610e295760405162461bcd60e51b8152600401610c06906143b5565b60006124ce610f21565b9050602a5460011415612543576001600160a01b0383166000908152601a602052604090205460ff166125135760405162461bcd60e51b8152600401610c0690614338565b6019546125208383614b86565b111561253e5760405162461bcd60e51b8152600401610c0690614116565b610e29565b602a5460021415612593576001600160a01b03831660009081526022602052604090205460ff166125865760405162461bcd60e51b8152600401610c0690614042565b601c546125208383614b86565b602a54600314156125e3576001600160a01b03831660009081526023602052604090205460ff166125d65760405162461bcd60e51b8152600401610c0690614042565b601d546125208383614b86565b602a5460041415612633576001600160a01b03831660009081526024602052604090205460ff166126265760405162461bcd60e51b8152600401610c0690614042565b601e546125208383614b86565b602a5460051415612683576001600160a01b03831660009081526025602052604090205460ff166126765760405162461bcd60e51b8152600401610c0690614338565b601f546125208383614b86565b602a54600614156126d3576001600160a01b03831660009081526026602052604090205460ff166126c65760405162461bcd60e51b8152600401610c0690614338565b6020546125208383614b86565b602a5460071415610e29576001600160a01b03831660009081526027602052604090205460ff166127165760405162461bcd60e51b8152600401610c0690614338565b6021546127238383614b86565b1115610e295760405162461bcd60e51b8152600401610c0690614116565b60148111156117aa5760405162461bcd60e51b8152600401610c0690614517565b600061210f8284614b86565b600061210f8284614bb2565b610f1482826040518060200160405280600081525061312b565b600061279f82612357565b6127bb5760405162461bcd60e51b8152600401610c0690614480565b60006127c683611db2565b9050806001600160a01b0316846001600160a01b031614806128015750836001600160a01b03166127f684610bdf565b6001600160a01b0316145b806124205750612420818561223f565b826001600160a01b031661282482611db2565b6001600160a01b03161461284a5760405162461bcd60e51b8152600401610c06906141fb565b6001600160a01b0382166128705760405162461bcd60e51b8152600401610c06906142bd565b60075460ff166128b2576001600160a01b03831660009081526008602052604090205460ff166128b25760405162461bcd60e51b8152600401610c0690613f88565b6128bd83838361315e565b6128c8600082612374565b6001600160a01b03831660009081526004602052604081208054600192906128f1908490614bd1565b90915550506001600160a01b038216600090815260046020526040812080546001929061291f908490614b86565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610e29838383610e29565b60005b8351811015612c41576000601060008684815181106129b857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054116129fe5760405162461bcd60e51b8152600401610c0690614277565b6000612a08612239565b612a129047614b86565b90506000612a72868481518110612a3957634e487b7160e01b600052603260045260246000fd5b602002602001015183610f82898781518110612a6557634e487b7160e01b600052603260045260246000fd5b6020026020010151612027565b90508015612b88578060116000888681518110612a9f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254612ad69190614b86565b9250508190555080600f6000828254612aef9190614b86565b92505081905550612b27868481518110612b1957634e487b7160e01b600052603260045260246000fd5b602002602001015182612428565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056868481518110612b6857634e487b7160e01b600052603260045260246000fd5b602002602001015182604051612b7f929190613f14565b60405180910390a15b600060116000888681518110612bae57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060106000888681518110612c0057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555050508080612c3990614c4f565b915050612989565b506000600e819055600f558051825114612c6d5760405162461bcd60e51b8152600401610c06906147eb565b6000825111612c8e5760405162461bcd60e51b8152600401610c0690614ac1565b60005b825181101561166e57612cf2838281518110612cbd57634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110612ce557634e487b7160e01b600052603260045260246000fd5b60200260200101516131e2565b80612cfc81614c4f565b915050612c91565b6007805460ff19811660ff90911615179055565b60005b8251811015610e29578160086000858481518110612d4957634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580612d8581614c4f565b915050612d1b565b6000612d9882611db2565b9050612da68160008461315e565b612db1600083612374565b6001600160a01b0381166000908152600460205260408120805460019290612dda908490614bd1565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4610f1481600084610e29565b600061210f8284614bd1565b610e298363a9059cbb60e01b8484604051602401612e67929190613f14565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613307565b8051610f14906002906020840190613878565b6001600160a01b031660009081526008602052604090205460ff1690565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612f535760405162461bcd60e51b8152600401610c0690614301565b6001600160a01b0383811660008181526006602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190612fb7908590613f6a565b60405180910390a3505050565b612fcf848484612811565b612fdb84848484613396565b61166e5760405162461bcd60e51b8152600401610c06906140c4565b60608161301c57506040805180820190915260018152600360fc1b6020820152610b3f565b8160005b8115613046578061303081614c4f565b915061303f9050600a83614b9e565b9150613020565b60008167ffffffffffffffff81111561306f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613099576020820181803683370190505b5090505b8415612420576130ae600183614bd1565b91506130bb600a86614c6a565b6130c6906030614b86565b60f81b8183815181106130e957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061310b600a86614b9e565b945061309d565b6001600160e01b031981166301ffc9a760e01b14919050565b61313583836134b1565b6131426000848484613396565b610e295760405162461bcd60e51b8152600401610c06906140c4565b613169838383610e29565b6001600160a01b0383166131855761318081613598565b6131a8565b816001600160a01b0316836001600160a01b0316146131a8576131a883826135dc565b6001600160a01b0382166131bf5761253e81613679565b826001600160a01b0316826001600160a01b031614610e2957610e298282613752565b6001600160a01b0382166132085760405162461bcd60e51b8152600401610c0690614169565b600081116132285760405162461bcd60e51b8152600401610c0690614af8565b6001600160a01b0382166000908152601060205260409020541561325e5760405162461bcd60e51b8152600401610c06906149e9565b60128054600181019091557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0384169081179091556000908152601060205260409020819055600e546132c6908290614b86565b600e556040517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac906132fb9084908490613f14565b60405180910390a15050565b600061335c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137969092919063ffffffff16565b805190915015610e29578080602001905181019061337a9190613daa565b610e295760405162461bcd60e51b8152600401610c0690614a34565b60006133aa846001600160a01b03166122e6565b156134a657836001600160a01b031663150b7a026133c6610b13565b8786866040518563ffffffff1660e01b81526004016133e89493929190613f2d565b602060405180830381600087803b15801561340257600080fd5b505af1925050508015613432575060408051601f3d908101601f1916820190925261342f91810190613de2565b60015b61348c573d808015613460576040519150601f19603f3d011682016040523d82523d6000602084013e613465565b606091505b5080516134845760405162461bcd60e51b8152600401610c06906140c4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612420565b506001949350505050565b6001600160a01b0382166134d75760405162461bcd60e51b8152600401610c069061467d565b6134e081612357565b156134fd5760405162461bcd60e51b8152600401610c0690614240565b6135096000838361315e565b6001600160a01b0382166000908152600460205260408120805460019290613532908490614b86565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610f1460008383610e29565b600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b600060016135e984611e9d565b6135f39190614bd1565b6000838152600a6020526040902054909150808214613646576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b600b5460009061368b90600190614bd1565b6000838152600c6020526040812054600b80549394509092849081106136c157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600b83815481106136f057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600c9091526040808220849055858252812055600b80548061373657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061375d83611e9d565b6001600160a01b0390931660009081526009602090815260408083208684528252808320859055938252600a9052919091209190915550565b60606124208484600085856137aa856122e6565b6137c65760405162461bcd60e51b8152600401610c0690614966565b600080866001600160a01b031685876040516137e29190613eb2565b60006040518083038185875af1925050503d806000811461381f576040519150601f19603f3d011682016040523d82523d6000602084013e613824565b606091505b509150915061383482828661383f565b979650505050505050565b6060831561384e57508161210f565b82511561385e5782518084602001fd5b8160405162461bcd60e51b8152600401610c069190613f75565b82805461388490614c14565b90600052602060002090601f0160209004810192826138a657600085556138ec565b82601f106138bf57805160ff19168380011785556138ec565b828001600101855582156138ec579182015b828111156138ec5782518255916020019190600101906138d1565b506138f8929150613951565b5090565b8280548282559060005260206000209081019282156138ec579160200282015b828111156138ec57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061391c565b5b808211156138f85760008155600101613952565b600067ffffffffffffffff83111561398057613980614caa565b613993601f8401601f1916602001614b38565b90508281528383830111156139a757600080fd5b828260208301376000602084830101529392505050565b600082601f8301126139ce578081fd5b813560206139e36139de83614b62565b614b38565b82815281810190858301838502870184018810156139ff578586fd5b855b85811015613a26578135613a1481614cc0565b84529284019290840190600101613a01565b5090979650505050505050565b600082601f830112613a43578081fd5b81356020613a536139de83614b62565b8281528181019085830183850287018401881015613a6f578586fd5b855b85811015613a2657813584529284019290840190600101613a71565b600060208284031215613a9e578081fd5b813561210f81614cc0565b60008060408385031215613abb578081fd5b8235613ac681614cc0565b91506020830135613ad681614cc0565b809150509250929050565b600080600060608486031215613af5578081fd5b8335613b0081614cc0565b92506020840135613b1081614cc0565b929592945050506040919091013590565b60008060008060808587031215613b36578081fd5b8435613b4181614cc0565b93506020850135613b5181614cc0565b925060408501359150606085013567ffffffffffffffff811115613b73578182fd5b8501601f81018713613b83578182fd5b613b9287823560208401613966565b91505092959194509250565b60008060408385031215613bb0578182fd5b8235613bbb81614cc0565b91506020830135613ad681614cd5565b60008060408385031215613bdd578182fd5b8235613be881614cc0565b946020939093013593505050565b600080600060608486031215613c0a578081fd5b833567ffffffffffffffff80821115613c21578283fd5b613c2d878388016139be565b94506020860135915080821115613c42578283fd5b613c4e878388016139be565b93506040860135915080821115613c63578283fd5b50613c7086828701613a33565b9150509250925092565b60008060408385031215613c8c578182fd5b823567ffffffffffffffff811115613ca2578283fd5b613cae858286016139be565b9250506020830135613ad681614cd5565b60008060408385031215613cd1578182fd5b823567ffffffffffffffff811115613ce7578283fd5b613cf3858286016139be565b95602094909401359450505050565b600080600060608486031215613d16578081fd5b833567ffffffffffffffff811115613d2c578182fd5b613d38868287016139be565b935050602084013591506040840135613d5081614cd5565b809150509250925092565b600060208284031215613d6c578081fd5b813567ffffffffffffffff811115613d82578182fd5b61242084828501613a33565b600060208284031215613d9f578081fd5b813561210f81614cd5565b600060208284031215613dbb578081fd5b815161210f81614cd5565b600060208284031215613dd7578081fd5b813561210f81614ce3565b600060208284031215613df3578081fd5b815161210f81614ce3565b60008060408385031215613abb578182fd5b600060208284031215613e21578081fd5b813567ffffffffffffffff811115613e37578182fd5b8201601f81018413613e47578182fd5b61242084823560208401613966565b600060208284031215613e67578081fd5b5035919050565b600060208284031215613e7f578081fd5b5051919050565b60008151808452613e9e816020860160208601614be8565b601f01601f19169290920160200192915050565b60008251613ec4818460208701614be8565b9190910192915050565b60008351613ee0818460208801614be8565b835190830190613ef4818360208801614be8565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f6090830184613e86565b9695505050505050565b901515815260200190565b60006020825261210f6020830184613e86565b6020808252605b908201527f5472616e73666572206973206e6f7420617574686f72697a656420666f72207460408201527f68652053656e646572203a20636f6e74616374207468652070726f6a6563742060608201527f7465616d20746f206265206f6e207468652057686974656c6973740000000000608082015260a00190565b6020808252601a908201527f50616e7468656f6e3a206275726e696e672064697361626c6564000000000000604082015260600190565b6020808252601e908201527f53656e646572206973206e6f74206f6e207468652057686974656c6973740000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526033908201527f4d696e74696e6720776f756c642065786365656420746f74616c20616c6c6f77604082015272656420666f72206561726c792061636365737360681b606082015260800190565b6020808252602c908201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060408201526b7a65726f206164647265737360a01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526026908201527f53656e646572206973206e6f74206f6e20746865206561726c792061636365736040820152651cc81b1a5cdd60d21b606082015260800190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252601b908201527f53616c65206d7573742062652061637469766520746f206d696e740000000000604082015260600190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526021908201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6040820152606560f81b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600d908201526c496e76616c696420737461746560981b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f50616e7468656f6e3a206275726e2063616c6c6572206973206e6f74206f776e60408201526132b960f11b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526032908201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726040820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252606b908201527f507572636861736520776f756c6420657863656564207374616765207375707060408201527f6c792c20636f6e6669726d2077697468207468652070726f6a6563742074656160608201527f6d20746865206d6178696d756d206361726420617661696c61626c6520666f7260808201526a207468697320737461676560a81b60a082015260c00190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960408201526a206861732073686172657360a81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526023908201527f5265736572766174696f6e20776f756c6420657863656564206d617820737570604082015262706c7960e81b606082015260800190565b6020808252601a908201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604082015260600190565b6020808252601d908201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715614b5a57614b5a614caa565b604052919050565b600067ffffffffffffffff821115614b7c57614b7c614caa565b5060209081020190565b60008219821115614b9957614b99614c7e565b500190565b600082614bad57614bad614c94565b500490565b6000816000190483118215151615614bcc57614bcc614c7e565b500290565b600082821015614be357614be3614c7e565b500390565b60005b83811015614c03578181015183820152602001614beb565b8381111561166e5750506000910152565b600281046001821680614c2857607f821691505b60208210811415614c4957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614c6357614c63614c7e565b5060010190565b600082614c7957614c79614c94565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146117aa57600080fd5b80151581146117aa57600080fd5b6001600160e01b0319811681146117aa57600080fdfea26469706673582212207595aa0a4421c3df88a552c218d9cd73dcafa8f426401b1e1e62438d833e393764736f6c63430008000033
Deployed Bytecode Sourcemap
92849:13189:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86509:40;86525:12;:10;:12::i;:::-;86539:9;86509:40;;;;;;;:::i;:::-;;;;;;;;92849:13189;;;;;67962:224;;;;;;;;;;-1:-1:-1;67962:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54711:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;94650:33::-;;;;;;;;;;;;;:::i;56143:221::-;;;;;;;;;;-1:-1:-1;56143:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;97681:163::-;;;;;;;;;;-1:-1:-1;97681:163:0;;;;;:::i;:::-;;:::i;:::-;;100359:601;;;;;;;;;;-1:-1:-1;100359:601:0;;;;;:::i;:::-;;:::i;55666:411::-;;;;;;;;;;-1:-1:-1;55666:411:0;;;;;:::i;:::-;;:::i;93003:44::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;94807:29::-;;;;;;;;;;;;;:::i;97852:100::-;;;;;;;;;;-1:-1:-1;97852:100:0;;;;;:::i;:::-;;:::i;52652:41::-;;;;;;;;;;;;;:::i;68602:113::-;;;;;;;;;;;;;:::i;88295:566::-;;;;;;;;;;-1:-1:-1;88295:566:0;;;;;:::i;:::-;;:::i;104075:1404::-;;;;;;:::i;:::-;;:::i;105533:500::-;;;;;;;;;;-1:-1:-1;105533:500:0;;;;;:::i;:::-;;:::i;93161:297::-;;;;;;;;;;-1:-1:-1;93161:297:0;;;;;:::i;:::-;;:::i;99160:1191::-;;;;;;;;;;-1:-1:-1;99160:1191:0;;;;;:::i;:::-;;:::i;56893:339::-;;;;;;;;;;-1:-1:-1;56893:339:0;;;;;:::i;:::-;;:::i;95528:120::-;;;;;;;;;;-1:-1:-1;95528:120:0;;;;;:::i;:::-;;:::i;68270:256::-;;;;;;;;;;-1:-1:-1;68270:256:0;;;;;:::i;:::-;;:::i;96025:103::-;;;;;;;;;;;;;:::i;86640:91::-;;;;;;;;;;;;;:::i;103565:119::-;;;;;;;;;;-1:-1:-1;103565:119:0;;;;;:::i;:::-;;:::i;96455:143::-;;;;;;;;;;;;;:::i;98051:82::-;;;;;;;;;;-1:-1:-1;98051:82:0;;;;;:::i;:::-;;:::i;87769:135::-;;;;;;;;;;-1:-1:-1;87769:135:0;;;;;:::i;:::-;;:::i;96199:151::-;;;;;;;;;;-1:-1:-1;96199:151:0;;;;;:::i;:::-;;:::i;57303:185::-;;;;;;;;;;-1:-1:-1;57303:185:0;;;;;:::i;:::-;;:::i;97054:301::-;;;;;;;;;;-1:-1:-1;97054:301:0;;;;;:::i;:::-;;:::i;93728:50::-;;;;;;;;;;;;;:::i;90911:641::-;;;;;;;;;;-1:-1:-1;90911:641:0;;;;;:::i;:::-;;:::i;68792:233::-;;;;;;;;;;-1:-1:-1;68792:233:0;;;;;:::i;:::-;;:::i;95362:99::-;;;;;;;;;;-1:-1:-1;95362:99:0;;;;;:::i;:::-;;:::i;98145:158::-;;;;;;;;;;-1:-1:-1;98145:158:0;;;;;:::i;:::-;;:::i;95024:28::-;;;;;;;;;;;;;:::i;98378:248::-;;;;;;;;;;-1:-1:-1;98378:248:0;;;;;:::i;:::-;;:::i;54405:239::-;;;;;;;;;;-1:-1:-1;54405:239:0;;;;;:::i;:::-;;:::i;97429:191::-;;;;;;;;;;-1:-1:-1;97429:191:0;;;;;:::i;:::-;;:::i;98973:122::-;;;;;;;;;;-1:-1:-1;98973:122:0;;;;;:::i;:::-;;:::i;55399:97::-;;;;;;;;;;;;;:::i;52700:49::-;;;;;;;;;;-1:-1:-1;52700:49:0;;;;;:::i;:::-;;:::i;54135:208::-;;;;;;;;;;-1:-1:-1;54135:208:0;;;;;:::i;:::-;;:::i;75764:103::-;;;;;;;;;;;;;:::i;87995:100::-;;;;;;;;;;-1:-1:-1;87995:100:0;;;;;:::i;:::-;;:::i;95734:219::-;;;;;;;;;;-1:-1:-1;95734:219:0;;;;;:::i;:::-;;:::i;75113:87::-;;;;;;;;;;;;;:::i;97960:85::-;;;;;;;;;;-1:-1:-1;97960:85:0;;;;;:::i;:::-;;:::i;54880:104::-;;;;;;;;;;;;;:::i;87491:109::-;;;;;;;;;;-1:-1:-1;87491:109:0;;;;;:::i;:::-;;:::i;56436:155::-;;;;;;;;;;-1:-1:-1;56436:155:0;;;;;:::i;:::-;;:::i;57559:328::-;;;;;;;;;;-1:-1:-1;57559:328:0;;;;;:::i;:::-;;:::i;93936:24::-;;;;;;;;;;;;;:::i;55055:336::-;;;;;;;;;;-1:-1:-1;55055:336:0;;;;;:::i;:::-;;:::i;87287:105::-;;;;;;;;;;-1:-1:-1;87287:105:0;;;;;:::i;:::-;;:::i;96655:325::-;;;;;;;;;;-1:-1:-1;96655:325:0;;;;;:::i;:::-;;:::i;98712:253::-;;;;;;;;;;;;;:::i;87077:119::-;;;;;;;;;;-1:-1:-1;87077:119:0;;;;;:::i;:::-;;:::i;86825:95::-;;;;;;;;;;;;;:::i;56662:164::-;;;;;;;;;;-1:-1:-1;56662:164:0;;;;;:::i;:::-;;:::i;76022:201::-;;;;;;;;;;-1:-1:-1;76022:201:0;;;;;:::i;:::-;;:::i;93638:32::-;;;;;;;;;;;;;:::i;93532:43::-;;;;;;;;;;;;;:::i;4258:98::-;4338:10;4258:98;:::o;67962:224::-;68064:4;-1:-1:-1;;;;;;68088:50:0;;-1:-1:-1;;;68088:50:0;;:90;;;68142:36;68166:11;68142:23;:36::i;:::-;68081:97;;67962:224;;;;:::o;54711:100::-;54765:13;54798:5;54791:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54711:100;:::o;94650:33::-;;;;;;:::o;56143:221::-;56219:7;56247:16;56255:7;56247;:16::i;:::-;56239:73;;;;-1:-1:-1;;;56239:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;56332:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;56332:24:0;;56143:221::o;97681:163::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;97786:1:::1;97774:8;:13;;97749:56;;;;-1:-1:-1::0;;;97749:56:0::1;;;;;;;:::i;:::-;97816:9;:20:::0;97681:163::o;100359:601::-;100444:4;100465:11;100480:1;100465:16;100461:492;;;-1:-1:-1;;;;;;100505:21:0;;;;;;:15;:21;;;;;;;;100498:28;;100461:492;100548:11;100563:1;100548:16;100544:409;;;-1:-1:-1;;;;;;100588:21:0;;;;;;:15;:21;;;;;;;;100581:28;;100544:409;100631:11;100646:1;100631:16;100627:326;;;-1:-1:-1;;;;;;100671:21:0;;;;;;:15;:21;;;;;;;;100664:28;;100627:326;100714:11;100729:1;100714:16;100710:243;;;-1:-1:-1;;;;;;100754:21:0;;;;;;:15;:21;;;;;;;;100747:28;;100710:243;100797:11;100812:1;100797:16;100793:160;;;-1:-1:-1;;;;;;100837:21:0;;;;;;:15;:21;;;;;;;;100830:28;;100793:160;100880:11;100895:1;100880:16;100876:77;;;-1:-1:-1;;;;;;100920:21:0;;;;;;:15;:21;;;;;;;;100876:77;100359:601;;;;:::o;55666:411::-;55747:13;55763:23;55778:7;55763:14;:23::i;:::-;55747:39;;55811:5;-1:-1:-1;;;;;55805:11:0;:2;-1:-1:-1;;;;;55805:11:0;;;55797:57;;;;-1:-1:-1;;;55797:57:0;;;;;;;:::i;:::-;55905:5;-1:-1:-1;;;;;55889:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;55889:21:0;;:62;;;;55914:37;55931:5;55938:12;:10;:12::i;55914:37::-;55867:168;;;;-1:-1:-1;;;55867:168:0;;;;;;;:::i;:::-;56048:21;56057:2;56061:7;56048:8;:21::i;:::-;55666:411;;;:::o;93003:44::-;;;;:::o;94807:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;97852:100::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;97927:17;;::::1;::::0;:10:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;97852:100:::0;:::o;52652:41::-;;;;;;:::o;68602:113::-;68690:10;:17;68602:113;:::o;88295:566::-;-1:-1:-1;;;;;88371:16:0;;88390:1;88371:16;;;:7;:16;;;;;;88363:71;;;;-1:-1:-1;;;88363:71:0;;;;;;;:::i;:::-;88447:21;88495:15;:13;:15::i;:::-;88471:39;;:21;:39;:::i;:::-;88447:63;;88521:15;88539:58;88555:7;88564:13;88579:17;88588:7;88579:8;:17::i;:::-;88539:15;:58::i;:::-;88521:76;-1:-1:-1;88618:12:0;88610:68;;;;-1:-1:-1;;;88610:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;88691:18:0;;;;;;:9;:18;;;;;:29;;88713:7;;88691:18;:29;;88713:7;;88691:29;:::i;:::-;;;;;;;;88749:7;88731:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;88769:35:0;;-1:-1:-1;88787:7:0;88796;88769:17;:35::i;:::-;88820:33;88836:7;88845;88820:33;;;;;;;:::i;:::-;;;;;;;;88295:566;;;:::o;104075:1404::-;104164:9;;104177:1;104164:14;:32;;;;104182:9;;104195:1;104182:14;104164:32;:50;;;;104200:9;;104213:1;104200:14;104164:50;:68;;;;104218:9;;104231:1;104218:14;104164:68;:86;;;;104236:9;;104249:1;104236:14;104164:86;:104;;;;104254:9;;104267:1;104254:14;104164:104;:122;;;;104272:9;;104285:1;104272:14;104164:122;:140;;;;104290:9;;104303:1;104290:14;104164:140;:158;;;;104308:9;;104321:1;104308:14;104164:158;104142:235;;;;-1:-1:-1;;;104142:235:0;;;;;;;:::i;:::-;104392:9;;104405:1;104392:14;:32;;;;104410:9;;104423:1;104410:14;104392:32;:50;;;;104428:9;;104441:1;104428:14;104392:50;:68;;;;104446:9;;104459:1;104446:14;104392:68;:86;;;;104464:9;;104477:1;104464:14;104392:86;:104;;;;104482:9;;104495:1;104482:14;104392:104;:122;;;;104500:9;;104513:1;104500:14;104392:122;104388:647;;;104531:45;104549:10;104561:14;104531:17;:45::i;:::-;104591:36;104612:14;104591:20;:36::i;:::-;104388:647;;;104649:9;;104662:1;104649:14;104645:390;;;104680:36;104701:14;104680:20;:36::i;:::-;104790:5;;104753:33;104771:14;104753:13;:11;:13::i;:::-;:17;;:33::i;:::-;:42;;104731:203;;;;-1:-1:-1;;;104731:203:0;;;;;;;:::i;104645:390::-;104956:9;;104969:1;104956:14;104952:83;;;104987:36;105008:14;104987:20;:36::i;:::-;105104:10;;105067:33;105085:14;105067:13;:11;:13::i;:33::-;:47;;105045:129;;;;-1:-1:-1;;;105045:129:0;;;;;;;:::i;:::-;105207:8;;105239:9;;105207:28;;105220:14;105207:12;:28::i;:::-;:41;;105185:122;;;;-1:-1:-1;;;105185:122:0;;;;;;;:::i;:::-;105325:9;105320:152;105344:14;105340:1;:18;105320:152;;;105380:17;105400:13;:11;:13::i;:::-;105380:33;;105428:32;105438:10;105450:9;105428;:32::i;:::-;-1:-1:-1;105360:3:0;;;;:::i;:::-;;;;105320:152;;105533:500;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;105690:10:::1;;105642:44;105679:6;105660:9;:16;:25;;;;:::i;:::-;105642:13;:11;:13::i;:44::-;:58;;105620:143;;;;-1:-1:-1::0;;;105620:143:0::1;;;;;;;:::i;:::-;105774:9;105794:232;105810:9;:16;105806:1;:20;105794:232;;;105848:9;105872:143;105888:6;105884:1;:10;105872:143;;;105917:17;105937:13;:11;:13::i;:::-;105917:33;;105965:34;105975:9;105985:1;105975:12;;;;;;-1:-1:-1::0;;;105975:12:0::1;;;;;;;;;;;;;;;105989:9;105965;:34::i;:::-;-1:-1:-1::0;105896:3:0;::::1;::::0;::::1;:::i;:::-;;;;105872:143;;;-1:-1:-1::0;105828:3:0;::::1;::::0;::::1;:::i;:::-;;;;105794:232;;93161:297:::0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;93161:297:0;;-1:-1:-1;93161:297:0;:::o;99160:1191::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;99316:11:::1;99331:1;99316:16;99312:1032;;;99354:9;99349:119;99373:9;:16;99369:1;:20;99349:119;;;99447:5;99415:15;:29;99431:9;99441:1;99431:12;;;;;;-1:-1:-1::0;;;99431:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;99415:29:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;99415:29:0;:37;;-1:-1:-1;;99415:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;99391:3;::::1;::::0;::::1;:::i;:::-;;;;99349:119;;;;99312:1032;;;99489:11;99504:1;99489:16;99485:859;;;99527:9;99522:119;99546:9;:16;99542:1;:20;99522:119;;;99620:5;99588:15;:29;99604:9;99614:1;99604:12;;;;;;-1:-1:-1::0;;;99604:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;99588:29:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;99588:29:0;:37;;-1:-1:-1;;99588:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;99564:3;::::1;::::0;::::1;:::i;:::-;;;;99522:119;;99485:859;99662:11;99677:1;99662:16;99658:686;;;99700:9;99695:119;99719:9;:16;99715:1;:20;99695:119;;;99793:5;99761:15;:29;99777:9;99787:1;99777:12;;;;;;-1:-1:-1::0;;;99777:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;99761:29:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;99761:29:0;:37;;-1:-1:-1;;99761:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;99737:3;::::1;::::0;::::1;:::i;:::-;;;;99695:119;;99658:686;99835:11;99850:1;99835:16;99831:513;;;99873:9;99868:119;99892:9;:16;99888:1;:20;99868:119;;;99966:5;99934:15;:29;99950:9;99960:1;99950:12;;;;;;-1:-1:-1::0;;;99950:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;99934:29:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;99934:29:0;:37;;-1:-1:-1;;99934:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;99910:3;::::1;::::0;::::1;:::i;:::-;;;;99868:119;;99831:513;100008:11;100023:1;100008:16;100004:340;;;100046:9;100041:119;100065:9;:16;100061:1;:20;100041:119;;;100139:5;100107:15;:29;100123:9;100133:1;100123:12;;;;;;-1:-1:-1::0;;;100123:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;100107:29:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;100107:29:0;:37;;-1:-1:-1;;100107:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;100083:3;::::1;::::0;::::1;:::i;:::-;;;;100041:119;;100004:340;100181:11;100196:1;100181:16;100177:167;;;100219:9;100214:119;100238:9;:16;100234:1;:20;100214:119;;;100312:5;100280:15;:29;100296:9;100306:1;100296:12;;;;;;-1:-1:-1::0;;;100296:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;100280:29:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;100280:29:0;:37;;-1:-1:-1;;100280:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;100256:3;::::1;::::0;::::1;:::i;:::-;;;;100214:119;;;;99160:1191:::0;;;:::o;56893:339::-;57088:41;57107:12;:10;:12::i;:::-;57121:7;57088:18;:41::i;:::-;57080:103;;;;-1:-1:-1;;;57080:103:0;;;;;;;:::i;:::-;57196:28;57206:4;57212:2;57216:7;57196:9;:28::i;95528:120::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;95604:36:::1;95618:5;95604:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;95604:36:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;95625:5;95604:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;95604:36:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;95632:7;95604:13;:36::i;:::-;95528:120:::0;:::o;68270:256::-;68367:7;68403:23;68420:5;68403:16;:23::i;:::-;68395:5;:31;68387:87;;;;-1:-1:-1;;;68387:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;68492:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;68270:256::o;96025:103::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;96091:29:::1;:27;:29::i;:::-;96025:103::o:0;86640:91::-;86711:12;;86640:91;:::o;103565:119::-;-1:-1:-1;;;;;103650:26:0;103626:4;103650:26;;;:20;:26;;;;;;;;;103565:119::o;96455:143::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;96553:37:::1;::::0;96521:21:::1;::::0;96561:10:::1;::::0;96553:37;::::1;;;::::0;96521:21;;96503:15:::1;96553:37:::0;96503:15;96553:37;96521:21;96561:10;96553:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;98051:82:::0;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;98112:5:::1;:13:::0;98051:82::o;87769:135::-;-1:-1:-1;;;;;87866:21:0;;;87839:7;87866:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;87769:135::o;96199:151::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;96300:42:::1;96325:9;96336:5;96300:24;:42::i;57303:185::-:0;57441:39;57458:4;57464:2;57468:7;57441:39;;;;;;;;;;;;:16;:39::i;97054:301::-;97113:13;;;;97105:52;;;;-1:-1:-1;;;97105:52:0;;;;;;;:::i;:::-;97190:39;97209:10;97221:7;97190:18;:39::i;:::-;97168:123;;;;-1:-1:-1;;;97168:123:0;;;;;;;:::i;:::-;97302:14;97308:7;97302:5;:14::i;:::-;97327:20;97345:1;97327:13;:11;:13::i;:::-;:17;;:20::i;93728:50::-;;;;:::o;90911:641::-;-1:-1:-1;;;;;90993:16:0;;91012:1;90993:16;;;:7;:16;;;;;;90985:71;;;;-1:-1:-1;;;90985:71:0;;;;;;;:::i;:::-;91069:21;91126:20;91140:5;91126:13;:20::i;:::-;91093:30;;-1:-1:-1;;;91093:30:0;;-1:-1:-1;;;;;91093:15:0;;;;;:30;;91117:4;;91093:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;91069:77;;91157:15;91175:65;91191:7;91200:13;91215:24;91224:5;91231:7;91215:8;:24::i;91175:65::-;91157:83;-1:-1:-1;91261:12:0;91253:68;;;;-1:-1:-1;;;91253:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;91334:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;91368:7;;91334:21;:41;;91368:7;;91334:41;:::i;:::-;;;;-1:-1:-1;;;;;;;91386:26:0;;;;;;:19;:26;;;;;:37;;91416:7;;91386:26;:37;;91416:7;;91386:37;:::i;:::-;;;;-1:-1:-1;91436:47:0;;-1:-1:-1;91459:5:0;91466:7;91475;91436:22;:47::i;:::-;91520:5;-1:-1:-1;;;;;91499:45:0;;91527:7;91536;91499:45;;;;;;;:::i;:::-;;;;;;;;90911:641;;;;:::o;68792:233::-;68867:7;68903:30;:28;:30::i;:::-;68895:5;:38;68887:95;;;;-1:-1:-1;;;68887:95:0;;;;;;;:::i;:::-;69000:10;69011:5;69000:17;;;;;;-1:-1:-1;;;69000:17:0;;;;;;;;;;;;;;;;;68993:24;;68792:233;;;:::o;95362:99::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;95433:20:::1;95445:7;95433:11;:20::i;98145:158::-:0;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;98218:13:::1;:30:::0;;-1:-1:-1;;98218:30:0::1;::::0;::::1;;;::::0;;98264:31:::1;::::0;::::1;::::0;::::1;::::0;98218:30;;98264:31:::1;:::i;:::-;;;;;;;;98145:158:::0;:::o;95024:28::-;;;;:::o;98378:248::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;98508:9:::1;98503:116;98527:9;:16;98523:1;:20;98503:116;;;98602:5;98565:20;:34;98586:9;98596:1;98586:12;;;;;;-1:-1:-1::0;;;98586:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;98565:34:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;98565:34:0;:42;;-1:-1:-1;;98565:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;98545:3;::::1;::::0;::::1;:::i;:::-;;;;98503:116;;54405:239:::0;54477:7;54513:16;;;:7;:16;;;;;;-1:-1:-1;;;;;54513:16:0;54548:19;54540:73;;;;-1:-1:-1;;;54540:73:0;;;;;;;:::i;97429:191::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;97537:13:::1;:11;:13::i;:::-;97526:7;97513:10;;:20;;;;:::i;:::-;:37;;97505:63;;;;-1:-1:-1::0;;;97505:63:0::1;;;;;;;:::i;:::-;97605:7;97592:10;;:20;;;;:::i;:::-;97579:10;:33:::0;-1:-1:-1;97429:191:0:o;98973:122::-;99037:4;99061:26;99082:4;99061:20;:26::i;55399:97::-;55447:13;55480:8;55473:15;;;;;:::i;52700:49::-;;;;;;;;;;;;;;;:::o;54135:208::-;54207:7;-1:-1:-1;;;;;54235:19:0;;54227:74;;;;-1:-1:-1;;;54227:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;54319:16:0;;;;;:9;:16;;;;;;;54135:208::o;75764:103::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;75829:30:::1;75856:1;75829:18;:30::i;87995:100::-:0;88046:7;88073;88081:5;88073:14;;;;;;-1:-1:-1;;;88073:14:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;88073:14:0;;87995:100;-1:-1:-1;;87995:100:0:o;95734:219::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;95873:44:::1;95887:9;95898;95909:7;95873:13;:44::i;:::-;95928:17:::0;;::::1;::::0;:5:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;75113:87::-:0;75186:6;;-1:-1:-1;;;;;75186:6:0;75113:87;:::o;97960:85::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;98021:8:::1;:16:::0;97960:85::o;54880:104::-;54936:13;54969:7;54962:14;;;;;:::i;87491:109::-;-1:-1:-1;;;;;87574:18:0;87547:7;87574:18;;;:9;:18;;;;;;;87491:109::o;56436:155::-;56531:52;56550:12;:10;:12::i;:::-;56564:8;56574;56531:18;:52::i;57559:328::-;57734:41;57753:12;:10;:12::i;:::-;57767:7;57734:18;:41::i;:::-;57726:103;;;;-1:-1:-1;;;57726:103:0;;;;;;;:::i;:::-;57840:39;57854:4;57860:2;57864:7;57873:5;57840:13;:39::i;93936:24::-;;;;:::o;55055:336::-;55128:13;55162:16;55170:7;55162;:16::i;:::-;55154:76;;;;-1:-1:-1;;;55154:76:0;;;;;;;:::i;:::-;55243:22;55268:9;:7;:9::i;:::-;55243:34;;55320:1;55301:8;55295:22;:26;:88;;;;;;;;;;;;;;;;;55348:8;55358:18;:7;:16;:18::i;:::-;55331:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55295:88;55288:95;55055:336;-1:-1:-1;;;55055:336:0:o;87287:105::-;-1:-1:-1;;;;;87368:16:0;87341:7;87368:16;;;:7;:16;;;;;;;87287:105::o;96655:325::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;96773:10:::1;;96744:25;96762:6;96744:13;:11;:13::i;:25::-;:39;;96722:124;;;;-1:-1:-1::0;;;96722:124:0::1;;;;;;;:::i;:::-;96857:9;96877:96;96893:6;96889:1;:10;96877:96;;;96921:40;96931:10;96959:1;96943:13;:11;:13::i;:::-;:17;;;;:::i;:::-;96921:9;:40::i;:::-;96901:3:::0;::::1;::::0;::::1;:::i;:::-;;;;96877:96;;98712:253:::0;98829:10;98808:32;;;;:20;:32;;;;;;;;98786:120;;;;-1:-1:-1;;;98786:120:0;;;;;;;:::i;:::-;98938:10;98952:5;98917:32;;;:20;:32;;;;;:40;;-1:-1:-1;;98917:40:0;;;98712:253::o;87077:119::-;-1:-1:-1;;;;;87162:26:0;87135:7;87162:26;;;:19;:26;;;;;;;87077:119::o;86825:95::-;86898:14;;86825:95;:::o;56662:164::-;-1:-1:-1;;;;;56783:25:0;;;56759:4;56783:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;56662:164::o;76022:201::-;75344:12;:10;:12::i;:::-;-1:-1:-1;;;;;75333:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;75333:23:0;;75325:68;;;;-1:-1:-1;;;75325:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;76111:22:0;::::1;76103:73;;;;-1:-1:-1::0;;;76103:73:0::1;;;;;;;:::i;:::-;76187:28;76206:8;76187:18;:28::i;93638:32::-:0;;;;:::o;93532:43::-;93573:2;93532:43;:::o;21877:326::-;21937:4;22194:1;22172:7;-1:-1:-1;;;;;22172:12:0;;;;;;;;;;;;;;;;;;;;;;;;:19;:23;;21877:326;-1:-1:-1;;21877:326:0:o;53766:305::-;53868:4;-1:-1:-1;;;;;;53905:40:0;;-1:-1:-1;;;53905:40:0;;:105;;-1:-1:-1;;;;;;;53962:48:0;;-1:-1:-1;;;53962:48:0;53905:105;:158;;;;54027:36;54051:11;54027:23;:36::i;59397:127::-;59462:4;59486:16;;;:7;:16;;;;;;-1:-1:-1;;;;;59486:16:0;:30;;;59397:127::o;63828:174::-;63903:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;63903:29:0;-1:-1:-1;;;;;63903:29:0;;;;;;;;:24;;63957:23;63903:24;63957:14;:23::i;:::-;-1:-1:-1;;;;;63948:46:0;;;;;;;;;;;63828:174;;:::o;91730:248::-;91940:12;;-1:-1:-1;;;;;91920:16:0;;91876:7;91920:16;;;:7;:16;;;;;;91876:7;;91955:15;;91904:32;;:13;:32;:::i;:::-;91903:49;;;;:::i;:::-;:67;;;;:::i;:::-;91896:74;91730:248;-1:-1:-1;;;;91730:248:0:o;23138:317::-;23253:6;23228:21;:31;;23220:73;;;;-1:-1:-1;;;23220:73:0;;;;;;;:::i;:::-;23307:12;23325:9;-1:-1:-1;;;;;23325:14:0;23347:6;23325:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23306:52;;;23377:7;23369:78;;;;-1:-1:-1;;;23369:78:0;;;;;;;:::i;100970:2520::-;101085:14;101102:13;:11;:13::i;:::-;101085:30;;101130:9;;101143:1;101130:14;101126:2357;;;-1:-1:-1;;;;;101187:28:0;;;;;;:20;:28;;;;;;;;101161:128;;;;-1:-1:-1;;;101161:128:0;;;;;;;:::i;:::-;101357:29;;101330:23;101339:14;101330:6;:23;:::i;:::-;:56;;101304:169;;;;-1:-1:-1;;;101304:169:0;;;;;;;:::i;:::-;101126:2357;;;101495:9;;101508:1;101495:14;101491:1992;;;-1:-1:-1;;;;;101552:23:0;;;;;;:15;:23;;;;;;;;101526:115;;;;-1:-1:-1;;;101526:115:0;;;;;;;:::i;:::-;101709:6;;101682:23;101691:14;101682:6;:23;:::i;101491:1992::-;101824:9;;101837:1;101824:14;101820:1663;;;-1:-1:-1;;;;;101881:23:0;;;;;;:15;:23;;;;;;;;101855:115;;;;-1:-1:-1;;;101855:115:0;;;;;;;:::i;:::-;102038:6;;102011:23;102020:14;102011:6;:23;:::i;101820:1663::-;102153:9;;102166:1;102153:14;102149:1334;;;-1:-1:-1;;;;;102210:23:0;;;;;;:15;:23;;;;;;;;102184:115;;;;-1:-1:-1;;;102184:115:0;;;;;;;:::i;:::-;102367:6;;102340:23;102349:14;102340:6;:23;:::i;102149:1334::-;102482:9;;102495:1;102482:14;102478:1005;;;-1:-1:-1;;;;;102539:23:0;;;;;;:15;:23;;;;;;;;102513:123;;;;-1:-1:-1;;;102513:123:0;;;;;;;:::i;:::-;102704:6;;102677:23;102686:14;102677:6;:23;:::i;102478:1005::-;102819:9;;102832:1;102819:14;102815:668;;;-1:-1:-1;;;;;102876:23:0;;;;;;:15;:23;;;;;;;;102850:123;;;;-1:-1:-1;;;102850:123:0;;;;;;;:::i;:::-;103041:6;;103014:23;103023:14;103014:6;:23;:::i;102815:668::-;103156:9;;103169:1;103156:14;103152:331;;;-1:-1:-1;;;;;103213:23:0;;;;;;:15;:23;;;;;;;;103187:123;;;;-1:-1:-1;;;103187:123:0;;;;;;;:::i;:::-;103378:6;;103351:23;103360:14;103351:6;:23;:::i;:::-;:33;;103325:146;;;;-1:-1:-1;;;103325:146:0;;;;;;;:::i;103825:203::-;93573:2;103926:14;:32;;103904:115;;;;-1:-1:-1;;;103904:115:0;;;;;;;:::i;16550:98::-;16608:7;16635:5;16639:1;16635;:5;:::i;17288:98::-;17346:7;17373:5;17377:1;17373;:5;:::i;60381:110::-;60457:26;60467:2;60471:7;60457:26;;;;;;;;;;;;:9;:26::i;59691:348::-;59784:4;59809:16;59817:7;59809;:16::i;:::-;59801:73;;;;-1:-1:-1;;;59801:73:0;;;;;;;:::i;:::-;59885:13;59901:23;59916:7;59901:14;:23::i;:::-;59885:39;;59954:5;-1:-1:-1;;;;;59943:16:0;:7;-1:-1:-1;;;;;59943:16:0;;:51;;;;59987:7;-1:-1:-1;;;;;59963:31:0;:20;59975:7;59963:11;:20::i;:::-;-1:-1:-1;;;;;59963:31:0;;59943:51;:87;;;;59998:32;60015:5;60022:7;59998:16;:32::i;62800:910::-;62959:4;-1:-1:-1;;;;;62932:31:0;:23;62947:7;62932:14;:23::i;:::-;-1:-1:-1;;;;;62932:31:0;;62924:81;;;;-1:-1:-1;;;62924:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63024:16:0;;63016:65;;;;-1:-1:-1;;;63016:65:0;;;;;;;:::i;:::-;63184:21;;;;63180:189;;-1:-1:-1;;;;;63238:23:0;;;;;;:17;:23;;;;;;;;63230:127;;;;-1:-1:-1;;;63230:127:0;;;;;;;:::i;:::-;63379:39;63400:4;63406:2;63410:7;63379:20;:39::i;:::-;63483:29;63500:1;63504:7;63483:8;:29::i;:::-;-1:-1:-1;;;;;63525:15:0;;;;;;:9;:15;;;;;:20;;63544:1;;63525:15;:20;;63544:1;;63525:20;:::i;:::-;;;;-1:-1:-1;;;;;;;63556:13:0;;;;;;:9;:13;;;;;:18;;63573:1;;63556:13;:18;;63573:1;;63556:18;:::i;:::-;;;;-1:-1:-1;;63585:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;63585:21:0;-1:-1:-1;;;;;63585:21:0;;;;;;;;;63624:27;;63585:16;;63624:27;;;;;;;63664:38;63684:4;63690:2;63694:7;63664:19;:38::i;89169:1474::-;89472:9;89467:688;89491:9;:16;89487:1;:20;89467:688;;;89561:1;89537:7;:21;89545:9;89555:1;89545:12;;;;;;-1:-1:-1;;;89545:12:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;89537:21:0;-1:-1:-1;;;;;89537:21:0;;;;;;;;;;;;;:25;89529:76;;;;-1:-1:-1;;;89529:76:0;;;;;;;:::i;:::-;89620:21;89668:15;:13;:15::i;:::-;89644:39;;:21;:39;:::i;:::-;89620:63;;89698:15;89716:68;89732:9;89742:1;89732:12;;;;;;-1:-1:-1;;;89732:12:0;;;;;;;;;;;;;;;89746:13;89761:22;89770:9;89780:1;89770:12;;;;;;-1:-1:-1;;;89770:12:0;;;;;;;;;;;;;;;89761:8;:22::i;89716:68::-;89698:86;-1:-1:-1;89805:12:0;;89801:260;;89864:7;89837:9;:23;89847:9;89857:1;89847:12;;;;;;-1:-1:-1;;;89847:12:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;89837:23:0;-1:-1:-1;;;;;89837:23:0;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;89908:7;89890:14;;:25;;;;;;;:::i;:::-;;;;;;;;89934:49;89960:9;89970:1;89960:12;;;;;;-1:-1:-1;;;89960:12:0;;;;;;;;;;;;;;;89975:7;89934:17;:49::i;:::-;90007:38;90023:9;90033:1;90023:12;;;;;;-1:-1:-1;;;90023:12:0;;;;;;;;;;;;;;;90037:7;90007:38;;;;;;;:::i;:::-;;;;;;;;89801:260;90102:1;90076:9;:23;90086:9;90096:1;90086:12;;;;;;-1:-1:-1;;;90086:12:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;90076:23:0;-1:-1:-1;;;;;90076:23:0;;;;;;;;;;;;:27;;;;90142:1;90118:7;:21;90126:9;90136:1;90126:12;;;;;;-1:-1:-1;;;90126:12:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;90118:21:0;-1:-1:-1;;;;;90118:21:0;;;;;;;;;;;;:25;;;;89467:688;;89509:3;;;;;:::i;:::-;;;;89467:688;;;-1:-1:-1;90250:1:0;90235:12;:16;;;90262:14;:18;90377:14;;90357:16;;:34;90349:97;;;;-1:-1:-1;;;90349:97:0;;;;;;;:::i;:::-;90484:1;90465:9;:16;:20;90457:59;;;;-1:-1:-1;;;90457:59:0;;;;;;;:::i;:::-;90532:9;90527:109;90551:9;:16;90547:1;:20;90527:109;;;90589:35;90599:9;90609:1;90599:12;;;;;;-1:-1:-1;;;90599:12:0;;;;;;;;;;;;;;;90613:7;90621:1;90613:10;;;;;;-1:-1:-1;;;90613:10:0;;;;;;;;;;;;;;;90589:9;:35::i;:::-;90569:3;;;;:::i;:::-;;;;90527:109;;53058:121;53150:21;;;-1:-1:-1;;53125:46:0;;53150:21;;;;53149:22;53125:46;;;53058:121::o;53250:222::-;53357:9;53352:113;53376:9;:16;53372:1;:20;53352:113;;;53448:5;53414:17;:31;53432:9;53442:1;53432:12;;;;;;-1:-1:-1;;;53432:12:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53414:31:0;;;;;;;;;;;-1:-1:-1;53414:31:0;:39;;-1:-1:-1;;53414:39:0;;;;;;;;;;53394:3;;;;:::i;:::-;;;;53352:113;;62043:420;62103:13;62119:23;62134:7;62119:14;:23::i;:::-;62103:39;;62155:48;62176:5;62191:1;62195:7;62155:20;:48::i;:::-;62244:29;62261:1;62265:7;62244:8;:29::i;:::-;-1:-1:-1;;;;;62286:16:0;;;;;;:9;:16;;;;;:21;;62306:1;;62286:16;:21;;62306:1;;62286:21;:::i;:::-;;;;-1:-1:-1;;62325:16:0;;;;:7;:16;;;;;;62318:23;;-1:-1:-1;;;;;;62318:23:0;;;62359:36;62333:7;;62325:16;-1:-1:-1;;;;;62359:36:0;;;;;62325:16;;62359:36;62408:47;62428:5;62443:1;62447:7;62408:19;:47::i;16931:98::-;16989:7;17016:5;17020:1;17016;:5;:::i;80041:211::-;80158:86;80178:5;80208:23;;;80233:2;80237:5;80185:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;80185:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;80185:58:0;-1:-1:-1;;;;;;80185:58:0;;;;;;;;;;80158:19;:86::i;55504:100::-;55577:19;;;;:8;;:19;;;;;:::i;53564:130::-;-1:-1:-1;;;;;53663:23:0;53639:4;53663:23;;;:17;:23;;;;;;;;;53564:130::o;76383:191::-;76476:6;;;-1:-1:-1;;;;;76493:17:0;;;-1:-1:-1;;;;;;76493:17:0;;;;;;;76526:40;;76476:6;;;76493:17;76476:6;;76526:40;;76457:16;;76526:40;76383:191;;:::o;64144:315::-;64299:8;-1:-1:-1;;;;;64290:17:0;:5;-1:-1:-1;;;;;64290:17:0;;;64282:55;;;;-1:-1:-1;;;64282:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64348:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;64348:46:0;;;;;;;64410:41;;;;;64348:46;;64410:41;:::i;:::-;;;;;;;;64144:315;;;:::o;58769:::-;58926:28;58936:4;58942:2;58946:7;58926:9;:28::i;:::-;58973:48;58996:4;59002:2;59006:7;59015:5;58973:22;:48::i;:::-;58965:111;;;;-1:-1:-1;;;58965:111:0;;;;;;;:::i;49779:723::-;49835:13;50056:10;50052:53;;-1:-1:-1;50083:10:0;;;;;;;;;;;;-1:-1:-1;;;50083:10:0;;;;;;50052:53;50130:5;50115:12;50171:78;50178:9;;50171:78;;50204:8;;;;:::i;:::-;;-1:-1:-1;50227:10:0;;-1:-1:-1;50235:2:0;50227:10;;:::i;:::-;;;50171:78;;;50259:19;50291:6;50281:17;;;;;;-1:-1:-1;;;50281:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50281:17:0;;50259:39;;50309:154;50316:10;;50309:154;;50343:11;50353:1;50343:11;;:::i;:::-;;-1:-1:-1;50412:10:0;50420:2;50412:5;:10;:::i;:::-;50399:24;;:2;:24;:::i;:::-;50386:39;;50369:6;50376;50369:14;;;;;;-1:-1:-1;;;50369:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;50369:56:0;;;;;;;;-1:-1:-1;50440:11:0;50449:2;50440:11;;:::i;:::-;;;50309:154;;13586:157;-1:-1:-1;;;;;;13695:40:0;;-1:-1:-1;;;13695:40:0;13586:157;;;:::o;60718:321::-;60848:18;60854:2;60858:7;60848:5;:18::i;:::-;60899:54;60930:1;60934:2;60938:7;60947:5;60899:22;:54::i;:::-;60877:154;;;;-1:-1:-1;;;60877:154:0;;;;;;;:::i;69638:589::-;69782:45;69809:4;69815:2;69819:7;69782:26;:45::i;:::-;-1:-1:-1;;;;;69844:18:0;;69840:187;;69879:40;69911:7;69879:31;:40::i;:::-;69840:187;;;69949:2;-1:-1:-1;;;;;69941:10:0;:4;-1:-1:-1;;;;;69941:10:0;;69937:90;;69968:47;70001:4;70007:7;69968:32;:47::i;:::-;-1:-1:-1;;;;;70041:16:0;;70037:183;;70074:45;70111:7;70074:36;:45::i;70037:183::-;70147:4;-1:-1:-1;;;;;70141:10:0;:2;-1:-1:-1;;;;;70141:10:0;;70137:83;;70168:40;70196:2;70200:7;70168:27;:40::i;92170:473::-;-1:-1:-1;;;;;92250:21:0;;92242:78;;;;-1:-1:-1;;;92242:78:0;;;;;;;:::i;:::-;92349:1;92339:7;:11;92331:53;;;;-1:-1:-1;;;92331:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;92403:16:0;;;;;;:7;:16;;;;;;:21;92395:77;;;;-1:-1:-1;;;92395:77:0;;;;;;;:::i;:::-;92485:7;:21;;;;;;;;;;;;-1:-1:-1;;;;;;92485:21:0;-1:-1:-1;;;;;92485:21:0;;;;;;;;-1:-1:-1;92517:16:0;;;:7;92485:21;92517:16;;;;:26;;;92569:12;;:22;;92517:26;;92569:22;:::i;:::-;92554:12;:37;92607:28;;;;;;92618:7;;92627;;92607:28;:::i;:::-;;;;;;;;92170:473;;:::o;82614:716::-;83038:23;83064:69;83092:4;83064:69;;;;;;;;;;;;;;;;;83072:5;-1:-1:-1;;;;;83064:27:0;;;:69;;;;;:::i;:::-;83148:17;;83038:95;;-1:-1:-1;83148:21:0;83144:179;;83245:10;83234:30;;;;;;;;;;;;:::i;:::-;83226:85;;;;-1:-1:-1;;;83226:85:0;;;;;;;:::i;65024:799::-;65179:4;65200:15;:2;-1:-1:-1;;;;;65200:13:0;;:15::i;:::-;65196:620;;;65252:2;-1:-1:-1;;;;;65236:36:0;;65273:12;:10;:12::i;:::-;65287:4;65293:7;65302:5;65236:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65236:72:0;;;;;;;;-1:-1:-1;;65236:72:0;;;;;;;;;;;;:::i;:::-;;;65232:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65478:13:0;;65474:272;;65521:60;;-1:-1:-1;;;65521:60:0;;;;;;;:::i;65474:272::-;65696:6;65690:13;65681:6;65677:2;65673:15;65666:38;65232:529;-1:-1:-1;;;;;;65359:51:0;-1:-1:-1;;;65359:51:0;;-1:-1:-1;65352:58:0;;65196:620;-1:-1:-1;65800:4:0;65024:799;;;;;;:::o;61375:439::-;-1:-1:-1;;;;;61455:16:0;;61447:61;;;;-1:-1:-1;;;61447:61:0;;;;;;;:::i;:::-;61528:16;61536:7;61528;:16::i;:::-;61527:17;61519:58;;;;-1:-1:-1;;;61519:58:0;;;;;;;:::i;:::-;61590:45;61619:1;61623:2;61627:7;61590:20;:45::i;:::-;-1:-1:-1;;;;;61648:13:0;;;;;;:9;:13;;;;;:18;;61665:1;;61648:13;:18;;61665:1;;61648:18;:::i;:::-;;;;-1:-1:-1;;61677:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;61677:21:0;-1:-1:-1;;;;;61677:21:0;;;;;;;;61716:33;;61677:16;;;61716:33;;61677:16;;61716:33;61762:44;61790:1;61794:2;61798:7;61762:19;:44::i;70950:164::-;71054:10;:17;;71027:24;;;;:15;:24;;;;;:44;;;71082:24;;;;;;;;;;;;70950:164::o;71741:988::-;72007:22;72057:1;72032:22;72049:4;72032:16;:22::i;:::-;:26;;;;:::i;:::-;72069:18;72090:26;;;:17;:26;;;;;;72007:51;;-1:-1:-1;72223:28:0;;;72219:328;;-1:-1:-1;;;;;72290:18:0;;72268:19;72290:18;;;:12;:18;;;;;;;;:34;;;;;;;;;72341:30;;;;;;:44;;;72458:30;;:17;:30;;;;;:43;;;72219:328;-1:-1:-1;72643:26:0;;;;:17;:26;;;;;;;;72636:33;;;-1:-1:-1;;;;;72687:18:0;;;;;:12;:18;;;;;:34;;;;;;;72680:41;71741:988::o;73024:1079::-;73302:10;:17;73277:22;;73302:21;;73322:1;;73302:21;:::i;:::-;73334:18;73355:24;;;:15;:24;;;;;;73728:10;:26;;73277:46;;-1:-1:-1;73355:24:0;;73277:46;;73728:26;;;;-1:-1:-1;;;73728:26:0;;;;;;;;;;;;;;;;;73706:48;;73792:11;73767:10;73778;73767:22;;;;;;-1:-1:-1;;;73767:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;73872:28;;;:15;:28;;;;;;;:41;;;74044:24;;;;;74037:31;74079:10;:16;;;;;-1:-1:-1;;;74079:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;73024:1079;;;;:::o;70528:221::-;70613:14;70630:20;70647:2;70630:16;:20::i;:::-;-1:-1:-1;;;;;70661:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;70706:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;70528:221:0:o;24622:229::-;24759:12;24791:52;24813:6;24821:4;24827:1;24830:12;24759;26037:18;26048:6;26037:10;:18::i;:::-;26029:60;;;;-1:-1:-1;;;26029:60:0;;;;;;;:::i;:::-;26103:12;26117:23;26144:6;-1:-1:-1;;;;;26144:11:0;26163:5;26170:4;26144:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26102:73;;;;26193:51;26210:7;26219:10;26231:12;26193:16;:51::i;:::-;26186:58;25742:510;-1:-1:-1;;;;;;;25742:510:0:o;28428:712::-;28578:12;28607:7;28603:530;;;-1:-1:-1;28638:10:0;28631:17;;28603:530;28752:17;;:21;28748:374;;28950:10;28944:17;29011:15;28998:10;28994:2;28990:19;28983:44;28898:148;29093:12;29086:20;;-1:-1:-1;;;29086:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:409:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:782::-;;541:3;534:4;526:6;522:17;518:27;508:2;;563:5;556;549:20;508:2;603:6;590:20;629:4;653:65;668:49;714:2;668:49;:::i;:::-;653:65;:::i;:::-;752:15;;;783:12;;;;815:15;;;861:11;;;849:24;;845:33;;842:42;-1:-1:-1;839:2:1;;;901:5;894;887:20;839:2;927:5;941:240;955:2;952:1;949:9;941:240;;;1026:3;1013:17;1043:33;1070:5;1043:33;:::i;:::-;1089:18;;1127:12;;;;1159;;;;973:1;966:9;941:240;;;-1:-1:-1;1199:5:1;;498:712;-1:-1:-1;;;;;;;498:712:1:o;1215:705::-;;1328:3;1321:4;1313:6;1309:17;1305:27;1295:2;;1350:5;1343;1336:20;1295:2;1390:6;1377:20;1416:4;1440:65;1455:49;1501:2;1455:49;:::i;1440:65::-;1539:15;;;1570:12;;;;1602:15;;;1648:11;;;1636:24;;1632:33;;1629:42;-1:-1:-1;1626:2:1;;;1688:5;1681;1674:20;1626:2;1714:5;1728:163;1742:2;1739:1;1736:9;1728:163;;;1799:17;;1787:30;;1837:12;;;;1869;;;;1760:1;1753:9;1728:163;;1925:259;;2037:2;2025:9;2016:7;2012:23;2008:32;2005:2;;;2058:6;2050;2043:22;2005:2;2102:9;2089:23;2121:33;2148:5;2121:33;:::i;2461:402::-;;;2590:2;2578:9;2569:7;2565:23;2561:32;2558:2;;;2611:6;2603;2596:22;2558:2;2655:9;2642:23;2674:33;2701:5;2674:33;:::i;:::-;2726:5;-1:-1:-1;2783:2:1;2768:18;;2755:32;2796:35;2755:32;2796:35;:::i;:::-;2850:7;2840:17;;;2548:315;;;;;:::o;2868:470::-;;;;3014:2;3002:9;2993:7;2989:23;2985:32;2982:2;;;3035:6;3027;3020:22;2982:2;3079:9;3066:23;3098:33;3125:5;3098:33;:::i;:::-;3150:5;-1:-1:-1;3207:2:1;3192:18;;3179:32;3220:35;3179:32;3220:35;:::i;:::-;2972:366;;3274:7;;-1:-1:-1;;;3328:2:1;3313:18;;;;3300:32;;2972:366::o;3343:830::-;;;;;3515:3;3503:9;3494:7;3490:23;3486:33;3483:2;;;3537:6;3529;3522:22;3483:2;3581:9;3568:23;3600:33;3627:5;3600:33;:::i;:::-;3652:5;-1:-1:-1;3709:2:1;3694:18;;3681:32;3722:35;3681:32;3722:35;:::i;:::-;3776:7;-1:-1:-1;3830:2:1;3815:18;;3802:32;;-1:-1:-1;3885:2:1;3870:18;;3857:32;3912:18;3901:30;;3898:2;;;3949:6;3941;3934:22;3898:2;3977:22;;4030:4;4022:13;;4018:27;-1:-1:-1;4008:2:1;;4064:6;4056;4049:22;4008:2;4092:75;4159:7;4154:2;4141:16;4136:2;4132;4128:11;4092:75;:::i;:::-;4082:85;;;3473:700;;;;;;;:::o;4178:396::-;;;4304:2;4292:9;4283:7;4279:23;4275:32;4272:2;;;4325:6;4317;4310:22;4272:2;4369:9;4356:23;4388:33;4415:5;4388:33;:::i;:::-;4440:5;-1:-1:-1;4497:2:1;4482:18;;4469:32;4510;4469;4510;:::i;4579:327::-;;;4708:2;4696:9;4687:7;4683:23;4679:32;4676:2;;;4729:6;4721;4714:22;4676:2;4773:9;4760:23;4792:33;4819:5;4792:33;:::i;:::-;4844:5;4896:2;4881:18;;;;4868:32;;-1:-1:-1;;;4666:240:1:o;4911:879::-;;;;5132:2;5120:9;5111:7;5107:23;5103:32;5100:2;;;5153:6;5145;5138:22;5100:2;5198:9;5185:23;5227:18;5268:2;5260:6;5257:14;5254:2;;;5289:6;5281;5274:22;5254:2;5317:67;5376:7;5367:6;5356:9;5352:22;5317:67;:::i;:::-;5307:77;;5437:2;5426:9;5422:18;5409:32;5393:48;;5466:2;5456:8;5453:16;5450:2;;;5487:6;5479;5472:22;5450:2;5515:69;5576:7;5565:8;5554:9;5550:24;5515:69;:::i;:::-;5505:79;;5637:2;5626:9;5622:18;5609:32;5593:48;;5666:2;5656:8;5653:16;5650:2;;;5687:6;5679;5672:22;5650:2;;5715:69;5776:7;5765:8;5754:9;5750:24;5715:69;:::i;:::-;5705:79;;;5090:700;;;;;:::o;5795:505::-;;;5946:2;5934:9;5925:7;5921:23;5917:32;5914:2;;;5967:6;5959;5952:22;5914:2;6012:9;5999:23;6045:18;6037:6;6034:30;6031:2;;;6082:6;6074;6067:22;6031:2;6110:67;6169:7;6160:6;6149:9;6145:22;6110:67;:::i;:::-;6100:77;;;6227:2;6216:9;6212:18;6199:32;6240:30;6264:5;6240:30;:::i;6305:442::-;;;6459:2;6447:9;6438:7;6434:23;6430:32;6427:2;;;6480:6;6472;6465:22;6427:2;6525:9;6512:23;6558:18;6550:6;6547:30;6544:2;;;6595:6;6587;6580:22;6544:2;6623:67;6682:7;6673:6;6662:9;6658:22;6623:67;:::i;:::-;6613:77;6737:2;6722:18;;;;6709:32;;-1:-1:-1;;;;6417:330:1:o;6752:573::-;;;;6920:2;6908:9;6899:7;6895:23;6891:32;6888:2;;;6941:6;6933;6926:22;6888:2;6986:9;6973:23;7019:18;7011:6;7008:30;7005:2;;;7056:6;7048;7041:22;7005:2;7084:67;7143:7;7134:6;7123:9;7119:22;7084:67;:::i;:::-;7074:77;;;7198:2;7187:9;7183:18;7170:32;7160:42;;7252:2;7241:9;7237:18;7224:32;7265:30;7289:5;7265:30;:::i;:::-;7314:5;7304:15;;;6878:447;;;;;:::o;7330:374::-;;7467:2;7455:9;7446:7;7442:23;7438:32;7435:2;;;7488:6;7480;7473:22;7435:2;7533:9;7520:23;7566:18;7558:6;7555:30;7552:2;;;7603:6;7595;7588:22;7552:2;7631:67;7690:7;7681:6;7670:9;7666:22;7631:67;:::i;7709:253::-;;7818:2;7806:9;7797:7;7793:23;7789:32;7786:2;;;7839:6;7831;7824:22;7786:2;7883:9;7870:23;7902:30;7926:5;7902:30;:::i;7967:257::-;;8087:2;8075:9;8066:7;8062:23;8058:32;8055:2;;;8108:6;8100;8093:22;8055:2;8145:9;8139:16;8164:30;8188:5;8164:30;:::i;8229:257::-;;8340:2;8328:9;8319:7;8315:23;8311:32;8308:2;;;8361:6;8353;8346:22;8308:2;8405:9;8392:23;8424:32;8450:5;8424:32;:::i;8491:261::-;;8613:2;8601:9;8592:7;8588:23;8584:32;8581:2;;;8634:6;8626;8619:22;8581:2;8671:9;8665:16;8690:32;8716:5;8690:32;:::i;9036:417::-;;;9180:2;9168:9;9159:7;9155:23;9151:32;9148:2;;;9201:6;9193;9186:22;9458:482;;9580:2;9568:9;9559:7;9555:23;9551:32;9548:2;;;9601:6;9593;9586:22;9548:2;9646:9;9633:23;9679:18;9671:6;9668:30;9665:2;;;9716:6;9708;9701:22;9665:2;9744:22;;9797:4;9789:13;;9785:27;-1:-1:-1;9775:2:1;;9831:6;9823;9816:22;9775:2;9859:75;9926:7;9921:2;9908:16;9903:2;9899;9895:11;9859:75;:::i;9945:190::-;;10057:2;10045:9;10036:7;10032:23;10028:32;10025:2;;;10078:6;10070;10063:22;10025:2;-1:-1:-1;10106:23:1;;10015:120;-1:-1:-1;10015:120:1:o;10140:194::-;;10263:2;10251:9;10242:7;10238:23;10234:32;10231:2;;;10284:6;10276;10269:22;10231:2;-1:-1:-1;10312:16:1;;10221:113;-1:-1:-1;10221:113:1:o;10339:259::-;;10420:5;10414:12;10447:6;10442:3;10435:19;10463:63;10519:6;10512:4;10507:3;10503:14;10496:4;10489:5;10485:16;10463:63;:::i;:::-;10580:2;10559:15;-1:-1:-1;;10555:29:1;10546:39;;;;10587:4;10542:50;;10390:208;-1:-1:-1;;10390:208:1:o;10603:274::-;;10770:6;10764:13;10786:53;10832:6;10827:3;10820:4;10812:6;10808:17;10786:53;:::i;:::-;10855:16;;;;;10740:137;-1:-1:-1;;10740:137:1:o;10882:470::-;;11099:6;11093:13;11115:53;11161:6;11156:3;11149:4;11141:6;11137:17;11115:53;:::i;:::-;11231:13;;11190:16;;;;11253:57;11231:13;11190:16;11287:4;11275:17;;11253:57;:::i;:::-;11326:20;;11069:283;-1:-1:-1;;;;11069:283:1:o;11357:205::-;11557:3;11548:14::o;11567:203::-;-1:-1:-1;;;;;11731:32:1;;;;11713:51;;11701:2;11686:18;;11668:102::o;11775:282::-;-1:-1:-1;;;;;11975:32:1;;;;11957:51;;12039:2;12024:18;;12017:34;11945:2;11930:18;;11912:145::o;12062:490::-;-1:-1:-1;;;;;12331:15:1;;;12313:34;;12383:15;;12378:2;12363:18;;12356:43;12430:2;12415:18;;12408:34;;;12478:3;12473:2;12458:18;;12451:31;;;12062:490;;12499:47;;12526:19;;12518:6;12499:47;:::i;:::-;12491:55;12265:287;-1:-1:-1;;;;;;12265:287:1:o;12836:187::-;13001:14;;12994:22;12976:41;;12964:2;12949:18;;12931:92::o;13028:221::-;;13177:2;13166:9;13159:21;13197:46;13239:2;13228:9;13224:18;13216:6;13197:46;:::i;13254:495::-;13456:2;13438:21;;;13495:2;13475:18;;;13468:30;13534:34;13529:2;13514:18;;13507:62;13605:34;13600:2;13585:18;;13578:62;13677:29;13671:3;13656:19;;13649:58;13739:3;13724:19;;13428:321::o;13754:350::-;13956:2;13938:21;;;13995:2;13975:18;;;13968:30;14034:28;14029:2;14014:18;;14007:56;14095:2;14080:18;;13928:176::o;14109:354::-;14311:2;14293:21;;;14350:2;14330:18;;;14323:30;14389:32;14384:2;14369:18;;14362:60;14454:2;14439:18;;14283:180::o;14468:407::-;14670:2;14652:21;;;14709:2;14689:18;;;14682:30;14748:34;14743:2;14728:18;;14721:62;-1:-1:-1;;;14814:2:1;14799:18;;14792:41;14865:3;14850:19;;14642:233::o;14880:414::-;15082:2;15064:21;;;15121:2;15101:18;;;15094:30;15160:34;15155:2;15140:18;;15133:62;-1:-1:-1;;;15226:2:1;15211:18;;15204:48;15284:3;15269:19;;15054:240::o;15299:415::-;15501:2;15483:21;;;15540:2;15520:18;;;15513:30;15579:34;15574:2;15559:18;;15552:62;-1:-1:-1;;;15645:2:1;15630:18;;15623:49;15704:3;15689:19;;15473:241::o;15719:408::-;15921:2;15903:21;;;15960:2;15940:18;;;15933:30;15999:34;15994:2;15979:18;;15972:62;-1:-1:-1;;;16065:2:1;16050:18;;16043:42;16117:3;16102:19;;15893:234::o;16132:402::-;16334:2;16316:21;;;16373:2;16353:18;;;16346:30;16412:34;16407:2;16392:18;;16385:62;-1:-1:-1;;;16478:2:1;16463:18;;16456:36;16524:3;16509:19;;16306:228::o;16539:401::-;16741:2;16723:21;;;16780:2;16760:18;;;16753:30;16819:34;16814:2;16799:18;;16792:62;-1:-1:-1;;;16885:2:1;16870:18;;16863:35;16930:3;16915:19;;16713:227::o;16945:352::-;17147:2;17129:21;;;17186:2;17166:18;;;17159:30;17225;17220:2;17205:18;;17198:58;17288:2;17273:18;;17119:178::o;17302:402::-;17504:2;17486:21;;;17543:2;17523:18;;;17516:30;17582:34;17577:2;17562:18;;17555:62;-1:-1:-1;;;17648:2:1;17633:18;;17626:36;17694:3;17679:19;;17476:228::o;17709:400::-;17911:2;17893:21;;;17950:2;17930:18;;;17923:30;17989:34;17984:2;17969:18;;17962:62;-1:-1:-1;;;18055:2:1;18040:18;;18033:34;18099:3;18084:19;;17883:226::o;18114:349::-;18316:2;18298:21;;;18355:2;18335:18;;;18328:30;18394:27;18389:2;18374:18;;18367:55;18454:2;18439:18;;18288:175::o;18468:402::-;18670:2;18652:21;;;18709:2;18689:18;;;18682:30;18748:34;18743:2;18728:18;;18721:62;-1:-1:-1;;;18814:2:1;18799:18;;18792:36;18860:3;18845:19;;18642:228::o;18875:355::-;19077:2;19059:21;;;19116:2;19096:18;;;19089:30;19155:33;19150:2;19135:18;;19128:61;19221:2;19206:18;;19049:181::o;19235:422::-;19437:2;19419:21;;;19476:2;19456:18;;;19449:30;19515:34;19510:2;19495:18;;19488:62;19586:28;19581:2;19566:18;;19559:56;19647:3;19632:19;;19409:248::o;19662:351::-;19864:2;19846:21;;;19903:2;19883:18;;;19876:30;19942:29;19937:2;19922:18;;19915:57;20004:2;19989:18;;19836:177::o;20018:353::-;20220:2;20202:21;;;20259:2;20239:18;;;20232:30;20298:31;20293:2;20278:18;;20271:59;20362:2;20347:18;;20192:179::o;20783:408::-;20985:2;20967:21;;;21024:2;21004:18;;;20997:30;21063:34;21058:2;21043:18;;21036:62;-1:-1:-1;;;21129:2:1;21114:18;;21107:42;21181:3;21166:19;;20957:234::o;21196:407::-;21398:2;21380:21;;;21437:2;21417:18;;;21410:30;21476:34;21471:2;21456:18;;21449:62;-1:-1:-1;;;21542:2:1;21527:18;;21520:41;21593:3;21578:19;;21370:233::o;21608:397::-;21810:2;21792:21;;;21849:2;21829:18;;;21822:30;21888:34;21883:2;21868:18;;21861:62;-1:-1:-1;;;21954:2:1;21939:18;;21932:31;21995:3;21980:19;;21782:223::o;22010:420::-;22212:2;22194:21;;;22251:2;22231:18;;;22224:30;22290:34;22285:2;22270:18;;22263:62;22361:26;22356:2;22341:18;;22334:54;22420:3;22405:19;;22184:246::o;22435:406::-;22637:2;22619:21;;;22676:2;22656:18;;;22649:30;22715:34;22710:2;22695:18;;22688:62;-1:-1:-1;;;22781:2:1;22766:18;;22759:40;22831:3;22816:19;;22609:232::o;22846:405::-;23048:2;23030:21;;;23087:2;23067:18;;;23060:30;23126:34;23121:2;23106:18;;23099:62;-1:-1:-1;;;23192:2:1;23177:18;;23170:39;23241:3;23226:19;;23020:231::o;23256:356::-;23458:2;23440:21;;;23477:18;;;23470:30;23536:34;23531:2;23516:18;;23509:62;23603:2;23588:18;;23430:182::o;23617:356::-;23819:2;23801:21;;;23838:18;;;23831:30;23897:34;23892:2;23877:18;;23870:62;23964:2;23949:18;;23791:182::o;23978:408::-;24180:2;24162:21;;;24219:2;24199:18;;;24192:30;24258:34;24253:2;24238:18;;24231:62;-1:-1:-1;;;24324:2:1;24309:18;;24302:42;24376:3;24361:19;;24152:234::o;24391:337::-;24593:2;24575:21;;;24632:2;24612:18;;;24605:30;-1:-1:-1;;;24666:2:1;24651:18;;24644:43;24719:2;24704:18;;24565:163::o;24733:356::-;24935:2;24917:21;;;24954:18;;;24947:30;25013:34;25008:2;24993:18;;24986:62;25080:2;25065:18;;24907:182::o;25094:398::-;25296:2;25278:21;;;25335:2;25315:18;;;25308:30;25374:34;25369:2;25354:18;;25347:62;-1:-1:-1;;;25440:2:1;25425:18;;25418:32;25482:3;25467:19;;25268:224::o;25497:411::-;25699:2;25681:21;;;25738:2;25718:18;;;25711:30;25777:34;25772:2;25757:18;;25750:62;-1:-1:-1;;;25843:2:1;25828:18;;25821:45;25898:3;25883:19;;25671:237::o;25913:414::-;26115:2;26097:21;;;26154:2;26134:18;;;26127:30;26193:34;26188:2;26173:18;;26166:62;-1:-1:-1;;;26259:2:1;26244:18;;26237:48;26317:3;26302:19;;26087:240::o;26332:397::-;26534:2;26516:21;;;26573:2;26553:18;;;26546:30;26612:34;26607:2;26592:18;;26585:62;-1:-1:-1;;;26678:2:1;26663:18;;26656:31;26719:3;26704:19;;26506:223::o;26734:552::-;26936:2;26918:21;;;26975:3;26955:18;;;26948:31;27015:34;27010:2;26995:18;;26988:62;27086:34;27081:2;27066:18;;27059:62;27158:34;27152:3;27137:19;;27130:63;-1:-1:-1;;;27224:3:1;27209:19;;27202:42;27276:3;27261:19;;26908:378::o;27291:413::-;27493:2;27475:21;;;27532:2;27512:18;;;27505:30;27571:34;27566:2;27551:18;;27544:62;-1:-1:-1;;;27637:2:1;27622:18;;27615:47;27694:3;27679:19;;27465:239::o;27709:353::-;27911:2;27893:21;;;27950:2;27930:18;;;27923:30;27989:31;27984:2;27969:18;;27962:59;28053:2;28038:18;;27883:179::o;28067:408::-;28269:2;28251:21;;;28308:2;28288:18;;;28281:30;28347:34;28342:2;28327:18;;28320:62;-1:-1:-1;;;28413:2:1;28398:18;;28391:42;28465:3;28450:19;;28241:234::o;28480:407::-;28682:2;28664:21;;;28721:2;28701:18;;;28694:30;28760:34;28755:2;28740:18;;28733:62;-1:-1:-1;;;28826:2:1;28811:18;;28804:41;28877:3;28862:19;;28654:233::o;28892:406::-;29094:2;29076:21;;;29133:2;29113:18;;;29106:30;29172:34;29167:2;29152:18;;29145:62;-1:-1:-1;;;29238:2:1;29223:18;;29216:40;29288:3;29273:19;;29066:232::o;29303:399::-;29505:2;29487:21;;;29544:2;29524:18;;;29517:30;29583:34;29578:2;29563:18;;29556:62;-1:-1:-1;;;29649:2:1;29634:18;;29627:33;29692:3;29677:19;;29477:225::o;29707:350::-;29909:2;29891:21;;;29948:2;29928:18;;;29921:30;29987:28;29982:2;29967:18;;29960:56;30048:2;30033:18;;29881:176::o;30062:353::-;30264:2;30246:21;;;30303:2;30283:18;;;30276:30;30342:31;30337:2;30322:18;;30315:59;30406:2;30391:18;;30236:179::o;30420:177::-;30566:25;;;30554:2;30539:18;;30521:76::o;30602:251::-;30672:2;30666:9;30702:17;;;30749:18;30734:34;;30770:22;;;30731:62;30728:2;;;30796:18;;:::i;:::-;30832:2;30825:22;30646:207;;-1:-1:-1;30646:207:1:o;30858:192::-;;30957:18;30949:6;30946:30;30943:2;;;30979:18;;:::i;:::-;-1:-1:-1;31039:4:1;31020:17;;;31016:28;;30933:117::o;31055:128::-;;31126:1;31122:6;31119:1;31116:13;31113:2;;;31132:18;;:::i;:::-;-1:-1:-1;31168:9:1;;31103:80::o;31188:120::-;;31254:1;31244:2;;31259:18;;:::i;:::-;-1:-1:-1;31293:9:1;;31234:74::o;31313:168::-;;31419:1;31415;31411:6;31407:14;31404:1;31401:21;31396:1;31389:9;31382:17;31378:45;31375:2;;;31426:18;;:::i;:::-;-1:-1:-1;31466:9:1;;31365:116::o;31486:125::-;;31554:1;31551;31548:8;31545:2;;;31559:18;;:::i;:::-;-1:-1:-1;31596:9:1;;31535:76::o;31616:258::-;31688:1;31698:113;31712:6;31709:1;31706:13;31698:113;;;31788:11;;;31782:18;31769:11;;;31762:39;31734:2;31727:10;31698:113;;;31829:6;31826:1;31823:13;31820:2;;;-1:-1:-1;;31864:1:1;31846:16;;31839:27;31669:205::o;31879:380::-;31964:1;31954:12;;32011:1;32001:12;;;32022:2;;32076:4;32068:6;32064:17;32054:27;;32022:2;32129;32121:6;32118:14;32098:18;32095:38;32092:2;;;32175:10;32170:3;32166:20;32163:1;32156:31;32210:4;32207:1;32200:15;32238:4;32235:1;32228:15;32092:2;;31934:325;;;:::o;32264:135::-;;-1:-1:-1;;32324:17:1;;32321:2;;;32344:18;;:::i;:::-;-1:-1:-1;32391:1:1;32380:13;;32311:88::o;32404:112::-;;32462:1;32452:2;;32467:18;;:::i;:::-;-1:-1:-1;32501:9:1;;32442:74::o;32521:127::-;32582:10;32577:3;32573:20;32570:1;32563:31;32613:4;32610:1;32603:15;32637:4;32634:1;32627:15;32653:127;32714:10;32709:3;32705:20;32702:1;32695:31;32745:4;32742:1;32735:15;32769:4;32766:1;32759:15;32785:127;32846:10;32841:3;32837:20;32834:1;32827:31;32877:4;32874:1;32867:15;32901:4;32898:1;32891:15;32917:133;-1:-1:-1;;;;;32994:31:1;;32984:42;;32974:2;;33040:1;33037;33030:12;33055:120;33143:5;33136:13;33129:21;33122:5;33119:32;33109:2;;33165:1;33162;33155:12;33180:133;-1:-1:-1;;;;;;33256:32:1;;33246:43;;33236:2;;33303:1;33300;33293:12
Swarm Source
ipfs://7595aa0a4421c3df88a552c218d9cd73dcafa8f426401b1e1e62438d833e3937
Loading...
Loading
Loading...
Loading
OVERVIEW
**1er réseau d'entrepreneurs français décentralisé.**Formations, conférences, développement physique et psychologique. Accède à l’expérience, au savoir et au carnet d'adresses d'Alex & PJ.. Deux formateurs et entrepreneurs à succès avec la meilleure mentalité qu'on puisse t...Net Worth in USD
$1,150.42
Net Worth in ETH
0.555465
Token Allocations
BNB
92.59%
GALEON
7.41%
POL
0.00%
Multichain Portfolio | 33 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.