Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 14 from a total of 14 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy With Eth | 20015156 | 185 days ago | IN | 0.016 ETH | 0.00153606 | ||||
Buy With Eth | 19997268 | 187 days ago | IN | 0.018 ETH | 0.00359943 | ||||
Buy With Eth | 19888085 | 202 days ago | IN | 0.035 ETH | 0.00062894 | ||||
Buy With Eth | 19885666 | 203 days ago | IN | 0.035 ETH | 0.00058653 | ||||
Set Current Step | 19856395 | 207 days ago | IN | 0 ETH | 0.00010253 | ||||
Set Current Step | 19856309 | 207 days ago | IN | 0 ETH | 0.00012787 | ||||
Change Rounds Da... | 19856275 | 207 days ago | IN | 0 ETH | 0.00022986 | ||||
Buy With Eth | 19854211 | 207 days ago | IN | 0.035 ETH | 0.0013135 | ||||
Set Staking Mana... | 19762308 | 220 days ago | IN | 0 ETH | 0.00039993 | ||||
Start Claim | 19762291 | 220 days ago | IN | 0 ETH | 0.00169962 | ||||
Change Rounds Da... | 19761039 | 220 days ago | IN | 0 ETH | 0.00067923 | ||||
Change Rounds Da... | 19756143 | 221 days ago | IN | 0 ETH | 0.00051574 | ||||
Set Splits | 19755420 | 221 days ago | IN | 0 ETH | 0.00108397 | ||||
Initialize | 19755419 | 221 days ago | IN | 0 ETH | 0.00324165 |
Latest 18 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20015156 | 185 days ago | 0.01496618 ETH | ||||
20015156 | 185 days ago | 0.00020676 ETH | ||||
20015156 | 185 days ago | 0.00082705 ETH | ||||
19997268 | 187 days ago | 0.01489854 ETH | ||||
19997268 | 187 days ago | 1 wei | ||||
19997268 | 187 days ago | 0.00062029 ETH | ||||
19997268 | 187 days ago | 0.00248116 ETH | ||||
19888085 | 202 days ago | 0.01499999 ETH | ||||
19888085 | 202 days ago | 1 wei | ||||
19888085 | 202 days ago | 0.004 ETH | ||||
19888085 | 202 days ago | 0.016 ETH | ||||
19885666 | 203 days ago | 0.01508883 ETH | ||||
19885666 | 203 days ago | 1 wei | ||||
19885666 | 203 days ago | 0.00398223 ETH | ||||
19885666 | 203 days ago | 0.01592893 ETH | ||||
19854211 | 207 days ago | 0.0143 ETH | ||||
19854211 | 207 days ago | 0.00414 ETH | ||||
19854211 | 207 days ago | 0.01656 ETH |
Loading...
Loading
Contract Name:
PresaleV1
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-28 */ // Sources flattened with hardhat v2.22.2 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // 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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] // Original license: 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 IERC20Upgradeable { /** * @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 contracts/eth/PresaleV1.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.9; /* ██████╗ ██████╗ ███████╗███████╗ █████╗ ██╗ ███████╗ * ██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗██║ ██╔════╝ * ██████╔╝██████╔╝█████╗ ███████╗███████║██║ █████╗ * ██╔═══╝ ██╔══██╗██╔══╝ ╚════██║██╔══██║██║ ██╔══╝ * ██║ ██║ ██║███████╗███████║██║ ██║███████╗███████╗ * ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝╚══════╝╚══════╝ */ interface Aggregator { function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); } interface StakingManager { function depositByPresale(address _user, uint256 _amount) external; } contract PresaleV1 is Initializable, ReentrancyGuardUpgradeable, OwnableUpgradeable, PausableUpgradeable { uint256 public totalTokensSold; uint256 public startTime; uint256 public endTime; uint256 public claimStart; address public saleToken; uint256 public baseDecimals; uint256 public maxTokensToBuy; uint256 public currentStep; uint256 public checkPoint; uint256 public usdRaised; uint256 public timeConstant; uint256 public totalBoughtAndStaked; uint256[][3] public rounds; uint256[] public prevCheckpoints; uint256[] public remainingTokensTracker; uint256[] public percentages; address[] public wallets; address public paymentWallet; address public admin; bool public dynamicTimeFlag; bool public whitelistClaimOnly; bool public stakeingWhitelistStatus; IERC20Upgradeable public USDTInterface; Aggregator public aggregatorInterface; mapping(address => uint256) public userDeposits; mapping(address => bool) public hasClaimed; mapping(address => bool) public isBlacklisted; mapping(address => bool) public isWhitelisted; mapping(address => bool) public wertWhitelisted; StakingManager public stakingManagerInterface; event SaleTimeSet(uint256 _start, uint256 _end, uint256 timestamp); event SaleTimeUpdated(bytes32 indexed key, uint256 prevValue, uint256 newValue, uint256 timestamp); event TokensBought(address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 amountPaid, uint256 usdEq, uint256 timestamp); event TokensAdded(address indexed token, uint256 noOfTokens, uint256 timestamp); event TokensClaimed(address indexed user, uint256 amount, uint256 timestamp); event ClaimStartUpdated(uint256 prevValue, uint256 newValue, uint256 timestamp); event MaxTokensUpdated(uint256 prevValue, uint256 newValue, uint256 timestamp); event TokensBoughtAndStaked(address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 amountPaid, uint256 usdEq, uint256 timestamp); event TokensClaimedAndStaked(address indexed user, uint256 amount, uint256 timestamp); /// @custom:oz-upgrades-unsafe-allow constructor constructor() {} /** * @dev Initializes the contract and sets key parameters * @param _oracle Oracle contract to fetch ETH/USDT price * @param _usdt USDT token contract address * @param _startTime start time of the presale * @param _endTime end time of the presale * @param _rounds array of round details * @param _maxTokensToBuy amount of max tokens to buy * @param _paymentWallet address to recive payments */ function initialize(address _oracle, address _usdt, uint256 _startTime, uint256 _endTime, uint256[][3] memory _rounds, uint256 _maxTokensToBuy, address _paymentWallet) external initializer { require(_oracle != address(0), "Zero aggregator address"); require(_usdt != address(0), "Zero USDT address"); require(_startTime > block.timestamp && _endTime > _startTime, "Invalid time"); __Pausable_init_unchained(); __Ownable_init_unchained(); __ReentrancyGuard_init_unchained(); baseDecimals = (10 ** 18); aggregatorInterface = Aggregator(_oracle); USDTInterface = IERC20Upgradeable(_usdt); startTime = _startTime; endTime = _endTime; rounds = _rounds; maxTokensToBuy = _maxTokensToBuy; paymentWallet = _paymentWallet; emit SaleTimeSet(startTime, endTime, block.timestamp); } /** * @dev To pause the presale */ function pause() external onlyOwner { _pause(); } /** * @dev To unpause the presale */ function unpause() external onlyOwner { _unpause(); } /** * @dev To calculate the price in USD for given amount of tokens. * @param _amount No of tokens */ function calculatePrice(uint256 _amount) public view returns (uint256) { uint256 USDTAmount; uint256 total = checkPoint == 0 ? totalTokensSold : checkPoint; require(_amount <= maxTokensToBuy, "Amount exceeds max tokens to buy"); if (_amount + total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { require(currentStep < (rounds[0].length - 1), "Wrong params"); if (block.timestamp >= rounds[2][currentStep]) { require(rounds[0][currentStep] + _amount <= rounds[0][currentStep + 1], "Cant Purchase More in individual tx"); USDTAmount = _amount * rounds[1][currentStep + 1]; } else { uint256 tokenAmountForCurrentPrice = rounds[0][currentStep] - total; USDTAmount = tokenAmountForCurrentPrice * rounds[1][currentStep] + (_amount - tokenAmountForCurrentPrice) * rounds[1][currentStep + 1]; } } else USDTAmount = _amount * rounds[1][currentStep]; return USDTAmount; } /** * @dev To update the sale times * @param _startTime New start time * @param _endTime New end time */ function changeSaleTimes(uint256 _startTime, uint256 _endTime) external onlyOwner { require(_startTime > 0 || _endTime > 0, "Invalid parameters"); if (_startTime > 0) { require(block.timestamp < startTime, "Sale already started"); require(block.timestamp < _startTime, "Sale time in past"); uint256 prevValue = startTime; startTime = _startTime; emit SaleTimeUpdated(bytes32("START"), prevValue, _startTime, block.timestamp); } if (_endTime > 0) { require(_endTime > startTime, "Invalid endTime"); uint256 prevValue = endTime; endTime = _endTime; emit SaleTimeUpdated(bytes32("END"), prevValue, _endTime, block.timestamp); } } /** * @dev To get latest ETH price in 10**18 format */ function getLatestPrice() public view returns (uint256) { (, int256 price, , , ) = aggregatorInterface.latestRoundData(); price = (price * (10 ** 10)); return uint256(price); } function setSplits(address[] memory _wallets, uint256[] memory _percentages) public onlyOwner { require(_wallets.length == _percentages.length, "Mismatched arrays"); delete wallets; delete percentages; uint256 totalPercentage = 0; for (uint256 i = 0; i < _wallets.length; i++) { require(_percentages[i] > 0, "Percentage must be greater than 0"); totalPercentage += _percentages[i]; wallets.push(_wallets[i]); percentages.push(_percentages[i]); } require(totalPercentage == 100, "Total percentage must equal 100"); } modifier checkSaleState(uint256 amount) { require(block.timestamp >= startTime && block.timestamp <= endTime, "Invalid time for buying"); require(amount > 0, "Invalid sale amount"); _; } /** * @dev To buy into a presale using USDT * @param amount No of tokens to buy * @param stake boolean flag for token staking */ function buyWithUSDT(uint256 amount, bool stake) external checkSaleState(amount) whenNotPaused returns (bool) { uint256 usdPrice = calculatePrice(amount); totalTokensSold += amount; uint256 price = usdPrice / (10 ** 12); if (checkPoint != 0) checkPoint += amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total - amount; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakeingWhitelistStatus) { require(isWhitelisted[_msgSender()], "User not whitelisted for stake"); } stakingManagerInterface.depositByPresale(_msgSender(), amount * baseDecimals); totalBoughtAndStaked += amount; emit TokensBoughtAndStaked(_msgSender(), amount, address(USDTInterface), price, usdPrice, block.timestamp); } else { userDeposits[_msgSender()] += (amount * baseDecimals); emit TokensBought(_msgSender(), amount, address(USDTInterface), price, usdPrice, block.timestamp); } usdRaised += usdPrice; uint256 ourAllowance = USDTInterface.allowance(_msgSender(), address(this)); require(price <= ourAllowance, "Make sure to add enough allowance"); splitUSDTValue(price); return true; } /** * @dev To buy into a presale using ETH * @param amount No of tokens to buy * @param stake boolean flag for token staking */ function buyWithEth(uint256 amount, bool stake) external payable checkSaleState(amount) whenNotPaused nonReentrant returns (bool) { uint256 usdPrice = calculatePrice(amount); uint256 ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); require(msg.value >= ethAmount, "Less payment"); uint256 excess = msg.value - ethAmount; totalTokensSold += amount; if (checkPoint != 0) checkPoint += amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total - amount; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakeingWhitelistStatus) { require(isWhitelisted[_msgSender()], "User not whitelisted for stake"); } stakingManagerInterface.depositByPresale(_msgSender(), amount * baseDecimals); totalBoughtAndStaked += amount; emit TokensBoughtAndStaked(_msgSender(), amount, address(0), ethAmount, usdPrice, block.timestamp); } else { userDeposits[_msgSender()] += (amount * baseDecimals); emit TokensBought(_msgSender(), amount, address(0), ethAmount, usdPrice, block.timestamp); } usdRaised += usdPrice; splitETHValue(ethAmount); if (excess > 0) sendValue(payable(_msgSender()), excess); return true; } /** * @dev To buy ETH directly from wert .*wert contract address should be whitelisted if wertBuyRestrictionStatus is set true * @param _user address of the user * @param _amount No of ETH to buy * @param stake boolean flag for token staking */ function buyWithETHWert(address _user, uint256 _amount, bool stake) external payable checkSaleState(_amount) whenNotPaused nonReentrant returns (bool) { require(wertWhitelisted[_msgSender()], "User not whitelisted for this tx"); uint256 usdPrice = calculatePrice(_amount); uint256 ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); require(msg.value >= ethAmount, "Less payment"); uint256 excess = msg.value - ethAmount; totalTokensSold += _amount; if (checkPoint != 0) checkPoint += _amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + _amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total - _amount; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakeingWhitelistStatus) { require(isWhitelisted[_user], "User not whitelisted for stake"); } stakingManagerInterface.depositByPresale(_user, _amount * baseDecimals); totalBoughtAndStaked += _amount; emit TokensBoughtAndStaked(_user, _amount, address(0), ethAmount, usdPrice, block.timestamp); } else { userDeposits[_user] += (_amount * baseDecimals); emit TokensBought(_user, _amount, address(0), ethAmount, usdPrice, block.timestamp); } usdRaised += usdPrice; splitETHValue(ethAmount); if (excess > 0) sendValue(payable(_user), excess); return true; } /** * @dev Helper funtion to get ETH price for given amount * @param amount No of tokens to buy */ function ethBuyHelper(uint256 amount) external view returns (uint256 ethAmount) { uint256 usdPrice = calculatePrice(amount); ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); } /** * @dev Helper funtion to get USDT price for given amount * @param amount No of tokens to buy */ function usdtBuyHelper(uint256 amount) external view returns (uint256 usdPrice) { usdPrice = calculatePrice(amount); usdPrice = usdPrice / (10 ** 12); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Low balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "ETH Payment failed"); } function splitETHValue(uint256 _amount) internal { if (wallets.length == 0) { require(paymentWallet != address(0), "Payment wallet not set"); sendValue(payable(paymentWallet), _amount); } else { uint256 tempCalc; for (uint256 i = 0; i < wallets.length; i++) { uint256 amountToTransfer = (_amount * percentages[i]) / 100; sendValue(payable(wallets[i]), amountToTransfer); tempCalc += amountToTransfer; } if ((_amount - tempCalc) > 0) { sendValue(payable(wallets[wallets.length - 1]), _amount - tempCalc); } } } function splitUSDTValue(uint256 _amount) internal { if (wallets.length == 0) { require(paymentWallet != address(0), "Payment wallet not set"); (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature("transferFrom(address,address,uint256)", _msgSender(), paymentWallet, _amount)); require(success, "Token payment failed"); } else { uint256 tempCalc; for (uint256 i = 0; i < wallets.length; i++) { uint256 amountToTransfer = (_amount * percentages[i]) / 100; (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature("transferFrom(address,address,uint256)", _msgSender(), wallets[i], amountToTransfer)); require(success, "Token payment failed"); tempCalc += amountToTransfer; } if ((_amount - tempCalc) > 0) { (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature("transferFrom(address,address,uint256)", _msgSender(), wallets[wallets.length - 1], _amount - tempCalc)); require(success, "Token payment failed"); } } } /** * @dev to initialize staking manager with new addredd * @param _stakingManagerAddress address of the staking smartcontract */ function setStakingManager(address _stakingManagerAddress) external onlyOwner { require(_stakingManagerAddress != address(0), "staking manager cannot be inatialized with zero address"); stakingManagerInterface = StakingManager(_stakingManagerAddress); IERC20Upgradeable(saleToken).approve(_stakingManagerAddress, type(uint256).max); } /** * @dev To set the claim start time and sale token address by the owner * @param _claimStart claim start time * @param noOfTokens no of tokens to add to the contract * @param _saleToken sale toke address */ function startClaim(uint256 _claimStart, uint256 noOfTokens, address _saleToken, address _stakingManagerAddress) external onlyOwner returns (bool) { require(_saleToken != address(0), "Zero token address"); require(claimStart == 0, "Claim already set"); claimStart = _claimStart; saleToken = _saleToken; whitelistClaimOnly = true; stakingManagerInterface = StakingManager(_stakingManagerAddress); IERC20Upgradeable(_saleToken).approve(_stakingManagerAddress, type(uint256).max); // bool success = IERC20Upgradeable(_saleToken).transferFrom(_msgSender(), address(this), noOfTokens); // require(success, "Token transfer failed"); emit TokensAdded(_saleToken, noOfTokens, block.timestamp); return true; } /** * @dev To set status for claim whitelisting * @param _status bool value */ function setStakeingWhitelistStatus(bool _status) external onlyOwner { stakeingWhitelistStatus = _status; } /** * @dev To change the claim start time by the owner * @param _claimStart new claim start time */ function changeClaimStart(uint256 _claimStart) external onlyOwner returns (bool) { require(claimStart > 0, "Initial claim data not set"); require(_claimStart > endTime, "Sale in progress"); require(_claimStart > block.timestamp, "Claim start in past"); uint256 prevValue = claimStart; claimStart = _claimStart; emit ClaimStartUpdated(prevValue, _claimStart, block.timestamp); return true; } /** * @dev To claim tokens after claiming starts */ function claim() external whenNotPaused returns (bool) { require(saleToken != address(0), "Sale token not added"); require(!isBlacklisted[_msgSender()], "This Address is Blacklisted"); if (whitelistClaimOnly) { require(isWhitelisted[_msgSender()], "User not whitelisted for claim"); } require(block.timestamp >= claimStart, "Claim has not started yet"); require(!hasClaimed[_msgSender()], "Already claimed"); hasClaimed[_msgSender()] = true; uint256 amount = userDeposits[_msgSender()]; require(amount > 0, "Nothing to claim"); delete userDeposits[_msgSender()]; bool success = IERC20Upgradeable(saleToken).transfer(_msgSender(), amount); require(success, "Token transfer failed"); emit TokensClaimed(_msgSender(), amount, block.timestamp); return true; } function claimAndStake() external whenNotPaused returns (bool) { require(saleToken != address(0), "Sale token not added"); require(!isBlacklisted[_msgSender()], "This Address is Blacklisted"); if (stakeingWhitelistStatus) { require(isWhitelisted[_msgSender()], "User not whitelisted for stake"); } uint256 amount = userDeposits[_msgSender()]; require(amount > 0, "Nothing to stake"); stakingManagerInterface.depositByPresale(_msgSender(), amount); delete userDeposits[_msgSender()]; emit TokensClaimedAndStaked(_msgSender(), amount, block.timestamp); return true; } /** * @dev To add wert contract addresses to whitelist * @param _addressesToWhitelist addresses of the contract */ function whitelistUsersForWERT(address[] calldata _addressesToWhitelist) external onlyOwner { for (uint256 i = 0; i < _addressesToWhitelist.length; i++) { wertWhitelisted[_addressesToWhitelist[i]] = true; } } /** * @dev To remove wert contract addresses to whitelist * @param _addressesToRemoveFromWhitelist addresses of the contracts */ function removeFromWhitelistForWERT(address[] calldata _addressesToRemoveFromWhitelist) external onlyOwner { for (uint256 i = 0; i < _addressesToRemoveFromWhitelist.length; i++) { wertWhitelisted[_addressesToRemoveFromWhitelist[i]] = false; } } function changeMaxTokensToBuy(uint256 _maxTokensToBuy) external onlyOwner { require(_maxTokensToBuy > 0, "Zero max tokens to buy value"); uint256 prevValue = maxTokensToBuy; maxTokensToBuy = _maxTokensToBuy; emit MaxTokensUpdated(prevValue, _maxTokensToBuy, block.timestamp); } function changeRoundsData(uint256[][3] memory _rounds) external onlyOwner { rounds = _rounds; } /** * @dev To add users to blacklist which restricts blacklisted users from claiming * @param _usersToBlacklist addresses of the users */ function blacklistUsers(address[] calldata _usersToBlacklist) external onlyOwner { for (uint256 i = 0; i < _usersToBlacklist.length; i++) { isBlacklisted[_usersToBlacklist[i]] = true; } } /** * @dev To remove users from blacklist which restricts blacklisted users from claiming * @param _userToRemoveFromBlacklist addresses of the users */ function removeFromBlacklist(address[] calldata _userToRemoveFromBlacklist) external onlyOwner { for (uint256 i = 0; i < _userToRemoveFromBlacklist.length; i++) { isBlacklisted[_userToRemoveFromBlacklist[i]] = false; } } /** * @dev To add users to whitelist which restricts users from claiming if claimWhitelistStatus is true * @param _usersToWhitelist addresses of the users */ function whitelistUsers(address[] calldata _usersToWhitelist) external onlyOwner { for (uint256 i = 0; i < _usersToWhitelist.length; i++) { isWhitelisted[_usersToWhitelist[i]] = true; } } /** * @dev To remove users from whitelist which restricts users from claiming if claimWhitelistStatus is true * @param _userToRemoveFromWhitelist addresses of the users */ function removeFromWhitelist(address[] calldata _userToRemoveFromWhitelist) external onlyOwner { for (uint256 i = 0; i < _userToRemoveFromWhitelist.length; i++) { isWhitelisted[_userToRemoveFromWhitelist[i]] = false; } } /** * @dev To set status for claim whitelisting * @param _status bool value */ function setClaimWhitelistStatus(bool _status) external onlyOwner { whitelistClaimOnly = _status; } /** * @dev To set payment wallet address * @param _newPaymentWallet new payment wallet address */ function changePaymentWallet(address _newPaymentWallet) external onlyOwner { require(_newPaymentWallet != address(0), "address cannot be zero"); paymentWallet = _newPaymentWallet; } /** * @dev To manage time gap between two rounds */ function manageTimeDiff() internal { for (uint256 i; i < rounds[2].length - currentStep; i++) { rounds[2][currentStep + i] = block.timestamp + i * timeConstant; } } /** * @dev To set time constant for manageTimeDiff() * @param _timeConstant time in <days>*24*60*60 format */ function setTimeConstant(uint256 _timeConstant) external onlyOwner { timeConstant = _timeConstant; } /** * @dev To get array of round details at once * @param _no array index */ function roundDetails(uint256 _no) external view returns (uint256[] memory) { return rounds[_no]; } /** * @dev to update userDeposits for purchases made on BSC * @param _users array of users * @param _userDeposits array of userDeposits associated with users */ function updateFromBSC(address[] calldata _users, uint256[] calldata _userDeposits) external onlyOwner { require(_users.length == _userDeposits.length, "Length mismatch"); for (uint256 i = 0; i < _users.length; i++) { userDeposits[_users[i]] += _userDeposits[i]; } } /** * @dev To increment the rounds from backend */ function incrementCurrentStep() external { require(msg.sender == admin || msg.sender == owner(), "caller not admin or owner"); prevCheckpoints.push(checkPoint); if (dynamicTimeFlag) { manageTimeDiff(); } if (checkPoint < rounds[0][currentStep]) { if (currentStep == 0) { remainingTokensTracker.push(rounds[0][currentStep] - totalTokensSold); } else { remainingTokensTracker.push(rounds[0][currentStep] - checkPoint); } checkPoint = rounds[0][currentStep]; } currentStep++; } /** * @dev To set admin * @param _admin new admin wallet address */ function setAdmin(address _admin) external onlyOwner { admin = _admin; } /** * @dev To change details of the round * @param _step round for which you want to change the details * @param _checkpoint token tracker amount */ function setCurrentStep(uint256 _step, uint256 _checkpoint) external onlyOwner { currentStep = _step; checkPoint = _checkpoint; } /** * @dev To set time shift functionality on/off * @param _dynamicTimeFlag bool value */ function setDynamicTimeFlag(bool _dynamicTimeFlag) external onlyOwner { dynamicTimeFlag = _dynamicTimeFlag; } function trackRemainingTokens() external view returns (uint256[] memory) { return remainingTokensTracker; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimStartUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MaxTokensUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SaleTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SaleTimeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"noOfTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokensBought","type":"uint256"},{"indexed":true,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdEq","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokensBought","type":"uint256"},{"indexed":true,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdEq","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensBoughtAndStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensClaimedAndStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"USDTInterface","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregatorInterface","outputs":[{"internalType":"contract Aggregator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_usersToBlacklist","type":"address[]"}],"name":"blacklistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"buyWithETHWert","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"buyWithEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"buyWithUSDT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStart","type":"uint256"}],"name":"changeClaimStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensToBuy","type":"uint256"}],"name":"changeMaxTokensToBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPaymentWallet","type":"address"}],"name":"changePaymentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[][3]","name":"_rounds","type":"uint256[][3]"}],"name":"changeRoundsData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"changeSaleTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAndStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicTimeFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ethBuyHelper","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incrementCurrentStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"uint256[][3]","name":"_rounds","type":"uint256[][3]"},{"internalType":"uint256","name":"_maxTokensToBuy","type":"uint256"},{"internalType":"address","name":"_paymentWallet","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensToBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"percentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"prevCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"remainingTokensTracker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userToRemoveFromBlacklist","type":"address[]"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userToRemoveFromWhitelist","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressesToRemoveFromWhitelist","type":"address[]"}],"name":"removeFromWhitelistForWERT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_no","type":"uint256"}],"name":"roundDetails","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setClaimWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_step","type":"uint256"},{"internalType":"uint256","name":"_checkpoint","type":"uint256"}],"name":"setCurrentStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_dynamicTimeFlag","type":"bool"}],"name":"setDynamicTimeFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"},{"internalType":"uint256[]","name":"_percentages","type":"uint256[]"}],"name":"setSplits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setStakeingWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingManagerAddress","type":"address"}],"name":"setStakingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeConstant","type":"uint256"}],"name":"setTimeConstant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeingWhitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingManagerInterface","outputs":[{"internalType":"contract StakingManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStart","type":"uint256"},{"internalType":"uint256","name":"noOfTokens","type":"uint256"},{"internalType":"address","name":"_saleToken","type":"address"},{"internalType":"address","name":"_stakingManagerAddress","type":"address"}],"name":"startClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeConstant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBoughtAndStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trackRemainingTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_userDeposits","type":"uint256[]"}],"name":"updateFromBSC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"usdtBuyHelper","outputs":[{"internalType":"uint256","name":"usdPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wallets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wertWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistClaimOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_usersToWhitelist","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressesToWhitelist","type":"address[]"}],"name":"whitelistUsersForWERT","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614c78806100206000396000f3fe6080604052600436106104055760003560e01c80638456cb5911610213578063cad0055611610123578063edec5f27116100ab578063f597573f1161007a578063f597573f14610bca578063f851a44014610bea578063f885838614610c0a578063fb9a4acd14610c2a578063fe575a8714610c4a57600080fd5b8063edec5f2714610b54578063f04d688f14610b74578063f2fde38b14610b8a578063f446374314610baa57600080fd5b8063e19648db116100f2578063e19648db14610abe578063e32204dd14610ade578063e6da921314610afe578063e985e36714610b1e578063eadd94ec14610b3e57600080fd5b8063cad0055614610a52578063cb1a4fc014610a72578063cff805ab14610a87578063dad80e8614610a9d57600080fd5b8063ae104265116101a6578063ba166a3911610175578063ba166a39146109b0578063bb3d676a146109dd578063c23326f3146109fd578063c49cc64514610a1d578063c8adff0114610a3d57600080fd5b8063ae1042651461093d578063ae4e0a181461095d578063b00bba6a14610970578063b8977d6d1461099057600080fd5b80638e15f473116101e25780638e15f473146108d25780639a89c1fb146108e75780639cfa0f7c14610907578063a6d42e4e1461091d57600080fd5b80638456cb591461085f57806389daf799146108745780638ac08082146108945780638da5cb5b146108b457600080fd5b806343568eae1161031957806363b20117116102a1578063715018a611610270578063715018a6146107ce57806373b2e80e146107e357806378e97925146108135780637ad71f72146108295780637f6fb2531461084957600080fd5b806363b201171461076357806363e4087914610779578063641046f414610799578063704b6c02146107ae57600080fd5b806357405d05116102e857806357405d05146106c55780635bc34f71146106e55780635c975abb146106fb5780635ddc5688146107135780635df4f3531461073357600080fd5b806343568eae146106595780634e71d92d1461066f57806353d9920714610684578063548db174146106a557600080fd5b806323a8f1c01161039c5780633197cbb61161036b5780633197cbb6146105b057806333f76178146105c657806338646608146105dc5780633af32abf146106145780633f4ba83a1461064457600080fd5b806323a8f1c01461053d578063278c278b1461055d57806329a5a0b61461057d5780632c65169e1461059d57600080fd5b80630dc9c838116103d85780630dc9c838146104bc578063136021d9146104dc5780631ddc6091146104fc5780631fa2bc921461051c57600080fd5b806303b9c5ad1461040a57806307f180821461042c5780630a200fc7146104615780630ba36dcd14610481575b600080fd5b34801561041657600080fd5b5061042a6104253660046143ea565b610c7a565b005b34801561043857600080fd5b5061044c61044736600461442c565b610cf9565b60405190151581526020015b60405180910390f35b34801561046d57600080fd5b5061042a61047c366004614453565b610e35565b34801561048d57600080fd5b506104ae61049c366004614487565b60e06020526000908152604090205481565b604051908152602001610458565b3480156104c857600080fd5b5061042a6104d73660046144a2565b610e5b565b3480156104e857600080fd5b5061044c6104f73660046144c4565b611037565b34801561050857600080fd5b5061042a610517366004614453565b611587565b34801561052857600080fd5b5060dd5461044c90600160a01b900460ff1681565b34801561054957600080fd5b5061042a61055836600461442c565b6115ad565b34801561056957600080fd5b5061042a61057836600461442c565b6115ba565b34801561058957600080fd5b506104ae61059836600461442c565b61165d565b61044c6105ab3660046144c4565b611691565b3480156105bc57600080fd5b506104ae60cb5481565b3480156105d257600080fd5b506104ae60ce5481565b3480156105e857600080fd5b5060e5546105fc906001600160a01b031681565b6040516001600160a01b039091168152602001610458565b34801561062057600080fd5b5061044c61062f366004614487565b60e36020526000908152604090205460ff1681565b34801561065057600080fd5b5061042a611b81565b34801561066557600080fd5b506104ae60d35481565b34801561067b57600080fd5b5061044c611b93565b34801561069057600080fd5b5060dd5461044c90600160a81b900460ff1681565b3480156106b157600080fd5b5061042a6106c03660046143ea565b611eef565b3480156106d157600080fd5b5061042a6106e0366004614658565b611f69565b3480156106f157600080fd5b506104ae60d05481565b34801561070757600080fd5b5060975460ff1661044c565b34801561071f57600080fd5b5061042a61072e3660046146e4565b612235565b34801561073f57600080fd5b5061044c61074e366004614487565b60e46020526000908152604090205460ff1681565b34801561076f57600080fd5b506104ae60c95481565b34801561078557600080fd5b506104ae61079436600461442c565b612429565b3480156107a557600080fd5b5061042a61244b565b3480156107ba57600080fd5b5061042a6107c9366004614487565b612614565b3480156107da57600080fd5b5061042a61263e565b3480156107ef57600080fd5b5061044c6107fe366004614487565b60e16020526000908152604090205460ff1681565b34801561081f57600080fd5b506104ae60ca5481565b34801561083557600080fd5b506105fc61084436600461442c565b612650565b34801561085557600080fd5b506104ae60d45481565b34801561086b57600080fd5b5061042a61267a565b34801561088057600080fd5b5061042a61088f3660046143ea565b61268a565b3480156108a057600080fd5b5061044c6108af3660046147a4565b612704565b3480156108c057600080fd5b506065546001600160a01b03166105fc565b3480156108de57600080fd5b506104ae6128ac565b3480156108f357600080fd5b5061042a6109023660046144a2565b61294c565b34801561091357600080fd5b506104ae60cf5481565b34801561092957600080fd5b5061042a6109383660046147ea565b61295f565b34801561094957600080fd5b506104ae61095836600461442c565b612974565b61044c61096b366004614827565b612caa565b34801561097c57600080fd5b5061042a61098b366004614487565b613223565b34801561099c57600080fd5b5061042a6109ab366004614453565b613345565b3480156109bc57600080fd5b506109d06109cb36600461442c565b61336b565b6040516104589190614867565b3480156109e957600080fd5b5061042a6109f83660046143ea565b6133d7565b348015610a0957600080fd5b506104ae610a1836600461442c565b613451565b348015610a2957600080fd5b5060df546105fc906001600160a01b031681565b348015610a4957600080fd5b506109d0613472565b348015610a5e57600080fd5b5061042a610a6d366004614487565b6134ca565b348015610a7e57600080fd5b5061044c613543565b348015610a9357600080fd5b506104ae60d15481565b348015610aa957600080fd5b5060dd5461044c90600160b01b900460ff1681565b348015610aca57600080fd5b506104ae610ad936600461442c565b61377a565b348015610aea57600080fd5b5060dc546105fc906001600160a01b031681565b348015610b0a57600080fd5b506104ae610b193660046144a2565b61378a565b348015610b2a57600080fd5b5060cd546105fc906001600160a01b031681565b348015610b4a57600080fd5b506104ae60d25481565b348015610b6057600080fd5b5061042a610b6f3660046143ea565b6137be565b348015610b8057600080fd5b506104ae60cc5481565b348015610b9657600080fd5b5061042a610ba5366004614487565b613838565b348015610bb657600080fd5b5061042a610bc53660046143ea565b6138b1565b348015610bd657600080fd5b5060de546105fc906001600160a01b031681565b348015610bf657600080fd5b5060dd546105fc906001600160a01b031681565b348015610c1657600080fd5b506104ae610c2536600461442c565b61392b565b348015610c3657600080fd5b5061042a610c453660046148ab565b61393b565b348015610c5657600080fd5b5061044c610c65366004614487565b60e26020526000908152604090205460ff1681565b610c82613a21565b60005b81811015610cf457600160e46000858585818110610ca557610ca5614917565b9050602002016020810190610cba9190614487565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610cec81614943565b915050610c85565b505050565b6000610d03613a21565b600060cc5411610d5a5760405162461bcd60e51b815260206004820152601a60248201527f496e697469616c20636c61696d2064617461206e6f742073657400000000000060448201526064015b60405180910390fd5b60cb548211610d9e5760405162461bcd60e51b815260206004820152601060248201526f53616c6520696e2070726f677265737360801b6044820152606401610d51565b428211610de35760405162461bcd60e51b815260206004820152601360248201527210db185a5b481cdd185c9d081a5b881c185cdd606a1b6044820152606401610d51565b60cc8054908390556040805182815260208101859052428183015290517f5f3a900c85949962b4cc192dd3714dae64071dc2e907049ec720b023270905a49181900360600190a160019150505b919050565b610e3d613a21565b60dd8054911515600160a01b0260ff60a01b19909216919091179055565b610e63613a21565b6000821180610e725750600081115b610eb35760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d657465727360701b6044820152606401610d51565b8115610f985760ca544210610f015760405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b6044820152606401610d51565b814210610f445760405162461bcd60e51b815260206004820152601160248201527014d85b19481d1a5b59481a5b881c185cdd607a1b6044820152606401610d51565b60ca8054908390556040805182815260208101859052428183015290516414d510549560da1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b80156110335760ca548111610fe15760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420656e6454696d6560881b6044820152606401610d51565b60cb8054908290556040805182815260208101849052428183015290516211539160ea1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b5050565b60008260ca54421015801561104e575060cb544211155b61106a5760405162461bcd60e51b8152600401610d519061495e565b6000811161108a5760405162461bcd60e51b8152600401610d5190614995565b611092613a7b565b600061109d85612974565b90508460c960008282546110b191906149c2565b90915550600090506110c864e8d4a51000836149da565b905060d1546000146110ec578560d160008282546110e691906149c2565b90915550505b600060d15460c954116111015760d154611105565b60c9545b905060d560000160d0548154811061111f5761111f614917565b9060005260206000200154811180611159575060d560020160d0548154811061114a5761114a614917565b90600052602060002001544210155b156112935760d560020160d0548154811061117657611176614917565b906000526020600020015442106111b9578660d560000160d054815481106111a0576111a0614917565b90600052602060002001546111b591906149c2565b60d1555b60dd54600160a01b900460ff16156111d3576111d3613ac1565b600060d5810160d054815481106111ec576111ec614917565b9060005260206000200154821161123b57878260d560000160d0548154811061121757611217614917565b906000526020600020015461122c91906149fc565b61123691906149fc565b61123e565b60005b60d980546001818101835560009283527fcc6782fd46dd71c5f512301ab049782450b4eaf79fdac5443d93d274d391678690910183905560d08054939450909290919061128c9084906149c2565b9091555050505b85156113d65760dd54600160b01b900460ff16156112da5733600090815260e3602052604090205460ff166112da5760405162461bcd60e51b8152600401610d5190614a13565b60e5546001600160a01b03166391c619663360ce546112f9908b614a4a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561133f57600080fd5b505af1158015611353573d6000803e3d6000fd5b505050508660d4600082825461136991906149c2565b909155505060de546001600160a01b031687336001600160a01b03167f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a8587426040516113c9939291909283526020830191909152604082015260600190565b60405180910390a461146b565b60ce546113e39088614a4a565b33600090815260e06020526040812080549091906114029084906149c2565b909155505060de546001600160a01b031687336001600160a01b03167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36858742604051611462939291909283526020830191909152604082015260600190565b60405180910390a45b8260d2600082825461147d91906149c2565b909155505060de546000906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156114dc57600080fd5b505afa1580156114f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115149190614a69565b9050808311156115705760405162461bcd60e51b815260206004820152602160248201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636044820152606560f81b6064820152608401610d51565b61157983613b31565b506001979650505050505050565b61158f613a21565b60dd8054911515600160a81b0260ff60a81b19909216919091179055565b6115b5613a21565b60d355565b6115c2613a21565b600081116116125760405162461bcd60e51b815260206004820152601c60248201527f5a65726f206d617820746f6b656e7320746f206275792076616c7565000000006044820152606401610d51565b60cf8054908290556040805182815260208101849052428183015290517f76f9e5e1f6af6a9f180708b77a5c99210fbf19b91f1f194f3918c262b8edf77c9181900360600190a15050565b60008061166983612974565b90506116736128ac565b60ce546116809083614a4a565b61168a91906149da565b9392505050565b60008260ca5442101580156116a8575060cb544211155b6116c45760405162461bcd60e51b8152600401610d519061495e565b600081116116e45760405162461bcd60e51b8152600401610d5190614995565b6116ec613a7b565b6002600154141561173f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d51565b6002600155600061174f85612974565b9050600061175b6128ac565b60ce546117689084614a4a565b61177291906149da565b9050803410156117b35760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610d51565b60006117bf82346149fc565b90508660c960008282546117d391906149c2565b909155505060d154156117f8578660d160008282546117f291906149c2565b90915550505b600060d15460c9541161180d5760d154611811565b60c9545b905060d560000160d0548154811061182b5761182b614917565b9060005260206000200154811180611865575060d560020160d0548154811061185657611856614917565b90600052602060002001544210155b1561199f5760d560020160d0548154811061188257611882614917565b906000526020600020015442106118c5578760d560000160d054815481106118ac576118ac614917565b90600052602060002001546118c191906149c2565b60d1555b60dd54600160a01b900460ff16156118df576118df613ac1565b600060d5810160d054815481106118f8576118f8614917565b9060005260206000200154821161194757888260d560000160d0548154811061192357611923614917565b906000526020600020015461193891906149fc565b61194291906149fc565b61194a565b60005b60d980546001818101835560009283527fcc6782fd46dd71c5f512301ab049782450b4eaf79fdac5443d93d274d391678690910183905560d0805493945090929091906119989084906149c2565b9091555050505b8615611ac65760dd54600160b01b900460ff16156119e65733600090815260e3602052604090205460ff166119e65760405162461bcd60e51b8152600401610d5190614a13565b60e5546001600160a01b03166391c619663360ce54611a05908c614a4a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611a4b57600080fd5b505af1158015611a5f573d6000803e3d6000fd5b505050508760d46000828254611a7591906149c2565b90915550506040805184815260208101869052428183015290516000918a9133917f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a919081900360600190a4611b3f565b60ce54611ad39089614a4a565b33600090815260e0602052604081208054909190611af29084906149c2565b90915550506040805184815260208101869052428183015290516000918a9133917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36919081900360600190a45b8360d26000828254611b5191906149c2565b90915550611b60905083613eca565b8115611b7057611b703383614027565b505060018080559695505050505050565b611b89613a21565b611b916140fd565b565b6000611b9d613a7b565b60cd546001600160a01b0316611bec5760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610d51565b33600090815260e2602052604090205460ff1615611c4c5760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610d51565b60dd54600160a81b900460ff1615611cbd5733600090815260e3602052604090205460ff16611cbd5760405162461bcd60e51b815260206004820152601e60248201527f55736572206e6f742077686974656c697374656420666f7220636c61696d00006044820152606401610d51565b60cc54421015611d0f5760405162461bcd60e51b815260206004820152601960248201527f436c61696d20686173206e6f74207374617274656420796574000000000000006044820152606401610d51565b33600090815260e1602052604090205460ff1615611d615760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610d51565b33600090815260e160209081526040808320805460ff1916600117905560e090915290205480611dc65760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610d51565b33600081815260e06020908152604080832083905560cd54815163a9059cbb60e01b8152600481019590955260248501869052905192936001600160a01b039091169263a9059cbb9260448084019391929182900301818787803b158015611e2d57600080fd5b505af1158015611e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e659190614a82565b905080611eac5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610d51565b6040805183815242602082015233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b910160405180910390a260019250505090565b611ef7613a21565b60005b81811015610cf457600060e36000858585818110611f1a57611f1a614917565b9050602002016020810190611f2f9190614487565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611f6181614943565b915050611efa565b600054610100900460ff1615808015611f895750600054600160ff909116105b80611fa35750303b158015611fa3575060005460ff166001145b6120065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d51565b6000805460ff191660011790558015612029576000805461ff0019166101001790555b6001600160a01b03881661207f5760405162461bcd60e51b815260206004820152601760248201527f5a65726f2061676772656761746f7220616464726573730000000000000000006044820152606401610d51565b6001600160a01b0387166120c95760405162461bcd60e51b81526020600482015260116024820152705a65726f2055534454206164647265737360781b6044820152606401610d51565b42861180156120d757508585115b6121125760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b6044820152606401610d51565b61211a61414f565b612122614182565b61212a6141b2565b670de0b6b3a764000060ce5560df80546001600160a01b03808b166001600160a01b03199283161790925560de8054928a169290911691909117905560ca86905560cb85905561217d60d58560036142b7565b5060cf83905560dc80546001600160a01b0319166001600160a01b03841617905560ca5460cb5460408051928352602083019190915242908201527f23f6ad8232d75562dd1c6b37dfc895af6bfc1ecd0fb3b88722c6a5e6b4dc9a209060600160405180910390a1801561222b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61223d613a21565b80518251146122825760405162461bcd60e51b81526020600482015260116024820152704d69736d6174636865642061727261797360781b6044820152606401610d51565b61228e60db6000614307565b61229a60da6000614307565b6000805b83518110156123d85760008382815181106122bb576122bb614917565b60200260200101511161231a5760405162461bcd60e51b815260206004820152602160248201527f50657263656e74616765206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608401610d51565b82818151811061232c5761232c614917565b60200260200101518261233f91906149c2565b915060db84828151811061235557612355614917565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b03909216919091179055825160da908490839081106123a7576123a7614917565b60209081029190910181015182546001810184556000938452919092200155806123d081614943565b91505061229e565b5080606414610cf45760405162461bcd60e51b815260206004820152601f60248201527f546f74616c2070657263656e74616765206d75737420657175616c20313030006044820152606401610d51565b600061243482612974565b905061244564e8d4a51000826149da565b92915050565b60dd546001600160a01b031633148061246e57506065546001600160a01b031633145b6124ba5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206e6f742061646d696e206f72206f776e6572000000000000006044820152606401610d51565b60d15460d880546001810182556000919091527f5320ad99a619a90804cd2efe3a5cf0ac1ac5c41ad9ff2c61cf699efdad771096015560dd54600160a01b900460ff161561250a5761250a613ac1565b60d560000160d0548154811061252257612522614917565b906000526020600020015460d15410156125fd5760d05461258b5760c95460d99060d560000160d0548154811061255b5761255b614917565b906000526020600020015461257091906149fc565b815460018101835560009283526020909220909101556125d5565b60d15460d99060d560000160d054815481106125a9576125a9614917565b90600052602060002001546125be91906149fc565b815460018101835560009283526020909220909101555b60d560000160d054815481106125ed576125ed614917565b60009182526020909120015460d1555b60d0805490600061260d83614943565b9190505550565b61261c613a21565b60dd80546001600160a01b0319166001600160a01b0392909216919091179055565b612646613a21565b611b9160006141df565b60db818154811061266057600080fd5b6000918252602090912001546001600160a01b0316905081565b612682613a21565b611b91614231565b612692613a21565b60005b81811015610cf457600060e260008585858181106126b5576126b5614917565b90506020020160208101906126ca9190614487565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806126fc81614943565b915050612695565b600061270e613a21565b6001600160a01b0383166127595760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610d51565b60cc541561279d5760405162461bcd60e51b815260206004820152601160248201527010db185a5b48185b1c9958591e481cd95d607a1b6044820152606401610d51565b60cc85905560cd80546001600160a01b038581166001600160a01b0319928316811790935560dd805460ff60a81b1916600160a81b17905560e5805491861691909216811790915560405163095ea7b360e01b81526004810191909152600019602482015263095ea7b390604401602060405180830381600087803b15801561282557600080fd5b505af1158015612839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285d9190614a82565b50604080518581524260208201526001600160a01b038516917fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8910160405180910390a2506001949350505050565b60008060df60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156128fd57600080fd5b505afa158015612911573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129359190614ab9565b505050915050806402540be4006124459190614b09565b612954613a21565b60d09190915560d155565b612967613a21565b61103360d58260036142b7565b600080600060d15460001461298b5760d15461298f565b60c9545b905060cf548411156129e35760405162461bcd60e51b815260206004820181905260248201527f416d6f756e742065786365656473206d617820746f6b656e7320746f206275796044820152606401610d51565b60d560000160d054815481106129fb576129fb614917565b90600052602060002001548185612a1291906149c2565b1180612a40575060d560020160d05481548110612a3157612a31614917565b90600052602060002001544210155b15612c725760d554612a54906001906149fc565b60d05410612a935760405162461bcd60e51b815260206004820152600c60248201526b57726f6e6720706172616d7360a01b6044820152606401610d51565b60d560020160d05481548110612aab57612aab614917565b90600052602060002001544210612bbe5760d05460d590612acd9060016149c2565b81548110612add57612add614917565b90600052602060002001548460d5600060038110612afd57612afd614917565b0160d05481548110612b1157612b11614917565b9060005260206000200154612b2691906149c2565b1115612b805760405162461bcd60e51b815260206004820152602360248201527f43616e74205075726368617365204d6f726520696e20696e646976696475616c604482015262040e8f60eb1b6064820152608401610d51565b60d05460d690612b919060016149c2565b81548110612ba157612ba1614917565b906000526020600020015484612bb79190614a4a565b9150612ca3565b60008160d5820160d05481548110612bd857612bd8614917565b9060005260206000200154612bed91906149fc565b60d05490915060d690612c019060016149c2565b81548110612c1157612c11614917565b90600052602060002001548186612c2891906149fc565b612c329190614a4a565b60d560010160d05481548110612c4a57612c4a614917565b906000526020600020015482612c609190614a4a565b612c6a91906149c2565b925050612ca3565b60d560010160d05481548110612c8a57612c8a614917565b906000526020600020015484612ca09190614a4a565b91505b5092915050565b60008260ca544210158015612cc1575060cb544211155b612cdd5760405162461bcd60e51b8152600401610d519061495e565b60008111612cfd5760405162461bcd60e51b8152600401610d5190614995565b612d05613a7b565b60026001541415612d585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d51565b600260015533600090815260e4602052604090205460ff16612dbc5760405162461bcd60e51b815260206004820181905260248201527f55736572206e6f742077686974656c697374656420666f7220746869732074786044820152606401610d51565b6000612dc785612974565b90506000612dd36128ac565b60ce54612de09084614a4a565b612dea91906149da565b905080341015612e2b5760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610d51565b6000612e3782346149fc565b90508660c96000828254612e4b91906149c2565b909155505060d15415612e70578660d16000828254612e6a91906149c2565b90915550505b600060d15460c95411612e855760d154612e89565b60c9545b905060d560000160d05481548110612ea357612ea3614917565b9060005260206000200154811180612edd575060d560020160d05481548110612ece57612ece614917565b90600052602060002001544210155b156130175760d560020160d05481548110612efa57612efa614917565b90600052602060002001544210612f3d578760d560000160d05481548110612f2457612f24614917565b9060005260206000200154612f3991906149c2565b60d1555b60dd54600160a01b900460ff1615612f5757612f57613ac1565b600060d5810160d05481548110612f7057612f70614917565b90600052602060002001548211612fbf57888260d560000160d05481548110612f9b57612f9b614917565b9060005260206000200154612fb091906149fc565b612fba91906149fc565b612fc2565b60005b60d980546001818101835560009283527fcc6782fd46dd71c5f512301ab049782450b4eaf79fdac5443d93d274d391678690910183905560d0805493945090929091906130109084906149c2565b9091555050505b86156131555760dd54600160b01b900460ff1615613067576001600160a01b038916600090815260e3602052604090205460ff166130675760405162461bcd60e51b8152600401610d5190614a13565b60e55460ce546001600160a01b03909116906391c61966908b9061308b908c614a4a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156130d157600080fd5b505af11580156130e5573d6000803e3d6000fd5b505050508760d460008282546130fb91906149c2565b90915550506040805184815260208101869052428183015290516000918a916001600160a01b038d16917f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a919081900360600190a46131e0565b60ce546131629089614a4a565b6001600160a01b038a16600090815260e060205260408120805490919061318a9084906149c2565b90915550506040805184815260208101869052428183015290516000918a916001600160a01b038d16917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36919081900360600190a45b8360d260008282546131f291906149c2565b90915550613201905083613eca565b8115613211576132118983614027565b50506001808055979650505050505050565b61322b613a21565b6001600160a01b0381166132a75760405162461bcd60e51b815260206004820152603760248201527f7374616b696e67206d616e616765722063616e6e6f7420626520696e6174696160448201527f6c697a65642077697468207a65726f20616464726573730000000000000000006064820152608401610d51565b60e580546001600160a01b0319166001600160a01b0383811691821790925560cd5460405163095ea7b360e01b8152600481019290925260001960248301529091169063095ea7b390604401602060405180830381600087803b15801561330d57600080fd5b505af1158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190614a82565b61334d613a21565b60dd8054911515600160b01b0260ff60b01b19909216919091179055565b606060d5826003811061338057613380614917565b018054806020026020016040519081016040528092919081815260200182805480156133cb57602002820191906000526020600020905b8154815260200190600101908083116133b7575b50505050509050919050565b6133df613a21565b60005b81811015610cf457600160e2600085858581811061340257613402614917565b90506020020160208101906134179190614487565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061344981614943565b9150506133e2565b60d9818154811061346157600080fd5b600091825260209091200154905081565b606060d98054806020026020016040519081016040528092919081815260200182805480156134c057602002820191906000526020600020905b8154815260200190600101908083116134ac575b5050505050905090565b6134d2613a21565b6001600160a01b0381166135215760405162461bcd60e51b8152602060048201526016602482015275616464726573732063616e6e6f74206265207a65726f60501b6044820152606401610d51565b60dc80546001600160a01b0319166001600160a01b0392909216919091179055565b600061354d613a7b565b60cd546001600160a01b031661359c5760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610d51565b33600090815260e2602052604090205460ff16156135fc5760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610d51565b60dd54600160b01b900460ff161561363d5733600090815260e3602052604090205460ff1661363d5760405162461bcd60e51b8152600401610d5190614a13565b33600090815260e060205260409020548061368d5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f207374616b6560801b6044820152606401610d51565b60e5546001600160a01b03166391c61966336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b1580156136e757600080fd5b505af11580156136fb573d6000803e3d6000fd5b5050505060e0600061370a3390565b6001600160a01b031681526020810191909152604001600090812055336001600160a01b03167ffa4ec67f9254455933eb145bae864b26f29dd0a7bbb76eb11e4d6b8b9b184c2b824260405161376a929190918252602082015260400190565b60405180910390a2600191505090565b60d8818154811061346157600080fd5b60d5826003811061379a57600080fd5b0181815481106137a957600080fd5b90600052602060002001600091509150505481565b6137c6613a21565b60005b81811015610cf457600160e360008585858181106137e9576137e9614917565b90506020020160208101906137fe9190614487565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061383081614943565b9150506137c9565b613840613a21565b6001600160a01b0381166138a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d51565b6138ae816141df565b50565b6138b9613a21565b60005b81811015610cf457600060e460008585858181106138dc576138dc614917565b90506020020160208101906138f19190614487565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061392381614943565b9150506138bc565b60da818154811061346157600080fd5b613943613a21565b8281146139845760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610d51565b60005b83811015613a1a578282828181106139a1576139a1614917565b9050602002013560e060008787858181106139be576139be614917565b90506020020160208101906139d39190614487565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254613a0291906149c2565b90915550819050613a1281614943565b915050613987565b5050505050565b6065546001600160a01b03163314611b915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d51565b60975460ff1615611b915760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d51565b60005b60d05460d754613ad491906149fc565b8110156138ae5760d354613ae89082614a4a565b613af290426149c2565b60d05460d790613b039084906149c2565b81548110613b1357613b13614917565b60009182526020909120015580613b2981614943565b915050613ac4565b60db54613c585760dc546001600160a01b0316613b895760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d081dd85b1b195d081b9bdd081cd95d60521b6044820152606401610d51565b60de546000906001600160a01b03163360dc546040516001600160a01b039283166024820152911660448201526064810184905260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613bf59190614b8e565b6000604051808303816000865af19150503d8060008114613c32576040519150601f19603f3d011682016040523d82523d6000602084013e613c37565b606091505b50509050806110335760405162461bcd60e51b8152600401610d5190614bc9565b6000805b60db54811015613dac576000606460da8381548110613c7d57613c7d614917565b906000526020600020015485613c939190614a4a565b613c9d91906149da565b60de549091506000906001600160a01b03163360db8581548110613cc357613cc3614917565b6000918252602090912001546040516001600160a01b039283166024820152911660448201526064810184905260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613d289190614b8e565b6000604051808303816000865af19150503d8060008114613d65576040519150601f19603f3d011682016040523d82523d6000602084013e613d6a565b606091505b5050905080613d8b5760405162461bcd60e51b8152600401610d5190614bc9565b613d9582856149c2565b935050508080613da490614943565b915050613c5c565b506000613db982846149fc565b11156110335760de546000906001600160a01b03163360db8054613ddf906001906149fc565b81548110613def57613def614917565b6000918252602090912001546001600160a01b0316613e0e85876149fc565b6040516001600160a01b039384166024820152929091166044830152606482015260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613e679190614b8e565b6000604051808303816000865af19150503d8060008114613ea4576040519150601f19603f3d011682016040523d82523d6000602084013e613ea9565b606091505b5050905080610cf45760405162461bcd60e51b8152600401610d5190614bc9565b60db54613f385760dc546001600160a01b0316613f225760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d081dd85b1b195d081b9bdd081cd95d60521b6044820152606401610d51565b60dc546138ae906001600160a01b031682614027565b6000805b60db54811015613fd0576000606460da8381548110613f5d57613f5d614917565b906000526020600020015485613f739190614a4a565b613f7d91906149da565b9050613fb060db8381548110613f9557613f95614917565b6000918252602090912001546001600160a01b031682614027565b613fba81846149c2565b9250508080613fc890614943565b915050613f3c565b506000613fdd82846149fc565b11156110335760db80546110339190613ff8906001906149fc565b8154811061400857614008614917565b6000918252602090912001546001600160a01b031661402783856149fc565b804710156140655760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401610d51565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146140b2576040519150601f19603f3d011682016040523d82523d6000602084013e6140b7565b606091505b5050905080610cf45760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b6044820152606401610d51565b61410561426e565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600054610100900460ff166141765760405162461bcd60e51b8152600401610d5190614bf7565b6097805460ff19169055565b600054610100900460ff166141a95760405162461bcd60e51b8152600401610d5190614bf7565b611b91336141df565b600054610100900460ff166141d95760405162461bcd60e51b8152600401610d5190614bf7565b60018055565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b614239613a7b565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586141323390565b60975460ff16611b915760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d51565b82600381019282156142f7579160200282015b828111156142f757825180516142e7918491602090910190614325565b50916020019190600101906142ca565b5061430392915061436c565b5090565b50805460008255906000526020600020908101906138ae9190614389565b828054828255906000526020600020908101928215614360579160200282015b82811115614360578251825591602001919060010190614345565b50614303929150614389565b808211156143035760006143808282614307565b5060010161436c565b5b80821115614303576000815560010161438a565b60008083601f8401126143b057600080fd5b50813567ffffffffffffffff8111156143c857600080fd5b6020830191508360208260051b85010111156143e357600080fd5b9250929050565b600080602083850312156143fd57600080fd5b823567ffffffffffffffff81111561441457600080fd5b6144208582860161439e565b90969095509350505050565b60006020828403121561443e57600080fd5b5035919050565b80151581146138ae57600080fd5b60006020828403121561446557600080fd5b813561168a81614445565b80356001600160a01b0381168114610e3057600080fd5b60006020828403121561449957600080fd5b61168a82614470565b600080604083850312156144b557600080fd5b50508035926020909101359150565b600080604083850312156144d757600080fd5b8235915060208301356144e981614445565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614533576145336144f4565b604052919050565b600067ffffffffffffffff821115614555576145556144f4565b5060051b60200190565b600082601f83011261457057600080fd5b813560206145856145808361453b565b61450a565b82815260059290921b840181019181810190868411156145a457600080fd5b8286015b848110156145bf57803583529183019183016145a8565b509695505050505050565b600082601f8301126145db57600080fd5b6040516060810167ffffffffffffffff82821081831117156145ff576145ff6144f4565b81604052829150606085018681111561461757600080fd5b855b8181101561464c578035838111156146315760008081fd5b61463d89828a0161455f565b85525060209384019301614619565b50929695505050505050565b600080600080600080600060e0888a03121561467357600080fd5b61467c88614470565b965061468a60208901614470565b95506040880135945060608801359350608088013567ffffffffffffffff8111156146b457600080fd5b6146c08a828b016145ca565b93505060a088013591506146d660c08901614470565b905092959891949750929550565b600080604083850312156146f757600080fd5b823567ffffffffffffffff8082111561470f57600080fd5b818501915085601f83011261472357600080fd5b813560206147336145808361453b565b82815260059290921b8401810191818101908984111561475257600080fd5b948201945b838610156147775761476886614470565b82529482019490820190614757565b9650508601359250508082111561478d57600080fd5b5061479a8582860161455f565b9150509250929050565b600080600080608085870312156147ba57600080fd5b84359350602085013592506147d160408601614470565b91506147df60608601614470565b905092959194509250565b6000602082840312156147fc57600080fd5b813567ffffffffffffffff81111561481357600080fd5b61481f848285016145ca565b949350505050565b60008060006060848603121561483c57600080fd5b61484584614470565b925060208401359150604084013561485c81614445565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561489f57835183529284019291840191600101614883565b50909695505050505050565b600080600080604085870312156148c157600080fd5b843567ffffffffffffffff808211156148d957600080fd5b6148e58883890161439e565b909650945060208701359150808211156148fe57600080fd5b5061490b8782880161439e565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156149575761495761492d565b5060010190565b60208082526017908201527f496e76616c69642074696d6520666f7220627579696e67000000000000000000604082015260600190565b602080825260139082015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b604082015260600190565b600082198211156149d5576149d561492d565b500190565b6000826149f757634e487b7160e01b600052601260045260246000fd5b500490565b600082821015614a0e57614a0e61492d565b500390565b6020808252601e908201527f55736572206e6f742077686974656c697374656420666f72207374616b650000604082015260600190565b6000816000190483118215151615614a6457614a6461492d565b500290565b600060208284031215614a7b57600080fd5b5051919050565b600060208284031215614a9457600080fd5b815161168a81614445565b805169ffffffffffffffffffff81168114610e3057600080fd5b600080600080600060a08688031215614ad157600080fd5b614ada86614a9f565b9450602086015193506040860151925060608601519150614afd60808701614a9f565b90509295509295909350565b60006001600160ff1b0381841382841380821686840486111615614b2f57614b2f61492d565b600160ff1b6000871282811687830589121615614b4e57614b4e61492d565b60008712925087820587128484161615614b6a57614b6a61492d565b87850587128184161615614b8057614b8061492d565b505050929093029392505050565b6000825160005b81811015614baf5760208186018101518583015201614b95565b81811115614bbe576000828501525b509190910192915050565b602080825260149082015273151bdad95b881c185e5b595b9d0819985a5b195960621b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220cfa9e3af3764bc030c8e18241876f39fe4065717bcea5e2d2e9cb4e4b5bfd95664736f6c63430008090033
Deployed Bytecode
0x6080604052600436106104055760003560e01c80638456cb5911610213578063cad0055611610123578063edec5f27116100ab578063f597573f1161007a578063f597573f14610bca578063f851a44014610bea578063f885838614610c0a578063fb9a4acd14610c2a578063fe575a8714610c4a57600080fd5b8063edec5f2714610b54578063f04d688f14610b74578063f2fde38b14610b8a578063f446374314610baa57600080fd5b8063e19648db116100f2578063e19648db14610abe578063e32204dd14610ade578063e6da921314610afe578063e985e36714610b1e578063eadd94ec14610b3e57600080fd5b8063cad0055614610a52578063cb1a4fc014610a72578063cff805ab14610a87578063dad80e8614610a9d57600080fd5b8063ae104265116101a6578063ba166a3911610175578063ba166a39146109b0578063bb3d676a146109dd578063c23326f3146109fd578063c49cc64514610a1d578063c8adff0114610a3d57600080fd5b8063ae1042651461093d578063ae4e0a181461095d578063b00bba6a14610970578063b8977d6d1461099057600080fd5b80638e15f473116101e25780638e15f473146108d25780639a89c1fb146108e75780639cfa0f7c14610907578063a6d42e4e1461091d57600080fd5b80638456cb591461085f57806389daf799146108745780638ac08082146108945780638da5cb5b146108b457600080fd5b806343568eae1161031957806363b20117116102a1578063715018a611610270578063715018a6146107ce57806373b2e80e146107e357806378e97925146108135780637ad71f72146108295780637f6fb2531461084957600080fd5b806363b201171461076357806363e4087914610779578063641046f414610799578063704b6c02146107ae57600080fd5b806357405d05116102e857806357405d05146106c55780635bc34f71146106e55780635c975abb146106fb5780635ddc5688146107135780635df4f3531461073357600080fd5b806343568eae146106595780634e71d92d1461066f57806353d9920714610684578063548db174146106a557600080fd5b806323a8f1c01161039c5780633197cbb61161036b5780633197cbb6146105b057806333f76178146105c657806338646608146105dc5780633af32abf146106145780633f4ba83a1461064457600080fd5b806323a8f1c01461053d578063278c278b1461055d57806329a5a0b61461057d5780632c65169e1461059d57600080fd5b80630dc9c838116103d85780630dc9c838146104bc578063136021d9146104dc5780631ddc6091146104fc5780631fa2bc921461051c57600080fd5b806303b9c5ad1461040a57806307f180821461042c5780630a200fc7146104615780630ba36dcd14610481575b600080fd5b34801561041657600080fd5b5061042a6104253660046143ea565b610c7a565b005b34801561043857600080fd5b5061044c61044736600461442c565b610cf9565b60405190151581526020015b60405180910390f35b34801561046d57600080fd5b5061042a61047c366004614453565b610e35565b34801561048d57600080fd5b506104ae61049c366004614487565b60e06020526000908152604090205481565b604051908152602001610458565b3480156104c857600080fd5b5061042a6104d73660046144a2565b610e5b565b3480156104e857600080fd5b5061044c6104f73660046144c4565b611037565b34801561050857600080fd5b5061042a610517366004614453565b611587565b34801561052857600080fd5b5060dd5461044c90600160a01b900460ff1681565b34801561054957600080fd5b5061042a61055836600461442c565b6115ad565b34801561056957600080fd5b5061042a61057836600461442c565b6115ba565b34801561058957600080fd5b506104ae61059836600461442c565b61165d565b61044c6105ab3660046144c4565b611691565b3480156105bc57600080fd5b506104ae60cb5481565b3480156105d257600080fd5b506104ae60ce5481565b3480156105e857600080fd5b5060e5546105fc906001600160a01b031681565b6040516001600160a01b039091168152602001610458565b34801561062057600080fd5b5061044c61062f366004614487565b60e36020526000908152604090205460ff1681565b34801561065057600080fd5b5061042a611b81565b34801561066557600080fd5b506104ae60d35481565b34801561067b57600080fd5b5061044c611b93565b34801561069057600080fd5b5060dd5461044c90600160a81b900460ff1681565b3480156106b157600080fd5b5061042a6106c03660046143ea565b611eef565b3480156106d157600080fd5b5061042a6106e0366004614658565b611f69565b3480156106f157600080fd5b506104ae60d05481565b34801561070757600080fd5b5060975460ff1661044c565b34801561071f57600080fd5b5061042a61072e3660046146e4565b612235565b34801561073f57600080fd5b5061044c61074e366004614487565b60e46020526000908152604090205460ff1681565b34801561076f57600080fd5b506104ae60c95481565b34801561078557600080fd5b506104ae61079436600461442c565b612429565b3480156107a557600080fd5b5061042a61244b565b3480156107ba57600080fd5b5061042a6107c9366004614487565b612614565b3480156107da57600080fd5b5061042a61263e565b3480156107ef57600080fd5b5061044c6107fe366004614487565b60e16020526000908152604090205460ff1681565b34801561081f57600080fd5b506104ae60ca5481565b34801561083557600080fd5b506105fc61084436600461442c565b612650565b34801561085557600080fd5b506104ae60d45481565b34801561086b57600080fd5b5061042a61267a565b34801561088057600080fd5b5061042a61088f3660046143ea565b61268a565b3480156108a057600080fd5b5061044c6108af3660046147a4565b612704565b3480156108c057600080fd5b506065546001600160a01b03166105fc565b3480156108de57600080fd5b506104ae6128ac565b3480156108f357600080fd5b5061042a6109023660046144a2565b61294c565b34801561091357600080fd5b506104ae60cf5481565b34801561092957600080fd5b5061042a6109383660046147ea565b61295f565b34801561094957600080fd5b506104ae61095836600461442c565b612974565b61044c61096b366004614827565b612caa565b34801561097c57600080fd5b5061042a61098b366004614487565b613223565b34801561099c57600080fd5b5061042a6109ab366004614453565b613345565b3480156109bc57600080fd5b506109d06109cb36600461442c565b61336b565b6040516104589190614867565b3480156109e957600080fd5b5061042a6109f83660046143ea565b6133d7565b348015610a0957600080fd5b506104ae610a1836600461442c565b613451565b348015610a2957600080fd5b5060df546105fc906001600160a01b031681565b348015610a4957600080fd5b506109d0613472565b348015610a5e57600080fd5b5061042a610a6d366004614487565b6134ca565b348015610a7e57600080fd5b5061044c613543565b348015610a9357600080fd5b506104ae60d15481565b348015610aa957600080fd5b5060dd5461044c90600160b01b900460ff1681565b348015610aca57600080fd5b506104ae610ad936600461442c565b61377a565b348015610aea57600080fd5b5060dc546105fc906001600160a01b031681565b348015610b0a57600080fd5b506104ae610b193660046144a2565b61378a565b348015610b2a57600080fd5b5060cd546105fc906001600160a01b031681565b348015610b4a57600080fd5b506104ae60d25481565b348015610b6057600080fd5b5061042a610b6f3660046143ea565b6137be565b348015610b8057600080fd5b506104ae60cc5481565b348015610b9657600080fd5b5061042a610ba5366004614487565b613838565b348015610bb657600080fd5b5061042a610bc53660046143ea565b6138b1565b348015610bd657600080fd5b5060de546105fc906001600160a01b031681565b348015610bf657600080fd5b5060dd546105fc906001600160a01b031681565b348015610c1657600080fd5b506104ae610c2536600461442c565b61392b565b348015610c3657600080fd5b5061042a610c453660046148ab565b61393b565b348015610c5657600080fd5b5061044c610c65366004614487565b60e26020526000908152604090205460ff1681565b610c82613a21565b60005b81811015610cf457600160e46000858585818110610ca557610ca5614917565b9050602002016020810190610cba9190614487565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610cec81614943565b915050610c85565b505050565b6000610d03613a21565b600060cc5411610d5a5760405162461bcd60e51b815260206004820152601a60248201527f496e697469616c20636c61696d2064617461206e6f742073657400000000000060448201526064015b60405180910390fd5b60cb548211610d9e5760405162461bcd60e51b815260206004820152601060248201526f53616c6520696e2070726f677265737360801b6044820152606401610d51565b428211610de35760405162461bcd60e51b815260206004820152601360248201527210db185a5b481cdd185c9d081a5b881c185cdd606a1b6044820152606401610d51565b60cc8054908390556040805182815260208101859052428183015290517f5f3a900c85949962b4cc192dd3714dae64071dc2e907049ec720b023270905a49181900360600190a160019150505b919050565b610e3d613a21565b60dd8054911515600160a01b0260ff60a01b19909216919091179055565b610e63613a21565b6000821180610e725750600081115b610eb35760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d657465727360701b6044820152606401610d51565b8115610f985760ca544210610f015760405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b6044820152606401610d51565b814210610f445760405162461bcd60e51b815260206004820152601160248201527014d85b19481d1a5b59481a5b881c185cdd607a1b6044820152606401610d51565b60ca8054908390556040805182815260208101859052428183015290516414d510549560da1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b80156110335760ca548111610fe15760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420656e6454696d6560881b6044820152606401610d51565b60cb8054908290556040805182815260208101849052428183015290516211539160ea1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b5050565b60008260ca54421015801561104e575060cb544211155b61106a5760405162461bcd60e51b8152600401610d519061495e565b6000811161108a5760405162461bcd60e51b8152600401610d5190614995565b611092613a7b565b600061109d85612974565b90508460c960008282546110b191906149c2565b90915550600090506110c864e8d4a51000836149da565b905060d1546000146110ec578560d160008282546110e691906149c2565b90915550505b600060d15460c954116111015760d154611105565b60c9545b905060d560000160d0548154811061111f5761111f614917565b9060005260206000200154811180611159575060d560020160d0548154811061114a5761114a614917565b90600052602060002001544210155b156112935760d560020160d0548154811061117657611176614917565b906000526020600020015442106111b9578660d560000160d054815481106111a0576111a0614917565b90600052602060002001546111b591906149c2565b60d1555b60dd54600160a01b900460ff16156111d3576111d3613ac1565b600060d5810160d054815481106111ec576111ec614917565b9060005260206000200154821161123b57878260d560000160d0548154811061121757611217614917565b906000526020600020015461122c91906149fc565b61123691906149fc565b61123e565b60005b60d980546001818101835560009283527fcc6782fd46dd71c5f512301ab049782450b4eaf79fdac5443d93d274d391678690910183905560d08054939450909290919061128c9084906149c2565b9091555050505b85156113d65760dd54600160b01b900460ff16156112da5733600090815260e3602052604090205460ff166112da5760405162461bcd60e51b8152600401610d5190614a13565b60e5546001600160a01b03166391c619663360ce546112f9908b614a4a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561133f57600080fd5b505af1158015611353573d6000803e3d6000fd5b505050508660d4600082825461136991906149c2565b909155505060de546001600160a01b031687336001600160a01b03167f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a8587426040516113c9939291909283526020830191909152604082015260600190565b60405180910390a461146b565b60ce546113e39088614a4a565b33600090815260e06020526040812080549091906114029084906149c2565b909155505060de546001600160a01b031687336001600160a01b03167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36858742604051611462939291909283526020830191909152604082015260600190565b60405180910390a45b8260d2600082825461147d91906149c2565b909155505060de546000906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156114dc57600080fd5b505afa1580156114f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115149190614a69565b9050808311156115705760405162461bcd60e51b815260206004820152602160248201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636044820152606560f81b6064820152608401610d51565b61157983613b31565b506001979650505050505050565b61158f613a21565b60dd8054911515600160a81b0260ff60a81b19909216919091179055565b6115b5613a21565b60d355565b6115c2613a21565b600081116116125760405162461bcd60e51b815260206004820152601c60248201527f5a65726f206d617820746f6b656e7320746f206275792076616c7565000000006044820152606401610d51565b60cf8054908290556040805182815260208101849052428183015290517f76f9e5e1f6af6a9f180708b77a5c99210fbf19b91f1f194f3918c262b8edf77c9181900360600190a15050565b60008061166983612974565b90506116736128ac565b60ce546116809083614a4a565b61168a91906149da565b9392505050565b60008260ca5442101580156116a8575060cb544211155b6116c45760405162461bcd60e51b8152600401610d519061495e565b600081116116e45760405162461bcd60e51b8152600401610d5190614995565b6116ec613a7b565b6002600154141561173f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d51565b6002600155600061174f85612974565b9050600061175b6128ac565b60ce546117689084614a4a565b61177291906149da565b9050803410156117b35760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610d51565b60006117bf82346149fc565b90508660c960008282546117d391906149c2565b909155505060d154156117f8578660d160008282546117f291906149c2565b90915550505b600060d15460c9541161180d5760d154611811565b60c9545b905060d560000160d0548154811061182b5761182b614917565b9060005260206000200154811180611865575060d560020160d0548154811061185657611856614917565b90600052602060002001544210155b1561199f5760d560020160d0548154811061188257611882614917565b906000526020600020015442106118c5578760d560000160d054815481106118ac576118ac614917565b90600052602060002001546118c191906149c2565b60d1555b60dd54600160a01b900460ff16156118df576118df613ac1565b600060d5810160d054815481106118f8576118f8614917565b9060005260206000200154821161194757888260d560000160d0548154811061192357611923614917565b906000526020600020015461193891906149fc565b61194291906149fc565b61194a565b60005b60d980546001818101835560009283527fcc6782fd46dd71c5f512301ab049782450b4eaf79fdac5443d93d274d391678690910183905560d0805493945090929091906119989084906149c2565b9091555050505b8615611ac65760dd54600160b01b900460ff16156119e65733600090815260e3602052604090205460ff166119e65760405162461bcd60e51b8152600401610d5190614a13565b60e5546001600160a01b03166391c619663360ce54611a05908c614a4a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611a4b57600080fd5b505af1158015611a5f573d6000803e3d6000fd5b505050508760d46000828254611a7591906149c2565b90915550506040805184815260208101869052428183015290516000918a9133917f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a919081900360600190a4611b3f565b60ce54611ad39089614a4a565b33600090815260e0602052604081208054909190611af29084906149c2565b90915550506040805184815260208101869052428183015290516000918a9133917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36919081900360600190a45b8360d26000828254611b5191906149c2565b90915550611b60905083613eca565b8115611b7057611b703383614027565b505060018080559695505050505050565b611b89613a21565b611b916140fd565b565b6000611b9d613a7b565b60cd546001600160a01b0316611bec5760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610d51565b33600090815260e2602052604090205460ff1615611c4c5760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610d51565b60dd54600160a81b900460ff1615611cbd5733600090815260e3602052604090205460ff16611cbd5760405162461bcd60e51b815260206004820152601e60248201527f55736572206e6f742077686974656c697374656420666f7220636c61696d00006044820152606401610d51565b60cc54421015611d0f5760405162461bcd60e51b815260206004820152601960248201527f436c61696d20686173206e6f74207374617274656420796574000000000000006044820152606401610d51565b33600090815260e1602052604090205460ff1615611d615760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610d51565b33600090815260e160209081526040808320805460ff1916600117905560e090915290205480611dc65760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610d51565b33600081815260e06020908152604080832083905560cd54815163a9059cbb60e01b8152600481019590955260248501869052905192936001600160a01b039091169263a9059cbb9260448084019391929182900301818787803b158015611e2d57600080fd5b505af1158015611e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e659190614a82565b905080611eac5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610d51565b6040805183815242602082015233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b910160405180910390a260019250505090565b611ef7613a21565b60005b81811015610cf457600060e36000858585818110611f1a57611f1a614917565b9050602002016020810190611f2f9190614487565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611f6181614943565b915050611efa565b600054610100900460ff1615808015611f895750600054600160ff909116105b80611fa35750303b158015611fa3575060005460ff166001145b6120065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d51565b6000805460ff191660011790558015612029576000805461ff0019166101001790555b6001600160a01b03881661207f5760405162461bcd60e51b815260206004820152601760248201527f5a65726f2061676772656761746f7220616464726573730000000000000000006044820152606401610d51565b6001600160a01b0387166120c95760405162461bcd60e51b81526020600482015260116024820152705a65726f2055534454206164647265737360781b6044820152606401610d51565b42861180156120d757508585115b6121125760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b6044820152606401610d51565b61211a61414f565b612122614182565b61212a6141b2565b670de0b6b3a764000060ce5560df80546001600160a01b03808b166001600160a01b03199283161790925560de8054928a169290911691909117905560ca86905560cb85905561217d60d58560036142b7565b5060cf83905560dc80546001600160a01b0319166001600160a01b03841617905560ca5460cb5460408051928352602083019190915242908201527f23f6ad8232d75562dd1c6b37dfc895af6bfc1ecd0fb3b88722c6a5e6b4dc9a209060600160405180910390a1801561222b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61223d613a21565b80518251146122825760405162461bcd60e51b81526020600482015260116024820152704d69736d6174636865642061727261797360781b6044820152606401610d51565b61228e60db6000614307565b61229a60da6000614307565b6000805b83518110156123d85760008382815181106122bb576122bb614917565b60200260200101511161231a5760405162461bcd60e51b815260206004820152602160248201527f50657263656e74616765206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608401610d51565b82818151811061232c5761232c614917565b60200260200101518261233f91906149c2565b915060db84828151811061235557612355614917565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b03909216919091179055825160da908490839081106123a7576123a7614917565b60209081029190910181015182546001810184556000938452919092200155806123d081614943565b91505061229e565b5080606414610cf45760405162461bcd60e51b815260206004820152601f60248201527f546f74616c2070657263656e74616765206d75737420657175616c20313030006044820152606401610d51565b600061243482612974565b905061244564e8d4a51000826149da565b92915050565b60dd546001600160a01b031633148061246e57506065546001600160a01b031633145b6124ba5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206e6f742061646d696e206f72206f776e6572000000000000006044820152606401610d51565b60d15460d880546001810182556000919091527f5320ad99a619a90804cd2efe3a5cf0ac1ac5c41ad9ff2c61cf699efdad771096015560dd54600160a01b900460ff161561250a5761250a613ac1565b60d560000160d0548154811061252257612522614917565b906000526020600020015460d15410156125fd5760d05461258b5760c95460d99060d560000160d0548154811061255b5761255b614917565b906000526020600020015461257091906149fc565b815460018101835560009283526020909220909101556125d5565b60d15460d99060d560000160d054815481106125a9576125a9614917565b90600052602060002001546125be91906149fc565b815460018101835560009283526020909220909101555b60d560000160d054815481106125ed576125ed614917565b60009182526020909120015460d1555b60d0805490600061260d83614943565b9190505550565b61261c613a21565b60dd80546001600160a01b0319166001600160a01b0392909216919091179055565b612646613a21565b611b9160006141df565b60db818154811061266057600080fd5b6000918252602090912001546001600160a01b0316905081565b612682613a21565b611b91614231565b612692613a21565b60005b81811015610cf457600060e260008585858181106126b5576126b5614917565b90506020020160208101906126ca9190614487565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806126fc81614943565b915050612695565b600061270e613a21565b6001600160a01b0383166127595760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610d51565b60cc541561279d5760405162461bcd60e51b815260206004820152601160248201527010db185a5b48185b1c9958591e481cd95d607a1b6044820152606401610d51565b60cc85905560cd80546001600160a01b038581166001600160a01b0319928316811790935560dd805460ff60a81b1916600160a81b17905560e5805491861691909216811790915560405163095ea7b360e01b81526004810191909152600019602482015263095ea7b390604401602060405180830381600087803b15801561282557600080fd5b505af1158015612839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285d9190614a82565b50604080518581524260208201526001600160a01b038516917fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8910160405180910390a2506001949350505050565b60008060df60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156128fd57600080fd5b505afa158015612911573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129359190614ab9565b505050915050806402540be4006124459190614b09565b612954613a21565b60d09190915560d155565b612967613a21565b61103360d58260036142b7565b600080600060d15460001461298b5760d15461298f565b60c9545b905060cf548411156129e35760405162461bcd60e51b815260206004820181905260248201527f416d6f756e742065786365656473206d617820746f6b656e7320746f206275796044820152606401610d51565b60d560000160d054815481106129fb576129fb614917565b90600052602060002001548185612a1291906149c2565b1180612a40575060d560020160d05481548110612a3157612a31614917565b90600052602060002001544210155b15612c725760d554612a54906001906149fc565b60d05410612a935760405162461bcd60e51b815260206004820152600c60248201526b57726f6e6720706172616d7360a01b6044820152606401610d51565b60d560020160d05481548110612aab57612aab614917565b90600052602060002001544210612bbe5760d05460d590612acd9060016149c2565b81548110612add57612add614917565b90600052602060002001548460d5600060038110612afd57612afd614917565b0160d05481548110612b1157612b11614917565b9060005260206000200154612b2691906149c2565b1115612b805760405162461bcd60e51b815260206004820152602360248201527f43616e74205075726368617365204d6f726520696e20696e646976696475616c604482015262040e8f60eb1b6064820152608401610d51565b60d05460d690612b919060016149c2565b81548110612ba157612ba1614917565b906000526020600020015484612bb79190614a4a565b9150612ca3565b60008160d5820160d05481548110612bd857612bd8614917565b9060005260206000200154612bed91906149fc565b60d05490915060d690612c019060016149c2565b81548110612c1157612c11614917565b90600052602060002001548186612c2891906149fc565b612c329190614a4a565b60d560010160d05481548110612c4a57612c4a614917565b906000526020600020015482612c609190614a4a565b612c6a91906149c2565b925050612ca3565b60d560010160d05481548110612c8a57612c8a614917565b906000526020600020015484612ca09190614a4a565b91505b5092915050565b60008260ca544210158015612cc1575060cb544211155b612cdd5760405162461bcd60e51b8152600401610d519061495e565b60008111612cfd5760405162461bcd60e51b8152600401610d5190614995565b612d05613a7b565b60026001541415612d585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d51565b600260015533600090815260e4602052604090205460ff16612dbc5760405162461bcd60e51b815260206004820181905260248201527f55736572206e6f742077686974656c697374656420666f7220746869732074786044820152606401610d51565b6000612dc785612974565b90506000612dd36128ac565b60ce54612de09084614a4a565b612dea91906149da565b905080341015612e2b5760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610d51565b6000612e3782346149fc565b90508660c96000828254612e4b91906149c2565b909155505060d15415612e70578660d16000828254612e6a91906149c2565b90915550505b600060d15460c95411612e855760d154612e89565b60c9545b905060d560000160d05481548110612ea357612ea3614917565b9060005260206000200154811180612edd575060d560020160d05481548110612ece57612ece614917565b90600052602060002001544210155b156130175760d560020160d05481548110612efa57612efa614917565b90600052602060002001544210612f3d578760d560000160d05481548110612f2457612f24614917565b9060005260206000200154612f3991906149c2565b60d1555b60dd54600160a01b900460ff1615612f5757612f57613ac1565b600060d5810160d05481548110612f7057612f70614917565b90600052602060002001548211612fbf57888260d560000160d05481548110612f9b57612f9b614917565b9060005260206000200154612fb091906149fc565b612fba91906149fc565b612fc2565b60005b60d980546001818101835560009283527fcc6782fd46dd71c5f512301ab049782450b4eaf79fdac5443d93d274d391678690910183905560d0805493945090929091906130109084906149c2565b9091555050505b86156131555760dd54600160b01b900460ff1615613067576001600160a01b038916600090815260e3602052604090205460ff166130675760405162461bcd60e51b8152600401610d5190614a13565b60e55460ce546001600160a01b03909116906391c61966908b9061308b908c614a4a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156130d157600080fd5b505af11580156130e5573d6000803e3d6000fd5b505050508760d460008282546130fb91906149c2565b90915550506040805184815260208101869052428183015290516000918a916001600160a01b038d16917f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a919081900360600190a46131e0565b60ce546131629089614a4a565b6001600160a01b038a16600090815260e060205260408120805490919061318a9084906149c2565b90915550506040805184815260208101869052428183015290516000918a916001600160a01b038d16917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36919081900360600190a45b8360d260008282546131f291906149c2565b90915550613201905083613eca565b8115613211576132118983614027565b50506001808055979650505050505050565b61322b613a21565b6001600160a01b0381166132a75760405162461bcd60e51b815260206004820152603760248201527f7374616b696e67206d616e616765722063616e6e6f7420626520696e6174696160448201527f6c697a65642077697468207a65726f20616464726573730000000000000000006064820152608401610d51565b60e580546001600160a01b0319166001600160a01b0383811691821790925560cd5460405163095ea7b360e01b8152600481019290925260001960248301529091169063095ea7b390604401602060405180830381600087803b15801561330d57600080fd5b505af1158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190614a82565b61334d613a21565b60dd8054911515600160b01b0260ff60b01b19909216919091179055565b606060d5826003811061338057613380614917565b018054806020026020016040519081016040528092919081815260200182805480156133cb57602002820191906000526020600020905b8154815260200190600101908083116133b7575b50505050509050919050565b6133df613a21565b60005b81811015610cf457600160e2600085858581811061340257613402614917565b90506020020160208101906134179190614487565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061344981614943565b9150506133e2565b60d9818154811061346157600080fd5b600091825260209091200154905081565b606060d98054806020026020016040519081016040528092919081815260200182805480156134c057602002820191906000526020600020905b8154815260200190600101908083116134ac575b5050505050905090565b6134d2613a21565b6001600160a01b0381166135215760405162461bcd60e51b8152602060048201526016602482015275616464726573732063616e6e6f74206265207a65726f60501b6044820152606401610d51565b60dc80546001600160a01b0319166001600160a01b0392909216919091179055565b600061354d613a7b565b60cd546001600160a01b031661359c5760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610d51565b33600090815260e2602052604090205460ff16156135fc5760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610d51565b60dd54600160b01b900460ff161561363d5733600090815260e3602052604090205460ff1661363d5760405162461bcd60e51b8152600401610d5190614a13565b33600090815260e060205260409020548061368d5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f207374616b6560801b6044820152606401610d51565b60e5546001600160a01b03166391c61966336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b1580156136e757600080fd5b505af11580156136fb573d6000803e3d6000fd5b5050505060e0600061370a3390565b6001600160a01b031681526020810191909152604001600090812055336001600160a01b03167ffa4ec67f9254455933eb145bae864b26f29dd0a7bbb76eb11e4d6b8b9b184c2b824260405161376a929190918252602082015260400190565b60405180910390a2600191505090565b60d8818154811061346157600080fd5b60d5826003811061379a57600080fd5b0181815481106137a957600080fd5b90600052602060002001600091509150505481565b6137c6613a21565b60005b81811015610cf457600160e360008585858181106137e9576137e9614917565b90506020020160208101906137fe9190614487565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061383081614943565b9150506137c9565b613840613a21565b6001600160a01b0381166138a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d51565b6138ae816141df565b50565b6138b9613a21565b60005b81811015610cf457600060e460008585858181106138dc576138dc614917565b90506020020160208101906138f19190614487565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061392381614943565b9150506138bc565b60da818154811061346157600080fd5b613943613a21565b8281146139845760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610d51565b60005b83811015613a1a578282828181106139a1576139a1614917565b9050602002013560e060008787858181106139be576139be614917565b90506020020160208101906139d39190614487565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254613a0291906149c2565b90915550819050613a1281614943565b915050613987565b5050505050565b6065546001600160a01b03163314611b915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d51565b60975460ff1615611b915760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d51565b60005b60d05460d754613ad491906149fc565b8110156138ae5760d354613ae89082614a4a565b613af290426149c2565b60d05460d790613b039084906149c2565b81548110613b1357613b13614917565b60009182526020909120015580613b2981614943565b915050613ac4565b60db54613c585760dc546001600160a01b0316613b895760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d081dd85b1b195d081b9bdd081cd95d60521b6044820152606401610d51565b60de546000906001600160a01b03163360dc546040516001600160a01b039283166024820152911660448201526064810184905260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613bf59190614b8e565b6000604051808303816000865af19150503d8060008114613c32576040519150601f19603f3d011682016040523d82523d6000602084013e613c37565b606091505b50509050806110335760405162461bcd60e51b8152600401610d5190614bc9565b6000805b60db54811015613dac576000606460da8381548110613c7d57613c7d614917565b906000526020600020015485613c939190614a4a565b613c9d91906149da565b60de549091506000906001600160a01b03163360db8581548110613cc357613cc3614917565b6000918252602090912001546040516001600160a01b039283166024820152911660448201526064810184905260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613d289190614b8e565b6000604051808303816000865af19150503d8060008114613d65576040519150601f19603f3d011682016040523d82523d6000602084013e613d6a565b606091505b5050905080613d8b5760405162461bcd60e51b8152600401610d5190614bc9565b613d9582856149c2565b935050508080613da490614943565b915050613c5c565b506000613db982846149fc565b11156110335760de546000906001600160a01b03163360db8054613ddf906001906149fc565b81548110613def57613def614917565b6000918252602090912001546001600160a01b0316613e0e85876149fc565b6040516001600160a01b039384166024820152929091166044830152606482015260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613e679190614b8e565b6000604051808303816000865af19150503d8060008114613ea4576040519150601f19603f3d011682016040523d82523d6000602084013e613ea9565b606091505b5050905080610cf45760405162461bcd60e51b8152600401610d5190614bc9565b60db54613f385760dc546001600160a01b0316613f225760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d081dd85b1b195d081b9bdd081cd95d60521b6044820152606401610d51565b60dc546138ae906001600160a01b031682614027565b6000805b60db54811015613fd0576000606460da8381548110613f5d57613f5d614917565b906000526020600020015485613f739190614a4a565b613f7d91906149da565b9050613fb060db8381548110613f9557613f95614917565b6000918252602090912001546001600160a01b031682614027565b613fba81846149c2565b9250508080613fc890614943565b915050613f3c565b506000613fdd82846149fc565b11156110335760db80546110339190613ff8906001906149fc565b8154811061400857614008614917565b6000918252602090912001546001600160a01b031661402783856149fc565b804710156140655760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401610d51565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146140b2576040519150601f19603f3d011682016040523d82523d6000602084013e6140b7565b606091505b5050905080610cf45760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b6044820152606401610d51565b61410561426e565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600054610100900460ff166141765760405162461bcd60e51b8152600401610d5190614bf7565b6097805460ff19169055565b600054610100900460ff166141a95760405162461bcd60e51b8152600401610d5190614bf7565b611b91336141df565b600054610100900460ff166141d95760405162461bcd60e51b8152600401610d5190614bf7565b60018055565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b614239613a7b565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586141323390565b60975460ff16611b915760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d51565b82600381019282156142f7579160200282015b828111156142f757825180516142e7918491602090910190614325565b50916020019190600101906142ca565b5061430392915061436c565b5090565b50805460008255906000526020600020908101906138ae9190614389565b828054828255906000526020600020908101928215614360579160200282015b82811115614360578251825591602001919060010190614345565b50614303929150614389565b808211156143035760006143808282614307565b5060010161436c565b5b80821115614303576000815560010161438a565b60008083601f8401126143b057600080fd5b50813567ffffffffffffffff8111156143c857600080fd5b6020830191508360208260051b85010111156143e357600080fd5b9250929050565b600080602083850312156143fd57600080fd5b823567ffffffffffffffff81111561441457600080fd5b6144208582860161439e565b90969095509350505050565b60006020828403121561443e57600080fd5b5035919050565b80151581146138ae57600080fd5b60006020828403121561446557600080fd5b813561168a81614445565b80356001600160a01b0381168114610e3057600080fd5b60006020828403121561449957600080fd5b61168a82614470565b600080604083850312156144b557600080fd5b50508035926020909101359150565b600080604083850312156144d757600080fd5b8235915060208301356144e981614445565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614533576145336144f4565b604052919050565b600067ffffffffffffffff821115614555576145556144f4565b5060051b60200190565b600082601f83011261457057600080fd5b813560206145856145808361453b565b61450a565b82815260059290921b840181019181810190868411156145a457600080fd5b8286015b848110156145bf57803583529183019183016145a8565b509695505050505050565b600082601f8301126145db57600080fd5b6040516060810167ffffffffffffffff82821081831117156145ff576145ff6144f4565b81604052829150606085018681111561461757600080fd5b855b8181101561464c578035838111156146315760008081fd5b61463d89828a0161455f565b85525060209384019301614619565b50929695505050505050565b600080600080600080600060e0888a03121561467357600080fd5b61467c88614470565b965061468a60208901614470565b95506040880135945060608801359350608088013567ffffffffffffffff8111156146b457600080fd5b6146c08a828b016145ca565b93505060a088013591506146d660c08901614470565b905092959891949750929550565b600080604083850312156146f757600080fd5b823567ffffffffffffffff8082111561470f57600080fd5b818501915085601f83011261472357600080fd5b813560206147336145808361453b565b82815260059290921b8401810191818101908984111561475257600080fd5b948201945b838610156147775761476886614470565b82529482019490820190614757565b9650508601359250508082111561478d57600080fd5b5061479a8582860161455f565b9150509250929050565b600080600080608085870312156147ba57600080fd5b84359350602085013592506147d160408601614470565b91506147df60608601614470565b905092959194509250565b6000602082840312156147fc57600080fd5b813567ffffffffffffffff81111561481357600080fd5b61481f848285016145ca565b949350505050565b60008060006060848603121561483c57600080fd5b61484584614470565b925060208401359150604084013561485c81614445565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561489f57835183529284019291840191600101614883565b50909695505050505050565b600080600080604085870312156148c157600080fd5b843567ffffffffffffffff808211156148d957600080fd5b6148e58883890161439e565b909650945060208701359150808211156148fe57600080fd5b5061490b8782880161439e565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156149575761495761492d565b5060010190565b60208082526017908201527f496e76616c69642074696d6520666f7220627579696e67000000000000000000604082015260600190565b602080825260139082015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b604082015260600190565b600082198211156149d5576149d561492d565b500190565b6000826149f757634e487b7160e01b600052601260045260246000fd5b500490565b600082821015614a0e57614a0e61492d565b500390565b6020808252601e908201527f55736572206e6f742077686974656c697374656420666f72207374616b650000604082015260600190565b6000816000190483118215151615614a6457614a6461492d565b500290565b600060208284031215614a7b57600080fd5b5051919050565b600060208284031215614a9457600080fd5b815161168a81614445565b805169ffffffffffffffffffff81168114610e3057600080fd5b600080600080600060a08688031215614ad157600080fd5b614ada86614a9f565b9450602086015193506040860151925060608601519150614afd60808701614a9f565b90509295509295909350565b60006001600160ff1b0381841382841380821686840486111615614b2f57614b2f61492d565b600160ff1b6000871282811687830589121615614b4e57614b4e61492d565b60008712925087820587128484161615614b6a57614b6a61492d565b87850587128184161615614b8057614b8061492d565b505050929093029392505050565b6000825160005b81811015614baf5760208186018101518583015201614b95565b81811115614bbe576000828501525b509190910192915050565b602080825260149082015273151bdad95b881c185e5b595b9d0819985a5b195960621b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220cfa9e3af3764bc030c8e18241876f39fe4065717bcea5e2d2e9cb4e4b5bfd95664736f6c63430008090033
Deployed Bytecode Sourcemap
29219:24715:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48115:228;;;;;;;;;;-1:-1:-1;48115:228:0;;;;;:::i;:::-;;:::i;:::-;;46016:428;;;;;;;;;;-1:-1:-1;46016:428:0;;;;;:::i;:::-;;:::i;:::-;;;1178:14:1;;1171:22;1153:41;;1141:2;1126:18;46016:428:0;;;;;;;;53693:117;;;;;;;;;;-1:-1:-1;53693:117:0;;;;;:::i;:::-;;:::i;30133:47::-;;;;;;;;;;-1:-1:-1;30133:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2089:25:1;;;2077:2;2062:18;30133:47:0;1943:177:1;34182:717:0;;;;;;;;;;-1:-1:-1;34182:717:0;;;;;:::i;:::-;;:::i;36120:1641::-;;;;;;;;;;-1:-1:-1;36120:1641:0;;;;;:::i;:::-;;:::i;50870:107::-;;;;;;;;;;-1:-1:-1;50870:107:0;;;;;:::i;:::-;;:::i;29939:27::-;;;;;;;;;;-1:-1:-1;29939:27:0;;;;-1:-1:-1;;;29939:27:0;;;;;;51674:108;;;;;;;;;;-1:-1:-1;51674:108:0;;;;;:::i;:::-;;:::i;48763:300::-;;;;;;;;;;-1:-1:-1;48763:300:0;;;;;:::i;:::-;;:::i;41736:197::-;;;;;;;;;;-1:-1:-1;41736:197:0;;;;;:::i;:::-;;:::i;37914:1679::-;;;;;;:::i;:::-;;:::i;29393:22::-;;;;;;;;;;;;;;;;29479:27;;;;;;;;;;;;;;;;30386:45;;;;;;;;;;-1:-1:-1;30386:45:0;;;;-1:-1:-1;;;;;30386:45:0;;;;;;-1:-1:-1;;;;;2878:32:1;;;2860:51;;2848:2;2833:18;30386:45:0;2692:225:1;30282:45:0;;;;;;;;;;-1:-1:-1;30282:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32884:61;;;;;;;;;;;;;:::i;29635:27::-;;;;;;;;;;;;;;;;46513:835;;;;;;;;;;;;;:::i;29971:30::-;;;;;;;;;;-1:-1:-1;29971:30:0;;;;-1:-1:-1;;;29971:30:0;;;;;;50530:240;;;;;;;;;;-1:-1:-1;50530:240:0;;;;;:::i;:::-;;:::i;31873:848::-;;;;;;;;;;-1:-1:-1;31873:848:0;;;;;:::i;:::-;;:::i;29545:26::-;;;;;;;;;;;;;;;;20288:86;;;;;;;;;;-1:-1:-1;20359:7:0;;;;20288:86;;35171:585;;;;;;;;;;-1:-1:-1;35171:585:0;;;;;:::i;:::-;;:::i;30332:47::-;;;;;;;;;;-1:-1:-1;30332:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29329:30;;;;;;;;;;;;;;;;42054:165;;;;;;;;;;-1:-1:-1;42054:165:0;;;;;:::i;:::-;;:::i;52532:565::-;;;;;;;;;;;;;:::i;53186:80::-;;;;;;;;;;-1:-1:-1;53186:80:0;;;;;:::i;:::-;;:::i;17227:103::-;;;;;;;;;;;;;:::i;30185:42::-;;;;;;;;;;-1:-1:-1;30185:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29364:24;;;;;;;;;;;;;;;;29852;;;;;;;;;;-1:-1:-1;29852:24:0;;;;;:::i;:::-;;:::i;29667:35::-;;;;;;;;;;;;;;;;32773:57;;;;;;;;;;;;;:::i;49711:240::-;;;;;;;;;;-1:-1:-1;49711:240:0;;;;;:::i;:::-;;:::i;44922:758::-;;;;;;;;;;-1:-1:-1;44922:758:0;;;;;:::i;:::-;;:::i;16579:87::-;;;;;;;;;;-1:-1:-1;16652:6:0;;-1:-1:-1;;;;;16652:6:0;16579:87;;34971:194;;;;;;;;;;;;;:::i;53440:142::-;;;;;;;;;;-1:-1:-1;53440:142:0;;;;;:::i;:::-;;:::i;29511:29::-;;;;;;;;;;;;;;;;49069:103;;;;;;;;;;-1:-1:-1;49069:103:0;;;;;:::i;:::-;;:::i;33068:984::-;;;;;;;;;;-1:-1:-1;33068:984:0;;;;;:::i;:::-;;:::i;39867:1749::-;;;;;;:::i;:::-;;:::i;44331:352::-;;;;;;;;;;-1:-1:-1;44331:352:0;;;;;:::i;:::-;;:::i;45780:115::-;;;;;;;;;;-1:-1:-1;45780:115:0;;;;;:::i;:::-;;:::i;51880:107::-;;;;;;;;;;-1:-1:-1;51880:107:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49331:207::-;;;;;;;;;;-1:-1:-1;49331:207:0;;;;;:::i;:::-;;:::i;29775:39::-;;;;;;;;;;-1:-1:-1;29775:39:0;;;;;:::i;:::-;;:::i;30091:37::-;;;;;;;;;;-1:-1:-1;30091:37:0;;;;-1:-1:-1;;;;;30091:37:0;;;53816:115;;;;;;;;;;;;;:::i;51096:194::-;;;;;;;;;;-1:-1:-1;51096:194:0;;;;;:::i;:::-;;:::i;47354:625::-;;;;;;;;;;;;;:::i;29576:25::-;;;;;;;;;;;;;;;;30006:35;;;;;;;;;;-1:-1:-1;30006:35:0;;;;-1:-1:-1;;;30006:35:0;;;;;;29738:32;;;;;;;;;;-1:-1:-1;29738:32:0;;;;;:::i;:::-;;:::i;29881:28::-;;;;;;;;;;-1:-1:-1;29881:28:0;;;;-1:-1:-1;;;;;29881:28:0;;;29707:26;;;;;;;;;;-1:-1:-1;29707:26:0;;;;;:::i;:::-;;:::i;29450:24::-;;;;;;;;;;-1:-1:-1;29450:24:0;;;;-1:-1:-1;;;;;29450:24:0;;;29606;;;;;;;;;;;;;;;;50130:207;;;;;;;;;;-1:-1:-1;50130:207:0;;;;;:::i;:::-;;:::i;29420:25::-;;;;;;;;;;;;;;;;17485:201;;;;;;;;;;-1:-1:-1;17485:201:0;;;;;:::i;:::-;;:::i;48493:264::-;;;;;;;;;;-1:-1:-1;48493:264:0;;;;;:::i;:::-;;:::i;30048:38::-;;;;;;;;;;-1:-1:-1;30048:38:0;;;;-1:-1:-1;;;;;30048:38:0;;;29914:20;;;;;;;;;;-1:-1:-1;29914:20:0;;;;-1:-1:-1;;;;;29914:20:0;;;29819:28;;;;;;;;;;-1:-1:-1;29819:28:0;;;;;:::i;:::-;;:::i;52173:291::-;;;;;;;;;;-1:-1:-1;52173:291:0;;;;;:::i;:::-;;:::i;30232:45::-;;;;;;;;;;-1:-1:-1;30232:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;48115:228;16465:13;:11;:13::i;:::-;48219:9:::1;48214:124;48234:32:::0;;::::1;48214:124;;;48326:4;48282:15;:41;48298:21;;48320:1;48298:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48282:41:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48282:41:0;:48;;-1:-1:-1;;48282:48:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48268:3;::::1;::::0;::::1;:::i;:::-;;;;48214:124;;;;48115:228:::0;;:::o;46016:428::-;46091:4;16465:13;:11;:13::i;:::-;46125:1:::1;46112:10;;:14;46104:53;;;::::0;-1:-1:-1;;;46104:53:0;;10907:2:1;46104:53:0::1;::::0;::::1;10889:21:1::0;10946:2;10926:18;;;10919:30;10985:28;10965:18;;;10958:56;11031:18;;46104:53:0::1;;;;;;;;;46186:7;;46172:11;:21;46164:50;;;::::0;-1:-1:-1;;;46164:50:0;;11262:2:1;46164:50:0::1;::::0;::::1;11244:21:1::0;11301:2;11281:18;;;11274:30;-1:-1:-1;;;11320:18:1;;;11313:46;11376:18;;46164:50:0::1;11060:340:1::0;46164:50:0::1;46243:15;46229:11;:29;46221:61;;;::::0;-1:-1:-1;;;46221:61:0;;11607:2:1;46221:61:0::1;::::0;::::1;11589:21:1::0;11646:2;11626:18;;;11619:30;-1:-1:-1;;;11665:18:1;;;11658:49;11724:18;;46221:61:0::1;11405:343:1::0;46221:61:0::1;46309:10;::::0;;46326:24;;;;46362:58:::1;::::0;;11955:25:1;;;12011:2;11996:18;;11989:34;;;46404:15:0::1;12039:18:1::0;;;12032:34;46362:58:0;;::::1;::::0;;;;11943:2:1;46362:58:0;;::::1;46434:4;46427:11;;;16489:1;46016:428:::0;;;:::o;53693:117::-;16465:13;:11;:13::i;:::-;53770:15:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;53770:34:0::1;-1:-1:-1::0;;;;53770:34:0;;::::1;::::0;;;::::1;::::0;;53693:117::o;34182:717::-;16465:13;:11;:13::i;:::-;34292:1:::1;34279:10;:14;:30;;;;34308:1;34297:8;:12;34279:30;34271:61;;;::::0;-1:-1:-1;;;34271:61:0;;12279:2:1;34271:61:0::1;::::0;::::1;12261:21:1::0;12318:2;12298:18;;;12291:30;-1:-1:-1;;;12337:18:1;;;12330:48;12395:18;;34271:61:0::1;12077:342:1::0;34271:61:0::1;34343:14:::0;;34339:320:::1;;34394:9;;34376:15;:27;34368:60;;;::::0;-1:-1:-1;;;34368:60:0;;12626:2:1;34368:60:0::1;::::0;::::1;12608:21:1::0;12665:2;12645:18;;;12638:30;-1:-1:-1;;;12684:18:1;;;12677:50;12744:18;;34368:60:0::1;12424:344:1::0;34368:60:0::1;34463:10;34445:15;:28;34437:58;;;::::0;-1:-1:-1;;;34437:58:0;;12975:2:1;34437:58:0::1;::::0;::::1;12957:21:1::0;13014:2;12994:18;;;12987:30;-1:-1:-1;;;13033:18:1;;;13026:47;13090:18;;34437:58:0::1;12773:341:1::0;34437:58:0::1;34524:9;::::0;;34542:22;;;;34578:73:::1;::::0;;11955:25:1;;;12011:2;11996:18;;11989:34;;;34635:15:0::1;12039:18:1::0;;;12032:34;34578:73:0;;-1:-1:-1;;;34594:16:0;34578:73:::1;::::0;;;;;11943:2:1;34578:73:0;;::::1;34359:300;34339:320;34669:12:::0;;34665:229:::1;;34711:9;;34700:8;:20;34692:48;;;::::0;-1:-1:-1;;;34692:48:0;;13321:2:1;34692:48:0::1;::::0;::::1;13303:21:1::0;13360:2;13340:18;;;13333:30;-1:-1:-1;;;13379:18:1;;;13372:45;13434:18;;34692:48:0::1;13119:339:1::0;34692:48:0::1;34769:7;::::0;;34785:18;;;;34817:69:::1;::::0;;11955:25:1;;;12011:2;11996:18;;11989:34;;;34870:15:0::1;12039:18:1::0;;;12032:34;34817:69:0;;-1:-1:-1;;;34833:14:0;34817:69:::1;::::0;;;;;11943:2:1;34817:69:0;;::::1;34683:211;34665:229;34182:717:::0;;:::o;36120:1641::-;36224:4;36193:6;35836:9;;35817:15;:28;;:58;;;;;35868:7;;35849:15;:26;;35817:58;35809:94;;;;-1:-1:-1;;;35809:94:0;;;;;;;:::i;:::-;35927:1;35918:6;:10;35910:42;;;;-1:-1:-1;;;35910:42:0;;;;;;;:::i;:::-;19893:19:::1;:17;:19::i;:::-;36237:16:::2;36256:22;36271:6;36256:14;:22::i;:::-;36237:41;;36304:6;36285:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;36317:13:0::2;::::0;-1:-1:-1;36333:21:0::2;36345:8;36333::::0;:21:::2;:::i;:::-;36317:37;;36365:10;;36379:1;36365:15;36361:41;;36396:6;36382:10;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36361:41:0::2;36409:13;36443:10;;36425:15;;:28;:59;;36474:10;;36425:59;;;36456:15;;36425:59;36409:75:::0;-1:-1:-1;36503:6:0::2;36510:1;36503:9;36513:11;;36503:22;;;;;;;;:::i;:::-;;;;;;;;;36495:5;:30;:75;;;-1:-1:-1::0;36548:6:0::2;36555:1;36548:9;36558:11;;36548:22;;;;;;;;:::i;:::-;;;;;;;;;36529:15;:41;;36495:75;36491:458;;;36604:6;36611:1;36604:9;36614:11;;36604:22;;;;;;;;:::i;:::-;;;;;;;;;36585:15;:41;36581:112;;36677:6:::0;36652::::2;36659:1;36652:9;36662:11;;36652:22;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;:::i;:::-;36639:10;:44:::0;36581:112:::2;36705:15;::::0;-1:-1:-1;;;36705:15:0;::::2;;;36701:58;;;36733:16;:14;:16::i;:::-;36767:20;36798:6;36767:20:::0;36798:9:::2;36808:11;;36798:22;;;;;;;;:::i;:::-;;;;;;;;;36790:5;:30;:76;;36860:6:::0;36852:5;36827:6:::2;36834:1;36827:9;36837:11;;36827:22;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;:::i;:::-;:39;;;;:::i;:::-;36790:76;;;36823:1;36790:76;36875:22;:41:::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;36875:41:0;;;;;;::::2;::::0;;;36925:11:::2;:16:::0;;36767:99;;-1:-1:-1;36875:41:0;;36925:11;;-1:-1:-1;36925:16:0::2;::::0;36875:41;;36925:16:::2;:::i;:::-;::::0;;;-1:-1:-1;;;36491:458:0::2;36959:5;36955:569;;;36979:23;::::0;-1:-1:-1;;;36979:23:0;::::2;;;36975:120;;;14642:10:::0;37023:27:::2;::::0;;;:13:::2;:27;::::0;;;;;::::2;;37015:70;;;;-1:-1:-1::0;;;37015:70:0::2;;;;;;;:::i;:::-;37103:23;::::0;-1:-1:-1;;;;;37103:23:0::2;:40;14642:10:::0;37167:12:::2;::::0;37158:21:::2;::::0;:6;:21:::2;:::i;:::-;37103:77;::::0;-1:-1:-1;;;;;;37103:77:0::2;::::0;;;;;;-1:-1:-1;;;;;15372:32:1;;;37103:77:0::2;::::0;::::2;15354:51:1::0;15421:18;;;15414:34;15327:18;;37103:77:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;37213:6;37189:20;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37285:13:0::2;::::0;-1:-1:-1;;;;;37285:13:0::2;37269:6:::0;14642:10;-1:-1:-1;;;;;37233:101:0::2;;37301:5;37308:8;37318:15;37233:101;;;;;;;11955:25:1::0;;;12011:2;11996:18;;11989:34;;;;12054:2;12039:18;;12032:34;11943:2;11928:18;;11753:319;37233:101:0::2;;;;;;;;36955:569;;;37397:12;::::0;37388:21:::2;::::0;:6;:21:::2;:::i;:::-;14642:10:::0;37357:26:::2;::::0;;;:12:::2;:26;::::0;;;;:53;;:26;;;:53:::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;37467:13:0::2;::::0;-1:-1:-1;;;;;37467:13:0::2;37451:6:::0;14642:10;-1:-1:-1;;;;;37424:92:0::2;;37483:5;37490:8;37500:15;37424:92;;;;;;;11955:25:1::0;;;12011:2;11996:18;;11989:34;;;;12054:2;12039:18;;12032:34;11943:2;11928:18;;11753:319;37424:92:0::2;;;;;;;;36955:569;37543:8;37530:9;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37581:13:0::2;::::0;37558:20:::2;::::0;-1:-1:-1;;;;;37581:13:0::2;:23;14642:10:::0;37581:52:::2;::::0;-1:-1:-1;;;;;;37581:52:0::2;::::0;;;;;;-1:-1:-1;;;;;15689:15:1;;;37581:52:0::2;::::0;::::2;15671:34:1::0;37627:4:0::2;15721:18:1::0;;;15714:43;15606:18;;37581:52:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37558:75;;37657:12;37648:5;:21;;37640:67;;;::::0;-1:-1:-1;;;37640:67:0;;16159:2:1;37640:67:0::2;::::0;::::2;16141:21:1::0;16198:2;16178:18;;;16171:30;16237:34;16217:18;;;16210:62;-1:-1:-1;;;16288:18:1;;;16281:31;16329:19;;37640:67:0::2;15957:397:1::0;37640:67:0::2;37714:21;37729:5;37714:14;:21::i;:::-;-1:-1:-1::0;37751:4:0::2;::::0;36120:1641;-1:-1:-1;;;;;;;36120:1641:0:o;50870:107::-;16465:13;:11;:13::i;:::-;50943:18:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;50943:28:0::1;-1:-1:-1::0;;;;50943:28:0;;::::1;::::0;;;::::1;::::0;;50870:107::o;51674:108::-;16465:13;:11;:13::i;:::-;51748:12:::1;:28:::0;51674:108::o;48763:300::-;16465:13;:11;:13::i;:::-;48870:1:::1;48852:15;:19;48844:60;;;::::0;-1:-1:-1;;;48844:60:0;;16561:2:1;48844:60:0::1;::::0;::::1;16543:21:1::0;16600:2;16580:18;;;16573:30;16639;16619:18;;;16612:58;16687:18;;48844:60:0::1;16359:352:1::0;48844:60:0::1;48931:14;::::0;;48952:32;;;;48996:61:::1;::::0;;11955:25:1;;;12011:2;11996:18;;11989:34;;;49041:15:0::1;12039:18:1::0;;;12032:34;48996:61:0;;::::1;::::0;;;;11943:2:1;48996:61:0;;::::1;48837:226;48763:300:::0;:::o;41736:197::-;41797:17;41823:16;41842:22;41857:6;41842:14;:22::i;:::-;41823:41;;41911:16;:14;:16::i;:::-;41895:12;;41884:23;;:8;:23;:::i;:::-;41883:44;;;;:::i;:::-;41871:56;41736:197;-1:-1:-1;;;41736:197:0:o;37914:1679::-;38038:4;37994:6;35836:9;;35817:15;:28;;:58;;;;;35868:7;;35849:15;:26;;35817:58;35809:94;;;;-1:-1:-1;;;35809:94:0;;;;;;;:::i;:::-;35927:1;35918:6;:10;35910:42;;;;-1:-1:-1;;;35910:42:0;;;;;;;:::i;:::-;19893:19:::1;:17;:19::i;:::-;23488:1:::2;24263:7;;:19;;24255:63;;;::::0;-1:-1:-1;;;24255:63:0;;16918:2:1;24255:63:0::2;::::0;::::2;16900:21:1::0;16957:2;16937:18;;;16930:30;16996:33;16976:18;;;16969:61;17047:18;;24255:63:0::2;16716:355:1::0;24255:63:0::2;23488:1;24396:7;:18:::0;38051:16:::3;38070:22;38085:6:::0;38070:14:::3;:22::i;:::-;38051:41;;38099:17;38147:16;:14;:16::i;:::-;38131:12;::::0;38120:23:::3;::::0;:8;:23:::3;:::i;:::-;38119:44;;;;:::i;:::-;38099:64;;38191:9;38178;:22;;38170:47;;;::::0;-1:-1:-1;;;38170:47:0;;17278:2:1;38170:47:0::3;::::0;::::3;17260:21:1::0;17317:2;17297:18;;;17290:30;-1:-1:-1;;;17336:18:1;;;17329:42;17388:18;;38170:47:0::3;17076:336:1::0;38170:47:0::3;38224:14;38241:21;38253:9:::0;38241::::3;:21;:::i;:::-;38224:38;;38288:6;38269:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;38305:10:0::3;::::0;:15;38301:41:::3;;38336:6;38322:10;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;38301:41:0::3;38349:13;38383:10;;38365:15;;:28;:59;;38414:10;;38365:59;;;38396:15;;38365:59;38349:75:::0;-1:-1:-1;38443:6:0::3;38450:1;38443:9;38453:11;;38443:22;;;;;;;;:::i;:::-;;;;;;;;;38435:5;:30;:75;;;-1:-1:-1::0;38488:6:0::3;38495:1;38488:9;38498:11;;38488:22;;;;;;;;:::i;:::-;;;;;;;;;38469:15;:41;;38435:75;38431:458;;;38544:6;38551:1;38544:9;38554:11;;38544:22;;;;;;;;:::i;:::-;;;;;;;;;38525:15;:41;38521:112;;38617:6:::0;38592::::3;38599:1;38592:9;38602:11;;38592:22;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;:::i;:::-;38579:10;:44:::0;38521:112:::3;38645:15;::::0;-1:-1:-1;;;38645:15:0;::::3;;;38641:58;;;38673:16;:14;:16::i;:::-;38707:20;38738:6;38707:20:::0;38738:9:::3;38748:11;;38738:22;;;;;;;;:::i;:::-;;;;;;;;;38730:5;:30;:76;;38800:6:::0;38792:5;38767:6:::3;38774:1;38767:9;38777:11;;38767:22;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;:::i;:::-;:39;;;;:::i;:::-;38730:76;;;38763:1;38730:76;38815:22;:41:::0;;::::3;::::0;;::::3;::::0;;-1:-1:-1;38815:41:0;;;;;;::::3;::::0;;;38865:11:::3;:16:::0;;38707:99;;-1:-1:-1;38815:41:0;;38865:11;;-1:-1:-1;38865:16:0::3;::::0;38815:41;;38865:16:::3;:::i;:::-;::::0;;;-1:-1:-1;;;38431:458:0::3;38899:5;38895:553;;;38919:23;::::0;-1:-1:-1;;;38919:23:0;::::3;;;38915:120;;;14642:10:::0;38963:27:::3;::::0;;;:13:::3;:27;::::0;;;;;::::3;;38955:70;;;;-1:-1:-1::0;;;38955:70:0::3;;;;;;;:::i;:::-;39043:23;::::0;-1:-1:-1;;;;;39043:23:0::3;:40;14642:10:::0;39107:12:::3;::::0;39098:21:::3;::::0;:6;:21:::3;:::i;:::-;39043:77;::::0;-1:-1:-1;;;;;;39043:77:0::3;::::0;;;;;;-1:-1:-1;;;;;15372:32:1;;;39043:77:0::3;::::0;::::3;15354:51:1::0;15421:18;;;15414:34;15327:18;;39043:77:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;39153:6;39129:20;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39173:93:0::3;::::0;;11955:25:1;;;12011:2;11996:18;;11989:34;;;39250:15:0::3;12039:18:1::0;;;12032:34;39173:93:0;;-1:-1:-1;;39209:6:0;;14642:10;;39173:93:::3;::::0;;;;;11943:2:1;39173:93:0;;::::3;38895:553;;;39329:12;::::0;39320:21:::3;::::0;:6;:21:::3;:::i;:::-;14642:10:::0;39289:26:::3;::::0;;;:12:::3;:26;::::0;;;;:53;;:26;;;:53:::3;::::0;;;::::3;:::i;:::-;::::0;;;-1:-1:-1;;39356:84:0::3;::::0;;11955:25:1;;;12011:2;11996:18;;11989:34;;;39424:15:0::3;12039:18:1::0;;;12032:34;39356:84:0;;-1:-1:-1;;39383:6:0;;14642:10;;39356:84:::3;::::0;;;;;11943:2:1;39356:84:0;;::::3;38895:553;39467:8;39454:9;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;39482:24:0::3;::::0;-1:-1:-1;39496:9:0;39482:13:::3;:24::i;:::-;39517:10:::0;;39513:56:::3;;39529:40;14642:10:::0;39562:6:::3;39529:9;:40::i;:::-;-1:-1:-1::0;;39583:4:0::3;24575:22:::0;;;39583:4;37914:1679;-1:-1:-1;;;;;;37914:1679:0:o;32884:61::-;16465:13;:11;:13::i;:::-;32929:10:::1;:8;:10::i;:::-;32884:61::o:0;46513:835::-;46562:4;19893:19;:17;:19::i;:::-;46583:9:::1;::::0;-1:-1:-1;;;;;46583:9:0::1;46575:56;;;::::0;-1:-1:-1;;;46575:56:0;;17619:2:1;46575:56:0::1;::::0;::::1;17601:21:1::0;17658:2;17638:18;;;17631:30;-1:-1:-1;;;17677:18:1;;;17670:50;17737:18;;46575:56:0::1;17417:344:1::0;46575:56:0::1;14642:10:::0;46647:27:::1;::::0;;;:13:::1;:27;::::0;;;;;::::1;;46646:28;46638:68;;;::::0;-1:-1:-1;;;46638:68:0;;17968:2:1;46638:68:0::1;::::0;::::1;17950:21:1::0;18007:2;17987:18;;;17980:30;18046:29;18026:18;;;18019:57;18093:18;;46638:68:0::1;17766:351:1::0;46638:68:0::1;46717:18;::::0;-1:-1:-1;;;46717:18:0;::::1;;;46713:111;;;14642:10:::0;46754:27:::1;::::0;;;:13:::1;:27;::::0;;;;;::::1;;46746:70;;;::::0;-1:-1:-1;;;46746:70:0;;18324:2:1;46746:70:0::1;::::0;::::1;18306:21:1::0;18363:2;18343:18;;;18336:30;18402:32;18382:18;;;18375:60;18452:18;;46746:70:0::1;18122:354:1::0;46746:70:0::1;46857:10;;46838:15;:29;;46830:67;;;::::0;-1:-1:-1;;;46830:67:0;;18683:2:1;46830:67:0::1;::::0;::::1;18665:21:1::0;18722:2;18702:18;;;18695:30;18761:27;18741:18;;;18734:55;18806:18;;46830:67:0::1;18481:349:1::0;46830:67:0::1;14642:10:::0;46913:24:::1;::::0;;;:10:::1;:24;::::0;;;;;::::1;;46912:25;46904:53;;;::::0;-1:-1:-1;;;46904:53:0;;19037:2:1;46904:53:0::1;::::0;::::1;19019:21:1::0;19076:2;19056:18;;;19049:30;-1:-1:-1;;;19095:18:1;;;19088:45;19150:18;;46904:53:0::1;18835:339:1::0;46904:53:0::1;14642:10:::0;46964:24:::1;::::0;;;:10:::1;:24;::::0;;;;;;;:31;;-1:-1:-1;;46964:31:0::1;46991:4;46964:31;::::0;;47019:12:::1;:26:::0;;;;;;47060:10;47052:39:::1;;;::::0;-1:-1:-1;;;47052:39:0;;19381:2:1;47052:39:0::1;::::0;::::1;19363:21:1::0;19420:2;19400:18;;;19393:30;-1:-1:-1;;;19439:18:1;;;19432:46;19495:18;;47052:39:0::1;19179:340:1::0;47052:39:0::1;14642:10:::0;47105:26:::1;::::0;;;:12:::1;:26;::::0;;;;;;;47098:33;;;47171:9:::1;::::0;47153:59;;-1:-1:-1;;;47153:59:0;;::::1;::::0;::::1;15354:51:1::0;;;;15421:18;;;15414:34;;;47153:59:0;;47105:26;;-1:-1:-1;;;;;47171:9:0;;::::1;::::0;47153:37:::1;::::0;15327:18:1;;;;;47105:26:0;;47153:59;;;;;;47105:26;47171:9;47153:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47138:74;;47227:7;47219:41;;;::::0;-1:-1:-1;;;47219:41:0;;19976:2:1;47219:41:0::1;::::0;::::1;19958:21:1::0;20015:2;19995:18;;;19988:30;-1:-1:-1;;;20034:18:1;;;20027:51;20095:18;;47219:41:0::1;19774:345:1::0;47219:41:0::1;47272:52;::::0;;20298:25:1;;;47308:15:0::1;20354:2:1::0;20339:18;;20332:34;14642:10:0;;47272:52:::1;::::0;20271:18:1;47272:52:0::1;;;;;;;47338:4;47331:11;;;;46513:835:::0;:::o;50530:240::-;16465:13;:11;:13::i;:::-;50637:9:::1;50632:133;50652:37:::0;;::::1;50632:133;;;50752:5;50705:13;:44;50719:26;;50746:1;50719:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50705:44:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50705:44:0;:52;;-1:-1:-1;;50705:52:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50691:3;::::1;::::0;::::1;:::i;:::-;;;;50632:133;;31873:848:::0;11010:19;11033:13;;;;;;11032:14;;11080:34;;;;-1:-1:-1;11098:12:0;;11113:1;11098:12;;;;:16;11080:34;11079:108;;;-1:-1:-1;11159:4:0;1717:19;:23;;;11120:66;;-1:-1:-1;11169:12:0;;;;;:17;11120:66;11057:204;;;;-1:-1:-1;;;11057:204:0;;20579:2:1;11057:204:0;;;20561:21:1;20618:2;20598:18;;;20591:30;20657:34;20637:18;;;20630:62;-1:-1:-1;;;20708:18:1;;;20701:44;20762:19;;11057:204:0;20377:410:1;11057:204:0;11272:12;:16;;-1:-1:-1;;11272:16:0;11287:1;11272:16;;;11299:67;;;;11334:13;:20;;-1:-1:-1;;11334:20:0;;;;;11299:67;-1:-1:-1;;;;;32077:21:0;::::1;32069:57;;;::::0;-1:-1:-1;;;32069:57:0;;20994:2:1;32069:57:0::1;::::0;::::1;20976:21:1::0;21033:2;21013:18;;;21006:30;21072:25;21052:18;;;21045:53;21115:18;;32069:57:0::1;20792:347:1::0;32069:57:0::1;-1:-1:-1::0;;;;;32141:19:0;::::1;32133:49;;;::::0;-1:-1:-1;;;32133:49:0;;21346:2:1;32133:49:0::1;::::0;::::1;21328:21:1::0;21385:2;21365:18;;;21358:30;-1:-1:-1;;;21404:18:1;;;21397:47;21461:18;;32133:49:0::1;21144:341:1::0;32133:49:0::1;32210:15;32197:10;:28;:53;;;;;32240:10;32229:8;:21;32197:53;32189:78;;;::::0;-1:-1:-1;;;32189:78:0;;21692:2:1;32189:78:0::1;::::0;::::1;21674:21:1::0;21731:2;21711:18;;;21704:30;-1:-1:-1;;;21750:18:1;;;21743:42;21802:18;;32189:78:0::1;21490:336:1::0;32189:78:0::1;32274:27;:25;:27::i;:::-;32308:26;:24;:26::i;:::-;32341:34;:32;:34::i;:::-;32398:8;32382:12;:25:::0;32414:19:::1;:41:::0;;-1:-1:-1;;;;;32414:41:0;;::::1;-1:-1:-1::0;;;;;;32414:41:0;;::::1;;::::0;;;32462:13:::1;:40:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;32509:9:::1;:22:::0;;;32538:7:::1;:18:::0;;;32563:16:::1;:6;32572:7:::0;-1:-1:-1;32563:16:0::1;:::i;:::-;-1:-1:-1::0;32586:14:0::1;:32:::0;;;32625:13:::1;:30:::0;;-1:-1:-1;;;;;;32625:30:0::1;-1:-1:-1::0;;;;;32625:30:0;::::1;;::::0;;32679:9:::1;::::0;32690:7:::1;::::0;32667:48:::1;::::0;;11955:25:1;;;12011:2;11996:18;;11989:34;;;;32699:15:0::1;12039:18:1::0;;;12032:34;32667:48:0::1;::::0;11943:2:1;11928:18;32667:48:0::1;;;;;;;11392:14:::0;11388:102;;;11439:5;11423:21;;-1:-1:-1;;11423:21:0;;;11464:14;;-1:-1:-1;21983:36:1;;11464:14:0;;21971:2:1;21956:18;11464:14:0;;;;;;;11388:102;10999:498;31873:848;;;;;;;:::o;35171:585::-;16465:13;:11;:13::i;:::-;35299:12:::1;:19;35280:8;:15;:38;35272:68;;;::::0;-1:-1:-1;;;35272:68:0;;22232:2:1;35272:68:0::1;::::0;::::1;22214:21:1::0;22271:2;22251:18;;;22244:30;-1:-1:-1;;;22290:18:1;;;22283:47;22347:18;;35272:68:0::1;22030:341:1::0;35272:68:0::1;35347:14;35354:7;;35347:14;:::i;:::-;35368:18;35375:11;;35368:18;:::i;:::-;35393:23;35434:9:::0;35429:247:::1;35453:8;:15;35449:1;:19;35429:247;;;35510:1;35492:12;35505:1;35492:15;;;;;;;;:::i;:::-;;;;;;;:19;35484:65;;;::::0;-1:-1:-1;;;35484:65:0;;22578:2:1;35484:65:0::1;::::0;::::1;22560:21:1::0;22617:2;22597:18;;;22590:30;22656:34;22636:18;;;22629:62;-1:-1:-1;;;22707:18:1;;;22700:31;22748:19;;35484:65:0::1;22376:397:1::0;35484:65:0::1;35577:12;35590:1;35577:15;;;;;;;;:::i;:::-;;;;;;;35558:34;;;;;:::i;:::-;;;35601:7;35614:8;35623:1;35614:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;35601:25;;::::1;::::0;::::1;::::0;;-1:-1:-1;35601:25:0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;35601:25:0::1;-1:-1:-1::0;;;;;35601:25:0;;::::1;::::0;;;::::1;::::0;;35652:15;;35635:11:::1;::::0;35652:15;;35665:1;;35652:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;35635:33;;::::1;::::0;::::1;::::0;;-1:-1:-1;35635:33:0;;;;;;;::::1;::::0;35470:3;::::1;::::0;::::1;:::i;:::-;;;;35429:247;;;;35692:15;35711:3;35692:22;35684:66;;;::::0;-1:-1:-1;;;35684:66:0;;22980:2:1;35684:66:0::1;::::0;::::1;22962:21:1::0;23019:2;22999:18;;;22992:30;23058:33;23038:18;;;23031:61;23109:18;;35684:66:0::1;22778:355:1::0;42054:165:0;42116:16;42152:22;42167:6;42152:14;:22::i;:::-;42141:33;-1:-1:-1;42192:21:0;42204:8;42141:33;42192:21;:::i;:::-;42181:32;42054:165;-1:-1:-1;;42054:165:0:o;52532:565::-;52602:5;;-1:-1:-1;;;;;52602:5:0;52588:10;:19;;:44;;-1:-1:-1;16652:6:0;;-1:-1:-1;;;;;16652:6:0;52611:10;:21;52588:44;52580:82;;;;-1:-1:-1;;;52580:82:0;;23340:2:1;52580:82:0;;;23322:21:1;23379:2;23359:18;;;23352:30;23418:27;23398:18;;;23391:55;23463:18;;52580:82:0;23138:349:1;52580:82:0;52690:10;;52669:15;:32;;;;;;;-1:-1:-1;52669:32:0;;;;;;;52712:15;;-1:-1:-1;;;52712:15:0;;;;52708:54;;;52738:16;:14;:16::i;:::-;52785:6;52792:1;52785:9;52795:11;;52785:22;;;;;;;;:::i;:::-;;;;;;;;;52772:10;;:35;52768:304;;;52822:11;;52818:203;;52904:15;;52851:22;;52879:6;52886:1;52879:9;52889:11;;52879:22;;;;;;;;:::i;:::-;;;;;;;;;:40;;;;:::i;:::-;52851:69;;;;;;;-1:-1:-1;52851:69:0;;;;;;;;;;;52818:203;;;53000:10;;52947:22;;52975:6;52982:1;52975:9;52985:11;;52975:22;;;;;;;;:::i;:::-;;;;;;;;;:35;;;;:::i;:::-;52947:64;;;;;;;-1:-1:-1;52947:64:0;;;;;;;;;;;52818:203;53042:6;53049:1;53042:9;53052:11;;53042:22;;;;;;;;:::i;:::-;;;;;;;;;;;53029:10;:35;52768:304;53078:11;:13;;;:11;:13;;;:::i;:::-;;;;;;52532:565::o;53186:80::-;16465:13;:11;:13::i;:::-;53246:5:::1;:14:::0;;-1:-1:-1;;;;;;53246:14:0::1;-1:-1:-1::0;;;;;53246:14:0;;;::::1;::::0;;;::::1;::::0;;53186:80::o;17227:103::-;16465:13;:11;:13::i;:::-;17292:30:::1;17319:1;17292:18;:30::i;29852:24::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29852:24:0;;-1:-1:-1;29852:24:0;:::o;32773:57::-;16465:13;:11;:13::i;:::-;32816:8:::1;:6;:8::i;49711:240::-:0;16465:13;:11;:13::i;:::-;49818:9:::1;49813:133;49833:37:::0;;::::1;49813:133;;;49933:5;49886:13;:44;49900:26;;49927:1;49900:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49886:44:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;49886:44:0;:52;;-1:-1:-1;;49886:52:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49872:3;::::1;::::0;::::1;:::i;:::-;;;;49813:133;;44922:758:::0;45063:4;16465:13;:11;:13::i;:::-;-1:-1:-1;;;;;45084:24:0;::::1;45076:55;;;::::0;-1:-1:-1;;;45076:55:0;;23694:2:1;45076:55:0::1;::::0;::::1;23676:21:1::0;23733:2;23713:18;;;23706:30;-1:-1:-1;;;23752:18:1;;;23745:48;23810:18;;45076:55:0::1;23492:342:1::0;45076:55:0::1;45146:10;::::0;:15;45138:45:::1;;;::::0;-1:-1:-1;;;45138:45:0;;24041:2:1;45138:45:0::1;::::0;::::1;24023:21:1::0;24080:2;24060:18;;;24053:30;-1:-1:-1;;;24099:18:1;;;24092:47;24156:18;;45138:45:0::1;23839:341:1::0;45138:45:0::1;45190:10;:24:::0;;;45221:9:::1;:22:::0;;-1:-1:-1;;;;;45221:22:0;;::::1;-1:-1:-1::0;;;;;;45221:22:0;;::::1;::::0;::::1;::::0;;;45250:18:::1;:25:::0;;-1:-1:-1;;;;45250:25:0::1;-1:-1:-1::0;;;45250:25:0::1;::::0;;45282:23:::1;:64:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;45353:80:::1;::::0;-1:-1:-1;;;45353:80:0;;::::1;::::0;::::1;15354:51:1::0;;;;-1:-1:-1;;15421:18:1;;;15414:34;45353:37:0::1;::::0;15327:18:1;;45353:80:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;45604:52:0::1;::::0;;20298:25:1;;;45640:15:0::1;20354:2:1::0;20339:18;;20332:34;-1:-1:-1;;;;;45604:52:0;::::1;::::0;::::1;::::0;20271:18:1;45604:52:0::1;;;;;;;-1:-1:-1::0;45670:4:0::1;44922:758:::0;;;;;;:::o;34971:194::-;35018:7;35037:12;35059:19;;;;;;;;;-1:-1:-1;;;;;35059:19:0;-1:-1:-1;;;;;35059:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35034:62;;;;;;35112:5;35121:8;35112:18;;;;:::i;53440:142::-;16465:13;:11;:13::i;:::-;53526:11:::1;:19:::0;;;;53552:10:::1;:24:::0;53440:142::o;49069:103::-;16465:13;:11;:13::i;:::-;49150:16:::1;:6;49159:7:::0;49150:16:::1;;:::i;33068:984::-:0;33130:7;33146:18;33171:13;33187:10;;33201:1;33187:15;:46;;33223:10;;33187:46;;;33205:15;;33187:46;33171:62;;33259:14;;33248:7;:25;;33240:70;;;;-1:-1:-1;;;33240:70:0;;25607:2:1;33240:70:0;;;25589:21:1;;;25626:18;;;25619:30;25685:34;25665:18;;;25658:62;25737:18;;33240:70:0;25405:356:1;33240:70:0;33339:6;33346:1;33339:9;33349:11;;33339:22;;;;;;;;:::i;:::-;;;;;;;;;33331:5;33321:7;:15;;;;:::i;:::-;:40;:85;;;-1:-1:-1;33384:6:0;33391:1;33384:9;33394:11;;33384:22;;;;;;;;:::i;:::-;;;;;;;;;33365:15;:41;;33321:85;33317:705;;;33440:6;:16;:20;;33459:1;;33440:20;:::i;:::-;33425:11;;:36;33417:61;;;;-1:-1:-1;;;33417:61:0;;25968:2:1;33417:61:0;;;25950:21:1;26007:2;25987:18;;;25980:30;-1:-1:-1;;;26026:18:1;;;26019:42;26078:18;;33417:61:0;25766:336:1;33417:61:0;33510:6;33517:1;33510:9;33520:11;;33510:22;;;;;;;;:::i;:::-;;;;;;;;;33491:15;:41;33487:477;;33599:11;;33589:6;;33599:15;;33613:1;33599:15;:::i;:::-;33589:26;;;;;;;;:::i;:::-;;;;;;;;;33578:7;33553:6;33560:1;33553:9;;;;;;;:::i;:::-;;33563:11;;33553:22;;;;;;;;:::i;:::-;;;;;;;;;:32;;;;:::i;:::-;:62;;33545:110;;;;-1:-1:-1;;;33545:110:0;;26309:2:1;33545:110:0;;;26291:21:1;26348:2;26328:18;;;26321:30;26387:34;26367:18;;;26360:62;-1:-1:-1;;;26438:18:1;;;26431:33;26481:19;;33545:110:0;26107:399:1;33545:110:0;33699:11;;33689:9;;33699:15;;33696:1;33699:15;:::i;:::-;33689:26;;;;;;;;:::i;:::-;;;;;;;;;33679:7;:36;;;;:::i;:::-;33666:49;;33317:705;;33487:477;33742:34;33804:5;33779:6;33742:34;33779:9;33789:11;;33779:22;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;:::i;:::-;33938:11;;33742:67;;-1:-1:-1;33928:9:0;;33938:15;;33935:1;33938:15;:::i;:::-;33928:26;;;;;;;;:::i;:::-;;;;;;;;;33898;33888:7;:36;;;;:::i;:::-;33887:67;;;;:::i;:::-;33862:6;33869:1;33862:9;33872:11;;33862:22;;;;;;;;:::i;:::-;;;;;;;;;33833:26;:51;;;;:::i;:::-;:121;;;;:::i;:::-;33820:134;;33731:233;33317:705;;;34000:6;34007:1;34000:9;34010:11;;34000:22;;;;;;;;:::i;:::-;;;;;;;;;33990:7;:32;;;;:::i;:::-;33977:45;;33317:705;-1:-1:-1;34036:10:0;33068:984;-1:-1:-1;;33068:984:0:o;39867:1749::-;40012:4;39967:7;35836:9;;35817:15;:28;;:58;;;;;35868:7;;35849:15;:26;;35817:58;35809:94;;;;-1:-1:-1;;;35809:94:0;;;;;;;:::i;:::-;35927:1;35918:6;:10;35910:42;;;;-1:-1:-1;;;35910:42:0;;;;;;;:::i;:::-;19893:19:::1;:17;:19::i;:::-;23488:1:::2;24263:7;;:19;;24255:63;;;::::0;-1:-1:-1;;;24255:63:0;;16918:2:1;24255:63:0::2;::::0;::::2;16900:21:1::0;16957:2;16937:18;;;16930:30;16996:33;16976:18;;;16969:61;17047:18;;24255:63:0::2;16716:355:1::0;24255:63:0::2;23488:1;24396:7;:18:::0;14642:10;40033:29:::3;::::0;;;:15:::3;:29;::::0;;;;;::::3;;40025:74;;;::::0;-1:-1:-1;;;40025:74:0;;26713:2:1;40025:74:0::3;::::0;::::3;26695:21:1::0;;;26732:18;;;26725:30;26791:34;26771:18;;;26764:62;26843:18;;40025:74:0::3;26511:356:1::0;40025:74:0::3;40106:16;40125:23;40140:7;40125:14;:23::i;:::-;40106:42;;40155:17;40203:16;:14;:16::i;:::-;40187:12;::::0;40176:23:::3;::::0;:8;:23:::3;:::i;:::-;40175:44;;;;:::i;:::-;40155:64;;40247:9;40234;:22;;40226:47;;;::::0;-1:-1:-1;;;40226:47:0;;17278:2:1;40226:47:0::3;::::0;::::3;17260:21:1::0;17317:2;17297:18;;;17290:30;-1:-1:-1;;;17336:18:1;;;17329:42;17388:18;;40226:47:0::3;17076:336:1::0;40226:47:0::3;40280:14;40297:21;40309:9:::0;40297::::3;:21;:::i;:::-;40280:38;;40344:7;40325:15;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40362:10:0::3;::::0;:15;40358:42:::3;;40393:7;40379:10;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40358:42:0::3;40407:13;40441:10;;40423:15;;:28;:59;;40472:10;;40423:59;;;40454:15;;40423:59;40407:75:::0;-1:-1:-1;40501:6:0::3;40508:1;40501:9;40511:11;;40501:22;;;;;;;;:::i;:::-;;;;;;;;;40493:5;:30;:75;;;-1:-1:-1::0;40546:6:0::3;40553:1;40546:9;40556:11;;40546:22;;;;;;;;:::i;:::-;;;;;;;;;40527:15;:41;;40493:75;40489:460;;;40602:6;40609:1;40602:9;40612:11;;40602:22;;;;;;;;:::i;:::-;;;;;;;;;40583:15;:41;40579:113;;40675:7:::0;40650:6:::3;40657:1;40650:9;40660:11;;40650:22;;;;;;;;:::i;:::-;;;;;;;;;:32;;;;:::i;:::-;40637:10;:45:::0;40579:113:::3;40704:15;::::0;-1:-1:-1;;;40704:15:0;::::3;;;40700:58;;;40732:16;:14;:16::i;:::-;40766:20;40797:6;40766:20:::0;40797:9:::3;40807:11;;40797:22;;;;;;;;:::i;:::-;;;;;;;;;40789:5;:30;:77;;40859:7:::0;40851:5;40826:6:::3;40833:1;40826:9;40836:11;;40826:22;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;:::i;:::-;:40;;;;:::i;:::-;40789:77;;;40822:1;40789:77;40875:22;:41:::0;;::::3;::::0;;::::3;::::0;;-1:-1:-1;40875:41:0;;;;;;::::3;::::0;;;40925:11:::3;:16:::0;;40766:100;;-1:-1:-1;40875:41:0;;40925:11;;-1:-1:-1;40925:16:0::3;::::0;40875:41;;40925:16:::3;:::i;:::-;::::0;;;-1:-1:-1;;;40489:460:0::3;40959:5;40955:523;;;40979:23;::::0;-1:-1:-1;;;40979:23:0;::::3;;;40975:113;;;-1:-1:-1::0;;;;;41023:20:0;::::3;;::::0;;;:13:::3;:20;::::0;;;;;::::3;;41015:63;;;;-1:-1:-1::0;;;41015:63:0::3;;;;;;;:::i;:::-;41096:23;::::0;41154:12:::3;::::0;-1:-1:-1;;;;;41096:23:0;;::::3;::::0;:40:::3;::::0;41137:5;;41144:22:::3;::::0;:7;:22:::3;:::i;:::-;41096:71;::::0;-1:-1:-1;;;;;;41096:71:0::3;::::0;;;;;;-1:-1:-1;;;;;15372:32:1;;;41096:71:0::3;::::0;::::3;15354:51:1::0;15421:18;;;15414:34;15327:18;;41096:71:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;41200:7;41176:20;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;41221:87:0::3;::::0;;11955:25:1;;;12011:2;11996:18;;11989:34;;;41292:15:0::3;12039:18:1::0;;;12032:34;41221:87:0;;-1:-1:-1;;41250:7:0;;-1:-1:-1;;;;;41221:87:0;::::3;::::0;::::3;::::0;;;;;11943:2:1;41221:87:0;;::::3;40955:523;;;41365:12;::::0;41355:22:::3;::::0;:7;:22:::3;:::i;:::-;-1:-1:-1::0;;;;;41331:19:0;::::3;;::::0;;;:12:::3;:19;::::0;;;;:47;;:19;;;:47:::3;::::0;;;::::3;:::i;:::-;::::0;;;-1:-1:-1;;41392:78:0::3;::::0;;11955:25:1;;;12011:2;11996:18;;11989:34;;;41454:15:0::3;12039:18:1::0;;;12032:34;41392:78:0;;-1:-1:-1;;41412:7:0;;-1:-1:-1;;;;;41392:78:0;::::3;::::0;::::3;::::0;;;;;11943:2:1;41392:78:0;;::::3;40955:523;41497:8;41484:9;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;41512:24:0::3;::::0;-1:-1:-1;41526:9:0;41512:13:::3;:24::i;:::-;41547:10:::0;;41543:49:::3;;41559:33;41577:5;41585:6;41559:9;:33::i;:::-;-1:-1:-1::0;;41606:4:0::3;24575:22:::0;;;41606:4;39867:1749;-1:-1:-1;;;;;;;39867:1749:0:o;44331:352::-;16465:13;:11;:13::i;:::-;-1:-1:-1;;;;;44424:36:0;::::1;44416:104;;;::::0;-1:-1:-1;;;44416:104:0;;27074:2:1;44416:104:0::1;::::0;::::1;27056:21:1::0;27113:2;27093:18;;;27086:30;27152:34;27132:18;;;27125:62;27223:25;27203:18;;;27196:53;27266:19;;44416:104:0::1;26872:419:1::0;44416:104:0::1;44527:23;:64:::0;;-1:-1:-1;;;;;;44527:64:0::1;-1:-1:-1::0;;;;;44527:64:0;;::::1;::::0;;::::1;::::0;;;44616:9:::1;::::0;44598:79:::1;::::0;-1:-1:-1;;;44598:79:0;;::::1;::::0;::::1;15354:51:1::0;;;;-1:-1:-1;;15421:18:1;;;15414:34;44616:9:0;;::::1;::::0;44598:36:::1;::::0;15327:18:1;;44598:79:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45780:115::-:0;16465:13;:11;:13::i;:::-;45856:23:::1;:33:::0;;;::::1;;-1:-1:-1::0;;;45856:33:0::1;-1:-1:-1::0;;;;45856:33:0;;::::1;::::0;;;::::1;::::0;;45780:115::o;51880:107::-;51938:16;51970:6;51977:3;51970:11;;;;;;;:::i;:::-;;51963:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51880:107;;;:::o;49331:207::-;16465:13;:11;:13::i;:::-;49424:9:::1;49419:114;49439:28:::0;;::::1;49419:114;;;49521:4;49483:13;:35;49497:17;;49515:1;49497:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49483:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;49483:35:0;:42;;-1:-1:-1;;49483:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49469:3;::::1;::::0;::::1;:::i;:::-;;;;49419:114;;29775:39:::0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29775:39:0;:::o;53816:115::-;53871:16;53903:22;53896:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53816:115;:::o;51096:194::-;16465:13;:11;:13::i;:::-;-1:-1:-1;;;;;51186:31:0;::::1;51178:66;;;::::0;-1:-1:-1;;;51178:66:0;;27498:2:1;51178:66:0::1;::::0;::::1;27480:21:1::0;27537:2;27517:18;;;27510:30;-1:-1:-1;;;27556:18:1;;;27549:52;27618:18;;51178:66:0::1;27296:346:1::0;51178:66:0::1;51251:13;:33:::0;;-1:-1:-1;;;;;;51251:33:0::1;-1:-1:-1::0;;;;;51251:33:0;;;::::1;::::0;;;::::1;::::0;;51096:194::o;47354:625::-;47411:4;19893:19;:17;:19::i;:::-;47432:9:::1;::::0;-1:-1:-1;;;;;47432:9:0::1;47424:56;;;::::0;-1:-1:-1;;;47424:56:0;;17619:2:1;47424:56:0::1;::::0;::::1;17601:21:1::0;17658:2;17638:18;;;17631:30;-1:-1:-1;;;17677:18:1;;;17670:50;17737:18;;47424:56:0::1;17417:344:1::0;47424:56:0::1;14642:10:::0;47496:27:::1;::::0;;;:13:::1;:27;::::0;;;;;::::1;;47495:28;47487:68;;;::::0;-1:-1:-1;;;47487:68:0;;17968:2:1;47487:68:0::1;::::0;::::1;17950:21:1::0;18007:2;17987:18;;;17980:30;18046:29;18026:18;;;18019:57;18093:18;;47487:68:0::1;17766:351:1::0;47487:68:0::1;47566:23;::::0;-1:-1:-1;;;47566:23:0;::::1;;;47562:116;;;14642:10:::0;47608:27:::1;::::0;;;:13:::1;:27;::::0;;;;;::::1;;47600:70;;;;-1:-1:-1::0;;;47600:70:0::1;;;;;;;:::i;:::-;14642:10:::0;47684:14:::1;47701:26:::0;;;:12:::1;:26;::::0;;;;;47742:10;47734:39:::1;;;::::0;-1:-1:-1;;;47734:39:0;;27849:2:1;47734:39:0::1;::::0;::::1;27831:21:1::0;27888:2;27868:18;;;27861:30;-1:-1:-1;;;27907:18:1;;;27900:46;27963:18;;47734:39:0::1;27647:340:1::0;47734:39:0::1;47780:23;::::0;-1:-1:-1;;;;;47780:23:0::1;:40;14642:10:::0;47780:62:::1;::::0;-1:-1:-1;;;;;;47780:62:0::1;::::0;;;;;;-1:-1:-1;;;;;15372:32:1;;;47780:62:0::1;::::0;::::1;15354:51:1::0;15421:18;;;15414:34;;;15327:18;;47780:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47856:12;:26;47869:12;14642:10:::0;;14562:98;47869:12:::1;-1:-1:-1::0;;;;;47856:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47856:26:0;;;47849:33;14642:10;-1:-1:-1;;;;;47894:61:0::1;;47931:6;47939:15;47894:61;;;;;;20298:25:1::0;;;20354:2;20339:18;;20332:34;20286:2;20271:18;;20124:248;47894:61:0::1;;;;;;;;47969:4;47962:11;;;47354:625:::0;:::o;29738:32::-;;;;;;;;;;;;29707:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50130:207::-;16465:13;:11;:13::i;:::-;50223:9:::1;50218:114;50238:28:::0;;::::1;50218:114;;;50320:4;50282:13;:35;50296:17;;50314:1;50296:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50282:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50282:35:0;:42;;-1:-1:-1;;50282:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50268:3;::::1;::::0;::::1;:::i;:::-;;;;50218:114;;17485:201:::0;16465:13;:11;:13::i;:::-;-1:-1:-1;;;;;17574:22:0;::::1;17566:73;;;::::0;-1:-1:-1;;;17566:73:0;;28194:2:1;17566:73:0::1;::::0;::::1;28176:21:1::0;28233:2;28213:18;;;28206:30;28272:34;28252:18;;;28245:62;-1:-1:-1;;;28323:18:1;;;28316:36;28369:19;;17566:73:0::1;27992:402:1::0;17566:73:0::1;17650:28;17669:8;17650:18;:28::i;:::-;17485:201:::0;:::o;48493:264::-;16465:13;:11;:13::i;:::-;48612:9:::1;48607:145;48627:42:::0;;::::1;48607:145;;;48739:5;48685:15;:51;48701:31;;48733:1;48701:34;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48685:51:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48685:51:0;:59;;-1:-1:-1;;48685:59:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48671:3;::::1;::::0;::::1;:::i;:::-;;;;48607:145;;29819:28:::0;;;;;;;;;;;;52173:291;16465:13;:11;:13::i;:::-;52291:37;;::::1;52283:65;;;::::0;-1:-1:-1;;;52283:65:0;;28601:2:1;52283:65:0::1;::::0;::::1;28583:21:1::0;28640:2;28620:18;;;28613:30;-1:-1:-1;;;28659:18:1;;;28652:45;28714:18;;52283:65:0::1;28399:339:1::0;52283:65:0::1;52360:9;52355:104;52375:17:::0;;::::1;52355:104;;;52435:13;;52449:1;52435:16;;;;;;;:::i;:::-;;;;;;;52408:12;:23;52421:6;;52428:1;52421:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52408:23:0::1;-1:-1:-1::0;;;;;52408:23:0::1;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;52394:3:0;;-1:-1:-1;52394:3:0::1;::::0;::::1;:::i;:::-;;;;52355:104;;;;52173:291:::0;;;;:::o;16744:132::-;16652:6;;-1:-1:-1;;;;;16652:6:0;14642:10;16808:23;16800:68;;;;-1:-1:-1;;;16800:68:0;;28945:2:1;16800:68:0;;;28927:21:1;;;28964:18;;;28957:30;29023:34;29003:18;;;28996:62;29075:18;;16800:68:0;28743:356:1;20447:108:0;20359:7;;;;20517:9;20509:38;;;;-1:-1:-1;;;20509:38:0;;29306:2:1;20509:38:0;;;29288:21:1;29345:2;29325:18;;;29318:30;-1:-1:-1;;;29364:18:1;;;29357:46;29420:18;;20509:38:0;29104:340:1;51359:184:0;51406:9;51401:137;51440:11;;51421:9;:16;:30;;51440:11;51421:30;:::i;:::-;51417:1;:34;51401:137;;;51518:12;;51514:16;;:1;:16;:::i;:::-;51496:34;;:15;:34;:::i;:::-;51477:11;;51467:9;;51477:15;;51491:1;;51477:15;:::i;:::-;51467:26;;;;;;;;:::i;:::-;;;;;;;;;;:63;51453:3;;;;:::i;:::-;;;;51401:137;;43092:1088;43153:7;:14;43149:1026;;43191:13;;-1:-1:-1;;;;;43191:13:0;43183:62;;;;-1:-1:-1;;;43183:62:0;;29651:2:1;43183:62:0;;;29633:21:1;29690:2;29670:18;;;29663:30;-1:-1:-1;;;29709:18:1;;;29702:52;29771:18;;43183:62:0;29449:346:1;43183:62:0;43281:13;;43255:12;;-1:-1:-1;;;;;43281:13:0;14642:10;43380:13;;43301:102;;-1:-1:-1;;;;;30058:15:1;;;43301:102:0;;;30040:34:1;43380:13:0;;30090:18:1;;;30083:43;30142:18;;;30135:34;;;29975:18;;43301:102:0;;;-1:-1:-1;;43301:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;43301:102:0;-1:-1:-1;;;43301:102:0;;;43273:131;;;43301:102;43273:131;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43254:150;;;43421:7;43413:40;;;;-1:-1:-1;;;43413:40:0;;;;;;;:::i;43149:1026::-;43476:16;;43501:382;43525:7;:14;43521:18;;43501:382;;;43557:24;43613:3;43595:11;43607:1;43595:14;;;;;;;;:::i;:::-;;;;;;;;;43585:7;:24;;;;:::i;:::-;43584:32;;;;:::i;:::-;43654:13;;43557:59;;-1:-1:-1;43628:12:0;;-1:-1:-1;;;;;43654:13:0;14642:10;43753:7;43761:1;43753:10;;;;;;;;:::i;:::-;;;;;;;;;;;43674:108;;-1:-1:-1;;;;;30058:15:1;;;43674:108:0;;;30040:34:1;43753:10:0;;30090:18:1;;;30083:43;30142:18;;;30135:34;;;29975:18;;43674:108:0;;;-1:-1:-1;;43674:108:0;;;;;;;;;;;;;;-1:-1:-1;;;;;43674:108:0;-1:-1:-1;;;43674:108:0;;;43646:137;;;43674:108;43646:137;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43627:156;;;43802:7;43794:40;;;;-1:-1:-1;;;43794:40:0;;;;;;;:::i;:::-;43845:28;43857:16;43845:28;;:::i;:::-;;;43546:337;;43541:3;;;;;:::i;:::-;;;;43501:382;;;-1:-1:-1;43918:1:0;43896:18;43906:8;43896:7;:18;:::i;:::-;43895:24;43891:277;;;43959:13;;43933:12;;-1:-1:-1;;;;;43959:13:0;14642:10;44058:7;44066:14;;:18;;44083:1;;44066:18;:::i;:::-;44058:27;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;44058:27:0;44087:18;44097:8;44087:7;:18;:::i;:::-;43979:127;;-1:-1:-1;;;;;30058:15:1;;;43979:127:0;;;30040:34:1;30110:15;;;;30090:18;;;30083:43;30142:18;;;30135:34;29975:18;;43979:127:0;;;-1:-1:-1;;43979:127:0;;;;;;;;;;;;;;-1:-1:-1;;;;;43979:127:0;-1:-1:-1;;;43979:127:0;;;43951:156;;;43979:127;43951:156;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43932:175;;;44126:7;44118:40;;;;-1:-1:-1;;;44118:40:0;;;;;;;:::i;42474:612::-;42534:7;:14;42530:551;;42572:13;;-1:-1:-1;;;;;42572:13:0;42564:62;;;;-1:-1:-1;;;42564:62:0;;29651:2:1;42564:62:0;;;29633:21:1;29690:2;29670:18;;;29663:30;-1:-1:-1;;;29709:18:1;;;29702:52;29771:18;;42564:62:0;29449:346:1;42564:62:0;42653:13;;42635:42;;-1:-1:-1;;;;;42653:13:0;42669:7;42635:9;:42::i;42530:551::-;42700:16;;42725:223;42749:7;:14;42745:18;;42725:223;;;42781:24;42837:3;42819:11;42831:1;42819:14;;;;;;;;:::i;:::-;;;;;;;;;42809:7;:24;;;;:::i;:::-;42808:32;;;;:::i;:::-;42781:59;;42851:48;42869:7;42877:1;42869:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;42869:10:0;42882:16;42851:9;:48::i;:::-;42910:28;42922:16;42910:28;;:::i;:::-;;;42770:178;42765:3;;;;;:::i;:::-;;;;42725:223;;;-1:-1:-1;42983:1:0;42961:18;42971:8;42961:7;:18;:::i;:::-;42960:24;42956:118;;;43015:7;43023:14;;42997:67;;43015:7;43023:18;;43040:1;;43023:18;:::i;:::-;43015:27;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;43015:27:0;43045:18;43055:8;43045:7;:18;:::i;:::-;42336:6;42311:21;:31;;42303:55;;;;-1:-1:-1;;;42303:55:0;;31162:2:1;42303:55:0;;;31144:21:1;31201:2;31181:18;;;31174:30;-1:-1:-1;;;31220:18:1;;;31213:41;31271:18;;42303:55:0;30960:335:1;42303:55:0;42366:12;42384:9;-1:-1:-1;;;;;42384:14:0;42406:6;42384:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42365:52;;;42432:7;42424:38;;;;-1:-1:-1;;;42424:38:0;;31712:2:1;42424:38:0;;;31694:21:1;31751:2;31731:18;;;31724:30;-1:-1:-1;;;31770:18:1;;;31763:48;31828:18;;42424:38:0;31510:342:1;21143:120:0;20152:16;:14;:16::i;:::-;21202:7:::1;:15:::0;;-1:-1:-1;;21202:15:0::1;::::0;;21233:22:::1;14642:10:::0;21242:12:::1;21233:22;::::0;-1:-1:-1;;;;;2878:32:1;;;2860:51;;2848:2;2833:18;21233:22:0::1;;;;;;;21143:120::o:0;19565:97::-;12851:13;;;;;;;12843:69;;;;-1:-1:-1;;;12843:69:0;;;;;;;:::i;:::-;19639:7:::1;:15:::0;;-1:-1:-1;;19639:15:0::1;::::0;;19565:97::o;16227:113::-;12851:13;;;;;;;12843:69;;;;-1:-1:-1;;;12843:69:0;;;;;;;:::i;:::-;16300:32:::1;14642:10:::0;16300:18:::1;:32::i;23651:111::-:0;12851:13;;;;;;;12843:69;;;;-1:-1:-1;;;12843:69:0;;;;;;;:::i;:::-;23444:1:::1;23732:22:::0;;23651:111::o;17846:191::-;17939:6;;;-1:-1:-1;;;;;17956:17:0;;;-1:-1:-1;;;;;;17956:17:0;;;;;;;17989:40;;17939:6;;;17956:17;17939:6;;17989:40;;17920:16;;17989:40;17909:128;17846:191;:::o;20884:118::-;19893:19;:17;:19::i;:::-;20944:7:::1;:14:::0;;-1:-1:-1;;20944:14:0::1;20954:4;20944:14;::::0;;20974:20:::1;20981:12;14642:10:::0;;14562:98;20632:108;20359:7;;;;20691:41;;;;-1:-1:-1;;;20691:41:0;;32471:2:1;20691:41:0;;;32453:21:1;32510:2;32490:18;;;32483:30;-1:-1:-1;;;32529:18:1;;;32522:50;32589:18;;20691:41:0;32269:344:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;14:367:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:437::-;472:6;480;533:2;521:9;512:7;508:23;504:32;501:52;;;549:1;546;539:12;501:52;589:9;576:23;622:18;614:6;611:30;608:50;;;654:1;651;644:12;608:50;693:70;755:7;746:6;735:9;731:22;693:70;:::i;:::-;782:8;;667:96;;-1:-1:-1;386:437:1;-1:-1:-1;;;;386:437:1:o;828:180::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;-1:-1:-1;979:23:1;;828:180;-1:-1:-1;828:180:1:o;1205:118::-;1291:5;1284:13;1277:21;1270:5;1267:32;1257:60;;1313:1;1310;1303:12;1328:241;1384:6;1437:2;1425:9;1416:7;1412:23;1408:32;1405:52;;;1453:1;1450;1443:12;1405:52;1492:9;1479:23;1511:28;1533:5;1511:28;:::i;1574:173::-;1642:20;;-1:-1:-1;;;;;1691:31:1;;1681:42;;1671:70;;1737:1;1734;1727:12;1752:186;1811:6;1864:2;1852:9;1843:7;1839:23;1835:32;1832:52;;;1880:1;1877;1870:12;1832:52;1903:29;1922:9;1903:29;:::i;2125:248::-;2193:6;2201;2254:2;2242:9;2233:7;2229:23;2225:32;2222:52;;;2270:1;2267;2260:12;2222:52;-1:-1:-1;;2293:23:1;;;2363:2;2348:18;;;2335:32;;-1:-1:-1;2125:248:1:o;2378:309::-;2443:6;2451;2504:2;2492:9;2483:7;2479:23;2475:32;2472:52;;;2520:1;2517;2510:12;2472:52;2556:9;2543:23;2533:33;;2616:2;2605:9;2601:18;2588:32;2629:28;2651:5;2629:28;:::i;:::-;2676:5;2666:15;;;2378:309;;;;;:::o;2922:127::-;2983:10;2978:3;2974:20;2971:1;2964:31;3014:4;3011:1;3004:15;3038:4;3035:1;3028:15;3054:275;3125:2;3119:9;3190:2;3171:13;;-1:-1:-1;;3167:27:1;3155:40;;3225:18;3210:34;;3246:22;;;3207:62;3204:88;;;3272:18;;:::i;:::-;3308:2;3301:22;3054:275;;-1:-1:-1;3054:275:1:o;3334:183::-;3394:4;3427:18;3419:6;3416:30;3413:56;;;3449:18;;:::i;:::-;-1:-1:-1;3494:1:1;3490:14;3506:4;3486:25;;3334:183::o;3522:662::-;3576:5;3629:3;3622:4;3614:6;3610:17;3606:27;3596:55;;3647:1;3644;3637:12;3596:55;3683:6;3670:20;3709:4;3733:60;3749:43;3789:2;3749:43;:::i;:::-;3733:60;:::i;:::-;3827:15;;;3913:1;3909:10;;;;3897:23;;3893:32;;;3858:12;;;;3937:15;;;3934:35;;;3965:1;3962;3955:12;3934:35;4001:2;3993:6;3989:15;4013:142;4029:6;4024:3;4021:15;4013:142;;;4095:17;;4083:30;;4133:12;;;;4046;;4013:142;;;-1:-1:-1;4173:5:1;3522:662;-1:-1:-1;;;;;;3522:662:1:o;4189:890::-;4249:5;4302:3;4295:4;4287:6;4283:17;4279:27;4269:55;;4320:1;4317;4310:12;4269:55;4353:2;4347:9;4395:2;4387:6;4383:15;4417:18;4485:6;4473:10;4470:22;4465:2;4453:10;4450:18;4447:46;4444:72;;;4496:18;;:::i;:::-;4536:10;4532:2;4525:22;4567:6;4556:17;;4608:2;4600:6;4596:15;4634:3;4626:6;4623:15;4620:35;;;4651:1;4648;4641:12;4620:35;4675:6;4690:359;4706:6;4701:3;4698:15;4690:359;;;4794:3;4781:17;4830:2;4817:11;4814:19;4811:109;;;4874:1;4903:2;4899;4892:14;4811:109;4945:59;5000:3;4986:11;4978:6;4974:24;4945:59;:::i;:::-;4933:72;;-1:-1:-1;5034:4:1;5025:14;;;;4723;4690:359;;;-1:-1:-1;5067:6:1;;4189:890;-1:-1:-1;;;;;;4189:890:1:o;5084:807::-;5245:6;5253;5261;5269;5277;5285;5293;5346:3;5334:9;5325:7;5321:23;5317:33;5314:53;;;5363:1;5360;5353:12;5314:53;5386:29;5405:9;5386:29;:::i;:::-;5376:39;;5434:38;5468:2;5457:9;5453:18;5434:38;:::i;:::-;5424:48;;5519:2;5508:9;5504:18;5491:32;5481:42;;5570:2;5559:9;5555:18;5542:32;5532:42;;5625:3;5614:9;5610:19;5597:33;5653:18;5645:6;5642:30;5639:50;;;5685:1;5682;5675:12;5639:50;5708:67;5767:7;5758:6;5747:9;5743:22;5708:67;:::i;:::-;5698:77;;;5822:3;5811:9;5807:19;5794:33;5784:43;;5846:39;5880:3;5869:9;5865:19;5846:39;:::i;:::-;5836:49;;5084:807;;;;;;;;;;:::o;5896:1146::-;6014:6;6022;6075:2;6063:9;6054:7;6050:23;6046:32;6043:52;;;6091:1;6088;6081:12;6043:52;6131:9;6118:23;6160:18;6201:2;6193:6;6190:14;6187:34;;;6217:1;6214;6207:12;6187:34;6255:6;6244:9;6240:22;6230:32;;6300:7;6293:4;6289:2;6285:13;6281:27;6271:55;;6322:1;6319;6312:12;6271:55;6358:2;6345:16;6380:4;6404:60;6420:43;6460:2;6420:43;:::i;6404:60::-;6498:15;;;6580:1;6576:10;;;;6568:19;;6564:28;;;6529:12;;;;6604:19;;;6601:39;;;6636:1;6633;6626:12;6601:39;6660:11;;;;6680:148;6696:6;6691:3;6688:15;6680:148;;;6762:23;6781:3;6762:23;:::i;:::-;6750:36;;6713:12;;;;6806;;;;6680:148;;;6847:5;-1:-1:-1;;6890:18:1;;6877:32;;-1:-1:-1;;6921:16:1;;;6918:36;;;6950:1;6947;6940:12;6918:36;;6973:63;7028:7;7017:8;7006:9;7002:24;6973:63;:::i;:::-;6963:73;;;5896:1146;;;;;:::o;7255:397::-;7341:6;7349;7357;7365;7418:3;7406:9;7397:7;7393:23;7389:33;7386:53;;;7435:1;7432;7425:12;7386:53;7471:9;7458:23;7448:33;;7528:2;7517:9;7513:18;7500:32;7490:42;;7551:38;7585:2;7574:9;7570:18;7551:38;:::i;:::-;7541:48;;7608:38;7642:2;7631:9;7627:18;7608:38;:::i;:::-;7598:48;;7255:397;;;;;;;:::o;7657:377::-;7764:6;7817:2;7805:9;7796:7;7792:23;7788:32;7785:52;;;7833:1;7830;7823:12;7785:52;7873:9;7860:23;7906:18;7898:6;7895:30;7892:50;;;7938:1;7935;7928:12;7892:50;7961:67;8020:7;8011:6;8000:9;7996:22;7961:67;:::i;:::-;7951:77;7657:377;-1:-1:-1;;;;7657:377:1:o;8039:383::-;8113:6;8121;8129;8182:2;8170:9;8161:7;8157:23;8153:32;8150:52;;;8198:1;8195;8188:12;8150:52;8221:29;8240:9;8221:29;:::i;:::-;8211:39;;8297:2;8286:9;8282:18;8269:32;8259:42;;8351:2;8340:9;8336:18;8323:32;8364:28;8386:5;8364:28;:::i;:::-;8411:5;8401:15;;;8039:383;;;;;:::o;8427:632::-;8598:2;8650:21;;;8720:13;;8623:18;;;8742:22;;;8569:4;;8598:2;8821:15;;;;8795:2;8780:18;;;8569:4;8864:169;8878:6;8875:1;8872:13;8864:169;;;8939:13;;8927:26;;9008:15;;;;8973:12;;;;8900:1;8893:9;8864:169;;;-1:-1:-1;9050:3:1;;8427:632;-1:-1:-1;;;;;;8427:632:1:o;9523:773::-;9645:6;9653;9661;9669;9722:2;9710:9;9701:7;9697:23;9693:32;9690:52;;;9738:1;9735;9728:12;9690:52;9778:9;9765:23;9807:18;9848:2;9840:6;9837:14;9834:34;;;9864:1;9861;9854:12;9834:34;9903:70;9965:7;9956:6;9945:9;9941:22;9903:70;:::i;:::-;9992:8;;-1:-1:-1;9877:96:1;-1:-1:-1;10080:2:1;10065:18;;10052:32;;-1:-1:-1;10096:16:1;;;10093:36;;;10125:1;10122;10115:12;10093:36;;10164:72;10228:7;10217:8;10206:9;10202:24;10164:72;:::i;:::-;9523:773;;;;-1:-1:-1;10255:8:1;-1:-1:-1;;;;9523:773:1:o;10301:127::-;10362:10;10357:3;10353:20;10350:1;10343:31;10393:4;10390:1;10383:15;10417:4;10414:1;10407:15;10433:127;10494:10;10489:3;10485:20;10482:1;10475:31;10525:4;10522:1;10515:15;10549:4;10546:1;10539:15;10565:135;10604:3;-1:-1:-1;;10625:17:1;;10622:43;;;10645:18;;:::i;:::-;-1:-1:-1;10692:1:1;10681:13;;10565:135::o;13463:347::-;13665:2;13647:21;;;13704:2;13684:18;;;13677:30;13743:25;13738:2;13723:18;;13716:53;13801:2;13786:18;;13463:347::o;13815:343::-;14017:2;13999:21;;;14056:2;14036:18;;;14029:30;-1:-1:-1;;;14090:2:1;14075:18;;14068:49;14149:2;14134:18;;13815:343::o;14163:128::-;14203:3;14234:1;14230:6;14227:1;14224:13;14221:39;;;14240:18;;:::i;:::-;-1:-1:-1;14276:9:1;;14163:128::o;14296:217::-;14336:1;14362;14352:132;;14406:10;14401:3;14397:20;14394:1;14387:31;14441:4;14438:1;14431:15;14469:4;14466:1;14459:15;14352:132;-1:-1:-1;14498:9:1;;14296:217::o;14518:125::-;14558:4;14586:1;14583;14580:8;14577:34;;;14591:18;;:::i;:::-;-1:-1:-1;14628:9:1;;14518:125::o;14648:354::-;14850:2;14832:21;;;14889:2;14869:18;;;14862:30;14928:32;14923:2;14908:18;;14901:60;14993:2;14978:18;;14648:354::o;15007:168::-;15047:7;15113:1;15109;15105:6;15101:14;15098:1;15095:21;15090:1;15083:9;15076:17;15072:45;15069:71;;;15120:18;;:::i;:::-;-1:-1:-1;15160:9:1;;15007:168::o;15768:184::-;15838:6;15891:2;15879:9;15870:7;15866:23;15862:32;15859:52;;;15907:1;15904;15897:12;15859:52;-1:-1:-1;15930:16:1;;15768:184;-1:-1:-1;15768:184:1:o;19524:245::-;19591:6;19644:2;19632:9;19623:7;19619:23;19615:32;19612:52;;;19660:1;19657;19650:12;19612:52;19692:9;19686:16;19711:28;19733:5;19711:28;:::i;24185:179::-;24263:13;;24316:22;24305:34;;24295:45;;24285:73;;24354:1;24351;24344:12;24369:473;24472:6;24480;24488;24496;24504;24557:3;24545:9;24536:7;24532:23;24528:33;24525:53;;;24574:1;24571;24564:12;24525:53;24597:39;24626:9;24597:39;:::i;:::-;24587:49;;24676:2;24665:9;24661:18;24655:25;24645:35;;24720:2;24709:9;24705:18;24699:25;24689:35;;24764:2;24753:9;24749:18;24743:25;24733:35;;24787:49;24831:3;24820:9;24816:19;24787:49;:::i;:::-;24777:59;;24369:473;;;;;;;;:::o;24847:553::-;24886:7;-1:-1:-1;;;;;24956:9:1;;;24984;;;25009:11;;;25028:10;;;25022:17;;25005:35;25002:61;;;25043:18;;:::i;:::-;-1:-1:-1;;;25119:1:1;25112:9;;25137:11;;;25157;;;25150:19;;25133:37;25130:63;;;25173:18;;:::i;:::-;25219:1;25216;25212:9;25202:19;;25266:1;25262:2;25257:11;25254:1;25250:19;25245:2;25241;25237:11;25233:37;25230:63;;;25273:18;;:::i;:::-;25338:1;25334:2;25329:11;25326:1;25322:19;25317:2;25313;25309:11;25305:37;25302:63;;;25345:18;;:::i;:::-;-1:-1:-1;;;25385:9:1;;;;;24847:553;-1:-1:-1;;;24847:553:1:o;30180:426::-;30309:3;30347:6;30341:13;30372:1;30382:129;30396:6;30393:1;30390:13;30382:129;;;30494:4;30478:14;;;30474:25;;30468:32;30455:11;;;30448:53;30411:12;30382:129;;;30529:6;30526:1;30523:13;30520:48;;;30564:1;30555:6;30550:3;30546:16;30539:27;30520:48;-1:-1:-1;30584:16:1;;;;;30180:426;-1:-1:-1;;30180:426:1:o;30611:344::-;30813:2;30795:21;;;30852:2;30832:18;;;30825:30;-1:-1:-1;;;30886:2:1;30871:18;;30864:50;30946:2;30931:18;;30611:344::o;31857:407::-;32059:2;32041:21;;;32098:2;32078:18;;;32071:30;32137:34;32132:2;32117:18;;32110:62;-1:-1:-1;;;32203:2:1;32188:18;;32181:41;32254:3;32239:19;;31857:407::o
Swarm Source
ipfs://cfa9e3af3764bc030c8e18241876f39fe4065717bcea5e2d2e9cb4e4b5bfd956
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.