Source Code
Overview
S Balance
Token Holdings
More Info
ContractCreator
Latest 5 from a total of 5 transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BondDepository
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at testnet.sonicscan.org on 2025-02-10 */ /** *Submitted for verification at testnet.sonicscan.org on 2025-02-03 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.20; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); } pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC-20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } } pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } pragma solidity ^0.8.20; /** * @dev External interface of AccessControlEnumerable declared to support ERC-165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.20; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.20; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._positions[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._positions[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; assembly ("memory-safe") { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly ("memory-safe") { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly ("memory-safe") { result := store } return result; } } pragma solidity ^0.8.20; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 role => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual returns (uint256) { return _roleMembers[role].length(); } /** * @dev Return all accounts that have `role` * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) { return _roleMembers[role].values(); } /** * @dev Overload {AccessControl-_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override returns (bool) { bool granted = super._grantRole(role, account); if (granted) { _roleMembers[role].add(account); } return granted; } /** * @dev Overload {AccessControl-_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) { bool revoked = super._revokeRole(role, account); if (revoked) { _roleMembers[role].remove(account); } return revoked; } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } //@author 0xPhant0m based on Ohm Bond Depository and Bond Protocol pragma solidity ^0.8.27; contract BondDepository is AccessControlEnumerable, ReentrancyGuard { using SafeERC20 for IERC20; bytes32 public constant AUCTIONEER_ROLE = keccak256("AUCTIONEER_ROLE"); bytes32 public constant TOKEN_WHITELISTER_ROLE = keccak256("TOKEN_WHITELISTER_ROLE"); bytes32 public constant EMERGENCY_ADMIN_ROLE = keccak256("EMERGENCY_ADMIN_ROLE"); bool public paused; event ContractPaused(address indexed by); event ContractUnpaused(address indexed by); event newBondCreated(uint256 indexed id, address indexed payoutToken, address indexed quoteToken, uint256 initialPrice ); event BondEnded(uint256 indexed id); event addedAuctioneer(address _auctioneer, address payoutToken); event removeAuctioneer(address auctioneer); event MarketTransferred( uint256 marketId, address owner, address newAuctioneer); event BondDeposited( address indexed user, uint256 indexed marketId, uint256 depositAmount, uint256 totalOwed, uint256 bondPrice ); event QuoteTokensWithdrawn( uint256 indexed marketId, address indexed auctioneer, uint256 amount, uint256 daoFee ); event FeeUpdated (uint256 oldFee, uint256 basePoints); event TokenUnwhitelisted( address _token); event TokenWhitelisted( address _token); event AdjustmentSet( uint256 indexed id, bool add, uint256 rate, uint256 target, uint256 buffer, uint256 lastBlock ); uint256 public marketCounter; address [] public _payoutTokens; Terms[] public terms; mapping(uint256 => Adjust) public adjustments; mapping (address => bool) _whitelistedAuctioneer; mapping (address => bool) _whitelistedToken; mapping(uint256 => address) public marketsToAuctioneers; mapping(address => uint256[]) public marketsForQuote; mapping(address => uint256[]) public marketsForPayout; mapping( address => Bond[]) public bondInfo; address public immutable mSig; uint256 public feeToDao; uint256 public constant MAX_FEE = 1000; // Info for creating new bonds struct Terms { address quoteToken; //token requested address payoutToken; //token to be redeemed uint256 amountToBond; //Amount of payout Tokens dedicated to this request uint256 totalDebt; uint256 controlVariable; // scaling variable for price uint256 minimumPrice; // vs principle value add 3 decimals of precision uint256 maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint256 quoteTokensRaised; uint256 lastDecay; //block.timestamp of last decay (i.e last deposit) uint32 bondEnds; //Unix Timestamp of when the offer ends. uint32 vestingTerm; // How long each bond should vest for in seconds } struct Bond { address tokenBonded; //token to be distributed uint256 amountOwed; //amount of tokens owed to Bonder uint256 pricePaid; //price paid in PayoutToken uint256 marketId; //Which market does this belong uint32 startTime; // block timestamp uint32 endTime; //timestamp } struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } //Strictly for front-end optimization struct BondMarketInfo { address quoteToken; address payoutToken; uint256 price; uint256 maxPayout; uint256 vestingTerm; uint256 amountToBond; address auctioneer; bool isLive; uint256 totalDebt; uint256 bondEnds; } constructor(address _mSig){ if (_mSig == address (0)) revert ("Invalid address"); mSig = _mSig; _grantRole(DEFAULT_ADMIN_ROLE, mSig); _grantRole(EMERGENCY_ADMIN_ROLE, mSig); _grantRole(TOKEN_WHITELISTER_ROLE, mSig); } /*================================= Auctioneer FUNCTIONS =================================*/ function newBond( address payoutToken_, IERC20 _quoteToken, uint256 [4] memory _terms, // [amountToBond, controlVariable, minimumPrice, maxDebt] uint32 [2] memory _vestingTerms // [bondEnds, vestingTerm] ) external onlyRole(AUCTIONEER_ROLE) whenNotPaused returns (uint256 marketID) { // Address validations require(payoutToken_ != address(0), "Invalid payout token"); require(address(_quoteToken) != address(0), "Invalid quote token"); require(address(_quoteToken) != payoutToken_, "Tokens must be different"); require(_whitelistedToken[payoutToken_], "Token not whitelisted"); require(!auctioneerHasMarketForQuote(msg.sender, address(_quoteToken)), "Already has market for quote token"); // Time validations require(_vestingTerms[0] > block.timestamp, "Bond end too early"); // Parameter validations require(_terms[0] > 0, "Amount must be > 0"); require(_terms[1] > 0, "Control variable must be > 0"); require(_terms[2] > 0, "Minimum price must be > 0"); require(_terms[3] > 0, "Max debt must be > 0"); uint256 secondsToConclusion = _vestingTerms[0] - block.timestamp; require(secondsToConclusion > 0, "Invalid vesting period"); // Calculate max payout with better precision uint8 quoteDecimals = IERC20Metadata(address(_quoteToken)).decimals(); uint8 payoutDecimals = IERC20Metadata(payoutToken_).decimals(); // Transfer payout tokens IERC20(payoutToken_).safeTransferFrom(msg.sender, address(this), _terms[0] * 10**payoutDecimals); // Create market terms.push(Terms({ quoteToken: address(_quoteToken), payoutToken: payoutToken_, amountToBond: _terms[0] * 10**payoutDecimals, controlVariable: _terms[1], minimumPrice: _terms[2], // Store minimumPrice without extra scaling maxDebt: _terms[3] * 10**payoutDecimals, quoteTokensRaised: 0, lastDecay: block.timestamp, bondEnds: _vestingTerms[0], vestingTerm: _vestingTerms[1], totalDebt: 0 })); // Market tracking uint256 marketId = marketCounter; marketsForPayout[payoutToken_].push(marketId); marketsForQuote[address(_quoteToken)].push(marketId); marketsToAuctioneers[marketId] = msg.sender; ++marketCounter; emit newBondCreated(marketId, payoutToken_, address(_quoteToken), _terms[1]); return marketId; } function closeBond(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { if (marketsToAuctioneers[_id] != msg.sender) revert ("Not your Bond"); terms[_id].bondEnds = uint32(block.timestamp); uint256 amountLeft = terms[_id].amountToBond - terms[_id].totalDebt; IERC20(terms[_id].payoutToken).safeTransfer(msg.sender, amountLeft); emit BondEnded(_id); } function withdrawQuoteTokens(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { require(marketsToAuctioneers[_id] == msg.sender, "Not market's auctioneer"); require(block.timestamp > terms[_id].bondEnds, "Bond not yet concluded"); address quoteToken = terms[_id].quoteToken; uint256 balance = terms[_id].quoteTokensRaised; uint256 daoFee = 0; if (feeToDao > 0) { daoFee = (balance * feeToDao) / 10000; balance -= daoFee; } IERC20(quoteToken).safeTransfer(msg.sender, balance); if (daoFee > 0) { IERC20(quoteToken).safeTransfer(mSig, daoFee); } emit QuoteTokensWithdrawn(_id, msg.sender, balance, daoFee); } function transferMarket(uint256 marketId, address newAuctioneer) external { require(marketsToAuctioneers[marketId] == msg.sender, "Not market owner"); require(hasRole(AUCTIONEER_ROLE, newAuctioneer), "Not auctioneer"); marketsToAuctioneers[marketId] = newAuctioneer; emit MarketTransferred(marketId, msg.sender, newAuctioneer); } function setAdjustment( uint256 _id, bool _add, uint256 _rate, uint256 _target, uint256 _buffer ) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { require(marketsToAuctioneers[_id] == msg.sender, "Not market's auctioneer"); require(_target > 0, "Target cannot be zero"); require(_rate > 0, "Rate cannot be zero"); adjustments[_id] = Adjust({ add: _add, rate: _rate, target: _target, buffer: _buffer, lastBlock: uint32(block.timestamp) }); emit AdjustmentSet( _id, _add, _rate, _target, _buffer, block.timestamp ); } /*================================= User FUNCTIONS =================================*/ function deposit(uint256 _id, uint256 amount, address user) public nonReentrant { require(user != address(0), "Invalid user address"); require(_id < terms.length, "Invalid market ID"); Terms storage term = terms[_id]; require(block.timestamp <= term.bondEnds, "Bond has ended"); require(term.totalDebt < term.maxDebt, "Maximum bond capacity reached"); uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 minimumDeposit = calculateMinimumDeposit(quoteDecimals); require(amount >= minimumDeposit, "Deposit below minimum threshold"); _tune(_id); _decayDebt(_id); uint256 price = _marketPrice(_id); uint256 scaledAmount = amount * (10 ** (18 - quoteDecimals)); uint256 payout = (scaledAmount * 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, amountOwed: payout, pricePaid: price, marketId: _id, startTime: uint32(block.timestamp), endTime: uint32(term.vestingTerm + block.timestamp) })); emit BondDeposited(user, _id, amount, payout, price); } function redeem(uint256 _id, address user) external nonReentrant returns (uint256 amountRedeemed) { uint256 length = bondInfo[user].length; uint256 totalRedeemed = 0; for (uint256 i = length; i > 0;) { i--; Bond storage currentBond = bondInfo[user][i]; if (currentBond.marketId == _id) { uint256 amount = calculateLinearPayout(user, i); if (amount > 0) { currentBond.amountOwed -= amount; totalRedeemed += amount; // Scale amount by token decimals for transfer IERC20(terms[_id].payoutToken).safeTransfer(user, amount); if (currentBond.amountOwed == 0) { if (i != bondInfo[user].length - 1) { bondInfo[user][i] = bondInfo[user][bondInfo[user].length - 1]; } bondInfo[user].pop(); } } } } return totalRedeemed; } /*================================= ADMIN FUNCTIONS =================================*/ function grantAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { // Additional validation require(_auctioneer != address(0), "Invalid auctioneer address"); require(!hasRole(AUCTIONEER_ROLE, _auctioneer), "Already an auctioneer"); _grantRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = true; emit RoleGranted(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function revokeAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { _revokeRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = false; emit RoleRevoked(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function whitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_token != address(0), "Invalid token address"); require(!_whitelistedToken[_token], "Token already whitelisted"); // Additional token validation try IERC20Metadata(_token).decimals() returns (uint8) { _whitelistedToken[_token] = true; _payoutTokens.push(_token); } catch { revert("Invalid ERC20 token"); } } function unwhitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_whitelistedToken[_token], "Token not whitelisted"); _whitelistedToken[_token] = false; emit TokenUnwhitelisted(_token); } function pauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = true; emit ContractPaused(msg.sender); } function unpauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = false; emit ContractUnpaused(msg.sender); } function setFeetoDao(uint32 basePoints) external onlyRole(DEFAULT_ADMIN_ROLE) { require(basePoints <= MAX_FEE, "Fee too high"); uint256 oldFee = feeToDao; feeToDao = basePoints; emit FeeUpdated(oldFee, basePoints); } /*================================= View Functions =================================*/ function getMarketsForQuote(address quoteToken) external view returns(uint256[] memory) { return marketsForQuote[quoteToken]; } function getMarketsForPayout(address payout) external view returns(uint256[] memory) { return marketsForPayout[payout]; } function getMarketsForUser(address user) external view returns(uint256[] memory) { uint256[] memory userMarkets = new uint256[](bondInfo[user].length); for (uint256 i = 0; i < bondInfo[user].length; i++) { userMarkets[i] = bondInfo[user][i].marketId; } return userMarkets; } function isLive(uint256 id_) public view returns (bool) { return block.timestamp <= terms[id_].bondEnds && terms[id_].totalDebt < terms[id_].maxDebt; } function currentMaxPayout(uint256 _id) public view returns (uint256) { Terms memory term = terms[_id]; uint256 remainingDebt = term.maxDebt - term.totalDebt; return (remainingDebt * 1800) / 10000; // 18% of remaining } function bondPrice(uint256 id_) public view returns(uint256) { return _trueBondPrice(id_); } function isAuctioneer(address account) external view returns (bool) { return hasRole(AUCTIONEER_ROLE, account); } function calculateLinearPayout(address user, uint256 _bondId) public view returns (uint256) { Bond memory bond = bondInfo[user][_bondId]; Terms memory term = terms[bond.marketId]; // Check if bond is active if (block.timestamp < bond.startTime) { return 0; } // Calculate total vesting duration uint256 vestingTerm = term.vestingTerm; // Calculate time elapsed since bond start uint256 timeElapsed = block.timestamp > bond.endTime ? vestingTerm : block.timestamp - bond.startTime; // Calculate tokens per second uint256 tokensPerSecond = bond.amountOwed / vestingTerm; // Calculate current claimable amount uint256 currentClaimable = tokensPerSecond * timeElapsed; // Ensure we don't claim more than the total owed if (currentClaimable > bond.amountOwed) { currentClaimable = bond.amountOwed; } return currentClaimable; } function getBondMarketInfo(uint256 marketId) public view returns (BondMarketInfo memory) { Terms storage term = terms[marketId]; return BondMarketInfo({ quoteToken: term.quoteToken, payoutToken: term.payoutToken, price: _trueBondPrice(marketId), maxPayout: currentMaxPayout(marketId), vestingTerm: term.vestingTerm, amountToBond: term.amountToBond, auctioneer: marketsToAuctioneers[marketId], isLive: isLive(marketId), totalDebt: term.totalDebt, bondEnds: term.bondEnds }); } function getBondMarketInfoBatch(uint256[] calldata marketIds) external view returns (BondMarketInfo[] memory) { BondMarketInfo[] memory markets = new BondMarketInfo[](marketIds.length); for (uint256 i = 0; i < marketIds.length; i++) { markets[i] = getBondMarketInfo(marketIds[i]); } return markets; } function payoutFor(address user, uint256 _bondId) public view returns (uint256 amount) { return calculateLinearPayout(user, _bondId); } function isMature(address user, uint256 _bondId) public view returns (bool) { Bond memory bond = bondInfo[user][_bondId]; return block.timestamp >= bond.endTime; } /*================================= Internal Functions =================================*/ function _decayDebt(uint256 _id) internal { Terms storage term = terms[_id]; uint256 currentDebt = term.totalDebt; if (currentDebt == 0) return; uint256 timeSinceLastDecay = block.timestamp - term.lastDecay; if (timeSinceLastDecay == 0) return; uint256 decay = (currentDebt * timeSinceLastDecay) / (term.vestingTerm * 100); term.totalDebt = decay > currentDebt ? 0 : currentDebt - decay; term.lastDecay = uint32(block.timestamp); } function _tune(uint256 _id) internal{ if (block.timestamp > adjustments[_id].lastBlock + adjustments[_id].buffer) { Terms storage term = terms[_id]; if (adjustments[_id].add) { term.controlVariable += adjustments[_id].rate; if (term.controlVariable >= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } else { term.controlVariable -= adjustments[_id].rate; if (term.controlVariable <= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } adjustments[_id].lastBlock = uint32(block.timestamp); } } function _marketPrice(uint256 _id) internal view returns (uint256 price) { Terms memory term = terms[_id]; uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 currentCV = _currentControlVariable(_id); // For 6 decimals token, scalingFactor = 10^30 uint256 scalingFactor = 10 ** (18 + (18 - quoteDecimals)); // Start with a simple calculation using just CV and scaling price = currentCV * scalingFactor / 1e18; require(price > 0, "Price calculation failed"); return price; } function _trueBondPrice(uint256 _id) internal view returns(uint256 price){ price = _marketPrice(_id); } function _debtRatio(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; if (term.quoteTokensRaised == 0) { return 1e18; } uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint8 payoutDecimals = IERC20Metadata(address(term.payoutToken)).decimals(); int8 decimalAdjustment = int8(payoutDecimals) - int8(quoteDecimals); if (decimalAdjustment >= 0) { // If payoutToken has more decimals, scale up quoteTokensRaised uint256 adjustedQuote = term.quoteTokensRaised * (10 ** uint8(decimalAdjustment)); return (term.totalDebt * 1e18) / adjustedQuote; } else { // If quoteToken has more decimals, scale up totalDebt uint256 adjustedDebt = term.totalDebt * (10 ** uint8(-decimalAdjustment)); return (adjustedDebt * 1e18) / term.quoteTokensRaised; } } function _currentControlVariable(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; Adjust memory adjustment = adjustments[_id]; // Start with base control variable uint256 currentCV = term.controlVariable; // If there's no adjustment or CV is 0, return the base CV if (adjustment.rate == 0 || currentCV == 0) { return currentCV; } // Calculate adjustments only if there's an active adjustment uint256 blocksSince = block.timestamp - adjustment.lastBlock; uint256 adjustmentCount = blocksSince / adjustment.buffer; if (adjustmentCount > 0) { uint256 totalAdjustment = adjustment.rate * adjustmentCount; if (adjustment.add) { if (currentCV + totalAdjustment > adjustment.target) { currentCV = adjustment.target; } else { currentCV += totalAdjustment; } } else { if (totalAdjustment >= currentCV || currentCV - totalAdjustment < adjustment.target) { currentCV = adjustment.target; } else { currentCV -= totalAdjustment; } } } return currentCV; } // Helper function for minimum deposit calculation function calculateMinimumDeposit(uint8 decimals) internal pure returns (uint256) { // Ensures meaningful deposit across different token decimal configurations if (decimals > 2) { return 10 ** (decimals - 2); // 1% of smallest token unit } return 1; // Fallback for tokens with very few decimals } // Helper function for precise owed calculation function calculateTotalOwed(uint256 amount, uint256 price) internal pure returns (uint256) { return (amount * 1e18) / price; } function auctioneerHasMarketForQuote(address auctioneer, address quoteToken) public view returns (bool) { uint256[] memory markets = marketsForQuote[quoteToken]; for(uint256 i = 0; i < markets.length; i++) { if(marketsToAuctioneers[markets[i]] == auctioneer && isLive(markets[i])) { return true; } } return false; } modifier whenNotPaused() { require(!paused, "Contract is paused"); _; } }
[{"inputs":[{"internalType":"address","name":"_mSig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bool","name":"add","type":"bool"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"target","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buffer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastBlock","type":"uint256"}],"name":"AdjustmentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalOwed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondPrice","type":"uint256"}],"name":"BondDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"BondEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basePoints","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"MarketTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"auctioneer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daoFee","type":"uint256"}],"name":"QuoteTokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenUnwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_auctioneer","type":"address"},{"indexed":false,"internalType":"address","name":"payoutToken","type":"address"}],"name":"addedAuctioneer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"payoutToken","type":"address"},{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialPrice","type":"uint256"}],"name":"newBondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"auctioneer","type":"address"}],"name":"removeAuctioneer","type":"event"},{"inputs":[],"name":"AUCTIONEER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_WHITELISTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payoutTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adjustments","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"}],"name":"auctioneerHasMarketForQuote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bondInfo","outputs":[{"internalType":"address","name":"tokenBonded","type":"address"},{"internalType":"uint256","name":"amountOwed","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"calculateLinearPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"closeBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"currentMaxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeToDao","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getBondMarketInfo","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"marketIds","type":"uint256[]"}],"name":"getBondMarketInfoBatch","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payout","type":"address"}],"name":"getMarketsForPayout","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"}],"name":"getMarketsForQuote","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMarketsForUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"grantAuctioneerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAuctioneer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"isMature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsToAuctioneers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payoutToken_","type":"address"},{"internalType":"contract IERC20","name":"_quoteToken","type":"address"},{"internalType":"uint256[4]","name":"_terms","type":"uint256[4]"},{"internalType":"uint32[2]","name":"_vestingTerms","type":"uint32[2]"}],"name":"newBond","outputs":[{"internalType":"uint256","name":"marketID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amountRedeemed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"revokeAuctioneerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_add","type":"bool"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"basePoints","type":"uint32"}],"name":"setFeetoDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"terms","outputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint256","name":"quoteTokensRaised","type":"uint256"},{"internalType":"uint256","name":"lastDecay","type":"uint256"},{"internalType":"uint32","name":"bondEnds","type":"uint32"},{"internalType":"uint32","name":"vestingTerm","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"transferMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"unwhitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"withdrawQuoteTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561000f575f5ffd5b506040516145ad3803806145ad83398101604081905261002e91610237565b60016002556001600160a01b03811661007f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b6001600160a01b0381166080819052610099905f90610106565b506100cc7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6360805161010660201b60201c565b506100ff7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e60805161010660201b60201c565b505061025d565b5f80610112848461013c565b90508015610133575f84815260016020526040902061013190846101e3565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166101dc575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101943390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610136565b505f610136565b5f610133836001600160a01b0384165f8181526001830160205260408120546101dc57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610136565b5f60208284031215610247575f5ffd5b81516001600160a01b0381168114610133575f5ffd5b60805161433161027c5f395f81816107c701526120ed01526143315ff3fe608060405234801561000f575f5ffd5b50600436106102c3575f3560e01c80639b299d9a11610177578063c8558f1b116100d5578063d547741f1161008f578063d547741f14610758578063d627d25e1461076b578063d918a16e1461077e578063ddb2924714610787578063ea5e0c601461079a578063ed421a9c146107c2578063f9a64664146107e9575f5ffd5b8063c8558f1b146106e5578063ca15c873146106f8578063cfe9232b1461070b578063d04cffeb1461071f578063d1af1fbc14610732578063d382fe9214610745575f5ffd5b8063b33712c511610131578063b33712c5146105b7578063bc063e1a146105bf578063bc3b2b12146105c8578063be32ee2614610632578063c0680e2014610645578063c0aa0e8a14610658578063c5f0d05c146106d2575f5ffd5b80639b299d9a146105445780639cc84589146105575780639cd85b5b1461056a578063a217fddf1461057d578063a3246ad314610584578063b2f5de94146105a4575f5ffd5b8063439766ce116102245780637bde82f2116101de5780637bde82f2146104715780638ad59c70146104845780638dbdbe6d146104d75780639010d07c146104ea578063909b2bb81461050a57806391d148541461051e57806391de4d0714610531575f5ffd5b8063439766ce1461040f5780635c975abb146104175780636247f6f2146104245780636e76fc8f14610437578063725dafe01461044b5780637b30564e1461045e575f5ffd5b8063172c44ec11610280578063172c44ec146103855780631b014e851461039857806324760807146103ab578063248a9ca3146103b457806327507458146103d65780632f2ff15d146103e957806336568abe146103fc575f5ffd5b806301ffc9a7146102c757806306b40ea3146102ef5780630868335e146103105780630fb81eb4146103305780631227b40214610345578063154347b514610365575b5f5ffd5b6102da6102d5366004613b01565b6107fc565b60405190151581526020015b60405180910390f35b6103026102fd366004613b3c565b610826565b6040519081526020016102e6565b61032361031e366004613b66565b610851565b6040516102e69190613c6b565b61034361033e366004613cae565b610900565b005b610358610353366004613cae565b610a95565b6040516102e69190613cc5565b610378610373366004613cd4565b610b81565b6040516102e69190613cef565b610302610393366004613cae565b610bea565b6103786103a6366004613cd4565b610bf4565b61030260045481565b6103026103c2366004613cae565b5f9081526020819052604090206001015490565b6102da6103e4366004613cae565b610c5b565b6103436103f7366004613d26565b610cdf565b61034361040a366004613d26565b610d09565b610343610d41565b6003546102da9060ff1681565b610343610432366004613cd4565b610d92565b6103025f5160206142dc5f395f51905f5281565b610343610459366004613d26565b610f61565b6102da61046c366004613b3c565b611080565b61030261047f366004613d26565b611124565b610497610492366004613b3c565b6113b9565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c0016102e6565b6103436104e5366004613d54565b61141e565b6104fd6104f8366004613d8a565b611ae1565b6040516102e69190613daa565b6103025f5160206142bc5f395f51905f5281565b6102da61052c366004613d26565b611aff565b6102da61053f366004613dbe565b611b27565b610343610552366004613cd4565b611c23565b610343610565366004613dea565b611d52565b6102da610578366004613cd4565b611f25565b6103025f81565b610597610592366004613cae565b611f3d565b6040516102e69190613e32565b6103436105b2366004613cae565b611f56565b610343612156565b6103026103e881565b6106086105d6366004613cae565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102e6565b610343610640366004613cd4565b6121a4565b610302610653366004613b3c565b612221565b61066b610666366004613cae565b61223a565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff90811661012084015216610140820152610160016102e6565b6103436106e0366004613e8a565b6122ba565b6103026106f3366004613b3c565b61235b565b610302610706366004613cae565b612545565b6103025f51602061429c5f395f51905f5281565b61037861072d366004613cd4565b61255b565b6104fd610740366004613cae565b612640565b610302610753366004613cae565b612668565b610343610766366004613d26565b612752565b610343610779366004613cd4565b612776565b610302600e5481565b610302610795366004613f3e565b612813565b6104fd6107a8366004613cae565b600a6020525f90815260409020546001600160a01b031681565b6104fd7f000000000000000000000000000000000000000000000000000000000000000081565b6103026107f7366004613b3c565b612fbc565b5f6001600160e01b03198216635a05180f60e01b1480610820575061082082612fc7565b92915050565b600c602052815f5260405f20818154811061083f575f80fd5b905f5260205f20015f91509150505481565b60605f826001600160401b0381111561086c5761086c613ea3565b6040519080825280602002602001820160405280156108a557816020015b610892613a9b565b81526020019060019003908161088a5790505b5090505f5b838110156108f8576108d38585838181106108c7576108c7613fd1565b90506020020135610a95565b8282815181106108e5576108e5613fd1565b60209081029190910101526001016108aa565b509392505050565b5f51602061429c5f395f51905f5261091781612ffb565b60035460ff16156109435760405162461bcd60e51b815260040161093a90613fe5565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109985760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b604482015260640161093a565b42600683815481106109ac576109ac613fd1565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f600683815481106109ec576109ec613fd1565b905f5260205f2090600a02016003015460068481548110610a0f57610a0f613fd1565b905f5260205f2090600a020160020154610a299190614025565b9050610a66338260068681548110610a4357610a43613fd1565b5f91825260209091206001600a9092020101546001600160a01b03169190613008565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610a9d613a9b565b5f60068381548110610ab157610ab1613fd1565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610af985613067565b8152602001610b0785612668565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b5885610c5b565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610bde57602002820191905f5260205f20905b815481526020019060010190808311610bca575b50505050509050919050565b5f61082082613067565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610bde57602002820191905f5260205f2090815481526020019060010190808311610bca5750505050509050919050565b5f60068281548110610c6f57610c6f613fd1565b5f91825260209091206009600a90920201015463ffffffff164211801590610820575060068281548110610ca557610ca5613fd1565b905f5260205f2090600a02016006015460068381548110610cc857610cc8613fd1565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610cf981612ffb565b610d038383613071565b50505050565b6001600160a01b0381163314610d325760405163334bd91960e11b815260040160405180910390fd5b610d3c828261309c565b505050565b5f5160206142dc5f395f51905f52610d5881612ffb565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b5f5160206142bc5f395f51905f52610da981612ffb565b6001600160a01b038216610df75760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161093a565b6001600160a01b0382165f9081526009602052604090205460ff1615610e5b5760405162461bcd60e51b8152602060048201526019602482015278151bdad95b88185b1c9958591e481dda1a5d195b1a5cdd1959603a1b604482015260640161093a565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610eb5575060408051601f3d908101601f19168201909252610eb291810190614038565b60015b610ef75760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b604482015260640161093a565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b03163314610fb95760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b604482015260640161093a565b610fd05f51602061429c5f395f51905f5282611aff565b61100d5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b604482015260640161093a565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d602052604081208054829190849081106110ac576110ac613fd1565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f61112d6130c7565b6001600160a01b0382165f908152600d602052604081205490815b80156113ab578061115881614058565b6001600160a01b0387165f908152600d602052604081208054929450909250908390811061118857611188613fd1565b905f5260205f2090600502019050868160030154036113a5575f6111ac878461235b565b905080156113a35780826001015f8282546111c79190614025565b909155506111d79050818561406d565b93506111f1878260068b81548110610a4357610a43613fd1565b81600101545f036113a3576001600160a01b0387165f908152600d602052604090205461122090600190614025565b8314611331576001600160a01b0387165f908152600d60205260409020805461124b90600190614025565b8154811061125b5761125b613fd1565b905f5260205f209060050201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f20848154811061129b5761129b613fd1565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d6020526040902080548061135757611357614080565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b50611148565b509150506108206001600255565b600d602052815f5260405f2081815481106113d2575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b6114266130c7565b6001600160a01b0381166114735760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b604482015260640161093a565b60065483106114b85760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b604482015260640161093a565b5f600684815481106114cc576114cc613fd1565b5f9182526020909120600a90910201600981015490915063ffffffff164211156115295760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b604482015260640161093a565b80600601548160030154106115805760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e642063617061636974792072656163686564000000604482015260640161093a565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156115c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ea9190614038565b90505f6115f68261311e565b9050808510156116485760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c6400604482015260640161093a565b61165186613149565b61165a8661328b565b5f6116648761334c565b90505f611672846012614094565b61167d90600a614190565b611687908861419e565b90505f8261169d83670de0b6b3a764000061419e565b6116a791906141b5565b90505f612710876003015488600601546116c19190614025565b6116cd9061070861419e565b6116d791906141b5565b9050808211156117295760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f77656400604482015260640161093a565b866006015482886003015461173e919061406d565b11156117885760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81b585e1a5b5d5b48189bdb99081919589d603a1b604482015260640161093a565b86546040516370a0823160e01b81526001600160a01b03909116905f9082906370a08231906117bb903090600401613daa565b602060405180830381865afa1580156117d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117fa91906141d4565b90506118116001600160a01b03831633308e613501565b6040516370a0823160e01b81525f906001600160a01b038416906370a082319061183f903090600401613daa565b602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906141d4565b90508b61188b8383614025565b146118d45760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd081d1c985b9cd9995c88185b5bdd5b9d603a1b604482015260640161093a565b8b60068e815481106118e8576118e8613fd1565b905f5260205f2090600a02016007015f828254611905919061406d565b925050819055508460068e8154811061192057611920613fd1565b905f5260205f2090600a02016003015f82825461193d919061406d565b90915550506001600160a01b03808c165f908152600d6020908152604091829020825160c08101845260018f01549094168452908301889052908201899052606082018f905263ffffffff42818116608085015260098e015492939260a08401926119b09291600160201b90041661406d565b63ffffffff16815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160040160046101000a81548163ffffffff021916908363ffffffff16021790555050508c8b6001600160a01b03167f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f28e888b604051611ac5939291909283526020830191909152604082015260600190565b60405180910390a350505050505050505050610d3c6001600255565b5f828152600160205260408120611af8908361353a565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611b8157602002820191905f5260205f20905b815481526020019060010190808311611b6d575b509394505f93505050505b8151811015611c1957846001600160a01b0316600a5f848481518110611bb457611bb4613fd1565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611c015750611c01828281518110611bf457611bf4613fd1565b6020026020010151610c5b565b15611c1157600192505050610820565b600101611b8c565b505f949350505050565b5f611c2d81612ffb565b6001600160a01b038216611c805760405162461bcd60e51b815260206004820152601a602482015279496e76616c69642061756374696f6e656572206164647265737360301b604482015260640161093a565b611c975f51602061429c5f395f51905f5283611aff565b15611cdc5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b604482015260640161093a565b611cf35f51602061429c5f395f51905f5283613071565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061429c5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f51602061429c5f395f51905f52611d6981612ffb565b60035460ff1615611d8c5760405162461bcd60e51b815260040161093a90613fe5565b5f868152600a60205260409020546001600160a01b03163314611dc15760405162461bcd60e51b815260040161093a906141eb565b5f8311611e085760405162461bcd60e51b81526020600482015260156024820152745461726765742063616e6e6f74206265207a65726f60581b604482015260640161093a565b5f8411611e4d5760405162461bcd60e51b8152602060048201526013602482015272526174652063616e6e6f74206265207a65726f60681b604482015260640161093a565b6040805160a081018252861515815260208082018781528284018781526060840187815263ffffffff42908116608087019081525f8e81526007909652948790209551865490151560ff1990911617865592516001860155905160028501555160038401559051600490920191909155905187917fca26b9928ef624ce9b23cfafc5e93180097417a4faaac312cc856e8d83f5ba4a91611f15918991899189918991909415158552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a2505050505050565b5f6108205f51602061429c5f395f51905f5283611aff565b5f81815260016020526040902060609061082090613545565b5f51602061429c5f395f51905f52611f6d81612ffb565b60035460ff1615611f905760405162461bcd60e51b815260040161093a90613fe5565b5f828152600a60205260409020546001600160a01b03163314611fc55760405162461bcd60e51b815260040161093a906141eb565b60068281548110611fd857611fd8613fd1565b5f91825260209091206009600a90920201015463ffffffff1642116120385760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b604482015260640161093a565b5f6006838154811061204c5761204c613fd1565b5f91825260208220600a9091020154600680546001600160a01b039092169350908590811061207d5761207d613fd1565b5f918252602082206007600a909202010154600e54909250156120c457612710600e54836120ab919061419e565b6120b591906141b5565b90506120c18183614025565b91505b6120d86001600160a01b0384163384613008565b8015612112576121126001600160a01b0384167f000000000000000000000000000000000000000000000000000000000000000083613008565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b5f5160206142dc5f395f51905f5261216d81612ffb565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f6121ae81612ffb565b6121c55f51602061429c5f395f51905f528361309c565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061429c5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f20818154811061083f575f80fd5b60068181548110612249575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f6122c481612ffb565b6103e88263ffffffff16111561230b5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161093a565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061238757612387613fd1565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a08301526006805492945091811061240757612407613fd1565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b909104811661014083015291840151909250164210156124c7575f92505050610820565b5f81610140015163ffffffff1690505f8360a0015163ffffffff1642116125025760808401516124fd9063ffffffff1642614025565b612504565b815b90505f82856020015161251791906141b5565b90505f612524838361419e565b90508560200151811115612539575060208501515b98975050505050505050565b5f81815260016020526040812061082090613551565b6001600160a01b0381165f908152600d6020526040812054606091906001600160401b0381111561258e5761258e613ea3565b6040519080825280602002602001820160405280156125b7578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d6020526040902054811015612639576001600160a01b0384165f908152600d6020526040902080548290811061260457612604613fd1565b905f5260205f2090600502016003015482828151811061262657612626613fd1565b60209081029190910101526001016125bc565b5092915050565b6005818154811061264f575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061267d5761267d613fd1565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b9091041661014084015291935061272f9190614025565b90506127106127408261070861419e565b61274a91906141b5565b949350505050565b5f8281526020819052604090206001015461276c81612ffb565b610d03838361309c565b5f5160206142bc5f395f51905f5261278d81612ffb565b6001600160a01b0382165f9081526009602052604090205460ff166127c45760405162461bcd60e51b815260040161093a9061421c565b6001600160a01b0382165f9081526009602052604090819020805460ff19169055517f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06190611074908490613daa565b5f5f51602061429c5f395f51905f5261282b81612ffb565b60035460ff161561284e5760405162461bcd60e51b815260040161093a90613fe5565b6001600160a01b03861661289b5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b604482015260640161093a565b6001600160a01b0385166128e75760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b604482015260640161093a565b856001600160a01b0316856001600160a01b0316036129435760405162461bcd60e51b8152602060048201526018602482015277151bdad95b9cc81b5d5cdd08189948191a5999995c995b9d60421b604482015260640161093a565b6001600160a01b0386165f9081526009602052604090205460ff1661297a5760405162461bcd60e51b815260040161093a9061421c565b6129843386611b27565b156129dc5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b606482015260840161093a565b82514263ffffffff90911611612a295760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b604482015260640161093a565b8351612a6c5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161093a565b6020840151612abd5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e203000000000604482015260640161093a565b6040840151612b0a5760405162461bcd60e51b815260206004820152601960248201527804d696e696d756d207072696365206d757374206265203e203603c1b604482015260640161093a565b6060840151612b525760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b604482015260640161093a565b82515f90612b6790429063ffffffff16614025565b90505f8111612bb15760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b604482015260640161093a565b5f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bee573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c129190614038565b90505f886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c51573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c759190614038565b9050612ca53330612c8784600a614190565b8a51612c93919061419e565b6001600160a01b038d16929190613501565b60408051610160810182526001600160a01b03808b1682528b1660208201526006918101612cd484600a614190565b8a51612ce0919061419e565b81525f6020808301919091528a01516040808301919091528a01516060820152608001612d0e84600a614190565b60608b0151612d1d919061419e565b81526020015f8152602001428152602001885f60028110612d4057612d40613fd1565b602002015163ffffffff16815260200188600160028110612d6357612d63613fd1565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8b6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612f5c9061424b565b909155506001600160a01b03808a16908b16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978b60016020020151604051612fa791815260200190565b60405180910390a49998505050505050505050565b5f611af8838361235b565b5f6001600160e01b03198216637965db0b60e01b148061082057506301ffc9a760e01b6001600160e01b0319831614610820565b613005813361355a565b50565b6040516001600160a01b03838116602483015260448201839052610d3c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613593565b5f6108208261334c565b5f5f61307d84846135f6565b90508015611af8575f8481526001602052604090206108f89084613685565b5f5f6130a88484613699565b90508015611af8575f8481526001602052604090206108f89084613702565b60028054036131185760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161093a565b60028055565b5f60028260ff16111561314157613136600283614094565b61082090600a614190565b506001919050565b5f818152600760205260409020600381015460049091015461316b919061406d565b421115613005575f6006828154811061318657613186613fd1565b5f91825260208083208584526007909152604090922054600a909102909101915060ff1615613211575f82815260076020526040812060010154600483018054919290916131d590849061406d565b90915550505f8281526007602052604090206002015460048201541061320c575f8281526007602052604090206002015460048201555b61326e565b5f8281526007602052604081206001015460048301805491929091613237908490614025565b90915550505f8281526007602052604090206002015460048201541161326e575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061329f5761329f613fd1565b905f5260205f2090600a020190505f81600301549050805f036132c157505050565b5f8260080154426132d29190614025565b9050805f036132e15750505050565b60098301545f9061330090600160201b900463ffffffff166064614263565b63ffffffff16613310838561419e565b61331a91906141b5565b90508281116133325761332d8184614025565b613334565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061336157613361613fd1565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613439573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061345d9190614038565b90505f61346985613716565b90505f613477836012614094565b613482906012614282565b61348d90600a614190565b9050670de0b6b3a76400006134a2828461419e565b6134ac91906141b5565b94505f85116134f85760405162461bcd60e51b8152602060048201526018602482015277141c9a58d94818d85b18dd5b185d1a5bdb8819985a5b195960421b604482015260640161093a565b50505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d039186918216906323b872dd90608401613035565b5f611af883836138f6565b60605f611af88361391c565b5f610820825490565b6135648282611aff565b610f5d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161093a565b5f5f60205f8451602086015f885af1806135b2576040513d5f823e3d81fd5b50505f513d915081156135c95780600114156135d6565b6001600160a01b0384163b155b15610d035783604051635274afe760e01b815260040161093a9190613daa565b5f6136018383611aff565b61367e575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556136363390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610820565b505f610820565b5f611af8836001600160a01b038416613973565b5f6136a48383611aff565b1561367e575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610820565b5f611af8836001600160a01b0384166139b8565b5f5f6006838154811061372b5761372b613fd1565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a529a88902088519788018952805460ff161515885295860154988701899052938501549686019690965290830154908401529201549481019490945251919350158061382a575080155b1561383757949350505050565b5f8260800151426138489190614025565b90505f83606001518261385b91906141b5565b905080156138eb575f818560200151613874919061419e565b8551909150156138b057604085015161388d828661406d565b111561389f57846040015193506138e9565b6138a9818561406d565b93506138e9565b83811015806138cb575060408501516138c98286614025565b105b156138dc57846040015193506138e9565b6138e68185614025565b93505b505b509095945050505050565b5f825f01828154811061390b5761390b613fd1565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610bde57602002820191905f5260205f2090815481526020019060010190808311610bca5750505050509050919050565b5f81815260018301602052604081205461367e57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610820565b5f8181526001830160205260408120548015613a92575f6139da600183614025565b85549091505f906139ed90600190614025565b9050808214613a4c575f865f018281548110613a0b57613a0b613fd1565b905f5260205f200154905080875f018481548110613a2b57613a2b613fd1565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613a5d57613a5d614080565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610820565b5f915050610820565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613b11575f5ffd5b81356001600160e01b031981168114611af8575f5ffd5b6001600160a01b0381168114613005575f5ffd5b5f5f60408385031215613b4d575f5ffd5b8235613b5881613b28565b946020939093013593505050565b5f5f60208385031215613b77575f5ffd5b82356001600160401b03811115613b8c575f5ffd5b8301601f81018513613b9c575f5ffd5b80356001600160401b03811115613bb1575f5ffd5b8560208260051b8401011115613bc5575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613bfc60208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613c3f60c08401826001600160a01b03169052565b5060e0810151613c5360e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b818110156138eb57613c97838551613bd5565b602093909301926101409290920191600101613c84565b5f60208284031215613cbe575f5ffd5b5035919050565b61014081016108208284613bd5565b5f60208284031215613ce4575f5ffd5b8135611af881613b28565b602080825282518282018190525f918401906040840190835b818110156138eb578351835260209384019390920191600101613d08565b5f5f60408385031215613d37575f5ffd5b823591506020830135613d4981613b28565b809150509250929050565b5f5f5f60608486031215613d66575f5ffd5b83359250602084013591506040840135613d7f81613b28565b809150509250925092565b5f5f60408385031215613d9b575f5ffd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f5f60408385031215613dcf575f5ffd5b8235613dda81613b28565b91506020830135613d4981613b28565b5f5f5f5f5f60a08688031215613dfe575f5ffd5b8535945060208601358015158114613e14575f5ffd5b94979496505050506040830135926060810135926080909101359150565b602080825282518282018190525f918401906040840190835b818110156138eb5783516001600160a01b0316835260209384019390920191600101613e4b565b803563ffffffff81168114613e85575f5ffd5b919050565b5f60208284031215613e9a575f5ffd5b611af882613e72565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613eeb57634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112613f02575f5ffd5b613f0c6040613eb7565b806040840185811115613f1d575f5ffd5b845b818110156138eb57613f3081613e72565b845260209384019301613f1f565b5f5f5f5f6101008587031215613f52575f5ffd5b8435613f5d81613b28565b93506020850135613f6d81613b28565b9250605f85018613613f7d575f5ffd5b613f876080613eb7565b8060c0870188811115613f98575f5ffd5b604088015b81811015613fb5578035845260209384019301613f9d565b50819450613fc38982613ef3565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561082057610820614011565b5f60208284031215614048575f5ffd5b815160ff81168114611af8575f5ffd5b5f8161406657614066614011565b505f190190565b8082018082111561082057610820614011565b634e487b7160e01b5f52603160045260245ffd5b60ff828116828216039081111561082057610820614011565b6001815b60018411156140e8578085048111156140cc576140cc614011565b60018416156140da57908102905b60019390931c9280026140b1565b935093915050565b5f826140fe57506001610820565b8161410a57505f610820565b8160018114614120576002811461412a57614146565b6001915050610820565b60ff84111561413b5761413b614011565b50506001821b610820565b5060208310610133831016604e8410600b8410161715614169575081810a610820565b6141755f1984846140ad565b805f190482111561418857614188614011565b029392505050565b5f611af860ff8416836140f0565b808202811582820484141761082057610820614011565b5f826141cf57634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156141e4575f5ffd5b5051919050565b6020808252601790820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b604082015260600190565b602080825260159082015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604082015260600190565b5f6001820161425c5761425c614011565b5060010190565b63ffffffff818116838216029081169081811461263957612639614011565b60ff81811683821601908111156108205761082061401156fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891d5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a2646970667358221220191c1c3442cc54e9841893e64eb334686614801ff2116aab80f6d62189fcb28764736f6c634300081b00330000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106102c3575f3560e01c80639b299d9a11610177578063c8558f1b116100d5578063d547741f1161008f578063d547741f14610758578063d627d25e1461076b578063d918a16e1461077e578063ddb2924714610787578063ea5e0c601461079a578063ed421a9c146107c2578063f9a64664146107e9575f5ffd5b8063c8558f1b146106e5578063ca15c873146106f8578063cfe9232b1461070b578063d04cffeb1461071f578063d1af1fbc14610732578063d382fe9214610745575f5ffd5b8063b33712c511610131578063b33712c5146105b7578063bc063e1a146105bf578063bc3b2b12146105c8578063be32ee2614610632578063c0680e2014610645578063c0aa0e8a14610658578063c5f0d05c146106d2575f5ffd5b80639b299d9a146105445780639cc84589146105575780639cd85b5b1461056a578063a217fddf1461057d578063a3246ad314610584578063b2f5de94146105a4575f5ffd5b8063439766ce116102245780637bde82f2116101de5780637bde82f2146104715780638ad59c70146104845780638dbdbe6d146104d75780639010d07c146104ea578063909b2bb81461050a57806391d148541461051e57806391de4d0714610531575f5ffd5b8063439766ce1461040f5780635c975abb146104175780636247f6f2146104245780636e76fc8f14610437578063725dafe01461044b5780637b30564e1461045e575f5ffd5b8063172c44ec11610280578063172c44ec146103855780631b014e851461039857806324760807146103ab578063248a9ca3146103b457806327507458146103d65780632f2ff15d146103e957806336568abe146103fc575f5ffd5b806301ffc9a7146102c757806306b40ea3146102ef5780630868335e146103105780630fb81eb4146103305780631227b40214610345578063154347b514610365575b5f5ffd5b6102da6102d5366004613b01565b6107fc565b60405190151581526020015b60405180910390f35b6103026102fd366004613b3c565b610826565b6040519081526020016102e6565b61032361031e366004613b66565b610851565b6040516102e69190613c6b565b61034361033e366004613cae565b610900565b005b610358610353366004613cae565b610a95565b6040516102e69190613cc5565b610378610373366004613cd4565b610b81565b6040516102e69190613cef565b610302610393366004613cae565b610bea565b6103786103a6366004613cd4565b610bf4565b61030260045481565b6103026103c2366004613cae565b5f9081526020819052604090206001015490565b6102da6103e4366004613cae565b610c5b565b6103436103f7366004613d26565b610cdf565b61034361040a366004613d26565b610d09565b610343610d41565b6003546102da9060ff1681565b610343610432366004613cd4565b610d92565b6103025f5160206142dc5f395f51905f5281565b610343610459366004613d26565b610f61565b6102da61046c366004613b3c565b611080565b61030261047f366004613d26565b611124565b610497610492366004613b3c565b6113b9565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c0016102e6565b6103436104e5366004613d54565b61141e565b6104fd6104f8366004613d8a565b611ae1565b6040516102e69190613daa565b6103025f5160206142bc5f395f51905f5281565b6102da61052c366004613d26565b611aff565b6102da61053f366004613dbe565b611b27565b610343610552366004613cd4565b611c23565b610343610565366004613dea565b611d52565b6102da610578366004613cd4565b611f25565b6103025f81565b610597610592366004613cae565b611f3d565b6040516102e69190613e32565b6103436105b2366004613cae565b611f56565b610343612156565b6103026103e881565b6106086105d6366004613cae565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102e6565b610343610640366004613cd4565b6121a4565b610302610653366004613b3c565b612221565b61066b610666366004613cae565b61223a565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff90811661012084015216610140820152610160016102e6565b6103436106e0366004613e8a565b6122ba565b6103026106f3366004613b3c565b61235b565b610302610706366004613cae565b612545565b6103025f51602061429c5f395f51905f5281565b61037861072d366004613cd4565b61255b565b6104fd610740366004613cae565b612640565b610302610753366004613cae565b612668565b610343610766366004613d26565b612752565b610343610779366004613cd4565b612776565b610302600e5481565b610302610795366004613f3e565b612813565b6104fd6107a8366004613cae565b600a6020525f90815260409020546001600160a01b031681565b6104fd7f0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d81565b6103026107f7366004613b3c565b612fbc565b5f6001600160e01b03198216635a05180f60e01b1480610820575061082082612fc7565b92915050565b600c602052815f5260405f20818154811061083f575f80fd5b905f5260205f20015f91509150505481565b60605f826001600160401b0381111561086c5761086c613ea3565b6040519080825280602002602001820160405280156108a557816020015b610892613a9b565b81526020019060019003908161088a5790505b5090505f5b838110156108f8576108d38585838181106108c7576108c7613fd1565b90506020020135610a95565b8282815181106108e5576108e5613fd1565b60209081029190910101526001016108aa565b509392505050565b5f51602061429c5f395f51905f5261091781612ffb565b60035460ff16156109435760405162461bcd60e51b815260040161093a90613fe5565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109985760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b604482015260640161093a565b42600683815481106109ac576109ac613fd1565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f600683815481106109ec576109ec613fd1565b905f5260205f2090600a02016003015460068481548110610a0f57610a0f613fd1565b905f5260205f2090600a020160020154610a299190614025565b9050610a66338260068681548110610a4357610a43613fd1565b5f91825260209091206001600a9092020101546001600160a01b03169190613008565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610a9d613a9b565b5f60068381548110610ab157610ab1613fd1565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610af985613067565b8152602001610b0785612668565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b5885610c5b565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610bde57602002820191905f5260205f20905b815481526020019060010190808311610bca575b50505050509050919050565b5f61082082613067565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610bde57602002820191905f5260205f2090815481526020019060010190808311610bca5750505050509050919050565b5f60068281548110610c6f57610c6f613fd1565b5f91825260209091206009600a90920201015463ffffffff164211801590610820575060068281548110610ca557610ca5613fd1565b905f5260205f2090600a02016006015460068381548110610cc857610cc8613fd1565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610cf981612ffb565b610d038383613071565b50505050565b6001600160a01b0381163314610d325760405163334bd91960e11b815260040160405180910390fd5b610d3c828261309c565b505050565b5f5160206142dc5f395f51905f52610d5881612ffb565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b5f5160206142bc5f395f51905f52610da981612ffb565b6001600160a01b038216610df75760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161093a565b6001600160a01b0382165f9081526009602052604090205460ff1615610e5b5760405162461bcd60e51b8152602060048201526019602482015278151bdad95b88185b1c9958591e481dda1a5d195b1a5cdd1959603a1b604482015260640161093a565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610eb5575060408051601f3d908101601f19168201909252610eb291810190614038565b60015b610ef75760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b604482015260640161093a565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b03163314610fb95760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b604482015260640161093a565b610fd05f51602061429c5f395f51905f5282611aff565b61100d5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b604482015260640161093a565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d602052604081208054829190849081106110ac576110ac613fd1565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f61112d6130c7565b6001600160a01b0382165f908152600d602052604081205490815b80156113ab578061115881614058565b6001600160a01b0387165f908152600d602052604081208054929450909250908390811061118857611188613fd1565b905f5260205f2090600502019050868160030154036113a5575f6111ac878461235b565b905080156113a35780826001015f8282546111c79190614025565b909155506111d79050818561406d565b93506111f1878260068b81548110610a4357610a43613fd1565b81600101545f036113a3576001600160a01b0387165f908152600d602052604090205461122090600190614025565b8314611331576001600160a01b0387165f908152600d60205260409020805461124b90600190614025565b8154811061125b5761125b613fd1565b905f5260205f209060050201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f20848154811061129b5761129b613fd1565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d6020526040902080548061135757611357614080565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b50611148565b509150506108206001600255565b600d602052815f5260405f2081815481106113d2575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b6114266130c7565b6001600160a01b0381166114735760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b604482015260640161093a565b60065483106114b85760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b604482015260640161093a565b5f600684815481106114cc576114cc613fd1565b5f9182526020909120600a90910201600981015490915063ffffffff164211156115295760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b604482015260640161093a565b80600601548160030154106115805760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e642063617061636974792072656163686564000000604482015260640161093a565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156115c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ea9190614038565b90505f6115f68261311e565b9050808510156116485760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c6400604482015260640161093a565b61165186613149565b61165a8661328b565b5f6116648761334c565b90505f611672846012614094565b61167d90600a614190565b611687908861419e565b90505f8261169d83670de0b6b3a764000061419e565b6116a791906141b5565b90505f612710876003015488600601546116c19190614025565b6116cd9061070861419e565b6116d791906141b5565b9050808211156117295760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f77656400604482015260640161093a565b866006015482886003015461173e919061406d565b11156117885760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81b585e1a5b5d5b48189bdb99081919589d603a1b604482015260640161093a565b86546040516370a0823160e01b81526001600160a01b03909116905f9082906370a08231906117bb903090600401613daa565b602060405180830381865afa1580156117d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117fa91906141d4565b90506118116001600160a01b03831633308e613501565b6040516370a0823160e01b81525f906001600160a01b038416906370a082319061183f903090600401613daa565b602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906141d4565b90508b61188b8383614025565b146118d45760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd081d1c985b9cd9995c88185b5bdd5b9d603a1b604482015260640161093a565b8b60068e815481106118e8576118e8613fd1565b905f5260205f2090600a02016007015f828254611905919061406d565b925050819055508460068e8154811061192057611920613fd1565b905f5260205f2090600a02016003015f82825461193d919061406d565b90915550506001600160a01b03808c165f908152600d6020908152604091829020825160c08101845260018f01549094168452908301889052908201899052606082018f905263ffffffff42818116608085015260098e015492939260a08401926119b09291600160201b90041661406d565b63ffffffff16815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160040160046101000a81548163ffffffff021916908363ffffffff16021790555050508c8b6001600160a01b03167f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f28e888b604051611ac5939291909283526020830191909152604082015260600190565b60405180910390a350505050505050505050610d3c6001600255565b5f828152600160205260408120611af8908361353a565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611b8157602002820191905f5260205f20905b815481526020019060010190808311611b6d575b509394505f93505050505b8151811015611c1957846001600160a01b0316600a5f848481518110611bb457611bb4613fd1565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611c015750611c01828281518110611bf457611bf4613fd1565b6020026020010151610c5b565b15611c1157600192505050610820565b600101611b8c565b505f949350505050565b5f611c2d81612ffb565b6001600160a01b038216611c805760405162461bcd60e51b815260206004820152601a602482015279496e76616c69642061756374696f6e656572206164647265737360301b604482015260640161093a565b611c975f51602061429c5f395f51905f5283611aff565b15611cdc5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b604482015260640161093a565b611cf35f51602061429c5f395f51905f5283613071565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061429c5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f51602061429c5f395f51905f52611d6981612ffb565b60035460ff1615611d8c5760405162461bcd60e51b815260040161093a90613fe5565b5f868152600a60205260409020546001600160a01b03163314611dc15760405162461bcd60e51b815260040161093a906141eb565b5f8311611e085760405162461bcd60e51b81526020600482015260156024820152745461726765742063616e6e6f74206265207a65726f60581b604482015260640161093a565b5f8411611e4d5760405162461bcd60e51b8152602060048201526013602482015272526174652063616e6e6f74206265207a65726f60681b604482015260640161093a565b6040805160a081018252861515815260208082018781528284018781526060840187815263ffffffff42908116608087019081525f8e81526007909652948790209551865490151560ff1990911617865592516001860155905160028501555160038401559051600490920191909155905187917fca26b9928ef624ce9b23cfafc5e93180097417a4faaac312cc856e8d83f5ba4a91611f15918991899189918991909415158552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a2505050505050565b5f6108205f51602061429c5f395f51905f5283611aff565b5f81815260016020526040902060609061082090613545565b5f51602061429c5f395f51905f52611f6d81612ffb565b60035460ff1615611f905760405162461bcd60e51b815260040161093a90613fe5565b5f828152600a60205260409020546001600160a01b03163314611fc55760405162461bcd60e51b815260040161093a906141eb565b60068281548110611fd857611fd8613fd1565b5f91825260209091206009600a90920201015463ffffffff1642116120385760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b604482015260640161093a565b5f6006838154811061204c5761204c613fd1565b5f91825260208220600a9091020154600680546001600160a01b039092169350908590811061207d5761207d613fd1565b5f918252602082206007600a909202010154600e54909250156120c457612710600e54836120ab919061419e565b6120b591906141b5565b90506120c18183614025565b91505b6120d86001600160a01b0384163384613008565b8015612112576121126001600160a01b0384167f0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d83613008565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b5f5160206142dc5f395f51905f5261216d81612ffb565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f6121ae81612ffb565b6121c55f51602061429c5f395f51905f528361309c565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061429c5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f20818154811061083f575f80fd5b60068181548110612249575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f6122c481612ffb565b6103e88263ffffffff16111561230b5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161093a565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061238757612387613fd1565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a08301526006805492945091811061240757612407613fd1565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b909104811661014083015291840151909250164210156124c7575f92505050610820565b5f81610140015163ffffffff1690505f8360a0015163ffffffff1642116125025760808401516124fd9063ffffffff1642614025565b612504565b815b90505f82856020015161251791906141b5565b90505f612524838361419e565b90508560200151811115612539575060208501515b98975050505050505050565b5f81815260016020526040812061082090613551565b6001600160a01b0381165f908152600d6020526040812054606091906001600160401b0381111561258e5761258e613ea3565b6040519080825280602002602001820160405280156125b7578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d6020526040902054811015612639576001600160a01b0384165f908152600d6020526040902080548290811061260457612604613fd1565b905f5260205f2090600502016003015482828151811061262657612626613fd1565b60209081029190910101526001016125bc565b5092915050565b6005818154811061264f575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061267d5761267d613fd1565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b9091041661014084015291935061272f9190614025565b90506127106127408261070861419e565b61274a91906141b5565b949350505050565b5f8281526020819052604090206001015461276c81612ffb565b610d03838361309c565b5f5160206142bc5f395f51905f5261278d81612ffb565b6001600160a01b0382165f9081526009602052604090205460ff166127c45760405162461bcd60e51b815260040161093a9061421c565b6001600160a01b0382165f9081526009602052604090819020805460ff19169055517f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06190611074908490613daa565b5f5f51602061429c5f395f51905f5261282b81612ffb565b60035460ff161561284e5760405162461bcd60e51b815260040161093a90613fe5565b6001600160a01b03861661289b5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b604482015260640161093a565b6001600160a01b0385166128e75760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b604482015260640161093a565b856001600160a01b0316856001600160a01b0316036129435760405162461bcd60e51b8152602060048201526018602482015277151bdad95b9cc81b5d5cdd08189948191a5999995c995b9d60421b604482015260640161093a565b6001600160a01b0386165f9081526009602052604090205460ff1661297a5760405162461bcd60e51b815260040161093a9061421c565b6129843386611b27565b156129dc5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b606482015260840161093a565b82514263ffffffff90911611612a295760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b604482015260640161093a565b8351612a6c5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161093a565b6020840151612abd5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e203000000000604482015260640161093a565b6040840151612b0a5760405162461bcd60e51b815260206004820152601960248201527804d696e696d756d207072696365206d757374206265203e203603c1b604482015260640161093a565b6060840151612b525760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b604482015260640161093a565b82515f90612b6790429063ffffffff16614025565b90505f8111612bb15760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b604482015260640161093a565b5f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bee573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c129190614038565b90505f886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c51573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c759190614038565b9050612ca53330612c8784600a614190565b8a51612c93919061419e565b6001600160a01b038d16929190613501565b60408051610160810182526001600160a01b03808b1682528b1660208201526006918101612cd484600a614190565b8a51612ce0919061419e565b81525f6020808301919091528a01516040808301919091528a01516060820152608001612d0e84600a614190565b60608b0151612d1d919061419e565b81526020015f8152602001428152602001885f60028110612d4057612d40613fd1565b602002015163ffffffff16815260200188600160028110612d6357612d63613fd1565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8b6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612f5c9061424b565b909155506001600160a01b03808a16908b16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978b60016020020151604051612fa791815260200190565b60405180910390a49998505050505050505050565b5f611af8838361235b565b5f6001600160e01b03198216637965db0b60e01b148061082057506301ffc9a760e01b6001600160e01b0319831614610820565b613005813361355a565b50565b6040516001600160a01b03838116602483015260448201839052610d3c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613593565b5f6108208261334c565b5f5f61307d84846135f6565b90508015611af8575f8481526001602052604090206108f89084613685565b5f5f6130a88484613699565b90508015611af8575f8481526001602052604090206108f89084613702565b60028054036131185760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161093a565b60028055565b5f60028260ff16111561314157613136600283614094565b61082090600a614190565b506001919050565b5f818152600760205260409020600381015460049091015461316b919061406d565b421115613005575f6006828154811061318657613186613fd1565b5f91825260208083208584526007909152604090922054600a909102909101915060ff1615613211575f82815260076020526040812060010154600483018054919290916131d590849061406d565b90915550505f8281526007602052604090206002015460048201541061320c575f8281526007602052604090206002015460048201555b61326e565b5f8281526007602052604081206001015460048301805491929091613237908490614025565b90915550505f8281526007602052604090206002015460048201541161326e575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061329f5761329f613fd1565b905f5260205f2090600a020190505f81600301549050805f036132c157505050565b5f8260080154426132d29190614025565b9050805f036132e15750505050565b60098301545f9061330090600160201b900463ffffffff166064614263565b63ffffffff16613310838561419e565b61331a91906141b5565b90508281116133325761332d8184614025565b613334565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061336157613361613fd1565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613439573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061345d9190614038565b90505f61346985613716565b90505f613477836012614094565b613482906012614282565b61348d90600a614190565b9050670de0b6b3a76400006134a2828461419e565b6134ac91906141b5565b94505f85116134f85760405162461bcd60e51b8152602060048201526018602482015277141c9a58d94818d85b18dd5b185d1a5bdb8819985a5b195960421b604482015260640161093a565b50505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d039186918216906323b872dd90608401613035565b5f611af883836138f6565b60605f611af88361391c565b5f610820825490565b6135648282611aff565b610f5d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161093a565b5f5f60205f8451602086015f885af1806135b2576040513d5f823e3d81fd5b50505f513d915081156135c95780600114156135d6565b6001600160a01b0384163b155b15610d035783604051635274afe760e01b815260040161093a9190613daa565b5f6136018383611aff565b61367e575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556136363390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610820565b505f610820565b5f611af8836001600160a01b038416613973565b5f6136a48383611aff565b1561367e575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610820565b5f611af8836001600160a01b0384166139b8565b5f5f6006838154811061372b5761372b613fd1565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a529a88902088519788018952805460ff161515885295860154988701899052938501549686019690965290830154908401529201549481019490945251919350158061382a575080155b1561383757949350505050565b5f8260800151426138489190614025565b90505f83606001518261385b91906141b5565b905080156138eb575f818560200151613874919061419e565b8551909150156138b057604085015161388d828661406d565b111561389f57846040015193506138e9565b6138a9818561406d565b93506138e9565b83811015806138cb575060408501516138c98286614025565b105b156138dc57846040015193506138e9565b6138e68185614025565b93505b505b509095945050505050565b5f825f01828154811061390b5761390b613fd1565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610bde57602002820191905f5260205f2090815481526020019060010190808311610bca5750505050509050919050565b5f81815260018301602052604081205461367e57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610820565b5f8181526001830160205260408120548015613a92575f6139da600183614025565b85549091505f906139ed90600190614025565b9050808214613a4c575f865f018281548110613a0b57613a0b613fd1565b905f5260205f200154905080875f018481548110613a2b57613a2b613fd1565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613a5d57613a5d614080565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610820565b5f915050610820565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613b11575f5ffd5b81356001600160e01b031981168114611af8575f5ffd5b6001600160a01b0381168114613005575f5ffd5b5f5f60408385031215613b4d575f5ffd5b8235613b5881613b28565b946020939093013593505050565b5f5f60208385031215613b77575f5ffd5b82356001600160401b03811115613b8c575f5ffd5b8301601f81018513613b9c575f5ffd5b80356001600160401b03811115613bb1575f5ffd5b8560208260051b8401011115613bc5575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613bfc60208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613c3f60c08401826001600160a01b03169052565b5060e0810151613c5360e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b818110156138eb57613c97838551613bd5565b602093909301926101409290920191600101613c84565b5f60208284031215613cbe575f5ffd5b5035919050565b61014081016108208284613bd5565b5f60208284031215613ce4575f5ffd5b8135611af881613b28565b602080825282518282018190525f918401906040840190835b818110156138eb578351835260209384019390920191600101613d08565b5f5f60408385031215613d37575f5ffd5b823591506020830135613d4981613b28565b809150509250929050565b5f5f5f60608486031215613d66575f5ffd5b83359250602084013591506040840135613d7f81613b28565b809150509250925092565b5f5f60408385031215613d9b575f5ffd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f5f60408385031215613dcf575f5ffd5b8235613dda81613b28565b91506020830135613d4981613b28565b5f5f5f5f5f60a08688031215613dfe575f5ffd5b8535945060208601358015158114613e14575f5ffd5b94979496505050506040830135926060810135926080909101359150565b602080825282518282018190525f918401906040840190835b818110156138eb5783516001600160a01b0316835260209384019390920191600101613e4b565b803563ffffffff81168114613e85575f5ffd5b919050565b5f60208284031215613e9a575f5ffd5b611af882613e72565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613eeb57634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112613f02575f5ffd5b613f0c6040613eb7565b806040840185811115613f1d575f5ffd5b845b818110156138eb57613f3081613e72565b845260209384019301613f1f565b5f5f5f5f6101008587031215613f52575f5ffd5b8435613f5d81613b28565b93506020850135613f6d81613b28565b9250605f85018613613f7d575f5ffd5b613f876080613eb7565b8060c0870188811115613f98575f5ffd5b604088015b81811015613fb5578035845260209384019301613f9d565b50819450613fc38982613ef3565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561082057610820614011565b5f60208284031215614048575f5ffd5b815160ff81168114611af8575f5ffd5b5f8161406657614066614011565b505f190190565b8082018082111561082057610820614011565b634e487b7160e01b5f52603160045260245ffd5b60ff828116828216039081111561082057610820614011565b6001815b60018411156140e8578085048111156140cc576140cc614011565b60018416156140da57908102905b60019390931c9280026140b1565b935093915050565b5f826140fe57506001610820565b8161410a57505f610820565b8160018114614120576002811461412a57614146565b6001915050610820565b60ff84111561413b5761413b614011565b50506001821b610820565b5060208310610133831016604e8410600b8410161715614169575081810a610820565b6141755f1984846140ad565b805f190482111561418857614188614011565b029392505050565b5f611af860ff8416836140f0565b808202811582820484141761082057610820614011565b5f826141cf57634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156141e4575f5ffd5b5051919050565b6020808252601790820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b604082015260600190565b602080825260159082015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604082015260600190565b5f6001820161425c5761425c614011565b5060010190565b63ffffffff818116838216029081169081811461263957612639614011565b60ff81811683821601908111156108205761082061401156fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891d5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a2646970667358221220191c1c3442cc54e9841893e64eb334686614801ff2116aab80f6d62189fcb28764736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
-----Decoded View---------------
Arg [0] : _mSig (address): 0x5e4D8755c0cBD26E8670b27Bc0bD21EF84cD881d
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
Deployed Bytecode Sourcemap
50569:23558:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44115:214;;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;44115:214:0;;;;;;;;52415:53;;;;;;:::i;:::-;;:::i;:::-;;;1247:25:1;;;1235:2;1220:18;52415:53:0;1101:177:1;67962:342:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57310:393::-;;;;;;:::i;:::-;;:::i;:::-;;67306:648;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65026:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66083:107::-;;;;;;:::i;:::-;;:::i;65176:138::-;;;;;;:::i;:::-;;:::i;52037:28::-;;;;;;27188:122;;;;;;:::i;:::-;27253:7;27280:12;;;;;;;;;;:22;;;;27188:122;65651:162;;;;;;:::i;:::-;;:::i;27620:138::-;;;;;;:::i;:::-;;:::i;28757:251::-;;;;;;:::i;:::-;;:::i;64313:165::-;;;:::i;50934:18::-;;;;;;;;;63533:525;;;;;;:::i;:::-;;:::i;50845:80::-;;-1:-1:-1;;;;;;;;;;;50845:80:0;;58431:350;;;;;;:::i;:::-;;:::i;68458:174::-;;;;;;:::i;:::-;;:::i;61535:1074::-;;;;;;:::i;:::-;;:::i;52475:43::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6339:32:1;;;6321:51;;6403:2;6388:18;;6381:34;;;;6431:18;;;6424:34;;;;6489:2;6474:18;;6467:34;6550:10;6538:23;;;6532:3;6517:19;;6510:52;6599:23;6359:3;6578:19;;6571:52;6308:3;6293:19;52475:43:0;6038:591:1;59707:1820:0;;;;;;:::i;:::-;;:::i;44928:144::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50754:84::-;;-1:-1:-1;;;;;;;;;;;50754:84:0;;26204:138;;;;;;:::i;:::-;;:::i;73633:375::-;;;;;;:::i;:::-;;:::i;62729:489::-;;;;;;:::i;:::-;;:::i;58790:790::-;;;;;;:::i;:::-;;:::i;66202:127::-;;;;;;:::i;:::-;;:::i;25516:49::-;;25561:4;25516:49;;45932:138;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57709:710::-;;;;;;:::i;:::-;;:::i;64486:170::-;;;:::i;52592:38::-;;52626:4;52592:38;;52137:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9760:14:1;;9753:22;9735:41;;9807:2;9792:18;;9785:34;;;;9835:18;;;9828:34;;;;9893:2;9878:18;;9871:34;9936:3;9921:19;;9914:35;9722:3;9707:19;52137:45:0;9482:473:1;63226:298:0;;;;;;:::i;:::-;;:::i;52356:52::-;;;;;;:::i;:::-;;:::i;52110:20::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10402:32:1;;;10384:51;;10471:32;;;;10466:2;10451:18;;10444:60;10520:18;;;10513:34;;;;10578:2;10563:18;;10556:34;;;;10621:3;10606:19;;10599:35;;;;10422:3;10650:19;;10643:35;;;;10709:3;10694:19;;10687:35;10753:3;10738:19;;10731:35;10797:3;10782:19;;10775:35;10859:10;10847:23;;;10841:3;10826:19;;10819:52;10908:24;10902:3;10887:19;;10880:53;10371:3;10356:19;52110:20:0;9960:979:1;64663:237:0;;;;;;:::i;:::-;;:::i;66337:959::-;;;;;;:::i;:::-;;:::i;45246:133::-;;;;;;:::i;:::-;;:::i;50677:70::-;;-1:-1:-1;;;;;;;;;;;50677:70:0;;65322:316;;;;;;:::i;:::-;;:::i;52072:31::-;;;;;;:::i;:::-;;:::i;65827:244::-;;;;;;:::i;:::-;;:::i;28051:140::-;;;;;;:::i;:::-;;:::i;64066:232::-;;;;;;:::i;:::-;;:::i;52562:23::-;;;;;;54824:2477;;;;;;:::i;:::-;;:::i;52294:55::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;52294:55:0;;;52526:29;;;;;68310:141;;;;;;:::i;:::-;;:::i;44115:214::-;44200:4;-1:-1:-1;;;;;;44224:57:0;;-1:-1:-1;;;44224:57:0;;:97;;;44285:36;44309:11;44285:23;:36::i;:::-;44217:104;44115:214;-1:-1:-1;;44115:214:0:o;52415:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67962:342::-;68047:23;68079:31;68134:9;-1:-1:-1;;;;;68113:38:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;68079:72:0;-1:-1:-1;68169:9:0;68164:110;68184:20;;;68164:110;;;68235:31;68253:9;;68263:1;68253:12;;;;;;;:::i;:::-;;;;;;;68235:17;:31::i;:::-;68222:7;68230:1;68222:10;;;;;;;;:::i;:::-;;;;;;;;;;:44;68206:3;;68164:110;;;-1:-1:-1;68293:7:0;67962:342;-1:-1:-1;;;67962:342:0:o;57310:393::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;74067:6:::1;::::0;::::1;;74066:7;74058:38;;;;-1:-1:-1::0;;;74058:38:0::1;;;;;;;:::i;:::-;;;;;;;;;57402:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57402:25:0::2;57431:10;57402:39;57398:69;;57443:24;::::0;-1:-1:-1;;;57443:24:0;;14182:2:1;57443:24:0::2;::::0;::::2;14164:21:1::0;14221:2;14201:18;;;14194:30;-1:-1:-1;;;14240:18:1;;;14233:43;14293:18;;57443:24:0::2;13980:337:1::0;57398:69:0::2;57503:15;57474:5;57480:3;57474:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:45;;;;;;;;;;;;;;;;;;57528:18;57575:5;57581:3;57575:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;57549:5;57555:3;57549:10;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:46;;;;:::i;:::-;57528:67;;57604;57648:10;57660;57611:5;57617:3;57611:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:22:::2;:10;::::0;;::::2;;:22;::::0;-1:-1:-1;;;;;57611:22:0::2;::::0;57604:67;:43:::2;:67::i;:::-;57685:14;::::0;57695:3;;57685:14:::2;::::0;;;::::2;57391:312;57310:393:::0;;:::o;67306:648::-;67372:21;;:::i;:::-;67406:18;67427:5;67433:8;67427:15;;;;;;;;:::i;:::-;;;;;;;;;;67470:476;;;;;;;;67427:15;;;;;;;67512;;-1:-1:-1;;;;;67512:15:0;;;67470:476;;67512:15;67555:16;;;;67470:476;;;;;;;67427:15;;-1:-1:-1;67470:476:0;;;67593:24;67608:8;67593:14;:24::i;:::-;67470:476;;;;67643:26;67660:8;67643:16;:26::i;:::-;67470:476;;67697:16;;;;-1:-1:-1;;;67697:16:0;;;;67470:476;;;;;;;;67743:17;;;;67470:476;;;;;;;;-1:-1:-1;67787:30:0;;;:20;:30;;;;;;-1:-1:-1;;;;;67787:30:0;67470:476;;;;;;67840:16;67787:30;67840:6;:16::i;:::-;67470:476;;;;67882:14;;;;67470:476;;;;67921:13;;;;;;;67470:476;;;;;;;;67463:483;67306:648;-1:-1:-1;;67306:648:0:o;65026:142::-;-1:-1:-1;;;;;65133:27:0;;;;;;:15;:27;;;;;;;;;65126:34;;;;;;;;;;;;;;;;;65096:16;;65126:34;;;65133:27;65126:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65026:142;;;:::o;66083:107::-;66135:7;66163:19;66178:3;66163:14;:19::i;65176:138::-;-1:-1:-1;;;;;65282:24:0;;;;;;:16;:24;;;;;;;;;65275:31;;;;;;;;;;;;;;;;;65243:16;;65275:31;;;65282:24;65275:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65176:138;;;:::o;65651:162::-;65701:4;65745:5;65751:3;65745:10;;;;;;;;:::i;:::-;;;;;;;;;:19;:10;;;;;:19;;;;65726:15;:38;;;;:83;;;65791:5;65797:3;65791:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;65768:5;65774:3;65768:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:41;65719:90;65651:162;-1:-1:-1;;65651:162:0:o;27620:138::-;27253:7;27280:12;;;;;;;;;;:22;;;25800:16;25811:4;25800:10;:16::i;:::-;27725:25:::1;27736:4;27742:7;27725:10;:25::i;:::-;;27620:138:::0;;;:::o;28757:251::-;-1:-1:-1;;;;;28851:34:0;;22507:10;28851:34;28847:104;;28909:30;;-1:-1:-1;;;28909:30:0;;;;;;;;;;;28847:104;28963:37;28975:4;28981:18;28963:11;:37::i;:::-;;28757:251;;:::o;64313:165::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;64415:6:::1;:13:::0;;-1:-1:-1;;64415:13:0::1;64424:4;64415:13;::::0;;64444:26:::1;::::0;64459:10:::1;::::0;64444:26:::1;::::0;64415:6:::1;::::0;64444:26:::1;64313:165:::0;:::o;63533:525::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;-1:-1:-1;;;;;63660:20:0;::::1;63652:54;;;::::0;-1:-1:-1;;;63652:54:0;;14789:2:1;63652:54:0::1;::::0;::::1;14771:21:1::0;14828:2;14808:18;;;14801:30;-1:-1:-1;;;14847:18:1;;;14840:51;14908:18;;63652:54:0::1;14587:345:1::0;63652:54:0::1;-1:-1:-1::0;;;;;63726:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;63725:26;63717:64;;;::::0;-1:-1:-1;;;63717:64:0;;15139:2:1;63717:64:0::1;::::0;::::1;15121:21:1::0;15178:2;15158:18;;;15151:30;-1:-1:-1;;;15197:18:1;;;15190:55;15262:18;;63717:64:0::1;14937:349:1::0;63717:64:0::1;63853:6;-1:-1:-1::0;;;;;63838:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;63838:33:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;63838:33:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;63834:217;;64010:29;::::0;-1:-1:-1;;;64010:29:0;;15771:2:1;64010:29:0::1;::::0;::::1;15753:21:1::0;15810:2;15790:18;;;15783:30;-1:-1:-1;;;15829:18:1;;;15822:49;15888:18;;64010:29:0::1;15569:343:1::0;63834:217:0::1;-1:-1:-1::0;;;;;;63903:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;:32;;-1:-1:-1;;63903:32:0::1;63931:4;63903:32:::0;;::::1;::::0;;;63950:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;63950:26:0::1;::::0;;::::1;::::0;;63834:217:::1;63533:525:::0;;:::o;58431:350::-;58520:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;58520:30:0;58554:10;58520:44;58512:73;;;;-1:-1:-1;;;58512:73:0;;16119:2:1;58512:73:0;;;16101:21:1;16158:2;16138:18;;;16131:30;-1:-1:-1;;;16177:18:1;;;16170:46;16233:18;;58512:73:0;15917:340:1;58512:73:0;58600:39;-1:-1:-1;;;;;;;;;;;58625:13:0;58600:7;:39::i;:::-;58592:66;;;;-1:-1:-1;;;58592:66:0;;16464:2:1;58592:66:0;;;16446:21:1;16503:2;16483:18;;;16476:30;-1:-1:-1;;;16522:18:1;;;16515:44;16576:18;;58592:66:0;16262:338:1;58592:66:0;58665:30;;;;:20;:30;;;;;;;;;:46;;-1:-1:-1;;;;;;58665:46:0;-1:-1:-1;;;;;58665:46:0;;;;;;;;58723:54;;16807:25:1;;;58751:10:0;16848:18:1;;;16841:60;;;;16917:18;;;16910:60;;;;58723:54:0;;16795:2:1;16780:18;58723:54:0;;;;;;;;58431:350;;:::o;68458:174::-;-1:-1:-1;;;;;68560:14:0;;68528:4;68560:14;;;:8;:14;;;;;:23;;68528:4;;68560:14;68575:7;;68560:23;;;;;;:::i;:::-;;;;;;;;;;68541:42;;;;;;;;68560:23;;;;;;;68541:42;;-1:-1:-1;;;;;68541:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68541:42:0;;;;;;;;;;;68597:15;:31;;;-1:-1:-1;;68458:174:0;;;;:::o;61535:1074::-;61609:22;49023:21;:19;:21::i;:::-;-1:-1:-1;;;;;61657:14:0;::::1;61640;61657::::0;;;:8:::1;:14;::::0;;;;:21;;;61721:852:::1;61746:5:::0;;61721:852:::1;;61765:3:::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;61818:14:0;::::1;61791:24;61818:14:::0;;;:8:::1;:14;::::0;;;;:17;;61765:3;;-1:-1:-1;61791:24:0;;-1:-1:-1;61818:14:0;61765:3;;61818:17;::::1;;;;;:::i;:::-;;;;;;;;;;;61791:44;;61874:3;61850:11;:20;;;:27:::0;61846:720:::1;;61894:14;61911:30;61933:4;61939:1;61911:21;:30::i;:::-;61894:47:::0;-1:-1:-1;61974:10:0;;61970:585:::1;;62031:6;62005:11;:22;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62056:23:0::1;::::0;-1:-1:-1;62073:6:0;62056:23;::::1;:::i;:::-;;;62180:57;62224:4;62230:6;62187:5;62193:3;62187:10;;;;;;;;:::i;62180:57::-;62278:11;:22;;;62304:1;62278:27:::0;62274:266:::1;;-1:-1:-1::0;;;;;62339:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:21;:25:::1;::::0;62363:1:::1;::::0;62339:25:::1;:::i;:::-;62334:1;:30;62330:148;;-1:-1:-1::0;;;;;62413:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;62428:21;;:25:::1;::::0;62452:1:::1;::::0;62428:25:::1;:::i;:::-;62413:41;;;;;;;;:::i;:::-;;;;;;;;;;;62393:8;:14;62402:4;-1:-1:-1::0;;;;;62393:14:0::1;-1:-1:-1::0;;;;;62393:14:0::1;;;;;;;;;;;;62408:1;62393:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:61;;:17:::1;::::0;;::::1;;:61:::0;;-1:-1:-1;;;;;;62393:61:0::1;-1:-1:-1::0;;;;;62393:61:0;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;62393:61:0;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;62393:61:0;;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;62393:61:0;;;;;;;;;::::1;::::0;;62330:148:::1;-1:-1:-1::0;;;;;62500:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:20;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;62500:20:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;62500:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;62500:20:0;;;;;62274:266:::1;61879:687;61846:720;61754:819;61721:852;;;-1:-1:-1::0;62592:13:0;-1:-1:-1;;49067:20:0;48461:1;49587:7;:22;49404:213;52475:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52475:43:0;;;;-1:-1:-1;52475:43:0;;-1:-1:-1;52475:43:0;;;;;;;-1:-1:-1;;;52475:43:0;;;;:::o;59707:1820::-;49023:21;:19;:21::i;:::-;-1:-1:-1;;;;;59802:18:0;::::1;59794:51;;;::::0;-1:-1:-1;;;59794:51:0;;17586:2:1;59794:51:0::1;::::0;::::1;17568:21:1::0;17625:2;17605:18;;;17598:30;-1:-1:-1;;;17644:18:1;;;17637:50;17704:18;;59794:51:0::1;17384:344:1::0;59794:51:0::1;59866:5;:12:::0;59860:18;::::1;59852:48;;;::::0;-1:-1:-1;;;59852:48:0;;17935:2:1;59852:48:0::1;::::0;::::1;17917:21:1::0;17974:2;17954:18;;;17947:30;-1:-1:-1;;;17993:18:1;;;17986:47;18050:18;;59852:48:0::1;17733:341:1::0;59852:48:0::1;59907:18;59928:5;59934:3;59928:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;59972:13;::::0;::::1;::::0;59928:10;;-1:-1:-1;59972:13:0::1;;59953:15;:32;;59945:59;;;::::0;-1:-1:-1;;;59945:59:0;;18281:2:1;59945:59:0::1;::::0;::::1;18263:21:1::0;18320:2;18300:18;;;18293:30;-1:-1:-1;;;18339:18:1;;;18332:44;18393:18;;59945:59:0::1;18079:338:1::0;59945:59:0::1;60036:4;:12;;;60019:4;:14;;;:29;60011:71;;;::::0;-1:-1:-1;;;60011:71:0;;18624:2:1;60011:71:0::1;::::0;::::1;18606:21:1::0;18663:2;18643:18;;;18636:30;18702:31;18682:18;;;18675:59;18751:18;;60011:71:0::1;18422:353:1::0;60011:71:0::1;60136:15:::0;;60113:51:::1;::::0;;-1:-1:-1;;;60113:51:0;;;;60091:19:::1;::::0;-1:-1:-1;;;;;60136:15:0::1;::::0;60113:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;60136:15;60113:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60091:73;;60171:22;60196:38;60220:13;60196:23;:38::i;:::-;60171:63;;60259:14;60249:6;:24;;60241:68;;;::::0;-1:-1:-1;;;60241:68:0;;18982:2:1;60241:68:0::1;::::0;::::1;18964:21:1::0;19021:2;19001:18;;;18994:30;19060:33;19040:18;;;19033:61;19111:18;;60241:68:0::1;18780:355:1::0;60241:68:0::1;60318:10;60324:3;60318:5;:10::i;:::-;60335:15;60346:3;60335:10;:15::i;:::-;60359:13;60375:17;60388:3;60375:12;:17::i;:::-;60359:33:::0;-1:-1:-1;60411:20:0::1;60451:18;60456:13:::0;60451:2:::1;:18;:::i;:::-;60444:26;::::0;:2:::1;:26;:::i;:::-;60434:37;::::0;:6;:37:::1;:::i;:::-;60411:60:::0;-1:-1:-1;60478:14:0::1;60519:5:::0;60496:19:::1;60411:60:::0;60511:4:::1;60496:19;:::i;:::-;60495:29;;;;:::i;:::-;60478:46;;60537:17;60600:5;60574:4;:14;;;60559:4;:12;;;:29;;;;:::i;:::-;60558:38;::::0;60592:4:::1;60558:38;:::i;:::-;60557:48;;;;:::i;:::-;60537:68;;60636:9;60626:6;:19;;60618:63;;;::::0;-1:-1:-1;;;60618:63:0;;21325:2:1;60618:63:0::1;::::0;::::1;21307:21:1::0;21364:2;21344:18;;;21337:30;21403:33;21383:18;;;21376:61;21454:18;;60618:63:0::1;21123:355:1::0;60618:63:0::1;60723:4;:12;;;60713:6;60696:4;:14;;;:23;;;;:::i;:::-;:39;;60688:77;;;::::0;-1:-1:-1;;;60688:77:0;;21685:2:1;60688:77:0::1;::::0;::::1;21667:21:1::0;21724:2;21704:18;;;21697:30;-1:-1:-1;;;21743:18:1;;;21736:55;21808:18;;60688:77:0::1;21483:349:1::0;60688:77:0::1;60801:15:::0;;60848:35:::1;::::0;-1:-1:-1;;;60848:35:0;;-1:-1:-1;;;;;60801:15:0;;::::1;::::0;60774:17:::1;::::0;60801:15;;60848:20:::1;::::0;:35:::1;::::0;60877:4:::1;::::0;60848:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60824:59:::0;-1:-1:-1;60890:62:0::1;-1:-1:-1::0;;;;;60890:27:0;::::1;60918:10;60938:4;60945:6:::0;60890:27:::1;:62::i;:::-;60982:35;::::0;-1:-1:-1;;;60982:35:0;;60959:20:::1;::::0;-1:-1:-1;;;;;60982:20:0;::::1;::::0;::::1;::::0;:35:::1;::::0;61011:4:::1;::::0;60982:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60959:58:::0;-1:-1:-1;61064:6:0;61032:28:::1;61047:13:::0;60959:58;61032:28:::1;:::i;:::-;:38;61024:76;;;::::0;-1:-1:-1;;;61024:76:0;;22228:2:1;61024:76:0::1;::::0;::::1;22210:21:1::0;22267:2;22247:18;;;22240:30;-1:-1:-1;;;22286:18:1;;;22279:55;22351:18;;61024:76:0::1;22026:349:1::0;61024:76:0::1;61145:6;61113:5;61119:3;61113:10;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;;;;;;;;61182:6;61158:5;61164:3;61158:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;61197:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;;61217:240;;::::1;::::0;::::1;::::0;;61246:16:::1;::::0;::::1;::::0;;;::::1;61217:240:::0;;;;::::1;::::0;;;;;;;;;;;;;;;::::1;61371:15;61217:240:::0;;::::1;::::0;;;;61414:16:::1;::::0;::::1;::::0;61197:14;;61217:240;;;;;61414:34:::1;::::0;61371:15;-1:-1:-1;;;61414:16:0;::::1;;:34;:::i;:::-;61217:240;;;;::::0;61197:261:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;61197:261:0::1;;;;;-1:-1:-1::0;;;;;61197:261:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61496:3;61490:4;-1:-1:-1::0;;;;;61476:47:0::1;;61501:6;61509;61517:5;61476:47;;;;;;;22582:25:1::0;;;22638:2;22623:18;;22616:34;;;;22681:2;22666:18;;22659:34;22570:2;22555:18;;22380:319;61476:47:0::1;;;;;;;;59787:1740;;;;;;;;;;49067:20:::0;48461:1;49587:7;:22;49404:213;44928:144;45009:7;45036:18;;;:12;:18;;;;;:28;;45058:5;45036:21;:28::i;:::-;45029:35;44928:144;-1:-1:-1;;;44928:144:0:o;26204:138::-;26281:4;26305:12;;;;;;;;;;;-1:-1:-1;;;;;26305:29:0;;;;;;;;;;;;;;;26204:138::o;73633:375::-;-1:-1:-1;;;;;73771:27:0;;73731:4;73771:27;;;:15;:27;;;;;;;;73744:54;;;;;;;;;;;;;;;;;73731:4;;73744:54;;73771:27;73744:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73744:54:0;;-1:-1:-1;73809:9:0;;-1:-1:-1;;;;73805:181:0;73828:7;:14;73824:1;:18;73805:181;;;73898:10;-1:-1:-1;;;;;73862:46:0;:20;:32;73883:7;73891:1;73883:10;;;;;;;;:::i;:::-;;;;;;;;;;;;73862:32;;;;;;;;;;-1:-1:-1;73862:32:0;;-1:-1:-1;;;;;73862:32:0;:46;:68;;;;;73912:18;73919:7;73927:1;73919:10;;;;;;;;:::i;:::-;;;;;;;73912:6;:18::i;:::-;73859:120;;;73963:4;73956:11;;;;;;73859:120;73844:3;;73805:181;;;-1:-1:-1;73999:5:0;;73633:375;-1:-1:-1;;;;73633:375:0:o;62729:489::-;25561:4;25800:16;25561:4;25800:10;:16::i;:::-;-1:-1:-1;;;;;62896:25:0;::::1;62888:64;;;::::0;-1:-1:-1;;;62888:64:0;;22906:2:1;62888:64:0::1;::::0;::::1;22888:21:1::0;22945:2;22925:18;;;22918:30;-1:-1:-1;;;22964:18:1;;;22957:56;23030:18;;62888:64:0::1;22704:350:1::0;62888:64:0::1;62972:37;-1:-1:-1::0;;;;;;;;;;;62997:11:0::1;62972:7;:37::i;:::-;62971:38;62963:72;;;::::0;-1:-1:-1;;;62963:72:0;;23261:2:1;62963:72:0::1;::::0;::::1;23243:21:1::0;23300:2;23280:18;;;23273:30;-1:-1:-1;;;23319:18:1;;;23312:51;23380:18;;62963:72:0::1;23059:345:1::0;62963:72:0::1;63048:40;-1:-1:-1::0;;;;;;;;;;;63076:11:0::1;63048:10;:40::i;:::-;-1:-1:-1::0;;;;;;63099:35:0;::::1;;::::0;;;:22:::1;:35;::::0;;;;;:42;;-1:-1:-1;;63099:42:0::1;63137:4;63099:42;::::0;;63157:53;63199:10:::1;::::0;63099:35;-1:-1:-1;;;;;;;;;;;50719:28:0;63157:53:::1;::::0;63099:35;63157:53:::1;62729:489:::0;;:::o;58790:790::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;74067:6:::1;::::0;::::1;;74066:7;74058:38;;;;-1:-1:-1::0;;;74058:38:0::1;;;;;;;:::i;:::-;59006:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;59006:25:0::2;59035:10;59006:39;58998:75;;;;-1:-1:-1::0;;;58998:75:0::2;;;;;;;:::i;:::-;59102:1;59092:7;:11;59084:45;;;::::0;-1:-1:-1;;;59084:45:0;;23963:2:1;59084:45:0::2;::::0;::::2;23945:21:1::0;24002:2;23982:18;;;23975:30;-1:-1:-1;;;24021:18:1;;;24014:51;24082:18;;59084:45:0::2;23761:345:1::0;59084:45:0::2;59156:1;59148:5;:9;59140:41;;;::::0;-1:-1:-1;;;59140:41:0;;24313:2:1;59140:41:0::2;::::0;::::2;24295:21:1::0;24352:2;24332:18;;;24325:30;-1:-1:-1;;;24371:18:1;;;24364:49;24430:18;;59140:41:0::2;24111:343:1::0;59140:41:0::2;59221:178;::::0;;::::2;::::0;::::2;::::0;;;::::2;;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;;;::::2;59371:15;59221:178:::0;;::::2;::::0;;;;;;-1:-1:-1;59202:16:0;;;:11:::2;:16:::0;;;;;;;:197;;;;;::::2;;-1:-1:-1::0;;59202:197:0;;::::2;;::::0;;;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;;;;59417:155;;59214:3;;59417:155:::2;::::0;::::2;::::0;59248:4;;59273:5;;59301:7;;59331;;59371:15;9760:14:1;;9753:22;9735:41;;9807:2;9792:18;;9785:34;;;;9850:2;9835:18;;9828:34;;;;9893:2;9878:18;;9871:34;9936:3;9921:19;;9914:35;9722:3;9707:19;;9482:473;59417:155:0::2;;;;;;;;58790:790:::0;;;;;;:::o;66202:127::-;66264:4;66288:33;-1:-1:-1;;;;;;;;;;;66313:7:0;66288;:33::i;45932:138::-;46035:18;;;;:12;:18;;;;;45999:16;;46035:27;;:25;:27::i;57709:710::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;74067:6:::1;::::0;::::1;;74066:7;74058:38;;;;-1:-1:-1::0;;;74058:38:0::1;;;;;;;:::i;:::-;57815:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57815:25:0::2;57844:10;57815:39;57807:75;;;;-1:-1:-1::0;;;57807:75:0::2;;;;;;;:::i;:::-;57915:5;57921:3;57915:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:19:::2;:10;::::0;;::::2;;:19;::::0;::::2;;57897:15;:37;57889:72;;;::::0;-1:-1:-1;;;57889:72:0;;24661:2:1;57889:72:0::2;::::0;::::2;24643:21:1::0;24700:2;24680:18;;;24673:30;-1:-1:-1;;;24719:18:1;;;24712:52;24781:18;;57889:72:0::2;24459:346:1::0;57889:72:0::2;57970:18;57991:5;57997:3;57991:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:21:::0;58037:5:::2;:10:::0;;-1:-1:-1;;;;;57991:21:0;;::::2;::::0;-1:-1:-1;58037:5:0;58043:3;;58037:10;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:28:::2;:10;::::0;;::::2;;:28;::::0;58103:8:::2;::::0;58037:28;;-1:-1:-1;58103:12:0;58099:102:::2;;58160:5;58148:8;;58138:7;:18;;;;:::i;:::-;58137:28;;;;:::i;:::-;58128:37:::0;-1:-1:-1;58176:17:0::2;58128:37:::0;58176:17;::::2;:::i;:::-;;;58099:102;58209:52;-1:-1:-1::0;;;;;58209:31:0;::::2;58241:10;58253:7:::0;58209:31:::2;:52::i;:::-;58272:10:::0;;58268:80:::2;;58295:45;-1:-1:-1::0;;;;;58295:31:0;::::2;58327:4;58333:6:::0;58295:31:::2;:45::i;:::-;58361:54;::::0;;24984:25:1;;;25040:2;25025:18;;25018:34;;;58387:10:0::2;::::0;58382:3;;58361:54:::2;::::0;24957:18:1;58361:54:0::2;;;;;;;57800:619;;;57709:710:::0;;:::o;64486:170::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;64590:6:::1;:14:::0;;-1:-1:-1;;64590:14:0::1;::::0;;64620:28:::1;::::0;64637:10:::1;::::0;64620:28:::1;::::0;64599:5:::1;::::0;64620:28:::1;64486:170:::0;:::o;63226:298::-;25561:4;25800:16;25561:4;25800:10;:16::i;:::-;63352:41:::1;-1:-1:-1::0;;;;;;;;;;;63381:11:0::1;63352;:41::i;:::-;-1:-1:-1::0;;;;;;63404:35:0;::::1;63442:5;63404:35:::0;;;:22:::1;:35;::::0;;;;;:43;;-1:-1:-1;;63404:43:0::1;::::0;;63463:53;63505:10:::1;::::0;63404:35;-1:-1:-1;;;;;;;;;;;50719:28:0;63463:53:::1;::::0;63442:5;63463:53:::1;63226:298:::0;;:::o;52356:52::-;;;;;;;;;;;;;;;;;;;;52110:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52110:20:0;;;;-1:-1:-1;52110:20:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52110:20:0;;;;:::o;64663:237::-;25561:4;25800:16;25561:4;25800:10;:16::i;:::-;52626:4:::1;64756:10;:21;;;;64748:46;;;::::0;-1:-1:-1;;;64748:46:0;;25265:2:1;64748:46:0::1;::::0;::::1;25247:21:1::0;25304:2;25284:18;;;25277:30;-1:-1:-1;;;25323:18:1;;;25316:42;25375:18;;64748:46:0::1;25063:336:1::0;64748:46:0::1;64818:8;::::0;;64833:21:::1;::::0;::::1;::::0;;;;64866:30:::1;::::0;;25577:25:1;;;25633:2;25618:18;;25611:51;;;;64818:8:0;;64866:30:::1;::::0;25550:18:1;64866:30:0::1;;;;;;;64741:159;64663:237:::0;;:::o;66337:959::-;-1:-1:-1;;;;;66455:14:0;;66420:7;66455:14;;;:8;:14;;;;;:23;;66420:7;;66455:14;66470:7;;66455:23;;;;;;:::i;:::-;;;;;;;;;66436:42;;;;;;;;66455:23;;;;;;;66436:42;;-1:-1:-1;;;;;66436:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66436:42:0;;;;;;;;66505:5;:20;;66436:42;;-1:-1:-1;66505:5:0;:20;;;;;;:::i;:::-;;;;;;;;;;66485:40;;;;;;;;66505:20;;;;;;;66485:40;;-1:-1:-1;;;;;66485:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66485:40:0;;;;;;;;;66588:14;;;;66485:40;;-1:-1:-1;66570:32:0;:15;:32;66566:65;;;66622:1;66615:8;;;;;;66566:65;66680:19;66702:4;:16;;;66680:38;;;;66775:19;66815:4;:12;;;66797:30;;:15;:30;:99;;66882:14;;;;66864:32;;;;:15;:32;:::i;:::-;66797:99;;;66840:11;66797:99;66775:121;;66941:23;66985:11;66967:4;:15;;;:29;;;;:::i;:::-;66941:55;-1:-1:-1;67048:24:0;67075:29;67093:11;66941:55;67075:29;:::i;:::-;67048:56;;67191:4;:15;;;67172:16;:34;67168:93;;;-1:-1:-1;67238:15:0;;;;67168:93;67276:16;66337:959;-1:-1:-1;;;;;;;;66337:959:0:o;45246:133::-;45317:7;45344:18;;;:12;:18;;;;;:27;;:25;:27::i;65322:316::-;-1:-1:-1;;;;;65463:14:0;;65418:28;65463:14;;;:8;:14;;;;;:21;65385:16;;65418:28;-1:-1:-1;;;;;65449:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65449:36:0;-1:-1:-1;65418:67:0;-1:-1:-1;65497:9:0;65492:114;-1:-1:-1;;;;;65516:14:0;;;;;;:8;:14;;;;;:21;65512:25;;65492:114;;;-1:-1:-1;;;;;65572:14:0;;;;;;:8;:14;;;;;:17;;65587:1;;65572:17;;;;;;:::i;:::-;;;;;;;;;;;:26;;;65555:11;65567:1;65555:14;;;;;;;;:::i;:::-;;;;;;;;;;:43;65539:3;;65492:114;;;-1:-1:-1;65619:11:0;65322:316;-1:-1:-1;;65322:316:0:o;52072:31::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52072:31:0;;-1:-1:-1;52072:31:0;:::o;65827:244::-;65887:7;65906:17;65926:5;65932:3;65926:10;;;;;;;;:::i;:::-;;;;;;;;;65906:30;;;;;;;;65926:10;;;;;;;65906:30;;-1:-1:-1;;;;;65906:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65906:30:0;;;;;;;;;;-1:-1:-1;65970:29:0;;65906:30;65970:29;:::i;:::-;65946:53;-1:-1:-1;66041:5:0;66017:20;65946:53;66033:4;66017:20;:::i;:::-;66016:30;;;;:::i;:::-;66009:37;65827:244;-1:-1:-1;;;;65827:244:0:o;28051:140::-;27253:7;27280:12;;;;;;;;;;:22;;;25800:16;25811:4;25800:10;:16::i;:::-;28157:26:::1;28169:4;28175:7;28157:11;:26::i;64066:232::-:0;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;-1:-1:-1;;;;;64165:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;64157:59;;;;-1:-1:-1::0;;;64157:59:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64223:25:0;::::1;64251:5;64223:25:::0;;;:17:::1;:25;::::0;;;;;;:33;;-1:-1:-1;;64223:33:0::1;::::0;;64268:26;::::1;::::0;::::1;::::0;64241:6;;64268:26:::1;:::i;54824:2477::-:0;55113:16;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;74067:6:::1;::::0;::::1;;74066:7;74058:38;;;;-1:-1:-1::0;;;74058:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55174:26:0;::::2;55166:59;;;::::0;-1:-1:-1;;;55166:59:0;;26225:2:1;55166:59:0::2;::::0;::::2;26207:21:1::0;26264:2;26244:18;;;26237:30;-1:-1:-1;;;26283:18:1;;;26276:50;26343:18;;55166:59:0::2;26023:344:1::0;55166:59:0::2;-1:-1:-1::0;;;;;55240:34:0;::::2;55232:66;;;::::0;-1:-1:-1;;;55232:66:0;;26574:2:1;55232:66:0::2;::::0;::::2;26556:21:1::0;26613:2;26593:18;;;26586:30;-1:-1:-1;;;26632:18:1;;;26625:49;26691:18;;55232:66:0::2;26372:343:1::0;55232:66:0::2;55337:12;-1:-1:-1::0;;;;;55313:36:0::2;55321:11;-1:-1:-1::0;;;;;55313:36:0::2;::::0;55305:73:::2;;;::::0;-1:-1:-1;;;55305:73:0;;26922:2:1;55305:73:0::2;::::0;::::2;26904:21:1::0;26961:2;26941:18;;;26934:30;-1:-1:-1;;;26980:18:1;;;26973:54;27044:18;;55305:73:0::2;26720:348:1::0;55305:73:0::2;-1:-1:-1::0;;;;;55393:31:0;::::2;;::::0;;;:17:::2;:31;::::0;;;;;::::2;;55385:65;;;;-1:-1:-1::0;;;55385:65:0::2;;;;;;;:::i;:::-;55466:61;55494:10;55514:11;55466:27;:61::i;:::-;55465:62;55457:109;;;::::0;-1:-1:-1;;;55457:109:0;;27275:2:1;55457:109:0::2;::::0;::::2;27257:21:1::0;27314:2;27294:18;;;27287:30;27353:34;27333:18;;;27326:62;-1:-1:-1;;;27404:18:1;;;27397:32;27446:19;;55457:109:0::2;27073:398:1::0;55457:109:0::2;55612:16:::0;;55631:15:::2;55612:34;::::0;;::::2;;55604:65;;;::::0;-1:-1:-1;;;55604:65:0;;27678:2:1;55604:65:0::2;::::0;::::2;27660:21:1::0;27717:2;27697:18;;;27690:30;-1:-1:-1;;;27736:18:1;;;27729:48;27794:18;;55604:65:0::2;27476:342:1::0;55604:65:0::2;55715:9:::0;;55707:44:::2;;;::::0;-1:-1:-1;;;55707:44:0;;28025:2:1;55707:44:0::2;::::0;::::2;28007:21:1::0;28064:2;28044:18;;;28037:30;-1:-1:-1;;;28083:18:1;;;28076:48;28141:18;;55707:44:0::2;27823:342:1::0;55707:44:0::2;55766:9;::::0;::::2;::::0;55758:54:::2;;;::::0;-1:-1:-1;;;55758:54:0;;28372:2:1;55758:54:0::2;::::0;::::2;28354:21:1::0;28411:2;28391:18;;;28384:30;28450;28430:18;;;28423:58;28498:18;;55758:54:0::2;28170:352:1::0;55758:54:0::2;55827:9:::0;;::::2;::::0;55819:51:::2;;;::::0;-1:-1:-1;;;55819:51:0;;28729:2:1;55819:51:0::2;::::0;::::2;28711:21:1::0;28768:2;28748:18;;;28741:30;-1:-1:-1;;;28787:18:1;;;28780:55;28852:18;;55819:51:0::2;28527:349:1::0;55819:51:0::2;55885:9:::0;;::::2;::::0;55877:46:::2;;;::::0;-1:-1:-1;;;55877:46:0;;29083:2:1;55877:46:0::2;::::0;::::2;29065:21:1::0;29122:2;29102:18;;;29095:30;-1:-1:-1;;;29141:18:1;;;29134:50;29201:18;;55877:46:0::2;28881:344:1::0;55877:46:0::2;55966:16:::0;;55936:27:::2;::::0;55966:34:::2;::::0;55985:15:::2;::::0;55966:34:::2;;;:::i;:::-;55936:64;;56037:1;56015:19;:23;56007:58;;;::::0;-1:-1:-1;;;56007:58:0;;29432:2:1;56007:58:0::2;::::0;::::2;29414:21:1::0;29471:2;29451:18;;;29444:30;-1:-1:-1;;;29490:18:1;;;29483:52;29552:18;;56007:58:0::2;29230:346:1::0;56007:58:0::2;56128:19;56173:11;-1:-1:-1::0;;;;;56150:45:0::2;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56128:69;;56203:20;56241:12;-1:-1:-1::0;;;;;56226:37:0::2;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56203:62:::0;-1:-1:-1;56309:96:0::2;56347:10;56367:4;56386:18;56203:62:::0;56386:2:::2;:18;:::i;:::-;56374:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;-1:-1:-1::0;;;;;56309:37:0;::::2;::::0;:96;;:37:::2;:96::i;:::-;56452:475;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;56452:475:0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;56441:5:::2;::::0;56452:475;;56571:18:::2;56575:14:::0;56571:2:::2;:18;:::i;:::-;56559:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;56452:475:::0;;56918:1:::2;56452:475;::::0;;::::2;::::0;;;;56618:9;::::2;::::0;56452:475;;;;;;;;56651:9;::::2;::::0;56452:475;;;;;;56736:18:::2;56740:14:::0;56736:2:::2;:18;:::i;:::-;56724:9:::0;;::::2;::::0;:30:::2;::::0;;::::2;:::i;:::-;56452:475;;;;56785:1;56452:475;;;;56807:15;56452:475;;;;56842:13;56856:1;56842:16;;;;;;;:::i;:::-;;;;;56452:475;;;;;;56881:13;56895:1;56881:16;;;;;;;:::i;:::-;;;;;56452:475;;;;::::0;56441:487:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56441:487:0::2;;;;;-1:-1:-1::0;;;;;56441:487:0::2;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56441:487:0::2;;;;;-1:-1:-1::0;;;;;56441:487:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56965:16;56984:13;;56965:32;;57004:16;:30;57021:12;-1:-1:-1::0;;;;;57004:30:0::2;-1:-1:-1::0;;;;;57004:30:0::2;;;;;;;;;;;;57040:8;57004:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57056:15;:37;57080:11;-1:-1:-1::0;;;;;57056:37:0::2;-1:-1:-1::0;;;;;57056:37:0::2;;;;;;;;;;;;57099:8;57056:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57148:10;57115:20;:30;57136:8;57115:30;;;;;;;;;;;;:43;;;;;-1:-1:-1::0;;;;;57115:43:0::2;;;;;-1:-1:-1::0;;;;;57115:43:0::2;;;;;;57173:13;;57171:15;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;57198:71:0;;::::2;::::0;;::::2;57213:8:::0;57198:71:::2;57259:6:::0;57266:1:::2;57259:9;;;;57198:71;;;;1247:25:1::0;;1235:2;1220:18;;1101:177;57198:71:0::2;;;;;;;;57289:8:::0;54824:2477;-1:-1:-1;;;;;;;;;54824:2477:0:o;68310:141::-;68381:14;68411:36;68433:4;68439:7;68411:21;:36::i;25908:204::-;25993:4;-1:-1:-1;;;;;;26017:47:0;;-1:-1:-1;;;26017:47:0;;:87;;-1:-1:-1;;;;;;;;;;23481:40:0;;;26068:36;23381:148;26557:105;26624:30;26635:4;22507:10;26624;:30::i;:::-;26557:105;:::o;9052:162::-;9162:43;;-1:-1:-1;;;;;29913:32:1;;;9162:43:0;;;29895:51:1;29962:18;;;29955:34;;;9135:71:0;;9155:5;;9177:14;;;;;29868:18:1;;9162:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9162:43:0;;;;;;;;;;;9135:19;:71::i;70658:139::-;70717:13;70768:17;70781:3;70768:12;:17::i;46177:263::-;46263:4;46280:12;46295:31;46312:4;46318:7;46295:16;:31::i;:::-;46280:46;;46341:7;46337:71;;;46365:18;;;;:12;:18;;;;;:31;;46388:7;46365:22;:31::i;46548:268::-;46635:4;46652:12;46667:32;46685:4;46691:7;46667:17;:32::i;:::-;46652:47;;46714:7;46710:74;;;46738:18;;;;:12;:18;;;;;:34;;46764:7;46738:25;:34::i;49103:293::-;48505:1;49237:7;;:19;49229:63;;;;-1:-1:-1;;;49229:63:0;;30202:2:1;49229:63:0;;;30184:21:1;30241:2;30221:18;;;30214:30;30280:33;30260:18;;;30253:61;30331:18;;49229:63:0;30000:355:1;49229:63:0;48505:1;49370:18;;49103:293::o;73076:340::-;73148:7;73266:1;73255:8;:12;;;73251:96;;;73296:12;73307:1;73296:8;:12;:::i;:::-;73289:20;;:2;:20;:::i;73251:96::-;-1:-1:-1;73364:1:0;;73076:340;-1:-1:-1;73076:340:0:o;69271:783::-;69373:16;;;;:11;:16;;;;;:23;;;;69344:26;;;;;:52;;69373:23;69344:52;:::i;:::-;69326:15;:70;69322:719;;;69409:18;69430:5;69436:3;69430:10;;;;;;;;:::i;:::-;;;;;;;;;69465:16;;;:11;:16;;;;;;;:20;69430:10;;;;;;;;-1:-1:-1;69465:20:0;;69461:500;;;69526:16;;;;:11;:16;;;;;:21;;;69502:20;;;:45;;69526:21;;69502:20;;:45;;69526:21;;69502:45;:::i;:::-;;;;-1:-1:-1;;69604:16:0;;;;:11;:16;;;;;:23;;;69580:20;;;;:47;69576:134;;69671:16;;;;:11;:16;;;;;:23;;;69648:20;;;:46;69576:134;69461:500;;;69766:16;;;;:11;:16;;;;;:21;;;69742:20;;;:45;;69766:21;;69742:20;;:45;;69766:21;;69742:45;:::i;:::-;;;;-1:-1:-1;;69844:16:0;;;;:11;:16;;;;;:23;;;69820:20;;;;:47;69816:134;;69911:16;;;;:11;:16;;;;;:23;;;69888:20;;;:46;69816:134;-1:-1:-1;69981:16:0;;;;:11;:16;;;;;70017:15;69981:52;;:26;;;;:52;69271:783::o;68762:495::-;68811:18;68832:5;68838:3;68832:10;;;;;;;;:::i;:::-;;;;;;;;;;;68811:31;;68855:19;68877:4;:14;;;68855:36;;68902:11;68917:1;68902:16;68898:29;;68920:7;;68762:495;:::o;68898:29::-;68935:26;68982:4;:14;;;68964:15;:32;;;;:::i;:::-;68935:61;;69007:18;69029:1;69007:23;69003:36;;69032:7;;;68762:495;:::o;69003:36::-;69107:16;;;;69053:13;;69107:22;;-1:-1:-1;;;69107:16:0;;;;69126:3;69107:22;:::i;:::-;69069:61;;69070:32;69084:18;69070:11;:32;:::i;:::-;69069:61;;;;:::i;:::-;69053:77;;69169:11;69161:5;:19;:45;;69187:19;69201:5;69187:11;:19;:::i;:::-;69161:45;;;69183:1;69161:45;69144:14;;;:62;-1:-1:-1;;;69213:40:0;69237:15;69213:40;:14;;;;:40;-1:-1:-1;68762:495:0:o;70062:574::-;70120:13;70142:17;70162:5;70168:3;70162:10;;;;;;;;:::i;:::-;;;;;;;;;70142:30;;;;;;;;70162:10;;;;;;;70142:30;;-1:-1:-1;;;;;70142:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70142:30:0;;;;;;;;70207:51;;-1:-1:-1;;;70207:51:0;;;;70142:30;;-1:-1:-1;70142:30:0;70207:49;;:51;;;;70162:10;;70207:51;;;;;;70142:30;70207:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70185:73;;70265:17;70285:28;70309:3;70285:23;:28::i;:::-;70265:48;-1:-1:-1;70378:21:0;70415:18;70420:13;70415:2;:18;:::i;:::-;70409:25;;:2;:25;:::i;:::-;70402:33;;:2;:33;:::i;:::-;70378:57;-1:-1:-1;70550:4:0;70522:25;70378:57;70522:9;:25;:::i;:::-;:32;;;;:::i;:::-;70514:40;;70583:1;70575:5;:9;70567:46;;;;-1:-1:-1;;;70567:46:0;;30964:2:1;70567:46:0;;;30946:21:1;31003:2;30983:18;;;30976:30;-1:-1:-1;;;31022:18:1;;;31015:54;31086:18;;70567:46:0;30762:348:1;70567:46:0;70620:12;;;;70062:574;;;:::o;9459:190::-;9587:53;;-1:-1:-1;;;;;31335:32:1;;;9587:53:0;;;31317:51:1;31404:32;;;31384:18;;;31377:60;31453:18;;;31446:34;;;9560:81:0;;9580:5;;9602:18;;;;;31290::1;;9587:53:0;31115:371:1;40246:158:0;40320:7;40371:22;40375:3;40387:5;40371:3;:22::i;40954:282::-;41017:16;41046:22;41071:19;41079:3;41071:7;:19::i;39775:117::-;39838:7;39865:19;39873:3;35103:18;;35020:109;26798:201;26887:22;26895:4;26901:7;26887;:22::i;:::-;26882:110;;26933:47;;-1:-1:-1;;;26933:47:0;;-1:-1:-1;;;;;29913:32:1;;26933:47:0;;;29895:51:1;29962:18;;;29955:34;;;29868:18;;26933:47:0;29721:274:1;15645:738:0;15726:18;15755:19;15895:4;15892:1;15885:4;15879:11;15872:4;15866;15862:15;15859:1;15852:5;15845;15840:60;15954:7;15944:180;;15999:4;15993:11;16045:16;16042:1;16037:3;16022:40;16092:16;16087:3;16080:29;15944:180;-1:-1:-1;;16203:1:0;16197:8;16152:16;;-1:-1:-1;16232:15:0;;:68;;16284:11;16299:1;16284:16;;16232:68;;;-1:-1:-1;;;;;16250:26:0;;;:31;16232:68;16228:148;;;16357:5;16324:40;;-1:-1:-1;;;16324:40:0;;;;;;;;:::i;29634:324::-;29711:4;29733:22;29741:4;29747:7;29733;:22::i;:::-;29728:223;;29772:6;:12;;;;;;;;;;;-1:-1:-1;;;;;29772:29:0;;;;;;;;;:36;;-1:-1:-1;;29772:36:0;29804:4;29772:36;;;29855:12;22507:10;;22427:98;29855:12;-1:-1:-1;;;;;29828:40:0;29846:7;-1:-1:-1;;;;;29828:40:0;29840:4;29828:40;;;;;;;;;;-1:-1:-1;29890:4:0;29883:11;;29728:223;-1:-1:-1;29934:5:0;29927:12;;38950:152;39020:4;39044:50;39049:3;-1:-1:-1;;;;;39069:23:0;;39044:4;:50::i;30202:325::-;30280:4;30301:22;30309:4;30315:7;30301;:22::i;:::-;30297:223;;;30372:5;30340:12;;;;;;;;;;;-1:-1:-1;;;;;30340:29:0;;;;;;;;;;:37;;-1:-1:-1;;30340:37:0;;;30397:40;22507:10;;30340:12;;30397:40;;30372:5;30397:40;-1:-1:-1;30459:4:0;30452:11;;39278:158;39351:4;39375:53;39383:3;-1:-1:-1;;;;;39403:23:0;;39375:7;:53::i;71748:1260::-;71817:7;71833:17;71853:5;71859:3;71853:10;;;;;;;;:::i;:::-;;;;;;;;;71833:30;;;;;;;;71853:10;;;;;;;71833:30;;-1:-1:-1;;;;;71833:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71833:30:0;;;;;;;;71897:16;;;;;;;;;;71870:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71983:20;71833:30;;-1:-1:-1;72084:20:0;;:38;;-1:-1:-1;72108:14:0;;72084:38;72080:79;;;72142:9;71748:1260;-1:-1:-1;;;;71748:1260:0:o;72080:79::-;72238:19;72278:10;:20;;;72260:15;:38;;;;:::i;:::-;72238:60;;72305:23;72345:10;:17;;;72331:11;:31;;;;:::i;:::-;72305:57;-1:-1:-1;72379:19:0;;72375:605;;72411:23;72455:15;72437:10;:15;;;:33;;;;:::i;:::-;72495:14;;72411:59;;-1:-1:-1;72491:482:0;;;72560:17;;;;72530:27;72542:15;72530:9;:27;:::i;:::-;:47;72526:186;;;72610:10;:17;;;72598:29;;72491:482;;72526:186;72668:28;72681:15;72668:28;;:::i;:::-;;;72491:482;;;72767:9;72748:15;:28;;:79;;;-1:-1:-1;72810:17:0;;;;72780:27;72792:15;72780:9;:27;:::i;:::-;:47;72748:79;72744:218;;;72860:10;:17;;;72848:29;;72744:218;;;72918:28;72931:15;72918:28;;:::i;:::-;;;72744:218;72400:580;72375:605;-1:-1:-1;72995:9:0;;71748:1260;-1:-1:-1;;;;;71748:1260:0:o;35483:120::-;35550:7;35577:3;:11;;35589:5;35577:18;;;;;;;;:::i;:::-;;;;;;;;;35570:25;;35483:120;;;;:::o;36153:111::-;36209:16;36245:3;:11;;36238:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36153:111;;;:::o;32725:416::-;32788:4;34900:21;;;:14;;;:21;;;;;;32805:329;;-1:-1:-1;32848:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;33033:18;;33009:21;;;:14;;;:21;;;;;;:42;;;;33066:11;;33317:1400;33383:4;33514:21;;;:14;;;:21;;;;;;33552:13;;33548:1162;;33925:18;33946:12;33957:1;33946:8;:12;:::i;:::-;33993:18;;33925:33;;-1:-1:-1;33973:17:0;;33993:22;;34014:1;;33993:22;:::i;:::-;33973:42;;34050:9;34036:10;:23;34032:385;;34080:17;34100:3;:11;;34112:9;34100:22;;;;;;;;:::i;:::-;;;;;;;;;34080:42;;34250:9;34224:3;:11;;34236:10;34224:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;34365:25;;;:14;;;:25;;;;;:36;;;34032:385;34498:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34604:3;:14;;:21;34619:5;34604:21;;;;;;;;;;;34597:28;;;34649:4;34642:11;;;;;;;33548:1162;34693:5;34686:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;593:131;-1:-1:-1;;;;;668:31:1;;658:42;;648:70;;714:1;711;704:12;729:367;797:6;805;858:2;846:9;837:7;833:23;829:32;826:52;;;874:1;871;864:12;826:52;913:9;900:23;932:31;957:5;932:31;:::i;:::-;982:5;1060:2;1045:18;;;;1032:32;;-1:-1:-1;;;729:367:1:o;1283:610::-;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1486:9;1473:23;-1:-1:-1;;;;;1511:6:1;1508:30;1505:50;;;1551:1;1548;1541:12;1505:50;1574:22;;1627:4;1619:13;;1615:27;-1:-1:-1;1605:55:1;;1656:1;1653;1646:12;1605:55;1696:2;1683:16;-1:-1:-1;;;;;1714:6:1;1711:30;1708:50;;;1754:1;1751;1744:12;1708:50;1807:7;1802:2;1792:6;1789:1;1785:14;1781:2;1777:23;1773:32;1770:45;1767:65;;;1828:1;1825;1818:12;1767:65;1859:2;1851:11;;;;;1881:6;;-1:-1:-1;1283:610:1;-1:-1:-1;;;1283:610:1:o;2007:787::-;2094:12;;-1:-1:-1;;;;;1964:31:1;1952:44;;2158:4;2151:5;2147:16;2141:23;2173:48;2215:4;2210:3;2206:14;2192:12;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2173:48;;2270:4;2263:5;2259:16;2253:23;2246:4;2241:3;2237:14;2230:47;2326:4;2319:5;2315:16;2309:23;2302:4;2297:3;2293:14;2286:47;2382:4;2375:5;2371:16;2365:23;2358:4;2353:3;2349:14;2342:47;2438:4;2431:5;2427:16;2421:23;2414:4;2409:3;2405:14;2398:47;2493:4;2486:5;2482:16;2476:23;2508:50;2552:4;2547:3;2543:14;2527;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2508:50;;2606:4;2599:5;2595:16;2589:23;2621:47;2662:4;2657:3;2653:14;2637;375:13;368:21;356:34;;305:91;2621:47;-1:-1:-1;2719:6:1;2708:18;;;2702:25;2684:16;;;2677:51;2779:6;2768:18;;;2762:25;2744:16;;2737:51;2007:787::o;2799:705::-;3053:2;3065:21;;;3135:13;;3038:18;;;3157:22;;;3005:4;;3236:15;;;3210:2;3195:18;;;3005:4;3279:199;3293:6;3290:1;3287:13;3279:199;;;3342:52;3390:3;3381:6;3375:13;3342:52;:::i;:::-;3465:2;3453:15;;;;;3423:6;3414:16;;;;;3315:1;3308:9;3279:199;;3509:226;3568:6;3621:2;3609:9;3600:7;3596:23;3592:32;3589:52;;;3637:1;3634;3627:12;3589:52;-1:-1:-1;3682:23:1;;3509:226;-1:-1:-1;3509:226:1:o;3740:268::-;3938:3;3923:19;;3951:51;3927:9;3984:6;3951:51;:::i;4013:247::-;4072:6;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;4265:611::-;4455:2;4467:21;;;4537:13;;4440:18;;;4559:22;;;4407:4;;4638:15;;;4612:2;4597:18;;;4407:4;4681:169;4695:6;4692:1;4689:13;4681:169;;;4756:13;;4744:26;;4799:2;4825:15;;;;4790:12;;;;4717:1;4710:9;4681:169;;5294:367;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5484:23;;;-1:-1:-1;5583:2:1;5568:18;;5555:32;5596:33;5555:32;5596:33;:::i;:::-;5648:7;5638:17;;;5294:367;;;;;:::o;6634:487::-;6711:6;6719;6727;6780:2;6768:9;6759:7;6755:23;6751:32;6748:52;;;6796:1;6793;6786:12;6748:52;6841:23;;;-1:-1:-1;6961:2:1;6946:18;;6933:32;;-1:-1:-1;7043:2:1;7028:18;;7015:32;7056:33;7015:32;7056:33;:::i;:::-;7108:7;7098:17;;;6634:487;;;;;:::o;7126:346::-;7194:6;7202;7255:2;7243:9;7234:7;7230:23;7226:32;7223:52;;;7271:1;7268;7261:12;7223:52;-1:-1:-1;;7316:23:1;;;7436:2;7421:18;;;7408:32;;-1:-1:-1;7126:346:1:o;7477:203::-;-1:-1:-1;;;;;7641:32:1;;;;7623:51;;7611:2;7596:18;;7477:203::o;7685:388::-;7753:6;7761;7814:2;7802:9;7793:7;7789:23;7785:32;7782:52;;;7830:1;7827;7820:12;7782:52;7869:9;7856:23;7888:31;7913:5;7888:31;:::i;:::-;7938:5;-1:-1:-1;7995:2:1;7980:18;;7967:32;8008:33;7967:32;8008:33;:::i;8078:757::-;8170:6;8178;8186;8194;8202;8255:3;8243:9;8234:7;8230:23;8226:33;8223:53;;;8272:1;8269;8262:12;8223:53;8317:23;;;-1:-1:-1;8416:2:1;8401:18;;8388:32;8458:15;;8451:23;8439:36;;8429:64;;8489:1;8486;8479:12;8429:64;8078:757;;8512:7;;-1:-1:-1;;;;8592:2:1;8577:18;;8564:32;;8695:2;8680:18;;8667:32;;8798:3;8783:19;;;8770:33;;-1:-1:-1;8078:757:1:o;8840:637::-;9030:2;9042:21;;;9112:13;;9015:18;;;9134:22;;;8982:4;;9213:15;;;9187:2;9172:18;;;8982:4;9256:195;9270:6;9267:1;9264:13;9256:195;;;9335:13;;-1:-1:-1;;;;;9331:39:1;9319:52;;9400:2;9426:15;;;;9391:12;;;;9367:1;9285:9;9256:195;;10944:163;11011:20;;11071:10;11060:22;;11050:33;;11040:61;;11097:1;11094;11087:12;11040:61;10944:163;;;:::o;11112:184::-;11170:6;11223:2;11211:9;11202:7;11198:23;11194:32;11191:52;;;11239:1;11236;11229:12;11191:52;11262:28;11280:9;11262:28;:::i;11301:127::-;11362:10;11357:3;11353:20;11350:1;11343:31;11393:4;11390:1;11383:15;11417:4;11414:1;11407:15;11433:372;11504:2;11498:9;11569:2;11550:13;;-1:-1:-1;;11546:27:1;11534:40;;-1:-1:-1;;;;;11589:34:1;;11625:22;;;11586:62;11583:185;;;11690:10;11685:3;11681:20;11678:1;11671:31;11725:4;11722:1;11715:15;11753:4;11750:1;11743:15;11583:185;11784:2;11777:22;11433:372;;-1:-1:-1;11433:372:1:o;11810:566::-;11859:5;11912:3;11905:4;11897:6;11893:17;11889:27;11879:55;;11930:1;11927;11920:12;11879:55;12031:19;12009:2;12031:19;:::i;:::-;12074:3;12112:2;12104:6;12100:15;12138:3;12130:6;12127:15;12124:35;;;12155:1;12152;12145:12;12124:35;12179:6;12194:151;12210:6;12205:3;12202:15;12194:151;;;12278:22;12296:3;12278:22;:::i;:::-;12266:35;;12330:4;12321:14;;;;12227;12194:151;;12381:1115;12525:6;12533;12541;12549;12602:3;12590:9;12581:7;12577:23;12573:33;12570:53;;;12619:1;12616;12609:12;12570:53;12658:9;12645:23;12677:31;12702:5;12677:31;:::i;:::-;12727:5;-1:-1:-1;12784:2:1;12769:18;;12756:32;12797:33;12756:32;12797:33;:::i;:::-;12849:7;-1:-1:-1;12894:2:1;12879:18;;12875:32;-1:-1:-1;12865:60:1;;12921:1;12918;12911:12;12865:60;13023:20;13000:3;13023:20;:::i;:::-;13065:3;13106;13095:9;13091:19;13133:7;13125:6;13122:19;13119:39;;;13154:1;13151;13144:12;13119:39;13193:2;13182:9;13178:18;13205:202;13221:6;13216:3;13213:15;13205:202;;;13315:17;;13345:20;;13394:2;13385:12;;;;13238;13205:202;;;13209:3;13426:5;13416:15;;13450:40;13482:7;13474:6;13450:40;:::i;:::-;13440:50;;;;;12381:1115;;;;;;;:::o;13501:127::-;13562:10;13557:3;13553:20;13550:1;13543:31;13593:4;13590:1;13583:15;13617:4;13614:1;13607:15;13633:342;13835:2;13817:21;;;13874:2;13854:18;;;13847:30;-1:-1:-1;;;13908:2:1;13893:18;;13886:48;13966:2;13951:18;;13633:342::o;14322:127::-;14383:10;14378:3;14374:20;14371:1;14364:31;14414:4;14411:1;14404:15;14438:4;14435:1;14428:15;14454:128;14521:9;;;14542:11;;;14539:37;;;14556:18;;:::i;15291:273::-;15359:6;15412:2;15400:9;15391:7;15387:23;15383:32;15380:52;;;15428:1;15425;15418:12;15380:52;15460:9;15454:16;15510:4;15503:5;15499:16;15492:5;15489:27;15479:55;;15530:1;15527;15520:12;16981:136;17020:3;17048:5;17038:39;;17057:18;;:::i;:::-;-1:-1:-1;;;17093:18:1;;16981:136::o;17122:125::-;17187:9;;;17208:10;;;17205:36;;;17221:18;;:::i;17252:127::-;17313:10;17308:3;17304:20;17301:1;17294:31;17344:4;17341:1;17334:15;17368:4;17365:1;17358:15;19140:151;19230:4;19223:12;;;19209;;;19205:31;;19248:14;;19245:40;;;19265:18;;:::i;19296:375::-;19384:1;19402:5;19416:249;19437:1;19427:8;19424:15;19416:249;;;19487:4;19482:3;19478:14;19472:4;19469:24;19466:50;;;19496:18;;:::i;:::-;19546:1;19536:8;19532:16;19529:49;;;19560:16;;;;19529:49;19643:1;19639:16;;;;;19599:15;;19416:249;;;19296:375;;;;;;:::o;19676:902::-;19725:5;19755:8;19745:80;;-1:-1:-1;19796:1:1;19810:5;;19745:80;19844:4;19834:76;;-1:-1:-1;19881:1:1;19895:5;;19834:76;19926:4;19944:1;19939:59;;;;20012:1;20007:174;;;;19919:262;;19939:59;19969:1;19960:10;;19983:5;;;20007:174;20044:3;20034:8;20031:17;20028:43;;;20051:18;;:::i;:::-;-1:-1:-1;;20107:1:1;20093:16;;20166:5;;19919:262;;20265:2;20255:8;20252:16;20246:3;20240:4;20237:13;20233:36;20227:2;20217:8;20214:16;20209:2;20203:4;20200:12;20196:35;20193:77;20190:203;;;-1:-1:-1;20302:19:1;;;20378:5;;20190:203;20425:42;-1:-1:-1;;20450:8:1;20444:4;20425:42;:::i;:::-;20503:6;20499:1;20495:6;20491:19;20482:7;20479:32;20476:58;;;20514:18;;:::i;:::-;20552:20;;19676:902;-1:-1:-1;;;19676:902:1:o;20583:140::-;20641:5;20670:47;20711:4;20701:8;20697:19;20691:4;20670:47;:::i;20728:168::-;20801:9;;;20832;;20849:15;;;20843:22;;20829:37;20819:71;;20870:18;;:::i;20901:217::-;20941:1;20967;20957:132;;21011:10;21006:3;21002:20;20999:1;20992:31;21046:4;21043:1;21036:15;21074:4;21071:1;21064:15;20957:132;-1:-1:-1;21103:9:1;;20901:217::o;21837:184::-;21907:6;21960:2;21948:9;21939:7;21935:23;21931:32;21928:52;;;21976:1;21973;21966:12;21928:52;-1:-1:-1;21999:16:1;;21837:184;-1:-1:-1;21837:184:1:o;23409:347::-;23611:2;23593:21;;;23650:2;23630:18;;;23623:30;-1:-1:-1;;;23684:2:1;23669:18;;23662:53;23747:2;23732:18;;23409:347::o;25673:345::-;25875:2;25857:21;;;25914:2;25894:18;;;25887:30;-1:-1:-1;;;25948:2:1;25933:18;;25926:51;26009:2;25994:18;;25673:345::o;29581:135::-;29620:3;29641:17;;;29638:43;;29661:18;;:::i;:::-;-1:-1:-1;29708:1:1;29697:13;;29581:135::o;30360:244::-;30471:10;30444:18;;;30464;;;30440:43;30503:28;;;;30550:24;;;30540:58;;30578:18;;:::i;30609:148::-;30697:4;30676:12;;;30690;;;30672:31;;30715:13;;30712:39;;;30731:18;;:::i
Swarm Source
ipfs://191c1c3442cc54e9841893e64eb334686614801ff2116aab80f6d62189fcb287
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.