Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SwapSmartLock
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-22 */ pragma solidity 0.6.2; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /* * @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 GSN 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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } /** * @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. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { 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 initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } /** * @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. */ contract PausableUpgradeSafe is Initializable, ContextUpgradeSafe { /** * @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 initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20MinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20UpgradeSafe is Initializable, ContextUpgradeSafe, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name, symbol); } function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[44] private __gap; } /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } interface IERC20Extended { function decimals() external view returns (uint8); function burnFrom(address account, uint256 amount) external; } interface IPriceEstimator { function getEstimatedETHforERC20( uint256 erc20Amount, address token ) external view returns (uint256[] memory); function getEstimatedERC20forETH( uint256 etherAmountInWei, address tokenAddress ) external view returns (uint256[] memory); } /** * @dev This contract will hold user scheduled payments which will be released after * release time */ contract SwapSmartLock is Initializable, OwnableUpgradeSafe, PausableUpgradeSafe { using SafeERC20 for IERC20; using SafeMath for uint256; using Address for address; enum Status { CLOSED, OPEN } IERC20 private _swapToken; //Wallet where fees will go address payable private _feesWallet; //Wallet where dev fund will go address private _devWallet; address constant private ETH_ADDRESS = address( 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ); uint256 constant private DEV_FEE_PERCENTAGE = 10; uint256 constant private BURN_FEE_PERCENTAGE = 10; struct Payment { address token;// Token address address sender; address payable beneficiary;// Beneficary who will receive funds uint256 amount; uint256 releaseTime; uint256 createdAt; Status status; } //Global payment id. Also give total number of payments made so far uint256 private _paymentId; //list of all payment ids for a user/beneficiary mapping(address => uint256[]) private _beneficiaryVsPaymentIds; //list of all payment ids for a sender mapping(address => uint256[]) private _senderVsPaymentIds; mapping(uint256 => Payment) private _idVsPayment; IPriceEstimator private _priceEstimator; uint256 private _ethFeePercentage; uint256 private _allowedFeeSlippagePercentage; uint256 private _uniswapFeePercentage; uint256 private _maxFeeInEth; //list of free tokens mapping(address => bool) private _listFreeTokens; event PaymentScheduled( address indexed token, address indexed sender, address indexed beneficiary, uint256 id, uint256 amount, uint256 releaseTime, uint256 fee, bool isFeeInSwap, bool calcFeeUsingTotalSupply ); event PaymentReleased( uint256 indexed id, address indexed beneficiary, address indexed token ); event FeeWalletChanged(address indexed wallet); event DevWalletChanged(address indexed wallet); event SwapTokenUpdated(address indexed swapTokenAddress); modifier onlyContract(address account) { require(account.isContract(), "[Validation] The address does not contain a contract"); _; } modifier canRelease(uint256 id) { require(releasable(id), "[Release]: Can't release payment"); _; } /** * @dev initialize * @param swapTokenAddress Address of the swap token * @param feesWallet Wallet address where fees will go * @param devWallet Wallet address where dev fund will go */ function initialize( address swapTokenAddress, address payable feesWallet, address devWallet, address priceEstimator ) external onlyContract(swapTokenAddress) onlyContract(priceEstimator) { __SwapSmartLock_init(swapTokenAddress, feesWallet, devWallet, priceEstimator); } function __SwapSmartLock_init( address swapTokenAddress, address payable feesWallet, address devWallet, address priceEstimator ) internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); __Pausable_init_unchained(); __SwapSmartLock_init_unchained(swapTokenAddress, feesWallet, devWallet, priceEstimator); } function __SwapSmartLock_init_unchained( address swapTokenAddress, address payable feesWallet, address devWallet, address priceEstimator ) internal initializer { require(feesWallet != address(0), "[Validation] feesWallet is the zero address"); require(devWallet != address(0), "[Validation] devWallet is the zero address"); _swapToken = IERC20(swapTokenAddress); _feesWallet = feesWallet; _devWallet = devWallet; _priceEstimator = IPriceEstimator(priceEstimator); _ethFeePercentage = 1; _allowedFeeSlippagePercentage = 5; _uniswapFeePercentage = 3; } /** * @dev returns the fee receiver wallet address */ function getFeesWallet() external view returns(address) { return _feesWallet; } /** * @dev returns the dev fund wallet address */ function getDevWallet() external view returns(address) { return _devWallet; } /** * @dev Returns swap token address */ function getSwapToken() external view returns(address) { return address(_swapToken); } /** * @dev Returns price estimator address */ function getPriceEstimator() external view returns(address) { return address(_priceEstimator); } /** * @dev Returns information about payment details * @param id Payment id */ function getPaymentDetails(uint256 id) external view returns( address token, uint256 amount, uint256 releaseTime, address sender, address beneficiary, uint256 createdAt, Status status ) { require(_idVsPayment[id].amount != 0, "[Validation] Payment details not found"); Payment memory payment = _idVsPayment[id]; token = payment.token; amount = payment.amount; releaseTime = payment.releaseTime; sender = payment.sender; beneficiary = payment.beneficiary; createdAt = payment.createdAt; status = payment.status; return( token, amount, releaseTime, sender, beneficiary, createdAt, status ); } /** * @dev Returns all payment ids for beneficiary * @param user Address of the user */ function getBeneficiaryPaymentIds(address user) external view returns (uint256[] memory ids) { return _beneficiaryVsPaymentIds[user]; } /** * @dev Returns all payment ids for sender * @param user Address of the user */ function getSenderPaymentIds(address user) external view returns (uint256[] memory ids) { return _senderVsPaymentIds[user]; } /** * @dev Update swap token address * @param swapTokenAddress New swap token address */ function setSwapToken(address swapTokenAddress) external onlyOwner onlyContract(swapTokenAddress) { require( swapTokenAddress != address(0), "[Validation]: Invalid swap token address" ); _swapToken = IERC20(swapTokenAddress); emit SwapTokenUpdated(swapTokenAddress); } /** * @dev Allows admin to set fee receiver wallet * @param wallet New wallet address */ function setFeeWallet(address payable wallet) external onlyOwner { require( wallet != address(0), "[Validation] feesWallet is the zero address" ); _feesWallet = wallet; emit FeeWalletChanged(wallet); } /** * @dev Allows admin to set fee receiver wallet * @param wallet New wallet address */ function setDevWallet(address payable wallet) external onlyOwner { require( wallet != address(0), "[Validation] devWallet is the zero address" ); _devWallet = wallet; emit DevWalletChanged(wallet); } /** * @dev Update price estimator address * @param priceEstimator New price estimator address */ function setPriceEstimator(address priceEstimator) external onlyOwner onlyContract(priceEstimator) { require( priceEstimator != address(0), "[Validation]: Invalid price estimator address" ); _priceEstimator = IPriceEstimator(priceEstimator); } /** * @dev Update fees * @param ethFeePercentage New percentage of fee in eth */ function setEthFeePercentage(uint8 ethFeePercentage) external onlyOwner { require( ethFeePercentage >= 0 && ethFeePercentage <= 100, "[Validation]: ETH Fee percentage must be between 0 to 100" ); _ethFeePercentage = ethFeePercentage; } /** * @dev Update fee slippage percentage allowance for erc20 * @param allowedFeeSlippagePercentage New allowed fee slippage percentage for fee in erc20 */ function setAllowedFeeSlippagePercentage(uint8 allowedFeeSlippagePercentage) external onlyOwner { require( allowedFeeSlippagePercentage >= 0 && allowedFeeSlippagePercentage <= 100, "[Validation]: Allowed Fee Slippage percentage must be between 0 to 100" ); _allowedFeeSlippagePercentage = allowedFeeSlippagePercentage; } /** * @dev Update Uniswap fees * @param uniswapFeePercentage New percentage of uniswap fee */ function setUniswapFeePercentage(uint8 uniswapFeePercentage) external onlyOwner { require( uniswapFeePercentage >= 0 && uniswapFeePercentage <= 100, "[Validation]: Uniswap Fee percentage must be between 0 to 100" ); _uniswapFeePercentage = uniswapFeePercentage; } /** * @dev Sets maximum fee in ETH * @param ethAmountInWei Maximum fee amount in wei */ function setMaxFeeInEth(uint256 ethAmountInWei) external onlyOwner { _maxFeeInEth = ethAmountInWei; } function getFeeInEthForEth(uint256 amount) public view returns (uint256) { return Math.min(amount.mul(_ethFeePercentage).div(100), _maxFeeInEth); //1% of ETH amount } function getFeeInEthForERC20(uint256 amount, address token) public view returns (uint256) { if(isFreeToken(token)) { return 0; } else { //price should be estimated by 1 token because Uniswap algo changes price based on large amount uint256 tokenBits = 10 ** uint256(IERC20Extended(token).decimals()); uint256 estFeesInEthPerUnit = _priceEstimator.getEstimatedETHforERC20(tokenBits, token)[0]; //subtract uniswap 0.30% fees //_uniswapFeePercentage is a percentage expressed in 1/10 (a tenth) of a percent hence we divide by 1000 estFeesInEthPerUnit = estFeesInEthPerUnit.sub(estFeesInEthPerUnit.mul(_uniswapFeePercentage).div(1000)); uint256 equivEth = amount.mul(estFeesInEthPerUnit).div(tokenBits); //multiply by amount to be scheduled amount return getFeeInEthForEth(equivEth); } } function getFeeInEthForERC20UsingTotalSupply(uint256 amount, address token) public view returns (uint256) { if(isFreeToken(token)) { return 0; } else { //per 1% supply , 0.1 ETH is the fee uint256 tokenTotalSupply = IERC20(token).totalSupply(); uint256 percentage = amount.mul(tokenTotalSupply).mul(100).div(tokenTotalSupply); uint256 ethFeeInWei = 100000000000000000; //0.1 ETH return Math.min(percentage.mul(ethFeeInWei).div(tokenTotalSupply), _maxFeeInEth); } } function getFeeInSwapForETH(uint256 amount) public view returns (uint256) { uint256 feesInEth = getFeeInEthForEth(amount); return _getEquivSwapFee(feesInEth); } function getFeeInSwapForERC20(uint256 amount, address token, bool calcFeeUsingTotalSupply) public view returns (uint256) { uint256 feesInEth = calcFeeUsingTotalSupply ? getFeeInEthForERC20UsingTotalSupply(amount, token) : getFeeInEthForERC20(amount, token); return _getEquivSwapFee(feesInEth); } function _getEquivSwapFee(uint256 feesInEth) private view returns (uint256) { uint256 feesInEthIfPaidViaSwap = feesInEth.div(2); uint256 swapPerEth = _priceEstimator.getEstimatedERC20forETH(1, address(_swapToken))[0]; //subtract uniswap 0.30% fees //_uniswapFeePercentage is a percentage expressed in 1/10 (a tenth) of a percent hence we divide by 1000 uint256 estSwapPerEth = swapPerEth.sub(swapPerEth.mul(_uniswapFeePercentage).div(1000)); return feesInEthIfPaidViaSwap.mul(estSwapPerEth); } /** * @dev Allows user to schedule payment. In case of ERC-20 token the user will * first have to approve the contract to spend on his/her behalf * @param tokenAddress Address of the token to be paid * @param amount Amount of tokens to pay * @param releaseTime release time after which tokens to be released. In seconds * @param beneficiary Address of the beneficiary * @param isFeeInSwap Bool to check if fee to be paid in swap token or not */ function schedulePayment( address tokenAddress, uint256 amount, uint256 releaseTime, address payable beneficiary, uint256 fee, bool isFeeInSwap, bool calcFeeUsingTotalSupply ) external payable whenNotPaused { _schedulePayment( tokenAddress, amount, releaseTime, beneficiary, msg.value, fee, isFeeInSwap, calcFeeUsingTotalSupply ); } /** * @dev Helper method to schedule payment */ function _schedulePayment( address tokenAddress, uint256 amount, uint256 releaseTime, address payable beneficiary, uint256 value, uint256 fee, bool isFeeInSwap, bool calcFeeUsingTotalSupply ) private returns(uint256) { require(amount > 0, "[Validation] The amount has to be larger than 0"); if(!isFreeToken(tokenAddress)) { require(fee > 0, "[Validation] The fee has to be larger than 0"); } require(beneficiary != address(0), "[Validation] Invalid beneficiary address"); uint256 remValue = value; if(ETH_ADDRESS == tokenAddress) { _scheduleETH( amount, fee, releaseTime, beneficiary, value, isFeeInSwap ); if(isFeeInSwap) { remValue = remValue.sub(amount); } else { remValue = remValue.sub(amount).sub(fee); } } else { _scheduleERC20( tokenAddress, amount, fee, releaseTime, beneficiary, value, isFeeInSwap, calcFeeUsingTotalSupply ); if(!isFeeInSwap) { remValue = remValue.sub(fee); } } emit PaymentScheduled( tokenAddress, msg.sender, beneficiary, _paymentId, amount, releaseTime, fee, isFeeInSwap, calcFeeUsingTotalSupply ); return remValue; } /** * @dev Helper method to schedule payment in ETH */ function _scheduleETH( uint256 amount, uint256 fee, uint256 releaseTime, address payable beneficiary, uint256 value, bool isFeeInSwap ) private { //Transferring fee to the wallet if(isFeeInSwap){ require(value >= amount, "[Validation] Enough ETH not sent"); uint256 minRequiredFeeInSwap = getFeeInSwapForETH(amount); uint256 feeDiff = 0; if( fee < minRequiredFeeInSwap ) { feeDiff = minRequiredFeeInSwap.sub(fee); uint256 feeSlippagePercentage = feeDiff.mul(100).div(minRequiredFeeInSwap); //will allow if diff is less than 5% require(feeSlippagePercentage < _allowedFeeSlippagePercentage, "[Validation] Fee (SWAP) is below minimum required fee"); } _distributeFees(minRequiredFeeInSwap); } else { uint256 minRequiredFeeInEth = getFeeInEthForEth(amount); require(fee >= minRequiredFeeInEth, "[Validation] Fee (ETH) is below minimum required fee"); require(value >= amount.add(minRequiredFeeInEth), "[Validation] Enough ETH not sent"); (bool success,) = _feesWallet.call.value(minRequiredFeeInEth)(""); require(success, "[Validation] Transfer of fee failed"); } _paymentId = _paymentId.add(1); _idVsPayment[_paymentId] = Payment({ token: ETH_ADDRESS, amount: amount, releaseTime: releaseTime, sender: msg.sender, beneficiary: beneficiary, createdAt: block.timestamp, status: Status.OPEN }); _beneficiaryVsPaymentIds[beneficiary].push(_paymentId); _senderVsPaymentIds[msg.sender].push(_paymentId); } /** * @dev Helper method to schedule payment in ERC-20 tokens */ function _scheduleERC20( address token, uint256 amount, uint256 fee, uint256 releaseTime, address payable beneficiary, uint256 value, bool isFeeInSwap, bool calcFeeUsingTotalSupply ) private onlyContract(token) { if(!isFreeToken(token)) { //Transfer fee to the wallet if(isFeeInSwap){ uint256 minRequiredFeeInSwap = getFeeInSwapForERC20(amount, token, calcFeeUsingTotalSupply); uint256 feeDiff = 0; if( fee < minRequiredFeeInSwap ) { feeDiff = minRequiredFeeInSwap.sub(fee); uint256 feeSlippagePercentage = feeDiff.mul(100).div(minRequiredFeeInSwap); //will allow if diff is less than 5% require(feeSlippagePercentage < _allowedFeeSlippagePercentage, "[Validation] Fee (SWAP) is below minimum required fee"); } _distributeFees(minRequiredFeeInSwap); } else { uint256 minRequiredFeeInEth = calcFeeUsingTotalSupply ? getFeeInEthForERC20UsingTotalSupply(amount, token) : getFeeInEthForERC20(amount, token); require(fee >= minRequiredFeeInEth, "[Validation] Fee (ETH) is below minimum required fee"); require(value >= minRequiredFeeInEth, "[Validation] msg.value doesn't contain enough ETH for fee"); (bool success,) = _feesWallet.call.value(minRequiredFeeInEth)(""); require(success, "[Validation] Transfer of fee failed"); } } //Transfer required amount of tokens to the contract from user balance IERC20(token).safeTransferFrom(msg.sender, address(this), amount); _paymentId = _paymentId.add(1); _idVsPayment[_paymentId] = Payment({ token: token, amount: amount, releaseTime: releaseTime, sender: msg.sender, beneficiary: beneficiary, createdAt: block.timestamp, status: Status.OPEN }); _beneficiaryVsPaymentIds[beneficiary].push(_paymentId); _senderVsPaymentIds[msg.sender].push(_paymentId); } function _distributeFees(uint256 fee) private { uint256 devAmount = fee.mul(DEV_FEE_PERCENTAGE).div(100); //10% uint256 burnAmount = fee.mul(BURN_FEE_PERCENTAGE).div(100); //10% uint256 remAmount = fee.sub(devAmount).sub(burnAmount); //80% _swapToken.safeTransferFrom(msg.sender, _feesWallet, remAmount); _swapToken.safeTransferFrom(msg.sender, _devWallet, devAmount); IERC20Extended(address(_swapToken)).burnFrom(msg.sender, burnAmount); } /** * @dev Allows user to schedule payment. In case of ERC-20 token the user will * first have to approve the contract to spend on his/her behalf * @param tokenAddress Address of the token to be paid * @param amounts List of amount of tokens to pay * @param releaseTimes List of release times after which tokens to be released. In seconds * @param beneficiaries List of addresses of the beneficiaries * @param isFeeInSwap Bool to check if fee to be paid in swap token or not */ function scheduleBulkPayment( address tokenAddress, uint256[] calldata amounts, uint256[] calldata releaseTimes, address payable[] calldata beneficiaries, uint256[] calldata fees, bool isFeeInSwap, bool calcFeeUsingTotalSupply ) external payable whenNotPaused { uint256 remValue = msg.value; require(amounts.length == releaseTimes.length, "SwapSmartLock: Invalid input"); require(amounts.length == beneficiaries.length, "SwapSmartLock: Invalid input"); require(amounts.length == fees.length, "SwapSmartLock: Invalid input"); for(uint256 i = 0; i < amounts.length; i++) { remValue = _schedulePayment( tokenAddress, amounts[i], releaseTimes[i], beneficiaries[i], remValue, fees[i], isFeeInSwap, calcFeeUsingTotalSupply ); } } /** * @dev Allows beneficiary of payment to release payment after release time * @param id Id of the scheduled payment */ function release(uint256 id) external canRelease(id) { Payment memory payment = _idVsPayment[id]; if(ETH_ADDRESS == payment.token) { _releaseETH(id); } else { _releaseERC20(id); } emit PaymentReleased( id, payment.beneficiary, payment.token ); } /** * @dev Returns whether given payment can be released or not * @param id id of a payment */ function releasable(uint256 id) public view returns(bool) { Payment memory payment = _idVsPayment[id]; if( (payment.status == Status.OPEN) && (payment.releaseTime <= block.timestamp) ) { return true; } return false; } /** * @dev Helper method to release ETH */ function _releaseETH(uint256 id) private { Payment storage payment = _idVsPayment[id]; payment.status = Status.CLOSED; (bool success,) = payment.beneficiary.call.value(payment.amount)(""); require(success, "[Release] Failed to transfer ETH"); } /** * @dev Helper method to release ERC-20 */ function _releaseERC20(uint256 id) private { Payment storage payment = _idVsPayment[id]; payment.status = Status.CLOSED; IERC20(payment.token).safeTransfer(payment.beneficiary, payment.amount); } /** * @dev Called by an admin to pause, triggers stopped state. */ function pause() external onlyOwner { _pause(); } /** * @dev Called by an admin to unpause, returns to normal state. */ function unpause() external onlyOwner { _unpause(); } /** * @dev called by admin to add given token to free tokens list */ function addTokenToFreeList(address token) external onlyOwner onlyContract(token) { _listFreeTokens[token] = true; } /** * @dev called by admin to remove given token from free tokens list */ function removeTokenFromFreeList(address token) external onlyOwner onlyContract(token) { _listFreeTokens[token] = false; } /** * @dev Checks if token is in free list * @param token The address to check */ function isFreeToken(address token) public view returns(bool) { return _listFreeTokens[token]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"DevWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"FeeWalletChanged","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":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isFeeInSwap","type":"bool"},{"indexed":false,"internalType":"bool","name":"calcFeeUsingTotalSupply","type":"bool"}],"name":"PaymentScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"swapTokenAddress","type":"address"}],"name":"SwapTokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"addTokenToFreeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getBeneficiaryPaymentIds","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDevWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"getFeeInEthForERC20","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"getFeeInEthForERC20UsingTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getFeeInEthForEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"calcFeeUsingTotalSupply","type":"bool"}],"name":"getFeeInSwapForERC20","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getFeeInSwapForETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeesWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getPaymentDetails","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"releaseTime","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"enum SwapSmartLock.Status","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceEstimator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getSenderPaymentIds","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"swapTokenAddress","type":"address"},{"internalType":"address payable","name":"feesWallet","type":"address"},{"internalType":"address","name":"devWallet","type":"address"},{"internalType":"address","name":"priceEstimator","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isFreeToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"releasable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"removeTokenFromFreeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"releaseTimes","type":"uint256[]"},{"internalType":"address payable[]","name":"beneficiaries","type":"address[]"},{"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"internalType":"bool","name":"isFeeInSwap","type":"bool"},{"internalType":"bool","name":"calcFeeUsingTotalSupply","type":"bool"}],"name":"scheduleBulkPayment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"releaseTime","type":"uint256"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"isFeeInSwap","type":"bool"},{"internalType":"bool","name":"calcFeeUsingTotalSupply","type":"bool"}],"name":"schedulePayment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"allowedFeeSlippagePercentage","type":"uint8"}],"name":"setAllowedFeeSlippagePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"ethFeePercentage","type":"uint8"}],"name":"setEthFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmountInWei","type":"uint256"}],"name":"setMaxFeeInEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"priceEstimator","type":"address"}],"name":"setPriceEstimator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"swapTokenAddress","type":"address"}],"name":"setSwapToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"uniswapFeePercentage","type":"uint8"}],"name":"setUniswapFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613ac2806100206000396000f3fe6080604052600436106101f85760003560e01c80639976dfbe1161010d578063cd7d9e99116100a0578063d92b9b631161006f578063d92b9b63146108e7578063e4bf01a814610939578063ea8a459314610963578063f2fde38b14610978578063f8c8765e146109ab576101f8565b8063cd7d9e99146106dc578063d22edafb1461070f578063d2bb3aed14610887578063d8ad1b2b146108b4576101f8565b8063af056b39116100dc578063af056b3914610613578063b851b7ca14610646578063bf3452f814610679578063c0f8bc60146106a3576101f8565b80639976dfbe1461050f5780639e70df21146105485780639fa944dd146105d1578063a9ff2bae146105e6576101f8565b806356ee468a11610190578063715018a61161015f578063715018a6146104705780638456cb59146104855780638cc6058b1461049a5780638da5cb5b146104c757806390d49b9d146104dc576101f8565b806356ee468a146103845780635c04aa6a146103ae5780635c975abb146103d857806361164e53146103ed576101f8565b806331bff521116101cc57806331bff521146102e957806337bdc99b146103305780633f4ba83a1461035a578063453dd97f1461036f576101f8565b806245a3d7146101fd578063199eedfa146102325780631f53ac02146102635780632699fd1f14610296575b600080fd5b34801561020957600080fd5b506102306004803603602081101561022057600080fd5b50356001600160a01b03166109f6565b005b34801561023e57600080fd5b50610247610b04565b604080516001600160a01b039092168252519081900360200190f35b34801561026f57600080fd5b506102306004803603602081101561028657600080fd5b50356001600160a01b0316610b13565b3480156102a257600080fd5b506102d7600480360360608110156102b957600080fd5b508035906001600160a01b0360208201351690604001351515610bfa565b60408051918252519081900360200190f35b3480156102f557600080fd5b5061031c6004803603602081101561030c57600080fd5b50356001600160a01b0316610c2f565b604080519115158252519081900360200190f35b34801561033c57600080fd5b506102306004803603602081101561035357600080fd5b5035610c51565b34801561036657600080fd5b50610230610dcc565b34801561037b57600080fd5b50610247610e2e565b34801561039057600080fd5b50610230600480360360208110156103a757600080fd5b5035610e3d565b3480156103ba57600080fd5b506102d7600480360360208110156103d157600080fd5b5035610e9a565b3480156103e457600080fd5b5061031c610eb8565b3480156103f957600080fd5b506104206004803603602081101561041057600080fd5b50356001600160a01b0316610ec1565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561045c578181015183820152602001610444565b505050509050019250505060405180910390f35b34801561047c57600080fd5b50610230610f2d565b34801561049157600080fd5b50610230610fcf565b3480156104a657600080fd5b50610230600480360360208110156104bd57600080fd5b503560ff1661102f565b3480156104d357600080fd5b506102476110d2565b3480156104e857600080fd5b50610230600480360360208110156104ff57600080fd5b50356001600160a01b03166110e1565b34801561051b57600080fd5b506102d76004803603604081101561053257600080fd5b50803590602001356001600160a01b03166111c8565b34801561055457600080fd5b506105726004803603602081101561056b57600080fd5b50356112b2565b604080516001600160a01b03808a168252602082018990529181018790528582166060820152908416608082015260a0810183905260c081018260018111156105b757fe5b60ff16815260200197505050505050505060405180910390f35b3480156105dd57600080fd5b506102476113dd565b3480156105f257600080fd5b506102306004803603602081101561060957600080fd5b503560ff166113ec565b34801561061f57600080fd5b506104206004803603602081101561063657600080fd5b50356001600160a01b031661148f565b34801561065257600080fd5b506102306004803603602081101561066957600080fd5b50356001600160a01b03166114f9565b34801561068557600080fd5b506102d76004803603602081101561069c57600080fd5b503561162f565b3480156106af57600080fd5b506102d7600480360360408110156106c657600080fd5b50803590602001356001600160a01b031661164e565b3480156106e857600080fd5b50610230600480360360208110156106ff57600080fd5b50356001600160a01b031661185a565b610230600480360360e081101561072557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561074f57600080fd5b82018360208201111561076157600080fd5b803590602001918460208302840111600160201b8311171561078257600080fd5b919390929091602081019035600160201b81111561079f57600080fd5b8201836020820111156107b157600080fd5b803590602001918460208302840111600160201b831117156107d257600080fd5b919390929091602081019035600160201b8111156107ef57600080fd5b82018360208201111561080157600080fd5b803590602001918460208302840111600160201b8311171561082257600080fd5b919390929091602081019035600160201b81111561083f57600080fd5b82018360208201111561085157600080fd5b803590602001918460208302840111600160201b8311171561087257600080fd5b91935091508035151590602001351515611925565b34801561089357600080fd5b50610230600480360360208110156108aa57600080fd5b503560ff16611af2565b3480156108c057600080fd5b50610230600480360360208110156108d757600080fd5b50356001600160a01b0316611b95565b610230600480360360e08110156108fd57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a081013515159060c001351515611c5d565b34801561094557600080fd5b5061031c6004803603602081101561095c57600080fd5b5035611cc2565b34801561096f57600080fd5b50610247611d93565b34801561098457600080fd5b506102306004803603602081101561099b57600080fd5b50356001600160a01b0316611da2565b3480156109b757600080fd5b50610230600480360360808110156109ce57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516611e9b565b6109fe611f4b565b6065546001600160a01b03908116911614610a4e576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b80610a61816001600160a01b0316611f4f565b610a9c5760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b6001600160a01b038216610ae15760405162461bcd60e51b815260040180806020018281038252602d8152602001806137ca602d913960400191505060405180910390fd5b5060d080546001600160a01b0319166001600160a01b0392909216919091179055565b60d0546001600160a01b031690565b610b1b611f4b565b6065546001600160a01b03908116911614610b6b576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b6001600160a01b038116610bb05760405162461bcd60e51b815260040180806020018281038252602a815260200180613720602a913960400191505060405180910390fd5b60cb80546001600160a01b0319166001600160a01b0383169081179091556040517f268c00f4ec08b34fdde24b52e47a09d62f3f3837eb3b8ac7206cefb3bb5e534590600090a250565b60008082610c1157610c0c858561164e565b610c1b565b610c1b85856111c8565b9050610c2681611f8b565b95945050505050565b6001600160a01b038116600090815260d5602052604090205460ff165b919050565b80610c5b81611cc2565b610cac576040805162461bcd60e51b815260206004820181905260248201527f5b52656c656173655d3a2043616e27742072656c65617365207061796d656e74604482015290519081900360640190fd5b610cb461368b565b600083815260cf6020908152604091829020825160e08101845281546001600160a01b039081168252600180840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460a08401526006810154909160c084019160ff1690811115610d3057fe5b6001811115610d3b57fe5b90525080519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610d7557610d7083612117565b610d7e565b610d7e836121e5565b80600001516001600160a01b031681604001516001600160a01b0316847fa6ea333f41ff25e0a1adef6504bf3be9c7e740717d65f28a40b57a9681c2940c60405160405180910390a4505050565b610dd4611f4b565b6065546001600160a01b03908116911614610e24576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b610e2c612227565b565b60cb546001600160a01b031690565b610e45611f4b565b6065546001600160a01b03908116911614610e95576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b60d455565b600080610ea68361162f565b9050610eb181611f8b565b9392505050565b60975460ff1690565b6001600160a01b038116600090815260cd6020908152604091829020805483518184028101840190945280845260609392830182828015610f2157602002820191906000526020600020905b815481526020019060010190808311610f0d575b50505050509050919050565b610f35611f4b565b6065546001600160a01b03908116911614610f85576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b610fd7611f4b565b6065546001600160a01b03908116911614611027576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b610e2c6122c5565b611037611f4b565b6065546001600160a01b03908116911614611087576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b60648160ff1611156110ca5760405162461bcd60e51b81526004018080602001828103825260398152602001806139c76039913960400191505060405180910390fd5b60ff1660d155565b6065546001600160a01b031690565b6110e9611f4b565b6065546001600160a01b03908116911614611139576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b6001600160a01b03811661117e5760405162461bcd60e51b815260040180806020018281038252602b81526020018061382b602b913960400191505060405180910390fd5b60ca80546001600160a01b0319166001600160a01b0383169081179091556040517fe805ffc02a12d27b142431551e2cd3f766203c54a9a4ab0d1cf01ce7366a796f90600090a250565b60006111d382610c2f565b156111e0575060006112ac565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121b57600080fd5b505afa15801561122f573d6000803e3d6000fd5b505050506040513d602081101561124557600080fd5b50519050600061127c826112706064611264898463ffffffff61234616565b9063ffffffff61234616565b9063ffffffff61239f16565b905067016345785d8a00006112a661129e84611270858563ffffffff61234616565b60d4546123e1565b93505050505b92915050565b600080600080600080600060cf600089815260200190815260200160002060030154600014156113135760405162461bcd60e51b8152600401808060200182810382526026815260200180613a676026913960400191505060405180910390fd5b61131b61368b565b600089815260cf6020908152604091829020825160e08101845281546001600160a01b039081168252600180840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460a08401526006810154909160c084019160ff169081111561139757fe5b60018111156113a257fe5b9052508051606082015160808301516020840151604085015160a086015160c090960151949f939e50919c509a509850919650945092505050565b60c9546001600160a01b031690565b6113f4611f4b565b6065546001600160a01b03908116911614611444576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b60648160ff1611156114875760405162461bcd60e51b815260040180806020018281038252603d815260200180613a2a603d913960400191505060405180910390fd5b60ff1660d355565b6001600160a01b038116600090815260ce6020908152604091829020805483518184028101840190945280845260609392830182828015610f215760200282019190600052602060002090815481526020019060010190808311610f0d5750505050509050919050565b611501611f4b565b6065546001600160a01b03908116911614611551576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b80611564816001600160a01b0316611f4f565b61159f5760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b6001600160a01b0382166115e45760405162461bcd60e51b815260040180806020018281038252602881526020018061376d6028913960400191505060405180910390fd5b60c980546001600160a01b0319166001600160a01b0384169081179091556040517f44fe57485076f35a8eb17e92799dcc65f24a9eab90ffae0af662812f19803be590600090a25050565b60006112ac61129e606461127060d1548661234690919063ffffffff16565b600061165982610c2f565b15611666575060006112ac565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156116a157600080fd5b505afa1580156116b5573d6000803e3d6000fd5b505050506040513d60208110156116cb57600080fd5b505160d054604080516350a2394560e01b815260ff909316600a0a600484018190526001600160a01b038781166024860152915190945060009391909216916350a23945916044808201928692909190829003018186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561176c57600080fd5b8101908080516040519392919084600160201b82111561178b57600080fd5b9083019060208201858111156117a057600080fd5b82518660208202830111600160201b821117156117bc57600080fd5b82525081516020918201928201910280838360005b838110156117e95781810151838201526020016117d1565b5050505090500160405250505060008151811061180257fe5b6020026020010151905061183761182a6103e861127060d3548561234690919063ffffffff16565b829063ffffffff6123f716565b9050600061184f83611270888563ffffffff61234616565b90506112a68161162f565b611862611f4b565b6065546001600160a01b039081169116146118b2576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b806118c5816001600160a01b0316611f4f565b6119005760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b506001600160a01b0316600090815260d560205260409020805460ff19166001179055565b60975460ff1615611970576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b348988146119c5576040805162461bcd60e51b815260206004820152601c60248201527f53776170536d6172744c6f636b3a20496e76616c696420696e70757400000000604482015290519081900360640190fd5b898614611a19576040805162461bcd60e51b815260206004820152601c60248201527f53776170536d6172744c6f636b3a20496e76616c696420696e70757400000000604482015290519081900360640190fd5b898414611a6d576040805162461bcd60e51b815260206004820152601c60248201527f53776170536d6172744c6f636b3a20496e76616c696420696e70757400000000604482015290519081900360640190fd5b60005b8a811015611ae357611ad98d8d8d84818110611a8857fe5b905060200201358c8c85818110611a9b57fe5b905060200201358b8b86818110611aae57fe5b905060200201356001600160a01b0316868b8b88818110611acb57fe5b905060200201358a8a612439565b9150600101611a70565b50505050505050505050505050565b611afa611f4b565b6065546001600160a01b03908116911614611b4a576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b60648160ff161115611b8d5760405162461bcd60e51b81526004018080602001828103825260468152602001806139816046913960600191505060405180910390fd5b60ff1660d255565b611b9d611f4b565b6065546001600160a01b03908116911614611bed576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b80611c00816001600160a01b0316611f4f565b611c3b5760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b506001600160a01b0316600090815260d560205260409020805460ff19169055565b60975460ff1615611ca8576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b611cb88787878734888888612439565b5050505050505050565b6000611ccc61368b565b600083815260cf6020908152604091829020825160e08101845281546001600160a01b039081168252600180840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460a08401526006810154909160c084019160ff1690811115611d4857fe5b6001811115611d5357fe5b905250905060018160c001516001811115611d6a57fe5b148015611d7b575042816080015111155b15611d8a576001915050610c4c565b50600092915050565b60ca546001600160a01b031690565b611daa611f4b565b6065546001600160a01b03908116911614611dfa576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b6001600160a01b038116611e3f5760405162461bcd60e51b81526004018080602001828103825260268152602001806136c66026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b83611eae816001600160a01b0316611f4f565b611ee95760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b81611efc816001600160a01b0316611f4f565b611f375760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b611f4386868686612623565b505050505050565b3390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611f8357508115155b949350505050565b600080611f9f83600263ffffffff61239f16565b60d05460c95460408051637524c56f60e11b8152600160048201526001600160a01b0392831660248201529051939450600093919092169163ea498ade9160448083019286929190829003018186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561203857600080fd5b8101908080516040519392919084600160201b82111561205757600080fd5b90830190602082018581111561206c57600080fd5b82518660208202830111600160201b8211171561208857600080fd5b82525081516020918201928201910280838360005b838110156120b557818101518382015260200161209d565b505050509050016040525050506000815181106120ce57fe5b6020026020010151905060006121056120f86103e861127060d3548661234690919063ffffffff16565b839063ffffffff6123f716565b9050610c26838263ffffffff61234616565b600081815260cf602052604080822060068101805460ff191690556002810154600382015492519193926001600160a01b03909116918381818185875af1925050503d8060008114612185576040519150601f19603f3d011682016040523d82523d6000602084013e61218a565b606091505b50509050806121e0576040805162461bcd60e51b815260206004820181905260248201527f5b52656c656173655d204661696c656420746f207472616e7366657220455448604482015290519081900360640190fd5b505050565b600081815260cf6020526040902060068101805460ff19169055600281015460038201548254612223926001600160a01b03918216929116906126ed565b5050565b60975460ff16612275576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122a8611f4b565b604080516001600160a01b039092168252519081900360200190a1565b60975460ff1615612310576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122a8611f4b565b600082612355575060006112ac565b8282028284828161236257fe5b0414610eb15760405162461bcd60e51b81526004018080602001828103825260218152602001806138566021913960400191505060405180910390fd5b6000610eb183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061273f565b60008183106123f05781610eb1565b5090919050565b6000610eb183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127e1565b60008088116124795760405162461bcd60e51b815260040180806020018281038252602f815260200180613877602f913960400191505060405180910390fd5b61248289610c2f565b6124c557600084116124c55760405162461bcd60e51b815260040180806020018281038252602c815260200180613955602c913960400191505060405180910390fd5b6001600160a01b03861661250a5760405162461bcd60e51b815260040180806020018281038252602881526020018061392d6028913960400191505060405180910390fd5b8473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038b1614156125835761253e89868a8a8a8961283b565b831561255b57612554818a63ffffffff6123f716565b905061257e565b61257b8561256f838c63ffffffff6123f716565b9063ffffffff6123f716565b90505b6125ab565b6125938a8a878b8b8b8a8a612bbf565b836125ab576125a8818663ffffffff6123f716565b90505b60cc5460408051918252602082018b90528181018a905260608201879052851515608083015284151560a0830152516001600160a01b03808a16923392918e16917f211830a7f3f5f8b96be451168334f4a75f9f11a9c0a857c7e0c3592e07f881049181900360c00190a49998505050505050505050565b600054610100900460ff168061263c575061263c612f47565b8061264a575060005460ff16155b6126855760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff161580156126b0576000805460ff1961ff0019909116610100171660011790555b6126b8612f4d565b6126c0612fef565b6126c86130e8565b6126d485858585613193565b80156126e6576000805461ff00191690555b5050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526121e090849061331b565b600081836127cb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612790578181015183820152602001612778565b50505050905090810190601f1680156127bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816127d757fe5b0495945050505050565b600081848411156128335760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612790578181015183820152602001612778565b505050900390565b801561292a5785821015612896576040805162461bcd60e51b815260206004820181905260248201527f5b56616c69646174696f6e5d20456e6f75676820455448206e6f742073656e74604482015290519081900360640190fd5b60006128a187610e9a565b905060008187101561291a576128bd828863ffffffff6123f716565b905060006128d68361127084606463ffffffff61234616565b905060d25481106129185760405162461bcd60e51b81526004018080602001828103825260358152602001806137956035913960400191505060405180910390fd5b505b612923826134d9565b5050612a6f565b60006129358761162f565b9050808610156129765760405162461bcd60e51b81526004018080602001828103825260348152602001806136ec6034913960400191505060405180910390fd5b612986878263ffffffff6135d716565b8310156129da576040805162461bcd60e51b815260206004820181905260248201527f5b56616c69646174696f6e5d20456e6f75676820455448206e6f742073656e74604482015290519081900360640190fd5b60ca546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612a27576040519150601f19603f3d011682016040523d82523d6000602084013e612a2c565b606091505b5050905080612a6c5760405162461bcd60e51b815260040180806020018281038252602381526020018061374a6023913960400191505060405180910390fd5b50505b60cc54612a8390600163ffffffff6135d716565b60cc8190556040805160e08101825273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81523360208083019182526001600160a01b03888116848601908152606085018d8152608086018c81524260a08801908152600160c0890181815260009b8c5260cf90975298909920875181549086166001600160a01b03199182161782559651818a01805491871691891691909117905592516002840180549190951696169590951790925590516003820155915160048301559351600582015592516006840180549294939192909160ff19909116908381811115612b6457fe5b021790555050506001600160a01b03909216600090815260cd6020908152604080832060cc8054825460018181018555938752858720015533855260ce84529184209154825491820183559184529190922001555050505050565b87612bd2816001600160a01b0316611f4f565b612c0d5760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b612c1689610c2f565b612deb578215612cb6576000612c2d898b85610bfa565b9050600081891015612ca657612c49828a63ffffffff6123f716565b90506000612c628361127084606463ffffffff61234616565b905060d2548110612ca45760405162461bcd60e51b81526004018080602001828103825260358152602001806137956035913960400191505060405180910390fd5b505b612caf826134d9565b5050612deb565b600082612ccc57612cc7898b61164e565b612cd6565b612cd6898b6111c8565b905080881015612d175760405162461bcd60e51b81526004018080602001828103825260348152602001806136ec6034913960400191505060405180910390fd5b80851015612d565760405162461bcd60e51b81526004018080602001828103825260398152602001806138f46039913960400191505060405180910390fd5b60ca546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612da3576040519150601f19603f3d011682016040523d82523d6000602084013e612da8565b606091505b5050905080612de85760405162461bcd60e51b815260040180806020018281038252602381526020018061374a6023913960400191505060405180910390fd5b50505b612e066001600160a01b038a1633308b63ffffffff61363116565b60cc54612e1a90600163ffffffff6135d716565b60cc8190556040805160e0810182526001600160a01b038c811682523360208084019182528a8316848601908152606085018f8152608086018e81524260a08801908152600160c0890181815260009b8c5260cf90965298909920875181549088166001600160a01b03199182161782559551818a01805491891691881691909117905592516002840180549190971695169490941790945592516003840155905160048301559351600582015592516006840180549294939192909160ff19909116908381811115612ee957fe5b021790555050506001600160a01b03909416600090815260cd6020908152604080832060cc8054825460018181018555938752858720015533855260ce84529184209154825491820183559184529190922001555050505050505050565b303b1590565b600054610100900460ff1680612f665750612f66612f47565b80612f74575060005460ff16155b612faf5760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff16158015612fda576000805460ff1961ff0019909116610100171660011790555b8015612fec576000805461ff00191690555b50565b600054610100900460ff16806130085750613008612f47565b80613016575060005460ff16155b6130515760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff1615801561307c576000805460ff1961ff0019909116610100171660011790555b6000613086611f4b565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612fec576000805461ff001916905550565b600054610100900460ff16806131015750613101612f47565b8061310f575060005460ff16155b61314a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff16158015613175576000805460ff1961ff0019909116610100171660011790555b6097805460ff191690558015612fec576000805461ff001916905550565b600054610100900460ff16806131ac57506131ac612f47565b806131ba575060005460ff16155b6131f55760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff16158015613220576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166132655760405162461bcd60e51b815260040180806020018281038252602b81526020018061382b602b913960400191505060405180910390fd5b6001600160a01b0383166132aa5760405162461bcd60e51b815260040180806020018281038252602a815260200180613720602a913960400191505060405180910390fd5b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cb805486841690831617905560d0805492851692909116919091179055600160d155600560d255600360d35580156126e6576000805461ff00191690555050505050565b61332d826001600160a01b0316611f4f565b61337e576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106133bc5780518252601f19909201916020918201910161339d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461341e576040519150601f19603f3d011682016040523d82523d6000602084013e613423565b606091505b50915091508161347a576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156134d35780806020019051602081101561349657600080fd5b50516134d35760405162461bcd60e51b815260040180806020018281038252602a815260200180613a00602a913960400191505060405180910390fd5b50505050565b60006134f1606461127084600a63ffffffff61234616565b9050600061350b606461127085600a63ffffffff61234616565b905060006135238261256f868663ffffffff6123f716565b60ca5460c95491925061354b916001600160a01b03908116913391168463ffffffff61363116565b60cb5460c954613570916001600160a01b03918216913391168663ffffffff61363116565b60c9546040805163079cc67960e41b81523360048201526024810185905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b1580156135c357600080fd5b505af1158015611cb8573d6000803e3d6000fd5b600082820183811015610eb1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526134d390859061331b565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529060c08201529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735b56616c69646174696f6e5d204665652028455448292069732062656c6f77206d696e696d756d207265717569726564206665655b56616c69646174696f6e5d2064657657616c6c657420697320746865207a65726f20616464726573735b56616c69646174696f6e5d205472616e73666572206f6620666565206661696c65645b56616c69646174696f6e5d3a20496e76616c6964207377617020746f6b656e20616464726573735b56616c69646174696f6e5d20466565202853574150292069732062656c6f77206d696e696d756d207265717569726564206665655b56616c69646174696f6e5d3a20496e76616c696420707269636520657374696d61746f7220616464726573735b56616c69646174696f6e5d20546865206164647265737320646f6573206e6f7420636f6e7461696e206120636f6e74726163745b56616c69646174696f6e5d206665657357616c6c657420697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775b56616c69646174696f6e5d2054686520616d6f756e742068617320746f206265206c6172676572207468616e20304f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645b56616c69646174696f6e5d206d73672e76616c756520646f65736e277420636f6e7461696e20656e6f7567682045544820666f72206665655b56616c69646174696f6e5d20496e76616c69642062656e656669636961727920616464726573735b56616c69646174696f6e5d20546865206665652068617320746f206265206c6172676572207468616e20305b56616c69646174696f6e5d3a20416c6c6f7765642046656520536c6970706167652070657263656e74616765206d757374206265206265747765656e203020746f203130305b56616c69646174696f6e5d3a20455448204665652070657263656e74616765206d757374206265206265747765656e203020746f203130305361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645b56616c69646174696f6e5d3a20556e6973776170204665652070657263656e74616765206d757374206265206265747765656e203020746f203130305b56616c69646174696f6e5d205061796d656e742064657461696c73206e6f7420666f756e64a264697066735822122078ce3494559571a21e359920f606ad506fd51438865a4170e4c2aec4e1be765364736f6c63430006020033
Deployed Bytecode
0x6080604052600436106101f85760003560e01c80639976dfbe1161010d578063cd7d9e99116100a0578063d92b9b631161006f578063d92b9b63146108e7578063e4bf01a814610939578063ea8a459314610963578063f2fde38b14610978578063f8c8765e146109ab576101f8565b8063cd7d9e99146106dc578063d22edafb1461070f578063d2bb3aed14610887578063d8ad1b2b146108b4576101f8565b8063af056b39116100dc578063af056b3914610613578063b851b7ca14610646578063bf3452f814610679578063c0f8bc60146106a3576101f8565b80639976dfbe1461050f5780639e70df21146105485780639fa944dd146105d1578063a9ff2bae146105e6576101f8565b806356ee468a11610190578063715018a61161015f578063715018a6146104705780638456cb59146104855780638cc6058b1461049a5780638da5cb5b146104c757806390d49b9d146104dc576101f8565b806356ee468a146103845780635c04aa6a146103ae5780635c975abb146103d857806361164e53146103ed576101f8565b806331bff521116101cc57806331bff521146102e957806337bdc99b146103305780633f4ba83a1461035a578063453dd97f1461036f576101f8565b806245a3d7146101fd578063199eedfa146102325780631f53ac02146102635780632699fd1f14610296575b600080fd5b34801561020957600080fd5b506102306004803603602081101561022057600080fd5b50356001600160a01b03166109f6565b005b34801561023e57600080fd5b50610247610b04565b604080516001600160a01b039092168252519081900360200190f35b34801561026f57600080fd5b506102306004803603602081101561028657600080fd5b50356001600160a01b0316610b13565b3480156102a257600080fd5b506102d7600480360360608110156102b957600080fd5b508035906001600160a01b0360208201351690604001351515610bfa565b60408051918252519081900360200190f35b3480156102f557600080fd5b5061031c6004803603602081101561030c57600080fd5b50356001600160a01b0316610c2f565b604080519115158252519081900360200190f35b34801561033c57600080fd5b506102306004803603602081101561035357600080fd5b5035610c51565b34801561036657600080fd5b50610230610dcc565b34801561037b57600080fd5b50610247610e2e565b34801561039057600080fd5b50610230600480360360208110156103a757600080fd5b5035610e3d565b3480156103ba57600080fd5b506102d7600480360360208110156103d157600080fd5b5035610e9a565b3480156103e457600080fd5b5061031c610eb8565b3480156103f957600080fd5b506104206004803603602081101561041057600080fd5b50356001600160a01b0316610ec1565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561045c578181015183820152602001610444565b505050509050019250505060405180910390f35b34801561047c57600080fd5b50610230610f2d565b34801561049157600080fd5b50610230610fcf565b3480156104a657600080fd5b50610230600480360360208110156104bd57600080fd5b503560ff1661102f565b3480156104d357600080fd5b506102476110d2565b3480156104e857600080fd5b50610230600480360360208110156104ff57600080fd5b50356001600160a01b03166110e1565b34801561051b57600080fd5b506102d76004803603604081101561053257600080fd5b50803590602001356001600160a01b03166111c8565b34801561055457600080fd5b506105726004803603602081101561056b57600080fd5b50356112b2565b604080516001600160a01b03808a168252602082018990529181018790528582166060820152908416608082015260a0810183905260c081018260018111156105b757fe5b60ff16815260200197505050505050505060405180910390f35b3480156105dd57600080fd5b506102476113dd565b3480156105f257600080fd5b506102306004803603602081101561060957600080fd5b503560ff166113ec565b34801561061f57600080fd5b506104206004803603602081101561063657600080fd5b50356001600160a01b031661148f565b34801561065257600080fd5b506102306004803603602081101561066957600080fd5b50356001600160a01b03166114f9565b34801561068557600080fd5b506102d76004803603602081101561069c57600080fd5b503561162f565b3480156106af57600080fd5b506102d7600480360360408110156106c657600080fd5b50803590602001356001600160a01b031661164e565b3480156106e857600080fd5b50610230600480360360208110156106ff57600080fd5b50356001600160a01b031661185a565b610230600480360360e081101561072557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561074f57600080fd5b82018360208201111561076157600080fd5b803590602001918460208302840111600160201b8311171561078257600080fd5b919390929091602081019035600160201b81111561079f57600080fd5b8201836020820111156107b157600080fd5b803590602001918460208302840111600160201b831117156107d257600080fd5b919390929091602081019035600160201b8111156107ef57600080fd5b82018360208201111561080157600080fd5b803590602001918460208302840111600160201b8311171561082257600080fd5b919390929091602081019035600160201b81111561083f57600080fd5b82018360208201111561085157600080fd5b803590602001918460208302840111600160201b8311171561087257600080fd5b91935091508035151590602001351515611925565b34801561089357600080fd5b50610230600480360360208110156108aa57600080fd5b503560ff16611af2565b3480156108c057600080fd5b50610230600480360360208110156108d757600080fd5b50356001600160a01b0316611b95565b610230600480360360e08110156108fd57600080fd5b506001600160a01b03813581169160208101359160408201359160608101359091169060808101359060a081013515159060c001351515611c5d565b34801561094557600080fd5b5061031c6004803603602081101561095c57600080fd5b5035611cc2565b34801561096f57600080fd5b50610247611d93565b34801561098457600080fd5b506102306004803603602081101561099b57600080fd5b50356001600160a01b0316611da2565b3480156109b757600080fd5b50610230600480360360808110156109ce57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516611e9b565b6109fe611f4b565b6065546001600160a01b03908116911614610a4e576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b80610a61816001600160a01b0316611f4f565b610a9c5760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b6001600160a01b038216610ae15760405162461bcd60e51b815260040180806020018281038252602d8152602001806137ca602d913960400191505060405180910390fd5b5060d080546001600160a01b0319166001600160a01b0392909216919091179055565b60d0546001600160a01b031690565b610b1b611f4b565b6065546001600160a01b03908116911614610b6b576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b6001600160a01b038116610bb05760405162461bcd60e51b815260040180806020018281038252602a815260200180613720602a913960400191505060405180910390fd5b60cb80546001600160a01b0319166001600160a01b0383169081179091556040517f268c00f4ec08b34fdde24b52e47a09d62f3f3837eb3b8ac7206cefb3bb5e534590600090a250565b60008082610c1157610c0c858561164e565b610c1b565b610c1b85856111c8565b9050610c2681611f8b565b95945050505050565b6001600160a01b038116600090815260d5602052604090205460ff165b919050565b80610c5b81611cc2565b610cac576040805162461bcd60e51b815260206004820181905260248201527f5b52656c656173655d3a2043616e27742072656c65617365207061796d656e74604482015290519081900360640190fd5b610cb461368b565b600083815260cf6020908152604091829020825160e08101845281546001600160a01b039081168252600180840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460a08401526006810154909160c084019160ff1690811115610d3057fe5b6001811115610d3b57fe5b90525080519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610d7557610d7083612117565b610d7e565b610d7e836121e5565b80600001516001600160a01b031681604001516001600160a01b0316847fa6ea333f41ff25e0a1adef6504bf3be9c7e740717d65f28a40b57a9681c2940c60405160405180910390a4505050565b610dd4611f4b565b6065546001600160a01b03908116911614610e24576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b610e2c612227565b565b60cb546001600160a01b031690565b610e45611f4b565b6065546001600160a01b03908116911614610e95576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b60d455565b600080610ea68361162f565b9050610eb181611f8b565b9392505050565b60975460ff1690565b6001600160a01b038116600090815260cd6020908152604091829020805483518184028101840190945280845260609392830182828015610f2157602002820191906000526020600020905b815481526020019060010190808311610f0d575b50505050509050919050565b610f35611f4b565b6065546001600160a01b03908116911614610f85576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b610fd7611f4b565b6065546001600160a01b03908116911614611027576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b610e2c6122c5565b611037611f4b565b6065546001600160a01b03908116911614611087576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b60648160ff1611156110ca5760405162461bcd60e51b81526004018080602001828103825260398152602001806139c76039913960400191505060405180910390fd5b60ff1660d155565b6065546001600160a01b031690565b6110e9611f4b565b6065546001600160a01b03908116911614611139576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b6001600160a01b03811661117e5760405162461bcd60e51b815260040180806020018281038252602b81526020018061382b602b913960400191505060405180910390fd5b60ca80546001600160a01b0319166001600160a01b0383169081179091556040517fe805ffc02a12d27b142431551e2cd3f766203c54a9a4ab0d1cf01ce7366a796f90600090a250565b60006111d382610c2f565b156111e0575060006112ac565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121b57600080fd5b505afa15801561122f573d6000803e3d6000fd5b505050506040513d602081101561124557600080fd5b50519050600061127c826112706064611264898463ffffffff61234616565b9063ffffffff61234616565b9063ffffffff61239f16565b905067016345785d8a00006112a661129e84611270858563ffffffff61234616565b60d4546123e1565b93505050505b92915050565b600080600080600080600060cf600089815260200190815260200160002060030154600014156113135760405162461bcd60e51b8152600401808060200182810382526026815260200180613a676026913960400191505060405180910390fd5b61131b61368b565b600089815260cf6020908152604091829020825160e08101845281546001600160a01b039081168252600180840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460a08401526006810154909160c084019160ff169081111561139757fe5b60018111156113a257fe5b9052508051606082015160808301516020840151604085015160a086015160c090960151949f939e50919c509a509850919650945092505050565b60c9546001600160a01b031690565b6113f4611f4b565b6065546001600160a01b03908116911614611444576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b60648160ff1611156114875760405162461bcd60e51b815260040180806020018281038252603d815260200180613a2a603d913960400191505060405180910390fd5b60ff1660d355565b6001600160a01b038116600090815260ce6020908152604091829020805483518184028101840190945280845260609392830182828015610f215760200282019190600052602060002090815481526020019060010190808311610f0d5750505050509050919050565b611501611f4b565b6065546001600160a01b03908116911614611551576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b80611564816001600160a01b0316611f4f565b61159f5760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b6001600160a01b0382166115e45760405162461bcd60e51b815260040180806020018281038252602881526020018061376d6028913960400191505060405180910390fd5b60c980546001600160a01b0319166001600160a01b0384169081179091556040517f44fe57485076f35a8eb17e92799dcc65f24a9eab90ffae0af662812f19803be590600090a25050565b60006112ac61129e606461127060d1548661234690919063ffffffff16565b600061165982610c2f565b15611666575060006112ac565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156116a157600080fd5b505afa1580156116b5573d6000803e3d6000fd5b505050506040513d60208110156116cb57600080fd5b505160d054604080516350a2394560e01b815260ff909316600a0a600484018190526001600160a01b038781166024860152915190945060009391909216916350a23945916044808201928692909190829003018186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561176c57600080fd5b8101908080516040519392919084600160201b82111561178b57600080fd5b9083019060208201858111156117a057600080fd5b82518660208202830111600160201b821117156117bc57600080fd5b82525081516020918201928201910280838360005b838110156117e95781810151838201526020016117d1565b5050505090500160405250505060008151811061180257fe5b6020026020010151905061183761182a6103e861127060d3548561234690919063ffffffff16565b829063ffffffff6123f716565b9050600061184f83611270888563ffffffff61234616565b90506112a68161162f565b611862611f4b565b6065546001600160a01b039081169116146118b2576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b806118c5816001600160a01b0316611f4f565b6119005760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b506001600160a01b0316600090815260d560205260409020805460ff19166001179055565b60975460ff1615611970576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b348988146119c5576040805162461bcd60e51b815260206004820152601c60248201527f53776170536d6172744c6f636b3a20496e76616c696420696e70757400000000604482015290519081900360640190fd5b898614611a19576040805162461bcd60e51b815260206004820152601c60248201527f53776170536d6172744c6f636b3a20496e76616c696420696e70757400000000604482015290519081900360640190fd5b898414611a6d576040805162461bcd60e51b815260206004820152601c60248201527f53776170536d6172744c6f636b3a20496e76616c696420696e70757400000000604482015290519081900360640190fd5b60005b8a811015611ae357611ad98d8d8d84818110611a8857fe5b905060200201358c8c85818110611a9b57fe5b905060200201358b8b86818110611aae57fe5b905060200201356001600160a01b0316868b8b88818110611acb57fe5b905060200201358a8a612439565b9150600101611a70565b50505050505050505050505050565b611afa611f4b565b6065546001600160a01b03908116911614611b4a576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b60648160ff161115611b8d5760405162461bcd60e51b81526004018080602001828103825260468152602001806139816046913960600191505060405180910390fd5b60ff1660d255565b611b9d611f4b565b6065546001600160a01b03908116911614611bed576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b80611c00816001600160a01b0316611f4f565b611c3b5760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b506001600160a01b0316600090815260d560205260409020805460ff19169055565b60975460ff1615611ca8576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b611cb88787878734888888612439565b5050505050505050565b6000611ccc61368b565b600083815260cf6020908152604091829020825160e08101845281546001600160a01b039081168252600180840154821694830194909452600283015416938101939093526003810154606084015260048101546080840152600581015460a08401526006810154909160c084019160ff1690811115611d4857fe5b6001811115611d5357fe5b905250905060018160c001516001811115611d6a57fe5b148015611d7b575042816080015111155b15611d8a576001915050610c4c565b50600092915050565b60ca546001600160a01b031690565b611daa611f4b565b6065546001600160a01b03908116911614611dfa576040805162461bcd60e51b815260206004820181905260248201526000805160206138a6833981519152604482015290519081900360640190fd5b6001600160a01b038116611e3f5760405162461bcd60e51b81526004018080602001828103825260268152602001806136c66026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b83611eae816001600160a01b0316611f4f565b611ee95760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b81611efc816001600160a01b0316611f4f565b611f375760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b611f4386868686612623565b505050505050565b3390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611f8357508115155b949350505050565b600080611f9f83600263ffffffff61239f16565b60d05460c95460408051637524c56f60e11b8152600160048201526001600160a01b0392831660248201529051939450600093919092169163ea498ade9160448083019286929190829003018186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561203857600080fd5b8101908080516040519392919084600160201b82111561205757600080fd5b90830190602082018581111561206c57600080fd5b82518660208202830111600160201b8211171561208857600080fd5b82525081516020918201928201910280838360005b838110156120b557818101518382015260200161209d565b505050509050016040525050506000815181106120ce57fe5b6020026020010151905060006121056120f86103e861127060d3548661234690919063ffffffff16565b839063ffffffff6123f716565b9050610c26838263ffffffff61234616565b600081815260cf602052604080822060068101805460ff191690556002810154600382015492519193926001600160a01b03909116918381818185875af1925050503d8060008114612185576040519150601f19603f3d011682016040523d82523d6000602084013e61218a565b606091505b50509050806121e0576040805162461bcd60e51b815260206004820181905260248201527f5b52656c656173655d204661696c656420746f207472616e7366657220455448604482015290519081900360640190fd5b505050565b600081815260cf6020526040902060068101805460ff19169055600281015460038201548254612223926001600160a01b03918216929116906126ed565b5050565b60975460ff16612275576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122a8611f4b565b604080516001600160a01b039092168252519081900360200190a1565b60975460ff1615612310576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122a8611f4b565b600082612355575060006112ac565b8282028284828161236257fe5b0414610eb15760405162461bcd60e51b81526004018080602001828103825260218152602001806138566021913960400191505060405180910390fd5b6000610eb183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061273f565b60008183106123f05781610eb1565b5090919050565b6000610eb183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127e1565b60008088116124795760405162461bcd60e51b815260040180806020018281038252602f815260200180613877602f913960400191505060405180910390fd5b61248289610c2f565b6124c557600084116124c55760405162461bcd60e51b815260040180806020018281038252602c815260200180613955602c913960400191505060405180910390fd5b6001600160a01b03861661250a5760405162461bcd60e51b815260040180806020018281038252602881526020018061392d6028913960400191505060405180910390fd5b8473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038b1614156125835761253e89868a8a8a8961283b565b831561255b57612554818a63ffffffff6123f716565b905061257e565b61257b8561256f838c63ffffffff6123f716565b9063ffffffff6123f716565b90505b6125ab565b6125938a8a878b8b8b8a8a612bbf565b836125ab576125a8818663ffffffff6123f716565b90505b60cc5460408051918252602082018b90528181018a905260608201879052851515608083015284151560a0830152516001600160a01b03808a16923392918e16917f211830a7f3f5f8b96be451168334f4a75f9f11a9c0a857c7e0c3592e07f881049181900360c00190a49998505050505050505050565b600054610100900460ff168061263c575061263c612f47565b8061264a575060005460ff16155b6126855760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff161580156126b0576000805460ff1961ff0019909116610100171660011790555b6126b8612f4d565b6126c0612fef565b6126c86130e8565b6126d485858585613193565b80156126e6576000805461ff00191690555b5050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526121e090849061331b565b600081836127cb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612790578181015183820152602001612778565b50505050905090810190601f1680156127bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816127d757fe5b0495945050505050565b600081848411156128335760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612790578181015183820152602001612778565b505050900390565b801561292a5785821015612896576040805162461bcd60e51b815260206004820181905260248201527f5b56616c69646174696f6e5d20456e6f75676820455448206e6f742073656e74604482015290519081900360640190fd5b60006128a187610e9a565b905060008187101561291a576128bd828863ffffffff6123f716565b905060006128d68361127084606463ffffffff61234616565b905060d25481106129185760405162461bcd60e51b81526004018080602001828103825260358152602001806137956035913960400191505060405180910390fd5b505b612923826134d9565b5050612a6f565b60006129358761162f565b9050808610156129765760405162461bcd60e51b81526004018080602001828103825260348152602001806136ec6034913960400191505060405180910390fd5b612986878263ffffffff6135d716565b8310156129da576040805162461bcd60e51b815260206004820181905260248201527f5b56616c69646174696f6e5d20456e6f75676820455448206e6f742073656e74604482015290519081900360640190fd5b60ca546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612a27576040519150601f19603f3d011682016040523d82523d6000602084013e612a2c565b606091505b5050905080612a6c5760405162461bcd60e51b815260040180806020018281038252602381526020018061374a6023913960400191505060405180910390fd5b50505b60cc54612a8390600163ffffffff6135d716565b60cc8190556040805160e08101825273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81523360208083019182526001600160a01b03888116848601908152606085018d8152608086018c81524260a08801908152600160c0890181815260009b8c5260cf90975298909920875181549086166001600160a01b03199182161782559651818a01805491871691891691909117905592516002840180549190951696169590951790925590516003820155915160048301559351600582015592516006840180549294939192909160ff19909116908381811115612b6457fe5b021790555050506001600160a01b03909216600090815260cd6020908152604080832060cc8054825460018181018555938752858720015533855260ce84529184209154825491820183559184529190922001555050505050565b87612bd2816001600160a01b0316611f4f565b612c0d5760405162461bcd60e51b81526004018080602001828103825260348152602001806137f76034913960400191505060405180910390fd5b612c1689610c2f565b612deb578215612cb6576000612c2d898b85610bfa565b9050600081891015612ca657612c49828a63ffffffff6123f716565b90506000612c628361127084606463ffffffff61234616565b905060d2548110612ca45760405162461bcd60e51b81526004018080602001828103825260358152602001806137956035913960400191505060405180910390fd5b505b612caf826134d9565b5050612deb565b600082612ccc57612cc7898b61164e565b612cd6565b612cd6898b6111c8565b905080881015612d175760405162461bcd60e51b81526004018080602001828103825260348152602001806136ec6034913960400191505060405180910390fd5b80851015612d565760405162461bcd60e51b81526004018080602001828103825260398152602001806138f46039913960400191505060405180910390fd5b60ca546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612da3576040519150601f19603f3d011682016040523d82523d6000602084013e612da8565b606091505b5050905080612de85760405162461bcd60e51b815260040180806020018281038252602381526020018061374a6023913960400191505060405180910390fd5b50505b612e066001600160a01b038a1633308b63ffffffff61363116565b60cc54612e1a90600163ffffffff6135d716565b60cc8190556040805160e0810182526001600160a01b038c811682523360208084019182528a8316848601908152606085018f8152608086018e81524260a08801908152600160c0890181815260009b8c5260cf90965298909920875181549088166001600160a01b03199182161782559551818a01805491891691881691909117905592516002840180549190971695169490941790945592516003840155905160048301559351600582015592516006840180549294939192909160ff19909116908381811115612ee957fe5b021790555050506001600160a01b03909416600090815260cd6020908152604080832060cc8054825460018181018555938752858720015533855260ce84529184209154825491820183559184529190922001555050505050505050565b303b1590565b600054610100900460ff1680612f665750612f66612f47565b80612f74575060005460ff16155b612faf5760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff16158015612fda576000805460ff1961ff0019909116610100171660011790555b8015612fec576000805461ff00191690555b50565b600054610100900460ff16806130085750613008612f47565b80613016575060005460ff16155b6130515760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff1615801561307c576000805460ff1961ff0019909116610100171660011790555b6000613086611f4b565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612fec576000805461ff001916905550565b600054610100900460ff16806131015750613101612f47565b8061310f575060005460ff16155b61314a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff16158015613175576000805460ff1961ff0019909116610100171660011790555b6097805460ff191690558015612fec576000805461ff001916905550565b600054610100900460ff16806131ac57506131ac612f47565b806131ba575060005460ff16155b6131f55760405162461bcd60e51b815260040180806020018281038252602e8152602001806138c6602e913960400191505060405180910390fd5b600054610100900460ff16158015613220576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166132655760405162461bcd60e51b815260040180806020018281038252602b81526020018061382b602b913960400191505060405180910390fd5b6001600160a01b0383166132aa5760405162461bcd60e51b815260040180806020018281038252602a815260200180613720602a913960400191505060405180910390fd5b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cb805486841690831617905560d0805492851692909116919091179055600160d155600560d255600360d35580156126e6576000805461ff00191690555050505050565b61332d826001600160a01b0316611f4f565b61337e576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106133bc5780518252601f19909201916020918201910161339d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461341e576040519150601f19603f3d011682016040523d82523d6000602084013e613423565b606091505b50915091508161347a576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156134d35780806020019051602081101561349657600080fd5b50516134d35760405162461bcd60e51b815260040180806020018281038252602a815260200180613a00602a913960400191505060405180910390fd5b50505050565b60006134f1606461127084600a63ffffffff61234616565b9050600061350b606461127085600a63ffffffff61234616565b905060006135238261256f868663ffffffff6123f716565b60ca5460c95491925061354b916001600160a01b03908116913391168463ffffffff61363116565b60cb5460c954613570916001600160a01b03918216913391168663ffffffff61363116565b60c9546040805163079cc67960e41b81523360048201526024810185905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b1580156135c357600080fd5b505af1158015611cb8573d6000803e3d6000fd5b600082820183811015610eb1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526134d390859061331b565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529060c08201529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735b56616c69646174696f6e5d204665652028455448292069732062656c6f77206d696e696d756d207265717569726564206665655b56616c69646174696f6e5d2064657657616c6c657420697320746865207a65726f20616464726573735b56616c69646174696f6e5d205472616e73666572206f6620666565206661696c65645b56616c69646174696f6e5d3a20496e76616c6964207377617020746f6b656e20616464726573735b56616c69646174696f6e5d20466565202853574150292069732062656c6f77206d696e696d756d207265717569726564206665655b56616c69646174696f6e5d3a20496e76616c696420707269636520657374696d61746f7220616464726573735b56616c69646174696f6e5d20546865206164647265737320646f6573206e6f7420636f6e7461696e206120636f6e74726163745b56616c69646174696f6e5d206665657357616c6c657420697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775b56616c69646174696f6e5d2054686520616d6f756e742068617320746f206265206c6172676572207468616e20304f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645b56616c69646174696f6e5d206d73672e76616c756520646f65736e277420636f6e7461696e20656e6f7567682045544820666f72206665655b56616c69646174696f6e5d20496e76616c69642062656e656669636961727920616464726573735b56616c69646174696f6e5d20546865206665652068617320746f206265206c6172676572207468616e20305b56616c69646174696f6e5d3a20416c6c6f7765642046656520536c6970706167652070657263656e74616765206d757374206265206265747765656e203020746f203130305b56616c69646174696f6e5d3a20455448204665652070657263656e74616765206d757374206265206265747765656e203020746f203130305361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645b56616c69646174696f6e5d3a20556e6973776170204665652070657263656e74616765206d757374206265206265747765656e203020746f203130305b56616c69646174696f6e5d205061796d656e742064657461696c73206e6f7420666f756e64a264697066735822122078ce3494559571a21e359920f606ad506fd51438865a4170e4c2aec4e1be765364736f6c63430006020033
Deployed Bytecode Sourcemap
34840:24881:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42748:321;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42748:321:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42748:321:0;-1:-1:-1;;;;;42748:321:0;;:::i;:::-;;39693:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39693:130:0;;;:::i;:::-;;;;-1:-1:-1;;;;;39693:130:0;;;;;;;;;;;;;;42340:283;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42340:283:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42340:283:0;-1:-1:-1;;;;;42340:283:0;;:::i;46758:338::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46758:338:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46758:338:0;;;-1:-1:-1;;;;;46758:338:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;59582:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59582:130:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59582:130:0;-1:-1:-1;;;;;59582:130:0;;:::i;:::-;;;;;;;;;;;;;;;;;;57146:395;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57146:395:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57146:395:0;;:::i;58893:82::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58893:82:0;;;:::i;39329:111::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39329:111:0;;;:::i;44637:130::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44637:130:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44637:130:0;;:::i;46547:203::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46547:203:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46547:203:0;;:::i;21380:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21380:78:0;;;:::i;40908:171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40908:171:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40908:171:0;-1:-1:-1;;;;;40908:171:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40908:171:0;;;;;;;;;;;;;;;;;19592:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19592:148:0;;;:::i;58721:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58721:79:0;;;:::i;43178:308::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43178:308:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43178:308:0;;;;:::i;18950:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18950:79:0;;;:::i;41938:285::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41938:285:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41938:285:0;-1:-1:-1;;;;;41938:285:0;;:::i;45945:594::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45945:594:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45945:594:0;;;;;;-1:-1:-1;;;;;45945:594:0;;:::i;39930:862::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39930:862:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39930:862:0;;:::i;:::-;;;;-1:-1:-1;;;;;39930:862:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39504:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39504:120:0;;;:::i;44185:336::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44185:336:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44185:336:0;;;;:::i;41190:159::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41190:159:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41190:159:0;-1:-1:-1;;;;;41190:159:0;;:::i;41466:355::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41466:355:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41466:355:0;-1:-1:-1;;;;;41466:355:0;;:::i;44775:201::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44775:201:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44775:201:0;;:::i;44984:953::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44984:953:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44984:953:0;;;;;;-1:-1:-1;;;;;44984:953:0;;:::i;59067:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59067:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59067:150:0;-1:-1:-1;;;;;59067:150:0;;:::i;55962:1034::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;55962:1034:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;55962:1034:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55962:1034:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;55962:1034:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;55962:1034:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55962:1034:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;55962:1034:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;55962:1034:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55962:1034:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;55962:1034:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;55962:1034:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55962:1034:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;55962:1034:0;;-1:-1:-1;55962:1034:0;-1:-1:-1;55962:1034:0;;;;;;;;;;;:::i;43670:393::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43670:393:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43670:393:0;;;;:::i;59314:156::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59314:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59314:156:0;-1:-1:-1;;;;;59314:156:0;;:::i;48174:547::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;48174:547:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57664:300::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57664:300:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57664:300:0;;:::i;39143:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39143:113:0;;;:::i;19895:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19895:244:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19895:244:0;-1:-1:-1;;;;;19895:244:0;;:::i;37587:345::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37587:345:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;37587:345:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;42748:321::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;42846:14:::1;37134:20;:7;-1:-1:-1::0;;;;;37134:18:0::1;;:20::i;:::-;37126:85;;;;-1:-1:-1::0;;;37126:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42900:28:0;::::2;42878:123;;;;-1:-1:-1::0;;;42878:123:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;43012:15:0::2;:49:::0;;-1:-1:-1;;;;;;43012:49:0::2;-1:-1:-1::0;;;;;43012:49:0;;;::::2;::::0;;;::::2;::::0;;42748:321::o;39693:130::-;39799:15;;-1:-1:-1;;;;;39799:15:0;39693:130;:::o;42340:283::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42453:20:0;::::1;42431:112;;;;-1:-1:-1::0;;;42431:112:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42554:10;:19:::0;;-1:-1:-1;;;;;;42554:19:0::1;-1:-1:-1::0;;;;;42554:19:0;::::1;::::0;;::::1;::::0;;;42591:24:::1;::::0;::::1;::::0;-1:-1:-1;;42591:24:0::1;42340:283:::0;:::o;46758:338::-;46885:7;46910:17;46930:23;:113;;47009:34;47029:6;47037:5;47009:19;:34::i;:::-;46930:113;;;46956:50;46992:6;47000:5;46956:35;:50::i;:::-;46910:133;;47061:27;47078:9;47061:16;:27::i;:::-;47054:34;46758:338;-1:-1:-1;;;;;46758:338:0:o;59582:130::-;-1:-1:-1;;;;;59682:22:0;;59653:4;59682:22;;;:15;:22;;;;;;;;59582:130;;;;:::o;57146:395::-;57205:2;37290:14;37301:2;37290:10;:14::i;:::-;37282:59;;;;;-1:-1:-1;;;37282:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57225:22:::1;;:::i;:::-;57250:16;::::0;;;:12:::1;:16;::::0;;;;;;;;57225:41;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;57225:41:0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;57250:16;;57225:41;;;;::::1;;::::0;;::::1;;;;;;;;;;;;;;::::0;;-1:-1:-1;57295:13:0;;;;-1:-1:-1;;;;;;57280:28:0::1;35304:42;57280:28;57277:134;;;57325:15;57337:2;57325:11;:15::i;:::-;57277:134;;;57382:17;57396:2;57382:13;:17::i;:::-;57509:7;:13;;;-1:-1:-1::0;;;;;57428:105:0::1;57475:7;:19;;;-1:-1:-1::0;;;;;57428:105:0::1;57458:2;57428:105;;;;;;;;;;37352:1;57146:395:::0;;:::o;58893:82::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;58957:10:::1;:8;:10::i;:::-;58893:82::o:0;39329:111::-;39422:10;;-1:-1:-1;;;;;39422:10:0;39329:111;:::o;44637:130::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;44730:12:::1;:29:::0;44637:130::o;46547:203::-;46627:7;46652:17;46672:25;46690:6;46672:17;:25::i;:::-;46652:45;;46715:27;46732:9;46715:16;:27::i;:::-;46708:34;46547:203;-1:-1:-1;;;46547:203:0:o;21380:78::-;21443:7;;;;21380:78;:::o;40908:171::-;-1:-1:-1;;;;;41041:30:0;;;;;;:24;:30;;;;;;;;;41034:37;;;;;;;;;;;;;;;;;40996:20;;41034:37;;;41041:30;41034:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40908:171;;;:::o;19592:148::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;19683:6:::1;::::0;19662:40:::1;::::0;19699:1:::1;::::0;-1:-1:-1;;;;;19683:6:0::1;::::0;19662:40:::1;::::0;19699:1;;19662:40:::1;19713:6;:19:::0;;-1:-1:-1;;;;;;19713:19:0::1;::::0;;19592:148::o;58721:79::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;58784:8:::1;:6;:8::i;43178:308::-:0;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;43343:3:::1;43323:16;:23;;;;43276:155;;;;-1:-1:-1::0;;;43276:155:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43442:36;;:17;:36:::0;43178:308::o;18950:79::-;19015:6;;-1:-1:-1;;;;;19015:6:0;18950:79;:::o;41938:285::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42051:20:0;::::1;42029:113;;;;-1:-1:-1::0;;;42029:113:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42153:11;:20:::0;;-1:-1:-1;;;;;;42153:20:0::1;-1:-1:-1::0;;;;;42153:20:0;::::1;::::0;;::::1;::::0;;;42191:24:::1;::::0;::::1;::::0;-1:-1:-1;;42191:24:0::1;41938:285:::0;:::o;45945:594::-;46057:7;46085:18;46097:5;46085:11;:18::i;:::-;46082:450;;;-1:-1:-1;46127:1:0;46120:8;;46082:450;46211:24;46245:5;-1:-1:-1;;;;;46238:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46238:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46238:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46238:27:0;;-1:-1:-1;46280:18:0;46301:59;46238:27;46301:37;46334:3;46301:28;:6;46238:27;46301:28;:10;:28;:::i;:::-;:32;:37;:32;:37;:::i;:::-;:41;:59;:41;:59;:::i;:::-;46280:80;-1:-1:-1;46397:18:0;46447:73;46456:49;46488:16;46456:27;46280:80;46397:18;46456:27;:14;:27;:::i;:49::-;46507:12;;46447:8;:73::i;:::-;46440:80;;;;;46082:450;45945:594;;;;:::o;39930:862::-;40001:13;40025:14;40050:19;40080:14;40105:19;40135:17;40163:13;40208:12;:16;40221:2;40208:16;;;;;;;;;;;:23;;;40235:1;40208:28;;40200:79;;;;-1:-1:-1;;;40200:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40292:22;;:::i;:::-;40317:16;;;;:12;:16;;;;;;;;;40292:41;;;;;;;;;-1:-1:-1;;;;;40292:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40317:16;;40292:41;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40352:13:0;;40385:14;;;;40424:19;;;;40463:14;;;;40502:19;;;;40544:17;;;;40581:14;;;;;40352:13;;40385:14;;-1:-1:-1;40424:19:0;;-1:-1:-1;40463:14:0;-1:-1:-1;40502:19:0;-1:-1:-1;40544:17:0;;-1:-1:-1;40581:14:0;-1:-1:-1;39930:862:0;-1:-1:-1;;;39930:862:0:o;39504:120::-;39605:10;;-1:-1:-1;;;;;39605:10:0;39504:120;:::o;44185:336::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;44366:3:::1;44342:20;:27;;;;44291:167;;;;-1:-1:-1::0;;;44291:167:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44469:44;;:21;:44:::0;44185:336::o;41190:159::-;-1:-1:-1;;;;;41316:25:0;;;;;;:19;:25;;;;;;;;;41309:32;;;;;;;;;;;;;;;;;41271:20;;41309:32;;;41316:25;41309:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41190:159;;;:::o;41466:355::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;41561:16:::1;37134:20;:7;-1:-1:-1::0;;;;;37134:18:0::1;;:20::i;:::-;37126:85;;;;-1:-1:-1::0;;;37126:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41617:30:0;::::2;41595:120;;;;-1:-1:-1::0;;;41595:120:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41726:10;:37:::0;;-1:-1:-1;;;;;;41726:37:0::2;-1:-1:-1::0;;;;;41726:37:0;::::2;::::0;;::::2;::::0;;;41779:34:::2;::::0;::::2;::::0;-1:-1:-1;;41779:34:0::2;19232:1:::1;41466:355:::0;:::o;44775:201::-;44854:7;44887:62;44896:38;44930:3;44896:29;44907:17;;44896:6;:10;;:29;;;;:::i;44984:953::-;45081:7;45109:18;45121:5;45109:11;:18::i;:::-;45106:824;;;-1:-1:-1;45151:1:0;45144:8;;45106:824;45294:17;45343:5;-1:-1:-1;;;;;45328:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45328:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45328:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45328:32:0;45406:15;;:57;;;-1:-1:-1;;;45406:57:0;;45320:41;;;;45314:2;:47;45406:57;;;;;;-1:-1:-1;;;;;45406:57:0;;;;;;;;;45314:47;;-1:-1:-1;45376:27:0;;45406:15;;;;;:39;;:57;;;;;45376:27;;45406:57;;;;;;;;:15;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;45406:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45406:57:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45406:57:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;45406:57:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;45406:57:0;;421:4:-1;412:14;;;;45406:57:0;;;;;412:14:-1;45406:57:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45406:57:0;;;;;;;;;;;45464:1;45406:60;;;;;;;;;;;;;;45376:90;;45664:81;45688:56;45739:4;45688:46;45712:21;;45688:19;:23;;:46;;;;:::i;:56::-;45664:19;;:81;:23;:81;:::i;:::-;45642:103;-1:-1:-1;45760:16:0;45779:46;45815:9;45779:31;:6;45642:103;45779:31;:10;:31;:::i;:46::-;45760:65;;45891:27;45909:8;45891:17;:27::i;59067:150::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;59157:5:::1;37134:20;:7;-1:-1:-1::0;;;;;37134:18:0::1;;:20::i;:::-;37126:85;;;;-1:-1:-1::0;;;37126:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;59180:22:0::2;;::::0;;;:15:::2;:22;::::0;;;;:29;;-1:-1:-1;;59180:29:0::2;59205:4;59180:29;::::0;;59067:150::o;55962:1034::-;21617:7;;;;21616:8;21608:37;;;;;-1:-1:-1;;;21608:37:0;;;;;;;;;;;;-1:-1:-1;;;21608:37:0;;;;;;;;;;;;;;;56340:9:::1;56368:37:::0;;::::1;56360:78;;;::::0;;-1:-1:-1;;;56360:78:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;56457:38:::0;;::::1;56449:79;;;::::0;;-1:-1:-1;;;56449:79:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;56547:29:::0;;::::1;56539:70;;;::::0;;-1:-1:-1;;;56539:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;56626:9;56622:367;56641:18:::0;;::::1;56622:367;;;56692:285;56727:12;56758:7;;56766:1;56758:10;;;;;;;;;;;;;56787:12;;56800:1;56787:15;;;;;;;;;;;;;56821:13;;56835:1;56821:16;;;;;;;;;;;;;-1:-1:-1::0;;;;;56821:16:0::1;56856:8;56883:4;;56888:1;56883:7;;;;;;;;;;;;;56909:11;56939:23;56692:16;:285::i;:::-;56681:296:::0;-1:-1:-1;56661:3:0::1;;56622:367;;;;21656:1;55962:1034:::0;;;;;;;;;;;:::o;43670:393::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;43883:3:::1;43851:28;:35;;;;43792:192;;;;-1:-1:-1::0;;;43792:192:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43995:60;;:29;:60:::0;43670:393::o;59314:156::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;59409:5:::1;37134:20;:7;-1:-1:-1::0;;;;;37134:18:0::1;;:20::i;:::-;37126:85;;;;-1:-1:-1::0;;;37126:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;59432:22:0::2;59457:5;59432:22:::0;;;:15:::2;:22;::::0;;;;:30;;-1:-1:-1;;59432:30:0::2;::::0;;59314:156::o;48174:547::-;21617:7;;;;21616:8;21608:37;;;;;-1:-1:-1;;;21608:37:0;;;;;;;;;;;;-1:-1:-1;;;21608:37:0;;;;;;;;;;;;;;;48480:233:::1;48511:12;48538:6;48559:11;48585;48611:9;48635:3;48653:11;48679:23;48480:16;:233::i;:::-;;48174:547:::0;;;;;;;:::o;57664:300::-;57731:4;57753:22;;:::i;:::-;57778:16;;;;:12;:16;;;;;;;;;57753:41;;;;;;;;;-1:-1:-1;;;;;57753:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57778:16;;57753:41;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57753:41:0;-1:-1:-1;57828:11:0;57810:7;:14;;;:29;;;;;;;;;57809:75;;;;;57868:15;57845:7;:19;;;:38;;57809:75;57805:129;;;57918:4;57911:11;;;;;57805:129;-1:-1:-1;57951:5:0;;57664:300;-1:-1:-1;;57664:300:0:o;39143:113::-;39237:11;;-1:-1:-1;;;;;39237:11:0;39143:113;:::o;19895:244::-;19172:12;:10;:12::i;:::-;19162:6;;-1:-1:-1;;;;;19162:6:0;;;:22;;;19154:67;;;;;-1:-1:-1;;;19154:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19154:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19984:22:0;::::1;19976:73;;;;-1:-1:-1::0;;;19976:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20086:6;::::0;20065:38:::1;::::0;-1:-1:-1;;;;;20065:38:0;;::::1;::::0;20086:6:::1;::::0;20065:38:::1;::::0;20086:6:::1;::::0;20065:38:::1;20114:6;:17:::0;;-1:-1:-1;;;;;;20114:17:0::1;-1:-1:-1::0;;;;;20114:17:0;;;::::1;::::0;;;::::1;::::0;;19895:244::o;37587:345::-;37779:16;37134:20;:7;-1:-1:-1;;;;;37134:18:0;;:20::i;:::-;37126:85;;;;-1:-1:-1;;;37126:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37815:14:::1;37134:20;:7;-1:-1:-1::0;;;;;37134:18:0::1;;:20::i;:::-;37126:85;;;;-1:-1:-1::0;;;37126:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37847:77:::2;37868:16;37886:10;37898:9;37909:14;37847:20;:77::i;:::-;37222:1:::1;37587:345:::0;;;;;:::o;17341:106::-;17429:10;17341:106;:::o;8723:619::-;8783:4;9251:20;;9094:66;9291:23;;;;;;:42;;-1:-1:-1;9318:15:0;;;9291:42;9283:51;8723:619;-1:-1:-1;;;;8723:619:0:o;47104:572::-;47186:7;;47244:16;:9;47258:1;47244:16;:13;:16;:::i;:::-;47292:15;;47343:10;;47292:63;;;-1:-1:-1;;;47292:63:0;;:15;:63;;;;-1:-1:-1;;;;;47343:10:0;;;47292:63;;;;;;47211:49;;-1:-1:-1;47271:18:0;;47292:15;;;;;:39;;:63;;;;;47271:18;;47292:63;;;;;;;:15;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;47292:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47292:63:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;47292:63:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;47292:63:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;47292:63:0;;421:4:-1;412:14;;;;47292:63:0;;;;;412:14:-1;47292:63:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;47292:63:0;;;;;;;;;;;47356:1;47292:66;;;;;;;;;;;;;;47271:87;;47522:21;47546:63;47561:47;47603:4;47561:37;47576:21;;47561:10;:14;;:37;;;;:::i;:47::-;47546:10;;:63;:14;:63;:::i;:::-;47522:87;-1:-1:-1;47627:41:0;:22;47522:87;47627:41;:26;:41;:::i;58030:295::-;58092:23;58118:16;;;:12;:16;;;;;;58145:14;;;:30;;-1:-1:-1;;58145:30:0;;;58204:19;;;;58235:14;;;;58204:50;;58118:16;;58092:23;-1:-1:-1;;;;;58204:19:0;;;;58092:23;58204:50;58092:23;58204:50;58235:14;58204:19;:50;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;58186:68:0;;;58273:7;58265:52;;;;;-1:-1:-1;;;58265:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58030:295;;;:::o;58394:237::-;58458:23;58484:16;;;:12;:16;;;;;58511:14;;;:30;;-1:-1:-1;;58511:30:0;;;58587:19;;;;58608:14;;;;58559:13;;58552:71;;-1:-1:-1;;;;;58559:13:0;;;;58587:19;;;58552:34;:71::i;:::-;58394:237;;:::o;22113:120::-;21816:7;;;;21808:40;;;;;-1:-1:-1;;;21808:40:0;;;;;;;;;;;;-1:-1:-1;;;21808:40:0;;;;;;;;;;;;;;;22172:7:::1;:15:::0;;-1:-1:-1;;22172:15:0::1;::::0;;22203:22:::1;22212:12;:10;:12::i;:::-;22203:22;::::0;;-1:-1:-1;;;;;22203:22:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;22113:120::o:0;21931:118::-;21617:7;;;;21616:8;21608:37;;;;;-1:-1:-1;;;21608:37:0;;;;;;;;;;;;-1:-1:-1;;;21608:37:0;;;;;;;;;;;;;;;21991:7:::1;:14:::0;;-1:-1:-1;;21991:14:0::1;22001:4;21991:14;::::0;;22021:20:::1;22028:12;:10;:12::i;2188:471::-:0;2246:7;2491:6;2487:47;;-1:-1:-1;2521:1:0;2514:8;;2487:47;2558:5;;;2562:1;2558;:5;:1;2582:5;;;;;:10;2574:56;;;;-1:-1:-1;;;2574:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3127:132;3185:7;3212:39;3216:1;3219;3212:39;;;;;;;;;;;;;;;;;:3;:39::i;33820:106::-;33878:7;33909:1;33905;:5;:13;;33917:1;33905:13;;;-1:-1:-1;33913:1:0;;33820:106;-1:-1:-1;33820:106:0:o;1314:136::-;1372:7;1399:43;1403:1;1406;1399:43;;;;;;;;;;;;;;;;;:3;:43::i;48792:1800::-;49087:7;49129:1;49120:6;:10;49112:70;;;;-1:-1:-1;;;49112:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49197:25;49209:12;49197:11;:25::i;:::-;49193:122;;49253:1;49247:3;:7;49239:64;;;;-1:-1:-1;;;49239:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49333:25:0;;49325:78;;;;-1:-1:-1;;;49325:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49435:5;35304:42;-1:-1:-1;;;;;49456:27:0;;;49453:827;;;49500:188;49531:6;49556:3;49578:11;49608;49638:5;49662:11;49500:12;:188::i;:::-;49708:11;49705:163;;;49751:20;:8;49764:6;49751:20;:12;:20;:::i;:::-;49740:31;;49705:163;;;49823:29;49848:3;49823:20;:8;49836:6;49823:20;:12;:20;:::i;:::-;:24;:29;:24;:29;:::i;:::-;49812:40;;49705:163;49453:827;;;49909:263;49942:12;49973:6;49998:3;50020:11;50050;50080:5;50104:11;50134:23;49909:14;:263::i;:::-;50193:11;50189:80;;50236:17;:8;50249:3;50236:17;:12;:17;:::i;:::-;50225:28;;50189:80;50406:10;;50297:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50297:259:0;;;;50355:10;;50297:259;;;;;;;;;;;;;50576:8;48792:1800;-1:-1:-1;;;;;;;;;48792:1800:0:o;37940:424::-;15422:12;;;;;;;;:31;;;15438:15;:13;:15::i;:::-;15422:47;;;-1:-1:-1;15458:11:0;;;;15457:12;15422:47;15414:106;;;;-1:-1:-1;;;15414:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15529:19;15552:12;;;;;;15551:13;15571:83;;;;15600:12;:19;;-1:-1:-1;;;;15600:19:0;;;;;15628:18;15615:4;15628:18;;;15571:83;38157:26:::1;:24;:26::i;:::-;38194;:24;:26::i;:::-;38231:27;:25;:27::i;:::-;38269:87;38300:16;38318:10;38330:9;38341:14;38269:30;:87::i;:::-;15676:14:::0;15672:57;;;15716:5;15701:20;;-1:-1:-1;;15701:20:0;;;15672:57;37940:424;;;;;:::o;11239:177::-;11349:58;;;-1:-1:-1;;;;;11349:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11349:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11322:86:0;;11342:5;;11322:19;:86::i;3747:345::-;3833:7;3935:12;3928:5;3920:28;;;;-1:-1:-1;;;3920:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3920:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3959:9;3975:1;3971;:5;;;;;;;3747:345;-1:-1:-1;;;;;3747:345:0:o;1745:192::-;1831:7;1867:12;1859:6;;;;1851:29;;;;-1:-1:-1;;;1851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1851:29:0;-1:-1:-1;;;1903:5:0;;;1745:192::o;50670:1867::-;50939:11;50936:1119;;;50983:6;50974:5;:15;;50966:60;;;;;-1:-1:-1;;;50966:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51041:28;51072:26;51091:6;51072:18;:26::i;:::-;51041:57;-1:-1:-1;51113:15:0;51151:26;;;51147:392;;;51209:29;:20;51234:3;51209:29;:24;:29;:::i;:::-;51199:39;-1:-1:-1;51257:29:0;51289:42;51310:20;51289:16;51199:39;51301:3;51289:16;:11;:16;:::i;:42::-;51257:74;;51436:29;;51412:21;:53;51404:119;;;;-1:-1:-1;;;51404:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51147:392;;51553:37;51569:20;51553:15;:37::i;:::-;50936:1119;;;;;51632:27;51662:25;51680:6;51662:17;:25::i;:::-;51632:55;;51717:19;51710:3;:26;;51702:91;;;;-1:-1:-1;;;51702:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51825:31;:6;51836:19;51825:31;:10;:31;:::i;:::-;51816:5;:40;;51808:85;;;;;-1:-1:-1;;;51808:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51926:11;;:47;;51909:12;;-1:-1:-1;;;;;51926:11:0;;51949:19;;51909:12;51926:47;51909:12;51926:47;51949:19;51926:11;:47;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;51908:65:0;;;51996:7;51988:55;;;;-1:-1:-1;;;51988:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50936:1119;;;52080:10;;:17;;52095:1;52080:17;:14;:17;:::i;:::-;52067:10;:30;;;52137:268;;;;;;;;35304:42;52137:268;;52269:10;52137:268;;;;;;;-1:-1:-1;;;;;52137:268:0;;;;;;;;;;;;;;;;;;;;;52344:15;52137:268;;;;;;52382:11;52137:268;;;;;;-1:-1:-1;52110:24:0;;;:12;:24;;;;;;;:295;;;;;;;-1:-1:-1;;;;;;52110:295:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52137:268;;52110:24;:295;;;;-1:-1:-1;;52110:295:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;52416:37:0;;;;;;;:24;:37;;;;;;;;52459:10;;;27::-1;;39:1;23:18;;;45:23;;52416:54:0;;;;;;;;52501:10;52481:31;;:19;:31;;;;;52518:10;;27::-1;;23:18;;;45:23;;52481:48:0;;;;;;;;;-1:-1:-1;;;;;50670:1867:0:o;52625:2287::-;52916:5;37134:20;:7;-1:-1:-1;;;;;37134:18:0;;:20::i;:::-;37126:85;;;;-1:-1:-1;;;37126:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52943:18:::1;52955:5;52943:11;:18::i;:::-;52939:1339;;53023:11;53020:1247;;;53054:28;53085:60;53106:6;53114:5;53121:23;53085:20;:60::i;:::-;53054:91:::0;-1:-1:-1;53164:15:0::1;53206:26:::0;;::::1;53202:412;;;53268:29;:20:::0;53293:3;53268:29:::1;:24;:29;:::i;:::-;53258:39:::0;-1:-1:-1;53320:29:0::1;53352:42;53373:20:::0;53352:16:::1;53258:39:::0;53364:3:::1;53352:16;:11;:16;:::i;:42::-;53320:74;;53507:29;;53483:21;:53;53475:119;;;;-1:-1:-1::0;;;53475:119:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53202:412;;53632:37;53648:20;53632:15;:37::i;:::-;53020:1247;;;;;53723:27;53753:23;:113;;53832:34;53852:6;53860:5;53832:19;:34::i;:::-;53753:113;;;53779:50;53815:6;53823:5;53779:35;:50::i;:::-;53723:143;;53900:19;53893:3;:26;;53885:91;;;;-1:-1:-1::0;;;53885:91:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54012:19;54003:5;:28;;53995:98;;;;-1:-1:-1::0;;;53995:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54130:11;::::0;:47:::1;::::0;54113:12:::1;::::0;-1:-1:-1;;;;;54130:11:0::1;::::0;54153:19;;54113:12;54130:47;54113:12;54130:47;54153:19;54130:11;:47:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;54112:65:0;;;54204:7;54196:55;;;;-1:-1:-1::0;;;54196:55:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53020:1247;;;54370:65;-1:-1:-1::0;;;;;54370:30:0;::::1;54401:10;54421:4;54428:6:::0;54370:65:::1;:30;:65;:::i;:::-;54461:10;::::0;:17:::1;::::0;54476:1:::1;54461:17;:14;:17;:::i;:::-;54448:10;:30:::0;;;54518:262:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;54518:262:0;;::::1;::::0;;54644:10:::1;54518:262;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;54719:15:::1;54518:262:::0;;;;;;54757:11:::1;54518:262:::0;;;;;;-1:-1:-1;54491:24:0;;;:12:::1;:24:::0;;;;;;;:289;;;;;;::::1;-1:-1:-1::0;;;;;;54491:289:0;;::::1;;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;54518:262;;54491:24;:289;;;;-1:-1:-1;;54491:289:0;;::::1;::::0;;;;::::1;;;;;;;;::::0;;-1:-1:-1;;;;;;;;54791:37:0;;::::1;;::::0;;;:24:::1;:37;::::0;;;;;;;54834:10:::1;::::0;;27::-1;;39:1:::1;23:18:::0;;::::1;45:23:::0;;54791:54:0;;;;;;::::1;::::0;54876:10:::1;54856:31:::0;;:19:::1;:31:::0;;;;;54893:10;;27::-1;;23:18;;::::1;45:23:::0;;54856:48:0;;;;;;;::::1;::::0;-1:-1:-1;;;;;;;;52625:2287:0:o;15823:508::-;16240:4;16286:17;16318:7;15823:508;:::o;17266:67::-;15422:12;;;;;;;;:31;;;15438:15;:13;:15::i;:::-;15422:47;;;-1:-1:-1;15458:11:0;;;;15457:12;15422:47;15414:106;;;;-1:-1:-1;;;15414:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15529:19;15552:12;;;;;;15551:13;15571:83;;;;15600:12;:19;;-1:-1:-1;;;;15600:19:0;;;;;15628:18;15615:4;15628:18;;;15571:83;15676:14;15672:57;;;15716:5;15701:20;;-1:-1:-1;;15701:20:0;;;15672:57;17266:67;:::o;18669:200::-;15422:12;;;;;;;;:31;;;15438:15;:13;:15::i;:::-;15422:47;;;-1:-1:-1;15458:11:0;;;;15457:12;15422:47;15414:106;;;;-1:-1:-1;;;15414:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15529:19;15552:12;;;;;;15551:13;15571:83;;;;15600:12;:19;;-1:-1:-1;;;;15600:19:0;;;;;15628:18;15615:4;15628:18;;;15571:83;18739:17:::1;18759:12;:10;:12::i;:::-;18782:6;:18:::0;;-1:-1:-1;;;;;;18782:18:0::1;-1:-1:-1::0;;;;;18782:18:0;::::1;::::0;;::::1;::::0;;;18816:43:::1;::::0;18782:18;;-1:-1:-1;18782:18:0;-1:-1:-1;;18816:43:0::1;::::0;-1:-1:-1;;18816:43:0::1;15662:1;15676:14:::0;15672:57;;;15716:5;15701:20;;-1:-1:-1;;15701:20:0;;;18669:200;:::o;21184:96::-;15422:12;;;;;;;;:31;;;15438:15;:13;:15::i;:::-;15422:47;;;-1:-1:-1;15458:11:0;;;;15457:12;15422:47;15414:106;;;;-1:-1:-1;;;15414:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15529:19;15552:12;;;;;;15551:13;15571:83;;;;15600:12;:19;;-1:-1:-1;;;;15600:19:0;;;;;15628:18;15615:4;15628:18;;;15571:83;21255:7:::1;:15:::0;;-1:-1:-1;;21255:15:0::1;::::0;;15672:57;;;;15716:5;15701:20;;-1:-1:-1;;15701:20:0;;;21184:96;:::o;38372:694::-;15422:12;;;;;;;;:31;;;15438:15;:13;:15::i;:::-;15422:47;;;-1:-1:-1;15458:11:0;;;;15457:12;15422:47;15414:106;;;;-1:-1:-1;;;15414:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15529:19;15552:12;;;;;;15551:13;15571:83;;;;15600:12;:19;;-1:-1:-1;;;;15600:19:0;;;;;15628:18;15615:4;15628:18;;;15571:83;-1:-1:-1;;;;;38607:24:0;::::1;38599:80;;;;-1:-1:-1::0;;;38599:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;38698:23:0;::::1;38690:78;;;;-1:-1:-1::0;;;38690:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38781:10;:37:::0;;-1:-1:-1;;;;;38781:37:0;;::::1;-1:-1:-1::0;;;;;;38781:37:0;;::::1;;::::0;;;38829:11:::1;:24:::0;;;;::::1;::::0;;::::1;;::::0;;38864:10:::1;:22:::0;;;;::::1;::::0;;::::1;;::::0;;38897:15:::1;:49:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;38781:37;38957:17:::1;:21:::0;39021:1:::1;38989:29;:33:::0;39057:1:::1;39033:21;:25:::0;15672:57;;;;15716:5;15701:20;;-1:-1:-1;;15701:20:0;;;38372:694;;;;;:::o;13283:1115::-;13888:27;13896:5;-1:-1:-1;;;;;13888:25:0;;:27::i;:::-;13880:71;;;;;-1:-1:-1;;;13880:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14025:12;14039:23;14074:5;-1:-1:-1;;;;;14066:19:0;14086:4;14066:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14066:25:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;14024:67:0;;;;14110:7;14102:52;;;;;-1:-1:-1;;;14102:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14171:17;;:21;14167:224;;14313:10;14302:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14302:30:0;14294:85;;;;-1:-1:-1;;;14294:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13283:1115;;;;:::o;54920:511::-;54987:17;55007:36;55039:3;55007:27;:3;35408:2;55007:27;:7;:27;:::i;:36::-;54987:56;-1:-1:-1;55060:18:0;55081:37;55114:3;55081:28;:3;35464:2;55081:28;:7;:28;:::i;:37::-;55060:58;-1:-1:-1;55135:17:0;55155:34;55060:58;55155:18;:3;55163:9;55155:18;:7;:18;:::i;:34::-;55248:11;;55208:10;;55135:54;;-1:-1:-1;55208:63:0;;-1:-1:-1;;;;;55208:10:0;;;;55236;;55248:11;55135:54;55208:63;:27;:63;:::i;:::-;55322:10;;55282;;:62;;-1:-1:-1;;;;;55282:10:0;;;;55310;;55322;55334:9;55282:62;:27;:62;:::i;:::-;55378:10;;55355:68;;;-1:-1:-1;;;55355:68:0;;55400:10;55355:68;;;;;;;;;;;;-1:-1:-1;;;;;55378:10:0;;;;55355:44;;:68;;;;;55378:10;;55355:68;;;;;;;;55378:10;;55355:68;;;5:2:-1;;;;30:1;27;20:12;5:2;55355:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;858:181:0;916:7;948:5;;;972:6;;;;964:46;;;;;-1:-1:-1;;;964:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11424:205;11552:68;;;-1:-1:-1;;;;;11552:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11552:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11525:96:0;;11545:5;;11525:19;:96::i;34840:24881::-;;;;;;;;;-1:-1:-1;34840:24881:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://78ce3494559571a21e359920f606ad506fd51438865a4170e4c2aec4e1be7653
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.