Overview
POL Balance
0 POL
POL Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 389 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit ETH | 63154161 | 45 days ago | IN | 0.81699 POL | 0.00246666 | ||||
Deposit | 49321711 | 399 days ago | IN | 0 POL | 0.00946124 | ||||
Pay Monthly Fee | 48808783 | 412 days ago | IN | 0 POL | 0.03048043 | ||||
Withdraw | 48761575 | 413 days ago | IN | 0 POL | 0.00536739 | ||||
Withdraw | 48323385 | 424 days ago | IN | 0 POL | 0.00843524 | ||||
Withdraw | 48313687 | 424 days ago | IN | 0 POL | 0.00822352 | ||||
Withdraw | 48186237 | 428 days ago | IN | 0 POL | 0.00618309 | ||||
Pay Monthly Fee | 48106823 | 430 days ago | IN | 0 POL | 0.01116022 | ||||
Pay Monthly Fee | 48068397 | 431 days ago | IN | 0 POL | 0.01257446 | ||||
Withdraw | 48020636 | 432 days ago | IN | 0 POL | 0.00510304 | ||||
Pay Monthly Fee | 48018859 | 432 days ago | IN | 0 POL | 0.02098001 | ||||
Deposit | 48018684 | 432 days ago | IN | 0 POL | 0.00860773 | ||||
Withdraw | 47995833 | 433 days ago | IN | 0 POL | 0.0085648 | ||||
Withdraw | 46932544 | 460 days ago | IN | 0 POL | 0.01621506 | ||||
Pay Monthly Fee | 46919471 | 460 days ago | IN | 0 POL | 0.0321137 | ||||
Pay Monthly Fee | 46879874 | 461 days ago | IN | 0 POL | 0.03105047 | ||||
Withdraw | 46735375 | 464 days ago | IN | 0 POL | 0.01238877 | ||||
Withdraw | 46735239 | 464 days ago | IN | 0 POL | 0.01905363 | ||||
Withdraw | 46519023 | 470 days ago | IN | 0 POL | 0.0097573 | ||||
Deposit ETH | 46517670 | 470 days ago | IN | 4.98201 POL | 0.00606742 | ||||
Deposit ETH | 46517365 | 470 days ago | IN | 33.29637 POL | 0.00646041 | ||||
Deposit ETH | 46516917 | 470 days ago | IN | 16.68562 POL | 0.00592161 | ||||
Pay Monthly Fee | 46516375 | 470 days ago | IN | 0 POL | 0.0354048 | ||||
Deposit ETH | 46516336 | 470 days ago | IN | 0.27872 POL | 0.00645013 | ||||
Deposit ETH | 46516212 | 470 days ago | IN | 18 POL | 0.00737226 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
63154161 | 45 days ago | 0.81699 POL | ||||
48323385 | 424 days ago | 32.73852804 POL | ||||
48323385 | 424 days ago | 32.73852804 POL | ||||
48313687 | 424 days ago | 12 POL | ||||
48313687 | 424 days ago | 12 POL | ||||
46519023 | 470 days ago | 59.07906 POL | ||||
46519023 | 470 days ago | 59.07906 POL | ||||
46517670 | 470 days ago | 4.98201 POL | ||||
46517365 | 470 days ago | 33.29637 POL | ||||
46516917 | 470 days ago | 16.68562 POL | ||||
46516336 | 470 days ago | 0.27872 POL | ||||
46516212 | 470 days ago | 18 POL | ||||
46349166 | 474 days ago | 13.66522767 POL | ||||
46348493 | 474 days ago | 10.93886466 POL | ||||
46348493 | 474 days ago | 10.93886466 POL | ||||
45879295 | 486 days ago | 87.67707758 POL | ||||
45879295 | 486 days ago | 87.67707758 POL | ||||
45814040 | 488 days ago | 69.97658326 POL | ||||
45812410 | 488 days ago | 27.88697059 POL | ||||
45700473 | 490 days ago | 4.82595442 POL | ||||
45699504 | 490 days ago | 5 POL | ||||
45583280 | 493 days ago | 1 POL | ||||
45583280 | 493 days ago | 1 POL | ||||
45583254 | 493 days ago | 1 POL | ||||
45188428 | 503 days ago | 10.27877775 POL |
Loading...
Loading
Contract Name:
OkseCard
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-11-17 */ // Sources flattened with hardhat v2.9.6 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/libraries/TransferHelper.sol pragma solidity >=0.6.0; library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } } // File contracts/interfaces/PriceOracle.sol pragma solidity ^0.7.0; abstract contract PriceOracle { /// @notice Indicator that this is a PriceOracle contract (for inspection) bool public constant isPriceOracle = true; /** * @notice Get the underlying price of a cToken asset * @param market The cToken to get the underlying price of * @return The underlying asset price mantissa (scaled by 1e18). * Zero means the price is unavailable. */ function getUnderlyingPrice(address market) external virtual view returns (uint); } // File contracts/interfaces/ILimitManager.sol pragma solidity ^0.7.0; interface ILimitManager { function getUserLimit(address userAddr) external view returns (uint256); function getDailyLimit(uint256 level) external view returns (uint256); function getSpendAmountToday(address userAddr) external view returns (uint256); function withinLimits(address userAddr, uint256 usdAmount) external view returns (bool); function updateUserSpendAmount(address userAddr, uint256 usdAmount) external; } // File contracts/interfaces/ILevelManager.sol pragma solidity ^0.7.0; interface ILevelManager { function getUserLevel(address userAddr) external view returns (uint256); function getLevel(uint256 _okseAmount) external view returns (uint256); function updateUserLevel( address userAddr, uint256 beforeAmount ) external returns (bool); } // File contracts/interfaces/IMarketManager.sol pragma solidity ^0.7.0; interface IMarketManager { function WETH() external view returns (address); function USDC() external view returns (address); function OKSE() external view returns (address); function defaultMarket() external view returns (address); function oksePaymentEnable() external view returns (bool); function emergencyStop() external view returns (bool); function marketEnable(address market) external view returns (bool); function isMarketExist(address market) external view returns (bool); function userMainMarket(address userAddr) external view returns (address); function slippage() external view returns (uint256); function getUserMainMarket(address userAddr) external view returns (address); function setUserMainMakret(address userAddr, address market) external; } // File contracts/interfaces/ICashBackManager.sol pragma solidity ^0.7.0; interface ICashBackManager { function cashBackEnable() external view returns (bool); function getCashBackPercent(uint256 level) external view returns (uint256); } // File contracts/interfaces/IWETH9.sol pragma solidity ^0.7.0; /// @title Interface for WETH9 interface IWETH9 is IERC20 { /// @notice Deposit ether to get wrapped ether function deposit() external payable; /// @notice Withdraw wrapped ether to get ether function withdraw(uint256) external; } // File contracts/interfaces/ISwapper.sol pragma solidity ^0.7.0; interface ISwapper { function _swap( uint256[] memory amounts, address[] memory path, address _to ) external; function getAmountsIn(uint256 amountOut, address[] memory path) external view returns (uint256[] memory amounts); function getAmountsOut(uint256 amountIn, address[] memory path) external view returns (uint256[] memory amounts); function GetReceiverAddress(address[] memory path) external view returns (address); function getOptimumPath(address token0, address token1) external view returns (address[] memory); } // File contracts/interfaces/ERC20Interface.sol pragma solidity ^0.7.0; interface ERC20Interface { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/interfaces/IConverter.sol pragma solidity ^0.7.0; interface IConverter { function convertUsdAmountToAssetAmount( uint256 usdAmount, address assetAddress ) external view returns (uint256); function convertAssetAmountToUsdAmount( uint256 assetAmount, address assetAddress ) external view returns (uint256); function getUsdAmount( address market, uint256 assetAmount, address priceOracle ) external view returns (uint256 usdAmount); function getAssetAmount( address market, uint256 usdAmount, address priceOracle ) external view returns (uint256 assetAmount); } // File contracts/libraries/SafeMath.sol pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return add(a, b, "SafeMath: addition overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/MultiSigOwner.sol pragma solidity ^0.7.0; pragma abicoder v2; // 2/3 Multi Sig Owner contract MultiSigOwner { address[] public owners; mapping(uint256 => bool) public signatureId; bool private initialized; // events event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); event SignValidTimeChanged(uint256 newValue); modifier validSignOfOwner( bytes calldata signData, bytes calldata keys, string memory functionName ) { require(isOwner(msg.sender), "on"); address signer = getSigner(signData, keys); require( signer != msg.sender && isOwner(signer) && signer != address(0), "is" ); (bytes4 method, uint256 id, uint256 validTime, ) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); require( signatureId[id] == false && method == bytes4(keccak256(bytes(functionName))), "sru" ); require(validTime > block.timestamp, "ep"); signatureId[id] = true; _; } function isOwner(address addr) public view returns (bool) { bool _isOwner = false; for (uint256 i = 0; i < owners.length; i++) { if (owners[i] == addr) { _isOwner = true; } } return _isOwner; } constructor() {} function initializeOwners(address[3] memory _owners) public { require( !initialized && _owners[0] != address(0) && _owners[1] != address(0) && _owners[2] != address(0), "ai" ); owners = [_owners[0], _owners[1], _owners[2]]; initialized = true; } function getSigner(bytes calldata _data, bytes calldata keys) public view returns (address) { uint256 chainId; assembly { chainId := chainid() } (uint8 v, bytes32 r, bytes32 s) = abi.decode( keys, (uint8, bytes32, bytes32) ); return ecrecover( toEthSignedMessageHash( keccak256(abi.encodePacked(this, chainId, _data)) ), v, r, s ); } function encodePackedData(bytes calldata _data) public view returns (bytes32) { uint256 chainId; assembly { chainId := chainid() } return keccak256(abi.encodePacked(this, chainId, _data)); } function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", hash) ); } // Set functions // verified function transferOwnership(bytes calldata signData, bytes calldata keys) public validSignOfOwner(signData, keys, "transferOwnership") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); address newOwner = abi.decode(params, (address)); uint256 index; for (uint256 i = 0; i < owners.length; i++) { if (owners[i] == msg.sender) { index = i; } } address oldOwner = owners[index]; owners[index] = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/OwnerConstants.sol pragma solidity ^0.7.0; contract OwnerConstants is MultiSigOwner { using SafeMath for uint256; // daily limit contants uint256 public constant MAX_LEVEL = 5; // this is reward address for user's withdraw and payment for goods. address public treasuryAddress; // this address should be deposit okse in his balance and users can get cashback from this address. address public financialAddress; // master address is used to send USDC tokens when user buy goods. address public masterAddress; // monthly fee rewarded address address public monthlyFeeAddress; // staking contract address, which is used to receive 20% of monthly fee, so staked users can be rewarded from this contract address public stakeContractAddress; // statking amount of monthly fee uint256 public stakePercent; // 15 % // withdraw fee and payment fee should not exeed this amount, 1% is coresponding to 100. uint256 public constant MAX_FEE_AMOUNT = 500; // 5% // buy fee setting. uint256 public buyFeePercent; // 1% // withdraw fee setting. uint256 public withdrawFeePercent; // 0.1 % // set monthly fee of user to use card payment, unit is usd amount ( 1e18) uint256 public monthlyFeeAmount; // 6.99 USD // if user pay monthly fee using okse, then he will pay less amount fro this percent. 0% => 0, 100% => 10000 uint256 public okseMonthlyProfit; // 10% // buy tx fee in usd uint256 public buyTxFee; // 0.7 usd event ManagerAddressChanged( address treasuryAddress, address financialAddress, address masterAddress, address monthlyFeeAddress ); event FeeValuesChanged( uint256 monthlyFeeAmount, uint256 okseMonthlyProfit, uint256 withdrawFeePercent, uint256 buyTxFee, uint256 buyFeePercent ); event StakeContractParamChanged( address stakeContractAddress, uint256 stakePercent ); constructor() {} function getMonthlyFeeAmount(bool payFromOkse) public view returns (uint256) { uint256 result; if (payFromOkse) { result = monthlyFeeAmount.sub( (monthlyFeeAmount.mul(okseMonthlyProfit)).div(10000) ); } else { result = monthlyFeeAmount; } return result; } function setManagerAddresses(bytes calldata signData, bytes calldata keys) public validSignOfOwner(signData, keys, "setManagerAddresses") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); ( address _newTreasuryAddress, address _newFinancialAddress, address _newMasterAddress, address _mothlyFeeAddress ) = abi.decode(params, (address, address, address, address)); treasuryAddress = _newTreasuryAddress; financialAddress = _newFinancialAddress; masterAddress = _newMasterAddress; monthlyFeeAddress = _mothlyFeeAddress; emit ManagerAddressChanged( treasuryAddress, financialAddress, masterAddress, monthlyFeeAddress ); } // verified function setFeeValues(bytes calldata signData, bytes calldata keys) public validSignOfOwner(signData, keys, "setFeeValues") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); ( uint256 _monthlyFeeAmount, uint256 _okseMonthlyProfit, uint256 _withdrawFeePercent, uint256 newBuyFeePercent, uint256 newBuyTxFee ) = abi.decode(params, (uint256, uint256, uint256, uint256, uint256)); require(_okseMonthlyProfit <= 10000, "over percent"); require(_withdrawFeePercent <= MAX_FEE_AMOUNT, "mfo"); monthlyFeeAmount = _monthlyFeeAmount; okseMonthlyProfit = _okseMonthlyProfit; withdrawFeePercent = _withdrawFeePercent; require(newBuyFeePercent <= MAX_FEE_AMOUNT, "mpo"); buyFeePercent = newBuyFeePercent; buyTxFee = newBuyTxFee; emit FeeValuesChanged( monthlyFeeAmount, okseMonthlyProfit, withdrawFeePercent, buyTxFee, buyFeePercent ); } function setStakeContractParams( bytes calldata signData, bytes calldata keys ) public validSignOfOwner(signData, keys, "setStakeContractParams") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); (address _stakeContractAddress, uint256 _stakePercent) = abi.decode( params, (address, uint256) ); stakeContractAddress = _stakeContractAddress; stakePercent = _stakePercent; emit StakeContractParamChanged(stakeContractAddress, stakePercent); } } // File contracts/SignerRole.sol pragma solidity ^0.7.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping(address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { // require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } abstract contract SignerRole is Context { using Roles for Roles.Role; event SignerAdded(address indexed account); event SignerRemoved(address indexed account); Roles.Role private _signers; constructor(address _signer) { _addSigner(_signer); } modifier onlySigner() { require( isSigner(_msgSender()), "SignerRole: caller does not have the Signer role" ); _; } function isSigner(address account) public view returns (bool) { return _signers.has(account); } function _addSigner(address account) internal { _signers.add(account); emit SignerAdded(account); } function _removeSigner(address account) internal { _signers.remove(account); emit SignerRemoved(account); } } // File contracts/OkseCard.sol // Solidity files have to start with this pragma. // It will be used by the Solidity compiler to validate its version. pragma solidity ^0.7.0; // We import this library to be able to use console.log // import "hardhat/console.sol"; // This is the main building block for smart contracts. contract OkseCard is OwnerConstants, SignerRole { // bytes4 public constant PAY_MONTHLY_FEE = bytes4(keccak256(bytes('payMonthlyFee'))); bytes4 public constant PAY_MONTHLY_FEE = 0x529a8d6c; // bytes4 public constant WITHDRAW = bytes4(keccak256(bytes('withdraw'))); bytes4 public constant WITHDRAW = 0x855511cc; // bytes4 public constant BUYGOODS = bytes4(keccak256(bytes('buyGoods'))); bytes4 public constant BUYGOODS = 0xa8fd19f2; // bytes4 public constant SET_USER_MAIN_MARKET = bytes4(keccak256(bytes('setUserMainMarket'))); bytes4 public constant SET_USER_MAIN_MARKET = 0x4a22142e; // uint256 public constant CARD_VALIDATION_TIME = 10 minutes; // 30 days in prodcution uint256 public constant CARD_VALIDATION_TIME = 30 days; // 30 days in prodcution using SafeMath for uint256; address public immutable converter; address public swapper; // Price oracle address, which is used for verification of swapping assets amount address public priceOracle; address public limitManager; address public levelManager; address public marketManager; address public cashbackManager; // Governor can set followings: address public governorAddress; // Governance address /*** Main Actions ***/ // user's deposited balance. // user => ( market => balances) mapping(address => mapping(address => uint256)) public usersBalances; mapping(address => uint256) public userValidTimes; //prevent reentrancy attack uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; bool private initialized; // uint256 public timeDiff; struct SignKeys { uint8 v; bytes32 r; bytes32 s; } struct SignData { bytes4 method; uint256 id; address market; address userAddr; uint256 amount; uint256 validTime; } // emit event event UserBalanceChanged( address indexed userAddr, address indexed market, uint256 amount ); event GovernorAddressChanged( address indexed previousGovernor, address indexed newGovernor ); event MonthlyFeePaid( uint256 id, address userAddr, uint256 userValidTime, uint256 usdAmount ); event UserDeposit(address userAddr, address market, uint256 amount); event UserWithdraw( uint256 id, address userAddr, address market, uint256 amount, uint256 remainedBalance ); event SignerBuyGoods( uint256 id, address signer1, address signer2, address market, address userAddr, uint256 usdAmount ); event UserMainMarketChanged( uint256 id, address userAddr, address market, address beforeMarket ); event ContractAddressChanged( address priceOracle, address swapper, address limitManager, address levelManager, address marketManager, address cashbackManager ); event WithdrawTokens(address token, address to, uint256 amount); // verified /** * Contract initialization. * * The `constructor` is executed only once when the contract is created. * The `public` modifier makes a function callable from outside the contract. */ constructor(address _converter, address _initialSigner) SignerRole(_initialSigner) { converter = _converter; // The totalSupply is assigned to transaction sender, which is the account // that is deploying the contract. } // verified receive() external payable { // require(msg.sender == WETH, 'Not WETH9'); } // verified function initialize( address _priceOracle, address _limitManager, address _levelManager, address _marketManager, address _cashbackManager, address _financialAddress, address _masterAddress, address _treasuryAddress, address _governorAddress, address _monthlyFeeAddress, address _stakeContractAddress, address _swapper ) public { require(!initialized, "ai"); // owner = _owner; // _addSigner(_owner); priceOracle = _priceOracle; limitManager = _limitManager; levelManager = _levelManager; marketManager = _marketManager; cashbackManager = _cashbackManager; treasuryAddress = _treasuryAddress; financialAddress = _financialAddress; masterAddress = _masterAddress; governorAddress = _governorAddress; monthlyFeeAddress = _monthlyFeeAddress; stakeContractAddress = _stakeContractAddress; swapper = _swapper; //private variables initialize. _status = _NOT_ENTERED; //initialize OwnerConstants arrays stakePercent = 15 * (100 + 15); buyFeePercent = 250; buyTxFee = 0.7 ether; withdrawFeePercent = 0; monthlyFeeAmount = 6.99 ether; okseMonthlyProfit = 1000; initialized = true; } /// modifier functions // verified modifier onlyGovernor() { require(_msgSender() == governorAddress, "og"); _; } // // verified modifier marketEnabled(address market) { require(IMarketManager(marketManager).marketEnable(market), "mdnd"); _; } // verified modifier noExpired(address userAddr) { require(!getUserExpired(userAddr), "user expired"); _; } /** * @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 make it call a * `private` function that does the actual work. */ // verified modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "rc"); // 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; } modifier validSignOfUser( SignData calldata sign_data, SignKeys calldata sign_key ) { require( sign_data.userAddr == getecrecover(sign_data, sign_key), "ssst" ); _; } modifier noEmergency() { require(!IMarketManager(marketManager).emergencyStop(), "stopped"); _; } function getUserOkseBalance(address userAddr) external view returns (uint256) { return usersBalances[userAddr][IMarketManager(marketManager).OKSE()]; } // verified function getUserExpired(address _userAddr) public view returns (bool) { // if monthly fee is zero then user never expired if (monthlyFeeAmount == 0){ return false; } if (userValidTimes[_userAddr].add(25 days) > block.timestamp) { return false; } return true; } // set Governance address function setGovernor(address newGovernor) public onlyGovernor { address oldGovernor = governorAddress; governorAddress = newGovernor; emit GovernorAddressChanged(oldGovernor, newGovernor); } // verified function updateSigner(address _signer, bool bAddOrRemove) public onlyGovernor { if (bAddOrRemove) { _addSigner(_signer); } else { _removeSigner(_signer); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function onUpdateUserBalance( address userAddr, address market, uint256 amount, uint256 beforeAmount ) internal returns (bool) { emit UserBalanceChanged(userAddr, market, amount); if (market != IMarketManager(marketManager).OKSE()) return true; return ILevelManager(levelManager).updateUserLevel(userAddr, beforeAmount); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // newly verified function deposit(address market, uint256 amount) public marketEnabled(market) nonReentrant noEmergency { TransferHelper.safeTransferFrom( market, msg.sender, address(this), amount ); _addUserBalance(market, msg.sender, amount); emit UserDeposit(msg.sender, market, amount); } // newly verified function depositETH() public payable nonReentrant { address WETH = IMarketManager(marketManager).WETH(); require(IMarketManager(marketManager).marketEnable(WETH), "me"); IWETH9(WETH).deposit{value: msg.value}(); _addUserBalance(WETH, msg.sender, msg.value); emit UserDeposit(msg.sender, WETH, msg.value); } // verified function _addUserBalance( address market, address userAddr, uint256 amount ) internal marketEnabled(market) { uint256 beforeAmount = usersBalances[userAddr][market]; usersBalances[userAddr][market] = usersBalances[userAddr][market].add( amount ); onUpdateUserBalance( userAddr, market, usersBalances[userAddr][market], beforeAmount ); } // newly verified function setUserMainMarket( uint256 id, address market, uint256 validTime, uint8 v, bytes32 r, bytes32 s ) public { address userAddr = msg.sender; uint256 chainId; assembly { chainId := chainid() } require( isSigner( ecrecover( toEthSignedMessageHash( keccak256( abi.encodePacked( this, SET_USER_MAIN_MARKET, id, userAddr, market, chainId, uint256(0), validTime ) ) ), v, r, s ) ), "summ" ); require(signatureId[id] == false, "pru"); signatureId[id] = true; require(validTime > block.timestamp, "expired"); address beforeMarket = IMarketManager(marketManager).getUserMainMarket( userAddr ); IMarketManager(marketManager).setUserMainMakret(userAddr, market); emit UserMainMarketChanged(id, userAddr, market, beforeMarket); } // verified function payMonthlyFee( uint256 id, SignData calldata _data, SignKeys calldata user_key, address market ) public nonReentrant marketEnabled(market) noEmergency validSignOfUser(_data, user_key) onlySigner { address userAddr = _data.userAddr; require(userValidTimes[userAddr] <= block.timestamp, "e"); require(monthlyFeeAmount <= _data.amount, "over paid"); require( signatureId[id] == false && _data.method == PAY_MONTHLY_FEE, "pru" ); signatureId[id] = true; // increase valid period // extend user's valid time uint256 _monthlyFee = getMonthlyFeeAmount( market == IMarketManager(marketManager).OKSE() ); uint256 _tempVal = _monthlyFee; userValidTimes[userAddr] = block.timestamp.add(CARD_VALIDATION_TIME); if (stakeContractAddress != address(0)) { _tempVal = (_monthlyFee.mul(10000)).div(stakePercent.add(10000)); } uint256 beforeAmount = usersBalances[userAddr][market]; calculateAmount( market, userAddr, _tempVal, monthlyFeeAddress, stakeContractAddress, stakePercent ); onUpdateUserBalance( userAddr, market, usersBalances[userAddr][market], beforeAmount ); emit MonthlyFeePaid( id, userAddr, userValidTimes[userAddr], _monthlyFee ); } // newly verified function withdraw( uint256 id, address market, uint256 amount, uint256 validTime, uint8 v, bytes32 r, bytes32 s ) public nonReentrant { address userAddr = msg.sender; uint256 chainId; assembly { chainId := chainid() } require( isSigner( ecrecover( toEthSignedMessageHash( keccak256( abi.encodePacked( this, WITHDRAW, id, userAddr, market, chainId, amount, validTime ) ) ), v, r, s ) ), "ssst" ); require(signatureId[id] == false, "pru"); signatureId[id] = true; require(validTime > block.timestamp, "expired"); uint256 beforeAmount = usersBalances[userAddr][market]; // require(beforeAmount >= amount, "ib"); usersBalances[userAddr][market] = beforeAmount.sub(amount); address WETH = IMarketManager(marketManager).WETH(); if (market == WETH) { IWETH9(WETH).withdraw(amount); if (treasuryAddress != address(0)) { uint256 feeAmount = (amount.mul(withdrawFeePercent)).div(10000); if (feeAmount > 0) { TransferHelper.safeTransferETH(treasuryAddress, feeAmount); } TransferHelper.safeTransferETH( msg.sender, amount.sub(feeAmount) ); } else { TransferHelper.safeTransferETH(msg.sender, amount); } } else { if (treasuryAddress != address(0)) { uint256 feeAmount = (amount.mul(withdrawFeePercent)).div(10000); if (feeAmount > 0) { TransferHelper.safeTransfer( market, treasuryAddress, feeAmount ); } TransferHelper.safeTransfer( market, msg.sender, amount.sub(feeAmount) ); } else { TransferHelper.safeTransfer(market, msg.sender, amount); } } uint256 userBal = usersBalances[userAddr][market]; onUpdateUserBalance(userAddr, market, userBal, beforeAmount); emit UserWithdraw(id, userAddr, market, amount, userBal); } // decimal of usdAmount is 18 // newly verified function buyGoods(SignData calldata _data, SignKeys[2] calldata signer_key) external nonReentrant marketEnabled(_data.market) noExpired(_data.userAddr) noEmergency { address[2] memory signers = [ getecrecover(_data, signer_key[0]), getecrecover(_data, signer_key[1]) ]; require( isSigner(signers[0]) && isSigner(signers[1]) && (signers[0] != signers[1]), "is" ); require( signatureId[_data.id] == false && _data.method == BUYGOODS, "pru" ); signatureId[_data.id] = true; if (_data.market == IMarketManager(marketManager).OKSE()) { require(IMarketManager(marketManager).oksePaymentEnable(), "jsy"); } require( IMarketManager(marketManager).getUserMainMarket(_data.userAddr) == _data.market, "jsy2" ); uint256 spendAmount = _makePayment( _data.market, _data.userAddr, _data.amount ); cashBack(_data.userAddr, spendAmount); emit SignerBuyGoods( _data.id, signers[0], signers[1], _data.market, _data.userAddr, _data.amount ); } // deduce user assets using usd amount // decimal of usdAmount is 18 // verified function _makePayment( address market, address userAddr, uint256 usdAmount ) internal returns (uint256 spendAmount) { uint256 beforeAmount = usersBalances[userAddr][market]; spendAmount = calculateAmount( market, userAddr, usdAmount, masterAddress, treasuryAddress, buyFeePercent ); ILimitManager(limitManager).updateUserSpendAmount(userAddr, usdAmount); onUpdateUserBalance( userAddr, market, usersBalances[userAddr][market], beforeAmount ); } // calculate aseet amount from market and required usd amount // decimal of usdAmount is 18 // spendAmount is decimal 18 function calculateAmount( address market, address userAddr, uint256 usdAmount, address targetAddress, address feeAddress, uint256 feePercent ) internal returns (uint256 spendAmount) { uint256 _amount; address USDC = IMarketManager(marketManager).USDC(); if (feeAddress != address(0)) { _amount = usdAmount.add((usdAmount.mul(feePercent)).div(10000)).add( buyTxFee ); } else { _amount = usdAmount; } // change _amount to USDC asset amounts uint256 assetAmountIn = IConverter(converter).getAssetAmount( market, _amount, priceOracle ); assetAmountIn = assetAmountIn.add( (assetAmountIn.mul(IMarketManager(marketManager).slippage())).div( 10000 ) ); _amount = IConverter(converter).convertUsdAmountToAssetAmount( _amount, USDC ); uint256 userBal = usersBalances[userAddr][market]; if (market != USDC) { // we need to change somehting here, because if there are not pair {market, USDC} , then we have to add another path // so please check the path is exist and if no, please add market, weth, usdc to path address[] memory path = ISwapper(swapper).getOptimumPath( market, USDC ); uint256[] memory amounts = ISwapper(swapper).getAmountsIn( _amount, path ); require(amounts[0] < assetAmountIn, "ua"); usersBalances[userAddr][market] = userBal.sub(amounts[0]); TransferHelper.safeTransfer( path[0], ISwapper(swapper).GetReceiverAddress(path), amounts[0] ); ISwapper(swapper)._swap(amounts, path, address(this)); } else { // require(_amount <= usersBalances[userAddr][market], "uat"); require(_amount < assetAmountIn, "au"); usersBalances[userAddr][market] = userBal.sub(_amount); } require(targetAddress != address(0), "mis"); uint256 usdcAmount = IConverter(converter) .convertUsdAmountToAssetAmount(usdAmount, USDC); require(_amount >= usdcAmount, "sp"); TransferHelper.safeTransfer(USDC, targetAddress, usdcAmount); uint256 fee = _amount.sub(usdcAmount); if (feeAddress != address(0)) TransferHelper.safeTransfer(USDC, feeAddress, fee); spendAmount = IConverter(converter).convertAssetAmountToUsdAmount( _amount, USDC ); } function cashBack(address userAddr, uint256 usdAmount) internal { if (!ICashBackManager(cashbackManager).cashBackEnable()) return; uint256 cashBackPercent = ICashBackManager(cashbackManager) .getCashBackPercent( ILevelManager(levelManager).getUserLevel(userAddr) ); address OKSE = IMarketManager(marketManager).OKSE(); uint256 okseAmount = IConverter(converter).getAssetAmount( OKSE, (usdAmount.mul(cashBackPercent)).div(10000), priceOracle ); // require(ERC20Interface(OKSE).balanceOf(address(this)) >= okseAmount , "insufficient OKSE"); if (usersBalances[financialAddress][OKSE] > okseAmount) { usersBalances[financialAddress][OKSE] = usersBalances[ financialAddress ][OKSE].sub(okseAmount); //needs extra check that owner deposited how much OKSE for cashBack _addUserBalance(OKSE, userAddr, okseAmount); } } // verified function getUserAssetAmount(address userAddr, address market) public view returns (uint256) { return usersBalances[userAddr][market]; } // verified function encodePackedData(SignData calldata _data) public view returns (bytes32) { uint256 chainId; assembly { chainId := chainid() } return keccak256( abi.encodePacked( this, _data.method, _data.id, _data.userAddr, _data.market, chainId, _data.amount, _data.validTime ) ); } // verified function getecrecover(SignData calldata _data, SignKeys calldata key) public view returns (address) { uint256 chainId; assembly { chainId := chainid() } return ecrecover( toEthSignedMessageHash( keccak256( abi.encodePacked( this, _data.method, _data.id, _data.userAddr, _data.market, chainId, _data.amount, _data.validTime ) ) ), key.v, key.r, key.s ); } // verified function setContractAddress(bytes calldata signData, bytes calldata keys) public validSignOfOwner(signData, keys, "setContractAddress") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); ( address _priceOracle, address _swapper, address _limitManager, address _levelManager, address _marketManager, address _cashbackManager ) = abi.decode( params, (address, address, address, address, address, address) ); priceOracle = _priceOracle; swapper = _swapper; limitManager = _limitManager; levelManager = _levelManager; marketManager = _marketManager; cashbackManager = _cashbackManager; emit ContractAddressChanged( priceOracle, swapper, limitManager, levelManager, marketManager, cashbackManager ); } // owner function function withdrawTokens(bytes calldata signData, bytes calldata keys) public validSignOfOwner(signData, keys, "withdrawTokens") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); (address token, address to) = abi.decode(params, (address, address)); require(!IMarketManager(marketManager).isMarketExist(token), "me"); uint256 amount; if (token == address(0)) { amount = address(this).balance; TransferHelper.safeTransferETH(to, amount); } else { amount = ERC20Interface(token).balanceOf(address(this)); TransferHelper.safeTransfer(token, to, amount); } emit WithdrawTokens(token, to, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_converter","type":"address"},{"internalType":"address","name":"_initialSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"priceOracle","type":"address"},{"indexed":false,"internalType":"address","name":"swapper","type":"address"},{"indexed":false,"internalType":"address","name":"limitManager","type":"address"},{"indexed":false,"internalType":"address","name":"levelManager","type":"address"},{"indexed":false,"internalType":"address","name":"marketManager","type":"address"},{"indexed":false,"internalType":"address","name":"cashbackManager","type":"address"}],"name":"ContractAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"monthlyFeeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"okseMonthlyProfit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawFeePercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyTxFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyFeePercent","type":"uint256"}],"name":"FeeValuesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernor","type":"address"}],"name":"GovernorAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasuryAddress","type":"address"},{"indexed":false,"internalType":"address","name":"financialAddress","type":"address"},{"indexed":false,"internalType":"address","name":"masterAddress","type":"address"},{"indexed":false,"internalType":"address","name":"monthlyFeeAddress","type":"address"}],"name":"ManagerAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"userValidTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdAmount","type":"uint256"}],"name":"MonthlyFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"SignValidTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer1","type":"address"},{"indexed":false,"internalType":"address","name":"signer2","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"usdAmount","type":"uint256"}],"name":"SignerBuyGoods","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stakeContractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakePercent","type":"uint256"}],"name":"StakeContractParamChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddr","type":"address"},{"indexed":true,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserBalanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"beforeMarket","type":"address"}],"name":"UserMainMarketChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remainedBalance","type":"uint256"}],"name":"UserWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawTokens","type":"event"},{"inputs":[],"name":"BUYGOODS","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CARD_VALIDATION_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LEVEL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAY_MONTHLY_FEE","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_USER_MAIN_MARKET","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OkseCard.SignKeys[2]","name":"signer_key","type":"tuple[2]"}],"name":"buyGoods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashbackManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"converter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"encodePackedData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"}],"name":"encodePackedData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"financialAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"payFromOkse","type":"bool"}],"name":"getMonthlyFeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"address","name":"market","type":"address"}],"name":"getUserAssetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddr","type":"address"}],"name":"getUserExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getUserOkseBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OkseCard.SignKeys","name":"key","type":"tuple"}],"name":"getecrecover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_priceOracle","type":"address"},{"internalType":"address","name":"_limitManager","type":"address"},{"internalType":"address","name":"_levelManager","type":"address"},{"internalType":"address","name":"_marketManager","type":"address"},{"internalType":"address","name":"_cashbackManager","type":"address"},{"internalType":"address","name":"_financialAddress","type":"address"},{"internalType":"address","name":"_masterAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_governorAddress","type":"address"},{"internalType":"address","name":"_monthlyFeeAddress","type":"address"},{"internalType":"address","name":"_stakeContractAddress","type":"address"},{"internalType":"address","name":"_swapper","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[3]","name":"_owners","type":"address[3]"}],"name":"initializeOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"levelManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyFeeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyFeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"okseMonthlyProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OkseCard.SignKeys","name":"user_key","type":"tuple"},{"internalType":"address","name":"market","type":"address"}],"name":"payMonthlyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"priceOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setFeeValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernor","type":"address"}],"name":"setGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setManagerAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setStakeContractParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"validTime","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"setUserMainMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signatureId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bool","name":"bAddOrRemove","type":"bool"}],"name":"updateSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userValidTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"usersBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162005e4c38038062005e4c83398101604081905262000034916200016c565b80620000408162000058565b505060601b6001600160601b0319166080526200021c565b6200007381600d620000aa60201b620034a31790919060201c565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b620000b6828262000104565b15620000df5760405162461bcd60e51b8152600401620000d690620001a3565b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200012f5760405162461bcd60e51b8152600401620000d690620001da565b506001600160a01b03166000908152602091909152604090205460ff1690565b80516001600160a01b03811681146200016757600080fd5b919050565b600080604083850312156200017f578182fd5b6200018a836200014f565b91506200019a602084016200014f565b90509250929050565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60805160601c615bf96200025360003980612b4c52806136a352806137eb5280613c385280613d2b52806146195250615bf96000f3fe6080604052600436106102ef5760003560e01c80636ac7bca011610186578063b2b9f0ed116100d7578063d1f21f4f11610085578063d1f21f4f1461085d578063d365a08e1461087d578063d73d8b9014610892578063e9b786cb146108b2578063f460590b146108c7578063f6326fb3146108e7578063f6e71bc8146108ef576102f6565b8063b2b9f0ed146107a9578063bd38837b146107c9578063c42cf535146107de578063c5f956af146107fe578063c8a68c9614610813578063cc3fdd4c14610828578063cefd071b1461083d576102f6565b80637df73e27116101345780637df73e27146106ea57806389c9cbc01461070a5780638a0afa771461071f578063947977a81461073f578063a49062d41461075f578063a89b7ed614610774578063af14944414610794576102f6565b80636ac7bca0146106205780636c3fc891146106405780636e933c74146106605780636f1a65e0146106805780636f9e4f0b1461069557806375e16b17146106b55780637b7b0820146106d5576102f6565b806334a6cdc5116102405780635d70557c116101ee5780635d70557c146105565780635e3260471461056b57806361e3c5231461058b57806362c3c2e5146105ab5780636309daf5146105cb57806368af81e6146105eb57806368d3ae831461060b576102f6565b806334a6cdc5146104975780633d5c2644146104ac57806341ed2c12146104cc578063459a1782146104e157806347e7ef2414610501578063495ef705146105215780634e24127714610536576102f6565b8063272caf691161029d578063272caf69146103df578063276f1c41146103f45780632a54caba146104095780632a8d950c1461042b5780632b3297f9146104405780632f54bf6e1461045557806332c2e8d714610482576102f6565b8063025e7c27146102fb5780630885ad571461033157806308b14011146103535780630b800f481461037357806316ba71971461039357806321f8fba7146103b55780632630c12f146103ca576102f6565b366102f657005b600080fd5b34801561030757600080fd5b5061031b6103163660046150f7565b610904565b60405161032891906153d9565b60405180910390f35b34801561033d57600080fd5b5061035161034c3660046151e4565b61092e565b005b34801561035f57600080fd5b5061035161036e366004615003565b610dce565b34801561037f57600080fd5b5061035161038e366004614be4565b6110dc565b34801561039f57600080fd5b506103a861121d565b6040516103289190615578565b3480156103c157600080fd5b5061031b611228565b3480156103d657600080fd5b5061031b611237565b3480156103eb57600080fd5b5061031b611246565b34801561040057600080fd5b5061031b611255565b34801561041557600080fd5b5061041e611264565b6040516103289190615551565b34801561043757600080fd5b5061031b61126a565b34801561044c57600080fd5b5061031b611279565b34801561046157600080fd5b50610475610470366004614a35565b611288565b6040516103289190615546565b34801561048e57600080fd5b506103a86112df565b3480156104a357600080fd5b5061041e6112ea565b3480156104b857600080fd5b5061041e6104c7366004614a35565b6112f0565b3480156104d857600080fd5b5061031b6113a1565b3480156104ed57600080fd5b506103516104fc366004615003565b6113b0565b34801561050d57600080fd5b5061035161051c366004614cf8565b6115f1565b34801561052d57600080fd5b5061041e6117ab565b34801561054257600080fd5b5061041e610551366004614ec8565b6117b1565b34801561056257600080fd5b5061031b6117f5565b34801561057757600080fd5b50610351610586366004615086565b611804565b34801561059757600080fd5b5061041e6105a6366004614bb7565b611da7565b3480156105b757600080fd5b506104756105c6366004614a35565b611dd2565b3480156105d757600080fd5b5061041e6105e6366004614a35565b611e25565b3480156105f757600080fd5b5061041e610606366004614fc4565b611e37565b34801561061757600080fd5b5061041e611e72565b34801561062c57600080fd5b5061035161063b366004615003565b611e78565b34801561064c57600080fd5b5061035161065b366004615003565b6120d5565b34801561066c57600080fd5b5061041e61067b36600461506b565b61241f565b34801561068c57600080fd5b5061041e612495565b3480156106a157600080fd5b506103516106b0366004614d23565b61249c565b3480156106c157600080fd5b5061031b6106d0366004615003565b612554565b3480156106e157600080fd5b5061031b6125fe565b3480156106f657600080fd5b50610475610705366004614a35565b61260d565b34801561071657600080fd5b5061031b61261a565b34801561072b57600080fd5b5061035161073a36600461518b565b612629565b34801561074b57600080fd5b5061035161075a366004615003565b612867565b34801561076b57600080fd5b5061041e612a5f565b34801561078057600080fd5b5061031b61078f3660046150c2565b612a64565b3480156107a057600080fd5b506103a8612b2a565b3480156107b557600080fd5b506104756107c43660046150f7565b612b35565b3480156107d557600080fd5b5061031b612b4a565b3480156107ea57600080fd5b506103516107f9366004614a35565b612b6e565b34801561080a57600080fd5b5061031b612bfa565b34801561081f57600080fd5b5061041e612c0e565b34801561083457600080fd5b5061041e612c14565b34801561084957600080fd5b5061041e610858366004614bb7565b612c1a565b34801561086957600080fd5b50610351610878366004615003565b612c37565b34801561088957600080fd5b5061031b612e96565b34801561089e57600080fd5b506103516108ad366004615127565b612ea5565b3480156108be57600080fd5b5061041e613253565b3480156108d357600080fd5b506103516108e2366004614ccb565b613259565b6103516132b4565b3480156108fb57600080fd5b506103a8613498565b6000818154811061091457600080fd5b6000918252602090912001546001600160a01b0316905081565b6002601754141561095a5760405162461bcd60e51b81526004016109519061592e565b60405180910390fd5b60026017556012546040516301c6e7ff60e11b815282916001600160a01b03169063038dcffe9061098f9084906004016153d9565b60206040518083038186803b1580156109a757600080fd5b505afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190614ee4565b6109fb5760405162461bcd60e51b8152600401610951906157ae565b601260009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610a4957600080fd5b505afa158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a819190614ee4565b15610a9e5760405162461bcd60e51b81526004016109519061598c565b8383610aaa8282612a64565b6001600160a01b0316610ac36080840160608501614a35565b6001600160a01b031614610ae95760405162461bcd60e51b81526004016109519061573b565b610af46107056134ef565b610b105760405162461bcd60e51b8152600401610951906158de565b6000610b226080880160608901614a35565b6001600160a01b038116600090815260166020526040902054909150421015610b5d5760405162461bcd60e51b8152600401610951906158a6565b8660800135600a541115610b835760405162461bcd60e51b815260040161095190615613565b60008881526001602052604090205460ff16158015610bbe57506314a6a35b60e21b610bb26020890189614f00565b6001600160e01b031916145b610bda5760405162461bcd60e51b8152600401610951906158c1565b6000888152600160208181526040808420805460ff1916909317909255601254825163dffda16360e01b81529251610c8a936001600160a01b039092169263dffda1639260048082019391829003018186803b158015610c3957600080fd5b505afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190614a51565b6001600160a01b0316876001600160a01b0316146117b1565b905080610c9a4262278d006134f3565b6001600160a01b038085166000908152601660205260409020919091556006541615610ce857600754610ce590610cd3906127106134f3565b610cdf8461271061353c565b90613576565b90505b6001600160a01b0380841660009081526015602090815260408083208b851684529091529020546005546006546007549293610d30938c9389938893918216929116906135b8565b506001600160a01b038085166000908152601560209081526040808320938c1683529290522054610d659085908a9084613dc3565b506001600160a01b038416600090815260166020526040908190205490517f36468bb69cf35301290533742acb0f5890fc576141b4884532cf11f7b29c240a91610db4918e9188918890615acd565b60405180910390a150506001601755505050505050505050565b838383836040518060400160405280600e81526020016d7769746864726177546f6b656e7360901b815250610e0233611288565b610e1e5760405162461bcd60e51b8152600401610951906156e2565b6000610e2c86868686612554565b90506001600160a01b0381163314801590610e4b5750610e4b81611288565b8015610e5f57506001600160a01b03811615155b610e7b5760405162461bcd60e51b815260040161095190615792565b60008080610e8b888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015610ec55750845160208601206001600160e01b03198481169116145b610ee15760405162461bcd60e51b8152600401610951906159d3565b428111610f005760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055610f278d8f018f614f1a565b935050505060008082806020019051810190610f439190614a6d565b60125460405163c037934760e01b81529294509092506001600160a01b03169063c037934790610f779085906004016153d9565b60206040518083038186803b158015610f8f57600080fd5b505afa158015610fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc79190614ee4565b15610fe45760405162461bcd60e51b815260040161095190615759565b60006001600160a01b0383166110055750476110008282613f43565b61108e565b6040516370a0823160e01b81526001600160a01b038416906370a08231906110319030906004016153d9565b60206040518083038186803b15801561104957600080fd5b505afa15801561105d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611081919061510f565b905061108e838383613fd5565b7f70082d08c003c5341f2401bec1c2ae1dbcdc29ae17e9cc5633fa617caa8acd4c8383836040516110c1939291906153ed565b60405180910390a15050505050505050505050505050505050565b60185460ff16156110ff5760405162461bcd60e51b81526004016109519061594a565b600f80546001600160a01b03199081166001600160a01b039e8f16179091556010805482169c8e169c909c17909b55601180548c169a8d169a909a17909955601280548b16988c1698909817909755601380548a16968b169690961790955560028054610100600160a81b031916610100938b16939093029290921790915560038054881693891693909317909255600480548716918816919091179055601480548616918716919091179055600580548516918616919091179055600680548416918516919091179055600e80549092169216919091179055600160178190556106bd60075560fa6008556709b6e64a8ec60000600c55600060095567610177f723fb0000600a556103e8600b556018805460ff19169091179055565b632155447360e21b81565b6013546001600160a01b031681565b600f546001600160a01b031681565b6006546001600160a01b031681565b6014546001600160a01b031681565b6101f481565b6011546001600160a01b031681565b600e546001600160a01b031681565b600080805b6000548110156112d657836001600160a01b0316600082815481106112ae57fe5b6000918252602090912001546001600160a01b031614156112ce57600191505b60010161128d565b5090505b919050565b6325110a1760e11b81565b60075481565b6001600160a01b038082166000908152601560209081526040808320601254825163dffda16360e01b81529251949591948694919092169263dffda1639260048083019392829003018186803b15801561134957600080fd5b505afa15801561135d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113819190614a51565b6001600160a01b0316815260208101919091526040016000205492915050565b6012546001600160a01b031681565b83838383604051806040016040528060138152602001727365744d616e6167657241646472657373657360681b8152506113e933611288565b6114055760405162461bcd60e51b8152600401610951906156e2565b600061141386868686612554565b90506001600160a01b0381163314801590611432575061143281611288565b801561144657506001600160a01b03811615155b6114625760405162461bcd60e51b815260040161095190615792565b60008080611472888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156114ac5750845160208601206001600160e01b03198481169116145b6114c85760405162461bcd60e51b8152600401610951906159d3565b4281116114e75760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff1916909117905561150e8d8f018f614f1a565b93505050506000806000808480602001905181019061152d9190614aa6565b60028054610100600160a81b0319166101006001600160a01b0387811682029290921792839055600380546001600160a01b031990811688851617918290556004805482168886161790819055600580549092168786161791829055604051999d50979b509599509397507f471bd784db5079421761b0728e4d7bd73efe27958f0bc3452bada7799f0d3457966115d59691909304821694938216939082169291169061542b565b60405180910390a1505050505050505050505050505050505050565b6012546040516301c6e7ff60e11b815283916001600160a01b03169063038dcffe906116219084906004016153d9565b60206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116719190614ee4565b61168d5760405162461bcd60e51b8152600401610951906157ae565b600260175414156116b05760405162461bcd60e51b81526004016109519061592e565b6002601755601254604080516318e9666960e21b815290516001600160a01b03909216916363a599a491600480820192602092909190829003018186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190614ee4565b1561174f5760405162461bcd60e51b81526004016109519061598c565b61175b833330856140ca565b6117668333846141c2565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a16689582338484604051611799939291906153ed565b60405180910390a15050600160175550565b60095481565b60008082156117ea576117e36117da612710610cdf600b54600a5461353c90919063ffffffff16565b600a54906142c4565b90506117ef565b50600a545b92915050565b6005546001600160a01b031681565b600260175414156118275760405162461bcd60e51b81526004016109519061592e565b600260175561183c6060830160408401614a35565b6012546040516301c6e7ff60e11b81526001600160a01b039091169063038dcffe9061186c9084906004016153d9565b60206040518083038186803b15801561188457600080fd5b505afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190614ee4565b6118d85760405162461bcd60e51b8152600401610951906157ae565b6118e86080840160608501614a35565b6118f181611dd2565b1561190e5760405162461bcd60e51b815260040161095190615966565b601260009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561195c57600080fd5b505afa158015611970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119949190614ee4565b156119b15760405162461bcd60e51b81526004016109519061598c565b600060405180604001604052806119d887876000600281106119cf57fe5b60600201612a64565b6001600160a01b031681526020016119f2878760016119cf565b6001600160a01b031690529050611a108160005b602002015161260d565b8015611a225750611a22816001611a06565b8015611a405750602081015181516001600160a01b03908116911614155b611a5c5760405162461bcd60e51b815260040161095190615792565b60208086013560009081526001909152604090205460ff16158015611a9d575063547e8cf960e11b611a916020870187614f00565b6001600160e01b031916145b611ab95760405162461bcd60e51b8152600401610951906158c1565b60208086013560009081526001808352604091829020805460ff19169091179055601254815163dffda16360e01b815291516001600160a01b039091169263dffda1639260048082019391829003018186803b158015611b1857600080fd5b505afa158015611b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b509190614a51565b6001600160a01b0316611b696060870160408801614a35565b6001600160a01b03161415611c1a57601260009054906101000a90046001600160a01b03166001600160a01b0316638aa7ba676040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfe9190614ee4565b611c1a5760405162461bcd60e51b815260040161095190615775565b611c2a6060860160408701614a35565b6012546001600160a01b03918216911663be2ec3bc611c4f6080890160608a01614a35565b6040518263ffffffff1660e01b8152600401611c6b91906153d9565b60206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbb9190614a51565b6001600160a01b031614611ce15760405162461bcd60e51b8152600401610951906157e8565b6000611d10611cf66060880160408901614a35565b611d066080890160608a01614a35565b8860800135614306565b9050611d2b611d256080880160608901614a35565b826143f7565b81516020838101517f68c88f2d1b180ac31c1b89c8a25db195d669e6d352368be8ae4bb1ade1e7f64792918901359190611d6b60608b0160408c01614a35565b611d7b60808c0160608d01614a35565b8b60800135604051611d9296959493929190615a68565b60405180910390a15050600160175550505050565b6001600160a01b03918216600090815260156020908152604080832093909416825291909152205490565b6000600a5460001415611de7575060006112da565b6001600160a01b0382166000908152601660205260409020544290611e0f906220f5806134f3565b1115611e1d575060006112da565b506001919050565b60166020526000908152604090205481565b6040516000904690611e53903090839087908790602001615315565b6040516020818303038152906040528051906020012091505092915050565b600b5481565b838383836040518060400160405280600c81526020016b73657446656556616c75657360a01b815250611eaa33611288565b611ec65760405162461bcd60e51b8152600401610951906156e2565b6000611ed486868686612554565b90506001600160a01b0381163314801590611ef35750611ef381611288565b8015611f0757506001600160a01b03811615155b611f235760405162461bcd60e51b815260040161095190615792565b60008080611f33888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015611f6d5750845160208601206001600160e01b03198481169116145b611f895760405162461bcd60e51b8152600401610951906159d3565b428111611fa85760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055611fcf8d8f018f614f1a565b9350505050600080600080600085806020019051810190611ff0919061522b565b9450945094509450945061271084111561201c5760405162461bcd60e51b8152600401610951906159ad565b6101f483111561203e5760405162461bcd60e51b81526004016109519061568c565b600a859055600b84905560098390556101f482111561206f5760405162461bcd60e51b81526004016109519061566f565b6008829055600c819055600a54600b546009546040517fba5e401ce259802da9c7838f9696cd1079b2eb2a0ea245e551c978b5d33069c9936120b8939092909186908890615b0a565b60405180910390a150505050505050505050505050505050505050565b8383838360405180604001604052806012815260200171736574436f6e74726163744164647265737360701b81525061210d33611288565b6121295760405162461bcd60e51b8152600401610951906156e2565b600061213786868686612554565b90506001600160a01b0381163314801590612156575061215681611288565b801561216a57506001600160a01b03811615155b6121865760405162461bcd60e51b815260040161095190615792565b60008080612196888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156121d05750845160208601206001600160e01b03198481169116145b6121ec5760405162461bcd60e51b8152600401610951906159d3565b42811161220b5760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff191690911790556122328d8f018f614f1a565b9350505050600080600080600080868060200190518101906122549190614b04565b95509550955095509550955085600f60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084600e60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083601060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082601160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081601260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080601360006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f4366821234a42b582d7d66472fd7d6d5a4d783381ba060215a83e1c3ce0c6db8600f60009054906101000a90046001600160a01b0316600e60009054906101000a90046001600160a01b0316601060009054906101000a90046001600160a01b0316601160009054906101000a90046001600160a01b0316601260009054906101000a90046001600160a01b0316601360009054906101000a90046001600160a01b031660405161240196959493929190615456565b60405180910390a15050505050505050505050505050505050505050565b600046306124306020850185614f00565b60208501356124456080870160608801614a35565b6124556060880160408901614a35565b8588608001358960a00135604051602001612477989796959493929190615348565b60405160208183030381529060405280519060200120915050919050565b62278d0081565b60025460ff161580156124b8575080516001600160a01b031615155b80156124d0575060208101516001600160a01b031615155b80156124e8575060408101516001600160a01b031615155b6125045760405162461bcd60e51b81526004016109519061594a565b6040805160608101825282516001600160a01b039081168252602080850151821690830152838301511691810191909152612543906000906003614919565b50506002805460ff19166001179055565b60004681808061256686880188615284565b92509250925060016125a330868c8c6040516020016125889493929190615315565b60405160208183030381529060405280519060200120614768565b848484604051600081526020016040526040516125c3949392919061555a565b6020604051602081039080840390855afa1580156125e5573d6000803e3d6000fd5b505050602060405103519450505050505b949350505050565b6010546001600160a01b031681565b60006117ef600d83614798565b6003546001600160a01b031681565b600033905060004690506126b3600161266230634a22142e60e01b8c878d8860008f604051602001612588989796959493929190615348565b87878760405160008152602001604052604051612682949392919061555a565b6020604051602081039080840390855afa1580156126a4573d6000803e3d6000fd5b5050506020604051035161260d565b6126cf5760405162461bcd60e51b8152600401610951906159f0565b60008881526001602052604090205460ff16156126fe5760405162461bcd60e51b8152600401610951906158c1565b6000888152600160208190526040909120805460ff191690911790554286116127395760405162461bcd60e51b8152600401610951906156fe565b601254604051632f8bb0ef60e21b81526000916001600160a01b03169063be2ec3bc9061276a9086906004016153d9565b60206040518083038186803b15801561278257600080fd5b505afa158015612796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ba9190614a51565b60125460405163e8b624ad60e01b81529192506001600160a01b03169063e8b624ad906127ed9086908c90600401615411565b600060405180830381600087803b15801561280757600080fd5b505af115801561281b573d6000803e3d6000fd5b505050507f6d41219ad121d8734cd4bf7d276c6e3ef10c1a9b4e0e2245dd02ec458599cdb789848a846040516128549493929190615a41565b60405180910390a1505050505050505050565b83838383604051806040016040528060168152602001757365745374616b65436f6e7472616374506172616d7360501b8152506128a333611288565b6128bf5760405162461bcd60e51b8152600401610951906156e2565b60006128cd86868686612554565b90506001600160a01b03811633148015906128ec57506128ec81611288565b801561290057506001600160a01b03811615155b61291c5760405162461bcd60e51b815260040161095190615792565b6000808061292c888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156129665750845160208601206001600160e01b03198481169116145b6129825760405162461bcd60e51b8152600401610951906159d3565b4281116129a15760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff191690911790556129c88d8f018f614f1a565b9350505050600080828060200190518101906129e49190614b8a565b600680546001600160a01b0319166001600160a01b03848116919091179182905560078390556040519395509193507f81e80fe065ce07af29c0ce5b1c050c0a153937cfc80aade3416745b8d15a24e292612a459291909116908490615490565b60405180910390a150505050505050505050505050505050565b600581565b6000466001612ac130612a7a6020880188614f00565b6020880135612a8f60808a0160608b01614a35565b612a9f60608b0160408c01614a35565b878b608001358c60a00135604051602001612588989796959493929190615348565b612ace602086018661526a565b8560200135866040013560405160008152602001604052604051612af5949392919061555a565b6020604051602081039080840390855afa158015612b17573d6000803e3d6000fd5b5050604051601f19015195945050505050565b63547e8cf960e11b81565b60016020526000908152604090205460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6014546001600160a01b0316612b826134ef565b6001600160a01b031614612ba85760405162461bcd60e51b815260040161095190615a0e565b601480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f92caf80b3b287e058d945a90272035dd5f5eb1fee321aced853a991d9ab315ad90600090a35050565b60025461010090046001600160a01b031681565b600a5481565b60085481565b601560209081526000928352604080842090915290825290205481565b838383836040518060400160405280601181526020017007472616e736665724f776e65727368697607c1b815250612c6e33611288565b612c8a5760405162461bcd60e51b8152600401610951906156e2565b6000612c9886868686612554565b90506001600160a01b0381163314801590612cb75750612cb781611288565b8015612ccb57506001600160a01b03811615155b612ce75760405162461bcd60e51b815260040161095190615792565b60008080612cf7888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015612d315750845160208601206001600160e01b03198481169116145b612d4d5760405162461bcd60e51b8152600401610951906159d3565b428111612d6c5760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055612d938d8f018f614f1a565b9350505050600081806020019051810190612dae9190614a51565b90506000805b600054811015612dfc57336001600160a01b031660008281548110612dd557fe5b6000918252602090912001546001600160a01b03161415612df4578091505b600101612db4565b506000808281548110612e0b57fe5b600091825260208220015481546001600160a01b03909116925084919084908110612e3257fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051858316928416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050505050505050505050505050505050565b6004546001600160a01b031681565b60026017541415612ec85760405162461bcd60e51b81526004016109519061592e565b600260178190555060003390506000469050612f0860016126623063855511cc60e01b8d878e888f8f604051602001612588989796959493929190615348565b612f245760405162461bcd60e51b81526004016109519061573b565b60008981526001602052604090205460ff1615612f535760405162461bcd60e51b8152600401610951906158c1565b6000898152600160208190526040909120805460ff19169091179055428611612f8e5760405162461bcd60e51b8152600401610951906156fe565b6001600160a01b038083166000908152601560209081526040808320938c1683529290522054612fbe81896142c4565b6001600160a01b0380851660009081526015602090815260408083208e8516845282528083209490945560125484516315ab88c960e31b81529451929493169263ad5c46489260048083019392829003018186803b15801561301f57600080fd5b505afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190614a51565b9050806001600160a01b03168a6001600160a01b0316141561315157604051632e1a7d4d60e01b81526001600160a01b03821690632e1a7d4d9061309f908c90600401615551565b600060405180830381600087803b1580156130b957600080fd5b505af11580156130cd573d6000803e3d6000fd5b505060025461010090046001600160a01b03161591506131429050576000613106612710610cdf6009548d61353c90919063ffffffff16565b90508015613129576002546131299061010090046001600160a01b031682613f43565b61313c336131378c846142c4565b613f43565b5061314c565b61314c338a613f43565b6131ce565b60025461010090046001600160a01b0316156131c3576000613184612710610cdf6009548d61353c90919063ffffffff16565b905080156131a9576002546131a9908c9061010090046001600160a01b031683613fd5565b6131bd8b336131b88d856142c4565b613fd5565b506131ce565b6131ce8a338b613fd5565b6001600160a01b038085166000908152601560209081526040808320938e1683529290522054613200858c8386613dc3565b507f43b573ac1c738f28df57dc3e1fea317d5c9d932501be02f3f096f617e3e5c5d78c868d8d85604051613238959493929190615a9e565b60405180910390a15050600160175550505050505050505050565b600c5481565b6014546001600160a01b031661326d6134ef565b6001600160a01b0316146132935760405162461bcd60e51b815260040161095190615a0e565b80156132a7576132a2826147e0565b6132b0565b6132b082614822565b5050565b600260175414156132d75760405162461bcd60e51b81526004016109519061592e565b6002601755601254604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561332157600080fd5b505afa158015613335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133599190614a51565b6012546040516301c6e7ff60e11b81529192506001600160a01b03169063038dcffe9061338a9084906004016153d9565b60206040518083038186803b1580156133a257600080fd5b505afa1580156133b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133da9190614ee4565b6133f65760405162461bcd60e51b815260040161095190615759565b806001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561343157600080fd5b505af1158015613445573d6000803e3d6000fd5b50505050506134558133346141c2565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a16689582338234604051613488939291906153ed565b60405180910390a1506001601755565b6314a6a35b60e21b81565b6134ad8282614798565b156134ca5760405162461bcd60e51b8152600401610951906155dc565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3390565b600061353583836040518060400160405280601b81526020017f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815250614864565b9392505050565b60008261354b575060006117ef565b8282028284828161355857fe5b04146135355760405162461bcd60e51b815260040161095190615806565b600061353583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614894565b6000806000601260009054906101000a90046001600160a01b03166001600160a01b03166389a302716040518163ffffffff1660e01b815260040160206040518083038186803b15801561360b57600080fd5b505afa15801561361f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136439190614a51565b90506001600160a01b0385161561368257600c5461367b9061367561366e612710610cdf8c8a61353c565b8a906134f3565b906134f3565b9150613686565b8691505b600f54604051631228942160e21b81526000916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926348a25084926136df928f928992909116906004016154a9565b60206040518083038186803b1580156136f757600080fd5b505afa15801561370b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372f919061510f565b90506137d16137ca612710610cdf601260009054906101000a90046001600160a01b03166001600160a01b0316633e032a3b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561378b57600080fd5b505afa15801561379f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c3919061510f565b859061353c565b82906134f3565b604051634da431e960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b4863d2906138229086908690600401615a2a565b60206040518083038186803b15801561383a57600080fd5b505afa15801561384e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613872919061510f565b6001600160a01b03808b1660009081526015602090815260408083208f851680855292529091205492955090841614613b8257600e5460405163361b48eb60e11b81526000916001600160a01b031690636c3691d6906138d8908f908890600401615411565b60006040518083038186803b1580156138f057600080fd5b505afa158015613904573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261392c9190810190614da8565b600e546040516307c0329d60e21b81529192506000916001600160a01b0390911690631f00ca74906139649089908690600401615af1565b60006040518083038186803b15801561397c57600080fd5b505afa158015613990573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526139b89190810190614e45565b905083816000815181106139c857fe5b6020026020010151106139ed5760405162461bcd60e51b815260040161095190615636565b613a14816000815181106139fd57fe5b6020026020010151846142c490919063ffffffff16565b601560008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002081905550613b1582600081518110613a7057fe5b6020908102919091010151600e54604051630137e32360e31b81526001600160a01b03909116906309bf191890613aab9087906004016154cc565b60206040518083038186803b158015613ac357600080fd5b505afa158015613ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613afb9190614a51565b83600081518110613b0857fe5b6020026020010151613fd5565b600e5460405163f5901d4d60e01b81526001600160a01b039091169063f5901d4d90613b49908490869030906004016154df565b600060405180830381600087803b158015613b6357600080fd5b505af1158015613b77573d6000803e3d6000fd5b505050505050613bf8565b818410613ba15760405162461bcd60e51b8152600401610951906155c0565b613bab81856142c4565b601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055505b6001600160a01b038816613c1e5760405162461bcd60e51b815260040161095190615652565b604051634da431e960e11b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b4863d290613c6f908d908890600401615a2a565b60206040518083038186803b158015613c8757600080fd5b505afa158015613c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cbf919061510f565b905080851015613ce15760405162461bcd60e51b8152600401610951906156c6565b613cec848a83613fd5565b6000613cf886836142c4565b90506001600160a01b03891615613d1457613d14858a83613fd5565b60405163791f99a560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791f99a590613d629089908990600401615a2a565b60206040518083038186803b158015613d7a57600080fd5b505afa158015613d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db2919061510f565b9d9c50505050505050505050505050565b6000836001600160a01b0316856001600160a01b03167f47006484f2df633ac2a5063887c3edaae5a0a3cdf585767bc494e1a3180e5d6f85604051613e089190615551565b60405180910390a3601260009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b158015613e5e57600080fd5b505afa158015613e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e969190614a51565b6001600160a01b0316846001600160a01b031614613eb6575060016125f6565b60115460405163256a3ccb60e11b81526001600160a01b0390911690634ad4799690613ee89088908690600401615490565b602060405180830381600087803b158015613f0257600080fd5b505af1158015613f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3a9190614ee4565b95945050505050565b604080516000808252602082019092526001600160a01b038416908390604051613f6d91906152f9565b60006040518083038185875af1925050503d8060008114613faa576040519150601f19603f3d011682016040523d82523d6000602084013e613faf565b606091505b5050905080613fd05760405162461bcd60e51b8152600401610951906156a9565b505050565b600080846001600160a01b031663a9059cbb60e01b8585604051602401613ffd929190615490565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161403b91906152f9565b6000604051808303816000865af19150503d8060008114614078576040519150601f19603f3d011682016040523d82523d6000602084013e61407d565b606091505b50915091508180156140a75750805115806140a75750808060200190518101906140a79190614ee4565b6140c35760405162461bcd60e51b8152600401610951906157cc565b5050505050565b600080856001600160a01b03166323b872dd60e01b8686866040516024016140f4939291906153ed565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161413291906152f9565b6000604051808303816000865af19150503d806000811461416f576040519150601f19603f3d011682016040523d82523d6000602084013e614174565b606091505b509150915081801561419e57508051158061419e57508080602001905181019061419e9190614ee4565b6141ba5760405162461bcd60e51b815260040161095190615889565b505050505050565b6012546040516301c6e7ff60e11b815284916001600160a01b03169063038dcffe906141f29084906004016153d9565b60206040518083038186803b15801561420a57600080fd5b505afa15801561421e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142429190614ee4565b61425e5760405162461bcd60e51b8152600401610951906157ae565b6001600160a01b0383811660009081526015602090815260408083209388168352929052205461428e81846134f3565b6001600160a01b038581166000908152601560209081526040808320938a168352929052208190556141ba908590879084613dc3565b600061353583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506148cb565b6001600160a01b038083166000908152601560209081526040808320878516845290915281205460045460025460085493949293614355938993899389939183169261010090910416906135b8565b6010546040516339ec2d6360e21b81529193506001600160a01b03169063e7b0b58c906143889087908790600401615490565b600060405180830381600087803b1580156143a257600080fd5b505af11580156143b6573d6000803e3d6000fd5b5050506001600160a01b038086166000908152601560209081526040808320938a16835292905220546143ee91508590879084613dc3565b50509392505050565b601360009054906101000a90046001600160a01b03166001600160a01b031663f130af696040518163ffffffff1660e01b815260040160206040518083038186803b15801561444557600080fd5b505afa158015614459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061447d9190614ee4565b614486576132b0565b6013546011546040516310c91def60e11b81526000926001600160a01b03908116926318d885c2929116906321923bde906144c59088906004016153d9565b60206040518083038186803b1580156144dd57600080fd5b505afa1580156144f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614515919061510f565b6040518263ffffffff1660e01b81526004016145319190615551565b60206040518083038186803b15801561454957600080fd5b505afa15801561455d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614581919061510f565b90506000601260009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b1580156145d357600080fd5b505afa1580156145e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061460b9190614a51565b905060006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166348a250848361464f612710610cdf898961353c565b600f546040516001600160e01b031960e086901b16815261467e9392916001600160a01b0316906004016154a9565b60206040518083038186803b15801561469657600080fd5b505afa1580156146aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146ce919061510f565b6003546001600160a01b039081166000908152601560209081526040808320938716835292905220549091508110156140c3576003546001600160a01b0390811660009081526015602090815260408083209386168352929052205461473490826142c4565b6003546001600160a01b039081166000908152601560209081526040808320938716835292905220556140c38286836141c2565b60008160405160200161477b91906153a8565b604051602081830303815290604052805190602001209050919050565b60006001600160a01b0382166147c05760405162461bcd60e51b815260040161095190615847565b506001600160a01b03166000908152602091909152604090205460ff1690565b6147eb600d826134a3565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b61482d600d826148f7565b6040516001600160a01b038216907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a250565b6000838301828582101561488b5760405162461bcd60e51b8152600401610951919061558d565b50949350505050565b600081836148b55760405162461bcd60e51b8152600401610951919061558d565b5060008385816148c157fe5b0495945050505050565b600081848411156148ef5760405162461bcd60e51b8152600401610951919061558d565b505050900390565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b82805482825590600052602060002090810192821561496e579160200282015b8281111561496e57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614939565b5061497a92915061497e565b5090565b5b8082111561497a576000815560010161497f565b80356112da81615b9d565b80356001600160e01b0319811681146112da57600080fd5b60008083601f8401126149c7578182fd5b5081356001600160401b038111156149dd578182fd5b6020830191508360208285010111156149f557600080fd5b9250929050565b600060c08284031215614a0d578081fd5b50919050565b600060608284031215614a0d578081fd5b803560ff811681146112da57600080fd5b600060208284031215614a46578081fd5b813561353581615b9d565b600060208284031215614a62578081fd5b815161353581615b9d565b60008060408385031215614a7f578081fd5b8251614a8a81615b9d565b6020840151909250614a9b81615b9d565b809150509250929050565b60008060008060808587031215614abb578182fd5b8451614ac681615b9d565b6020860151909450614ad781615b9d565b6040860151909350614ae881615b9d565b6060860151909250614af981615b9d565b939692955090935050565b60008060008060008060c08789031215614b1c578384fd5b8651614b2781615b9d565b6020880151909650614b3881615b9d565b6040880151909550614b4981615b9d565b6060880151909450614b5a81615b9d565b6080880151909350614b6b81615b9d565b60a0880151909250614b7c81615b9d565b809150509295509295509295565b60008060408385031215614b9c578182fd5b8251614ba781615b9d565b6020939093015192949293505050565b60008060408385031215614bc9578182fd5b8235614bd481615b9d565b91506020830135614a9b81615b9d565b6000806000806000806000806000806000806101808d8f031215614c0657898afd5b8c35614c1181615b9d565b9b5060208d0135614c2181615b9d565b9a5060408d0135614c3181615b9d565b995060608d0135614c4181615b9d565b985060808d0135614c5181615b9d565b975060a08d0135614c6181615b9d565b9650614c6f60c08e01614993565b9550614c7d60e08e01614993565b9450614c8c6101008e01614993565b9350614c9b6101208e01614993565b9250614caa6101408e01614993565b9150614cb96101608e01614993565b90509295989b509295989b509295989b565b60008060408385031215614cdd578182fd5b8235614ce881615b9d565b91506020830135614a9b81615bb5565b60008060408385031215614d0a578182fd5b8235614d1581615b9d565b946020939093013593505050565b600060608284031215614d34578081fd5b82601f830112614d42578081fd5b604051606081018181106001600160401b0382111715614d5e57fe5b604052808360608101861015614d72578384fd5b835b6003811015614d9d578135614d8881615b9d565b83526020928301929190910190600101614d74565b509195945050505050565b60006020808385031215614dba578182fd5b82516001600160401b03811115614dcf578283fd5b8301601f81018513614ddf578283fd5b8051614df2614ded82615b50565b615b2d565b8181528381019083850185840285018601891015614e0e578687fd5b8694505b83851015614e39578051614e2581615b9d565b835260019490940193918501918501614e12565b50979650505050505050565b60006020808385031215614e57578182fd5b82516001600160401b03811115614e6c578283fd5b8301601f81018513614e7c578283fd5b8051614e8a614ded82615b50565b8181528381019083850185840285018601891015614ea6578687fd5b8694505b83851015614e39578051835260019490940193918501918501614eaa565b600060208284031215614ed9578081fd5b813561353581615bb5565b600060208284031215614ef5578081fd5b815161353581615bb5565b600060208284031215614f11578081fd5b6135358261499e565b60008060008060808587031215614f2f578182fd5b614f388561499e565b935060208086013593506040860135925060608601356001600160401b0380821115614f62578384fd5b818801915088601f830112614f75578384fd5b813581811115614f8157fe5b614f93601f8201601f19168501615b2d565b91508082528984828501011115614fa8578485fd5b8084840185840137810190920192909252939692955090935050565b60008060208385031215614fd6578182fd5b82356001600160401b03811115614feb578283fd5b614ff7858286016149b6565b90969095509350505050565b60008060008060408587031215615018578182fd5b84356001600160401b038082111561502e578384fd5b61503a888389016149b6565b90965094506020870135915080821115615052578384fd5b5061505f878288016149b6565b95989497509550505050565b600060c0828403121561507c578081fd5b61353583836149fc565b60008061018080848603121561509a578283fd5b6150a485856149fc565b92508481850111156150b4578182fd5b5060c0830190509250929050565b60008061012083850312156150d5578182fd5b6150df84846149fc565b91506150ee8460c08501614a13565b90509250929050565b600060208284031215615108578081fd5b5035919050565b600060208284031215615120578081fd5b5051919050565b600080600080600080600060e0888a031215615141578081fd5b87359650602088013561515381615b9d565b9550604088013594506060880135935061516f60808901614a24565b925060a0880135915060c0880135905092959891949750929550565b60008060008060008060c087890312156151a3578384fd5b8635955060208701356151b581615b9d565b9450604087013593506151ca60608801614a24565b92506080870135915060a087013590509295509295509295565b60008060008061016085870312156151fa578182fd5b8435935061520b86602087016149fc565b925061521a8660e08701614a13565b9150610140850135614af981615b9d565b600080600080600060a08688031215615242578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b60006020828403121561527b578081fd5b61353582614a24565b600080600060608486031215615298578081fd5b6152a184614a24565b95602085013595506040909401359392505050565b6000815180845260208085019450808401835b838110156152ee5781516001600160a01b0316875295820195908201906001016152c9565b509495945050505050565b6000825161530b818460208701615b6d565b9190910192915050565b60006bffffffffffffffffffffffff198660601b1682528460148301528284603484013791016034019081529392505050565b6bffffffffffffffffffffffff196060998a1b811682526001600160e01b0319989098166014820152601881019690965293871b8616603886015291861b909416604c84015293820192909252608081019290925260a082015260c00190565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03948516815292841660208401529083166040830152909116606082015260800190565b6001600160a01b0396871681529486166020860152928516604085015290841660608401528316608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60006020825261353560208301846152b6565b606080825284519082018190526000906020906080840190828801845b82811015615518578151845292840192908401906001016154fc565b5050508381038285015261552c81876152b6565b9250505060018060a01b0383166040830152949350505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526155ac816040850160208701615b6d565b601f01601f19169190910160400192915050565b602080825260029082015261617560f01b604082015260600190565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b6020808252600990820152681bdd995c881c185a5960ba1b604082015260600190565b602080825260029082015261756160f01b604082015260600190565b6020808252600390820152626d697360e81b604082015260600190565b6020808252600390820152626d706f60e81b604082015260600190565b6020808252600390820152626d666f60e81b604082015260600190565b60208082526003908201526253544560e81b604082015260600190565b602080825260029082015261073760f41b604082015260600190565b60208082526002908201526137b760f11b604082015260600190565b602080825260079082015266195e1c1a5c995960ca1b604082015260600190565b602080825260029082015261065760f41b604082015260600190565b6020808252600490820152631cdcdcdd60e21b604082015260600190565b6020808252600290820152616d6560f01b604082015260600190565b6020808252600390820152626a737960e81b604082015260600190565b602080825260029082015261697360f01b604082015260600190565b6020808252600490820152631b591b9960e21b604082015260600190565b60208082526002908201526114d560f21b604082015260600190565b6020808252600490820152633539bc9960e11b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526003908201526229aa2360e91b604082015260600190565b6020808252600190820152606560f81b604082015260600190565b60208082526003908201526270727560e81b604082015260600190565b60208082526030908201527f5369676e6572526f6c653a2063616c6c657220646f6573206e6f74206861766560408201526f20746865205369676e657220726f6c6560801b606082015260800190565b602080825260029082015261726360f01b604082015260600190565b602080825260029082015261616960f01b604082015260600190565b6020808252600c908201526b1d5cd95c88195e1c1a5c995960a21b604082015260600190565b6020808252600790820152661cdd1bdc1c195960ca1b604082015260600190565b6020808252600c908201526b1bdd995c881c195c98d95b9d60a21b604082015260600190565b60208082526003908201526273727560e81b604082015260600190565b60208082526004908201526373756d6d60e01b604082015260600190565b6020808252600290820152616f6760f01b604082015260600190565b9182526001600160a01b0316602082015260400190565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b9586526001600160a01b03948516602087015292841660408601529083166060850152909116608083015260a082015260c00190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b6000838252604060208301526125f660408301846152b6565b948552602085019390935260408401919091526060830152608082015260a00190565b6040518181016001600160401b0381118282101715615b4857fe5b604052919050565b60006001600160401b03821115615b6357fe5b5060209081020190565b60005b83811015615b88578181015183820152602001615b70565b83811115615b97576000848401525b50505050565b6001600160a01b0381168114615bb257600080fd5b50565b8015158114615bb257600080fdfea2646970667358221220aa32cc4f0b9d48b357e0c1c5b11ee64a12e631c5e5c235c62bdd99202e92eed964736f6c6343000706003300000000000000000000000041f5391b474bfb3688aca4ea3e6bebd8abe7838c0000000000000000000000005126ea3894671e1c6cce47d3fb462e3c270e499e
Deployed Bytecode
0x6080604052600436106102ef5760003560e01c80636ac7bca011610186578063b2b9f0ed116100d7578063d1f21f4f11610085578063d1f21f4f1461085d578063d365a08e1461087d578063d73d8b9014610892578063e9b786cb146108b2578063f460590b146108c7578063f6326fb3146108e7578063f6e71bc8146108ef576102f6565b8063b2b9f0ed146107a9578063bd38837b146107c9578063c42cf535146107de578063c5f956af146107fe578063c8a68c9614610813578063cc3fdd4c14610828578063cefd071b1461083d576102f6565b80637df73e27116101345780637df73e27146106ea57806389c9cbc01461070a5780638a0afa771461071f578063947977a81461073f578063a49062d41461075f578063a89b7ed614610774578063af14944414610794576102f6565b80636ac7bca0146106205780636c3fc891146106405780636e933c74146106605780636f1a65e0146106805780636f9e4f0b1461069557806375e16b17146106b55780637b7b0820146106d5576102f6565b806334a6cdc5116102405780635d70557c116101ee5780635d70557c146105565780635e3260471461056b57806361e3c5231461058b57806362c3c2e5146105ab5780636309daf5146105cb57806368af81e6146105eb57806368d3ae831461060b576102f6565b806334a6cdc5146104975780633d5c2644146104ac57806341ed2c12146104cc578063459a1782146104e157806347e7ef2414610501578063495ef705146105215780634e24127714610536576102f6565b8063272caf691161029d578063272caf69146103df578063276f1c41146103f45780632a54caba146104095780632a8d950c1461042b5780632b3297f9146104405780632f54bf6e1461045557806332c2e8d714610482576102f6565b8063025e7c27146102fb5780630885ad571461033157806308b14011146103535780630b800f481461037357806316ba71971461039357806321f8fba7146103b55780632630c12f146103ca576102f6565b366102f657005b600080fd5b34801561030757600080fd5b5061031b6103163660046150f7565b610904565b60405161032891906153d9565b60405180910390f35b34801561033d57600080fd5b5061035161034c3660046151e4565b61092e565b005b34801561035f57600080fd5b5061035161036e366004615003565b610dce565b34801561037f57600080fd5b5061035161038e366004614be4565b6110dc565b34801561039f57600080fd5b506103a861121d565b6040516103289190615578565b3480156103c157600080fd5b5061031b611228565b3480156103d657600080fd5b5061031b611237565b3480156103eb57600080fd5b5061031b611246565b34801561040057600080fd5b5061031b611255565b34801561041557600080fd5b5061041e611264565b6040516103289190615551565b34801561043757600080fd5b5061031b61126a565b34801561044c57600080fd5b5061031b611279565b34801561046157600080fd5b50610475610470366004614a35565b611288565b6040516103289190615546565b34801561048e57600080fd5b506103a86112df565b3480156104a357600080fd5b5061041e6112ea565b3480156104b857600080fd5b5061041e6104c7366004614a35565b6112f0565b3480156104d857600080fd5b5061031b6113a1565b3480156104ed57600080fd5b506103516104fc366004615003565b6113b0565b34801561050d57600080fd5b5061035161051c366004614cf8565b6115f1565b34801561052d57600080fd5b5061041e6117ab565b34801561054257600080fd5b5061041e610551366004614ec8565b6117b1565b34801561056257600080fd5b5061031b6117f5565b34801561057757600080fd5b50610351610586366004615086565b611804565b34801561059757600080fd5b5061041e6105a6366004614bb7565b611da7565b3480156105b757600080fd5b506104756105c6366004614a35565b611dd2565b3480156105d757600080fd5b5061041e6105e6366004614a35565b611e25565b3480156105f757600080fd5b5061041e610606366004614fc4565b611e37565b34801561061757600080fd5b5061041e611e72565b34801561062c57600080fd5b5061035161063b366004615003565b611e78565b34801561064c57600080fd5b5061035161065b366004615003565b6120d5565b34801561066c57600080fd5b5061041e61067b36600461506b565b61241f565b34801561068c57600080fd5b5061041e612495565b3480156106a157600080fd5b506103516106b0366004614d23565b61249c565b3480156106c157600080fd5b5061031b6106d0366004615003565b612554565b3480156106e157600080fd5b5061031b6125fe565b3480156106f657600080fd5b50610475610705366004614a35565b61260d565b34801561071657600080fd5b5061031b61261a565b34801561072b57600080fd5b5061035161073a36600461518b565b612629565b34801561074b57600080fd5b5061035161075a366004615003565b612867565b34801561076b57600080fd5b5061041e612a5f565b34801561078057600080fd5b5061031b61078f3660046150c2565b612a64565b3480156107a057600080fd5b506103a8612b2a565b3480156107b557600080fd5b506104756107c43660046150f7565b612b35565b3480156107d557600080fd5b5061031b612b4a565b3480156107ea57600080fd5b506103516107f9366004614a35565b612b6e565b34801561080a57600080fd5b5061031b612bfa565b34801561081f57600080fd5b5061041e612c0e565b34801561083457600080fd5b5061041e612c14565b34801561084957600080fd5b5061041e610858366004614bb7565b612c1a565b34801561086957600080fd5b50610351610878366004615003565b612c37565b34801561088957600080fd5b5061031b612e96565b34801561089e57600080fd5b506103516108ad366004615127565b612ea5565b3480156108be57600080fd5b5061041e613253565b3480156108d357600080fd5b506103516108e2366004614ccb565b613259565b6103516132b4565b3480156108fb57600080fd5b506103a8613498565b6000818154811061091457600080fd5b6000918252602090912001546001600160a01b0316905081565b6002601754141561095a5760405162461bcd60e51b81526004016109519061592e565b60405180910390fd5b60026017556012546040516301c6e7ff60e11b815282916001600160a01b03169063038dcffe9061098f9084906004016153d9565b60206040518083038186803b1580156109a757600080fd5b505afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190614ee4565b6109fb5760405162461bcd60e51b8152600401610951906157ae565b601260009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610a4957600080fd5b505afa158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a819190614ee4565b15610a9e5760405162461bcd60e51b81526004016109519061598c565b8383610aaa8282612a64565b6001600160a01b0316610ac36080840160608501614a35565b6001600160a01b031614610ae95760405162461bcd60e51b81526004016109519061573b565b610af46107056134ef565b610b105760405162461bcd60e51b8152600401610951906158de565b6000610b226080880160608901614a35565b6001600160a01b038116600090815260166020526040902054909150421015610b5d5760405162461bcd60e51b8152600401610951906158a6565b8660800135600a541115610b835760405162461bcd60e51b815260040161095190615613565b60008881526001602052604090205460ff16158015610bbe57506314a6a35b60e21b610bb26020890189614f00565b6001600160e01b031916145b610bda5760405162461bcd60e51b8152600401610951906158c1565b6000888152600160208181526040808420805460ff1916909317909255601254825163dffda16360e01b81529251610c8a936001600160a01b039092169263dffda1639260048082019391829003018186803b158015610c3957600080fd5b505afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190614a51565b6001600160a01b0316876001600160a01b0316146117b1565b905080610c9a4262278d006134f3565b6001600160a01b038085166000908152601660205260409020919091556006541615610ce857600754610ce590610cd3906127106134f3565b610cdf8461271061353c565b90613576565b90505b6001600160a01b0380841660009081526015602090815260408083208b851684529091529020546005546006546007549293610d30938c9389938893918216929116906135b8565b506001600160a01b038085166000908152601560209081526040808320938c1683529290522054610d659085908a9084613dc3565b506001600160a01b038416600090815260166020526040908190205490517f36468bb69cf35301290533742acb0f5890fc576141b4884532cf11f7b29c240a91610db4918e9188918890615acd565b60405180910390a150506001601755505050505050505050565b838383836040518060400160405280600e81526020016d7769746864726177546f6b656e7360901b815250610e0233611288565b610e1e5760405162461bcd60e51b8152600401610951906156e2565b6000610e2c86868686612554565b90506001600160a01b0381163314801590610e4b5750610e4b81611288565b8015610e5f57506001600160a01b03811615155b610e7b5760405162461bcd60e51b815260040161095190615792565b60008080610e8b888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015610ec55750845160208601206001600160e01b03198481169116145b610ee15760405162461bcd60e51b8152600401610951906159d3565b428111610f005760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055610f278d8f018f614f1a565b935050505060008082806020019051810190610f439190614a6d565b60125460405163c037934760e01b81529294509092506001600160a01b03169063c037934790610f779085906004016153d9565b60206040518083038186803b158015610f8f57600080fd5b505afa158015610fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc79190614ee4565b15610fe45760405162461bcd60e51b815260040161095190615759565b60006001600160a01b0383166110055750476110008282613f43565b61108e565b6040516370a0823160e01b81526001600160a01b038416906370a08231906110319030906004016153d9565b60206040518083038186803b15801561104957600080fd5b505afa15801561105d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611081919061510f565b905061108e838383613fd5565b7f70082d08c003c5341f2401bec1c2ae1dbcdc29ae17e9cc5633fa617caa8acd4c8383836040516110c1939291906153ed565b60405180910390a15050505050505050505050505050505050565b60185460ff16156110ff5760405162461bcd60e51b81526004016109519061594a565b600f80546001600160a01b03199081166001600160a01b039e8f16179091556010805482169c8e169c909c17909b55601180548c169a8d169a909a17909955601280548b16988c1698909817909755601380548a16968b169690961790955560028054610100600160a81b031916610100938b16939093029290921790915560038054881693891693909317909255600480548716918816919091179055601480548616918716919091179055600580548516918616919091179055600680548416918516919091179055600e80549092169216919091179055600160178190556106bd60075560fa6008556709b6e64a8ec60000600c55600060095567610177f723fb0000600a556103e8600b556018805460ff19169091179055565b632155447360e21b81565b6013546001600160a01b031681565b600f546001600160a01b031681565b6006546001600160a01b031681565b6014546001600160a01b031681565b6101f481565b6011546001600160a01b031681565b600e546001600160a01b031681565b600080805b6000548110156112d657836001600160a01b0316600082815481106112ae57fe5b6000918252602090912001546001600160a01b031614156112ce57600191505b60010161128d565b5090505b919050565b6325110a1760e11b81565b60075481565b6001600160a01b038082166000908152601560209081526040808320601254825163dffda16360e01b81529251949591948694919092169263dffda1639260048083019392829003018186803b15801561134957600080fd5b505afa15801561135d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113819190614a51565b6001600160a01b0316815260208101919091526040016000205492915050565b6012546001600160a01b031681565b83838383604051806040016040528060138152602001727365744d616e6167657241646472657373657360681b8152506113e933611288565b6114055760405162461bcd60e51b8152600401610951906156e2565b600061141386868686612554565b90506001600160a01b0381163314801590611432575061143281611288565b801561144657506001600160a01b03811615155b6114625760405162461bcd60e51b815260040161095190615792565b60008080611472888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156114ac5750845160208601206001600160e01b03198481169116145b6114c85760405162461bcd60e51b8152600401610951906159d3565b4281116114e75760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff1916909117905561150e8d8f018f614f1a565b93505050506000806000808480602001905181019061152d9190614aa6565b60028054610100600160a81b0319166101006001600160a01b0387811682029290921792839055600380546001600160a01b031990811688851617918290556004805482168886161790819055600580549092168786161791829055604051999d50979b509599509397507f471bd784db5079421761b0728e4d7bd73efe27958f0bc3452bada7799f0d3457966115d59691909304821694938216939082169291169061542b565b60405180910390a1505050505050505050505050505050505050565b6012546040516301c6e7ff60e11b815283916001600160a01b03169063038dcffe906116219084906004016153d9565b60206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116719190614ee4565b61168d5760405162461bcd60e51b8152600401610951906157ae565b600260175414156116b05760405162461bcd60e51b81526004016109519061592e565b6002601755601254604080516318e9666960e21b815290516001600160a01b03909216916363a599a491600480820192602092909190829003018186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190614ee4565b1561174f5760405162461bcd60e51b81526004016109519061598c565b61175b833330856140ca565b6117668333846141c2565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a16689582338484604051611799939291906153ed565b60405180910390a15050600160175550565b60095481565b60008082156117ea576117e36117da612710610cdf600b54600a5461353c90919063ffffffff16565b600a54906142c4565b90506117ef565b50600a545b92915050565b6005546001600160a01b031681565b600260175414156118275760405162461bcd60e51b81526004016109519061592e565b600260175561183c6060830160408401614a35565b6012546040516301c6e7ff60e11b81526001600160a01b039091169063038dcffe9061186c9084906004016153d9565b60206040518083038186803b15801561188457600080fd5b505afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190614ee4565b6118d85760405162461bcd60e51b8152600401610951906157ae565b6118e86080840160608501614a35565b6118f181611dd2565b1561190e5760405162461bcd60e51b815260040161095190615966565b601260009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561195c57600080fd5b505afa158015611970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119949190614ee4565b156119b15760405162461bcd60e51b81526004016109519061598c565b600060405180604001604052806119d887876000600281106119cf57fe5b60600201612a64565b6001600160a01b031681526020016119f2878760016119cf565b6001600160a01b031690529050611a108160005b602002015161260d565b8015611a225750611a22816001611a06565b8015611a405750602081015181516001600160a01b03908116911614155b611a5c5760405162461bcd60e51b815260040161095190615792565b60208086013560009081526001909152604090205460ff16158015611a9d575063547e8cf960e11b611a916020870187614f00565b6001600160e01b031916145b611ab95760405162461bcd60e51b8152600401610951906158c1565b60208086013560009081526001808352604091829020805460ff19169091179055601254815163dffda16360e01b815291516001600160a01b039091169263dffda1639260048082019391829003018186803b158015611b1857600080fd5b505afa158015611b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b509190614a51565b6001600160a01b0316611b696060870160408801614a35565b6001600160a01b03161415611c1a57601260009054906101000a90046001600160a01b03166001600160a01b0316638aa7ba676040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfe9190614ee4565b611c1a5760405162461bcd60e51b815260040161095190615775565b611c2a6060860160408701614a35565b6012546001600160a01b03918216911663be2ec3bc611c4f6080890160608a01614a35565b6040518263ffffffff1660e01b8152600401611c6b91906153d9565b60206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbb9190614a51565b6001600160a01b031614611ce15760405162461bcd60e51b8152600401610951906157e8565b6000611d10611cf66060880160408901614a35565b611d066080890160608a01614a35565b8860800135614306565b9050611d2b611d256080880160608901614a35565b826143f7565b81516020838101517f68c88f2d1b180ac31c1b89c8a25db195d669e6d352368be8ae4bb1ade1e7f64792918901359190611d6b60608b0160408c01614a35565b611d7b60808c0160608d01614a35565b8b60800135604051611d9296959493929190615a68565b60405180910390a15050600160175550505050565b6001600160a01b03918216600090815260156020908152604080832093909416825291909152205490565b6000600a5460001415611de7575060006112da565b6001600160a01b0382166000908152601660205260409020544290611e0f906220f5806134f3565b1115611e1d575060006112da565b506001919050565b60166020526000908152604090205481565b6040516000904690611e53903090839087908790602001615315565b6040516020818303038152906040528051906020012091505092915050565b600b5481565b838383836040518060400160405280600c81526020016b73657446656556616c75657360a01b815250611eaa33611288565b611ec65760405162461bcd60e51b8152600401610951906156e2565b6000611ed486868686612554565b90506001600160a01b0381163314801590611ef35750611ef381611288565b8015611f0757506001600160a01b03811615155b611f235760405162461bcd60e51b815260040161095190615792565b60008080611f33888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015611f6d5750845160208601206001600160e01b03198481169116145b611f895760405162461bcd60e51b8152600401610951906159d3565b428111611fa85760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055611fcf8d8f018f614f1a565b9350505050600080600080600085806020019051810190611ff0919061522b565b9450945094509450945061271084111561201c5760405162461bcd60e51b8152600401610951906159ad565b6101f483111561203e5760405162461bcd60e51b81526004016109519061568c565b600a859055600b84905560098390556101f482111561206f5760405162461bcd60e51b81526004016109519061566f565b6008829055600c819055600a54600b546009546040517fba5e401ce259802da9c7838f9696cd1079b2eb2a0ea245e551c978b5d33069c9936120b8939092909186908890615b0a565b60405180910390a150505050505050505050505050505050505050565b8383838360405180604001604052806012815260200171736574436f6e74726163744164647265737360701b81525061210d33611288565b6121295760405162461bcd60e51b8152600401610951906156e2565b600061213786868686612554565b90506001600160a01b0381163314801590612156575061215681611288565b801561216a57506001600160a01b03811615155b6121865760405162461bcd60e51b815260040161095190615792565b60008080612196888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156121d05750845160208601206001600160e01b03198481169116145b6121ec5760405162461bcd60e51b8152600401610951906159d3565b42811161220b5760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff191690911790556122328d8f018f614f1a565b9350505050600080600080600080868060200190518101906122549190614b04565b95509550955095509550955085600f60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084600e60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083601060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082601160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081601260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080601360006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f4366821234a42b582d7d66472fd7d6d5a4d783381ba060215a83e1c3ce0c6db8600f60009054906101000a90046001600160a01b0316600e60009054906101000a90046001600160a01b0316601060009054906101000a90046001600160a01b0316601160009054906101000a90046001600160a01b0316601260009054906101000a90046001600160a01b0316601360009054906101000a90046001600160a01b031660405161240196959493929190615456565b60405180910390a15050505050505050505050505050505050505050565b600046306124306020850185614f00565b60208501356124456080870160608801614a35565b6124556060880160408901614a35565b8588608001358960a00135604051602001612477989796959493929190615348565b60405160208183030381529060405280519060200120915050919050565b62278d0081565b60025460ff161580156124b8575080516001600160a01b031615155b80156124d0575060208101516001600160a01b031615155b80156124e8575060408101516001600160a01b031615155b6125045760405162461bcd60e51b81526004016109519061594a565b6040805160608101825282516001600160a01b039081168252602080850151821690830152838301511691810191909152612543906000906003614919565b50506002805460ff19166001179055565b60004681808061256686880188615284565b92509250925060016125a330868c8c6040516020016125889493929190615315565b60405160208183030381529060405280519060200120614768565b848484604051600081526020016040526040516125c3949392919061555a565b6020604051602081039080840390855afa1580156125e5573d6000803e3d6000fd5b505050602060405103519450505050505b949350505050565b6010546001600160a01b031681565b60006117ef600d83614798565b6003546001600160a01b031681565b600033905060004690506126b3600161266230634a22142e60e01b8c878d8860008f604051602001612588989796959493929190615348565b87878760405160008152602001604052604051612682949392919061555a565b6020604051602081039080840390855afa1580156126a4573d6000803e3d6000fd5b5050506020604051035161260d565b6126cf5760405162461bcd60e51b8152600401610951906159f0565b60008881526001602052604090205460ff16156126fe5760405162461bcd60e51b8152600401610951906158c1565b6000888152600160208190526040909120805460ff191690911790554286116127395760405162461bcd60e51b8152600401610951906156fe565b601254604051632f8bb0ef60e21b81526000916001600160a01b03169063be2ec3bc9061276a9086906004016153d9565b60206040518083038186803b15801561278257600080fd5b505afa158015612796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ba9190614a51565b60125460405163e8b624ad60e01b81529192506001600160a01b03169063e8b624ad906127ed9086908c90600401615411565b600060405180830381600087803b15801561280757600080fd5b505af115801561281b573d6000803e3d6000fd5b505050507f6d41219ad121d8734cd4bf7d276c6e3ef10c1a9b4e0e2245dd02ec458599cdb789848a846040516128549493929190615a41565b60405180910390a1505050505050505050565b83838383604051806040016040528060168152602001757365745374616b65436f6e7472616374506172616d7360501b8152506128a333611288565b6128bf5760405162461bcd60e51b8152600401610951906156e2565b60006128cd86868686612554565b90506001600160a01b03811633148015906128ec57506128ec81611288565b801561290057506001600160a01b03811615155b61291c5760405162461bcd60e51b815260040161095190615792565b6000808061292c888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156129665750845160208601206001600160e01b03198481169116145b6129825760405162461bcd60e51b8152600401610951906159d3565b4281116129a15760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff191690911790556129c88d8f018f614f1a565b9350505050600080828060200190518101906129e49190614b8a565b600680546001600160a01b0319166001600160a01b03848116919091179182905560078390556040519395509193507f81e80fe065ce07af29c0ce5b1c050c0a153937cfc80aade3416745b8d15a24e292612a459291909116908490615490565b60405180910390a150505050505050505050505050505050565b600581565b6000466001612ac130612a7a6020880188614f00565b6020880135612a8f60808a0160608b01614a35565b612a9f60608b0160408c01614a35565b878b608001358c60a00135604051602001612588989796959493929190615348565b612ace602086018661526a565b8560200135866040013560405160008152602001604052604051612af5949392919061555a565b6020604051602081039080840390855afa158015612b17573d6000803e3d6000fd5b5050604051601f19015195945050505050565b63547e8cf960e11b81565b60016020526000908152604090205460ff1681565b7f00000000000000000000000041f5391b474bfb3688aca4ea3e6bebd8abe7838c81565b6014546001600160a01b0316612b826134ef565b6001600160a01b031614612ba85760405162461bcd60e51b815260040161095190615a0e565b601480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f92caf80b3b287e058d945a90272035dd5f5eb1fee321aced853a991d9ab315ad90600090a35050565b60025461010090046001600160a01b031681565b600a5481565b60085481565b601560209081526000928352604080842090915290825290205481565b838383836040518060400160405280601181526020017007472616e736665724f776e65727368697607c1b815250612c6e33611288565b612c8a5760405162461bcd60e51b8152600401610951906156e2565b6000612c9886868686612554565b90506001600160a01b0381163314801590612cb75750612cb781611288565b8015612ccb57506001600160a01b03811615155b612ce75760405162461bcd60e51b815260040161095190615792565b60008080612cf7888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015612d315750845160208601206001600160e01b03198481169116145b612d4d5760405162461bcd60e51b8152600401610951906159d3565b428111612d6c5760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055612d938d8f018f614f1a565b9350505050600081806020019051810190612dae9190614a51565b90506000805b600054811015612dfc57336001600160a01b031660008281548110612dd557fe5b6000918252602090912001546001600160a01b03161415612df4578091505b600101612db4565b506000808281548110612e0b57fe5b600091825260208220015481546001600160a01b03909116925084919084908110612e3257fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051858316928416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050505050505050505050505050505050565b6004546001600160a01b031681565b60026017541415612ec85760405162461bcd60e51b81526004016109519061592e565b600260178190555060003390506000469050612f0860016126623063855511cc60e01b8d878e888f8f604051602001612588989796959493929190615348565b612f245760405162461bcd60e51b81526004016109519061573b565b60008981526001602052604090205460ff1615612f535760405162461bcd60e51b8152600401610951906158c1565b6000898152600160208190526040909120805460ff19169091179055428611612f8e5760405162461bcd60e51b8152600401610951906156fe565b6001600160a01b038083166000908152601560209081526040808320938c1683529290522054612fbe81896142c4565b6001600160a01b0380851660009081526015602090815260408083208e8516845282528083209490945560125484516315ab88c960e31b81529451929493169263ad5c46489260048083019392829003018186803b15801561301f57600080fd5b505afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190614a51565b9050806001600160a01b03168a6001600160a01b0316141561315157604051632e1a7d4d60e01b81526001600160a01b03821690632e1a7d4d9061309f908c90600401615551565b600060405180830381600087803b1580156130b957600080fd5b505af11580156130cd573d6000803e3d6000fd5b505060025461010090046001600160a01b03161591506131429050576000613106612710610cdf6009548d61353c90919063ffffffff16565b90508015613129576002546131299061010090046001600160a01b031682613f43565b61313c336131378c846142c4565b613f43565b5061314c565b61314c338a613f43565b6131ce565b60025461010090046001600160a01b0316156131c3576000613184612710610cdf6009548d61353c90919063ffffffff16565b905080156131a9576002546131a9908c9061010090046001600160a01b031683613fd5565b6131bd8b336131b88d856142c4565b613fd5565b506131ce565b6131ce8a338b613fd5565b6001600160a01b038085166000908152601560209081526040808320938e1683529290522054613200858c8386613dc3565b507f43b573ac1c738f28df57dc3e1fea317d5c9d932501be02f3f096f617e3e5c5d78c868d8d85604051613238959493929190615a9e565b60405180910390a15050600160175550505050505050505050565b600c5481565b6014546001600160a01b031661326d6134ef565b6001600160a01b0316146132935760405162461bcd60e51b815260040161095190615a0e565b80156132a7576132a2826147e0565b6132b0565b6132b082614822565b5050565b600260175414156132d75760405162461bcd60e51b81526004016109519061592e565b6002601755601254604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561332157600080fd5b505afa158015613335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133599190614a51565b6012546040516301c6e7ff60e11b81529192506001600160a01b03169063038dcffe9061338a9084906004016153d9565b60206040518083038186803b1580156133a257600080fd5b505afa1580156133b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133da9190614ee4565b6133f65760405162461bcd60e51b815260040161095190615759565b806001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561343157600080fd5b505af1158015613445573d6000803e3d6000fd5b50505050506134558133346141c2565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a16689582338234604051613488939291906153ed565b60405180910390a1506001601755565b6314a6a35b60e21b81565b6134ad8282614798565b156134ca5760405162461bcd60e51b8152600401610951906155dc565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3390565b600061353583836040518060400160405280601b81526020017f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815250614864565b9392505050565b60008261354b575060006117ef565b8282028284828161355857fe5b04146135355760405162461bcd60e51b815260040161095190615806565b600061353583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614894565b6000806000601260009054906101000a90046001600160a01b03166001600160a01b03166389a302716040518163ffffffff1660e01b815260040160206040518083038186803b15801561360b57600080fd5b505afa15801561361f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136439190614a51565b90506001600160a01b0385161561368257600c5461367b9061367561366e612710610cdf8c8a61353c565b8a906134f3565b906134f3565b9150613686565b8691505b600f54604051631228942160e21b81526000916001600160a01b037f00000000000000000000000041f5391b474bfb3688aca4ea3e6bebd8abe7838c8116926348a25084926136df928f928992909116906004016154a9565b60206040518083038186803b1580156136f757600080fd5b505afa15801561370b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372f919061510f565b90506137d16137ca612710610cdf601260009054906101000a90046001600160a01b03166001600160a01b0316633e032a3b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561378b57600080fd5b505afa15801561379f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c3919061510f565b859061353c565b82906134f3565b604051634da431e960e11b81529091506001600160a01b037f00000000000000000000000041f5391b474bfb3688aca4ea3e6bebd8abe7838c1690639b4863d2906138229086908690600401615a2a565b60206040518083038186803b15801561383a57600080fd5b505afa15801561384e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613872919061510f565b6001600160a01b03808b1660009081526015602090815260408083208f851680855292529091205492955090841614613b8257600e5460405163361b48eb60e11b81526000916001600160a01b031690636c3691d6906138d8908f908890600401615411565b60006040518083038186803b1580156138f057600080fd5b505afa158015613904573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261392c9190810190614da8565b600e546040516307c0329d60e21b81529192506000916001600160a01b0390911690631f00ca74906139649089908690600401615af1565b60006040518083038186803b15801561397c57600080fd5b505afa158015613990573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526139b89190810190614e45565b905083816000815181106139c857fe5b6020026020010151106139ed5760405162461bcd60e51b815260040161095190615636565b613a14816000815181106139fd57fe5b6020026020010151846142c490919063ffffffff16565b601560008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002081905550613b1582600081518110613a7057fe5b6020908102919091010151600e54604051630137e32360e31b81526001600160a01b03909116906309bf191890613aab9087906004016154cc565b60206040518083038186803b158015613ac357600080fd5b505afa158015613ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613afb9190614a51565b83600081518110613b0857fe5b6020026020010151613fd5565b600e5460405163f5901d4d60e01b81526001600160a01b039091169063f5901d4d90613b49908490869030906004016154df565b600060405180830381600087803b158015613b6357600080fd5b505af1158015613b77573d6000803e3d6000fd5b505050505050613bf8565b818410613ba15760405162461bcd60e51b8152600401610951906155c0565b613bab81856142c4565b601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055505b6001600160a01b038816613c1e5760405162461bcd60e51b815260040161095190615652565b604051634da431e960e11b81526000906001600160a01b037f00000000000000000000000041f5391b474bfb3688aca4ea3e6bebd8abe7838c1690639b4863d290613c6f908d908890600401615a2a565b60206040518083038186803b158015613c8757600080fd5b505afa158015613c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cbf919061510f565b905080851015613ce15760405162461bcd60e51b8152600401610951906156c6565b613cec848a83613fd5565b6000613cf886836142c4565b90506001600160a01b03891615613d1457613d14858a83613fd5565b60405163791f99a560e01b81526001600160a01b037f00000000000000000000000041f5391b474bfb3688aca4ea3e6bebd8abe7838c169063791f99a590613d629089908990600401615a2a565b60206040518083038186803b158015613d7a57600080fd5b505afa158015613d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db2919061510f565b9d9c50505050505050505050505050565b6000836001600160a01b0316856001600160a01b03167f47006484f2df633ac2a5063887c3edaae5a0a3cdf585767bc494e1a3180e5d6f85604051613e089190615551565b60405180910390a3601260009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b158015613e5e57600080fd5b505afa158015613e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e969190614a51565b6001600160a01b0316846001600160a01b031614613eb6575060016125f6565b60115460405163256a3ccb60e11b81526001600160a01b0390911690634ad4799690613ee89088908690600401615490565b602060405180830381600087803b158015613f0257600080fd5b505af1158015613f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3a9190614ee4565b95945050505050565b604080516000808252602082019092526001600160a01b038416908390604051613f6d91906152f9565b60006040518083038185875af1925050503d8060008114613faa576040519150601f19603f3d011682016040523d82523d6000602084013e613faf565b606091505b5050905080613fd05760405162461bcd60e51b8152600401610951906156a9565b505050565b600080846001600160a01b031663a9059cbb60e01b8585604051602401613ffd929190615490565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161403b91906152f9565b6000604051808303816000865af19150503d8060008114614078576040519150601f19603f3d011682016040523d82523d6000602084013e61407d565b606091505b50915091508180156140a75750805115806140a75750808060200190518101906140a79190614ee4565b6140c35760405162461bcd60e51b8152600401610951906157cc565b5050505050565b600080856001600160a01b03166323b872dd60e01b8686866040516024016140f4939291906153ed565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161413291906152f9565b6000604051808303816000865af19150503d806000811461416f576040519150601f19603f3d011682016040523d82523d6000602084013e614174565b606091505b509150915081801561419e57508051158061419e57508080602001905181019061419e9190614ee4565b6141ba5760405162461bcd60e51b815260040161095190615889565b505050505050565b6012546040516301c6e7ff60e11b815284916001600160a01b03169063038dcffe906141f29084906004016153d9565b60206040518083038186803b15801561420a57600080fd5b505afa15801561421e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142429190614ee4565b61425e5760405162461bcd60e51b8152600401610951906157ae565b6001600160a01b0383811660009081526015602090815260408083209388168352929052205461428e81846134f3565b6001600160a01b038581166000908152601560209081526040808320938a168352929052208190556141ba908590879084613dc3565b600061353583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506148cb565b6001600160a01b038083166000908152601560209081526040808320878516845290915281205460045460025460085493949293614355938993899389939183169261010090910416906135b8565b6010546040516339ec2d6360e21b81529193506001600160a01b03169063e7b0b58c906143889087908790600401615490565b600060405180830381600087803b1580156143a257600080fd5b505af11580156143b6573d6000803e3d6000fd5b5050506001600160a01b038086166000908152601560209081526040808320938a16835292905220546143ee91508590879084613dc3565b50509392505050565b601360009054906101000a90046001600160a01b03166001600160a01b031663f130af696040518163ffffffff1660e01b815260040160206040518083038186803b15801561444557600080fd5b505afa158015614459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061447d9190614ee4565b614486576132b0565b6013546011546040516310c91def60e11b81526000926001600160a01b03908116926318d885c2929116906321923bde906144c59088906004016153d9565b60206040518083038186803b1580156144dd57600080fd5b505afa1580156144f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614515919061510f565b6040518263ffffffff1660e01b81526004016145319190615551565b60206040518083038186803b15801561454957600080fd5b505afa15801561455d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614581919061510f565b90506000601260009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b1580156145d357600080fd5b505afa1580156145e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061460b9190614a51565b905060006001600160a01b037f00000000000000000000000041f5391b474bfb3688aca4ea3e6bebd8abe7838c166348a250848361464f612710610cdf898961353c565b600f546040516001600160e01b031960e086901b16815261467e9392916001600160a01b0316906004016154a9565b60206040518083038186803b15801561469657600080fd5b505afa1580156146aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146ce919061510f565b6003546001600160a01b039081166000908152601560209081526040808320938716835292905220549091508110156140c3576003546001600160a01b0390811660009081526015602090815260408083209386168352929052205461473490826142c4565b6003546001600160a01b039081166000908152601560209081526040808320938716835292905220556140c38286836141c2565b60008160405160200161477b91906153a8565b604051602081830303815290604052805190602001209050919050565b60006001600160a01b0382166147c05760405162461bcd60e51b815260040161095190615847565b506001600160a01b03166000908152602091909152604090205460ff1690565b6147eb600d826134a3565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b61482d600d826148f7565b6040516001600160a01b038216907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a250565b6000838301828582101561488b5760405162461bcd60e51b8152600401610951919061558d565b50949350505050565b600081836148b55760405162461bcd60e51b8152600401610951919061558d565b5060008385816148c157fe5b0495945050505050565b600081848411156148ef5760405162461bcd60e51b8152600401610951919061558d565b505050900390565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b82805482825590600052602060002090810192821561496e579160200282015b8281111561496e57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614939565b5061497a92915061497e565b5090565b5b8082111561497a576000815560010161497f565b80356112da81615b9d565b80356001600160e01b0319811681146112da57600080fd5b60008083601f8401126149c7578182fd5b5081356001600160401b038111156149dd578182fd5b6020830191508360208285010111156149f557600080fd5b9250929050565b600060c08284031215614a0d578081fd5b50919050565b600060608284031215614a0d578081fd5b803560ff811681146112da57600080fd5b600060208284031215614a46578081fd5b813561353581615b9d565b600060208284031215614a62578081fd5b815161353581615b9d565b60008060408385031215614a7f578081fd5b8251614a8a81615b9d565b6020840151909250614a9b81615b9d565b809150509250929050565b60008060008060808587031215614abb578182fd5b8451614ac681615b9d565b6020860151909450614ad781615b9d565b6040860151909350614ae881615b9d565b6060860151909250614af981615b9d565b939692955090935050565b60008060008060008060c08789031215614b1c578384fd5b8651614b2781615b9d565b6020880151909650614b3881615b9d565b6040880151909550614b4981615b9d565b6060880151909450614b5a81615b9d565b6080880151909350614b6b81615b9d565b60a0880151909250614b7c81615b9d565b809150509295509295509295565b60008060408385031215614b9c578182fd5b8251614ba781615b9d565b6020939093015192949293505050565b60008060408385031215614bc9578182fd5b8235614bd481615b9d565b91506020830135614a9b81615b9d565b6000806000806000806000806000806000806101808d8f031215614c0657898afd5b8c35614c1181615b9d565b9b5060208d0135614c2181615b9d565b9a5060408d0135614c3181615b9d565b995060608d0135614c4181615b9d565b985060808d0135614c5181615b9d565b975060a08d0135614c6181615b9d565b9650614c6f60c08e01614993565b9550614c7d60e08e01614993565b9450614c8c6101008e01614993565b9350614c9b6101208e01614993565b9250614caa6101408e01614993565b9150614cb96101608e01614993565b90509295989b509295989b509295989b565b60008060408385031215614cdd578182fd5b8235614ce881615b9d565b91506020830135614a9b81615bb5565b60008060408385031215614d0a578182fd5b8235614d1581615b9d565b946020939093013593505050565b600060608284031215614d34578081fd5b82601f830112614d42578081fd5b604051606081018181106001600160401b0382111715614d5e57fe5b604052808360608101861015614d72578384fd5b835b6003811015614d9d578135614d8881615b9d565b83526020928301929190910190600101614d74565b509195945050505050565b60006020808385031215614dba578182fd5b82516001600160401b03811115614dcf578283fd5b8301601f81018513614ddf578283fd5b8051614df2614ded82615b50565b615b2d565b8181528381019083850185840285018601891015614e0e578687fd5b8694505b83851015614e39578051614e2581615b9d565b835260019490940193918501918501614e12565b50979650505050505050565b60006020808385031215614e57578182fd5b82516001600160401b03811115614e6c578283fd5b8301601f81018513614e7c578283fd5b8051614e8a614ded82615b50565b8181528381019083850185840285018601891015614ea6578687fd5b8694505b83851015614e39578051835260019490940193918501918501614eaa565b600060208284031215614ed9578081fd5b813561353581615bb5565b600060208284031215614ef5578081fd5b815161353581615bb5565b600060208284031215614f11578081fd5b6135358261499e565b60008060008060808587031215614f2f578182fd5b614f388561499e565b935060208086013593506040860135925060608601356001600160401b0380821115614f62578384fd5b818801915088601f830112614f75578384fd5b813581811115614f8157fe5b614f93601f8201601f19168501615b2d565b91508082528984828501011115614fa8578485fd5b8084840185840137810190920192909252939692955090935050565b60008060208385031215614fd6578182fd5b82356001600160401b03811115614feb578283fd5b614ff7858286016149b6565b90969095509350505050565b60008060008060408587031215615018578182fd5b84356001600160401b038082111561502e578384fd5b61503a888389016149b6565b90965094506020870135915080821115615052578384fd5b5061505f878288016149b6565b95989497509550505050565b600060c0828403121561507c578081fd5b61353583836149fc565b60008061018080848603121561509a578283fd5b6150a485856149fc565b92508481850111156150b4578182fd5b5060c0830190509250929050565b60008061012083850312156150d5578182fd5b6150df84846149fc565b91506150ee8460c08501614a13565b90509250929050565b600060208284031215615108578081fd5b5035919050565b600060208284031215615120578081fd5b5051919050565b600080600080600080600060e0888a031215615141578081fd5b87359650602088013561515381615b9d565b9550604088013594506060880135935061516f60808901614a24565b925060a0880135915060c0880135905092959891949750929550565b60008060008060008060c087890312156151a3578384fd5b8635955060208701356151b581615b9d565b9450604087013593506151ca60608801614a24565b92506080870135915060a087013590509295509295509295565b60008060008061016085870312156151fa578182fd5b8435935061520b86602087016149fc565b925061521a8660e08701614a13565b9150610140850135614af981615b9d565b600080600080600060a08688031215615242578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b60006020828403121561527b578081fd5b61353582614a24565b600080600060608486031215615298578081fd5b6152a184614a24565b95602085013595506040909401359392505050565b6000815180845260208085019450808401835b838110156152ee5781516001600160a01b0316875295820195908201906001016152c9565b509495945050505050565b6000825161530b818460208701615b6d565b9190910192915050565b60006bffffffffffffffffffffffff198660601b1682528460148301528284603484013791016034019081529392505050565b6bffffffffffffffffffffffff196060998a1b811682526001600160e01b0319989098166014820152601881019690965293871b8616603886015291861b909416604c84015293820192909252608081019290925260a082015260c00190565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03948516815292841660208401529083166040830152909116606082015260800190565b6001600160a01b0396871681529486166020860152928516604085015290841660608401528316608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60006020825261353560208301846152b6565b606080825284519082018190526000906020906080840190828801845b82811015615518578151845292840192908401906001016154fc565b5050508381038285015261552c81876152b6565b9250505060018060a01b0383166040830152949350505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526155ac816040850160208701615b6d565b601f01601f19169190910160400192915050565b602080825260029082015261617560f01b604082015260600190565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b6020808252600990820152681bdd995c881c185a5960ba1b604082015260600190565b602080825260029082015261756160f01b604082015260600190565b6020808252600390820152626d697360e81b604082015260600190565b6020808252600390820152626d706f60e81b604082015260600190565b6020808252600390820152626d666f60e81b604082015260600190565b60208082526003908201526253544560e81b604082015260600190565b602080825260029082015261073760f41b604082015260600190565b60208082526002908201526137b760f11b604082015260600190565b602080825260079082015266195e1c1a5c995960ca1b604082015260600190565b602080825260029082015261065760f41b604082015260600190565b6020808252600490820152631cdcdcdd60e21b604082015260600190565b6020808252600290820152616d6560f01b604082015260600190565b6020808252600390820152626a737960e81b604082015260600190565b602080825260029082015261697360f01b604082015260600190565b6020808252600490820152631b591b9960e21b604082015260600190565b60208082526002908201526114d560f21b604082015260600190565b6020808252600490820152633539bc9960e11b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526003908201526229aa2360e91b604082015260600190565b6020808252600190820152606560f81b604082015260600190565b60208082526003908201526270727560e81b604082015260600190565b60208082526030908201527f5369676e6572526f6c653a2063616c6c657220646f6573206e6f74206861766560408201526f20746865205369676e657220726f6c6560801b606082015260800190565b602080825260029082015261726360f01b604082015260600190565b602080825260029082015261616960f01b604082015260600190565b6020808252600c908201526b1d5cd95c88195e1c1a5c995960a21b604082015260600190565b6020808252600790820152661cdd1bdc1c195960ca1b604082015260600190565b6020808252600c908201526b1bdd995c881c195c98d95b9d60a21b604082015260600190565b60208082526003908201526273727560e81b604082015260600190565b60208082526004908201526373756d6d60e01b604082015260600190565b6020808252600290820152616f6760f01b604082015260600190565b9182526001600160a01b0316602082015260400190565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b9586526001600160a01b03948516602087015292841660408601529083166060850152909116608083015260a082015260c00190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b6000838252604060208301526125f660408301846152b6565b948552602085019390935260408401919091526060830152608082015260a00190565b6040518181016001600160401b0381118282101715615b4857fe5b604052919050565b60006001600160401b03821115615b6357fe5b5060209081020190565b60005b83811015615b88578181015183820152602001615b70565b83811115615b97576000848401525b50505050565b6001600160a01b0381168114615bb257600080fd5b50565b8015158114615bb257600080fdfea2646970667358221220aa32cc4f0b9d48b357e0c1c5b11ee64a12e631c5e5c235c62bdd99202e92eed964736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000041f5391b474bfb3688aca4ea3e6bebd8abe7838c0000000000000000000000005126ea3894671e1c6cce47d3fb462e3c270e499e
-----Decoded View---------------
Arg [0] : _converter (address): 0x41f5391b474bFB3688acA4ea3e6BEBD8aBE7838c
Arg [1] : _initialSigner (address): 0x5126EA3894671E1c6cce47D3fB462E3C270e499e
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000041f5391b474bfb3688aca4ea3e6bebd8abe7838c
Arg [1] : 0000000000000000000000005126ea3894671e1c6cce47d3fb462e3c270e499e
Deployed Bytecode Sourcemap
30847:26279:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18771:23;;;;;;;;;;-1:-1:-1;18771:23:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42506:1674;;;;;;;;;;-1:-1:-1;42506:1674:0;;;;;:::i;:::-;;:::i;:::-;;56301:822;;;;;;;;;;-1:-1:-1;56301:822:0;;;;;:::i;:::-;;:::i;34783:1417::-;;;;;;;;;;-1:-1:-1;34783:1417:0;;;;;:::i;:::-;;:::i;31134:44::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31992:30::-;;;;;;;;;;;;;:::i;31856:26::-;;;;;;;;;;;;;:::i;23177:35::-;;;;;;;;;;;;;:::i;32068:30::-;;;;;;;;;;;;;:::i;23396:44::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31923:27::-;;;;;;;;;;;;;:::i;31738:22::-;;;;;;;;;;;;;:::i;19846:277::-;;;;;;;;;;-1:-1:-1;19846:277:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31419:56::-;;;;;;;;;;;;;:::i;23258:27::-;;;;;;;;;;;;;:::i;37876:197::-;;;;;;;;;;-1:-1:-1;37876:197:0;;;;;:::i;:::-;;:::i;31957:28::-;;;;;;;;;;;;;:::i;24882:909::-;;;;;;;;;;-1:-1:-1;24882:909:0;;;;;:::i;:::-;;:::i;39666:409::-;;;;;;;;;;-1:-1:-1;39666:409:0;;;;;:::i;:::-;;:::i;23551:33::-;;;;;;;;;;;;;:::i;24481:393::-;;;;;;;;;;-1:-1:-1;24481:393:0;;;;;:::i;:::-;;:::i;23006:32::-;;;;;;;;;;;;;:::i;47231:1407::-;;;;;;;;;;-1:-1:-1;47231:1407:0;;;;;:::i;:::-;;:::i;53449:181::-;;;;;;;;;;-1:-1:-1;53449:181:0;;;;;:::i;:::-;;:::i;38098:349::-;;;;;;;;;;-1:-1:-1;38098:349:0;;;;;:::i;:::-;;:::i;32307:49::-;;;;;;;;;;-1:-1:-1;32307:49:0;;;;;:::i;:::-;;:::i;21129:276::-;;;;;;;;;;-1:-1:-1;21129:276:0;;;;;:::i;:::-;;:::i;23846:32::-;;;;;;;;;;;;;:::i;25816:1175::-;;;;;;;;;;-1:-1:-1;25816:1175:0;;;;;:::i;:::-;;:::i;55169:1101::-;;;;;;;;;;-1:-1:-1;55169:1101:0;;;;;:::i;:::-;;:::i;53655:589::-;;;;;;;;;;-1:-1:-1;53655:589:0;;;;;:::i;:::-;;:::i;31576:54::-;;;;;;;;;;;;;:::i;20155:363::-;;;;;;;;;;-1:-1:-1;20155:363:0;;;;;:::i;:::-;;:::i;20526:595::-;;;;;;;;;;-1:-1:-1;20526:595:0;;;;;:::i;:::-;;:::i;31889:27::-;;;;;;;;;;;;;:::i;30161:103::-;;;;;;;;;;-1:-1:-1;30161:103:0;;;;;:::i;:::-;;:::i;22824:31::-;;;;;;;;;;;;;:::i;41001:1480::-;;;;;;;;;;-1:-1:-1;41001:1480:0;;;;;:::i;:::-;;:::i;26999:624::-;;;;;;;;;;-1:-1:-1;26999:624:0;;;;;:::i;:::-;;:::i;22562:37::-;;;;;;;;;;;;;:::i;54269:875::-;;;;;;;;;;-1:-1:-1;54269:875:0;;;;;:::i;:::-;;:::i;31266:44::-;;;;;;;;;;;;;:::i;18801:43::-;;;;;;;;;;-1:-1:-1;18801:43:0;;;;;:::i;:::-;;:::i;31697:34::-;;;;;;;;;;;;;:::i;38486:222::-;;;;;;;;;;-1:-1:-1;38486:222:0;;;;;:::i;:::-;;:::i;22682:30::-;;;;;;;;;;;;;:::i;23682:31::-;;;;;;;;;;;;;:::i;23478:28::-;;;;;;;;;;;;;:::i;32230:68::-;;;;;;;;;;-1:-1:-1;32230:68:0;;;;;:::i;:::-;;:::i;21710:668::-;;;;;;;;;;-1:-1:-1;21710:668:0;;;;;:::i;:::-;;:::i;22934:28::-;;;;;;;;;;;;;:::i;44211:2954::-;;;;;;;;;;-1:-1:-1;44211:2954:0;;;;;:::i;:::-;;:::i;23918:23::-;;;;;;;;;;;;;:::i;38733:238::-;;;;;;;;;;-1:-1:-1;38733:238:0;;;;;:::i;:::-;;:::i;40106:356::-;;;:::i;30995:51::-;;;;;;;;;;;;;:::i;18771:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18771:23:0;;-1:-1:-1;18771:23:0;:::o;42506:1674::-;32482:1;37174:7;;:19;;37166:34;;;;-1:-1:-1;;;37166:34:0;;;;;;;:::i;:::-;;;;;;;;;32482:1;37278:7;:18;36453:13:::1;::::0;36438:50:::1;::::0;-1:-1:-1;;;36438:50:0;;42714:6;;-1:-1:-1;;;;;36453:13:0::1;::::0;36438:42:::1;::::0;:50:::1;::::0;42714:6;;36438:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36430:67;;;;-1:-1:-1::0;;;36430:67:0::1;;;;;;;:::i;:::-;37806:13:::2;;;;;;;;;-1:-1:-1::0;;;;;37806:13:0::2;-1:-1:-1::0;;;;;37791:43:0::2;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37790:46;37782:66;;;;-1:-1:-1::0;;;37782:66:0::2;;;;;;;:::i;:::-;42768:5:::3;42775:8;37657:33;37670:9;37681:8;37657:12;:33::i;:::-;-1:-1:-1::0;;;;;37635:55:0::3;:18;::::0;;;::::3;::::0;::::3;;:::i;:::-;-1:-1:-1::0;;;;;37635:55:0::3;;37613:109;;;;-1:-1:-1::0;;;37613:109:0::3;;;;;;;:::i;:::-;30053:22:::4;30062:12;:10;:12::i;30053:22::-;30037:104;;;;-1:-1:-1::0;;;30037:104:0::4;;;;;;;:::i;:::-;42821:16:::5;42840:14;::::0;;;::::5;::::0;::::5;;:::i;:::-;-1:-1:-1::0;;;;;42873:24:0;::::5;;::::0;;;:14:::5;:24;::::0;;;;;42821:33;;-1:-1:-1;42901:15:0::5;-1:-1:-1::0;42873:43:0::5;42865:57;;;;-1:-1:-1::0;;;42865:57:0::5;;;;;;;:::i;:::-;42961:5;:12;;;42941:16;;:32;;42933:54;;;;-1:-1:-1::0;;;42933:54:0::5;;;;;;;:::i;:::-;43020:15;::::0;;;:11:::5;:15;::::0;;;;;::::5;;:24;::::0;::::5;:59;;-1:-1:-1::0;;;;43048:12:0::5;;::::0;::::5;:5:::0;:12:::5;:::i;:::-;-1:-1:-1::0;;;;;;43048:31:0::5;;43020:59;42998:112;;;;-1:-1:-1::0;;;42998:112:0::5;;;;;;;:::i;:::-;43121:15;::::0;;;43139:4:::5;43121:15;::::0;;;;;;;:22;;-1:-1:-1;;43121:22:0::5;::::0;;::::5;::::0;;;43308:13:::5;::::0;43293:36;;-1:-1:-1;;;43293:36:0;;;;43249:91:::5;::::0;-1:-1:-1;;;;;43308:13:0;;::::5;::::0;43293:34:::5;::::0;:36:::5;::::0;;::::5;::::0;;;;;;;43308:13;43293:36;::::5;;::::0;::::5;;;;::::0;::::5;;;;;;;;;;;;::::0;::::5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43283:46:0::5;:6;-1:-1:-1::0;;;;;43283:46:0::5;;43249:19;:91::i;:::-;43227:113:::0;-1:-1:-1;43227:113:0;43419:41:::5;:15;31623:7;43419:19;:41::i;:::-;-1:-1:-1::0;;;;;43392:24:0;;::::5;;::::0;;;:14:::5;:24;::::0;;;;:68;;;;43477:20:::5;::::0;::::5;:34:::0;43473:131:::5;;43568:12;::::0;43539:53:::5;::::0;43568:23:::5;::::0;43585:5:::5;43568:16;:23::i;:::-;43540:22;:11:::0;43556:5:::5;43540:15;:22::i;:::-;43539:28:::0;::::5;:53::i;:::-;43528:64;;43473:131;-1:-1:-1::0;;;;;43639:23:0;;::::5;43616:20;43639:23:::0;;;:13:::5;:23;::::0;;;;;;;:31;;::::5;::::0;;;;;;;;43778:17:::5;::::0;43810:20:::5;::::0;43845:12:::5;::::0;43639:31;;43681:187:::5;::::0;43663:6;;43653:8;;43755;;43778:17;;::::5;::::0;43810:20;::::5;::::0;43681:15:::5;:187::i;:::-;-1:-1:-1::0;;;;;;43957:23:0;;::::5;;::::0;;;:13:::5;:23;::::0;;;;;;;:31;;::::5;::::0;;;;;;;43879:147:::5;::::0;43913:8;;43936:6;;44003:12;43879:19:::5;:147::i;:::-;-1:-1:-1::0;;;;;;44111:24:0;::::5;;::::0;;;:14:::5;:24;::::0;;;;;;;44042:130;;::::5;::::0;::::5;::::0;44071:2;;44088:8;;44150:11;;44042:130:::5;:::i;:::-;;;;;;;;-1:-1:-1::0;;32438:1:0;37457:7;:22;-1:-1:-1;;;;;;;;;42506:1674:0:o;56301:822::-;56413:8;;56423:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;56493:92:::1;::::0;;::::1;56518:8:::0;56493:92:::1;:::i;:::-;56463:122;;;;;56597:13;56612:10:::0;56637:6:::1;56626:38;;;;;;;;;;;;:::i;:::-;56701:13;::::0;56686:50:::1;::::0;-1:-1:-1;;;56686:50:0;;56596:68;;-1:-1:-1;56596:68:0;;-1:-1:-1;;;;;;56701:13:0::1;::::0;56686:43:::1;::::0;:50:::1;::::0;56596:68;;56686:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56685:51;56677:66;;;;-1:-1:-1::0;;;56677:66:0::1;;;;;;;:::i;:::-;56754:14;-1:-1:-1::0;;;;;56783:19:0;::::1;56779:288;;-1:-1:-1::0;56828:21:0::1;56864:42;56895:2:::0;56828:21;56864:30:::1;:42::i;:::-;56779:288;;;56948:46;::::0;-1:-1:-1;;;56948:46:0;;-1:-1:-1;;;;;56948:31:0;::::1;::::0;::::1;::::0;:46:::1;::::0;56988:4:::1;::::0;56948:46:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56939:55;;57009:46;57037:5;57044:2;57048:6;57009:27;:46::i;:::-;57082:33;57097:5;57104:2;57108:6;57082:33;;;;;;;;:::i;:::-;;;;;;;;19829:1;;;;56301:822:::0;;;;;;;;;;;;;:::o;34783:1417::-;35243:11;;;;35242:12;35234:27;;;;-1:-1:-1;;;35234:27:0;;;;;;;:::i;:::-;35332:11;:26;;-1:-1:-1;;;;;;35332:26:0;;;-1:-1:-1;;;;;35332:26:0;;;;;;;35369:12;:28;;;;;;;;;;;;;;35408:12;:28;;;;;;;;;;;;;;35447:13;:30;;;;;;;;;;;;;;35488:15;:34;;;;;;;;;;;;;;35533:15;:34;;-1:-1:-1;;;;;;35533:34:0;35332:26;35533:34;;;;;;;;;;;;;;35578:16;:36;;;;;;;;;;;;;;35625:13;:30;;;;;;;;;;;;;35666:15;:34;;;;;;;;;;;;;35711:17;:38;;;;;;;;;;;;;35760:20;:44;;;;;;;;;;;;;-1:-1:-1;35815:18:0;;;;;;;;;;;;;-1:-1:-1;35885:7:0;:22;;;35979:15;35964:12;:30;36021:3;-1:-1:-1;36005:19:0;36046:9;-1:-1:-1;36035:20:0;-1:-1:-1;;36066:22:0;36118:10;-1:-1:-1;36099:29:0;36159:4;-1:-1:-1;36139:24:0;36174:11;:18;;-1:-1:-1;;36174:18:0;;;;;;34783:1417::o;31134:44::-;-1:-1:-1;;;31134:44:0;:::o;31992:30::-;;;-1:-1:-1;;;;;31992:30:0;;:::o;31856:26::-;;;-1:-1:-1;;;;;31856:26:0;;:::o;23177:35::-;;;-1:-1:-1;;;;;23177:35:0;;:::o;32068:30::-;;;-1:-1:-1;;;;;32068:30:0;;:::o;23396:44::-;23437:3;23396:44;:::o;31923:27::-;;;-1:-1:-1;;;;;31923:27:0;;:::o;31738:22::-;;;-1:-1:-1;;;;;31738:22:0;;:::o;19846:277::-;19898:4;;;19947:143;19971:6;:13;19967:17;;19947:143;;;20023:4;-1:-1:-1;;;;;20010:17:0;:6;20017:1;20010:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20010:9:0;:17;20006:73;;;20059:4;20048:15;;20006:73;19986:3;;19947:143;;;-1:-1:-1;20107:8:0;-1:-1:-1;19846:277:0;;;;:::o;31419:56::-;-1:-1:-1;;;31419:56:0;:::o;23258:27::-;;;;:::o;37876:197::-;-1:-1:-1;;;;;38004:23:0;;;37972:7;38004:23;;;:13;:23;;;;;;;;38043:13;;38028:36;;-1:-1:-1;;;38028:36:0;;;;37972:7;;38004:23;;37972:7;;38043:13;;;;;38028:34;;:36;;;;;38004:23;38028:36;;;;;38043:13;38028:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38004:61:0;;;;;;;;;;;;-1:-1:-1;38004:61:0;;;37876:197;-1:-1:-1;;37876:197:0:o;31957:28::-;;;-1:-1:-1;;;;;31957:28:0;;:::o;24882:909::-;24999:8;;25009:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;25084:92:::1;::::0;;::::1;25109:8:::0;25084:92:::1;:::i;:::-;25054:122;;;;;25202:27;25244:28:::0;25287:25:::1;25327::::0;25377:6:::1;25366:56;;;;;;;;;;;;:::i;:::-;25435:15;:37:::0;;-1:-1:-1;;;;;;25435:37:0::1;;-1:-1:-1::0;;;;;25435:37:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;25483:16:::1;:39:::0;;-1:-1:-1;;;;;;25483:39:0;;::::1;::::0;;::::1;;::::0;;;;25533:13:::1;:33:::0;;;::::1;::::0;;::::1;;::::0;;;;25577:17:::1;:37:::0;;;;::::1;::::0;;::::1;;::::0;;;;25630:153:::1;::::0;25435:37;;-1:-1:-1;25483:39:0;;-1:-1:-1;25533:33:0;;-1:-1:-1;25577:37:0;;-1:-1:-1;25630:153:0::1;::::0;::::1;::::0;25666:15;;;::::1;::::0;::::1;::::0;25696:16;;::::1;::::0;25727:13;;::::1;::::0;25755:17;::::1;::::0;25630:153:::1;:::i;:::-;;;;;;;;19829:1;;;;;24882:909:::0;;;;;;;;;;;;;:::o;39666:409::-;36453:13;;36438:50;;-1:-1:-1;;;36438:50:0;;39754:6;;-1:-1:-1;;;;;36453:13:0;;36438:42;;:50;;39754:6;;36438:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36430:67;;;;-1:-1:-1;;;36430:67:0;;;;;;;:::i;:::-;32482:1:::1;37174:7;;:19;;37166:34;;;;-1:-1:-1::0;;;37166:34:0::1;;;;;;;:::i;:::-;32482:1;37278:7;:18:::0;37806:13:::2;::::0;37791:45:::2;::::0;;-1:-1:-1;;;37791:45:0;;;;-1:-1:-1;;;;;37806:13:0;;::::2;::::0;37791:43:::2;::::0;:45:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;37806:13;37791:45;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37790:46;37782:66;;;;-1:-1:-1::0;;;37782:66:0::2;;;;;;;:::i;:::-;39821:137:::3;39867:6;39888:10;39921:4;39941:6;39821:31;:137::i;:::-;39969:43;39985:6;39993:10;40005:6;39969:15;:43::i;:::-;40028:39;40040:10;40052:6;40060;40028:39;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;32438:1:0::1;37457:7;:22:::0;-1:-1:-1;39666:409:0:o;23551:33::-;;;;:::o;24481:393::-;24576:7;24601:14;24630:11;24626:217;;;24667:106;24706:52;24752:5;24707:39;24728:17;;24707:16;;:20;;:39;;;;:::i;24706:52::-;24667:16;;;:20;:106::i;:::-;24658:115;;24626:217;;;-1:-1:-1;24815:16:0;;24626:217;24860:6;24481:393;-1:-1:-1;;24481:393:0:o;23006:32::-;;;-1:-1:-1;;;;;23006:32:0;;:::o;47231:1407::-;32482:1;37174:7;;:19;;37166:34;;;;-1:-1:-1;;;37166:34:0;;;;;;;:::i;:::-;32482:1;37278:7;:18;47370:12:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;36453:13;::::0;36438:50:::1;::::0;-1:-1:-1;;;36438:50:0;;-1:-1:-1;;;;;36453:13:0;;::::1;::::0;36438:42:::1;::::0;:50:::1;::::0;36481:6;;36438:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36430:67;;;;-1:-1:-1::0;;;36430:67:0::1;;;;;;;:::i;:::-;47403:14:::2;::::0;;;::::2;::::0;::::2;;:::i;:::-;36597:24;36612:8;36597:14;:24::i;:::-;36596:25;36588:50;;;;-1:-1:-1::0;;;36588:50:0::2;;;;;;;:::i;:::-;37806:13:::3;;;;;;;;;-1:-1:-1::0;;;;;37806:13:0::3;-1:-1:-1::0;;;;;37791:43:0::3;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37790:46;37782:66;;;;-1:-1:-1::0;;;37782:66:0::3;;;;;;;:::i;:::-;47456:25:::4;:137;;;;;;;;47499:34;47512:5;47519:10;47530:1;47519:13;;;;;;;;;;47499:12;:34::i;:::-;-1:-1:-1::0;;;;;47456:137:0::4;::::0;;::::4;;47548:34;47561:5:::0;47568:10;47579:1:::4;47568:13;::::0;47548:34:::4;-1:-1:-1::0;;;;;47456:137:0::4;::::0;;;-1:-1:-1;47626:20:0::4;47456:137:::0;47643:1:::4;47635:10;;;;;47626:8;:20::i;:::-;:61;;;;-1:-1:-1::0;47667:20:0::4;47676:7:::0;47684:1:::4;47676:10;::::0;47667:20:::4;47626:108;;;;-1:-1:-1::0;47723:10:0::4;::::0;::::4;::::0;47709;;-1:-1:-1;;;;;47709:24:0;;::::4;::::0;::::4;;;47626:108;47604:160;;;;-1:-1:-1::0;;;47604:160:0::4;;;;;;;:::i;:::-;47809:8;::::0;;::::4;;47797:21;::::0;;;:11:::4;:21:::0;;;;;;;::::4;;:30;::::0;::::4;:58;;-1:-1:-1::0;;;;47831:12:0::4;;::::0;::::4;:5:::0;:12:::4;:::i;:::-;-1:-1:-1::0;;;;;;47831:24:0::4;;47797:58;47775:111;;;;-1:-1:-1::0;;;47775:111:0::4;;;;;;;:::i;:::-;47909:8;::::0;;::::4;;47897:21;::::0;;;47921:4:::4;47897:21:::0;;;;;;;;:28;;-1:-1:-1;;47897:28:0::4;::::0;;::::4;::::0;;47971:13:::4;::::0;47956:36;;-1:-1:-1;;;47956:36:0;;;;-1:-1:-1;;;;;47971:13:0;;::::4;::::0;47956:34:::4;::::0;:36:::4;::::0;;::::4;::::0;;;;;;;47971:13;47956:36;::::4;;::::0;::::4;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47940:52:0::4;:12;::::0;;;::::4;::::0;::::4;;:::i;:::-;-1:-1:-1::0;;;;;47940:52:0::4;;47936:150;;;48032:13;;;;;;;;;-1:-1:-1::0;;;;;48032:13:0::4;-1:-1:-1::0;;;;;48017:47:0::4;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48009:65;;;;-1:-1:-1::0;;;48009:65:0::4;;;;;;;:::i;:::-;48202:12;::::0;;;::::4;::::0;::::4;;:::i;:::-;48133:13;::::0;-1:-1:-1;;;;;48118:96:0;;::::4;::::0;48133:13:::4;48118:47;48166:14;::::0;;;::::4;::::0;::::4;;:::i;:::-;48118:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48118:96:0::4;;48096:150;;;;-1:-1:-1::0;;;48096:150:0::4;;;;;;;:::i;:::-;48257:19;48279:106;48306:12;::::0;;;::::4;::::0;::::4;;:::i;:::-;48333:14;::::0;;;::::4;::::0;::::4;;:::i;:::-;48362:5;:12;;;48279;:106::i;:::-;48257:128:::0;-1:-1:-1;48396:37:0::4;48405:14;::::0;;;::::4;::::0;::::4;;:::i;:::-;48421:11;48396:8;:37::i;:::-;48501:10:::0;;48478:8:::4;48526:10:::0;;::::4;::::0;48449:181:::4;::::0;48478:8;;::::4;;::::0;48501:10;48551:12:::4;::::0;;;::::4;::::0;::::4;;:::i;:::-;48578:14;::::0;;;::::4;::::0;::::4;;:::i;:::-;48607:5;:12;;;48449:181;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;32438:1:0;37457:7;:22;-1:-1:-1;;;;47231:1407:0:o;53449:181::-;-1:-1:-1;;;;;53591:23:0;;;53559:7;53591:23;;;:13;:23;;;;;;;;:31;;;;;;;;;;;;;53449:181::o;38098:349::-;38162:4;38242:16;;38262:1;38242:21;38238:65;;;-1:-1:-1;38286:5:0;38279:12;;38238:65;-1:-1:-1;;;;;38317:25:0;;;;;;:14;:25;;;;;;38358:15;;38317:38;;38347:7;38317:29;:38::i;:::-;:56;38313:105;;;-1:-1:-1;38401:5:0;38394:12;;38313:105;-1:-1:-1;38435:4:0;38098:349;;;:::o;32307:49::-;;;;;;;;;;;;;:::o;21129:276::-;21358:38;;21225:7;;21311:9;;21358:38;;21375:4;;21311:9;;21390:5;;;;21358:38;;;:::i;:::-;;;;;;;;;;;;;21348:49;;;;;;21341:56;;;21129:276;;;;:::o;23846:32::-;;;;:::o;25816:1175::-;25926:8;;25936:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;26004:92:::1;::::0;;::::1;26029:8:::0;26004:92:::1;:::i;:::-;25974:122;;;;;26122:25;26162:26:::0;26203:27:::1;26245:24:::0;26284:19:::1;26328:6;26317:65;;;;;;;;;;;;:::i;:::-;26107:275;;;;;;;;;;26423:5;26401:18;:27;;26393:52;;;;-1:-1:-1::0;;;26393:52:0::1;;;;;;;:::i;:::-;23437:3;26464:19;:37;;26456:53;;;;-1:-1:-1::0;;;26456:53:0::1;;;;;;;:::i;:::-;26520:16;:36:::0;;;26567:17:::1;:38:::0;;;26616:18:::1;:40:::0;;;23437:3:::1;26675:34:::0;::::1;;26667:50;;;;-1:-1:-1::0;;;26667:50:0::1;;;;;;;:::i;:::-;26728:13;:32:::0;;;26771:8:::1;:22:::0;;;26840:16:::1;::::0;26871:17:::1;::::0;26903:18:::1;::::0;26809:174:::1;::::0;::::1;::::0;::::1;::::0;26840:16;;26871:17;;26782:11;;26744:16;;26809:174:::1;:::i;:::-;;;;;;;;19829:1;;;;;;25816:1175:::0;;;;;;;;;;;;;:::o;55169:1101::-;55285:8;;55295:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;55369:92:::1;::::0;;::::1;55394:8:::0;55369:92:::1;:::i;:::-;55339:122;;;;;55487:20;55522:16:::0;55553:21:::1;55589::::0;55625:22:::1;55662:24:::0;55729:6:::1;55700:123;;;;;;;;;;;;:::i;:::-;55472:351;;;;;;;;;;;;55848:12;55834:11;;:26;;;;;-1:-1:-1::0;;;;;55834:26:0::1;;;;;-1:-1:-1::0;;;;;55834:26:0::1;;;;;;55881:8;55871:7;;:18;;;;;-1:-1:-1::0;;;;;55871:18:0::1;;;;;-1:-1:-1::0;;;;;55871:18:0::1;;;;;;55915:13;55900:12;;:28;;;;;-1:-1:-1::0;;;;;55900:28:0::1;;;;;-1:-1:-1::0;;;;;55900:28:0::1;;;;;;55954:13;55939:12;;:28;;;;;-1:-1:-1::0;;;;;55939:28:0::1;;;;;-1:-1:-1::0;;;;;55939:28:0::1;;;;;;55994:14;55978:13;;:30;;;;;-1:-1:-1::0;;;;;55978:30:0::1;;;;;-1:-1:-1::0;;;;;55978:30:0::1;;;;;;56037:16;56019:15;;:34;;;;;-1:-1:-1::0;;;;;56019:34:0::1;;;;;-1:-1:-1::0;;;;;56019:34:0::1;;;;;;56069:193;56106:11;;;;;;;;;-1:-1:-1::0;;;;;56106:11:0::1;56132:7;;;;;;;;;-1:-1:-1::0;;;;;56132:7:0::1;56154:12;;;;;;;;;-1:-1:-1::0;;;;;56154:12:0::1;56181;;;;;;;;;-1:-1:-1::0;;;;;56181:12:0::1;56208:13;;;;;;;;;-1:-1:-1::0;;;;;56208:13:0::1;56236:15;;;;;;;;;-1:-1:-1::0;;;;;56236:15:0::1;56069:193;;;;;;;;;;;:::i;:::-;;;;;;;;19829:1;;;;;;;55169:1101:::0;;;;;;;;;;;;;:::o;53655:589::-;53754:7;53840:9;53957:4;53984:12;;;;:5;:12;:::i;:::-;54019:8;;;;54050:14;;;;;;;;:::i;:::-;54087:12;;;;;;;;:::i;:::-;54122:7;54152:5;:12;;;54187:5;:15;;;53918:303;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53890:346;;;;;;53870:366;;;53655:589;;;:::o;31576:54::-;31623:7;31576:54;:::o;20155:363::-;20249:11;;;;20248:12;:57;;;;-1:-1:-1;20281:10:0;;-1:-1:-1;;;;;20281:24:0;;;20248:57;:102;;;;-1:-1:-1;20326:10:0;;;;-1:-1:-1;;;;;20326:24:0;;;20248:102;:147;;;;-1:-1:-1;20371:10:0;;;;-1:-1:-1;;;;;20371:24:0;;;20248:147;20226:199;;;;-1:-1:-1;;;20226:199:0;;;;;;;:::i;:::-;20436:45;;;;;;;;20446:10;;-1:-1:-1;;;;;20436:45:0;;;;;20446:10;20458;;;;20436:45;;;;;;20470:10;;;;20436:45;;;;;;;;;;-1:-1:-1;;20436:45:0;;:::i;:::-;-1:-1:-1;;20492:11:0;:18;;-1:-1:-1;;20492:18:0;20506:4;20492:18;;;20155:363::o;20526:595::-;20636:7;20722:9;20636:7;;;20786:80;;;;20811:4;20786:80;:::i;:::-;20752:114;;;;;;20897:216;20925:113;20997:4;21003:7;21012:5;;20980:38;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20970:49;;;;;;20925:22;:113::i;:::-;21057:1;21077;21097;20897:216;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20877:236;;;;;;20526:595;;;;;;;:::o;31889:27::-;;;-1:-1:-1;;;;;31889:27:0;;:::o;30161:103::-;30217:4;30237:21;:8;30250:7;30237:12;:21::i;22824:31::-;;;-1:-1:-1;;;;;22824:31:0;;:::o;41001:1480::-;41185:16;41204:10;41185:29;;41225:15;41286:9;41275:20;;41338:697;41365:655;41397:532;41537:4;31465:10;41576:20;;41631:2;41668:8;41711:6;41752:7;41802:1;41839:9;41486:393;;;;;;;;;;;;;;;:::i;41397:532::-;41952:1;41976;42000;41365:655;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41338:8;:697::i;:::-;41316:751;;;;-1:-1:-1;;;41316:751:0;;;;;;;:::i;:::-;42086:15;;;;:11;:15;;;;;;;;:24;42078:40;;;;-1:-1:-1;;;42078:40:0;;;;;;;:::i;:::-;42129:15;;;;42147:4;42129:15;;;;;;;;:22;;-1:-1:-1;;42129:22:0;;;;;;42182:15;42170:27;;42162:47;;;;-1:-1:-1;;;42162:47:0;;;;;;;:::i;:::-;42258:13;;42243:81;;-1:-1:-1;;;42243:81:0;;42220:20;;-1:-1:-1;;;;;42258:13:0;;42243:47;;:81;;42305:8;;42243:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42350:13;;42335:65;;-1:-1:-1;;;42335:65:0;;42220:104;;-1:-1:-1;;;;;;42350:13:0;;42335:47;;:65;;42383:8;;42393:6;;42335:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42416:57;42438:2;42442:8;42452:6;42460:12;42416:57;;;;;;;;;:::i;:::-;;;;;;;;41001:1480;;;;;;;;;:::o;26999:624::-;27126:8;;27136:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;27209:92:::1;::::0;;::::1;27234:8:::0;27209:92:::1;:::i;:::-;27179:122;;;;;27313:29;27344:21:::0;27394:6:::1;27369:75;;;;;;;;;;;;:::i;:::-;27455:20;:44:::0;;-1:-1:-1;;;;;;27455:44:0::1;-1:-1:-1::0;;;;;27455:44:0;;::::1;::::0;;;::::1;::::0;;;;27510:12:::1;:28:::0;;;27554:61:::1;::::0;27455:44;;-1:-1:-1;27510:28:0;;-1:-1:-1;27554:61:0::1;::::0;::::1;::::0;27580:20;;;::::1;::::0;27510:28;;27554:61:::1;:::i;:::-;;;;;;;;19829:1;;;26999:624:::0;;;;;;;;;;;;;:::o;22562:37::-;22598:1;22562:37;:::o;54269:875::-;54387:7;54473:9;54523:613;54551:498;54679:4;54714:12;;;;:5;:12;:::i;:::-;54757:8;;;;54796:14;;;;;;;;:::i;:::-;54841:12;;;;;;;;:::i;:::-;54884:7;54922:5;:12;;;54965:5;:15;;;54632:375;;;;;;;;;;;;;;;:::i;54551:498::-;55068:5;;;;:3;:5;:::i;:::-;55092:3;:5;;;55116:3;:5;;;54523:613;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54523:613:0;;-1:-1:-1;;54523:613:0;;;54269:875;-1:-1:-1;;;;;54269:875:0:o;31266:44::-;-1:-1:-1;;;31266:44:0;:::o;18801:43::-;;;;;;;;;;;;;;;:::o;31697:34::-;;;:::o;38486:222::-;36312:15;;-1:-1:-1;;;;;36312:15:0;36296:12;:10;:12::i;:::-;-1:-1:-1;;;;;36296:31:0;;36288:46;;;;-1:-1:-1;;;36288:46:0;;;;;;;:::i;:::-;38581:15:::1;::::0;;-1:-1:-1;;;;;38607:29:0;;::::1;-1:-1:-1::0;;;;;;38607:29:0;::::1;::::0;::::1;::::0;;;38652:48:::1;::::0;38581:15;::::1;::::0;38607:29;38581:15;;38652:48:::1;::::0;38559:19:::1;::::0;38652:48:::1;36345:1;38486:222:::0;:::o;22682:30::-;;;;;;-1:-1:-1;;;;;22682:30:0;;:::o;23682:31::-;;;;:::o;23478:28::-;;;;:::o;32230:68::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;21710:668::-;21825:8;;21835:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;21908:92:::1;::::0;;::::1;21933:8:::0;21908:92:::1;:::i;:::-;21878:122;;;;;22011:16;22041:6;22030:29;;;;;;;;;;;;:::i;:::-;22011:48:::0;-1:-1:-1;22070:13:0::1;::::0;22094:143:::1;22118:6;:13:::0;22114:17;::::1;22094:143;;;22170:10;-1:-1:-1::0;;;;;22157:23:0::1;:6;22164:1;22157:9;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;22157:9:0::1;:23;22153:73;;;22209:1;22201:9;;22153:73;22133:3;;22094:143;;;;22247:16;22266:6:::0;22273:5:::1;22266:13;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;22290;;-1:-1:-1;;;;;22266:13:0;;::::1;::::0;-1:-1:-1;22306:8:0;;22266:13;22297:5;;22290:13;::::1;;;;;;::::0;;;::::1;::::0;;::::1;:24:::0;;-1:-1:-1;;;;;;22290:24:0::1;-1:-1:-1::0;;;;;22290:24:0;;::::1;;::::0;;22330:40:::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;19829:1;;;;21710:668:::0;;;;;;;;;;;;;:::o;22934:28::-;;;-1:-1:-1;;;;;22934:28:0;;:::o;44211:2954::-;32482:1;37174:7;;:19;;37166:34;;;;-1:-1:-1;;;37166:34:0;;;;;;;:::i;:::-;32482:1;37278:7;:18;;;;44424:16:::1;44443:10;44424:29;;44464:15;44525:9;44514:20;;44577:681;44604:639;44636:516;44776:4;31168:10;44815:8;;44858:2;44895:8;44938:6;44979:7;45021:6;45062:9;44725:377;;;;;;;;;;;;;;;:::i;44577:681::-;44555:735;;;;-1:-1:-1::0;;;44555:735:0::1;;;;;;;:::i;:::-;45309:15;::::0;;;:11:::1;:15;::::0;;;;;::::1;;:24;45301:40;;;;-1:-1:-1::0;;;45301:40:0::1;;;;;;;:::i;:::-;45352:15;::::0;;;45370:4:::1;45352:15;::::0;;;;;;;:22;;-1:-1:-1;;45352:22:0::1;::::0;;::::1;::::0;;45405:15:::1;45393:27:::0;::::1;45385:47;;;;-1:-1:-1::0;;;45385:47:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45466:23:0;;::::1;45443:20;45466:23:::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;;45593:24:::1;45466:31:::0;45610:6;45593:16:::1;:24::i;:::-;-1:-1:-1::0;;;;;45559:23:0;;::::1;;::::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;;:58;;;;45658:13:::1;::::0;45643:36;;-1:-1:-1;;;45643:36:0;;;;45559:23;;45658:13;::::1;::::0;45643:34:::1;::::0;:36:::1;::::0;;::::1;::::0;45559:23;45643:36;;;;;45658:13;45643:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45628:51;;45704:4;-1:-1:-1::0;;;;;45694:14:0::1;:6;-1:-1:-1::0;;;;;45694:14:0::1;;45690:1270;;;45725:29;::::0;-1:-1:-1;;;45725:29:0;;-1:-1:-1;;;;;45725:21:0;::::1;::::0;::::1;::::0;:29:::1;::::0;45747:6;;45725:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;45773:15:0::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;45773:15:0::1;:29:::0;;-1:-1:-1;45769:507:0::1;::::0;-1:-1:-1;45769:507:0::1;45823:17;45843:43;45880:5;45844:30;45855:18;;45844:6;:10;;:30;;;;:::i;45843:43::-;45823:63:::0;-1:-1:-1;45909:13:0;;45905:120:::1;;45978:15;::::0;45947:58:::1;::::0;45978:15:::1;::::0;::::1;-1:-1:-1::0;;;;;45978:15:0::1;45995:9:::0;45947:30:::1;:58::i;:::-;46043:126;46096:10;46129:21;:6:::0;46140:9;46129:10:::1;:21::i;:::-;46043:30;:126::i;:::-;45769:507;;;;46210:50;46241:10;46253:6;46210:30;:50::i;:::-;45690:1270;;;46312:15;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;46312:15:0::1;:29:::0;46308:641:::1;;46362:17;46382:43;46419:5;46383:30;46394:18;;46383:6;:10;;:30;;;;:::i;46382:43::-;46362:63:::0;-1:-1:-1;46448:13:0;;46444:223:::1;;46573:15;::::0;46486:161:::1;::::0;46540:6;;46573:15:::1;::::0;::::1;-1:-1:-1::0;;;;;46573:15:0::1;46615:9:::0;46486:27:::1;:161::i;:::-;46685:152;46735:6:::0;46764:10:::1;46797:21;:6:::0;46808:9;46797:10:::1;:21::i;:::-;46685:27;:152::i;:::-;46308:641;;;;46878:55;46906:6;46914:10;46926:6;46878:27;:55::i;:::-;-1:-1:-1::0;;;;;46988:23:0;;::::1;46970:15;46988:23:::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;;47030:60:::1;47002:8:::0;47012:6;46988:31;47077:12;47030:19:::1;:60::i;:::-;;47106:51;47119:2;47123:8;47133:6;47141;47149:7;47106:51;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;32438:1:0;37457:7;:22;-1:-1:-1;;;;;;;;;;44211:2954:0:o;23918:23::-;;;;:::o;38733:238::-;36312:15;;-1:-1:-1;;;;;36312:15:0;36296:12;:10;:12::i;:::-;-1:-1:-1;;;;;36296:31:0;;36288:46;;;;-1:-1:-1;;;36288:46:0;;;;;;;:::i;:::-;38849:12:::1;38845:119;;;38878:19;38889:7;38878:10;:19::i;:::-;38845:119;;;38930:22;38944:7;38930:13;:22::i;:::-;38733:238:::0;;:::o;40106:356::-;32482:1;37174:7;;:19;;37166:34;;;;-1:-1:-1;;;37166:34:0;;;;;;;:::i;:::-;32482:1;37278:7;:18;40197:13:::1;::::0;40182:36:::1;::::0;;-1:-1:-1;;;40182:36:0;;;;40167:12:::1;::::0;-1:-1:-1;;;;;40197:13:0::1;::::0;40182:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;40197:13;40182:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40252:13;::::0;40237:48:::1;::::0;-1:-1:-1;;;40237:48:0;;40167:51;;-1:-1:-1;;;;;;40252:13:0::1;::::0;40237:42:::1;::::0;:48:::1;::::0;40167:51;;40237:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40229:63;;;;-1:-1:-1::0;;;40229:63:0::1;;;;;;;:::i;:::-;40310:4;-1:-1:-1::0;;;;;40303:20:0::1;;40331:9;40303:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;40354:44;40370:4;40376:10;40388:9;40354:15;:44::i;:::-;40414:40;40426:10;40438:4;40444:9;40414:40;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;32438:1:0;37457:7;:22;40106:356::o;30995:51::-;-1:-1:-1;;;30995:51:0;:::o;27923:168::-;27997:18;28001:4;28007:7;27997:3;:18::i;:::-;27996:19;27988:63;;;;-1:-1:-1;;;27988:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28058:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;28058:27:0;28081:4;28058:27;;;27923:168::o;29411:92::-;29487:10;29411:92;:::o;14018:127::-;14076:7;14099:40;14103:1;14106;14099:40;;;;;;;;;;;;;;;;;:3;:40::i;:::-;14092:47;14018:127;-1:-1:-1;;;14018:127:0:o;15667:431::-;15725:7;15954:6;15950:37;;-1:-1:-1;15978:1:0;15971:8;;15950:37;16007:5;;;16011:1;16007;:5;:1;16027:5;;;;;:10;16019:56;;;;-1:-1:-1;;;16019:56:0;;;;;;;:::i;16542:126::-;16600:7;16623:39;16627:1;16630;16623:39;;;;;;;;;;;;;;;;;:3;:39::i;49553:2825::-;49773:19;49805:15;49831:12;49861:13;;;;;;;;;-1:-1:-1;;;;;49861:13:0;-1:-1:-1;;;;;49846:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49831:51;-1:-1:-1;;;;;;49897:24:0;;;49893:226;;50028:8;;49948:107;;:53;49962:38;49994:5;49963:25;:9;49977:10;49963:13;:25::i;49962:38::-;49948:9;;:13;:53::i;:::-;:57;;:107::i;:::-;49938:117;;49893:226;;;50098:9;50088:19;;49893:226;50296:11;;50202:116;;-1:-1:-1;;;50202:116:0;;50178:21;;-1:-1:-1;;;;;50213:9:0;50202:36;;;;;:116;;50253:6;;50274:7;;50296:11;;;;50202:116;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50178:140;;50345:147;50377:104;50461:5;50378:59;50411:13;;;;;;;;;-1:-1:-1;;;;;50411:13:0;-1:-1:-1;;;;;50396:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50378:13;;:17;:59::i;50377:104::-;50345:13;;:17;:147::i;:::-;50513:103;;-1:-1:-1;;;50513:103:0;;50329:163;;-1:-1:-1;;;;;;50524:9:0;50513:51;;;;:103;;50579:7;;50601:4;;50513:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50645:23:0;;;50627:15;50645:23;;;:13;:23;;;;;;;;:31;;;;;;;;;;;;50503:113;;-1:-1:-1;50691:14:0;;;;50687:1118;;50984:7;;50975:95;;-1:-1:-1;;;50975:95:0;;50951:21;;-1:-1:-1;;;;;50984:7:0;;50975:32;;:95;;51026:6;;51051:4;;50975:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50975:95:0;;;;;;;;;;;;:::i;:::-;51121:7;;51112:94;;-1:-1:-1;;;51112:94:0;;50951:119;;-1:-1:-1;51085:24:0;;-1:-1:-1;;;;;51121:7:0;;;;51112:30;;:94;;51161:7;;50951:119;;51112:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51112:94:0;;;;;;;;;;;;:::i;:::-;51085:121;;51244:13;51231:7;51239:1;51231:10;;;;;;;;;;;;;;:26;51223:41;;;;-1:-1:-1;;;51223:41:0;;;;;;;:::i;:::-;51313:23;51325:7;51333:1;51325:10;;;;;;;;;;;;;;51313:7;:11;;:23;;;;:::i;:::-;51279:13;:23;51293:8;-1:-1:-1;;;;;51279:23:0;-1:-1:-1;;;;;51279:23:0;;;;;;;;;;;;:31;51303:6;-1:-1:-1;;;;;51279:31:0;-1:-1:-1;;;;;51279:31:0;;;;;;;;;;;;:57;;;;51351:158;51397:4;51402:1;51397:7;;;;;;;;;;;;;;;;;;51432;;51423:42;;-1:-1:-1;;;51423:42:0;;-1:-1:-1;;;;;51432:7:0;;;;51423:36;;:42;;51460:4;;51423:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51484:7;51492:1;51484:10;;;;;;;;;;;;;;51351:27;:158::i;:::-;51533:7;;51524:53;;-1:-1:-1;;;51524:53:0;;-1:-1:-1;;;;;51533:7:0;;;;51524:23;;:53;;51548:7;;51557:4;;51571;;51524:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50687:1118;;;;;51704:13;51694:7;:23;51686:38;;;;-1:-1:-1;;;51686:38:0;;;;;;;:::i;:::-;51773:20;:7;51785;51773:11;:20::i;:::-;51739:13;:23;51753:8;-1:-1:-1;;;;;51739:23:0;-1:-1:-1;;;;;51739:23:0;;;;;;;;;;;;:31;51763:6;-1:-1:-1;;;;;51739:31:0;-1:-1:-1;;;;;51739:31:0;;;;;;;;;;;;:54;;;;50687:1118;-1:-1:-1;;;;;51823:27:0;;51815:43;;;;-1:-1:-1;;;51815:43:0;;;;;;;:::i;:::-;51890:82;;-1:-1:-1;;;51890:82:0;;51869:18;;-1:-1:-1;;;;;51901:9:0;51890:65;;;;:82;;51956:9;;51967:4;;51890:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51869:103;;52002:10;51991:7;:21;;51983:36;;;;-1:-1:-1;;;51983:36:0;;;;;;;:::i;:::-;52030:60;52058:4;52064:13;52079:10;52030:27;:60::i;:::-;52101:11;52115:23;:7;52127:10;52115:11;:23::i;:::-;52101:37;-1:-1:-1;;;;;;52153:24:0;;;52149:93;;52192:50;52220:4;52226:10;52238:3;52192:27;:50::i;:::-;52267:103;;-1:-1:-1;;;52267:103:0;;-1:-1:-1;;;;;52278:9:0;52267:51;;;;:103;;52333:7;;52355:4;;52267:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52253:117;49553:2825;-1:-1:-1;;;;;;;;;;;;;49553:2825:0:o;39107:408::-;39269:4;39320:6;-1:-1:-1;;;;;39291:44:0;39310:8;-1:-1:-1;;;;;39291:44:0;;39328:6;39291:44;;;;;;:::i;:::-;;;;;;;;39375:13;;;;;;;;;-1:-1:-1;;;;;39375:13:0;-1:-1:-1;;;;;39360:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39350:46:0;:6;-1:-1:-1;;;;;39350:46:0;;39346:63;;-1:-1:-1;39405:4:0;39398:11;;39346:63;39454:12;;39440:67;;-1:-1:-1;;;39440:67:0;;-1:-1:-1;;;;;39454:12:0;;;;39440:43;;:67;;39484:8;;39494:12;;39440:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39420:87;39107:408;-1:-1:-1;;;;;39107:408:0:o;5283:168::-;5396:12;;;5356;5396;;;;;;;;;-1:-1:-1;;;;;5374:7:0;;;5389:5;;5374:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5355:54;;;5428:7;5420:23;;;;-1:-1:-1;;;5420:23:0;;;;;;;:::i;:::-;5283:168;;;:::o;4097:316::-;4216:12;4230:17;4251:5;-1:-1:-1;;;;;4251:10:0;4285:24;;;4311:2;4315:5;4262:59;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4262:59:0;;;;;;;;;;;;;;-1:-1:-1;;;;;4262:59:0;-1:-1:-1;;;;;;4262:59:0;;;;;;;;;;4251:71;;;;4262:59;4251:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4215:107;;;;4341:7;:57;;;;-1:-1:-1;4353:11:0;;:16;;:44;;;4384:4;4373:24;;;;;;;;;;;;:::i;:::-;4333:72;;;;-1:-1:-1;;;4333:72:0;;;;;;;:::i;:::-;4097:316;;;;;:::o;3431:367::-;3577:12;3591:17;3625:5;-1:-1:-1;;;;;3625:10:0;3659:28;;;3689:4;3695:2;3699:5;3636:69;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3636:69:0;;;;;;;;;;;;;;-1:-1:-1;;;;;3636:69:0;-1:-1:-1;;;;;;3636:69:0;;;;;;;;;;3625:81;;;;3636:69;3625:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3576:130;;;;3725:7;:57;;;;-1:-1:-1;3737:11:0;;:16;;:44;;;3768:4;3757:24;;;;;;;;;;;;:::i;:::-;3717:73;;;;-1:-1:-1;;;3717:73:0;;;;;;;:::i;:::-;3431:367;;;;;;:::o;40487:483::-;36453:13;;36438:50;;-1:-1:-1;;;36438:50:0;;40619:6;;-1:-1:-1;;;;;36453:13:0;;36438:42;;:50;;40619:6;;36438:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36430:67;;;;-1:-1:-1;;;36430:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40661:23:0;;::::1;40638:20;40661:23:::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;;40737:67:::1;40661:31:::0;40787:6;40737:35:::1;:67::i;:::-;-1:-1:-1::0;;;;;40703:23:0;;::::1;;::::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;:101;;;40815:147:::1;::::0;40703:23;;:31;;40939:12;40815:19:::1;:147::i;14853:130::-:0;14911:7;14934:43;14938:1;14941;14934:43;;;;;;;;;;;;;;;;;:3;:43::i;48742:667::-;-1:-1:-1;;;;;48924:23:0;;;48869:19;48924:23;;;:13;:23;;;;;;;;:31;;;;;;;;;;;49078:13;;49106:15;;49136:13;;48869:19;;48924:31;;48980:180;;48948:6;;48938:8;;49054:9;;49078:13;;;;;49106:15;;;;;48980;:180::i;:::-;49185:12;;49171:70;;-1:-1:-1;;;49171:70:0;;48966:194;;-1:-1:-1;;;;;;49185:12:0;;49171:49;;:70;;49221:8;;49231:9;;49171:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;49332:23:0;;;;;;;:13;:23;;;;;;;;:31;;;;;;;;;;49254:147;;-1:-1:-1;49288:8:0;;49311:6;;49378:12;49254:19;:147::i;:::-;;48742:667;;;;;;:::o;52386:1038::-;52483:15;;;;;;;;;-1:-1:-1;;;;;52483:15:0;-1:-1:-1;;;;;52466:48:0;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52461:64;;52518:7;;52461:64;52578:15;;52660:12;;52646:50;;-1:-1:-1;;;52646:50:0;;52535:23;;-1:-1:-1;;;;;52578:15:0;;;;52561:66;;52660:12;;;52646:40;;:50;;52687:8;;52646:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52561:150;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52535:176;;52722:12;52752:13;;;;;;;;;-1:-1:-1;;;;;52752:13:0;-1:-1:-1;;;;;52737:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52722:51;-1:-1:-1;52784:18:0;-1:-1:-1;;;;;52816:9:0;52805:36;;52722:51;52875:43;52912:5;52876:30;:9;52890:15;52876:13;:30::i;52875:43::-;52933:11;;52805:150;;-1:-1:-1;;;;;;52805:150:0;;;;;;;;;;;-1:-1:-1;;;;;52933:11:0;;52805:150;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53088:16;;-1:-1:-1;;;;;53088:16:0;;;53074:31;;;;:13;:31;;;;;;;;:37;;;;;;;;;;52784:171;;-1:-1:-1;53074:50:0;-1:-1:-1;53070:347:0;;;53213:16;;-1:-1:-1;;;;;53213:16:0;;;53181:63;;;;:13;:63;;;;;;;;:69;;;;;;;;;;:85;;53255:10;53181:73;:85::i;:::-;53155:16;;-1:-1:-1;;;;;53155:16:0;;;53141:31;;;;:13;:31;;;;;;;;:37;;;;;;;;;:125;53362:43;53173:4;53384:8;53394:10;53362:15;:43::i;21413:250::-;21509:7;21635:4;21582:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;21554:101;;;;;;21534:121;;21413:250;;;:::o;28424:211::-;28511:4;-1:-1:-1;;;;;28535:21:0;;28527:68;;;;-1:-1:-1;;;28527:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;28609:20:0;:11;:20;;;;;;;;;;;;;;;28424:211::o;30270:112::-;30323:21;:8;30336:7;30323:12;:21::i;:::-;30356:20;;-1:-1:-1;;;;;30356:20:0;;;;;;;;30270:112;:::o;30388:120::-;30444:24;:8;30460:7;30444:15;:24::i;:::-;30480:22;;-1:-1:-1;;;;;30480:22:0;;;;;;;;30388:120;:::o;14420:178::-;14506:7;14534:5;;;14562:12;14554:6;;;;14546:29;;;;-1:-1:-1;;;14546:29:0;;;;;;;;:::i;:::-;-1:-1:-1;14591:1:0;14420:178;-1:-1:-1;;;;14420:178:0:o;17132:323::-;17218:7;17312:12;17305:5;17297:28;;;;-1:-1:-1;;;17297:28:0;;;;;;;;:::i;:::-;;17332:9;17348:1;17344;:5;;;;;;;17132:323;-1:-1:-1;;;;;17132:323:0:o;15258:178::-;15344:7;15376:12;15368:6;;;;15360:29;;;;-1:-1:-1;;;15360:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;15408:5:0;;;15258:178::o;28163:176::-;-1:-1:-1;;;;;28305:20:0;28328:5;28305:20;;;;;;;;;;;:28;;-1:-1:-1;;28305:28:0;;;28163:176::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:138:1;84:20;;113:33;84:20;113:33;:::i;157:175::-;226:20;;-1:-1:-1;;;;;;275:32:1;;265:43;;255:2;;322:1;319;312:12;337:377;;;454:3;447:4;439:6;435:17;431:27;421:2;;479:8;469;462:26;421:2;-1:-1:-1;509:20:1;;-1:-1:-1;;;;;541:30:1;;538:2;;;591:8;581;574:26;538:2;635:4;627:6;623:17;611:29;;687:3;680:4;671:6;663;659:19;655:30;652:39;649:2;;;704:1;701;694:12;649:2;411:303;;;;;:::o;719:168::-;;828:3;819:6;814:3;810:16;806:26;803:2;;;849:5;842;835:20;803:2;-1:-1:-1;875:6:1;793:94;-1:-1:-1;793:94:1:o;892:167::-;;1001:2;992:6;987:3;983:16;979:25;976:2;;;1021:5;1014;1007:20;1064:158;1132:20;;1192:4;1181:16;;1171:27;;1161:2;;1212:1;1209;1202:12;1227:259;;1339:2;1327:9;1318:7;1314:23;1310:32;1307:2;;;1360:6;1352;1345:22;1307:2;1404:9;1391:23;1423:33;1450:5;1423:33;:::i;1491:263::-;;1614:2;1602:9;1593:7;1589:23;1585:32;1582:2;;;1635:6;1627;1620:22;1582:2;1672:9;1666:16;1691:33;1718:5;1691:33;:::i;2035:415::-;;;2191:2;2179:9;2170:7;2166:23;2162:32;2159:2;;;2212:6;2204;2197:22;2159:2;2249:9;2243:16;2268:33;2295:5;2268:33;:::i;:::-;2370:2;2355:18;;2349:25;2320:5;;-1:-1:-1;2383:35:1;2349:25;2383:35;:::i;:::-;2437:7;2427:17;;;2149:301;;;;;:::o;2455:704::-;;;;;2661:3;2649:9;2640:7;2636:23;2632:33;2629:2;;;2683:6;2675;2668:22;2629:2;2720:9;2714:16;2739:33;2766:5;2739:33;:::i;:::-;2841:2;2826:18;;2820:25;2791:5;;-1:-1:-1;2854:35:1;2820:25;2854:35;:::i;:::-;2960:2;2945:18;;2939:25;2908:7;;-1:-1:-1;2973:35:1;2939:25;2973:35;:::i;:::-;3079:2;3064:18;;3058:25;3027:7;;-1:-1:-1;3092:35:1;3058:25;3092:35;:::i;:::-;2619:540;;;;-1:-1:-1;2619:540:1;;-1:-1:-1;;2619:540:1:o;3164:994::-;;;;;;;3420:3;3408:9;3399:7;3395:23;3391:33;3388:2;;;3442:6;3434;3427:22;3388:2;3479:9;3473:16;3498:33;3525:5;3498:33;:::i;:::-;3600:2;3585:18;;3579:25;3550:5;;-1:-1:-1;3613:35:1;3579:25;3613:35;:::i;:::-;3719:2;3704:18;;3698:25;3667:7;;-1:-1:-1;3732:35:1;3698:25;3732:35;:::i;:::-;3838:2;3823:18;;3817:25;3786:7;;-1:-1:-1;3851:35:1;3817:25;3851:35;:::i;:::-;3957:3;3942:19;;3936:26;3905:7;;-1:-1:-1;3971:35:1;3936:26;3971:35;:::i;:::-;4077:3;4062:19;;4056:26;4025:7;;-1:-1:-1;4091:35:1;4056:26;4091:35;:::i;:::-;4145:7;4135:17;;;3378:780;;;;;;;;:::o;4163:332::-;;;4311:2;4299:9;4290:7;4286:23;4282:32;4279:2;;;4332:6;4324;4317:22;4279:2;4369:9;4363:16;4388:33;4415:5;4388:33;:::i;:::-;4485:2;4470:18;;;;4464:25;4440:5;;4464:25;;-1:-1:-1;;;4269:226:1:o;4500:402::-;;;4629:2;4617:9;4608:7;4604:23;4600:32;4597:2;;;4650:6;4642;4635:22;4597:2;4694:9;4681:23;4713:33;4740:5;4713:33;:::i;:::-;4765:5;-1:-1:-1;4822:2:1;4807:18;;4794:32;4835:35;4794:32;4835:35;:::i;4907:1443::-;;;;;;;;;;;;;5208:3;5196:9;5187:7;5183:23;5179:33;5176:2;;;5230:6;5222;5215:22;5176:2;5274:9;5261:23;5293:33;5320:5;5293:33;:::i;:::-;5345:5;-1:-1:-1;5402:2:1;5387:18;;5374:32;5415:35;5374:32;5415:35;:::i;:::-;5469:7;-1:-1:-1;5528:2:1;5513:18;;5500:32;5541:35;5500:32;5541:35;:::i;:::-;5595:7;-1:-1:-1;5654:2:1;5639:18;;5626:32;5667:35;5626:32;5667:35;:::i;:::-;5721:7;-1:-1:-1;5780:3:1;5765:19;;5752:33;5794:35;5752:33;5794:35;:::i;:::-;5848:7;-1:-1:-1;5907:3:1;5892:19;;5879:33;5921:35;5879:33;5921:35;:::i;:::-;5975:7;-1:-1:-1;6001:41:1;6037:3;6022:19;;6001:41;:::i;:::-;5991:51;;6061:41;6097:3;6086:9;6082:19;6061:41;:::i;:::-;6051:51;;6121:41;6157:3;6146:9;6142:19;6121:41;:::i;:::-;6111:51;;6181:41;6217:3;6206:9;6202:19;6181:41;:::i;:::-;6171:51;;6242:41;6278:3;6267:9;6263:19;6242:41;:::i;:::-;6231:52;;6303:41;6339:3;6328:9;6324:19;6303:41;:::i;:::-;6292:52;;5166:1184;;;;;;;;;;;;;;:::o;6355:396::-;;;6481:2;6469:9;6460:7;6456:23;6452:32;6449:2;;;6502:6;6494;6487:22;6449:2;6546:9;6533:23;6565:33;6592:5;6565:33;:::i;:::-;6617:5;-1:-1:-1;6674:2:1;6659:18;;6646:32;6687;6646;6687;:::i;6756:327::-;;;6885:2;6873:9;6864:7;6860:23;6856:32;6853:2;;;6906:6;6898;6891:22;6853:2;6950:9;6937:23;6969:33;6996:5;6969:33;:::i;:::-;7021:5;7073:2;7058:18;;;;7045:32;;-1:-1:-1;;;6843:240:1:o;7088:897::-;;7223:2;7211:9;7202:7;7198:23;7194:32;7191:2;;;7244:6;7236;7229:22;7191:2;7298:7;7291:4;7280:9;7276:20;7272:34;7262:2;;7325:6;7317;7310:22;7262:2;7363;7357:9;7405:2;7397:6;7393:15;7474:6;7462:10;7459:22;-1:-1:-1;;;;;7426:10:1;7423:34;7420:62;7417:2;;;7485:9;7417:2;7512;7505:22;7547:6;7573:9;7612:2;7597:18;;7594:31;-1:-1:-1;7591:2:1;;;7643:6;7635;7628:22;7591:2;7670:6;7685:269;7699:4;7696:1;7693:11;7685:269;;;7772:3;7759:17;7789:33;7816:5;7789:33;:::i;:::-;7835:18;;7876:4;7900:12;;;;7932;;;;;7719:1;7712:9;7685:269;;;-1:-1:-1;7973:6:1;;7181:804;-1:-1:-1;;;;;7181:804:1:o;7990:1020::-;;8116:2;8159;8147:9;8138:7;8134:23;8130:32;8127:2;;;8180:6;8172;8165:22;8127:2;8218:9;8212:16;-1:-1:-1;;;;;8243:6:1;8240:30;8237:2;;;8288:6;8280;8273:22;8237:2;8316:22;;8369:4;8361:13;;8357:27;-1:-1:-1;8347:2:1;;8403:6;8395;8388:22;8347:2;8437;8431:9;8460:65;8475:49;8521:2;8475:49;:::i;:::-;8460:65;:::i;:::-;8559:15;;;8590:12;;;;8622:11;;;8660;;;8652:20;;8648:29;;8645:42;-1:-1:-1;8642:2:1;;;8705:6;8697;8690:22;8642:2;8732:6;8723:15;;8747:233;8761:2;8758:1;8755:9;8747:233;;;8825:3;8819:10;8842:33;8869:5;8842:33;:::i;:::-;8888:18;;8779:1;8772:9;;;;;8926:12;;;;8958;;8747:233;;;-1:-1:-1;8999:5:1;8096:914;-1:-1:-1;;;;;;;8096:914:1:o;9015:943::-;;9141:2;9184;9172:9;9163:7;9159:23;9155:32;9152:2;;;9205:6;9197;9190:22;9152:2;9243:9;9237:16;-1:-1:-1;;;;;9268:6:1;9265:30;9262:2;;;9313:6;9305;9298:22;9262:2;9341:22;;9394:4;9386:13;;9382:27;-1:-1:-1;9372:2:1;;9428:6;9420;9413:22;9372:2;9462;9456:9;9485:65;9500:49;9546:2;9500:49;:::i;9485:65::-;9584:15;;;9615:12;;;;9647:11;;;9685;;;9677:20;;9673:29;;9670:42;-1:-1:-1;9667:2:1;;;9730:6;9722;9715:22;9667:2;9757:6;9748:15;;9772:156;9786:2;9783:1;9780:9;9772:156;;;9843:10;;9831:23;;9804:1;9797:9;;;;;9874:12;;;;9906;;9772:156;;9963:253;;10072:2;10060:9;10051:7;10047:23;10043:32;10040:2;;;10093:6;10085;10078:22;10040:2;10137:9;10124:23;10156:30;10180:5;10156:30;:::i;10221:257::-;;10341:2;10329:9;10320:7;10316:23;10312:32;10309:2;;;10362:6;10354;10347:22;10309:2;10399:9;10393:16;10418:30;10442:5;10418:30;:::i;10483:196::-;;10594:2;10582:9;10573:7;10569:23;10565:32;10562:2;;;10615:6;10607;10600:22;10562:2;10643:30;10663:9;10643:30;:::i;10684:1009::-;;;;;10855:3;10843:9;10834:7;10830:23;10826:33;10823:2;;;10877:6;10869;10862:22;10823:2;10905:30;10925:9;10905:30;:::i;:::-;10895:40;;10954:2;11003;10992:9;10988:18;10975:32;10965:42;;11054:2;11043:9;11039:18;11026:32;11016:42;;11109:2;11098:9;11094:18;11081:32;-1:-1:-1;;;;;11173:2:1;11165:6;11162:14;11159:2;;;11194:6;11186;11179:22;11159:2;11237:6;11226:9;11222:22;11212:32;;11282:7;11275:4;11271:2;11267:13;11263:27;11253:2;;11309:6;11301;11294:22;11253:2;11350;11337:16;11372:2;11368;11365:10;11362:2;;;11378:9;11362:2;11411:52;11453:2;11434:13;;-1:-1:-1;;11430:27:1;11426:36;;11411:52;:::i;:::-;11398:65;;11486:2;11479:5;11472:17;11526:7;11521:2;11516;11512;11508:11;11504:20;11501:33;11498:2;;;11552:6;11544;11537:22;11498:2;11612;11607;11603;11599:11;11594:2;11587:5;11583:14;11570:45;11635:14;;11631:23;;;11624:39;;;;10813:880;;;;-1:-1:-1;10813:880:1;;-1:-1:-1;;10813:880:1:o;11698:431::-;;;11829:2;11817:9;11808:7;11804:23;11800:32;11797:2;;;11850:6;11842;11835:22;11797:2;11895:9;11882:23;-1:-1:-1;;;;;11920:6:1;11917:30;11914:2;;;11965:6;11957;11950:22;11914:2;12009:60;12061:7;12052:6;12041:9;12037:22;12009:60;:::i;:::-;12088:8;;11983:86;;-1:-1:-1;11787:342:1;-1:-1:-1;;;;11787:342:1:o;12134:751::-;;;;;12301:2;12289:9;12280:7;12276:23;12272:32;12269:2;;;12322:6;12314;12307:22;12269:2;12367:9;12354:23;-1:-1:-1;;;;;12437:2:1;12429:6;12426:14;12423:2;;;12458:6;12450;12443:22;12423:2;12502:60;12554:7;12545:6;12534:9;12530:22;12502:60;:::i;:::-;12581:8;;-1:-1:-1;12476:86:1;-1:-1:-1;12669:2:1;12654:18;;12641:32;;-1:-1:-1;12685:16:1;;;12682:2;;;12719:6;12711;12704:22;12682:2;;12763:62;12817:7;12806:8;12795:9;12791:24;12763:62;:::i;:::-;12259:626;;;;-1:-1:-1;12844:8:1;-1:-1:-1;;;;12259:626:1:o;12890:254::-;;13030:3;13018:9;13009:7;13005:23;13001:33;12998:2;;;13052:6;13044;13037:22;12998:2;13080:58;13130:7;13119:9;13080:58;:::i;13149:453::-;;;13337:3;13381:2;13369:9;13360:7;13356:23;13352:32;13349:2;;;13402:6;13394;13387:22;13349:2;13430:58;13480:7;13469:9;13430:58;:::i;:::-;13420:68;;13523:7;13518:2;13507:9;13503:18;13500:31;13497:2;;;13549:6;13541;13534:22;13497:2;;13592:3;13581:9;13577:19;13567:29;;13317:285;;;;;:::o;13607:386::-;;;13792:3;13780:9;13771:7;13767:23;13763:33;13760:2;;;13814:6;13806;13799:22;13760:2;13842:58;13892:7;13881:9;13842:58;:::i;:::-;13832:68;;13919;13979:7;13973:3;13962:9;13958:19;13919:68;:::i;:::-;13909:78;;13750:243;;;;;:::o;13998:190::-;;14110:2;14098:9;14089:7;14085:23;14081:32;14078:2;;;14131:6;14123;14116:22;14078:2;-1:-1:-1;14159:23:1;;14068:120;-1:-1:-1;14068:120:1:o;14193:194::-;;14316:2;14304:9;14295:7;14291:23;14287:32;14284:2;;;14337:6;14329;14322:22;14284:2;-1:-1:-1;14365:16:1;;14274:113;-1:-1:-1;14274:113:1:o;14392:675::-;;;;;;;;14604:3;14592:9;14583:7;14579:23;14575:33;14572:2;;;14626:6;14618;14611:22;14572:2;14667:9;14654:23;14644:33;;14727:2;14716:9;14712:18;14699:32;14740:33;14767:5;14740:33;:::i;:::-;14792:5;-1:-1:-1;14844:2:1;14829:18;;14816:32;;-1:-1:-1;14895:2:1;14880:18;;14867:32;;-1:-1:-1;14918:39:1;14952:3;14937:19;;14918:39;:::i;:::-;14908:49;;15004:3;14993:9;14989:19;14976:33;14966:43;;15056:3;15045:9;15041:19;15028:33;15018:43;;14562:505;;;;;;;;;;:::o;15072:606::-;;;;;;;15267:3;15255:9;15246:7;15242:23;15238:33;15235:2;;;15289:6;15281;15274:22;15235:2;15330:9;15317:23;15307:33;;15390:2;15379:9;15375:18;15362:32;15403:33;15430:5;15403:33;:::i;:::-;15455:5;-1:-1:-1;15507:2:1;15492:18;;15479:32;;-1:-1:-1;15530:38:1;15564:2;15549:18;;15530:38;:::i;:::-;15520:48;;15615:3;15604:9;15600:19;15587:33;15577:43;;15667:3;15656:9;15652:19;15639:33;15629:43;;15225:453;;;;;;;;:::o;15683:592::-;;;;;15902:3;15890:9;15881:7;15877:23;15873:33;15870:2;;;15924:6;15916;15909:22;15870:2;15965:9;15952:23;15942:33;;15994:67;16053:7;16048:2;16037:9;16033:18;15994:67;:::i;:::-;15984:77;;16080:68;16140:7;16134:3;16123:9;16119:19;16080:68;:::i;:::-;16070:78;;16198:3;16187:9;16183:19;16170:33;16212;16239:5;16212:33;:::i;16280:440::-;;;;;;16471:3;16459:9;16450:7;16446:23;16442:33;16439:2;;;16493:6;16485;16478:22;16439:2;-1:-1:-1;;16521:16:1;;16577:2;16562:18;;16556:25;16621:2;16606:18;;16600:25;16665:2;16650:18;;16644:25;16709:3;16694:19;;;16688:26;16521:16;;16556:25;;-1:-1:-1;16600:25:1;16644;-1:-1:-1;16688:26:1;;-1:-1:-1;16429:291:1;-1:-1:-1;16429:291:1:o;16725:194::-;;16835:2;16823:9;16814:7;16810:23;16806:32;16803:2;;;16856:6;16848;16841:22;16803:2;16884:29;16903:9;16884:29;:::i;16924:330::-;;;;17068:2;17056:9;17047:7;17043:23;17039:32;17036:2;;;17089:6;17081;17074:22;17036:2;17117:29;17136:9;17117:29;:::i;:::-;17107:39;17193:2;17178:18;;17165:32;;-1:-1:-1;17244:2:1;17229:18;;;17216:32;;17026:228;-1:-1:-1;;;17026:228:1:o;17259:469::-;;17356:5;17350:12;17383:6;17378:3;17371:19;17409:4;17438:2;17433:3;17429:12;17422:19;;17475:2;17468:5;17464:14;17496:3;17508:195;17522:6;17519:1;17516:13;17508:195;;;17587:13;;-1:-1:-1;;;;;17583:39:1;17571:52;;17643:12;;;;17678:15;;;;17619:1;17537:9;17508:195;;;-1:-1:-1;17719:3:1;;17326:402;-1:-1:-1;;;;;17326:402:1:o;17733:274::-;;17900:6;17894:13;17916:53;17962:6;17957:3;17950:4;17942:6;17938:17;17916:53;:::i;:::-;17985:16;;;;;17870:137;-1:-1:-1;;17870:137:1:o;18012:481::-;;18284:26;18280:31;18271:6;18267:2;18263:15;18259:53;18254:3;18247:66;18343:6;18338:2;18333:3;18329:12;18322:28;18394:6;18386;18381:2;18376:3;18372:12;18359:42;18424:16;;18442:2;18420:25;18454:15;;;18420:25;18237:256;-1:-1:-1;;;18237:256:1:o;18498:794::-;-1:-1:-1;;18916:2:1;18912:15;;;18908:24;;18896:37;;-1:-1:-1;;;;;;18963:33:1;;;;18958:2;18949:12;;18942:55;19022:2;19013:12;;19006:28;;;;19068:15;;;19064:24;;19059:2;19050:12;;19043:46;19123:15;;;19119:24;;;19114:2;19105:12;;19098:46;19160:12;;;19153:28;;;;19206:3;19197:13;;19190:29;;;;19244:3;19235:13;;19228:29;19282:3;19273:13;;18836:456::o;19297:380::-;19539:66;19527:79;;19631:2;19622:12;;19615:28;;;;19668:2;19659:12;;19517:160::o;19682:203::-;-1:-1:-1;;;;;19846:32:1;;;;19828:51;;19816:2;19801:18;;19783:102::o;20106:383::-;-1:-1:-1;;;;;20372:15:1;;;20354:34;;20424:15;;;;20419:2;20404:18;;20397:43;20471:2;20456:18;;20449:34;;;;20304:2;20289:18;;20271:218::o;20494:304::-;-1:-1:-1;;;;;20724:15:1;;;20706:34;;20776:15;;20771:2;20756:18;;20749:43;20656:2;20641:18;;20623:175::o;20803:465::-;-1:-1:-1;;;;;21090:15:1;;;21072:34;;21142:15;;;21137:2;21122:18;;21115:43;21194:15;;;21189:2;21174:18;;21167:43;21246:15;;;21241:2;21226:18;;21219:43;21021:3;21006:19;;20988:280::o;21273:627::-;-1:-1:-1;;;;;21616:15:1;;;21598:34;;21668:15;;;21663:2;21648:18;;21641:43;21720:15;;;21715:2;21700:18;;21693:43;21772:15;;;21767:2;21752:18;;21745:43;21825:15;;21819:3;21804:19;;21797:44;21878:15;;;21578:3;21857:19;;21850:44;21547:3;21532:19;;21514:386::o;22285:274::-;-1:-1:-1;;;;;22477:32:1;;;;22459:51;;22541:2;22526:18;;22519:34;22447:2;22432:18;;22414:145::o;22564:375::-;-1:-1:-1;;;;;22822:15:1;;;22804:34;;22869:2;22854:18;;22847:34;;;;22917:15;;;22912:2;22897:18;;22890:43;22754:2;22739:18;;22721:218::o;22944:267::-;;23123:2;23112:9;23105:21;23143:62;23201:2;23190:9;23186:18;23178:6;23143:62;:::i;23216:921::-;23520:2;23532:21;;;23602:13;;23505:18;;;23624:22;;;23216:921;;23700:4;;23677:3;23662:19;;;23727:15;;;23216:921;23773:169;23787:6;23784:1;23781:13;23773:169;;;23848:13;;23836:26;;23882:12;;;;23917:15;;;;23809:1;23802:9;23773:169;;;23777:3;;;23987:9;23982:3;23978:19;23973:2;23962:9;23958:18;23951:47;24015;24058:3;24050:6;24015:47;:::i;:::-;24007:55;;;;24127:1;24123;24118:3;24114:11;24110:19;24102:6;24098:32;24093:2;24082:9;24078:18;24071:60;23481:656;;;;;;:::o;24142:187::-;24307:14;;24300:22;24282:41;;24270:2;24255:18;;24237:92::o;24334:177::-;24480:25;;;24468:2;24453:18;;24435:76::o;24516:398::-;24743:25;;;24816:4;24804:17;;;;24799:2;24784:18;;24777:45;24853:2;24838:18;;24831:34;24896:2;24881:18;;24874:34;24730:3;24715:19;;24697:217::o;24919:202::-;-1:-1:-1;;;;;;25081:33:1;;;;25063:52;;25051:2;25036:18;;25018:103::o;25126:383::-;;25275:2;25264:9;25257:21;25307:6;25301:13;25350:6;25345:2;25334:9;25330:18;25323:34;25366:66;25425:6;25420:2;25409:9;25405:18;25400:2;25392:6;25388:15;25366:66;:::i;:::-;25493:2;25472:15;-1:-1:-1;;25468:29:1;25453:45;;;;25500:2;25449:54;;25247:262;-1:-1:-1;;25247:262:1:o;25514:325::-;25716:2;25698:21;;;25755:1;25735:18;;;25728:29;-1:-1:-1;;;25788:2:1;25773:18;;25766:32;25830:2;25815:18;;25688:151::o;25844:355::-;26046:2;26028:21;;;26085:2;26065:18;;;26058:30;26124:33;26119:2;26104:18;;26097:61;26190:2;26175:18;;26018:181::o;26204:332::-;26406:2;26388:21;;;26445:1;26425:18;;;26418:29;-1:-1:-1;;;26478:2:1;26463:18;;26456:39;26527:2;26512:18;;26378:158::o;26541:325::-;26743:2;26725:21;;;26782:1;26762:18;;;26755:29;-1:-1:-1;;;26815:2:1;26800:18;;26793:32;26857:2;26842:18;;26715:151::o;26871:326::-;27073:2;27055:21;;;27112:1;27092:18;;;27085:29;-1:-1:-1;;;27145:2:1;27130:18;;27123:33;27188:2;27173:18;;27045:152::o;27202:326::-;27404:2;27386:21;;;27443:1;27423:18;;;27416:29;-1:-1:-1;;;27476:2:1;27461:18;;27454:33;27519:2;27504:18;;27376:152::o;27533:326::-;27735:2;27717:21;;;27774:1;27754:18;;;27747:29;-1:-1:-1;;;27807:2:1;27792:18;;27785:33;27850:2;27835:18;;27707:152::o;27864:326::-;28066:2;28048:21;;;28105:1;28085:18;;;28078:29;-1:-1:-1;;;28138:2:1;28123:18;;28116:33;28181:2;28166:18;;28038:152::o;28195:325::-;28397:2;28379:21;;;28436:1;28416:18;;;28409:29;-1:-1:-1;;;28469:2:1;28454:18;;28447:32;28511:2;28496:18;;28369:151::o;28525:325::-;28727:2;28709:21;;;28766:1;28746:18;;;28739:29;-1:-1:-1;;;28799:2:1;28784:18;;28777:32;28841:2;28826:18;;28699:151::o;28855:330::-;29057:2;29039:21;;;29096:1;29076:18;;;29069:29;-1:-1:-1;;;29129:2:1;29114:18;;29107:37;29176:2;29161:18;;29029:156::o;29190:325::-;29392:2;29374:21;;;29431:1;29411:18;;;29404:29;-1:-1:-1;;;29464:2:1;29449:18;;29442:32;29506:2;29491:18;;29364:151::o;29520:327::-;29722:2;29704:21;;;29761:1;29741:18;;;29734:29;-1:-1:-1;;;29794:2:1;29779:18;;29772:34;29838:2;29823:18;;29694:153::o;29852:325::-;30054:2;30036:21;;;30093:1;30073:18;;;30066:29;-1:-1:-1;;;30126:2:1;30111:18;;30104:32;30168:2;30153:18;;30026:151::o;30182:326::-;30384:2;30366:21;;;30423:1;30403:18;;;30396:29;-1:-1:-1;;;30456:2:1;30441:18;;30434:33;30499:2;30484:18;;30356:152::o;30513:325::-;30715:2;30697:21;;;30754:1;30734:18;;;30727:29;-1:-1:-1;;;30787:2:1;30772:18;;30765:32;30829:2;30814:18;;30687:151::o;30843:327::-;31045:2;31027:21;;;31084:1;31064:18;;;31057:29;-1:-1:-1;;;31117:2:1;31102:18;;31095:34;31161:2;31146:18;;31017:153::o;31175:325::-;31377:2;31359:21;;;31416:1;31396:18;;;31389:29;-1:-1:-1;;;31449:2:1;31434:18;;31427:32;31491:2;31476:18;;31349:151::o;31505:327::-;31707:2;31689:21;;;31746:1;31726:18;;;31719:29;-1:-1:-1;;;31779:2:1;31764:18;;31757:34;31823:2;31808:18;;31679:153::o;31837:397::-;32039:2;32021:21;;;32078:2;32058:18;;;32051:30;32117:34;32112:2;32097:18;;32090:62;-1:-1:-1;;;32183:2:1;32168:18;;32161:31;32224:3;32209:19;;32011:223::o;32239:398::-;32441:2;32423:21;;;32480:2;32460:18;;;32453:30;32519:34;32514:2;32499:18;;32492:62;-1:-1:-1;;;32585:2:1;32570:18;;32563:32;32627:3;32612:19;;32413:224::o;32642:326::-;32844:2;32826:21;;;32883:1;32863:18;;;32856:29;-1:-1:-1;;;32916:2:1;32901:18;;32894:33;32959:2;32944:18;;32816:152::o;32973:324::-;33175:2;33157:21;;;33214:1;33194:18;;;33187:29;-1:-1:-1;;;33247:2:1;33232:18;;33225:31;33288:2;33273:18;;33147:150::o;33302:326::-;33504:2;33486:21;;;33543:1;33523:18;;;33516:29;-1:-1:-1;;;33576:2:1;33561:18;;33554:33;33619:2;33604:18;;33476:152::o;33633:412::-;33835:2;33817:21;;;33874:2;33854:18;;;33847:30;33913:34;33908:2;33893:18;;33886:62;-1:-1:-1;;;33979:2:1;33964:18;;33957:46;34035:3;34020:19;;33807:238::o;34050:325::-;34252:2;34234:21;;;34291:1;34271:18;;;34264:29;-1:-1:-1;;;34324:2:1;34309:18;;34302:32;34366:2;34351:18;;34224:151::o;34380:325::-;34582:2;34564:21;;;34621:1;34601:18;;;34594:29;-1:-1:-1;;;34654:2:1;34639:18;;34632:32;34696:2;34681:18;;34554:151::o;34710:336::-;34912:2;34894:21;;;34951:2;34931:18;;;34924:30;-1:-1:-1;;;34985:2:1;34970:18;;34963:42;35037:2;35022:18;;34884:162::o;35051:330::-;35253:2;35235:21;;;35292:1;35272:18;;;35265:29;-1:-1:-1;;;35325:2:1;35310:18;;35303:37;35372:2;35357:18;;35225:156::o;35386:336::-;35588:2;35570:21;;;35627:2;35607:18;;;35600:30;-1:-1:-1;;;35661:2:1;35646:18;;35639:42;35713:2;35698:18;;35560:162::o;35727:326::-;35929:2;35911:21;;;35968:1;35948:18;;;35941:29;-1:-1:-1;;;36001:2:1;35986:18;;35979:33;36044:2;36029:18;;35901:152::o;36058:327::-;36260:2;36242:21;;;36299:1;36279:18;;;36272:29;-1:-1:-1;;;36332:2:1;36317:18;;36310:34;36376:2;36361:18;;36232:153::o;36390:325::-;36592:2;36574:21;;;36631:1;36611:18;;;36604:29;-1:-1:-1;;;36664:2:1;36649:18;;36642:32;36706:2;36691:18;;36564:151::o;36902:274::-;37076:25;;;-1:-1:-1;;;;;37137:32:1;37132:2;37117:18;;37110:60;37064:2;37049:18;;37031:145::o;37181:456::-;37412:25;;;-1:-1:-1;;;;;37511:15:1;;;37506:2;37491:18;;37484:43;37563:15;;;37558:2;37543:18;;37536:43;37615:15;37610:2;37595:18;;37588:43;37399:3;37384:19;;37366:271::o;37642:609::-;37929:25;;;-1:-1:-1;;;;;38028:15:1;;;38023:2;38008:18;;38001:43;38080:15;;;38075:2;38060:18;;38053:43;38132:15;;;38127:2;38112:18;;38105:43;38185:15;;;38179:3;38164:19;;38157:44;37981:3;38217:19;;38210:35;37916:3;37901:19;;37883:368::o;38256:519::-;38515:25;;;-1:-1:-1;;;;;38614:15:1;;;38609:2;38594:18;;38587:43;38666:15;;;;38661:2;38646:18;;38639:43;38713:2;38698:18;;38691:34;;;;38756:3;38741:19;;38734:35;38502:3;38487:19;;38469:306::o;38780:417::-;39011:25;;;-1:-1:-1;;;;;39072:32:1;;;;39067:2;39052:18;;39045:60;39136:2;39121:18;;39114:34;39179:2;39164:18;;39157:34;38998:3;38983:19;;38965:232::o;39202:338::-;;39409:6;39398:9;39391:25;39452:2;39447;39436:9;39432:18;39425:30;39472:62;39530:2;39519:9;39515:18;39507:6;39472:62;:::i;39545:463::-;39804:25;;;39860:2;39845:18;;39838:34;;;;39903:2;39888:18;;39881:34;;;;39946:2;39931:18;;39924:34;39989:3;39974:19;;39967:35;39791:3;39776:19;;39758:250::o;40013:242::-;40083:2;40077:9;40113:17;;;-1:-1:-1;;;;;40145:34:1;;40181:22;;;40142:62;40139:2;;;40207:9;40139:2;40234;40227:22;40057:198;;-1:-1:-1;40057:198:1:o;40260:183::-;;-1:-1:-1;;;;;40351:6:1;40348:30;40345:2;;;40381:9;40345:2;-1:-1:-1;40432:4:1;40413:17;;;40409:28;;40335:108::o;40448:258::-;40520:1;40530:113;40544:6;40541:1;40538:13;40530:113;;;40620:11;;;40614:18;40601:11;;;40594:39;40566:2;40559:10;40530:113;;;40661:6;40658:1;40655:13;40652:2;;;40696:1;40687:6;40682:3;40678:16;40671:27;40652:2;;40501:205;;;:::o;40711:133::-;-1:-1:-1;;;;;40788:31:1;;40778:42;;40768:2;;40834:1;40831;40824:12;40768:2;40758:86;:::o;40849:120::-;40937:5;40930:13;40923:21;40916:5;40913:32;40903:2;;40959:1;40956;40949:12
Swarm Source
ipfs://aa32cc4f0b9d48b357e0c1c5b11ee64a12e631c5e5c235c62bdd99202e92eed9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.