ERC-20
Overview
Max Total Supply
720,000,000 MAIT
Holders
36
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MaitrejaCoin
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-07-15 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // 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 (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, 'ERC20: decreased allowance below zero'); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), 'ERC20: transfer from the zero address'); require(to != address(0), 'ERC20: transfer to the zero address'); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, 'ERC20: transfer amount exceeds balance'); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), 'ERC20: mint to the zero address'); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), 'ERC20: burn from the zero address'); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, 'ERC20: burn amount exceeds balance'); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), 'ERC20: approve from the zero address'); require(spender != address(0), 'ERC20: approve to the zero address'); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, 'ERC20: insufficient allowance'); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount) 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, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 functionCallWithValue(target, data, 0, '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'); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), 'Address: call to non-contract'); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // OpenZeppelin Contracts (last updated v4.8.0) (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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, 'SafeERC20: permit did not succeed'); } /** * @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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 (last updated v4.8.0) (access/Ownable2Step.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides 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} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() external { address sender = _msgSender(); require(pendingOwner() == sender, 'Ownable2Step: caller is not the new owner'); _transferOwnership(sender); } } pragma solidity ^0.8.16; /** * @title MaitrejaCoin * This contract implements the MaitrejaCoin (MAIT) token and the functions * necessary for its initial coin offering (ICO). */ contract MaitrejaCoin is ERC20, Ownable2Step { using SafeERC20 for IERC20; address public USDT_Address; /** * A struct that holds information about a lock */ struct Lock { /** * A timestamp when the lock will be unlocked */ uint256 unlock; /** * The amount that is locked */ uint256 amount; } /** * Smart contract deployment time */ uint256 public deployTime; /** * Team address */ address public team; /** * End time of ICO */ uint256 public icoEnd; /** * Amount of coins available for ICO */ uint256 public icoAmount; /** * The price of 1 MAIT in USD. */ uint256 public USDprice; /** * Date of the last price change */ uint256 public lastPriceChange; /** * The minimum order value required in the ICO. */ uint256 public minimalOrder; // MAPPINGS /** * Mapping of addresses to an array of Lock structs * * The mapping is used to keep track of locked amounts for each address. */ mapping(address => Lock[]) public lockedAmounts; /** * Mapping of addresses to their last lock time * * The mapping is used to keep track of the latest time a lock will be unlocked for each address. */ mapping(address => uint256) private lastLock; /** * Contract constructor to initialize the token and ICO parameters. * * @param _icoEnd End of ico. * @param _minimalOrder The minimum order value required in the ICO. * @param _team Address of Team. */ constructor(uint256 _icoEnd, uint256 _minimalOrder, address _team) ERC20('MaitrejaCoin', 'MAIT') { // Initialize the price in USD USDprice = 1 * 10 ** 6; // 1 USD // Initialize USDT address USDT_Address = 0xdAC17F958D2ee523a2206206994597C13D831ec7; // Initialize the minimal order minimalOrder = _minimalOrder; // Initialize the team address team = _team; // Initialize the smart contract deployment time deployTime = block.timestamp; // Set the lastPriceChange to 1.4.2023 to allow the price to be changed no sooner than 1.4.2024 lastPriceChange = 1680307200; // Initialize ICO end time icoEnd = _icoEnd; // Initialize the amount of tokens availble in ICO (65% of total supply of 720M) icoAmount = 468_000_000 * 10 ** 18; // Mint tokens 65 % for sale, 12 % for Maitreja (marketing, risk management, liquidity), 23 % for team, user rewards etc. _mint(address(this), 468_000_000 * 10 ** 18); _mint(0xff84F6b169972162Af0AcA5734507FA76fd3b0F2, 86_400_000 * 10 ** 18); _mint(team, 165_600_000 * 10 ** 18); // Lock team funds lockedAmounts[team].push(Lock(1688169600, 33_120_000 * 10 ** 18)); //1.7.2023 lockedAmounts[team].push(Lock(1706745600, 33_120_000 * 10 ** 18)); //1.2.2024 lockedAmounts[team].push(Lock(1719792000, 33_120_000 * 10 ** 18)); //1.7.2024 lockedAmounts[team].push(Lock(1738368000, 33_120_000 * 10 ** 18)); //1.2.2025 lockedAmounts[team].push(Lock(1751328000, 33_120_000 * 10 ** 18)); //1.7.2025 lastLock[team] = 1751328000; //1.7.2025 } // MODIFIERS /** * modifier to check if the input value is greater than or equal * to the minimal order value * * @param amount the input value to be checked */ modifier moreThanMinimal(uint256 amount) { require(amount >= minimalOrder, 'MAIT: minimal order value was not met'); _; } /** * Modifier to validate if the amount is less than or equal the available amount * * This modifier ensures that the provided `amount` is less than or equal to the `icoAmount`, * thus preventing a transfer of more tokens than available. * * @param amount The amount of tokens being transferred. */ modifier lessThanAvailable(uint256 amount, bool shortUnlock) { uint256 _amount; if (shortUnlock) { _amount = amount + amount / 10; } else { _amount = amount; } require(_amount <= icoAmount, 'MAIT: amount cannot be greater than the available amount'); _; } /** * Modifier that checks if the ICO is currently active (i.e., the current block timestamp is before the `icoEnd` time). * Reverts if the ICO has already ended. */ modifier icoActive() { require(block.timestamp < icoEnd, 'MAIT: ICO has already ended'); _; } // GETTERS /** * Returns the last time the msg.sender has locked their funds * * @return uint256 the last time the msg.sender has locked their funds */ function getLastLock() public view returns (uint256) { return lastLock[msg.sender]; } // SETTERS /** * Allows the contract owner to set the end date * for the initial coin offering (ICO). * * @param _icoEnd - The timestamp for the end of the ICO. */ function setIcoEnd(uint256 _icoEnd) external onlyOwner { require(_icoEnd > block.timestamp, 'MAIT: ICO cannot be set in the past'); icoEnd = _icoEnd; } /** * Allows the contract owner to set the price of one MaitrejaCoin in USDT. * * @param _USDprice The price of one MaitrejaCoin in USDT. */ function setUSDPrice(uint256 _USDprice) external onlyOwner { require(_USDprice > 0, 'MAIT: price of the coin cannot be zero'); require(lastPriceChange + 365 days < block.timestamp, 'MAIT: price can only be updated once a year'); USDprice = _USDprice; lastPriceChange = block.timestamp; } /** * Allows the owner of the contract to set the address of the USTD token * This is needed only for testing purposes. * * @param _USDT: the address of the USTD token */ function setUSDT(address _USDT) external onlyOwner { //check if the address is not the zero address require(_USDT != address(0), 'MAIT: USDT address cannot be the zero address'); USDT_Address = _USDT; } /** * Allows the contract owner to set the minimum order value in MaitrejaCoin. * * @param _minimalOrder The minimum order value in MaitrejaCoin. */ function setMinimalOrder(uint256 _minimalOrder) external onlyOwner { require(_minimalOrder > 0, 'MAIT: minimal order cannot be zero'); minimalOrder = _minimalOrder; } /** * Validates a transfer of an amount of tokens from one address to another. * Returns true if the transfer is allowed, false otherwise. * * @param amount The amount of tokens to transfer. * @param from The address sending the tokens. * @return bool Returns true if the transfer is allowed, false otherwise. */ function _validateTransfer(uint256 amount, address from) private view returns (bool) { // Return true on mint if (deployTime == block.timestamp) { return true; } else if (from == address(this)) { return true; } else if (_getUnlockedFunds(from) >= amount) { return true; } else { return false; } } /** * Returns the unlocked funds for a particular address * * @param from - address to get the unlocked funds for * @return uint256 - the unlocked funds available */ function _getUnlockedFunds(address from) private view returns (uint256) { uint256 locked; for (uint i = 0; i < lockedAmounts[from].length; ++i) { if (lockedAmounts[from][i].unlock > block.timestamp) { locked += lockedAmounts[from][i].amount; } } return balanceOf(from) - locked; } /** * @dev Override the default token transfer behavior to enforce restrictions based on locked amounts and balance * * @param from address The address of the transferor * @param to address The address of the transferee * @param amount uint256 The amount being transferred */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal override { super._beforeTokenTransfer(from, to, amount); if (lastLock[from] > block.timestamp) { require(_validateTransfer(amount, from), 'MAIT: transfer amount exceeds balance or unlocked amount too low'); } } /** * Internal function that is executed after a token transfer from the `from` address to the `to` address * * @param from - address of the transfer sender * @param to - address of the transfer recipient * @param amount - amount of tokens transferred */ function _afterTokenTransfer(address from, address to, uint256 amount) internal override { super._afterTokenTransfer(from, to, amount); if (lastLock[from] > block.timestamp) { removeFromLocked(from, amount); } } /** * Removes a specified amount of tokens from the locked tokens * of a particular address * * @param from the address whose locked tokens should be reduced * @param amount the amount to be reduced from the locked tokens * * @dev Function first iterates through the lockedAmounts mapping of the `from` address * If an amount has a lock time that is lower than the current block timestamp, * the `amount` is reduced from it. The loop continues until the full `amount` * has been reduced. */ function removeFromLocked(address from, uint256 amount) internal { for (uint i = 0; i < lockedAmounts[from].length; ++i) { if (lockedAmounts[from][i].unlock < block.timestamp) { if (amount > lockedAmounts[from][i].amount) { amount -= lockedAmounts[from][i].amount; delete lockedAmounts[from][i]; } else { lockedAmounts[from][i].amount -= amount; return; } } } } /** * Participate in the ICO. * * @param amount The amount of the specified currency to participate in the ICO. * @param shortUnlock A boolean value that determines the lock time. If `true`, the lock time will be short, otherwise it will be long. * @return Whether the participation in the ICO was successful. * * @dev The function is public and payable. It can only be called if the ICO is active and the `amount` is more than the minimal value, and less than the available value. */ function ico( uint256 amount, // amount to participate in ICO bool shortUnlock, // short or long lock time uint256 expectedPrice // expected price paid for a token ) public payable icoActive moreThanMinimal(amount) lessThanAvailable(amount, shortUnlock) returns (bool) { //check if the the price matches the expected price require(USDprice == expectedPrice, "MAIT: Expected price per coin doesn't match the real price"); SafeERC20.safeTransferFrom(IERC20(USDT_Address), msg.sender, address(this), (amount * USDprice) / 10 ** 18); uint256 _lockTime; // variable to store the lock time if (shortUnlock) { _lockTime = block.timestamp + 365 days; // short lock time } else { amount = amount + amount / 10; // add 10 % to the amount to participate _lockTime = block.timestamp + 2 * 365 days; // long lock time } // update the last lock time of the participant if the new lock time is greater than the previous one if (lastLock[msg.sender] < _lockTime) lastLock[msg.sender] = _lockTime; // add the amount and the lock time to the list of locked lockedAmounts[msg.sender].push(Lock(_lockTime, amount)); // transfers the amount of tokes from contact to sender _transfer(address(this), msg.sender, amount); // decreses amount of tokens available by ICO icoAmount -= amount; return true; } /** * Returns the balance of USDT held by the contract * * @return The balance of the specified currency held by the contract * */ function getUSDBalance() external view returns (uint256) { return IERC20(USDT_Address).balanceOf(address(this)); } /** * Allows owner to cash out by transferring a specified amount of USDT to `maitreja` * * @param amount The amount being cashed out * * throws "Ownable: caller is not the owner" if the caller is not `owner` */ function cashOut(uint256 amount) external onlyOwner { SafeERC20.safeTransfer(IERC20(USDT_Address), msg.sender, amount); } /** * Returns the amount of locked tokens for the calling address * * @return The amount of locked tokens for the calling address */ function getLocked() external view returns (Lock[] memory) { return lockedAmounts[msg.sender]; } /** * Returns the current block's timestamp * * @return The current block's timestamp */ function getTime() external view returns (uint) { return block.timestamp; } function renounceOwnership() public pure override { revert("Ownable: can't renounceOwnership here"); //not possible with this token } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_icoEnd","type":"uint256"},{"internalType":"uint256","name":"_minimalOrder","type":"uint256"},{"internalType":"address","name":"_team","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"USDT_Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"cashOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLocked","outputs":[{"components":[{"internalType":"uint256","name":"unlock","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MaitrejaCoin.Lock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUSDBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"shortUnlock","type":"bool"},{"internalType":"uint256","name":"expectedPrice","type":"uint256"}],"name":"ico","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"icoAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"icoEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPriceChange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockedAmounts","outputs":[{"internalType":"uint256","name":"unlock","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_icoEnd","type":"uint256"}],"name":"setIcoEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimalOrder","type":"uint256"}],"name":"setMinimalOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_USDprice","type":"uint256"}],"name":"setUSDPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_USDT","type":"address"}],"name":"setUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004f7738038062004f77833981810160405281019062000037919062000fde565b6040518060400160405280600c81526020017f4d61697472656a61436f696e00000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d414954000000000000000000000000000000000000000000000000000000008152508160039081620000b49190620012aa565b508060049081620000c69190620012aa565b505050620000e9620000dd6200069160201b60201c565b6200069960201b60201c565b620f4240600c8190555073dac17f958d2ee523a2206206994597c13d831ec7600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e8190555080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055506364277400600d8190555082600a819055506b01831edad60ea26a54000000600b81905550620001da306b01831edad60ea26a54000000620006d760201b60201c565b6200020b73ff84f6b169972162af0aca5734507fa76fd3b0f26a4777e962985cfff0000000620006d760201b60201c565b6200024a600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166a88fb29fcf95cea8c000000620006d760201b60201c565b600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040528063649f6c8081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052806365badf0081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405280636681f18081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040528063679d640081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600f6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405280636863250081526020016a1b656ecc31df621c000000815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050636863250060106000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050620015fb565b600033905090565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055620006d4816200084460201b6200150b1760201c565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200074090620013f2565b60405180910390fd5b6200075d600083836200090a60201b60201c565b806002600082825462000771919062001443565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200082491906200148f565b60405180910390a36200084060008383620009c460201b60201c565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200092283838362000a3c60201b620015d11760201c565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115620009bf576200097c818462000a4160201b60201c565b620009be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009b59062001522565b60405180910390fd5b5b505050565b620009dc83838362000ac260201b620015d61760201c565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111562000a375762000a36838262000ac760201b60201c565b5b505050565b505050565b6000426008540362000a57576001905062000abc565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a95576001905062000abc565b8262000aa78362000d8160201b60201c565b1062000ab7576001905062000abc565b600090505b92915050565b505050565b60005b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101562000d7b5742600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811062000b6a5762000b6962001544565b5b906000526020600020906002020160000154101562000d6757600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811062000bd75762000bd662001544565b5b90600052602060002090600202016001015482111562000ce157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811062000c455762000c4462001544565b5b9060005260206000209060020201600101548262000c64919062001573565b9150600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811062000cba5762000cb962001544565b5b90600052602060002090600202016000808201600090556001820160009055505062000d66565b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811062000d365762000d3562001544565b5b9060005260206000209060020201600101600082825462000d58919062001573565b925050819055505062000d7d565b5b8062000d7390620015ae565b905062000aca565b505b5050565b60008060005b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101562000eca5742600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811062000e275762000e2662001544565b5b906000526020600020906002020160000154111562000eb657600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811062000e945762000e9362001544565b5b9060005260206000209060020201600101548262000eb3919062001443565b91505b8062000ec290620015ae565b905062000d87565b508062000edd8462000ef160201b60201c565b62000ee9919062001573565b915050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080fd5b6000819050919050565b62000f538162000f3e565b811462000f5f57600080fd5b50565b60008151905062000f738162000f48565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000fa68262000f79565b9050919050565b62000fb88162000f99565b811462000fc457600080fd5b50565b60008151905062000fd88162000fad565b92915050565b60008060006060848603121562000ffa5762000ff962000f39565b5b60006200100a8682870162000f62565b93505060206200101d8682870162000f62565b9250506040620010308682870162000fc7565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620010bc57607f821691505b602082108103620010d257620010d162001074565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200113c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620010fd565b620011488683620010fd565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200118b620011856200117f8462000f3e565b62001160565b62000f3e565b9050919050565b6000819050919050565b620011a7836200116a565b620011bf620011b68262001192565b8484546200110a565b825550505050565b600090565b620011d6620011c7565b620011e38184846200119c565b505050565b5b818110156200120b57620011ff600082620011cc565b600181019050620011e9565b5050565b601f8211156200125a576200122481620010d8565b6200122f84620010ed565b810160208510156200123f578190505b620012576200124e85620010ed565b830182620011e8565b50505b505050565b600082821c905092915050565b60006200127f600019846008026200125f565b1980831691505092915050565b60006200129a83836200126c565b9150826002028217905092915050565b620012b5826200103a565b67ffffffffffffffff811115620012d157620012d062001045565b5b620012dd8254620010a3565b620012ea8282856200120f565b600060209050601f8311600181146200132257600084156200130d578287015190505b6200131985826200128c565b86555062001389565b601f1984166200133286620010d8565b60005b828110156200135c5784890151825560018201915060208501945060208101905062001335565b868310156200137c578489015162001378601f8916826200126c565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620013da601f8362001391565b9150620013e782620013a2565b602082019050919050565b600060208201905081810360008301526200140d81620013cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620014508262000f3e565b91506200145d8362000f3e565b925082820190508082111562001478576200147762001414565b5b92915050565b620014898162000f3e565b82525050565b6000602082019050620014a660008301846200147e565b92915050565b7f4d4149543a207472616e7366657220616d6f756e74206578636565647320626160008201527f6c616e6365206f7220756e6c6f636b656420616d6f756e7420746f6f206c6f77602082015250565b60006200150a60408362001391565b91506200151782620014ac565b604082019050919050565b600060208201905081810360008301526200153d81620014fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620015808262000f3e565b91506200158d8362000f3e565b9250828203905081811115620015a857620015a762001414565b5b92915050565b6000620015bb8262000f3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620015f057620015ef62001414565b5b600182019050919050565b61396c806200160b6000396000f3fe6080604052600436106102045760003560e01c80637a40624b11610118578063a9059cbb116100a0578063e20c04a71161006f578063e20c04a714610777578063e30c3978146107a2578063e654210b146107cd578063f2fde38b146107f8578063faccdd501461082157610204565b8063a9059cbb146106a9578063c1201054146106e6578063c3c9560e14610711578063dd62ed3e1461073a57610204565b80638da5cb5b116100e75780638da5cb5b146105ad5780638f441b19146105d857806395d89b411461060357806399683fa51461062e578063a457c2d71461066c57610204565b80637a40624b1461050157806381c6c9761461052c57806385f2aef2146105575780638b1ebbf91461058257610204565b8063313ce5671161019b578063557ed1ba1161016a578063557ed1ba146104425780635c7b79f51461046d57806370a0823114610496578063715018a6146104d357806379ba5097146104ea57610204565b8063313ce5671461038157806332fb3c13146103ac57806339509351146103dc57806350c1b9231461041957610204565b806318160ddd116101d757806318160ddd146102c557806323b872dd146102f057806323e7a9001461032d5780632d49ffcd1461035657610204565b80630563451a1461020957806306fdde0314610234578063095ea7b31461025f578063147d959a1461029c575b600080fd5b34801561021557600080fd5b5061021e61084c565b60405161022b9190612487565b60405180910390f35b34801561024057600080fd5b50610249610852565b6040516102569190612532565b60405180910390f35b34801561026b57600080fd5b50610286600480360381019061028191906125e3565b6108e4565b604051610293919061263e565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be9190612659565b610907565b005b3480156102d157600080fd5b506102da6109b6565b6040516102e79190612487565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612686565b6109c0565b604051610324919061263e565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190612659565b6109ef565b005b34801561036257600080fd5b5061036b610a43565b60405161037891906127c6565b60405180910390f35b34801561038d57600080fd5b50610396610af3565b6040516103a39190612804565b60405180910390f35b6103c660048036038101906103c1919061284b565b610afc565b6040516103d3919061263e565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906125e3565b610e2b565b604051610410919061263e565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061289e565b610e62565b005b34801561044e57600080fd5b50610457610f1d565b6040516104649190612487565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612659565b610f25565b005b3480156104a257600080fd5b506104bd60048036038101906104b8919061289e565b610f5d565b6040516104ca9190612487565b60405180910390f35b3480156104df57600080fd5b506104e8610fa5565b005b3480156104f657600080fd5b506104ff610fe0565b005b34801561050d57600080fd5b5061051661106d565b6040516105239190612487565b60405180910390f35b34801561053857600080fd5b50610541611073565b60405161054e9190612487565b60405180910390f35b34801561056357600080fd5b5061056c611079565b60405161057991906128da565b60405180910390f35b34801561058e57600080fd5b5061059761109f565b6040516105a49190612487565b60405180910390f35b3480156105b957600080fd5b506105c26110a5565b6040516105cf91906128da565b60405180910390f35b3480156105e457600080fd5b506105ed6110cf565b6040516105fa9190612487565b60405180910390f35b34801561060f57600080fd5b50610618611116565b6040516106259190612532565b60405180910390f35b34801561063a57600080fd5b50610655600480360381019061065091906125e3565b6111a8565b6040516106639291906128f5565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e91906125e3565b6111e9565b6040516106a0919061263e565b60405180910390f35b3480156106b557600080fd5b506106d060048036038101906106cb91906125e3565b611260565b6040516106dd919061263e565b60405180910390f35b3480156106f257600080fd5b506106fb611283565b6040516107089190612487565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190612659565b611326565b005b34801561074657600080fd5b50610761600480360381019061075c919061291e565b61137b565b60405161076e9190612487565b60405180910390f35b34801561078357600080fd5b5061078c611402565b6040516107999190612487565b60405180910390f35b3480156107ae57600080fd5b506107b7611408565b6040516107c491906128da565b60405180910390f35b3480156107d957600080fd5b506107e2611432565b6040516107ef91906128da565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a919061289e565b611458565b005b34801561082d57600080fd5b50610836611505565b6040516108439190612487565b60405180910390f35b600a5481565b6060600380546108619061298d565b80601f016020809104026020016040519081016040528092919081815260200182805461088d9061298d565b80156108da5780601f106108af576101008083540402835291602001916108da565b820191906000526020600020905b8154815290600101906020018083116108bd57829003601f168201915b5050505050905090565b6000806108ef6115db565b90506108fc8185856115e3565b600191505092915050565b61090f6117ac565b60008111610952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094990612a30565b60405180910390fd5b426301e13380600d546109659190612a7f565b106109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c90612b25565b60405180910390fd5b80600c8190555042600d8190555050565b6000600254905090565b6000806109cb6115db565b90506109d885828561182a565b6109e38585856118b6565b60019150509392505050565b6109f76117ac565b428111610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090612bb7565b60405180910390fd5b80600a8190555050565b6060600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610aea57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610aa4565b50505050905090565b60006012905090565b6000600a544210610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990612c23565b60405180910390fd5b83600e54811015610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f90612cb5565b60405180910390fd5b848460008115610bb157600a83610b9f9190612d04565b83610baa9190612a7f565b9050610bb5565b8290505b600b54811115610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190612da7565b60405180910390fd5b85600c5414610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590612e39565b60405180910390fd5b610c8c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163330670de0b6b3a7640000600c548d610c7d9190612e59565b610c879190612d04565b611b2c565b60008715610cab576301e1338042610ca49190612a7f565b9050610cd8565b600a89610cb89190612d04565b89610cc39190612a7f565b98506303c2670042610cd59190612a7f565b90505b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d645780601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052808381526020018b815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050610e0230338b6118b6565b88600b6000828254610e149190612e9b565b925050819055506001955050505050509392505050565b600080610e366115db565b9050610e57818585610e48858961137b565b610e529190612a7f565b6115e3565b600191505092915050565b610e6a6117ac565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090612f41565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600042905090565b610f2d6117ac565b610f5a600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383611bb5565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790612fd3565b60405180910390fd5b6000610fea6115db565b90508073ffffffffffffffffffffffffffffffffffffffff1661100b611408565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613065565b60405180910390fd5b61106a81611c3b565b50565b60085481565b600d5481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6060600480546111259061298d565b80601f01602080910402602001604051908101604052809291908181526020018280546111519061298d565b801561119e5780601f106111735761010080835404028352916020019161119e565b820191906000526020600020905b81548152906001019060200180831161118157829003601f168201915b5050505050905090565b600f60205281600052604060002081815481106111c457600080fd5b9060005260206000209060020201600091509150508060000154908060010154905082565b6000806111f46115db565b90506000611202828661137b565b905083811015611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e906130f7565b60405180910390fd5b61125482868684036115e3565b60019250505092915050565b60008061126b6115db565b90506112788185856118b6565b600191505092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112e091906128da565b602060405180830381865afa1580156112fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611321919061312c565b905090565b61132e6117ac565b60008111611371576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611368906131cb565b60405180910390fd5b80600e8190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114606117ac565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166114c06110a5565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600b5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061325d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906132ef565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161179f9190612487565b60405180910390a3505050565b6117b46115db565b73ffffffffffffffffffffffffffffffffffffffff166117d26110a5565b73ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f9061335b565b60405180910390fd5b565b6000611836848461137b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118b057818110156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906133c7565b60405180910390fd5b6118af84848484036115e3565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90613459565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198b906134eb565b60405180910390fd5b61199f838383611c6c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1c9061357d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b139190612487565b60405180910390a3611b26848484611d0d565b50505050565b611baf846323b872dd60e01b858585604051602401611b4d9392919061359d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d6f565b50505050565b611c368363a9059cbb60e01b8484604051602401611bd49291906135d4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d6f565b505050565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055611c698161150b565b50565b611c778383836115d1565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d0857611cc88184611e36565b611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe9061366f565b60405180910390fd5b5b505050565b611d188383836115d6565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d6a57611d698382611ea9565b5b505050565b6000611dd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121489092919063ffffffff16565b9050600081511115611e315780806020019051810190611df191906136a4565b611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790613743565b60405180910390fd5b5b505050565b60004260085403611e4a5760019050611ea3565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e865760019050611ea3565b82611e9083612160565b10611e9e5760019050611ea3565b600090505b92915050565b60005b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156121425742600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611f4857611f47613763565b5b906000526020600020906002020160000154101561213157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611fb157611fb0613763565b5b9060005260206000209060020201600101548211156120b157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061201b5761201a613763565b5b906000526020600020906002020160010154826120389190612e9b565b9150600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061208b5761208a613763565b5b906000526020600020906002020160008082016000905560018201600090555050612130565b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061210357612102613763565b5b906000526020600020906002020160010160008282546121239190612e9b565b9250508190555050612144565b5b8061213b90613792565b9050611eac565b505b5050565b606061215784846000856122b9565b90509392505050565b60008060005b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561229c5742600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061220257612201613763565b5b906000526020600020906002020160000154111561228b57600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061226b5761226a613763565b5b906000526020600020906002020160010154826122889190612a7f565b91505b8061229590613792565b9050612166565b50806122a784610f5d565b6122b19190612e9b565b915050919050565b6060824710156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f59061384c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161232791906138b3565b60006040518083038185875af1925050503d8060008114612364576040519150601f19603f3d011682016040523d82523d6000602084013e612369565b606091505b509150915061237a87838387612386565b92505050949350505050565b606083156123e85760008351036123e0576123a0856123fb565b6123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690613916565b60405180910390fd5b5b8290506123f3565b6123f2838361241e565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156124315781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124659190612532565b60405180910390fd5b6000819050919050565b6124818161246e565b82525050565b600060208201905061249c6000830184612478565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124dc5780820151818401526020810190506124c1565b60008484015250505050565b6000601f19601f8301169050919050565b6000612504826124a2565b61250e81856124ad565b935061251e8185602086016124be565b612527816124e8565b840191505092915050565b6000602082019050818103600083015261254c81846124f9565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061258482612559565b9050919050565b61259481612579565b811461259f57600080fd5b50565b6000813590506125b18161258b565b92915050565b6125c08161246e565b81146125cb57600080fd5b50565b6000813590506125dd816125b7565b92915050565b600080604083850312156125fa576125f9612554565b5b6000612608858286016125a2565b9250506020612619858286016125ce565b9150509250929050565b60008115159050919050565b61263881612623565b82525050565b6000602082019050612653600083018461262f565b92915050565b60006020828403121561266f5761266e612554565b5b600061267d848285016125ce565b91505092915050565b60008060006060848603121561269f5761269e612554565b5b60006126ad868287016125a2565b93505060206126be868287016125a2565b92505060406126cf868287016125ce565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61270e8161246e565b82525050565b60408201600082015161272a6000850182612705565b50602082015161273d6020850182612705565b50505050565b600061274f8383612714565b60408301905092915050565b6000602082019050919050565b6000612773826126d9565b61277d81856126e4565b9350612788836126f5565b8060005b838110156127b95781516127a08882612743565b97506127ab8361275b565b92505060018101905061278c565b5085935050505092915050565b600060208201905081810360008301526127e08184612768565b905092915050565b600060ff82169050919050565b6127fe816127e8565b82525050565b600060208201905061281960008301846127f5565b92915050565b61282881612623565b811461283357600080fd5b50565b6000813590506128458161281f565b92915050565b60008060006060848603121561286457612863612554565b5b6000612872868287016125ce565b935050602061288386828701612836565b9250506040612894868287016125ce565b9150509250925092565b6000602082840312156128b4576128b3612554565b5b60006128c2848285016125a2565b91505092915050565b6128d481612579565b82525050565b60006020820190506128ef60008301846128cb565b92915050565b600060408201905061290a6000830185612478565b6129176020830184612478565b9392505050565b6000806040838503121561293557612934612554565b5b6000612943858286016125a2565b9250506020612954858286016125a2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129a557607f821691505b6020821081036129b8576129b761295e565b5b50919050565b7f4d4149543a207072696365206f662074686520636f696e2063616e6e6f74206260008201527f65207a65726f0000000000000000000000000000000000000000000000000000602082015250565b6000612a1a6026836124ad565b9150612a25826129be565b604082019050919050565b60006020820190508181036000830152612a4981612a0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a8a8261246e565b9150612a958361246e565b9250828201905080821115612aad57612aac612a50565b5b92915050565b7f4d4149543a2070726963652063616e206f6e6c7920626520757064617465642060008201527f6f6e636520612079656172000000000000000000000000000000000000000000602082015250565b6000612b0f602b836124ad565b9150612b1a82612ab3565b604082019050919050565b60006020820190508181036000830152612b3e81612b02565b9050919050565b7f4d4149543a2049434f2063616e6e6f742062652073657420696e20746865207060008201527f6173740000000000000000000000000000000000000000000000000000000000602082015250565b6000612ba16023836124ad565b9150612bac82612b45565b604082019050919050565b60006020820190508181036000830152612bd081612b94565b9050919050565b7f4d4149543a2049434f2068617320616c726561647920656e6465640000000000600082015250565b6000612c0d601b836124ad565b9150612c1882612bd7565b602082019050919050565b60006020820190508181036000830152612c3c81612c00565b9050919050565b7f4d4149543a206d696e696d616c206f726465722076616c756520776173206e6f60008201527f74206d6574000000000000000000000000000000000000000000000000000000602082015250565b6000612c9f6025836124ad565b9150612caa82612c43565b604082019050919050565b60006020820190508181036000830152612cce81612c92565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d0f8261246e565b9150612d1a8361246e565b925082612d2a57612d29612cd5565b5b828204905092915050565b7f4d4149543a20616d6f756e742063616e6e6f742062652067726561746572207460008201527f68616e2074686520617661696c61626c6520616d6f756e740000000000000000602082015250565b6000612d916038836124ad565b9150612d9c82612d35565b604082019050919050565b60006020820190508181036000830152612dc081612d84565b9050919050565b7f4d4149543a2045787065637465642070726963652070657220636f696e20646f60008201527f65736e2774206d6174636820746865207265616c207072696365000000000000602082015250565b6000612e23603a836124ad565b9150612e2e82612dc7565b604082019050919050565b60006020820190508181036000830152612e5281612e16565b9050919050565b6000612e648261246e565b9150612e6f8361246e565b9250828202612e7d8161246e565b91508282048414831517612e9457612e93612a50565b5b5092915050565b6000612ea68261246e565b9150612eb18361246e565b9250828203905081811115612ec957612ec8612a50565b5b92915050565b7f4d4149543a205553445420616464726573732063616e6e6f742062652074686560008201527f207a65726f206164647265737300000000000000000000000000000000000000602082015250565b6000612f2b602d836124ad565b9150612f3682612ecf565b604082019050919050565b60006020820190508181036000830152612f5a81612f1e565b9050919050565b7f4f776e61626c653a2063616e27742072656e6f756e63654f776e65727368697060008201527f2068657265000000000000000000000000000000000000000000000000000000602082015250565b6000612fbd6025836124ad565b9150612fc882612f61565b604082019050919050565b60006020820190508181036000830152612fec81612fb0565b9050919050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b600061304f6029836124ad565b915061305a82612ff3565b604082019050919050565b6000602082019050818103600083015261307e81613042565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006130e16025836124ad565b91506130ec82613085565b604082019050919050565b60006020820190508181036000830152613110816130d4565b9050919050565b600081519050613126816125b7565b92915050565b60006020828403121561314257613141612554565b5b600061315084828501613117565b91505092915050565b7f4d4149543a206d696e696d616c206f726465722063616e6e6f74206265207a6560008201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b60006131b56022836124ad565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006132476024836124ad565b9150613252826131eb565b604082019050919050565b600060208201905081810360008301526132768161323a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132d96022836124ad565b91506132e48261327d565b604082019050919050565b60006020820190508181036000830152613308816132cc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133456020836124ad565b91506133508261330f565b602082019050919050565b6000602082019050818103600083015261337481613338565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006133b1601d836124ad565b91506133bc8261337b565b602082019050919050565b600060208201905081810360008301526133e0816133a4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006134436025836124ad565b915061344e826133e7565b604082019050919050565b6000602082019050818103600083015261347281613436565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006134d56023836124ad565b91506134e082613479565b604082019050919050565b60006020820190508181036000830152613504816134c8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006135676026836124ad565b91506135728261350b565b604082019050919050565b600060208201905081810360008301526135968161355a565b9050919050565b60006060820190506135b260008301866128cb565b6135bf60208301856128cb565b6135cc6040830184612478565b949350505050565b60006040820190506135e960008301856128cb565b6135f66020830184612478565b9392505050565b7f4d4149543a207472616e7366657220616d6f756e74206578636565647320626160008201527f6c616e6365206f7220756e6c6f636b656420616d6f756e7420746f6f206c6f77602082015250565b60006136596040836124ad565b9150613664826135fd565b604082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b60008151905061369e8161281f565b92915050565b6000602082840312156136ba576136b9612554565b5b60006136c88482850161368f565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061372d602a836124ad565b9150613738826136d1565b604082019050919050565b6000602082019050818103600083015261375c81613720565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061379d8261246e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137cf576137ce612a50565b5b600182019050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006138366026836124ad565b9150613841826137da565b604082019050919050565b6000602082019050818103600083015261386581613829565b9050919050565b600081519050919050565b600081905092915050565b600061388d8261386c565b6138978185613877565b93506138a78185602086016124be565b80840191505092915050565b60006138bf8284613882565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613900601d836124ad565b915061390b826138ca565b602082019050919050565b6000602082019050818103600083015261392f816138f3565b905091905056fea2646970667358221220544c7d2085c4021b9f83080e5980c3d5bdaff22b5c37417fc9e9009a9deac9b364736f6c63430008110033000000000000000000000000000000000000000000000000000000006608a7800000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000018b0b5d86c6f0620bd1564ce06a97f99e3de38bc
Deployed Bytecode
0x6080604052600436106102045760003560e01c80637a40624b11610118578063a9059cbb116100a0578063e20c04a71161006f578063e20c04a714610777578063e30c3978146107a2578063e654210b146107cd578063f2fde38b146107f8578063faccdd501461082157610204565b8063a9059cbb146106a9578063c1201054146106e6578063c3c9560e14610711578063dd62ed3e1461073a57610204565b80638da5cb5b116100e75780638da5cb5b146105ad5780638f441b19146105d857806395d89b411461060357806399683fa51461062e578063a457c2d71461066c57610204565b80637a40624b1461050157806381c6c9761461052c57806385f2aef2146105575780638b1ebbf91461058257610204565b8063313ce5671161019b578063557ed1ba1161016a578063557ed1ba146104425780635c7b79f51461046d57806370a0823114610496578063715018a6146104d357806379ba5097146104ea57610204565b8063313ce5671461038157806332fb3c13146103ac57806339509351146103dc57806350c1b9231461041957610204565b806318160ddd116101d757806318160ddd146102c557806323b872dd146102f057806323e7a9001461032d5780632d49ffcd1461035657610204565b80630563451a1461020957806306fdde0314610234578063095ea7b31461025f578063147d959a1461029c575b600080fd5b34801561021557600080fd5b5061021e61084c565b60405161022b9190612487565b60405180910390f35b34801561024057600080fd5b50610249610852565b6040516102569190612532565b60405180910390f35b34801561026b57600080fd5b50610286600480360381019061028191906125e3565b6108e4565b604051610293919061263e565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be9190612659565b610907565b005b3480156102d157600080fd5b506102da6109b6565b6040516102e79190612487565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612686565b6109c0565b604051610324919061263e565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190612659565b6109ef565b005b34801561036257600080fd5b5061036b610a43565b60405161037891906127c6565b60405180910390f35b34801561038d57600080fd5b50610396610af3565b6040516103a39190612804565b60405180910390f35b6103c660048036038101906103c1919061284b565b610afc565b6040516103d3919061263e565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906125e3565b610e2b565b604051610410919061263e565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061289e565b610e62565b005b34801561044e57600080fd5b50610457610f1d565b6040516104649190612487565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612659565b610f25565b005b3480156104a257600080fd5b506104bd60048036038101906104b8919061289e565b610f5d565b6040516104ca9190612487565b60405180910390f35b3480156104df57600080fd5b506104e8610fa5565b005b3480156104f657600080fd5b506104ff610fe0565b005b34801561050d57600080fd5b5061051661106d565b6040516105239190612487565b60405180910390f35b34801561053857600080fd5b50610541611073565b60405161054e9190612487565b60405180910390f35b34801561056357600080fd5b5061056c611079565b60405161057991906128da565b60405180910390f35b34801561058e57600080fd5b5061059761109f565b6040516105a49190612487565b60405180910390f35b3480156105b957600080fd5b506105c26110a5565b6040516105cf91906128da565b60405180910390f35b3480156105e457600080fd5b506105ed6110cf565b6040516105fa9190612487565b60405180910390f35b34801561060f57600080fd5b50610618611116565b6040516106259190612532565b60405180910390f35b34801561063a57600080fd5b50610655600480360381019061065091906125e3565b6111a8565b6040516106639291906128f5565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e91906125e3565b6111e9565b6040516106a0919061263e565b60405180910390f35b3480156106b557600080fd5b506106d060048036038101906106cb91906125e3565b611260565b6040516106dd919061263e565b60405180910390f35b3480156106f257600080fd5b506106fb611283565b6040516107089190612487565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190612659565b611326565b005b34801561074657600080fd5b50610761600480360381019061075c919061291e565b61137b565b60405161076e9190612487565b60405180910390f35b34801561078357600080fd5b5061078c611402565b6040516107999190612487565b60405180910390f35b3480156107ae57600080fd5b506107b7611408565b6040516107c491906128da565b60405180910390f35b3480156107d957600080fd5b506107e2611432565b6040516107ef91906128da565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a919061289e565b611458565b005b34801561082d57600080fd5b50610836611505565b6040516108439190612487565b60405180910390f35b600a5481565b6060600380546108619061298d565b80601f016020809104026020016040519081016040528092919081815260200182805461088d9061298d565b80156108da5780601f106108af576101008083540402835291602001916108da565b820191906000526020600020905b8154815290600101906020018083116108bd57829003601f168201915b5050505050905090565b6000806108ef6115db565b90506108fc8185856115e3565b600191505092915050565b61090f6117ac565b60008111610952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094990612a30565b60405180910390fd5b426301e13380600d546109659190612a7f565b106109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c90612b25565b60405180910390fd5b80600c8190555042600d8190555050565b6000600254905090565b6000806109cb6115db565b90506109d885828561182a565b6109e38585856118b6565b60019150509392505050565b6109f76117ac565b428111610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090612bb7565b60405180910390fd5b80600a8190555050565b6060600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610aea57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610aa4565b50505050905090565b60006012905090565b6000600a544210610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990612c23565b60405180910390fd5b83600e54811015610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f90612cb5565b60405180910390fd5b848460008115610bb157600a83610b9f9190612d04565b83610baa9190612a7f565b9050610bb5565b8290505b600b54811115610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190612da7565b60405180910390fd5b85600c5414610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590612e39565b60405180910390fd5b610c8c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163330670de0b6b3a7640000600c548d610c7d9190612e59565b610c879190612d04565b611b2c565b60008715610cab576301e1338042610ca49190612a7f565b9050610cd8565b600a89610cb89190612d04565b89610cc39190612a7f565b98506303c2670042610cd59190612a7f565b90505b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d645780601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052808381526020018b815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050610e0230338b6118b6565b88600b6000828254610e149190612e9b565b925050819055506001955050505050509392505050565b600080610e366115db565b9050610e57818585610e48858961137b565b610e529190612a7f565b6115e3565b600191505092915050565b610e6a6117ac565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090612f41565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600042905090565b610f2d6117ac565b610f5a600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383611bb5565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790612fd3565b60405180910390fd5b6000610fea6115db565b90508073ffffffffffffffffffffffffffffffffffffffff1661100b611408565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613065565b60405180910390fd5b61106a81611c3b565b50565b60085481565b600d5481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6060600480546111259061298d565b80601f01602080910402602001604051908101604052809291908181526020018280546111519061298d565b801561119e5780601f106111735761010080835404028352916020019161119e565b820191906000526020600020905b81548152906001019060200180831161118157829003601f168201915b5050505050905090565b600f60205281600052604060002081815481106111c457600080fd5b9060005260206000209060020201600091509150508060000154908060010154905082565b6000806111f46115db565b90506000611202828661137b565b905083811015611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e906130f7565b60405180910390fd5b61125482868684036115e3565b60019250505092915050565b60008061126b6115db565b90506112788185856118b6565b600191505092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112e091906128da565b602060405180830381865afa1580156112fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611321919061312c565b905090565b61132e6117ac565b60008111611371576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611368906131cb565b60405180910390fd5b80600e8190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114606117ac565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166114c06110a5565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600b5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061325d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906132ef565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161179f9190612487565b60405180910390a3505050565b6117b46115db565b73ffffffffffffffffffffffffffffffffffffffff166117d26110a5565b73ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f9061335b565b60405180910390fd5b565b6000611836848461137b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118b057818110156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906133c7565b60405180910390fd5b6118af84848484036115e3565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90613459565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198b906134eb565b60405180910390fd5b61199f838383611c6c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1c9061357d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b139190612487565b60405180910390a3611b26848484611d0d565b50505050565b611baf846323b872dd60e01b858585604051602401611b4d9392919061359d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d6f565b50505050565b611c368363a9059cbb60e01b8484604051602401611bd49291906135d4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611d6f565b505050565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055611c698161150b565b50565b611c778383836115d1565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d0857611cc88184611e36565b611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe9061366f565b60405180910390fd5b5b505050565b611d188383836115d6565b42601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d6a57611d698382611ea9565b5b505050565b6000611dd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121489092919063ffffffff16565b9050600081511115611e315780806020019051810190611df191906136a4565b611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790613743565b60405180910390fd5b5b505050565b60004260085403611e4a5760019050611ea3565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e865760019050611ea3565b82611e9083612160565b10611e9e5760019050611ea3565b600090505b92915050565b60005b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156121425742600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611f4857611f47613763565b5b906000526020600020906002020160000154101561213157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611fb157611fb0613763565b5b9060005260206000209060020201600101548211156120b157600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061201b5761201a613763565b5b906000526020600020906002020160010154826120389190612e9b565b9150600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061208b5761208a613763565b5b906000526020600020906002020160008082016000905560018201600090555050612130565b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061210357612102613763565b5b906000526020600020906002020160010160008282546121239190612e9b565b9250508190555050612144565b5b8061213b90613792565b9050611eac565b505b5050565b606061215784846000856122b9565b90509392505050565b60008060005b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561229c5742600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061220257612201613763565b5b906000526020600020906002020160000154111561228b57600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061226b5761226a613763565b5b906000526020600020906002020160010154826122889190612a7f565b91505b8061229590613792565b9050612166565b50806122a784610f5d565b6122b19190612e9b565b915050919050565b6060824710156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f59061384c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161232791906138b3565b60006040518083038185875af1925050503d8060008114612364576040519150601f19603f3d011682016040523d82523d6000602084013e612369565b606091505b509150915061237a87838387612386565b92505050949350505050565b606083156123e85760008351036123e0576123a0856123fb565b6123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690613916565b60405180910390fd5b5b8290506123f3565b6123f2838361241e565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156124315781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124659190612532565b60405180910390fd5b6000819050919050565b6124818161246e565b82525050565b600060208201905061249c6000830184612478565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124dc5780820151818401526020810190506124c1565b60008484015250505050565b6000601f19601f8301169050919050565b6000612504826124a2565b61250e81856124ad565b935061251e8185602086016124be565b612527816124e8565b840191505092915050565b6000602082019050818103600083015261254c81846124f9565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061258482612559565b9050919050565b61259481612579565b811461259f57600080fd5b50565b6000813590506125b18161258b565b92915050565b6125c08161246e565b81146125cb57600080fd5b50565b6000813590506125dd816125b7565b92915050565b600080604083850312156125fa576125f9612554565b5b6000612608858286016125a2565b9250506020612619858286016125ce565b9150509250929050565b60008115159050919050565b61263881612623565b82525050565b6000602082019050612653600083018461262f565b92915050565b60006020828403121561266f5761266e612554565b5b600061267d848285016125ce565b91505092915050565b60008060006060848603121561269f5761269e612554565b5b60006126ad868287016125a2565b93505060206126be868287016125a2565b92505060406126cf868287016125ce565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61270e8161246e565b82525050565b60408201600082015161272a6000850182612705565b50602082015161273d6020850182612705565b50505050565b600061274f8383612714565b60408301905092915050565b6000602082019050919050565b6000612773826126d9565b61277d81856126e4565b9350612788836126f5565b8060005b838110156127b95781516127a08882612743565b97506127ab8361275b565b92505060018101905061278c565b5085935050505092915050565b600060208201905081810360008301526127e08184612768565b905092915050565b600060ff82169050919050565b6127fe816127e8565b82525050565b600060208201905061281960008301846127f5565b92915050565b61282881612623565b811461283357600080fd5b50565b6000813590506128458161281f565b92915050565b60008060006060848603121561286457612863612554565b5b6000612872868287016125ce565b935050602061288386828701612836565b9250506040612894868287016125ce565b9150509250925092565b6000602082840312156128b4576128b3612554565b5b60006128c2848285016125a2565b91505092915050565b6128d481612579565b82525050565b60006020820190506128ef60008301846128cb565b92915050565b600060408201905061290a6000830185612478565b6129176020830184612478565b9392505050565b6000806040838503121561293557612934612554565b5b6000612943858286016125a2565b9250506020612954858286016125a2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129a557607f821691505b6020821081036129b8576129b761295e565b5b50919050565b7f4d4149543a207072696365206f662074686520636f696e2063616e6e6f74206260008201527f65207a65726f0000000000000000000000000000000000000000000000000000602082015250565b6000612a1a6026836124ad565b9150612a25826129be565b604082019050919050565b60006020820190508181036000830152612a4981612a0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a8a8261246e565b9150612a958361246e565b9250828201905080821115612aad57612aac612a50565b5b92915050565b7f4d4149543a2070726963652063616e206f6e6c7920626520757064617465642060008201527f6f6e636520612079656172000000000000000000000000000000000000000000602082015250565b6000612b0f602b836124ad565b9150612b1a82612ab3565b604082019050919050565b60006020820190508181036000830152612b3e81612b02565b9050919050565b7f4d4149543a2049434f2063616e6e6f742062652073657420696e20746865207060008201527f6173740000000000000000000000000000000000000000000000000000000000602082015250565b6000612ba16023836124ad565b9150612bac82612b45565b604082019050919050565b60006020820190508181036000830152612bd081612b94565b9050919050565b7f4d4149543a2049434f2068617320616c726561647920656e6465640000000000600082015250565b6000612c0d601b836124ad565b9150612c1882612bd7565b602082019050919050565b60006020820190508181036000830152612c3c81612c00565b9050919050565b7f4d4149543a206d696e696d616c206f726465722076616c756520776173206e6f60008201527f74206d6574000000000000000000000000000000000000000000000000000000602082015250565b6000612c9f6025836124ad565b9150612caa82612c43565b604082019050919050565b60006020820190508181036000830152612cce81612c92565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d0f8261246e565b9150612d1a8361246e565b925082612d2a57612d29612cd5565b5b828204905092915050565b7f4d4149543a20616d6f756e742063616e6e6f742062652067726561746572207460008201527f68616e2074686520617661696c61626c6520616d6f756e740000000000000000602082015250565b6000612d916038836124ad565b9150612d9c82612d35565b604082019050919050565b60006020820190508181036000830152612dc081612d84565b9050919050565b7f4d4149543a2045787065637465642070726963652070657220636f696e20646f60008201527f65736e2774206d6174636820746865207265616c207072696365000000000000602082015250565b6000612e23603a836124ad565b9150612e2e82612dc7565b604082019050919050565b60006020820190508181036000830152612e5281612e16565b9050919050565b6000612e648261246e565b9150612e6f8361246e565b9250828202612e7d8161246e565b91508282048414831517612e9457612e93612a50565b5b5092915050565b6000612ea68261246e565b9150612eb18361246e565b9250828203905081811115612ec957612ec8612a50565b5b92915050565b7f4d4149543a205553445420616464726573732063616e6e6f742062652074686560008201527f207a65726f206164647265737300000000000000000000000000000000000000602082015250565b6000612f2b602d836124ad565b9150612f3682612ecf565b604082019050919050565b60006020820190508181036000830152612f5a81612f1e565b9050919050565b7f4f776e61626c653a2063616e27742072656e6f756e63654f776e65727368697060008201527f2068657265000000000000000000000000000000000000000000000000000000602082015250565b6000612fbd6025836124ad565b9150612fc882612f61565b604082019050919050565b60006020820190508181036000830152612fec81612fb0565b9050919050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b600061304f6029836124ad565b915061305a82612ff3565b604082019050919050565b6000602082019050818103600083015261307e81613042565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006130e16025836124ad565b91506130ec82613085565b604082019050919050565b60006020820190508181036000830152613110816130d4565b9050919050565b600081519050613126816125b7565b92915050565b60006020828403121561314257613141612554565b5b600061315084828501613117565b91505092915050565b7f4d4149543a206d696e696d616c206f726465722063616e6e6f74206265207a6560008201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b60006131b56022836124ad565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006132476024836124ad565b9150613252826131eb565b604082019050919050565b600060208201905081810360008301526132768161323a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132d96022836124ad565b91506132e48261327d565b604082019050919050565b60006020820190508181036000830152613308816132cc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133456020836124ad565b91506133508261330f565b602082019050919050565b6000602082019050818103600083015261337481613338565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006133b1601d836124ad565b91506133bc8261337b565b602082019050919050565b600060208201905081810360008301526133e0816133a4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006134436025836124ad565b915061344e826133e7565b604082019050919050565b6000602082019050818103600083015261347281613436565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006134d56023836124ad565b91506134e082613479565b604082019050919050565b60006020820190508181036000830152613504816134c8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006135676026836124ad565b91506135728261350b565b604082019050919050565b600060208201905081810360008301526135968161355a565b9050919050565b60006060820190506135b260008301866128cb565b6135bf60208301856128cb565b6135cc6040830184612478565b949350505050565b60006040820190506135e960008301856128cb565b6135f66020830184612478565b9392505050565b7f4d4149543a207472616e7366657220616d6f756e74206578636565647320626160008201527f6c616e6365206f7220756e6c6f636b656420616d6f756e7420746f6f206c6f77602082015250565b60006136596040836124ad565b9150613664826135fd565b604082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b60008151905061369e8161281f565b92915050565b6000602082840312156136ba576136b9612554565b5b60006136c88482850161368f565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061372d602a836124ad565b9150613738826136d1565b604082019050919050565b6000602082019050818103600083015261375c81613720565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061379d8261246e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137cf576137ce612a50565b5b600182019050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006138366026836124ad565b9150613841826137da565b604082019050919050565b6000602082019050818103600083015261386581613829565b9050919050565b600081519050919050565b600081905092915050565b600061388d8261386c565b6138978185613877565b93506138a78185602086016124be565b80840191505092915050565b60006138bf8284613882565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613900601d836124ad565b915061390b826138ca565b602082019050919050565b6000602082019050818103600083015261392f816138f3565b905091905056fea2646970667358221220544c7d2085c4021b9f83080e5980c3d5bdaff22b5c37417fc9e9009a9deac9b364736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000006608a7800000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000018b0b5d86c6f0620bd1564ce06a97f99e3de38bc
-----Decoded View---------------
Arg [0] : _icoEnd (uint256): 1711843200
Arg [1] : _minimalOrder (uint256): 1000000000000000000
Arg [2] : _team (address): 0x18B0B5D86C6F0620BD1564ce06a97f99e3de38bc
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000006608a780
Arg [1] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [2] : 00000000000000000000000018b0b5d86c6f0620bd1564ce06a97f99e3de38bc
Deployed Bytecode Sourcemap
35928:12973:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36473:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6177:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8376:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41204:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7233:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9109:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40872:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48450:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7089:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46221:1415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9735:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41721:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48668:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48163:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7390:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48757:141;;;;;;;;;;;;;:::i;:::-;;35535:196;;;;;;;;;;;;;:::i;:::-;;36346:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36714:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36411:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36816:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32497:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40580:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6380:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37018:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;10432:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7699:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47796:122;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42117:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7933:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36634:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34677:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36011:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34961:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36555:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36473:21;;;;:::o;6177:94::-;6231:13;6260:5;6253:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6177:94;:::o;8376:187::-;8459:4;8472:13;8488:12;:10;:12::i;:::-;8472:28;;8507:32;8516:5;8523:7;8532:6;8507:8;:32::i;:::-;8553:4;8546:11;;;8376:187;;;;:::o;41204:314::-;32397:13;:11;:13::i;:::-;41290:1:::1;41278:9;:13;41270:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;41380:15;41369:8;41351:15;;:26;;;;:::i;:::-;:44;41343:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;41463:9;41452:8;:20;;;;41497:15;41479;:33;;;;41204:314:::0;:::o;7233:102::-;7294:7;7317:12;;7310:19;;7233:102;:::o;9109:243::-;9206:4;9219:15;9237:12;:10;:12::i;:::-;9219:30;;9256:38;9272:4;9278:7;9287:6;9256:15;:38::i;:::-;9301:27;9311:4;9317:2;9321:6;9301:9;:27::i;:::-;9342:4;9335:11;;;9109:243;;;;;:::o;40872:166::-;32397:13;:11;:13::i;:::-;40952:15:::1;40942:7;:25;40934:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41025:7;41016:6;:16;;;;40872:166:::0;:::o;48450:104::-;48494:13;48523;:25;48537:10;48523:25;;;;;;;;;;;;;;;48516:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48450:104;:::o;7089:87::-;7147:5;7168:2;7161:9;;7089:87;:::o;46221:1415::-;46502:4;40346:6;;40328:15;:24;40320:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46446:6:::1;39396:12;;39386:6;:22;;39378:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;46472:6:::2;46480:11;39869:15;39895:11;39891:103;;;39945:2;39936:6;:11;;;;:::i;:::-;39927:6;:20;;;;:::i;:::-;39917:30;;39891:103;;;39980:6;39970:16;;39891:103;40021:9;;40010:7;:20;;40002:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;46592:13:::3;46580:8;;:25;46572:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;46677:107;46711:12;;;;;;;;;;;46726:10;46746:4;46775:8;46763;;46754:6;:17;;;;:::i;:::-;46753:30;;;;:::i;:::-;46677:26;:107::i;:::-;46793:17;46856:11;46852:253;;;46908:8;46890:15;:26;;;;:::i;:::-;46878:38;;46852:253;;;46985:2;46976:6;:11;;;;:::i;:::-;46967:6;:20;;;;:::i;:::-;46958:29;;47067:12;47049:15;:30;;;;:::i;:::-;47037:42;;46852:253;47247:9;47224:8;:20;47233:10;47224:20;;;;;;;;;;;;;;;;:32;47220:70;;;47281:9;47258:8;:20;47267:10;47258:20;;;;;;;;;;;;;;;:32;;;;47220:70;47362:13;:25;47376:10;47362:25;;;;;;;;;;;;;;;47393:23;;;;;;;;47398:9;47393:23;;;;47409:6;47393:23;;::::0;47362:55:::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47487:44;47505:4;47512:10;47524:6;47487:9;:44::i;:::-;47604:6;47591:9;;:19;;;;;;;:::i;:::-;;;;;;;;47626:4;47619:11;;;39862:243:::2;39457:1;;40391::::1;46221:1415:::0;;;;;:::o;9735:224::-;9823:4;9836:13;9852:12;:10;:12::i;:::-;9836:28;;9871:64;9880:5;9887:7;9924:10;9896:25;9906:5;9913:7;9896:9;:25::i;:::-;:38;;;;:::i;:::-;9871:8;:64::i;:::-;9949:4;9942:11;;;9735:224;;;;:::o;41721:222::-;32397:13;:11;:13::i;:::-;41856:1:::1;41839:19;;:5;:19;;::::0;41831:77:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41932:5;41917:12;;:20;;;;;;;;;;;;;;;;;;41721:222:::0;:::o;48668:83::-;48710:4;48730:15;48723:22;;48668:83;:::o;48163:129::-;32397:13;:11;:13::i;:::-;48222:64:::1;48252:12;;;;;;;;;;;48267:10;48279:6;48222:22;:64::i;:::-;48163:129:::0;:::o;7390:121::-;7464:7;7487:9;:18;7497:7;7487:18;;;;;;;;;;;;;;;;7480:25;;7390:121;;;:::o;48757:141::-;48814:47;;;;;;;;;;:::i;:::-;;;;;;;;35535:196;35578:14;35595:12;:10;:12::i;:::-;35578:29;;35640:6;35622:24;;:14;:12;:14::i;:::-;:24;;;35614:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;35699:26;35718:6;35699:18;:26::i;:::-;35571:160;35535:196::o;36346:25::-;;;;:::o;36714:30::-;;;;:::o;36411:19::-;;;;;;;;;;;;;:::o;36816:27::-;;;;:::o;32497:81::-;32543:7;32566:6;;;;;;;;;;;32559:13;;32497:81;:::o;40580:93::-;40624:7;40647:8;:20;40656:10;40647:20;;;;;;;;;;;;;;;;40640:27;;40580:93;:::o;6380:98::-;6436:13;6465:7;6458:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6380:98;:::o;37018:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10432:404::-;10525:4;10538:13;10554:12;:10;:12::i;:::-;10538:28;;10573:24;10600:25;10610:5;10617:7;10600:9;:25::i;:::-;10573:52;;10660:15;10640:16;:35;;10632:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10743:60;10752:5;10759:7;10787:15;10768:16;:34;10743:8;:60::i;:::-;10826:4;10819:11;;;;10432:404;;;;:::o;7699:179::-;7778:4;7791:13;7807:12;:10;:12::i;:::-;7791:28;;7826;7836:5;7843:2;7847:6;7826:9;:28::i;:::-;7868:4;7861:11;;;7699:179;;;;:::o;47796:122::-;47844:7;47874:12;;;;;;;;;;;47867:30;;;47906:4;47867:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47860:52;;47796:122;:::o;42117:181::-;32397:13;:11;:13::i;:::-;42215:1:::1;42199:13;:17;42191:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42279:13;42264:12;:28;;;;42117:181:::0;:::o;7933:145::-;8022:7;8045:11;:18;8057:5;8045:18;;;;;;;;;;;;;;;:27;8064:7;8045:27;;;;;;;;;;;;;;;;8038:34;;7933:145;;;;:::o;36634:23::-;;;;:::o;34677:95::-;34730:7;34753:13;;;;;;;;;;;34746:20;;34677:95;:::o;36011:27::-;;;;;;;;;;;;;:::o;34961:171::-;32397:13;:11;:13::i;:::-;35063:8:::1;35047:13;;:24;;;;;;;;;;;;;;;;;;35117:8;35083:43;;35108:7;:5;:7::i;:::-;35083:43;;;;;;;;;;;;34961:171:::0;:::o;36555:24::-;;;;:::o;33692:177::-;33762:16;33781:6;;;;;;;;;;;33762:25;;33803:8;33794:6;;:17;;;;;;;;;;;;;;;;;;33854:8;33823:40;;33844:8;33823:40;;;;;;;;;;;;33755:114;33692:177;:::o;15685:91::-;;;;:::o;16350:90::-;;;;:::o;3947:92::-;4000:7;4023:10;4016:17;;3947:92;:::o;14135:328::-;14250:1;14233:19;;:5;:19;;;14225:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14327:1;14308:21;;:7;:21;;;14300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14407:6;14377:11;:18;14389:5;14377:18;;;;;;;;;;;;;;;:27;14396:7;14377:27;;;;;;;;;;;;;;;:36;;;;14441:7;14425:32;;14434:5;14425:32;;;14450:6;14425:32;;;;;;:::i;:::-;;;;;;;;14135:328;;;:::o;32648:126::-;32719:12;:10;:12::i;:::-;32708:23;;:7;:5;:7::i;:::-;:23;;;32700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32648:126::o;14736:379::-;14833:24;14860:25;14870:5;14877:7;14860:9;:25::i;:::-;14833:52;;14916:17;14896:16;:37;14892:218;;14972:6;14952:16;:26;;14944:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15042:51;15051:5;15058:7;15086:6;15067:16;:25;15042:8;:51::i;:::-;14892:218;14826:289;14736:379;;;:::o;11276:744::-;11385:1;11369:18;;:4;:18;;;11361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11458:1;11444:16;;:2;:16;;;11436:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;11509:38;11530:4;11536:2;11540:6;11509:20;:38::i;:::-;11556:19;11578:9;:15;11588:4;11578:15;;;;;;;;;;;;;;;;11556:37;;11623:6;11608:11;:21;;11600:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;11730:6;11716:11;:20;11698:9;:15;11708:4;11698:15;;;;;;;;;;;;;;;:38;;;;11915:6;11898:9;:13;11908:2;11898:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;11957:2;11942:26;;11951:4;11942:26;;;11961:6;11942:26;;;;;;:::i;:::-;;;;;;;;11977:37;11997:4;12003:2;12007:6;11977:19;:37::i;:::-;11354:666;11276:744;;;:::o;28153:199::-;28250:96;28270:5;28300:27;;;28329:4;28335:2;28339:5;28277:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28250:19;:96::i;:::-;28153:199;;;;:::o;27976:171::-;28055:86;28075:5;28105:23;;;28130:2;28134:5;28082:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28055:19;:86::i;:::-;27976:171;;;:::o;35312:146::-;35398:13;;35391:20;;;;;;;;;;;35418:34;35443:8;35418:24;:34::i;:::-;35312:146;:::o;43837:316::-;43934:44;43961:4;43967:2;43971:6;43934:26;:44::i;:::-;44006:15;43989:8;:14;43998:4;43989:14;;;;;;;;;;;;;;;;:32;43985:163;;;44040:31;44058:6;44066:4;44040:17;:31::i;:::-;44032:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;43985:163;43837:316;;;:::o;44441:236::-;44537:43;44563:4;44569:2;44573:6;44537:25;:43::i;:::-;44608:15;44591:8;:14;44600:4;44591:14;;;;;;;;;;;;;;;;:32;44587:85;;;44634:30;44651:4;44657:6;44634:16;:30::i;:::-;44587:85;44441:236;;;:::o;30680:678::-;31088:23;31114:69;31142:4;31114:69;;;;;;;;;;;;;;;;;31122:5;31114:27;;;;:69;;;;;:::i;:::-;31088:95;;31214:1;31194:10;:17;:21;31190:163;;;31279:10;31268:30;;;;;;;;;;;;:::i;:::-;31260:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31190:163;30750:608;30680:678;;:::o;42648:357::-;42727:4;42786:15;42772:10;;:29;42768:232;;42819:4;42812:11;;;;42768:232;42857:4;42841:21;;:4;:21;;;42837:163;;42880:4;42873:11;;;;42837:163;42929:6;42902:23;42920:4;42902:17;:23::i;:::-;:33;42898:102;;42953:4;42946:11;;;;42898:102;42987:5;42980:12;;42648:357;;;;;:::o;45236:459::-;45313:6;45308:382;45329:13;:19;45343:4;45329:19;;;;;;;;;;;;;;;:26;;;;45325:1;:30;45308:382;;;45407:15;45375:13;:19;45389:4;45375:19;;;;;;;;;;;;;;;45395:1;45375:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:47;45371:312;;;45448:13;:19;45462:4;45448:19;;;;;;;;;;;;;;;45468:1;45448:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;45439:6;:38;45435:239;;;45502:13;:19;45516:4;45502:19;;;;;;;;;;;;;;;45522:1;45502:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;45492:39;;;;;:::i;:::-;;;45551:13;:19;45565:4;45551:19;;;;;;;;;;;;;;;45571:1;45551:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;45544:29;;;;;;;;;;;;;;45435:239;;;45637:6;45604:13;:19;45618:4;45604:19;;;;;;;;;;;;;;;45624:1;45604:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:39;;;;;;;:::i;:::-;;;;;;;;45656:7;;;45435:239;45371:312;45357:3;;;;:::i;:::-;;;45308:382;;;;45236:459;;;:::o;22384:189::-;22487:12;22515:52;22537:6;22545:4;22551:1;22554:12;22515:21;:52::i;:::-;22508:59;;22384:189;;;;;:::o;43200:328::-;43263:7;43279:14;43305:6;43300:183;43321:13;:19;43335:4;43321:19;;;;;;;;;;;;;;;:26;;;;43317:1;:30;43300:183;;;43399:15;43367:13;:19;43381:4;43367:19;;;;;;;;;;;;;;;43387:1;43367:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:47;43363:113;;;43437:13;:19;43451:4;43437:19;;;;;;;;;;;;;;;43457:1;43437:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;43427:39;;;;;:::i;:::-;;;43363:113;43349:3;;;;:::i;:::-;;;43300:183;;;;43516:6;43498:15;43508:4;43498:9;:15::i;:::-;:24;;;;:::i;:::-;43491:31;;;43200:328;;;:::o;23386:423::-;23538:12;23592:5;23567:21;:30;;23559:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23648:12;23662:23;23689:6;:11;;23708:5;23715:4;23689:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23647:73;;;;23734:69;23761:6;23769:7;23778:10;23790:12;23734:26;:69::i;:::-;23727:76;;;;23386:423;;;;;;:::o;25797:564::-;25964:12;25989:7;25985:371;;;26032:1;26011:10;:17;:22;26007:260;;26205:18;26216:6;26205:10;:18::i;:::-;26197:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;26007:260;26282:10;26275:17;;;;25985:371;26315:33;26323:10;26335:12;26315:7;:33::i;:::-;25797:564;;;;;;;:::o;19751:308::-;19811:4;20052:1;20030:7;:19;;;:23;20023:30;;19751:308;;;:::o;26847:488::-;27020:1;27000:10;:17;:21;26996:334;;;27206:10;27200:17;27255:15;27242:10;27238:2;27234:19;27227:44;26996:334;27309:12;27302:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:329::-;3857:6;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;3798:329;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:136::-;4847:6;4881:5;4875:12;4865:22;;4758:136;;;:::o;4900:206::-;5021:11;5055:6;5050:3;5043:19;5095:4;5090:3;5086:14;5071:29;;4900:206;;;;:::o;5112:154::-;5201:4;5224:3;5216:11;;5254:4;5249:3;5245:14;5237:22;;5112:154;;;:::o;5272:108::-;5349:24;5367:5;5349:24;:::i;:::-;5344:3;5337:37;5272:108;;:::o;5446:495::-;5577:4;5572:3;5568:14;5666:4;5659:5;5655:16;5649:23;5685:63;5742:4;5737:3;5733:14;5719:12;5685:63;:::i;:::-;5592:166;5842:4;5835:5;5831:16;5825:23;5861:63;5918:4;5913:3;5909:14;5895:12;5861:63;:::i;:::-;5768:166;5546:395;5446:495;;:::o;5947:267::-;6060:10;6081:90;6167:3;6159:6;6081:90;:::i;:::-;6203:4;6198:3;6194:14;6180:28;;5947:267;;;;:::o;6220:135::-;6312:4;6344;6339:3;6335:14;6327:22;;6220:135;;;:::o;6425:908::-;6588:3;6617:76;6687:5;6617:76;:::i;:::-;6709:108;6810:6;6805:3;6709:108;:::i;:::-;6702:115;;6841:78;6913:5;6841:78;:::i;:::-;6942:7;6973:1;6958:350;6983:6;6980:1;6977:13;6958:350;;;7059:6;7053:13;7086:107;7189:3;7174:13;7086:107;:::i;:::-;7079:114;;7216:82;7291:6;7216:82;:::i;:::-;7206:92;;7018:290;7005:1;7002;6998:9;6993:14;;6958:350;;;6962:14;7324:3;7317:10;;6593:740;;;6425:908;;;;:::o;7339:461::-;7526:4;7564:2;7553:9;7549:18;7541:26;;7613:9;7607:4;7603:20;7599:1;7588:9;7584:17;7577:47;7641:152;7788:4;7779:6;7641:152;:::i;:::-;7633:160;;7339:461;;;;:::o;7806:86::-;7841:7;7881:4;7874:5;7870:16;7859:27;;7806:86;;;:::o;7898:112::-;7981:22;7997:5;7981:22;:::i;:::-;7976:3;7969:35;7898:112;;:::o;8016:214::-;8105:4;8143:2;8132:9;8128:18;8120:26;;8156:67;8220:1;8209:9;8205:17;8196:6;8156:67;:::i;:::-;8016:214;;;;:::o;8236:116::-;8306:21;8321:5;8306:21;:::i;:::-;8299:5;8296:32;8286:60;;8342:1;8339;8332:12;8286:60;8236:116;:::o;8358:133::-;8401:5;8439:6;8426:20;8417:29;;8455:30;8479:5;8455:30;:::i;:::-;8358:133;;;;:::o;8497:613::-;8571:6;8579;8587;8636:2;8624:9;8615:7;8611:23;8607:32;8604:119;;;8642:79;;:::i;:::-;8604:119;8762:1;8787:53;8832:7;8823:6;8812:9;8808:22;8787:53;:::i;:::-;8777:63;;8733:117;8889:2;8915:50;8957:7;8948:6;8937:9;8933:22;8915:50;:::i;:::-;8905:60;;8860:115;9014:2;9040:53;9085:7;9076:6;9065:9;9061:22;9040:53;:::i;:::-;9030:63;;8985:118;8497:613;;;;;:::o;9116:329::-;9175:6;9224:2;9212:9;9203:7;9199:23;9195:32;9192:119;;;9230:79;;:::i;:::-;9192:119;9350:1;9375:53;9420:7;9411:6;9400:9;9396:22;9375:53;:::i;:::-;9365:63;;9321:117;9116:329;;;;:::o;9451:118::-;9538:24;9556:5;9538:24;:::i;:::-;9533:3;9526:37;9451:118;;:::o;9575:222::-;9668:4;9706:2;9695:9;9691:18;9683:26;;9719:71;9787:1;9776:9;9772:17;9763:6;9719:71;:::i;:::-;9575:222;;;;:::o;9803:332::-;9924:4;9962:2;9951:9;9947:18;9939:26;;9975:71;10043:1;10032:9;10028:17;10019:6;9975:71;:::i;:::-;10056:72;10124:2;10113:9;10109:18;10100:6;10056:72;:::i;:::-;9803:332;;;;;:::o;10141:474::-;10209:6;10217;10266:2;10254:9;10245:7;10241:23;10237:32;10234:119;;;10272:79;;:::i;:::-;10234:119;10392:1;10417:53;10462:7;10453:6;10442:9;10438:22;10417:53;:::i;:::-;10407:63;;10363:117;10519:2;10545:53;10590:7;10581:6;10570:9;10566:22;10545:53;:::i;:::-;10535:63;;10490:118;10141:474;;;;;:::o;10621:180::-;10669:77;10666:1;10659:88;10766:4;10763:1;10756:15;10790:4;10787:1;10780:15;10807:320;10851:6;10888:1;10882:4;10878:12;10868:22;;10935:1;10929:4;10925:12;10956:18;10946:81;;11012:4;11004:6;11000:17;10990:27;;10946:81;11074:2;11066:6;11063:14;11043:18;11040:38;11037:84;;11093:18;;:::i;:::-;11037:84;10858:269;10807:320;;;:::o;11133:225::-;11273:34;11269:1;11261:6;11257:14;11250:58;11342:8;11337:2;11329:6;11325:15;11318:33;11133:225;:::o;11364:366::-;11506:3;11527:67;11591:2;11586:3;11527:67;:::i;:::-;11520:74;;11603:93;11692:3;11603:93;:::i;:::-;11721:2;11716:3;11712:12;11705:19;;11364:366;;;:::o;11736:419::-;11902:4;11940:2;11929:9;11925:18;11917:26;;11989:9;11983:4;11979:20;11975:1;11964:9;11960:17;11953:47;12017:131;12143:4;12017:131;:::i;:::-;12009:139;;11736:419;;;:::o;12161:180::-;12209:77;12206:1;12199:88;12306:4;12303:1;12296:15;12330:4;12327:1;12320:15;12347:191;12387:3;12406:20;12424:1;12406:20;:::i;:::-;12401:25;;12440:20;12458:1;12440:20;:::i;:::-;12435:25;;12483:1;12480;12476:9;12469:16;;12504:3;12501:1;12498:10;12495:36;;;12511:18;;:::i;:::-;12495:36;12347:191;;;;:::o;12544:230::-;12684:34;12680:1;12672:6;12668:14;12661:58;12753:13;12748:2;12740:6;12736:15;12729:38;12544:230;:::o;12780:366::-;12922:3;12943:67;13007:2;13002:3;12943:67;:::i;:::-;12936:74;;13019:93;13108:3;13019:93;:::i;:::-;13137:2;13132:3;13128:12;13121:19;;12780:366;;;:::o;13152:419::-;13318:4;13356:2;13345:9;13341:18;13333:26;;13405:9;13399:4;13395:20;13391:1;13380:9;13376:17;13369:47;13433:131;13559:4;13433:131;:::i;:::-;13425:139;;13152:419;;;:::o;13577:222::-;13717:34;13713:1;13705:6;13701:14;13694:58;13786:5;13781:2;13773:6;13769:15;13762:30;13577:222;:::o;13805:366::-;13947:3;13968:67;14032:2;14027:3;13968:67;:::i;:::-;13961:74;;14044:93;14133:3;14044:93;:::i;:::-;14162:2;14157:3;14153:12;14146:19;;13805:366;;;:::o;14177:419::-;14343:4;14381:2;14370:9;14366:18;14358:26;;14430:9;14424:4;14420:20;14416:1;14405:9;14401:17;14394:47;14458:131;14584:4;14458:131;:::i;:::-;14450:139;;14177:419;;;:::o;14602:177::-;14742:29;14738:1;14730:6;14726:14;14719:53;14602:177;:::o;14785:366::-;14927:3;14948:67;15012:2;15007:3;14948:67;:::i;:::-;14941:74;;15024:93;15113:3;15024:93;:::i;:::-;15142:2;15137:3;15133:12;15126:19;;14785:366;;;:::o;15157:419::-;15323:4;15361:2;15350:9;15346:18;15338:26;;15410:9;15404:4;15400:20;15396:1;15385:9;15381:17;15374:47;15438:131;15564:4;15438:131;:::i;:::-;15430:139;;15157:419;;;:::o;15582:224::-;15722:34;15718:1;15710:6;15706:14;15699:58;15791:7;15786:2;15778:6;15774:15;15767:32;15582:224;:::o;15812:366::-;15954:3;15975:67;16039:2;16034:3;15975:67;:::i;:::-;15968:74;;16051:93;16140:3;16051:93;:::i;:::-;16169:2;16164:3;16160:12;16153:19;;15812:366;;;:::o;16184:419::-;16350:4;16388:2;16377:9;16373:18;16365:26;;16437:9;16431:4;16427:20;16423:1;16412:9;16408:17;16401:47;16465:131;16591:4;16465:131;:::i;:::-;16457:139;;16184:419;;;:::o;16609:180::-;16657:77;16654:1;16647:88;16754:4;16751:1;16744:15;16778:4;16775:1;16768:15;16795:185;16835:1;16852:20;16870:1;16852:20;:::i;:::-;16847:25;;16886:20;16904:1;16886:20;:::i;:::-;16881:25;;16925:1;16915:35;;16930:18;;:::i;:::-;16915:35;16972:1;16969;16965:9;16960:14;;16795:185;;;;:::o;16986:243::-;17126:34;17122:1;17114:6;17110:14;17103:58;17195:26;17190:2;17182:6;17178:15;17171:51;16986:243;:::o;17235:366::-;17377:3;17398:67;17462:2;17457:3;17398:67;:::i;:::-;17391:74;;17474:93;17563:3;17474:93;:::i;:::-;17592:2;17587:3;17583:12;17576:19;;17235:366;;;:::o;17607:419::-;17773:4;17811:2;17800:9;17796:18;17788:26;;17860:9;17854:4;17850:20;17846:1;17835:9;17831:17;17824:47;17888:131;18014:4;17888:131;:::i;:::-;17880:139;;17607:419;;;:::o;18032:245::-;18172:34;18168:1;18160:6;18156:14;18149:58;18241:28;18236:2;18228:6;18224:15;18217:53;18032:245;:::o;18283:366::-;18425:3;18446:67;18510:2;18505:3;18446:67;:::i;:::-;18439:74;;18522:93;18611:3;18522:93;:::i;:::-;18640:2;18635:3;18631:12;18624:19;;18283:366;;;:::o;18655:419::-;18821:4;18859:2;18848:9;18844:18;18836:26;;18908:9;18902:4;18898:20;18894:1;18883:9;18879:17;18872:47;18936:131;19062:4;18936:131;:::i;:::-;18928:139;;18655:419;;;:::o;19080:410::-;19120:7;19143:20;19161:1;19143:20;:::i;:::-;19138:25;;19177:20;19195:1;19177:20;:::i;:::-;19172:25;;19232:1;19229;19225:9;19254:30;19272:11;19254:30;:::i;:::-;19243:41;;19433:1;19424:7;19420:15;19417:1;19414:22;19394:1;19387:9;19367:83;19344:139;;19463:18;;:::i;:::-;19344:139;19128:362;19080:410;;;;:::o;19496:194::-;19536:4;19556:20;19574:1;19556:20;:::i;:::-;19551:25;;19590:20;19608:1;19590:20;:::i;:::-;19585:25;;19634:1;19631;19627:9;19619:17;;19658:1;19652:4;19649:11;19646:37;;;19663:18;;:::i;:::-;19646:37;19496:194;;;;:::o;19696:232::-;19836:34;19832:1;19824:6;19820:14;19813:58;19905:15;19900:2;19892:6;19888:15;19881:40;19696:232;:::o;19934:366::-;20076:3;20097:67;20161:2;20156:3;20097:67;:::i;:::-;20090:74;;20173:93;20262:3;20173:93;:::i;:::-;20291:2;20286:3;20282:12;20275:19;;19934:366;;;:::o;20306:419::-;20472:4;20510:2;20499:9;20495:18;20487:26;;20559:9;20553:4;20549:20;20545:1;20534:9;20530:17;20523:47;20587:131;20713:4;20587:131;:::i;:::-;20579:139;;20306:419;;;:::o;20731:224::-;20871:34;20867:1;20859:6;20855:14;20848:58;20940:7;20935:2;20927:6;20923:15;20916:32;20731:224;:::o;20961:366::-;21103:3;21124:67;21188:2;21183:3;21124:67;:::i;:::-;21117:74;;21200:93;21289:3;21200:93;:::i;:::-;21318:2;21313:3;21309:12;21302:19;;20961:366;;;:::o;21333:419::-;21499:4;21537:2;21526:9;21522:18;21514:26;;21586:9;21580:4;21576:20;21572:1;21561:9;21557:17;21550:47;21614:131;21740:4;21614:131;:::i;:::-;21606:139;;21333:419;;;:::o;21758:228::-;21898:34;21894:1;21886:6;21882:14;21875:58;21967:11;21962:2;21954:6;21950:15;21943:36;21758:228;:::o;21992:366::-;22134:3;22155:67;22219:2;22214:3;22155:67;:::i;:::-;22148:74;;22231:93;22320:3;22231:93;:::i;:::-;22349:2;22344:3;22340:12;22333:19;;21992:366;;;:::o;22364:419::-;22530:4;22568:2;22557:9;22553:18;22545:26;;22617:9;22611:4;22607:20;22603:1;22592:9;22588:17;22581:47;22645:131;22771:4;22645:131;:::i;:::-;22637:139;;22364:419;;;:::o;22789:224::-;22929:34;22925:1;22917:6;22913:14;22906:58;22998:7;22993:2;22985:6;22981:15;22974:32;22789:224;:::o;23019:366::-;23161:3;23182:67;23246:2;23241:3;23182:67;:::i;:::-;23175:74;;23258:93;23347:3;23258:93;:::i;:::-;23376:2;23371:3;23367:12;23360:19;;23019:366;;;:::o;23391:419::-;23557:4;23595:2;23584:9;23580:18;23572:26;;23644:9;23638:4;23634:20;23630:1;23619:9;23615:17;23608:47;23672:131;23798:4;23672:131;:::i;:::-;23664:139;;23391:419;;;:::o;23816:143::-;23873:5;23904:6;23898:13;23889:22;;23920:33;23947:5;23920:33;:::i;:::-;23816:143;;;;:::o;23965:351::-;24035:6;24084:2;24072:9;24063:7;24059:23;24055:32;24052:119;;;24090:79;;:::i;:::-;24052:119;24210:1;24235:64;24291:7;24282:6;24271:9;24267:22;24235:64;:::i;:::-;24225:74;;24181:128;23965:351;;;;:::o;24322:221::-;24462:34;24458:1;24450:6;24446:14;24439:58;24531:4;24526:2;24518:6;24514:15;24507:29;24322:221;:::o;24549:366::-;24691:3;24712:67;24776:2;24771:3;24712:67;:::i;:::-;24705:74;;24788:93;24877:3;24788:93;:::i;:::-;24906:2;24901:3;24897:12;24890:19;;24549:366;;;:::o;24921:419::-;25087:4;25125:2;25114:9;25110:18;25102:26;;25174:9;25168:4;25164:20;25160:1;25149:9;25145:17;25138:47;25202:131;25328:4;25202:131;:::i;:::-;25194:139;;24921:419;;;:::o;25346:223::-;25486:34;25482:1;25474:6;25470:14;25463:58;25555:6;25550:2;25542:6;25538:15;25531:31;25346:223;:::o;25575:366::-;25717:3;25738:67;25802:2;25797:3;25738:67;:::i;:::-;25731:74;;25814:93;25903:3;25814:93;:::i;:::-;25932:2;25927:3;25923:12;25916:19;;25575:366;;;:::o;25947:419::-;26113:4;26151:2;26140:9;26136:18;26128:26;;26200:9;26194:4;26190:20;26186:1;26175:9;26171:17;26164:47;26228:131;26354:4;26228:131;:::i;:::-;26220:139;;25947:419;;;:::o;26372:221::-;26512:34;26508:1;26500:6;26496:14;26489:58;26581:4;26576:2;26568:6;26564:15;26557:29;26372:221;:::o;26599:366::-;26741:3;26762:67;26826:2;26821:3;26762:67;:::i;:::-;26755:74;;26838:93;26927:3;26838:93;:::i;:::-;26956:2;26951:3;26947:12;26940:19;;26599:366;;;:::o;26971:419::-;27137:4;27175:2;27164:9;27160:18;27152:26;;27224:9;27218:4;27214:20;27210:1;27199:9;27195:17;27188:47;27252:131;27378:4;27252:131;:::i;:::-;27244:139;;26971:419;;;:::o;27396:182::-;27536:34;27532:1;27524:6;27520:14;27513:58;27396:182;:::o;27584:366::-;27726:3;27747:67;27811:2;27806:3;27747:67;:::i;:::-;27740:74;;27823:93;27912:3;27823:93;:::i;:::-;27941:2;27936:3;27932:12;27925:19;;27584:366;;;:::o;27956:419::-;28122:4;28160:2;28149:9;28145:18;28137:26;;28209:9;28203:4;28199:20;28195:1;28184:9;28180:17;28173:47;28237:131;28363:4;28237:131;:::i;:::-;28229:139;;27956:419;;;:::o;28381:179::-;28521:31;28517:1;28509:6;28505:14;28498:55;28381:179;:::o;28566:366::-;28708:3;28729:67;28793:2;28788:3;28729:67;:::i;:::-;28722:74;;28805:93;28894:3;28805:93;:::i;:::-;28923:2;28918:3;28914:12;28907:19;;28566:366;;;:::o;28938:419::-;29104:4;29142:2;29131:9;29127:18;29119:26;;29191:9;29185:4;29181:20;29177:1;29166:9;29162:17;29155:47;29219:131;29345:4;29219:131;:::i;:::-;29211:139;;28938:419;;;:::o;29363:224::-;29503:34;29499:1;29491:6;29487:14;29480:58;29572:7;29567:2;29559:6;29555:15;29548:32;29363:224;:::o;29593:366::-;29735:3;29756:67;29820:2;29815:3;29756:67;:::i;:::-;29749:74;;29832:93;29921:3;29832:93;:::i;:::-;29950:2;29945:3;29941:12;29934:19;;29593:366;;;:::o;29965:419::-;30131:4;30169:2;30158:9;30154:18;30146:26;;30218:9;30212:4;30208:20;30204:1;30193:9;30189:17;30182:47;30246:131;30372:4;30246:131;:::i;:::-;30238:139;;29965:419;;;:::o;30390:222::-;30530:34;30526:1;30518:6;30514:14;30507:58;30599:5;30594:2;30586:6;30582:15;30575:30;30390:222;:::o;30618:366::-;30760:3;30781:67;30845:2;30840:3;30781:67;:::i;:::-;30774:74;;30857:93;30946:3;30857:93;:::i;:::-;30975:2;30970:3;30966:12;30959:19;;30618:366;;;:::o;30990:419::-;31156:4;31194:2;31183:9;31179:18;31171:26;;31243:9;31237:4;31233:20;31229:1;31218:9;31214:17;31207:47;31271:131;31397:4;31271:131;:::i;:::-;31263:139;;30990:419;;;:::o;31415:225::-;31555:34;31551:1;31543:6;31539:14;31532:58;31624:8;31619:2;31611:6;31607:15;31600:33;31415:225;:::o;31646:366::-;31788:3;31809:67;31873:2;31868:3;31809:67;:::i;:::-;31802:74;;31885:93;31974:3;31885:93;:::i;:::-;32003:2;31998:3;31994:12;31987:19;;31646:366;;;:::o;32018:419::-;32184:4;32222:2;32211:9;32207:18;32199:26;;32271:9;32265:4;32261:20;32257:1;32246:9;32242:17;32235:47;32299:131;32425:4;32299:131;:::i;:::-;32291:139;;32018:419;;;:::o;32443:442::-;32592:4;32630:2;32619:9;32615:18;32607:26;;32643:71;32711:1;32700:9;32696:17;32687:6;32643:71;:::i;:::-;32724:72;32792:2;32781:9;32777:18;32768:6;32724:72;:::i;:::-;32806;32874:2;32863:9;32859:18;32850:6;32806:72;:::i;:::-;32443:442;;;;;;:::o;32891:332::-;33012:4;33050:2;33039:9;33035:18;33027:26;;33063:71;33131:1;33120:9;33116:17;33107:6;33063:71;:::i;:::-;33144:72;33212:2;33201:9;33197:18;33188:6;33144:72;:::i;:::-;32891:332;;;;;:::o;33229:251::-;33369:34;33365:1;33357:6;33353:14;33346:58;33438:34;33433:2;33425:6;33421:15;33414:59;33229:251;:::o;33486:366::-;33628:3;33649:67;33713:2;33708:3;33649:67;:::i;:::-;33642:74;;33725:93;33814:3;33725:93;:::i;:::-;33843:2;33838:3;33834:12;33827:19;;33486:366;;;:::o;33858:419::-;34024:4;34062:2;34051:9;34047:18;34039:26;;34111:9;34105:4;34101:20;34097:1;34086:9;34082:17;34075:47;34139:131;34265:4;34139:131;:::i;:::-;34131:139;;33858:419;;;:::o;34283:137::-;34337:5;34368:6;34362:13;34353:22;;34384:30;34408:5;34384:30;:::i;:::-;34283:137;;;;:::o;34426:345::-;34493:6;34542:2;34530:9;34521:7;34517:23;34513:32;34510:119;;;34548:79;;:::i;:::-;34510:119;34668:1;34693:61;34746:7;34737:6;34726:9;34722:22;34693:61;:::i;:::-;34683:71;;34639:125;34426:345;;;;:::o;34777:229::-;34917:34;34913:1;34905:6;34901:14;34894:58;34986:12;34981:2;34973:6;34969:15;34962:37;34777:229;:::o;35012:366::-;35154:3;35175:67;35239:2;35234:3;35175:67;:::i;:::-;35168:74;;35251:93;35340:3;35251:93;:::i;:::-;35369:2;35364:3;35360:12;35353:19;;35012:366;;;:::o;35384:419::-;35550:4;35588:2;35577:9;35573:18;35565:26;;35637:9;35631:4;35627:20;35623:1;35612:9;35608:17;35601:47;35665:131;35791:4;35665:131;:::i;:::-;35657:139;;35384:419;;;:::o;35809:180::-;35857:77;35854:1;35847:88;35954:4;35951:1;35944:15;35978:4;35975:1;35968:15;35995:233;36034:3;36057:24;36075:5;36057:24;:::i;:::-;36048:33;;36103:66;36096:5;36093:77;36090:103;;36173:18;;:::i;:::-;36090:103;36220:1;36213:5;36209:13;36202:20;;35995:233;;;:::o;36234:225::-;36374:34;36370:1;36362:6;36358:14;36351:58;36443:8;36438:2;36430:6;36426:15;36419:33;36234:225;:::o;36465:366::-;36607:3;36628:67;36692:2;36687:3;36628:67;:::i;:::-;36621:74;;36704:93;36793:3;36704:93;:::i;:::-;36822:2;36817:3;36813:12;36806:19;;36465:366;;;:::o;36837:419::-;37003:4;37041:2;37030:9;37026:18;37018:26;;37090:9;37084:4;37080:20;37076:1;37065:9;37061:17;37054:47;37118:131;37244:4;37118:131;:::i;:::-;37110:139;;36837:419;;;:::o;37262:98::-;37313:6;37347:5;37341:12;37331:22;;37262:98;;;:::o;37366:147::-;37467:11;37504:3;37489:18;;37366:147;;;;:::o;37519:386::-;37623:3;37651:38;37683:5;37651:38;:::i;:::-;37705:88;37786:6;37781:3;37705:88;:::i;:::-;37698:95;;37802:65;37860:6;37855:3;37848:4;37841:5;37837:16;37802:65;:::i;:::-;37892:6;37887:3;37883:16;37876:23;;37627:278;37519:386;;;;:::o;37911:271::-;38041:3;38063:93;38152:3;38143:6;38063:93;:::i;:::-;38056:100;;38173:3;38166:10;;37911:271;;;;:::o;38188:179::-;38328:31;38324:1;38316:6;38312:14;38305:55;38188:179;:::o;38373:366::-;38515:3;38536:67;38600:2;38595:3;38536:67;:::i;:::-;38529:74;;38612:93;38701:3;38612:93;:::i;:::-;38730:2;38725:3;38721:12;38714:19;;38373:366;;;:::o;38745:419::-;38911:4;38949:2;38938:9;38934:18;38926:26;;38998:9;38992:4;38988:20;38984:1;38973:9;38969:17;38962:47;39026:131;39152:4;39026:131;:::i;:::-;39018:139;;38745:419;;;:::o
Swarm Source
ipfs://544c7d2085c4021b9f83080e5980c3d5bdaff22b5c37417fc9e9009a9deac9b3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.