More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 114 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 8568568 | 3 hrs ago | IN | 0 S | 0.00478251 | ||||
Redeem | 8568471 | 3 hrs ago | IN | 0 S | 0.00977501 | ||||
Redeem | 8482534 | 13 hrs ago | IN | 0 S | 0.00597705 | ||||
Redeem | 8482513 | 13 hrs ago | IN | 0 S | 0.00597705 | ||||
Redeem | 8482490 | 13 hrs ago | IN | 0 S | 0.00597705 | ||||
Redeem | 8482472 | 13 hrs ago | IN | 0 S | 0.00577021 | ||||
Redeem | 8482403 | 13 hrs ago | IN | 0 S | 0.00577021 | ||||
Redeem | 8468661 | 15 hrs ago | IN | 0 S | 0.0048851 | ||||
Redeem | 8468641 | 15 hrs ago | IN | 0 S | 0.0048851 | ||||
Redeem | 8468573 | 15 hrs ago | IN | 0 S | 0.00478251 | ||||
Redeem | 8468534 | 15 hrs ago | IN | 0 S | 0.00577021 | ||||
Redeem | 8467597 | 15 hrs ago | IN | 0 S | 0.00573797 | ||||
Redeem | 8467500 | 15 hrs ago | IN | 0 S | 0.00637231 | ||||
Redeem | 8467363 | 15 hrs ago | IN | 0 S | 0.00871838 | ||||
Redeem | 8463940 | 16 hrs ago | IN | 0 S | 0.01182887 | ||||
Redeem | 8463812 | 16 hrs ago | IN | 0 S | 0.00478251 | ||||
Redeem | 8453269 | 17 hrs ago | IN | 0 S | 0.01011481 | ||||
Redeem | 8424186 | 21 hrs ago | IN | 0 S | 0.00853529 | ||||
Redeem | 8422776 | 21 hrs ago | IN | 0 S | 0.00495552 | ||||
Redeem | 8422753 | 21 hrs ago | IN | 0 S | 0.00597895 | ||||
Redeem | 8422565 | 21 hrs ago | IN | 0 S | 0.00853529 | ||||
Redeem | 8422534 | 21 hrs ago | IN | 0 S | 0.00853529 | ||||
Redeem | 8388749 | 26 hrs ago | IN | 0 S | 0.00853529 | ||||
Redeem | 8069083 | 3 days ago | IN | 0 S | 0.01024049 | ||||
Redeem | 8068937 | 3 days ago | IN | 0 S | 0.00728425 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BondDepository
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-10 */ /** *Submitted for verification at testnet.sonicscan.org on 2025-02-03 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.20; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); } pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC-20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } } pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } pragma solidity ^0.8.20; /** * @dev External interface of AccessControlEnumerable declared to support ERC-165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.20; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.20; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._positions[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._positions[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; assembly ("memory-safe") { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly ("memory-safe") { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly ("memory-safe") { result := store } return result; } } pragma solidity ^0.8.20; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 role => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual returns (uint256) { return _roleMembers[role].length(); } /** * @dev Return all accounts that have `role` * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) { return _roleMembers[role].values(); } /** * @dev Overload {AccessControl-_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override returns (bool) { bool granted = super._grantRole(role, account); if (granted) { _roleMembers[role].add(account); } return granted; } /** * @dev Overload {AccessControl-_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) { bool revoked = super._revokeRole(role, account); if (revoked) { _roleMembers[role].remove(account); } return revoked; } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } //@author 0xPhant0m based on Ohm Bond Depository and Bond Protocol pragma solidity ^0.8.27; contract BondDepository is AccessControlEnumerable, ReentrancyGuard { using SafeERC20 for IERC20; bytes32 public constant AUCTIONEER_ROLE = keccak256("AUCTIONEER_ROLE"); bytes32 public constant TOKEN_WHITELISTER_ROLE = keccak256("TOKEN_WHITELISTER_ROLE"); bytes32 public constant EMERGENCY_ADMIN_ROLE = keccak256("EMERGENCY_ADMIN_ROLE"); bool public paused; event ContractPaused(address indexed by); event ContractUnpaused(address indexed by); event newBondCreated(uint256 indexed id, address indexed payoutToken, address indexed quoteToken, uint256 initialPrice ); event BondEnded(uint256 indexed id); event addedAuctioneer(address _auctioneer, address payoutToken); event removeAuctioneer(address auctioneer); event MarketTransferred( uint256 marketId, address owner, address newAuctioneer); event BondDeposited( address indexed user, uint256 indexed marketId, uint256 depositAmount, uint256 totalOwed, uint256 bondPrice ); event QuoteTokensWithdrawn( uint256 indexed marketId, address indexed auctioneer, uint256 amount, uint256 daoFee ); event FeeUpdated (uint256 oldFee, uint256 basePoints); event TokenUnwhitelisted( address _token); event TokenWhitelisted( address _token); event AdjustmentSet( uint256 indexed id, bool add, uint256 rate, uint256 target, uint256 buffer, uint256 lastBlock ); uint256 public marketCounter; address [] public _payoutTokens; Terms[] public terms; mapping(uint256 => Adjust) public adjustments; mapping (address => bool) _whitelistedAuctioneer; mapping (address => bool) _whitelistedToken; mapping(uint256 => address) public marketsToAuctioneers; mapping(address => uint256[]) public marketsForQuote; mapping(address => uint256[]) public marketsForPayout; mapping( address => Bond[]) public bondInfo; address public immutable mSig; uint256 public feeToDao; uint256 public constant MAX_FEE = 1000; // Info for creating new bonds struct Terms { address quoteToken; //token requested address payoutToken; //token to be redeemed uint256 amountToBond; //Amount of payout Tokens dedicated to this request uint256 totalDebt; uint256 controlVariable; // scaling variable for price uint256 minimumPrice; // vs principle value add 3 decimals of precision uint256 maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint256 quoteTokensRaised; uint256 lastDecay; //block.timestamp of last decay (i.e last deposit) uint32 bondEnds; //Unix Timestamp of when the offer ends. uint32 vestingTerm; // How long each bond should vest for in seconds } struct Bond { address tokenBonded; //token to be distributed uint256 amountOwed; //amount of tokens owed to Bonder uint256 pricePaid; //price paid in PayoutToken uint256 marketId; //Which market does this belong uint32 startTime; // block timestamp uint32 endTime; //timestamp } struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } //Strictly for front-end optimization struct BondMarketInfo { address quoteToken; address payoutToken; uint256 price; uint256 maxPayout; uint256 vestingTerm; uint256 amountToBond; address auctioneer; bool isLive; uint256 totalDebt; uint256 bondEnds; } constructor(address _mSig){ if (_mSig == address (0)) revert ("Invalid address"); mSig = _mSig; _grantRole(DEFAULT_ADMIN_ROLE, mSig); _grantRole(EMERGENCY_ADMIN_ROLE, mSig); _grantRole(TOKEN_WHITELISTER_ROLE, mSig); } /*================================= Auctioneer FUNCTIONS =================================*/ function newBond( address payoutToken_, IERC20 _quoteToken, uint256 [4] memory _terms, // [amountToBond, controlVariable, minimumPrice, maxDebt] uint32 [2] memory _vestingTerms // [bondEnds, vestingTerm] ) external onlyRole(AUCTIONEER_ROLE) whenNotPaused returns (uint256 marketID) { // Address validations require(payoutToken_ != address(0), "Invalid payout token"); require(address(_quoteToken) != address(0), "Invalid quote token"); require(address(_quoteToken) != payoutToken_, "Tokens must be different"); require(_whitelistedToken[payoutToken_], "Token not whitelisted"); require(!auctioneerHasMarketForQuote(msg.sender, address(_quoteToken)), "Already has market for quote token"); // Time validations require(_vestingTerms[0] > block.timestamp, "Bond end too early"); // Parameter validations require(_terms[0] > 0, "Amount must be > 0"); require(_terms[1] > 0, "Control variable must be > 0"); require(_terms[2] > 0, "Minimum price must be > 0"); require(_terms[3] > 0, "Max debt must be > 0"); uint256 secondsToConclusion = _vestingTerms[0] - block.timestamp; require(secondsToConclusion > 0, "Invalid vesting period"); // Calculate max payout with better precision uint8 quoteDecimals = IERC20Metadata(address(_quoteToken)).decimals(); uint8 payoutDecimals = IERC20Metadata(payoutToken_).decimals(); // Transfer payout tokens IERC20(payoutToken_).safeTransferFrom(msg.sender, address(this), _terms[0] * 10**payoutDecimals); // Create market terms.push(Terms({ quoteToken: address(_quoteToken), payoutToken: payoutToken_, amountToBond: _terms[0] * 10**payoutDecimals, controlVariable: _terms[1], minimumPrice: _terms[2], // Store minimumPrice without extra scaling maxDebt: _terms[3] * 10**payoutDecimals, quoteTokensRaised: 0, lastDecay: block.timestamp, bondEnds: _vestingTerms[0], vestingTerm: _vestingTerms[1], totalDebt: 0 })); // Market tracking uint256 marketId = marketCounter; marketsForPayout[payoutToken_].push(marketId); marketsForQuote[address(_quoteToken)].push(marketId); marketsToAuctioneers[marketId] = msg.sender; ++marketCounter; emit newBondCreated(marketId, payoutToken_, address(_quoteToken), _terms[1]); return marketId; } function closeBond(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { if (marketsToAuctioneers[_id] != msg.sender) revert ("Not your Bond"); terms[_id].bondEnds = uint32(block.timestamp); uint256 amountLeft = terms[_id].amountToBond - terms[_id].totalDebt; IERC20(terms[_id].payoutToken).safeTransfer(msg.sender, amountLeft); emit BondEnded(_id); } function withdrawQuoteTokens(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { require(marketsToAuctioneers[_id] == msg.sender, "Not market's auctioneer"); require(block.timestamp > terms[_id].bondEnds, "Bond not yet concluded"); address quoteToken = terms[_id].quoteToken; uint256 balance = terms[_id].quoteTokensRaised; uint256 daoFee = 0; if (feeToDao > 0) { daoFee = (balance * feeToDao) / 10000; balance -= daoFee; } IERC20(quoteToken).safeTransfer(msg.sender, balance); if (daoFee > 0) { IERC20(quoteToken).safeTransfer(mSig, daoFee); } emit QuoteTokensWithdrawn(_id, msg.sender, balance, daoFee); } function transferMarket(uint256 marketId, address newAuctioneer) external { require(marketsToAuctioneers[marketId] == msg.sender, "Not market owner"); require(hasRole(AUCTIONEER_ROLE, newAuctioneer), "Not auctioneer"); marketsToAuctioneers[marketId] = newAuctioneer; emit MarketTransferred(marketId, msg.sender, newAuctioneer); } function setAdjustment( uint256 _id, bool _add, uint256 _rate, uint256 _target, uint256 _buffer ) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { require(marketsToAuctioneers[_id] == msg.sender, "Not market's auctioneer"); require(_target > 0, "Target cannot be zero"); require(_rate > 0, "Rate cannot be zero"); adjustments[_id] = Adjust({ add: _add, rate: _rate, target: _target, buffer: _buffer, lastBlock: uint32(block.timestamp) }); emit AdjustmentSet( _id, _add, _rate, _target, _buffer, block.timestamp ); } /*================================= User FUNCTIONS =================================*/ function deposit(uint256 _id, uint256 amount, address user) public nonReentrant { require(user != address(0), "Invalid user address"); require(_id < terms.length, "Invalid market ID"); Terms storage term = terms[_id]; require(block.timestamp <= term.bondEnds, "Bond has ended"); require(term.totalDebt < term.maxDebt, "Maximum bond capacity reached"); uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 minimumDeposit = calculateMinimumDeposit(quoteDecimals); require(amount >= minimumDeposit, "Deposit below minimum threshold"); _tune(_id); _decayDebt(_id); uint256 price = _marketPrice(_id); // For 6 decimal input -> 18 decimal output uint256 payout = (amount * 1e18) / (price / (10 ** (18 - quoteDecimals))); uint256 maxPayout = ((term.maxDebt - term.totalDebt) * 1800) / 10000; require(payout <= maxPayout, "Deposit exceeds maximum allowed"); require(term.totalDebt + payout <= term.maxDebt, "Exceeds maximum bond debt"); IERC20 quoteToken = IERC20(term.quoteToken); uint256 balanceBefore = quoteToken.balanceOf(address(this)); quoteToken.safeTransferFrom(msg.sender, address(this), amount); uint256 balanceAfter = quoteToken.balanceOf(address(this)); require(balanceAfter - balanceBefore == amount, "Incorrect transfer amount"); terms[_id].quoteTokensRaised += amount; terms[_id].totalDebt += payout; bondInfo[user].push(Bond({ tokenBonded: term.payoutToken, amountOwed: payout, pricePaid: price, marketId: _id, startTime: uint32(block.timestamp), endTime: uint32(term.vestingTerm + block.timestamp) })); emit BondDeposited(user, _id, amount, payout, price); } function redeem(uint256 _id, address user) external nonReentrant returns (uint256 amountRedeemed) { uint256 length = bondInfo[user].length; uint256 totalRedeemed = 0; for (uint256 i = length; i > 0;) { i--; Bond storage currentBond = bondInfo[user][i]; if (currentBond.marketId == _id) { uint256 amount = calculateLinearPayout(user, i); if (amount > 0) { currentBond.amountOwed -= amount; totalRedeemed += amount; // Scale amount by token decimals for transfer IERC20(terms[_id].payoutToken).safeTransfer(user, amount); if (currentBond.amountOwed == 0) { if (i != bondInfo[user].length - 1) { bondInfo[user][i] = bondInfo[user][bondInfo[user].length - 1]; } bondInfo[user].pop(); } } } } return totalRedeemed; } /*================================= ADMIN FUNCTIONS =================================*/ function grantAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { // Additional validation require(_auctioneer != address(0), "Invalid auctioneer address"); require(!hasRole(AUCTIONEER_ROLE, _auctioneer), "Already an auctioneer"); _grantRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = true; emit RoleGranted(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function revokeAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { _revokeRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = false; emit RoleRevoked(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function whitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_token != address(0), "Invalid token address"); require(!_whitelistedToken[_token], "Token already whitelisted"); // Additional token validation try IERC20Metadata(_token).decimals() returns (uint8) { _whitelistedToken[_token] = true; _payoutTokens.push(_token); } catch { revert("Invalid ERC20 token"); } } function unwhitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_whitelistedToken[_token], "Token not whitelisted"); _whitelistedToken[_token] = false; emit TokenUnwhitelisted(_token); } function pauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = true; emit ContractPaused(msg.sender); } function unpauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = false; emit ContractUnpaused(msg.sender); } function setFeetoDao(uint32 basePoints) external onlyRole(DEFAULT_ADMIN_ROLE) { require(basePoints <= MAX_FEE, "Fee too high"); uint256 oldFee = feeToDao; feeToDao = basePoints; emit FeeUpdated(oldFee, basePoints); } /*================================= View Functions =================================*/ function getMarketsForQuote(address quoteToken) external view returns(uint256[] memory) { return marketsForQuote[quoteToken]; } function getMarketsForPayout(address payout) external view returns(uint256[] memory) { return marketsForPayout[payout]; } function getMarketsForUser(address user) external view returns(uint256[] memory) { uint256[] memory userMarkets = new uint256[](bondInfo[user].length); for (uint256 i = 0; i < bondInfo[user].length; i++) { userMarkets[i] = bondInfo[user][i].marketId; } return userMarkets; } function isLive(uint256 id_) public view returns (bool) { return block.timestamp <= terms[id_].bondEnds && terms[id_].totalDebt < terms[id_].maxDebt; } function currentMaxPayout(uint256 _id) public view returns (uint256) { Terms memory term = terms[_id]; uint256 remainingDebt = term.maxDebt - term.totalDebt; return (remainingDebt * 1800) / 10000; // 18% of remaining } function bondPrice(uint256 id_) public view returns(uint256) { return _trueBondPrice(id_); } function isAuctioneer(address account) external view returns (bool) { return hasRole(AUCTIONEER_ROLE, account); } function calculateLinearPayout(address user, uint256 _bondId) public view returns (uint256) { Bond memory bond = bondInfo[user][_bondId]; Terms memory term = terms[bond.marketId]; // Check if bond is active if (block.timestamp < bond.startTime) { return 0; } // Calculate total vesting duration uint256 vestingTerm = term.vestingTerm; // Calculate time elapsed since bond start uint256 timeElapsed = block.timestamp > bond.endTime ? vestingTerm : block.timestamp - bond.startTime; // Calculate tokens per second uint256 tokensPerSecond = bond.amountOwed / vestingTerm; // Calculate current claimable amount uint256 currentClaimable = tokensPerSecond * timeElapsed; // Ensure we don't claim more than the total owed if (currentClaimable > bond.amountOwed) { currentClaimable = bond.amountOwed; } return currentClaimable; } function getBondMarketInfo(uint256 marketId) public view returns (BondMarketInfo memory) { Terms storage term = terms[marketId]; return BondMarketInfo({ quoteToken: term.quoteToken, payoutToken: term.payoutToken, price: _trueBondPrice(marketId), maxPayout: currentMaxPayout(marketId), vestingTerm: term.vestingTerm, amountToBond: term.amountToBond, auctioneer: marketsToAuctioneers[marketId], isLive: isLive(marketId), totalDebt: term.totalDebt, bondEnds: term.bondEnds }); } function getBondMarketInfoBatch(uint256[] calldata marketIds) external view returns (BondMarketInfo[] memory) { BondMarketInfo[] memory markets = new BondMarketInfo[](marketIds.length); for (uint256 i = 0; i < marketIds.length; i++) { markets[i] = getBondMarketInfo(marketIds[i]); } return markets; } function payoutFor(address user, uint256 _bondId) public view returns (uint256 amount) { return calculateLinearPayout(user, _bondId); } function isMature(address user, uint256 _bondId) public view returns (bool) { Bond memory bond = bondInfo[user][_bondId]; return block.timestamp >= bond.endTime; } /*================================= Internal Functions =================================*/ function _decayDebt(uint256 _id) internal { Terms storage term = terms[_id]; uint256 currentDebt = term.totalDebt; if (currentDebt == 0) return; uint256 timeSinceLastDecay = block.timestamp - term.lastDecay; if (timeSinceLastDecay == 0) return; uint256 decay = (currentDebt * timeSinceLastDecay) / (term.vestingTerm * 100); term.totalDebt = decay > currentDebt ? 0 : currentDebt - decay; term.lastDecay = uint32(block.timestamp); } function _tune(uint256 _id) internal{ if (block.timestamp > adjustments[_id].lastBlock + adjustments[_id].buffer) { Terms storage term = terms[_id]; if (adjustments[_id].add) { term.controlVariable += adjustments[_id].rate; if (term.controlVariable >= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } else { term.controlVariable -= adjustments[_id].rate; if (term.controlVariable <= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } adjustments[_id].lastBlock = uint32(block.timestamp); } } function _marketPrice(uint256 _id) internal view returns (uint256 price) { Terms memory term = terms[_id]; uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 currentCV = _currentControlVariable(_id); // For 6 decimals token, scalingFactor = 10^30 uint256 scalingFactor = 10 ** (18 + (18 - quoteDecimals)); // Start with a simple calculation using just CV and scaling price = currentCV * scalingFactor / 1e18; require(price > 0, "Price calculation failed"); return price; } function _trueBondPrice(uint256 _id) internal view returns(uint256 price){ price = _marketPrice(_id); } function _debtRatio(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; if (term.quoteTokensRaised == 0) { return 1e18; } uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint8 payoutDecimals = IERC20Metadata(address(term.payoutToken)).decimals(); int8 decimalAdjustment = int8(payoutDecimals) - int8(quoteDecimals); if (decimalAdjustment >= 0) { // If payoutToken has more decimals, scale up quoteTokensRaised uint256 adjustedQuote = term.quoteTokensRaised * (10 ** uint8(decimalAdjustment)); return (term.totalDebt * 1e18) / adjustedQuote; } else { // If quoteToken has more decimals, scale up totalDebt uint256 adjustedDebt = term.totalDebt * (10 ** uint8(-decimalAdjustment)); return (adjustedDebt * 1e18) / term.quoteTokensRaised; } } function _currentControlVariable(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; Adjust memory adjustment = adjustments[_id]; // Start with base control variable uint256 currentCV = term.controlVariable; // If there's no adjustment or CV is 0, return the base CV if (adjustment.rate == 0 || currentCV == 0) { return currentCV; } // Calculate adjustments only if there's an active adjustment uint256 blocksSince = block.timestamp - adjustment.lastBlock; uint256 adjustmentCount = blocksSince / adjustment.buffer; if (adjustmentCount > 0) { uint256 totalAdjustment = adjustment.rate * adjustmentCount; if (adjustment.add) { if (currentCV + totalAdjustment > adjustment.target) { currentCV = adjustment.target; } else { currentCV += totalAdjustment; } } else { if (totalAdjustment >= currentCV || currentCV - totalAdjustment < adjustment.target) { currentCV = adjustment.target; } else { currentCV -= totalAdjustment; } } } return currentCV; } // Helper function for minimum deposit calculation function calculateMinimumDeposit(uint8 decimals) internal pure returns (uint256) { // Ensures meaningful deposit across different token decimal configurations if (decimals > 2) { return 10 ** (decimals - 2); // 1% of smallest token unit } return 1; // Fallback for tokens with very few decimals } // Helper function for precise owed calculation function calculateTotalOwed(uint256 amount, uint256 price) internal pure returns (uint256) { return (amount * 1e18) / price; } function auctioneerHasMarketForQuote(address auctioneer, address quoteToken) public view returns (bool) { uint256[] memory markets = marketsForQuote[quoteToken]; for(uint256 i = 0; i < markets.length; i++) { if(marketsToAuctioneers[markets[i]] == auctioneer && isLive(markets[i])) { return true; } } return false; } modifier whenNotPaused() { require(!paused, "Contract is paused"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_mSig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bool","name":"add","type":"bool"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"target","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buffer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastBlock","type":"uint256"}],"name":"AdjustmentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalOwed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondPrice","type":"uint256"}],"name":"BondDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"BondEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basePoints","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"MarketTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"auctioneer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daoFee","type":"uint256"}],"name":"QuoteTokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenUnwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_auctioneer","type":"address"},{"indexed":false,"internalType":"address","name":"payoutToken","type":"address"}],"name":"addedAuctioneer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"payoutToken","type":"address"},{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialPrice","type":"uint256"}],"name":"newBondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"auctioneer","type":"address"}],"name":"removeAuctioneer","type":"event"},{"inputs":[],"name":"AUCTIONEER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_WHITELISTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payoutTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adjustments","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"}],"name":"auctioneerHasMarketForQuote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bondInfo","outputs":[{"internalType":"address","name":"tokenBonded","type":"address"},{"internalType":"uint256","name":"amountOwed","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"calculateLinearPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"closeBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"currentMaxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeToDao","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getBondMarketInfo","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"marketIds","type":"uint256[]"}],"name":"getBondMarketInfoBatch","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payout","type":"address"}],"name":"getMarketsForPayout","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"}],"name":"getMarketsForQuote","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMarketsForUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"grantAuctioneerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAuctioneer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"isMature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsToAuctioneers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payoutToken_","type":"address"},{"internalType":"contract IERC20","name":"_quoteToken","type":"address"},{"internalType":"uint256[4]","name":"_terms","type":"uint256[4]"},{"internalType":"uint32[2]","name":"_vestingTerms","type":"uint32[2]"}],"name":"newBond","outputs":[{"internalType":"uint256","name":"marketID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amountRedeemed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"revokeAuctioneerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_add","type":"bool"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"basePoints","type":"uint32"}],"name":"setFeetoDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"terms","outputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint256","name":"quoteTokensRaised","type":"uint256"},{"internalType":"uint256","name":"lastDecay","type":"uint256"},{"internalType":"uint32","name":"bondEnds","type":"uint32"},{"internalType":"uint32","name":"vestingTerm","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"transferMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"unwhitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"withdrawQuoteTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561000f575f5ffd5b5060405161457038038061457083398101604081905261002e91610237565b60016002556001600160a01b03811661007f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b6001600160a01b0381166080819052610099905f90610106565b506100cc7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6360805161010660201b60201c565b506100ff7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e60805161010660201b60201c565b505061025d565b5f80610112848461013c565b90508015610133575f84815260016020526040902061013190846101e3565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166101dc575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101943390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610136565b505f610136565b5f610133836001600160a01b0384165f8181526001830160205260408120546101dc57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610136565b5f60208284031215610247575f5ffd5b81516001600160a01b0381168114610133575f5ffd5b6080516142f461027c5f395f81816107c701526120b001526142f45ff3fe608060405234801561000f575f5ffd5b50600436106102c3575f3560e01c80639b299d9a11610177578063c8558f1b116100d5578063d547741f1161008f578063d547741f14610758578063d627d25e1461076b578063d918a16e1461077e578063ddb2924714610787578063ea5e0c601461079a578063ed421a9c146107c2578063f9a64664146107e9575f5ffd5b8063c8558f1b146106e5578063ca15c873146106f8578063cfe9232b1461070b578063d04cffeb1461071f578063d1af1fbc14610732578063d382fe9214610745575f5ffd5b8063b33712c511610131578063b33712c5146105b7578063bc063e1a146105bf578063bc3b2b12146105c8578063be32ee2614610632578063c0680e2014610645578063c0aa0e8a14610658578063c5f0d05c146106d2575f5ffd5b80639b299d9a146105445780639cc84589146105575780639cd85b5b1461056a578063a217fddf1461057d578063a3246ad314610584578063b2f5de94146105a4575f5ffd5b8063439766ce116102245780637bde82f2116101de5780637bde82f2146104715780638ad59c70146104845780638dbdbe6d146104d75780639010d07c146104ea578063909b2bb81461050a57806391d148541461051e57806391de4d0714610531575f5ffd5b8063439766ce1461040f5780635c975abb146104175780636247f6f2146104245780636e76fc8f14610437578063725dafe01461044b5780637b30564e1461045e575f5ffd5b8063172c44ec11610280578063172c44ec146103855780631b014e851461039857806324760807146103ab578063248a9ca3146103b457806327507458146103d65780632f2ff15d146103e957806336568abe146103fc575f5ffd5b806301ffc9a7146102c757806306b40ea3146102ef5780630868335e146103105780630fb81eb4146103305780631227b40214610345578063154347b514610365575b5f5ffd5b6102da6102d5366004613ac4565b6107fc565b60405190151581526020015b60405180910390f35b6103026102fd366004613aff565b610826565b6040519081526020016102e6565b61032361031e366004613b29565b610851565b6040516102e69190613c2e565b61034361033e366004613c71565b610900565b005b610358610353366004613c71565b610a95565b6040516102e69190613c88565b610378610373366004613c97565b610b81565b6040516102e69190613cb2565b610302610393366004613c71565b610bea565b6103786103a6366004613c97565b610bf4565b61030260045481565b6103026103c2366004613c71565b5f9081526020819052604090206001015490565b6102da6103e4366004613c71565b610c5b565b6103436103f7366004613ce9565b610cdf565b61034361040a366004613ce9565b610d09565b610343610d41565b6003546102da9060ff1681565b610343610432366004613c97565b610d92565b6103025f51602061429f5f395f51905f5281565b610343610459366004613ce9565b610f61565b6102da61046c366004613aff565b611080565b61030261047f366004613ce9565b611124565b610497610492366004613aff565b6113b9565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c0016102e6565b6103436104e5366004613d17565b61141e565b6104fd6104f8366004613d4d565b611aa4565b6040516102e69190613d6d565b6103025f51602061427f5f395f51905f5281565b6102da61052c366004613ce9565b611ac2565b6102da61053f366004613d81565b611aea565b610343610552366004613c97565b611be6565b610343610565366004613dad565b611d15565b6102da610578366004613c97565b611ee8565b6103025f81565b610597610592366004613c71565b611f00565b6040516102e69190613df5565b6103436105b2366004613c71565b611f19565b610343612119565b6103026103e881565b6106086105d6366004613c71565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102e6565b610343610640366004613c97565b612167565b610302610653366004613aff565b6121e4565b61066b610666366004613c71565b6121fd565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff90811661012084015216610140820152610160016102e6565b6103436106e0366004613e4d565b61227d565b6103026106f3366004613aff565b61231e565b610302610706366004613c71565b612508565b6103025f51602061425f5f395f51905f5281565b61037861072d366004613c97565b61251e565b6104fd610740366004613c71565b612603565b610302610753366004613c71565b61262b565b610343610766366004613ce9565b612715565b610343610779366004613c97565b612739565b610302600e5481565b610302610795366004613f01565b6127d6565b6104fd6107a8366004613c71565b600a6020525f90815260409020546001600160a01b031681565b6104fd7f000000000000000000000000000000000000000000000000000000000000000081565b6103026107f7366004613aff565b612f7f565b5f6001600160e01b03198216635a05180f60e01b1480610820575061082082612f8a565b92915050565b600c602052815f5260405f20818154811061083f575f80fd5b905f5260205f20015f91509150505481565b60605f826001600160401b0381111561086c5761086c613e66565b6040519080825280602002602001820160405280156108a557816020015b610892613a5e565b81526020019060019003908161088a5790505b5090505f5b838110156108f8576108d38585838181106108c7576108c7613f94565b90506020020135610a95565b8282815181106108e5576108e5613f94565b60209081029190910101526001016108aa565b509392505050565b5f51602061425f5f395f51905f5261091781612fbe565b60035460ff16156109435760405162461bcd60e51b815260040161093a90613fa8565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109985760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b604482015260640161093a565b42600683815481106109ac576109ac613f94565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f600683815481106109ec576109ec613f94565b905f5260205f2090600a02016003015460068481548110610a0f57610a0f613f94565b905f5260205f2090600a020160020154610a299190613fe8565b9050610a66338260068681548110610a4357610a43613f94565b5f91825260209091206001600a9092020101546001600160a01b03169190612fcb565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610a9d613a5e565b5f60068381548110610ab157610ab1613f94565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610af98561302a565b8152602001610b078561262b565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b5885610c5b565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610bde57602002820191905f5260205f20905b815481526020019060010190808311610bca575b50505050509050919050565b5f6108208261302a565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610bde57602002820191905f5260205f2090815481526020019060010190808311610bca5750505050509050919050565b5f60068281548110610c6f57610c6f613f94565b5f91825260209091206009600a90920201015463ffffffff164211801590610820575060068281548110610ca557610ca5613f94565b905f5260205f2090600a02016006015460068381548110610cc857610cc8613f94565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610cf981612fbe565b610d038383613034565b50505050565b6001600160a01b0381163314610d325760405163334bd91960e11b815260040160405180910390fd5b610d3c828261305f565b505050565b5f51602061429f5f395f51905f52610d5881612fbe565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b5f51602061427f5f395f51905f52610da981612fbe565b6001600160a01b038216610df75760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161093a565b6001600160a01b0382165f9081526009602052604090205460ff1615610e5b5760405162461bcd60e51b8152602060048201526019602482015278151bdad95b88185b1c9958591e481dda1a5d195b1a5cdd1959603a1b604482015260640161093a565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610eb5575060408051601f3d908101601f19168201909252610eb291810190613ffb565b60015b610ef75760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b604482015260640161093a565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b03163314610fb95760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b604482015260640161093a565b610fd05f51602061425f5f395f51905f5282611ac2565b61100d5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b604482015260640161093a565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d602052604081208054829190849081106110ac576110ac613f94565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f61112d61308a565b6001600160a01b0382165f908152600d602052604081205490815b80156113ab57806111588161401b565b6001600160a01b0387165f908152600d602052604081208054929450909250908390811061118857611188613f94565b905f5260205f2090600502019050868160030154036113a5575f6111ac878461231e565b905080156113a35780826001015f8282546111c79190613fe8565b909155506111d790508185614030565b93506111f1878260068b81548110610a4357610a43613f94565b81600101545f036113a3576001600160a01b0387165f908152600d602052604090205461122090600190613fe8565b8314611331576001600160a01b0387165f908152600d60205260409020805461124b90600190613fe8565b8154811061125b5761125b613f94565b905f5260205f209060050201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f20848154811061129b5761129b613f94565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d6020526040902080548061135757611357614043565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b50611148565b509150506108206001600255565b600d602052815f5260405f2081815481106113d2575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b61142661308a565b6001600160a01b0381166114735760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b604482015260640161093a565b60065483106114b85760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b604482015260640161093a565b5f600684815481106114cc576114cc613f94565b5f9182526020909120600a90910201600981015490915063ffffffff164211156115295760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b604482015260640161093a565b80600601548160030154106115805760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e642063617061636974792072656163686564000000604482015260640161093a565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156115c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ea9190613ffb565b90505f6115f6826130e1565b9050808510156116485760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c6400604482015260640161093a565b6116518661310c565b61165a8661324e565b5f6116648761330f565b90505f611672846012614057565b61167d90600a614153565b6116879083614161565b61169988670de0b6b3a7640000614180565b6116a39190614161565b90505f612710866003015487600601546116bd9190613fe8565b6116c990610708614180565b6116d39190614161565b9050808211156117255760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f77656400604482015260640161093a565b856006015482876003015461173a9190614030565b11156117845760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81b585e1a5b5d5b48189bdb99081919589d603a1b604482015260640161093a565b85546040516370a0823160e01b81526001600160a01b03909116905f9082906370a08231906117b7903090600401613d6d565b602060405180830381865afa1580156117d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f69190614197565b905061180d6001600160a01b03831633308d6134c4565b6040516370a0823160e01b81525f906001600160a01b038416906370a082319061183b903090600401613d6d565b602060405180830381865afa158015611856573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187a9190614197565b90508a6118878383613fe8565b146118d05760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd081d1c985b9cd9995c88185b5bdd5b9d603a1b604482015260640161093a565b8a60068d815481106118e4576118e4613f94565b905f5260205f2090600a02016007015f8282546119019190614030565b925050819055508460068d8154811061191c5761191c613f94565b905f5260205f2090600a02016003015f8282546119399190614030565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160c08101845260018e01549094168452908301889052908201889052606082018e905263ffffffff42818116608085015260098d015492939260a08401926119ac9291600160201b900416614030565b63ffffffff9081169091528254600181810185555f948552602094859020845160059093020180546001600160a01b039384166001600160a01b0319909116178155948401519085015560408084015160028601556060840151600386015560808401516004909501805460a0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611a89908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d3c6001600255565b5f828152600160205260408120611abb90836134fd565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611b4457602002820191905f5260205f20905b815481526020019060010190808311611b30575b509394505f93505050505b8151811015611bdc57846001600160a01b0316600a5f848481518110611b7757611b77613f94565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611bc45750611bc4828281518110611bb757611bb7613f94565b6020026020010151610c5b565b15611bd457600192505050610820565b600101611b4f565b505f949350505050565b5f611bf081612fbe565b6001600160a01b038216611c435760405162461bcd60e51b815260206004820152601a602482015279496e76616c69642061756374696f6e656572206164647265737360301b604482015260640161093a565b611c5a5f51602061425f5f395f51905f5283611ac2565b15611c9f5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b604482015260640161093a565b611cb65f51602061425f5f395f51905f5283613034565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061425f5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f51602061425f5f395f51905f52611d2c81612fbe565b60035460ff1615611d4f5760405162461bcd60e51b815260040161093a90613fa8565b5f868152600a60205260409020546001600160a01b03163314611d845760405162461bcd60e51b815260040161093a906141ae565b5f8311611dcb5760405162461bcd60e51b81526020600482015260156024820152745461726765742063616e6e6f74206265207a65726f60581b604482015260640161093a565b5f8411611e105760405162461bcd60e51b8152602060048201526013602482015272526174652063616e6e6f74206265207a65726f60681b604482015260640161093a565b6040805160a081018252861515815260208082018781528284018781526060840187815263ffffffff42908116608087019081525f8e81526007909652948790209551865490151560ff1990911617865592516001860155905160028501555160038401559051600490920191909155905187917fca26b9928ef624ce9b23cfafc5e93180097417a4faaac312cc856e8d83f5ba4a91611ed8918991899189918991909415158552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a2505050505050565b5f6108205f51602061425f5f395f51905f5283611ac2565b5f81815260016020526040902060609061082090613508565b5f51602061425f5f395f51905f52611f3081612fbe565b60035460ff1615611f535760405162461bcd60e51b815260040161093a90613fa8565b5f828152600a60205260409020546001600160a01b03163314611f885760405162461bcd60e51b815260040161093a906141ae565b60068281548110611f9b57611f9b613f94565b5f91825260209091206009600a90920201015463ffffffff164211611ffb5760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b604482015260640161093a565b5f6006838154811061200f5761200f613f94565b5f91825260208220600a9091020154600680546001600160a01b039092169350908590811061204057612040613f94565b5f918252602082206007600a909202010154600e549092501561208757612710600e548361206e9190614180565b6120789190614161565b90506120848183613fe8565b91505b61209b6001600160a01b0384163384612fcb565b80156120d5576120d56001600160a01b0384167f000000000000000000000000000000000000000000000000000000000000000083612fcb565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b5f51602061429f5f395f51905f5261213081612fbe565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f61217181612fbe565b6121885f51602061425f5f395f51905f528361305f565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061425f5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f20818154811061083f575f80fd5b6006818154811061220c575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f61228781612fbe565b6103e88263ffffffff1611156122ce5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161093a565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061234a5761234a613f94565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a0830152600680549294509181106123ca576123ca613f94565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b9091048116610140830152918401519092501642101561248a575f92505050610820565b5f81610140015163ffffffff1690505f8360a0015163ffffffff1642116124c55760808401516124c09063ffffffff1642613fe8565b6124c7565b815b90505f8285602001516124da9190614161565b90505f6124e78383614180565b905085602001518111156124fc575060208501515b98975050505050505050565b5f81815260016020526040812061082090613514565b6001600160a01b0381165f908152600d6020526040812054606091906001600160401b0381111561255157612551613e66565b60405190808252806020026020018201604052801561257a578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d60205260409020548110156125fc576001600160a01b0384165f908152600d602052604090208054829081106125c7576125c7613f94565b905f5260205f209060050201600301548282815181106125e9576125e9613f94565b602090810291909101015260010161257f565b5092915050565b60058181548110612612575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061264057612640613f94565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b909104166101408401529193506126f29190613fe8565b905061271061270382610708614180565b61270d9190614161565b949350505050565b5f8281526020819052604090206001015461272f81612fbe565b610d03838361305f565b5f51602061427f5f395f51905f5261275081612fbe565b6001600160a01b0382165f9081526009602052604090205460ff166127875760405162461bcd60e51b815260040161093a906141df565b6001600160a01b0382165f9081526009602052604090819020805460ff19169055517f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06190611074908490613d6d565b5f5f51602061425f5f395f51905f526127ee81612fbe565b60035460ff16156128115760405162461bcd60e51b815260040161093a90613fa8565b6001600160a01b03861661285e5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b604482015260640161093a565b6001600160a01b0385166128aa5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b604482015260640161093a565b856001600160a01b0316856001600160a01b0316036129065760405162461bcd60e51b8152602060048201526018602482015277151bdad95b9cc81b5d5cdd08189948191a5999995c995b9d60421b604482015260640161093a565b6001600160a01b0386165f9081526009602052604090205460ff1661293d5760405162461bcd60e51b815260040161093a906141df565b6129473386611aea565b1561299f5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b606482015260840161093a565b82514263ffffffff909116116129ec5760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b604482015260640161093a565b8351612a2f5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161093a565b6020840151612a805760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e203000000000604482015260640161093a565b6040840151612acd5760405162461bcd60e51b815260206004820152601960248201527804d696e696d756d207072696365206d757374206265203e203603c1b604482015260640161093a565b6060840151612b155760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b604482015260640161093a565b82515f90612b2a90429063ffffffff16613fe8565b90505f8111612b745760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b604482015260640161093a565b5f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bb1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bd59190613ffb565b90505f886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c14573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c389190613ffb565b9050612c683330612c4a84600a614153565b8a51612c569190614180565b6001600160a01b038d169291906134c4565b60408051610160810182526001600160a01b03808b1682528b1660208201526006918101612c9784600a614153565b8a51612ca39190614180565b81525f6020808301919091528a01516040808301919091528a01516060820152608001612cd184600a614153565b60608b0151612ce09190614180565b81526020015f8152602001428152602001885f60028110612d0357612d03613f94565b602002015163ffffffff16815260200188600160028110612d2657612d26613f94565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8b6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612f1f9061420e565b909155506001600160a01b03808a16908b16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978b60016020020151604051612f6a91815260200190565b60405180910390a49998505050505050505050565b5f611abb838361231e565b5f6001600160e01b03198216637965db0b60e01b148061082057506301ffc9a760e01b6001600160e01b0319831614610820565b612fc8813361351d565b50565b6040516001600160a01b03838116602483015260448201839052610d3c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613556565b5f6108208261330f565b5f5f61304084846135b9565b90508015611abb575f8481526001602052604090206108f89084613648565b5f5f61306b848461365c565b90508015611abb575f8481526001602052604090206108f890846136c5565b60028054036130db5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161093a565b60028055565b5f60028260ff161115613104576130f9600283614057565b61082090600a614153565b506001919050565b5f818152600760205260409020600381015460049091015461312e9190614030565b421115612fc8575f6006828154811061314957613149613f94565b5f91825260208083208584526007909152604090922054600a909102909101915060ff16156131d4575f8281526007602052604081206001015460048301805491929091613198908490614030565b90915550505f828152600760205260409020600201546004820154106131cf575f8281526007602052604090206002015460048201555b613231565b5f82815260076020526040812060010154600483018054919290916131fa908490613fe8565b90915550505f82815260076020526040902060020154600482015411613231575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061326257613262613f94565b905f5260205f2090600a020190505f81600301549050805f0361328457505050565b5f8260080154426132959190613fe8565b9050805f036132a45750505050565b60098301545f906132c390600160201b900463ffffffff166064614226565b63ffffffff166132d38385614180565b6132dd9190614161565b90508281116132f5576132f08184613fe8565b6132f7565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061332457613324613f94565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa1580156133fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134209190613ffb565b90505f61342c856136d9565b90505f61343a836012614057565b613445906012614245565b61345090600a614153565b9050670de0b6b3a76400006134658284614180565b61346f9190614161565b94505f85116134bb5760405162461bcd60e51b8152602060048201526018602482015277141c9a58d94818d85b18dd5b185d1a5bdb8819985a5b195960421b604482015260640161093a565b50505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d039186918216906323b872dd90608401612ff8565b5f611abb83836138b9565b60605f611abb836138df565b5f610820825490565b6135278282611ac2565b610f5d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161093a565b5f5f60205f8451602086015f885af180613575576040513d5f823e3d81fd5b50505f513d9150811561358c578060011415613599565b6001600160a01b0384163b155b15610d035783604051635274afe760e01b815260040161093a9190613d6d565b5f6135c48383611ac2565b613641575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556135f93390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610820565b505f610820565b5f611abb836001600160a01b038416613936565b5f6136678383611ac2565b15613641575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610820565b5f611abb836001600160a01b03841661397b565b5f5f600683815481106136ee576136ee613f94565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a529a88902088519788018952805460ff16151588529586015498870189905293850154968601969096529083015490840152920154948101949094525191935015806137ed575080155b156137fa57949350505050565b5f82608001514261380b9190613fe8565b90505f83606001518261381e9190614161565b905080156138ae575f8185602001516138379190614180565b8551909150156138735760408501516138508286614030565b111561386257846040015193506138ac565b61386c8185614030565b93506138ac565b838110158061388e5750604085015161388c8286613fe8565b105b1561389f57846040015193506138ac565b6138a98185613fe8565b93505b505b509095945050505050565b5f825f0182815481106138ce576138ce613f94565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610bde57602002820191905f5260205f2090815481526020019060010190808311610bca5750505050509050919050565b5f81815260018301602052604081205461364157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610820565b5f8181526001830160205260408120548015613a55575f61399d600183613fe8565b85549091505f906139b090600190613fe8565b9050808214613a0f575f865f0182815481106139ce576139ce613f94565b905f5260205f200154905080875f0184815481106139ee576139ee613f94565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613a2057613a20614043565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610820565b5f915050610820565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613ad4575f5ffd5b81356001600160e01b031981168114611abb575f5ffd5b6001600160a01b0381168114612fc8575f5ffd5b5f5f60408385031215613b10575f5ffd5b8235613b1b81613aeb565b946020939093013593505050565b5f5f60208385031215613b3a575f5ffd5b82356001600160401b03811115613b4f575f5ffd5b8301601f81018513613b5f575f5ffd5b80356001600160401b03811115613b74575f5ffd5b8560208260051b8401011115613b88575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613bbf60208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613c0260c08401826001600160a01b03169052565b5060e0810151613c1660e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b818110156138ae57613c5a838551613b98565b602093909301926101409290920191600101613c47565b5f60208284031215613c81575f5ffd5b5035919050565b61014081016108208284613b98565b5f60208284031215613ca7575f5ffd5b8135611abb81613aeb565b602080825282518282018190525f918401906040840190835b818110156138ae578351835260209384019390920191600101613ccb565b5f5f60408385031215613cfa575f5ffd5b823591506020830135613d0c81613aeb565b809150509250929050565b5f5f5f60608486031215613d29575f5ffd5b83359250602084013591506040840135613d4281613aeb565b809150509250925092565b5f5f60408385031215613d5e575f5ffd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f5f60408385031215613d92575f5ffd5b8235613d9d81613aeb565b91506020830135613d0c81613aeb565b5f5f5f5f5f60a08688031215613dc1575f5ffd5b8535945060208601358015158114613dd7575f5ffd5b94979496505050506040830135926060810135926080909101359150565b602080825282518282018190525f918401906040840190835b818110156138ae5783516001600160a01b0316835260209384019390920191600101613e0e565b803563ffffffff81168114613e48575f5ffd5b919050565b5f60208284031215613e5d575f5ffd5b611abb82613e35565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613eae57634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112613ec5575f5ffd5b613ecf6040613e7a565b806040840185811115613ee0575f5ffd5b845b818110156138ae57613ef381613e35565b845260209384019301613ee2565b5f5f5f5f6101008587031215613f15575f5ffd5b8435613f2081613aeb565b93506020850135613f3081613aeb565b9250605f85018613613f40575f5ffd5b613f4a6080613e7a565b8060c0870188811115613f5b575f5ffd5b604088015b81811015613f78578035845260209384019301613f60565b50819450613f868982613eb6565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561082057610820613fd4565b5f6020828403121561400b575f5ffd5b815160ff81168114611abb575f5ffd5b5f8161402957614029613fd4565b505f190190565b8082018082111561082057610820613fd4565b634e487b7160e01b5f52603160045260245ffd5b60ff828116828216039081111561082057610820613fd4565b6001815b60018411156140ab5780850481111561408f5761408f613fd4565b600184161561409d57908102905b60019390931c928002614074565b935093915050565b5f826140c157506001610820565b816140cd57505f610820565b81600181146140e357600281146140ed57614109565b6001915050610820565b60ff8411156140fe576140fe613fd4565b50506001821b610820565b5060208310610133831016604e8410600b841016171561412c575081810a610820565b6141385f198484614070565b805f190482111561414b5761414b613fd4565b029392505050565b5f611abb60ff8416836140b3565b5f8261417b57634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761082057610820613fd4565b5f602082840312156141a7575f5ffd5b5051919050565b6020808252601790820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b604082015260600190565b602080825260159082015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604082015260600190565b5f6001820161421f5761421f613fd4565b5060010190565b63ffffffff81811683821602908116908181146125fc576125fc613fd4565b60ff818116838216019081111561082057610820613fd456fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891d5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a2646970667358221220e1a298af4576db1f678222e4656d0cf572c1aabaf51e49fae71d04d1bd2f4b4a64736f6c634300081b00330000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106102c3575f3560e01c80639b299d9a11610177578063c8558f1b116100d5578063d547741f1161008f578063d547741f14610758578063d627d25e1461076b578063d918a16e1461077e578063ddb2924714610787578063ea5e0c601461079a578063ed421a9c146107c2578063f9a64664146107e9575f5ffd5b8063c8558f1b146106e5578063ca15c873146106f8578063cfe9232b1461070b578063d04cffeb1461071f578063d1af1fbc14610732578063d382fe9214610745575f5ffd5b8063b33712c511610131578063b33712c5146105b7578063bc063e1a146105bf578063bc3b2b12146105c8578063be32ee2614610632578063c0680e2014610645578063c0aa0e8a14610658578063c5f0d05c146106d2575f5ffd5b80639b299d9a146105445780639cc84589146105575780639cd85b5b1461056a578063a217fddf1461057d578063a3246ad314610584578063b2f5de94146105a4575f5ffd5b8063439766ce116102245780637bde82f2116101de5780637bde82f2146104715780638ad59c70146104845780638dbdbe6d146104d75780639010d07c146104ea578063909b2bb81461050a57806391d148541461051e57806391de4d0714610531575f5ffd5b8063439766ce1461040f5780635c975abb146104175780636247f6f2146104245780636e76fc8f14610437578063725dafe01461044b5780637b30564e1461045e575f5ffd5b8063172c44ec11610280578063172c44ec146103855780631b014e851461039857806324760807146103ab578063248a9ca3146103b457806327507458146103d65780632f2ff15d146103e957806336568abe146103fc575f5ffd5b806301ffc9a7146102c757806306b40ea3146102ef5780630868335e146103105780630fb81eb4146103305780631227b40214610345578063154347b514610365575b5f5ffd5b6102da6102d5366004613ac4565b6107fc565b60405190151581526020015b60405180910390f35b6103026102fd366004613aff565b610826565b6040519081526020016102e6565b61032361031e366004613b29565b610851565b6040516102e69190613c2e565b61034361033e366004613c71565b610900565b005b610358610353366004613c71565b610a95565b6040516102e69190613c88565b610378610373366004613c97565b610b81565b6040516102e69190613cb2565b610302610393366004613c71565b610bea565b6103786103a6366004613c97565b610bf4565b61030260045481565b6103026103c2366004613c71565b5f9081526020819052604090206001015490565b6102da6103e4366004613c71565b610c5b565b6103436103f7366004613ce9565b610cdf565b61034361040a366004613ce9565b610d09565b610343610d41565b6003546102da9060ff1681565b610343610432366004613c97565b610d92565b6103025f51602061429f5f395f51905f5281565b610343610459366004613ce9565b610f61565b6102da61046c366004613aff565b611080565b61030261047f366004613ce9565b611124565b610497610492366004613aff565b6113b9565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c0016102e6565b6103436104e5366004613d17565b61141e565b6104fd6104f8366004613d4d565b611aa4565b6040516102e69190613d6d565b6103025f51602061427f5f395f51905f5281565b6102da61052c366004613ce9565b611ac2565b6102da61053f366004613d81565b611aea565b610343610552366004613c97565b611be6565b610343610565366004613dad565b611d15565b6102da610578366004613c97565b611ee8565b6103025f81565b610597610592366004613c71565b611f00565b6040516102e69190613df5565b6103436105b2366004613c71565b611f19565b610343612119565b6103026103e881565b6106086105d6366004613c71565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102e6565b610343610640366004613c97565b612167565b610302610653366004613aff565b6121e4565b61066b610666366004613c71565b6121fd565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff90811661012084015216610140820152610160016102e6565b6103436106e0366004613e4d565b61227d565b6103026106f3366004613aff565b61231e565b610302610706366004613c71565b612508565b6103025f51602061425f5f395f51905f5281565b61037861072d366004613c97565b61251e565b6104fd610740366004613c71565b612603565b610302610753366004613c71565b61262b565b610343610766366004613ce9565b612715565b610343610779366004613c97565b612739565b610302600e5481565b610302610795366004613f01565b6127d6565b6104fd6107a8366004613c71565b600a6020525f90815260409020546001600160a01b031681565b6104fd7f0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a581565b6103026107f7366004613aff565b612f7f565b5f6001600160e01b03198216635a05180f60e01b1480610820575061082082612f8a565b92915050565b600c602052815f5260405f20818154811061083f575f80fd5b905f5260205f20015f91509150505481565b60605f826001600160401b0381111561086c5761086c613e66565b6040519080825280602002602001820160405280156108a557816020015b610892613a5e565b81526020019060019003908161088a5790505b5090505f5b838110156108f8576108d38585838181106108c7576108c7613f94565b90506020020135610a95565b8282815181106108e5576108e5613f94565b60209081029190910101526001016108aa565b509392505050565b5f51602061425f5f395f51905f5261091781612fbe565b60035460ff16156109435760405162461bcd60e51b815260040161093a90613fa8565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109985760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b604482015260640161093a565b42600683815481106109ac576109ac613f94565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f600683815481106109ec576109ec613f94565b905f5260205f2090600a02016003015460068481548110610a0f57610a0f613f94565b905f5260205f2090600a020160020154610a299190613fe8565b9050610a66338260068681548110610a4357610a43613f94565b5f91825260209091206001600a9092020101546001600160a01b03169190612fcb565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610a9d613a5e565b5f60068381548110610ab157610ab1613f94565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610af98561302a565b8152602001610b078561262b565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b5885610c5b565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610bde57602002820191905f5260205f20905b815481526020019060010190808311610bca575b50505050509050919050565b5f6108208261302a565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610bde57602002820191905f5260205f2090815481526020019060010190808311610bca5750505050509050919050565b5f60068281548110610c6f57610c6f613f94565b5f91825260209091206009600a90920201015463ffffffff164211801590610820575060068281548110610ca557610ca5613f94565b905f5260205f2090600a02016006015460068381548110610cc857610cc8613f94565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610cf981612fbe565b610d038383613034565b50505050565b6001600160a01b0381163314610d325760405163334bd91960e11b815260040160405180910390fd5b610d3c828261305f565b505050565b5f51602061429f5f395f51905f52610d5881612fbe565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b5f51602061427f5f395f51905f52610da981612fbe565b6001600160a01b038216610df75760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161093a565b6001600160a01b0382165f9081526009602052604090205460ff1615610e5b5760405162461bcd60e51b8152602060048201526019602482015278151bdad95b88185b1c9958591e481dda1a5d195b1a5cdd1959603a1b604482015260640161093a565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610eb5575060408051601f3d908101601f19168201909252610eb291810190613ffb565b60015b610ef75760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b604482015260640161093a565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b03163314610fb95760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b604482015260640161093a565b610fd05f51602061425f5f395f51905f5282611ac2565b61100d5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b604482015260640161093a565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d602052604081208054829190849081106110ac576110ac613f94565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f61112d61308a565b6001600160a01b0382165f908152600d602052604081205490815b80156113ab57806111588161401b565b6001600160a01b0387165f908152600d602052604081208054929450909250908390811061118857611188613f94565b905f5260205f2090600502019050868160030154036113a5575f6111ac878461231e565b905080156113a35780826001015f8282546111c79190613fe8565b909155506111d790508185614030565b93506111f1878260068b81548110610a4357610a43613f94565b81600101545f036113a3576001600160a01b0387165f908152600d602052604090205461122090600190613fe8565b8314611331576001600160a01b0387165f908152600d60205260409020805461124b90600190613fe8565b8154811061125b5761125b613f94565b905f5260205f209060050201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f20848154811061129b5761129b613f94565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d6020526040902080548061135757611357614043565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b50611148565b509150506108206001600255565b600d602052815f5260405f2081815481106113d2575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b61142661308a565b6001600160a01b0381166114735760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b604482015260640161093a565b60065483106114b85760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b604482015260640161093a565b5f600684815481106114cc576114cc613f94565b5f9182526020909120600a90910201600981015490915063ffffffff164211156115295760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b604482015260640161093a565b80600601548160030154106115805760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e642063617061636974792072656163686564000000604482015260640161093a565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156115c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ea9190613ffb565b90505f6115f6826130e1565b9050808510156116485760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c6400604482015260640161093a565b6116518661310c565b61165a8661324e565b5f6116648761330f565b90505f611672846012614057565b61167d90600a614153565b6116879083614161565b61169988670de0b6b3a7640000614180565b6116a39190614161565b90505f612710866003015487600601546116bd9190613fe8565b6116c990610708614180565b6116d39190614161565b9050808211156117255760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f77656400604482015260640161093a565b856006015482876003015461173a9190614030565b11156117845760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81b585e1a5b5d5b48189bdb99081919589d603a1b604482015260640161093a565b85546040516370a0823160e01b81526001600160a01b03909116905f9082906370a08231906117b7903090600401613d6d565b602060405180830381865afa1580156117d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f69190614197565b905061180d6001600160a01b03831633308d6134c4565b6040516370a0823160e01b81525f906001600160a01b038416906370a082319061183b903090600401613d6d565b602060405180830381865afa158015611856573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187a9190614197565b90508a6118878383613fe8565b146118d05760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd081d1c985b9cd9995c88185b5bdd5b9d603a1b604482015260640161093a565b8a60068d815481106118e4576118e4613f94565b905f5260205f2090600a02016007015f8282546119019190614030565b925050819055508460068d8154811061191c5761191c613f94565b905f5260205f2090600a02016003015f8282546119399190614030565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160c08101845260018e01549094168452908301889052908201889052606082018e905263ffffffff42818116608085015260098d015492939260a08401926119ac9291600160201b900416614030565b63ffffffff9081169091528254600181810185555f948552602094859020845160059093020180546001600160a01b039384166001600160a01b0319909116178155948401519085015560408084015160028601556060840151600386015560808401516004909501805460a0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611a89908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d3c6001600255565b5f828152600160205260408120611abb90836134fd565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611b4457602002820191905f5260205f20905b815481526020019060010190808311611b30575b509394505f93505050505b8151811015611bdc57846001600160a01b0316600a5f848481518110611b7757611b77613f94565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611bc45750611bc4828281518110611bb757611bb7613f94565b6020026020010151610c5b565b15611bd457600192505050610820565b600101611b4f565b505f949350505050565b5f611bf081612fbe565b6001600160a01b038216611c435760405162461bcd60e51b815260206004820152601a602482015279496e76616c69642061756374696f6e656572206164647265737360301b604482015260640161093a565b611c5a5f51602061425f5f395f51905f5283611ac2565b15611c9f5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b604482015260640161093a565b611cb65f51602061425f5f395f51905f5283613034565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061425f5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f51602061425f5f395f51905f52611d2c81612fbe565b60035460ff1615611d4f5760405162461bcd60e51b815260040161093a90613fa8565b5f868152600a60205260409020546001600160a01b03163314611d845760405162461bcd60e51b815260040161093a906141ae565b5f8311611dcb5760405162461bcd60e51b81526020600482015260156024820152745461726765742063616e6e6f74206265207a65726f60581b604482015260640161093a565b5f8411611e105760405162461bcd60e51b8152602060048201526013602482015272526174652063616e6e6f74206265207a65726f60681b604482015260640161093a565b6040805160a081018252861515815260208082018781528284018781526060840187815263ffffffff42908116608087019081525f8e81526007909652948790209551865490151560ff1990911617865592516001860155905160028501555160038401559051600490920191909155905187917fca26b9928ef624ce9b23cfafc5e93180097417a4faaac312cc856e8d83f5ba4a91611ed8918991899189918991909415158552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a2505050505050565b5f6108205f51602061425f5f395f51905f5283611ac2565b5f81815260016020526040902060609061082090613508565b5f51602061425f5f395f51905f52611f3081612fbe565b60035460ff1615611f535760405162461bcd60e51b815260040161093a90613fa8565b5f828152600a60205260409020546001600160a01b03163314611f885760405162461bcd60e51b815260040161093a906141ae565b60068281548110611f9b57611f9b613f94565b5f91825260209091206009600a90920201015463ffffffff164211611ffb5760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b604482015260640161093a565b5f6006838154811061200f5761200f613f94565b5f91825260208220600a9091020154600680546001600160a01b039092169350908590811061204057612040613f94565b5f918252602082206007600a909202010154600e549092501561208757612710600e548361206e9190614180565b6120789190614161565b90506120848183613fe8565b91505b61209b6001600160a01b0384163384612fcb565b80156120d5576120d56001600160a01b0384167f0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a583612fcb565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b5f51602061429f5f395f51905f5261213081612fbe565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f61217181612fbe565b6121885f51602061425f5f395f51905f528361305f565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061425f5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f20818154811061083f575f80fd5b6006818154811061220c575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f61228781612fbe565b6103e88263ffffffff1611156122ce5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161093a565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061234a5761234a613f94565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a0830152600680549294509181106123ca576123ca613f94565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b9091048116610140830152918401519092501642101561248a575f92505050610820565b5f81610140015163ffffffff1690505f8360a0015163ffffffff1642116124c55760808401516124c09063ffffffff1642613fe8565b6124c7565b815b90505f8285602001516124da9190614161565b90505f6124e78383614180565b905085602001518111156124fc575060208501515b98975050505050505050565b5f81815260016020526040812061082090613514565b6001600160a01b0381165f908152600d6020526040812054606091906001600160401b0381111561255157612551613e66565b60405190808252806020026020018201604052801561257a578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d60205260409020548110156125fc576001600160a01b0384165f908152600d602052604090208054829081106125c7576125c7613f94565b905f5260205f209060050201600301548282815181106125e9576125e9613f94565b602090810291909101015260010161257f565b5092915050565b60058181548110612612575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061264057612640613f94565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b909104166101408401529193506126f29190613fe8565b905061271061270382610708614180565b61270d9190614161565b949350505050565b5f8281526020819052604090206001015461272f81612fbe565b610d03838361305f565b5f51602061427f5f395f51905f5261275081612fbe565b6001600160a01b0382165f9081526009602052604090205460ff166127875760405162461bcd60e51b815260040161093a906141df565b6001600160a01b0382165f9081526009602052604090819020805460ff19169055517f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06190611074908490613d6d565b5f5f51602061425f5f395f51905f526127ee81612fbe565b60035460ff16156128115760405162461bcd60e51b815260040161093a90613fa8565b6001600160a01b03861661285e5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b604482015260640161093a565b6001600160a01b0385166128aa5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b604482015260640161093a565b856001600160a01b0316856001600160a01b0316036129065760405162461bcd60e51b8152602060048201526018602482015277151bdad95b9cc81b5d5cdd08189948191a5999995c995b9d60421b604482015260640161093a565b6001600160a01b0386165f9081526009602052604090205460ff1661293d5760405162461bcd60e51b815260040161093a906141df565b6129473386611aea565b1561299f5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b606482015260840161093a565b82514263ffffffff909116116129ec5760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b604482015260640161093a565b8351612a2f5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161093a565b6020840151612a805760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e203000000000604482015260640161093a565b6040840151612acd5760405162461bcd60e51b815260206004820152601960248201527804d696e696d756d207072696365206d757374206265203e203603c1b604482015260640161093a565b6060840151612b155760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b604482015260640161093a565b82515f90612b2a90429063ffffffff16613fe8565b90505f8111612b745760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b604482015260640161093a565b5f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bb1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bd59190613ffb565b90505f886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c14573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c389190613ffb565b9050612c683330612c4a84600a614153565b8a51612c569190614180565b6001600160a01b038d169291906134c4565b60408051610160810182526001600160a01b03808b1682528b1660208201526006918101612c9784600a614153565b8a51612ca39190614180565b81525f6020808301919091528a01516040808301919091528a01516060820152608001612cd184600a614153565b60608b0151612ce09190614180565b81526020015f8152602001428152602001885f60028110612d0357612d03613f94565b602002015163ffffffff16815260200188600160028110612d2657612d26613f94565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8b6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612f1f9061420e565b909155506001600160a01b03808a16908b16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978b60016020020151604051612f6a91815260200190565b60405180910390a49998505050505050505050565b5f611abb838361231e565b5f6001600160e01b03198216637965db0b60e01b148061082057506301ffc9a760e01b6001600160e01b0319831614610820565b612fc8813361351d565b50565b6040516001600160a01b03838116602483015260448201839052610d3c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613556565b5f6108208261330f565b5f5f61304084846135b9565b90508015611abb575f8481526001602052604090206108f89084613648565b5f5f61306b848461365c565b90508015611abb575f8481526001602052604090206108f890846136c5565b60028054036130db5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161093a565b60028055565b5f60028260ff161115613104576130f9600283614057565b61082090600a614153565b506001919050565b5f818152600760205260409020600381015460049091015461312e9190614030565b421115612fc8575f6006828154811061314957613149613f94565b5f91825260208083208584526007909152604090922054600a909102909101915060ff16156131d4575f8281526007602052604081206001015460048301805491929091613198908490614030565b90915550505f828152600760205260409020600201546004820154106131cf575f8281526007602052604090206002015460048201555b613231565b5f82815260076020526040812060010154600483018054919290916131fa908490613fe8565b90915550505f82815260076020526040902060020154600482015411613231575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061326257613262613f94565b905f5260205f2090600a020190505f81600301549050805f0361328457505050565b5f8260080154426132959190613fe8565b9050805f036132a45750505050565b60098301545f906132c390600160201b900463ffffffff166064614226565b63ffffffff166132d38385614180565b6132dd9190614161565b90508281116132f5576132f08184613fe8565b6132f7565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061332457613324613f94565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa1580156133fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134209190613ffb565b90505f61342c856136d9565b90505f61343a836012614057565b613445906012614245565b61345090600a614153565b9050670de0b6b3a76400006134658284614180565b61346f9190614161565b94505f85116134bb5760405162461bcd60e51b8152602060048201526018602482015277141c9a58d94818d85b18dd5b185d1a5bdb8819985a5b195960421b604482015260640161093a565b50505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d039186918216906323b872dd90608401612ff8565b5f611abb83836138b9565b60605f611abb836138df565b5f610820825490565b6135278282611ac2565b610f5d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161093a565b5f5f60205f8451602086015f885af180613575576040513d5f823e3d81fd5b50505f513d9150811561358c578060011415613599565b6001600160a01b0384163b155b15610d035783604051635274afe760e01b815260040161093a9190613d6d565b5f6135c48383611ac2565b613641575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556135f93390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610820565b505f610820565b5f611abb836001600160a01b038416613936565b5f6136678383611ac2565b15613641575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610820565b5f611abb836001600160a01b03841661397b565b5f5f600683815481106136ee576136ee613f94565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a529a88902088519788018952805460ff16151588529586015498870189905293850154968601969096529083015490840152920154948101949094525191935015806137ed575080155b156137fa57949350505050565b5f82608001514261380b9190613fe8565b90505f83606001518261381e9190614161565b905080156138ae575f8185602001516138379190614180565b8551909150156138735760408501516138508286614030565b111561386257846040015193506138ac565b61386c8185614030565b93506138ac565b838110158061388e5750604085015161388c8286613fe8565b105b1561389f57846040015193506138ac565b6138a98185613fe8565b93505b505b509095945050505050565b5f825f0182815481106138ce576138ce613f94565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610bde57602002820191905f5260205f2090815481526020019060010190808311610bca5750505050509050919050565b5f81815260018301602052604081205461364157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610820565b5f8181526001830160205260408120548015613a55575f61399d600183613fe8565b85549091505f906139b090600190613fe8565b9050808214613a0f575f865f0182815481106139ce576139ce613f94565b905f5260205f200154905080875f0184815481106139ee576139ee613f94565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613a2057613a20614043565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610820565b5f915050610820565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613ad4575f5ffd5b81356001600160e01b031981168114611abb575f5ffd5b6001600160a01b0381168114612fc8575f5ffd5b5f5f60408385031215613b10575f5ffd5b8235613b1b81613aeb565b946020939093013593505050565b5f5f60208385031215613b3a575f5ffd5b82356001600160401b03811115613b4f575f5ffd5b8301601f81018513613b5f575f5ffd5b80356001600160401b03811115613b74575f5ffd5b8560208260051b8401011115613b88575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613bbf60208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613c0260c08401826001600160a01b03169052565b5060e0810151613c1660e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b818110156138ae57613c5a838551613b98565b602093909301926101409290920191600101613c47565b5f60208284031215613c81575f5ffd5b5035919050565b61014081016108208284613b98565b5f60208284031215613ca7575f5ffd5b8135611abb81613aeb565b602080825282518282018190525f918401906040840190835b818110156138ae578351835260209384019390920191600101613ccb565b5f5f60408385031215613cfa575f5ffd5b823591506020830135613d0c81613aeb565b809150509250929050565b5f5f5f60608486031215613d29575f5ffd5b83359250602084013591506040840135613d4281613aeb565b809150509250925092565b5f5f60408385031215613d5e575f5ffd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f5f60408385031215613d92575f5ffd5b8235613d9d81613aeb565b91506020830135613d0c81613aeb565b5f5f5f5f5f60a08688031215613dc1575f5ffd5b8535945060208601358015158114613dd7575f5ffd5b94979496505050506040830135926060810135926080909101359150565b602080825282518282018190525f918401906040840190835b818110156138ae5783516001600160a01b0316835260209384019390920191600101613e0e565b803563ffffffff81168114613e48575f5ffd5b919050565b5f60208284031215613e5d575f5ffd5b611abb82613e35565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613eae57634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112613ec5575f5ffd5b613ecf6040613e7a565b806040840185811115613ee0575f5ffd5b845b818110156138ae57613ef381613e35565b845260209384019301613ee2565b5f5f5f5f6101008587031215613f15575f5ffd5b8435613f2081613aeb565b93506020850135613f3081613aeb565b9250605f85018613613f40575f5ffd5b613f4a6080613e7a565b8060c0870188811115613f5b575f5ffd5b604088015b81811015613f78578035845260209384019301613f60565b50819450613f868982613eb6565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561082057610820613fd4565b5f6020828403121561400b575f5ffd5b815160ff81168114611abb575f5ffd5b5f8161402957614029613fd4565b505f190190565b8082018082111561082057610820613fd4565b634e487b7160e01b5f52603160045260245ffd5b60ff828116828216039081111561082057610820613fd4565b6001815b60018411156140ab5780850481111561408f5761408f613fd4565b600184161561409d57908102905b60019390931c928002614074565b935093915050565b5f826140c157506001610820565b816140cd57505f610820565b81600181146140e357600281146140ed57614109565b6001915050610820565b60ff8411156140fe576140fe613fd4565b50506001821b610820565b5060208310610133831016604e8410600b841016171561412c575081810a610820565b6141385f198484614070565b805f190482111561414b5761414b613fd4565b029392505050565b5f611abb60ff8416836140b3565b5f8261417b57634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761082057610820613fd4565b5f602082840312156141a7575f5ffd5b5051919050565b6020808252601790820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b604082015260600190565b602080825260159082015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604082015260600190565b5f6001820161421f5761421f613fd4565b5060010190565b63ffffffff81811683821602908116908181146125fc576125fc613fd4565b60ff818116838216019081111561082057610820613fd456fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891d5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a2646970667358221220e1a298af4576db1f678222e4656d0cf572c1aabaf51e49fae71d04d1bd2f4b4a64736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
-----Decoded View---------------
Arg [0] : _mSig (address): 0x5B14Cc6b2a36a7c36dE709775252855d0563E0A5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
Deployed Bytecode Sourcemap
50569:23561:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44115:214;;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;44115:214:0;;;;;;;;52415:53;;;;;;:::i;:::-;;:::i;:::-;;;1247:25:1;;;1235:2;1220:18;52415:53:0;1101:177:1;67965:342:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57310:393::-;;;;;;:::i;:::-;;:::i;:::-;;67309:648;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65029:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66086:107::-;;;;;;:::i;:::-;;:::i;65179:138::-;;;;;;:::i;:::-;;:::i;52037:28::-;;;;;;27188:122;;;;;;:::i;:::-;27253:7;27280:12;;;;;;;;;;:22;;;;27188:122;65654:162;;;;;;:::i;:::-;;:::i;27620:138::-;;;;;;:::i;:::-;;:::i;28757:251::-;;;;;;:::i;:::-;;:::i;64316:165::-;;;:::i;50934:18::-;;;;;;;;;63536:525;;;;;;:::i;:::-;;:::i;50845:80::-;;-1:-1:-1;;;;;;;;;;;50845:80:0;;58431:350;;;;;;:::i;:::-;;:::i;68461:174::-;;;;;;:::i;:::-;;:::i;61538:1074::-;;;;;;:::i;:::-;;:::i;52475:43::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6339:32:1;;;6321:51;;6403:2;6388:18;;6381:34;;;;6431:18;;;6424:34;;;;6489:2;6474:18;;6467:34;6550:10;6538:23;;;6532:3;6517:19;;6510:52;6599:23;6359:3;6578:19;;6571:52;6308:3;6293:19;52475:43:0;6038:591:1;59707:1823:0;;;;;;:::i;:::-;;:::i;44928:144::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50754:84::-;;-1:-1:-1;;;;;;;;;;;50754:84:0;;26204:138;;;;;;:::i;:::-;;:::i;73636:375::-;;;;;;:::i;:::-;;:::i;62732:489::-;;;;;;:::i;:::-;;:::i;58790:790::-;;;;;;:::i;:::-;;:::i;66205:127::-;;;;;;:::i;:::-;;:::i;25516:49::-;;25561:4;25516:49;;45932:138;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57709:710::-;;;;;;:::i;:::-;;:::i;64489:170::-;;;:::i;52592:38::-;;52626:4;52592:38;;52137:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9760:14:1;;9753:22;9735:41;;9807:2;9792:18;;9785:34;;;;9835:18;;;9828:34;;;;9893:2;9878:18;;9871:34;9936:3;9921:19;;9914:35;9722:3;9707:19;52137:45:0;9482:473:1;63229:298:0;;;;;;:::i;:::-;;:::i;52356:52::-;;;;;;:::i;:::-;;:::i;52110:20::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10402:32:1;;;10384:51;;10471:32;;;;10466:2;10451:18;;10444:60;10520:18;;;10513:34;;;;10578:2;10563:18;;10556:34;;;;10621:3;10606:19;;10599:35;;;;10422:3;10650:19;;10643:35;;;;10709:3;10694:19;;10687:35;10753:3;10738:19;;10731:35;10797:3;10782:19;;10775:35;10859:10;10847:23;;;10841:3;10826:19;;10819:52;10908:24;10902:3;10887:19;;10880:53;10371:3;10356:19;52110:20:0;9960:979:1;64666:237:0;;;;;;:::i;:::-;;:::i;66340:959::-;;;;;;:::i;:::-;;:::i;45246:133::-;;;;;;:::i;:::-;;:::i;50677:70::-;;-1:-1:-1;;;;;;;;;;;50677:70:0;;65325:316;;;;;;:::i;:::-;;:::i;52072:31::-;;;;;;:::i;:::-;;:::i;65830:244::-;;;;;;:::i;:::-;;:::i;28051:140::-;;;;;;:::i;:::-;;:::i;64069:232::-;;;;;;:::i;:::-;;:::i;52562:23::-;;;;;;54824:2477;;;;;;:::i;:::-;;:::i;52294:55::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;52294:55:0;;;52526:29;;;;;68313:141;;;;;;:::i;:::-;;:::i;44115:214::-;44200:4;-1:-1:-1;;;;;;44224:57:0;;-1:-1:-1;;;44224:57:0;;:97;;;44285:36;44309:11;44285:23;:36::i;:::-;44217:104;44115:214;-1:-1:-1;;44115:214:0:o;52415:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67965:342::-;68050:23;68082:31;68137:9;-1:-1:-1;;;;;68116:38:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;68082:72:0;-1:-1:-1;68172:9:0;68167:110;68187:20;;;68167:110;;;68238:31;68256:9;;68266:1;68256:12;;;;;;;:::i;:::-;;;;;;;68238:17;:31::i;:::-;68225:7;68233:1;68225:10;;;;;;;;:::i;:::-;;;;;;;;;;:44;68209:3;;68167:110;;;-1:-1:-1;68296:7:0;67965:342;-1:-1:-1;;;67965:342:0:o;57310:393::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;74070:6:::1;::::0;::::1;;74069:7;74061:38;;;;-1:-1:-1::0;;;74061:38:0::1;;;;;;;:::i;:::-;;;;;;;;;57402:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57402:25:0::2;57431:10;57402:39;57398:69;;57443:24;::::0;-1:-1:-1;;;57443:24:0;;14182:2:1;57443:24:0::2;::::0;::::2;14164:21:1::0;14221:2;14201:18;;;14194:30;-1:-1:-1;;;14240:18:1;;;14233:43;14293:18;;57443:24:0::2;13980:337:1::0;57398:69:0::2;57503:15;57474:5;57480:3;57474:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:45;;;;;;;;;;;;;;;;;;57528:18;57575:5;57581:3;57575:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;57549:5;57555:3;57549:10;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:46;;;;:::i;:::-;57528:67;;57604;57648:10;57660;57611:5;57617:3;57611:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:22:::2;:10;::::0;;::::2;;:22;::::0;-1:-1:-1;;;;;57611:22:0::2;::::0;57604:67;:43:::2;:67::i;:::-;57685:14;::::0;57695:3;;57685:14:::2;::::0;;;::::2;57391:312;57310:393:::0;;:::o;67309:648::-;67375:21;;:::i;:::-;67409:18;67430:5;67436:8;67430:15;;;;;;;;:::i;:::-;;;;;;;;;;67473:476;;;;;;;;67430:15;;;;;;;67515;;-1:-1:-1;;;;;67515:15:0;;;67473:476;;67515:15;67558:16;;;;67473:476;;;;;;;67430:15;;-1:-1:-1;67473:476:0;;;67596:24;67611:8;67596:14;:24::i;:::-;67473:476;;;;67646:26;67663:8;67646:16;:26::i;:::-;67473:476;;67700:16;;;;-1:-1:-1;;;67700:16:0;;;;67473:476;;;;;;;;67746:17;;;;67473:476;;;;;;;;-1:-1:-1;67790:30:0;;;:20;:30;;;;;;-1:-1:-1;;;;;67790:30:0;67473:476;;;;;;67843:16;67790:30;67843:6;:16::i;:::-;67473:476;;;;67885:14;;;;67473:476;;;;67924:13;;;;;;;67473:476;;;;;;;;67466:483;67309:648;-1:-1:-1;;67309:648:0:o;65029:142::-;-1:-1:-1;;;;;65136:27:0;;;;;;:15;:27;;;;;;;;;65129:34;;;;;;;;;;;;;;;;;65099:16;;65129:34;;;65136:27;65129:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65029:142;;;:::o;66086:107::-;66138:7;66166:19;66181:3;66166:14;:19::i;65179:138::-;-1:-1:-1;;;;;65285:24:0;;;;;;:16;:24;;;;;;;;;65278:31;;;;;;;;;;;;;;;;;65246:16;;65278:31;;;65285:24;65278:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65179:138;;;:::o;65654:162::-;65704:4;65748:5;65754:3;65748:10;;;;;;;;:::i;:::-;;;;;;;;;:19;:10;;;;;:19;;;;65729:15;:38;;;;:83;;;65794:5;65800:3;65794:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;65771:5;65777:3;65771:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:41;65722:90;65654:162;-1:-1:-1;;65654:162:0:o;27620:138::-;27253:7;27280:12;;;;;;;;;;:22;;;25800:16;25811:4;25800:10;:16::i;:::-;27725:25:::1;27736:4;27742:7;27725:10;:25::i;:::-;;27620:138:::0;;;:::o;28757:251::-;-1:-1:-1;;;;;28851:34:0;;22507:10;28851:34;28847:104;;28909:30;;-1:-1:-1;;;28909:30:0;;;;;;;;;;;28847:104;28963:37;28975:4;28981:18;28963:11;:37::i;:::-;;28757:251;;:::o;64316:165::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;64418:6:::1;:13:::0;;-1:-1:-1;;64418:13:0::1;64427:4;64418:13;::::0;;64447:26:::1;::::0;64462:10:::1;::::0;64447:26:::1;::::0;64418:6:::1;::::0;64447:26:::1;64316:165:::0;:::o;63536:525::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;-1:-1:-1;;;;;63663:20:0;::::1;63655:54;;;::::0;-1:-1:-1;;;63655:54:0;;14789:2:1;63655:54:0::1;::::0;::::1;14771:21:1::0;14828:2;14808:18;;;14801:30;-1:-1:-1;;;14847:18:1;;;14840:51;14908:18;;63655:54:0::1;14587:345:1::0;63655:54:0::1;-1:-1:-1::0;;;;;63729:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;63728:26;63720:64;;;::::0;-1:-1:-1;;;63720:64:0;;15139:2:1;63720:64:0::1;::::0;::::1;15121:21:1::0;15178:2;15158:18;;;15151:30;-1:-1:-1;;;15197:18:1;;;15190:55;15262:18;;63720:64:0::1;14937:349:1::0;63720:64:0::1;63856:6;-1:-1:-1::0;;;;;63841:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;63841:33:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;63841:33:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;63837:217;;64013:29;::::0;-1:-1:-1;;;64013:29:0;;15771:2:1;64013:29:0::1;::::0;::::1;15753:21:1::0;15810:2;15790:18;;;15783:30;-1:-1:-1;;;15829:18:1;;;15822:49;15888:18;;64013:29:0::1;15569:343:1::0;63837:217:0::1;-1:-1:-1::0;;;;;;63906:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;:32;;-1:-1:-1;;63906:32:0::1;63934:4;63906:32:::0;;::::1;::::0;;;63953:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;63953:26:0::1;::::0;;::::1;::::0;;63837:217:::1;63536:525:::0;;:::o;58431:350::-;58520:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;58520:30:0;58554:10;58520:44;58512:73;;;;-1:-1:-1;;;58512:73:0;;16119:2:1;58512:73:0;;;16101:21:1;16158:2;16138:18;;;16131:30;-1:-1:-1;;;16177:18:1;;;16170:46;16233:18;;58512:73:0;15917:340:1;58512:73:0;58600:39;-1:-1:-1;;;;;;;;;;;58625:13:0;58600:7;:39::i;:::-;58592:66;;;;-1:-1:-1;;;58592:66:0;;16464:2:1;58592:66:0;;;16446:21:1;16503:2;16483:18;;;16476:30;-1:-1:-1;;;16522:18:1;;;16515:44;16576:18;;58592:66:0;16262:338:1;58592:66:0;58665:30;;;;:20;:30;;;;;;;;;:46;;-1:-1:-1;;;;;;58665:46:0;-1:-1:-1;;;;;58665:46:0;;;;;;;;58723:54;;16807:25:1;;;58751:10:0;16848:18:1;;;16841:60;;;;16917:18;;;16910:60;;;;58723:54:0;;16795:2:1;16780:18;58723:54:0;;;;;;;;58431:350;;:::o;68461:174::-;-1:-1:-1;;;;;68563:14:0;;68531:4;68563:14;;;:8;:14;;;;;:23;;68531:4;;68563:14;68578:7;;68563:23;;;;;;:::i;:::-;;;;;;;;;;68544:42;;;;;;;;68563:23;;;;;;;68544:42;;-1:-1:-1;;;;;68544:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68544:42:0;;;;;;;;;;;68600:15;:31;;;-1:-1:-1;;68461:174:0;;;;:::o;61538:1074::-;61612:22;49023:21;:19;:21::i;:::-;-1:-1:-1;;;;;61660:14:0;::::1;61643;61660::::0;;;:8:::1;:14;::::0;;;;:21;;;61724:852:::1;61749:5:::0;;61724:852:::1;;61768:3:::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;61821:14:0;::::1;61794:24;61821:14:::0;;;:8:::1;:14;::::0;;;;:17;;61768:3;;-1:-1:-1;61794:24:0;;-1:-1:-1;61821:14:0;61768:3;;61821:17;::::1;;;;;:::i;:::-;;;;;;;;;;;61794:44;;61877:3;61853:11;:20;;;:27:::0;61849:720:::1;;61897:14;61914:30;61936:4;61942:1;61914:21;:30::i;:::-;61897:47:::0;-1:-1:-1;61977:10:0;;61973:585:::1;;62034:6;62008:11;:22;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62059:23:0::1;::::0;-1:-1:-1;62076:6:0;62059:23;::::1;:::i;:::-;;;62183:57;62227:4;62233:6;62190:5;62196:3;62190:10;;;;;;;;:::i;62183:57::-;62281:11;:22;;;62307:1;62281:27:::0;62277:266:::1;;-1:-1:-1::0;;;;;62342:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:21;:25:::1;::::0;62366:1:::1;::::0;62342:25:::1;:::i;:::-;62337:1;:30;62333:148;;-1:-1:-1::0;;;;;62416:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;62431:21;;:25:::1;::::0;62455:1:::1;::::0;62431:25:::1;:::i;:::-;62416:41;;;;;;;;:::i;:::-;;;;;;;;;;;62396:8;:14;62405:4;-1:-1:-1::0;;;;;62396:14:0::1;-1:-1:-1::0;;;;;62396:14:0::1;;;;;;;;;;;;62411:1;62396:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:61;;:17:::1;::::0;;::::1;;:61:::0;;-1:-1:-1;;;;;;62396:61:0::1;-1:-1:-1::0;;;;;62396:61:0;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;62396:61:0;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;62396:61:0;;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;62396:61:0;;;;;;;;;::::1;::::0;;62333:148:::1;-1:-1:-1::0;;;;;62503:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:20;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;62503:20:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;62503:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;62503:20:0;;;;;62277:266:::1;61882:687;61849:720;61757:819;61724:852;;;-1:-1:-1::0;62595:13:0;-1:-1:-1;;49067:20:0;48461:1;49587:7;:22;49404:213;52475:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52475:43:0;;;;-1:-1:-1;52475:43:0;;-1:-1:-1;52475:43:0;;;;;;;-1:-1:-1;;;52475:43:0;;;;:::o;59707:1823::-;49023:21;:19;:21::i;:::-;-1:-1:-1;;;;;59802:18:0;::::1;59794:51;;;::::0;-1:-1:-1;;;59794:51:0;;17586:2:1;59794:51:0::1;::::0;::::1;17568:21:1::0;17625:2;17605:18;;;17598:30;-1:-1:-1;;;17644:18:1;;;17637:50;17704:18;;59794:51:0::1;17384:344:1::0;59794:51:0::1;59866:5;:12:::0;59860:18;::::1;59852:48;;;::::0;-1:-1:-1;;;59852:48:0;;17935:2:1;59852:48:0::1;::::0;::::1;17917:21:1::0;17974:2;17954:18;;;17947:30;-1:-1:-1;;;17993:18:1;;;17986:47;18050:18;;59852:48:0::1;17733:341:1::0;59852:48:0::1;59907:18;59928:5;59934:3;59928:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;59972:13;::::0;::::1;::::0;59928:10;;-1:-1:-1;59972:13:0::1;;59953:15;:32;;59945:59;;;::::0;-1:-1:-1;;;59945:59:0;;18281:2:1;59945:59:0::1;::::0;::::1;18263:21:1::0;18320:2;18300:18;;;18293:30;-1:-1:-1;;;18339:18:1;;;18332:44;18393:18;;59945:59:0::1;18079:338:1::0;59945:59:0::1;60036:4;:12;;;60019:4;:14;;;:29;60011:71;;;::::0;-1:-1:-1;;;60011:71:0;;18624:2:1;60011:71:0::1;::::0;::::1;18606:21:1::0;18663:2;18643:18;;;18636:30;18702:31;18682:18;;;18675:59;18751:18;;60011:71:0::1;18422:353:1::0;60011:71:0::1;60136:15:::0;;60113:51:::1;::::0;;-1:-1:-1;;;60113:51:0;;;;60091:19:::1;::::0;-1:-1:-1;;;;;60136:15:0::1;::::0;60113:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;60136:15;60113:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60091:73;;60171:22;60196:38;60220:13;60196:23;:38::i;:::-;60171:63;;60259:14;60249:6;:24;;60241:68;;;::::0;-1:-1:-1;;;60241:68:0;;18982:2:1;60241:68:0::1;::::0;::::1;18964:21:1::0;19021:2;19001:18;;;18994:30;19060:33;19040:18;;;19033:61;19111:18;;60241:68:0::1;18780:355:1::0;60241:68:0::1;60318:10;60324:3;60318:5;:10::i;:::-;60335:15;60346:3;60335:10;:15::i;:::-;60359:13;60375:17;60388:3;60375:12;:17::i;:::-;60359:33:::0;-1:-1:-1;60454:14:0::1;60506:18;60511:13:::0;60506:2:::1;:18;:::i;:::-;60499:26;::::0;:2:::1;:26;:::i;:::-;60490:36;::::0;:5;:36:::1;:::i;:::-;60472:13;:6:::0;60481:4:::1;60472:13;:::i;:::-;60471:56;;;;:::i;:::-;60454:73;;60540:17;60603:5;60577:4;:14;;;60562:4;:12;;;:29;;;;:::i;:::-;60561:38;::::0;60595:4:::1;60561:38;:::i;:::-;60560:48;;;;:::i;:::-;60540:68;;60639:9;60629:6;:19;;60621:63;;;::::0;-1:-1:-1;;;60621:63:0;;21325:2:1;60621:63:0::1;::::0;::::1;21307:21:1::0;21364:2;21344:18;;;21337:30;21403:33;21383:18;;;21376:61;21454:18;;60621:63:0::1;21123:355:1::0;60621:63:0::1;60726:4;:12;;;60716:6;60699:4;:14;;;:23;;;;:::i;:::-;:39;;60691:77;;;::::0;-1:-1:-1;;;60691:77:0;;21685:2:1;60691:77:0::1;::::0;::::1;21667:21:1::0;21724:2;21704:18;;;21697:30;-1:-1:-1;;;21743:18:1;;;21736:55;21808:18;;60691:77:0::1;21483:349:1::0;60691:77:0::1;60804:15:::0;;60851:35:::1;::::0;-1:-1:-1;;;60851:35:0;;-1:-1:-1;;;;;60804:15:0;;::::1;::::0;60777:17:::1;::::0;60804:15;;60851:20:::1;::::0;:35:::1;::::0;60880:4:::1;::::0;60851:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60827:59:::0;-1:-1:-1;60893:62:0::1;-1:-1:-1::0;;;;;60893:27:0;::::1;60921:10;60941:4;60948:6:::0;60893:27:::1;:62::i;:::-;60985:35;::::0;-1:-1:-1;;;60985:35:0;;60962:20:::1;::::0;-1:-1:-1;;;;;60985:20:0;::::1;::::0;::::1;::::0;:35:::1;::::0;61014:4:::1;::::0;60985:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60962:58:::0;-1:-1:-1;61067:6:0;61035:28:::1;61050:13:::0;60962:58;61035:28:::1;:::i;:::-;:38;61027:76;;;::::0;-1:-1:-1;;;61027:76:0;;22228:2:1;61027:76:0::1;::::0;::::1;22210:21:1::0;22267:2;22247:18;;;22240:30;-1:-1:-1;;;22286:18:1;;;22279:55;22351:18;;61027:76:0::1;22026:349:1::0;61027:76:0::1;61148:6;61116:5;61122:3;61116:10;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;;;;;;;;61185:6;61161:5;61167:3;61161:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;61200:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;;61220:240;;::::1;::::0;::::1;::::0;;61249:16:::1;::::0;::::1;::::0;;;::::1;61220:240:::0;;;;::::1;::::0;;;;;;;;;;;;;;;::::1;61374:15;61220:240:::0;;::::1;::::0;;;;61417:16:::1;::::0;::::1;::::0;61200:14;;61220:240;;;;;61417:34:::1;::::0;61374:15;-1:-1:-1;;;61417:16:0;::::1;;:34;:::i;:::-;61220:240;::::0;;::::1;::::0;;;61200:261;;::::1;::::0;;::::1;::::0;;-1:-1:-1;61200:261:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;61200:261:0;;::::1;-1:-1:-1::0;;;;;;61200:261:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;61200:261:0::1;-1:-1:-1::0;;61200:261:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;61479:47;;61499:3;;61479:47;::::1;::::0;::::1;::::0;::::1;::::0;61504:6;;61512;;61520:5;;22582:25:1;;;22638:2;22623:18;;22616:34;;;;22681:2;22666:18;;22659:34;22570:2;22555:18;;22380:319;61479:47:0::1;;;;;;;;59787:1743;;;;;;;;;49067:20:::0;48461:1;49587:7;:22;49404:213;44928:144;45009:7;45036:18;;;:12;:18;;;;;:28;;45058:5;45036:21;:28::i;:::-;45029:35;44928:144;-1:-1:-1;;;44928:144:0:o;26204:138::-;26281:4;26305:12;;;;;;;;;;;-1:-1:-1;;;;;26305:29:0;;;;;;;;;;;;;;;26204:138::o;73636:375::-;-1:-1:-1;;;;;73774:27:0;;73734:4;73774:27;;;:15;:27;;;;;;;;73747:54;;;;;;;;;;;;;;;;;73734:4;;73747:54;;73774:27;73747:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73747:54:0;;-1:-1:-1;73812:9:0;;-1:-1:-1;;;;73808:181:0;73831:7;:14;73827:1;:18;73808:181;;;73901:10;-1:-1:-1;;;;;73865:46:0;:20;:32;73886:7;73894:1;73886:10;;;;;;;;:::i;:::-;;;;;;;;;;;;73865:32;;;;;;;;;;-1:-1:-1;73865:32:0;;-1:-1:-1;;;;;73865:32:0;:46;:68;;;;;73915:18;73922:7;73930:1;73922:10;;;;;;;;:::i;:::-;;;;;;;73915:6;:18::i;:::-;73862:120;;;73966:4;73959:11;;;;;;73862:120;73847:3;;73808:181;;;-1:-1:-1;74002:5:0;;73636:375;-1:-1:-1;;;;73636:375:0:o;62732:489::-;25561:4;25800:16;25561:4;25800:10;:16::i;:::-;-1:-1:-1;;;;;62899:25:0;::::1;62891:64;;;::::0;-1:-1:-1;;;62891:64:0;;22906:2:1;62891:64:0::1;::::0;::::1;22888:21:1::0;22945:2;22925:18;;;22918:30;-1:-1:-1;;;22964:18:1;;;22957:56;23030:18;;62891:64:0::1;22704:350:1::0;62891:64:0::1;62975:37;-1:-1:-1::0;;;;;;;;;;;63000:11:0::1;62975:7;:37::i;:::-;62974:38;62966:72;;;::::0;-1:-1:-1;;;62966:72:0;;23261:2:1;62966:72:0::1;::::0;::::1;23243:21:1::0;23300:2;23280:18;;;23273:30;-1:-1:-1;;;23319:18:1;;;23312:51;23380:18;;62966:72:0::1;23059:345:1::0;62966:72:0::1;63051:40;-1:-1:-1::0;;;;;;;;;;;63079:11:0::1;63051:10;:40::i;:::-;-1:-1:-1::0;;;;;;63102:35:0;::::1;;::::0;;;:22:::1;:35;::::0;;;;;:42;;-1:-1:-1;;63102:42:0::1;63140:4;63102:42;::::0;;63160:53;63202:10:::1;::::0;63102:35;-1:-1:-1;;;;;;;;;;;50719:28:0;63160:53:::1;::::0;63102:35;63160:53:::1;62732:489:::0;;:::o;58790:790::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;74070:6:::1;::::0;::::1;;74069:7;74061:38;;;;-1:-1:-1::0;;;74061:38:0::1;;;;;;;:::i;:::-;59006:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;59006:25:0::2;59035:10;59006:39;58998:75;;;;-1:-1:-1::0;;;58998:75:0::2;;;;;;;:::i;:::-;59102:1;59092:7;:11;59084:45;;;::::0;-1:-1:-1;;;59084:45:0;;23963:2:1;59084:45:0::2;::::0;::::2;23945:21:1::0;24002:2;23982:18;;;23975:30;-1:-1:-1;;;24021:18:1;;;24014:51;24082:18;;59084:45:0::2;23761:345:1::0;59084:45:0::2;59156:1;59148:5;:9;59140:41;;;::::0;-1:-1:-1;;;59140:41:0;;24313:2:1;59140:41:0::2;::::0;::::2;24295:21:1::0;24352:2;24332:18;;;24325:30;-1:-1:-1;;;24371:18:1;;;24364:49;24430:18;;59140:41:0::2;24111:343:1::0;59140:41:0::2;59221:178;::::0;;::::2;::::0;::::2;::::0;;;::::2;;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;;;::::2;59371:15;59221:178:::0;;::::2;::::0;;;;;;-1:-1:-1;59202:16:0;;;:11:::2;:16:::0;;;;;;;:197;;;;;::::2;;-1:-1:-1::0;;59202:197:0;;::::2;;::::0;;;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;;;;59417:155;;59214:3;;59417:155:::2;::::0;::::2;::::0;59248:4;;59273:5;;59301:7;;59331;;59371:15;9760:14:1;;9753:22;9735:41;;9807:2;9792:18;;9785:34;;;;9850:2;9835:18;;9828:34;;;;9893:2;9878:18;;9871:34;9936:3;9921:19;;9914:35;9722:3;9707:19;;9482:473;59417:155:0::2;;;;;;;;58790:790:::0;;;;;;:::o;66205:127::-;66267:4;66291:33;-1:-1:-1;;;;;;;;;;;66316:7:0;66291;:33::i;45932:138::-;46035:18;;;;:12;:18;;;;;45999:16;;46035:27;;:25;:27::i;57709:710::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;74070:6:::1;::::0;::::1;;74069:7;74061:38;;;;-1:-1:-1::0;;;74061:38:0::1;;;;;;;:::i;:::-;57815:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57815:25:0::2;57844:10;57815:39;57807:75;;;;-1:-1:-1::0;;;57807:75:0::2;;;;;;;:::i;:::-;57915:5;57921:3;57915:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:19:::2;:10;::::0;;::::2;;:19;::::0;::::2;;57897:15;:37;57889:72;;;::::0;-1:-1:-1;;;57889:72:0;;24661:2:1;57889:72:0::2;::::0;::::2;24643:21:1::0;24700:2;24680:18;;;24673:30;-1:-1:-1;;;24719:18:1;;;24712:52;24781:18;;57889:72:0::2;24459:346:1::0;57889:72:0::2;57970:18;57991:5;57997:3;57991:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:21:::0;58037:5:::2;:10:::0;;-1:-1:-1;;;;;57991:21:0;;::::2;::::0;-1:-1:-1;58037:5:0;58043:3;;58037:10;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:28:::2;:10;::::0;;::::2;;:28;::::0;58103:8:::2;::::0;58037:28;;-1:-1:-1;58103:12:0;58099:102:::2;;58160:5;58148:8;;58138:7;:18;;;;:::i;:::-;58137:28;;;;:::i;:::-;58128:37:::0;-1:-1:-1;58176:17:0::2;58128:37:::0;58176:17;::::2;:::i;:::-;;;58099:102;58209:52;-1:-1:-1::0;;;;;58209:31:0;::::2;58241:10;58253:7:::0;58209:31:::2;:52::i;:::-;58272:10:::0;;58268:80:::2;;58295:45;-1:-1:-1::0;;;;;58295:31:0;::::2;58327:4;58333:6:::0;58295:31:::2;:45::i;:::-;58361:54;::::0;;24984:25:1;;;25040:2;25025:18;;25018:34;;;58387:10:0::2;::::0;58382:3;;58361:54:::2;::::0;24957:18:1;58361:54:0::2;;;;;;;57800:619;;;57709:710:::0;;:::o;64489:170::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;64593:6:::1;:14:::0;;-1:-1:-1;;64593:14:0::1;::::0;;64623:28:::1;::::0;64640:10:::1;::::0;64623:28:::1;::::0;64602:5:::1;::::0;64623:28:::1;64489:170:::0;:::o;63229:298::-;25561:4;25800:16;25561:4;25800:10;:16::i;:::-;63355:41:::1;-1:-1:-1::0;;;;;;;;;;;63384:11:0::1;63355;:41::i;:::-;-1:-1:-1::0;;;;;;63407:35:0;::::1;63445:5;63407:35:::0;;;:22:::1;:35;::::0;;;;;:43;;-1:-1:-1;;63407:43:0::1;::::0;;63466:53;63508:10:::1;::::0;63407:35;-1:-1:-1;;;;;;;;;;;50719:28:0;63466:53:::1;::::0;63445:5;63466:53:::1;63229:298:::0;;:::o;52356:52::-;;;;;;;;;;;;;;;;;;;;52110:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52110:20:0;;;;-1:-1:-1;52110:20:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52110:20:0;;;;:::o;64666:237::-;25561:4;25800:16;25561:4;25800:10;:16::i;:::-;52626:4:::1;64759:10;:21;;;;64751:46;;;::::0;-1:-1:-1;;;64751:46:0;;25265:2:1;64751:46:0::1;::::0;::::1;25247:21:1::0;25304:2;25284:18;;;25277:30;-1:-1:-1;;;25323:18:1;;;25316:42;25375:18;;64751:46:0::1;25063:336:1::0;64751:46:0::1;64821:8;::::0;;64836:21:::1;::::0;::::1;::::0;;;;64869:30:::1;::::0;;25577:25:1;;;25633:2;25618:18;;25611:51;;;;64821:8:0;;64869:30:::1;::::0;25550:18:1;64869:30:0::1;;;;;;;64744:159;64666:237:::0;;:::o;66340:959::-;-1:-1:-1;;;;;66458:14:0;;66423:7;66458:14;;;:8;:14;;;;;:23;;66423:7;;66458:14;66473:7;;66458:23;;;;;;:::i;:::-;;;;;;;;;66439:42;;;;;;;;66458:23;;;;;;;66439:42;;-1:-1:-1;;;;;66439:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66439:42:0;;;;;;;;66508:5;:20;;66439:42;;-1:-1:-1;66508:5:0;:20;;;;;;:::i;:::-;;;;;;;;;;66488:40;;;;;;;;66508:20;;;;;;;66488:40;;-1:-1:-1;;;;;66488:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66488:40:0;;;;;;;;;66591:14;;;;66488:40;;-1:-1:-1;66573:32:0;:15;:32;66569:65;;;66625:1;66618:8;;;;;;66569:65;66683:19;66705:4;:16;;;66683:38;;;;66778:19;66818:4;:12;;;66800:30;;:15;:30;:99;;66885:14;;;;66867:32;;;;:15;:32;:::i;:::-;66800:99;;;66843:11;66800:99;66778:121;;66944:23;66988:11;66970:4;:15;;;:29;;;;:::i;:::-;66944:55;-1:-1:-1;67051:24:0;67078:29;67096:11;66944:55;67078:29;:::i;:::-;67051:56;;67194:4;:15;;;67175:16;:34;67171:93;;;-1:-1:-1;67241:15:0;;;;67171:93;67279:16;66340:959;-1:-1:-1;;;;;;;;66340:959:0:o;45246:133::-;45317:7;45344:18;;;:12;:18;;;;;:27;;:25;:27::i;65325:316::-;-1:-1:-1;;;;;65466:14:0;;65421:28;65466:14;;;:8;:14;;;;;:21;65388:16;;65421:28;-1:-1:-1;;;;;65452:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65452:36:0;-1:-1:-1;65421:67:0;-1:-1:-1;65500:9:0;65495:114;-1:-1:-1;;;;;65519:14:0;;;;;;:8;:14;;;;;:21;65515:25;;65495:114;;;-1:-1:-1;;;;;65575:14:0;;;;;;:8;:14;;;;;:17;;65590:1;;65575:17;;;;;;:::i;:::-;;;;;;;;;;;:26;;;65558:11;65570:1;65558:14;;;;;;;;:::i;:::-;;;;;;;;;;:43;65542:3;;65495:114;;;-1:-1:-1;65622:11:0;65325:316;-1:-1:-1;;65325:316:0:o;52072:31::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52072:31:0;;-1:-1:-1;52072:31:0;:::o;65830:244::-;65890:7;65909:17;65929:5;65935:3;65929:10;;;;;;;;:::i;:::-;;;;;;;;;65909:30;;;;;;;;65929:10;;;;;;;65909:30;;-1:-1:-1;;;;;65909:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65909:30:0;;;;;;;;;;-1:-1:-1;65973:29:0;;65909:30;65973:29;:::i;:::-;65949:53;-1:-1:-1;66044:5:0;66020:20;65949:53;66036:4;66020:20;:::i;:::-;66019:30;;;;:::i;:::-;66012:37;65830:244;-1:-1:-1;;;;65830:244:0:o;28051:140::-;27253:7;27280:12;;;;;;;;;;:22;;;25800:16;25811:4;25800:10;:16::i;:::-;28157:26:::1;28169:4;28175:7;28157:11;:26::i;64069:232::-:0;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;-1:-1:-1;;;;;64168:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;64160:59;;;;-1:-1:-1::0;;;64160:59:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64226:25:0;::::1;64254:5;64226:25:::0;;;:17:::1;:25;::::0;;;;;;:33;;-1:-1:-1;;64226:33:0::1;::::0;;64271:26;::::1;::::0;::::1;::::0;64244:6;;64271:26:::1;:::i;54824:2477::-:0;55113:16;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;74070:6:::1;::::0;::::1;;74069:7;74061:38;;;;-1:-1:-1::0;;;74061:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55174:26:0;::::2;55166:59;;;::::0;-1:-1:-1;;;55166:59:0;;26225:2:1;55166:59:0::2;::::0;::::2;26207:21:1::0;26264:2;26244:18;;;26237:30;-1:-1:-1;;;26283:18:1;;;26276:50;26343:18;;55166:59:0::2;26023:344:1::0;55166:59:0::2;-1:-1:-1::0;;;;;55240:34:0;::::2;55232:66;;;::::0;-1:-1:-1;;;55232:66:0;;26574:2:1;55232:66:0::2;::::0;::::2;26556:21:1::0;26613:2;26593:18;;;26586:30;-1:-1:-1;;;26632:18:1;;;26625:49;26691:18;;55232:66:0::2;26372:343:1::0;55232:66:0::2;55337:12;-1:-1:-1::0;;;;;55313:36:0::2;55321:11;-1:-1:-1::0;;;;;55313:36:0::2;::::0;55305:73:::2;;;::::0;-1:-1:-1;;;55305:73:0;;26922:2:1;55305:73:0::2;::::0;::::2;26904:21:1::0;26961:2;26941:18;;;26934:30;-1:-1:-1;;;26980:18:1;;;26973:54;27044:18;;55305:73:0::2;26720:348:1::0;55305:73:0::2;-1:-1:-1::0;;;;;55393:31:0;::::2;;::::0;;;:17:::2;:31;::::0;;;;;::::2;;55385:65;;;;-1:-1:-1::0;;;55385:65:0::2;;;;;;;:::i;:::-;55466:61;55494:10;55514:11;55466:27;:61::i;:::-;55465:62;55457:109;;;::::0;-1:-1:-1;;;55457:109:0;;27275:2:1;55457:109:0::2;::::0;::::2;27257:21:1::0;27314:2;27294:18;;;27287:30;27353:34;27333:18;;;27326:62;-1:-1:-1;;;27404:18:1;;;27397:32;27446:19;;55457:109:0::2;27073:398:1::0;55457:109:0::2;55612:16:::0;;55631:15:::2;55612:34;::::0;;::::2;;55604:65;;;::::0;-1:-1:-1;;;55604:65:0;;27678:2:1;55604:65:0::2;::::0;::::2;27660:21:1::0;27717:2;27697:18;;;27690:30;-1:-1:-1;;;27736:18:1;;;27729:48;27794:18;;55604:65:0::2;27476:342:1::0;55604:65:0::2;55715:9:::0;;55707:44:::2;;;::::0;-1:-1:-1;;;55707:44:0;;28025:2:1;55707:44:0::2;::::0;::::2;28007:21:1::0;28064:2;28044:18;;;28037:30;-1:-1:-1;;;28083:18:1;;;28076:48;28141:18;;55707:44:0::2;27823:342:1::0;55707:44:0::2;55766:9;::::0;::::2;::::0;55758:54:::2;;;::::0;-1:-1:-1;;;55758:54:0;;28372:2:1;55758:54:0::2;::::0;::::2;28354:21:1::0;28411:2;28391:18;;;28384:30;28450;28430:18;;;28423:58;28498:18;;55758:54:0::2;28170:352:1::0;55758:54:0::2;55827:9:::0;;::::2;::::0;55819:51:::2;;;::::0;-1:-1:-1;;;55819:51:0;;28729:2:1;55819:51:0::2;::::0;::::2;28711:21:1::0;28768:2;28748:18;;;28741:30;-1:-1:-1;;;28787:18:1;;;28780:55;28852:18;;55819:51:0::2;28527:349:1::0;55819:51:0::2;55885:9:::0;;::::2;::::0;55877:46:::2;;;::::0;-1:-1:-1;;;55877:46:0;;29083:2:1;55877:46:0::2;::::0;::::2;29065:21:1::0;29122:2;29102:18;;;29095:30;-1:-1:-1;;;29141:18:1;;;29134:50;29201:18;;55877:46:0::2;28881:344:1::0;55877:46:0::2;55966:16:::0;;55936:27:::2;::::0;55966:34:::2;::::0;55985:15:::2;::::0;55966:34:::2;;;:::i;:::-;55936:64;;56037:1;56015:19;:23;56007:58;;;::::0;-1:-1:-1;;;56007:58:0;;29432:2:1;56007:58:0::2;::::0;::::2;29414:21:1::0;29471:2;29451:18;;;29444:30;-1:-1:-1;;;29490:18:1;;;29483:52;29552:18;;56007:58:0::2;29230:346:1::0;56007:58:0::2;56128:19;56173:11;-1:-1:-1::0;;;;;56150:45:0::2;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56128:69;;56203:20;56241:12;-1:-1:-1::0;;;;;56226:37:0::2;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56203:62:::0;-1:-1:-1;56309:96:0::2;56347:10;56367:4;56386:18;56203:62:::0;56386:2:::2;:18;:::i;:::-;56374:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;-1:-1:-1::0;;;;;56309:37:0;::::2;::::0;:96;;:37:::2;:96::i;:::-;56452:475;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;56452:475:0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;56441:5:::2;::::0;56452:475;;56571:18:::2;56575:14:::0;56571:2:::2;:18;:::i;:::-;56559:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;56452:475:::0;;56918:1:::2;56452:475;::::0;;::::2;::::0;;;;56618:9;::::2;::::0;56452:475;;;;;;;;56651:9;::::2;::::0;56452:475;;;;;;56736:18:::2;56740:14:::0;56736:2:::2;:18;:::i;:::-;56724:9:::0;;::::2;::::0;:30:::2;::::0;;::::2;:::i;:::-;56452:475;;;;56785:1;56452:475;;;;56807:15;56452:475;;;;56842:13;56856:1;56842:16;;;;;;;:::i;:::-;;;;;56452:475;;;;;;56881:13;56895:1;56881:16;;;;;;;:::i;:::-;;;;;56452:475;;;;::::0;56441:487:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56441:487:0::2;;;;;-1:-1:-1::0;;;;;56441:487:0::2;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56441:487:0::2;;;;;-1:-1:-1::0;;;;;56441:487:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56965:16;56984:13;;56965:32;;57004:16;:30;57021:12;-1:-1:-1::0;;;;;57004:30:0::2;-1:-1:-1::0;;;;;57004:30:0::2;;;;;;;;;;;;57040:8;57004:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57056:15;:37;57080:11;-1:-1:-1::0;;;;;57056:37:0::2;-1:-1:-1::0;;;;;57056:37:0::2;;;;;;;;;;;;57099:8;57056:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57148:10;57115:20;:30;57136:8;57115:30;;;;;;;;;;;;:43;;;;;-1:-1:-1::0;;;;;57115:43:0::2;;;;;-1:-1:-1::0;;;;;57115:43:0::2;;;;;;57173:13;;57171:15;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;57198:71:0;;::::2;::::0;;::::2;57213:8:::0;57198:71:::2;57259:6:::0;57266:1:::2;57259:9;;;;57198:71;;;;1247:25:1::0;;1235:2;1220:18;;1101:177;57198:71:0::2;;;;;;;;57289:8:::0;54824:2477;-1:-1:-1;;;;;;;;;54824:2477:0:o;68313:141::-;68384:14;68414:36;68436:4;68442:7;68414:21;:36::i;25908:204::-;25993:4;-1:-1:-1;;;;;;26017:47:0;;-1:-1:-1;;;26017:47:0;;:87;;-1:-1:-1;;;;;;;;;;23481:40:0;;;26068:36;23381:148;26557:105;26624:30;26635:4;22507:10;26624;:30::i;:::-;26557:105;:::o;9052:162::-;9162:43;;-1:-1:-1;;;;;29913:32:1;;;9162:43:0;;;29895:51:1;29962:18;;;29955:34;;;9135:71:0;;9155:5;;9177:14;;;;;29868:18:1;;9162:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9162:43:0;;;;;;;;;;;9135:19;:71::i;70661:139::-;70720:13;70771:17;70784:3;70771:12;:17::i;46177:263::-;46263:4;46280:12;46295:31;46312:4;46318:7;46295:16;:31::i;:::-;46280:46;;46341:7;46337:71;;;46365:18;;;;:12;:18;;;;;:31;;46388:7;46365:22;:31::i;46548:268::-;46635:4;46652:12;46667:32;46685:4;46691:7;46667:17;:32::i;:::-;46652:47;;46714:7;46710:74;;;46738:18;;;;:12;:18;;;;;:34;;46764:7;46738:25;:34::i;49103:293::-;48505:1;49237:7;;:19;49229:63;;;;-1:-1:-1;;;49229:63:0;;30202:2:1;49229:63:0;;;30184:21:1;30241:2;30221:18;;;30214:30;30280:33;30260:18;;;30253:61;30331:18;;49229:63:0;30000:355:1;49229:63:0;48505:1;49370:18;;49103:293::o;73079:340::-;73151:7;73269:1;73258:8;:12;;;73254:96;;;73299:12;73310:1;73299:8;:12;:::i;:::-;73292:20;;:2;:20;:::i;73254:96::-;-1:-1:-1;73367:1:0;;73079:340;-1:-1:-1;73079:340:0:o;69274:783::-;69376:16;;;;:11;:16;;;;;:23;;;;69347:26;;;;;:52;;69376:23;69347:52;:::i;:::-;69329:15;:70;69325:719;;;69412:18;69433:5;69439:3;69433:10;;;;;;;;:::i;:::-;;;;;;;;;69468:16;;;:11;:16;;;;;;;:20;69433:10;;;;;;;;-1:-1:-1;69468:20:0;;69464:500;;;69529:16;;;;:11;:16;;;;;:21;;;69505:20;;;:45;;69529:21;;69505:20;;:45;;69529:21;;69505:45;:::i;:::-;;;;-1:-1:-1;;69607:16:0;;;;:11;:16;;;;;:23;;;69583:20;;;;:47;69579:134;;69674:16;;;;:11;:16;;;;;:23;;;69651:20;;;:46;69579:134;69464:500;;;69769:16;;;;:11;:16;;;;;:21;;;69745:20;;;:45;;69769:21;;69745:20;;:45;;69769:21;;69745:45;:::i;:::-;;;;-1:-1:-1;;69847:16:0;;;;:11;:16;;;;;:23;;;69823:20;;;;:47;69819:134;;69914:16;;;;:11;:16;;;;;:23;;;69891:20;;;:46;69819:134;-1:-1:-1;69984:16:0;;;;:11;:16;;;;;70020:15;69984:52;;:26;;;;:52;69274:783::o;68765:495::-;68814:18;68835:5;68841:3;68835:10;;;;;;;;:::i;:::-;;;;;;;;;;;68814:31;;68858:19;68880:4;:14;;;68858:36;;68905:11;68920:1;68905:16;68901:29;;68923:7;;68765:495;:::o;68901:29::-;68938:26;68985:4;:14;;;68967:15;:32;;;;:::i;:::-;68938:61;;69010:18;69032:1;69010:23;69006:36;;69035:7;;;68765:495;:::o;69006:36::-;69110:16;;;;69056:13;;69110:22;;-1:-1:-1;;;69110:16:0;;;;69129:3;69110:22;:::i;:::-;69072:61;;69073:32;69087:18;69073:11;:32;:::i;:::-;69072:61;;;;:::i;:::-;69056:77;;69172:11;69164:5;:19;:45;;69190:19;69204:5;69190:11;:19;:::i;:::-;69164:45;;;69186:1;69164:45;69147:14;;;:62;-1:-1:-1;;;69216:40:0;69240:15;69216:40;:14;;;;:40;-1:-1:-1;68765:495:0:o;70065:574::-;70123:13;70145:17;70165:5;70171:3;70165:10;;;;;;;;:::i;:::-;;;;;;;;;70145:30;;;;;;;;70165:10;;;;;;;70145:30;;-1:-1:-1;;;;;70145:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70145:30:0;;;;;;;;70210:51;;-1:-1:-1;;;70210:51:0;;;;70145:30;;-1:-1:-1;70145:30:0;70210:49;;:51;;;;70165:10;;70210:51;;;;;;70145:30;70210:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70188:73;;70268:17;70288:28;70312:3;70288:23;:28::i;:::-;70268:48;-1:-1:-1;70381:21:0;70418:18;70423:13;70418:2;:18;:::i;:::-;70412:25;;:2;:25;:::i;:::-;70405:33;;:2;:33;:::i;:::-;70381:57;-1:-1:-1;70553:4:0;70525:25;70381:57;70525:9;:25;:::i;:::-;:32;;;;:::i;:::-;70517:40;;70586:1;70578:5;:9;70570:46;;;;-1:-1:-1;;;70570:46:0;;30964:2:1;70570:46:0;;;30946:21:1;31003:2;30983:18;;;30976:30;-1:-1:-1;;;31022:18:1;;;31015:54;31086:18;;70570:46:0;30762:348:1;70570:46:0;70623:12;;;;70065:574;;;:::o;9459:190::-;9587:53;;-1:-1:-1;;;;;31335:32:1;;;9587:53:0;;;31317:51:1;31404:32;;;31384:18;;;31377:60;31453:18;;;31446:34;;;9560:81:0;;9580:5;;9602:18;;;;;31290::1;;9587:53:0;31115:371:1;40246:158:0;40320:7;40371:22;40375:3;40387:5;40371:3;:22::i;40954:282::-;41017:16;41046:22;41071:19;41079:3;41071:7;:19::i;39775:117::-;39838:7;39865:19;39873:3;35103:18;;35020:109;26798:201;26887:22;26895:4;26901:7;26887;:22::i;:::-;26882:110;;26933:47;;-1:-1:-1;;;26933:47:0;;-1:-1:-1;;;;;29913:32:1;;26933:47:0;;;29895:51:1;29962:18;;;29955:34;;;29868:18;;26933:47:0;29721:274:1;15645:738:0;15726:18;15755:19;15895:4;15892:1;15885:4;15879:11;15872:4;15866;15862:15;15859:1;15852:5;15845;15840:60;15954:7;15944:180;;15999:4;15993:11;16045:16;16042:1;16037:3;16022:40;16092:16;16087:3;16080:29;15944:180;-1:-1:-1;;16203:1:0;16197:8;16152:16;;-1:-1:-1;16232:15:0;;:68;;16284:11;16299:1;16284:16;;16232:68;;;-1:-1:-1;;;;;16250:26:0;;;:31;16232:68;16228:148;;;16357:5;16324:40;;-1:-1:-1;;;16324:40:0;;;;;;;;:::i;29634:324::-;29711:4;29733:22;29741:4;29747:7;29733;:22::i;:::-;29728:223;;29772:6;:12;;;;;;;;;;;-1:-1:-1;;;;;29772:29:0;;;;;;;;;:36;;-1:-1:-1;;29772:36:0;29804:4;29772:36;;;29855:12;22507:10;;22427:98;29855:12;-1:-1:-1;;;;;29828:40:0;29846:7;-1:-1:-1;;;;;29828:40:0;29840:4;29828:40;;;;;;;;;;-1:-1:-1;29890:4:0;29883:11;;29728:223;-1:-1:-1;29934:5:0;29927:12;;38950:152;39020:4;39044:50;39049:3;-1:-1:-1;;;;;39069:23:0;;39044:4;:50::i;30202:325::-;30280:4;30301:22;30309:4;30315:7;30301;:22::i;:::-;30297:223;;;30372:5;30340:12;;;;;;;;;;;-1:-1:-1;;;;;30340:29:0;;;;;;;;;;:37;;-1:-1:-1;;30340:37:0;;;30397:40;22507:10;;30340:12;;30397:40;;30372:5;30397:40;-1:-1:-1;30459:4:0;30452:11;;39278:158;39351:4;39375:53;39383:3;-1:-1:-1;;;;;39403:23:0;;39375:7;:53::i;71751:1260::-;71820:7;71836:17;71856:5;71862:3;71856:10;;;;;;;;:::i;:::-;;;;;;;;;71836:30;;;;;;;;71856:10;;;;;;;71836:30;;-1:-1:-1;;;;;71836:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71836:30:0;;;;;;;;71900:16;;;;;;;;;;71873:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71986:20;71836:30;;-1:-1:-1;72087:20:0;;:38;;-1:-1:-1;72111:14:0;;72087:38;72083:79;;;72145:9;71751:1260;-1:-1:-1;;;;71751:1260:0:o;72083:79::-;72241:19;72281:10;:20;;;72263:15;:38;;;;:::i;:::-;72241:60;;72308:23;72348:10;:17;;;72334:11;:31;;;;:::i;:::-;72308:57;-1:-1:-1;72382:19:0;;72378:605;;72414:23;72458:15;72440:10;:15;;;:33;;;;:::i;:::-;72498:14;;72414:59;;-1:-1:-1;72494:482:0;;;72563:17;;;;72533:27;72545:15;72533:9;:27;:::i;:::-;:47;72529:186;;;72613:10;:17;;;72601:29;;72494:482;;72529:186;72671:28;72684:15;72671:28;;:::i;:::-;;;72494:482;;;72770:9;72751:15;:28;;:79;;;-1:-1:-1;72813:17:0;;;;72783:27;72795:15;72783:9;:27;:::i;:::-;:47;72751:79;72747:218;;;72863:10;:17;;;72851:29;;72747:218;;;72921:28;72934:15;72921:28;;:::i;:::-;;;72747:218;72403:580;72378:605;-1:-1:-1;72998:9:0;;71751:1260;-1:-1:-1;;;;;71751:1260:0:o;35483:120::-;35550:7;35577:3;:11;;35589:5;35577:18;;;;;;;;:::i;:::-;;;;;;;;;35570:25;;35483:120;;;;:::o;36153:111::-;36209:16;36245:3;:11;;36238:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36153:111;;;:::o;32725:416::-;32788:4;34900:21;;;:14;;;:21;;;;;;32805:329;;-1:-1:-1;32848:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;33033:18;;33009:21;;;:14;;;:21;;;;;;:42;;;;33066:11;;33317:1400;33383:4;33514:21;;;:14;;;:21;;;;;;33552:13;;33548:1162;;33925:18;33946:12;33957:1;33946:8;:12;:::i;:::-;33993:18;;33925:33;;-1:-1:-1;33973:17:0;;33993:22;;34014:1;;33993:22;:::i;:::-;33973:42;;34050:9;34036:10;:23;34032:385;;34080:17;34100:3;:11;;34112:9;34100:22;;;;;;;;:::i;:::-;;;;;;;;;34080:42;;34250:9;34224:3;:11;;34236:10;34224:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;34365:25;;;:14;;;:25;;;;;:36;;;34032:385;34498:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34604:3;:14;;:21;34619:5;34604:21;;;;;;;;;;;34597:28;;;34649:4;34642:11;;;;;;;33548:1162;34693:5;34686:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;593:131;-1:-1:-1;;;;;668:31:1;;658:42;;648:70;;714:1;711;704:12;729:367;797:6;805;858:2;846:9;837:7;833:23;829:32;826:52;;;874:1;871;864:12;826:52;913:9;900:23;932:31;957:5;932:31;:::i;:::-;982:5;1060:2;1045:18;;;;1032:32;;-1:-1:-1;;;729:367:1:o;1283:610::-;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1486:9;1473:23;-1:-1:-1;;;;;1511:6:1;1508:30;1505:50;;;1551:1;1548;1541:12;1505:50;1574:22;;1627:4;1619:13;;1615:27;-1:-1:-1;1605:55:1;;1656:1;1653;1646:12;1605:55;1696:2;1683:16;-1:-1:-1;;;;;1714:6:1;1711:30;1708:50;;;1754:1;1751;1744:12;1708:50;1807:7;1802:2;1792:6;1789:1;1785:14;1781:2;1777:23;1773:32;1770:45;1767:65;;;1828:1;1825;1818:12;1767:65;1859:2;1851:11;;;;;1881:6;;-1:-1:-1;1283:610:1;-1:-1:-1;;;1283:610:1:o;2007:787::-;2094:12;;-1:-1:-1;;;;;1964:31:1;1952:44;;2158:4;2151:5;2147:16;2141:23;2173:48;2215:4;2210:3;2206:14;2192:12;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2173:48;;2270:4;2263:5;2259:16;2253:23;2246:4;2241:3;2237:14;2230:47;2326:4;2319:5;2315:16;2309:23;2302:4;2297:3;2293:14;2286:47;2382:4;2375:5;2371:16;2365:23;2358:4;2353:3;2349:14;2342:47;2438:4;2431:5;2427:16;2421:23;2414:4;2409:3;2405:14;2398:47;2493:4;2486:5;2482:16;2476:23;2508:50;2552:4;2547:3;2543:14;2527;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2508:50;;2606:4;2599:5;2595:16;2589:23;2621:47;2662:4;2657:3;2653:14;2637;375:13;368:21;356:34;;305:91;2621:47;-1:-1:-1;2719:6:1;2708:18;;;2702:25;2684:16;;;2677:51;2779:6;2768:18;;;2762:25;2744:16;;2737:51;2007:787::o;2799:705::-;3053:2;3065:21;;;3135:13;;3038:18;;;3157:22;;;3005:4;;3236:15;;;3210:2;3195:18;;;3005:4;3279:199;3293:6;3290:1;3287:13;3279:199;;;3342:52;3390:3;3381:6;3375:13;3342:52;:::i;:::-;3465:2;3453:15;;;;;3423:6;3414:16;;;;;3315:1;3308:9;3279:199;;3509:226;3568:6;3621:2;3609:9;3600:7;3596:23;3592:32;3589:52;;;3637:1;3634;3627:12;3589:52;-1:-1:-1;3682:23:1;;3509:226;-1:-1:-1;3509:226:1:o;3740:268::-;3938:3;3923:19;;3951:51;3927:9;3984:6;3951:51;:::i;4013:247::-;4072:6;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;4265:611::-;4455:2;4467:21;;;4537:13;;4440:18;;;4559:22;;;4407:4;;4638:15;;;4612:2;4597:18;;;4407:4;4681:169;4695:6;4692:1;4689:13;4681:169;;;4756:13;;4744:26;;4799:2;4825:15;;;;4790:12;;;;4717:1;4710:9;4681:169;;5294:367;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5484:23;;;-1:-1:-1;5583:2:1;5568:18;;5555:32;5596:33;5555:32;5596:33;:::i;:::-;5648:7;5638:17;;;5294:367;;;;;:::o;6634:487::-;6711:6;6719;6727;6780:2;6768:9;6759:7;6755:23;6751:32;6748:52;;;6796:1;6793;6786:12;6748:52;6841:23;;;-1:-1:-1;6961:2:1;6946:18;;6933:32;;-1:-1:-1;7043:2:1;7028:18;;7015:32;7056:33;7015:32;7056:33;:::i;:::-;7108:7;7098:17;;;6634:487;;;;;:::o;7126:346::-;7194:6;7202;7255:2;7243:9;7234:7;7230:23;7226:32;7223:52;;;7271:1;7268;7261:12;7223:52;-1:-1:-1;;7316:23:1;;;7436:2;7421:18;;;7408:32;;-1:-1:-1;7126:346:1:o;7477:203::-;-1:-1:-1;;;;;7641:32:1;;;;7623:51;;7611:2;7596:18;;7477:203::o;7685:388::-;7753:6;7761;7814:2;7802:9;7793:7;7789:23;7785:32;7782:52;;;7830:1;7827;7820:12;7782:52;7869:9;7856:23;7888:31;7913:5;7888:31;:::i;:::-;7938:5;-1:-1:-1;7995:2:1;7980:18;;7967:32;8008:33;7967:32;8008:33;:::i;8078:757::-;8170:6;8178;8186;8194;8202;8255:3;8243:9;8234:7;8230:23;8226:33;8223:53;;;8272:1;8269;8262:12;8223:53;8317:23;;;-1:-1:-1;8416:2:1;8401:18;;8388:32;8458:15;;8451:23;8439:36;;8429:64;;8489:1;8486;8479:12;8429:64;8078:757;;8512:7;;-1:-1:-1;;;;8592:2:1;8577:18;;8564:32;;8695:2;8680:18;;8667:32;;8798:3;8783:19;;;8770:33;;-1:-1:-1;8078:757:1:o;8840:637::-;9030:2;9042:21;;;9112:13;;9015:18;;;9134:22;;;8982:4;;9213:15;;;9187:2;9172:18;;;8982:4;9256:195;9270:6;9267:1;9264:13;9256:195;;;9335:13;;-1:-1:-1;;;;;9331:39:1;9319:52;;9400:2;9426:15;;;;9391:12;;;;9367:1;9285:9;9256:195;;10944:163;11011:20;;11071:10;11060:22;;11050:33;;11040:61;;11097:1;11094;11087:12;11040:61;10944:163;;;:::o;11112:184::-;11170:6;11223:2;11211:9;11202:7;11198:23;11194:32;11191:52;;;11239:1;11236;11229:12;11191:52;11262:28;11280:9;11262:28;:::i;11301:127::-;11362:10;11357:3;11353:20;11350:1;11343:31;11393:4;11390:1;11383:15;11417:4;11414:1;11407:15;11433:372;11504:2;11498:9;11569:2;11550:13;;-1:-1:-1;;11546:27:1;11534:40;;-1:-1:-1;;;;;11589:34:1;;11625:22;;;11586:62;11583:185;;;11690:10;11685:3;11681:20;11678:1;11671:31;11725:4;11722:1;11715:15;11753:4;11750:1;11743:15;11583:185;11784:2;11777:22;11433:372;;-1:-1:-1;11433:372:1:o;11810:566::-;11859:5;11912:3;11905:4;11897:6;11893:17;11889:27;11879:55;;11930:1;11927;11920:12;11879:55;12031:19;12009:2;12031:19;:::i;:::-;12074:3;12112:2;12104:6;12100:15;12138:3;12130:6;12127:15;12124:35;;;12155:1;12152;12145:12;12124:35;12179:6;12194:151;12210:6;12205:3;12202:15;12194:151;;;12278:22;12296:3;12278:22;:::i;:::-;12266:35;;12330:4;12321:14;;;;12227;12194:151;;12381:1115;12525:6;12533;12541;12549;12602:3;12590:9;12581:7;12577:23;12573:33;12570:53;;;12619:1;12616;12609:12;12570:53;12658:9;12645:23;12677:31;12702:5;12677:31;:::i;:::-;12727:5;-1:-1:-1;12784:2:1;12769:18;;12756:32;12797:33;12756:32;12797:33;:::i;:::-;12849:7;-1:-1:-1;12894:2:1;12879:18;;12875:32;-1:-1:-1;12865:60:1;;12921:1;12918;12911:12;12865:60;13023:20;13000:3;13023:20;:::i;:::-;13065:3;13106;13095:9;13091:19;13133:7;13125:6;13122:19;13119:39;;;13154:1;13151;13144:12;13119:39;13193:2;13182:9;13178:18;13205:202;13221:6;13216:3;13213:15;13205:202;;;13315:17;;13345:20;;13394:2;13385:12;;;;13238;13205:202;;;13209:3;13426:5;13416:15;;13450:40;13482:7;13474:6;13450:40;:::i;:::-;13440:50;;;;;12381:1115;;;;;;;:::o;13501:127::-;13562:10;13557:3;13553:20;13550:1;13543:31;13593:4;13590:1;13583:15;13617:4;13614:1;13607:15;13633:342;13835:2;13817:21;;;13874:2;13854:18;;;13847:30;-1:-1:-1;;;13908:2:1;13893:18;;13886:48;13966:2;13951:18;;13633:342::o;14322:127::-;14383:10;14378:3;14374:20;14371:1;14364:31;14414:4;14411:1;14404:15;14438:4;14435:1;14428:15;14454:128;14521:9;;;14542:11;;;14539:37;;;14556:18;;:::i;15291:273::-;15359:6;15412:2;15400:9;15391:7;15387:23;15383:32;15380:52;;;15428:1;15425;15418:12;15380:52;15460:9;15454:16;15510:4;15503:5;15499:16;15492:5;15489:27;15479:55;;15530:1;15527;15520:12;16981:136;17020:3;17048:5;17038:39;;17057:18;;:::i;:::-;-1:-1:-1;;;17093:18:1;;16981:136::o;17122:125::-;17187:9;;;17208:10;;;17205:36;;;17221:18;;:::i;17252:127::-;17313:10;17308:3;17304:20;17301:1;17294:31;17344:4;17341:1;17334:15;17368:4;17365:1;17358:15;19140:151;19230:4;19223:12;;;19209;;;19205:31;;19248:14;;19245:40;;;19265:18;;:::i;19296:375::-;19384:1;19402:5;19416:249;19437:1;19427:8;19424:15;19416:249;;;19487:4;19482:3;19478:14;19472:4;19469:24;19466:50;;;19496:18;;:::i;:::-;19546:1;19536:8;19532:16;19529:49;;;19560:16;;;;19529:49;19643:1;19639:16;;;;;19599:15;;19416:249;;;19296:375;;;;;;:::o;19676:902::-;19725:5;19755:8;19745:80;;-1:-1:-1;19796:1:1;19810:5;;19745:80;19844:4;19834:76;;-1:-1:-1;19881:1:1;19895:5;;19834:76;19926:4;19944:1;19939:59;;;;20012:1;20007:174;;;;19919:262;;19939:59;19969:1;19960:10;;19983:5;;;20007:174;20044:3;20034:8;20031:17;20028:43;;;20051:18;;:::i;:::-;-1:-1:-1;;20107:1:1;20093:16;;20166:5;;19919:262;;20265:2;20255:8;20252:16;20246:3;20240:4;20237:13;20233:36;20227:2;20217:8;20214:16;20209:2;20203:4;20200:12;20196:35;20193:77;20190:203;;;-1:-1:-1;20302:19:1;;;20378:5;;20190:203;20425:42;-1:-1:-1;;20450:8:1;20444:4;20425:42;:::i;:::-;20503:6;20499:1;20495:6;20491:19;20482:7;20479:32;20476:58;;;20514:18;;:::i;:::-;20552:20;;19676:902;-1:-1:-1;;;19676:902:1:o;20583:140::-;20641:5;20670:47;20711:4;20701:8;20697:19;20691:4;20670:47;:::i;20728:217::-;20768:1;20794;20784:132;;20838:10;20833:3;20829:20;20826:1;20819:31;20873:4;20870:1;20863:15;20901:4;20898:1;20891:15;20784:132;-1:-1:-1;20930:9:1;;20728:217::o;20950:168::-;21023:9;;;21054;;21071:15;;;21065:22;;21051:37;21041:71;;21092:18;;:::i;21837:184::-;21907:6;21960:2;21948:9;21939:7;21935:23;21931:32;21928:52;;;21976:1;21973;21966:12;21928:52;-1:-1:-1;21999:16:1;;21837:184;-1:-1:-1;21837:184:1:o;23409:347::-;23611:2;23593:21;;;23650:2;23630:18;;;23623:30;-1:-1:-1;;;23684:2:1;23669:18;;23662:53;23747:2;23732:18;;23409:347::o;25673:345::-;25875:2;25857:21;;;25914:2;25894:18;;;25887:30;-1:-1:-1;;;25948:2:1;25933:18;;25926:51;26009:2;25994:18;;25673:345::o;29581:135::-;29620:3;29641:17;;;29638:43;;29661:18;;:::i;:::-;-1:-1:-1;29708:1:1;29697:13;;29581:135::o;30360:244::-;30471:10;30444:18;;;30464;;;30440:43;30503:28;;;;30550:24;;;30540:58;;30578:18;;:::i;30609:148::-;30697:4;30676:12;;;30690;;;30672:31;;30715:13;;30712:39;;;30731:18;;:::i
Swarm Source
ipfs://e1a298af4576db1f678222e4656d0cf572c1aabaf51e49fae71d04d1bd2f4b4a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.