Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Initialize | 12504491 | 1353 days ago | IN | 0 ETH | 0.02708621 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
xBNT
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-25 */ // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @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; } } // File: @openzeppelin/contracts-ethereum-package/contracts/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @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; } // File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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; } // File: @openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ 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; } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol pragma solidity ^0.6.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ 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; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @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"); } } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {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; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for 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"); } } } // File: contracts/interface/IContractRegistry.sol pragma solidity >=0.6.0; interface IContractRegistry { function addressOf(bytes32 contractName) external view returns(address); } // File: contracts/interface/IBancorGovernance.sol pragma solidity >=0.6.0; interface IBancorGovernance { function voteFor(uint256 _id) external; function voteAgainst(uint256 _id) external; function stake(uint256 _amount) external; function unstake(uint256 _amount) external; } // File: contracts/interface/IStakingRewards.sol pragma solidity >=0.6.0; interface IDSToken { } interface IStakingRewards { // claims all rewards from providing address function claimRewards() external returns (uint256); // returns pending rewards from providing address function pendingRewards(address provider) external view returns (uint256); // returns all staked rewards and the ID of the new position function stakeRewards(uint256 maxAmount, IDSToken poolToken) external returns (uint256, uint256); } // File: contracts/interface/ILiquidityProtection.sol pragma solidity >=0.6.0; interface IConverterAnchor { } interface ILiquidityProtection { function addLiquidity( IConverterAnchor _poolAnchor, IERC20 _reserveToken, uint256 _amount ) external payable returns(uint); // returns id of deposit function removeLiquidity(uint256 _id, uint32 _portion) external; function removeLiquidityReturn( uint256 _id, uint32 _portion, uint256 _removeTimestamp ) external view returns (uint256, uint256, uint256); // returns amount in the reserve token // returns actual return amount in the reserve token // returns compensation in the network token // call 24 hours after removing liquidity function claimBalance(uint256 _startIndex, uint256 _endIndex) external; } // File: contracts/interface/ILiquidityProvider.sol pragma solidity 0.6.2; interface ILiquidityProvider { function initializeAndAddLiquidity( IContractRegistry _contractRegistry, address _xbntContract, IERC20 _bnt, IERC20 _vbnt, address _poolAnchor, uint256 _amount ) external returns(uint); function removeLiquidity(uint256 _id) external; function claimRewards() external returns(uint256); function claimBalance() external; function claimRewardsAndRemoveLiquidity() external returns(uint256); function claimAndRestake(address _poolToken) external returns(uint256, uint256); function pendingRewards() external view returns(uint256); } // File: contracts/interface/IMinimalProxyFactory.sol pragma solidity ^0.6.0; interface IMinimalProxyFactory { function deploy(uint256 salt, address implementation) external returns(address proxyAddress); } // File: contracts/interface/IDelegateRegistry.sol pragma solidity 0.6.2; interface IDelegateRegistry { function setDelegate(bytes32 id, address delegate) external; } // File: contracts/interface/IxBNT.sol pragma solidity 0.6.2; interface IxBNT { function getProxyAddressDepositIds(address proxyAddress) external view returns(uint256[] memory); } // File: contracts/helpers/LiquidityProvider.sol pragma solidity 0.6.2; contract LiquidityProvider { bool private initialized; IContractRegistry private contractRegistry; IERC20 private bnt; IERC20 private vbnt; address private xbnt; uint256 public nextDepositIndexToClaimBalance; function initializeAndAddLiquidity( IContractRegistry _contractRegistry, address _xbnt, IERC20 _bnt, IERC20 _vbnt, address _poolToken, uint256 _amount ) external returns(uint256) { require(msg.sender == _xbnt, 'Invalid caller'); require(!initialized, 'Already initialized'); initialized = true; contractRegistry = _contractRegistry; xbnt = _xbnt; bnt = _bnt; vbnt = _vbnt; return _addLiquidity(_poolToken, _amount); } function _addLiquidity( address _poolToken, uint256 _amount ) private returns(uint256 id) { ILiquidityProtection lp = getLiquidityProtectionContract(); bnt.approve(address(lp), uint(-1)); id = lp.addLiquidity(IConverterAnchor(_poolToken), bnt, _amount); _retrieveVbntBalance(); } /* * @notice Restake this proxy's rewards */ function claimAndRestake(address _poolToken) external onlyXbntContract returns(uint256 newDepositId, uint256 restakedBal){ (, newDepositId) = getStakingRewardsContract().stakeRewards(uint(-1), IDSToken(_poolToken)); restakedBal = _retrieveVbntBalance(); } function claimRewards() external onlyXbntContract returns(uint256 rewardsAmount){ rewardsAmount = _claimRewards(); } function _claimRewards() private returns(uint256 rewards){ rewards = getStakingRewardsContract().claimRewards(); _retrieveBntBalance(); } function _removeLiquidity(ILiquidityProtection _lp, uint256 _id) private { _lp.removeLiquidity(_id, 1000000); // full PPM resolution } /* * @notice Initiate final exit from this proxy */ function claimRewardsAndRemoveLiquidity() external onlyXbntContract returns(uint256 rewards) { rewards = _claimRewards(); uint256[] memory depositIds = getDepositIds(); ILiquidityProtection lp = getLiquidityProtectionContract(); vbnt.approve(address(lp), uint(-1)); for(uint256 i = 0; i < depositIds.length; i++){ _removeLiquidity(lp, depositIds[i]); } } /* * @notice Called 24 hours after `claimRewardsAndRemoveLiquidity` */ function claimBalance() external onlyXbntContract { getLiquidityProtectionContract().claimBalance(0, getDepositIds().length); _retrieveBntBalance(); } function _retrieveBntBalance() private { bnt.transfer(xbnt, bnt.balanceOf(address(this))); } function _retrieveVbntBalance() private returns(uint256 vbntBal) { vbntBal = vbnt.balanceOf(address(this)); vbnt.transfer(xbnt, vbntBal); } function pendingRewards() external view returns(uint){ return getStakingRewardsContract().pendingRewards(address(this)); } function getStakingRewardsContract() private view returns(IStakingRewards){ return IStakingRewards(contractRegistry.addressOf('StakingRewards')); } function getLiquidityProtectionContract() private view returns(ILiquidityProtection){ return ILiquidityProtection(contractRegistry.addressOf('LiquidityProtection')); } function getDepositIds() private view returns(uint256[] memory){ return IxBNT(xbnt).getProxyAddressDepositIds(address(this)); } modifier onlyXbntContract { require(msg.sender == xbnt, 'Invalid caller'); _; } } // File: contracts/xBNT.sol pragma solidity 0.6.2; interface IBancorNetwork { function convertByPath( address[] calldata _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee ) external payable returns (uint256); function rateByPath(address[] calldata _path, uint256 _amount) external view returns (uint256); function conversionPath(IERC20 _sourceToken, IERC20 _targetToken) external view returns (address[] memory); } contract xBNT is ERC20UpgradeSafe, OwnableUpgradeSafe, PausableUpgradeSafe { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private bnt; IERC20 private vbnt; IContractRegistry private contractRegistry; IBancorGovernance internal bancorGovernance; IMinimalProxyFactory private proxyFactory; bytes32 private constant bancorNetworkName = 'BancorNetwork'; bytes32 private constant stakingRewardsName = 'StakingRewards'; bytes32 private constant liquidityProtectionName = 'LiquidityProtection'; uint32 private constant PPM = 1000000; uint256 private constant DEC_18 = 1e18; uint256 private constant BUFFER_TARGET = 20; // 5% uint256 private constant MAX_UINT = 2**256 - 1; uint256 private constant WAITING_PERIOD = 2 days; uint256 private constant INITIAL_SUPPLY_MULTIPLIER = 10; uint256 private constant LIQUIDATION_TIME_PERIOD = 4 weeks; uint256 private lpImplementationChangedTimestamp; uint256 private governanceAddressChangedTimestamp; uint256 public adminActiveTimestamp; uint256 public lowestActiveProxyIndex; uint256 public nextProxyIndex; uint256 public totalAllocatedNav; uint256 public pendingRewardsContributionToNav; uint256 public withdrawableBntFees; address private manager; address private manager2; address private protocolMinter; address internal liquidityProviderImplementation; address private queuedLiquidityProviderImplementation; address private queuedGovernanceAddress; address private constant ZERO_ADDRESS = address(0); struct FeeDivisors { uint256 mintFee; uint256 burnFee; uint256 claimFee; } FeeDivisors public feeDivisors; struct Deposit { address proxyAddress; uint256 depositId; uint256 initialContribution; uint256 latestContributionToNav; } mapping(uint256 => Deposit) public depositIdToDeposit; struct ProxyData { uint256[] depositIds; uint256 pendingRewardsContributionToNav; uint256 deployedBnt; bool balanceClaimed; } mapping(address => ProxyData) private proxyAddressToData; mapping(uint256 => address) public proxyIndexToAddress; // addresses are locked from transfer after minting or burning uint256 private constant BLOCK_LOCK_COUNT = 6; // last block for which this address is blocklocked mapping(address => uint256) public lastLockedBlock; event AddLiquidity( address poolToken, uint256 amount, uint256 depositId, uint256 proxyIndex, uint256 timestamp ); event ClaimRestake( uint256 proxyIndex, uint256 amount, uint256 depositId, uint256 timestamp ); event ClaimRemove(uint256 proxyIndex, uint256 rewardsClaimed); event ClaimRewards(uint256 proxyIndex, uint256 rewardsClaimed); event ClaimBalance(uint256 proxyIndex); event RewardsNavUpdated( uint256 previousRewardsNav, uint256 newRewardsNav, uint256 timestamp ); event KeyAddressChange(); function initialize( IERC20 _bnt, IERC20 _vbnt, IContractRegistry _contractRegistry, IBancorGovernance _bancorGovernance, IMinimalProxyFactory _proxyFactory, address _liquidityProviderImplementation, address _protocolMinter, uint256 _mintFeeDivisor, uint256 _burnFeeDivisor, uint256 _claimFeeDivisor, uint256 _initialMint, string memory _symbol ) public initializer { __ERC20_init('xBNT', _symbol); __Ownable_init(); __Pausable_init(); bnt = _bnt; vbnt = _vbnt; contractRegistry = _contractRegistry; bancorGovernance = _bancorGovernance; proxyFactory = _proxyFactory; liquidityProviderImplementation = _liquidityProviderImplementation; protocolMinter = _protocolMinter; _mint(msg.sender, _initialMint); _setFeeDivisors(_mintFeeDivisor, _burnFeeDivisor, _claimFeeDivisor); _updateAdminActiveTimestamp(); _pause(); } /* ========================================================================================= */ /* User-Facing */ /* ========================================================================================= */ /* * @notice Mint xBNT using ETH * @param minReturn: BancorNetwork trade minReturn */ function mint(uint256 minReturn) external payable whenNotPaused notLocked(msg.sender) { require(msg.value > 0, 'Must send ETH'); lock(msg.sender); address[] memory path = new address[](3); path[0] = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; path[1] = 0xb1CD6e4153B2a390Cf00A6556b0fC1458C4A5533; // ETH_BNT_ANCHOR path[2] = address(bnt); uint256 incrementalBnt = IBancorNetwork(contractRegistry.addressOf(bancorNetworkName)) .convertByPath{value: msg.value}( path, msg.value, minReturn, ZERO_ADDRESS, ZERO_ADDRESS, 0 ); _mintInternal(incrementalBnt, false); } /* * @notice Mint xBNT using BNT * @notice Must run approval first * @param bntAmount: BNT amount */ function mintWithToken(uint256 bntAmount) external whenNotPaused notLocked(msg.sender) { require(bntAmount > 0, 'Must send BNT'); lock(msg.sender); bnt.transferFrom(msg.sender, address(this), bntAmount); _mintInternal(bntAmount, msg.sender == protocolMinter); } function _mintInternal(uint256 _incrementalBnt, bool _isProtocolMinter) private { uint256 fee; if (!_isProtocolMinter) { fee = _calculateAndIncrementFee( _incrementalBnt, feeDivisors.mintFee ); } uint256 mintAmount = calculateMintAmount(_incrementalBnt.sub(fee), totalSupply()); super._mint(msg.sender, mintAmount); } function calculateMintAmount(uint256 incrementalBnt, uint256 totalSupply) public view returns (uint256 mintAmount) { if (totalSupply == 0) return incrementalBnt.mul(INITIAL_SUPPLY_MULTIPLIER); mintAmount = (incrementalBnt).mul(totalSupply).div( getNav().sub(incrementalBnt) ); } /* * @notice Burn xBNT * @notice Will fail if pro rata BNT is more than buffer balance * @param redeemAmount: xBNT to burn * @param redeemForEth: Redeem for ETH or BNT * @param minReturn: If redeem for ETH, BancorNetwork minReturn */ function burn( uint256 redeemAmount, bool redeemForEth, uint256 minReturn ) public notLocked(msg.sender) { require(redeemAmount > 0, 'Must send xBNT'); lock(msg.sender); uint256 bufferBalance = getBufferBalance(); uint256 proRataBnt = getNav().mul(redeemAmount).div(totalSupply()); require( proRataBnt <= bufferBalance, 'Burn exceeds available liquidity' ); super._burn(msg.sender, redeemAmount); uint256 fee; if (msg.sender != protocolMinter) { fee = _calculateAndIncrementFee(proRataBnt, feeDivisors.burnFee); } if (redeemForEth) { address bancorNetworkAddress = contractRegistry.addressOf(bancorNetworkName); _approveIfNecessary(bnt, bancorNetworkAddress); // in case registry addr has changed address[] memory path = new address[](3); path[0] = address(bnt); path[1] = 0xb1CD6e4153B2a390Cf00A6556b0fC1458C4A5533; // ETH_BNT_ANCHOR path[2] = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; IBancorNetwork(bancorNetworkAddress).convertByPath( path, proRataBnt.sub(fee), minReturn, msg.sender, ZERO_ADDRESS, 0 ); } else { bnt.transfer(msg.sender, proRataBnt.sub(fee)); } } /* ========================================================================================= */ /* Liquidity Provision */ /* ========================================================================================= */ /* * @notice Makes BNT deposit on Bancor * @notice Deploys new proxy * @notice Allocates buffer BNT to allocated NAV * @param _poolAnchor: Address of liquidity pool * @param _amount: BNT amount */ function addLiquidity(IConverterAnchor _poolAnchor, uint256 _amount) external onlyOwnerOrManager { uint256 salt = uint256(keccak256(abi.encodePacked(nextProxyIndex, _amount))); address liquidityProviderProxy = proxyFactory.deploy(salt, liquidityProviderImplementation); bnt.transfer(liquidityProviderProxy, _amount); uint256 depositId = ILiquidityProvider(liquidityProviderProxy) .initializeAndAddLiquidity( contractRegistry, address(this), bnt, vbnt, address(_poolAnchor), _amount ); Deposit memory newDeposit = Deposit({ proxyAddress: liquidityProviderProxy, depositId: depositId, initialContribution: _amount, latestContributionToNav: _amount }); emit AddLiquidity( address(_poolAnchor), _amount, depositId, nextProxyIndex, block.timestamp ); depositIdToDeposit[depositId] = newDeposit; ProxyData storage proxyData = proxyAddressToData[liquidityProviderProxy]; proxyData.depositIds.push(depositId); proxyData.deployedBnt = _amount; proxyIndexToAddress[nextProxyIndex] = liquidityProviderProxy; nextProxyIndex++; totalAllocatedNav = totalAllocatedNav.add(_amount); _stake(_amount); _updateAdminActiveTimestamp(); } /* * @notice Restakes rewards from current deposit into new deposit * @notice Deploys capital to same proxy as current deposit * @notice Allocates from rewards NAV to allocated NAV * @param proxyIndex: Proxy index * @param poolToken: Pool to restake rewards to */ function claimAndRestake(uint256 proxyIndex, address poolToken) external onlyOwnerOrManager { address proxyAddress = proxyIndexToAddress[proxyIndex]; ProxyData storage proxyData = proxyAddressToData[proxyAddress]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); (uint256 newDepositId, uint256 restakedBal) = lpProxy.claimAndRestake(poolToken); // fee effectively deducted from buffer balance // because full rewards are restaked without cycling through xBNT _calculateAndIncrementFee(restakedBal, feeDivisors.claimFee); proxyData.depositIds.push(newDepositId); proxyData.deployedBnt = proxyData.deployedBnt.add(restakedBal); // zero out restaked rewards pendingRewardsContributionToNav = pendingRewardsContributionToNav.sub( proxyData.pendingRewardsContributionToNav ); proxyData.pendingRewardsContributionToNav = 0; // add restaked rewards back to nav totalAllocatedNav = totalAllocatedNav.add(restakedBal); depositIdToDeposit[newDepositId] = Deposit({ proxyAddress: proxyAddress, depositId: newDepositId, initialContribution: restakedBal, latestContributionToNav: restakedBal }); emit ClaimRestake( proxyIndex, restakedBal, newDepositId, block.timestamp ); _stake(restakedBal); _updateAdminActiveTimestamp(); } /* * @notice Iterates through proxies to calculate current available rewards * @notice Must be called daily or more to stay current with NAV * @notice We specify begin/end indices in case num proxies approaches gas limit * @param beginProxyIndexIterator: proxyIndex to begin iteration * @param endProxyIndexIterator: proxyIndex to end iteration */ function updatePendingRewardsContributionToNav( uint256 beginProxyIndexIterator, uint256 endProxyIndexIterator ) external onlyOwnerOrManager { require( beginProxyIndexIterator >= lowestActiveProxyIndex, 'Invalid index' ); require(endProxyIndexIterator <= nextProxyIndex, 'Invalid index'); require( endProxyIndexIterator > beginProxyIndexIterator, 'Invalid order' ); IStakingRewards stakingRewards = getStakingRewardsContract(); uint256 replacedPendingRewardsContributionToNav; uint256 updatedPendingRewardsContributionToNav; for (uint256 i = lowestActiveProxyIndex; i < nextProxyIndex; i++) { address proxyAddress = proxyIndexToAddress[i]; replacedPendingRewardsContributionToNav = replacedPendingRewardsContributionToNav .add( proxyAddressToData[proxyAddress].pendingRewardsContributionToNav ); uint256 newContributionToRewardsNav = stakingRewards.pendingRewards(proxyAddress); proxyAddressToData[proxyAddress] .pendingRewardsContributionToNav = newContributionToRewardsNav; updatedPendingRewardsContributionToNav = updatedPendingRewardsContributionToNav .add(newContributionToRewardsNav); } emit RewardsNavUpdated( pendingRewardsContributionToNav, updatedPendingRewardsContributionToNav, block.timestamp ); pendingRewardsContributionToNav = pendingRewardsContributionToNav .add(updatedPendingRewardsContributionToNav) .sub(replacedPendingRewardsContributionToNav); } /* * @notice Updates NAV for value of deposits * @notice Needs to be called weekly at least * @notice Due to IL protection, allocated NAV is assumed to be the greater of value * of initial deposit or removeLiquidityReturn * @notice We specify begin/end indices in case num deposits approaches gas limit * @param beginProxyIndexIterator: proxyIndex to begin iteration * @param endProxyIndexIterator: proxyIndex to end iteration */ function updateTotalAllocatedNav( uint256 beginProxyIndexIterator, uint256 endProxyIndexIterator ) external onlyOwnerOrManager { require( beginProxyIndexIterator >= lowestActiveProxyIndex, 'Invalid index' ); require(endProxyIndexIterator <= nextProxyIndex, 'Invalid index'); ILiquidityProtection lp = getLiquidityProtectionContract(); uint256[] memory depositIds; uint256 newContributionToAllocatedNav; for ( uint256 i = beginProxyIndexIterator; i < endProxyIndexIterator; i++ ) { depositIds = proxyAddressToData[proxyIndexToAddress[i]].depositIds; for (uint256 j = 0; j < depositIds.length; j++) { (newContributionToAllocatedNav, , ) = lp.removeLiquidityReturn( depositIds[j], PPM, block.timestamp ); Deposit storage deposit = depositIdToDeposit[depositIds[j]]; totalAllocatedNav = totalAllocatedNav .sub(deposit.latestContributionToNav) .add(newContributionToAllocatedNav); deposit.latestContributionToNav = newContributionToAllocatedNav; } } } /* * @notice Removes all deposits from proxy at lowestActiveProxyIndex */ function claimRewardsAndRemoveLiquidity() external onlyOwnerOrManager { _claimRewardsAndRemoveLiquidity(); _updateAdminActiveTimestamp(); } function emergencyClaimAndRemove() external liquidationTimeElapsed { _claimRewardsAndRemoveLiquidity(); } function _claimRewardsAndRemoveLiquidity() private { address proxyAddress = proxyIndexToAddress[lowestActiveProxyIndex]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); ProxyData storage proxyData = proxyAddressToData[proxyAddress]; // rewards nav reallocated implicitly to buffer balance pendingRewardsContributionToNav = pendingRewardsContributionToNav.sub( proxyData.pendingRewardsContributionToNav ); proxyData.pendingRewardsContributionToNav = 0; _unstake(proxyData.deployedBnt); vbnt.transfer(proxyAddress, proxyData.deployedBnt); uint256 rewardsClaimed = lpProxy.claimRewardsAndRemoveLiquidity(); _calculateAndIncrementFee(rewardsClaimed, feeDivisors.claimFee); emit ClaimRemove(lowestActiveProxyIndex, rewardsClaimed); // we don't deduct totalAllocatedNav yet because we need to wait // 24 hours to `claimBalance`. Only rewards are immediately retrieved lowestActiveProxyIndex++; _updateAdminActiveTimestamp(); } /* * @notice Second step in removal process * @notice Claims deposits balance 24 hrs after `claimRewardsAndRemoveLiquidity` called * @param proxyIndex: proxyIndex */ function claimBalance(uint256 proxyIndex) external onlyOwnerOrManager { _claimBalance(proxyIndex); _updateAdminActiveTimestamp(); } function emergencyClaimBalance(uint256 proxyIndex) external liquidationTimeElapsed { _claimBalance(proxyIndex); } function _claimBalance(uint256 _proxyIndex) private { address proxyAddress = proxyIndexToAddress[_proxyIndex]; ProxyData memory proxyData = proxyAddressToData[proxyAddress]; require(!proxyData.balanceClaimed, 'Already claimed'); proxyAddressToData[proxyAddress].balanceClaimed = true; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); lpProxy.claimBalance(); uint256 contributionToTotalAllocatedNav; uint256[] memory depositIds = proxyData.depositIds; for (uint256 i = 0; i < depositIds.length; i++) { contributionToTotalAllocatedNav = contributionToTotalAllocatedNav .add(depositIdToDeposit[depositIds[i]].latestContributionToNav); } emit ClaimBalance(_proxyIndex); // allocatedNav now becomes bnt buffer balance totalAllocatedNav = totalAllocatedNav.sub( contributionToTotalAllocatedNav ); } /* * @notice Claims rewards from a proxy without restaking * @notice Will reset rewards multiplier - use sparingly when buffer balance needed */ function claimRewards(uint256 proxyIndex) external onlyOwnerOrManager { address proxyAddress = proxyIndexToAddress[lowestActiveProxyIndex]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); uint256 proxyContributionToRewardsNav = getProxyAddressRewardsContributionToNav(proxyAddress); pendingRewardsContributionToNav = pendingRewardsContributionToNav.sub( proxyContributionToRewardsNav ); proxyAddressToData[proxyAddress].pendingRewardsContributionToNav = 0; uint256 rewards = lpProxy.claimRewards(); _calculateAndIncrementFee(rewards, feeDivisors.claimFee); _updateAdminActiveTimestamp(); emit ClaimRewards(proxyIndex, rewards); } function getLiquidityProtectionContract() public view returns (ILiquidityProtection) { return ILiquidityProtection( contractRegistry.addressOf(liquidityProtectionName) ); } function getStakingRewardsContract() public view returns (IStakingRewards) { return IStakingRewards(contractRegistry.addressOf(stakingRewardsName)); } /* ========================================================================================= */ /* Utils */ /* ========================================================================================= */ function getProxyAddressDepositIds(address proxyAddress) public view returns (uint256[] memory) { return proxyAddressToData[proxyAddress].depositIds; } function getProxyAddressRewardsContributionToNav(address proxyAddress) public view returns (uint256) { return proxyAddressToData[proxyAddress].pendingRewardsContributionToNav; } function changeLiquidityProviderImplementation(address newImplementation) external onlyOwner { queuedLiquidityProviderImplementation = newImplementation; lpImplementationChangedTimestamp = block.timestamp; emit KeyAddressChange(); } function confirmLiquidityProviderImplementationChange() external onlyOwner { require( block.timestamp > lpImplementationChangedTimestamp.add(WAITING_PERIOD), 'Too soon' ); liquidityProviderImplementation = queuedLiquidityProviderImplementation; } function changeGovernanceAddress(address newAddress) external onlyOwner { queuedGovernanceAddress = newAddress; governanceAddressChangedTimestamp = block.timestamp; emit KeyAddressChange(); } function confirmGovernanceAddressChange() external onlyOwner { require( block.timestamp > governanceAddressChangedTimestamp.add(WAITING_PERIOD), 'Too soon' ); bancorGovernance = IBancorGovernance(queuedGovernanceAddress); } /* ========================================================================================= */ /* Governance */ /* ========================================================================================= */ // we should probably have a setter in case bancor gov address changes function _stake(uint256 _amount) private { bancorGovernance.stake(_amount); } function _unstake(uint256 _amount) private { bancorGovernance.unstake(_amount); } /* ========================================================================================= */ /* NAV */ /* ========================================================================================= */ function getTargetBufferBalance() public view returns (uint256) { return getNav().div(BUFFER_TARGET); } function getNav() public view returns (uint256) { return totalAllocatedNav.add(getRewardsContributionToNav()).add( getBufferBalance() ); } function getRewardsContributionToNav() public view returns (uint256) { uint256 unassessedFees = pendingRewardsContributionToNav.div(feeDivisors.claimFee); return pendingRewardsContributionToNav.sub(unassessedFees); } function getBufferBalance() public view returns (uint256) { uint256 bntBal = bnt.balanceOf(address(this)); if (bntBal < withdrawableBntFees) return 0; return bntBal.sub(withdrawableBntFees); } function _calculateFee(uint256 _value, uint256 _feeDivisor) internal pure returns (uint256 fee) { if (_feeDivisor > 0 && _value > 0) { fee = _value.div(_feeDivisor); } } function _incrementWithdrawableBntFees(uint256 _feeAmount) private { withdrawableBntFees = withdrawableBntFees.add(_feeAmount); } function _calculateAndIncrementFee(uint256 _value, uint256 _feeDivisor) private returns (uint256 fee) { fee = _calculateFee(_value, _feeDivisor); _incrementWithdrawableBntFees(fee); } function setDelegate( address delegateRegistry, bytes32 id, address delegate ) external onlyOwnerOrManager { IDelegateRegistry(delegateRegistry).setDelegate(id, delegate); } /* ========================================================================================= */ /* Utils */ /* ========================================================================================= */ function _approveIfNecessary(IERC20 _token, address _toApprove) private { if (_token.allowance(address(this), _toApprove) == 0) { _token.safeApprove(_toApprove, MAX_UINT); } } function getBancorNetworkContract() public view returns (IBancorNetwork) { return IBancorNetwork(contractRegistry.addressOf(bancorNetworkName)); } function approveVbnt() external onlyOwnerOrManager { vbnt.approve(address(bancorGovernance), MAX_UINT); } function pauseContract() public onlyOwnerOrManager { _pause(); } function unpauseContract() external onlyOwnerOrManager { _unpause(); } modifier onlyOwnerOrManager { require( msg.sender == owner() || msg.sender == manager || msg.sender == manager2, 'Non-admin caller' ); _; } modifier liquidationTimeElapsed { require( adminActiveTimestamp.add(LIQUIDATION_TIME_PERIOD) < block.timestamp, 'Liquidation time not elapsed' ); _; } /* * @notice manager == alternative admin caller to owner */ function setManager(address _manager) external onlyOwner { manager = _manager; } /* * @notice manager2 == alternative admin caller to owner */ function setManager2(address _manager2) external onlyOwner { manager2 = _manager2; } function setProtocolMinter(address _protocolMinter) external onlyOwner { protocolMinter = _protocolMinter; } /* * @notice Inverse of fee i.e., a fee divisor of 100 == 1% * @notice Three fee types * @dev Mint fee 0 or <= 2% * @dev Burn fee 0 or <= 1% * @dev Claim fee 0 <= 4% */ function setFeeDivisors( uint256 mintFeeDivisor, uint256 burnFeeDivisor, uint256 claimFeeDivisor ) external onlyOwner { _setFeeDivisors(mintFeeDivisor, burnFeeDivisor, claimFeeDivisor); } function _setFeeDivisors( uint256 _mintFeeDivisor, uint256 _burnFeeDivisor, uint256 _claimFeeDivisor ) private { require(_mintFeeDivisor == 0 || _mintFeeDivisor >= 50, 'Invalid fee'); require(_burnFeeDivisor == 0 || _burnFeeDivisor >= 100, 'Invalid fee'); require(_claimFeeDivisor >= 25, 'Invalid fee'); feeDivisors.mintFee = _mintFeeDivisor; feeDivisors.burnFee = _burnFeeDivisor; feeDivisors.claimFee = _claimFeeDivisor; } /* * @notice Records admin activity * @notice If not certified for a period exceeding LIQUIDATION_TIME_PERIOD, * emergencyCooldown and emergencyRedeem become available to non-admin caller */ function _updateAdminActiveTimestamp() private { adminActiveTimestamp = block.timestamp; } receive() external payable { require(msg.sender != tx.origin, 'Errant ETH deposit'); } /** * BlockLock logic: Implements locking of mint, burn, transfer and transferFrom * functions via a notLocked modifier. * Functions are locked per address. */ modifier notLocked(address lockedAddress) { require( lastLockedBlock[lockedAddress] <= block.number, "Function is temporarily locked for this address" ); _; } /** * @dev Lock mint, burn, transfer and transferFrom functions * for _address for BLOCK_LOCK_COUNT blocks */ function lock(address _address) private { lastLockedBlock[_address] = block.number + BLOCK_LOCK_COUNT; } function transfer(address recipient, uint256 amount) public override notLocked(msg.sender) returns (bool) { return super.transfer(recipient, amount); } function transferFrom( address sender, address recipient, uint256 amount ) public override notLocked(sender) returns (bool) { return super.transferFrom(sender, recipient, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"poolToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"ClaimBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsClaimed","type":"uint256"}],"name":"ClaimRemove","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimRestake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsClaimed","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[],"name":"KeyAddressChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousRewardsNav","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardsNav","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RewardsNavUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"contract IConverterAnchor","name":"_poolAnchor","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminActiveTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approveVbnt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"internalType":"bool","name":"redeemForEth","type":"bool"},{"internalType":"uint256","name":"minReturn","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"incrementalBnt","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"calculateMintAmount","outputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"changeGovernanceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"changeLiquidityProviderImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"internalType":"address","name":"poolToken","type":"address"}],"name":"claimAndRestake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"claimBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardsAndRemoveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmGovernanceAddressChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmLiquidityProviderImplementationChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositIdToDeposit","outputs":[{"internalType":"address","name":"proxyAddress","type":"address"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"uint256","name":"initialContribution","type":"uint256"},{"internalType":"uint256","name":"latestContributionToNav","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyClaimAndRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"emergencyClaimBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDivisors","outputs":[{"internalType":"uint256","name":"mintFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"claimFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBancorNetworkContract","outputs":[{"internalType":"contract IBancorNetwork","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBufferBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityProtectionContract","outputs":[{"internalType":"contract ILiquidityProtection","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"getProxyAddressDepositIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"getProxyAddressRewardsContributionToNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsContributionToNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingRewardsContract","outputs":[{"internalType":"contract IStakingRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTargetBufferBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_bnt","type":"address"},{"internalType":"contract IERC20","name":"_vbnt","type":"address"},{"internalType":"contract IContractRegistry","name":"_contractRegistry","type":"address"},{"internalType":"contract IBancorGovernance","name":"_bancorGovernance","type":"address"},{"internalType":"contract IMinimalProxyFactory","name":"_proxyFactory","type":"address"},{"internalType":"address","name":"_liquidityProviderImplementation","type":"address"},{"internalType":"address","name":"_protocolMinter","type":"address"},{"internalType":"uint256","name":"_mintFeeDivisor","type":"uint256"},{"internalType":"uint256","name":"_burnFeeDivisor","type":"uint256"},{"internalType":"uint256","name":"_claimFeeDivisor","type":"uint256"},{"internalType":"uint256","name":"_initialMint","type":"uint256"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastLockedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowestActiveProxyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"minReturn","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bntAmount","type":"uint256"}],"name":"mintWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProxyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRewardsContributionToNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proxyIndexToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegateRegistry","type":"address"},{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"address","name":"delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintFeeDivisor","type":"uint256"},{"internalType":"uint256","name":"burnFeeDivisor","type":"uint256"},{"internalType":"uint256","name":"claimFeeDivisor","type":"uint256"}],"name":"setFeeDivisors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager2","type":"address"}],"name":"setManager2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_protocolMinter","type":"address"}],"name":"setProtocolMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocatedNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"beginProxyIndexIterator","type":"uint256"},{"internalType":"uint256","name":"endProxyIndexIterator","type":"uint256"}],"name":"updatePendingRewardsContributionToNav","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"beginProxyIndexIterator","type":"uint256"},{"internalType":"uint256","name":"endProxyIndexIterator","type":"uint256"}],"name":"updateTotalAllocatedNav","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawableBntFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50615568806100206000396000f3fe60806040526004361061039b5760003560e01c80638da5cb5b116101dc578063b5a0425711610102578063dd62ed3e116100a0578063e942e4841161006f578063e942e48414610e40578063e9484f8b14610e55578063e9fad39614610e88578063f2fde38b14610eb2576103ec565b8063dd62ed3e14610d6d578063df22db8814610da8578063e1a0f07214610de0578063e7654b3c14610e0a576103ec565b8063d5108057116100dc578063d510805714610cfe578063d9bb717014610d13578063dada981914610d43578063dc24fc0714610d58576103ec565b8063b5a0425714610c7d578063c8cabda514610cb6578063d0ebdbe714610ccb576103ec565b8063a0712d681161017a578063afdb3df611610149578063afdb3df614610afd578063afde448d14610b2d578063b33712c514610c3e578063b3eaff8b14610c53576103ec565b8063a0712d6814610a44578063a2d48da514610a61578063a457c2d714610a8b578063a9059cbb14610ac4576103ec565b80639440334f116101b65780639440334f146109b757806395d89b41146109e75780639db75962146109fc5780639f3e8b3414610a11576103ec565b80638da5cb5b1461090a5780639068e2111461091f5780639154d77c146109a2576103ec565b80634ceac4db116102c15780636a2d13fb1161025f578063803c64bb1161022e578063803c64bb1461087a57806380bac468146108ad57806386d1c5ff146108c25780638bea72fb146108d7576103ec565b80636a2d13fb146107ea57806370a082311461081d578063715018a6146108505780637c3651ae14610865576103ec565b806358927bc41161029b57806358927bc4146107785780635c975abb1461078d578063629c577e146107a257806362fdfced146107d5576103ec565b80634ceac4db146106d057806351bb42571461072a578063566887001461073f576103ec565b806323b872dd1161033957806332d6a2f21161030857806332d6a2f2146106585780633552c62f1461066d5780633950935114610682578063439766ce146106bb576103ec565b806323b872dd146105a457806326da9fb6146105e757806330d7aa84146105fc578063313ce5671461062d576103ec565b8063095ea7b311610375578063095ea7b3146104f15780630962ef791461053e5780631373c1a61461056857806318160ddd1461058f576103ec565b806303b17808146103f15780630636769e1461043457806306fdde0314610467576103ec565b366103ec57333214156103ea576040805162461bcd60e51b8152602060048201526012602482015271115c9c985b9d081155120819195c1bdcda5d60721b604482015290519081900360640190fd5b005b600080fd5b3480156103fd57600080fd5b506103ea6004803603606081101561041457600080fd5b506001600160a01b03813581169160208101359160409091013516610ee5565b34801561044057600080fd5b506103ea6004803603602081101561045757600080fd5b50356001600160a01b0316610fee565b34801561047357600080fd5b5061047c611093565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104b657818101518382015260200161049e565b50505050905090810190601f1680156104e35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104fd57600080fd5b5061052a6004803603604081101561051457600080fd5b506001600160a01b03813516906020013561112a565b604080519115158252519081900360200190f35b34801561054a57600080fd5b506103ea6004803603602081101561056157600080fd5b5035611148565b34801561057457600080fd5b5061057d6112fb565b60408051918252519081900360200190f35b34801561059b57600080fd5b5061057d61131b565b3480156105b057600080fd5b5061052a600480360360608110156105c757600080fd5b506001600160a01b03813581169160208101359091169060400135611321565b3480156105f357600080fd5b5061057d61138f565b34801561060857600080fd5b50610611611396565b604080516001600160a01b039092168252519081900360200190f35b34801561063957600080fd5b50610642611428565b6040805160ff9092168252519081900360200190f35b34801561066457600080fd5b506103ea611431565b34801561067957600080fd5b5061057d611504565b34801561068e57600080fd5b5061052a600480360360408110156106a557600080fd5b506001600160a01b038135169060200135611538565b3480156106c757600080fd5b506103ea611591565b3480156106dc57600080fd5b506106fa600480360360208110156106f357600080fd5b5035611627565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b34801561073657600080fd5b5061057d611659565b34801561074b57600080fd5b506103ea6004803603604081101561076257600080fd5b506001600160a01b038135169060200135611660565b34801561078457600080fd5b50610611611a1a565b34801561079957600080fd5b5061052a611a75565b3480156107ae57600080fd5b506107b7611a7e565b60408051938452602084019290925282820152519081900360600190f35b3480156107e157600080fd5b506103ea611a8d565b3480156107f657600080fd5b506103ea6004803603602081101561080d57600080fd5b50356001600160a01b0316611b5f565b34801561082957600080fd5b5061057d6004803603602081101561084057600080fd5b50356001600160a01b0316611bda565b34801561085c57600080fd5b506103ea611bf5565b34801561087157600080fd5b5061057d611c97565b34801561088657600080fd5b5061057d6004803603602081101561089d57600080fd5b50356001600160a01b0316611cd0565b3480156108b957600080fd5b5061057d611cef565b3480156108ce57600080fd5b506103ea611cf6565b3480156108e357600080fd5b506103ea600480360360208110156108fa57600080fd5b50356001600160a01b0316611d92565b34801561091657600080fd5b50610611611e0d565b34801561092b57600080fd5b506109526004803603602081101561094257600080fd5b50356001600160a01b0316611e1c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561098e578181015183820152602001610976565b505050509050019250505060405180910390f35b3480156109ae57600080fd5b5061057d611e89565b3480156109c357600080fd5b506103ea600480360360408110156109da57600080fd5b5080359060200135611e90565b3480156109f357600080fd5b5061047c612159565b348015610a0857600080fd5b5061057d6121ba565b348015610a1d57600080fd5b5061057d60048036036020811015610a3457600080fd5b50356001600160a01b03166121c1565b6103ea60048036036020811015610a5a57600080fd5b50356121d4565b348015610a6d57600080fd5b5061061160048036036020811015610a8457600080fd5b50356124fd565b348015610a9757600080fd5b5061052a60048036036040811015610aae57600080fd5b506001600160a01b038135169060200135612519565b348015610ad057600080fd5b5061052a60048036036040811015610ae757600080fd5b506001600160a01b038135169060200135612587565b348015610b0957600080fd5b506103ea60048036036040811015610b2057600080fd5b50803590602001356125eb565b348015610b3957600080fd5b506103ea6004803603610180811015610b5157600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135811692608081013582169260a082013583169260c0830135169160e081013591610100820135916101208101359161014082013591908101906101808101610160820135640100000000811115610bc957600080fd5b820183602082011115610bdb57600080fd5b80359060200191846001830284011164010000000083111715610bfd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128e2945050505050565b348015610c4a57600080fd5b506103ea612afe565b348015610c5f57600080fd5b506103ea60048036036020811015610c7657600080fd5b5035612b92565b348015610c8957600080fd5b506103ea60048036036040811015610ca057600080fd5b50803590602001356001600160a01b0316612d1e565b348015610cc257600080fd5b506103ea612f80565b348015610cd757600080fd5b506103ea60048036036020811015610cee57600080fd5b50356001600160a01b0316613090565b348015610d0a57600080fd5b5061057d61310b565b348015610d1f57600080fd5b5061057d60048036036040811015610d3657600080fd5b5080359060200135613112565b348015610d4f57600080fd5b506103ea613157565b348015610d6457600080fd5b5061057d6131ca565b348015610d7957600080fd5b5061057d60048036036040811015610d9057600080fd5b506001600160a01b0381358116916020013516613273565b348015610db457600080fd5b506103ea60048036036060811015610dcb57600080fd5b5080359060208101351515906040013561329e565b348015610dec57600080fd5b506103ea60048036036020811015610e0357600080fd5b503561370a565b348015610e1657600080fd5b506103ea60048036036060811015610e2d57600080fd5b5080359060208101359060400135613781565b348015610e4c57600080fd5b506106116137e9565b348015610e6157600080fd5b506103ea60048036036020811015610e7857600080fd5b50356001600160a01b0316613845565b348015610e9457600080fd5b506103ea60048036036020811015610eab57600080fd5b50356138ea565b348015610ebe57600080fd5b506103ea60048036036020811015610ed557600080fd5b50356001600160a01b0316613987565b610eed611e0d565b6001600160a01b0316336001600160a01b03161480610f175750610108546001600160a01b031633145b80610f2d5750610109546001600160a01b031633145b610f71576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b826001600160a01b031663bd86e50883836040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b50505050505050565b610ff6613a80565b6097546001600160a01b03908116911614611046576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010d80546001600160a01b0319166001600160a01b03831617905542610101556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b60688054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b820191906000526020600020905b81548152906001019060200180831161110257829003601f168201915b505050505090505b90565b600061113e611137613a80565b8484613a84565b5060015b92915050565b611150611e0d565b6001600160a01b0316336001600160a01b0316148061117a5750610108546001600160a01b031633145b806111905750610109546001600160a01b031633145b6111d4576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354600090815261011360205260408120546001600160a01b03169081906111fd82611cd0565b61010654909150611214908263ffffffff613b7016565b610106556001600160a01b03808416600090815261011260209081526040808320600101839055805163372500ab60e01b81529051929386169263372500ab9260048084019391929182900301818787803b15801561127257600080fd5b505af1158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b5051610110549091506112b0908290613bb2565b506112b9613bc9565b604080518681526020810183905281517f8b0944629ca33aba8dd5f33f7f8220efe77a2d5548a1651362c856c5ea586a65929181900390910190a15050505050565b6000611316601461130a611504565b9063ffffffff613bd016565b905090565b60675490565b6001600160a01b03831660009081526101146020526040812054849043101561137b5760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b611386858585613c12565b95945050505050565b6101035481565b60fd5460408051632ecd14d360e21b8152722634b8bab4b234ba3ca83937ba32b1ba34b7b760691b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113f757600080fd5b505afa15801561140b573d6000803e3d6000fd5b505050506040513d602081101561142157600080fd5b5051905090565b606a5460ff1690565b611439613a80565b6097546001600160a01b03908116911614611489576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b610100546114a0906202a30063ffffffff613c9a16565b42116114de576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010c5461010b80546001600160a01b0319166001600160a01b03909216919091179055565b60006113166115116131ca565b61152c61151c611c97565b610105549063ffffffff613c9a16565b9063ffffffff613c9a16565b600061113e611545613a80565b8461158c8560666000611556613a80565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff613c9a16565b613a84565b611599611e0d565b6001600160a01b0316336001600160a01b031614806115c35750610108546001600160a01b031633145b806115d95750610109546001600160a01b031633145b61161d576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611625613cf4565b565b6101116020526000908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b6101075481565b611668611e0d565b6001600160a01b0316336001600160a01b031614806116925750610108546001600160a01b031633145b806116a85750610109546001600160a01b031633145b6116ec576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010454604080516020808201939093528082018490528151808203830181526060820180845281519185019190912060ff5461010b5463df02995d60e01b909352606484018290526001600160a01b03928316608485015293519094600094929092169263df02995d9260a480830193919282900301818787803b15801561177457600080fd5b505af1158015611788573d6000803e3d6000fd5b505050506040513d602081101561179e57600080fd5b505160fb546040805163a9059cbb60e01b81526001600160a01b03808516600483015260248201889052915193945091169163a9059cbb916044808201926020929091908290030181600087803b1580156117f857600080fd5b505af115801561180c573d6000803e3d6000fd5b505050506040513d602081101561182257600080fd5b505060fd5460fb5460fc546040805163410ace9360e01b81526001600160a01b03948516600482015230602482015292841660448401529083166064830152868316608483015260a482018690525160009284169163410ace939160c480830192602092919082900301818787803b15801561189d57600080fd5b505af11580156118b1573d6000803e3d6000fd5b505050506040513d60208110156118c757600080fd5b505190506118d36151d7565b5060408051608080820183526001600160a01b038086168352602080840186905283850189905260608085018a9052610104548651938c1684529183018a90528286018790528201524291810191909152915190917fd92dda7384b5f0fa573be9bbf63d63ac81a5bbb08ebc31f00c0f066e50239609919081900360a00190a1600082815261011160209081526040808320845181546001600160a01b039182166001600160a01b031991821617835584870151600180850191909155848801516002808601919091556060890151600390950194909455918916808752610112865284872080548085018255818952878920018a90559384018c905561010480548852610113909652939095208054909516909217909355815401905561010554611a05908763ffffffff613c9a16565b61010555611a1286613d92565b610fe5613bc9565b60fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113f757600080fd5b60c95460ff1690565b61010e5461010f546101105483565b611a95613a80565b6097546001600160a01b03908116911614611ae5576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010154611afc906202a30063ffffffff613c9a16565b4211611b3a576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010d5460fe80546001600160a01b0319166001600160a01b03909216919091179055565b611b67613a80565b6097546001600160a01b03908116911614611bb7576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526065602052604090205490565b611bfd613a80565b6097546001600160a01b03908116911614611c4d576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b61011054610106546000918291611cb39163ffffffff613bd016565b61010654909150611cca908263ffffffff613b7016565b91505090565b6001600160a01b03166000908152610112602052604090206001015490565b6101065481565b611cfe611e0d565b6001600160a01b0316336001600160a01b03161480611d285750610108546001600160a01b031633145b80611d3e5750610109546001600160a01b031633145b611d82576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611d8a613dfa565b611625613bc9565b611d9a613a80565b6097546001600160a01b03908116911614611dea576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010980546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031690565b6001600160a01b03811660009081526101126020908152604091829020805483518184028101840190945280845260609392830182828015611e7d57602002820191906000526020600020905b815481526020019060010190808311611e69575b50505050509050919050565b6101025481565b611e98611e0d565b6001600160a01b0316336001600160a01b03161480611ec25750610108546001600160a01b031633145b80611ed85750610109546001600160a01b031633145b611f1c576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354821015611f64576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b61010454811115611fac576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6000611fb6611396565b905060606000845b8481101561215157600081815261011360209081526040808320546001600160a01b031683526101128252918290208054835181840281018401909452808452909183018282801561202f57602002820191906000526020600020905b81548152602001906001019080831161201b575b50939650600093505050505b835181101561214857846001600160a01b0316636d533e9b85838151811061205f57fe5b6020026020010151620f4240426040518463ffffffff1660e01b8152600401808481526020018363ffffffff1663ffffffff168152602001828152602001935050505060606040518083038186803b1580156120ba57600080fd5b505afa1580156120ce573d6000803e3d6000fd5b505050506040513d60608110156120e457600080fd5b5051845190935060009061011190829087908590811061210057fe5b6020026020010151815260200190815260200160002090506121368461152c836003015461010554613b7090919063ffffffff16565b6101055560030183905560010161203b565b50600101611fbe565b505050505050565b60698054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b6101045481565b6101146020526000908152604090205481565b60c95460ff161561221f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336000818152610114602052604090205443101561226e5760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b600034116122b3576040805162461bcd60e51b815260206004820152600d60248201526c09aeae6e840e6cadcc8408aa89609b1b604482015290519081900360640190fd5b6122bc33613fb7565b6040805160038082526080820190925260609160208201838038833901905050905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8160008151811061230057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073b1cd6e4153b2a390cf00a6556b0fc1458c4a55338160018151811061234257fe5b6001600160a01b03928316602091820292909201015260fb5482519116908290600290811061236d57fe5b6001600160a01b0392831660209182029290920181019190915260fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b60048201529051600094929092169263bb34534c92602480840193829003018186803b1580156123d857600080fd5b505afa1580156123ec573d6000803e3d6000fd5b505050506040513d602081101561240257600080fd5b505160405163b77d239b60e01b81523460248201819052604482018790526000606483018190526084830181905260a4830181905260c060048401908152865160c485015286516001600160a01b039095169463b77d239b94889385938c9391928392839291829160e49091019060208a81019102808383885b8381101561249457818101518382015260200161247c565b505050509050019750505050505050506020604051808303818588803b1580156124bd57600080fd5b505af11580156124d1573d6000803e3d6000fd5b50505050506040513d60208110156124e857600080fd5b505190506124f7816000613fd7565b50505050565b610113602052600090815260409020546001600160a01b031681565b600061113e612526613a80565b8461158c8560405180606001604052806025815260200161550e6025913960666000612550613a80565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61401f16565b33600081815261011460205260408120549091904310156125d95760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b6125e384846140b6565b949350505050565b6125f3611e0d565b6001600160a01b0316336001600160a01b0316148061261d5750610108546001600160a01b031633145b806126335750610109546001600160a01b031633145b612677576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610103548210156126bf576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b61010454811115612707576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b81811161274b576040805162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037b93232b960991b604482015290519081900360640190fd5b60006127556137e9565b905060008060006101035490505b6101045481101561286e57600081815261011360209081526040808320546001600160a01b0316808452610112909252909120600101546127ab90859063ffffffff613c9a16565b93506000856001600160a01b03166331d7a262836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561280557600080fd5b505afa158015612819573d6000803e3d6000fd5b505050506040513d602081101561282f57600080fd5b50516001600160a01b0383166000908152610112602052604090206001018190559050612862848263ffffffff613c9a16565b93505050600101612763565b506101065460408051918252602082018390524282820152517fdb6384c96bf21119d48fbb5985f4f9b3dcd153386eba0ffcb2b8b4c69fd9aa409181900360600190a16128d7826128cb8361010654613c9a90919063ffffffff16565b9063ffffffff613b7016565b610106555050505050565b600054610100900460ff16806128fb57506128fb6140ca565b80612909575060005460ff16155b6129445760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff1615801561296f576000805460ff1961ff0019909116610100171660011790555b612995604051806040016040528060048152602001631e10939560e21b815250836140d0565b61299d614185565b6129a5614236565b8c60fb60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b60fc60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a60fd60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508960fe60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508860ff60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508761010b60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508661010a60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612ac233846142d3565b612acd8686866143d1565b612ad5613bc9565b612add613cf4565b8015612aef576000805461ff00191690555b50505050505050505050505050565b612b06611e0d565b6001600160a01b0316336001600160a01b03161480612b305750610108546001600160a01b031633145b80612b465750610109546001600160a01b031633145b612b8a576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b6116256144c0565b60c95460ff1615612bdd576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b3360008181526101146020526040902054431015612c2c5760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b60008211612c71576040805162461bcd60e51b815260206004820152600d60248201526c135d5cdd081cd95b9908109395609a1b604482015290519081900360640190fd5b612c7a33613fb7565b60fb54604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015612cd457600080fd5b505af1158015612ce8573d6000803e3d6000fd5b505050506040513d6020811015612cfe57600080fd5b505061010a54612d1a9083906001600160a01b03163314613fd7565b5050565b612d26611e0d565b6001600160a01b0316336001600160a01b03161480612d505750610108546001600160a01b031633145b80612d665750610109546001600160a01b031633145b612daa576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b600082815261011360209081526040808320546001600160a01b03908116808552610112909352818420825163a04d481360e01b81529186166004830152825193949093859391928392859263a04d481392602480820193929182900301818787803b158015612e1957600080fd5b505af1158015612e2d573d6000803e3d6000fd5b505050506040513d6040811015612e4357600080fd5b508051602090910151610110549193509150612e60908290613bb2565b508354600181018555600085815260209020018290556002840154612e8b908263ffffffff613c9a16565b6002850155600184015461010654612ea89163ffffffff613b7016565b610106556000600185015561010554612ec7908263ffffffff613c9a16565b6101055560408051608080820183526001600160a01b0388811683526020808401878152848601878152606080870189815260008b81526101118652899020975188546001600160a01b031916961695909517875591516001870155516002860155915160039094019390935583518b8152928301859052828401869052429083015291517f9737e7b0050fbe768c31b5c3d88bbcb6fe5e72237a4b8f3d60864d9110e4d397929181900390910190a1611a1281613d92565b612f88611e0d565b6001600160a01b0316336001600160a01b03161480612fb25750610108546001600160a01b031633145b80612fc85750610109546001600160a01b031633145b61300c576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60fc5460fe546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561306657600080fd5b505af115801561307a573d6000803e3d6000fd5b505050506040513d6020811015612d1a57600080fd5b613098613a80565b6097546001600160a01b039081169116146130e8576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010880546001600160a01b0319166001600160a01b0392909216919091179055565b6101055481565b6000816131315761312a83600a63ffffffff61454116565b9050611142565b613150613140846128cb611504565b61130a858563ffffffff61454116565b9392505050565b610102544290613170906224ea0063ffffffff613c9a16565b106131c2576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b611625613dfa565b60fb54604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561321a57600080fd5b505afa15801561322e573d6000803e3d6000fd5b505050506040513d602081101561324457600080fd5b50516101075490915081101561325e576000915050611127565b61010754611cca90829063ffffffff613b7016565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b33600081815261011460205260409020544310156132ed5760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b60008411613333576040805162461bcd60e51b815260206004820152600e60248201526d135d5cdd081cd95b99081e10939560921b604482015290519081900360640190fd5b61333c33613fb7565b60006133466131ca565b9050600061336d61335561131b565b61130a88613361611504565b9063ffffffff61454116565b9050818111156133c4576040805162461bcd60e51b815260206004820181905260248201527f4275726e206578636565647320617661696c61626c65206c6971756964697479604482015290519081900360640190fd5b6133ce338761459a565b61010a546000906001600160a01b031633146133f7576133f48261010e60010154613bb2565b90505b85156136645760fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561345857600080fd5b505afa15801561346c573d6000803e3d6000fd5b505050506040513d602081101561348257600080fd5b505160fb5490915061349d906001600160a01b0316826146a2565b60408051600380825260808201909252606091602082018380388339505060fb5482519293506001600160a01b0316918391506000906134d957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073b1cd6e4153b2a390cf00a6556b0fc1458c4a55338160018151811061351b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8160028151811061355d57fe5b6001600160a01b039283166020918202929092010152821663b77d239b8261358b878763ffffffff613b7016565b6040516001600160e01b031960e085901b16815260248101829052604481018c9052336064820181905260006084830181905260a4830181905260c060048401908152855160c485015285518f94839291829160e4019060208a81019102808383885b838110156136065781810151838201526020016135ee565b50505050905001975050505050505050602060405180830381600087803b15801561363057600080fd5b505af1158015613644573d6000803e3d6000fd5b505050506040513d602081101561365a57600080fd5b50610fe592505050565b60fb546001600160a01b031663a9059cbb33613686858563ffffffff613b7016565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156136d557600080fd5b505af11580156136e9573d6000803e3d6000fd5b505050506040513d60208110156136ff57600080fd5b505050505050505050565b610102544290613723906224ea0063ffffffff613c9a16565b10613775576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b61377e8161473e565b50565b613789613a80565b6097546001600160a01b039081169116146137d9576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b6137e48383836143d1565b505050565b60fd5460408051632ecd14d360e21b81526d5374616b696e675265776172647360901b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113f757600080fd5b61384d613a80565b6097546001600160a01b0390811691161461389d576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010c80546001600160a01b0319166001600160a01b03831617905542610100556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b6138f2611e0d565b6001600160a01b0316336001600160a01b0316148061391c5750610108546001600160a01b031633145b806139325750610109546001600160a01b031633145b613976576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61397f8161473e565b61377e613bc9565b61398f613a80565b6097546001600160a01b039081169116146139df576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b6001600160a01b038116613a245760405162461bcd60e51b81526004018080602001828103825260268152602001806153106026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316613ac95760405162461bcd60e51b815260040180806020018281038252602481526020018061548a6024913960400191505060405180910390fd5b6001600160a01b038216613b0e5760405162461bcd60e51b81526004018080602001828103825260228152602001806153366022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600061315083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061401f565b6000613bbe8383614960565b905061114281614986565b4261010255565b600061315083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506149a1565b6000613c1f848484614a06565b613c9084613c2b613a80565b61158c856040518060600160405280602881526020016153ce602891396001600160a01b038a16600090815260666020526040812090613c69613a80565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61401f16565b5060019392505050565b600082820183811015613150576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60c95460ff1615613d3f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d75613a80565b604080516001600160a01b039092168252519081900360200190a1565b60fe546040805163534a7e1d60e11b81526004810184905290516001600160a01b039092169163a694fc3a9160248082019260009290919082900301818387803b158015613ddf57600080fd5b505af1158015613df3573d6000803e3d6000fd5b5050505050565b61010354600090815261011360209081526040808320546001600160a01b0316808452610112909252909120600181015461010654839291613e42919063ffffffff613b7016565b61010655600060018201556002810154613e5b90614b6f565b60fc5460028201546040805163a9059cbb60e01b81526001600160a01b03878116600483015260248201939093529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015613eb757600080fd5b505af1158015613ecb573d6000803e3d6000fd5b505050506040513d6020811015613ee157600080fd5b5050604080516386d1c5ff60e01b815290516000916001600160a01b038516916386d1c5ff9160048082019260209290919082900301818787803b158015613f2857600080fd5b505af1158015613f3c573d6000803e3d6000fd5b505050506040513d6020811015613f5257600080fd5b505161011054909150613f66908290613bb2565b5061010354604080519182526020820183905280517f2493012c2b3f032daebde31221d2adb14631b760cd03040957e4ba73dc20b9719281900390910190a1610103805460010190556124f7613bc9565b6001600160a01b0316600090815261011460205260409020436006019055565b600081613ff157613fee8361010e60000154613bb2565b90505b6000614013614006858463ffffffff613b7016565b61400e61131b565b613112565b90506124f733826142d3565b600081848411156140ae5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561407357818101518382015260200161405b565b50505050905090810190601f1680156140a05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061113e6140c3613a80565b8484614a06565b303b1590565b600054610100900460ff16806140e957506140e96140ca565b806140f7575060005460ff16155b6141325760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff1615801561415d576000805460ff1961ff0019909116610100171660011790555b614165614bbc565b61416f8383614c5c565b80156137e4576000805461ff0019169055505050565b600054610100900460ff168061419e575061419e6140ca565b806141ac575060005460ff16155b6141e75760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614212576000805460ff1961ff0019909116610100171660011790555b61421a614bbc565b614222614d34565b801561377e576000805461ff001916905550565b600054610100900460ff168061424f575061424f6140ca565b8061425d575060005460ff16155b6142985760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff161580156142c3576000805460ff1961ff0019909116610100171660011790555b6142cb614bbc565b614222614e2d565b6001600160a01b03821661432e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61433a600083836137e4565b60675461434d908263ffffffff613c9a16565b6067556001600160a01b038216600090815260656020526040902054614379908263ffffffff613c9a16565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b8215806143df575060328310155b61441e576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b81158061442c575060648210155b61446b576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b60198110156144af576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b61010e9290925561010f5561011055565b60c95460ff1661450e576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613d75613a80565b60008261455057506000611142565b8282028284828161455d57fe5b04146131505760405162461bcd60e51b81526004018080602001828103825260218152602001806153ad6021913960400191505060405180910390fd5b6001600160a01b0382166145df5760405162461bcd60e51b81526004018080602001828103825260218152602001806154446021913960400191505060405180910390fd5b6145eb826000836137e4565b61462e816040518060600160405280602281526020016152ee602291396001600160a01b038516600090815260656020526040902054919063ffffffff61401f16565b6001600160a01b03831660009081526065602052604090205560675461465a908263ffffffff613b7016565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b1580156146f257600080fd5b505afa158015614706573d6000803e3d6000fd5b505050506040513d602081101561471c57600080fd5b5051612d1a57612d1a6001600160a01b0383168260001963ffffffff614ed816565b600081815261011360205260409020546001600160a01b031661475f615208565b6001600160a01b038216600090815261011260209081526040918290208251815460a0938102820184019094526080810184815290939192849284918401828280156147ca57602002820191906000526020600020905b8154815260200190600101908083116147b6575b5050509183525050600182015460208201526002820154604082015260039091015460ff16151560609182015281015190915015614841576040805162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6001600160a01b03821660008181526101126020526040808220600301805460ff1916600117905580516318284de560e11b815290518593926330509bca926004808201939182900301818387803b15801561489c57600080fd5b505af11580156148b0573d6000803e3d6000fd5b50508351600092509050815b815181101561490c5761490261011160008484815181106148d957fe5b602002602001015181526020019081526020016000206003015484613c9a90919063ffffffff16565b92506001016148bc565b506040805187815290517f7fc547d30654f63b77c16f8a90f08290e8f69a076d8d5512d182b4ddbc198d039181900360200190a161010554614954908363ffffffff613b7016565b61010555505050505050565b600080821180156149715750600083115b1561114257613150838363ffffffff613bd016565b6101075461499a908263ffffffff613c9a16565b6101075550565b600081836149f05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561407357818101518382015260200161405b565b5060008385816149fc57fe5b0495945050505050565b6001600160a01b038316614a4b5760405162461bcd60e51b81526004018080602001828103825260258152602001806154656025913960400191505060405180910390fd5b6001600160a01b038216614a905760405162461bcd60e51b81526004018080602001828103825260238152602001806152cb6023913960400191505060405180910390fd5b614a9b8383836137e4565b614ade81604051806060016040528060268152602001615358602691396001600160a01b038616600090815260656020526040902054919063ffffffff61401f16565b6001600160a01b038085166000908152606560205260408082209390935590841681522054614b13908263ffffffff613c9a16565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60fe54604080516305c2fbcf60e31b81526004810184905290516001600160a01b0390921691632e17de789160248082019260009290919082900301818387803b158015613ddf57600080fd5b600054610100900460ff1680614bd55750614bd56140ca565b80614be3575060005460ff16155b614c1e5760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614222576000805460ff1961ff001990911661010017166001179055801561377e576000805461ff001916905550565b600054610100900460ff1680614c755750614c756140ca565b80614c83575060005460ff16155b614cbe5760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614ce9576000805460ff1961ff0019909116610100171660011790555b8251614cfc906068906020860190615232565b508151614d10906069906020850190615232565b50606a805460ff1916601217905580156137e4576000805461ff0019169055505050565b600054610100900460ff1680614d4d5750614d4d6140ca565b80614d5b575060005460ff16155b614d965760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614dc1576000805460ff1961ff0019909116610100171660011790555b6000614dcb613a80565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561377e576000805461ff001916905550565b600054610100900460ff1680614e465750614e466140ca565b80614e54575060005460ff16155b614e8f5760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614eba576000805460ff1961ff0019909116610100171660011790555b60c9805460ff19169055801561377e576000805461ff001916905550565b801580614f5e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614f3057600080fd5b505afa158015614f44573d6000803e3d6000fd5b505050506040513d6020811015614f5a57600080fd5b5051155b614f995760405162461bcd60e51b81526004018080602001828103825260368152602001806154d86036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526137e4908490614ff8826001600160a01b031661519e565b615049576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106150875780518252601f199092019160209182019101615068565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146150e9576040519150601f19603f3d011682016040523d82523d6000602084013e6150ee565b606091505b509150915081615145576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156124f75780806020019051602081101561516157600080fd5b50516124f75760405162461bcd60e51b815260040180806020018281038252602a8152602001806154ae602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906125e3575050151592915050565b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b60405180608001604052806060815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061527357805160ff19168380011785556152a0565b828001600101855582156152a0579182015b828111156152a0578251825591602001919060010190615285565b506152ac9291506152b0565b5090565b61112791905b808211156152ac57600081556001016152b656fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546756e6374696f6e2069732074656d706f726172696c79206c6f636b656420666f7220746869732061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220715bcc878bae8e118e43a4d0ca69612bc8f3ca49c3bcd797711e2ad48a28153264736f6c63430006020033
Deployed Bytecode
0x60806040526004361061039b5760003560e01c80638da5cb5b116101dc578063b5a0425711610102578063dd62ed3e116100a0578063e942e4841161006f578063e942e48414610e40578063e9484f8b14610e55578063e9fad39614610e88578063f2fde38b14610eb2576103ec565b8063dd62ed3e14610d6d578063df22db8814610da8578063e1a0f07214610de0578063e7654b3c14610e0a576103ec565b8063d5108057116100dc578063d510805714610cfe578063d9bb717014610d13578063dada981914610d43578063dc24fc0714610d58576103ec565b8063b5a0425714610c7d578063c8cabda514610cb6578063d0ebdbe714610ccb576103ec565b8063a0712d681161017a578063afdb3df611610149578063afdb3df614610afd578063afde448d14610b2d578063b33712c514610c3e578063b3eaff8b14610c53576103ec565b8063a0712d6814610a44578063a2d48da514610a61578063a457c2d714610a8b578063a9059cbb14610ac4576103ec565b80639440334f116101b65780639440334f146109b757806395d89b41146109e75780639db75962146109fc5780639f3e8b3414610a11576103ec565b80638da5cb5b1461090a5780639068e2111461091f5780639154d77c146109a2576103ec565b80634ceac4db116102c15780636a2d13fb1161025f578063803c64bb1161022e578063803c64bb1461087a57806380bac468146108ad57806386d1c5ff146108c25780638bea72fb146108d7576103ec565b80636a2d13fb146107ea57806370a082311461081d578063715018a6146108505780637c3651ae14610865576103ec565b806358927bc41161029b57806358927bc4146107785780635c975abb1461078d578063629c577e146107a257806362fdfced146107d5576103ec565b80634ceac4db146106d057806351bb42571461072a578063566887001461073f576103ec565b806323b872dd1161033957806332d6a2f21161030857806332d6a2f2146106585780633552c62f1461066d5780633950935114610682578063439766ce146106bb576103ec565b806323b872dd146105a457806326da9fb6146105e757806330d7aa84146105fc578063313ce5671461062d576103ec565b8063095ea7b311610375578063095ea7b3146104f15780630962ef791461053e5780631373c1a61461056857806318160ddd1461058f576103ec565b806303b17808146103f15780630636769e1461043457806306fdde0314610467576103ec565b366103ec57333214156103ea576040805162461bcd60e51b8152602060048201526012602482015271115c9c985b9d081155120819195c1bdcda5d60721b604482015290519081900360640190fd5b005b600080fd5b3480156103fd57600080fd5b506103ea6004803603606081101561041457600080fd5b506001600160a01b03813581169160208101359160409091013516610ee5565b34801561044057600080fd5b506103ea6004803603602081101561045757600080fd5b50356001600160a01b0316610fee565b34801561047357600080fd5b5061047c611093565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104b657818101518382015260200161049e565b50505050905090810190601f1680156104e35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104fd57600080fd5b5061052a6004803603604081101561051457600080fd5b506001600160a01b03813516906020013561112a565b604080519115158252519081900360200190f35b34801561054a57600080fd5b506103ea6004803603602081101561056157600080fd5b5035611148565b34801561057457600080fd5b5061057d6112fb565b60408051918252519081900360200190f35b34801561059b57600080fd5b5061057d61131b565b3480156105b057600080fd5b5061052a600480360360608110156105c757600080fd5b506001600160a01b03813581169160208101359091169060400135611321565b3480156105f357600080fd5b5061057d61138f565b34801561060857600080fd5b50610611611396565b604080516001600160a01b039092168252519081900360200190f35b34801561063957600080fd5b50610642611428565b6040805160ff9092168252519081900360200190f35b34801561066457600080fd5b506103ea611431565b34801561067957600080fd5b5061057d611504565b34801561068e57600080fd5b5061052a600480360360408110156106a557600080fd5b506001600160a01b038135169060200135611538565b3480156106c757600080fd5b506103ea611591565b3480156106dc57600080fd5b506106fa600480360360208110156106f357600080fd5b5035611627565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b34801561073657600080fd5b5061057d611659565b34801561074b57600080fd5b506103ea6004803603604081101561076257600080fd5b506001600160a01b038135169060200135611660565b34801561078457600080fd5b50610611611a1a565b34801561079957600080fd5b5061052a611a75565b3480156107ae57600080fd5b506107b7611a7e565b60408051938452602084019290925282820152519081900360600190f35b3480156107e157600080fd5b506103ea611a8d565b3480156107f657600080fd5b506103ea6004803603602081101561080d57600080fd5b50356001600160a01b0316611b5f565b34801561082957600080fd5b5061057d6004803603602081101561084057600080fd5b50356001600160a01b0316611bda565b34801561085c57600080fd5b506103ea611bf5565b34801561087157600080fd5b5061057d611c97565b34801561088657600080fd5b5061057d6004803603602081101561089d57600080fd5b50356001600160a01b0316611cd0565b3480156108b957600080fd5b5061057d611cef565b3480156108ce57600080fd5b506103ea611cf6565b3480156108e357600080fd5b506103ea600480360360208110156108fa57600080fd5b50356001600160a01b0316611d92565b34801561091657600080fd5b50610611611e0d565b34801561092b57600080fd5b506109526004803603602081101561094257600080fd5b50356001600160a01b0316611e1c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561098e578181015183820152602001610976565b505050509050019250505060405180910390f35b3480156109ae57600080fd5b5061057d611e89565b3480156109c357600080fd5b506103ea600480360360408110156109da57600080fd5b5080359060200135611e90565b3480156109f357600080fd5b5061047c612159565b348015610a0857600080fd5b5061057d6121ba565b348015610a1d57600080fd5b5061057d60048036036020811015610a3457600080fd5b50356001600160a01b03166121c1565b6103ea60048036036020811015610a5a57600080fd5b50356121d4565b348015610a6d57600080fd5b5061061160048036036020811015610a8457600080fd5b50356124fd565b348015610a9757600080fd5b5061052a60048036036040811015610aae57600080fd5b506001600160a01b038135169060200135612519565b348015610ad057600080fd5b5061052a60048036036040811015610ae757600080fd5b506001600160a01b038135169060200135612587565b348015610b0957600080fd5b506103ea60048036036040811015610b2057600080fd5b50803590602001356125eb565b348015610b3957600080fd5b506103ea6004803603610180811015610b5157600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135811692608081013582169260a082013583169260c0830135169160e081013591610100820135916101208101359161014082013591908101906101808101610160820135640100000000811115610bc957600080fd5b820183602082011115610bdb57600080fd5b80359060200191846001830284011164010000000083111715610bfd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128e2945050505050565b348015610c4a57600080fd5b506103ea612afe565b348015610c5f57600080fd5b506103ea60048036036020811015610c7657600080fd5b5035612b92565b348015610c8957600080fd5b506103ea60048036036040811015610ca057600080fd5b50803590602001356001600160a01b0316612d1e565b348015610cc257600080fd5b506103ea612f80565b348015610cd757600080fd5b506103ea60048036036020811015610cee57600080fd5b50356001600160a01b0316613090565b348015610d0a57600080fd5b5061057d61310b565b348015610d1f57600080fd5b5061057d60048036036040811015610d3657600080fd5b5080359060200135613112565b348015610d4f57600080fd5b506103ea613157565b348015610d6457600080fd5b5061057d6131ca565b348015610d7957600080fd5b5061057d60048036036040811015610d9057600080fd5b506001600160a01b0381358116916020013516613273565b348015610db457600080fd5b506103ea60048036036060811015610dcb57600080fd5b5080359060208101351515906040013561329e565b348015610dec57600080fd5b506103ea60048036036020811015610e0357600080fd5b503561370a565b348015610e1657600080fd5b506103ea60048036036060811015610e2d57600080fd5b5080359060208101359060400135613781565b348015610e4c57600080fd5b506106116137e9565b348015610e6157600080fd5b506103ea60048036036020811015610e7857600080fd5b50356001600160a01b0316613845565b348015610e9457600080fd5b506103ea60048036036020811015610eab57600080fd5b50356138ea565b348015610ebe57600080fd5b506103ea60048036036020811015610ed557600080fd5b50356001600160a01b0316613987565b610eed611e0d565b6001600160a01b0316336001600160a01b03161480610f175750610108546001600160a01b031633145b80610f2d5750610109546001600160a01b031633145b610f71576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b826001600160a01b031663bd86e50883836040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b50505050505050565b610ff6613a80565b6097546001600160a01b03908116911614611046576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010d80546001600160a01b0319166001600160a01b03831617905542610101556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b60688054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b820191906000526020600020905b81548152906001019060200180831161110257829003601f168201915b505050505090505b90565b600061113e611137613a80565b8484613a84565b5060015b92915050565b611150611e0d565b6001600160a01b0316336001600160a01b0316148061117a5750610108546001600160a01b031633145b806111905750610109546001600160a01b031633145b6111d4576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354600090815261011360205260408120546001600160a01b03169081906111fd82611cd0565b61010654909150611214908263ffffffff613b7016565b610106556001600160a01b03808416600090815261011260209081526040808320600101839055805163372500ab60e01b81529051929386169263372500ab9260048084019391929182900301818787803b15801561127257600080fd5b505af1158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b5051610110549091506112b0908290613bb2565b506112b9613bc9565b604080518681526020810183905281517f8b0944629ca33aba8dd5f33f7f8220efe77a2d5548a1651362c856c5ea586a65929181900390910190a15050505050565b6000611316601461130a611504565b9063ffffffff613bd016565b905090565b60675490565b6001600160a01b03831660009081526101146020526040812054849043101561137b5760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b611386858585613c12565b95945050505050565b6101035481565b60fd5460408051632ecd14d360e21b8152722634b8bab4b234ba3ca83937ba32b1ba34b7b760691b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113f757600080fd5b505afa15801561140b573d6000803e3d6000fd5b505050506040513d602081101561142157600080fd5b5051905090565b606a5460ff1690565b611439613a80565b6097546001600160a01b03908116911614611489576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b610100546114a0906202a30063ffffffff613c9a16565b42116114de576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010c5461010b80546001600160a01b0319166001600160a01b03909216919091179055565b60006113166115116131ca565b61152c61151c611c97565b610105549063ffffffff613c9a16565b9063ffffffff613c9a16565b600061113e611545613a80565b8461158c8560666000611556613a80565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff613c9a16565b613a84565b611599611e0d565b6001600160a01b0316336001600160a01b031614806115c35750610108546001600160a01b031633145b806115d95750610109546001600160a01b031633145b61161d576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611625613cf4565b565b6101116020526000908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b6101075481565b611668611e0d565b6001600160a01b0316336001600160a01b031614806116925750610108546001600160a01b031633145b806116a85750610109546001600160a01b031633145b6116ec576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010454604080516020808201939093528082018490528151808203830181526060820180845281519185019190912060ff5461010b5463df02995d60e01b909352606484018290526001600160a01b03928316608485015293519094600094929092169263df02995d9260a480830193919282900301818787803b15801561177457600080fd5b505af1158015611788573d6000803e3d6000fd5b505050506040513d602081101561179e57600080fd5b505160fb546040805163a9059cbb60e01b81526001600160a01b03808516600483015260248201889052915193945091169163a9059cbb916044808201926020929091908290030181600087803b1580156117f857600080fd5b505af115801561180c573d6000803e3d6000fd5b505050506040513d602081101561182257600080fd5b505060fd5460fb5460fc546040805163410ace9360e01b81526001600160a01b03948516600482015230602482015292841660448401529083166064830152868316608483015260a482018690525160009284169163410ace939160c480830192602092919082900301818787803b15801561189d57600080fd5b505af11580156118b1573d6000803e3d6000fd5b505050506040513d60208110156118c757600080fd5b505190506118d36151d7565b5060408051608080820183526001600160a01b038086168352602080840186905283850189905260608085018a9052610104548651938c1684529183018a90528286018790528201524291810191909152915190917fd92dda7384b5f0fa573be9bbf63d63ac81a5bbb08ebc31f00c0f066e50239609919081900360a00190a1600082815261011160209081526040808320845181546001600160a01b039182166001600160a01b031991821617835584870151600180850191909155848801516002808601919091556060890151600390950194909455918916808752610112865284872080548085018255818952878920018a90559384018c905561010480548852610113909652939095208054909516909217909355815401905561010554611a05908763ffffffff613c9a16565b61010555611a1286613d92565b610fe5613bc9565b60fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113f757600080fd5b60c95460ff1690565b61010e5461010f546101105483565b611a95613a80565b6097546001600160a01b03908116911614611ae5576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010154611afc906202a30063ffffffff613c9a16565b4211611b3a576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010d5460fe80546001600160a01b0319166001600160a01b03909216919091179055565b611b67613a80565b6097546001600160a01b03908116911614611bb7576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526065602052604090205490565b611bfd613a80565b6097546001600160a01b03908116911614611c4d576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b61011054610106546000918291611cb39163ffffffff613bd016565b61010654909150611cca908263ffffffff613b7016565b91505090565b6001600160a01b03166000908152610112602052604090206001015490565b6101065481565b611cfe611e0d565b6001600160a01b0316336001600160a01b03161480611d285750610108546001600160a01b031633145b80611d3e5750610109546001600160a01b031633145b611d82576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611d8a613dfa565b611625613bc9565b611d9a613a80565b6097546001600160a01b03908116911614611dea576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010980546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031690565b6001600160a01b03811660009081526101126020908152604091829020805483518184028101840190945280845260609392830182828015611e7d57602002820191906000526020600020905b815481526020019060010190808311611e69575b50505050509050919050565b6101025481565b611e98611e0d565b6001600160a01b0316336001600160a01b03161480611ec25750610108546001600160a01b031633145b80611ed85750610109546001600160a01b031633145b611f1c576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354821015611f64576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b61010454811115611fac576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6000611fb6611396565b905060606000845b8481101561215157600081815261011360209081526040808320546001600160a01b031683526101128252918290208054835181840281018401909452808452909183018282801561202f57602002820191906000526020600020905b81548152602001906001019080831161201b575b50939650600093505050505b835181101561214857846001600160a01b0316636d533e9b85838151811061205f57fe5b6020026020010151620f4240426040518463ffffffff1660e01b8152600401808481526020018363ffffffff1663ffffffff168152602001828152602001935050505060606040518083038186803b1580156120ba57600080fd5b505afa1580156120ce573d6000803e3d6000fd5b505050506040513d60608110156120e457600080fd5b5051845190935060009061011190829087908590811061210057fe5b6020026020010151815260200190815260200160002090506121368461152c836003015461010554613b7090919063ffffffff16565b6101055560030183905560010161203b565b50600101611fbe565b505050505050565b60698054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561111f5780601f106110f45761010080835404028352916020019161111f565b6101045481565b6101146020526000908152604090205481565b60c95460ff161561221f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336000818152610114602052604090205443101561226e5760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b600034116122b3576040805162461bcd60e51b815260206004820152600d60248201526c09aeae6e840e6cadcc8408aa89609b1b604482015290519081900360640190fd5b6122bc33613fb7565b6040805160038082526080820190925260609160208201838038833901905050905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8160008151811061230057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073b1cd6e4153b2a390cf00a6556b0fc1458c4a55338160018151811061234257fe5b6001600160a01b03928316602091820292909201015260fb5482519116908290600290811061236d57fe5b6001600160a01b0392831660209182029290920181019190915260fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b60048201529051600094929092169263bb34534c92602480840193829003018186803b1580156123d857600080fd5b505afa1580156123ec573d6000803e3d6000fd5b505050506040513d602081101561240257600080fd5b505160405163b77d239b60e01b81523460248201819052604482018790526000606483018190526084830181905260a4830181905260c060048401908152865160c485015286516001600160a01b039095169463b77d239b94889385938c9391928392839291829160e49091019060208a81019102808383885b8381101561249457818101518382015260200161247c565b505050509050019750505050505050506020604051808303818588803b1580156124bd57600080fd5b505af11580156124d1573d6000803e3d6000fd5b50505050506040513d60208110156124e857600080fd5b505190506124f7816000613fd7565b50505050565b610113602052600090815260409020546001600160a01b031681565b600061113e612526613a80565b8461158c8560405180606001604052806025815260200161550e6025913960666000612550613a80565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61401f16565b33600081815261011460205260408120549091904310156125d95760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b6125e384846140b6565b949350505050565b6125f3611e0d565b6001600160a01b0316336001600160a01b0316148061261d5750610108546001600160a01b031633145b806126335750610109546001600160a01b031633145b612677576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610103548210156126bf576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b61010454811115612707576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b81811161274b576040805162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037b93232b960991b604482015290519081900360640190fd5b60006127556137e9565b905060008060006101035490505b6101045481101561286e57600081815261011360209081526040808320546001600160a01b0316808452610112909252909120600101546127ab90859063ffffffff613c9a16565b93506000856001600160a01b03166331d7a262836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561280557600080fd5b505afa158015612819573d6000803e3d6000fd5b505050506040513d602081101561282f57600080fd5b50516001600160a01b0383166000908152610112602052604090206001018190559050612862848263ffffffff613c9a16565b93505050600101612763565b506101065460408051918252602082018390524282820152517fdb6384c96bf21119d48fbb5985f4f9b3dcd153386eba0ffcb2b8b4c69fd9aa409181900360600190a16128d7826128cb8361010654613c9a90919063ffffffff16565b9063ffffffff613b7016565b610106555050505050565b600054610100900460ff16806128fb57506128fb6140ca565b80612909575060005460ff16155b6129445760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff1615801561296f576000805460ff1961ff0019909116610100171660011790555b612995604051806040016040528060048152602001631e10939560e21b815250836140d0565b61299d614185565b6129a5614236565b8c60fb60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b60fc60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a60fd60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508960fe60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508860ff60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508761010b60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508661010a60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612ac233846142d3565b612acd8686866143d1565b612ad5613bc9565b612add613cf4565b8015612aef576000805461ff00191690555b50505050505050505050505050565b612b06611e0d565b6001600160a01b0316336001600160a01b03161480612b305750610108546001600160a01b031633145b80612b465750610109546001600160a01b031633145b612b8a576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b6116256144c0565b60c95460ff1615612bdd576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b3360008181526101146020526040902054431015612c2c5760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b60008211612c71576040805162461bcd60e51b815260206004820152600d60248201526c135d5cdd081cd95b9908109395609a1b604482015290519081900360640190fd5b612c7a33613fb7565b60fb54604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015612cd457600080fd5b505af1158015612ce8573d6000803e3d6000fd5b505050506040513d6020811015612cfe57600080fd5b505061010a54612d1a9083906001600160a01b03163314613fd7565b5050565b612d26611e0d565b6001600160a01b0316336001600160a01b03161480612d505750610108546001600160a01b031633145b80612d665750610109546001600160a01b031633145b612daa576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b600082815261011360209081526040808320546001600160a01b03908116808552610112909352818420825163a04d481360e01b81529186166004830152825193949093859391928392859263a04d481392602480820193929182900301818787803b158015612e1957600080fd5b505af1158015612e2d573d6000803e3d6000fd5b505050506040513d6040811015612e4357600080fd5b508051602090910151610110549193509150612e60908290613bb2565b508354600181018555600085815260209020018290556002840154612e8b908263ffffffff613c9a16565b6002850155600184015461010654612ea89163ffffffff613b7016565b610106556000600185015561010554612ec7908263ffffffff613c9a16565b6101055560408051608080820183526001600160a01b0388811683526020808401878152848601878152606080870189815260008b81526101118652899020975188546001600160a01b031916961695909517875591516001870155516002860155915160039094019390935583518b8152928301859052828401869052429083015291517f9737e7b0050fbe768c31b5c3d88bbcb6fe5e72237a4b8f3d60864d9110e4d397929181900390910190a1611a1281613d92565b612f88611e0d565b6001600160a01b0316336001600160a01b03161480612fb25750610108546001600160a01b031633145b80612fc85750610109546001600160a01b031633145b61300c576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60fc5460fe546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561306657600080fd5b505af115801561307a573d6000803e3d6000fd5b505050506040513d6020811015612d1a57600080fd5b613098613a80565b6097546001600160a01b039081169116146130e8576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010880546001600160a01b0319166001600160a01b0392909216919091179055565b6101055481565b6000816131315761312a83600a63ffffffff61454116565b9050611142565b613150613140846128cb611504565b61130a858563ffffffff61454116565b9392505050565b610102544290613170906224ea0063ffffffff613c9a16565b106131c2576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b611625613dfa565b60fb54604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561321a57600080fd5b505afa15801561322e573d6000803e3d6000fd5b505050506040513d602081101561324457600080fd5b50516101075490915081101561325e576000915050611127565b61010754611cca90829063ffffffff613b7016565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b33600081815261011460205260409020544310156132ed5760405162461bcd60e51b815260040180806020018281038252602f81526020018061537e602f913960400191505060405180910390fd5b60008411613333576040805162461bcd60e51b815260206004820152600e60248201526d135d5cdd081cd95b99081e10939560921b604482015290519081900360640190fd5b61333c33613fb7565b60006133466131ca565b9050600061336d61335561131b565b61130a88613361611504565b9063ffffffff61454116565b9050818111156133c4576040805162461bcd60e51b815260206004820181905260248201527f4275726e206578636565647320617661696c61626c65206c6971756964697479604482015290519081900360640190fd5b6133ce338761459a565b61010a546000906001600160a01b031633146133f7576133f48261010e60010154613bb2565b90505b85156136645760fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561345857600080fd5b505afa15801561346c573d6000803e3d6000fd5b505050506040513d602081101561348257600080fd5b505160fb5490915061349d906001600160a01b0316826146a2565b60408051600380825260808201909252606091602082018380388339505060fb5482519293506001600160a01b0316918391506000906134d957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073b1cd6e4153b2a390cf00a6556b0fc1458c4a55338160018151811061351b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8160028151811061355d57fe5b6001600160a01b039283166020918202929092010152821663b77d239b8261358b878763ffffffff613b7016565b6040516001600160e01b031960e085901b16815260248101829052604481018c9052336064820181905260006084830181905260a4830181905260c060048401908152855160c485015285518f94839291829160e4019060208a81019102808383885b838110156136065781810151838201526020016135ee565b50505050905001975050505050505050602060405180830381600087803b15801561363057600080fd5b505af1158015613644573d6000803e3d6000fd5b505050506040513d602081101561365a57600080fd5b50610fe592505050565b60fb546001600160a01b031663a9059cbb33613686858563ffffffff613b7016565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156136d557600080fd5b505af11580156136e9573d6000803e3d6000fd5b505050506040513d60208110156136ff57600080fd5b505050505050505050565b610102544290613723906224ea0063ffffffff613c9a16565b10613775576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b61377e8161473e565b50565b613789613a80565b6097546001600160a01b039081169116146137d9576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b6137e48383836143d1565b505050565b60fd5460408051632ecd14d360e21b81526d5374616b696e675265776172647360901b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113f757600080fd5b61384d613a80565b6097546001600160a01b0390811691161461389d576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b61010c80546001600160a01b0319166001600160a01b03831617905542610100556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b6138f2611e0d565b6001600160a01b0316336001600160a01b0316148061391c5750610108546001600160a01b031633145b806139325750610109546001600160a01b031633145b613976576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61397f8161473e565b61377e613bc9565b61398f613a80565b6097546001600160a01b039081169116146139df576040805162461bcd60e51b815260206004820181905260248201526000805160206153f6833981519152604482015290519081900360640190fd5b6001600160a01b038116613a245760405162461bcd60e51b81526004018080602001828103825260268152602001806153106026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316613ac95760405162461bcd60e51b815260040180806020018281038252602481526020018061548a6024913960400191505060405180910390fd5b6001600160a01b038216613b0e5760405162461bcd60e51b81526004018080602001828103825260228152602001806153366022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600061315083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061401f565b6000613bbe8383614960565b905061114281614986565b4261010255565b600061315083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506149a1565b6000613c1f848484614a06565b613c9084613c2b613a80565b61158c856040518060600160405280602881526020016153ce602891396001600160a01b038a16600090815260666020526040812090613c69613a80565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61401f16565b5060019392505050565b600082820183811015613150576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60c95460ff1615613d3f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d75613a80565b604080516001600160a01b039092168252519081900360200190a1565b60fe546040805163534a7e1d60e11b81526004810184905290516001600160a01b039092169163a694fc3a9160248082019260009290919082900301818387803b158015613ddf57600080fd5b505af1158015613df3573d6000803e3d6000fd5b5050505050565b61010354600090815261011360209081526040808320546001600160a01b0316808452610112909252909120600181015461010654839291613e42919063ffffffff613b7016565b61010655600060018201556002810154613e5b90614b6f565b60fc5460028201546040805163a9059cbb60e01b81526001600160a01b03878116600483015260248201939093529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015613eb757600080fd5b505af1158015613ecb573d6000803e3d6000fd5b505050506040513d6020811015613ee157600080fd5b5050604080516386d1c5ff60e01b815290516000916001600160a01b038516916386d1c5ff9160048082019260209290919082900301818787803b158015613f2857600080fd5b505af1158015613f3c573d6000803e3d6000fd5b505050506040513d6020811015613f5257600080fd5b505161011054909150613f66908290613bb2565b5061010354604080519182526020820183905280517f2493012c2b3f032daebde31221d2adb14631b760cd03040957e4ba73dc20b9719281900390910190a1610103805460010190556124f7613bc9565b6001600160a01b0316600090815261011460205260409020436006019055565b600081613ff157613fee8361010e60000154613bb2565b90505b6000614013614006858463ffffffff613b7016565b61400e61131b565b613112565b90506124f733826142d3565b600081848411156140ae5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561407357818101518382015260200161405b565b50505050905090810190601f1680156140a05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061113e6140c3613a80565b8484614a06565b303b1590565b600054610100900460ff16806140e957506140e96140ca565b806140f7575060005460ff16155b6141325760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff1615801561415d576000805460ff1961ff0019909116610100171660011790555b614165614bbc565b61416f8383614c5c565b80156137e4576000805461ff0019169055505050565b600054610100900460ff168061419e575061419e6140ca565b806141ac575060005460ff16155b6141e75760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614212576000805460ff1961ff0019909116610100171660011790555b61421a614bbc565b614222614d34565b801561377e576000805461ff001916905550565b600054610100900460ff168061424f575061424f6140ca565b8061425d575060005460ff16155b6142985760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff161580156142c3576000805460ff1961ff0019909116610100171660011790555b6142cb614bbc565b614222614e2d565b6001600160a01b03821661432e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61433a600083836137e4565b60675461434d908263ffffffff613c9a16565b6067556001600160a01b038216600090815260656020526040902054614379908263ffffffff613c9a16565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b8215806143df575060328310155b61441e576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b81158061442c575060648210155b61446b576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b60198110156144af576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b61010e9290925561010f5561011055565b60c95460ff1661450e576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613d75613a80565b60008261455057506000611142565b8282028284828161455d57fe5b04146131505760405162461bcd60e51b81526004018080602001828103825260218152602001806153ad6021913960400191505060405180910390fd5b6001600160a01b0382166145df5760405162461bcd60e51b81526004018080602001828103825260218152602001806154446021913960400191505060405180910390fd5b6145eb826000836137e4565b61462e816040518060600160405280602281526020016152ee602291396001600160a01b038516600090815260656020526040902054919063ffffffff61401f16565b6001600160a01b03831660009081526065602052604090205560675461465a908263ffffffff613b7016565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b1580156146f257600080fd5b505afa158015614706573d6000803e3d6000fd5b505050506040513d602081101561471c57600080fd5b5051612d1a57612d1a6001600160a01b0383168260001963ffffffff614ed816565b600081815261011360205260409020546001600160a01b031661475f615208565b6001600160a01b038216600090815261011260209081526040918290208251815460a0938102820184019094526080810184815290939192849284918401828280156147ca57602002820191906000526020600020905b8154815260200190600101908083116147b6575b5050509183525050600182015460208201526002820154604082015260039091015460ff16151560609182015281015190915015614841576040805162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6001600160a01b03821660008181526101126020526040808220600301805460ff1916600117905580516318284de560e11b815290518593926330509bca926004808201939182900301818387803b15801561489c57600080fd5b505af11580156148b0573d6000803e3d6000fd5b50508351600092509050815b815181101561490c5761490261011160008484815181106148d957fe5b602002602001015181526020019081526020016000206003015484613c9a90919063ffffffff16565b92506001016148bc565b506040805187815290517f7fc547d30654f63b77c16f8a90f08290e8f69a076d8d5512d182b4ddbc198d039181900360200190a161010554614954908363ffffffff613b7016565b61010555505050505050565b600080821180156149715750600083115b1561114257613150838363ffffffff613bd016565b6101075461499a908263ffffffff613c9a16565b6101075550565b600081836149f05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561407357818101518382015260200161405b565b5060008385816149fc57fe5b0495945050505050565b6001600160a01b038316614a4b5760405162461bcd60e51b81526004018080602001828103825260258152602001806154656025913960400191505060405180910390fd5b6001600160a01b038216614a905760405162461bcd60e51b81526004018080602001828103825260238152602001806152cb6023913960400191505060405180910390fd5b614a9b8383836137e4565b614ade81604051806060016040528060268152602001615358602691396001600160a01b038616600090815260656020526040902054919063ffffffff61401f16565b6001600160a01b038085166000908152606560205260408082209390935590841681522054614b13908263ffffffff613c9a16565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60fe54604080516305c2fbcf60e31b81526004810184905290516001600160a01b0390921691632e17de789160248082019260009290919082900301818387803b158015613ddf57600080fd5b600054610100900460ff1680614bd55750614bd56140ca565b80614be3575060005460ff16155b614c1e5760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614222576000805460ff1961ff001990911661010017166001179055801561377e576000805461ff001916905550565b600054610100900460ff1680614c755750614c756140ca565b80614c83575060005460ff16155b614cbe5760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614ce9576000805460ff1961ff0019909116610100171660011790555b8251614cfc906068906020860190615232565b508151614d10906069906020850190615232565b50606a805460ff1916601217905580156137e4576000805461ff0019169055505050565b600054610100900460ff1680614d4d5750614d4d6140ca565b80614d5b575060005460ff16155b614d965760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614dc1576000805460ff1961ff0019909116610100171660011790555b6000614dcb613a80565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561377e576000805461ff001916905550565b600054610100900460ff1680614e465750614e466140ca565b80614e54575060005460ff16155b614e8f5760405162461bcd60e51b815260040180806020018281038252602e815260200180615416602e913960400191505060405180910390fd5b600054610100900460ff16158015614eba576000805460ff1961ff0019909116610100171660011790555b60c9805460ff19169055801561377e576000805461ff001916905550565b801580614f5e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614f3057600080fd5b505afa158015614f44573d6000803e3d6000fd5b505050506040513d6020811015614f5a57600080fd5b5051155b614f995760405162461bcd60e51b81526004018080602001828103825260368152602001806154d86036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526137e4908490614ff8826001600160a01b031661519e565b615049576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106150875780518252601f199092019160209182019101615068565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146150e9576040519150601f19603f3d011682016040523d82523d6000602084013e6150ee565b606091505b509150915081615145576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156124f75780806020019051602081101561516157600080fd5b50516124f75760405162461bcd60e51b815260040180806020018281038252602a8152602001806154ae602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906125e3575050151592915050565b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b60405180608001604052806060815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061527357805160ff19168380011785556152a0565b828001600101855582156152a0579182015b828111156152a0578251825591602001919060010190615285565b506152ac9291506152b0565b5090565b61112791905b808211156152ac57600081556001016152b656fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546756e6374696f6e2069732074656d706f726172696c79206c6f636b656420666f7220746869732061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220715bcc878bae8e118e43a4d0ca69612bc8f3ca49c3bcd797711e2ad48a28153264736f6c63430006020033
Deployed Bytecode Sourcemap
42307:30202:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71323:10;71337:9;71323:23;;71315:54;;;;;-1:-1:-1;;;71315:54:0;;;;;;;;;;;;-1:-1:-1;;;71315:54:0;;;;;;;;;;;;;;;42307:30202;;;;;67797:219;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67797:219:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;67797:219:0;;;;;;;;;;;;;;;;;:::i;64919:223::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64919:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64919:223:0;-1:-1:-1;;;;;64919:223:0;;:::i;21790:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21790:83: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;21790:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23896:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23896:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23896:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;62334:771;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62334:771:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62334:771:0;;:::i;66344:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66344:117:0;;;:::i;:::-;;;;;;;;;;;;;;;;22865:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22865:100:0;;;:::i;72279:227::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72279:227:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;72279:227:0;;;;;;;;;;;;;;;;;:::i;43413:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43413:37:0;;;:::i;63113:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63113:261:0;;;:::i;:::-;;;;-1:-1:-1;;;;;63113:261:0;;;;;;;;;;;;;;22717:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22717:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64590:321;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64590:321:0;;;:::i;66469:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66469:195:0;;;:::i;25269:218::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25269:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25269:218:0;;;;;;;;:::i;68843:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68843:78:0;;;:::i;44277:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44277:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44277:53:0;;:::i;:::-;;;;-1:-1:-1;;;;;44277:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43589:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43589:34:0;;;:::i;51527:1649::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51527:1649:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51527:1649:0;;;;;;;;:::i;68548:160::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68548:160:0;;;:::i;12849:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12849:78:0;;;:::i;44068:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44068:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;65150:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65150:298:0;;;:::i;69841:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69841:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;69841:122:0;-1:-1:-1;;;;;69841:122:0;;:::i;23028:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23028:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23028:119:0;-1:-1:-1;;;;;23028:119:0;;:::i;10944:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10944:148:0;;;:::i;66672:252::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66672:252:0;;;:::i;64064:223::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64064:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64064:223:0;-1:-1:-1;;;;;64064:223:0;;:::i;43534:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43534:46:0;;;:::i;59237:162::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59237:162:0;;;:::i;69735:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69735:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;69735:98:0;-1:-1:-1;;;;;69735:98:0;;:::i;10302:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10302:79:0;;;:::i;63859:197::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63859:197:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63859:197:0;-1:-1:-1;;;;;63859:197: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;63859:197:0;;;;;;;;;;;;;;;;;43369:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43369:35:0;;;:::i;57777:1361::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57777:1361:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57777:1361:0;;;;;;;:::i;21992:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21992:87:0;;;:::i;43457:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43457:29:0;;;:::i;44816:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44816:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44816:50:0;-1:-1:-1;;;;;44816:50:0;;:::i;47034:829::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47034:829:0;;:::i;44576:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44576:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44576:54:0;;:::i;25990:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25990:269:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25990:269:0;;;;;;;;:::i;72065:206::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72065:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;72065:206:0;;;;;;;;:::i;55478:1807::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55478:1807:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55478:1807:0;;;;;;;:::i;45548:1064::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45548:1064:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;45548:1064:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;45548:1064:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45548:1064:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;45548:1064:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45548:1064:0;;-1:-1:-1;45548:1064:0;;-1:-1:-1;;;;;45548:1064:0:i;68929:84::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68929:84:0;;;:::i;48001:338::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48001:338:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48001:338:0;;:::i;53489:1592::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53489:1592:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53489:1592:0;;;;;;-1:-1:-1;;;;;53489:1592:0;;:::i;68716:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68716:119:0;;;:::i;69554:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69554:94:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;69554:94:0;-1:-1:-1;;;;;69554:94:0;;:::i;43495:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43495:32:0;;;:::i;48813:370::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48813:370:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48813:370:0;;;;;;;:::i;59407:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59407:119:0;;;:::i;66932:224::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66932:224:0;;;:::i;23598:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23598:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23598:151:0;;;;;;;;;;:::i;49466:1510::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49466:1510:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49466:1510:0;;;;;;;;;;;;;;:::i;61008:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61008:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61008:150:0;;:::i;70181:233::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70181:233:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;70181:233:0;;;;;;;;;;;;:::i;63382:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63382:164:0;;;:::i;64295:287::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64295:287:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64295:287:0;-1:-1:-1;;;;;64295:287:0;;:::i;60846:154::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60846:154:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60846:154:0;;:::i;11247:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11247:244:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11247:244:0;-1:-1:-1;;;;;11247:244:0;;:::i;67797:219::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;67965:16:::1;-1:-1:-1::0;;;;;67947:47:0::1;;67995:2;67999:8;67947:61;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;67947:61:0::1;-1:-1:-1::0;;;;;67947:61:0::1;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;67947:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;67947:61:0;;;;67797:219:::0;;;:::o;64919:223::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;65002:23:::1;:36:::0;;-1:-1:-1;;;;;;65002:36:0::1;-1:-1:-1::0;;;;;65002:36:0;::::1;;::::0;;65085:15:::1;65049:33;:51:::0;65116:18:::1;::::0;::::1;::::0;-1:-1:-1;;65116:18:0::1;64919:223:::0;:::o;21790:83::-;21860:5;21853:12;;;;;;;;-1:-1:-1;;21853:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21827:13;;21853:12;;21860:5;;21853:12;;21860:5;21853:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21790:83;;:::o;23896:169::-;23979:4;23996:39;24005:12;:10;:12::i;:::-;24019:7;24028:6;23996:8;:39::i;:::-;-1:-1:-1;24053:4:0;23896:169;;;;;:::o;62334:771::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;62458:22:::1;::::0;62415:20:::1;62438:43:::0;;;:19:::1;:43;::::0;;;;;-1:-1:-1;;;;;62438:43:0::1;::::0;;;62619:53:::1;62438:43:::0;62619:39:::1;:53::i;:::-;62717:31;::::0;62566:106;;-1:-1:-1;62717:90:0::1;::::0;62566:106;62717:90:::1;:35;:90;:::i;:::-;62683:31;:124:::0;-1:-1:-1;;;;;62818:32:0;;::::1;62885:1;62818:32:::0;;;:18:::1;:32;::::0;;;;;;;:64:::1;;:68:::0;;;62917:22;;-1:-1:-1;;;62917:22:0;;;;62885:1;;62917:20;::::1;::::0;::::1;::::0;:22:::1;::::0;;::::1;::::0;62818:32;;62917:22;;;;;;62885:1;62917:20;:22;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;62917:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;62917:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;62917:22:0;62985:20;;62917:22;;-1:-1:-1;62950:56:0::1;::::0;62917:22;;62950:25:::1;:56::i;:::-;;63017:29;:27;:29::i;:::-;63064:33;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;69243:1;;;;62334:771:::0;:::o;66344:117::-;66399:7;66426:27;43004:2;66426:8;:6;:8::i;:::-;:12;:27;:12;:27;:::i;:::-;66419:34;;66344:117;:::o;22865:100::-;22945:12;;22865:100;:::o;72279:227::-;-1:-1:-1;;;;;71652:30:0;;72429:4;71652:30;;;:15;:30;;;;;;72412:6;;71686:12;-1:-1:-1;71652:46:0;71630:143;;;;-1:-1:-1;;;71630:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72453:45:::1;72472:6;72480:9;72491:6;72453:18;:45::i;:::-;72446:52:::0;72279:227;-1:-1:-1;;;;;72279:227:0:o;43413:37::-;;;;:::o;63113:261::-;63300:16;;:51;;;-1:-1:-1;;;63300:51:0;;-1:-1:-1;;;63300:51:0;;;;;;63203:20;;-1:-1:-1;;;;;63300:16:0;;:26;;:51;;;;;;;;;;;;;;:16;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;63300:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63300:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63300:51:0;;-1:-1:-1;63113:261:0;:::o;22717:83::-;22783:9;;;;22717:83;:::o;64590:321::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;64733:32:::1;::::0;:52:::1;::::0;43114:6:::1;64733:52;:36;:52;:::i;:::-;64698:15;:87;64676:145;;;::::0;;-1:-1:-1;;;64676:145:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;64676:145:0;;;;;;;;;;;;;::::1;;64866:37;::::0;64832:31:::1;:71:::0;;-1:-1:-1;;;;;;64832:71:0::1;-1:-1:-1::0;;;;;64866:37:0;;::::1;64832:71:::0;;;::::1;::::0;;64590:321::o;66469:195::-;66508:7;66548:108;66623:18;:16;:18::i;:::-;66548:52;66570:29;:27;:29::i;:::-;66548:17;;;:52;:21;:52;:::i;:::-;:56;:108;:56;:108;:::i;25269:218::-;25357:4;25374:83;25383:12;:10;:12::i;:::-;25397:7;25406:50;25445:10;25406:11;:25;25418:12;:10;:12::i;:::-;-1:-1:-1;;;;;25406:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;25406:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;:::-;25374:8;:83::i;68843:78::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;68905:8:::1;:6;:8::i;:::-;68843:78::o:0;44277:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44277:53:0;;;;;;;:::o;43589:34::-;;;;:::o;51527:1649::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;51721:14:::1;::::0;51704:41:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;51704:41:0;;;;;;51694:52;;;;::::1;::::0;;;;51804:12:::1;::::0;51830:31:::1;::::0;-1:-1:-1;;;51804:58:0;;;;;;;;;-1:-1:-1;;;;;51830:31:0;;::::1;51804:58:::0;;;;;;51694:52;;51658:12:::1;::::0;51804;;;::::1;::::0;:19:::1;::::0;:58;;;;;51704:41;;51804:58;;;;;51658:12;51804;:58;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;51804:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;51804:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;51804:58:0;51875:3:::1;::::0;:45:::1;::::0;;-1:-1:-1;;;51875:45:0;;-1:-1:-1;;;;;51875:45:0;;::::1;;::::0;::::1;::::0;;;;;;;;;51804:58;;-1:-1:-1;51875:3:0;::::1;::::0;:12:::1;::::0;:45;;;;;51804:58:::1;::::0;51875:45;;;;;;;;:3:::1;::::0;:45;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;51875:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;51875:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;52071:16:0::1;::::0;52138:3:::1;::::0;52160:4:::1;::::0;51966:278:::1;::::0;;-1:-1:-1;;;51966:278:0;;-1:-1:-1;;;;;52071:16:0;;::::1;51966:278;::::0;::::1;::::0;52114:4:::1;51966:278:::0;;;;52138:3;;::::1;51966:278:::0;;;;52160:4;;::::1;51966:278:::0;;;;;;::::1;::::0;;;;;;;;;;;51933:17:::1;::::0;51966:86;::::1;::::0;::::1;::::0;:278;;;;;51875:45:::1;::::0;51966:278;;;;;;;51933:17;51966:86;:278;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;51966:278:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;51966:278:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;51966:278:0;;-1:-1:-1;52257:25:0::1;;:::i;:::-;-1:-1:-1::0;52298:216:0::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;52298:216:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;52640:14:::1;::::0;52532:163;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;52669:15:::1;52532:163:::0;;;;;;;;;52298:216;;52532:163:::1;::::0;;;;;;;;::::1;52708:29;::::0;;;:18:::1;:29;::::0;;;;;;;:42;;;;-1:-1:-1;;;;;52708:42:0;;::::1;-1:-1:-1::0;;;;;;52708:42:0;;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;52806;;::::1;::::0;;;:18:::1;:42:::0;;;;;27:10:-1;;23:18;;::::1;45:23:::0;;52859:36:0;;;;;;::::1;::::0;;;52906:21;;::::1;:31:::0;;;52970:14:::1;::::0;;52950:35;;:19:::1;:35:::0;;;;;;;:60;;;;::::1;::::0;;::::1;::::0;;;53021:16;;::::1;::::0;;53070:17:::1;::::0;:30:::1;::::0;52930:7;53070:30:::1;:21;:30;:::i;:::-;53050:17;:50:::0;53113:15:::1;53120:7:::0;53113:6:::1;:15::i;:::-;53139:29;:27;:29::i;68548:160::-:0;68654:16;;:45;;;-1:-1:-1;;;68654:45:0;;-1:-1:-1;;;68654:45:0;;;;;;68605:14;;-1:-1:-1;;;;;68654:16:0;;:26;;:45;;;;;;;;;;;;;;:16;:45;;;5:2:-1;;;;30:1;27;20:12;12849:78:0;12912:7;;;;12849:78;:::o;44068:30::-;;;;;;;;:::o;65150:298::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;65279:33:::1;::::0;:53:::1;::::0;43114:6:::1;65279:53;:37;:53;:::i;:::-;65244:15;:88;65222:146;;;::::0;;-1:-1:-1;;;65222:146:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;65222:146:0;;;;;;;;;;;;;::::1;;65416:23;::::0;65379:16:::1;:61:::0;;-1:-1:-1;;;;;;65379:61:0::1;-1:-1:-1::0;;;;;65416:23:0;;::::1;65379:61:::0;;;::::1;::::0;;65150:298::o;69841:122::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;69923:14:::1;:32:::0;;-1:-1:-1;;;;;;69923:32:0::1;-1:-1:-1::0;;;;;69923:32:0;;;::::1;::::0;;;::::1;::::0;;69841:122::o;23028:119::-;-1:-1:-1;;;;;23121:18:0;23094:7;23121:18;;;:9;:18;;;;;;;23028:119::o;10944:148::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;11035:6:::1;::::0;11014:40:::1;::::0;11051:1:::1;::::0;-1:-1:-1;;;;;11035:6:0::1;::::0;11014:40:::1;::::0;11051:1;;11014:40:::1;11065:6;:19:::0;;-1:-1:-1;;;;;;11065:19:0::1;::::0;;10944:148::o;66672:252::-;66826:20;;66790:31;;66732:7;;;;66790:57;;;:35;:57;:::i;:::-;66865:31;;66752:95;;-1:-1:-1;66865:51:0;;66752:95;66865:51;:35;:51;:::i;:::-;66858:58;;;66672:252;:::o;64064:223::-;-1:-1:-1;;;;;64215:32:0;64183:7;64215:32;;;:18;:32;;;;;:64;;;;64064:223::o;43534:46::-;;;;:::o;59237:162::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;59318:33:::1;:31;:33::i;:::-;59362:29;:27;:29::i;69735:98::-:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;69805:8:::1;:20:::0;;-1:-1:-1;;;;;;69805:20:0::1;-1:-1:-1::0;;;;;69805:20:0;;;::::1;::::0;;;::::1;::::0;;69735:98::o;10302:79::-;10367:6;;-1:-1:-1;;;;;10367:6:0;10302:79;:::o;63859:197::-;-1:-1:-1;;;;;64005:32:0;;;;;;:18;:32;;;;;;;;;63998:50;;;;;;;;;;;;;;;;;63964:16;;63998:50;;;64005:32;63998:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63859:197;;;:::o;43369:35::-;;;;:::o;57777:1361::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;57987:22:::1;;57960:23;:49;;57938:112;;;::::0;;-1:-1:-1;;;57938:112:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;57938:112:0;;;;;;;;;;;;;::::1;;58094:14;;58069:21;:39;;58061:65;;;::::0;;-1:-1:-1;;;58061:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;58061:65:0;;;;;;;;;;;;;::::1;;58139:23;58165:32;:30;:32::i;:::-;58139:58:::0;-1:-1:-1;58210:27:0::1;58248:37;58329:23:::0;58298:833:::1;58371:21;58367:1;:25;58298:833;;;58450:42;58469:22:::0;;;:19:::1;:22;::::0;;;;;;;;-1:-1:-1;;;;;58469:22:0::1;58450:42:::0;;:18:::1;:42:::0;;;;;;58437:66;;;;;;::::1;::::0;;;;;;;;;;58450:42;;58437:66;::::1;58450:42:::0;58437:66;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;58437:66:0;;-1:-1:-1;58525:9:0::1;::::0;-1:-1:-1;;;;58520:600:0::1;58544:10;:17;58540:1;:21;58520:600;;;58625:2;-1:-1:-1::0;;;;;58625:24:0::1;;58672:10;58683:1;58672:13;;;;;;;;;;;;;;42904:7;58734:15;58625:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;58625:143:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;58625:143:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;58625:143:0;58834:13;;58625:143;;-1:-1:-1;58789:23:0::1;::::0;58815:18:::1;::::0;58789:23;;58834:10;;58845:1;;58834:13;::::1;;;;;;;;;;;58815:33;;;;;;;;;;;58789:59;;58889:133;58992:29;58889:76;58933:7;:31;;;58889:17;;:43;;:76;;;;:::i;:133::-;58869:17;:153:::0;59041:31:::1;;:63:::0;;;58563:3:::1;;58520:600;;;-1:-1:-1::0;58407:3:0::1;;58298:833;;;;69243:1;;;57777:1361:::0;;:::o;21992:87::-;22064:7;22057:14;;;;;;;;-1:-1:-1;;22057:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22031:13;;22057:14;;22064:7;;22057:14;;22064:7;22057:14;;;;;;;;;;;;;;;;;;;;;;;;43457:29;;;;:::o;44816:50::-;;;;;;;;;;;;;:::o;47034:829::-;13086:7;;;;13085:8;13077:37;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;;;;47144:10:::1;71652:30;::::0;;;:15:::1;:30;::::0;;;;;71686:12:::1;-1:-1:-1::0;71652:46:0::1;71630:143;;;;-1:-1:-1::0;;;71630:143:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47192:1:::2;47180:9;:13;47172:39;;;::::0;;-1:-1:-1;;;47172:39:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47172:39:0;;;;;;;;;;;;;::::2;;47222:16;47227:10;47222:4;:16::i;:::-;47275;::::0;;47289:1:::2;47275:16:::0;;;;;::::2;::::0;;;47251:21:::2;::::0;47275:16:::2;::::0;::::2;47251:21:::0;;105:10:-1::2;47275:16:0::0;88:34:-1::2;136:17;::::0;-1:-1;47275:16:0::2;47251:40;;47312:42;47302:4;47307:1;47302:7;;;;;;;;;;;;;:52;-1:-1:-1::0;;;;;47302:52:0::2;;;-1:-1:-1::0;;;;;47302:52:0::2;;;::::0;::::2;47375:42;47365:4;47370:1;47365:7;;;;;;;;-1:-1:-1::0;;;;;47365:52:0;;::::2;:7;::::0;;::::2;::::0;;;;;:52;47464:3:::2;::::0;47446:7;;47464:3;::::2;::::0;47446:4;;47451:1:::2;::::0;47446:7;::::2;;;;;-1:-1:-1::0;;;;;47446:22:0;;::::2;:7;::::0;;::::2;::::0;;;;;;:22;;;;47534:16:::2;::::0;:45:::2;::::0;;-1:-1:-1;;;47534:45:0;;-1:-1:-1;;;47534:45:0::2;::::0;::::2;::::0;;;47481:22:::2;::::0;47534:16;;;::::2;::::0;:26:::2;::::0;:45;;;;;;;;;;:16;:45;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;47534:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;47534:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;47534:45:0;47519:287:::2;::::0;-1:-1:-1;;;47519:287:0;;47620:9:::2;47519:287:::0;;;;;;;;;;;;43943:1:::2;47519:287:::0;;;;;;;;;;;;;;;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;47519:93:0;;::::2;::::0;::::2;::::0;47649:4;;47620:9;;47700;;43943:1;;;;;;47519:287;;;;;;;;47534:45:::2;47519:287:::0;;::::2;::::0;::::2;::::0;;;43943:1;8:100:-1::2;33:3;30:1;27:10;8:100;;;90:11:::0;;::::2;84:18:::0;71:11;;::::2;64:39:::0;52:2:::2;45:10;8:100;;;12:14;47519:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::2;5:2;47519:287:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;47519:287:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;47519:287:0;;-1:-1:-1;47819:36:0::2;47519:287:::0;47849:5:::2;47819:13;:36::i;:::-;71784:1;;13125::::1;47034:829:::0;:::o;44576:54::-;;;;;;;;;;;;-1:-1:-1;;;;;44576:54:0;;:::o;25990:269::-;26083:4;26100:129;26109:12;:10;:12::i;:::-;26123:7;26132:96;26171:15;26132:96;;;;;;;;;;;;;;;;;:11;:25;26144:12;:10;:12::i;:::-;-1:-1:-1;;;;;26132:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;26132:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;72065:206::-;72171:10;72201:4;71652:30;;;:15;:30;;;;;;72201:4;;72171:10;71686:12;-1:-1:-1;71652:46:0;71630:143;;;;-1:-1:-1;;;71630:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72230:33:::1;72245:9;72256:6;72230:14;:33::i;:::-;72223:40:::0;72065:206;-1:-1:-1;;;;72065:206:0:o;55478:1807::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;55702:22:::1;;55675:23;:49;;55653:112;;;::::0;;-1:-1:-1;;;55653:112:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;55653:112:0;;;;;;;;;;;;;::::1;;55809:14;;55784:21;:39;;55776:65;;;::::0;;-1:-1:-1;;;55776:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;55776:65:0;;;;;;;;;;;;;::::1;;55898:23;55874:21;:47;55852:110;;;::::0;;-1:-1:-1;;;55852:110:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;55852:110:0;;;;;;;;;;;;;::::1;;55975:30;56008:27;:25;:27::i;:::-;55975:60;;56048:47;56106:46:::0;56170:9:::1;56182:22;;56170:34;;56165:743;56210:14;;56206:1;:18;56165:743;;;56246:20;56269:22:::0;;;:19:::1;:22;::::0;;;;;;;;-1:-1:-1;;;;;56269:22:0::1;56428:32:::0;;;:18:::1;:32:::0;;;;;;56269:22;56428:64:::1;::::0;56348:159:::1;::::0;:39;;:159:::1;:61;:159;:::i;:::-;56306:201;;56524:35;56579:14;-1:-1:-1::0;;;;;56579:29:0::1;;56609:12;56579:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;56579:43:0::1;-1:-1:-1::0;;;;;56579:43:0::1;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;56579:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;56579:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;56579:43:0;-1:-1:-1;;;;;56639:32:0;::::1;;::::0;;;:18:::1;56579:43;56639:32:::0;;;;:82:::1;;:112:::0;;;56579:43;-1:-1:-1;56807:89:0::1;:38:::0;56579:43;56807:89:::1;:60;:89;:::i;:::-;56766:130:::0;-1:-1:-1;;;56226:3:0::1;;56165:743;;;-1:-1:-1::0;56957:31:0::1;::::0;56925:157:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;57056:15:::1;56925:157:::0;;;;;::::1;::::0;;;;;;;::::1;57129:148;57237:39;57129:89;57179:38;57129:31;;:49;;:89;;;;:::i;:::-;:107:::0;:148:::1;:107;:148;:::i;:::-;57095:31;:182:::0;-1:-1:-1;;;;;55478:1807:0:o;45548:1064::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;46038:29:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;46038:29:0::1;;::::0;46059:7:::1;46038:12;:29::i;:::-;46078:16;:14;:16::i;:::-;46105:17;:15;:17::i;:::-;46141:4;46135:3;;:10;;;;;-1:-1:-1::0;;;;;46135:10:0::1;;;;;-1:-1:-1::0;;;;;46135:10:0::1;;;;;;46163:5;46156:4;;:12;;;;;-1:-1:-1::0;;;;;46156:12:0::1;;;;;-1:-1:-1::0;;;;;46156:12:0::1;;;;;;46198:17;46179:16;;:36;;;;;-1:-1:-1::0;;;;;46179:36:0::1;;;;;-1:-1:-1::0;;;;;46179:36:0::1;;;;;;46245:17;46226:16;;:36;;;;;-1:-1:-1::0;;;;;46226:36:0::1;;;;;-1:-1:-1::0;;;;;46226:36:0::1;;;;;;46288:13;46273:12;;:28;;;;;-1:-1:-1::0;;;;;46273:28:0::1;;;;;-1:-1:-1::0;;;;;46273:28:0::1;;;;;;46346:32;46312:31;;:66;;;;;-1:-1:-1::0;;;;;46312:66:0::1;;;;;-1:-1:-1::0;;;;;46312:66:0::1;;;;;;46408:15;46391:14;;:32;;;;;-1:-1:-1::0;;;;;46391:32:0::1;;;;;-1:-1:-1::0;;;;;46391:32:0::1;;;;;;46436:31;46442:10;46454:12;46436:5;:31::i;:::-;46478:67;46494:15;46511;46528:16;46478:15;:67::i;:::-;46556:29;:27;:29::i;:::-;46596:8;:6;:8::i;:::-;6801:14:::0;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;6797:57;45548:1064;;;;;;;;;;;;;:::o;68929:84::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;68995:10:::1;:8;:10::i;48001:338::-:0;13086:7;;;;13085:8;13077:37;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;;;;48103:10:::1;71652:30;::::0;;;:15:::1;:30;::::0;;;;;71686:12:::1;-1:-1:-1::0;71652:46:0::1;71630:143;;;;-1:-1:-1::0;;;71630:143:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48151:1:::2;48139:9;:13;48131:39;;;::::0;;-1:-1:-1;;;48131:39:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48131:39:0;;;;;;;;;;;;;::::2;;48181:16;48186:10;48181:4;:16::i;:::-;48210:3;::::0;:54:::2;::::0;;-1:-1:-1;;;48210:54:0;;48227:10:::2;48210:54;::::0;::::2;::::0;48247:4:::2;48210:54:::0;;;;;;;;;;;;-1:-1:-1;;;;;48210:3:0;;::::2;::::0;:16:::2;::::0;:54;;;;;::::2;::::0;;;;;;;;;:3:::2;::::0;:54;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;48210:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;48210:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;;48316:14:0::2;::::0;48277:54:::2;::::0;48291:9;;-1:-1:-1;;;;;48316:14:0::2;48302:10;:28;48277:13;:54::i;:::-;13125:1:::1;48001:338:::0;:::o;53489:1592::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;53615:20:::1;53638:31:::0;;;:19:::1;:31;::::0;;;;;;;;-1:-1:-1;;;;;53638:31:0;;::::1;53710:32:::0;;;:18:::1;:32:::0;;;;;;53888:34;;-1:-1:-1;;;53888:34:0;;;;::::1;;::::0;::::1;::::0;;;53638:31;;53710:32;;53638:31;;53615:20;;;;53638:31;;53888:23:::1;::::0;:34;;;;;53638:31;53888:34;;;;;;53615:20;53638:31;53888:34;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;53888:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;53888:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;53888:34:0;;::::1;::::0;;::::1;::::0;54106:20;;53888:34;;-1:-1:-1;53888:34:0;-1:-1:-1;54067:60:0::1;::::0;53888:34;;54067:25:::1;:60::i;:::-;-1:-1:-1::0;27:10;;39:1:::1;23:18:::0;::::1;45:23:::0;;54140:20:0::1;:39:::0;;;::::1;::::0;;::::1;::::0;;;54214:21:::1;::::0;::::1;::::0;:38:::1;::::0;54240:11;54214:38:::1;:25;:38;:::i;:::-;54190:21;::::0;::::1;:62:::0;54387:41:::1;::::0;::::1;::::0;54337:31:::1;::::0;:102:::1;::::0;::::1;:35;:102;:::i;:::-;54303:31;:136:::0;54494:1:::1;54450:41;::::0;::::1;:45:::0;54573:17:::1;::::0;:34:::1;::::0;54595:11;54573:34:::1;:21;:34;:::i;:::-;54553:17;:54:::0;54655:197:::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;54655:197:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;-1:-1:-1;54620:32:0;;;:18:::1;:32:::0;;;;;:232;;;;-1:-1:-1;;;;;;54620:232:0::1;::::0;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;54620:232:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;54870:131;;;;;;;::::1;::::0;;;;;;;;;54975:15:::1;54870:131:::0;;;;;;::::1;::::0;;;;;;;;;::::1;55014:19;55021:11;55014:6;:19::i;68716:119::-:0;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;68778:4:::1;::::0;68799:16:::1;::::0;68778:49:::1;::::0;;-1:-1:-1;;;68778:49:0;;-1:-1:-1;;;;;68799:16:0;;::::1;68778:49;::::0;::::1;::::0;-1:-1:-1;;68778:49:0;;;;;;:4;;;::::1;::::0;:12:::1;::::0;:49;;;;;::::1;::::0;;;;;;;;:4:::1;::::0;:49;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;68778:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;68778:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;69554:94:0::0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;69622:7:::1;:18:::0;;-1:-1:-1;;;;;;69622:18:0::1;-1:-1:-1::0;;;;;69622:18:0;;;::::1;::::0;;;::::1;::::0;;69554:94::o;43495:32::-;;;;:::o;48813:370::-;48935:18;48975:16;48971:87;;49013:45;:14;43180:2;49013:45;:18;:45;:::i;:::-;49006:52;;;;48971:87;49084:91;49136:28;49149:14;49136:8;:6;:8::i;:28::-;49084:33;49085:14;49105:11;49084:33;:20;:33;:::i;:91::-;49071:104;48813:370;-1:-1:-1;;;48813:370:0:o;59407:119::-;69325:20;;69377:15;;69325:49;;43240:7;69325:49;:24;:49;:::i;:::-;:67;69303:145;;;;;-1:-1:-1;;;69303:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59485:33:::1;:31;:33::i;66932:224::-:0;67018:3;;:28;;;-1:-1:-1;;;67018:28:0;;67040:4;67018:28;;;;;;66981:7;;;;-1:-1:-1;;;;;67018:3:0;;;;:13;;:28;;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;67018:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67018:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67018:28:0;67070:19;;67018:28;;-1:-1:-1;67061:28:0;;67057:42;;;67098:1;67091:8;;;;;67057:42;67128:19;;67117:31;;:6;;:31;:10;:31;:::i;23598:151::-;-1:-1:-1;;;;;23714:18:0;;;23687:7;23714:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23598:151::o;49466:1510::-;49591:10;71652:30;;;;:15;:30;;;;;;71686:12;-1:-1:-1;71652:46:0;71630:143;;;;-1:-1:-1;;;71630:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49637:1:::1;49622:12;:16;49614:43;;;::::0;;-1:-1:-1;;;49614:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;49614:43:0;;;;;;;;;;;;;::::1;;49668:16;49673:10;49668:4;:16::i;:::-;49697:21;49721:18;:16;:18::i;:::-;49697:42;;49750:18;49771:45;49802:13;:11;:13::i;:::-;49771:26;49784:12;49771:8;:6;:8::i;:::-;:12:::0;:26:::1;:12;:26;:::i;:45::-;49750:66;;49863:13;49849:10;:27;;49827:109;;;::::0;;-1:-1:-1;;;49827:109:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;49949:37;49961:10;49973:12;49949:11;:37::i;:::-;50039:14;::::0;49999:11:::1;::::0;-1:-1:-1;;;;;50039:14:0::1;50025:10;:28;50021:125;;50076:58;50102:10;50114:11;:19;;;50076:25;:58::i;:::-;50070:64;;50021:125;50162:12;50158:811;;;50239:16;::::0;:45:::1;::::0;;-1:-1:-1;;;50239:45:0;;-1:-1:-1;;;50239:45:0::1;::::0;::::1;::::0;;;50191:28:::1;::::0;-1:-1:-1;;;;;50239:16:0::1;::::0;:26:::1;::::0;:45;;;;;::::1;::::0;;;;;;;;:16;:45;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;50239:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;50239:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;50239:45:0;50319:3:::1;::::0;50239:45;;-1:-1:-1;50299:46:0::1;::::0;-1:-1:-1;;;;;50319:3:0::1;50239:45:::0;50299:19:::1;:46::i;:::-;50423:16;::::0;;50437:1:::1;50423:16:::0;;;;;::::1;::::0;;;50399:21:::1;::::0;50423:16:::1;::::0;::::1;50399:21:::0;;105:10:-1::1;50423:16:0::0;88:34:-1::1;-1:-1:::0;;50472:3:0::1;::::0;50454:7;;;;-1:-1:-1;;;;;;50472:3:0::1;::::0;50454:7;;-1:-1:-1;50472:3:0::1;::::0;50454:7:::1;;;;;;;;;:22;-1:-1:-1::0;;;;;50454:22:0::1;;;-1:-1:-1::0;;;;;50454:22:0::1;;;::::0;::::1;50501:42;50491:4;50496:1;50491:7;;;;;;;;;;;;;:52;-1:-1:-1::0;;;;;50491:52:0::1;;;-1:-1:-1::0;;;;;50491:52:0::1;;;::::0;::::1;50586:42;50576:4;50581:1;50576:7;;;;;;;;-1:-1:-1::0;;;;;50576:52:0;;::::1;:7;::::0;;::::1;::::0;;;;;:52;50645:50;::::1;;50714:4:::0;50737:19:::1;:10:::0;50752:3;50737:19:::1;:14;:19;:::i;:::-;50645:234;::::0;-1:-1:-1;;;;;;50645:234:0::1;::::0;;;;;;;;;;;;;;;;;;50803:10:::1;50645:234:::0;;;;;;43943:1:::1;50645:234:::0;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;50775:9;;43943:1;;50645:234;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;43943:1;8:100:-1::1;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;50645:234:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;50645:234:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;50645:234:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;50158:811:0::1;::::0;-1:-1:-1;;;50158:811:0::1;;50912:3;::::0;-1:-1:-1;;;;;50912:3:0::1;:12;50925:10;50937:19;:10:::0;50952:3;50937:19:::1;:14;:19;:::i;:::-;50912:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;50912:45:0::1;-1:-1:-1::0;;;;;50912:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;50912:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;50912:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;71784:1:0::1;;;49466:1510:::0;;;;:::o;61008:150::-;69325:20;;69377:15;;69325:49;;43240:7;69325:49;:24;:49;:::i;:::-;:67;69303:145;;;;;-1:-1:-1;;;69303:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;61125:25:::1;61139:10;61125:13;:25::i;:::-;61008:150:::0;:::o;70181:233::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;70342:64:::1;70358:14;70374;70390:15;70342;:64::i;:::-;70181:233:::0;;;:::o;63382:164::-;63491:16;;:46;;;-1:-1:-1;;;63491:46:0;;-1:-1:-1;;;63491:46:0;;;;;;63440:15;;-1:-1:-1;;;;;63491:16:0;;:26;;:46;;;;;;;;;;;;;;:16;:46;;;5:2:-1;;;;30:1;27;20:12;64295:287:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;64422:37:::1;:57:::0;;-1:-1:-1;;;;;;64422:57:0::1;-1:-1:-1::0;;;;;64422:57:0;::::1;;::::0;;64525:15:::1;64422:57;64490:50:::0;64556:18:::1;::::0;::::1;::::0;-1:-1:-1;;64556:18:0::1;64295:287:::0;:::o;60846:154::-;69096:7;:5;:7::i;:::-;-1:-1:-1;;;;;69082:21:0;:10;-1:-1:-1;;;;;69082:21:0;;:63;;;-1:-1:-1;69138:7:0;;-1:-1:-1;;;;;69138:7:0;69124:10;:21;69082:63;:106;;;-1:-1:-1;69180:8:0;;-1:-1:-1;;;;;69180:8:0;69166:10;:22;69082:106;69060:172;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;-1:-1:-1;;;69060:172:0;;;;;;;;;;;;;;;60927:25:::1;60941:10;60927:13;:25::i;:::-;60963:29;:27;:29::i;11247:244::-:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11336:22:0;::::1;11328:73;;;;-1:-1:-1::0;;;11328:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11438:6;::::0;11417:38:::1;::::0;-1:-1:-1;;;;;11417:38:0;;::::1;::::0;11438:6:::1;::::0;11417:38:::1;::::0;11438:6:::1;::::0;11417:38:::1;11466:6;:17:::0;;-1:-1:-1;;;;;;11466:17:0::1;-1:-1:-1::0;;;;;11466:17:0;;;::::1;::::0;;;::::1;::::0;;11247:244::o;8578:106::-;8666:10;8578:106;:::o;29137:346::-;-1:-1:-1;;;;;29239:19:0;;29231:68;;;;-1:-1:-1;;;29231:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29318:21:0;;29310:68;;;;-1:-1:-1;;;29310:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29391:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;29443:32;;;;;;;;;;;;;;;;;29137:346;;;:::o;1396:136::-;1454:7;1481:43;1485:1;1488;1481:43;;;;;;;;;;;;;;;;;:3;:43::i;67560:229::-;67667:11;67702:34;67716:6;67724:11;67702:13;:34::i;:::-;67696:40;;67747:34;67777:3;67747:29;:34::i;71165:104::-;71246:15;71223:20;:38;71165:104::o;3209:132::-;3267:7;3294:39;3298:1;3301;3294:39;;;;;;;;;;;;;;;;;:3;:39::i;24539:321::-;24645:4;24662:36;24672:6;24680:9;24691:6;24662:9;:36::i;:::-;24709:121;24718:6;24726:12;:10;:12::i;:::-;24740:89;24778:6;24740:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24740:19:0;;;;;;:11;:19;;;;;;24760:12;:10;:12::i;:::-;-1:-1:-1;;;;;24740:33:0;;;;;;;;;;;;-1:-1:-1;24740:33:0;;;:89;;:37;:89;:::i;24709:121::-;-1:-1:-1;24848:4:0;24539:321;;;;;:::o;940:181::-;998:7;1030:5;;;1054:6;;;;1046:46;;;;;-1:-1:-1;;;1046:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13400:118;13086:7;;;;13085:8;13077:37;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;;;;13460:7:::1;:14:::0;;-1:-1:-1;;13460:14:0::1;13470:4;13460:14;::::0;;13490:20:::1;13497:12;:10;:12::i;:::-;13490:20;::::0;;-1:-1:-1;;;;;13490:20:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;13400:118::o:0;65837:91::-;65889:16;;:31;;;-1:-1:-1;;;65889:31:0;;;;;;;;;;-1:-1:-1;;;;;65889:16:0;;;;:22;;:31;;;;;:16;;:31;;;;;;;;:16;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;65889:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65889:31:0;;;;65837:91;:::o;59534:1109::-;59639:22;;59596:20;59619:43;;;:19;:43;;;;;;;;;-1:-1:-1;;;;;59619:43:0;59775:32;;;:18;:32;;;;;;59619:43;59969:41;;;59919:31;;59619:43;;59775:32;59919:102;;:31;:102;:35;:102;:::i;:::-;59885:31;:136;60076:1;60032:41;;;:45;60099:21;;;;60090:31;;:8;:31::i;:::-;60132:4;;60160:21;;;;60132:50;;;-1:-1:-1;;;60132:50:0;;-1:-1:-1;;;;;60132:50:0;;;;;;;;;;;;;;;;:4;;;;;:13;;:50;;;;;;;;;;;;;;:4;;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;60132:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60132:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;60220:40:0;;;-1:-1:-1;;;60220:40:0;;;;60195:22;;-1:-1:-1;;;;;60220:38:0;;;;;:40;;;;;60132:50;;60220:40;;;;;;;;60195:22;60220:38;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;60220:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60220:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60220:40:0;60313:20;;60220:40;;-1:-1:-1;60271:63:0;;60220:40;;60271:25;:63::i;:::-;-1:-1:-1;60364:22:0;;60352:51;;;;;;;;;;;;;;;;;;;;;;;;60571:22;:24;;;;;;60606:29;:27;:29::i;71939:118::-;-1:-1:-1;;;;;71990:25:0;;;;;:15;:25;;;;;72018:12;44751:1;72018:31;71990:59;;71939:118::o;48347:458::-;48452:11;48479:17;48474:169;;48519:112;48563:15;48597:11;:19;;;48519:25;:112::i;:::-;48513:118;;48474:169;48655:18;48689:60;48709:24;:15;48729:3;48709:24;:19;:24;:::i;:::-;48735:13;:11;:13::i;:::-;48689:19;:60::i;:::-;48655:94;;48762:35;48774:10;48786;48762:11;:35::i;1827:192::-;1913:7;1949:12;1941:6;;;;1933:29;;;;-1:-1:-1;;;1933:29: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;1933:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1985:5:0;;;1827:192::o;23360:175::-;23446:4;23463:42;23473:12;:10;:12::i;:::-;23487:9;23498:6;23463:9;:42::i;6948:508::-;7365:4;7411:17;7443:7;6948:508;:::o;21349:177::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;21445:26:::1;:24;:26::i;:::-;21482:36;21505:4;21511:6;21482:22;:36::i;:::-;6801:14:::0;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;21349:177;;;:::o;9880:129::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;9938:26:::1;:24;:26::i;:::-;9975;:24;:26::i;:::-;6801:14:::0;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;9880:129;:::o;12510:131::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;12569:26:::1;:24;:26::i;:::-;12606:27;:25;:27::i;27569:378::-:0;-1:-1:-1;;;;;27653:21:0;;27645:65;;;;;-1:-1:-1;;;27645:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27723:49;27752:1;27756:7;27765:6;27723:20;:49::i;:::-;27800:12;;:24;;27817:6;27800:24;:16;:24;:::i;:::-;27785:12;:39;-1:-1:-1;;;;;27856:18:0;;;;;;:9;:18;;;;;;:30;;27879:6;27856:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;27835:18:0;;;;;;:9;:18;;;;;;;;:51;;;;27902:37;;;;;;;27835:18;;;;27902:37;;;;;;;;;;27569:378;;:::o;70422:515::-;70584:20;;;:45;;;70627:2;70608:15;:21;;70584:45;70576:69;;;;;-1:-1:-1;;;70576:69:0;;;;;;;;;;;;-1:-1:-1;;;70576:69:0;;;;;;;;;;;;;;;70664:20;;;:46;;;70707:3;70688:15;:22;;70664:46;70656:70;;;;;-1:-1:-1;;;70656:70:0;;;;;;;;;;;;-1:-1:-1;;;70656:70:0;;;;;;;;;;;;;;;70765:2;70745:16;:22;;70737:46;;;;;-1:-1:-1;;;70737:46:0;;;;;;;;;;;;-1:-1:-1;;;70737:46:0;;;;;;;;;;;;;;;70794:11;:37;;;;70842:19;:37;70890:20;:39;70422:515::o;13582:120::-;13285:7;;;;13277:40;;;;;-1:-1:-1;;;13277:40:0;;;;;;;;;;;;-1:-1:-1;;;13277:40:0;;;;;;;;;;;;;;;13641:7:::1;:15:::0;;-1:-1:-1;;13641:15:0::1;::::0;;13672:22:::1;13681:12;:10;:12::i;2270:471::-:0;2328:7;2573:6;2569:47;;-1:-1:-1;2603:1:0;2596:8;;2569:47;2640:5;;;2644:1;2640;:5;:1;2664:5;;;;;:10;2656:56;;;;-1:-1:-1;;;2656:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28279:418;-1:-1:-1;;;;;28363:21:0;;28355:67;;;;-1:-1:-1;;;28355:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28435:49;28456:7;28473:1;28477:6;28435:20;:49::i;:::-;28518:68;28541:6;28518:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28518:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;28497:18:0;;;;;;:9;:18;;;;;:89;28612:12;;:24;;28629:6;28612:24;:16;:24;:::i;:::-;28597:12;:39;28652:37;;;;;;;;28678:1;;-1:-1:-1;;;;;28652:37:0;;;;;;;;;;;;28279:418;;:::o;68329:211::-;68416:43;;;-1:-1:-1;;;68416:43:0;;68441:4;68416:43;;;;-1:-1:-1;;;;;68416:43:0;;;;;;;;;:16;;;;;;:43;;;;;;;;;;;;;;;:16;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;68416:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68416:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;68416:43:0;68412:121;;68481:40;-1:-1:-1;;;;;68481:18:0;;68500:10;-1:-1:-1;;68481:40:0;:18;:40;:::i;61166:992::-;61229:20;61252:32;;;:19;:32;;;;;;-1:-1:-1;;;;;61252:32:0;61295:26;;:::i;:::-;-1:-1:-1;;;;;61324:32:0;;;;;;:18;:32;;;;;;;;;61295:61;;;;;;;;;;;;;;;;;;;;;;;61324:32;;61295:61;;61324:32;;61295:61;;61324:32;61295:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61295:61:0;;;-1:-1:-1;;61295:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61378:24;;;61295:61;;-1:-1:-1;61377:25:0;61369:53;;;;;-1:-1:-1;;;61369:53:0;;;;;;;;;;;;-1:-1:-1;;;61369:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;61433:32:0;;;;;;:18;:32;;;;;;:47;;:54;;-1:-1:-1;;61433:54:0;61483:4;61433:54;;;61572:22;;-1:-1:-1;;;61572:22:0;;;;61452:12;;61433:32;61572:20;;:22;;;;;;;;;;;61433:32;;61572:22;;;5:2:-1;;;;30:1;27;20:12;5:2;61572:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;61689:20:0;;61607:39;;-1:-1:-1;61689:20:0;-1:-1:-1;61607:39:0;61720:221;61744:10;:17;61740:1;:21;61720:221;;;61817:112;61871:18;:33;61890:10;61901:1;61890:13;;;;;;;;;;;;;;61871:33;;;;;;;;;;;:57;;;61817:31;:53;;:112;;;;:::i;:::-;61783:146;-1:-1:-1;61763:3:0;;61720:221;;;-1:-1:-1;61958:25:0;;;;;;;;;;;;;;;;;62072:17;;:78;;62108:31;62072:78;:21;:78;:::i;:::-;62052:17;:98;-1:-1:-1;;;;;;61166:992:0:o;67164:237::-;67274:11;67321:1;67307:11;:15;:29;;;;;67335:1;67326:6;:10;67307:29;67303:91;;;67359:23;:6;67370:11;67359:23;:10;:23;:::i;67409:143::-;67509:19;;:35;;67533:10;67509:35;:23;:35;:::i;:::-;67487:19;:57;-1:-1:-1;67409:143:0:o;3829:345::-;3915:7;4017:12;4010:5;4002:28;;;;-1:-1:-1;;;4002:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4002:28:0;;4041:9;4057:1;4053;:5;;;;;;;3829:345;-1:-1:-1;;;;;3829:345:0:o;26749:539::-;-1:-1:-1;;;;;26855:20:0;;26847:70;;;;-1:-1:-1;;;26847:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26936:23:0;;26928:71;;;;-1:-1:-1;;;26928:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27012:47;27033:6;27041:9;27052:6;27012:20;:47::i;:::-;27092:71;27114:6;27092:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27092:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;27072:17:0;;;;;;;:9;:17;;;;;;:91;;;;27197:20;;;;;;;:32;;27222:6;27197:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;27174:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;27245:35;;;;;;;27174:20;;27245:35;;;;;;;;;;;;;26749:539;;;:::o;65936:95::-;65990:16;;:33;;;-1:-1:-1;;;65990:33:0;;;;;;;;;;-1:-1:-1;;;;;65990:16:0;;;;:24;;:33;;;;;:16;;:33;;;;;;;;:16;;:33;;;5:2:-1;;;;30:1;27;20:12;8499:69:0;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6801:14;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;8499:69;:::o;21534:184::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;21644:12;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;21667:16:0;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;21694:9:0::1;:14:::0;;-1:-1:-1;;21694:14:0::1;21706:2;21694:14;::::0;;6797:57;;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;21534:184;;;:::o;10017:202::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;10089:17:::1;10109:12;:10;:12::i;:::-;10132:6;:18:::0;;-1:-1:-1;;;;;;10132:18:0::1;-1:-1:-1::0;;;;;10132:18:0;::::1;::::0;;::::1;::::0;;;10166:43:::1;::::0;10132:18;;-1:-1:-1;10132:18:0;-1:-1:-1;;10166:43:0::1;::::0;-1:-1:-1;;10166:43:0::1;6787:1;6801:14:::0;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;10017:202;:::o;12649:98::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;12722:7:::1;:15:::0;;-1:-1:-1;;12722:15:0::1;::::0;;6797:57;;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;12649:98;:::o;31719:622::-;32089:10;;;32088:62;;-1:-1:-1;32105:39:0;;;-1:-1:-1;;;32105:39:0;;32129:4;32105:39;;;;-1:-1:-1;;;;;32105:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;32105:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32105:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32105:39:0;:44;32088:62;32080:152;;;;-1:-1:-1;;;32080:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32270:62;;;-1:-1:-1;;;;;32270:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;32270:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;32243:90:0;;32263:5;;33970:27;33978:5;-1:-1:-1;;;;;33970:25:0;;:27::i;:::-;33962:71;;;;;-1:-1:-1;;;33962:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34107:12;34121:23;34156:5;-1:-1:-1;;;;;34148:19:0;34168:4;34148: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;;;34148: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;;34106:67:0;;;;34192:7;34184:52;;;;;-1:-1:-1;;;34184:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34253:17;;:21;34249:224;;34395:10;34384:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34384:30:0;34376:85;;;;-1:-1:-1;;;34376:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17358:619;17418:4;17886:20;;17729:66;17926:23;;;;;;:42;;-1:-1:-1;;17953:15:0;;;17918:51;-1:-1:-1;;17358:619:0:o;42307:30202::-;;;;;;;;;;-1:-1:-1;;;;;42307:30202:0;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42307:30202:0;;;-1:-1:-1;42307:30202:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://715bcc878bae8e118e43a4d0ca69612bc8f3ca49c3bcd797711e2ad48a281532
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.