ERC-20
MEME
Overview
Max Total Supply
210,000,000,000,000,000 AIDOGE
Holders
272,405 ( 0.000%)
Market
Price
$0.00 @ 0.000000 ETH (-0.81%)
Onchain Market Cap
$84,000,000.00
Circulating Supply Market Cap
$64,451,318.04
Other Info
Token Contract (WITH 6 Decimals)
Balance
110,981,954,928.64 AIDOGEValue
$44.39 ( ~0.0120736318850129 ETH) [0.0001%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
AIDoge
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2023-04-11 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // 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); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // 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); } // File: @openzeppelin/contracts/utils/Context.sol // 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; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // 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 {} } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // 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); } // File: @openzeppelin/contracts/utils/Address.sol // 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); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // 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"); } } } // File: @openzeppelin/contracts/access/Ownable.sol // 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); } } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: contracts/interfaces/ICamelotFactory.sol pragma solidity >=0.5.0; interface ICamelotFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function owner() external view returns (address); function feePercentOwner() external view returns (address); function setStableOwner() external view returns (address); function feeTo() external view returns (address); function ownerFeeShare() external view returns (uint256); function referrersFeeShare(address) external view returns (uint256); function getPair( address tokenA, address tokenB ) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair( address tokenA, address tokenB ) external returns (address pair); function setFeeTo(address) external; function feeInfo() external view returns (uint _ownerFeeShare, address _feeTo); } // File: contracts/interfaces/IUniswapV2Router01.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function quote( uint amountA, uint reserveA, uint reserveB ) external pure returns (uint amountB); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: contracts/interfaces/ICamelotRouter.sol pragma solidity >=0.6.2; interface ICamelotRouter is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, address referrer, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, address referrer, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, address referrer, uint deadline ) external; function getAmountsOut( uint amountIn, address[] calldata path ) external view returns (uint[] memory amounts); } // File: contracts/interfaces/IJackpot.sol pragma solidity >=0.5.0; interface IJackpot { function tradeEvent(address sender, uint256 amount) external; } // File: contracts/interfaces/IWETH.sol pragma solidity >=0.5.0; interface IWETH { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } // File: contracts/interfaces/IDogeBonusPool.sol pragma solidity >=0.5.0; interface IDogeBonusPool { function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function emergencyWithdraw(uint256 _pid) external; function injectRewards(uint256 amount) external; function injectRewardsWithTime(uint256 amount, uint256 rewardsSeconds) external; } // File: contracts/token/AIDoge.sol pragma solidity =0.8.19; contract AIDoge is ERC20, Ownable { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; event SwapBack(uint256 burn, uint256 gov1, uint256 gov2, uint256 liquidity, uint256 jackpot, uint256 bonus, uint256 dev, uint timestamp); event Trade(address user, address pair, uint256 amount, uint side, uint256 circulatingSupply, uint timestamp); event AddLiquidity(uint256 tokenAmount, uint256 ethAmount, uint256 timestamp); bool public swapEnabled = true; bool public addLiquidityEnabled = true; bool public inSwap; modifier swapping() { inSwap = true; _; inSwap = false; } mapping(address => bool) public isFeeExempt; mapping(address => bool) public canAddLiquidityBeforeLaunch; uint256 private burnFee; uint256 public gov1Fee; uint256 public gov2Fee; uint256 private liquidityFee; uint256 private jackpotFee; uint256 private bonusFee; uint256 private devFee; uint256 private totalFee; uint256 public feeDenominator = 10000; // Buy Fees uint256 public burnFeeBuy = 100; uint256 public gov1FeeBuy = 100; uint256 public gov2FeeBuy = 200; uint256 public liquidityFeeBuy = 200; uint256 public jackpotFeeBuy = 300; uint256 public bonusFeeBuy = 300; uint256 public devFeeBuy = 300; uint256 public totalFeeBuy = 1500; // Sell Fees uint256 public burnFeeSell = 100; uint256 public gov1FeeSell = 100; uint256 public gov2FeeSell = 200; uint256 public liquidityFeeSell = 200; uint256 public jackpotFeeSell = 300; uint256 public bonusFeeSell = 300; uint256 public devFeeSell = 300; uint256 public totalFeeSell = 1500; // Fees receivers address private gov1Wallet; address private gov2Wallet; address private bonusWallet; IJackpot public jackpotWallet; address private devWallet; IERC20 public backToken; uint256 public launchedAt; uint256 public launchedAtTimestamp; bool private initialized; ICamelotFactory private immutable factory; ICamelotRouter private immutable swapRouter; IWETH private immutable WETH; address private constant DEAD = 0x000000000000000000000000000000000000dEaD; address private constant ZERO = 0x0000000000000000000000000000000000000000; EnumerableSet.AddressSet private _pairs; constructor( IERC20 _backToken, address _factory, address _swapRouter, address _weth ) ERC20("AIDOGE", "AIDOGE") { uint256 _totalSupply = 210_000_000_000_000_000 * 1e6; backToken = _backToken; canAddLiquidityBeforeLaunch[_msgSender()] = true; canAddLiquidityBeforeLaunch[address(this)] = true; isFeeExempt[msg.sender] = true; isFeeExempt[address(this)] = true; factory = ICamelotFactory(_factory); swapRouter = ICamelotRouter(_swapRouter); WETH = IWETH(_weth); _mint(_msgSender(), _totalSupply); } function initializePair() external onlyOwner { require(!initialized, "Already initialized"); address pair = factory.createPair(address(WETH), address(this)); _pairs.add(pair); initialized = true; } function decimals() public view virtual override returns (uint8) { return 6; } function transfer(address to, uint256 amount) public virtual override returns (bool) { return _dogTransfer(_msgSender(), to, amount); } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(sender, spender, amount); return _dogTransfer(sender, recipient, amount); } function _dogTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { if (inSwap) { _transfer(sender, recipient, amount); return true; } if (!canAddLiquidityBeforeLaunch[sender]) { require(launched(), "Trading not open yet"); } bool shouldTakeFee = (!isFeeExempt[sender] && !isFeeExempt[recipient]) && launched(); uint side = 0; address user_ = sender; address pair_ = recipient; // Set Fees if (isPair(sender)) { buyFees(); side = 1; user_ = recipient; pair_ = sender; try jackpotWallet.tradeEvent(sender, amount) {} catch {} } else if (isPair(recipient)) { sellFees(); side = 2; } else { shouldTakeFee = false; } if (shouldSwapBack()) { swapBack(); } uint256 amountReceived = shouldTakeFee ? takeFee(sender, amount) : amount; _transfer(sender, recipient, amountReceived); if (side > 0) { emit Trade(user_, pair_, amount, side, getCirculatingSupply(), block.timestamp); } return true; } function shouldSwapBack() internal view returns (bool) { return !inSwap && swapEnabled && launched() && balanceOf(address(this)) > 0 && !isPair(_msgSender()); } function swapBack() internal swapping { uint256 taxAmount = balanceOf(address(this)); _approve(address(this), address(swapRouter), taxAmount); uint256 amountDogBurn = (taxAmount * burnFee) / (totalFee); uint256 amountDogLp = (taxAmount * liquidityFee) / (totalFee); uint256 amountDogBonus = (taxAmount * bonusFee) / (totalFee); taxAmount -= amountDogBurn; taxAmount -= amountDogLp; taxAmount -= amountDogBonus; address[] memory path = new address[](3); path[0] = address(this); path[1] = address(WETH); path[2] = address(backToken); bool success = false; uint256 balanceBefore = backToken.balanceOf(address(this)); try swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(taxAmount,0,path,address(this),address(0),block.timestamp){ success = true; } catch { try swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(taxAmount,0,path,address(this),block.timestamp) { success = true; } catch {} } if (!success) { return; } _transfer(address(this), DEAD, amountDogBurn); _approve(address(this), address(bonusWallet), amountDogBonus); IDogeBonusPool(bonusWallet).injectRewards(amountDogBonus); uint256 amountBackToken = backToken.balanceOf(address(this)) - balanceBefore; uint256 backTokenTotalFee = totalFee - burnFee - liquidityFee - bonusFee; uint256 amountBackTokenGov1 = (amountBackToken * gov1Fee) / (backTokenTotalFee); uint256 amountBackTokenGov2 = (amountBackToken * gov2Fee) / (backTokenTotalFee); uint256 amountBackTokenJackpot = (amountBackToken * jackpotFee) / backTokenTotalFee; uint256 amountBackTokenDev = amountBackToken - amountBackTokenGov1 - amountBackTokenGov2 - amountBackTokenJackpot; backToken.transfer(gov1Wallet, amountBackTokenGov1); backToken.transfer(gov2Wallet, amountBackTokenGov2); backToken.transfer(address(jackpotWallet), amountBackTokenJackpot); backToken.transfer(devWallet, amountBackTokenDev); if (addLiquidityEnabled) { _doAddLp(); } emit SwapBack(amountDogBurn, amountBackTokenGov1, amountBackTokenGov2, amountDogLp, amountBackTokenJackpot, amountDogBonus, amountBackTokenDev, block.timestamp); } function _doAddLp() internal { address[] memory pathEth = new address[](2); pathEth[0] = address(this); pathEth[1] = address(WETH); uint256 tokenAmount = balanceOf(address(this)); uint256 half = tokenAmount / 2; if(half < 1000) return; uint256 ethAmountBefore = address(this).balance; bool success = false; try swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(half,0, pathEth,address(this),address(0),block.timestamp){ success = true; } catch { try swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(half,0, pathEth,address(this),block.timestamp){ success = true; } catch {} } if (!success) { return; } uint256 ethAmount = address(this).balance - ethAmountBefore; _addLiquidity(half, ethAmount); } function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal { _approve(address(this), address(swapRouter), tokenAmount); try swapRouter.addLiquidityETH{value: ethAmount}(address(this), tokenAmount, 0, 0, address(0), block.timestamp) { emit AddLiquidity(tokenAmount, ethAmount, block.timestamp); } catch {} } function doSwapBack() public onlyOwner { swapBack(); } function launched() internal view returns (bool) { return launchedAt != 0; } function buyFees() internal { burnFee = burnFeeBuy; gov1Fee = gov1FeeBuy; gov2Fee = gov2FeeBuy; liquidityFee = liquidityFeeBuy; jackpotFee = jackpotFeeBuy; bonusFee = bonusFeeBuy; devFee = devFeeBuy; totalFee = totalFeeBuy; } function sellFees() internal { burnFee = burnFeeSell; gov1Fee = gov1FeeSell; gov2Fee = gov2FeeSell; liquidityFee = liquidityFeeSell; jackpotFee = jackpotFeeSell; bonusFee = bonusFeeSell; devFee = devFeeSell; totalFee = totalFeeSell; } function takeFee(address sender, uint256 amount) internal returns (uint256) { uint256 feeAmount = (amount * totalFee) / feeDenominator; _transfer(sender, address(this), feeAmount); return amount - feeAmount; } function rescueToken(address tokenAddress) external onlyOwner { IERC20(tokenAddress).safeTransfer(msg.sender,IERC20(tokenAddress).balanceOf(address(this))); } function clearStuckEthBalance() external onlyOwner { uint256 amountETH = address(this).balance; (bool success, ) = payable(_msgSender()).call{value: amountETH}(new bytes(0)); require(success, 'AIDOGE: ETH_TRANSFER_FAILED'); } function clearStuckBalance() external onlyOwner { backToken.transfer(_msgSender(), backToken.balanceOf(address(this))); } function getCirculatingSupply() public view returns (uint256) { return totalSupply() - balanceOf(DEAD) - balanceOf(ZERO); } /*** ADMIN FUNCTIONS ***/ function launch() public onlyOwner { require(launchedAt == 0, "Already launched"); launchedAt = block.number; launchedAtTimestamp = block.timestamp; } function setBuyFees( uint256 _gov1Fee, uint256 _gov2Fee, uint256 _liquidityFee, uint256 _jackpotFee, uint256 _bonusFee, uint256 _devFee, uint256 _burnFee ) external onlyOwner { gov1FeeBuy = _gov1Fee; gov2FeeBuy = _gov2Fee; liquidityFeeBuy = _liquidityFee; jackpotFeeBuy = _jackpotFee; bonusFeeBuy = _bonusFee; devFeeBuy = _devFee; burnFeeBuy = _burnFee; totalFeeBuy = _liquidityFee + _jackpotFee + _bonusFee + _devFee + _burnFee; } function setSellFees( uint256 _gov1Fee, uint256 _gov2Fee, uint256 _liquidityFee, uint256 _jackpotFee, uint256 _bonusFee, uint256 _devFee, uint256 _burnFee ) external onlyOwner { gov1FeeSell = _gov1Fee; gov2FeeSell = _gov2Fee; liquidityFeeSell = _liquidityFee; jackpotFeeSell = _jackpotFee; bonusFeeSell = _bonusFee; devFeeSell = _devFee; burnFeeSell = _burnFee; totalFeeSell = _liquidityFee + _jackpotFee + _bonusFee + _devFee + _burnFee; } function setFeeReceivers( address _gov1Wallet, address _gov2Wallet, address _bonusWallet, address _jackpotWallet, address _devWallet ) external onlyOwner { gov1Wallet = _gov1Wallet; gov2Wallet = _gov2Wallet; bonusWallet = _bonusWallet; jackpotWallet = IJackpot(_jackpotWallet); devWallet = _devWallet; devWallet = _devWallet; } function setIsFeeExempt(address holder, bool exempt) external onlyOwner { isFeeExempt[holder] = exempt; } function setSwapBackSettings(bool _enabled) external onlyOwner { swapEnabled = _enabled; } function setAddLiquidityEnabled(bool _enabled) external onlyOwner { addLiquidityEnabled = _enabled; } function isPair(address account) public view returns (bool) { return _pairs.contains(account); } function addPair(address pair) public onlyOwner returns (bool) { require(pair != address(0), "AIDOGE: pair is the zero address"); return _pairs.add(pair); } function delPair(address pair) public onlyOwner returns (bool) { require(pair != address(0), "AIDOGE: pair is the zero address"); return _pairs.remove(pair); } function getMinterLength() public view returns (uint256) { return _pairs.length(); } function getPair(uint256 index) public view returns (address) { require(index <= _pairs.length() - 1, "AIDOGE: index out of bounds"); return _pairs.at(index); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_backToken","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"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":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gov1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gov2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"jackpot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"side","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"circulatingSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","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":"addLiquidityEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"backToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAddLiquidityBeforeLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearStuckEthBalance","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":[{"internalType":"address","name":"pair","type":"address"}],"name":"delPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1FeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1FeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2FeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2FeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"initializePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotWallet","outputs":[{"internalType":"contract IJackpot","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeSell","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setAddLiquidityEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gov1Fee","type":"uint256"},{"internalType":"uint256","name":"_gov2Fee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_jackpotFee","type":"uint256"},{"internalType":"uint256","name":"_bonusFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov1Wallet","type":"address"},{"internalType":"address","name":"_gov2Wallet","type":"address"},{"internalType":"address","name":"_bonusWallet","type":"address"},{"internalType":"address","name":"_jackpotWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gov1Fee","type":"uint256"},{"internalType":"uint256","name":"_gov2Fee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_jackpotFee","type":"uint256"},{"internalType":"uint256","name":"_bonusFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"sender","type":"address"},{"internalType":"address","name":"recipient","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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040526001600560146101000a81548160ff0219169083151502179055506001600560156101000a81548160ff0219169083151502179055506127106010556064601155606460125560c860135560c860145561012c60155561012c60165561012c6017556105dc60185560646019556064601a5560c8601b5560c8601c5561012c601d5561012c601e5561012c601f556105dc602055348015620000a557600080fd5b5060405162005d4a38038062005d4a8339818101604052810190620000cb9190620006f8565b6040518060400160405280600681526020017f4149444f474500000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4149444f474500000000000000000000000000000000000000000000000000008152508160039081620001489190620009e4565b5080600490816200015a9190620009e4565b5050506200017d620001716200040460201b60201c565b6200040c60201b60201c565b6000692c781f708c509f400000905084602660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160076000620001e36200040460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050620003f9620003ec6200040460201b60201c565b82620004d260201b60201c565b505050505062000be6565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000544576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053b9062000b2c565b60405180910390fd5b62000558600083836200063f60201b60201c565b80600260008282546200056c919062000b7d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200061f919062000bc9565b60405180910390a36200063b600083836200064460201b60201c565b5050565b505050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200067b826200064e565b9050919050565b60006200068f826200066e565b9050919050565b620006a18162000682565b8114620006ad57600080fd5b50565b600081519050620006c18162000696565b92915050565b620006d2816200066e565b8114620006de57600080fd5b50565b600081519050620006f281620006c7565b92915050565b6000806000806080858703121562000715576200071462000649565b5b60006200072587828801620006b0565b94505060206200073887828801620006e1565b93505060406200074b87828801620006e1565b92505060606200075e87828801620006e1565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007ec57607f821691505b602082108103620008025762000801620007a4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200086c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200082d565b6200087886836200082d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008c5620008bf620008b98462000890565b6200089a565b62000890565b9050919050565b6000819050919050565b620008e183620008a4565b620008f9620008f082620008cc565b8484546200083a565b825550505050565b600090565b6200091062000901565b6200091d818484620008d6565b505050565b5b8181101562000945576200093960008262000906565b60018101905062000923565b5050565b601f82111562000994576200095e8162000808565b62000969846200081d565b8101602085101562000979578190505b6200099162000988856200081d565b83018262000922565b50505b505050565b600082821c905092915050565b6000620009b96000198460080262000999565b1980831691505092915050565b6000620009d48383620009a6565b9150826002028217905092915050565b620009ef826200076a565b67ffffffffffffffff81111562000a0b5762000a0a62000775565b5b62000a178254620007d3565b62000a2482828562000949565b600060209050601f83116001811462000a5c576000841562000a47578287015190505b62000a538582620009c6565b86555062000ac3565b601f19841662000a6c8662000808565b60005b8281101562000a965784890151825560018201915060208501945060208101905062000a6f565b8683101562000ab6578489015162000ab2601f891682620009a6565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000b14601f8362000acb565b915062000b218262000adc565b602082019050919050565b6000602082019050818103600083015262000b478162000b05565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b8a8262000890565b915062000b978362000890565b925082820190508082111562000bb25762000bb162000b4e565b5b92915050565b62000bc38162000890565b82525050565b600060208201905062000be0600083018462000bb8565b92915050565b60805160a05160c0516150fc62000c4e600039600081816114f70152818161261801526134b90152600081816124cd015281816127990152818161282d0152818161355f015281816135f30152818161384e0152613875015260006114bb01526150fc6000f3fe60806040526004361061039b5760003560e01c806382d20116116101dc578063b8c6113011610102578063cdba31fd116100a0578063e1e5a66d1161006f578063e1e5a66d14610d61578063e5e31b1314610d8c578063f2fde38b14610dc9578063fb5f27fb14610df2576103a2565b8063cdba31fd14610ca3578063d830678614610cce578063dbd6c48914610cf9578063dd62ed3e14610d24576103a2565b8063bfa382b5116100dc578063bfa382b514610bf9578063c2b7bbb614610c10578063c6d2577d14610c4d578063cb806e0714610c78576103a2565b8063b8c6113014610b68578063bdf391cc14610b91578063bf56b37114610bce576103a2565b806395d89b411161017a578063aac46c9511610149578063aac46c9514610abe578063ace1880114610ae7578063b6309f6814610b12578063b7eed4c414610b3d576103a2565b806395d89b41146109dc578063a457c2d714610a07578063a5bc508514610a44578063a9059cbb14610a81576103a2565b806386c8782f116101b657806386c8782f146109465780638da5cb5b146109715780638fbbd7501461099c5780639272293c146109b3576103a2565b806382d20116146108c557806386013940146108f0578063861faf5f1461091b576103a2565b80632d2f244b116102c1578063531484161161025f57806370a082311161022e57806370a082311461080957806370c8810e14610846578063715018a6146108715780638072250b14610888576103a2565b8063531484161461075f578063658d4b7f1461078a5780636c470595146107b35780636ddd1713146107de576103a2565b8063395093511161029b57806339509351146106a55780633f4218e0146106e25780634460d3cf1461071f5780634fab9e4c14610748576103a2565b80632d2f244b14610638578063313ce56714610663578063364333f41461068e576103a2565b806312835c5e1161033957806318abb6351161030857806318abb6351461057c578063234a2daa146105a557806323b872dd146105d05780632b112e491461060d576103a2565b806312835c5e146104d057806315674e8e146104fb578063180b0d7e1461052657806318160ddd14610551576103a2565b806306fdde031161037557806306fdde0314610414578063095ea7b31461043f5780630ca5979b1461047c5780631107b3a5146104a5576103a2565b806301339c21146103a7578063017e24e1146103be5780630323aac7146103e9576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610e1d565b005b3480156103ca57600080fd5b506103d3610e7a565b6040516103e09190613b2b565b60405180910390f35b3480156103f557600080fd5b506103fe610e80565b60405161040b9190613b2b565b60405180910390f35b34801561042057600080fd5b50610429610e91565b6040516104369190613bd6565b60405180910390f35b34801561044b57600080fd5b5061046660048036038101906104619190613c87565b610f23565b6040516104739190613ce2565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613cfd565b610f46565b005b3480156104b157600080fd5b506104ba610fbb565b6040516104c79190613b2b565b60405180910390f35b3480156104dc57600080fd5b506104e5610fc1565b6040516104f29190613b2b565b60405180910390f35b34801561050757600080fd5b50610510610fc7565b60405161051d9190613b2b565b60405180910390f35b34801561053257600080fd5b5061053b610fcd565b6040516105489190613b2b565b60405180910390f35b34801561055d57600080fd5b50610566610fd3565b6040516105739190613b2b565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190613d9f565b610fdd565b005b3480156105b157600080fd5b506105ba611172565b6040516105c79190613b2b565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190613e1a565b611178565b6040516106049190613ce2565b60405180910390f35b34801561061957600080fd5b506106226111a5565b60405161062f9190613b2b565b60405180910390f35b34801561064457600080fd5b5061064d6111dd565b60405161065a9190613ecc565b60405180910390f35b34801561066f57600080fd5b50610678611203565b6040516106859190613f03565b60405180910390f35b34801561069a57600080fd5b506106a361120c565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613c87565b611359565b6040516106d99190613ce2565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613f1e565b611390565b6040516107169190613ce2565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613f1e565b6113b0565b005b34801561075457600080fd5b5061075d61145f565b005b34801561076b57600080fd5b506107746115ac565b6040516107819190613b2b565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613f77565b6115b2565b005b3480156107bf57600080fd5b506107c8611615565b6040516107d59190613b2b565b60405180910390f35b3480156107ea57600080fd5b506107f361161b565b6040516108009190613ce2565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613f1e565b61162e565b60405161083d9190613b2b565b60405180910390f35b34801561085257600080fd5b5061085b611676565b6040516108689190613b2b565b60405180910390f35b34801561087d57600080fd5b5061088661167c565b005b34801561089457600080fd5b506108af60048036038101906108aa9190613f1e565b611690565b6040516108bc9190613ce2565b60405180910390f35b3480156108d157600080fd5b506108da6116b0565b6040516108e79190613b2b565b60405180910390f35b3480156108fc57600080fd5b506109056116b6565b6040516109129190613ce2565b60405180910390f35b34801561092757600080fd5b506109306116c9565b60405161093d9190613fd8565b60405180910390f35b34801561095257600080fd5b5061095b6116ef565b6040516109689190613b2b565b60405180910390f35b34801561097d57600080fd5b506109866116f5565b6040516109939190614002565b60405180910390f35b3480156109a857600080fd5b506109b161171f565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190613cfd565b611731565b005b3480156109e857600080fd5b506109f16117a6565b6040516109fe9190613bd6565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613c87565b611838565b604051610a3b9190613ce2565b60405180910390f35b348015610a5057600080fd5b50610a6b6004803603810190610a669190613f1e565b6118af565b604051610a789190613ce2565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa39190613c87565b611943565b604051610ab59190613ce2565b60405180910390f35b348015610aca57600080fd5b50610ae56004803603810190610ae0919061401d565b61195f565b005b348015610af357600080fd5b50610afc611984565b604051610b099190613b2b565b60405180910390f35b348015610b1e57600080fd5b50610b2761198a565b604051610b349190613b2b565b60405180910390f35b348015610b4957600080fd5b50610b52611990565b604051610b5f9190613b2b565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a919061401d565b611996565b005b348015610b9d57600080fd5b50610bb86004803603810190610bb3919061404a565b6119bb565b604051610bc59190614002565b60405180910390f35b348015610bda57600080fd5b50610be3611a30565b604051610bf09190613b2b565b60405180910390f35b348015610c0557600080fd5b50610c0e611a36565b005b348015610c1c57600080fd5b50610c376004803603810190610c329190613f1e565b611b49565b604051610c449190613ce2565b60405180910390f35b348015610c5957600080fd5b50610c62611bdd565b604051610c6f9190613b2b565b60405180910390f35b348015610c8457600080fd5b50610c8d611be3565b604051610c9a9190613b2b565b60405180910390f35b348015610caf57600080fd5b50610cb8611be9565b604051610cc59190613b2b565b60405180910390f35b348015610cda57600080fd5b50610ce3611bef565b604051610cf09190613ce2565b60405180910390f35b348015610d0557600080fd5b50610d0e611c02565b604051610d1b9190613b2b565b60405180910390f35b348015610d3057600080fd5b50610d4b6004803603810190610d469190614077565b611c08565b604051610d589190613b2b565b60405180910390f35b348015610d6d57600080fd5b50610d76611c8f565b604051610d839190613b2b565b60405180910390f35b348015610d9857600080fd5b50610db36004803603810190610dae9190613f1e565b611c95565b604051610dc09190613ce2565b60405180910390f35b348015610dd557600080fd5b50610df06004803603810190610deb9190613f1e565b611cb2565b005b348015610dfe57600080fd5b50610e07611d35565b604051610e149190613b2b565b60405180910390f35b610e25611d3b565b600060275414610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6190614103565b60405180910390fd5b4360278190555042602881905550565b600a5481565b6000610e8c602a611db9565b905090565b606060038054610ea090614152565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90614152565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b5050505050905090565b600080610f2e611dce565b9050610f3b818585611dd6565b600191505092915050565b610f4e611d3b565b866012819055508560138190555084601481905550836015819055508260168190555081601781905550806011819055508082848688610f8e91906141b2565b610f9891906141b2565b610fa291906141b2565b610fac91906141b2565b60188190555050505050505050565b601c5481565b601f5481565b60115481565b60105481565b6000600254905090565b610fe5611d3b565b84602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60195481565b600080611183611dce565b9050611190858285611f9f565b61119b85858561202b565b9150509392505050565b60006111b1600061162e565b6111bc61dead61162e565b6111c4610fd3565b6111ce91906141e6565b6111d891906141e6565b905090565b602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006905090565b611214611d3b565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61125a611dce565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112b59190614002565b602060405180830381865afa1580156112d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f6919061422f565b6040518363ffffffff1660e01b815260040161131392919061425c565b6020604051808303816000875af1158015611332573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611356919061429a565b50565b600080611364611dce565b90506113858185856113768589611c08565b61138091906141b2565b611dd6565b600191505092915050565b60066020528060005260406000206000915054906101000a900460ff1681565b6113b8611d3b565b61145c338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113f59190614002565b602060405180830381865afa158015611412573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611436919061422f565b8373ffffffffffffffffffffffffffffffffffffffff166123239092919063ffffffff16565b50565b611467611d3b565b602960009054906101000a900460ff16156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614313565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c653967f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b8152600401611534929190614333565b6020604051808303816000875af1158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190614371565b905061158d81602a6123a990919063ffffffff16565b506001602960006101000a81548160ff02191690831515021790555050565b60205481565b6115ba611d3b565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60155481565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b611684611d3b565b61168e60006123d9565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60145481565b600560159054906101000a900460ff1681565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611727611d3b565b61172f61249f565b565b611739611d3b565b86601a8190555085601b8190555084601c8190555083601d8190555082601e8190555081601f8190555080601981905550808284868861177991906141b2565b61178391906141b2565b61178d91906141b2565b61179791906141b2565b60208190555050505050505050565b6060600480546117b590614152565b80601f01602080910402602001604051908101604052809291908181526020018280546117e190614152565b801561182e5780601f106118035761010080835404028352916020019161182e565b820191906000526020600020905b81548152906001019060200180831161181157829003601f168201915b5050505050905090565b600080611843611dce565b905060006118518286611c08565b905083811015611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614410565b60405180910390fd5b6118a38286868403611dd6565b60019250505092915050565b60006118b9611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f9061447c565b60405180910390fd5b61193c82602a612e9490919063ffffffff16565b9050919050565b6000611957611950611dce565b848461202b565b905092915050565b611967611d3b565b80600560156101000a81548160ff02191690831515021790555050565b601e5481565b601b5481565b601d5481565b61199e611d3b565b80600560146101000a81548160ff02191690831515021790555050565b600060016119c9602a611db9565b6119d391906141e6565b821115611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c906144e8565b60405180910390fd5b611a2982602a612ec490919063ffffffff16565b9050919050565b60275481565b611a3e611d3b565b60004790506000611a4d611dce565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115611a7f57611a7e614508565b5b6040519080825280601f01601f191660200182016040528015611ab15781602001600182028036833780820191505090505b50604051611abf919061457e565b60006040518083038185875af1925050503d8060008114611afc576040519150601f19603f3d011682016040523d82523d6000602084013e611b01565b606091505b5050905080611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c906145e1565b60405180910390fd5b5050565b6000611b53611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb99061447c565b60405180910390fd5b611bd682602a6123a990919063ffffffff16565b9050919050565b60285481565b60095481565b60175481565b600560169054906101000a900460ff1681565b601a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60135481565b6000611cab82602a612ede90919063ffffffff16565b9050919050565b611cba611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2090614673565b60405180910390fd5b611d32816123d9565b50565b60185481565b611d43611dce565b73ffffffffffffffffffffffffffffffffffffffff16611d616116f5565b73ffffffffffffffffffffffffffffffffffffffff1614611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906146df565b60405180910390fd5b565b6000611dc782600001612f0e565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c90614771565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614803565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f929190613b2b565b60405180910390a3505050565b6000611fab8484611c08565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120255781811015612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e9061486f565b60405180910390fd5b6120248484848403611dd6565b5b50505050565b6000600560169054906101000a900460ff16156120565761204d848484612f1f565b6001905061231c565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120ef576120af613195565b6120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e5906148db565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156121955750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156121a557506121a4613195565b5b905060008086905060008690506121bb88611c95565b15612260576121c86131a2565b60019250869150879050602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166367d198a689886040518363ffffffff1660e01b815260040161222f92919061425c565b600060405180830381600087803b15801561224957600080fd5b505af192505050801561225a575060015b50612285565b61226987611c95565b1561227f576122766131ec565b60029250612284565b600093505b5b61228d613236565b1561229b5761229a61249f565b5b6000846122a857866122b3565b6122b289886132a3565b5b90506122c0898983612f1f565b6000841115612312577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d754838389876122f66111a5565b42604051612309969594939291906148fb565b60405180910390a15b6001955050505050505b9392505050565b6123a48363a9059cbb60e01b848460405160240161234292919061425c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506132e3565b505050565b60006123d1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6133aa565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff02191690831515021790555060006124c53061162e565b90506124f2307f000000000000000000000000000000000000000000000000000000000000000083611dd6565b6000600f5460085483612505919061495c565b61250f91906149cd565b90506000600f54600b5484612524919061495c565b61252e91906149cd565b90506000600f54600d5485612543919061495c565b61254d91906149cd565b9050828461255b91906141e6565b9350818461256991906141e6565b9350808461257791906141e6565b93506000600367ffffffffffffffff81111561259657612595614508565b5b6040519080825280602002602001820160405280156125c45781602001602082028036833780820191505090505b50905030816000815181106125dc576125db6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061264b5761264a6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106126bc576126bb6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127549190614002565b602060405180830381865afa158015612771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612795919061422f565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b81526004016127fc96959493929190614b26565b600060405180830381600087803b15801561281657600080fd5b505af1925050508015612827575060015b6128c7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b815260040161288d959493929190614b8e565b600060405180830381600087803b1580156128a757600080fd5b505af19250505080156128b8575060015b156128c257600191505b6128cc565b600191505b816128dd5750505050505050612e77565b6128ea3061dead88612f1f565b61291730602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611dd6565b602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bdc8a1f856040518263ffffffff1660e01b81526004016129729190613b2b565b600060405180830381600087803b15801561298c57600080fd5b505af11580156129a0573d6000803e3d6000fd5b50505050600081602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a029190614002565b602060405180830381865afa158015612a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a43919061422f565b612a4d91906141e6565b90506000600d54600b54600854600f54612a6791906141e6565b612a7191906141e6565b612a7b91906141e6565b905060008160095484612a8e919061495c565b612a9891906149cd565b9050600082600a5485612aab919061495c565b612ab591906149cd565b9050600083600c5486612ac8919061495c565b612ad291906149cd565b9050600081838588612ae491906141e6565b612aee91906141e6565b612af891906141e6565b9050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401612b7992919061425c565b6020604051808303816000875af1158015612b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbc919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401612c3c92919061425c565b6020604051808303816000875af1158015612c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7f919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612cff92919061425c565b6020604051808303816000875af1158015612d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d42919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612dc292919061425c565b6020604051808303816000875af1158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e05919061429a565b50600560159054906101000a900460ff1615612e2457612e2361341a565b5b7f310a031bae0df2b1a8ba6de615833770c757a404a7395cc0121c13975e67c0b08c85858e868f8742604051612e61989796959493929190614be8565b60405180910390a1505050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612ebc836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6136c4565b905092915050565b6000612ed383600001836137d8565b60001c905092915050565b6000612f06836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613803565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8590614cd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490614d6a565b60405180910390fd5b613008838383613826565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561308e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308590614dfc565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161317c9190613b2b565b60405180910390a361318f84848461382b565b50505050565b6000806027541415905090565b601154600881905550601254600981905550601354600a81905550601454600b81905550601554600c81905550601654600d81905550601754600e81905550601854600f81905550565b601954600881905550601a54600981905550601b54600a81905550601c54600b81905550601d54600c81905550601e54600d81905550601f54600e81905550602054600f81905550565b6000600560169054906101000a900460ff161580156132615750600560149054906101000a900460ff165b80156132715750613270613195565b5b8015613285575060006132833061162e565b115b801561329e575061329c613297611dce565b611c95565b155b905090565b600080601054600f54846132b7919061495c565b6132c191906149cd565b90506132ce843083612f1f565b80836132da91906141e6565b91505092915050565b6000613345826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138309092919063ffffffff16565b90506000815111156133a55780806020019051810190613365919061429a565b6133a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339b90614e8e565b60405180910390fd5b5b505050565b60006133b68383613803565b61340f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613414565b600090505b92915050565b6000600267ffffffffffffffff81111561343757613436614508565b5b6040519080825280602002602001820160405280156134655781602001602082028036833780820191505090505b509050308160008151811061347d5761347c6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106134ec576134eb6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006135313061162e565b9050600060028261354291906149cd565b90506103e8811015613556575050506136c2565b600047905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016135c296959493929190614b26565b600060405180830381600087803b1580156135dc57600080fd5b505af19250505080156135ed575060015b61368d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b8152600401613653959493929190614b8e565b600060405180830381600087803b15801561366d57600080fd5b505af192505050801561367e575060015b1561368857600190505b613692565b600190505b806136a15750505050506136c2565b600082476136af91906141e6565b90506136bb8482613848565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146137cc5760006001826136f691906141e6565b905060006001866000018054905061370e91906141e6565b905081811461377d57600086600001828154811061372f5761372e6149fe565b5b9060005260206000200154905080876000018481548110613753576137526149fe565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061379157613790614eae565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506137d2565b60009150505b92915050565b60008260000182815481106137f0576137ef6149fe565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b606061383f848460008561395d565b90509392505050565b613873307f000000000000000000000000000000000000000000000000000000000000000084611dd6565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b81526004016138d996959493929190614edd565b60606040518083038185885af19350505050801561391557506040513d601f19601f820116820180604052508101906139129190614f3e565b60015b15613959575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2482824260405161395093929190614f91565b60405180910390a15b5050565b6060824710156139a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139999061503a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139cb919061457e565b60006040518083038185875af1925050503d8060008114613a08576040519150601f19603f3d011682016040523d82523d6000602084013e613a0d565b606091505b5091509150613a1e87838387613a2a565b92505050949350505050565b60608315613a8c576000835103613a8457613a4485613a9f565b613a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7a906150a6565b60405180910390fd5b5b829050613a97565b613a968383613ac2565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115613ad55781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b099190613bd6565b60405180910390fd5b6000819050919050565b613b2581613b12565b82525050565b6000602082019050613b406000830184613b1c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b80578082015181840152602081019050613b65565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ba882613b46565b613bb28185613b51565b9350613bc2818560208601613b62565b613bcb81613b8c565b840191505092915050565b60006020820190508181036000830152613bf08184613b9d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c2882613bfd565b9050919050565b613c3881613c1d565b8114613c4357600080fd5b50565b600081359050613c5581613c2f565b92915050565b613c6481613b12565b8114613c6f57600080fd5b50565b600081359050613c8181613c5b565b92915050565b60008060408385031215613c9e57613c9d613bf8565b5b6000613cac85828601613c46565b9250506020613cbd85828601613c72565b9150509250929050565b60008115159050919050565b613cdc81613cc7565b82525050565b6000602082019050613cf76000830184613cd3565b92915050565b600080600080600080600060e0888a031215613d1c57613d1b613bf8565b5b6000613d2a8a828b01613c72565b9750506020613d3b8a828b01613c72565b9650506040613d4c8a828b01613c72565b9550506060613d5d8a828b01613c72565b9450506080613d6e8a828b01613c72565b93505060a0613d7f8a828b01613c72565b92505060c0613d908a828b01613c72565b91505092959891949750929550565b600080600080600060a08688031215613dbb57613dba613bf8565b5b6000613dc988828901613c46565b9550506020613dda88828901613c46565b9450506040613deb88828901613c46565b9350506060613dfc88828901613c46565b9250506080613e0d88828901613c46565b9150509295509295909350565b600080600060608486031215613e3357613e32613bf8565b5b6000613e4186828701613c46565b9350506020613e5286828701613c46565b9250506040613e6386828701613c72565b9150509250925092565b6000819050919050565b6000613e92613e8d613e8884613bfd565b613e6d565b613bfd565b9050919050565b6000613ea482613e77565b9050919050565b6000613eb682613e99565b9050919050565b613ec681613eab565b82525050565b6000602082019050613ee16000830184613ebd565b92915050565b600060ff82169050919050565b613efd81613ee7565b82525050565b6000602082019050613f186000830184613ef4565b92915050565b600060208284031215613f3457613f33613bf8565b5b6000613f4284828501613c46565b91505092915050565b613f5481613cc7565b8114613f5f57600080fd5b50565b600081359050613f7181613f4b565b92915050565b60008060408385031215613f8e57613f8d613bf8565b5b6000613f9c85828601613c46565b9250506020613fad85828601613f62565b9150509250929050565b6000613fc282613e99565b9050919050565b613fd281613fb7565b82525050565b6000602082019050613fed6000830184613fc9565b92915050565b613ffc81613c1d565b82525050565b60006020820190506140176000830184613ff3565b92915050565b60006020828403121561403357614032613bf8565b5b600061404184828501613f62565b91505092915050565b6000602082840312156140605761405f613bf8565b5b600061406e84828501613c72565b91505092915050565b6000806040838503121561408e5761408d613bf8565b5b600061409c85828601613c46565b92505060206140ad85828601613c46565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b60006140ed601083613b51565b91506140f8826140b7565b602082019050919050565b6000602082019050818103600083015261411c816140e0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061416a57607f821691505b60208210810361417d5761417c614123565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141bd82613b12565b91506141c883613b12565b92508282019050808211156141e0576141df614183565b5b92915050565b60006141f182613b12565b91506141fc83613b12565b925082820390508181111561421457614213614183565b5b92915050565b60008151905061422981613c5b565b92915050565b60006020828403121561424557614244613bf8565b5b60006142538482850161421a565b91505092915050565b60006040820190506142716000830185613ff3565b61427e6020830184613b1c565b9392505050565b60008151905061429481613f4b565b92915050565b6000602082840312156142b0576142af613bf8565b5b60006142be84828501614285565b91505092915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b60006142fd601383613b51565b9150614308826142c7565b602082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b60006040820190506143486000830185613ff3565b6143556020830184613ff3565b9392505050565b60008151905061436b81613c2f565b92915050565b60006020828403121561438757614386613bf8565b5b60006143958482850161435c565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006143fa602583613b51565b91506144058261439e565b604082019050919050565b60006020820190508181036000830152614429816143ed565b9050919050565b7f4149444f47453a207061697220697320746865207a65726f2061646472657373600082015250565b6000614466602083613b51565b915061447182614430565b602082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f4149444f47453a20696e646578206f7574206f6620626f756e64730000000000600082015250565b60006144d2601b83613b51565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061455882614537565b6145628185614542565b9350614572818560208601613b62565b80840191505092915050565b600061458a828461454d565b915081905092915050565b7f4149444f47453a204554485f5452414e534645525f4641494c45440000000000600082015250565b60006145cb601b83613b51565b91506145d682614595565b602082019050919050565b600060208201905081810360008301526145fa816145be565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061465d602683613b51565b915061466882614601565b604082019050919050565b6000602082019050818103600083015261468c81614650565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146c9602083613b51565b91506146d482614693565b602082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061475b602483613b51565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147ed602283613b51565b91506147f882614791565b604082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614859601d83613b51565b915061486482614823565b602082019050919050565b600060208201905081810360008301526148888161484c565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b60006148c5601483613b51565b91506148d08261488f565b602082019050919050565b600060208201905081810360008301526148f4816148b8565b9050919050565b600060c0820190506149106000830189613ff3565b61491d6020830188613ff3565b61492a6040830187613b1c565b6149376060830186613b1c565b6149446080830185613b1c565b61495160a0830184613b1c565b979650505050505050565b600061496782613b12565b915061497283613b12565b925082820261498081613b12565b9150828204841483151761499757614996614183565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149d882613b12565b91506149e383613b12565b9250826149f3576149f261499e565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000614a52614a4d614a4884614a2d565b613e6d565b613b12565b9050919050565b614a6281614a37565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a9d81613c1d565b82525050565b6000614aaf8383614a94565b60208301905092915050565b6000602082019050919050565b6000614ad382614a68565b614add8185614a73565b9350614ae883614a84565b8060005b83811015614b19578151614b008882614aa3565b9750614b0b83614abb565b925050600181019050614aec565b5085935050505092915050565b600060c082019050614b3b6000830189613b1c565b614b486020830188614a59565b8181036040830152614b5a8187614ac8565b9050614b696060830186613ff3565b614b766080830185613ff3565b614b8360a0830184613b1c565b979650505050505050565b600060a082019050614ba36000830188613b1c565b614bb06020830187614a59565b8181036040830152614bc28186614ac8565b9050614bd16060830185613ff3565b614bde6080830184613b1c565b9695505050505050565b600061010082019050614bfe600083018b613b1c565b614c0b602083018a613b1c565b614c186040830189613b1c565b614c256060830188613b1c565b614c326080830187613b1c565b614c3f60a0830186613b1c565b614c4c60c0830185613b1c565b614c5960e0830184613b1c565b9998505050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614cc2602583613b51565b9150614ccd82614c66565b604082019050919050565b60006020820190508181036000830152614cf181614cb5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614d54602383613b51565b9150614d5f82614cf8565b604082019050919050565b60006020820190508181036000830152614d8381614d47565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614de6602683613b51565b9150614df182614d8a565b604082019050919050565b60006020820190508181036000830152614e1581614dd9565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614e78602a83613b51565b9150614e8382614e1c565b604082019050919050565b60006020820190508181036000830152614ea781614e6b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c082019050614ef26000830189613ff3565b614eff6020830188613b1c565b614f0c6040830187614a59565b614f196060830186614a59565b614f266080830185613ff3565b614f3360a0830184613b1c565b979650505050505050565b600080600060608486031215614f5757614f56613bf8565b5b6000614f658682870161421a565b9350506020614f768682870161421a565b9250506040614f878682870161421a565b9150509250925092565b6000606082019050614fa66000830186613b1c565b614fb36020830185613b1c565b614fc06040830184613b1c565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615024602683613b51565b915061502f82614fc8565b604082019050919050565b6000602082019050818103600083015261505381615017565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615090601d83613b51565b915061509b8261505a565b602082019050919050565b600060208201905081810360008301526150bf81615083565b905091905056fea2646970667358221220f7408e3ec91b5774681225e547dfe764a4366d26908b49f5338842d18fdba3b864736f6c63430008130033000000000000000000000000912ce59144191c1204e64559fe8253a0e49e65480000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Deployed Bytecode
0x60806040526004361061039b5760003560e01c806382d20116116101dc578063b8c6113011610102578063cdba31fd116100a0578063e1e5a66d1161006f578063e1e5a66d14610d61578063e5e31b1314610d8c578063f2fde38b14610dc9578063fb5f27fb14610df2576103a2565b8063cdba31fd14610ca3578063d830678614610cce578063dbd6c48914610cf9578063dd62ed3e14610d24576103a2565b8063bfa382b5116100dc578063bfa382b514610bf9578063c2b7bbb614610c10578063c6d2577d14610c4d578063cb806e0714610c78576103a2565b8063b8c6113014610b68578063bdf391cc14610b91578063bf56b37114610bce576103a2565b806395d89b411161017a578063aac46c9511610149578063aac46c9514610abe578063ace1880114610ae7578063b6309f6814610b12578063b7eed4c414610b3d576103a2565b806395d89b41146109dc578063a457c2d714610a07578063a5bc508514610a44578063a9059cbb14610a81576103a2565b806386c8782f116101b657806386c8782f146109465780638da5cb5b146109715780638fbbd7501461099c5780639272293c146109b3576103a2565b806382d20116146108c557806386013940146108f0578063861faf5f1461091b576103a2565b80632d2f244b116102c1578063531484161161025f57806370a082311161022e57806370a082311461080957806370c8810e14610846578063715018a6146108715780638072250b14610888576103a2565b8063531484161461075f578063658d4b7f1461078a5780636c470595146107b35780636ddd1713146107de576103a2565b8063395093511161029b57806339509351146106a55780633f4218e0146106e25780634460d3cf1461071f5780634fab9e4c14610748576103a2565b80632d2f244b14610638578063313ce56714610663578063364333f41461068e576103a2565b806312835c5e1161033957806318abb6351161030857806318abb6351461057c578063234a2daa146105a557806323b872dd146105d05780632b112e491461060d576103a2565b806312835c5e146104d057806315674e8e146104fb578063180b0d7e1461052657806318160ddd14610551576103a2565b806306fdde031161037557806306fdde0314610414578063095ea7b31461043f5780630ca5979b1461047c5780631107b3a5146104a5576103a2565b806301339c21146103a7578063017e24e1146103be5780630323aac7146103e9576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610e1d565b005b3480156103ca57600080fd5b506103d3610e7a565b6040516103e09190613b2b565b60405180910390f35b3480156103f557600080fd5b506103fe610e80565b60405161040b9190613b2b565b60405180910390f35b34801561042057600080fd5b50610429610e91565b6040516104369190613bd6565b60405180910390f35b34801561044b57600080fd5b5061046660048036038101906104619190613c87565b610f23565b6040516104739190613ce2565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613cfd565b610f46565b005b3480156104b157600080fd5b506104ba610fbb565b6040516104c79190613b2b565b60405180910390f35b3480156104dc57600080fd5b506104e5610fc1565b6040516104f29190613b2b565b60405180910390f35b34801561050757600080fd5b50610510610fc7565b60405161051d9190613b2b565b60405180910390f35b34801561053257600080fd5b5061053b610fcd565b6040516105489190613b2b565b60405180910390f35b34801561055d57600080fd5b50610566610fd3565b6040516105739190613b2b565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190613d9f565b610fdd565b005b3480156105b157600080fd5b506105ba611172565b6040516105c79190613b2b565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190613e1a565b611178565b6040516106049190613ce2565b60405180910390f35b34801561061957600080fd5b506106226111a5565b60405161062f9190613b2b565b60405180910390f35b34801561064457600080fd5b5061064d6111dd565b60405161065a9190613ecc565b60405180910390f35b34801561066f57600080fd5b50610678611203565b6040516106859190613f03565b60405180910390f35b34801561069a57600080fd5b506106a361120c565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613c87565b611359565b6040516106d99190613ce2565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613f1e565b611390565b6040516107169190613ce2565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613f1e565b6113b0565b005b34801561075457600080fd5b5061075d61145f565b005b34801561076b57600080fd5b506107746115ac565b6040516107819190613b2b565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613f77565b6115b2565b005b3480156107bf57600080fd5b506107c8611615565b6040516107d59190613b2b565b60405180910390f35b3480156107ea57600080fd5b506107f361161b565b6040516108009190613ce2565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613f1e565b61162e565b60405161083d9190613b2b565b60405180910390f35b34801561085257600080fd5b5061085b611676565b6040516108689190613b2b565b60405180910390f35b34801561087d57600080fd5b5061088661167c565b005b34801561089457600080fd5b506108af60048036038101906108aa9190613f1e565b611690565b6040516108bc9190613ce2565b60405180910390f35b3480156108d157600080fd5b506108da6116b0565b6040516108e79190613b2b565b60405180910390f35b3480156108fc57600080fd5b506109056116b6565b6040516109129190613ce2565b60405180910390f35b34801561092757600080fd5b506109306116c9565b60405161093d9190613fd8565b60405180910390f35b34801561095257600080fd5b5061095b6116ef565b6040516109689190613b2b565b60405180910390f35b34801561097d57600080fd5b506109866116f5565b6040516109939190614002565b60405180910390f35b3480156109a857600080fd5b506109b161171f565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190613cfd565b611731565b005b3480156109e857600080fd5b506109f16117a6565b6040516109fe9190613bd6565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613c87565b611838565b604051610a3b9190613ce2565b60405180910390f35b348015610a5057600080fd5b50610a6b6004803603810190610a669190613f1e565b6118af565b604051610a789190613ce2565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa39190613c87565b611943565b604051610ab59190613ce2565b60405180910390f35b348015610aca57600080fd5b50610ae56004803603810190610ae0919061401d565b61195f565b005b348015610af357600080fd5b50610afc611984565b604051610b099190613b2b565b60405180910390f35b348015610b1e57600080fd5b50610b2761198a565b604051610b349190613b2b565b60405180910390f35b348015610b4957600080fd5b50610b52611990565b604051610b5f9190613b2b565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a919061401d565b611996565b005b348015610b9d57600080fd5b50610bb86004803603810190610bb3919061404a565b6119bb565b604051610bc59190614002565b60405180910390f35b348015610bda57600080fd5b50610be3611a30565b604051610bf09190613b2b565b60405180910390f35b348015610c0557600080fd5b50610c0e611a36565b005b348015610c1c57600080fd5b50610c376004803603810190610c329190613f1e565b611b49565b604051610c449190613ce2565b60405180910390f35b348015610c5957600080fd5b50610c62611bdd565b604051610c6f9190613b2b565b60405180910390f35b348015610c8457600080fd5b50610c8d611be3565b604051610c9a9190613b2b565b60405180910390f35b348015610caf57600080fd5b50610cb8611be9565b604051610cc59190613b2b565b60405180910390f35b348015610cda57600080fd5b50610ce3611bef565b604051610cf09190613ce2565b60405180910390f35b348015610d0557600080fd5b50610d0e611c02565b604051610d1b9190613b2b565b60405180910390f35b348015610d3057600080fd5b50610d4b6004803603810190610d469190614077565b611c08565b604051610d589190613b2b565b60405180910390f35b348015610d6d57600080fd5b50610d76611c8f565b604051610d839190613b2b565b60405180910390f35b348015610d9857600080fd5b50610db36004803603810190610dae9190613f1e565b611c95565b604051610dc09190613ce2565b60405180910390f35b348015610dd557600080fd5b50610df06004803603810190610deb9190613f1e565b611cb2565b005b348015610dfe57600080fd5b50610e07611d35565b604051610e149190613b2b565b60405180910390f35b610e25611d3b565b600060275414610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6190614103565b60405180910390fd5b4360278190555042602881905550565b600a5481565b6000610e8c602a611db9565b905090565b606060038054610ea090614152565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90614152565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b5050505050905090565b600080610f2e611dce565b9050610f3b818585611dd6565b600191505092915050565b610f4e611d3b565b866012819055508560138190555084601481905550836015819055508260168190555081601781905550806011819055508082848688610f8e91906141b2565b610f9891906141b2565b610fa291906141b2565b610fac91906141b2565b60188190555050505050505050565b601c5481565b601f5481565b60115481565b60105481565b6000600254905090565b610fe5611d3b565b84602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60195481565b600080611183611dce565b9050611190858285611f9f565b61119b85858561202b565b9150509392505050565b60006111b1600061162e565b6111bc61dead61162e565b6111c4610fd3565b6111ce91906141e6565b6111d891906141e6565b905090565b602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006905090565b611214611d3b565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61125a611dce565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112b59190614002565b602060405180830381865afa1580156112d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f6919061422f565b6040518363ffffffff1660e01b815260040161131392919061425c565b6020604051808303816000875af1158015611332573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611356919061429a565b50565b600080611364611dce565b90506113858185856113768589611c08565b61138091906141b2565b611dd6565b600191505092915050565b60066020528060005260406000206000915054906101000a900460ff1681565b6113b8611d3b565b61145c338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113f59190614002565b602060405180830381865afa158015611412573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611436919061422f565b8373ffffffffffffffffffffffffffffffffffffffff166123239092919063ffffffff16565b50565b611467611d3b565b602960009054906101000a900460ff16156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614313565b60405180910390fd5b60007f0000000000000000000000006eccab422d763ac031210895c81787e87b43a65273ffffffffffffffffffffffffffffffffffffffff1663c9c653967f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1306040518363ffffffff1660e01b8152600401611534929190614333565b6020604051808303816000875af1158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190614371565b905061158d81602a6123a990919063ffffffff16565b506001602960006101000a81548160ff02191690831515021790555050565b60205481565b6115ba611d3b565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60155481565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b611684611d3b565b61168e60006123d9565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60145481565b600560159054906101000a900460ff1681565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611727611d3b565b61172f61249f565b565b611739611d3b565b86601a8190555085601b8190555084601c8190555083601d8190555082601e8190555081601f8190555080601981905550808284868861177991906141b2565b61178391906141b2565b61178d91906141b2565b61179791906141b2565b60208190555050505050505050565b6060600480546117b590614152565b80601f01602080910402602001604051908101604052809291908181526020018280546117e190614152565b801561182e5780601f106118035761010080835404028352916020019161182e565b820191906000526020600020905b81548152906001019060200180831161181157829003601f168201915b5050505050905090565b600080611843611dce565b905060006118518286611c08565b905083811015611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614410565b60405180910390fd5b6118a38286868403611dd6565b60019250505092915050565b60006118b9611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f9061447c565b60405180910390fd5b61193c82602a612e9490919063ffffffff16565b9050919050565b6000611957611950611dce565b848461202b565b905092915050565b611967611d3b565b80600560156101000a81548160ff02191690831515021790555050565b601e5481565b601b5481565b601d5481565b61199e611d3b565b80600560146101000a81548160ff02191690831515021790555050565b600060016119c9602a611db9565b6119d391906141e6565b821115611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c906144e8565b60405180910390fd5b611a2982602a612ec490919063ffffffff16565b9050919050565b60275481565b611a3e611d3b565b60004790506000611a4d611dce565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115611a7f57611a7e614508565b5b6040519080825280601f01601f191660200182016040528015611ab15781602001600182028036833780820191505090505b50604051611abf919061457e565b60006040518083038185875af1925050503d8060008114611afc576040519150601f19603f3d011682016040523d82523d6000602084013e611b01565b606091505b5050905080611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c906145e1565b60405180910390fd5b5050565b6000611b53611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb99061447c565b60405180910390fd5b611bd682602a6123a990919063ffffffff16565b9050919050565b60285481565b60095481565b60175481565b600560169054906101000a900460ff1681565b601a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60135481565b6000611cab82602a612ede90919063ffffffff16565b9050919050565b611cba611d3b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2090614673565b60405180910390fd5b611d32816123d9565b50565b60185481565b611d43611dce565b73ffffffffffffffffffffffffffffffffffffffff16611d616116f5565b73ffffffffffffffffffffffffffffffffffffffff1614611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906146df565b60405180910390fd5b565b6000611dc782600001612f0e565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c90614771565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614803565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f929190613b2b565b60405180910390a3505050565b6000611fab8484611c08565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120255781811015612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e9061486f565b60405180910390fd5b6120248484848403611dd6565b5b50505050565b6000600560169054906101000a900460ff16156120565761204d848484612f1f565b6001905061231c565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120ef576120af613195565b6120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e5906148db565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156121955750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156121a557506121a4613195565b5b905060008086905060008690506121bb88611c95565b15612260576121c86131a2565b60019250869150879050602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166367d198a689886040518363ffffffff1660e01b815260040161222f92919061425c565b600060405180830381600087803b15801561224957600080fd5b505af192505050801561225a575060015b50612285565b61226987611c95565b1561227f576122766131ec565b60029250612284565b600093505b5b61228d613236565b1561229b5761229a61249f565b5b6000846122a857866122b3565b6122b289886132a3565b5b90506122c0898983612f1f565b6000841115612312577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d754838389876122f66111a5565b42604051612309969594939291906148fb565b60405180910390a15b6001955050505050505b9392505050565b6123a48363a9059cbb60e01b848460405160240161234292919061425c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506132e3565b505050565b60006123d1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6133aa565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff02191690831515021790555060006124c53061162e565b90506124f2307f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d83611dd6565b6000600f5460085483612505919061495c565b61250f91906149cd565b90506000600f54600b5484612524919061495c565b61252e91906149cd565b90506000600f54600d5485612543919061495c565b61254d91906149cd565b9050828461255b91906141e6565b9350818461256991906141e6565b9350808461257791906141e6565b93506000600367ffffffffffffffff81111561259657612595614508565b5b6040519080825280602002602001820160405280156125c45781602001602082028036833780820191505090505b50905030816000815181106125dc576125db6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab18160018151811061264b5761264a6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106126bc576126bb6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127549190614002565b602060405180830381865afa158015612771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612795919061422f565b90507f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b81526004016127fc96959493929190614b26565b600060405180830381600087803b15801561281657600080fd5b505af1925050508015612827575060015b6128c7577f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b815260040161288d959493929190614b8e565b600060405180830381600087803b1580156128a757600080fd5b505af19250505080156128b8575060015b156128c257600191505b6128cc565b600191505b816128dd5750505050505050612e77565b6128ea3061dead88612f1f565b61291730602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611dd6565b602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bdc8a1f856040518263ffffffff1660e01b81526004016129729190613b2b565b600060405180830381600087803b15801561298c57600080fd5b505af11580156129a0573d6000803e3d6000fd5b50505050600081602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a029190614002565b602060405180830381865afa158015612a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a43919061422f565b612a4d91906141e6565b90506000600d54600b54600854600f54612a6791906141e6565b612a7191906141e6565b612a7b91906141e6565b905060008160095484612a8e919061495c565b612a9891906149cd565b9050600082600a5485612aab919061495c565b612ab591906149cd565b9050600083600c5486612ac8919061495c565b612ad291906149cd565b9050600081838588612ae491906141e6565b612aee91906141e6565b612af891906141e6565b9050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401612b7992919061425c565b6020604051808303816000875af1158015612b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbc919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401612c3c92919061425c565b6020604051808303816000875af1158015612c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7f919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612cff92919061425c565b6020604051808303816000875af1158015612d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d42919061429a565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612dc292919061425c565b6020604051808303816000875af1158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e05919061429a565b50600560159054906101000a900460ff1615612e2457612e2361341a565b5b7f310a031bae0df2b1a8ba6de615833770c757a404a7395cc0121c13975e67c0b08c85858e868f8742604051612e61989796959493929190614be8565b60405180910390a1505050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612ebc836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6136c4565b905092915050565b6000612ed383600001836137d8565b60001c905092915050565b6000612f06836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613803565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8590614cd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490614d6a565b60405180910390fd5b613008838383613826565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561308e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308590614dfc565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161317c9190613b2b565b60405180910390a361318f84848461382b565b50505050565b6000806027541415905090565b601154600881905550601254600981905550601354600a81905550601454600b81905550601554600c81905550601654600d81905550601754600e81905550601854600f81905550565b601954600881905550601a54600981905550601b54600a81905550601c54600b81905550601d54600c81905550601e54600d81905550601f54600e81905550602054600f81905550565b6000600560169054906101000a900460ff161580156132615750600560149054906101000a900460ff165b80156132715750613270613195565b5b8015613285575060006132833061162e565b115b801561329e575061329c613297611dce565b611c95565b155b905090565b600080601054600f54846132b7919061495c565b6132c191906149cd565b90506132ce843083612f1f565b80836132da91906141e6565b91505092915050565b6000613345826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138309092919063ffffffff16565b90506000815111156133a55780806020019051810190613365919061429a565b6133a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339b90614e8e565b60405180910390fd5b5b505050565b60006133b68383613803565b61340f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613414565b600090505b92915050565b6000600267ffffffffffffffff81111561343757613436614508565b5b6040519080825280602002602001820160405280156134655781602001602082028036833780820191505090505b509050308160008151811061347d5761347c6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1816001815181106134ec576134eb6149fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006135313061162e565b9050600060028261354291906149cd565b90506103e8811015613556575050506136c2565b600047905060007f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016135c296959493929190614b26565b600060405180830381600087803b1580156135dc57600080fd5b505af19250505080156135ed575060015b61368d577f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b8152600401613653959493929190614b8e565b600060405180830381600087803b15801561366d57600080fd5b505af192505050801561367e575060015b1561368857600190505b613692565b600190505b806136a15750505050506136c2565b600082476136af91906141e6565b90506136bb8482613848565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146137cc5760006001826136f691906141e6565b905060006001866000018054905061370e91906141e6565b905081811461377d57600086600001828154811061372f5761372e6149fe565b5b9060005260206000200154905080876000018481548110613753576137526149fe565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061379157613790614eae565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506137d2565b60009150505b92915050565b60008260000182815481106137f0576137ef6149fe565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b606061383f848460008561395d565b90509392505050565b613873307f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d84611dd6565b7f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b81526004016138d996959493929190614edd565b60606040518083038185885af19350505050801561391557506040513d601f19601f820116820180604052508101906139129190614f3e565b60015b15613959575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2482824260405161395093929190614f91565b60405180910390a15b5050565b6060824710156139a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139999061503a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139cb919061457e565b60006040518083038185875af1925050503d8060008114613a08576040519150601f19603f3d011682016040523d82523d6000602084013e613a0d565b606091505b5091509150613a1e87838387613a2a565b92505050949350505050565b60608315613a8c576000835103613a8457613a4485613a9f565b613a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7a906150a6565b60405180910390fd5b5b829050613a97565b613a968383613ac2565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115613ad55781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b099190613bd6565b60405180910390fd5b6000819050919050565b613b2581613b12565b82525050565b6000602082019050613b406000830184613b1c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b80578082015181840152602081019050613b65565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ba882613b46565b613bb28185613b51565b9350613bc2818560208601613b62565b613bcb81613b8c565b840191505092915050565b60006020820190508181036000830152613bf08184613b9d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c2882613bfd565b9050919050565b613c3881613c1d565b8114613c4357600080fd5b50565b600081359050613c5581613c2f565b92915050565b613c6481613b12565b8114613c6f57600080fd5b50565b600081359050613c8181613c5b565b92915050565b60008060408385031215613c9e57613c9d613bf8565b5b6000613cac85828601613c46565b9250506020613cbd85828601613c72565b9150509250929050565b60008115159050919050565b613cdc81613cc7565b82525050565b6000602082019050613cf76000830184613cd3565b92915050565b600080600080600080600060e0888a031215613d1c57613d1b613bf8565b5b6000613d2a8a828b01613c72565b9750506020613d3b8a828b01613c72565b9650506040613d4c8a828b01613c72565b9550506060613d5d8a828b01613c72565b9450506080613d6e8a828b01613c72565b93505060a0613d7f8a828b01613c72565b92505060c0613d908a828b01613c72565b91505092959891949750929550565b600080600080600060a08688031215613dbb57613dba613bf8565b5b6000613dc988828901613c46565b9550506020613dda88828901613c46565b9450506040613deb88828901613c46565b9350506060613dfc88828901613c46565b9250506080613e0d88828901613c46565b9150509295509295909350565b600080600060608486031215613e3357613e32613bf8565b5b6000613e4186828701613c46565b9350506020613e5286828701613c46565b9250506040613e6386828701613c72565b9150509250925092565b6000819050919050565b6000613e92613e8d613e8884613bfd565b613e6d565b613bfd565b9050919050565b6000613ea482613e77565b9050919050565b6000613eb682613e99565b9050919050565b613ec681613eab565b82525050565b6000602082019050613ee16000830184613ebd565b92915050565b600060ff82169050919050565b613efd81613ee7565b82525050565b6000602082019050613f186000830184613ef4565b92915050565b600060208284031215613f3457613f33613bf8565b5b6000613f4284828501613c46565b91505092915050565b613f5481613cc7565b8114613f5f57600080fd5b50565b600081359050613f7181613f4b565b92915050565b60008060408385031215613f8e57613f8d613bf8565b5b6000613f9c85828601613c46565b9250506020613fad85828601613f62565b9150509250929050565b6000613fc282613e99565b9050919050565b613fd281613fb7565b82525050565b6000602082019050613fed6000830184613fc9565b92915050565b613ffc81613c1d565b82525050565b60006020820190506140176000830184613ff3565b92915050565b60006020828403121561403357614032613bf8565b5b600061404184828501613f62565b91505092915050565b6000602082840312156140605761405f613bf8565b5b600061406e84828501613c72565b91505092915050565b6000806040838503121561408e5761408d613bf8565b5b600061409c85828601613c46565b92505060206140ad85828601613c46565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b60006140ed601083613b51565b91506140f8826140b7565b602082019050919050565b6000602082019050818103600083015261411c816140e0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061416a57607f821691505b60208210810361417d5761417c614123565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141bd82613b12565b91506141c883613b12565b92508282019050808211156141e0576141df614183565b5b92915050565b60006141f182613b12565b91506141fc83613b12565b925082820390508181111561421457614213614183565b5b92915050565b60008151905061422981613c5b565b92915050565b60006020828403121561424557614244613bf8565b5b60006142538482850161421a565b91505092915050565b60006040820190506142716000830185613ff3565b61427e6020830184613b1c565b9392505050565b60008151905061429481613f4b565b92915050565b6000602082840312156142b0576142af613bf8565b5b60006142be84828501614285565b91505092915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b60006142fd601383613b51565b9150614308826142c7565b602082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b60006040820190506143486000830185613ff3565b6143556020830184613ff3565b9392505050565b60008151905061436b81613c2f565b92915050565b60006020828403121561438757614386613bf8565b5b60006143958482850161435c565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006143fa602583613b51565b91506144058261439e565b604082019050919050565b60006020820190508181036000830152614429816143ed565b9050919050565b7f4149444f47453a207061697220697320746865207a65726f2061646472657373600082015250565b6000614466602083613b51565b915061447182614430565b602082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f4149444f47453a20696e646578206f7574206f6620626f756e64730000000000600082015250565b60006144d2601b83613b51565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061455882614537565b6145628185614542565b9350614572818560208601613b62565b80840191505092915050565b600061458a828461454d565b915081905092915050565b7f4149444f47453a204554485f5452414e534645525f4641494c45440000000000600082015250565b60006145cb601b83613b51565b91506145d682614595565b602082019050919050565b600060208201905081810360008301526145fa816145be565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061465d602683613b51565b915061466882614601565b604082019050919050565b6000602082019050818103600083015261468c81614650565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146c9602083613b51565b91506146d482614693565b602082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061475b602483613b51565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147ed602283613b51565b91506147f882614791565b604082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614859601d83613b51565b915061486482614823565b602082019050919050565b600060208201905081810360008301526148888161484c565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b60006148c5601483613b51565b91506148d08261488f565b602082019050919050565b600060208201905081810360008301526148f4816148b8565b9050919050565b600060c0820190506149106000830189613ff3565b61491d6020830188613ff3565b61492a6040830187613b1c565b6149376060830186613b1c565b6149446080830185613b1c565b61495160a0830184613b1c565b979650505050505050565b600061496782613b12565b915061497283613b12565b925082820261498081613b12565b9150828204841483151761499757614996614183565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149d882613b12565b91506149e383613b12565b9250826149f3576149f261499e565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000614a52614a4d614a4884614a2d565b613e6d565b613b12565b9050919050565b614a6281614a37565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a9d81613c1d565b82525050565b6000614aaf8383614a94565b60208301905092915050565b6000602082019050919050565b6000614ad382614a68565b614add8185614a73565b9350614ae883614a84565b8060005b83811015614b19578151614b008882614aa3565b9750614b0b83614abb565b925050600181019050614aec565b5085935050505092915050565b600060c082019050614b3b6000830189613b1c565b614b486020830188614a59565b8181036040830152614b5a8187614ac8565b9050614b696060830186613ff3565b614b766080830185613ff3565b614b8360a0830184613b1c565b979650505050505050565b600060a082019050614ba36000830188613b1c565b614bb06020830187614a59565b8181036040830152614bc28186614ac8565b9050614bd16060830185613ff3565b614bde6080830184613b1c565b9695505050505050565b600061010082019050614bfe600083018b613b1c565b614c0b602083018a613b1c565b614c186040830189613b1c565b614c256060830188613b1c565b614c326080830187613b1c565b614c3f60a0830186613b1c565b614c4c60c0830185613b1c565b614c5960e0830184613b1c565b9998505050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614cc2602583613b51565b9150614ccd82614c66565b604082019050919050565b60006020820190508181036000830152614cf181614cb5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614d54602383613b51565b9150614d5f82614cf8565b604082019050919050565b60006020820190508181036000830152614d8381614d47565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614de6602683613b51565b9150614df182614d8a565b604082019050919050565b60006020820190508181036000830152614e1581614dd9565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614e78602a83613b51565b9150614e8382614e1c565b604082019050919050565b60006020820190508181036000830152614ea781614e6b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c082019050614ef26000830189613ff3565b614eff6020830188613b1c565b614f0c6040830187614a59565b614f196060830186614a59565b614f266080830185613ff3565b614f3360a0830184613b1c565b979650505050505050565b600080600060608486031215614f5757614f56613bf8565b5b6000614f658682870161421a565b9350506020614f768682870161421a565b9250506040614f878682870161421a565b9150509250925092565b6000606082019050614fa66000830186613b1c565b614fb36020830185613b1c565b614fc06040830184613b1c565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615024602683613b51565b915061502f82614fc8565b604082019050919050565b6000602082019050818103600083015261505381615017565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615090601d83613b51565b915061509b8261505a565b602082019050919050565b600060208201905081810360008301526150bf81615083565b905091905056fea2646970667358221220f7408e3ec91b5774681225e547dfe764a4366d26908b49f5338842d18fdba3b864736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000912ce59144191c1204e64559fe8253a0e49e65480000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
-----Decoded View---------------
Arg [0] : _backToken (address): 0x912CE59144191C1204E64559FE8253a0e49E6548
Arg [1] : _factory (address): 0x6EcCab422D763aC031210895C81787E87B43A652
Arg [2] : _swapRouter (address): 0xc873fEcbd354f5A56E00E710B90EF4201db2448d
Arg [3] : _weth (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548
Arg [1] : 0000000000000000000000006eccab422d763ac031210895c81787e87b43a652
Arg [2] : 000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d
Arg [3] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Deployed Bytecode Sourcemap
56880:13980:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67863:182;;;;;;;;;;;;;:::i;:::-;;57739:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70531:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6672:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9023:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68053:576;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58439:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58565:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57990;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57927:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7792:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69230:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58322:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60464:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67687:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58769:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60207:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67544:135;;;;;;;;;;;;;:::i;:::-;;10508:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57562:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67099:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59961:238;;;;;;;;;;;;;:::i;:::-;;58603:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69674:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58147:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57356:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7963:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58028:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36028:103;;;;;;;;;;;;;:::i;:::-;;57612:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58104:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57393:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58839:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58188:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35380:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66047:68;;;;;;;;;;;;;:::i;:::-;;68637:585;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6891:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11249:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70341:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60307:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69913:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58525:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58400:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58483:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69801:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70637:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58869:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67279:257;;;;;;;;;;;;;:::i;:::-;;70154:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58901:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57710:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58227:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57440:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58361:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8552:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58066:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70036:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36286:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58264:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67863:182;35266:13;:11;:13::i;:::-;67931:1:::1;67917:10;;:15;67909:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;67977:12;67964:10;:25;;;;68022:15;68000:19;:37;;;;67863:182::o:0;57739:22::-;;;;:::o;70531:98::-;70579:7;70606:15;:6;:13;:15::i;:::-;70599:22;;70531:98;:::o;6672:100::-;6726:13;6759:5;6752:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6672:100;:::o;9023:201::-;9106:4;9123:13;9139:12;:10;:12::i;:::-;9123:28;;9162:32;9171:5;9178:7;9187:6;9162:8;:32::i;:::-;9212:4;9205:11;;;9023:201;;;;:::o;68053:576::-;35266:13;:11;:13::i;:::-;68320:8:::1;68307:10;:21;;;;68352:8;68339:10;:21;;;;68389:13;68371:15;:31;;;;68429:11;68413:13;:27;;;;68465:9;68451:11;:23;;;;68497:7;68485:9;:19;;;;68528:8;68515:10;:21;;;;68613:8;68603:7;68591:9;68577:11;68561:13;:27;;;;:::i;:::-;:39;;;;:::i;:::-;:49;;;;:::i;:::-;:60;;;;:::i;:::-;68547:11;:74;;;;68053:576:::0;;;;;;;:::o;58439:37::-;;;;:::o;58565:31::-;;;;:::o;57990:::-;;;;:::o;57927:37::-;;;;:::o;7792:108::-;7853:7;7880:12;;7873:19;;7792:108;:::o;69230:436::-;35266:13;:11;:13::i;:::-;69458:11:::1;69445:10;;:24;;;;;;;;;;;;;;;;;;69493:11;69480:10;;:24;;;;;;;;;;;;;;;;;;69529:12;69515:11;;:26;;;;;;;;;;;;;;;;;;69577:14;69552:13;;:40;;;;;;;;;;;;;;;;;;69615:10;69603:9;;:22;;;;;;;;;;;;;;;;;;69648:10;69636:9;;:22;;;;;;;;;;;;;;;;;;69230:436:::0;;;;;:::o;58322:32::-;;;;:::o;60464:269::-;60570:4;60587:15;60605:12;:10;:12::i;:::-;60587:30;;60628:40;60644:6;60652:7;60661:6;60628:15;:40::i;:::-;60686:39;60699:6;60707:9;60718:6;60686:12;:39::i;:::-;60679:46;;;60464:269;;;;;:::o;67687:137::-;67740:7;67801:15;59221:42;67801:9;:15::i;:::-;67783;59140:42;67783:9;:15::i;:::-;67767:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:49;;;;:::i;:::-;67760:56;;67687:137;:::o;58769:29::-;;;;;;;;;;;;;:::o;60207:92::-;60265:5;60290:1;60283:8;;60207:92;:::o;67544:135::-;35266:13;:11;:13::i;:::-;67603:9:::1;;;;;;;;;;;:18;;;67622:12;:10;:12::i;:::-;67636:9;;;;;;;;;;;:19;;;67664:4;67636:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67603:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67544:135::o:0;10508:238::-;10596:4;10613:13;10629:12;:10;:12::i;:::-;10613:28;;10652:64;10661:5;10668:7;10705:10;10677:25;10687:5;10694:7;10677:9;:25::i;:::-;:38;;;;:::i;:::-;10652:8;:64::i;:::-;10734:4;10727:11;;;10508:238;;;;:::o;57562:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;67099:172::-;35266:13;:11;:13::i;:::-;67172:91:::1;67206:10;67224:12;67217:30;;;67256:4;67217:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67179:12;67172:33;;;;:91;;;;;:::i;:::-;67099:172:::0;:::o;59961:238::-;35266:13;:11;:13::i;:::-;60026:11:::1;;;;;;;;;;;60025:12;60017:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;60072:12;60087:7;:18;;;60114:4;60129;60087:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60072:63;;60146:16;60157:4;60146:6;:10;;:16;;;;:::i;:::-;;60187:4;60173:11;;:18;;;;;;;;;;;;;;;;;;60006:193;59961:238::o:0;58603:34::-;;;;:::o;69674:119::-;35266:13;:11;:13::i;:::-;69779:6:::1;69757:11;:19;69769:6;69757:19;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;69674:119:::0;;:::o;58147:34::-;;;;:::o;57356:30::-;;;;;;;;;;;;;:::o;7963:127::-;8037:7;8064:9;:18;8074:7;8064:18;;;;;;;;;;;;;;;;8057:25;;7963:127;;;:::o;58028:31::-;;;;:::o;36028:103::-;35266:13;:11;:13::i;:::-;36093:30:::1;36120:1;36093:18;:30::i;:::-;36028:103::o:0;57612:59::-;;;;;;;;;;;;;;;;;;;;;;:::o;58104:36::-;;;;:::o;57393:38::-;;;;;;;;;;;;;:::o;58839:23::-;;;;;;;;;;;;;:::o;58188:32::-;;;;:::o;35380:87::-;35426:7;35453:6;;;;;;;;;;;35446:13;;35380:87;:::o;66047:68::-;35266:13;:11;:13::i;:::-;66097:10:::1;:8;:10::i;:::-;66047:68::o:0;68637:585::-;35266:13;:11;:13::i;:::-;68906:8:::1;68892:11;:22;;;;68939:8;68925:11;:22;;;;68977:13;68958:16;:32;;;;69018:11;69001:14;:28;;;;69055:9;69040:12;:24;;;;69088:7;69075:10;:20;;;;69120:8;69106:11;:22;;;;69206:8;69196:7;69184:9;69170:11;69154:13;:27;;;;:::i;:::-;:39;;;;:::i;:::-;:49;;;;:::i;:::-;:60;;;;:::i;:::-;69139:12;:75;;;;68637:585:::0;;;;;;;:::o;6891:104::-;6947:13;6980:7;6973:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6891:104;:::o;11249:436::-;11342:4;11359:13;11375:12;:10;:12::i;:::-;11359:28;;11398:24;11425:25;11435:5;11442:7;11425:9;:25::i;:::-;11398:52;;11489:15;11469:16;:35;;11461:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11582:60;11591:5;11598:7;11626:15;11607:16;:34;11582:8;:60::i;:::-;11673:4;11666:11;;;;11249:436;;;;:::o;70341:182::-;70398:4;35266:13;:11;:13::i;:::-;70439:1:::1;70423:18;;:4;:18;;::::0;70415:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;70496:19;70510:4;70496:6;:13;;:19;;;;:::i;:::-;70489:26;;70341:182:::0;;;:::o;60307:149::-;60386:4;60410:38;60423:12;:10;:12::i;:::-;60437:2;60441:6;60410:12;:38::i;:::-;60403:45;;60307:149;;;;:::o;69913:115::-;35266:13;:11;:13::i;:::-;70012:8:::1;69990:19;;:30;;;;;;;;;;;;;;;;;;69913:115:::0;:::o;58525:33::-;;;;:::o;58400:32::-;;;;:::o;58483:35::-;;;;:::o;69801:104::-;35266:13;:11;:13::i;:::-;69889:8:::1;69875:11;;:22;;;;;;;;;;;;;;;;;;69801:104:::0;:::o;70637:183::-;70690:7;70745:1;70727:15;:6;:13;:15::i;:::-;:19;;;;:::i;:::-;70718:5;:28;;70710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70796:16;70806:5;70796:6;:9;;:16;;;;:::i;:::-;70789:23;;70637:183;;;:::o;58869:25::-;;;;:::o;67279:257::-;35266:13;:11;:13::i;:::-;67341:17:::1;67361:21;67341:41;;67394:12;67420;:10;:12::i;:::-;67412:26;;67446:9;67467:1;67457:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67412:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67393:77;;;67489:7;67481:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;67330:206;;67279:257::o:0;70154:179::-;70211:4;35266:13;:11;:13::i;:::-;70252:1:::1;70236:18;;:4;:18;;::::0;70228:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;70309:16;70320:4;70309:6;:10;;:16;;;;:::i;:::-;70302:23;;70154:179:::0;;;:::o;58901:34::-;;;;:::o;57710:22::-;;;;:::o;58227:30::-;;;;:::o;57440:18::-;;;;;;;;;;;;;:::o;58361:32::-;;;;:::o;8552:151::-;8641:7;8668:11;:18;8680:5;8668:18;;;;;;;;;;;;;;;:27;8687:7;8668:27;;;;;;;;;;;;;;;;8661:34;;8552:151;;;;:::o;58066:31::-;;;;:::o;70036:110::-;70090:4;70114:24;70130:7;70114:6;:15;;:24;;;;:::i;:::-;70107:31;;70036:110;;;:::o;36286:201::-;35266:13;:11;:13::i;:::-;36395:1:::1;36375:22;;:8;:22;;::::0;36367:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36451:28;36470:8;36451:18;:28::i;:::-;36286:201:::0;:::o;58264:33::-;;;;:::o;35545:132::-;35620:12;:10;:12::i;:::-;35609:23;;:7;:5;:7::i;:::-;:23;;;35601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35545:132::o;46244:117::-;46307:7;46334:19;46342:3;:10;;46334:7;:19::i;:::-;46327:26;;46244:117;;;:::o;4318:98::-;4371:7;4398:10;4391:17;;4318:98;:::o;15276:380::-;15429:1;15412:19;;:5;:19;;;15404:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15510:1;15491:21;;:7;:21;;;15483:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15594:6;15564:11;:18;15576:5;15564:18;;;;;;;;;;;;;;;:27;15583:7;15564:27;;;;;;;;;;;;;;;:36;;;;15632:7;15616:32;;15625:5;15616:32;;;15641:6;15616:32;;;;;;:::i;:::-;;;;;;;;15276:380;;;:::o;15947:453::-;16082:24;16109:25;16119:5;16126:7;16109:9;:25::i;:::-;16082:52;;16169:17;16149:16;:37;16145:248;;16231:6;16211:16;:26;;16203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16315:51;16324:5;16331:7;16359:6;16340:16;:25;16315:8;:51::i;:::-;16145:248;16071:329;15947:453;;;:::o;60741:1278::-;60832:4;60853:6;;;;;;;;;;;60849:101;;;60876:36;60886:6;60894:9;60905:6;60876:9;:36::i;:::-;60934:4;60927:11;;;;60849:101;60965:27;:35;60993:6;60965:35;;;;;;;;;;;;;;;;;;;;;;;;;60960:112;;61025:10;:8;:10::i;:::-;61017:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60960:112;61084:18;61107:11;:19;61119:6;61107:19;;;;;;;;;;;;;;;;;;;;;;;;;61106:20;:47;;;;;61131:11;:22;61143:9;61131:22;;;;;;;;;;;;;;;;;;;;;;;;;61130:23;61106:47;61105:63;;;;;61158:10;:8;:10::i;:::-;61105:63;61084:84;;61179:9;61203:13;61219:6;61203:22;;61236:13;61252:9;61236:25;;61297:14;61304:6;61297;:14::i;:::-;61293:353;;;61328:9;:7;:9::i;:::-;61359:1;61352:8;;61383:9;61375:17;;61415:6;61407:14;;61440:13;;;;;;;;;;;:24;;;61465:6;61473;61440:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61436:56;61293:353;;;61513:17;61520:9;61513:6;:17::i;:::-;61509:137;;;61547:10;:8;:10::i;:::-;61579:1;61572:8;;61509:137;;;61629:5;61613:21;;61509:137;61293:353;61662:16;:14;:16::i;:::-;61658:59;;;61695:10;:8;:10::i;:::-;61658:59;61729:22;61754:13;:48;;61796:6;61754:48;;;61770:23;61778:6;61786;61770:7;:23::i;:::-;61754:48;61729:73;;61813:44;61823:6;61831:9;61842:14;61813:9;:44::i;:::-;61881:1;61874:4;:8;61870:120;;;61904:74;61910:5;61917;61924:6;61932:4;61938:22;:20;:22::i;:::-;61962:15;61904:74;;;;;;;;;;;:::i;:::-;;;;;;;;61870:120;62007:4;62000:11;;;;;;;60741:1278;;;;;;:::o;30359:211::-;30476:86;30496:5;30526:23;;;30551:2;30555:5;30503:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30476:19;:86::i;:::-;30359:211;;;:::o;45419:152::-;45489:4;45513:50;45518:3;:10;;45554:5;45538:23;;45530:32;;45513:4;:50::i;:::-;45506:57;;45419:152;;;;:::o;36647:191::-;36721:16;36740:6;;;;;;;;;;;36721:25;;36766:8;36757:6;;:17;;;;;;;;;;;;;;;;;;36821:8;36790:40;;36811:8;36790:40;;;;;;;;;;;;36710:128;36647:191;:::o;62209:2514::-;57505:4;57496:6;;:13;;;;;;;;;;;;;;;;;;62258:17:::1;62278:24;62296:4;62278:9;:24::i;:::-;62258:44;;62313:55;62330:4;62345:10;62358:9;62313:8;:55::i;:::-;62381:21;62430:8;;62418:7;;62406:9;:19;;;;:::i;:::-;62405:34;;;;:::i;:::-;62381:58;;62450:19;62502:8;;62485:12;;62473:9;:24;;;;:::i;:::-;62472:39;;;;:::i;:::-;62450:61;;62522:22;62573:8;;62560;;62548:9;:20;;;;:::i;:::-;62547:35;;;;:::i;:::-;62522:60;;62606:13;62593:26;;;;;:::i;:::-;;;62643:11;62630:24;;;;;:::i;:::-;;;62678:14;62665:27;;;;;:::i;:::-;;;62715:21;62753:1;62739:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62715:40;;62784:4;62766;62771:1;62766:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62818:4;62800;62805:1;62800:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62852:9;;;;;;;;;;;62834:4;62839:1;62834:7;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;::::0;::::1;62875:12;62906:21:::0;62930:9:::1;;;;;;;;;;;:19;;;62958:4;62930:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62906:58;;62979:10;:64;;;63044:9;63054:1;63056:4;63069;63083:1;63086:15;62979:123;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;62975:390;;63169:10;:64;;;63234:9;63244:1;63246:4;63259;63265:15;63169:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;63165:189:::0;::::1;;63311:4;63301:14;;63165:189;62975:390;;;63127:4;63117:14;;62975:390;63380:7;63375:47;;63404:7;;;;;;;;;63375:47;63434:45;63452:4;59140:42;63465:13;63434:9;:45::i;:::-;63490:61;63507:4;63522:11;;;;;;;;;;;63536:14;63490:8;:61::i;:::-;63577:11;;;;;;;;;;;63562:41;;;63604:14;63562:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63640:23;63703:13;63666:9;;;;;;;;;;;:19;;;63694:4;63666:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;63640:76;;63727:25;63791:8;;63776:12;;63766:7;;63755:8;;:18;;;;:::i;:::-;:33;;;;:::i;:::-;:44;;;;:::i;:::-;63727:72;;63810:27;63871:17;63859:7;;63841:15;:25;;;;:::i;:::-;63840:49;;;;:::i;:::-;63810:79;;63900:27;63961:17;63949:7;;63931:15;:25;;;;:::i;:::-;63930:49;;;;:::i;:::-;63900:79;;63990:30;64056:17;64042:10;;64024:15;:28;;;;:::i;:::-;64023:50;;;;:::i;:::-;63990:83;;64084:26;64175:22;64153:19;64131;64113:15;:37;;;;:::i;:::-;:59;;;;:::i;:::-;:84;;;;:::i;:::-;64084:113;;64210:9;;;;;;;;;;;:18;;;64229:10;;;;;;;;;;;64241:19;64210:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64272:9;;;;;;;;;;;:18;;;64291:10;;;;;;;;;;;64303:19;64272:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64334:9;;;;;;;;;;;:18;;;64361:13;;;;;;;;;;;64377:22;64334:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64411:9;;;;;;;;;;;:18;;;64430:9;;;;;;;;;;;64441:18;64411:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64477:19;;;;;;;;;;;64473:62;;;64513:10;:8;:10::i;:::-;64473:62;64560:155;64569:13;64584:19;64605;64626:11;64639:22;64663:14;64679:18;64699:15;64560:155;;;;;;;;;;;;;:::i;:::-;;;;;;;;62247:2476;;;;;;;;;;;;;57520:1;57541:5:::0;57532:6;;:14;;;;;;;;;;;;;;;;;;62209:2514::o;45747:158::-;45820:4;45844:53;45852:3;:10;;45888:5;45872:23;;45864:32;;45844:7;:53::i;:::-;45837:60;;45747:158;;;;:::o;46715:::-;46789:7;46840:22;46844:3;:10;;46856:5;46840:3;:22::i;:::-;46832:31;;46809:56;;46715:158;;;;:::o;45991:167::-;46071:4;46095:55;46105:3;:10;;46141:5;46125:23;;46117:32;;46095:9;:55::i;:::-;46088:62;;45991:167;;;;:::o;41461:109::-;41517:7;41544:3;:11;;:18;;;;41537:25;;41461:109;;;:::o;12155:840::-;12302:1;12286:18;;:4;:18;;;12278:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12379:1;12365:16;;:2;:16;;;12357:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12434:38;12455:4;12461:2;12465:6;12434:20;:38::i;:::-;12485:19;12507:9;:15;12517:4;12507:15;;;;;;;;;;;;;;;;12485:37;;12556:6;12541:11;:21;;12533:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12673:6;12659:11;:20;12641:9;:15;12651:4;12641:15;;;;;;;;;;;;;;;:38;;;;12876:6;12859:9;:13;12869:2;12859:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;12926:2;12911:26;;12920:4;12911:26;;;12930:6;12911:26;;;;;;:::i;:::-;;;;;;;;12950:37;12970:4;12976:2;12980:6;12950:19;:37::i;:::-;12267:728;12155:840;;;:::o;66123:90::-;66166:4;66204:1;66190:10;;:15;;66183:22;;66123:90;:::o;66221:302::-;66270:10;;66260:7;:20;;;;66301:10;;66291:7;:20;;;;66332:10;;66322:7;:20;;;;66368:15;;66353:12;:30;;;;66407:13;;66394:10;:26;;;;66442:11;;66431:8;:22;;;;66473:9;;66464:6;:18;;;;66504:11;;66493:8;:22;;;;66221:302::o;66531:311::-;66581:11;;66571:7;:21;;;;66613:11;;66603:7;:21;;;;66645:11;;66635:7;:21;;;;66682:16;;66667:12;:31;;;;66722:14;;66709:10;:27;;;;66758:12;;66747:8;:23;;;;66790:10;;66781:6;:19;;;;66822:12;;66811:8;:23;;;;66531:311::o;62027:174::-;62076:4;62101:6;;;;;;;;;;;62100:7;:22;;;;;62111:11;;;;;;;;;;;62100:22;:36;;;;;62126:10;:8;:10::i;:::-;62100:36;:68;;;;;62167:1;62140:24;62158:4;62140:9;:24::i;:::-;:28;62100:68;:93;;;;;62173:20;62180:12;:10;:12::i;:::-;62173:6;:20::i;:::-;62172:21;62100:93;62093:100;;62027:174;:::o;66850:241::-;66917:7;66937:17;66979:14;;66967:8;;66958:6;:17;;;;:::i;:::-;66957:36;;;;:::i;:::-;66937:56;;67004:43;67014:6;67030:4;67037:9;67004;:43::i;:::-;67074:9;67065:6;:18;;;;:::i;:::-;67058:25;;;66850:241;;;;:::o;33426:716::-;33850:23;33876:69;33904:4;33876:69;;;;;;;;;;;;;;;;;33884:5;33876:27;;;;:69;;;;;:::i;:::-;33850:95;;33980:1;33960:10;:17;:21;33956:179;;;34057:10;34046:30;;;;;;;;;;;;:::i;:::-;34038:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33956:179;33496:646;33426:716;;:::o;39150:414::-;39213:4;39235:21;39245:3;39250:5;39235:9;:21::i;:::-;39230:327;;39273:3;:11;;39290:5;39273:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39456:3;:11;;:18;;;;39434:3;:12;;:19;39447:5;39434:19;;;;;;;;;;;:40;;;;39496:4;39489:11;;;;39230:327;39540:5;39533:12;;39150:414;;;;;:::o;64731:936::-;64771:24;64812:1;64798:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64771:43;;64846:4;64825:7;64833:1;64825:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;64883:4;64862:7;64870:1;64862:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;64901:19;64923:24;64941:4;64923:9;:24::i;:::-;64901:46;;64958:12;64987:1;64973:11;:15;;;;:::i;:::-;64958:30;;65009:4;65002;:11;64999:23;;;65015:7;;;;;64999:23;65034;65060:21;65034:47;;65092:12;65127:10;:61;;;65189:4;65194:1;65197:7;65213:4;65227:1;65230:15;65127:119;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65123:367;;65313:10;:61;;;65375:4;65380:1;65383:7;65399:4;65405:15;65313:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65309:170;;;65450:4;65440:14;;65309:170;65123:367;;;65271:4;65261:14;;65123:367;65505:7;65500:47;;65529:7;;;;;;;65500:47;65559:17;65603:15;65579:21;:39;;;;:::i;:::-;65559:59;;65629:30;65643:4;65649:9;65629:13;:30::i;:::-;64760:907;;;;;;64731:936;:::o;39740:1420::-;39806:4;39924:18;39945:3;:12;;:19;39958:5;39945:19;;;;;;;;;;;;39924:40;;39995:1;39981:10;:15;39977:1176;;40356:21;40393:1;40380:10;:14;;;;:::i;:::-;40356:38;;40409:17;40450:1;40429:3;:11;;:18;;;;:22;;;;:::i;:::-;40409:42;;40485:13;40472:9;:26;40468:405;;40519:17;40539:3;:11;;40551:9;40539:22;;;;;;;;:::i;:::-;;;;;;;;;;40519:42;;40693:9;40664:3;:11;;40676:13;40664:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;40804:10;40778:3;:12;;:23;40791:9;40778:23;;;;;;;;;;;:36;;;;40500:373;40468:405;40954:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41049:3;:12;;:19;41062:5;41049:19;;;;;;;;;;;41042:26;;;41092:4;41085:11;;;;;;;39977:1176;41136:5;41129:12;;;39740:1420;;;;;:::o;41924:120::-;41991:7;42018:3;:11;;42030:5;42018:18;;;;;;;;:::i;:::-;;;;;;;;;;42011:25;;41924:120;;;;:::o;41246:129::-;41319:4;41366:1;41343:3;:12;;:19;41356:5;41343:19;;;;;;;;;;;;:24;;41336:31;;41246:129;;;;:::o;17000:125::-;;;;:::o;17729:124::-;;;;:::o;24211:229::-;24348:12;24380:52;24402:6;24410:4;24416:1;24419:12;24380:21;:52::i;:::-;24373:59;;24211:229;;;;;:::o;65675:364::-;65758:57;65775:4;65790:10;65803:11;65758:8;:57::i;:::-;65830:10;:26;;;65864:9;65883:4;65890:11;65903:1;65906;65917;65921:15;65830:107;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65826:206;;;;;;65958:53;65971:11;65984:9;65995:15;65958:53;;;;;;;;:::i;:::-;;;;;;;;65826:206;65675:364;;:::o;25331:455::-;25501:12;25559:5;25534:21;:30;;25526:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;25619:12;25633:23;25660:6;:11;;25679:5;25686:4;25660:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25618:73;;;;25709:69;25736:6;25744:7;25753:10;25765:12;25709:26;:69::i;:::-;25702:76;;;;25331:455;;;;;;:::o;27904:644::-;28089:12;28118:7;28114:427;;;28167:1;28146:10;:17;:22;28142:290;;28364:18;28375:6;28364:10;:18::i;:::-;28356:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28142:290;28453:10;28446:17;;;;28114:427;28496:33;28504:10;28516:12;28496:7;:33::i;:::-;27904:644;;;;;;;:::o;21454:326::-;21514:4;21771:1;21749:7;:19;;;:23;21742:30;;21454:326;;;:::o;29090:552::-;29271:1;29251:10;:17;:21;29247:388;;;29483:10;29477:17;29540:15;29527:10;29523:2;29519:19;29512:44;29247:388;29610:12;29603: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:1203::-;3911:6;3919;3927;3935;3943;3951;3959;4008:3;3996:9;3987:7;3983:23;3979:33;3976:120;;;4015:79;;:::i;:::-;3976:120;4135:1;4160:53;4205:7;4196:6;4185:9;4181:22;4160:53;:::i;:::-;4150:63;;4106:117;4262:2;4288:53;4333:7;4324:6;4313:9;4309:22;4288:53;:::i;:::-;4278:63;;4233:118;4390:2;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4361:118;4518:2;4544:53;4589:7;4580:6;4569:9;4565:22;4544:53;:::i;:::-;4534:63;;4489:118;4646:3;4673:53;4718:7;4709:6;4698:9;4694:22;4673:53;:::i;:::-;4663:63;;4617:119;4775:3;4802:53;4847:7;4838:6;4827:9;4823:22;4802:53;:::i;:::-;4792:63;;4746:119;4904:3;4931:53;4976:7;4967:6;4956:9;4952:22;4931:53;:::i;:::-;4921:63;;4875:119;3798:1203;;;;;;;;;;:::o;5007:911::-;5102:6;5110;5118;5126;5134;5183:3;5171:9;5162:7;5158:23;5154:33;5151:120;;;5190:79;;:::i;:::-;5151:120;5310:1;5335:53;5380:7;5371:6;5360:9;5356:22;5335:53;:::i;:::-;5325:63;;5281:117;5437:2;5463:53;5508:7;5499:6;5488:9;5484:22;5463:53;:::i;:::-;5453:63;;5408:118;5565:2;5591:53;5636:7;5627:6;5616:9;5612:22;5591:53;:::i;:::-;5581:63;;5536:118;5693:2;5719:53;5764:7;5755:6;5744:9;5740:22;5719:53;:::i;:::-;5709:63;;5664:118;5821:3;5848:53;5893:7;5884:6;5873:9;5869:22;5848:53;:::i;:::-;5838:63;;5792:119;5007:911;;;;;;;;:::o;5924:619::-;6001:6;6009;6017;6066:2;6054:9;6045:7;6041:23;6037:32;6034:119;;;6072:79;;:::i;:::-;6034:119;6192:1;6217:53;6262:7;6253:6;6242:9;6238:22;6217:53;:::i;:::-;6207:63;;6163:117;6319:2;6345:53;6390:7;6381:6;6370:9;6366:22;6345:53;:::i;:::-;6335:63;;6290:118;6447:2;6473:53;6518:7;6509:6;6498:9;6494:22;6473:53;:::i;:::-;6463:63;;6418:118;5924:619;;;;;:::o;6549:60::-;6577:3;6598:5;6591:12;;6549:60;;;:::o;6615:142::-;6665:9;6698:53;6716:34;6725:24;6743:5;6725:24;:::i;:::-;6716:34;:::i;:::-;6698:53;:::i;:::-;6685:66;;6615:142;;;:::o;6763:126::-;6813:9;6846:37;6877:5;6846:37;:::i;:::-;6833:50;;6763:126;;;:::o;6895:143::-;6962:9;6995:37;7026:5;6995:37;:::i;:::-;6982:50;;6895:143;;;:::o;7044:165::-;7148:54;7196:5;7148:54;:::i;:::-;7143:3;7136:67;7044:165;;:::o;7215:256::-;7325:4;7363:2;7352:9;7348:18;7340:26;;7376:88;7461:1;7450:9;7446:17;7437:6;7376:88;:::i;:::-;7215:256;;;;:::o;7477:86::-;7512:7;7552:4;7545:5;7541:16;7530:27;;7477:86;;;:::o;7569:112::-;7652:22;7668:5;7652:22;:::i;:::-;7647:3;7640:35;7569:112;;:::o;7687:214::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:67;7891:1;7880:9;7876:17;7867:6;7827:67;:::i;:::-;7687:214;;;;:::o;7907:329::-;7966:6;8015:2;8003:9;7994:7;7990:23;7986:32;7983:119;;;8021:79;;:::i;:::-;7983:119;8141:1;8166:53;8211:7;8202:6;8191:9;8187:22;8166:53;:::i;:::-;8156:63;;8112:117;7907:329;;;;:::o;8242:116::-;8312:21;8327:5;8312:21;:::i;:::-;8305:5;8302:32;8292:60;;8348:1;8345;8338:12;8292:60;8242:116;:::o;8364:133::-;8407:5;8445:6;8432:20;8423:29;;8461:30;8485:5;8461:30;:::i;:::-;8364:133;;;;:::o;8503:468::-;8568:6;8576;8625:2;8613:9;8604:7;8600:23;8596:32;8593:119;;;8631:79;;:::i;:::-;8593:119;8751:1;8776:53;8821:7;8812:6;8801:9;8797:22;8776:53;:::i;:::-;8766:63;;8722:117;8878:2;8904:50;8946:7;8937:6;8926:9;8922:22;8904:50;:::i;:::-;8894:60;;8849:115;8503:468;;;;;:::o;8977:139::-;9040:9;9073:37;9104:5;9073:37;:::i;:::-;9060:50;;8977:139;;;:::o;9122:157::-;9222:50;9266:5;9222:50;:::i;:::-;9217:3;9210:63;9122:157;;:::o;9285:248::-;9391:4;9429:2;9418:9;9414:18;9406:26;;9442:84;9523:1;9512:9;9508:17;9499:6;9442:84;:::i;:::-;9285:248;;;;:::o;9539:118::-;9626:24;9644:5;9626:24;:::i;:::-;9621:3;9614:37;9539:118;;:::o;9663:222::-;9756:4;9794:2;9783:9;9779:18;9771:26;;9807:71;9875:1;9864:9;9860:17;9851:6;9807:71;:::i;:::-;9663:222;;;;:::o;9891:323::-;9947:6;9996:2;9984:9;9975:7;9971:23;9967:32;9964:119;;;10002:79;;:::i;:::-;9964:119;10122:1;10147:50;10189:7;10180:6;10169:9;10165:22;10147:50;:::i;:::-;10137:60;;10093:114;9891:323;;;;:::o;10220:329::-;10279:6;10328:2;10316:9;10307:7;10303:23;10299:32;10296:119;;;10334:79;;:::i;:::-;10296:119;10454:1;10479:53;10524:7;10515:6;10504:9;10500:22;10479:53;:::i;:::-;10469:63;;10425:117;10220:329;;;;:::o;10555:474::-;10623:6;10631;10680:2;10668:9;10659:7;10655:23;10651:32;10648:119;;;10686:79;;:::i;:::-;10648:119;10806:1;10831:53;10876:7;10867:6;10856:9;10852:22;10831:53;:::i;:::-;10821:63;;10777:117;10933:2;10959:53;11004:7;10995:6;10984:9;10980:22;10959:53;:::i;:::-;10949:63;;10904:118;10555:474;;;;;:::o;11035:166::-;11175:18;11171:1;11163:6;11159:14;11152:42;11035:166;:::o;11207:366::-;11349:3;11370:67;11434:2;11429:3;11370:67;:::i;:::-;11363:74;;11446:93;11535:3;11446:93;:::i;:::-;11564:2;11559:3;11555:12;11548:19;;11207:366;;;:::o;11579:419::-;11745:4;11783:2;11772:9;11768:18;11760:26;;11832:9;11826:4;11822:20;11818:1;11807:9;11803:17;11796:47;11860:131;11986:4;11860:131;:::i;:::-;11852:139;;11579:419;;;:::o;12004:180::-;12052:77;12049:1;12042:88;12149:4;12146:1;12139:15;12173:4;12170:1;12163:15;12190:320;12234:6;12271:1;12265:4;12261:12;12251:22;;12318:1;12312:4;12308:12;12339:18;12329:81;;12395:4;12387:6;12383:17;12373:27;;12329:81;12457:2;12449:6;12446:14;12426:18;12423:38;12420:84;;12476:18;;:::i;:::-;12420:84;12241:269;12190:320;;;:::o;12516:180::-;12564:77;12561:1;12554:88;12661:4;12658:1;12651:15;12685:4;12682:1;12675:15;12702:191;12742:3;12761:20;12779:1;12761:20;:::i;:::-;12756:25;;12795:20;12813:1;12795:20;:::i;:::-;12790:25;;12838:1;12835;12831:9;12824:16;;12859:3;12856:1;12853:10;12850:36;;;12866:18;;:::i;:::-;12850:36;12702:191;;;;:::o;12899:194::-;12939:4;12959:20;12977:1;12959:20;:::i;:::-;12954:25;;12993:20;13011:1;12993:20;:::i;:::-;12988:25;;13037:1;13034;13030:9;13022:17;;13061:1;13055:4;13052:11;13049:37;;;13066:18;;:::i;:::-;13049:37;12899:194;;;;:::o;13099:143::-;13156:5;13187:6;13181:13;13172:22;;13203:33;13230:5;13203:33;:::i;:::-;13099:143;;;;:::o;13248:351::-;13318:6;13367:2;13355:9;13346:7;13342:23;13338:32;13335:119;;;13373:79;;:::i;:::-;13335:119;13493:1;13518:64;13574:7;13565:6;13554:9;13550:22;13518:64;:::i;:::-;13508:74;;13464:128;13248:351;;;;:::o;13605:332::-;13726:4;13764:2;13753:9;13749:18;13741:26;;13777:71;13845:1;13834:9;13830:17;13821:6;13777:71;:::i;:::-;13858:72;13926:2;13915:9;13911:18;13902:6;13858:72;:::i;:::-;13605:332;;;;;:::o;13943:137::-;13997:5;14028:6;14022:13;14013:22;;14044:30;14068:5;14044:30;:::i;:::-;13943:137;;;;:::o;14086:345::-;14153:6;14202:2;14190:9;14181:7;14177:23;14173:32;14170:119;;;14208:79;;:::i;:::-;14170:119;14328:1;14353:61;14406:7;14397:6;14386:9;14382:22;14353:61;:::i;:::-;14343:71;;14299:125;14086:345;;;;:::o;14437:169::-;14577:21;14573:1;14565:6;14561:14;14554:45;14437:169;:::o;14612:366::-;14754:3;14775:67;14839:2;14834:3;14775:67;:::i;:::-;14768:74;;14851:93;14940:3;14851:93;:::i;:::-;14969:2;14964:3;14960:12;14953:19;;14612:366;;;:::o;14984:419::-;15150:4;15188:2;15177:9;15173:18;15165:26;;15237:9;15231:4;15227:20;15223:1;15212:9;15208:17;15201:47;15265:131;15391:4;15265:131;:::i;:::-;15257:139;;14984:419;;;:::o;15409:332::-;15530:4;15568:2;15557:9;15553:18;15545:26;;15581:71;15649:1;15638:9;15634:17;15625:6;15581:71;:::i;:::-;15662:72;15730:2;15719:9;15715:18;15706:6;15662:72;:::i;:::-;15409:332;;;;;:::o;15747:143::-;15804:5;15835:6;15829:13;15820:22;;15851:33;15878:5;15851:33;:::i;:::-;15747:143;;;;:::o;15896:351::-;15966:6;16015:2;16003:9;15994:7;15990:23;15986:32;15983:119;;;16021:79;;:::i;:::-;15983:119;16141:1;16166:64;16222:7;16213:6;16202:9;16198:22;16166:64;:::i;:::-;16156:74;;16112:128;15896:351;;;;:::o;16253:224::-;16393:34;16389:1;16381:6;16377:14;16370:58;16462:7;16457:2;16449:6;16445:15;16438:32;16253:224;:::o;16483:366::-;16625:3;16646:67;16710:2;16705:3;16646:67;:::i;:::-;16639:74;;16722:93;16811:3;16722:93;:::i;:::-;16840:2;16835:3;16831:12;16824:19;;16483:366;;;:::o;16855:419::-;17021:4;17059:2;17048:9;17044:18;17036:26;;17108:9;17102:4;17098:20;17094:1;17083:9;17079:17;17072:47;17136:131;17262:4;17136:131;:::i;:::-;17128:139;;16855:419;;;:::o;17280:182::-;17420:34;17416:1;17408:6;17404:14;17397:58;17280:182;:::o;17468:366::-;17610:3;17631:67;17695:2;17690:3;17631:67;:::i;:::-;17624:74;;17707:93;17796:3;17707:93;:::i;:::-;17825:2;17820:3;17816:12;17809:19;;17468:366;;;:::o;17840:419::-;18006:4;18044:2;18033:9;18029:18;18021:26;;18093:9;18087:4;18083:20;18079:1;18068:9;18064:17;18057:47;18121:131;18247:4;18121:131;:::i;:::-;18113:139;;17840:419;;;:::o;18265:177::-;18405:29;18401:1;18393:6;18389:14;18382:53;18265:177;:::o;18448:366::-;18590:3;18611:67;18675:2;18670:3;18611:67;:::i;:::-;18604:74;;18687:93;18776:3;18687:93;:::i;:::-;18805:2;18800:3;18796:12;18789:19;;18448:366;;;:::o;18820:419::-;18986:4;19024:2;19013:9;19009:18;19001:26;;19073:9;19067:4;19063:20;19059:1;19048:9;19044:17;19037:47;19101:131;19227:4;19101:131;:::i;:::-;19093:139;;18820:419;;;:::o;19245:180::-;19293:77;19290:1;19283:88;19390:4;19387:1;19380:15;19414:4;19411:1;19404:15;19431:98;19482:6;19516:5;19510:12;19500:22;;19431:98;;;:::o;19535:147::-;19636:11;19673:3;19658:18;;19535:147;;;;:::o;19688:386::-;19792:3;19820:38;19852:5;19820:38;:::i;:::-;19874:88;19955:6;19950:3;19874:88;:::i;:::-;19867:95;;19971:65;20029:6;20024:3;20017:4;20010:5;20006:16;19971:65;:::i;:::-;20061:6;20056:3;20052:16;20045:23;;19796:278;19688:386;;;;:::o;20080:271::-;20210:3;20232:93;20321:3;20312:6;20232:93;:::i;:::-;20225:100;;20342:3;20335:10;;20080:271;;;;:::o;20357:177::-;20497:29;20493:1;20485:6;20481:14;20474:53;20357:177;:::o;20540:366::-;20682:3;20703:67;20767:2;20762:3;20703:67;:::i;:::-;20696:74;;20779:93;20868:3;20779:93;:::i;:::-;20897:2;20892:3;20888:12;20881:19;;20540:366;;;:::o;20912:419::-;21078:4;21116:2;21105:9;21101:18;21093:26;;21165:9;21159:4;21155:20;21151:1;21140:9;21136:17;21129:47;21193:131;21319:4;21193:131;:::i;:::-;21185:139;;20912:419;;;:::o;21337:225::-;21477:34;21473:1;21465:6;21461:14;21454:58;21546:8;21541:2;21533:6;21529:15;21522:33;21337:225;:::o;21568:366::-;21710:3;21731:67;21795:2;21790:3;21731:67;:::i;:::-;21724:74;;21807:93;21896:3;21807:93;:::i;:::-;21925:2;21920:3;21916:12;21909:19;;21568:366;;;:::o;21940:419::-;22106:4;22144:2;22133:9;22129:18;22121:26;;22193:9;22187:4;22183:20;22179:1;22168:9;22164:17;22157:47;22221:131;22347:4;22221:131;:::i;:::-;22213:139;;21940:419;;;:::o;22365:182::-;22505:34;22501:1;22493:6;22489:14;22482:58;22365:182;:::o;22553:366::-;22695:3;22716:67;22780:2;22775:3;22716:67;:::i;:::-;22709:74;;22792:93;22881:3;22792:93;:::i;:::-;22910:2;22905:3;22901:12;22894:19;;22553:366;;;:::o;22925:419::-;23091:4;23129:2;23118:9;23114:18;23106:26;;23178:9;23172:4;23168:20;23164:1;23153:9;23149:17;23142:47;23206:131;23332:4;23206:131;:::i;:::-;23198:139;;22925:419;;;:::o;23350:223::-;23490:34;23486:1;23478:6;23474:14;23467:58;23559:6;23554:2;23546:6;23542:15;23535:31;23350:223;:::o;23579:366::-;23721:3;23742:67;23806:2;23801:3;23742:67;:::i;:::-;23735:74;;23818:93;23907:3;23818:93;:::i;:::-;23936:2;23931:3;23927:12;23920:19;;23579:366;;;:::o;23951:419::-;24117:4;24155:2;24144:9;24140:18;24132:26;;24204:9;24198:4;24194:20;24190:1;24179:9;24175:17;24168:47;24232:131;24358:4;24232:131;:::i;:::-;24224:139;;23951:419;;;:::o;24376:221::-;24516:34;24512:1;24504:6;24500:14;24493:58;24585:4;24580:2;24572:6;24568:15;24561:29;24376:221;:::o;24603:366::-;24745:3;24766:67;24830:2;24825:3;24766:67;:::i;:::-;24759:74;;24842:93;24931:3;24842:93;:::i;:::-;24960:2;24955:3;24951:12;24944:19;;24603:366;;;:::o;24975:419::-;25141:4;25179:2;25168:9;25164:18;25156:26;;25228:9;25222:4;25218:20;25214:1;25203:9;25199:17;25192:47;25256:131;25382:4;25256:131;:::i;:::-;25248:139;;24975:419;;;:::o;25400:179::-;25540:31;25536:1;25528:6;25524:14;25517:55;25400:179;:::o;25585:366::-;25727:3;25748:67;25812:2;25807:3;25748:67;:::i;:::-;25741:74;;25824:93;25913:3;25824:93;:::i;:::-;25942:2;25937:3;25933:12;25926:19;;25585:366;;;:::o;25957:419::-;26123:4;26161:2;26150:9;26146:18;26138:26;;26210:9;26204:4;26200:20;26196:1;26185:9;26181:17;26174:47;26238:131;26364:4;26238:131;:::i;:::-;26230:139;;25957:419;;;:::o;26382:170::-;26522:22;26518:1;26510:6;26506:14;26499:46;26382:170;:::o;26558:366::-;26700:3;26721:67;26785:2;26780:3;26721:67;:::i;:::-;26714:74;;26797:93;26886:3;26797:93;:::i;:::-;26915:2;26910:3;26906:12;26899:19;;26558:366;;;:::o;26930:419::-;27096:4;27134:2;27123:9;27119:18;27111:26;;27183:9;27177:4;27173:20;27169:1;27158:9;27154:17;27147:47;27211:131;27337:4;27211:131;:::i;:::-;27203:139;;26930:419;;;:::o;27355:775::-;27588:4;27626:3;27615:9;27611:19;27603:27;;27640:71;27708:1;27697:9;27693:17;27684:6;27640:71;:::i;:::-;27721:72;27789:2;27778:9;27774:18;27765:6;27721:72;:::i;:::-;27803;27871:2;27860:9;27856:18;27847:6;27803:72;:::i;:::-;27885;27953:2;27942:9;27938:18;27929:6;27885:72;:::i;:::-;27967:73;28035:3;28024:9;28020:19;28011:6;27967:73;:::i;:::-;28050;28118:3;28107:9;28103:19;28094:6;28050:73;:::i;:::-;27355:775;;;;;;;;;:::o;28136:410::-;28176:7;28199:20;28217:1;28199:20;:::i;:::-;28194:25;;28233:20;28251:1;28233:20;:::i;:::-;28228:25;;28288:1;28285;28281:9;28310:30;28328:11;28310:30;:::i;:::-;28299:41;;28489:1;28480:7;28476:15;28473:1;28470:22;28450:1;28443:9;28423:83;28400:139;;28519:18;;:::i;:::-;28400:139;28184:362;28136:410;;;;:::o;28552:180::-;28600:77;28597:1;28590:88;28697:4;28694:1;28687:15;28721:4;28718:1;28711:15;28738:185;28778:1;28795:20;28813:1;28795:20;:::i;:::-;28790:25;;28829:20;28847:1;28829:20;:::i;:::-;28824:25;;28868:1;28858:35;;28873:18;;:::i;:::-;28858:35;28915:1;28912;28908:9;28903:14;;28738:185;;;;:::o;28929:180::-;28977:77;28974:1;28967:88;29074:4;29071:1;29064:15;29098:4;29095:1;29088:15;29115:85;29160:7;29189:5;29178:16;;29115:85;;;:::o;29206:158::-;29264:9;29297:61;29315:42;29324:32;29350:5;29324:32;:::i;:::-;29315:42;:::i;:::-;29297:61;:::i;:::-;29284:74;;29206:158;;;:::o;29370:147::-;29465:45;29504:5;29465:45;:::i;:::-;29460:3;29453:58;29370:147;;:::o;29523:114::-;29590:6;29624:5;29618:12;29608:22;;29523:114;;;:::o;29643:184::-;29742:11;29776:6;29771:3;29764:19;29816:4;29811:3;29807:14;29792:29;;29643:184;;;;:::o;29833:132::-;29900:4;29923:3;29915:11;;29953:4;29948:3;29944:14;29936:22;;29833:132;;;:::o;29971:108::-;30048:24;30066:5;30048:24;:::i;:::-;30043:3;30036:37;29971:108;;:::o;30085:179::-;30154:10;30175:46;30217:3;30209:6;30175:46;:::i;:::-;30253:4;30248:3;30244:14;30230:28;;30085:179;;;;:::o;30270:113::-;30340:4;30372;30367:3;30363:14;30355:22;;30270:113;;;:::o;30419:732::-;30538:3;30567:54;30615:5;30567:54;:::i;:::-;30637:86;30716:6;30711:3;30637:86;:::i;:::-;30630:93;;30747:56;30797:5;30747:56;:::i;:::-;30826:7;30857:1;30842:284;30867:6;30864:1;30861:13;30842:284;;;30943:6;30937:13;30970:63;31029:3;31014:13;30970:63;:::i;:::-;30963:70;;31056:60;31109:6;31056:60;:::i;:::-;31046:70;;30902:224;30889:1;30886;30882:9;30877:14;;30842:284;;;30846:14;31142:3;31135:10;;30543:608;;;30419:732;;;;:::o;31157:942::-;31448:4;31486:3;31475:9;31471:19;31463:27;;31500:71;31568:1;31557:9;31553:17;31544:6;31500:71;:::i;:::-;31581:80;31657:2;31646:9;31642:18;31633:6;31581:80;:::i;:::-;31708:9;31702:4;31698:20;31693:2;31682:9;31678:18;31671:48;31736:108;31839:4;31830:6;31736:108;:::i;:::-;31728:116;;31854:72;31922:2;31911:9;31907:18;31898:6;31854:72;:::i;:::-;31936:73;32004:3;31993:9;31989:19;31980:6;31936:73;:::i;:::-;32019;32087:3;32076:9;32072:19;32063:6;32019:73;:::i;:::-;31157:942;;;;;;;;;:::o;32105:831::-;32368:4;32406:3;32395:9;32391:19;32383:27;;32420:71;32488:1;32477:9;32473:17;32464:6;32420:71;:::i;:::-;32501:80;32577:2;32566:9;32562:18;32553:6;32501:80;:::i;:::-;32628:9;32622:4;32618:20;32613:2;32602:9;32598:18;32591:48;32656:108;32759:4;32750:6;32656:108;:::i;:::-;32648:116;;32774:72;32842:2;32831:9;32827:18;32818:6;32774:72;:::i;:::-;32856:73;32924:3;32913:9;32909:19;32900:6;32856:73;:::i;:::-;32105:831;;;;;;;;:::o;32942:997::-;33231:4;33269:3;33258:9;33254:19;33246:27;;33283:71;33351:1;33340:9;33336:17;33327:6;33283:71;:::i;:::-;33364:72;33432:2;33421:9;33417:18;33408:6;33364:72;:::i;:::-;33446;33514:2;33503:9;33499:18;33490:6;33446:72;:::i;:::-;33528;33596:2;33585:9;33581:18;33572:6;33528:72;:::i;:::-;33610:73;33678:3;33667:9;33663:19;33654:6;33610:73;:::i;:::-;33693;33761:3;33750:9;33746:19;33737:6;33693:73;:::i;:::-;33776;33844:3;33833:9;33829:19;33820:6;33776:73;:::i;:::-;33859;33927:3;33916:9;33912:19;33903:6;33859:73;:::i;:::-;32942:997;;;;;;;;;;;:::o;33945:224::-;34085:34;34081:1;34073:6;34069:14;34062:58;34154:7;34149:2;34141:6;34137:15;34130:32;33945:224;:::o;34175:366::-;34317:3;34338:67;34402:2;34397:3;34338:67;:::i;:::-;34331:74;;34414:93;34503:3;34414:93;:::i;:::-;34532:2;34527:3;34523:12;34516:19;;34175:366;;;:::o;34547:419::-;34713:4;34751:2;34740:9;34736:18;34728:26;;34800:9;34794:4;34790:20;34786:1;34775:9;34771:17;34764:47;34828:131;34954:4;34828:131;:::i;:::-;34820:139;;34547:419;;;:::o;34972:222::-;35112:34;35108:1;35100:6;35096:14;35089:58;35181:5;35176:2;35168:6;35164:15;35157:30;34972:222;:::o;35200:366::-;35342:3;35363:67;35427:2;35422:3;35363:67;:::i;:::-;35356:74;;35439:93;35528:3;35439:93;:::i;:::-;35557:2;35552:3;35548:12;35541:19;;35200:366;;;:::o;35572:419::-;35738:4;35776:2;35765:9;35761:18;35753:26;;35825:9;35819:4;35815:20;35811:1;35800:9;35796:17;35789:47;35853:131;35979:4;35853:131;:::i;:::-;35845:139;;35572:419;;;:::o;35997:225::-;36137:34;36133:1;36125:6;36121:14;36114:58;36206:8;36201:2;36193:6;36189:15;36182:33;35997:225;:::o;36228:366::-;36370:3;36391:67;36455:2;36450:3;36391:67;:::i;:::-;36384:74;;36467:93;36556:3;36467:93;:::i;:::-;36585:2;36580:3;36576:12;36569:19;;36228:366;;;:::o;36600:419::-;36766:4;36804:2;36793:9;36789:18;36781:26;;36853:9;36847:4;36843:20;36839:1;36828:9;36824:17;36817:47;36881:131;37007:4;36881:131;:::i;:::-;36873:139;;36600:419;;;:::o;37025:229::-;37165:34;37161:1;37153:6;37149:14;37142:58;37234:12;37229:2;37221:6;37217:15;37210:37;37025:229;:::o;37260:366::-;37402:3;37423:67;37487:2;37482:3;37423:67;:::i;:::-;37416:74;;37499:93;37588:3;37499:93;:::i;:::-;37617:2;37612:3;37608:12;37601:19;;37260:366;;;:::o;37632:419::-;37798:4;37836:2;37825:9;37821:18;37813:26;;37885:9;37879:4;37875:20;37871:1;37860:9;37856:17;37849:47;37913:131;38039:4;37913:131;:::i;:::-;37905:139;;37632:419;;;:::o;38057:180::-;38105:77;38102:1;38095:88;38202:4;38199:1;38192:15;38226:4;38223:1;38216:15;38243:807;38492:4;38530:3;38519:9;38515:19;38507:27;;38544:71;38612:1;38601:9;38597:17;38588:6;38544:71;:::i;:::-;38625:72;38693:2;38682:9;38678:18;38669:6;38625:72;:::i;:::-;38707:80;38783:2;38772:9;38768:18;38759:6;38707:80;:::i;:::-;38797;38873:2;38862:9;38858:18;38849:6;38797:80;:::i;:::-;38887:73;38955:3;38944:9;38940:19;38931:6;38887:73;:::i;:::-;38970;39038:3;39027:9;39023:19;39014:6;38970:73;:::i;:::-;38243:807;;;;;;;;;:::o;39056:663::-;39144:6;39152;39160;39209:2;39197:9;39188:7;39184:23;39180:32;39177:119;;;39215:79;;:::i;:::-;39177:119;39335:1;39360:64;39416:7;39407:6;39396:9;39392:22;39360:64;:::i;:::-;39350:74;;39306:128;39473:2;39499:64;39555:7;39546:6;39535:9;39531:22;39499:64;:::i;:::-;39489:74;;39444:129;39612:2;39638:64;39694:7;39685:6;39674:9;39670:22;39638:64;:::i;:::-;39628:74;;39583:129;39056:663;;;;;:::o;39725:442::-;39874:4;39912:2;39901:9;39897:18;39889:26;;39925:71;39993:1;39982:9;39978:17;39969:6;39925:71;:::i;:::-;40006:72;40074:2;40063:9;40059:18;40050:6;40006:72;:::i;:::-;40088;40156:2;40145:9;40141:18;40132:6;40088:72;:::i;:::-;39725:442;;;;;;:::o;40173:225::-;40313:34;40309:1;40301:6;40297:14;40290:58;40382:8;40377:2;40369:6;40365:15;40358:33;40173:225;:::o;40404:366::-;40546:3;40567:67;40631:2;40626:3;40567:67;:::i;:::-;40560:74;;40643:93;40732:3;40643:93;:::i;:::-;40761:2;40756:3;40752:12;40745:19;;40404:366;;;:::o;40776:419::-;40942:4;40980:2;40969:9;40965:18;40957:26;;41029:9;41023:4;41019:20;41015:1;41004:9;41000:17;40993:47;41057:131;41183:4;41057:131;:::i;:::-;41049:139;;40776:419;;;:::o;41201:179::-;41341:31;41337:1;41329:6;41325:14;41318:55;41201:179;:::o;41386:366::-;41528:3;41549:67;41613:2;41608:3;41549:67;:::i;:::-;41542:74;;41625:93;41714:3;41625:93;:::i;:::-;41743:2;41738:3;41734:12;41727:19;;41386:366;;;:::o;41758:419::-;41924:4;41962:2;41951:9;41947:18;41939:26;;42011:9;42005:4;42001:20;41997:1;41986:9;41982:17;41975:47;42039:131;42165:4;42039:131;:::i;:::-;42031:139;;41758:419;;;:::o
Swarm Source
ipfs://f7408e3ec91b5774681225e547dfe764a4366d26908b49f5338842d18fdba3b8
[ 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.