More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 49 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 8830022 | 2 days ago | IN | 0 S | 0.00183788 | ||||
Deposit | 8732272 | 2 days ago | IN | 0 S | 0.00183788 | ||||
Deposit | 8713009 | 2 days ago | IN | 0 S | 0.00183755 | ||||
Deposit | 8712908 | 2 days ago | IN | 0 S | 0.00183755 | ||||
Deposit | 8712430 | 2 days ago | IN | 0 S | 0.00183755 | ||||
Deposit | 8712376 | 2 days ago | IN | 0 S | 0.00183755 | ||||
Deposit | 8544637 | 3 days ago | IN | 0 S | 0.00183788 | ||||
Deposit | 8544625 | 3 days ago | IN | 0 S | 0.00183788 | ||||
Deposit | 8543082 | 3 days ago | IN | 0 S | 0.00183821 | ||||
Deposit | 8532319 | 3 days ago | IN | 0 S | 0.00183755 | ||||
Deposit | 8532006 | 3 days ago | IN | 0 S | 0.00183755 | ||||
Deposit | 8527297 | 3 days ago | IN | 0 S | 0.0020213 | ||||
Deposit | 8513572 | 3 days ago | IN | 0 S | 0.0018773 | ||||
Deposit | 8513536 | 3 days ago | IN | 0 S | 0.00203968 | ||||
Deposit | 8512609 | 3 days ago | IN | 0 S | 0.00183855 | ||||
Deposit | 8512553 | 3 days ago | IN | 0 S | 0.00183921 | ||||
Deposit | 8512440 | 3 days ago | IN | 0 S | 0.00183887 | ||||
Deposit | 8506298 | 3 days ago | IN | 0 S | 0.00183788 | ||||
Deposit | 8506200 | 3 days ago | IN | 0 S | 0.00183788 | ||||
Deposit | 8501272 | 3 days ago | IN | 0 S | 0.00183854 | ||||
Deposit | 8500791 | 3 days ago | IN | 0 S | 0.00202203 | ||||
Deposit | 8500632 | 3 days ago | IN | 0 S | 0.00275731 | ||||
Deposit | 8495146 | 3 days ago | IN | 0 S | 0.00183716 | ||||
Deposit | 8488311 | 3 days ago | IN | 0 S | 0.00258993 | ||||
Deposit | 8486652 | 3 days ago | IN | 0 S | 0.00220506 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BondDepository
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-15 */ // 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); 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 initialAmount; //stored for vesting 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(AUCTIONEER_ROLE, msg.sender); _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 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] * 10 ** 18) / 1000, 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); } /*================================= 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); uint256 payout = (amount * 1e18) / price; 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, initialAmount: payout, 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; bool[] memory toDelete = new bool[](length); uint256 deleteCount = 0; // First loop: Handle all redemptions and mark bonds for deletion for (uint256 i = 0; i < length; i++) { Bond storage currentBond = bondInfo[user][i]; if (currentBond.marketId == _id) { uint256 amount = calculateLinearPayout(user, i); if (amount > 0) { bondInfo[user][i].amountOwed -= amount; totalRedeemed += amount; IERC20(terms[_id].payoutToken).safeTransfer(user, amount); // Mark for deletion if fully redeemed if (currentBond.amountOwed == 0) { toDelete[i] = true; deleteCount++; } } } } // Second loop: Only if we need to delete bonds if (deleteCount > 0) { // Create new array with remaining bonds Bond[] memory remainingBonds = new Bond[](length - deleteCount); uint256 newIndex = 0; // Copy only the bonds we want to keep for (uint256 i = 0; i < length; i++) { if (!toDelete[i]) { remainingBonds[newIndex] = bondInfo[user][i]; newIndex++; } } // Clear existing array delete bondInfo[user]; // Rebuild array with only unredeemed bonds for (uint256 i = 0; i < remainingBonds.length; i++) { bondInfo[user].push(remainingBonds[i]); } } 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 using initialAmount uint256 tokensPerSecond = bond.initialAmount / vestingTerm; // Calculate current claimable amount uint256 currentClaimable = tokensPerSecond * timeElapsed; // Ensure we don't claim more than what's currently 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]; // Get decimals for both tokens for precise calculations uint8 payoutDecimals = IERC20Metadata(address(term.payoutToken)).decimals(); uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); // Get current control variable and debt ratio uint256 currentCV = _currentControlVariable(_id); uint256 debtRatio = _debtRatio(_id); // Scale up before division to maintain precision // Use a higher precision factor (1e36) to prevent overflow while maintaining precision uint256 scaledPrice = (currentCV * debtRatio) * (10 ** (36 - payoutDecimals - quoteDecimals)); // Perform division last to minimize precision loss // Divide by 1e18 twice because debtRatio is scaled by 1e18 and we want final precision of 1e18 price = scaledPrice / 1e18 / 1e18; // Apply minimum price check after all calculations if (price < term.minimumPrice) { price = term.minimumPrice; } // Add safety check for maximum price to prevent unreasonable values // This value should be adjusted based on your specific needs require(price <= type(uint256).max / 1e18, "Price overflow"); } 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]; // Get decimals for precise calculation uint8 quoteDecimals = uint8(IERC20Metadata(address(term.quoteToken)).decimals()); uint8 payoutDecimals = uint8(IERC20Metadata(address(term.payoutToken)).decimals()); // Normalize totalDebt to 18 decimals (totalDebt is in payoutToken) uint256 totalDebt = term.totalDebt * (10**(18 - payoutDecimals)); // Normalize quote tokens raised to 18 decimals uint256 quoteBalance = term.quoteTokensRaised * (10 ** (18 - quoteDecimals)); // Prevent division by zero if (quoteBalance == 0) { return 1e18; } // Calculate debt ratio with high precision // Result is scaled to 1e18 uint256 debtRatio = (totalDebt * 1e18) / quoteBalance; return debtRatio; } function _currentControlVariable(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; Adjust memory adjustment = adjustments[_id]; // Base control variable uint256 baseCV = term.controlVariable; // Market-adaptive decay calculation uint256 currentDebtRatio = _debtRatio(_id); uint256 timeSinceBondStart = block.timestamp > term.bondEnds ? block.timestamp - term.bondEnds : 0; // Adaptive decay rate based on debt ratio // Higher debt ratio accelerates decay uint256 adaptiveDecayRate = (currentDebtRatio * 1e18) / term.maxDebt; // Calculate decay amount uint256 decayAmount = (baseCV * adaptiveDecayRate) / (timeSinceBondStart + 1); // Apply ongoing adjustment if within adjustment window if (block.timestamp <= adjustment.lastBlock + adjustment.buffer) { if (adjustment.add) { // Increasing control variable baseCV += adjustment.rate; // Cap at target if exceeded if (baseCV > adjustment.target) { baseCV = adjustment.target; } } else { // Decreasing control variable baseCV -= adjustment.rate; // Floor at target if fallen below if (baseCV < adjustment.target) { baseCV = adjustment.target; } } } // Apply decay if (baseCV > decayAmount) { return baseCV - decayAmount; } return 0; } // 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 * 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":"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":"initialAmount","type":"uint256"},{"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":"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
60a060405234801561000f575f5ffd5b506040516148a23803806148a283398101604081905261002e91610262565b60016002556001600160a01b03811661007f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b6001600160a01b0381166080819052610099905f90610131565b506100c47fc1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e60189133610131565b506100f77f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6360805161013160201b60201c565b5061012a7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e60805161013160201b60201c565b5050610288565b5f8061013d8484610167565b9050801561015e575f84815260016020526040902061015c908461020e565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610207575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101bf3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610161565b505f610161565b5f61015e836001600160a01b0384165f81815260018301602052604081205461020757508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610161565b5f60208284031215610272575f5ffd5b81516001600160a01b038116811461015e575f5ffd5b6080516145fb6102a75f395f818161080f015261212901526145fb5ff3fe608060405234801561000f575f5ffd5b50600436106102e5575f3560e01c806391de4d0711610195578063c8558f1b116100e4578063d547741f1161009e578063ddb2924711610079578063ddb29247146107cf578063ea5e0c60146107e2578063ed421a9c1461080a578063f9a6466414610831575f5ffd5b8063d547741f146107a0578063d627d25e146107b3578063d918a16e146107c6575f5ffd5b8063c8558f1b1461072d578063ca15c87314610740578063cfe9232b14610753578063d04cffeb14610767578063d1af1fbc1461077a578063d382fe921461078d575f5ffd5b8063b33712c51161014f578063be32ee261161012a578063be32ee261461067a578063c0680e201461068d578063c0aa0e8a146106a0578063c5f0d05c1461071a575f5ffd5b8063b33712c5146105ff578063bc063e1a14610607578063bc3b2b1214610610575f5ffd5b806391de4d071461058c5780639b299d9a1461059f5780639cd85b5b146105b2578063a217fddf146105c5578063a3246ad3146105cc578063b2f5de94146105ec575f5ffd5b806336568abe116102515780637b30564e1161020b5780638dbdbe6d116101e65780638dbdbe6d146105145780639010d07c14610527578063909b2bb81461055257806391d1485414610579575f5ffd5b80637b30564e146104935780637bde82f2146104a65780638ad59c70146104b9575f5ffd5b806336568abe1461041e578063439766ce146104315780635c975abb146104395780636247f6f2146104465780636e76fc8f14610459578063725dafe014610480575f5ffd5b8063172c44ec116102a2578063172c44ec146103a75780631b014e85146103ba57806324760807146103cd578063248a9ca3146103d657806327507458146103f85780632f2ff15d1461040b575f5ffd5b806301ffc9a7146102e957806306b40ea3146103115780630868335e146103325780630fb81eb4146103525780631227b40214610367578063154347b514610387575b5f5ffd5b6102fc6102f7366004613ee7565b610844565b60405190151581526020015b60405180910390f35b61032461031f366004613f22565b61086e565b604051908152602001610308565b610345610340366004613f4c565b610899565b6040516103089190614053565b6103656103603660046140a1565b610949565b005b61037a6103753660046140a1565b610ade565b60405161030891906140b8565b61039a6103953660046140c7565b610bca565b60405161030891906140e2565b6103246103b53660046140a1565b610c33565b61039a6103c83660046140c7565b610c3d565b61032460045481565b6103246103e43660046140a1565b5f9081526020819052604090206001015490565b6102fc6104063660046140a1565b610ca4565b610365610419366004614119565b610d28565b61036561042c366004614119565b610d52565b610365610d8a565b6003546102fc9060ff1681565b6103656104543660046140c7565b610dee565b6103247f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6381565b61036561048e366004614119565b610fd4565b6102fc6104a1366004613f22565b6110f3565b6103246104b4366004614119565b6111a1565b6104cc6104c7366004613f22565b6115dc565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015263ffffffff90811660a08401521660c082015260e001610308565b610365610522366004614147565b611647565b61053a61053536600461417d565b611cbd565b6040516001600160a01b039091168152602001610308565b6103247fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e81565b6102fc610587366004614119565b611cdb565b6102fc61059a36600461419d565b611d03565b6103656105ad3660046140c7565b611dff565b6102fc6105c03660046140c7565b611f31565b6103245f81565b6105df6105da3660046140a1565b611f49565b60405161030891906141c9565b6103656105fa3660046140a1565b611f62565b610365612192565b6103246103e881565b61065061061e3660046140a1565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a001610308565b6103656106883660046140c7565b6121f3565b61032461069b366004613f22565b612270565b6106b36106ae3660046140a1565b612289565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff9081166101208401521661014082015261016001610308565b610365610728366004614221565b612309565b61032461073b366004613f22565b6123aa565b61032461074e3660046140a1565b61259b565b6103245f5160206145a65f395f51905f5281565b61039a6107753660046140c7565b6125b1565b61053a6107883660046140a1565b612697565b61032461079b3660046140a1565b6126bf565b6103656107ae366004614119565b6127a9565b6103656107c13660046140c7565b6127cd565b610324600e5481565b6103246107dd3660046142d6565b6128a6565b61053a6107f03660046140a1565b600a6020525f90815260409020546001600160a01b031681565b61053a7f000000000000000000000000000000000000000000000000000000000000000081565b61032461083f366004613f22565b61303c565b5f6001600160e01b03198216635a05180f60e01b1480610868575061086882613047565b92915050565b600c602052815f5260405f208181548110610887575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff8111156108b5576108b561423a565b6040519080825280602002602001820160405280156108ee57816020015b6108db613e17565b8152602001906001900390816108d35790505b5090505f5b838110156109415761091c85858381811061091057610910614369565b90506020020135610ade565b82828151811061092e5761092e614369565b60209081029190910101526001016108f3565b509392505050565b5f5160206145a65f395f51905f526109608161307b565b60035460ff161561098c5760405162461bcd60e51b81526004016109839061437d565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109e15760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b6044820152606401610983565b42600683815481106109f5576109f5614369565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f60068381548110610a3557610a35614369565b905f5260205f2090600a02016003015460068481548110610a5857610a58614369565b905f5260205f2090600a020160020154610a7291906143bd565b9050610aaf338260068681548110610a8c57610a8c614369565b5f91825260209091206001600a9092020101546001600160a01b03169190613088565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610ae6613e17565b5f60068381548110610afa57610afa614369565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610b42856130e7565b8152602001610b50856126bf565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610ba185610ca4565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610c2757602002820191905f5260205f20905b815481526020019060010190808311610c13575b50505050509050919050565b5f610868826130e7565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c2757602002820191905f5260205f2090815481526020019060010190808311610c135750505050509050919050565b5f60068281548110610cb857610cb8614369565b5f91825260209091206009600a90920201015463ffffffff164211801590610868575060068281548110610cee57610cee614369565b905f5260205f2090600a02016006015460068381548110610d1157610d11614369565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610d428161307b565b610d4c83836130f1565b50505050565b6001600160a01b0381163314610d7b5760405163334bd91960e11b815260040160405180910390fd5b610d85828261311c565b505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63610db48161307b565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e610e188161307b565b6001600160a01b038216610e665760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606401610983565b6001600160a01b0382165f9081526009602052604090205460ff1615610ece5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c6973746564000000000000006044820152606401610983565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f28575060408051601f3d908101601f19168201909252610f25918101906143d0565b60015b610f6a5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b6044820152606401610983565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b0316331461102c5760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b6044820152606401610983565b6110435f5160206145a65f395f51905f5282611cdb565b6110805760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b6044820152606401610983565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061111f5761111f614369565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c090910181905242101591505092915050565b5f6111aa613147565b6001600160a01b0382165f908152600d602052604081205490808267ffffffffffffffff8111156111dd576111dd61423a565b604051908082528060200260200182016040528015611206578160200160208202803683370190505b5090505f805b84811015611324576001600160a01b0387165f908152600d6020526040812080548390811061123d5761123d614369565b905f5260205f20906006020190508881600401540361131b575f61126189846123aa565b90508015611319576001600160a01b0389165f908152600d6020526040902080548291908590811061129557611295614369565b905f5260205f2090600602016002015f8282546112b291906143bd565b909155506112c2905081876143f0565b95506112dc898260068d81548110610a8c57610a8c614369565b81600201545f036113195760018584815181106112fb576112fb614369565b911515602092830291909101909101528361131581614403565b9450505b505b5060010161120c565b5080156115cc575f61133682866143bd565b67ffffffffffffffff81111561134e5761134e61423a565b6040519080825280602002602001820160405280156113cd57816020015b6113ba6040518060e001604052805f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f63ffffffff1681526020015f63ffffffff1681525090565b81526020019060019003908161136c5790505b5090505f805b868110156114cb578481815181106113ed576113ed614369565b60200260200101516114c3576001600160a01b0389165f908152600d6020526040902080548290811061142257611422614369565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c082015283518490849081106114a9576114a9614369565b602002602001018190525081806114bf90614403565b9250505b6001016113d3565b506001600160a01b0388165f908152600d602052604081206114ec91613e7d565b5f5b82518110156115c8576001600160a01b0389165f908152600d60205260409020835184908390811061152257611522614369565b6020908102919091018101518254600181810185555f94855293839020825160069092020180546001600160a01b039092166001600160a01b0319909216919091178155918101518284015560408101516002830155606081015160038301556080810151600483015560a08101516005909201805460c09092015163ffffffff908116600160201b0267ffffffffffffffff19909316931692909217179055016114ee565b5050505b5090925050506108686001600255565b600d602052815f5260405f2081815481106115f5575f80fd5b5f9182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909163ffffffff80821691600160201b90041687565b61164f613147565b6001600160a01b03811661169c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b6044820152606401610983565b60065483106116e15760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b6044820152606401610983565b5f600684815481106116f5576116f5614369565b5f9182526020909120600a90910201600981015490915063ffffffff164211156117525760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b6044820152606401610983565b80600601548160030154106117a95760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e6420636170616369747920726561636865640000006044820152606401610983565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156117ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181391906143d0565b90505f61181f8261319e565b9050808510156118715760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c64006044820152606401610983565b61187a866131c9565b6118838661330b565b5f61188d876133cc565b90505f816118a388670de0b6b3a764000061441b565b6118ad9190614432565b90505f612710866003015487600601546118c791906143bd565b6118d39061070861441b565b6118dd9190614432565b90508082111561192f5760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f776564006044820152606401610983565b856006015482876003015461194491906143f0565b11156119925760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e642064656274000000000000006044820152606401610983565b85546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190614451565b9050611a166001600160a01b03831633308d613625565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611a5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a7e9190614451565b90508a611a8b83836143bd565b14611ad85760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e74000000000000006044820152606401610983565b8a60068d81548110611aec57611aec614369565b905f5260205f2090600a02016007015f828254611b0991906143f0565b925050819055508460068d81548110611b2457611b24614369565b905f5260205f2090600a02016003015f828254611b4191906143f0565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160e08101845260018e0154909416845290830188905290820187905260608201889052608082018e905263ffffffff4281811660a085015260098d015492939260c0840192611bbb9291600160201b9004166143f0565b63ffffffff9081169091528254600181810185555f948552602094859020845160069093020180546001600160a01b039384166001600160a01b031990911617815594840151908501556040808401516002860155606084015160038601556080840151600486015560a08401516005909501805460c0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611ca2908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d856001600255565b5f828152600160205260408120611cd4908361365e565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611d5d57602002820191905f5260205f20905b815481526020019060010190808311611d49575b509394505f93505050505b8151811015611df557846001600160a01b0316600a5f848481518110611d9057611d90614369565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611ddd5750611ddd828281518110611dd057611dd0614369565b6020026020010151610ca4565b15611ded57600192505050610868565b600101611d68565b505f949350505050565b5f611e098161307b565b6001600160a01b038216611e5f5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e65657220616464726573730000000000006044820152606401610983565b611e765f5160206145a65f395f51905f5283611cdb565b15611ebb5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b6044820152606401610983565b611ed25f5160206145a65f395f51905f52836130f1565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f5160206145a65f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108685f5160206145a65f395f51905f5283611cdb565b5f81815260016020526040902060609061086890613669565b5f5160206145a65f395f51905f52611f798161307b565b60035460ff1615611f9c5760405162461bcd60e51b81526004016109839061437d565b5f828152600a60205260409020546001600160a01b031633146120015760405162461bcd60e51b815260206004820152601760248201527f4e6f74206d61726b657427732061756374696f6e6565720000000000000000006044820152606401610983565b6006828154811061201457612014614369565b5f91825260209091206009600a90920201015463ffffffff1642116120745760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b6044820152606401610983565b5f6006838154811061208857612088614369565b5f91825260208220600a9091020154600680546001600160a01b03909216935090859081106120b9576120b9614369565b5f918252602082206007600a909202010154600e549092501561210057612710600e54836120e7919061441b565b6120f19190614432565b90506120fd81836143bd565b91505b6121146001600160a01b0384163384613088565b801561214e5761214e6001600160a01b0384167f000000000000000000000000000000000000000000000000000000000000000083613088565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a636121bc8161307b565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f6121fd8161307b565b6122145f5160206145a65f395f51905f528361311c565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f5160206145a65f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f208181548110610887575f80fd5b60068181548110612298575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f6123138161307b565b6103e88263ffffffff16111561235a5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b6044820152606401610983565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d602052604081208054829190849081106123d6576123d6614369565b5f91825260208083206040805160e081018252600694850290920180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260048201546080820181905260059092015463ffffffff80821660a0840152600160201b9091041660c08201528254909450811061245d5761245d614369565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b039081168452600182015416938301939093526002830154908201526003820154606082015260048201546080820152600582015460a080830191909152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b9091048116610140830152918401519092501642101561251d575f92505050610868565b5f81610140015163ffffffff1690505f8360c0015163ffffffff1642116125585760a08401516125539063ffffffff16426143bd565b61255a565b815b90505f82856020015161256d9190614432565b90505f61257a838361441b565b9050856040015181111561258f575060408501515b98975050505050505050565b5f81815260016020526040812061086890613675565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff8111156125e5576125e561423a565b60405190808252806020026020018201604052801561260e578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d6020526040902054811015612690576001600160a01b0384165f908152600d6020526040902080548290811061265b5761265b614369565b905f5260205f2090600602016004015482828151811061267d5761267d614369565b6020908102919091010152600101612613565b5092915050565b600581815481106126a6575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f600683815481106126d4576126d4614369565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b9091041661014084015291935061278691906143bd565b90506127106127978261070861441b565b6127a19190614432565b949350505050565b5f828152602081905260409020600101546127c38161307b565b610d4c838361311c565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e6127f78161307b565b6001600160a01b0382165f9081526009602052604090205460ff166128565760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610983565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06191016110e7565b5f5f5160206145a65f395f51905f526128be8161307b565b60035460ff16156128e15760405162461bcd60e51b81526004016109839061437d565b6001600160a01b03861661292e5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b6044820152606401610983565b6001600160a01b03851661297a5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b6044820152606401610983565b856001600160a01b0316856001600160a01b0316036129db5760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e7400000000000000006044820152606401610983565b6001600160a01b0386165f9081526009602052604090205460ff16612a3a5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610983565b612a443386611d03565b15612a9c5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b6064820152608401610983565b82514263ffffffff90911611612ae95760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b6044820152606401610983565b8351612b2c5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b6044820152606401610983565b6020840151612b7d5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e2030000000006044820152606401610983565b6040840151612bce5760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e2030000000000000006044820152606401610983565b6060840151612c165760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b6044820152606401610983565b82515f90612c2b90429063ffffffff166143bd565b90505f8111612c755760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b6044820152606401610983565b5f876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cb2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cd691906143d0565b9050612d063330612ce884600a61454b565b8951612cf4919061441b565b6001600160a01b038c16929190613625565b60408051610160810182526001600160a01b03808a1682528a1660208201526006918101612d3584600a61454b565b8951612d41919061441b565b81525f60208083019190915289015160408201526060016103e88960026020020151612d7590670de0b6b3a764000061441b565b612d7f9190614432565b8152602001612d8f84600a61454b565b60608a0151612d9e919061441b565b81526020015f8152602001428152602001875f60028110612dc157612dc1614369565b602002015163ffffffff16815260200187600160028110612de457612de4614369565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f896001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612fdd90614403565b909155506001600160a01b03808916908a16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978a6001602002015160405161302891815260200190565b60405180910390a498975050505050505050565b5f611cd483836123aa565b5f6001600160e01b03198216637965db0b60e01b148061086857506301ffc9a760e01b6001600160e01b0319831614610868565b613085813361367e565b50565b6040516001600160a01b03838116602483015260448201839052610d8591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506136b7565b5f610868826133cc565b5f5f6130fd8484613723565b90508015611cd4575f84815260016020526040902061094190846137b2565b5f5f61312884846137c6565b90508015611cd4575f848152600160205260409020610941908461382f565b60028054036131985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610983565b60028055565b5f60028260ff1611156131c1576131b6600283614559565b61086890600a61454b565b506001919050565b5f81815260076020526040902060038101546004909101546131eb91906143f0565b421115613085575f6006828154811061320657613206614369565b5f91825260208083208584526007909152604090922054600a909102909101915060ff1615613291575f82815260076020526040812060010154600483018054919290916132559084906143f0565b90915550505f8281526007602052604090206002015460048201541061328c575f8281526007602052604090206002015460048201555b6132ee565b5f82815260076020526040812060010154600483018054919290916132b79084906143bd565b90915550505f828152600760205260409020600201546004820154116132ee575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061331f5761331f614369565b905f5260205f2090600a020190505f81600301549050805f0361334157505050565b5f82600801544261335291906143bd565b9050805f036133615750505050565b60098301545f9061338090600160201b900463ffffffff166064614572565b63ffffffff16613390838561441b565b61339a9190614432565b90508281116133b2576133ad81846143bd565b6133b4565b5f5b600385015550505063ffffffff421660089091015550565b5f5f600683815481106133e1576133e1614369565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416848401819052600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa1580156134b8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134dc91906143d0565b90505f825f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561351e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061354291906143d0565b90505f61354e86613843565b90505f61355a87613a6f565b90505f83613569866024614559565b6135739190614559565b61357e90600a61454b565b613588838561441b565b613592919061441b565b9050670de0b6b3a76400006135a78183614432565b6135b19190614432565b96508560a001518710156135c7578560a0015196505b6135da670de0b6b3a76400005f19614432565b87111561361a5760405162461bcd60e51b815260206004820152600e60248201526d5072696365206f766572666c6f7760901b6044820152606401610983565b505050505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d4c9186918216906323b872dd906084016130b5565b5f611cd48383613c72565b60605f611cd483613c98565b5f610868825490565b6136888282611cdb565b610fd05760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610983565b5f5f60205f8451602086015f885af1806136d6576040513d5f823e3d81fd5b50505f513d915081156136ed5780600114156136fa565b6001600160a01b0384163b155b15610d4c57604051635274afe760e01b81526001600160a01b0385166004820152602401610983565b5f61372e8383611cdb565b6137ab575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556137633390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610868565b505f610868565b5f611cd4836001600160a01b038416613cef565b5f6137d18383611cdb565b156137ab575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610868565b5f611cd4836001600160a01b038416613d34565b5f5f6006838154811061385857613858614369565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a52888c2089519889018a52805460ff161515895296870154998801999099529385015496860196909652908301549084015292015492810192909252519193509161395786613a6f565b90505f84610120015163ffffffff164211613972575f613988565b6101208501516139889063ffffffff16426143bd565b90505f8560c0015183670de0b6b3a76400006139a4919061441b565b6139ae9190614432565b90505f6139bc8360016143f0565b6139c6838761441b565b6139d09190614432565b9050856060015186608001516139e691906143f0565b4211613a4257855115613a1d576020860151613a0290866143f0565b94508560400151851115613a1857856040015194505b613a42565b6020860151613a2c90866143bd565b94508560400151851015613a4257856040015194505b80851115613a6157613a5481866143bd565b9998505050505050505050565b505f98975050505050505050565b5f5f60068381548110613a8457613a84614369565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613b5c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8091906143d0565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613be791906143d0565b90505f613bf5826012614559565b613c0090600a61454b565b8460600151613c0f919061441b565b90505f613c1d846012614559565b613c2890600a61454b565b8560e00151613c37919061441b565b9050805f03613c545750670de0b6b3a76400009695505050505050565b5f81613c6884670de0b6b3a764000061441b565b61258f9190614432565b5f825f018281548110613c8757613c87614369565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c2757602002820191905f5260205f2090815481526020019060010190808311610c135750505050509050919050565b5f8181526001830160205260408120546137ab57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610868565b5f8181526001830160205260408120548015613e0e575f613d566001836143bd565b85549091505f90613d69906001906143bd565b9050808214613dc8575f865f018281548110613d8757613d87614369565b905f5260205f200154905080875f018481548110613da757613da7614369565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613dd957613dd9614591565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610868565b5f915050610868565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5080545f8255600602905f5260205f209081019061308591905b80821115613ee35780546001600160a01b03191681555f600182018190556002820181905560038201819055600482015560058101805467ffffffffffffffff19169055600601613e97565b5090565b5f60208284031215613ef7575f5ffd5b81356001600160e01b031981168114611cd4575f5ffd5b6001600160a01b0381168114613085575f5ffd5b5f5f60408385031215613f33575f5ffd5b8235613f3e81613f0e565b946020939093013593505050565b5f5f60208385031215613f5d575f5ffd5b823567ffffffffffffffff811115613f73575f5ffd5b8301601f81018513613f83575f5ffd5b803567ffffffffffffffff811115613f99575f5ffd5b8560208260051b8401011115613fad575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613fe460208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015161402760c08401826001600160a01b03169052565b5060e081015161403b60e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b818110156140965761407f838551613fbd565b60209390930192610140929092019160010161406c565b509095945050505050565b5f602082840312156140b1575f5ffd5b5035919050565b61014081016108688284613fbd565b5f602082840312156140d7575f5ffd5b8135611cd481613f0e565b602080825282518282018190525f918401906040840190835b818110156140965783518352602093840193909201916001016140fb565b5f5f6040838503121561412a575f5ffd5b82359150602083013561413c81613f0e565b809150509250929050565b5f5f5f60608486031215614159575f5ffd5b8335925060208401359150604084013561417281613f0e565b809150509250925092565b5f5f6040838503121561418e575f5ffd5b50508035926020909101359150565b5f5f604083850312156141ae575f5ffd5b82356141b981613f0e565b9150602083013561413c81613f0e565b602080825282518282018190525f918401906040840190835b818110156140965783516001600160a01b03168352602093840193909201916001016141e2565b803563ffffffff8116811461421c575f5ffd5b919050565b5f60208284031215614231575f5ffd5b611cd482614209565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561428357634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f83011261429a575f5ffd5b6142a4604061424e565b8060408401858111156142b5575f5ffd5b845b81811015614096576142c881614209565b8452602093840193016142b7565b5f5f5f5f61010085870312156142ea575f5ffd5b84356142f581613f0e565b9350602085013561430581613f0e565b9250605f85018613614315575f5ffd5b61431f608061424e565b8060c0870188811115614330575f5ffd5b604088015b8181101561434d578035845260209384019301614335565b5081945061435b898261428b565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610868576108686143a9565b5f602082840312156143e0575f5ffd5b815160ff81168114611cd4575f5ffd5b80820180821115610868576108686143a9565b5f60018201614414576144146143a9565b5060010190565b8082028115828204841417610868576108686143a9565b5f8261444c57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614461575f5ffd5b5051919050565b6001815b60018411156144a357808504811115614487576144876143a9565b600184161561449557908102905b60019390931c92800261446c565b935093915050565b5f826144b957506001610868565b816144c557505f610868565b81600181146144db57600281146144e557614501565b6001915050610868565b60ff8411156144f6576144f66143a9565b50506001821b610868565b5060208310610133831016604e8410600b8410161715614524575081810a610868565b6145305f198484614468565b805f1904821115614543576145436143a9565b029392505050565b5f611cd460ff8416836144ab565b60ff8281168282160390811115610868576108686143a9565b63ffffffff8181168382160290811690818114612690576126906143a9565b634e487b7160e01b5f52603160045260245ffdfec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891a2646970667358221220a2568472f289c853c91a98c2f2172fe71ba21f3da6bdbf07d456c82f74a2ced464736f6c634300081c00330000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106102e5575f3560e01c806391de4d0711610195578063c8558f1b116100e4578063d547741f1161009e578063ddb2924711610079578063ddb29247146107cf578063ea5e0c60146107e2578063ed421a9c1461080a578063f9a6466414610831575f5ffd5b8063d547741f146107a0578063d627d25e146107b3578063d918a16e146107c6575f5ffd5b8063c8558f1b1461072d578063ca15c87314610740578063cfe9232b14610753578063d04cffeb14610767578063d1af1fbc1461077a578063d382fe921461078d575f5ffd5b8063b33712c51161014f578063be32ee261161012a578063be32ee261461067a578063c0680e201461068d578063c0aa0e8a146106a0578063c5f0d05c1461071a575f5ffd5b8063b33712c5146105ff578063bc063e1a14610607578063bc3b2b1214610610575f5ffd5b806391de4d071461058c5780639b299d9a1461059f5780639cd85b5b146105b2578063a217fddf146105c5578063a3246ad3146105cc578063b2f5de94146105ec575f5ffd5b806336568abe116102515780637b30564e1161020b5780638dbdbe6d116101e65780638dbdbe6d146105145780639010d07c14610527578063909b2bb81461055257806391d1485414610579575f5ffd5b80637b30564e146104935780637bde82f2146104a65780638ad59c70146104b9575f5ffd5b806336568abe1461041e578063439766ce146104315780635c975abb146104395780636247f6f2146104465780636e76fc8f14610459578063725dafe014610480575f5ffd5b8063172c44ec116102a2578063172c44ec146103a75780631b014e85146103ba57806324760807146103cd578063248a9ca3146103d657806327507458146103f85780632f2ff15d1461040b575f5ffd5b806301ffc9a7146102e957806306b40ea3146103115780630868335e146103325780630fb81eb4146103525780631227b40214610367578063154347b514610387575b5f5ffd5b6102fc6102f7366004613ee7565b610844565b60405190151581526020015b60405180910390f35b61032461031f366004613f22565b61086e565b604051908152602001610308565b610345610340366004613f4c565b610899565b6040516103089190614053565b6103656103603660046140a1565b610949565b005b61037a6103753660046140a1565b610ade565b60405161030891906140b8565b61039a6103953660046140c7565b610bca565b60405161030891906140e2565b6103246103b53660046140a1565b610c33565b61039a6103c83660046140c7565b610c3d565b61032460045481565b6103246103e43660046140a1565b5f9081526020819052604090206001015490565b6102fc6104063660046140a1565b610ca4565b610365610419366004614119565b610d28565b61036561042c366004614119565b610d52565b610365610d8a565b6003546102fc9060ff1681565b6103656104543660046140c7565b610dee565b6103247f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6381565b61036561048e366004614119565b610fd4565b6102fc6104a1366004613f22565b6110f3565b6103246104b4366004614119565b6111a1565b6104cc6104c7366004613f22565b6115dc565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015263ffffffff90811660a08401521660c082015260e001610308565b610365610522366004614147565b611647565b61053a61053536600461417d565b611cbd565b6040516001600160a01b039091168152602001610308565b6103247fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e81565b6102fc610587366004614119565b611cdb565b6102fc61059a36600461419d565b611d03565b6103656105ad3660046140c7565b611dff565b6102fc6105c03660046140c7565b611f31565b6103245f81565b6105df6105da3660046140a1565b611f49565b60405161030891906141c9565b6103656105fa3660046140a1565b611f62565b610365612192565b6103246103e881565b61065061061e3660046140a1565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a001610308565b6103656106883660046140c7565b6121f3565b61032461069b366004613f22565b612270565b6106b36106ae3660046140a1565b612289565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff9081166101208401521661014082015261016001610308565b610365610728366004614221565b612309565b61032461073b366004613f22565b6123aa565b61032461074e3660046140a1565b61259b565b6103245f5160206145a65f395f51905f5281565b61039a6107753660046140c7565b6125b1565b61053a6107883660046140a1565b612697565b61032461079b3660046140a1565b6126bf565b6103656107ae366004614119565b6127a9565b6103656107c13660046140c7565b6127cd565b610324600e5481565b6103246107dd3660046142d6565b6128a6565b61053a6107f03660046140a1565b600a6020525f90815260409020546001600160a01b031681565b61053a7f0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a581565b61032461083f366004613f22565b61303c565b5f6001600160e01b03198216635a05180f60e01b1480610868575061086882613047565b92915050565b600c602052815f5260405f208181548110610887575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff8111156108b5576108b561423a565b6040519080825280602002602001820160405280156108ee57816020015b6108db613e17565b8152602001906001900390816108d35790505b5090505f5b838110156109415761091c85858381811061091057610910614369565b90506020020135610ade565b82828151811061092e5761092e614369565b60209081029190910101526001016108f3565b509392505050565b5f5160206145a65f395f51905f526109608161307b565b60035460ff161561098c5760405162461bcd60e51b81526004016109839061437d565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109e15760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b6044820152606401610983565b42600683815481106109f5576109f5614369565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f60068381548110610a3557610a35614369565b905f5260205f2090600a02016003015460068481548110610a5857610a58614369565b905f5260205f2090600a020160020154610a7291906143bd565b9050610aaf338260068681548110610a8c57610a8c614369565b5f91825260209091206001600a9092020101546001600160a01b03169190613088565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610ae6613e17565b5f60068381548110610afa57610afa614369565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610b42856130e7565b8152602001610b50856126bf565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610ba185610ca4565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610c2757602002820191905f5260205f20905b815481526020019060010190808311610c13575b50505050509050919050565b5f610868826130e7565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c2757602002820191905f5260205f2090815481526020019060010190808311610c135750505050509050919050565b5f60068281548110610cb857610cb8614369565b5f91825260209091206009600a90920201015463ffffffff164211801590610868575060068281548110610cee57610cee614369565b905f5260205f2090600a02016006015460068381548110610d1157610d11614369565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610d428161307b565b610d4c83836130f1565b50505050565b6001600160a01b0381163314610d7b5760405163334bd91960e11b815260040160405180910390fd5b610d85828261311c565b505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63610db48161307b565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e610e188161307b565b6001600160a01b038216610e665760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606401610983565b6001600160a01b0382165f9081526009602052604090205460ff1615610ece5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c6973746564000000000000006044820152606401610983565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f28575060408051601f3d908101601f19168201909252610f25918101906143d0565b60015b610f6a5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b6044820152606401610983565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b0316331461102c5760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b6044820152606401610983565b6110435f5160206145a65f395f51905f5282611cdb565b6110805760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b6044820152606401610983565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061111f5761111f614369565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c090910181905242101591505092915050565b5f6111aa613147565b6001600160a01b0382165f908152600d602052604081205490808267ffffffffffffffff8111156111dd576111dd61423a565b604051908082528060200260200182016040528015611206578160200160208202803683370190505b5090505f805b84811015611324576001600160a01b0387165f908152600d6020526040812080548390811061123d5761123d614369565b905f5260205f20906006020190508881600401540361131b575f61126189846123aa565b90508015611319576001600160a01b0389165f908152600d6020526040902080548291908590811061129557611295614369565b905f5260205f2090600602016002015f8282546112b291906143bd565b909155506112c2905081876143f0565b95506112dc898260068d81548110610a8c57610a8c614369565b81600201545f036113195760018584815181106112fb576112fb614369565b911515602092830291909101909101528361131581614403565b9450505b505b5060010161120c565b5080156115cc575f61133682866143bd565b67ffffffffffffffff81111561134e5761134e61423a565b6040519080825280602002602001820160405280156113cd57816020015b6113ba6040518060e001604052805f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f63ffffffff1681526020015f63ffffffff1681525090565b81526020019060019003908161136c5790505b5090505f805b868110156114cb578481815181106113ed576113ed614369565b60200260200101516114c3576001600160a01b0389165f908152600d6020526040902080548290811061142257611422614369565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c082015283518490849081106114a9576114a9614369565b602002602001018190525081806114bf90614403565b9250505b6001016113d3565b506001600160a01b0388165f908152600d602052604081206114ec91613e7d565b5f5b82518110156115c8576001600160a01b0389165f908152600d60205260409020835184908390811061152257611522614369565b6020908102919091018101518254600181810185555f94855293839020825160069092020180546001600160a01b039092166001600160a01b0319909216919091178155918101518284015560408101516002830155606081015160038301556080810151600483015560a08101516005909201805460c09092015163ffffffff908116600160201b0267ffffffffffffffff19909316931692909217179055016114ee565b5050505b5090925050506108686001600255565b600d602052815f5260405f2081815481106115f5575f80fd5b5f9182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909163ffffffff80821691600160201b90041687565b61164f613147565b6001600160a01b03811661169c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b6044820152606401610983565b60065483106116e15760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b6044820152606401610983565b5f600684815481106116f5576116f5614369565b5f9182526020909120600a90910201600981015490915063ffffffff164211156117525760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b6044820152606401610983565b80600601548160030154106117a95760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e6420636170616369747920726561636865640000006044820152606401610983565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156117ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181391906143d0565b90505f61181f8261319e565b9050808510156118715760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c64006044820152606401610983565b61187a866131c9565b6118838661330b565b5f61188d876133cc565b90505f816118a388670de0b6b3a764000061441b565b6118ad9190614432565b90505f612710866003015487600601546118c791906143bd565b6118d39061070861441b565b6118dd9190614432565b90508082111561192f5760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f776564006044820152606401610983565b856006015482876003015461194491906143f0565b11156119925760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e642064656274000000000000006044820152606401610983565b85546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff9190614451565b9050611a166001600160a01b03831633308d613625565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611a5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a7e9190614451565b90508a611a8b83836143bd565b14611ad85760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e74000000000000006044820152606401610983565b8a60068d81548110611aec57611aec614369565b905f5260205f2090600a02016007015f828254611b0991906143f0565b925050819055508460068d81548110611b2457611b24614369565b905f5260205f2090600a02016003015f828254611b4191906143f0565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160e08101845260018e0154909416845290830188905290820187905260608201889052608082018e905263ffffffff4281811660a085015260098d015492939260c0840192611bbb9291600160201b9004166143f0565b63ffffffff9081169091528254600181810185555f948552602094859020845160069093020180546001600160a01b039384166001600160a01b031990911617815594840151908501556040808401516002860155606084015160038601556080840151600486015560a08401516005909501805460c0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611ca2908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d856001600255565b5f828152600160205260408120611cd4908361365e565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611d5d57602002820191905f5260205f20905b815481526020019060010190808311611d49575b509394505f93505050505b8151811015611df557846001600160a01b0316600a5f848481518110611d9057611d90614369565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611ddd5750611ddd828281518110611dd057611dd0614369565b6020026020010151610ca4565b15611ded57600192505050610868565b600101611d68565b505f949350505050565b5f611e098161307b565b6001600160a01b038216611e5f5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e65657220616464726573730000000000006044820152606401610983565b611e765f5160206145a65f395f51905f5283611cdb565b15611ebb5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b6044820152606401610983565b611ed25f5160206145a65f395f51905f52836130f1565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f5160206145a65f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108685f5160206145a65f395f51905f5283611cdb565b5f81815260016020526040902060609061086890613669565b5f5160206145a65f395f51905f52611f798161307b565b60035460ff1615611f9c5760405162461bcd60e51b81526004016109839061437d565b5f828152600a60205260409020546001600160a01b031633146120015760405162461bcd60e51b815260206004820152601760248201527f4e6f74206d61726b657427732061756374696f6e6565720000000000000000006044820152606401610983565b6006828154811061201457612014614369565b5f91825260209091206009600a90920201015463ffffffff1642116120745760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b6044820152606401610983565b5f6006838154811061208857612088614369565b5f91825260208220600a9091020154600680546001600160a01b03909216935090859081106120b9576120b9614369565b5f918252602082206007600a909202010154600e549092501561210057612710600e54836120e7919061441b565b6120f19190614432565b90506120fd81836143bd565b91505b6121146001600160a01b0384163384613088565b801561214e5761214e6001600160a01b0384167f0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a583613088565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a636121bc8161307b565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f6121fd8161307b565b6122145f5160206145a65f395f51905f528361311c565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f5160206145a65f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f208181548110610887575f80fd5b60068181548110612298575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f6123138161307b565b6103e88263ffffffff16111561235a5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b6044820152606401610983565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d602052604081208054829190849081106123d6576123d6614369565b5f91825260208083206040805160e081018252600694850290920180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260048201546080820181905260059092015463ffffffff80821660a0840152600160201b9091041660c08201528254909450811061245d5761245d614369565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b039081168452600182015416938301939093526002830154908201526003820154606082015260048201546080820152600582015460a080830191909152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b9091048116610140830152918401519092501642101561251d575f92505050610868565b5f81610140015163ffffffff1690505f8360c0015163ffffffff1642116125585760a08401516125539063ffffffff16426143bd565b61255a565b815b90505f82856020015161256d9190614432565b90505f61257a838361441b565b9050856040015181111561258f575060408501515b98975050505050505050565b5f81815260016020526040812061086890613675565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff8111156125e5576125e561423a565b60405190808252806020026020018201604052801561260e578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d6020526040902054811015612690576001600160a01b0384165f908152600d6020526040902080548290811061265b5761265b614369565b905f5260205f2090600602016004015482828151811061267d5761267d614369565b6020908102919091010152600101612613565b5092915050565b600581815481106126a6575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f600683815481106126d4576126d4614369565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b9091041661014084015291935061278691906143bd565b90506127106127978261070861441b565b6127a19190614432565b949350505050565b5f828152602081905260409020600101546127c38161307b565b610d4c838361311c565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e6127f78161307b565b6001600160a01b0382165f9081526009602052604090205460ff166128565760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610983565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06191016110e7565b5f5f5160206145a65f395f51905f526128be8161307b565b60035460ff16156128e15760405162461bcd60e51b81526004016109839061437d565b6001600160a01b03861661292e5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b6044820152606401610983565b6001600160a01b03851661297a5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b6044820152606401610983565b856001600160a01b0316856001600160a01b0316036129db5760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e7400000000000000006044820152606401610983565b6001600160a01b0386165f9081526009602052604090205460ff16612a3a5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610983565b612a443386611d03565b15612a9c5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b6064820152608401610983565b82514263ffffffff90911611612ae95760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b6044820152606401610983565b8351612b2c5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b6044820152606401610983565b6020840151612b7d5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e2030000000006044820152606401610983565b6040840151612bce5760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e2030000000000000006044820152606401610983565b6060840151612c165760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b6044820152606401610983565b82515f90612c2b90429063ffffffff166143bd565b90505f8111612c755760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b6044820152606401610983565b5f876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cb2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cd691906143d0565b9050612d063330612ce884600a61454b565b8951612cf4919061441b565b6001600160a01b038c16929190613625565b60408051610160810182526001600160a01b03808a1682528a1660208201526006918101612d3584600a61454b565b8951612d41919061441b565b81525f60208083019190915289015160408201526060016103e88960026020020151612d7590670de0b6b3a764000061441b565b612d7f9190614432565b8152602001612d8f84600a61454b565b60608a0151612d9e919061441b565b81526020015f8152602001428152602001875f60028110612dc157612dc1614369565b602002015163ffffffff16815260200187600160028110612de457612de4614369565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f896001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612fdd90614403565b909155506001600160a01b03808916908a16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978a6001602002015160405161302891815260200190565b60405180910390a498975050505050505050565b5f611cd483836123aa565b5f6001600160e01b03198216637965db0b60e01b148061086857506301ffc9a760e01b6001600160e01b0319831614610868565b613085813361367e565b50565b6040516001600160a01b03838116602483015260448201839052610d8591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506136b7565b5f610868826133cc565b5f5f6130fd8484613723565b90508015611cd4575f84815260016020526040902061094190846137b2565b5f5f61312884846137c6565b90508015611cd4575f848152600160205260409020610941908461382f565b60028054036131985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610983565b60028055565b5f60028260ff1611156131c1576131b6600283614559565b61086890600a61454b565b506001919050565b5f81815260076020526040902060038101546004909101546131eb91906143f0565b421115613085575f6006828154811061320657613206614369565b5f91825260208083208584526007909152604090922054600a909102909101915060ff1615613291575f82815260076020526040812060010154600483018054919290916132559084906143f0565b90915550505f8281526007602052604090206002015460048201541061328c575f8281526007602052604090206002015460048201555b6132ee565b5f82815260076020526040812060010154600483018054919290916132b79084906143bd565b90915550505f828152600760205260409020600201546004820154116132ee575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061331f5761331f614369565b905f5260205f2090600a020190505f81600301549050805f0361334157505050565b5f82600801544261335291906143bd565b9050805f036133615750505050565b60098301545f9061338090600160201b900463ffffffff166064614572565b63ffffffff16613390838561441b565b61339a9190614432565b90508281116133b2576133ad81846143bd565b6133b4565b5f5b600385015550505063ffffffff421660089091015550565b5f5f600683815481106133e1576133e1614369565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416848401819052600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa1580156134b8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134dc91906143d0565b90505f825f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561351e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061354291906143d0565b90505f61354e86613843565b90505f61355a87613a6f565b90505f83613569866024614559565b6135739190614559565b61357e90600a61454b565b613588838561441b565b613592919061441b565b9050670de0b6b3a76400006135a78183614432565b6135b19190614432565b96508560a001518710156135c7578560a0015196505b6135da670de0b6b3a76400005f19614432565b87111561361a5760405162461bcd60e51b815260206004820152600e60248201526d5072696365206f766572666c6f7760901b6044820152606401610983565b505050505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d4c9186918216906323b872dd906084016130b5565b5f611cd48383613c72565b60605f611cd483613c98565b5f610868825490565b6136888282611cdb565b610fd05760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610983565b5f5f60205f8451602086015f885af1806136d6576040513d5f823e3d81fd5b50505f513d915081156136ed5780600114156136fa565b6001600160a01b0384163b155b15610d4c57604051635274afe760e01b81526001600160a01b0385166004820152602401610983565b5f61372e8383611cdb565b6137ab575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556137633390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610868565b505f610868565b5f611cd4836001600160a01b038416613cef565b5f6137d18383611cdb565b156137ab575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610868565b5f611cd4836001600160a01b038416613d34565b5f5f6006838154811061385857613858614369565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a52888c2089519889018a52805460ff161515895296870154998801999099529385015496860196909652908301549084015292015492810192909252519193509161395786613a6f565b90505f84610120015163ffffffff164211613972575f613988565b6101208501516139889063ffffffff16426143bd565b90505f8560c0015183670de0b6b3a76400006139a4919061441b565b6139ae9190614432565b90505f6139bc8360016143f0565b6139c6838761441b565b6139d09190614432565b9050856060015186608001516139e691906143f0565b4211613a4257855115613a1d576020860151613a0290866143f0565b94508560400151851115613a1857856040015194505b613a42565b6020860151613a2c90866143bd565b94508560400151851015613a4257856040015194505b80851115613a6157613a5481866143bd565b9998505050505050505050565b505f98975050505050505050565b5f5f60068381548110613a8457613a84614369565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613b5c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8091906143d0565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613be791906143d0565b90505f613bf5826012614559565b613c0090600a61454b565b8460600151613c0f919061441b565b90505f613c1d846012614559565b613c2890600a61454b565b8560e00151613c37919061441b565b9050805f03613c545750670de0b6b3a76400009695505050505050565b5f81613c6884670de0b6b3a764000061441b565b61258f9190614432565b5f825f018281548110613c8757613c87614369565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c2757602002820191905f5260205f2090815481526020019060010190808311610c135750505050509050919050565b5f8181526001830160205260408120546137ab57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610868565b5f8181526001830160205260408120548015613e0e575f613d566001836143bd565b85549091505f90613d69906001906143bd565b9050808214613dc8575f865f018281548110613d8757613d87614369565b905f5260205f200154905080875f018481548110613da757613da7614369565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613dd957613dd9614591565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610868565b5f915050610868565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5080545f8255600602905f5260205f209081019061308591905b80821115613ee35780546001600160a01b03191681555f600182018190556002820181905560038201819055600482015560058101805467ffffffffffffffff19169055600601613e97565b5090565b5f60208284031215613ef7575f5ffd5b81356001600160e01b031981168114611cd4575f5ffd5b6001600160a01b0381168114613085575f5ffd5b5f5f60408385031215613f33575f5ffd5b8235613f3e81613f0e565b946020939093013593505050565b5f5f60208385031215613f5d575f5ffd5b823567ffffffffffffffff811115613f73575f5ffd5b8301601f81018513613f83575f5ffd5b803567ffffffffffffffff811115613f99575f5ffd5b8560208260051b8401011115613fad575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613fe460208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015161402760c08401826001600160a01b03169052565b5060e081015161403b60e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b818110156140965761407f838551613fbd565b60209390930192610140929092019160010161406c565b509095945050505050565b5f602082840312156140b1575f5ffd5b5035919050565b61014081016108688284613fbd565b5f602082840312156140d7575f5ffd5b8135611cd481613f0e565b602080825282518282018190525f918401906040840190835b818110156140965783518352602093840193909201916001016140fb565b5f5f6040838503121561412a575f5ffd5b82359150602083013561413c81613f0e565b809150509250929050565b5f5f5f60608486031215614159575f5ffd5b8335925060208401359150604084013561417281613f0e565b809150509250925092565b5f5f6040838503121561418e575f5ffd5b50508035926020909101359150565b5f5f604083850312156141ae575f5ffd5b82356141b981613f0e565b9150602083013561413c81613f0e565b602080825282518282018190525f918401906040840190835b818110156140965783516001600160a01b03168352602093840193909201916001016141e2565b803563ffffffff8116811461421c575f5ffd5b919050565b5f60208284031215614231575f5ffd5b611cd482614209565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561428357634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f83011261429a575f5ffd5b6142a4604061424e565b8060408401858111156142b5575f5ffd5b845b81811015614096576142c881614209565b8452602093840193016142b7565b5f5f5f5f61010085870312156142ea575f5ffd5b84356142f581613f0e565b9350602085013561430581613f0e565b9250605f85018613614315575f5ffd5b61431f608061424e565b8060c0870188811115614330575f5ffd5b604088015b8181101561434d578035845260209384019301614335565b5081945061435b898261428b565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610868576108686143a9565b5f602082840312156143e0575f5ffd5b815160ff81168114611cd4575f5ffd5b80820180821115610868576108686143a9565b5f60018201614414576144146143a9565b5060010190565b8082028115828204841417610868576108686143a9565b5f8261444c57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614461575f5ffd5b5051919050565b6001815b60018411156144a357808504811115614487576144876143a9565b600184161561449557908102905b60019390931c92800261446c565b935093915050565b5f826144b957506001610868565b816144c557505f610868565b81600181146144db57600281146144e557614501565b6001915050610868565b60ff8411156144f6576144f66143a9565b50506001821b610868565b5060208310610133831016604e8410600b8410161715614524575081810a610868565b6145305f198484614468565b805f1904821115614543576145436143a9565b029392505050565b5f611cd460ff8416836144ab565b60ff8281168282160390811115610868576108686143a9565b63ffffffff8181168382160290811690818114612690576126906143a9565b634e487b7160e01b5f52603160045260245ffdfec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891a2646970667358221220a2568472f289c853c91a98c2f2172fe71ba21f3da6bdbf07d456c82f74a2ced464736f6c634300081c0033
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
50500:24350:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44037:214;;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;44037:214:0;;;;;;;;52164:53;;;;;;:::i;:::-;;:::i;:::-;;;1247:25:1;;;1235:2;1220:18;52164:53:0;1101:177:1;67669:342:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57060:393::-;;;;;;:::i;:::-;;:::i;:::-;;67013:648;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64703:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65760:107::-;;;;;;:::i;:::-;;:::i;64853:138::-;;;;;;:::i;:::-;;:::i;51786:28::-;;;;;;27110:122;;;;;;:::i;:::-;27175:7;27202:12;;;;;;;;;;:22;;;;27110:122;65328:162;;;;;;:::i;:::-;;:::i;27542:138::-;;;;;;:::i;:::-;;:::i;28679:251::-;;;;;;:::i;:::-;;:::i;63989:165::-;;;:::i;50865:18::-;;;;;;;;;63209:525;;;;;;:::i;:::-;;:::i;50776:80::-;;50823:33;50776:80;;58181:350;;;;;;:::i;:::-;;:::i;68165:174::-;;;;;;:::i;:::-;;:::i;60429:1838::-;;;;;;:::i;:::-;;:::i;52224:43::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6367:32:1;;;6349:51;;6431:2;6416:18;;6409:34;;;;6459:18;;;6452:34;;;;6517:2;6502:18;;6495:34;;;;6560:3;6545:19;;6538:35;6622:10;6610:23;;;6387:3;6589:19;;6582:52;6671:23;6665:3;6650:19;;6643:52;6336:3;6321:19;52224:43:0;6038:663:1;58658:1764:0;;;;;;:::i;:::-;;:::i;44850:144::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7713:32:1;;;7695:51;;7683:2;7668:18;44850:144:0;7549:203:1;50685:84:0;;50734:35;50685:84;;26126:138;;;;;;:::i;:::-;;:::i;74361:375::-;;;;;;:::i;:::-;;:::i;62405:489::-;;;;;;:::i;:::-;;:::i;65879:127::-;;;;;;:::i;:::-;;:::i;25438:49::-;;25483:4;25438:49;;45854:138;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57459:710::-;;;;;;:::i;:::-;;:::i;64162:170::-;;;:::i;52341:38::-;;52375:4;52341:38;;51886:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9070:14:1;;9063:22;9045:41;;9117:2;9102:18;;9095:34;;;;9145:18;;;9138:34;;;;9203:2;9188:18;;9181:34;9246:3;9231:19;;9224:35;9032:3;9017:19;51886:45:0;8792:473:1;62902:298:0;;;;;;:::i;:::-;;:::i;52105:52::-;;;;;;:::i;:::-;;:::i;51859:20::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9712:32:1;;;9694:51;;9781:32;;;;9776:2;9761:18;;9754:60;9830:18;;;9823:34;;;;9888:2;9873:18;;9866:34;;;;9931:3;9916:19;;9909:35;;;;9732:3;9960:19;;9953:35;;;;10019:3;10004:19;;9997:35;10063:3;10048:19;;10041:35;10107:3;10092:19;;10085:35;10169:10;10157:23;;;10151:3;10136:19;;10129:52;10218:24;10212:3;10197:19;;10190:53;9681:3;9666:19;51859:20:0;9270:979:1;64339:237:0;;;;;;:::i;:::-;;:::i;66013:990::-;;;;;;:::i;:::-;;:::i;45168:133::-;;;;;;:::i;:::-;;:::i;50608:70::-;;-1:-1:-1;;;;;;;;;;;50608:70:0;;64999:316;;;;;;:::i;:::-;;:::i;51821:31::-;;;;;;:::i;:::-;;:::i;65504:244::-;;;;;;:::i;:::-;;:::i;27973:140::-;;;;;;:::i;:::-;;:::i;63742:232::-;;;;;;:::i;:::-;;:::i;52311:23::-;;;;;;54674:2377;;;;;;:::i;:::-;;:::i;52043:55::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;52043:55:0;;;52275:29;;;;;68017:141;;;;;;:::i;:::-;;:::i;44037:214::-;44122:4;-1:-1:-1;;;;;;44146:57:0;;-1:-1:-1;;;44146:57:0;;:97;;;44207:36;44231:11;44207:23;:36::i;:::-;44139:104;44037:214;-1:-1:-1;;44037:214:0:o;52164:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67669:342::-;67754:23;67786:31;67841:9;67820:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;67786:72:0;-1:-1:-1;67876:9:0;67871:110;67891:20;;;67871:110;;;67942:31;67960:9;;67970:1;67960:12;;;;;;;:::i;:::-;;;;;;;67942:17;:31::i;:::-;67929:7;67937:1;67929:10;;;;;;;;:::i;:::-;;;;;;;;;;:44;67913:3;;67871:110;;;-1:-1:-1;68000:7:0;67669:342;-1:-1:-1;;;67669:342:0:o;57060:393::-;-1:-1:-1;;;;;;;;;;;25722:16:0;25733:4;25722:10;:16::i;:::-;74795:6:::1;::::0;::::1;;74794:7;74786:38;;;;-1:-1:-1::0;;;74786:38:0::1;;;;;;;:::i;:::-;;;;;;;;;57152:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57152:25:0::2;57181:10;57152:39;57148:69;;57193:24;::::0;-1:-1:-1;;;57193:24:0;;13492:2:1;57193:24:0::2;::::0;::::2;13474:21:1::0;13531:2;13511:18;;;13504:30;-1:-1:-1;;;13550:18:1;;;13543:43;13603:18;;57193:24:0::2;13290:337:1::0;57148:69:0::2;57253:15;57224:5;57230:3;57224:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:45;;;;;;;;;;;;;;;;;;57278:18;57325:5;57331:3;57325:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;57299:5;57305:3;57299:10;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:46;;;;:::i;:::-;57278:67;;57354;57398:10;57410;57361:5;57367:3;57361:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:22:::2;:10;::::0;;::::2;;:22;::::0;-1:-1:-1;;;;;57361:22:0::2;::::0;57354:67;:43:::2;:67::i;:::-;57435:14;::::0;57445:3;;57435:14:::2;::::0;;;::::2;57141:312;57060:393:::0;;:::o;67013:648::-;67079:21;;:::i;:::-;67113:18;67134:5;67140:8;67134:15;;;;;;;;:::i;:::-;;;;;;;;;;67177:476;;;;;;;;67134:15;;;;;;;67219;;-1:-1:-1;;;;;67219:15:0;;;67177:476;;67219:15;67262:16;;;;67177:476;;;;;;;67134:15;;-1:-1:-1;67177:476:0;;;67300:24;67315:8;67300:14;:24::i;:::-;67177:476;;;;67350:26;67367:8;67350:16;:26::i;:::-;67177:476;;67404:16;;;;-1:-1:-1;;;67404:16:0;;;;67177:476;;;;;;;;67450:17;;;;67177:476;;;;;;;;-1:-1:-1;67494:30:0;;;:20;:30;;;;;;-1:-1:-1;;;;;67494:30:0;67177:476;;;;;;67547:16;67494:30;67547:6;:16::i;:::-;67177:476;;;;67589:14;;;;67177:476;;;;67628:13;;;;;;;67177:476;;;;;;;;67170:483;67013:648;-1:-1:-1;;67013:648:0:o;64703:142::-;-1:-1:-1;;;;;64810:27:0;;;;;;:15;:27;;;;;;;;;64803:34;;;;;;;;;;;;;;;;;64773:16;;64803:34;;;64810:27;64803:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64703:142;;;:::o;65760:107::-;65812:7;65840:19;65855:3;65840:14;:19::i;64853:138::-;-1:-1:-1;;;;;64959:24:0;;;;;;:16;:24;;;;;;;;;64952:31;;;;;;;;;;;;;;;;;64920:16;;64952:31;;;64959:24;64952:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64853:138;;;:::o;65328:162::-;65378:4;65422:5;65428:3;65422:10;;;;;;;;:::i;:::-;;;;;;;;;:19;:10;;;;;:19;;;;65403:15;:38;;;;:83;;;65468:5;65474:3;65468:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;65445:5;65451:3;65445:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:41;65396:90;65328:162;-1:-1:-1;;65328:162:0:o;27542:138::-;27175:7;27202:12;;;;;;;;;;:22;;;25722:16;25733:4;25722:10;:16::i;:::-;27647:25:::1;27658:4;27664:7;27647:10;:25::i;:::-;;27542:138:::0;;;:::o;28679:251::-;-1:-1:-1;;;;;28773:34:0;;22431:10;28773:34;28769:104;;28831:30;;-1:-1:-1;;;28831:30:0;;;;;;;;;;;28769:104;28885:37;28897:4;28903:18;28885:11;:37::i;:::-;;28679:251;;:::o;63989:165::-;50823:33;25722:16;25733:4;25722:10;:16::i;:::-;64091:6:::1;:13:::0;;-1:-1:-1;;64091:13:0::1;64100:4;64091:13;::::0;;64120:26:::1;::::0;64135:10:::1;::::0;64120:26:::1;::::0;64091:6:::1;::::0;64120:26:::1;63989:165:::0;:::o;63209:525::-;50734:35;25722:16;25733:4;25722:10;:16::i;:::-;-1:-1:-1;;;;;63336:20:0;::::1;63328:54;;;::::0;-1:-1:-1;;;63328:54:0;;14099:2:1;63328:54:0::1;::::0;::::1;14081:21:1::0;14138:2;14118:18;;;14111:30;-1:-1:-1;;;14157:18:1;;;14150:51;14218:18;;63328:54:0::1;13897:345:1::0;63328:54:0::1;-1:-1:-1::0;;;;;63402:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;63401:26;63393:64;;;::::0;-1:-1:-1;;;63393:64:0;;14449:2:1;63393:64:0::1;::::0;::::1;14431:21:1::0;14488:2;14468:18;;;14461:30;14527:27;14507:18;;;14500:55;14572:18;;63393:64:0::1;14247:349:1::0;63393:64:0::1;63529:6;-1:-1:-1::0;;;;;63514:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;63514:33:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;63514:33:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;63510:217;;63686:29;::::0;-1:-1:-1;;;63686:29:0;;15081:2:1;63686:29:0::1;::::0;::::1;15063:21:1::0;15120:2;15100:18;;;15093:30;-1:-1:-1;;;15139:18:1;;;15132:49;15198:18;;63686:29:0::1;14879:343:1::0;63510:217:0::1;-1:-1:-1::0;;;;;;63579:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;:32;;-1:-1:-1;;63579:32:0::1;63607:4;63579:32:::0;;::::1;::::0;;;63626:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;63626:26:0::1;::::0;;::::1;::::0;;63510:217:::1;63209:525:::0;;:::o;58181:350::-;58270:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;58270:30:0;58304:10;58270:44;58262:73;;;;-1:-1:-1;;;58262:73:0;;15429:2:1;58262:73:0;;;15411:21:1;15468:2;15448:18;;;15441:30;-1:-1:-1;;;15487:18:1;;;15480:46;15543:18;;58262:73:0;15227:340:1;58262:73:0;58350:39;-1:-1:-1;;;;;;;;;;;58375:13:0;58350:7;:39::i;:::-;58342:66;;;;-1:-1:-1;;;58342:66:0;;15774:2:1;58342:66:0;;;15756:21:1;15813:2;15793:18;;;15786:30;-1:-1:-1;;;15832:18:1;;;15825:44;15886:18;;58342:66:0;15572:338:1;58342:66:0;58415:30;;;;:20;:30;;;;;;;;;:46;;-1:-1:-1;;;;;;58415:46:0;-1:-1:-1;;;;;58415:46:0;;;;;;;;58473:54;;16117:25:1;;;58501:10:0;16158:18:1;;;16151:60;;;;16227:18;;;16220:60;;;;58473:54:0;;16105:2:1;16090:18;58473:54:0;;;;;;;;58181:350;;:::o;68165:174::-;-1:-1:-1;;;;;68267:14:0;;68235:4;68267:14;;;:8;:14;;;;;:23;;68235:4;;68267:14;68282:7;;68267:23;;;;;;:::i;:::-;;;;;;;;;;68248:42;;;;;;;;68267:23;;;;;;;68248:42;;-1:-1:-1;;;;;68248:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68248:42:0;;;;;;;;;;;68304:15;:31;;;-1:-1:-1;;68165:174:0;;;;:::o;60429:1838::-;60503:22;48945:21;:19;:21::i;:::-;-1:-1:-1;;;;;60551:14:0;::::1;60534;60551::::0;;;:8:::1;:14;::::0;;;;:21;;60534:14;60551:21;60636:18:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;60636:18:0::1;-1:-1:-1::0;60611:43:0;-1:-1:-1;60661:19:0::1;::::0;60768:692:::1;60792:6;60788:1;:10;60768:692;;;-1:-1:-1::0;;;;;60843:14:0;::::1;60816:24;60843:14:::0;;;:8:::1;:14;::::0;;;;:17;;60858:1;;60843:17;::::1;;;;;:::i;:::-;;;;;;;;;;;60816:44;;60899:3;60875:11;:20;;;:27:::0;60871:582:::1;;60919:14;60936:30;60958:4;60964:1;60936:21;:30::i;:::-;60919:47:::0;-1:-1:-1;60999:10:0;;60995:447:::1;;-1:-1:-1::0;;;;;61030:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:17;;61062:6;;61030:14;61045:1;;61030:17;::::1;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;61087:23:0::1;::::0;-1:-1:-1;61104:6:0;61087:23;::::1;:::i;:::-;;;61147:57;61191:4;61197:6;61154:5;61160:3;61154:10;;;;;;;;:::i;61147:57::-;61301:11;:22;;;61327:1;61301:27:::0;61297:130:::1;;61367:4;61353:8;61362:1;61353:11;;;;;;;;:::i;:::-;:18:::0;::::1;;:11;::::0;;::::1;::::0;;;;;;;:18;61394:13;::::1;::::0;::::1;:::i;:::-;;;;61297:130;60904:549;60871:582;-1:-1:-1::0;60800:3:0::1;;60768:692;;;-1:-1:-1::0;61529:15:0;;61525:706:::1;;61607:28;61649:20;61658:11:::0;61649:6;:20:::1;:::i;:::-;61638:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61638:32:0::1;;;;;;;;;;;;;;;;-1:-1:-1::0;61607:63:0;-1:-1:-1;61681:16:0::1;::::0;61770:189:::1;61794:6;61790:1;:10;61770:189;;;61827:8;61836:1;61827:11;;;;;;;;:::i;:::-;;;;;;;61822:126;;-1:-1:-1::0;;;;;61886:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:17;;61901:1;;61886:17;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;61859:44:::1;::::0;;::::1;::::0;::::1;::::0;;61886:17:::1;::::0;;::::1;::::0;;::::1;61859:44:::0;;-1:-1:-1;;;;;61859:44: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;;;61859:44:0;;::::1;;::::0;;;;:24;;:14;;61874:8;;61859:24;::::1;;;;;:::i;:::-;;;;;;:44;;;;61922:10;;;;;:::i;:::-;;;;61822:126;61802:3;;61770:189;;;-1:-1:-1::0;;;;;;62019:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;62012:21:::1;::::0;::::1;:::i;:::-;62112:9;62107:117;62131:14;:21;62127:1;:25;62107:117;;;-1:-1:-1::0;;;;;62174:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;62194:17;;:14;;62209:1;;62194:17;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;62174:38;;::::1;::::0;;::::1;::::0;;-1:-1:-1;62174:38:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;62174:38:0;;::::1;-1:-1:-1::0;;;;;;62174:38: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;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;62174:38:0::1;-1:-1:-1::0;;62174:38:0;;;;::::1;::::0;;;;::::1;::::0;;62154:3:::1;62107:117;;;;61546:685;;61525:706;-1:-1:-1::0;62250:13:0;;-1:-1:-1;;;48989:20:0;48383:1;49509:7;:22;49326:213;52224:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52224:43:0;;;;-1:-1:-1;52224:43:0;;-1:-1:-1;52224:43:0;;;;;;;;-1:-1:-1;;;52224:43:0;;;;:::o;58658:1764::-;48945:21;:19;:21::i;:::-;-1:-1:-1;;;;;58753:18:0;::::1;58745:51;;;::::0;-1:-1:-1;;;58745:51:0;;16763:2:1;58745:51:0::1;::::0;::::1;16745:21:1::0;16802:2;16782:18;;;16775:30;-1:-1:-1;;;16821:18:1;;;16814:50;16881:18;;58745:51:0::1;16561:344:1::0;58745:51:0::1;58817:5;:12:::0;58811:18;::::1;58803:48;;;::::0;-1:-1:-1;;;58803:48:0;;17112:2:1;58803:48:0::1;::::0;::::1;17094:21:1::0;17151:2;17131:18;;;17124:30;-1:-1:-1;;;17170:18:1;;;17163:47;17227:18;;58803:48:0::1;16910:341:1::0;58803:48:0::1;58858:18;58879:5;58885:3;58879:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;58923:13;::::0;::::1;::::0;58879:10;;-1:-1:-1;58923:13:0::1;;58904:15;:32;;58896:59;;;::::0;-1:-1:-1;;;58896:59:0;;17458:2:1;58896:59:0::1;::::0;::::1;17440:21:1::0;17497:2;17477:18;;;17470:30;-1:-1:-1;;;17516:18:1;;;17509:44;17570:18;;58896:59:0::1;17256:338:1::0;58896:59:0::1;58987:4;:12;;;58970:4;:14;;;:29;58962:71;;;::::0;-1:-1:-1;;;58962:71:0;;17801:2:1;58962:71:0::1;::::0;::::1;17783:21:1::0;17840:2;17820:18;;;17813:30;17879:31;17859:18;;;17852:59;17928:18;;58962:71:0::1;17599:353:1::0;58962:71:0::1;59087:15:::0;;59064:51:::1;::::0;;-1:-1:-1;;;59064:51:0;;;;59042:19:::1;::::0;-1:-1:-1;;;;;59087:15:0::1;::::0;59064:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;59087:15;59064:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59042:73;;59122:22;59147:38;59171:13;59147:23;:38::i;:::-;59122:63;;59210:14;59200:6;:24;;59192:68;;;::::0;-1:-1:-1;;;59192:68:0;;18159:2:1;59192:68:0::1;::::0;::::1;18141:21:1::0;18198:2;18178:18;;;18171:30;18237:33;18217:18;;;18210:61;18288:18;;59192:68:0::1;17957:355:1::0;59192:68:0::1;59269:10;59275:3;59269:5;:10::i;:::-;59286:15;59297:3;59286:10;:15::i;:::-;59310:13;59326:17;59339:3;59326:12;:17::i;:::-;59310:33:::0;-1:-1:-1;59350:14:0::1;59310:33:::0;59368:13:::1;:6:::0;59377:4:::1;59368:13;:::i;:::-;59367:23;;;;:::i;:::-;59350:40;;59397:17;59460:5;59434:4;:14;;;59419:4;:12;;;:29;;;;:::i;:::-;59418:38;::::0;59452:4:::1;59418:38;:::i;:::-;59417:48;;;;:::i;:::-;59397:68;;59496:9;59486:6;:19;;59478:63;;;::::0;-1:-1:-1;;;59478:63:0;;18914:2:1;59478:63:0::1;::::0;::::1;18896:21:1::0;18953:2;18933:18;;;18926:30;18992:33;18972:18;;;18965:61;19043:18;;59478:63:0::1;18712:355:1::0;59478:63:0::1;59583:4;:12;;;59573:6;59556:4;:14;;;:23;;;;:::i;:::-;:39;;59548:77;;;::::0;-1:-1:-1;;;59548:77:0;;19274:2:1;59548:77:0::1;::::0;::::1;19256:21:1::0;19313:2;19293:18;;;19286:30;19352:27;19332:18;;;19325:55;19397:18;;59548:77:0::1;19072:349:1::0;59548:77:0::1;59661:15:::0;;59708:35:::1;::::0;-1:-1:-1;;;59708:35:0;;59737:4:::1;59708:35;::::0;::::1;7695:51:1::0;-1:-1:-1;;;;;59661:15:0;;::::1;::::0;59634:17:::1;::::0;59661:15;;59708:20:::1;::::0;7668:18:1;;59708:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59684:59:::0;-1:-1:-1;59750:62:0::1;-1:-1:-1::0;;;;;59750:27:0;::::1;59778:10;59798:4;59805:6:::0;59750:27:::1;:62::i;:::-;59842:35;::::0;-1:-1:-1;;;59842:35:0;;59871:4:::1;59842:35;::::0;::::1;7695:51:1::0;59819:20:0::1;::::0;-1:-1:-1;;;;;59842:20:0;::::1;::::0;::::1;::::0;7668:18:1;;59842:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59819:58:::0;-1:-1:-1;59924:6:0;59892:28:::1;59907:13:::0;59819:58;59892:28:::1;:::i;:::-;:38;59884:76;;;::::0;-1:-1:-1;;;59884:76:0;;19817:2:1;59884:76:0::1;::::0;::::1;19799:21:1::0;19856:2;19836:18;;;19829:30;19895:27;19875:18;;;19868:55;19940:18;;59884:76:0::1;19615:349:1::0;59884:76:0::1;60005:6;59973:5;59979:3;59973:10;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;;;;;;;;60042:6;60018:5;60024:3;60018:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;60057:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;;60077:273;;::::1;::::0;::::1;::::0;;60106:16:::1;::::0;::::1;::::0;;;::::1;60077:273:::0;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;::::1;60264:15;60077:273:::0;;::::1;::::0;;;;60307:16:::1;::::0;::::1;::::0;60057:14;;60077:273;;;;;60307:34:::1;::::0;60264:15;-1:-1:-1;;;60307:16:0;::::1;;:34;:::i;:::-;60077:273;::::0;;::::1;::::0;;;60057:294;;::::1;::::0;;::::1;::::0;;-1:-1:-1;60057:294:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;60057:294:0;;::::1;-1:-1:-1::0;;;;;;60057:294: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;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;60057:294:0::1;-1:-1:-1::0;;60057:294:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;60367:47;;60387:3;;60367:47;::::1;::::0;::::1;::::0;::::1;::::0;60392:6;;60400;;60408:5;;20171:25:1;;;20227:2;20212:18;;20205:34;;;;20270:2;20255:18;;20248:34;20159:2;20144:18;;19969:319;60367:47:0::1;;;;;;;;58738:1684;;;;;;;;;48989:20:::0;48383:1;49509:7;:22;49326:213;44850:144;44931:7;44958:18;;;:12;:18;;;;;:28;;44980:5;44958:21;:28::i;:::-;44951:35;44850:144;-1:-1:-1;;;44850:144:0:o;26126:138::-;26203:4;26227:12;;;;;;;;;;;-1:-1:-1;;;;;26227:29:0;;;;;;;;;;;;;;;26126:138::o;74361:375::-;-1:-1:-1;;;;;74499:27:0;;74459:4;74499:27;;;:15;:27;;;;;;;;74472:54;;;;;;;;;;;;;;;;;74459:4;;74472:54;;74499:27;74472:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74472:54:0;;-1:-1:-1;74537:9:0;;-1:-1:-1;;;;74533:181:0;74556:7;:14;74552:1;:18;74533:181;;;74626:10;-1:-1:-1;;;;;74590:46:0;:20;:32;74611:7;74619:1;74611:10;;;;;;;;:::i;:::-;;;;;;;;;;;;74590:32;;;;;;;;;;-1:-1:-1;74590:32:0;;-1:-1:-1;;;;;74590:32:0;:46;:68;;;;;74640:18;74647:7;74655:1;74647:10;;;;;;;;:::i;:::-;;;;;;;74640:6;:18::i;:::-;74587:120;;;74691:4;74684:11;;;;;;74587:120;74572:3;;74533:181;;;-1:-1:-1;74727:5:0;;74361:375;-1:-1:-1;;;;74361:375:0:o;62405:489::-;25483:4;25722:16;25483:4;25722:10;:16::i;:::-;-1:-1:-1;;;;;62572:25:0;::::1;62564:64;;;::::0;-1:-1:-1;;;62564:64:0;;20495:2:1;62564:64:0::1;::::0;::::1;20477:21:1::0;20534:2;20514:18;;;20507:30;20573:28;20553:18;;;20546:56;20619:18;;62564:64:0::1;20293:350:1::0;62564:64:0::1;62648:37;-1:-1:-1::0;;;;;;;;;;;62673:11:0::1;62648:7;:37::i;:::-;62647:38;62639:72;;;::::0;-1:-1:-1;;;62639:72:0;;20850:2:1;62639:72:0::1;::::0;::::1;20832:21:1::0;20889:2;20869:18;;;20862:30;-1:-1:-1;;;20908:18:1;;;20901:51;20969:18;;62639:72:0::1;20648:345:1::0;62639:72:0::1;62724:40;-1:-1:-1::0;;;;;;;;;;;62752:11:0::1;62724:10;:40::i;:::-;-1:-1:-1::0;;;;;;62775:35:0;::::1;;::::0;;;:22:::1;:35;::::0;;;;;:42;;-1:-1:-1;;62775:42:0::1;62813:4;62775:42;::::0;;62833:53;62875:10:::1;::::0;62775:35;-1:-1:-1;;;;;;;;;;;50650:28:0;62833:53:::1;::::0;62775:35;62833:53:::1;62405:489:::0;;:::o;65879:127::-;65941:4;65965:33;-1:-1:-1;;;;;;;;;;;65990:7:0;65965;:33::i;45854:138::-;45957:18;;;;:12;:18;;;;;45921:16;;45957:27;;:25;:27::i;57459:710::-;-1:-1:-1;;;;;;;;;;;25722:16:0;25733:4;25722:10;:16::i;:::-;74795:6:::1;::::0;::::1;;74794:7;74786:38;;;;-1:-1:-1::0;;;74786:38:0::1;;;;;;;:::i;:::-;57565:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57565:25:0::2;57594:10;57565:39;57557:75;;;::::0;-1:-1:-1;;;57557:75:0;;21200:2:1;57557:75:0::2;::::0;::::2;21182:21:1::0;21239:2;21219:18;;;21212:30;21278:25;21258:18;;;21251:53;21321:18;;57557:75:0::2;20998:347:1::0;57557:75:0::2;57665:5;57671:3;57665:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:19:::2;:10;::::0;;::::2;;:19;::::0;::::2;;57647:15;:37;57639:72;;;::::0;-1:-1:-1;;;57639:72:0;;21552:2:1;57639:72:0::2;::::0;::::2;21534:21:1::0;21591:2;21571:18;;;21564:30;-1:-1:-1;;;21610:18:1;;;21603:52;21672:18;;57639:72:0::2;21350:346:1::0;57639:72:0::2;57720:18;57741:5;57747:3;57741:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:21:::0;57787:5:::2;:10:::0;;-1:-1:-1;;;;;57741:21:0;;::::2;::::0;-1:-1:-1;57787:5:0;57793:3;;57787:10;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:28:::2;:10;::::0;;::::2;;:28;::::0;57853:8:::2;::::0;57787:28;;-1:-1:-1;57853:12:0;57849:102:::2;;57910:5;57898:8;;57888:7;:18;;;;:::i;:::-;57887:28;;;;:::i;:::-;57878:37:::0;-1:-1:-1;57926:17:0::2;57878:37:::0;57926:17;::::2;:::i;:::-;;;57849:102;57959:52;-1:-1:-1::0;;;;;57959:31:0;::::2;57991:10;58003:7:::0;57959:31:::2;:52::i;:::-;58022:10:::0;;58018:80:::2;;58045:45;-1:-1:-1::0;;;;;58045:31:0;::::2;58077:4;58083:6:::0;58045:31:::2;:45::i;:::-;58111:54;::::0;;21875:25:1;;;21931:2;21916:18;;21909:34;;;58137:10:0::2;::::0;58132:3;;58111:54:::2;::::0;21848:18:1;58111:54:0::2;;;;;;;57550:619;;;57459:710:::0;;:::o;64162:170::-;50823:33;25722:16;25733:4;25722:10;:16::i;:::-;64266:6:::1;:14:::0;;-1:-1:-1;;64266:14:0::1;::::0;;64296:28:::1;::::0;64313:10:::1;::::0;64296:28:::1;::::0;64275:5:::1;::::0;64296:28:::1;64162:170:::0;:::o;62902:298::-;25483:4;25722:16;25483:4;25722:10;:16::i;:::-;63028:41:::1;-1:-1:-1::0;;;;;;;;;;;63057:11:0::1;63028;:41::i;:::-;-1:-1:-1::0;;;;;;63080:35:0;::::1;63118:5;63080:35:::0;;;:22:::1;:35;::::0;;;;;:43;;-1:-1:-1;;63080:43:0::1;::::0;;63139:53;63181:10:::1;::::0;63080:35;-1:-1:-1;;;;;;;;;;;50650:28:0;63139:53:::1;::::0;63118:5;63139:53:::1;62902:298:::0;;:::o;52105:52::-;;;;;;;;;;;;;;;;;;;;51859:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51859:20:0;;;;-1:-1:-1;51859:20:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51859:20:0;;;;:::o;64339:237::-;25483:4;25722:16;25483:4;25722:10;:16::i;:::-;52375:4:::1;64432:10;:21;;;;64424:46;;;::::0;-1:-1:-1;;;64424:46:0;;22156:2:1;64424:46:0::1;::::0;::::1;22138:21:1::0;22195:2;22175:18;;;22168:30;-1:-1:-1;;;22214:18:1;;;22207:42;22266:18;;64424:46:0::1;21954:336:1::0;64424:46:0::1;64494:8;::::0;;64509:21:::1;::::0;::::1;::::0;;;;64542:30:::1;::::0;;22468:25:1;;;22524:2;22509:18;;22502:51;;;;64494:8:0;;64542:30:::1;::::0;22441:18:1;64542:30:0::1;;;;;;;64417:159;64339:237:::0;;:::o;66013:990::-;-1:-1:-1;;;;;66131:14:0;;66096:7;66131:14;;;:8;:14;;;;;:23;;66096:7;;66131:14;66146:7;;66131:23;;;;;;:::i;:::-;;;;;;;;;66112:42;;;;;;;;66131:23;;;;;;;66112:42;;-1:-1:-1;;;;;66112:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66112:42:0;;;;;;;;66181:20;;66112:42;;-1:-1:-1;66181:20:0;;;;;;:::i;:::-;;;;;;;;;;66161:40;;;;;;;;66181:20;;;;;;;66161:40;;-1:-1:-1;;;;;66161:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66161:40:0;;;;;;;;;66264:14;;;;66161:40;;-1:-1:-1;66246:32:0;:15;:32;66242:65;;;66298:1;66291:8;;;;;;66242:65;66356:19;66378:4;:16;;;66356:38;;;;66451:19;66491:4;:12;;;66473:30;;:15;:30;:99;;66558:14;;;;66540:32;;;;:15;:32;:::i;:::-;66473:99;;;66516:11;66473:99;66451:121;;66638:23;66685:11;66664:4;:18;;;:32;;;;:::i;:::-;66638:58;-1:-1:-1;66748:24:0;66775:29;66793:11;66638:58;66775:29;:::i;:::-;66748:56;;66898:4;:15;;;66879:16;:34;66875:93;;;-1:-1:-1;66945:15:0;;;;66875:93;66983:16;66013:990;-1:-1:-1;;;;;;;;66013:990:0:o;45168:133::-;45239:7;45266:18;;;:12;:18;;;;;:27;;:25;:27::i;64999:316::-;-1:-1:-1;;;;;65140:14:0;;65095:28;65140:14;;;:8;:14;;;;;:21;65062:16;;65095:28;65126:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65126:36:0;-1:-1:-1;65095:67:0;-1:-1:-1;65174:9:0;65169:114;-1:-1:-1;;;;;65193:14:0;;;;;;:8;:14;;;;;:21;65189:25;;65169:114;;;-1:-1:-1;;;;;65249:14:0;;;;;;:8;:14;;;;;:17;;65264:1;;65249:17;;;;;;:::i;:::-;;;;;;;;;;;:26;;;65232:11;65244:1;65232:14;;;;;;;;:::i;:::-;;;;;;;;;;:43;65216:3;;65169:114;;;-1:-1:-1;65296:11:0;64999:316;-1:-1:-1;;64999:316:0:o;51821:31::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51821:31:0;;-1:-1:-1;51821:31:0;:::o;65504:244::-;65564:7;65583:17;65603:5;65609:3;65603:10;;;;;;;;:::i;:::-;;;;;;;;;65583:30;;;;;;;;65603:10;;;;;;;65583:30;;-1:-1:-1;;;;;65583:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65583:30:0;;;;;;;;;;-1:-1:-1;65647:29:0;;65583:30;65647:29;:::i;:::-;65623:53;-1:-1:-1;65718:5:0;65694:20;65623:53;65710:4;65694:20;:::i;:::-;65693:30;;;;:::i;:::-;65686:37;65504:244;-1:-1:-1;;;;65504:244:0:o;27973:140::-;27175:7;27202:12;;;;;;;;;;:22;;;25722:16;25733:4;25722:10;:16::i;:::-;28079:26:::1;28091:4;28097:7;28079:11;:26::i;63742:232::-:0;50734:35;25722:16;25733:4;25722:10;:16::i;:::-;-1:-1:-1;;;;;63841:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;63833:59;;;::::0;-1:-1:-1;;;63833:59:0;;22766:2:1;63833:59:0::1;::::0;::::1;22748:21:1::0;22805:2;22785:18;;;22778:30;-1:-1:-1;;;22824:18:1;;;22817:51;22885:18;;63833:59:0::1;22564:345:1::0;63833:59:0::1;-1:-1:-1::0;;;;;63899:25:0;::::1;63927:5;63899:25:::0;;;:17:::1;:25;::::0;;;;;;;;:33;;-1:-1:-1;;63899:33:0::1;::::0;;63944:26;;7695:51:1;;;63944:26:0::1;::::0;7668:18:1;63944:26:0::1;7549:203:1::0;54674:2377:0;54963:16;-1:-1:-1;;;;;;;;;;;25722:16:0;25733:4;25722:10;:16::i;:::-;74795:6:::1;::::0;::::1;;74794:7;74786:38;;;;-1:-1:-1::0;;;74786:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55024:26:0;::::2;55016:59;;;::::0;-1:-1:-1;;;55016:59:0;;23116:2:1;55016:59:0::2;::::0;::::2;23098:21:1::0;23155:2;23135:18;;;23128:30;-1:-1:-1;;;23174:18:1;;;23167:50;23234:18;;55016:59:0::2;22914:344:1::0;55016:59:0::2;-1:-1:-1::0;;;;;55090:34:0;::::2;55082:66;;;::::0;-1:-1:-1;;;55082:66:0;;23465:2:1;55082:66:0::2;::::0;::::2;23447:21:1::0;23504:2;23484:18;;;23477:30;-1:-1:-1;;;23523:18:1;;;23516:49;23582:18;;55082:66:0::2;23263:343:1::0;55082:66:0::2;55187:12;-1:-1:-1::0;;;;;55163:36:0::2;55171:11;-1:-1:-1::0;;;;;55163:36:0::2;::::0;55155:73:::2;;;::::0;-1:-1:-1;;;55155:73:0;;23813:2:1;55155:73:0::2;::::0;::::2;23795:21:1::0;23852:2;23832:18;;;23825:30;23891:26;23871:18;;;23864:54;23935:18;;55155:73:0::2;23611:348:1::0;55155:73:0::2;-1:-1:-1::0;;;;;55243:31:0;::::2;;::::0;;;:17:::2;:31;::::0;;;;;::::2;;55235:65;;;::::0;-1:-1:-1;;;55235:65:0;;22766:2:1;55235:65:0::2;::::0;::::2;22748:21:1::0;22805:2;22785:18;;;22778:30;-1:-1:-1;;;22824:18:1;;;22817:51;22885:18;;55235:65:0::2;22564:345:1::0;55235:65:0::2;55316:61;55344:10;55364:11;55316:27;:61::i;:::-;55315:62;55307:109;;;::::0;-1:-1:-1;;;55307:109:0;;24166:2:1;55307:109:0::2;::::0;::::2;24148:21:1::0;24205:2;24185:18;;;24178:30;24244:34;24224:18;;;24217:62;-1:-1:-1;;;24295:18:1;;;24288:32;24337:19;;55307:109:0::2;23964:398:1::0;55307:109:0::2;55462:16:::0;;55481:15:::2;55462:34;::::0;;::::2;;55454:65;;;::::0;-1:-1:-1;;;55454:65:0;;24569:2:1;55454:65:0::2;::::0;::::2;24551:21:1::0;24608:2;24588:18;;;24581:30;-1:-1:-1;;;24627:18:1;;;24620:48;24685:18;;55454:65:0::2;24367:342:1::0;55454:65:0::2;55565:9:::0;;55557:44:::2;;;::::0;-1:-1:-1;;;55557:44:0;;24916:2:1;55557:44:0::2;::::0;::::2;24898:21:1::0;24955:2;24935:18;;;24928:30;-1:-1:-1;;;24974:18:1;;;24967:48;25032:18;;55557:44:0::2;24714:342:1::0;55557:44:0::2;55616:9;::::0;::::2;::::0;55608:54:::2;;;::::0;-1:-1:-1;;;55608:54:0;;25263:2:1;55608:54:0::2;::::0;::::2;25245:21:1::0;25302:2;25282:18;;;25275:30;25341;25321:18;;;25314:58;25389:18;;55608:54:0::2;25061:352:1::0;55608:54:0::2;55677:9:::0;;::::2;::::0;55669:51:::2;;;::::0;-1:-1:-1;;;55669:51:0;;25620:2:1;55669:51:0::2;::::0;::::2;25602:21:1::0;25659:2;25639:18;;;25632:30;25698:27;25678:18;;;25671:55;25743:18;;55669:51:0::2;25418:349:1::0;55669:51:0::2;55735:9:::0;;::::2;::::0;55727:46:::2;;;::::0;-1:-1:-1;;;55727:46:0;;25974:2:1;55727:46:0::2;::::0;::::2;25956:21:1::0;26013:2;25993:18;;;25986:30;-1:-1:-1;;;26032:18:1;;;26025:50;26092:18;;55727:46:0::2;25772:344:1::0;55727:46:0::2;55816:16:::0;;55786:27:::2;::::0;55816:34:::2;::::0;55835:15:::2;::::0;55816:34:::2;;;:::i;:::-;55786:64;;55887:1;55865:19;:23;55857:58;;;::::0;-1:-1:-1;;;55857:58:0;;26323:2:1;55857:58:0::2;::::0;::::2;26305:21:1::0;26362:2;26342:18;;;26335:30;-1:-1:-1;;;26381:18:1;;;26374:52;26443:18;;55857:58:0::2;26121:346:1::0;55857:58:0::2;55978:20;56016:12;-1:-1:-1::0;;;;;56001:37:0::2;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55978:62:::0;-1:-1:-1;56084:96:0::2;56122:10;56142:4;56161:18;55978:62:::0;56161:2:::2;:18;:::i;:::-;56149:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;-1:-1:-1::0;;;;;56084:37:0;::::2;::::0;:96;;:37:::2;:96::i;:::-;56227:450;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;56227:450:0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;56216:5:::2;::::0;56227:450;;56346:18:::2;56350:14:::0;56346:2:::2;:18;:::i;:::-;56334:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;56227:450:::0;;56668:1:::2;56227:450;::::0;;::::2;::::0;;;;56393:9;::::2;::::0;56227:450;;;;;;56451:4:::2;56393:6:::0;56434:1:::2;56427:9;;;::::0;:20:::2;::::0;56439:8:::2;56427:20;:::i;:::-;56426:29;;;;:::i;:::-;56227:450:::0;;::::2;;56486:18;56490:14:::0;56486:2:::2;:18;:::i;:::-;56474:9:::0;;::::2;::::0;:30:::2;::::0;;::::2;:::i;:::-;56227:450;;;;56535:1;56227:450;;;;56557:15;56227:450;;;;56592:13;56606:1;56592:16;;;;;;;:::i;:::-;;;;;56227:450;;;;;;56631:13;56645:1;56631:16;;;;;;;:::i;:::-;;;;;56227:450;;;;::::0;56216:462:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56216:462:0::2;;;;;-1:-1:-1::0;;;;;56216:462:0::2;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56216:462:0::2;;;;;-1:-1:-1::0;;;;;56216:462:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56715:16;56734:13;;56715:32;;56754:16;:30;56771:12;-1:-1:-1::0;;;;;56754:30:0::2;-1:-1:-1::0;;;;;56754:30:0::2;;;;;;;;;;;;56790:8;56754:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56806:15;:37;56830:11;-1:-1:-1::0;;;;;56806:37:0::2;-1:-1:-1::0;;;;;56806:37:0::2;;;;;;;;;;;;56849:8;56806:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56898:10;56865:20;:30;56886:8;56865:30;;;;;;;;;;;;:43;;;;;-1:-1:-1::0;;;;;56865:43:0::2;;;;;-1:-1:-1::0;;;;;56865:43:0::2;;;;;;56923:13;;56921:15;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;56948:71:0;;::::2;::::0;;::::2;56963:8:::0;56948:71:::2;57009:6:::0;57016:1:::2;57009:9;;;;56948:71;;;;1247:25:1::0;;1235:2;1220:18;;1101:177;56948:71:0::2;;;;;;;;57039:8:::0;54674:2377;-1:-1:-1;;;;;;;;54674:2377:0:o;68017:141::-;68088:14;68118:36;68140:4;68146:7;68118:21;:36::i;25830:204::-;25915:4;-1:-1:-1;;;;;;25939:47:0;;-1:-1:-1;;;25939:47:0;;:87;;-1:-1:-1;;;;;;;;;;23403:40:0;;;25990:36;23303:148;26479:105;26546:30;26557:4;22431:10;26546;:30::i;:::-;26479:105;:::o;8976:162::-;9086:43;;-1:-1:-1;;;;;28096:32:1;;;9086:43:0;;;28078:51:1;28145:18;;;28138:34;;;9059:71:0;;9079:5;;9101:14;;;;;28051:18:1;;9086:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9086:43:0;;;;;;;;;;;9059:19;:71::i;71106:139::-;71165:13;71216:17;71229:3;71216:12;:17::i;46099:263::-;46185:4;46202:12;46217:31;46234:4;46240:7;46217:16;:31::i;:::-;46202:46;;46263:7;46259:71;;;46287:18;;;;:12;:18;;;;;:31;;46310:7;46287:22;:31::i;46470:268::-;46557:4;46574:12;46589:32;46607:4;46613:7;46589:17;:32::i;:::-;46574:47;;46636:7;46632:74;;;46660:18;;;;:12;:18;;;;;:34;;46686:7;46660:25;:34::i;49025:293::-;48427:1;49159:7;;:19;49151:63;;;;-1:-1:-1;;;49151:63:0;;28385:2:1;49151:63:0;;;28367:21:1;28424:2;28404:18;;;28397:30;28463:33;28443:18;;;28436:61;28514:18;;49151:63:0;28183:355:1;49151:63:0;48427:1;49292:18;;49025:293::o;73813:340::-;73885:7;74003:1;73992:8;:12;;;73988:96;;;74033:12;74044:1;74033:8;:12;:::i;:::-;74026:20;;:2;:20;:::i;73988:96::-;-1:-1:-1;74101:1:0;;73813:340;-1:-1:-1;73813:340:0:o;68978:783::-;69080:16;;;;:11;:16;;;;;:23;;;;69051:26;;;;;:52;;69080:23;69051:52;:::i;:::-;69033:15;:70;69029:719;;;69116:18;69137:5;69143:3;69137:10;;;;;;;;:::i;:::-;;;;;;;;;69172:16;;;:11;:16;;;;;;;:20;69137:10;;;;;;;;-1:-1:-1;69172:20:0;;69168:500;;;69233:16;;;;:11;:16;;;;;:21;;;69209:20;;;:45;;69233:21;;69209:20;;:45;;69233:21;;69209:45;:::i;:::-;;;;-1:-1:-1;;69311:16:0;;;;:11;:16;;;;;:23;;;69287:20;;;;:47;69283:134;;69378:16;;;;:11;:16;;;;;:23;;;69355:20;;;:46;69283:134;69168:500;;;69473:16;;;;:11;:16;;;;;:21;;;69449:20;;;:45;;69473:21;;69449:20;;:45;;69473:21;;69449:45;:::i;:::-;;;;-1:-1:-1;;69551:16:0;;;;:11;:16;;;;;:23;;;69527:20;;;;:47;69523:134;;69618:16;;;;:11;:16;;;;;:23;;;69595:20;;;:46;69523:134;-1:-1:-1;69688:16:0;;;;:11;:16;;;;;69724:15;69688:52;;:26;;;;:52;68978:783::o;68469:495::-;68518:18;68539:5;68545:3;68539:10;;;;;;;;:::i;:::-;;;;;;;;;;;68518:31;;68562:19;68584:4;:14;;;68562:36;;68609:11;68624:1;68609:16;68605:29;;68627:7;;68469:495;:::o;68605:29::-;68642:26;68689:4;:14;;;68671:15;:32;;;;:::i;:::-;68642:61;;68714:18;68736:1;68714:23;68710:36;;68739:7;;;68469:495;:::o;68710:36::-;68814:16;;;;68760:13;;68814:22;;-1:-1:-1;;;68814:16:0;;;;68833:3;68814:22;:::i;:::-;68776:61;;68777:32;68791:18;68777:11;:32;:::i;:::-;68776:61;;;;:::i;:::-;68760:77;;68876:11;68868:5;:19;:45;;68894:19;68908:5;68894:11;:19;:::i;:::-;68868:45;;;68890:1;68868:45;68851:14;;;:62;-1:-1:-1;;;68920:40:0;68944:15;68920:40;:14;;;;:40;-1:-1:-1;68469:495:0:o;69769:1315::-;69827:13;69849:17;69869:5;69875:3;69869:10;;;;;;;;:::i;:::-;;;;;;;;;69849:30;;;;;;;;69869:10;;;;;;;69849:30;;-1:-1:-1;;;;;69849:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69849:30:0;;;;;;;;69977:52;;-1:-1:-1;;;69977:52:0;;;;69849:30;;-1:-1:-1;69849:30:0;69977:50;;:52;;;;69869:10;;69977:52;;;;;;69849:30;69977:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69954:75;;70036:19;70081:4;:15;;;-1:-1:-1;;;;;70058:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70036:73;;70174:17;70194:28;70218:3;70194:23;:28::i;:::-;70174:48;;70229:17;70249:15;70260:3;70249:10;:15::i;:::-;70229:35;-1:-1:-1;70425:19:0;70503:13;70481:19;70486:14;70481:2;:19;:::i;:::-;:35;;;;:::i;:::-;70474:43;;:2;:43;:::i;:::-;70448:21;70460:9;70448;:21;:::i;:::-;70447:71;;;;:::i;:::-;70425:93;-1:-1:-1;70718:4:0;70697:18;70718:4;70425:93;70697:18;:::i;:::-;:25;;;;:::i;:::-;70689:33;;70804:4;:17;;;70796:5;:25;70792:75;;;70842:4;:17;;;70834:25;;70792:75;71037:24;71057:4;-1:-1:-1;;71037:24:0;:::i;:::-;71028:5;:33;;71020:60;;;;-1:-1:-1;;;71020:60:0;;29150:2:1;71020:60:0;;;29132:21:1;29189:2;29169:18;;;29162:30;-1:-1:-1;;;29208:18:1;;;29201:44;29262:18;;71020:60:0;28948:338:1;71020:60:0;69842:1242;;;;;;69769:1315;;;:::o;9383:190::-;9511:53;;-1:-1:-1;;;;;29511:32:1;;;9511:53:0;;;29493:51:1;29580:32;;;29560:18;;;29553:60;29629:18;;;29622:34;;;9484:81:0;;9504:5;;9526:18;;;;;29466::1;;9511:53:0;29291:371:1;40168:158:0;40242:7;40293:22;40297:3;40309:5;40293:3;:22::i;40876:282::-;40939:16;40968:22;40993:19;41001:3;40993:7;:19::i;39697:117::-;39760:7;39787:19;39795:3;35025:18;;34942:109;26720:201;26809:22;26817:4;26823:7;26809;:22::i;:::-;26804:110;;26855:47;;-1:-1:-1;;;26855:47:0;;-1:-1:-1;;;;;28096:32:1;;26855:47:0;;;28078:51:1;28145:18;;;28138:34;;;28051:18;;26855:47:0;27904:274:1;15569:738:0;15650:18;15679:19;15819:4;15816:1;15809:4;15803:11;15796:4;15790;15786:15;15783:1;15776:5;15769;15764:60;15878:7;15868:180;;15923:4;15917:11;15969:16;15966:1;15961:3;15946:40;16016:16;16011:3;16004:29;15868:180;-1:-1:-1;;16127:1:0;16121:8;16076:16;;-1:-1:-1;16156:15:0;;:68;;16208:11;16223:1;16208:16;;16156:68;;;-1:-1:-1;;;;;16174:26:0;;;:31;16156:68;16152:148;;;16248:40;;-1:-1:-1;;;16248:40:0;;-1:-1:-1;;;;;7713:32:1;;16248:40:0;;;7695:51:1;7668:18;;16248:40:0;7549:203:1;29556:324:0;29633:4;29655:22;29663:4;29669:7;29655;:22::i;:::-;29650:223;;29694:6;:12;;;;;;;;;;;-1:-1:-1;;;;;29694:29:0;;;;;;;;;:36;;-1:-1:-1;;29694:36:0;29726:4;29694:36;;;29777:12;22431:10;;22351:98;29777:12;-1:-1:-1;;;;;29750:40:0;29768:7;-1:-1:-1;;;;;29750:40:0;29762:4;29750:40;;;;;;;;;;-1:-1:-1;29812:4:0;29805:11;;29650:223;-1:-1:-1;29856:5:0;29849:12;;38872:152;38942:4;38966:50;38971:3;-1:-1:-1;;;;;38991:23:0;;38966:4;:50::i;30124:325::-;30202:4;30223:22;30231:4;30237:7;30223;:22::i;:::-;30219:223;;;30294:5;30262:12;;;;;;;;;;;-1:-1:-1;;;;;30262:29:0;;;;;;;;;;:37;;-1:-1:-1;;30262:37:0;;;30319:40;22431:10;;30262:12;;30319:40;;30294:5;30319:40;-1:-1:-1;30381:4:0;30374:11;;39200:158;39273:4;39297:53;39305:3;-1:-1:-1;;;;;39325:23:0;;39297:7;:53::i;72165:1580::-;72234:7;72250:17;72270:5;72276:3;72270:10;;;;;;;;:::i;:::-;;;;;;;;;72250:30;;;;;;;;72270:10;;;;;;;72250:30;;-1:-1:-1;;;;;72250:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72250:30:0;;;;;;;;72314:16;;;;;;;;;72287:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72386:20;72250:30;;-1:-1:-1;72287:43:0;72484:15;72326:3;72484:10;:15::i;:::-;72457:42;;72506:26;72553:4;:13;;;72535:31;;:15;:31;:89;;72623:1;72535:89;;;72597:13;;;;72579:31;;;;:15;:31;:::i;:::-;72506:118;;72729:25;72785:4;:12;;;72758:16;72777:4;72758:23;;;;:::i;:::-;72757:40;;;;:::i;:::-;72729:68;-1:-1:-1;72841:19:0;72895:22;:18;72916:1;72895:22;:::i;:::-;72864:26;72873:17;72864:6;:26;:::i;:::-;72863:55;;;;:::i;:::-;72841:77;;73034:10;:17;;;73011:10;:20;;;:40;;;;:::i;:::-;72992:15;:59;72988:633;;73068:14;;73064:550;;;73153:15;;;;73143:25;;;;:::i;:::-;;;73252:10;:17;;;73243:6;:26;73239:93;;;73299:10;:17;;;73290:26;;73239:93;73064:550;;;73418:15;;;;73408:25;;;;:::i;:::-;;;73523:10;:17;;;73514:6;:26;73510:93;;;73570:10;:17;;;73561:26;;73510:93;73662:11;73653:6;:20;73649:72;;;73693:20;73702:11;73693:6;:20;:::i;:::-;73686:27;72165:1580;-1:-1:-1;;;;;;;;;72165:1580:0:o;73649:72::-;-1:-1:-1;73740:1:0;;72165:1580;-1:-1:-1;;;;;;;;72165:1580:0:o;71254:898::-;71310:7;71330:17;71350:5;71356:3;71350:10;;;;;;;;:::i;:::-;;;;;;;;;71330:30;;;;;;;;71350:10;;;;;;;71330:30;;-1:-1:-1;;;;;71330:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71330:30:0;;;;;;;;71446:51;;-1:-1:-1;;;71446:51:0;;;;71330:30;;-1:-1:-1;71330:30:0;71446:49;;:51;;;;71350:10;;71446:51;;;;;;71330:30;71446:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71418:80;;71505:20;71557:4;:16;;;-1:-1:-1;;;;;71534:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71505:82;-1:-1:-1;71669:17:0;71712:19;71505:82;71712:2;:19;:::i;:::-;71707:25;;:2;:25;:::i;:::-;71689:4;:14;;;:44;;;;:::i;:::-;71669:64;-1:-1:-1;71799:20:0;71855:18;71860:13;71855:2;:18;:::i;:::-;71848:26;;:2;:26;:::i;:::-;71822:4;:22;;;:53;;;;:::i;:::-;71799:76;;71925:12;71941:1;71925:17;71921:55;;-1:-1:-1;71963:4:0;;71254:898;-1:-1:-1;;;;;;71254:898:0:o;71921:55::-;72066:17;72107:12;72087:16;:9;72099:4;72087:16;:::i;:::-;72086:33;;;;:::i;35405:120::-;35472:7;35499:3;:11;;35511:5;35499:18;;;;;;;;:::i;:::-;;;;;;;;;35492:25;;35405:120;;;;:::o;36075:111::-;36131:16;36167:3;:11;;36160:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36075:111;;;:::o;32647:416::-;32710:4;34822:21;;;:14;;;:21;;;;;;32727:329;;-1:-1:-1;32770:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;32955:18;;32931:21;;;:14;;;:21;;;;;;:42;;;;32988:11;;33239:1400;33305:4;33436:21;;;:14;;;:21;;;;;;33474:13;;33470:1162;;33847:18;33868:12;33879:1;33868:8;:12;:::i;:::-;33915:18;;33847:33;;-1:-1:-1;33895:17:0;;33915:22;;33936:1;;33915:22;:::i;:::-;33895:42;;33972:9;33958:10;:23;33954:385;;34002:17;34022:3;:11;;34034:9;34022:22;;;;;;;;:::i;:::-;;;;;;;;;34002:42;;34172:9;34146:3;:11;;34158:10;34146:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;34287:25;;;:14;;;:25;;;;;:36;;;33954:385;34420:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34526:3;:14;;:21;34541:5;34526:21;;;;;;;;;;;34519:28;;;34571:4;34564:11;;;;;;;33470:1162;34615:5;34608:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;1519:18;1511:6;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;1722:18;1714:6;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;;;-1:-1:-1;3495:3:1;;2799:705;-1:-1:-1;;;;;2799:705:1:o;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;6706:487::-;6783:6;6791;6799;6852:2;6840:9;6831:7;6827:23;6823:32;6820:52;;;6868:1;6865;6858:12;6820:52;6913:23;;;-1:-1:-1;7033:2:1;7018:18;;7005:32;;-1:-1:-1;7115:2:1;7100:18;;7087:32;7128:33;7087:32;7128:33;:::i;:::-;7180:7;7170:17;;;6706:487;;;;;:::o;7198:346::-;7266:6;7274;7327:2;7315:9;7306:7;7302:23;7298:32;7295:52;;;7343:1;7340;7333:12;7295:52;-1:-1:-1;;7388:23:1;;;7508:2;7493:18;;;7480:32;;-1:-1:-1;7198:346:1:o;7757:388::-;7825:6;7833;7886:2;7874:9;7865:7;7861:23;7857:32;7854:52;;;7902:1;7899;7892:12;7854:52;7941:9;7928:23;7960:31;7985:5;7960:31;:::i;:::-;8010:5;-1:-1:-1;8067:2:1;8052:18;;8039:32;8080:33;8039:32;8080:33;:::i;8150:637::-;8340:2;8352:21;;;8422:13;;8325:18;;;8444:22;;;8292:4;;8523:15;;;8497:2;8482:18;;;8292:4;8566:195;8580:6;8577:1;8574:13;8566:195;;;8645:13;;-1:-1:-1;;;;;8641:39:1;8629:52;;8710:2;8736:15;;;;8701:12;;;;8677:1;8595:9;8566:195;;10254:163;10321:20;;10381:10;10370:22;;10360:33;;10350:61;;10407:1;10404;10397:12;10350:61;10254:163;;;:::o;10422:184::-;10480:6;10533:2;10521:9;10512:7;10508:23;10504:32;10501:52;;;10549:1;10546;10539:12;10501:52;10572:28;10590:9;10572:28;:::i;10611:127::-;10672:10;10667:3;10663:20;10660:1;10653:31;10703:4;10700:1;10693:15;10727:4;10724:1;10717:15;10743:372;10814:2;10808:9;10879:2;10860:13;;-1:-1:-1;;10856:27:1;10844:40;;10914:18;10899:34;;10935:22;;;10896:62;10893:185;;;11000:10;10995:3;10991:20;10988:1;10981:31;11035:4;11032:1;11025:15;11063:4;11060:1;11053:15;10893:185;11094:2;11087:22;10743:372;;-1:-1:-1;10743:372:1:o;11120:566::-;11169:5;11222:3;11215:4;11207:6;11203:17;11199:27;11189:55;;11240:1;11237;11230:12;11189:55;11341:19;11319:2;11341:19;:::i;:::-;11384:3;11422:2;11414:6;11410:15;11448:3;11440:6;11437:15;11434:35;;;11465:1;11462;11455:12;11434:35;11489:6;11504:151;11520:6;11515:3;11512:15;11504:151;;;11588:22;11606:3;11588:22;:::i;:::-;11576:35;;11640:4;11631:14;;;;11537;11504:151;;11691:1115;11835:6;11843;11851;11859;11912:3;11900:9;11891:7;11887:23;11883:33;11880:53;;;11929:1;11926;11919:12;11880:53;11968:9;11955:23;11987:31;12012:5;11987:31;:::i;:::-;12037:5;-1:-1:-1;12094:2:1;12079:18;;12066:32;12107:33;12066:32;12107:33;:::i;:::-;12159:7;-1:-1:-1;12204:2:1;12189:18;;12185:32;-1:-1:-1;12175:60:1;;12231:1;12228;12221:12;12175:60;12333:20;12310:3;12333:20;:::i;:::-;12375:3;12416;12405:9;12401:19;12443:7;12435:6;12432:19;12429:39;;;12464:1;12461;12454:12;12429:39;12503:2;12492:9;12488:18;12515:202;12531:6;12526:3;12523:15;12515:202;;;12625:17;;12655:20;;12704:2;12695:12;;;;12548;12515:202;;;12519:3;12736:5;12726:15;;12760:40;12792:7;12784:6;12760:40;:::i;:::-;12750:50;;;;;11691:1115;;;;;;;:::o;12811:127::-;12872:10;12867:3;12863:20;12860:1;12853:31;12903:4;12900:1;12893:15;12927:4;12924:1;12917:15;12943:342;13145:2;13127:21;;;13184:2;13164:18;;;13157:30;-1:-1:-1;;;13218:2:1;13203:18;;13196:48;13276:2;13261:18;;12943:342::o;13632:127::-;13693:10;13688:3;13684:20;13681:1;13674:31;13724:4;13721:1;13714:15;13748:4;13745:1;13738:15;13764:128;13831:9;;;13852:11;;;13849:37;;;13866:18;;:::i;14601:273::-;14669:6;14722:2;14710:9;14701:7;14697:23;14693:32;14690:52;;;14738:1;14735;14728:12;14690:52;14770:9;14764:16;14820:4;14813:5;14809:16;14802:5;14799:27;14789:55;;14840:1;14837;14830:12;16291:125;16356:9;;;16377:10;;;16374:36;;;16390:18;;:::i;16421:135::-;16460:3;16481:17;;;16478:43;;16501:18;;:::i;:::-;-1:-1:-1;16548:1:1;16537:13;;16421:135::o;18317:168::-;18390:9;;;18421;;18438:15;;;18432:22;;18418:37;18408:71;;18459:18;;:::i;18490:217::-;18530:1;18556;18546:132;;18600:10;18595:3;18591:20;18588:1;18581:31;18635:4;18632:1;18625:15;18663:4;18660:1;18653:15;18546:132;-1:-1:-1;18692:9:1;;18490:217::o;19426:184::-;19496:6;19549:2;19537:9;19528:7;19524:23;19520:32;19517:52;;;19565:1;19562;19555:12;19517:52;-1:-1:-1;19588:16:1;;19426:184;-1:-1:-1;19426:184:1:o;26472:375::-;26560:1;26578:5;26592:249;26613:1;26603:8;26600:15;26592:249;;;26663:4;26658:3;26654:14;26648:4;26645:24;26642:50;;;26672:18;;:::i;:::-;26722:1;26712:8;26708:16;26705:49;;;26736:16;;;;26705:49;26819:1;26815:16;;;;;26775:15;;26592:249;;;26472:375;;;;;;:::o;26852:902::-;26901:5;26931:8;26921:80;;-1:-1:-1;26972:1:1;26986:5;;26921:80;27020:4;27010:76;;-1:-1:-1;27057:1:1;27071:5;;27010:76;27102:4;27120:1;27115:59;;;;27188:1;27183:174;;;;27095:262;;27115:59;27145:1;27136:10;;27159:5;;;27183:174;27220:3;27210:8;27207:17;27204:43;;;27227:18;;:::i;:::-;-1:-1:-1;;27283:1:1;27269:16;;27342:5;;27095:262;;27441:2;27431:8;27428:16;27422:3;27416:4;27413:13;27409:36;27403:2;27393:8;27390:16;27385:2;27379:4;27376:12;27372:35;27369:77;27366:203;;;-1:-1:-1;27478:19:1;;;27554:5;;27366:203;27601:42;-1:-1:-1;;27626:8:1;27620:4;27601:42;:::i;:::-;27679:6;27675:1;27671:6;27667:19;27658:7;27655:32;27652:58;;;27690:18;;:::i;:::-;27728:20;;26852:902;-1:-1:-1;;;26852:902:1:o;27759:140::-;27817:5;27846:47;27887:4;27877:8;27873:19;27867:4;27846:47;:::i;28543:151::-;28633:4;28626:12;;;28612;;;28608:31;;28651:14;;28648:40;;;28668:18;;:::i;28699:244::-;28810:10;28783:18;;;28803;;;28779:43;28842:28;;;;28889:24;;;28879:58;;28917:18;;:::i;29946:127::-;30007:10;30002:3;29998:20;29995:1;29988:31;30038:4;30035:1;30028:15;30062:4;30059:1;30052:15
Swarm Source
ipfs://a2568472f289c853c91a98c2f2172fe71ba21f3da6bdbf07d456c82f74a2ced4
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.