Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
VestedAkro
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-02 */ // SPDX-License-Identifier: AGPL V3.0 pragma solidity 0.6.12; // Part: AddressUpgradeable /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // 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"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: IERC20Upgradeable /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); } // Part: Initializable /** * @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; } // Part: Roles /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // Part: SafeMathUpgradeable /** * @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 SafeMathUpgradeable { /** * @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) { 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; } } // Part: ContextUpgradeable /* * @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. */ abstract contract ContextUpgradeable is Initializable { 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; } // Part: SafeERC20Upgradeable /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20Upgradeable 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(IERC20Upgradeable 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(IERC20Upgradeable 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(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Part: MinterRole contract MinterRole is Initializable, ContextUpgradeable { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; function initialize(address sender) public virtual initializer { __Context_init_unchained(); if (!isMinter(sender)) { _addMinter(sender); } } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(_msgSender()); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } uint256[50] private ______gap; } // Part: OwnableUpgradeable /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal 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; } // Part: VestedAkroSenderRole contract VestedAkroSenderRole is Initializable, ContextUpgradeable { using Roles for Roles.Role; event SenderAdded(address indexed account); event SenderRemoved(address indexed account); Roles.Role private _senders; function initialize(address sender) public virtual initializer { __Context_init_unchained(); if (!isSender(sender)) { _addSender(sender); } } modifier onlySender() { require(isSender(_msgSender()), "SenderRole: caller does not have the Sender role"); _; } function isSender(address account) public view returns (bool) { return _senders.has(account); } function addSender(address account) public onlySender { _addSender(account); } function renounceSender() public { _removeSender(_msgSender()); } function _addSender(address account) internal { _senders.add(account); emit SenderAdded(account); } function _removeSender(address account) internal { _senders.remove(account); emit SenderRemoved(account); } uint256[50] private ______gap; } // File: VestedAkro.sol /** * @notice VestedAkro token represents AKRO token vested for a vestingPeriod set by owner of this VestedAkro token. * Generic holders of this token CAN NOT transfer it. They only can redeem AKRO from unlocked vAKRO. * Minters can mint unlocked vAKRO from AKRO to special VestedAkroSenders. * VestedAkroSender can send his unlocked vAKRO to generic holders, and this vAKRO will be vested. He can not redeem AKRO himself. */ contract VestedAkro is OwnableUpgradeable, IERC20Upgradeable, MinterRole, VestedAkroSenderRole { using SafeMathUpgradeable for uint256; using SafeERC20Upgradeable for IERC20Upgradeable; event Locked(address indexed holder, uint256 amount); event Unlocked(address indexed holder, uint256 amount); event AkroAdded(uint256 amount); struct VestedBatch { uint256 amount; // Full amount of vAKRO vested in this batch uint256 start; // Vesting start time; uint256 end; // Vesting end time uint256 claimed; // vAKRO already claimed from this batch to unlocked balance of holder } struct Balance { VestedBatch[] batches; // Array of vesting batches uint256 locked; // Amount locked in batches uint256 unlocked; // Amount of unlocked vAKRO (which either was previously claimed, or received from Minter) uint256 firstUnclaimedBatch; // First batch which is not fully claimed } string private _name; string private _symbol; uint8 private _decimals; uint256 public override totalSupply; IERC20Upgradeable public akro; uint256 public vestingPeriod; //set by owner of this VestedAkro token uint256 public vestingStart; //set by owner, default value 01 May 2021, 00:00:00 GMT+0 uint256 public vestingCliff; //set by owner, cliff for akro unlock, 1 month by default mapping (address => mapping (address => uint256)) private allowances; mapping (address => Balance) private holders; function initialize(address _akro, uint256 _vestingPeriod) public initializer { __Ownable_init(); MinterRole.initialize(_msgSender()); VestedAkroSenderRole.initialize(_msgSender()); _name = "Vested AKRO"; _symbol = "vAKRO"; _decimals = 18; akro = IERC20Upgradeable(_akro); require(_vestingPeriod > 0, "VestedAkro: vestingPeriod should be > 0"); vestingPeriod = _vestingPeriod; vestingStart = 1619827200; //01 May 2021, 00:00:00 GMT+0 vestingCliff = 31 * 24 * 60 * 60; //1 month - 31 day in May } // Stub for compiler purposes only function initialize(address sender) public override(MinterRole, VestedAkroSenderRole) { } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function allowance(address owner, address spender) public override view returns (uint256) { return allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override onlySender returns (bool) { // We require both sender and _msgSender() to have VestedAkroSender role // to prevent sender from redeem and prevent unauthorized transfers via transferFrom. require(isSender(sender), "VestedAkro: sender should have VestedAkroSender role"); _transfer(sender, recipient, amount); _approve(sender, _msgSender(), allowances[sender][_msgSender()].sub(amount, "VestedAkro: transfer amount exceeds allowance")); return true; } function transfer(address recipient, uint256 amount) public override onlySender returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function setVestingPeriod(uint256 _vestingPeriod) public onlyOwner { require(_vestingPeriod > 0, "VestedAkro: vestingPeriod should be > 0"); vestingPeriod = _vestingPeriod; } /** * @notice Sets vesting start date (as unix timestamp). Owner only * @param _vestingStart Unix timestamp. */ function setVestingStart(uint256 _vestingStart) public onlyOwner { require(_vestingStart > 0, "VestedAkro: vestingStart should be > 0"); vestingStart = _vestingStart; } /** * @notice Sets vesting start date (as unix timestamp). Owner only * @param _vestingCliff Cliff in seconds (1 month by default) */ function setVestingCliff(uint256 _vestingCliff) public onlyOwner { vestingCliff = _vestingCliff; } function mint(address beneficiary, uint256 amount) public onlyMinter { totalSupply = totalSupply.add(amount); holders[beneficiary].unlocked = holders[beneficiary].unlocked.add(amount); emit Transfer(address(0), beneficiary, amount); } /** * @notice Adds AKRO liquidity to the swap contract * @param _amount Amout of AKRO added to the contract. */ function addAkroLiquidity(uint256 _amount) public onlyMinter { require(_amount > 0, "Incorrect amount"); IERC20Upgradeable(akro).safeTransferFrom(_msgSender(), address(this), _amount); emit AkroAdded(_amount); } /** * @notice Unlocks all avilable vAKRO for a holder * @param holder Whose funds to unlock * @return total unlocked amount awailable for redeem */ function unlockAvailable(address holder) public returns(uint256) { require(holders[holder].batches.length > 0, "VestedAkro: nothing to unlock"); claimAllFromBatches(holder); return holders[holder].unlocked; } /** * @notice Unlock all available vAKRO and redeem it * @return Amount redeemed */ function unlockAndRedeemAll() public returns(uint256){ address beneficiary = _msgSender(); claimAllFromBatches(beneficiary); return redeemAllUnlocked(); } /** * @notice Redeem all already unlocked vAKRO * @return Amount redeemed */ function redeemAllUnlocked() public returns(uint256){ address beneficiary = _msgSender(); require(!isSender(beneficiary), "VestedAkro: VestedAkroSender is not allowed to redeem"); uint256 amount = holders[beneficiary].unlocked; if(amount == 0) return 0; require(akro.balanceOf(address(this)) >= amount, "Not enough AKRO"); holders[beneficiary].unlocked = 0; totalSupply = totalSupply.sub(amount); akro.transfer(beneficiary, amount); emit Transfer(beneficiary, address(0), amount); return amount; } function balanceOf(address account) public override view returns (uint256) { Balance storage b = holders[account]; return b.locked.add(b.unlocked); } function balanceInfoOf(address account) public view returns(uint256 locked, uint256 unlocked, uint256 unlockable) { Balance storage b = holders[account]; return (b.locked, b.unlocked, calculateClaimableFromBatches(account)); } function batchesInfoOf(address account) public view returns(uint256 firstUnclaimedBatch, uint256 totalBatches) { Balance storage b = holders[account]; return (b.firstUnclaimedBatch, b.batches.length); } function batchInfo(address account, uint256 batch) public view returns(uint256 amount, uint256 start, uint256 end, uint256 claimed, uint256 claimable) { VestedBatch storage vb = holders[account].batches[batch]; (claimable,) = calculateClaimableFromBatch(vb); return (vb.amount, vb.start, vb.end, vb.claimed, claimable); } function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "VestedAkro: approve from the zero address"); require(spender != address(0), "VestedAkro: approve to the zero address"); allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "VestedAkro: transfer from the zero address"); require(recipient != address(0), "VestedAkro: transfer to the zero address"); holders[sender].unlocked = holders[sender].unlocked.sub(amount, "VestedAkro: transfer amount exceeds unlocked balance"); createOrModifyBatch(recipient, amount); emit Transfer(sender, recipient, amount); } function createOrModifyBatch(address holder, uint256 amount) internal { Balance storage b = holders[holder]; if (b.batches.length == 0 || b.firstUnclaimedBatch == b.batches.length) { b.batches.push(VestedBatch({ amount: amount, start: vestingStart, end: vestingStart.add(vestingPeriod), claimed: 0 })); } else { uint256 batchAmount = b.batches[b.firstUnclaimedBatch].amount; b.batches[b.firstUnclaimedBatch].amount = batchAmount.add(amount); } b.locked = b.locked.add(amount); emit Locked(holder, amount); } function claimAllFromBatches(address holder) internal { claimAllFromBatches(holder, holders[holder].batches.length); } function claimAllFromBatches(address holder, uint256 tillBatch) internal { Balance storage b = holders[holder]; bool firstUnclaimedFound; uint256 claiming; for(uint256 i = b.firstUnclaimedBatch; i < tillBatch; i++) { (uint256 claimable, bool fullyClaimable) = calculateClaimableFromBatch(b.batches[i]); if(claimable > 0) { b.batches[i].claimed = b.batches[i].claimed.add(claimable); claiming = claiming.add(claimable); } if(!fullyClaimable && !firstUnclaimedFound) { b.firstUnclaimedBatch = i; firstUnclaimedFound = true; } } if(!firstUnclaimedFound) { b.firstUnclaimedBatch = b.batches.length; } if(claiming > 0){ b.locked = b.locked.sub(claiming); b.unlocked = b.unlocked.add(claiming); emit Unlocked(holder, claiming); } } /** * @notice Calculates claimable amount from all batches * @param holder pointer to a batch * @return claimable amount */ function calculateClaimableFromBatches(address holder) internal view returns(uint256) { Balance storage b = holders[holder]; uint256 claiming; for(uint256 i = b.firstUnclaimedBatch; i < b.batches.length; i++) { (uint256 claimable,) = calculateClaimableFromBatch(b.batches[i]); claiming = claiming.add(claimable); } return claiming; } /** * @notice Calculates one batch * @param vb pointer to a batch * @return claimable amount and bool which is true if batch is fully claimable */ function calculateClaimableFromBatch(VestedBatch storage vb) internal view returns(uint256, bool) { if (now < vb.start.add(vestingCliff) ) { return (0, false); // No unlcoks before cliff period is over } if(now >= vb.end) { return (vb.amount.sub(vb.claimed), true); } uint256 claimable = (vb.amount.mul(now.sub(vb.start)).div(vb.end.sub(vb.start))).sub(vb.claimed); return (claimable, false); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AkroAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SenderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SenderRemoved","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":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addAkroLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"akro","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceInfoOf","outputs":[{"internalType":"uint256","name":"locked","type":"uint256"},{"internalType":"uint256","name":"unlocked","type":"uint256"},{"internalType":"uint256","name":"unlockable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"batch","type":"uint256"}],"name":"batchInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"claimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"batchesInfoOf","outputs":[{"internalType":"uint256","name":"firstUnclaimedBatch","type":"uint256"},{"internalType":"uint256","name":"totalBatches","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_akro","type":"address"},{"internalType":"uint256","name":"_vestingPeriod","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeemAllUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vestingCliff","type":"uint256"}],"name":"setVestingCliff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vestingPeriod","type":"uint256"}],"name":"setVestingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vestingStart","type":"uint256"}],"name":"setVestingStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"unlockAndRedeemAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"unlockAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingCliff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506136b7806100206000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c8063983b2d5611610145578063c4d66de8116100bd578063e38434631161008c578063f2fde38b11610071578063f2fde38b146107a9578063f3640e74146107dc578063f8c20b9b146107e457610241565b8063e384346314610743578063ed391c1c1461077657610241565b8063c4d66de814610694578063cd6dc687146106c7578063d922017114610700578063dd62ed3e1461070857610241565b8063aa271e1a11610114578063b697f531116100f9578063b697f531146105f8578063c1ca99f81461062b578063c2bae8c61461067757610241565b8063aa271e1a146105bd578063b24f925c146105f057610241565b8063983b2d56146105415780639865027514610574578063a22dda181461057c578063a9059cbb1461058457610241565b806340c10f19116101d857806370a08231116101a75780637313ee5a1161018c5780637313ee5a146105295780638da5cb5b1461053157806395d89b411461053957610241565b806370a08231146104ee578063715018a61461052157610241565b806340c10f19146103cf57806355111a5914610408578063580ad06f1461043957806363f781e41461048a57610241565b806323b872dd1161021457806323b872dd14610349578063254800d41461038c578063313ce5671461039457806340bee0ed146103b257610241565b806306fdde0314610246578063095ea7b3146102c3578063126f854d1461031057806318160ddd1461032f575b600080fd5b61024e610801565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610288578181015183820152602001610270565b50505050905090810190601f1680156102b55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102fc600480360360408110156102d957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108b6565b604080519115158252519081900360200190f35b61032d6004803603602081101561032657600080fd5b50356108d4565b005b6103376109c4565b60408051918252519081900360200190f35b6102fc6004803603606081101561035f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356109cb565b610337610b31565b61039c610b38565b6040805160ff9092168252519081900360200190f35b61032d600480360360208110156103c857600080fd5b5035610b40565b61032d600480360360408110156103e557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c30565b610410610d44565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61046c6004803603602081101561044f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d61565b60408051938452602084019290925282820152519081900360600190f35b6104c3600480360360408110156104a057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610dae565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103376004803603602081101561050457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e29565b61032d610e62565b610337610f62565b610410610f69565b61024e610f85565b61032d6004803603602081101561055757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611004565b61032d611070565b610337611082565b6102fc6004803603604081101561059a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356110a6565b6102fc600480360360208110156105d357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661111a565b61032d611127565b61032d6004803603602081101561060e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611137565b61065e6004803603602081101561064157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111a0565b6040805192835260208301919091528051918290030190f35b61032d6004803603602081101561068d57600080fd5b50356111d3565b61032d600480360360208110156106aa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661106d565b61032d600480360360408110156106dd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561126a565b61033761150d565b6103376004803603604081101561071e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166117f6565b6102fc6004803603602081101561075957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661182f565b6103376004803603602081101561078c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661183c565b61032d600480360360208110156107bf57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611904565b610337611a8f565b61032d600480360360208110156107fa57600080fd5b5035611a96565b60fd8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108ab5780601f10610880576101008083540402835291602001916108ab565b820191906000526020600020905b81548152906001019060200180831161088e57829003601f168201915b505050505090505b90565b60006108ca6108c3611bc8565b8484611bcc565b5060015b92915050565b6108dc611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461096557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600081116109be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061365c6026913960400191505060405180910390fd5b61010355565b6101005481565b60006109dd6109d8611bc8565b61182f565b610a32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806133616030913960400191505060405180910390fd5b610a3b8461182f565b610a90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806135c96034913960400191505060405180910390fd5b610a9b848484611d14565b610b2684610aa7611bc8565b610b21856040518060600160405280602d815260200161354c602d913973ffffffffffffffffffffffffffffffffffffffff8a1660009081526101056020526040812090610af3611bc8565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190611ed8565b611bcc565b5060015b9392505050565b6101035481565b60ff80541690565b610b48611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614610bd157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60008111610c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806135046027913960400191505060405180910390fd5b61010255565b610c40610c3b611bc8565b61111a565b610c95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806134b36030913960400191505060405180910390fd5b61010054610ca39082611f89565b6101005573ffffffffffffffffffffffffffffffffffffffff821660009081526101066020526040902060020154610cdb9082611f89565b73ffffffffffffffffffffffffffffffffffffffff83166000818152610106602090815260408083206002019490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6101015473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff811660009081526101066020526040812060018101546002820154839283929091610da087611ffd565b935093509350509193909250565b73ffffffffffffffffffffffffffffffffffffffff82166000908152610106602052604081208054829182918291829182919088908110610deb57fe5b90600052602060002090600402019050610e048161207b565b50815460018301546002840154600390940154919b909a509298509650945092505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526101066020526040812060028101546001820154610b2a91611f89565b610e6a611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614610ef357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60655460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6101025481565b60655473ffffffffffffffffffffffffffffffffffffffff1690565b60fe8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108ab5780601f10610880576101008083540402835291602001916108ab565b61100f610c3b611bc8565b611064576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806134b36030913960400191505060405180910390fd5b61106d81612131565b50565b61108061107b611bc8565b612180565b565b60008061108d611bc8565b9050611098816121cf565b6110a061150d565b91505090565b60006110b36109d8611bc8565b611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806133616030913960400191505060405180910390fd5b6108ca611113611bc8565b8484611d14565b60006108ce609783612201565b611080611132611bc8565b61229c565b6111426109d8611bc8565b611197576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806133616030913960400191505060405180910390fd5b61106d816122eb565b73ffffffffffffffffffffffffffffffffffffffff8116600090815261010660205260409020600381015490545b915091565b6111db611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461126457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61010455565b600054610100900460ff1680611283575061128361233a565b80611291575060005460ff16155b6112e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561134c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611354612340565b61136461135f611bc8565b612463565b61137461136f611bc8565b612596565b60408051808201909152600b8082527f56657374656420414b524f00000000000000000000000000000000000000000060209092019182526113b89160fd916132cd565b506040805180820190915260058082527f76414b524f00000000000000000000000000000000000000000000000000000060209092019182526113fd9160fe916132cd565b5060ff80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166012179055610101805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055816114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806135046027913960400191505060405180910390fd5b61010282905563608c9a00610103556228de8061010455801561150857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050565b600080611518611bc8565b90506115238161182f565b15611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806135fd6035913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526101066020526040902060020154806115b3576000925050506108b3565b61010154604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051839273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561162457600080fd5b505afa158015611638573d6000803e3d6000fd5b505050506040513d602081101561164e57600080fd5b505110156116bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7420656e6f75676820414b524f0000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526101066020526040812060020155610100546116f59082612696565b6101005561010154604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561177657600080fd5b505af115801561178a573d6000803e3d6000fd5b505050506040513d60208110156117a057600080fd5b505060408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a391505090565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526101056020908152604080832093909416825291909152205490565b60006108ce60ca83612201565b73ffffffffffffffffffffffffffffffffffffffff8116600090815261010660205260408120546118ce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f566573746564416b726f3a206e6f7468696e6720746f20756e6c6f636b000000604482015290519081900360640190fd5b6118d7826121cf565b5073ffffffffffffffffffffffffffffffffffffffff166000908152610106602052604090206002015490565b61190c611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461199557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133ba6026913960400191505060405180910390fd5b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6101045481565b611aa1610c3b611bc8565b611af6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806134b36030913960400191505060405180910390fd5b60008111611b6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e636f727265637420616d6f756e7400000000000000000000000000000000604482015290519081900360640190fd5b611b92611b70611bc8565b6101015473ffffffffffffffffffffffffffffffffffffffff169030846126d8565b6040805182815290517f553d28c3c527fdb6b88ada7783469dbb0211d13d4ae0db85df4174cd0a381ae09181900360200190a150565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316611c38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806133916029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611ca4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806134586027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff80841660008181526101056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316611d80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061342e602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611dec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806133e06028913960400191505060405180910390fd5b611e3a8160405180606001604052806034815260200161347f6034913973ffffffffffffffffffffffffffffffffffffffff8616600090815261010660205260409020600201549190611ed8565b73ffffffffffffffffffffffffffffffffffffffff841660009081526101066020526040902060020155611e6e8282612773565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008184841115611f81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f46578181015183820152602001611f2e565b50505050905090810190601f168015611f735780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610b2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815261010660205260408120600381015482905b825481101561207357600061205b84600001838154811061204857fe5b906000526020600020906004020161207b565b5090506120688382611f89565b92505060010161202b565b509392505050565b600080612098610104548460010154611f8990919063ffffffff16565b4210156120aa575060009050806111ce565b826002015442106120d057600383015483546120c591612696565b6001915091506111ce565b600061212684600301546121206120f88760010154886002015461269690919063ffffffff16565b61211a61211289600101544261269690919063ffffffff16565b8954906128e2565b90612955565b90612696565b946000945092505050565b61213c609782612997565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b61218b609782612a5d565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b73ffffffffffffffffffffffffffffffffffffffff81166000908152610106602052604090205461106d908290612b09565b600073ffffffffffffffffffffffffffffffffffffffff821661226f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806135796022913960400191505060405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff1690565b6122a760ca82612a5d565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f384859c5ef5fafac31e8bc92ce7fb48b1f2c74c4dd5e212eb84ec202fa5d9fad90600090a250565b6122f660ca82612997565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fd65eca5d561d3a4568c87b9b13ced4ab52a69edadfdfdb22d76bc595f36d7d8790600090a250565b303b1590565b600054610100900460ff1680612359575061235961233a565b80612367575060005460ff16155b6123bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561242257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61242a612c7c565b612432612d8e565b801561106d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff168061247c575061247c61233a565b8061248a575060005460ff16155b6124df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561254557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61254d612c7c565b6125568261111a565b6125635761256382612131565b801561259257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b5050565b600054610100900460ff16806125af57506125af61233a565b806125bd575060005460ff16155b612612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561267857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b612680612c7c565b6126898261182f565b61256357612563826122eb565b6000610b2a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ed8565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261276d908590612f1e565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815261010660205260409020805415806127ab575080546003820154145b15612825576040805160808101825283815261010354602082018190526101025484938301916127da91611f89565b8152600060209182018190528354600181810186559482529082902083516004909202019081559082015192810192909255604081015160028301556060015160039091015561287d565b60008160000182600301548154811061283a57fe5b600091825260209091206004909102015490506128578184611f89565b8260000183600301548154811061286a57fe5b6000918252602090912060049091020155505b600181015461288c9083611f89565b600182015560408051838152905173ffffffffffffffffffffffffffffffffffffffff8516917f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008919081900360200190a2505050565b6000826128f1575060006108ce565b828202828482816128fe57fe5b0414610b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061352b6021913960400191505060405180910390fd5b6000610b2a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ff6565b6129a18282612201565b15612a0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b612a678282612201565b612abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134e36021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b73ffffffffffffffffffffffffffffffffffffffff8216600090815261010660205260408120600381015490919081905b84811015612bec57600080612b5786600001848154811061204857fe5b90925090508115612bc557612b9582876000018581548110612b7557fe5b906000526020600020906004020160030154611f8990919063ffffffff16565b866000018481548110612ba457fe5b6000918252602090912060036004909202010155612bc28483611f89565b93505b80158015612bd1575084155b15612be25760038601839055600194505b5050600101612b3a565b5081612bfa57825460038401555b8015612c75576001830154612c0f9082612696565b60018401556002830154612c239082611f89565b600284015560408051828152905173ffffffffffffffffffffffffffffffffffffffff8716917f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d919081900360200190a25b5050505050565b600054610100900460ff1680612c955750612c9561233a565b80612ca3575060005460ff16155b612cf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561243257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff90911661010017166001179055801561106d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680612da75750612da761233a565b80612db5575060005460ff16155b612e0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff16158015612e7057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6000612e7a611bc8565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561106d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b6060612f80826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130759092919063ffffffff16565b80519091501561150857808060200190516020811015612f9f57600080fd5b5051611508576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613632602a913960400191505060405180910390fd5b6000818361305f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315611f46578181015183820152602001611f2e565b50600083858161306b57fe5b0495945050505050565b6060613084848460008561308c565b949350505050565b6060824710156130e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806134086026913960400191505060405180910390fd5b6130f085613247565b61315b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106131c557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613188565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613227576040519150601f19603f3d011682016040523d82523d6000602084013e61322c565b606091505b509150915061323c82828661324d565b979650505050505050565b3b151590565b6060831561325c575081610b2a565b82511561326c5782518084602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152845160248401528451859391928392604401919085019080838360008315611f46578181015183820152602001611f2e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061330e57805160ff191683800117855561333b565b8280016001018555821561333b579182015b8281111561333b578251825591602001919060010190613320565b5061334792915061334b565b5090565b5b80821115613347576000815560010161334c56fe53656e646572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652053656e64657220726f6c65566573746564416b726f3a20617070726f76652066726f6d20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373566573746564416b726f3a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c566573746564416b726f3a207472616e736665722066726f6d20746865207a65726f2061646472657373566573746564416b726f3a20617070726f766520746f20746865207a65726f2061646472657373566573746564416b726f3a207472616e7366657220616d6f756e74206578636565647320756e6c6f636b65642062616c616e63654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65566573746564416b726f3a2076657374696e67506572696f642073686f756c64206265203e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77566573746564416b726f3a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564566573746564416b726f3a2073656e6465722073686f756c64206861766520566573746564416b726f53656e64657220726f6c65566573746564416b726f3a20566573746564416b726f53656e646572206973206e6f7420616c6c6f77656420746f2072656465656d5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564566573746564416b726f3a2076657374696e6753746172742073686f756c64206265203e2030a2646970667358221220015e5a4d7ea2f2fcae2555adfe56d1d3a1c207023cd33fec6d7af9a2272ff1a464736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102415760003560e01c8063983b2d5611610145578063c4d66de8116100bd578063e38434631161008c578063f2fde38b11610071578063f2fde38b146107a9578063f3640e74146107dc578063f8c20b9b146107e457610241565b8063e384346314610743578063ed391c1c1461077657610241565b8063c4d66de814610694578063cd6dc687146106c7578063d922017114610700578063dd62ed3e1461070857610241565b8063aa271e1a11610114578063b697f531116100f9578063b697f531146105f8578063c1ca99f81461062b578063c2bae8c61461067757610241565b8063aa271e1a146105bd578063b24f925c146105f057610241565b8063983b2d56146105415780639865027514610574578063a22dda181461057c578063a9059cbb1461058457610241565b806340c10f19116101d857806370a08231116101a75780637313ee5a1161018c5780637313ee5a146105295780638da5cb5b1461053157806395d89b411461053957610241565b806370a08231146104ee578063715018a61461052157610241565b806340c10f19146103cf57806355111a5914610408578063580ad06f1461043957806363f781e41461048a57610241565b806323b872dd1161021457806323b872dd14610349578063254800d41461038c578063313ce5671461039457806340bee0ed146103b257610241565b806306fdde0314610246578063095ea7b3146102c3578063126f854d1461031057806318160ddd1461032f575b600080fd5b61024e610801565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610288578181015183820152602001610270565b50505050905090810190601f1680156102b55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102fc600480360360408110156102d957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108b6565b604080519115158252519081900360200190f35b61032d6004803603602081101561032657600080fd5b50356108d4565b005b6103376109c4565b60408051918252519081900360200190f35b6102fc6004803603606081101561035f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356109cb565b610337610b31565b61039c610b38565b6040805160ff9092168252519081900360200190f35b61032d600480360360208110156103c857600080fd5b5035610b40565b61032d600480360360408110156103e557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c30565b610410610d44565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61046c6004803603602081101561044f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d61565b60408051938452602084019290925282820152519081900360600190f35b6104c3600480360360408110156104a057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610dae565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103376004803603602081101561050457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e29565b61032d610e62565b610337610f62565b610410610f69565b61024e610f85565b61032d6004803603602081101561055757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611004565b61032d611070565b610337611082565b6102fc6004803603604081101561059a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356110a6565b6102fc600480360360208110156105d357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661111a565b61032d611127565b61032d6004803603602081101561060e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611137565b61065e6004803603602081101561064157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111a0565b6040805192835260208301919091528051918290030190f35b61032d6004803603602081101561068d57600080fd5b50356111d3565b61032d600480360360208110156106aa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661106d565b61032d600480360360408110156106dd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561126a565b61033761150d565b6103376004803603604081101561071e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166117f6565b6102fc6004803603602081101561075957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661182f565b6103376004803603602081101561078c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661183c565b61032d600480360360208110156107bf57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611904565b610337611a8f565b61032d600480360360208110156107fa57600080fd5b5035611a96565b60fd8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108ab5780601f10610880576101008083540402835291602001916108ab565b820191906000526020600020905b81548152906001019060200180831161088e57829003601f168201915b505050505090505b90565b60006108ca6108c3611bc8565b8484611bcc565b5060015b92915050565b6108dc611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461096557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600081116109be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061365c6026913960400191505060405180910390fd5b61010355565b6101005481565b60006109dd6109d8611bc8565b61182f565b610a32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806133616030913960400191505060405180910390fd5b610a3b8461182f565b610a90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806135c96034913960400191505060405180910390fd5b610a9b848484611d14565b610b2684610aa7611bc8565b610b21856040518060600160405280602d815260200161354c602d913973ffffffffffffffffffffffffffffffffffffffff8a1660009081526101056020526040812090610af3611bc8565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190611ed8565b611bcc565b5060015b9392505050565b6101035481565b60ff80541690565b610b48611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614610bd157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60008111610c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806135046027913960400191505060405180910390fd5b61010255565b610c40610c3b611bc8565b61111a565b610c95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806134b36030913960400191505060405180910390fd5b61010054610ca39082611f89565b6101005573ffffffffffffffffffffffffffffffffffffffff821660009081526101066020526040902060020154610cdb9082611f89565b73ffffffffffffffffffffffffffffffffffffffff83166000818152610106602090815260408083206002019490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6101015473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff811660009081526101066020526040812060018101546002820154839283929091610da087611ffd565b935093509350509193909250565b73ffffffffffffffffffffffffffffffffffffffff82166000908152610106602052604081208054829182918291829182919088908110610deb57fe5b90600052602060002090600402019050610e048161207b565b50815460018301546002840154600390940154919b909a509298509650945092505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526101066020526040812060028101546001820154610b2a91611f89565b610e6a611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614610ef357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60655460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6101025481565b60655473ffffffffffffffffffffffffffffffffffffffff1690565b60fe8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108ab5780601f10610880576101008083540402835291602001916108ab565b61100f610c3b611bc8565b611064576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806134b36030913960400191505060405180910390fd5b61106d81612131565b50565b61108061107b611bc8565b612180565b565b60008061108d611bc8565b9050611098816121cf565b6110a061150d565b91505090565b60006110b36109d8611bc8565b611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806133616030913960400191505060405180910390fd5b6108ca611113611bc8565b8484611d14565b60006108ce609783612201565b611080611132611bc8565b61229c565b6111426109d8611bc8565b611197576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806133616030913960400191505060405180910390fd5b61106d816122eb565b73ffffffffffffffffffffffffffffffffffffffff8116600090815261010660205260409020600381015490545b915091565b6111db611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461126457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61010455565b600054610100900460ff1680611283575061128361233a565b80611291575060005460ff16155b6112e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561134c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611354612340565b61136461135f611bc8565b612463565b61137461136f611bc8565b612596565b60408051808201909152600b8082527f56657374656420414b524f00000000000000000000000000000000000000000060209092019182526113b89160fd916132cd565b506040805180820190915260058082527f76414b524f00000000000000000000000000000000000000000000000000000060209092019182526113fd9160fe916132cd565b5060ff80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166012179055610101805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055816114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806135046027913960400191505060405180910390fd5b61010282905563608c9a00610103556228de8061010455801561150857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050565b600080611518611bc8565b90506115238161182f565b15611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806135fd6035913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526101066020526040902060020154806115b3576000925050506108b3565b61010154604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051839273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561162457600080fd5b505afa158015611638573d6000803e3d6000fd5b505050506040513d602081101561164e57600080fd5b505110156116bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f7420656e6f75676820414b524f0000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526101066020526040812060020155610100546116f59082612696565b6101005561010154604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561177657600080fd5b505af115801561178a573d6000803e3d6000fd5b505050506040513d60208110156117a057600080fd5b505060408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a391505090565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526101056020908152604080832093909416825291909152205490565b60006108ce60ca83612201565b73ffffffffffffffffffffffffffffffffffffffff8116600090815261010660205260408120546118ce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f566573746564416b726f3a206e6f7468696e6720746f20756e6c6f636b000000604482015290519081900360640190fd5b6118d7826121cf565b5073ffffffffffffffffffffffffffffffffffffffff166000908152610106602052604090206002015490565b61190c611bc8565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461199557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133ba6026913960400191505060405180910390fd5b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6101045481565b611aa1610c3b611bc8565b611af6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806134b36030913960400191505060405180910390fd5b60008111611b6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e636f727265637420616d6f756e7400000000000000000000000000000000604482015290519081900360640190fd5b611b92611b70611bc8565b6101015473ffffffffffffffffffffffffffffffffffffffff169030846126d8565b6040805182815290517f553d28c3c527fdb6b88ada7783469dbb0211d13d4ae0db85df4174cd0a381ae09181900360200190a150565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316611c38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806133916029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611ca4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806134586027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff80841660008181526101056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316611d80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061342e602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611dec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806133e06028913960400191505060405180910390fd5b611e3a8160405180606001604052806034815260200161347f6034913973ffffffffffffffffffffffffffffffffffffffff8616600090815261010660205260409020600201549190611ed8565b73ffffffffffffffffffffffffffffffffffffffff841660009081526101066020526040902060020155611e6e8282612773565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008184841115611f81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f46578181015183820152602001611f2e565b50505050905090810190601f168015611f735780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610b2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815261010660205260408120600381015482905b825481101561207357600061205b84600001838154811061204857fe5b906000526020600020906004020161207b565b5090506120688382611f89565b92505060010161202b565b509392505050565b600080612098610104548460010154611f8990919063ffffffff16565b4210156120aa575060009050806111ce565b826002015442106120d057600383015483546120c591612696565b6001915091506111ce565b600061212684600301546121206120f88760010154886002015461269690919063ffffffff16565b61211a61211289600101544261269690919063ffffffff16565b8954906128e2565b90612955565b90612696565b946000945092505050565b61213c609782612997565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b61218b609782612a5d565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b73ffffffffffffffffffffffffffffffffffffffff81166000908152610106602052604090205461106d908290612b09565b600073ffffffffffffffffffffffffffffffffffffffff821661226f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806135796022913960400191505060405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff1690565b6122a760ca82612a5d565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f384859c5ef5fafac31e8bc92ce7fb48b1f2c74c4dd5e212eb84ec202fa5d9fad90600090a250565b6122f660ca82612997565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fd65eca5d561d3a4568c87b9b13ced4ab52a69edadfdfdb22d76bc595f36d7d8790600090a250565b303b1590565b600054610100900460ff1680612359575061235961233a565b80612367575060005460ff16155b6123bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561242257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61242a612c7c565b612432612d8e565b801561106d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff168061247c575061247c61233a565b8061248a575060005460ff16155b6124df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561254557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61254d612c7c565b6125568261111a565b6125635761256382612131565b801561259257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b5050565b600054610100900460ff16806125af57506125af61233a565b806125bd575060005460ff16155b612612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561267857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b612680612c7c565b6126898261182f565b61256357612563826122eb565b6000610b2a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ed8565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261276d908590612f1e565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815261010660205260409020805415806127ab575080546003820154145b15612825576040805160808101825283815261010354602082018190526101025484938301916127da91611f89565b8152600060209182018190528354600181810186559482529082902083516004909202019081559082015192810192909255604081015160028301556060015160039091015561287d565b60008160000182600301548154811061283a57fe5b600091825260209091206004909102015490506128578184611f89565b8260000183600301548154811061286a57fe5b6000918252602090912060049091020155505b600181015461288c9083611f89565b600182015560408051838152905173ffffffffffffffffffffffffffffffffffffffff8516917f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008919081900360200190a2505050565b6000826128f1575060006108ce565b828202828482816128fe57fe5b0414610b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061352b6021913960400191505060405180910390fd5b6000610b2a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ff6565b6129a18282612201565b15612a0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b612a678282612201565b612abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134e36021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b73ffffffffffffffffffffffffffffffffffffffff8216600090815261010660205260408120600381015490919081905b84811015612bec57600080612b5786600001848154811061204857fe5b90925090508115612bc557612b9582876000018581548110612b7557fe5b906000526020600020906004020160030154611f8990919063ffffffff16565b866000018481548110612ba457fe5b6000918252602090912060036004909202010155612bc28483611f89565b93505b80158015612bd1575084155b15612be25760038601839055600194505b5050600101612b3a565b5081612bfa57825460038401555b8015612c75576001830154612c0f9082612696565b60018401556002830154612c239082611f89565b600284015560408051828152905173ffffffffffffffffffffffffffffffffffffffff8716917f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d919081900360200190a25b5050505050565b600054610100900460ff1680612c955750612c9561233a565b80612ca3575060005460ff16155b612cf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff1615801561243257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff90911661010017166001179055801561106d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680612da75750612da761233a565b80612db5575060005460ff16155b612e0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061359b602e913960400191505060405180910390fd5b600054610100900460ff16158015612e7057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6000612e7a611bc8565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561106d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b6060612f80826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130759092919063ffffffff16565b80519091501561150857808060200190516020811015612f9f57600080fd5b5051611508576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613632602a913960400191505060405180910390fd5b6000818361305f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315611f46578181015183820152602001611f2e565b50600083858161306b57fe5b0495945050505050565b6060613084848460008561308c565b949350505050565b6060824710156130e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806134086026913960400191505060405180910390fd5b6130f085613247565b61315b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106131c557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613188565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613227576040519150601f19603f3d011682016040523d82523d6000602084013e61322c565b606091505b509150915061323c82828661324d565b979650505050505050565b3b151590565b6060831561325c575081610b2a565b82511561326c5782518084602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152845160248401528451859391928392604401919085019080838360008315611f46578181015183820152602001611f2e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061330e57805160ff191683800117855561333b565b8280016001018555821561333b579182015b8281111561333b578251825591602001919060010190613320565b5061334792915061334b565b5090565b5b80821115613347576000815560010161334c56fe53656e646572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652053656e64657220726f6c65566573746564416b726f3a20617070726f76652066726f6d20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373566573746564416b726f3a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c566573746564416b726f3a207472616e736665722066726f6d20746865207a65726f2061646472657373566573746564416b726f3a20617070726f766520746f20746865207a65726f2061646472657373566573746564416b726f3a207472616e7366657220616d6f756e74206578636565647320756e6c6f636b65642062616c616e63654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65566573746564416b726f3a2076657374696e67506572696f642073686f756c64206265203e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77566573746564416b726f3a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564566573746564416b726f3a2073656e6465722073686f756c64206861766520566573746564416b726f53656e64657220726f6c65566573746564416b726f3a20566573746564416b726f53656e646572206973206e6f7420616c6c6f77656420746f2072656465656d5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564566573746564416b726f3a2076657374696e6753746172742073686f756c64206265203e2030a2646970667358221220015e5a4d7ea2f2fcae2555adfe56d1d3a1c207023cd33fec6d7af9a2272ff1a464736f6c634300060c0033
Deployed Bytecode Sourcemap
28529:11628:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30875:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31300:161;;;;;;;;;;;;;;;;-1:-1:-1;31300:161:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;32600:191;;;;;;;;;;;;;;;;-1:-1:-1;32600:191:0;;:::i;:::-;;29647:35;;;:::i;:::-;;;;;;;;;;;;;;;;31467:599;;;;;;;;;;;;;;;;-1:-1:-1;31467:599:0;;;;;;;;;;;;;;;;;;:::i;29800:27::-;;;:::i;31061:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32260:197;;;;;;;;;;;;;;;;-1:-1:-1;32260:197:0;;:::i;33076:266::-;;;;;;;;;;;;;;;;-1:-1:-1;33076:266:0;;;;;;;;;:::i;29689:29::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35364:249;;;;;;;;;;;;;;;;-1:-1:-1;35364:249:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;35854:359;;;;;;;;;;;;;;;;-1:-1:-1;35854:359:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35184:172;;;;;;;;;;;;;;;;-1:-1:-1;35184:172:0;;;;:::i;26252:148::-;;;:::i;29725:28::-;;;:::i;25610:79::-;;;:::i;30966:87::-;;;:::i;23863:92::-;;;;;;;;;;;;;;;;-1:-1:-1;23863:92:0;;;;:::i;23963:79::-;;;:::i;34288:186::-;;;:::i;32074:178::-;;;;;;;;;;;;;;;;-1:-1:-1;32074:178:0;;;;;;;;;:::i;23746:109::-;;;;;;;;;;;;;;;;-1:-1:-1;23746:109:0;;;;:::i;27673:79::-;;;:::i;27573:92::-;;;;;;;;;;;;;;;;-1:-1:-1;27573:92:0;;;;:::i;35621:225::-;;;;;;;;;;;;;;;;-1:-1:-1;35621:225:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32956:112;;;;;;;;;;;;;;;;-1:-1:-1;32956:112:0;;:::i;30773:94::-;;;;;;;;;;;;;;;;-1:-1:-1;30773:94:0;;;;:::i;30114:611::-;;;;;;;;;;;;;;;;-1:-1:-1;30114:611:0;;;;;;;;;:::i;34582:594::-;;;:::i;31152:142::-;;;;;;;;;;;;;;;;-1:-1:-1;31152:142:0;;;;;;;;;;;:::i;27456:109::-;;;;;;;;;;;;;;;;-1:-1:-1;27456:109:0;;;;:::i;33933:240::-;;;;;;;;;;;;;;;;-1:-1:-1;33933:240:0;;;;:::i;26555:244::-;;;;;;;;;;;;;;;;-1:-1:-1;26555:244:0;;;;:::i;29892:27::-;;;:::i;33485:263::-;;;;;;;;;;;;;;;;-1:-1:-1;33485:263:0;;:::i;30875:83::-;30945:5;30938:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30912:13;;30938:12;;30945:5;;30938:12;;30945:5;30938:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30875:83;;:::o;31300:161::-;31375:4;31392:39;31401:12;:10;:12::i;:::-;31415:7;31424:6;31392:8;:39::i;:::-;-1:-1:-1;31449:4:0;31300:161;;;;;:::o;32600:191::-;25832:12;:10;:12::i;:::-;25822:6;;:22;:6;;;:22;;;25814:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32700:1:::1;32684:13;:17;32676:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32755:12;:28:::0;32600:191::o;29647:35::-;;;;:::o;31467:599::-;31576:4;27353:22;27362:12;:10;:12::i;:::-;27353:8;:22::i;:::-;27345:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31778:16:::1;31787:6;31778:8;:16::i;:::-;31770:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31864:36;31874:6;31882:9;31893:6;31864:9;:36::i;:::-;31911:125;31920:6;31928:12;:10;:12::i;:::-;31942:93;31979:6;31942:93;;;;;;;;;;;;;;;;;:18;::::0;::::1;;::::0;;;:10:::1;:18;::::0;;;;;31961:12:::1;:10;:12::i;:::-;31942:32;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;31942:32:0;;;:93;:36:::1;:93::i;:::-;31911:8;:125::i;:::-;-1:-1:-1::0;32054:4:0::1;27439:1;31467:599:::0;;;;;:::o;29800:27::-;;;;:::o;31061:83::-;31127:9;;;;31061:83;:::o;32260:197::-;25832:12;:10;:12::i;:::-;25822:6;;:22;:6;;;:22;;;25814:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32363:1:::1;32346:14;:18;32338:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32419:13;:30:::0;32260:197::o;33076:266::-;23643:22;23652:12;:10;:12::i;:::-;23643:8;:22::i;:::-;23635:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33170:11:::1;::::0;:23:::1;::::0;33186:6;33170:15:::1;:23::i;:::-;33156:11;:37:::0;33236:20:::1;::::0;::::1;;::::0;;;:7:::1;:20;::::0;;;;:29:::1;;::::0;:41:::1;::::0;33270:6;33236:33:::1;:41::i;:::-;33204:20;::::0;::::1;;::::0;;;:7:::1;:20;::::0;;;;;;;:29:::1;;:73:::0;;;;33293:41;;;;;;;33204:20;;;;33293:41:::1;::::0;;;;;;;;::::1;33076:266:::0;;:::o;29689:29::-;;;;;;:::o;35364:249::-;35509:16;;;35424:14;35509:16;;;:7;:16;;;;;35544:8;;;;35554:10;;;;35424:14;;;;35509:16;;35566:38;35517:7;35566:29;:38::i;:::-;35536:69;;;;;;;35364:249;;;;;:::o;35854:359::-;36047:16;;;35931:14;36047:16;;;:7;:16;;;;;:31;;35931:14;;;;;;;;;;36047:16;36072:5;;36047:31;;;;;;;;;;;;;;;;36022:56;;36104:31;36132:2;36104:27;:31::i;:::-;-1:-1:-1;36154:9:0;;36165:8;;;;36175:6;;;;36183:10;;;;;36154:9;;36165:8;;-1:-1:-1;36175:6:0;;-1:-1:-1;36183:10:0;-1:-1:-1;36183:10:0;-1:-1:-1;35854:359:0;-1:-1:-1;;;35854:359:0:o;35184:172::-;35290:16;;;35250:7;35290:16;;;:7;:16;;;;;35337:10;;;;35324:8;;;;:24;;:12;:24::i;26252:148::-;25832:12;:10;:12::i;:::-;25822:6;;:22;:6;;;:22;;;25814:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26343:6:::1;::::0;26322:40:::1;::::0;26359:1:::1;::::0;26322:40:::1;26343:6;::::0;26322:40:::1;::::0;26359:1;;26322:40:::1;26373:6;:19:::0;;;::::1;::::0;;26252:148::o;29725:28::-;;;;:::o;25610:79::-;25675:6;;;;25610:79;:::o;30966:87::-;31038:7;31031:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31005:13;;31031:14;;31038:7;;31031:14;;31038:7;31031:14;;;;;;;;;;;;;;;;;;;;;;;;23863:92;23643:22;23652:12;:10;:12::i;23643:22::-;23635:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23928:19:::1;23939:7;23928:10;:19::i;:::-;23863:92:::0;:::o;23963:79::-;24007:27;24021:12;:10;:12::i;:::-;24007:13;:27::i;:::-;23963:79::o;34288:186::-;34333:7;34352:19;34374:12;:10;:12::i;:::-;34352:34;;34397:32;34417:11;34397:19;:32::i;:::-;34447:19;:17;:19::i;:::-;34440:26;;;34288:186;:::o;32074:178::-;32163:4;27353:22;27362:12;:10;:12::i;27353:22::-;27345:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32180:42:::1;32190:12;:10;:12::i;:::-;32204:9;32215:6;32180:9;:42::i;23746:109::-:0;23802:4;23826:21;:8;23839:7;23826:12;:21::i;27673:79::-;27717:27;27731:12;:10;:12::i;:::-;27717:13;:27::i;27573:92::-;27353:22;27362:12;:10;:12::i;27353:22::-;27345:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27638:19:::1;27649:7;27638:10;:19::i;35621:225::-:0;35763:16;;;35681:27;35763:16;;;:7;:16;;;;;35798:21;;;;35821:16;;35621:225;;;;:::o;32956:112::-;25832:12;:10;:12::i;:::-;25822:6;;:22;:6;;;:22;;;25814:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33032:12:::1;:28:::0;32956:112::o;30114:611::-;10847:12;;;;;;;;:31;;;10863:15;:13;:15::i;:::-;10847:47;;;-1:-1:-1;10883:11:0;;;;10882:12;10847:47;10839:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10954:19;10977:12;;;;;;10976:13;10996:83;;;;11025:12;:19;;11053:18;11025:19;;;;;;11053:18;11040:4;11053:18;;;10996:83;30203:16:::1;:14;:16::i;:::-;30230:35;30252:12;:10;:12::i;:::-;30230:21;:35::i;:::-;30276:45;30308:12;:10;:12::i;:::-;30276:31;:45::i;:::-;30334:21;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;:5:::1;::::0;:21:::1;:::i;:::-;-1:-1:-1::0;30366:17:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;:7:::1;::::0;:17:::1;:::i;:::-;-1:-1:-1::0;30394:9:0::1;:14:::0;;;::::1;30406:2;30394:14;::::0;;30429:4:::1;:31:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;30479:18;30471:70:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30552:13;:30:::0;;;30608:10:::1;30593:12;:25:::0;30674:17:::1;30659:12;:32:::0;11097:57;;;;11141:5;11126:20;;;;;;11097:57;30114:611;;;:::o;34582:594::-;34626:7;34645:19;34667:12;:10;:12::i;:::-;34645:34;;34699:21;34708:11;34699:8;:21::i;:::-;34698:22;34690:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34806:20;;;34789:14;34806:20;;;:7;:20;;;;;:29;;;34849:11;34846:24;;34869:1;34862:8;;;;;;34846:24;34889:4;;:29;;;;;;34912:4;34889:29;;;;;;34922:6;;34889:4;;;:14;;:29;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34889:29:0;:39;;34881:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34961:20;;;34993:1;34961:20;;;:7;:20;;;;;:29;;:33;35019:11;;:23;;35035:6;35019:15;:23::i;:::-;35005:11;:37;35053:4;;:34;;;;;;:4;:34;;;;;;;;;;;;;;;:4;;;;;:13;;:34;;;;;;;;;;;;;;:4;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35103:41:0;;;;;;;;35133:1;;35103:41;;;;;;;;;35053:34;35103:41;;;35162:6;-1:-1:-1;;34582:594:0;:::o;31152:142::-;31260:17;;;;31233:7;31260:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;31152:142::o;27456:109::-;27512:4;27536:21;:8;27549:7;27536:12;:21::i;33933:240::-;34017:15;;;33989:7;34017:15;;;:7;:15;;;;;:30;34009:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34096:27;34116:6;34096:19;:27::i;:::-;-1:-1:-1;34141:15:0;;;;;;:7;:15;;;;;:24;;;;33933:240::o;26555:244::-;25832:12;:10;:12::i;:::-;25822:6;;:22;:6;;;:22;;;25814:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26644:22:::1;::::0;::::1;26636:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26746:6;::::0;26725:38:::1;::::0;::::1;::::0;;::::1;::::0;26746:6:::1;::::0;26725:38:::1;::::0;26746:6:::1;::::0;26725:38:::1;26774:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;26555:244::o;29892:27::-;;;;:::o;33485:263::-;23643:22;23652:12;:10;:12::i;23643:22::-;23635:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33575:1:::1;33565:7;:11;33557:40;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33618:78;33659:12;:10;:12::i;:::-;33636:4;::::0;::::1;;::::0;33681::::1;33688:7:::0;33618:40:::1;:78::i;:::-;33722:18;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;33485:263:::0;:::o;18998:106::-;19086:10;18998:106;:::o;36221:347::-;36315:19;;;36307:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36399:21;;;36391:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36477:17;;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;:35;;;36528:32;;;;;;;;;;;;;;;;;36221:347;;;:::o;36576:494::-;36674:20;;;36666:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36760:23;;;36752:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36868:92;36897:6;36868:92;;;;;;;;;;;;;;;;;:15;;;;;;;:7;:15;;;;;:24;;;;:92;:28;:92::i;:::-;36841:15;;;;;;;:7;:15;;;;;:24;;:119;36971:38;36991:9;37002:6;36971:19;:38::i;:::-;37044:9;37027:35;;37036:6;37027:35;;;37055:6;37027:35;;;;;;;;;;;;;;;;;;36576:494;;;:::o;14668:192::-;14754:7;14790:12;14782:6;;;;14774:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14826:5:0;;;14668:192::o;13765:181::-;13823:7;13855:5;;;13879:6;;;;13871:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39082:409;39199:15;;;39159:7;39199:15;;;:7;:15;;;;;39268:21;;;;39159:7;;39252:206;39295:16;;39291:20;;39252:206;;;39334:17;39356:41;39384:1;:9;;39394:1;39384:12;;;;;;;;;;;;;;;;;;39356:27;:41::i;:::-;-1:-1:-1;39333:64:0;-1:-1:-1;39423:23:0;:8;39333:64;39423:12;:23::i;:::-;39412:34;-1:-1:-1;;39313:3:0;;39252:206;;;-1:-1:-1;39475:8:0;39082:409;-1:-1:-1;;;39082:409:0:o;39675:479::-;39758:7;39767:4;39794:26;39807:12;;39794:2;:8;;;:12;;:26;;;;:::i;:::-;39788:3;:32;39784:125;;;-1:-1:-1;39846:1:0;;-1:-1:-1;39846:1:0;39838:17;;39784:125;39929:2;:6;;;39922:3;:13;39919:85;;39974:10;;;;39960:9;;:25;;:13;:25::i;:::-;39987:4;39952:40;;;;;;39919:85;40014:17;40034:76;40099:2;:10;;;40035:58;40072:20;40083:2;:8;;;40072:2;:6;;;:10;;:20;;;;:::i;:::-;40035:32;40049:17;40057:2;:8;;;40049:3;:7;;:17;;;;:::i;:::-;40035:9;;;:13;:32::i;:::-;:36;;:58::i;:::-;40034:64;;:76::i;:::-;40014:96;40140:5;;-1:-1:-1;39675:479:0;-1:-1:-1;;;39675:479:0:o;24050:122::-;24107:21;:8;24120:7;24107:12;:21::i;:::-;24144:20;;;;;;;;;;;24050:122;:::o;24180:130::-;24240:24;:8;24256:7;24240:15;:24::i;:::-;24280:22;;;;;;;;;;;24180:130;:::o;37785:132::-;37878:15;;;;;;;:7;:15;;;;;:30;37850:59;;37870:6;;37850:19;:59::i;12672:203::-;12744:4;12769:21;;;12761:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12847:20:0;;:11;:20;;;;;;;;;;;;;;;12672:203::o;27890:130::-;27950:24;:8;27966:7;27950:15;:24::i;:::-;27990:22;;;;;;;;;;;27890:130;:::o;27760:122::-;27817:21;:8;27830:7;27817:12;:21::i;:::-;27854:20;;;;;;;;;;;27760:122;:::o;11248:508::-;11665:4;11711:17;11743:7;11248:508;:::o;25196:129::-;10847:12;;;;;;;;:31;;;10863:15;:13;:15::i;:::-;10847:47;;;-1:-1:-1;10883:11:0;;;;10882:12;10847:47;10839:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10954:19;10977:12;;;;;;10976:13;10996:83;;;;11025:12;:19;;11053:18;11025:19;;;;;;11053:18;11040:4;11053:18;;;10996:83;25254:26:::1;:24;:26::i;:::-;25291;:24;:26::i;:::-;11101:14:::0;11097:57;;;11141:5;11126:20;;;;;;25196:129;:::o;23408:186::-;10847:12;;;;;;;;:31;;;10863:15;:13;:15::i;:::-;10847:47;;;-1:-1:-1;10883:11:0;;;;10882:12;10847:47;10839:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10954:19;10977:12;;;;;;10976:13;10996:83;;;;11025:12;:19;;11053:18;11025:19;;;;;;11053:18;11040:4;11053:18;;;10996:83;23482:26:::1;:24;:26::i;:::-;23524:16;23533:6;23524:8;:16::i;:::-;23519:68;;23557:18;23568:6;23557:10;:18::i;:::-;11101:14:::0;11097:57;;;11141:5;11126:20;;;;;;11097:57;23408:186;;:::o;27118:::-;10847:12;;;;;;;;:31;;;10863:15;:13;:15::i;:::-;10847:47;;;-1:-1:-1;10883:11:0;;;;10882:12;10847:47;10839:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10954:19;10977:12;;;;;;10976:13;10996:83;;;;11025:12;:19;;11053:18;11025:19;;;;;;11053:18;11040:4;11053:18;;;10996:83;27192:26:::1;:24;:26::i;:::-;27234:16;27243:6;27234:8;:16::i;:::-;27229:68;;27267:18;27278:6;27267:10;:18::i;14229:136::-:0;14287:7;14314:43;14318:1;14321;14314:43;;;;;;;;;;;;;;;;;:3;:43::i;20205:216::-;20344:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20367:27;20344:68;;;20317:96;;20337:5;;20317:19;:96::i;:::-;20205:216;;;;:::o;37080:697::-;37181:15;;;37161:17;37181:15;;;:7;:15;;;;;37213:16;;:21;;:66;;-1:-1:-1;37263:16:0;;37238:21;;;;:41;37213:66;37209:481;;;37311:183;;;;;;;;;;;37382:12;;37311:183;;;;;;37435:13;;37296:1;;37311:183;;;37418:31;;:16;:31::i;:::-;37311:183;;37477:1;37311:183;;;;;;;37296:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37209:481;;;37537:19;37559:1;:9;;37569:1;:21;;;37559:32;;;;;;;;;;;;;;;;;;;;;:39;;-1:-1:-1;37655:23:0;37559:39;37671:6;37655:15;:23::i;:::-;37613:1;:9;;37623:1;:21;;;37613:32;;;;;;;;;;;;;;;;;;;;;:65;-1:-1:-1;37209:481:0;37711:8;;;;:20;;37724:6;37711:12;:20::i;:::-;37700:8;;;:31;37747:22;;;;;;;;;;;;;;;;;;;;;;37080:697;;;:::o;15119:471::-;15177:7;15422:6;15418:47;;-1:-1:-1;15452:1:0;15445:8;;15418:47;15489:5;;;15493:1;15489;:5;:1;15513:5;;;;;:10;15505:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16066:132;16124:7;16151:39;16155:1;16158;16151:39;;;;;;;;;;;;;;;;;:3;:39::i;12136:178::-;12214:18;12218:4;12224:7;12214:3;:18::i;:::-;12213:19;12205:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12279:20;;:11;:20;;;;;;;;;;;:27;;;;12302:4;12279:27;;;12136:178::o;12394:183::-;12474:18;12478:4;12484:7;12474:3;:18::i;:::-;12466:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12541:20;;12564:5;12541:20;;;;;;;;;;;:28;;;;;;12394:183::o;37925:996::-;38029:15;;;38009:17;38029:15;;;:7;:15;;;;;38133:21;;;;38029:15;;38009:17;;;38117:511;38160:9;38156:1;:13;38117:511;;;38192:17;38211:19;38234:41;38262:1;:9;;38272:1;38262:12;;;;;;;38234:41;38191:84;;-1:-1:-1;38191:84:0;-1:-1:-1;38293:13:0;;38290:164;;38350:35;38375:9;38350:1;:9;;38360:1;38350:12;;;;;;;;;;;;;;;;;;:20;;;:24;;:35;;;;:::i;:::-;38327:1;:9;;38337:1;38327:12;;;;;;;;;;;;;;;;:20;:12;;;;;:20;:58;38415:23;:8;38428:9;38415:12;:23::i;:::-;38404:34;;38290:164;38472:14;38471:15;:39;;;;;38491:19;38490:20;38471:39;38468:149;;;38531:21;;;:25;;;38597:4;;-1:-1:-1;38468:149:0;-1:-1:-1;;38171:3:0;;38117:511;;;;38642:19;38638:92;;38702:16;;38678:21;;;:40;38638:92;38743:12;;38740:174;;38782:8;;;;:22;;38795:8;38782:12;:22::i;:::-;38771:8;;;:33;38832:10;;;;:24;;38847:8;38832:14;:24::i;:::-;38819:10;;;:37;38876:26;;;;;;;;;;;;;;;;;;;;;;38740:174;37925:996;;;;;:::o;18927:65::-;10847:12;;;;;;;;:31;;;10863:15;:13;:15::i;:::-;10847:47;;;-1:-1:-1;10883:11:0;;;;10882:12;10847:47;10839:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10954:19;10977:12;;;;;;10976:13;10996:83;;;;11025:12;:19;;11053:18;11025:19;;;;;;11053:18;11040:4;11053:18;;;11101:14;11097:57;;;11141:5;11126:20;;;;;;18927:65;:::o;25333:196::-;10847:12;;;;;;;;:31;;;10863:15;:13;:15::i;:::-;10847:47;;;-1:-1:-1;10883:11:0;;;;10882:12;10847:47;10839:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10954:19;10977:12;;;;;;10976:13;10996:83;;;;11025:12;:19;;11053:18;11025:19;;;;;;11053:18;11040:4;11053:18;;;10996:83;25401:17:::1;25421:12;:10;:12::i;:::-;25444:6;:18:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;25478:43:::1;::::0;25444:18;;-1:-1:-1;25444:18:0;-1:-1:-1;;25478:43:0::1;::::0;-1:-1:-1;;25478:43:0::1;11087:1;11101:14:::0;11097:57;;;11141:5;11126:20;;;;;;25333:196;:::o;22369:772::-;22804:23;22830:69;22858:4;22830:69;;;;;;;;;;;;;;;;;22838:5;22830:27;;;;:69;;;;;:::i;:::-;22914:17;;22804:95;;-1:-1:-1;22914:21:0;22910:224;;23056:10;23045:30;;;;;;;;;;;;;;;-1:-1:-1;23045:30:0;23037:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16694:278;16780:7;16815:12;16808:5;16800:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16839:9;16855:1;16851;:5;;;;;;;16694:278;-1:-1:-1;;;;;16694:278:0:o;3713:195::-;3816:12;3848:52;3870:6;3878:4;3884:1;3887:12;3848:21;:52::i;:::-;3841:59;3713:195;-1:-1:-1;;;;3713:195:0:o;4765:530::-;4892:12;4950:5;4925:21;:30;;4917:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5017:18;5028:6;5017:10;:18::i;:::-;5009:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5143:12;5157:23;5184:6;:11;;5204:5;5212:4;5184:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5142:75;;;;5235:52;5253:7;5262:10;5274:12;5235:17;:52::i;:::-;5228:59;4765:530;-1:-1:-1;;;;;;;4765:530:0:o;795:422::-;1162:20;1201:8;;;795:422::o;6301:742::-;6416:12;6445:7;6441:595;;;-1:-1:-1;6476:10:0;6469:17;;6441:595;6590:17;;:21;6586:439;;6853:10;6847:17;6914:15;6901:10;6897:2;6893:19;6886:44;6801:148;6989:20;;;;;;;;;;;;;;;;;;;;6996:12;;6989:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://015e5a4d7ea2f2fcae2555adfe56d1d3a1c207023cd33fec6d7af9a2272ff1a4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.