More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SpiralChef
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-19 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; //Address (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // 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; 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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Context (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // Ownable (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual 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 { _transferOwnership(address(0xdead)); } /** * @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(0xdead), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // ReentrancyGuard (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // // IERC20 (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IUniswapV2Router02 { function factory() external pure returns (address); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // SafeERC20 (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Staking contract (this is forked, rewritten for 0.8.x, gas optimized and functionally modified from GooseDefi's MasterchefV2, codebase is battle tested countless times and is totally safe). // You're free to publish, distribute and modify a copy of this contract as you want. Please mention where it's from though. // Have fun reading it :) ( Original contract : https://github.com/goosedefi/goose-contracts/blob/master/contracts/MasterChefV2.sol). // RWT is a placeholder name for the upcoming reward token contract SpiralChef is Ownable, ReentrancyGuard{ using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. // uint256[] rewardDebt; // Reward debt. See explanation below. uint256[] claimableRWT; } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint64 allocPoint; // How many allocation points assigned to this pool. uint64 lastRewardBlock; // Last block number that rewards distribution occurs. uint256[] accRwtPerShare; // Accumulated RWTs per share, times 1e30. } IERC20 public spiral; // The reward tokens IERC20[] public rwt; address public router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; uint256[] public perBurn; uint256[] public maxBurn; uint256[] public rwtPerBlock; mapping(address => mapping(uint256 => uint256)) public userBurnt; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; // The block number when the farm starts mining starts. uint256 public startBlock; uint256 public lockUntil; bool public isEmergency; event RewardTokenSet(IERC20 indexed spiralddress, uint256 indexed rwtPerBlock, uint256 timestamp); event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event UpdateEmissionRate(address indexed user, uint256 rwtPerBlock); event Burn(address indexed user, uint256 burnAmount); event Emergency(uint256 timestamp, bool ifEmergency); mapping(IERC20 => bool) public poolExistence; mapping(IERC20 => bool) public rwtExistence; modifier nonDuplicated(IERC20 _lpToken) { require(poolExistence[_lpToken] == false, "nonDuplicated: duplicated"); _; } modifier nonDuplicatedRWT(IERC20 _rwtToken) { require(rwtExistence[_rwtToken] == false, "nonDuplicated: duplicated"); _; } modifier onlyEmergency { require(isEmergency == true, "onlyEmergency: Emergency use only!"); _; } mapping(address => bool) public authorized; modifier onlyAuthorized { require(authorized[msg.sender] == true, "onlyAuthorized: address not authorized"); _; } constructor(IERC20 _spiral) { spiral = _spiral; startBlock = type(uint256).max; add(1, _spiral, false); } //--------------------------------------------------------VIEW FUNCTIONS -------------------------------------------------------- // Return number of pools function poolLength() external view returns (uint256) { return poolInfo.length; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return (_to - _from); } // View function to see pending rewards on frontend. function pendingRewards(uint256 _pid, address _user) external view returns (uint256[] memory) { PoolInfo memory pool = poolInfo[_pid]; UserInfo memory user = userInfo[_pid][_user]; uint256 amount = user.amount; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); uint256[] memory accRwtPerShare = pool.accRwtPerShare; uint256[] memory PendingRWT = new uint256[](rwt.length); if (amount != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); for (uint i=0; i < rwt.length; i++) { uint256 rwtReward = multiplier * rwtPerBlock[i] * pool.allocPoint / totalAllocPoint; accRwtPerShare[i] = accRwtPerShare[i] + rwtReward * 1e30 / lpSupply; if (i < user.rewardDebt.length){ PendingRWT[i] = (amount * accRwtPerShare[i] / 1e30) - user.rewardDebt[i] + user.claimableRWT[i]; } else { PendingRWT[i] = (amount * accRwtPerShare[i] / 1e30); } } } return(PendingRWT); } function poolAccRew(uint256 _pid) external view returns (uint256[] memory) { uint256[] memory _poolAccRew = poolInfo[_pid].accRwtPerShare; return(_poolAccRew); } function userRewDebt(uint256 _pid, address _user) external view returns (uint256[] memory) { uint256[] memory _userRewDebt = userInfo[_pid][_user].rewardDebt; return(_userRewDebt); } function userClaimable(uint256 _pid, address _user) external view returns (uint256[] memory) { uint256[] memory _userClaimable = userInfo[_pid][_user].claimableRWT; return(_userClaimable); } function userBurntForNum(uint256 burnNum, address user) external view returns (uint256) { return(userBurnt[user][burnNum]); } function userAmount(uint256 _pid, address user) external view returns (uint256) { return(userInfo[_pid][user].amount); } //--------------------------------------------------------PUBLIC FUNCTIONS -------------------------------------------------------- // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; pid++) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardBlock = uint64(block.number); return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); if(rwt.length > 0) { uint256[] memory _rwtPerBlock = rwtPerBlock; PoolInfo memory _pool = pool; for (uint i=0; i < rwt.length; i++) { uint256 rwtReward = multiplier * _rwtPerBlock[i] * _pool.allocPoint / totalAllocPoint; pool.accRwtPerShare[i] = _pool.accRwtPerShare[i] + rwtReward * 1e30 / lpSupply; } } pool.lastRewardBlock = uint64(block.number); } function burnFromWallet(uint256 burnAmount, uint256 burnNum) public nonReentrant { require(burnAmount > 0); uint256 burnspiralmount = burnAmount * perBurn[burnNum]; userBurnt[msg.sender][burnNum] += burnAmount; require(userBurnt[msg.sender][burnNum] <= maxBurn[burnNum]); spiral.safeTransferFrom(msg.sender, address(0xdead), burnspiralmount); emit Burn(msg.sender, burnspiralmount); } function burnFromStake(uint256 burnAmount, uint256 burnNum) public nonReentrant { uint256 burnspiralmount = burnAmount * perBurn[burnNum]; uint256 postAmount = userInfo[0][msg.sender].amount - burnspiralmount; require(postAmount >= 0 && burnspiralmount > 0); updatePool(0); _addToClaimable(0, msg.sender); userInfo[0][msg.sender].amount = postAmount; if (rwt.length != 0) { uint256[] memory _poolAccRew = poolInfo[0].accRwtPerShare; for (uint i = 0; i < rwt.length; i++) { userInfo[0][msg.sender].rewardDebt[i] = postAmount * _poolAccRew[i] / 1e30; } } userBurnt[msg.sender][burnNum] += burnAmount; require(userBurnt[msg.sender][burnNum] <= maxBurn[burnNum]); spiral.safeTransfer(address(0xdead), burnspiralmount); emit Burn(msg.sender, burnspiralmount); } // Deposit tokens for rewards. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { _deposit(msg.sender, _pid, _amount); } function claimRWT(uint256 _pid, uint256 _tokenID) public nonReentrant { require(_tokenID < rwt.length); updatePool(_pid); UserInfo storage user = userInfo[_pid][msg.sender]; uint256[] memory _poolAccRew = poolInfo[_pid].accRwtPerShare; uint256 pending; if(user.rewardDebt.length <= _tokenID) { pending = (user.amount * _poolAccRew[_tokenID] / 1e30); uint diff = _tokenID-user.rewardDebt.length; if (diff > 0) { for (uint i = 0; i<diff; i++){ user.claimableRWT.push(); user.rewardDebt.push(); } } user.claimableRWT.push(); user.rewardDebt.push(pending); } else { pending = (user.amount * _poolAccRew[_tokenID] / 1e30) + user.claimableRWT[_tokenID] - user.rewardDebt[_tokenID]; user.claimableRWT[_tokenID] = 0; user.rewardDebt[_tokenID] = user.amount * _poolAccRew[_tokenID] / 1e30; } require(pending > 0); safeRWTTransfer(_tokenID, msg.sender, pending); } function claimAllRWT(uint256 _pid) public nonReentrant { updatePool(_pid); UserInfo storage user = userInfo[_pid][msg.sender]; uint256[] memory _poolAccRew = poolInfo[_pid].accRwtPerShare; UserInfo memory _user = user; if(rwt.length != 0) { for (uint i=0; i < _user.rewardDebt.length; i++){ uint256 pending = (_user.amount * _poolAccRew[i] / 1e30) - _user.rewardDebt[i] + _user.claimableRWT[i]; if (pending > 0) { user.claimableRWT[i] = 0; user.rewardDebt[i] = _user.amount * _poolAccRew[i] / 1e30; safeRWTTransfer(i, msg.sender, pending); } } if (_user.rewardDebt.length != rwt.length) { for (uint i = _user.rewardDebt.length; i < rwt.length; i++) { uint256 pending = (_user.amount * _poolAccRew[i] / 1e30); user.claimableRWT.push(); user.rewardDebt.push(_user.amount * _poolAccRew[i] / 1e30); if(pending > 0) { safeRWTTransfer(i, msg.sender, pending); } } } } } // Withdraw unlocked tokens. function withdraw(uint256 _pid, uint256 _amount) public nonReentrant { require(block.timestamp > lockUntil); UserInfo storage user = userInfo[_pid][msg.sender]; uint256 postAmount = user.amount - _amount; require(postAmount >= 0 && _amount > 0, "withdraw: not good"); updatePool(_pid); if (rwt.length > 0) { _addToClaimable(_pid, msg.sender); uint256[] memory _poolAccRew = poolInfo[_pid].accRwtPerShare; for (uint i=0; i < rwt.length; i++){ if (user.claimableRWT[i] > 0) { safeRWTTransfer(i, msg.sender, user.claimableRWT[i]); user.claimableRWT[i] = 0; user.rewardDebt[i] = postAmount * _poolAccRew[i] / 1e30; } } } user.amount = postAmount; poolInfo[_pid].lpToken.safeTransfer(address(msg.sender), _amount); emit Withdraw(msg.sender, _pid, _amount); } function reinvestRewards(uint256 _tokenID, uint256 amountOutMin) public nonReentrant { UserInfo storage user = userInfo[0][msg.sender]; updatePool(0); require(user.amount > 0, "reinvestRewards: No tokens staked"); _addToClaimable(0, msg.sender); uint256 claimableAmount = user.claimableRWT[_tokenID]; user.claimableRWT[_tokenID] = 0; address[] memory path = new address[](2); path[0] = address(rwt[_tokenID]); path[1] = address(spiral); if (claimableAmount > 0) { rwt[_tokenID].approve(router, claimableAmount); uint256 balanceBefore = spiral.balanceOf(address(this)); IUniswapV2Router02(router).swapExactTokensForTokensSupportingFeeOnTransferTokens( claimableAmount, amountOutMin, path, address(this), block.timestamp ); uint256 amountSwapped = spiral.balanceOf(address(this)) - balanceBefore; user.amount += amountSwapped; uint256 postAmount = user.amount; uint256[] memory _poolAccRew = poolInfo[0].accRwtPerShare; for (uint i = 0; i < rwt.length; i++) { userInfo[0][msg.sender].rewardDebt[i] = postAmount * _poolAccRew[i] / 1e30; } emit Deposit(msg.sender, 0, amountSwapped); } } // Withdraw unlocked tokens without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant onlyEmergency { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; uint256[] memory zeroArray = new uint256[](rwt.length); user.amount = 0; user.rewardDebt = zeroArray; user.claimableRWT = zeroArray; pool.lpToken.safeTransfer(address(msg.sender), amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } //--------------------------------------------------------RESTRICTED FUNCTIONS -------------------------------------------------------- function depositFor(address sender, uint256 _pid, uint256 amount) public onlyAuthorized { _deposit(sender, _pid, amount); } // Create a new pool. Can only be called by the owner. function add(uint64 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner nonDuplicated(_lpToken) { if (_withUpdate) { massUpdatePools(); } uint64 lastRewardBlock = uint64(block.number > startBlock ? block.number : startBlock); totalAllocPoint = totalAllocPoint + _allocPoint; poolExistence[_lpToken] = true; uint256[] memory accRWT = new uint256[](rwt.length); poolInfo.push(PoolInfo({ lpToken : _lpToken, allocPoint : _allocPoint, lastRewardBlock : lastRewardBlock, accRwtPerShare : accRWT })); } // Pull out tokens accidentally sent to the contract. Doesnt work with the reward token or any staked token. Can only be called by the owner. function rescueToken(address tokenaddress) public onlyOwner { require(!rwtExistence[IERC20(tokenaddress)] && !poolExistence[IERC20(tokenaddress)], "rescueToken : wrong token address"); uint256 bal = IERC20(tokenaddress).balanceOf(address(this)); IERC20(tokenaddress).transfer(msg.sender, bal); } // Update the given pool's rewards allocation point and deposit fee. Can only be called by the owner. function set(uint256 _pid, uint64 _allocPoint, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint ; poolInfo[_pid].allocPoint = _allocPoint; } // Initialize the rewards. Can only be called by the owner. function startRewards() public onlyOwner { require(startBlock > block.number, "startRewards: rewards already started"); startBlock = block.number; for (uint i; i < poolInfo.length; i++) { poolInfo[i].lastRewardBlock = uint64(block.number); } } // Updates RWT emision rate. Can only be called by the owner function updateEmissionRate(uint256 _tokenID, uint256 _rwtPerBlock) public onlyOwner { require(_tokenID < rwt.length); massUpdatePools(); rwtPerBlock[_tokenID] = _rwtPerBlock; emit UpdateEmissionRate(msg.sender, _rwtPerBlock); } // Sets the reward token address and the initial emission rate. Can only be called by the owner. function addRewardToken(IERC20 _RWT, uint _rwtPerBlock) public onlyOwner nonDuplicatedRWT(_RWT) { rwt.push(_RWT); rwtPerBlock.push(_rwtPerBlock); rwtExistence[_RWT] = true; uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; pid++) { poolInfo[pid].accRwtPerShare.push(); } emit RewardTokenSet(_RWT, _rwtPerBlock, block.timestamp); } function setPerBurn(uint256 _perBurn, uint256 _maxBurn) external onlyOwner { perBurn.push(_perBurn); maxBurn.push(_maxBurn); } // Emergency only function emergency(bool _isEmergency) external onlyOwner { isEmergency = _isEmergency; emit Emergency(block.timestamp, _isEmergency); } function authorize(address _address) external onlyOwner { authorized[_address] = true; } function unauthorize(address _address) external onlyOwner { authorized[_address] = false; } function setLock(uint256 _lockUntil) external onlyOwner { require(_lockUntil <= block.timestamp + 2 weeks && lockUntil + 1 days <= block.timestamp); lockUntil = _lockUntil; } //--------------------------------------------------------INTERNAL FUNCTIONS -------------------------------------------------------- function _deposit(address sender, uint256 _pid, uint256 _amount) internal { require(_amount > 0); UserInfo storage user = userInfo[_pid][sender]; uint256 amount = user.amount; updatePool(_pid); if(amount > 0) { _addToClaimable(_pid, sender); } poolInfo[_pid].lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = amount + _amount; if(rwt.length != 0) { amount = user.amount; uint256[] memory accRwtPerShare = poolInfo[_pid].accRwtPerShare; for (uint i=0; i < user.rewardDebt.length; i++){ user.rewardDebt[i] = amount * accRwtPerShare[i] / 1e30; } if (user.rewardDebt.length != rwt.length) { for (uint i = user.rewardDebt.length; i < rwt.length; i++) { user.claimableRWT.push(0); user.rewardDebt.push(amount * accRwtPerShare[i] / 1e30); } } } emit Deposit(sender, _pid, _amount); } function _addToClaimable(uint256 _pid, address sender) internal { if(rwt.length != 0) { UserInfo storage user = userInfo[_pid][sender]; PoolInfo memory pool = poolInfo[_pid]; UserInfo memory _user = user; for (uint i=0; i < _user.rewardDebt.length; i++){ uint256 pending = (_user.amount * pool.accRwtPerShare[i] / 1e30) - _user.rewardDebt[i] + _user.claimableRWT[i]; if (pending > 0) { user.claimableRWT[i] = pending; } } if (_user.rewardDebt.length != rwt.length) { for (uint i = _user.rewardDebt.length; i < rwt.length; i++) { uint256 pending = (_user.amount * pool.accRwtPerShare[i] / 1e30); user.claimableRWT.push(pending); user.rewardDebt.push(); } } } } // Safe transfer function, just in case if rounding error causes pool to not have enough RWTs. function safeRWTTransfer(uint tokenID, address _to, uint256 _amount) internal { IERC20 _rwt = rwt[tokenID]; uint256 rwtBal = _rwt.balanceOf(address(this)); bool transferSuccess = false; if (_amount > rwtBal) { transferSuccess = _rwt.transfer(_to, rwtBal); } else { transferSuccess = _rwt.transfer(_to, _amount); } require(transferSuccess, "safeRWTTransfer: transfer failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_spiral","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"ifEmergency","type":"bool"}],"name":"Emergency","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":"contract IERC20","name":"spiralddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"rwtPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RewardTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"rwtPerBlock","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint64","name":"_allocPoint","type":"uint64"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_RWT","type":"address"},{"internalType":"uint256","name":"_rwtPerBlock","type":"uint256"}],"name":"addRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"internalType":"uint256","name":"burnNum","type":"uint256"}],"name":"burnFromStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"internalType":"uint256","name":"burnNum","type":"uint256"}],"name":"burnFromWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claimAllRWT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"claimRWT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEmergency","type":"bool"}],"name":"emergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"isEmergency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"perBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolAccRew","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"poolExistence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint64","name":"allocPoint","type":"uint64"},{"internalType":"uint64","name":"lastRewardBlock","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"reinvestRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenaddress","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rwt","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"rwtExistence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rwtPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint64","name":"_allocPoint","type":"uint64"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockUntil","type":"uint256"}],"name":"setLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_perBurn","type":"uint256"},{"internalType":"uint256","name":"_maxBurn","type":"uint256"}],"name":"setPerBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spiral","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256","name":"_rwtPerBlock","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"userAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userBurnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnNum","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"userBurntForNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"userClaimable","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"userRewDebt","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600480546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790553480156200003757600080fd5b506040516200492f3803806200492f8339810160408190526200005a9162000769565b6200006533620000a0565b6001808055600280546001600160a01b0319166001600160a01b038416179055600019600c556200009990826000620000f0565b5062000886565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620001505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0382166000908152600f6020526040902054829060ff1615620001bd5760405162461bcd60e51b815260206004820152601960248201527f6e6f6e4475706c6963617465643a206475706c69636174656400000000000000604482015260640162000147565b8115620001ce57620001ce6200038c565b6000600c544311620001e357600c54620001e5565b435b9050846001600160401b0316600b54620002009190620007aa565b600b556001600160a01b0384166000908152600f60205260408120805460ff191660011790556003546001600160401b03811115620002435762000243620007c5565b6040519080825280602002602001820160405280156200026d578160200160208202803683370190505b50604080516080810182526001600160a01b0380891682526001600160401b03808b1660208085019182528883169585019586526060850187815260098054600181018255600091909152865160039091027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af8101805495518716600160a01b026001600160e01b0319909616929097169190911793909317855595517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b083018054919094166001600160401b031990911617909255935180519596509294919362000381937f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b19091019291019062000702565b505050505050505050565b60095460005b81811015620003bb57620003a681620003bf565b80620003b281620007db565b91505062000392565b5050565b600060098281548110620003d757620003d7620007f7565b6000918252602090912060039091020160018101549091506001600160401b0316431162000403575050565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047291906200080d565b90508015806200049157508154600160a01b90046001600160401b0316155b15620004b7575060010180546001600160401b031916436001600160401b031617905550565b6001820154600090620004d4906001600160401b031643620006ed565b60035490915015620006cc57600060078054806020026020016040519081016040528092919081815260200182805480156200053057602002820191906000526020600020905b8154815260200190600101908083116200051b575b50506040805160808101825289546001600160a01b03811682526001600160401b03600160a01b909104811660208084019190915260018c01549091168284015260028b0180548451818402810184019095528085529798506000979296508b95506060870194509190830182828015620005cb57602002820191906000526020600020905b815481526020019060010190808311620005b6575b505050505081525050905060005b600354811015620006c8576000600b5483602001516001600160401b03168584815181106200060c576200060c620007f7565b60200260200101518762000621919062000827565b6200062d919062000827565b62000639919062000849565b90508562000655826c0c9f2c9cd04674edea4000000062000827565b62000661919062000849565b836060015183815181106200067a576200067a620007f7565b60200260200101516200068e9190620007aa565b876002018381548110620006a657620006a6620007f7565b6000918252602090912001555080620006bf81620007db565b915050620005d9565b5050505b505060010180546001600160401b031916436001600160401b031617905550565b6000620006fb83836200086c565b9392505050565b82805482825590600052602060002090810192821562000740579160200282015b828111156200074057825182559160200191906001019062000723565b506200074e92915062000752565b5090565b5b808211156200074e576000815560010162000753565b6000602082840312156200077c57600080fd5b81516001600160a01b0381168114620006fb57600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115620007c057620007c062000794565b500190565b634e487b7160e01b600052604160045260246000fd5b600060018201620007f057620007f062000794565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156200082057600080fd5b5051919050565b600081600019048311821515161562000844576200084462000794565b500290565b6000826200086757634e487b7160e01b600052601260045260246000fd5b500490565b60008282101562000881576200088162000794565b500390565b61409980620008966000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c80636184ee8a11610182578063aa97b0a0116100e9578063d3e15747116100a2578063ef76aea81161007c578063ef76aea8146106dd578063f0b37c04146106f0578063f2fde38b14610703578063f887ea401461071657600080fd5b8063d3e15747146106a4578063e2bbb158146106b7578063e914a34f146106ca57600080fd5b8063aa97b0a014610612578063b66c79bb14610625578063b6a5d7de14610638578063b91816111461064b578063cbd258b51461066e578063d18df53c1461069157600080fd5b80637370ebef1161013b5780637370ebef1461058a5780637c2b83b61461059d5780638da5cb5b146105b05780638dbb1e3a146105c157806393f1a40b146105d4578063aa24e67f146105ff57600080fd5b80636184ee8a146104fe578063630b5ba1146105295780636348657c1461053157806363a6410314610544578063715018a61461056f57806372d343541461057757600080fd5b8063441a3e701161022657806350ebbb0d116101df57806350ebbb0d1461049257806351eb05a6146104a55780635312ea8e146104b857806353398119146104cb57806353b2e581146104de5780635f9e8f82146104f157600080fd5b8063441a3e701461040a5780634460d3cf1461041d57806345d942851461043057806348cd4cb1146104435780634939ccfc1461044c5780634cf5fbf51461047f57600080fd5b80632dfd0bdc116102785780632dfd0bdc1461036a57806332f812ab146103725780633c78929e146103855780633e8f5ad41461038e5780633f180538146103c1578063401519b6146103f757600080fd5b8063081e3eda146102c05780630e3802e9146102d75780630ee2e663146102ec5780631526fe271461030c57806317909cb31461034e57806317caf6f114610361575b600080fd5b6009545b6040519081526020015b60405180910390f35b6102ea6102e5366004613c08565b610729565b005b6102ff6102fa366004613c34565b6108ee565b6040516102ce9190613c4d565b61031f61031a366004613c34565b61096d565b604080516001600160a01b0390941684526001600160401b0392831660208501529116908201526060016102ce565b6102ea61035c366004613c91565b6109b8565b6102c4600b5481565b6102ea610ebf565b6102ea610380366004613c91565b610fb8565b6102c4600d5481565b6103b161039c366004613cb3565b60106020526000908152604090205460ff1681565b60405190151581526020016102ce565b6102c46103cf366004613cd0565b6000918252600a602090815260408084206001600160a01b0393909316845291905290205490565b6102ea610405366004613d2a565b611047565b6102ea610418366004613c91565b611128565b6102ea61042b366004613cb3565b6113d9565b6102ea61043e366004613c91565b61157f565b6102c4600c5481565b6102c461045a366004613cd0565b6001600160a01b03166000908152600860209081526040808320938352929052205490565b6102ea61048d366004613d6a565b611827565b6102ea6104a0366004613c91565b6118a5565b6102ea6104b3366004613c34565b611945565b6102ea6104c6366004613c34565b611c4b565b6102ea6104d9366004613d9f565b611de4565b6102ff6104ec366004613cd0565b611e5c565b600e546103b19060ff1681565b61051161050c366004613c34565b611ed3565b6040516001600160a01b0390911681526020016102ce565b6102ea611efd565b600254610511906001600160a01b031681565b6102c4610552366004613c08565b600860209081526000928352604080842090915290825290205481565b6102ea611f2a565b6102c4610585366004613c34565b611f61565b6102c4610598366004613c34565b611f82565b6102ea6105ab366004613c91565b611f92565b6000546001600160a01b0316610511565b6102c46105cf366004613c91565b6120bc565b6102c46105e2366004613cd0565b600a60209081526000928352604080842090915290825290205481565b6102c461060d366004613c34565b6120cf565b6102ea610620366004613dbc565b6120df565b6102ea610633366004613c91565b612333565b6102ea610646366004613cb3565b61260a565b6103b1610659366004613cb3565b60116020526000908152604090205460ff1681565b6103b161067c366004613cb3565b600f6020526000908152604090205460ff1681565b6102ff61069f366004613cd0565b612658565b6102ea6106b2366004613c34565b612ad9565b6102ea6106c5366004613c91565b612b3d565b6102ea6106d8366004613c34565b612b77565b6102ff6106eb366004613cd0565b612f5f565b6102ea6106fe366004613cb3565b612fd4565b6102ea610711366004613cb3565b61301f565b600454610511906001600160a01b031681565b6000546001600160a01b0316331461075c5760405162461bcd60e51b815260040161075390613dea565b60405180910390fd5b6001600160a01b038216600090815260106020526040902054829060ff16156107c35760405162461bcd60e51b81526020600482015260196024820152781b9bdb911d5c1b1a58d85d19590e88191d5c1b1a58d85d1959603a1b6044820152606401610753565b6003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b038616908117909155600780548084019091557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018490556000908152601060205260408120805460ff1916909217909155600954905b818110156108a3576009818154811061087657610876613e1f565b6000918252602082206002600390920201018054600101815590528061089b81613e4b565b91505061085b565b5082846001600160a01b03167fb75e540d948d21695cea1c0838e8d12cdabb7cb689e1cd1dc05f88d2c4944887426040516108e091815260200190565b60405180910390a350505050565b606060006009838154811061090557610905613e1f565b906000526020600020906003020160020180548060200260200160405190810160405280929190818152602001828054801561096057602002820191906000526020600020905b81548152602001906001019080831161094c575b5093979650505050505050565b6009818154811061097d57600080fd5b6000918252602090912060039091020180546001909101546001600160a01b03821692506001600160401b03600160a01b9092048216911683565b6002600154036109da5760405162461bcd60e51b815260040161075390613e64565b60026001553360009081526000805160206140448339815191526020526040812090610a0590611945565b8054610a5d5760405162461bcd60e51b815260206004820152602160248201527f7265696e76657374526577617264733a204e6f20746f6b656e73207374616b656044820152601960fa1b6064820152608401610753565b610a686000336130bc565b6000816002018481548110610a7f57610a7f613e1f565b906000526020600020015490506000826002018581548110610aa357610aa3613e1f565b6000918252602082200191909155604080516002808252606082019092529081602001602082028036833701905050905060038581548110610ae757610ae7613e1f565b600091825260208220015482516001600160a01b03909116918391610b0e57610b0e613e1f565b6001600160a01b039283166020918202929092010152600254825191169082906001908110610b3f57610b3f613e1f565b6001600160a01b03909216602092830291909101909101528115610eb45760038581548110610b7057610b70613e1f565b6000918252602090912001546004805460405163095ea7b360e01b81526001600160a01b0391821692810192909252602482018590529091169063095ea7b3906044016020604051808303816000875af1158015610bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf69190613eb1565b506002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c649190613ece565b60048054604051635c11d79560e01b81529293506001600160a01b031691635c11d79591610c9c9187918a9188913091429101613ee7565b600060405180830381600087803b158015610cb657600080fd5b505af1158015610cca573d6000803e3d6000fd5b50506002546040516370a0823160e01b8152306004820152600093508492506001600160a01b03909116906370a0823190602401602060405180830381865afa158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190613ece565b610d499190613f58565b905080856000016000828254610d5f9190613f6f565b9091555050845460098054600091908290610d7c57610d7c613e1f565b9060005260206000209060030201600201805480602002602001604051908101604052809291908181526020018280548015610dd757602002820191906000526020600020905b815481526020019060010190808311610dc3575b5050505050905060005b600354811015610e765768327cb2734119d3b7a9601e1b828281518110610e0a57610e0a613e1f565b602002602001015184610e1d9190613f87565b610e279190613fa6565b33600090815260008051602061404483398151915260205260409020600101805483908110610e5857610e58613e1f565b60009182526020909120015580610e6e81613e4b565b915050610de1565b5060405183815260009033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505050505b505060018055505050565b6000546001600160a01b03163314610ee95760405162461bcd60e51b815260040161075390613dea565b43600c5411610f485760405162461bcd60e51b815260206004820152602560248201527f7374617274526577617264733a207265776172647320616c7265616479207374604482015264185c9d195960da1b6064820152608401610753565b43600c5560005b600954811015610fb5574360098281548110610f6d57610f6d613e1f565b906000526020600020906003020160010160006101000a8154816001600160401b0302191690836001600160401b031602179055508080610fad90613e4b565b915050610f4f565b50565b6000546001600160a01b03163314610fe25760405162461bcd60e51b815260040161075390613dea565b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001929092556006805492830181556000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90910155565b6000546001600160a01b031633146110715760405162461bcd60e51b815260040161075390613dea565b801561107f5761107f611efd565b816001600160401b03166009848154811061109c5761109c613e1f565b6000918252602090912060039091020154600b546110ca91600160a01b90046001600160401b031690613f58565b6110d49190613f6f565b600b8190555081600984815481106110ee576110ee613e1f565b906000526020600020906003020160000160146101000a8154816001600160401b0302191690836001600160401b03160217905550505050565b60026001540361114a5760405162461bcd60e51b815260040161075390613e64565b6002600155600d54421161115d57600080fd5b6000828152600a6020908152604080832033845290915281208054909190611186908490613f58565b9050600083116111cd5760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b6044820152606401610753565b6111d684611945565b60035415611356576111e884336130bc565b6000600985815481106111fd576111fd613e1f565b906000526020600020906003020160020180548060200260200160405190810160405280929190818152602001828054801561125857602002820191906000526020600020905b815481526020019060010190808311611244575b5050505050905060005b60035481101561135357600084600201828154811061128357611283613e1f565b90600052602060002001541115611341576112be81338660020184815481106112ae576112ae613e1f565b90600052602060002001546133f9565b60008460020182815481106112d5576112d5613e1f565b906000526020600020018190555068327cb2734119d3b7a9601e1b82828151811061130257611302613e1f565b6020026020010151846113159190613f87565b61131f9190613fa6565b84600101828154811061133457611334613e1f565b6000918252602090912001555b8061134b81613e4b565b915050611262565b50505b80826000018190555061139833846009878154811061137757611377613e1f565b60009182526020909120600390910201546001600160a01b031691906135ce565b604051838152849033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35050600180555050565b6000546001600160a01b031633146114035760405162461bcd60e51b815260040161075390613dea565b6001600160a01b03811660009081526010602052604090205460ff1615801561144557506001600160a01b0381166000908152600f602052604090205460ff16155b61149b5760405162461bcd60e51b815260206004820152602160248201527f726573637565546f6b656e203a2077726f6e6720746f6b656e206164647265736044820152607360f81b6064820152608401610753565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156114e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115069190613ece565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a9190613eb1565b505050565b6002600154036115a15760405162461bcd60e51b815260040161075390613e64565b60026001819055506000600582815481106115be576115be613e1f565b9060005260206000200154836115d49190613f87565b336000908152600080516020614044833981519152602052604081205491925090611600908390613f58565b90506000821161160f57600080fd5b6116196000611945565b6116246000336130bc565b336000908152600080516020614044833981519152602052604090208190556003541561175e576000600960008154811061166157611661613e1f565b90600052602060002090600302016002018054806020026020016040519081016040528092919081815260200182805480156116bc57602002820191906000526020600020905b8154815260200190600101908083116116a8575b5050505050905060005b60035481101561175b5768327cb2734119d3b7a9601e1b8282815181106116ef576116ef613e1f565b6020026020010151846117029190613f87565b61170c9190613fa6565b3360009081526000805160206140448339815191526020526040902060010180548390811061173d5761173d613e1f565b6000918252602090912001558061175381613e4b565b9150506116c6565b50505b33600090815260086020908152604080832086845290915281208054869290611788908490613f6f565b909155505060068054849081106117a1576117a1613e1f565b600091825260208083209091015433835260088252604080842087855290925291205411156117cf57600080fd5b6002546117e8906001600160a01b031661dead846135ce565b60405182815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a25050600180555050565b3360009081526011602052604090205460ff16151560011461189a5760405162461bcd60e51b815260206004820152602660248201527f6f6e6c79417574686f72697a65643a2061646472657373206e6f7420617574686044820152651bdc9a5e995960d21b6064820152608401610753565b61157a838383613631565b6000546001600160a01b031633146118cf5760405162461bcd60e51b815260040161075390613dea565b60035482106118dd57600080fd5b6118e5611efd565b80600783815481106118f9576118f9613e1f565b60009182526020909120015560405133907fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c4053906119399084815260200190565b60405180910390a25050565b60006009828154811061195a5761195a613e1f565b6000918252602090912060039091020160018101549091506001600160401b03164311611985575050565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156119cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f19190613ece565b9050801580611a0f57508154600160a01b90046001600160401b0316155b15611a355750600101805467ffffffffffffffff1916436001600160401b031617905550565b6001820154600090611a50906001600160401b0316436120bc565b60035490915015611c295760006007805480602002602001604051908101604052809291908181526020018280548015611aa957602002820191906000526020600020905b815481526020019060010190808311611a95575b50506040805160808101825289546001600160a01b03811682526001600160401b03600160a01b909104811660208084019190915260018c01549091168284015260028b0180548451818402810184019095528085529798506000979296508b95506060870194509190830182828015611b4257602002820191906000526020600020905b815481526020019060010190808311611b2e575b505050505081525050905060005b600354811015611c25576000600b5483602001516001600160401b0316858481518110611b7f57611b7f613e1f565b602002602001015187611b929190613f87565b611b9c9190613f87565b611ba69190613fa6565b905085611bbf8268327cb2734119d3b7a9601e1b613f87565b611bc99190613fa6565b83606001518381518110611bdf57611bdf613e1f565b6020026020010151611bf19190613f6f565b876002018381548110611c0657611c06613e1f565b6000918252602090912001555080611c1d81613e4b565b915050611b50565b5050505b5050600101805467ffffffffffffffff1916436001600160401b031617905550565b600260015403611c6d5760405162461bcd60e51b815260040161075390613e64565b60026001908155600e5460ff16151514611cd45760405162461bcd60e51b815260206004820152602260248201527f6f6e6c79456d657267656e63793a20456d657267656e637920757365206f6e6c604482015261792160f01b6064820152608401610753565b600060098281548110611ce957611ce9613e1f565b60009182526020808320858452600a82526040808520338652909252908320805460038054940290920194509290916001600160401b03811115611d2f57611d2f613e9b565b604051908082528060200260200182016040528015611d58578160200160208202803683370190505b50600084558051909150611d759060018501906020840190613b93565b508051611d8b9060028501906020840190613b93565b508354611da2906001600160a01b031633846135ce565b604051828152859033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a3505060018055505050565b6000546001600160a01b03163314611e0e5760405162461bcd60e51b815260040161075390613dea565b600e805460ff19168215159081179091556040805142815260208101929092527fff8db90c07460bbb951945fef7481379809de7701710f89abe56cbaa5216df1e910160405180910390a150565b6000828152600a602090815260408083206001600160a01b03851684528252808320600201805482518185028101850190935280835260609493830182828015611ec557602002820191906000526020600020905b815481526020019060010190808311611eb1575b509398975050505050505050565b60038181548110611ee357600080fd5b6000918252602090912001546001600160a01b0316905081565b60095460005b81811015611f2657611f1481611945565b80611f1e81613e4b565b915050611f03565b5050565b6000546001600160a01b03163314611f545760405162461bcd60e51b815260040161075390613dea565b611f5f61dead6138bb565b565b60068181548110611f7157600080fd5b600091825260209091200154905081565b60058181548110611f7157600080fd5b600260015403611fb45760405162461bcd60e51b815260040161075390613e64565b600260015581611fc357600080fd5b600060058281548110611fd857611fd8613e1f565b906000526020600020015483611fee9190613f87565b33600090815260086020908152604080832086845290915281208054929350859290919061201d908490613f6f565b9091555050600680548390811061203657612036613e1f565b6000918252602080832090910154338352600882526040808420868552909252912054111561206457600080fd5b60025461207e906001600160a01b03163361dead8461390b565b60405181815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a250506001805550565b60006120c88383613f58565b9392505050565b60078181548110611f7157600080fd5b6000546001600160a01b031633146121095760405162461bcd60e51b815260040161075390613dea565b6001600160a01b0382166000908152600f6020526040902054829060ff16156121705760405162461bcd60e51b81526020600482015260196024820152781b9bdb911d5c1b1a58d85d19590e88191d5c1b1a58d85d1959603a1b6044820152606401610753565b811561217e5761217e611efd565b6000600c54431161219157600c54612193565b435b9050846001600160401b0316600b546121ac9190613f6f565b600b556001600160a01b0384166000908152600f60205260408120805460ff191660011790556003546001600160401b038111156121ec576121ec613e9b565b604051908082528060200260200182016040528015612215578160200160208202803683370190505b50604080516080810182526001600160a01b0380891682526001600160401b03808b1660208085019182528883169585019586526060850187815260098054600181018255600091909152865160039091027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af8101805495518716600160a01b026001600160e01b0319909616929097169190911793909317855595517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0830180549190941667ffffffffffffffff19909116179092559351805195965092949193612328937f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b190910192910190613b93565b505050505050505050565b6002600154036123555760405162461bcd60e51b815260040161075390613e64565b6002600155600354811061236857600080fd5b61237182611945565b6000828152600a60209081526040808320338452909152812060098054919291859081106123a1576123a1613e1f565b90600052602060002090600302016002018054806020026020016040519081016040528092919081815260200182805480156123fc57602002820191906000526020600020905b8154815260200190600101908083116123e8575b505050505090506000838360010180549050116124d55768327cb2734119d3b7a9601e1b82858151811061243257612432613e1f565b602002602001015184600001546124499190613f87565b6124539190613fa6565b60018401549091506000906124689086613f58565b905080156124aa5760005b818110156124a857600285018054600190810190915580860180549091018155600052806124a081613e4b565b915050612473565b505b50600283018054600190810190915580840180549182018155600090815260209020018190556125f2565b8260010184815481106124ea576124ea613e1f565b906000526020600020015483600201858154811061250a5761250a613e1f565b906000526020600020015468327cb2734119d3b7a9601e1b84878151811061253457612534613e1f565b6020026020010151866000015461254b9190613f87565b6125559190613fa6565b61255f9190613f6f565b6125699190613f58565b9050600083600201858154811061258257612582613e1f565b906000526020600020018190555068327cb2734119d3b7a9601e1b8285815181106125af576125af613e1f565b602002602001015184600001546125c69190613f87565b6125d09190613fa6565b8360010185815481106125e5576125e5613e1f565b6000918252602090912001555b600081116125ff57600080fd5b610eb48433836133f9565b6000546001600160a01b031633146126345760405162461bcd60e51b815260040161075390613dea565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b606060006009848154811061266f5761266f613e1f565b600091825260209182902060408051608081018252600390930290910180546001600160a01b03811684526001600160401b03600160a01b909104811684860152600182015416838301526002810180548351818702810187019094528084529394919360608601939283018282801561270857602002820191906000526020600020905b8154815260200190600101908083116126f4575b505050919092525050506000858152600a602090815260408083206001600160a01b038816845282528083208151606081018352815481526001820180548451818702810187019095528085529697509495909491938581019392919083018282801561279457602002820191906000526020600020905b815481526020019060010190808311612780575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156127ec57602002820191906000526020600020905b8154815260200190600101908083116127d8575b505050919092525050815184516040516370a0823160e01b81523060048201529394509092600092506001600160a01b03909116906370a0823190602401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286b9190613ece565b6060850151600354919250906000906001600160401b0381111561289157612891613e9b565b6040519080825280602002602001820160405280156128ba578160200160208202803683370190505b5090508315612acd5760006128dc87604001516001600160401b0316436120bc565b905060005b600354811015612aca576000600b5489602001516001600160401b03166007848154811061291157612911613e1f565b9060005260206000200154856129279190613f87565b6129319190613f87565b61293b9190613fa6565b9050856129548268327cb2734119d3b7a9601e1b613f87565b61295e9190613fa6565b85838151811061297057612970613e1f565b60200260200101516129829190613f6f565b85838151811061299457612994613e1f565b602002602001018181525050876020015151821015612a5c57876040015182815181106129c3576129c3613e1f565b6020026020010151886020015183815181106129e1576129e1613e1f565b602002602001015168327cb2734119d3b7a9601e1b878581518110612a0857612a08613e1f565b60200260200101518a612a1b9190613f87565b612a259190613fa6565b612a2f9190613f58565b612a399190613f6f565b848381518110612a4b57612a4b613e1f565b602002602001018181525050612ab7565b68327cb2734119d3b7a9601e1b858381518110612a7b57612a7b613e1f565b602002602001015188612a8e9190613f87565b612a989190613fa6565b848381518110612aaa57612aaa613e1f565b6020026020010181815250505b5080612ac281613e4b565b9150506128e1565b50505b98975050505050505050565b6000546001600160a01b03163314612b035760405162461bcd60e51b815260040161075390613dea565b612b104262127500613f6f565b8111158015612b2f575042600d5462015180612b2c9190613f6f565b11155b612b3857600080fd5b600d55565b600260015403612b5f5760405162461bcd60e51b815260040161075390613e64565b6002600155612b6f338383613631565b505060018055565b600260015403612b995760405162461bcd60e51b815260040161075390613e64565b6002600155612ba781611945565b6000818152600a6020908152604080832033845290915281206009805491929184908110612bd757612bd7613e1f565b9060005260206000209060030201600201805480602002602001604051908101604052809291908181526020018280548015612c3257602002820191906000526020600020905b815481526020019060010190808311612c1e575b505050505090506000826040518060600160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015612ca057602002820191906000526020600020905b815481526020019060010190808311612c8c575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015612cf857602002820191906000526020600020905b815481526020019060010190808311612ce4575b5050509190925250506003549192505015612f555760005b816020015151811015612e5b57600082604001518281518110612d3557612d35613e1f565b602002602001015183602001518381518110612d5357612d53613e1f565b602002602001015168327cb2734119d3b7a9601e1b868581518110612d7a57612d7a613e1f565b60200260200101518660000151612d919190613f87565b612d9b9190613fa6565b612da59190613f58565b612daf9190613f6f565b90508015612e48576000856002018381548110612dce57612dce613e1f565b906000526020600020018190555068327cb2734119d3b7a9601e1b848381518110612dfb57612dfb613e1f565b60200260200101518460000151612e129190613f87565b612e1c9190613fa6565b856001018381548110612e3157612e31613e1f565b600091825260209091200155612e488233836133f9565b5080612e5381613e4b565b915050612d10565b5060035460208201515114612f55576020810151515b600354811015612f5357600068327cb2734119d3b7a9601e1b848381518110612e9c57612e9c613e1f565b60200260200101518460000151612eb39190613f87565b612ebd9190613fa6565b60028601805460019081018255600091909152855191925086019068327cb2734119d3b7a9601e1b90869085908110612ef857612ef8613e1f565b60200260200101518560000151612f0f9190613f87565b612f199190613fa6565b815460018101835560009283526020909220909101558015612f4057612f408233836133f9565b5080612f4b81613e4b565b915050612e71565b505b5050600180555050565b6000828152600a602090815260408083206001600160a01b03851684528252808320600101805482518185028101850190935280835260609493830182828015611ec55760200282019190600052602060002090815481526020019060010190808311611eb157509398975050505050505050565b6000546001600160a01b03163314612ffe5760405162461bcd60e51b815260040161075390613dea565b6001600160a01b03166000908152601160205260409020805460ff19169055565b6000546001600160a01b031633146130495760405162461bcd60e51b815260040161075390613dea565b61deac196001600160a01b038216016130b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610753565b610fb5816138bb565b60035415611f26576000828152600a602090815260408083206001600160a01b0385168452909152812060098054919291859081106130fd576130fd613e1f565b600091825260209182902060408051608081018252600390930290910180546001600160a01b03811684526001600160401b03600160a01b909104811684860152600182015416838301526002810180548351818702810187019094528084529394919360608601939283018282801561319657602002820191906000526020600020905b815481526020019060010190808311613182575b5050505050815250509050600082604051806060016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561320857602002820191906000526020600020905b8154815260200190600101908083116131f4575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561326057602002820191906000526020600020905b81548152602001906001019080831161324c575b505050505081525050905060005b81602001515181101561334f5760008260400151828151811061329357613293613e1f565b6020026020010151836020015183815181106132b1576132b1613e1f565b602002602001015168327cb2734119d3b7a9601e1b866060015185815181106132dc576132dc613e1f565b602002602001015186600001516132f39190613f87565b6132fd9190613fa6565b6133079190613f58565b6133119190613f6f565b9050801561333c578085600201838154811061332f5761332f613e1f565b6000918252602090912001555b508061334781613e4b565b91505061326e565b50600354602082015151146133f2576020810151515b6003548110156133f057600068327cb2734119d3b7a9601e1b8460600151838151811061339457613394613e1f565b602002602001015184600001516133ab9190613f87565b6133b59190613fa6565b6002860180546001818101835560009283526020832090910192909255818701805490920182555250806133e881613e4b565b915050613365565b505b5050505050565b60006003848154811061340e5761340e613e1f565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa158015613461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134859190613ece565b905060008184111561350b5760405163a9059cbb60e01b81526001600160a01b0386811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af11580156134e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135049190613eb1565b9050613581565b60405163a9059cbb60e01b81526001600160a01b0386811660048301526024820186905284169063a9059cbb906044016020604051808303816000875af115801561355a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357e9190613eb1565b90505b806133f05760405162461bcd60e51b815260206004820181905260248201527f736166655257545472616e736665723a207472616e73666572206661696c65646044820152606401610753565b6040516001600160a01b03831660248201526044810182905261157a90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613949565b6000811161363e57600080fd5b6000828152600a602090815260408083206001600160a01b03871684529091529020805461366b84611945565b801561367b5761367b84866130bc565b6136b63330856009888154811061369457613694613e1f565b60009182526020909120600390910201546001600160a01b031692919061390b565b6136c08382613f6f565b82556003541561387057816000015490506000600985815481106136e6576136e6613e1f565b906000526020600020906003020160020180548060200260200160405190810160405280929190818152602001828054801561374157602002820191906000526020600020905b81548152602001906001019080831161372d575b5050505050905060005b60018401548110156137c65768327cb2734119d3b7a9601e1b82828151811061377657613776613e1f565b6020026020010151846137899190613f87565b6137939190613fa6565b8460010182815481106137a8576137a8613e1f565b600091825260209091200155806137be81613e4b565b91505061374b565b5060035460018401541461386e5760018301545b60035481101561386c57600284018054600181810183556000928352602083209091019190915582519085019068327cb2734119d3b7a9601e1b9084908490811061382757613827613e1f565b60200260200101518561383a9190613f87565b6138449190613fa6565b815460018101835560009283526020909220909101558061386481613e4b565b9150506137da565b505b505b83856001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040516138ac91815260200190565b60405180910390a35050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526139439085906323b872dd60e01b906084016135fa565b50505050565b600061399e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a1b9092919063ffffffff16565b80519091501561157a57808060200190518101906139bc9190613eb1565b61157a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610753565b6060613a2a8484600085613a32565b949350505050565b606082471015613a935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610753565b843b613ae15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610753565b600080866001600160a01b03168587604051613afd9190613ff4565b60006040518083038185875af1925050503d8060008114613b3a576040519150601f19603f3d011682016040523d82523d6000602084013e613b3f565b606091505b5091509150613b4f828286613b5a565b979650505050505050565b60608315613b695750816120c8565b825115613b795782518084602001fd5b8160405162461bcd60e51b81526004016107539190614010565b828054828255906000526020600020908101928215613bce579160200282015b82811115613bce578251825591602001919060010190613bb3565b50613bda929150613bde565b5090565b5b80821115613bda5760008155600101613bdf565b6001600160a01b0381168114610fb557600080fd5b60008060408385031215613c1b57600080fd5b8235613c2681613bf3565b946020939093013593505050565b600060208284031215613c4657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015613c8557835183529284019291840191600101613c69565b50909695505050505050565b60008060408385031215613ca457600080fd5b50508035926020909101359150565b600060208284031215613cc557600080fd5b81356120c881613bf3565b60008060408385031215613ce357600080fd5b823591506020830135613cf581613bf3565b809150509250929050565b80356001600160401b0381168114613d1757600080fd5b919050565b8015158114610fb557600080fd5b600080600060608486031215613d3f57600080fd5b83359250613d4f60208501613d00565b91506040840135613d5f81613d1c565b809150509250925092565b600080600060608486031215613d7f57600080fd5b8335613d8a81613bf3565b95602085013595506040909401359392505050565b600060208284031215613db157600080fd5b81356120c881613d1c565b600080600060608486031215613dd157600080fd5b613dda84613d00565b92506020840135613d4f81613bf3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613e5d57613e5d613e35565b5060010190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613ec357600080fd5b81516120c881613d1c565b600060208284031215613ee057600080fd5b5051919050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613f375784516001600160a01b031683529383019391830191600101613f12565b50506001600160a01b03969096166060850152505050608001529392505050565b600082821015613f6a57613f6a613e35565b500390565b60008219821115613f8257613f82613e35565b500190565b6000816000190483118215151615613fa157613fa1613e35565b500290565b600082613fc357634e487b7160e01b600052601260045260246000fd5b500490565b60005b83811015613fe3578181015183820152602001613fcb565b838111156139435750506000910152565b60008251614006818460208701613fc8565b9190910192915050565b602081526000825180602084015261402f816040850160208701613fc8565b601f01601f1916919091016040019291505056fe13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3a2646970667358221220c915a5edbc3e5b3c8cae46afe5105b2c4f694889a5dba6abb75ecceab5a1d3ca64736f6c634300080f0033000000000000000000000000c94f3e2ade5e92389af7e543657211ecccaff11e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c80636184ee8a11610182578063aa97b0a0116100e9578063d3e15747116100a2578063ef76aea81161007c578063ef76aea8146106dd578063f0b37c04146106f0578063f2fde38b14610703578063f887ea401461071657600080fd5b8063d3e15747146106a4578063e2bbb158146106b7578063e914a34f146106ca57600080fd5b8063aa97b0a014610612578063b66c79bb14610625578063b6a5d7de14610638578063b91816111461064b578063cbd258b51461066e578063d18df53c1461069157600080fd5b80637370ebef1161013b5780637370ebef1461058a5780637c2b83b61461059d5780638da5cb5b146105b05780638dbb1e3a146105c157806393f1a40b146105d4578063aa24e67f146105ff57600080fd5b80636184ee8a146104fe578063630b5ba1146105295780636348657c1461053157806363a6410314610544578063715018a61461056f57806372d343541461057757600080fd5b8063441a3e701161022657806350ebbb0d116101df57806350ebbb0d1461049257806351eb05a6146104a55780635312ea8e146104b857806353398119146104cb57806353b2e581146104de5780635f9e8f82146104f157600080fd5b8063441a3e701461040a5780634460d3cf1461041d57806345d942851461043057806348cd4cb1146104435780634939ccfc1461044c5780634cf5fbf51461047f57600080fd5b80632dfd0bdc116102785780632dfd0bdc1461036a57806332f812ab146103725780633c78929e146103855780633e8f5ad41461038e5780633f180538146103c1578063401519b6146103f757600080fd5b8063081e3eda146102c05780630e3802e9146102d75780630ee2e663146102ec5780631526fe271461030c57806317909cb31461034e57806317caf6f114610361575b600080fd5b6009545b6040519081526020015b60405180910390f35b6102ea6102e5366004613c08565b610729565b005b6102ff6102fa366004613c34565b6108ee565b6040516102ce9190613c4d565b61031f61031a366004613c34565b61096d565b604080516001600160a01b0390941684526001600160401b0392831660208501529116908201526060016102ce565b6102ea61035c366004613c91565b6109b8565b6102c4600b5481565b6102ea610ebf565b6102ea610380366004613c91565b610fb8565b6102c4600d5481565b6103b161039c366004613cb3565b60106020526000908152604090205460ff1681565b60405190151581526020016102ce565b6102c46103cf366004613cd0565b6000918252600a602090815260408084206001600160a01b0393909316845291905290205490565b6102ea610405366004613d2a565b611047565b6102ea610418366004613c91565b611128565b6102ea61042b366004613cb3565b6113d9565b6102ea61043e366004613c91565b61157f565b6102c4600c5481565b6102c461045a366004613cd0565b6001600160a01b03166000908152600860209081526040808320938352929052205490565b6102ea61048d366004613d6a565b611827565b6102ea6104a0366004613c91565b6118a5565b6102ea6104b3366004613c34565b611945565b6102ea6104c6366004613c34565b611c4b565b6102ea6104d9366004613d9f565b611de4565b6102ff6104ec366004613cd0565b611e5c565b600e546103b19060ff1681565b61051161050c366004613c34565b611ed3565b6040516001600160a01b0390911681526020016102ce565b6102ea611efd565b600254610511906001600160a01b031681565b6102c4610552366004613c08565b600860209081526000928352604080842090915290825290205481565b6102ea611f2a565b6102c4610585366004613c34565b611f61565b6102c4610598366004613c34565b611f82565b6102ea6105ab366004613c91565b611f92565b6000546001600160a01b0316610511565b6102c46105cf366004613c91565b6120bc565b6102c46105e2366004613cd0565b600a60209081526000928352604080842090915290825290205481565b6102c461060d366004613c34565b6120cf565b6102ea610620366004613dbc565b6120df565b6102ea610633366004613c91565b612333565b6102ea610646366004613cb3565b61260a565b6103b1610659366004613cb3565b60116020526000908152604090205460ff1681565b6103b161067c366004613cb3565b600f6020526000908152604090205460ff1681565b6102ff61069f366004613cd0565b612658565b6102ea6106b2366004613c34565b612ad9565b6102ea6106c5366004613c91565b612b3d565b6102ea6106d8366004613c34565b612b77565b6102ff6106eb366004613cd0565b612f5f565b6102ea6106fe366004613cb3565b612fd4565b6102ea610711366004613cb3565b61301f565b600454610511906001600160a01b031681565b6000546001600160a01b0316331461075c5760405162461bcd60e51b815260040161075390613dea565b60405180910390fd5b6001600160a01b038216600090815260106020526040902054829060ff16156107c35760405162461bcd60e51b81526020600482015260196024820152781b9bdb911d5c1b1a58d85d19590e88191d5c1b1a58d85d1959603a1b6044820152606401610753565b6003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b038616908117909155600780548084019091557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018490556000908152601060205260408120805460ff1916909217909155600954905b818110156108a3576009818154811061087657610876613e1f565b6000918252602082206002600390920201018054600101815590528061089b81613e4b565b91505061085b565b5082846001600160a01b03167fb75e540d948d21695cea1c0838e8d12cdabb7cb689e1cd1dc05f88d2c4944887426040516108e091815260200190565b60405180910390a350505050565b606060006009838154811061090557610905613e1f565b906000526020600020906003020160020180548060200260200160405190810160405280929190818152602001828054801561096057602002820191906000526020600020905b81548152602001906001019080831161094c575b5093979650505050505050565b6009818154811061097d57600080fd5b6000918252602090912060039091020180546001909101546001600160a01b03821692506001600160401b03600160a01b9092048216911683565b6002600154036109da5760405162461bcd60e51b815260040161075390613e64565b60026001553360009081526000805160206140448339815191526020526040812090610a0590611945565b8054610a5d5760405162461bcd60e51b815260206004820152602160248201527f7265696e76657374526577617264733a204e6f20746f6b656e73207374616b656044820152601960fa1b6064820152608401610753565b610a686000336130bc565b6000816002018481548110610a7f57610a7f613e1f565b906000526020600020015490506000826002018581548110610aa357610aa3613e1f565b6000918252602082200191909155604080516002808252606082019092529081602001602082028036833701905050905060038581548110610ae757610ae7613e1f565b600091825260208220015482516001600160a01b03909116918391610b0e57610b0e613e1f565b6001600160a01b039283166020918202929092010152600254825191169082906001908110610b3f57610b3f613e1f565b6001600160a01b03909216602092830291909101909101528115610eb45760038581548110610b7057610b70613e1f565b6000918252602090912001546004805460405163095ea7b360e01b81526001600160a01b0391821692810192909252602482018590529091169063095ea7b3906044016020604051808303816000875af1158015610bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf69190613eb1565b506002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c649190613ece565b60048054604051635c11d79560e01b81529293506001600160a01b031691635c11d79591610c9c9187918a9188913091429101613ee7565b600060405180830381600087803b158015610cb657600080fd5b505af1158015610cca573d6000803e3d6000fd5b50506002546040516370a0823160e01b8152306004820152600093508492506001600160a01b03909116906370a0823190602401602060405180830381865afa158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190613ece565b610d499190613f58565b905080856000016000828254610d5f9190613f6f565b9091555050845460098054600091908290610d7c57610d7c613e1f565b9060005260206000209060030201600201805480602002602001604051908101604052809291908181526020018280548015610dd757602002820191906000526020600020905b815481526020019060010190808311610dc3575b5050505050905060005b600354811015610e765768327cb2734119d3b7a9601e1b828281518110610e0a57610e0a613e1f565b602002602001015184610e1d9190613f87565b610e279190613fa6565b33600090815260008051602061404483398151915260205260409020600101805483908110610e5857610e58613e1f565b60009182526020909120015580610e6e81613e4b565b915050610de1565b5060405183815260009033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505050505b505060018055505050565b6000546001600160a01b03163314610ee95760405162461bcd60e51b815260040161075390613dea565b43600c5411610f485760405162461bcd60e51b815260206004820152602560248201527f7374617274526577617264733a207265776172647320616c7265616479207374604482015264185c9d195960da1b6064820152608401610753565b43600c5560005b600954811015610fb5574360098281548110610f6d57610f6d613e1f565b906000526020600020906003020160010160006101000a8154816001600160401b0302191690836001600160401b031602179055508080610fad90613e4b565b915050610f4f565b50565b6000546001600160a01b03163314610fe25760405162461bcd60e51b815260040161075390613dea565b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001929092556006805492830181556000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90910155565b6000546001600160a01b031633146110715760405162461bcd60e51b815260040161075390613dea565b801561107f5761107f611efd565b816001600160401b03166009848154811061109c5761109c613e1f565b6000918252602090912060039091020154600b546110ca91600160a01b90046001600160401b031690613f58565b6110d49190613f6f565b600b8190555081600984815481106110ee576110ee613e1f565b906000526020600020906003020160000160146101000a8154816001600160401b0302191690836001600160401b03160217905550505050565b60026001540361114a5760405162461bcd60e51b815260040161075390613e64565b6002600155600d54421161115d57600080fd5b6000828152600a6020908152604080832033845290915281208054909190611186908490613f58565b9050600083116111cd5760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b6044820152606401610753565b6111d684611945565b60035415611356576111e884336130bc565b6000600985815481106111fd576111fd613e1f565b906000526020600020906003020160020180548060200260200160405190810160405280929190818152602001828054801561125857602002820191906000526020600020905b815481526020019060010190808311611244575b5050505050905060005b60035481101561135357600084600201828154811061128357611283613e1f565b90600052602060002001541115611341576112be81338660020184815481106112ae576112ae613e1f565b90600052602060002001546133f9565b60008460020182815481106112d5576112d5613e1f565b906000526020600020018190555068327cb2734119d3b7a9601e1b82828151811061130257611302613e1f565b6020026020010151846113159190613f87565b61131f9190613fa6565b84600101828154811061133457611334613e1f565b6000918252602090912001555b8061134b81613e4b565b915050611262565b50505b80826000018190555061139833846009878154811061137757611377613e1f565b60009182526020909120600390910201546001600160a01b031691906135ce565b604051838152849033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35050600180555050565b6000546001600160a01b031633146114035760405162461bcd60e51b815260040161075390613dea565b6001600160a01b03811660009081526010602052604090205460ff1615801561144557506001600160a01b0381166000908152600f602052604090205460ff16155b61149b5760405162461bcd60e51b815260206004820152602160248201527f726573637565546f6b656e203a2077726f6e6720746f6b656e206164647265736044820152607360f81b6064820152608401610753565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156114e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115069190613ece565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a9190613eb1565b505050565b6002600154036115a15760405162461bcd60e51b815260040161075390613e64565b60026001819055506000600582815481106115be576115be613e1f565b9060005260206000200154836115d49190613f87565b336000908152600080516020614044833981519152602052604081205491925090611600908390613f58565b90506000821161160f57600080fd5b6116196000611945565b6116246000336130bc565b336000908152600080516020614044833981519152602052604090208190556003541561175e576000600960008154811061166157611661613e1f565b90600052602060002090600302016002018054806020026020016040519081016040528092919081815260200182805480156116bc57602002820191906000526020600020905b8154815260200190600101908083116116a8575b5050505050905060005b60035481101561175b5768327cb2734119d3b7a9601e1b8282815181106116ef576116ef613e1f565b6020026020010151846117029190613f87565b61170c9190613fa6565b3360009081526000805160206140448339815191526020526040902060010180548390811061173d5761173d613e1f565b6000918252602090912001558061175381613e4b565b9150506116c6565b50505b33600090815260086020908152604080832086845290915281208054869290611788908490613f6f565b909155505060068054849081106117a1576117a1613e1f565b600091825260208083209091015433835260088252604080842087855290925291205411156117cf57600080fd5b6002546117e8906001600160a01b031661dead846135ce565b60405182815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a25050600180555050565b3360009081526011602052604090205460ff16151560011461189a5760405162461bcd60e51b815260206004820152602660248201527f6f6e6c79417574686f72697a65643a2061646472657373206e6f7420617574686044820152651bdc9a5e995960d21b6064820152608401610753565b61157a838383613631565b6000546001600160a01b031633146118cf5760405162461bcd60e51b815260040161075390613dea565b60035482106118dd57600080fd5b6118e5611efd565b80600783815481106118f9576118f9613e1f565b60009182526020909120015560405133907fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c4053906119399084815260200190565b60405180910390a25050565b60006009828154811061195a5761195a613e1f565b6000918252602090912060039091020160018101549091506001600160401b03164311611985575050565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156119cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f19190613ece565b9050801580611a0f57508154600160a01b90046001600160401b0316155b15611a355750600101805467ffffffffffffffff1916436001600160401b031617905550565b6001820154600090611a50906001600160401b0316436120bc565b60035490915015611c295760006007805480602002602001604051908101604052809291908181526020018280548015611aa957602002820191906000526020600020905b815481526020019060010190808311611a95575b50506040805160808101825289546001600160a01b03811682526001600160401b03600160a01b909104811660208084019190915260018c01549091168284015260028b0180548451818402810184019095528085529798506000979296508b95506060870194509190830182828015611b4257602002820191906000526020600020905b815481526020019060010190808311611b2e575b505050505081525050905060005b600354811015611c25576000600b5483602001516001600160401b0316858481518110611b7f57611b7f613e1f565b602002602001015187611b929190613f87565b611b9c9190613f87565b611ba69190613fa6565b905085611bbf8268327cb2734119d3b7a9601e1b613f87565b611bc99190613fa6565b83606001518381518110611bdf57611bdf613e1f565b6020026020010151611bf19190613f6f565b876002018381548110611c0657611c06613e1f565b6000918252602090912001555080611c1d81613e4b565b915050611b50565b5050505b5050600101805467ffffffffffffffff1916436001600160401b031617905550565b600260015403611c6d5760405162461bcd60e51b815260040161075390613e64565b60026001908155600e5460ff16151514611cd45760405162461bcd60e51b815260206004820152602260248201527f6f6e6c79456d657267656e63793a20456d657267656e637920757365206f6e6c604482015261792160f01b6064820152608401610753565b600060098281548110611ce957611ce9613e1f565b60009182526020808320858452600a82526040808520338652909252908320805460038054940290920194509290916001600160401b03811115611d2f57611d2f613e9b565b604051908082528060200260200182016040528015611d58578160200160208202803683370190505b50600084558051909150611d759060018501906020840190613b93565b508051611d8b9060028501906020840190613b93565b508354611da2906001600160a01b031633846135ce565b604051828152859033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a3505060018055505050565b6000546001600160a01b03163314611e0e5760405162461bcd60e51b815260040161075390613dea565b600e805460ff19168215159081179091556040805142815260208101929092527fff8db90c07460bbb951945fef7481379809de7701710f89abe56cbaa5216df1e910160405180910390a150565b6000828152600a602090815260408083206001600160a01b03851684528252808320600201805482518185028101850190935280835260609493830182828015611ec557602002820191906000526020600020905b815481526020019060010190808311611eb1575b509398975050505050505050565b60038181548110611ee357600080fd5b6000918252602090912001546001600160a01b0316905081565b60095460005b81811015611f2657611f1481611945565b80611f1e81613e4b565b915050611f03565b5050565b6000546001600160a01b03163314611f545760405162461bcd60e51b815260040161075390613dea565b611f5f61dead6138bb565b565b60068181548110611f7157600080fd5b600091825260209091200154905081565b60058181548110611f7157600080fd5b600260015403611fb45760405162461bcd60e51b815260040161075390613e64565b600260015581611fc357600080fd5b600060058281548110611fd857611fd8613e1f565b906000526020600020015483611fee9190613f87565b33600090815260086020908152604080832086845290915281208054929350859290919061201d908490613f6f565b9091555050600680548390811061203657612036613e1f565b6000918252602080832090910154338352600882526040808420868552909252912054111561206457600080fd5b60025461207e906001600160a01b03163361dead8461390b565b60405181815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a250506001805550565b60006120c88383613f58565b9392505050565b60078181548110611f7157600080fd5b6000546001600160a01b031633146121095760405162461bcd60e51b815260040161075390613dea565b6001600160a01b0382166000908152600f6020526040902054829060ff16156121705760405162461bcd60e51b81526020600482015260196024820152781b9bdb911d5c1b1a58d85d19590e88191d5c1b1a58d85d1959603a1b6044820152606401610753565b811561217e5761217e611efd565b6000600c54431161219157600c54612193565b435b9050846001600160401b0316600b546121ac9190613f6f565b600b556001600160a01b0384166000908152600f60205260408120805460ff191660011790556003546001600160401b038111156121ec576121ec613e9b565b604051908082528060200260200182016040528015612215578160200160208202803683370190505b50604080516080810182526001600160a01b0380891682526001600160401b03808b1660208085019182528883169585019586526060850187815260098054600181018255600091909152865160039091027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af8101805495518716600160a01b026001600160e01b0319909616929097169190911793909317855595517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0830180549190941667ffffffffffffffff19909116179092559351805195965092949193612328937f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b190910192910190613b93565b505050505050505050565b6002600154036123555760405162461bcd60e51b815260040161075390613e64565b6002600155600354811061236857600080fd5b61237182611945565b6000828152600a60209081526040808320338452909152812060098054919291859081106123a1576123a1613e1f565b90600052602060002090600302016002018054806020026020016040519081016040528092919081815260200182805480156123fc57602002820191906000526020600020905b8154815260200190600101908083116123e8575b505050505090506000838360010180549050116124d55768327cb2734119d3b7a9601e1b82858151811061243257612432613e1f565b602002602001015184600001546124499190613f87565b6124539190613fa6565b60018401549091506000906124689086613f58565b905080156124aa5760005b818110156124a857600285018054600190810190915580860180549091018155600052806124a081613e4b565b915050612473565b505b50600283018054600190810190915580840180549182018155600090815260209020018190556125f2565b8260010184815481106124ea576124ea613e1f565b906000526020600020015483600201858154811061250a5761250a613e1f565b906000526020600020015468327cb2734119d3b7a9601e1b84878151811061253457612534613e1f565b6020026020010151866000015461254b9190613f87565b6125559190613fa6565b61255f9190613f6f565b6125699190613f58565b9050600083600201858154811061258257612582613e1f565b906000526020600020018190555068327cb2734119d3b7a9601e1b8285815181106125af576125af613e1f565b602002602001015184600001546125c69190613f87565b6125d09190613fa6565b8360010185815481106125e5576125e5613e1f565b6000918252602090912001555b600081116125ff57600080fd5b610eb48433836133f9565b6000546001600160a01b031633146126345760405162461bcd60e51b815260040161075390613dea565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b606060006009848154811061266f5761266f613e1f565b600091825260209182902060408051608081018252600390930290910180546001600160a01b03811684526001600160401b03600160a01b909104811684860152600182015416838301526002810180548351818702810187019094528084529394919360608601939283018282801561270857602002820191906000526020600020905b8154815260200190600101908083116126f4575b505050919092525050506000858152600a602090815260408083206001600160a01b038816845282528083208151606081018352815481526001820180548451818702810187019095528085529697509495909491938581019392919083018282801561279457602002820191906000526020600020905b815481526020019060010190808311612780575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156127ec57602002820191906000526020600020905b8154815260200190600101908083116127d8575b505050919092525050815184516040516370a0823160e01b81523060048201529394509092600092506001600160a01b03909116906370a0823190602401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286b9190613ece565b6060850151600354919250906000906001600160401b0381111561289157612891613e9b565b6040519080825280602002602001820160405280156128ba578160200160208202803683370190505b5090508315612acd5760006128dc87604001516001600160401b0316436120bc565b905060005b600354811015612aca576000600b5489602001516001600160401b03166007848154811061291157612911613e1f565b9060005260206000200154856129279190613f87565b6129319190613f87565b61293b9190613fa6565b9050856129548268327cb2734119d3b7a9601e1b613f87565b61295e9190613fa6565b85838151811061297057612970613e1f565b60200260200101516129829190613f6f565b85838151811061299457612994613e1f565b602002602001018181525050876020015151821015612a5c57876040015182815181106129c3576129c3613e1f565b6020026020010151886020015183815181106129e1576129e1613e1f565b602002602001015168327cb2734119d3b7a9601e1b878581518110612a0857612a08613e1f565b60200260200101518a612a1b9190613f87565b612a259190613fa6565b612a2f9190613f58565b612a399190613f6f565b848381518110612a4b57612a4b613e1f565b602002602001018181525050612ab7565b68327cb2734119d3b7a9601e1b858381518110612a7b57612a7b613e1f565b602002602001015188612a8e9190613f87565b612a989190613fa6565b848381518110612aaa57612aaa613e1f565b6020026020010181815250505b5080612ac281613e4b565b9150506128e1565b50505b98975050505050505050565b6000546001600160a01b03163314612b035760405162461bcd60e51b815260040161075390613dea565b612b104262127500613f6f565b8111158015612b2f575042600d5462015180612b2c9190613f6f565b11155b612b3857600080fd5b600d55565b600260015403612b5f5760405162461bcd60e51b815260040161075390613e64565b6002600155612b6f338383613631565b505060018055565b600260015403612b995760405162461bcd60e51b815260040161075390613e64565b6002600155612ba781611945565b6000818152600a6020908152604080832033845290915281206009805491929184908110612bd757612bd7613e1f565b9060005260206000209060030201600201805480602002602001604051908101604052809291908181526020018280548015612c3257602002820191906000526020600020905b815481526020019060010190808311612c1e575b505050505090506000826040518060600160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015612ca057602002820191906000526020600020905b815481526020019060010190808311612c8c575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015612cf857602002820191906000526020600020905b815481526020019060010190808311612ce4575b5050509190925250506003549192505015612f555760005b816020015151811015612e5b57600082604001518281518110612d3557612d35613e1f565b602002602001015183602001518381518110612d5357612d53613e1f565b602002602001015168327cb2734119d3b7a9601e1b868581518110612d7a57612d7a613e1f565b60200260200101518660000151612d919190613f87565b612d9b9190613fa6565b612da59190613f58565b612daf9190613f6f565b90508015612e48576000856002018381548110612dce57612dce613e1f565b906000526020600020018190555068327cb2734119d3b7a9601e1b848381518110612dfb57612dfb613e1f565b60200260200101518460000151612e129190613f87565b612e1c9190613fa6565b856001018381548110612e3157612e31613e1f565b600091825260209091200155612e488233836133f9565b5080612e5381613e4b565b915050612d10565b5060035460208201515114612f55576020810151515b600354811015612f5357600068327cb2734119d3b7a9601e1b848381518110612e9c57612e9c613e1f565b60200260200101518460000151612eb39190613f87565b612ebd9190613fa6565b60028601805460019081018255600091909152855191925086019068327cb2734119d3b7a9601e1b90869085908110612ef857612ef8613e1f565b60200260200101518560000151612f0f9190613f87565b612f199190613fa6565b815460018101835560009283526020909220909101558015612f4057612f408233836133f9565b5080612f4b81613e4b565b915050612e71565b505b5050600180555050565b6000828152600a602090815260408083206001600160a01b03851684528252808320600101805482518185028101850190935280835260609493830182828015611ec55760200282019190600052602060002090815481526020019060010190808311611eb157509398975050505050505050565b6000546001600160a01b03163314612ffe5760405162461bcd60e51b815260040161075390613dea565b6001600160a01b03166000908152601160205260409020805460ff19169055565b6000546001600160a01b031633146130495760405162461bcd60e51b815260040161075390613dea565b61deac196001600160a01b038216016130b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610753565b610fb5816138bb565b60035415611f26576000828152600a602090815260408083206001600160a01b0385168452909152812060098054919291859081106130fd576130fd613e1f565b600091825260209182902060408051608081018252600390930290910180546001600160a01b03811684526001600160401b03600160a01b909104811684860152600182015416838301526002810180548351818702810187019094528084529394919360608601939283018282801561319657602002820191906000526020600020905b815481526020019060010190808311613182575b5050505050815250509050600082604051806060016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561320857602002820191906000526020600020905b8154815260200190600101908083116131f4575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561326057602002820191906000526020600020905b81548152602001906001019080831161324c575b505050505081525050905060005b81602001515181101561334f5760008260400151828151811061329357613293613e1f565b6020026020010151836020015183815181106132b1576132b1613e1f565b602002602001015168327cb2734119d3b7a9601e1b866060015185815181106132dc576132dc613e1f565b602002602001015186600001516132f39190613f87565b6132fd9190613fa6565b6133079190613f58565b6133119190613f6f565b9050801561333c578085600201838154811061332f5761332f613e1f565b6000918252602090912001555b508061334781613e4b565b91505061326e565b50600354602082015151146133f2576020810151515b6003548110156133f057600068327cb2734119d3b7a9601e1b8460600151838151811061339457613394613e1f565b602002602001015184600001516133ab9190613f87565b6133b59190613fa6565b6002860180546001818101835560009283526020832090910192909255818701805490920182555250806133e881613e4b565b915050613365565b505b5050505050565b60006003848154811061340e5761340e613e1f565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa158015613461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134859190613ece565b905060008184111561350b5760405163a9059cbb60e01b81526001600160a01b0386811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af11580156134e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135049190613eb1565b9050613581565b60405163a9059cbb60e01b81526001600160a01b0386811660048301526024820186905284169063a9059cbb906044016020604051808303816000875af115801561355a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357e9190613eb1565b90505b806133f05760405162461bcd60e51b815260206004820181905260248201527f736166655257545472616e736665723a207472616e73666572206661696c65646044820152606401610753565b6040516001600160a01b03831660248201526044810182905261157a90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613949565b6000811161363e57600080fd5b6000828152600a602090815260408083206001600160a01b03871684529091529020805461366b84611945565b801561367b5761367b84866130bc565b6136b63330856009888154811061369457613694613e1f565b60009182526020909120600390910201546001600160a01b031692919061390b565b6136c08382613f6f565b82556003541561387057816000015490506000600985815481106136e6576136e6613e1f565b906000526020600020906003020160020180548060200260200160405190810160405280929190818152602001828054801561374157602002820191906000526020600020905b81548152602001906001019080831161372d575b5050505050905060005b60018401548110156137c65768327cb2734119d3b7a9601e1b82828151811061377657613776613e1f565b6020026020010151846137899190613f87565b6137939190613fa6565b8460010182815481106137a8576137a8613e1f565b600091825260209091200155806137be81613e4b565b91505061374b565b5060035460018401541461386e5760018301545b60035481101561386c57600284018054600181810183556000928352602083209091019190915582519085019068327cb2734119d3b7a9601e1b9084908490811061382757613827613e1f565b60200260200101518561383a9190613f87565b6138449190613fa6565b815460018101835560009283526020909220909101558061386481613e4b565b9150506137da565b505b505b83856001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040516138ac91815260200190565b60405180910390a35050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526139439085906323b872dd60e01b906084016135fa565b50505050565b600061399e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a1b9092919063ffffffff16565b80519091501561157a57808060200190518101906139bc9190613eb1565b61157a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610753565b6060613a2a8484600085613a32565b949350505050565b606082471015613a935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610753565b843b613ae15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610753565b600080866001600160a01b03168587604051613afd9190613ff4565b60006040518083038185875af1925050503d8060008114613b3a576040519150601f19603f3d011682016040523d82523d6000602084013e613b3f565b606091505b5091509150613b4f828286613b5a565b979650505050505050565b60608315613b695750816120c8565b825115613b795782518084602001fd5b8160405162461bcd60e51b81526004016107539190614010565b828054828255906000526020600020908101928215613bce579160200282015b82811115613bce578251825591602001919060010190613bb3565b50613bda929150613bde565b5090565b5b80821115613bda5760008155600101613bdf565b6001600160a01b0381168114610fb557600080fd5b60008060408385031215613c1b57600080fd5b8235613c2681613bf3565b946020939093013593505050565b600060208284031215613c4657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015613c8557835183529284019291840191600101613c69565b50909695505050505050565b60008060408385031215613ca457600080fd5b50508035926020909101359150565b600060208284031215613cc557600080fd5b81356120c881613bf3565b60008060408385031215613ce357600080fd5b823591506020830135613cf581613bf3565b809150509250929050565b80356001600160401b0381168114613d1757600080fd5b919050565b8015158114610fb557600080fd5b600080600060608486031215613d3f57600080fd5b83359250613d4f60208501613d00565b91506040840135613d5f81613d1c565b809150509250925092565b600080600060608486031215613d7f57600080fd5b8335613d8a81613bf3565b95602085013595506040909401359392505050565b600060208284031215613db157600080fd5b81356120c881613d1c565b600080600060608486031215613dd157600080fd5b613dda84613d00565b92506020840135613d4f81613bf3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613e5d57613e5d613e35565b5060010190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613ec357600080fd5b81516120c881613d1c565b600060208284031215613ee057600080fd5b5051919050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613f375784516001600160a01b031683529383019391830191600101613f12565b50506001600160a01b03969096166060850152505050608001529392505050565b600082821015613f6a57613f6a613e35565b500390565b60008219821115613f8257613f82613e35565b500190565b6000816000190483118215151615613fa157613fa1613e35565b500290565b600082613fc357634e487b7160e01b600052601260045260246000fd5b500490565b60005b83811015613fe3578181015183820152602001613fcb565b838111156139435750506000910152565b60008251614006818460208701613fc8565b9190910192915050565b602081526000825180602084015261402f816040850160208701613fc8565b601f01601f1916919091016040019291505056fe13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3a2646970667358221220c915a5edbc3e5b3c8cae46afe5105b2c4f694889a5dba6abb75ecceab5a1d3ca64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c94f3e2ade5e92389af7e543657211ecccaff11e
-----Decoded View---------------
Arg [0] : _spiral (address): 0xC94f3e2aDE5E92389AF7E543657211EcCcAFf11E
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c94f3e2ade5e92389af7e543657211ecccaff11e
Deployed Bytecode Sourcemap
21945:20826:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25041:95;25113:8;:15;25041:95;;;160:25:1;;;148:2;133:18;25041:95:0;;;;;;;;38779:431;;;;;;:::i;:::-;;:::i;:::-;;26556:184;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23050:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;1734:32:1;;;1716:51;;-1:-1:-1;;;;;1840:15:1;;;1835:2;1820:18;;1813:43;1892:15;;1872:18;;;1865:43;1704:2;1689:18;23050:26:0;1504:410:1;33940:1517:0;;;;;;:::i;:::-;;:::i;23291:30::-;;;;;;38026:309;;;:::i;39218:149::-;;;;;;:::i;:::-;;:::i;23421:24::-;;;;;;24068:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2611:14:1;;2604:22;2586:41;;2574:2;2559:18;24068:43:0;2446:187:1;27330:134:0;;;;;;:::i;:::-;27401:7;27428:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;27428:20:0;;;;;;;;;;;:27;;27330:134;37659:298;;;;;;:::i;:::-;;:::i;32889:1043::-;;;;;;:::i;:::-;;:::i;37217:327::-;;;;;;:::i;:::-;;:::i;29337:925::-;;;;;;:::i;:::-;;:::i;23389:25::-;;;;;;27182:139;;;;;;:::i;:::-;-1:-1:-1;;;;;27288:15:0;27261:7;27288:15;;;:9;:15;;;;;;;;:24;;;;;;;;;27182:139;36227:137;;;;;;:::i;:::-;;:::i;38407:263::-;;;;;;:::i;:::-;;:::i;27940:938::-;;;;;;:::i;:::-;;:::i;35544:525::-;;;;;;:::i;:::-;;:::i;39403:158::-;;;;;;:::i;:::-;;:::i;26961:213::-;;;;;;:::i;:::-;;:::i;23449:23::-;;;;;;;;;22759:19;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4731:32:1;;;4713:51;;4701:2;4686:18;22759:19:0;4553:217:1;27680:180:0;;;:::i;22711:20::-;;;;;-1:-1:-1;;;;;22711:20:0;;;22952:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;10726:108;;;:::i;22886:24::-;;;;;;:::i;:::-;;:::i;22855:::-;;;;;;:::i;:::-;;:::i;28886:443::-;;;;;;:::i;:::-;;:::i;10075:87::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;10075:87;;25210:120;;;;;;:::i;:::-;;:::i;23132:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;22917:28;;;;;;:::i;:::-;;:::i;36430:635::-;;;;;;:::i;:::-;;:::i;30436:1154::-;;;;;;:::i;:::-;;:::i;39567:102::-;;;;;;:::i;:::-;;:::i;24552:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24017:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25396:1152;;;;;;:::i;:::-;;:::i;39788:197::-;;;;;;:::i;:::-;;:::i;30306:122::-;;;;;;:::i;:::-;;:::i;31598:1251::-;;;;;;:::i;:::-;;:::i;26748:205::-;;;;;;:::i;:::-;;:::i;39675:105::-;;;;;;:::i;:::-;;:::i;10989:206::-;;;;;;:::i;:::-;;:::i;22785:66::-;;;;;-1:-1:-1;;;;;22785:66:0;;;38779:431;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;24332:23:0;::::1;;::::0;;;:12:::1;:23;::::0;;;;;38869:4;;24332:23:::1;;:32;24324:70;;;::::0;-1:-1:-1;;;24324:70:0;;6355:2:1;24324:70:0::1;::::0;::::1;6337:21:1::0;6394:2;6374:18;;;6367:30;-1:-1:-1;;;6413:18:1;;;6406:55;6478:18;;24324:70:0::1;6153:349:1::0;24324:70:0::1;38886:3:::2;:14:::0;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;;38886:14:0::2;-1:-1:-1::0;;;;;38886:14:0;::::2;::::0;;::::2;::::0;;;38911:11:::2;:30:::0;;;;::::2;::::0;;;;::::2;::::0;;;-1:-1:-1;38952:18:0;;;:12:::2;38886:14;38952:18:::0;;;;:25;;-1:-1:-1;;38952:25:0::2;::::0;;::::2;::::0;;;39005:8:::2;:15:::0;;39031:105:::2;39059:6;39053:3;:12;39031:105;;;39089:8;39098:3;39089:13;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:28:::2;:13;::::0;;::::2;;:28;:35:::0;;::::2;;::::0;;;;39067:5;::::2;::::0;::::2;:::i;:::-;;;;39031:105;;;;39172:12;39166:4;-1:-1:-1::0;;;;;39151:51:0::2;;39186:15;39151:51;;;;160:25:1::0;;148:2;133:18;;14:177;39151:51:0::2;;;;;;;;38875:335;10366:1:::1;38779:431:::0;;:::o;26556:184::-;26613:16;26642:28;26673:8;26682:4;26673:14;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;26642:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26642:60:0;;26556:184;-1:-1:-1;;;;;;;26556:184:0:o;23050:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23050:26:0;;;-1:-1:-1;;;;;;;;;23050:26:0;;;;;;;;:::o;33940:1517::-;13336:1;13934:7;;:19;13926:63;;;;-1:-1:-1;;;13926:63:0;;;;;;;:::i;:::-;13336:1;14067:7;:18;34076:10:::1;34040:21;34064:23:::0;;;-1:-1:-1;;;;;;;;;;;34064:11:0::1;:23:::0;:11;:23;;;34102:13:::1;::::0;:10:::1;:13::i;:::-;34138:11:::0;;34130:61:::1;;;::::0;-1:-1:-1;;;34130:61:0;;7473:2:1;34130:61:0::1;::::0;::::1;7455:21:1::0;7512:2;7492:18;;;7485:30;7551:34;7531:18;;;7524:62;-1:-1:-1;;;7602:18:1;;;7595:31;7643:19;;34130:61:0::1;7271:397:1::0;34130:61:0::1;34206:30;34222:1;34225:10;34206:15;:30::i;:::-;34251:23;34277:4;:17;;34295:8;34277:27;;;;;;;;:::i;:::-;;;;;;;;;34251:53;;34349:1;34319:4;:17;;34337:8;34319:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;:31:::0;;;;34389:16:::1;::::0;;34403:1:::1;34389:16:::0;;;;;::::1;::::0;;;;::::1;;;;;;;;;;;::::0;-1:-1:-1;34389:16:0::1;34365:40;;34438:3;34442:8;34438:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;34420:7;;-1:-1:-1;;;;;34438:13:0;;::::1;::::0;34420:4;;:7:::1;;;;:::i;:::-;-1:-1:-1::0;;;;;34420:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;34485:6:::1;::::0;34467:7;;34485:6;::::1;::::0;34467:4;;34485:6;;34467:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;34467:25:0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:25;34511:19;;34507:943:::1;;34552:3;34556:8;34552:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;34574:6:::1;::::0;;34552:46:::1;::::0;-1:-1:-1;;;34552:46:0;;-1:-1:-1;;;;;34574:6:0;;::::1;34552:46:::0;;::::1;7979:51:1::0;;;;8046:18;;;8039:34;;;34552:13:0;;::::1;::::0;:21:::1;::::0;7952:18:1;;34552:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;34641:6:0::1;::::0;:31:::1;::::0;-1:-1:-1;;;34641:31:0;;34666:4:::1;34641:31;::::0;::::1;4713:51:1::0;34617:21:0::1;::::0;-1:-1:-1;;;;;34641:6:0::1;::::0;:16:::1;::::0;4686:18:1;;34641:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34710:6;::::0;;34691:257:::1;::::0;-1:-1:-1;;;34691:257:0;;34617:55;;-1:-1:-1;;;;;;34710:6:0::1;::::0;34691:80:::1;::::0;:257:::1;::::0;34790:15;;34828:12;;34859:4;;34890::::1;::::0;34914:15:::1;::::0;34691:257:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34991:6:0::1;::::0;:31:::1;::::0;-1:-1:-1;;;34991:31:0;;35016:4:::1;34991:31;::::0;::::1;4713:51:1::0;34967:21:0::1;::::0;-1:-1:-1;35025:13:0;;-1:-1:-1;;;;;;34991:6:0;;::::1;::::0;:16:::1;::::0;4686:18:1;;34991:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;34967:71;;35072:13;35057:4;:11;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;35125:11:0;;35186:8:::1;:11:::0;;35104:18:::1;::::0;35186:8;35104:18;;35186:11:::1;;;;:::i;:::-;;;;;;;;;;;:26;;35155:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35236:6;35231:155;35252:3;:10:::0;35248:14;::::1;35231:155;;;-1:-1:-1::0;;;35345:11:0::1;35357:1;35345:14;;;;;;;;:::i;:::-;;;;;;;35332:10;:27;;;;:::i;:::-;:34;;;;:::i;:::-;35304:10;35292:11;:23:::0;;;-1:-1:-1;;;;;;;;;;;35292:11:0::1;:23:::0;:11;:23;;:34:::1;;:37:::0;;35327:1;;35292:37;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:74:::0;35264:3;::::1;::::0;::::1;:::i;:::-;;;;35231:155;;;-1:-1:-1::0;35397:37:0::1;::::0;160:25:1;;;35417:1:0::1;::::0;35405:10:::1;::::0;35397:37:::1;::::0;148:2:1;133:18;35397:37:0::1;;;;;;;34532:918;;;;34507:943;-1:-1:-1::0;;13292:1:0;14246:22;;-1:-1:-1;;;33940:1517:0:o;38026:309::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;38099:12:::1;38086:10;;:25;38078:75;;;::::0;-1:-1:-1;;;38078:75:0;;10360:2:1;38078:75:0::1;::::0;::::1;10342:21:1::0;10399:2;10379:18;;;10372:30;10438:34;10418:18;;;10411:62;-1:-1:-1;;;10489:18:1;;;10482:35;10534:19;;38078:75:0::1;10158:401:1::0;38078:75:0::1;38177:12;38164:10;:25:::0;38205:6:::1;38200:128;38217:8;:15:::0;38213:19;::::1;38200:128;;;38291:12;38254:8;38263:1;38254:11;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:50;;;;;-1:-1:-1::0;;;;;38254:50:0::1;;;;;-1:-1:-1::0;;;;;38254:50:0::1;;;;;;38234:3;;;;;:::i;:::-;;;;38200:128;;;;38026:309::o:0;39218:149::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;39304:7:::1;:22:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;39337:7:::1;:22:::0;;;;::::1;::::0;;-1:-1:-1;39337:22:0;;;;::::1;::::0;39218:149::o;37659:298::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;37756:11:::1;37752:61;;;37784:17;:15;:17::i;:::-;37887:11;-1:-1:-1::0;;;;;37841:57:0::1;37859:8;37868:4;37859:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:25:::0;37841:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;37859:25:0;::::1;-1:-1:-1::0;;;;;37859:25:0::1;::::0;37841:43:::1;:::i;:::-;:57;;;;:::i;:::-;37823:15;:75;;;;37938:11;37910:8;37919:4;37910:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;:39;;;;;-1:-1:-1::0;;;;;37910:39:0::1;;;;;-1:-1:-1::0;;;;;37910:39:0::1;;;;;;37659:298:::0;;;:::o;32889:1043::-;13336:1;13934:7;;:19;13926:63;;;;-1:-1:-1;;;13926:63:0;;;;;;;:::i;:::-;13336:1;14067:7;:18;32995:9:::1;::::0;32977:15:::1;:27;32969:36;;;::::0;::::1;;33016:21;33040:14:::0;;;:8:::1;:14;::::0;;;;;;;33055:10:::1;33040:26:::0;;;;;;;33098:11;;33040:26;;33016:21;33098::::1;::::0;33112:7;;33098:21:::1;:::i;:::-;33077:42:::0;-1:-1:-1;33167:1:0::1;33157:7;:11;33130:61;;;::::0;-1:-1:-1;;;33130:61:0;;10766:2:1;33130:61:0::1;::::0;::::1;10748:21:1::0;10805:2;10785:18;;;10778:30;-1:-1:-1;;;10824:18:1;;;10817:48;10882:18;;33130:61:0::1;10564:342:1::0;33130:61:0::1;33202:16;33213:4;33202:10;:16::i;:::-;33233:3;:10:::0;:14;33229:524:::1;;33268:33;33284:4;33290:10;33268:15;:33::i;:::-;33320:28;33351:8;33360:4;33351:14;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;33320:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33404:6;33399:343;33418:3;:10:::0;33414:14;::::1;33399:343;;;33484:1;33461:4;:17;;33479:1;33461:20;;;;;;;;:::i;:::-;;;;;;;;;:24;33457:266;;;33514:52;33530:1;33533:10;33545:4;:17;;33563:1;33545:20;;;;;;;;:::i;:::-;;;;;;;;;33514:15;:52::i;:::-;33616:1;33593:4;:17;;33611:1;33593:20;;;;;;;;:::i;:::-;;;;;;;;:24;;;;-1:-1:-1::0;;;33678:11:0::1;33690:1;33678:14;;;;;;;;:::i;:::-;;;;;;;33665:10;:27;;;;:::i;:::-;:34;;;;:::i;:::-;33644:4;:15;;33660:1;33644:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:55:::0;33457:266:::1;33430:3:::0;::::1;::::0;::::1;:::i;:::-;;;;33399:343;;;;33249:504;33229:524;33777:10;33763:4;:11;;:24;;;;33798:65;33842:10;33855:7;33798:8;33807:4;33798:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:22:::0;-1:-1:-1;;;;;33798:22:0::1;::::0;:65;:35:::1;:65::i;:::-;33889:35;::::0;160:25:1;;;33910:4:0;;33898:10:::1;::::0;33889:35:::1;::::0;148:2:1;133:18;33889:35:0::1;;;;;;;-1:-1:-1::0;;13292:1:0;14246:22;;-1:-1:-1;;32889:1043:0:o;37217:327::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37297:34:0;::::1;;::::0;;;:12:::1;:34;::::0;;;;;::::1;;37296:35;:75:::0;::::1;;;-1:-1:-1::0;;;;;;37336:35:0;::::1;;::::0;;;:13:::1;:35;::::0;;;;;::::1;;37335:36;37296:75;37288:121;;;::::0;-1:-1:-1;;;37288:121:0;;11113:2:1;37288:121:0::1;::::0;::::1;11095:21:1::0;11152:2;11132:18;;;11125:30;11191:34;11171:18;;;11164:62;-1:-1:-1;;;11242:18:1;;;11235:31;11283:19;;37288:121:0::1;10911:397:1::0;37288:121:0::1;37434:45;::::0;-1:-1:-1;;;37434:45:0;;37473:4:::1;37434:45;::::0;::::1;4713:51:1::0;37420:11:0::1;::::0;-1:-1:-1;;;;;37434:30:0;::::1;::::0;::::1;::::0;4686:18:1;;37434:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37490:46;::::0;-1:-1:-1;;;37490:46:0;;37520:10:::1;37490:46;::::0;::::1;7979:51:1::0;8046:18;;;8039:34;;;37420:59:0;;-1:-1:-1;;;;;;37490:29:0;::::1;::::0;::::1;::::0;7952:18:1;;37490:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37277:267;37217:327:::0;:::o;29337:925::-;13336:1;13934:7;;:19;13926:63;;;;-1:-1:-1;;;13926:63:0;;;;;;;:::i;:::-;13336:1;14067:7;:18;;;;29428:23:::1;29467:7;29475;29467:16;;;;;;;;:::i;:::-;;;;;;;;;29454:10;:29;;;;:::i;:::-;29527:10;29494:18;29515:23:::0;;;-1:-1:-1;;;;;;;;;;;29515:11:0::1;:23:::0;:11;:23;;:30;29428:55;;-1:-1:-1;29494:18:0;29515:48:::1;::::0;29428:55;;29515:48:::1;:::i;:::-;29494:69:::0;-1:-1:-1;29619:1:0::1;29601:15;:19;29574:47;;;::::0;::::1;;29632:13;29643:1;29632:10;:13::i;:::-;29656:30;29672:1;29675:10;29656:15;:30::i;:::-;29709:10;29697:11;:23:::0;;;-1:-1:-1;;;;;;;;;;;29697:11:0::1;:23:::0;:11;:23;;:43;;;29755:3:::1;:10:::0;:15;29751:266:::1;;29787:28;29818:8;29827:1;29818:11;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;29787:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29864:6;29859:147;29880:3;:10:::0;29876:14;::::1;29859:147;;;-1:-1:-1::0;;;29969:11:0::1;29981:1;29969:14;;;;;;;;:::i;:::-;;;;;;;29956:10;:27;;;;:::i;:::-;:34;;;;:::i;:::-;29928:10;29916:11;:23:::0;;;-1:-1:-1;;;;;;;;;;;29916:11:0::1;:23:::0;:11;:23;;:34:::1;;:37:::0;;29951:1;;29916:37;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:74:::0;29892:3;::::1;::::0;::::1;:::i;:::-;;;;29859:147;;;;29772:245;29751:266;30037:10;30027:21;::::0;;;:9:::1;:21;::::0;;;;;;;:30;;;;;;;;:44;;30061:10;;30027:21;:44:::1;::::0;30061:10;;30027:44:::1;:::i;:::-;::::0;;;-1:-1:-1;;30124:7:0::1;:16:::0;;30132:7;;30124:16;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;30100:10:::1;30090:21:::0;;:9:::1;:21:::0;;;;;;:30;;;;;;;;;:50:::1;;30082:59;;;::::0;::::1;;30152:6;::::0;:53:::1;::::0;-1:-1:-1;;;;;30152:6:0::1;30180;30189:15:::0;30152:19:::1;:53::i;:::-;30221:33;::::0;160:25:1;;;30226:10:0::1;::::0;30221:33:::1;::::0;148:2:1;133:18;30221:33:0::1;;;;;;;-1:-1:-1::0;;13292:1:0;14246:22;;-1:-1:-1;;29337:925:0:o;36227:137::-;24655:10;24644:22;;;;:10;:22;;;;;;;;:30;;:22;:30;24636:81;;;;-1:-1:-1;;;24636:81:0;;11515:2:1;24636:81:0;;;11497:21:1;11554:2;11534:18;;;11527:30;11593:34;11573:18;;;11566:62;-1:-1:-1;;;11644:18:1;;;11637:36;11690:19;;24636:81:0;11313:402:1;24636:81:0;36326:30:::1;36335:6;36343:4;36349:6;36326:8;:30::i;38407:263::-:0;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;38522:3:::1;:10:::0;38511:21;::::1;38503:30;;;::::0;::::1;;38538:17;:15;:17::i;:::-;38590:12;38566:11;38578:8;38566:21;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:36:::0;38618:44:::1;::::0;38637:10:::1;::::0;38618:44:::1;::::0;::::1;::::0;38649:12;160:25:1;;148:2;133:18;;14:177;38618:44:0::1;;;;;;;;38407:263:::0;;:::o;27940:938::-;27992:21;28016:8;28025:4;28016:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;28061:20;;;;28016:14;;-1:-1:-1;;;;;;28061:20:0;28045:12;:36;28041:75;;28098:7;27940:938;:::o;28041:75::-;28145:12;;:37;;-1:-1:-1;;;28145:37:0;;28176:4;28145:37;;;4713:51:1;28126:16:0;;-1:-1:-1;;;;;28145:12:0;;:22;;4686:18:1;;28145:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28126:56;-1:-1:-1;28197:13:0;;;:37;;-1:-1:-1;28214:15:0;;-1:-1:-1;;;28214:15:0;;-1:-1:-1;;;;;28214:15:0;:20;28197:37;28193:134;;;-1:-1:-1;28251:20:0;;:43;;-1:-1:-1;;28251:43:0;28281:12;-1:-1:-1;;;;;28251:43:0;;;;-1:-1:-1;27940:938:0:o;28193:134::-;28372:20;;;;28337:18;;28358:49;;-1:-1:-1;;;;;28372:20:0;28394:12;28358:13;:49::i;:::-;28421:3;:10;28337:70;;-1:-1:-1;28421:14:0;28418:399;;28452:29;28484:11;28452:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28510:28:0;;;;;;;;;;-1:-1:-1;;;;;28510:28:0;;;;-1:-1:-1;;;;;;;;28510:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28452:43;;-1:-1:-1;28510:21:0;;:28;;-1:-1:-1;28534:4:0;;-1:-1:-1;28510:28:0;;;;-1:-1:-1;28510:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28558:6;28553:253;28572:3;:10;28568:14;;28553:253;;;28608:17;28678:15;;28659:5;:16;;;-1:-1:-1;;;;;28628:47:0;28641:12;28654:1;28641:15;;;;;;;;:::i;:::-;;;;;;;28628:10;:28;;;;:::i;:::-;:47;;;;:::i;:::-;:65;;;;:::i;:::-;28608:85;-1:-1:-1;28782:8:0;28763:16;28608:85;-1:-1:-1;;;28763:16:0;:::i;:::-;:27;;;;:::i;:::-;28737:5;:20;;;28758:1;28737:23;;;;;;;;:::i;:::-;;;;;;;:53;;;;:::i;:::-;28712:4;:19;;28732:1;28712:22;;;;;;;;:::i;:::-;;;;;;;;;;:78;-1:-1:-1;28584:3:0;;;;:::i;:::-;;;;28553:253;;;;28437:380;;28418:399;-1:-1:-1;;28827:20:0;;:43;;-1:-1:-1;;28827:43:0;28857:12;-1:-1:-1;;;;;28827:43:0;;;;-1:-1:-1;27940:938:0:o;35544:525::-;13336:1;13934:7;;:19;13926:63;;;;-1:-1:-1;;;13926:63:0;;;;;;;:::i;:::-;13336:1;14067:7;:18;;;24468:11:::1;::::0;::::1;;:19;;;24460:66;;;::::0;-1:-1:-1;;;24460:66:0;;11922:2:1;24460:66:0::1;::::0;::::1;11904:21:1::0;11961:2;11941:18;;;11934:30;12000:34;11980:18;;;11973:62;-1:-1:-1;;;12051:18:1;;;12044:32;12093:19;;24460:66:0::1;11720:398:1::0;24460:66:0::1;35630:21:::2;35654:8;35663:4;35654:14;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;35703;;;:8:::2;:14:::0;;;;;;35718:10:::2;35703:26:::0;;;;;;;;35757:11;;35654:14:::2;35822:10:::0;;35654:14;::::2;::::0;;::::2;::::0;-1:-1:-1;35703:26:0;35757:11;;-1:-1:-1;;;;;35808:25:0;::::2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;35808:25:0::2;-1:-1:-1::0;35858:1:0::2;35844:15:::0;;35870:27;;35779:54;;-1:-1:-1;35870:27:0::2;::::0;:15:::2;::::0;::::2;::::0;:27:::2;::::0;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;35908:29:0;;::::2;::::0;:17:::2;::::0;::::2;::::0;:29:::2;::::0;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;35948:12:0;;:54:::2;::::0;-1:-1:-1;;;;;35948:12:0::2;35982:10;35995:6:::0;35948:25:::2;:54::i;:::-;36018:43;::::0;160:25:1;;;36048:4:0;;36036:10:::2;::::0;36018:43:::2;::::0;148:2:1;133:18;36018:43:0::2;;;;;;;-1:-1:-1::0;;13292:1:0;14246:22;;-1:-1:-1;;;35544:525:0:o;39403:158::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;39471:11:::1;:26:::0;;-1:-1:-1;;39471:26:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39513:40:::1;::::0;;39523:15:::1;12291:25:1::0;;12347:2;12332:18;;12325:50;;;;39513:40:0::1;::::0;12264:18:1;39513:40:0::1;;;;;;;39403:158:::0;:::o;26961:213::-;27065:31;27099:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;27099:21:0;;;;;;;;;:34;;27065:68;;;;;;;;;;;;;;;;;27036:16;;27065:31;:68;;27099:34;27065:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27065:68:0;;26961:213;-1:-1:-1;;;;;;;;26961:213:0:o;22759:19::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22759:19:0;;-1:-1:-1;22759:19:0;:::o;27680:180::-;27742:8;:15;27725:14;27768:85;27796:6;27790:3;:12;27768:85;;;27826:15;27837:3;27826:10;:15::i;:::-;27804:5;;;;:::i;:::-;;;;27768:85;;;;27714:146;27680:180::o;10726:108::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;10791:35:::1;10818:6;10791:18;:35::i;:::-;10726:108::o:0;22886:24::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22886:24:0;:::o;22855:::-;;;;;;;;;;;;28886:443;13336:1;13934:7;;:19;13926:63;;;;-1:-1:-1;;;13926:63:0;;;;;;;:::i;:::-;13336:1;14067:7;:18;28986:14;28978:23:::1;;;::::0;::::1;;29012;29051:7;29059;29051:16;;;;;;;;:::i;:::-;;;;;;;;;29038:10;:29;;;;:::i;:::-;29088:10;29078:21;::::0;;;:9:::1;:21;::::0;;;;;;;:30;;;;;;;;:44;;29012:55;;-1:-1:-1;29112:10:0;;29078:30;;:21;:44:::1;::::0;29112:10;;29078:44:::1;:::i;:::-;::::0;;;-1:-1:-1;;29175:7:0::1;:16:::0;;29183:7;;29175:16;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;29151:10:::1;29141:21:::0;;:9:::1;:21:::0;;;;;;:30;;;;;;;;;:50:::1;;29133:59;;;::::0;::::1;;29203:6;::::0;:69:::1;::::0;-1:-1:-1;;;;;29203:6:0::1;29227:10;29247:6;29256:15:::0;29203:23:::1;:69::i;:::-;29288:33;::::0;160:25:1;;;29293:10:0::1;::::0;29288:33:::1;::::0;148:2:1;133:18;29288:33:0::1;;;;;;;-1:-1:-1::0;;13292:1:0;14246:22;;-1:-1:-1;28886:443:0:o;25210:120::-;25282:7;25310:11;25316:5;25310:3;:11;:::i;:::-;25302:20;25210:120;-1:-1:-1;;;25210:120:0:o;22917:28::-;;;;;;;;;;;;36430:635;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24179:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;36529:8;;24179:23:::1;;:32;24171:70;;;::::0;-1:-1:-1;;;24171:70:0;;6355:2:1;24171:70:0::1;::::0;::::1;6337:21:1::0;6394:2;6374:18;;;6367:30;-1:-1:-1;;;6413:18:1;;;6406:55;6478:18;;24171:70:0::1;6153:349:1::0;24171:70:0::1;36554:11:::2;36550:61;;;36582:17;:15;:17::i;:::-;36621:22;36668:10;;36653:12;:25;:53;;36696:10;;36653:53;;;36681:12;36653:53;36621:86;;36754:11;-1:-1:-1::0;;;;;36736:29:0::2;:15;;:29;;;;:::i;:::-;36718:15;:47:::0;-1:-1:-1;;;;;36776:23:0;::::2;;::::0;;;:13:::2;:23;::::0;;;;:30;;-1:-1:-1;;36776:30:0::2;36802:4;36776:30;::::0;;36857:3:::2;:10:::0;-1:-1:-1;;;;;36843:25:0;::::2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;36843:25:0::2;-1:-1:-1::0;36893:163:0::2;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;36893:163:0;;::::2;::::0;;-1:-1:-1;;;;;36893:163:0;;::::2;;::::0;;::::2;::::0;;;;;::::2;::::0;;;;;;;;;;;;36879:8:::2;:178:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;36879:178:0;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;::::2;-1:-1:-1::0;;;36879:178:0::2;-1:-1:-1::0;;;;;;36879:178:0;;;;;;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;::::2;-1:-1:-1::0;;36879:178:0;;::::2;;::::0;;;;;;;36817:51;;-1:-1:-1;36893:163:0;;36879:178;;::::2;::::0;;;;;;;::::2;::::0;::::2;:::i;:::-;;;;36539:526;;10366:1:::1;36430:635:::0;;;:::o;30436:1154::-;13336:1;13934:7;;:19;13926:63;;;;-1:-1:-1;;;13926:63:0;;;;;;;:::i;:::-;13336:1;14067:7;:18;30536:3:::1;:10:::0;30525:21;::::1;30517:30;;;::::0;::::1;;30558:16;30569:4;30558:10;:16::i;:::-;30585:21;30609:14:::0;;;:8:::1;:14;::::0;;;;;;;30624:10:::1;30609:26:::0;;;;;;;30677:8:::1;:14:::0;;30609:26;;30585:21;30618:4;;30677:14;::::1;;;;;:::i;:::-;;;;;;;;;;;:29;;30646:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30717:15;30772:8;30746:4;:15;;:22;;;;:34;30743:749;;-1:-1:-1::0;;;30822:11:0::1;30834:8;30822:21;;;;;;;;:::i;:::-;;;;;;;30808:4;:11;;;:35;;;;:::i;:::-;:42;;;;:::i;:::-;30887:15;::::0;::::1;:22:::0;30797:54;;-1:-1:-1;30866:9:0::1;::::0;30878:31:::1;::::0;:8;:31:::1;:::i;:::-;30866:43:::0;-1:-1:-1;30928:8:0;;30924:189:::1;;30962:6;30957:141;30976:4;30974:1;:6;30957:141;;;31009:17;::::0;::::1;:24:::0;;::::1;::::0;;::::1;::::0;;;31056:15;;::::1;:22:::0;;;;::::1;::::0;;-1:-1:-1;31056:22:0;30982:3;::::1;::::0;::::1;:::i;:::-;;;;30957:141;;;;30924:189;-1:-1:-1::0;31127:17:0::1;::::0;::::1;:24:::0;;::::1;::::0;;::::1;::::0;;;31166:15;;::::1;:29:::0;;;;::::1;::::0;;-1:-1:-1;31166:29:0;;;31127:24:::1;31166:29:::0;;::::1;::::0;;;30743:749:::1;;;31324:4;:15;;31340:8;31324:25;;;;;;;;:::i;:::-;;;;;;;;;31294:4;:17;;31312:8;31294:27;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1::0;;;31262:11:0::1;31274:8;31262:21;;;;;;;;:::i;:::-;;;;;;;31248:4;:11;;;:35;;;;:::i;:::-;:42;;;;:::i;:::-;31247:74;;;;:::i;:::-;:102;;;;:::i;:::-;31237:112;;31394:1;31364:4;:17;;31382:8;31364:27;;;;;;;;:::i;:::-;;;;;;;;:31;;;;-1:-1:-1::0;;;31452:11:0::1;31464:8;31452:21;;;;;;;;:::i;:::-;;;;;;;31438:4;:11;;;:35;;;;:::i;:::-;:42;;;;:::i;:::-;31410:4;:15;;31426:8;31410:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:70:::0;30743:749:::1;31520:1;31510:7;:11;31502:20;;;::::0;::::1;;31534:46;31550:8;31560:10;31572:7;31534:15;:46::i;39567:102::-:0;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39634:20:0::1;;::::0;;;:10:::1;:20;::::0;;;;:27;;-1:-1:-1;;39634:27:0::1;39657:4;39634:27;::::0;;39567:102::o;25396:1152::-;25472:16;25501:20;25524:8;25533:4;25524:14;;;;;;;;:::i;:::-;;;;;;;;;;25501:37;;;;;;;;25524:14;;;;;;;25501:37;;-1:-1:-1;;;;;25501:37:0;;;;-1:-1:-1;;;;;;;;25501:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25524:14;;25501:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25501:37:0;;;;-1:-1:-1;;;25549:20:0;25572:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;25572:21:0;;;;;;;;;25549:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25501:37;;-1:-1:-1;25549:20:0;;:44;;25572:21;;25549:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25549:44:0;;;;-1:-1:-1;;25621:11:0;;25662:12;;:37;;-1:-1:-1;;;25662:37:0;;25693:4;25662:37;;;4713:51:1;25621:11:0;;-1:-1:-1;25621:11:0;;25604:14;;-1:-1:-1;;;;;;25662:22:0;;;;;;4686:18:1;;25662:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25744:19;;;;25818:3;:10;25643:56;;-1:-1:-1;25744:19:0;25710:31;;-1:-1:-1;;;;;25804:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25804:25:0;-1:-1:-1;25774:55:0;-1:-1:-1;25844:11:0;;25840:672;;25872:18;25893:49;25907:4;:20;;;-1:-1:-1;;;;;25893:49:0;25929:12;25893:13;:49::i;:::-;25872:70;;25962:6;25957:544;25976:3;:10;25972:14;;25957:544;;;26012:17;26080:15;;26062:4;:15;;;-1:-1:-1;;;;;26032:45:0;26045:11;26057:1;26045:14;;;;;;;;:::i;:::-;;;;;;;;;26032:10;:27;;;;:::i;:::-;:45;;;;:::i;:::-;:63;;;;:::i;:::-;26012:83;-1:-1:-1;26173:8:0;26154:16;26012:83;-1:-1:-1;;;26154:16:0;:::i;:::-;:27;;;;:::i;:::-;26134:14;26149:1;26134:17;;;;;;;;:::i;:::-;;;;;;;:47;;;;:::i;:::-;26114:14;26129:1;26114:17;;;;;;;;:::i;:::-;;;;;;:67;;;;;26208:4;:15;;;:22;26204:1;:26;26200:286;;;26329:4;:17;;;26347:1;26329:20;;;;;;;;:::i;:::-;;;;;;;26308:4;:15;;;26324:1;26308:18;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;26280:14:0;26295:1;26280:17;;;;;;;;:::i;:::-;;;;;;;26271:6;:26;;;;:::i;:::-;:33;;;;:::i;:::-;26270:56;;;;:::i;:::-;:79;;;;:::i;:::-;26254:10;26265:1;26254:13;;;;;;;;:::i;:::-;;;;;;:95;;;;;26200:286;;;-1:-1:-1;;;26441:14:0;26456:1;26441:17;;;;;;;;:::i;:::-;;;;;;;26432:6;:26;;;;:::i;:::-;:33;;;;:::i;:::-;26415:10;26426:1;26415:13;;;;;;;;:::i;:::-;;;;;;:51;;;;;26200:286;-1:-1:-1;25988:3:0;;;;:::i;:::-;;;;25957:544;;;;25857:655;25840:672;26529:10;25396:1152;-1:-1:-1;;;;;;;;25396:1152:0:o;39788:197::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;39877:25:::1;:15;39895:7;39877:25;:::i;:::-;39863:10;:39;;:80;;;;;39928:15;39906:9;;39918:6;39906:18;;;;:::i;:::-;:37;;39863:80;39855:89;;;::::0;::::1;;39955:9;:22:::0;39788:197::o;30306:122::-;13336:1;13934:7;;:19;13926:63;;;;-1:-1:-1;;;13926:63:0;;;;;;;:::i;:::-;13336:1;14067:7;:18;30385:35:::1;30394:10;30406:4:::0;30412:7;30385:8:::1;:35::i;:::-;-1:-1:-1::0;;13292:1:0;14246:22;;30306:122::o;31598:1251::-;13336:1;13934:7;;:19;13926:63;;;;-1:-1:-1;;;13926:63:0;;;;;;;:::i;:::-;13336:1;14067:7;:18;31664:16:::1;31675:4:::0;31664:10:::1;:16::i;:::-;31691:21;31715:14:::0;;;:8:::1;:14;::::0;;;;;;;31730:10:::1;31715:26:::0;;;;;;;31783:8:::1;:14:::0;;31715:26;;31691:21;31724:4;;31783:14;::::1;;;;;:::i;:::-;;;;;;;;;;;:29;;31752:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31823:21;31847:4;31823:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;31823:28:0;;;;-1:-1:-1;;31865:3:0::1;:10:::0;31823:28;;-1:-1:-1;;31865:15:0;31862:980:::1;;31901:6;31896:429;31915:5;:16;;;:23;31911:1;:27;31896:429;;;31963:15;32044:5;:18;;;32063:1;32044:21;;;;;;;;:::i;:::-;;;;;;;32022:5;:16;;;32039:1;32022:19;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;31997:11:0::1;32009:1;31997:14;;;;;;;;:::i;:::-;;;;;;;31982:5;:12;;;:29;;;;:::i;:::-;:36;;;;:::i;:::-;31981:60;;;;:::i;:::-;:84;;;;:::i;:::-;31963:102:::0;-1:-1:-1;32088:11:0;;32084:226:::1;;32147:1;32124:4;:17;;32142:1;32124:20;;;;;;;;:::i;:::-;;;;;;;;:24;;;;-1:-1:-1::0;;;32207:11:0::1;32219:1;32207:14;;;;;;;;:::i;:::-;;;;;;;32192:5;:12;;;:29;;;;:::i;:::-;:36;;;;:::i;:::-;32171:4;:15;;32187:1;32171:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:57:::0;32251:39:::1;32267:1:::0;32270:10:::1;32282:7:::0;32251:15:::1;:39::i;:::-;-1:-1:-1::0;31940:3:0;::::1;::::0;::::1;:::i;:::-;;;;31896:429;;;-1:-1:-1::0;32370:3:0::1;:10:::0;32343:16:::1;::::0;::::1;::::0;:23;:37:::1;32339:492;;32415:16;::::0;::::1;::::0;:23;32401:415:::1;32444:3;:10:::0;32440:14;::::1;32401:415;;;32484:15;-1:-1:-1::0;;;32518:11:0::1;32530:1;32518:14;;;;;;;;:::i;:::-;;;;;;;32503:5;:12;;;:29;;;;:::i;:::-;:36;;;;:::i;:::-;32563:17;::::0;::::1;:24:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;32563:24:0;;;;32646:14;;32484:56;;-1:-1:-1;32610:15:0;::::1;::::0;-1:-1:-1;;;32663:4:0;32646:11;;32658:1;;32646:14;::::1;;;;;:::i;:::-;;;;;;;32631:5;:12;;;:29;;;;:::i;:::-;:36;;;;:::i;:::-;32610:58:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;32610:58:0;;;::::1;::::0;;;;;::::1;::::0;32694:11;;32691:106:::1;;32734:39;32750:1;32753:10;32765:7;32734:15;:39::i;:::-;-1:-1:-1::0;32456:3:0;::::1;::::0;::::1;:::i;:::-;;;;32401:415;;;;32339:492;-1:-1:-1::0;;13292:1:0;14246:22;;-1:-1:-1;;31598:1251:0:o;26748:205::-;26850:29;26882:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;26882:21:0;;;;;;;;;:32;;26850:64;;;;;;;;;;;;;;;;;26821:16;;26850:29;:64;;26882:32;26850:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26850:64:0;;26748:205;-1:-1:-1;;;;;;;;26748:205:0:o;39675:105::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39744:20:0::1;39767:5;39744:20:::0;;;:10:::1;:20;::::0;;;;:28;;-1:-1:-1;;39744:28:0::1;::::0;;39675:105::o;10989:206::-;10121:7;10148:6;-1:-1:-1;;;;;10148:6:0;8910:10;10295:23;10287:68;;;;-1:-1:-1;;;10287:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;11078:27:0;::::1;::::0;11070:78:::1;;;::::0;-1:-1:-1;;;11070:78:0;;12588:2:1;11070:78:0::1;::::0;::::1;12570:21:1::0;12627:2;12607:18;;;12600:30;12666:34;12646:18;;;12639:62;-1:-1:-1;;;12717:18:1;;;12710:36;12763:19;;11070:78:0::1;12386:402:1::0;11070:78:0::1;11159:28;11178:8;11159:18;:28::i;41247:942::-:0;41325:3;:10;:15;41322:860;;41357:21;41381:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;41381:22:0;;;;;;;;;41441:8;:14;;41381:22;;41357:21;41390:4;;41441:14;;;;;;:::i;:::-;;;;;;;;;;41418:37;;;;;;;;41441:14;;;;;;;41418:37;;-1:-1:-1;;;;;41418:37:0;;;;-1:-1:-1;;;;;;;;41418:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41441:14;;41418:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41470:21;41494:4;41470:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41518:6;41513:301;41532:5;:16;;;:23;41528:1;:27;41513:301;;;41580:15;41669:5;:18;;;41688:1;41669:21;;;;;;;;:::i;:::-;;;;;;;41647:5;:16;;;41664:1;41647:19;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;41614:4:0;:19;;;41634:1;41614:22;;;;;;;;:::i;:::-;;;;;;;41599:5;:12;;;:37;;;;:::i;:::-;:44;;;;:::i;:::-;41598:68;;;;:::i;:::-;:92;;;;:::i;:::-;41580:110;-1:-1:-1;41713:11:0;;41709:90;;41772:7;41749:4;:17;;41767:1;41749:20;;;;;;;;:::i;:::-;;;;;;;;;;:30;41709:90;-1:-1:-1;41557:3:0;;;;:::i;:::-;;;;41513:301;;;-1:-1:-1;41859:3:0;:10;41832:16;;;;:23;:37;41828:343;;41904:16;;;;:23;41890:266;41933:3;:10;41929:14;;41890:266;;;41973:15;-1:-1:-1;;;42007:4:0;:19;;;42027:1;42007:22;;;;;;;;:::i;:::-;;;;;;;41992:5;:12;;;:37;;;;:::i;:::-;:44;;;;:::i;:::-;42060:17;;;:31;;;;;;;;-1:-1:-1;42060:31:0;;;;;;;;;;;;;42114:15;;;:22;;;;;;;;-1:-1:-1;41945:3:0;;;;:::i;:::-;;;;41890:266;;;;41828:343;41342:840;;;41247:942;;:::o;42297:471::-;42386:11;42400:3;42404:7;42400:12;;;;;;;;:::i;:::-;;;;;;;;;;42440:29;;-1:-1:-1;;;42440:29:0;;42463:4;42440:29;;;4713:51:1;-1:-1:-1;;;;;42400:12:0;;;;-1:-1:-1;42400:12:0;;42440:14;;4686:18:1;;42440:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42423:46;;42480:20;42533:6;42523:7;:16;42519:171;;;42574:26;;-1:-1:-1;;;42574:26:0;;-1:-1:-1;;;;;7997:32:1;;;42574:26:0;;;7979:51:1;8046:18;;;8039:34;;;42574:13:0;;;;;7952:18:1;;42574:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42556:44;;42519:171;;;42651:27;;-1:-1:-1;;;42651:27:0;;-1:-1:-1;;;;;7997:32:1;;;42651:27:0;;;7979:51:1;8046:18;;;8039:34;;;42651:13:0;;;;;7952:18:1;;42651:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42633:45;;42519:171;42708:15;42700:60;;;;-1:-1:-1;;;42700:60:0;;12995:2:1;42700:60:0;;;12977:21:1;;;13014:18;;;13007:30;13073:34;13053:18;;;13046:62;13125:18;;42700:60:0;12793:356:1;18128:211:0;18272:58;;-1:-1:-1;;;;;7997:32:1;;18272:58:0;;;7979:51:1;8046:18;;;8039:34;;;18245:86:0;;18265:5;;-1:-1:-1;;;18295:23:0;7952:18:1;;18272:58:0;;;;-1:-1:-1;;18272:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;18272:58:0;-1:-1:-1;;;;;;18272:58:0;;;;;;;;;;18245:19;:86::i;40130:1105::-;40233:1;40223:7;:11;40215:20;;;;;;40246:21;40270:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;40270:22:0;;;;;;;;;40320:11;;40342:16;40279:4;40342:10;:16::i;:::-;40372:10;;40369:71;;40399:29;40415:4;40421:6;40399:15;:29::i;:::-;40452:84;40500:10;40521:4;40528:7;40452:8;40461:4;40452:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;40452:22:0;;:84;;:39;:84::i;:::-;40561:16;40570:7;40561:6;:16;:::i;:::-;40547:30;;40591:3;:10;:15;40588:594;;40632:4;:11;;;40623:20;;40658:31;40692:8;40701:4;40692:14;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;40658:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40741:6;40736:136;40755:15;;;:22;40751:26;;40736:136;;;-1:-1:-1;;;40832:14:0;40847:1;40832:17;;;;;;;;:::i;:::-;;;;;;;40823:6;:26;;;;:::i;:::-;:33;;;;:::i;:::-;40802:4;:15;;40818:1;40802:18;;;;;;;;:::i;:::-;;;;;;;;;;:54;40779:3;;;;:::i;:::-;;;;40736:136;;;-1:-1:-1;40916:3:0;:10;40890:15;;;:22;:36;40886:281;;40961:15;;;:22;40947:205;40989:3;:10;40985:14;;40947:205;;;41029:17;;;:25;;;;;;;;41052:1;41029:25;;;;;;;;;;;;;41107:17;;41077:15;;;;-1:-1:-1;;;41127:4:0;41107:14;;41122:1;;41107:17;;;;;;:::i;:::-;;;;;;;41098:6;:26;;;;:::i;:::-;:33;;;;:::i;:::-;41077:55;;;;;;;-1:-1:-1;41077:55:0;;;;;;;;;;;41001:3;;;;:::i;:::-;;;;40947:205;;;;40886:281;40608:574;40588:594;41213:4;41205:6;-1:-1:-1;;;;;41197:30:0;;41219:7;41197:30;;;;160:25:1;;148:2;133:18;;14:177;41197:30:0;;;;;;;;40204:1031;;40130:1105;;;:::o;11355:191::-;11429:16;11448:6;;-1:-1:-1;;;;;11465:17:0;;;-1:-1:-1;;;;;;11465:17:0;;;;;;11498:40;;11448:6;;;;;;;11498:40;;11429:16;11498:40;11418:128;11355:191;:::o;18347:248::-;18518:68;;-1:-1:-1;;;;;13412:15:1;;;18518:68:0;;;13394:34:1;13464:15;;13444:18;;;13437:43;13496:18;;;13489:34;;;18491:96:0;;18511:5;;-1:-1:-1;;;18541:27:0;13329:18:1;;18518:68:0;13154:375:1;18491:96:0;18347:248;;;;:::o;20701:716::-;21125:23;21151:69;21179:4;21151:69;;;;;;;;;;;;;;;;;21159:5;-1:-1:-1;;;;;21151:27:0;;;:69;;;;;:::i;:::-;21235:17;;21125:95;;-1:-1:-1;21235:21:0;21231:179;;21332:10;21321:30;;;;;;;;;;;;:::i;:::-;21313:85;;;;-1:-1:-1;;;21313:85:0;;13736:2:1;21313:85:0;;;13718:21:1;13775:2;13755:18;;;13748:30;13814:34;13794:18;;;13787:62;-1:-1:-1;;;13865:18:1;;;13858:40;13915:19;;21313:85:0;13534:406:1;3657:229:0;3794:12;3826:52;3848:6;3856:4;3862:1;3865:12;3826:21;:52::i;:::-;3819:59;3657:229;-1:-1:-1;;;;3657:229:0:o;4777:510::-;4947:12;5005:5;4980:21;:30;;4972:81;;;;-1:-1:-1;;;4972:81:0;;14147:2:1;4972:81:0;;;14129:21:1;14186:2;14166:18;;;14159:30;14225:34;14205:18;;;14198:62;-1:-1:-1;;;14276:18:1;;;14269:36;14322:19;;4972:81:0;13945:402:1;4972:81:0;1174:20;;5064:60;;;;-1:-1:-1;;;5064:60:0;;14554:2:1;5064:60:0;;;14536:21:1;14593:2;14573:18;;;14566:30;14632:31;14612:18;;;14605:59;14681:18;;5064:60:0;14352:353:1;5064:60:0;5138:12;5152:23;5179:6;-1:-1:-1;;;;;5179:11:0;5198:5;5205:4;5179:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5137:73;;;;5228:51;5245:7;5254:10;5266:12;5228:16;:51::i;:::-;5221:58;4777:510;-1:-1:-1;;;;;;;4777:510:0:o;7463:712::-;7613:12;7642:7;7638:530;;;-1:-1:-1;7673:10:0;7666:17;;7638:530;7787:17;;:21;7783:374;;7985:10;7979:17;8046:15;8033:10;8029:2;8025:19;8018:44;7783:374;8128:12;8121:20;;-1:-1:-1;;;8121:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:139:1;-1:-1:-1;;;;;279:31:1;;269:42;;259:70;;325:1;322;315:12;340:337;422:6;430;483:2;471:9;462:7;458:23;454:32;451:52;;;499:1;496;489:12;451:52;538:9;525:23;557:39;590:5;557:39;:::i;:::-;615:5;667:2;652:18;;;;639:32;;-1:-1:-1;;;340:337:1:o;682:180::-;741:6;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;-1:-1:-1;833:23:1;;682:180;-1:-1:-1;682:180:1:o;867:632::-;1038:2;1090:21;;;1160:13;;1063:18;;;1182:22;;;1009:4;;1038:2;1261:15;;;;1235:2;1220:18;;;1009:4;1304:169;1318:6;1315:1;1312:13;1304:169;;;1379:13;;1367:26;;1448:15;;;;1413:12;;;;1340:1;1333:9;1304:169;;;-1:-1:-1;1490:3:1;;867:632;-1:-1:-1;;;;;;867:632:1:o;1919:248::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;-1:-1:-1;;2087:23:1;;;2157:2;2142:18;;;2129:32;;-1:-1:-1;1919:248:1:o;2172:269::-;2245:6;2298:2;2286:9;2277:7;2273:23;2269:32;2266:52;;;2314:1;2311;2304:12;2266:52;2353:9;2340:23;2372:39;2405:5;2372:39;:::i;2638:323::-;2706:6;2714;2767:2;2755:9;2746:7;2742:23;2738:32;2735:52;;;2783:1;2780;2773:12;2735:52;2819:9;2806:23;2796:33;;2879:2;2868:9;2864:18;2851:32;2892:39;2925:5;2892:39;:::i;:::-;2950:5;2940:15;;;2638:323;;;;;:::o;2966:171::-;3033:20;;-1:-1:-1;;;;;3082:30:1;;3072:41;;3062:69;;3127:1;3124;3117:12;3062:69;2966:171;;;:::o;3142:118::-;3228:5;3221:13;3214:21;3207:5;3204:32;3194:60;;3250:1;3247;3240:12;3265:381;3338:6;3346;3354;3407:2;3395:9;3386:7;3382:23;3378:32;3375:52;;;3423:1;3420;3413:12;3375:52;3459:9;3446:23;3436:33;;3488:37;3521:2;3510:9;3506:18;3488:37;:::i;:::-;3478:47;;3575:2;3564:9;3560:18;3547:32;3588:28;3610:5;3588:28;:::i;:::-;3635:5;3625:15;;;3265:381;;;;;:::o;3911:391::-;3988:6;3996;4004;4057:2;4045:9;4036:7;4032:23;4028:32;4025:52;;;4073:1;4070;4063:12;4025:52;4112:9;4099:23;4131:39;4164:5;4131:39;:::i;:::-;4189:5;4241:2;4226:18;;4213:32;;-1:-1:-1;4292:2:1;4277:18;;;4264:32;;3911:391;-1:-1:-1;;;3911:391:1:o;4307:241::-;4363:6;4416:2;4404:9;4395:7;4391:23;4387:32;4384:52;;;4432:1;4429;4422:12;4384:52;4471:9;4458:23;4490:28;4512:5;4490:28;:::i;5311:476::-;5398:6;5406;5414;5467:2;5455:9;5446:7;5442:23;5438:32;5435:52;;;5483:1;5480;5473:12;5435:52;5506:28;5524:9;5506:28;:::i;:::-;5496:38;;5584:2;5573:9;5569:18;5556:32;5597:39;5630:5;5597:39;:::i;5792:356::-;5994:2;5976:21;;;6013:18;;;6006:30;6072:34;6067:2;6052:18;;6045:62;6139:2;6124:18;;5792:356::o;6507:127::-;6568:10;6563:3;6559:20;6556:1;6549:31;6599:4;6596:1;6589:15;6623:4;6620:1;6613:15;6639:127;6700:10;6695:3;6691:20;6688:1;6681:31;6731:4;6728:1;6721:15;6755:4;6752:1;6745:15;6771:135;6810:3;6831:17;;;6828:43;;6851:18;;:::i;:::-;-1:-1:-1;6898:1:1;6887:13;;6771:135::o;6911:355::-;7113:2;7095:21;;;7152:2;7132:18;;;7125:30;7191:33;7186:2;7171:18;;7164:61;7257:2;7242:18;;6911:355::o;7673:127::-;7734:10;7729:3;7725:20;7722:1;7715:31;7765:4;7762:1;7755:15;7789:4;7786:1;7779:15;8084:245;8151:6;8204:2;8192:9;8183:7;8179:23;8175:32;8172:52;;;8220:1;8217;8210:12;8172:52;8252:9;8246:16;8271:28;8293:5;8271:28;:::i;8334:184::-;8404:6;8457:2;8445:9;8436:7;8432:23;8428:32;8425:52;;;8473:1;8470;8463:12;8425:52;-1:-1:-1;8496:16:1;;8334:184;-1:-1:-1;8334:184:1:o;8523:972::-;8777:4;8825:3;8814:9;8810:19;8856:6;8845:9;8838:25;8882:2;8920:6;8915:2;8904:9;8900:18;8893:34;8963:3;8958:2;8947:9;8943:18;8936:31;8987:6;9022;9016:13;9053:6;9045;9038:22;9091:3;9080:9;9076:19;9069:26;;9130:2;9122:6;9118:15;9104:29;;9151:1;9161:195;9175:6;9172:1;9169:13;9161:195;;;9240:13;;-1:-1:-1;;;;;9236:39:1;9224:52;;9331:15;;;;9296:12;;;;9272:1;9190:9;9161:195;;;-1:-1:-1;;;;;;;9412:32:1;;;;9407:2;9392:18;;9385:60;-1:-1:-1;;;9476:3:1;9461:19;9454:35;9373:3;8523:972;-1:-1:-1;;;8523:972:1:o;9500:125::-;9540:4;9568:1;9565;9562:8;9559:34;;;9573:18;;:::i;:::-;-1:-1:-1;9610:9:1;;9500:125::o;9630:128::-;9670:3;9701:1;9697:6;9694:1;9691:13;9688:39;;;9707:18;;:::i;:::-;-1:-1:-1;9743:9:1;;9630:128::o;9763:168::-;9803:7;9869:1;9865;9861:6;9857:14;9854:1;9851:21;9846:1;9839:9;9832:17;9828:45;9825:71;;;9876:18;;:::i;:::-;-1:-1:-1;9916:9:1;;9763:168::o;9936:217::-;9976:1;10002;9992:132;;10046:10;10041:3;10037:20;10034:1;10027:31;10081:4;10078:1;10071:15;10109:4;10106:1;10099:15;9992:132;-1:-1:-1;10138:9:1;;9936:217::o;14710:258::-;14782:1;14792:113;14806:6;14803:1;14800:13;14792:113;;;14882:11;;;14876:18;14863:11;;;14856:39;14828:2;14821:10;14792:113;;;14923:6;14920:1;14917:13;14914:48;;;-1:-1:-1;;14958:1:1;14940:16;;14933:27;14710:258::o;14973:274::-;15102:3;15140:6;15134:13;15156:53;15202:6;15197:3;15190:4;15182:6;15178:17;15156:53;:::i;:::-;15225:16;;;;;14973:274;-1:-1:-1;;14973:274:1:o;15252:383::-;15401:2;15390:9;15383:21;15364:4;15433:6;15427:13;15476:6;15471:2;15460:9;15456:18;15449:34;15492:66;15551:6;15546:2;15535:9;15531:18;15526:2;15518:6;15514:15;15492:66;:::i;:::-;15619:2;15598:15;-1:-1:-1;;15594:29:1;15579:45;;;;15626:2;15575:54;;15252:383;-1:-1:-1;;15252:383:1:o
Swarm Source
ipfs://c915a5edbc3e5b3c8cae46afe5105b2c4f694889a5dba6abb75ecceab5a1d3ca
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1.01 | 44.6503 | $45.01 |
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.