Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 19 from a total of 19 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Allocate Seignio... | 13131621 | 22 hrs ago | IN | 0 S | 0.03251855 | ||||
Allocate Seignio... | 13130909 | 22 hrs ago | IN | 0 S | 0.03439808 | ||||
Allocate Seignio... | 13048341 | 31 hrs ago | IN | 0 S | 0.03439808 | ||||
Allocate Seignio... | 12993042 | 37 hrs ago | IN | 0 S | 0.04245522 | ||||
Allocate Seignio... | 12947063 | 43 hrs ago | IN | 0 S | 0.00168721 | ||||
Allocate Seignio... | 12947033 | 43 hrs ago | IN | 0 S | 0.03120011 | ||||
Allocate Seignio... | 12946982 | 43 hrs ago | IN | 0 S | 0.03120011 | ||||
Allocate Seignio... | 12946750 | 43 hrs ago | IN | 0 S | 0.0318109 | ||||
Allocate Seignio... | 12946701 | 43 hrs ago | IN | 0 S | 0.03467956 | ||||
Allocate Seignio... | 12946616 | 43 hrs ago | IN | 0 S | 0.03218292 | ||||
Allocate Seignio... | 12946602 | 43 hrs ago | IN | 0 S | 0.03218292 | ||||
Allocate Seignio... | 12946594 | 43 hrs ago | IN | 0 S | 0.03218292 | ||||
Allocate Seignio... | 12946565 | 43 hrs ago | IN | 0 S | 0.03070663 | ||||
Allocate Seignio... | 12846925 | 2 days ago | IN | 0 S | 0.03626491 | ||||
Allocate Seignio... | 12765179 | 2 days ago | IN | 0 S | 0.00710916 | ||||
Set Bill Oracle | 12644112 | 3 days ago | IN | 0 S | 0.00167653 | ||||
Allocate Seignio... | 12642473 | 3 days ago | IN | 0 S | 0.00295475 | ||||
Set Extra Funds | 12512126 | 4 days ago | IN | 0 S | 0.00914948 | ||||
Initialize | 12510178 | 4 days ago | IN | 0 S | 0.04333654 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Treasury
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-03-08 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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; } } /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @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; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @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.encodeWithSelector(token.transfer.selector, 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.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @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. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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 silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } interface IBasisAsset { function mint(address recipient, uint256 amount) external returns (bool); function burn(uint256 amount) external; function burnFrom(address from, uint256 amount) external; function isOperator() external returns (bool); function operator() external view returns (address); function transferOperator(address newOperator_) external; } interface IMasonry { function balanceOf(address _andras) external view returns (uint256); function earned(address _andras) external view returns (uint256); function canWithdraw(address _andras) external view returns (bool); function canClaimReward(address _andras) external view returns (bool); function epoch() external view returns (uint256); function nextEpochPoint() external view returns (uint256); function getTombPrice() external view returns (uint256); function setOperator(address _operator) external; function setLockUp(uint256 _withdrawLockupEpochs, uint256 _rewardLockupEpochs) external; function stake(uint256 _amount) external; function withdraw(uint256 _amount) external; function exit() external; function claimReward() external; function allocateSeigniorage(uint256 _amount) external; function governanceRecoverUnsupported(address _token, uint256 _amount, address _to) external; } interface IOracle { function update() external; function consult(address _token, uint256 _amountIn) external view returns (uint256 amountOut); function twap(address _token, uint256 _amountIn) external view returns (uint256 _amountOut); } library Babylonian { function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } // else z = 0 } } contract Operator is Context, Ownable { address private _operator; event OperatorTransferred(address indexed previousOperator, address indexed newOperator); constructor() { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); } function operator() public view returns (address) { return _operator; } modifier onlyOperator() { require(_operator == msg.sender, "operator: caller is not the operator"); _; } function isOperator() public view returns (bool) { return _msgSender() == _operator; } function transferOperator(address newOperator_) public onlyOwner { _transferOperator(newOperator_); } function _transferOperator(address newOperator_) internal { require(newOperator_ != address(0), "operator: zero address given for new operator"); emit OperatorTransferred(address(0), newOperator_); _operator = newOperator_; } function _renounceOperator() public onlyOwner { emit OperatorTransferred(_operator, address(0)); _operator = address(0); } } contract ContractGuard { mapping(uint256 => mapping(address => bool)) private _status; function checkSameOriginReentranted() internal view returns (bool) { return _status[block.number][tx.origin]; } function checkSameSenderReentranted() internal view returns (bool) { return _status[block.number][msg.sender]; } modifier onlyOneBlock() { require(!checkSameOriginReentranted(), "ContractGuard: one block, one function"); require(!checkSameSenderReentranted(), "ContractGuard: one block, one function"); _; _status[block.number][tx.origin] = true; _status[block.number][msg.sender] = true; } } contract Treasury is ContractGuard, Operator { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; /* ========= CONSTANT VARIABLES ======== */ uint256 public constant PERIOD = 6 hours; uint256 public constant BASIS_DIVISOR = 100000; // 100% /* ========== STATE VARIABLES ========== */ // flags bool public initialized = false; // epoch uint256 public startTime; uint256 public epoch = 0; uint256 public epochSupplyContractionLeft = 0; //=================================================================// exclusions from total supply address[] public excludedFromTotalSupply = [ address(0x29D0762f7bE8409d0aC34A3595AF62E8c0120950) // BillGenesisRewardPool ]; // core components address public bill; address public bond; address public share; address public masonry; address public billOracle; // price uint256 public billPriceOne; uint256 public billPriceCeiling; uint256 public seigniorageSaved; uint256[] public supplyTiers; uint256[] public maxExpansionTiers; uint256 public maxSupplyExpansionPercent; uint256 public bondDepletionFloorPercent; uint256 public seigniorageExpansionFloorPercent; uint256 public maxSupplyContractionPercent; uint256 public maxDebtRatioPercent; // 14 first epochs (0.5 week) with 4.5% expansion regardless of BILL price uint256 public bootstrapEpochs; uint256 public bootstrapSupplyExpansionPercent; /* =================== Added variables =================== */ uint256 public previousEpochBillPrice; uint256 public maxDiscountRate; // when purchasing bond uint256 public maxPremiumRate; // when redeeming bond uint256 public discountPercent; uint256 public premiumThreshold; uint256 public premiumPercent; uint256 public mintingFactorForPayingDebt; // print extra BILL during debt phase address public daoFund; uint256 public daoFundSharedPercent; //=================================================// address public devFund; uint256 public devFundSharedPercent; address public teamFund; uint256 public teamFundSharedPercent; /* =================== Events =================== */ event Initialized(address indexed executor, uint256 at); event BurnedBonds(address indexed from, uint256 bondAmount); event RedeemedBonds(address indexed from, uint256 billAmount, uint256 bondAmount); event BoughtBonds(address indexed from, uint256 billAmount, uint256 bondAmount); event TreasuryFunded(uint256 timestamp, uint256 seigniorage); event MasonryFunded(uint256 timestamp, uint256 seigniorage); event DaoFundFunded(uint256 timestamp, uint256 seigniorage); event DevFundFunded(uint256 timestamp, uint256 seigniorage); event TeamFundFunded(uint256 timestamp, uint256 seigniorage); /* =================== Modifier =================== */ modifier checkCondition { require(block.timestamp >= startTime, "Treasury: not started yet"); _; } modifier checkEpoch { require(block.timestamp >= nextEpochPoint(), "Treasury: not opened yet"); _; epoch = epoch.add(1); epochSupplyContractionLeft = (getBillPrice() > billPriceCeiling) ? 0 : getBillCirculatingSupply().mul(maxSupplyContractionPercent).div(BASIS_DIVISOR); } modifier checkOperator { require( IBasisAsset(bill).operator() == address(this) && IBasisAsset(bond).operator() == address(this) && IBasisAsset(share).operator() == address(this) && Operator(masonry).operator() == address(this), "Treasury: need more permission" ); _; } modifier notInitialized { require(!initialized, "Treasury: already initialized"); _; } /* ========== VIEW FUNCTIONS ========== */ function isInitialized() public view returns (bool) { return initialized; } // epoch function nextEpochPoint() public view returns (uint256) { return startTime.add(epoch.mul(PERIOD)); } // oracle function getBillPrice() public view returns (uint256 billPrice) { try IOracle(billOracle).consult(bill, 1e18) returns (uint256 price) { return uint256(price); } catch { revert("Treasury: failed to consult BILL price from the oracle"); } } function getBillUpdatedPrice() public view returns (uint256 _billPrice) { try IOracle(billOracle).twap(bill, 1e18) returns (uint256 price) { return uint256(price); } catch { revert("Treasury: failed to consult BILL price from the oracle"); } } // budget function getReserve() public view returns (uint256) { return seigniorageSaved; } function getBurnableBillLeft() public view returns (uint256 _burnableBillLeft) { uint256 _billPrice = getBillPrice(); if (_billPrice <= billPriceOne) { uint256 _billSupply = getBillCirculatingSupply(); uint256 _bondMaxSupply = _billSupply.mul(maxDebtRatioPercent).div(BASIS_DIVISOR); uint256 _bondSupply = IERC20(bond).totalSupply(); if (_bondMaxSupply > _bondSupply) { uint256 _maxMintableBond = _bondMaxSupply.sub(_bondSupply); uint256 _maxBurnableBill = _maxMintableBond.mul(_billPrice).div(1e18); _burnableBillLeft = Math.min(epochSupplyContractionLeft, _maxBurnableBill); } } } function getRedeemableBonds() public view returns (uint256 _redeemableBonds) { uint256 _billPrice = getBillPrice(); if (_billPrice > billPriceCeiling) { uint256 _totalBill = IERC20(bill).balanceOf(address(this)); uint256 _rate = getBondPremiumRate(); if (_rate > 0) { _redeemableBonds = _totalBill.mul(1e18).div(_rate); } } } function getBondDiscountRate() public view returns (uint256 _rate) { uint256 _billPrice = getBillPrice(); if (_billPrice <= billPriceOne) { if (discountPercent == 0) { // no discount _rate = billPriceOne; } else { uint256 _bondAmount = billPriceOne.mul(1e18).div(_billPrice); // to burn 1 BILL uint256 _discountAmount = _bondAmount.sub(billPriceOne).mul(discountPercent).div(BASIS_DIVISOR); _rate = billPriceOne.add(_discountAmount); if (maxDiscountRate > 0 && _rate > maxDiscountRate) { _rate = maxDiscountRate; } } } } function getBondPremiumRate() public view returns (uint256 _rate) { uint256 _billPrice = getBillPrice(); if (_billPrice > billPriceCeiling) { uint256 _billPricePremiumThreshold = billPriceOne.mul(premiumThreshold).div(100); if (_billPrice >= _billPricePremiumThreshold) { //Price > 1.10 uint256 _premiumAmount = _billPrice.sub(billPriceOne).mul(premiumPercent).div(BASIS_DIVISOR); _rate = billPriceOne.add(_premiumAmount); if (maxPremiumRate > 0 && _rate > maxPremiumRate) { _rate = maxPremiumRate; } } else { // no premium bonus _rate = billPriceOne; } } } /* ========== GOVERNANCE ========== */ function initialize( address _bill, address _bond, address _share, address _billOracle, address _masonry, uint256 _startTime ) public notInitialized onlyOperator { bill = _bill; bond = _bond; share = _share; billOracle = _billOracle; masonry = _masonry; startTime = _startTime; billPriceOne = 10 ** 18; // billPriceCeiling = 1000300000000000000; // 1.003 as its stable pool billPriceCeiling = billPriceOne.mul(101).div(100); // even if its stable we aim to get 1.01 // Dynamic max expansion percent supplyTiers = [0 ether, 600000 ether, 750000 ether, 1000000 ether, 1200000 ether, 1500000 ether, 2000000 ether]; maxExpansionTiers = [110, 90, 80, 70, 60, 50, 20]; // 0.11%, 0.09%, 0.08%, 0.07%, 0.06%, 0.05%, 0.02% maxSupplyExpansionPercent = 150; // 0.15% bondDepletionFloorPercent = 100000; // 100% of Bond supply for depletion floor seigniorageExpansionFloorPercent = 35000; // At least 35% of expansion reserved for masonry maxSupplyContractionPercent = 10000; // Upto 10.0% supply for contraction (to burn BILL and mint bond) maxDebtRatioPercent = 35000; // Upto 35% supply of bond to purchase premiumThreshold = 1100; premiumPercent = 70000; // First 12 epochs with 1.5% expansion bootstrapEpochs = 12; bootstrapSupplyExpansionPercent = 150; // 0.15% // set seigniorageSaved to it's balance seigniorageSaved = IERC20(bill).balanceOf(address(this)); initialized = true; emit Initialized(msg.sender, block.number); } function setOperator(address _operator) external onlyOperator { transferOperator(_operator); } function renounceOperator() external onlyOperator { _renounceOperator(); } function setMasonry(address _masonry) external onlyOperator { masonry = _masonry; } function setBillOracle(address _billOracle) external onlyOperator { billOracle = _billOracle; } function setBillPriceCeiling(uint256 _billPriceCeiling) external onlyOperator { require(_billPriceCeiling >= billPriceOne && _billPriceCeiling <= billPriceOne.mul(120).div(100), "out of range"); // [$1.0, $1.2] billPriceCeiling = _billPriceCeiling; } function setMaxSupplyExpansionPercents(uint256 _maxSupplyExpansionPercent) external onlyOperator { require(_maxSupplyExpansionPercent >= 10 && _maxSupplyExpansionPercent <= 10000, "_maxSupplyExpansionPercent: out of range"); // [0.01%, 10%] maxSupplyExpansionPercent = _maxSupplyExpansionPercent; } // =================== ALTER THE NUMBERS IN LOGIC!!!! =================== // function setSupplyTiersEntry(uint8 _index, uint256 _value) external onlyOperator returns (bool) { require(_index >= 0, "Index has to be higher than 0"); require(_index < 7, "Index has to be lower than count of tiers"); if (_index > 0) { require(_value > supplyTiers[_index - 1]); } if (_index < 6) { require(_value < supplyTiers[_index + 1]); } supplyTiers[_index] = _value; return true; } function setMaxExpansionTiersEntry(uint8 _index, uint256 _value) external onlyOperator returns (bool) { require(_index >= 0, "Index has to be higher than 0"); require(_index < 7, "Index has to be lower than count of tiers"); require(_value >= 10 && _value <= 10000, "_value: out of range"); // [0.01%, 10%] maxExpansionTiers[_index] = _value; return true; } function setBondDepletionFloorPercent(uint256 _bondDepletionFloorPercent) external onlyOperator { require(_bondDepletionFloorPercent >= 500 && _bondDepletionFloorPercent <= BASIS_DIVISOR, "out of range"); // [0.5%, 100%] bondDepletionFloorPercent = _bondDepletionFloorPercent; } function setMaxSupplyContractionPercent(uint256 _maxSupplyContractionPercent) external onlyOperator { require(_maxSupplyContractionPercent >= 100 && _maxSupplyContractionPercent <= 15000, "out of range"); // [0.1%, 15%] maxSupplyContractionPercent = _maxSupplyContractionPercent; } function setMaxDebtRatioPercent(uint256 _maxDebtRatioPercent) external onlyOperator { require(_maxDebtRatioPercent >= 1000 && _maxDebtRatioPercent <= BASIS_DIVISOR, "out of range"); // [1%, 100%] maxDebtRatioPercent = _maxDebtRatioPercent; } function setBootstrap(uint256 _bootstrapEpochs, uint256 _bootstrapSupplyExpansionPercent) external onlyOperator { require(_bootstrapEpochs <= 120, "_bootstrapEpochs: out of range"); // <= 1 month require(_bootstrapSupplyExpansionPercent >= 100 && _bootstrapSupplyExpansionPercent <= 10000, "_bootstrapSupplyExpansionPercent: out of range"); // [0.1%, 10%] bootstrapEpochs = _bootstrapEpochs; bootstrapSupplyExpansionPercent = _bootstrapSupplyExpansionPercent; } //====================================================================== function setExtraFunds( address _daoFund, uint256 _daoFundSharedPercent, address _devFund, uint256 _devFundSharedPercent, address _teamFund, uint256 _teamFundSharedPercent ) external onlyOperator { require(_daoFund != address(0), "zero"); require(_daoFundSharedPercent <= 15000, "out of range"); require(_devFund != address(0), "zero"); require(_devFundSharedPercent <= 3500, "out of range"); require(_teamFund != address(0), "zero"); require(_teamFundSharedPercent <= 5500, "out of range"); daoFund = _daoFund; daoFundSharedPercent = _daoFundSharedPercent; devFund = _devFund; devFundSharedPercent = _devFundSharedPercent; teamFund = _teamFund; teamFundSharedPercent = _teamFundSharedPercent; } function setMaxDiscountRate(uint256 _maxDiscountRate) external onlyOperator { require(_maxDiscountRate <= 200000, "_maxDiscountRate is over 200%"); maxDiscountRate = _maxDiscountRate; } function setMaxPremiumRate(uint256 _maxPremiumRate) external onlyOperator { require(_maxPremiumRate <= 200000, "_maxPremiumRate is over 200%"); maxPremiumRate = _maxPremiumRate; } function setDiscountPercent(uint256 _discountPercent) external onlyOperator { require(_discountPercent <= 200000, "_discountPercent is over 200%"); discountPercent = _discountPercent; } function setPremiumThreshold(uint256 _premiumThreshold) external onlyOperator { require(_premiumThreshold >= billPriceCeiling, "_premiumThreshold exceeds billPriceCeiling"); require(_premiumThreshold <= 1500, "_premiumThreshold is higher than 1.5"); premiumThreshold = _premiumThreshold; } function setPremiumPercent(uint256 _premiumPercent) external onlyOperator { require(_premiumPercent <= 200000, "_premiumPercent is over 200%"); premiumPercent = _premiumPercent; } function setMintingFactorForPayingDebt(uint256 _mintingFactorForPayingDebt) external onlyOperator { require(_mintingFactorForPayingDebt >= BASIS_DIVISOR && _mintingFactorForPayingDebt <= 200000, "_mintingFactorForPayingDebt: out of range"); // [100%, 200%] mintingFactorForPayingDebt = _mintingFactorForPayingDebt; } /* ========== MUTABLE FUNCTIONS ========== */ function _updateBillPrice() internal { try IOracle(billOracle).update() {} catch {} } function getBillCirculatingSupply() public view returns (uint256) { IERC20 billErc20 = IERC20(bill); uint256 totalSupply = billErc20.totalSupply(); uint256 balanceExcluded = 0; for (uint8 entryId = 0; entryId < excludedFromTotalSupply.length; ++entryId) { balanceExcluded = balanceExcluded.add(billErc20.balanceOf(excludedFromTotalSupply[entryId])); } return totalSupply.sub(balanceExcluded); } function buyBonds(uint256 _billAmount, uint256 targetPrice) external onlyOneBlock checkCondition checkOperator { require(_billAmount > 0, "Treasury: cannot purchase bonds with zero amount"); uint256 billPrice = getBillPrice(); require(billPrice == targetPrice, "Treasury: BILL price moved"); require( billPrice < billPriceOne, // price < $1 "Treasury: billPrice not eligible for bond purchase" ); require(_billAmount <= epochSupplyContractionLeft, "Treasury: not enough bond left to purchase"); uint256 _rate = getBondDiscountRate(); require(_rate > 0, "Treasury: invalid bond rate"); uint256 _bondAmount = _billAmount.mul(_rate).div(1e18); uint256 billSupply = getBillCirculatingSupply(); uint256 newBondSupply = IERC20(bond).totalSupply().add(_bondAmount); require(newBondSupply <= billSupply.mul(maxDebtRatioPercent).div(BASIS_DIVISOR), "over max debt ratio"); IBasisAsset(bill).burnFrom(msg.sender, _billAmount); IBasisAsset(bond).mint(msg.sender, _bondAmount); epochSupplyContractionLeft = epochSupplyContractionLeft.sub(_billAmount); _updateBillPrice(); emit BoughtBonds(msg.sender, _billAmount, _bondAmount); } function redeemBonds(uint256 _bondAmount, uint256 targetPrice) external onlyOneBlock checkCondition checkOperator { require(_bondAmount > 0, "Treasury: cannot redeem bonds with zero amount"); uint256 billPrice = getBillPrice(); require(billPrice == targetPrice, "Treasury: BILL price moved"); require( billPrice > billPriceCeiling, // price > $1.01 "Treasury: billPrice not eligible for bond purchase" ); uint256 _rate = getBondPremiumRate(); require(_rate > 0, "Treasury: invalid bond rate"); uint256 _billAmount = _bondAmount.mul(_rate).div(1e18); require(IERC20(bill).balanceOf(address(this)) >= _billAmount, "Treasury: treasury has no more budget"); seigniorageSaved = seigniorageSaved.sub(Math.min(seigniorageSaved, _billAmount)); IBasisAsset(bond).burnFrom(msg.sender, _bondAmount); IERC20(bill).safeTransfer(msg.sender, _billAmount); _updateBillPrice(); emit RedeemedBonds(msg.sender, _billAmount, _bondAmount); } function _sendToMasonry(uint256 _amount) internal { IBasisAsset(bill).mint(address(this), _amount); uint256 _daoFundSharedAmount = 0; if (daoFundSharedPercent > 0) { _daoFundSharedAmount = _amount.mul(daoFundSharedPercent).div(BASIS_DIVISOR); IERC20(bill).transfer(daoFund, _daoFundSharedAmount); emit DaoFundFunded(block.timestamp, _daoFundSharedAmount); } uint256 _devFundSharedAmount = 0; if (devFundSharedPercent > 0) { _devFundSharedAmount = _amount.mul(devFundSharedPercent).div(BASIS_DIVISOR); IERC20(bill).transfer(devFund, _devFundSharedAmount); emit DevFundFunded(block.timestamp, _devFundSharedAmount); } uint256 _teamFundSharedAmount = 0; if (teamFundSharedPercent > 0) { _teamFundSharedAmount = _amount.mul(teamFundSharedPercent).div(BASIS_DIVISOR); IERC20(bill).transfer(teamFund, _teamFundSharedAmount); emit TeamFundFunded(block.timestamp, _teamFundSharedAmount); } _amount = _amount.sub(_daoFundSharedAmount).sub(_devFundSharedAmount).sub(_teamFundSharedAmount); IERC20(bill).safeApprove(masonry, 0); IERC20(bill).safeApprove(masonry, _amount); IMasonry(masonry).allocateSeigniorage(_amount); emit MasonryFunded(block.timestamp, _amount); } function _calculateMaxSupplyExpansionPercent(uint256 _billSupply) internal returns (uint256) { for (uint8 tierId = 6; tierId >= 0; --tierId) { if (_billSupply >= supplyTiers[tierId]) { maxSupplyExpansionPercent = maxExpansionTiers[tierId]; break; } } return maxSupplyExpansionPercent; } function allocateSeigniorage() external onlyOneBlock checkCondition checkEpoch checkOperator { _updateBillPrice(); previousEpochBillPrice = getBillPrice(); uint256 billSupply = getBillCirculatingSupply().sub(seigniorageSaved); if (epoch < bootstrapEpochs) { // 14 first epochs with 6% expansion _sendToMasonry(billSupply.mul(bootstrapSupplyExpansionPercent).div(BASIS_DIVISOR)); } else { if (previousEpochBillPrice > billPriceCeiling) { // Expansion ($BILL Price > 1 $FTM): there is some seigniorage to be allocated uint256 bondSupply = IERC20(bond).totalSupply(); uint256 _percentage = previousEpochBillPrice.sub(billPriceOne); uint256 _savedForBond; uint256 _savedForMasonry; uint256 _mse = _calculateMaxSupplyExpansionPercent(billSupply).mul(1e13); if (_percentage > _mse) { _percentage = _mse; } if (seigniorageSaved >= bondSupply.mul(bondDepletionFloorPercent).div(BASIS_DIVISOR)) { // saved enough to pay debt, mint as usual rate _savedForMasonry = billSupply.mul(_percentage).div(1e18); } else { // have not saved enough to pay debt, mint more uint256 _seigniorage = billSupply.mul(_percentage).div(1e18); _savedForMasonry = _seigniorage.mul(seigniorageExpansionFloorPercent).div(BASIS_DIVISOR); _savedForBond = _seigniorage.sub(_savedForMasonry); if (mintingFactorForPayingDebt > 0) { _savedForBond = _savedForBond.mul(mintingFactorForPayingDebt).div(BASIS_DIVISOR); } } if (_savedForMasonry > 0) { _sendToMasonry(_savedForMasonry); } if (_savedForBond > 0) { seigniorageSaved = seigniorageSaved.add(_savedForBond); IBasisAsset(bill).mint(address(this), _savedForBond); emit TreasuryFunded(block.timestamp, _savedForBond); } } } } //=================================================================================================================================== function governanceRecoverUnsupported( IERC20 _token, uint256 _amount, address _to ) external onlyOperator { // do not allow to drain core tokens require(address(_token) != address(bill), "bill"); require(address(_token) != address(bond), "bond"); require(address(_token) != address(share), "share"); _token.safeTransfer(_to, _amount); } function masonrySetOperator(address _operator) external onlyOperator { IMasonry(masonry).setOperator(_operator); } function masonrySetLockUp(uint256 _withdrawLockupEpochs, uint256 _rewardLockupEpochs) external onlyOperator { IMasonry(masonry).setLockUp(_withdrawLockupEpochs, _rewardLockupEpochs); } function masonryAllocateSeigniorage(uint256 amount) external onlyOperator { IMasonry(masonry).allocateSeigniorage(amount); } function masonryGovernanceRecoverUnsupported( address _token, uint256 _amount, address _to ) external onlyOperator { IMasonry(masonry).governanceRecoverUnsupported(_token, _amount, _to); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"billAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"BoughtBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"BurnedBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"DaoFundFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"DevFundFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"at","type":"uint256"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"MasonryFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"billAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"RedeemedBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"TeamFundFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"TreasuryFunded","type":"event"},{"inputs":[],"name":"BASIS_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_renounceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bill","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"billOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"billPriceCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"billPriceOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bond","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondDepletionFloorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bootstrapEpochs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bootstrapSupplyExpansionPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_billAmount","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"buyBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daoFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoFundSharedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFundSharedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochSupplyContractionLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"excludedFromTotalSupply","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBillCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBillPrice","outputs":[{"internalType":"uint256","name":"billPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBillUpdatedPrice","outputs":[{"internalType":"uint256","name":"_billPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondDiscountRate","outputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondPremiumRate","outputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnableBillLeft","outputs":[{"internalType":"uint256","name":"_burnableBillLeft","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRedeemableBonds","outputs":[{"internalType":"uint256","name":"_redeemableBonds","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bill","type":"address"},{"internalType":"address","name":"_bond","type":"address"},{"internalType":"address","name":"_share","type":"address"},{"internalType":"address","name":"_billOracle","type":"address"},{"internalType":"address","name":"_masonry","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masonry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"masonryAllocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"masonryGovernanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawLockupEpochs","type":"uint256"},{"internalType":"uint256","name":"_rewardLockupEpochs","type":"uint256"}],"name":"masonrySetLockUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"masonrySetOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxDebtRatioPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDiscountRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxExpansionTiers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPremiumRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyContractionPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyExpansionPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingFactorForPayingDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextEpochPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousEpochBillPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bondAmount","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"redeemBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seigniorageExpansionFloorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seigniorageSaved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_billOracle","type":"address"}],"name":"setBillOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_billPriceCeiling","type":"uint256"}],"name":"setBillPriceCeiling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bondDepletionFloorPercent","type":"uint256"}],"name":"setBondDepletionFloorPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bootstrapEpochs","type":"uint256"},{"internalType":"uint256","name":"_bootstrapSupplyExpansionPercent","type":"uint256"}],"name":"setBootstrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_discountPercent","type":"uint256"}],"name":"setDiscountPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_daoFund","type":"address"},{"internalType":"uint256","name":"_daoFundSharedPercent","type":"uint256"},{"internalType":"address","name":"_devFund","type":"address"},{"internalType":"uint256","name":"_devFundSharedPercent","type":"uint256"},{"internalType":"address","name":"_teamFund","type":"address"},{"internalType":"uint256","name":"_teamFundSharedPercent","type":"uint256"}],"name":"setExtraFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masonry","type":"address"}],"name":"setMasonry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxDebtRatioPercent","type":"uint256"}],"name":"setMaxDebtRatioPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxDiscountRate","type":"uint256"}],"name":"setMaxDiscountRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxExpansionTiersEntry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPremiumRate","type":"uint256"}],"name":"setMaxPremiumRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupplyContractionPercent","type":"uint256"}],"name":"setMaxSupplyContractionPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupplyExpansionPercent","type":"uint256"}],"name":"setMaxSupplyExpansionPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintingFactorForPayingDebt","type":"uint256"}],"name":"setMintingFactorForPayingDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_premiumPercent","type":"uint256"}],"name":"setPremiumPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_premiumThreshold","type":"uint256"}],"name":"setPremiumThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setSupplyTiersEntry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyTiers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFundSharedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6002805460ff60a01b191690555f600481905560055560a06040527329d0762f7be8409d0ac34a3595af62e8c012095060809081526100429060069060016100ed565b5034801561004e575f80fd5b506100583361009c565b600280546001600160a01b031916339081179091556040515f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3610164565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b828054828255905f5260205f20908101928215610140579160200282015b8281111561014057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061010b565b5061014c929150610150565b5090565b5b8082111561014c575f8155600101610151565b614362806101715f395ff3fe608060405234801561000f575f80fd5b5060043610610485575f3560e01c806378e9792511610258578063ab39e27a1161014b578063d4b14944116100ca578063db3caf9a1161008f578063db3caf9a14610906578063e90b245414610919578063edc9465e14610922578063f14698de1461092b578063f2fde38b14610934578063fcb6f00814610947575f80fd5b8063d4b14944146108c6578063d5d3b26c146108d9578063d69dbfd4146108ec578063d98f2495146108f4578063da3ed419146108fd575f80fd5b8063be266d5411610110578063be266d5414610886578063c5967c2614610899578063c8412d02146108a1578063c8f987f3146108aa578063cecce38e146108b3575f80fd5b8063ab39e27a14610850578063b3ab15fb14610858578063b4ae7e0f1461086b578063b4d1d79514610874578063b8a878f91461087d575f80fd5b806391bbfed5116101d7578063998200251161019c57806399820025146107fc578063a0487eea1461080f578063a204452b14610822578063a58c066a14610835578063a8d5fd651461083d575f80fd5b806391bbfed51461079d578063940e6064146107b0578063951357d4146107c357806395b6ef0c146107d657806398b762a1146107e9575f80fd5b80638a27f1031161021d5780638a27f103146107555780638c664db61461075d5780638d934f74146107705780638da5cb5b14610783578063900cf0cf14610794575f80fd5b806378e979251461071457806380ca12021461071d57806381d11eaf1461073057806382cad83814610739578063874106cc1461074c575f80fd5b80634390d2a81161037b57806359bf5d39116102fa5780636343ae1a116102bf5780636343ae1a146106c257806363f96cf4146106cb57806364c9ec6f146106de578063715018a6146106f157806372c054f9146106f9578063734f709614610701575f80fd5b806359bf5d39146106835780635a0fc79c1461068b5780635b75617914610694578063613b9c951461069c57806362ac58e4146106af575f80fd5b80635495699f116103405780635495699f1461063057806354f04a111461064357806355ebdeef14610656578063570ca7351461065f578063591663e114610670575f80fd5b80634390d2a8146105db5780634456eda2146105ee578063499f3f19146106015780634c109ce01461061457806354575af41461061d575f80fd5b806322f832cd116104075780632e9c7b65116103cc5780632e9c7b6514610579578063371e677a14610582578063392e53cd146105ad5780634013a08e146105bf57806340af7ba5146105c8575f80fd5b806322f832cd1461054457806329605e771461054d57806329ef1919146105605780632ab6f8db146105695780632bdbc47014610571575f80fd5b8063118ebbf91161044d578063118ebbf9146104dd578063154ec2db146104f0578063158ef93e146105035780631b0fb35f14610527578063200fea3b1461053a575f80fd5b806303be7e761461048957806304e5c7b1146104a55780630b5bcec7146104ba5780630cf60175146104cd5780630db7eb0b146104d5575b5f80fd5b61049260225481565b6040519081526020015b60405180910390f35b6104b86104b3366004613e1a565b610950565b005b6104b86104c8366004613e1a565b610a4b565b610492610aea565b610492610b99565b6104b86104eb366004613e31565b610c36565b6104b86104fe366004613e1a565b611201565b60025461051790600160a01b900460ff1681565b604051901515815260200161049c565b6104b8610535366004613e65565b611283565b610492620186a081565b61049260135481565b6104b861055b366004613ec8565b6113d4565b610492601b5481565b6104b86113e8565b61049261141c565b610492601a5481565b600754610595906001600160a01b031681565b6040516001600160a01b03909116815260200161049c565b600254600160a01b900460ff16610517565b610492601e5481565b6104b86105d6366004613e1a565b611518565b602154610595906001600160a01b031681565b6002546001600160a01b03163314610517565b6104b861060f366004613e1a565b61159a565b61049260245481565b6104b861062b366004613ee3565b61163d565b602354610595906001600160a01b031681565b6104b8610651366004613e31565b611754565b61049260205481565b6002546001600160a01b0316610595565b6104b861067e366004613e1a565b611dfc565b600e54610492565b610492600e5481565b6104b8611e5c565b6104b86106aa366004613e1a565b612466565b6104b86106bd366004613ec8565b6124dd565b610492600d5481565b600a54610595906001600160a01b031681565b600854610595906001600160a01b031681565b6104b8612565565b610492612576565b6104b861070f366004613e31565b612627565b61049260035481565b6104b861072b366004613ec8565b6126b5565b61049260125481565b610595610747366004613e1a565b612701565b61049260175481565b6104b8612729565b6104b861076b366004613e1a565b61277a565b601f54610595906001600160a01b031681565b6001546001600160a01b0316610595565b61049260045481565b6104b86107ab366004613e31565b6127da565b6105176107be366004613f22565b6128d6565b6104b86107d1366004613ee3565b6129cc565b6104b86107e4366004613f51565b612a64565b6104b86107f7366004613e1a565b612d27565b61049261080a366004613e1a565b612da9565b61049261081d366004613e1a565b612dc8565b6104b8610830366004613e1a565b612dd7565b610492612e59565b600954610595906001600160a01b031681565b610492612f43565b6104b8610866366004613ec8565b612f84565b610492600c5481565b61049261546081565b61049260195481565b6104b8610894366004613e1a565b612fb7565b610492613012565b610492601d5481565b610492601c5481565b6104b86108c1366004613e1a565b61303b565b6105176108d4366004613f22565b613099565b6104b86108e7366004613ec8565b613155565b6104926131a1565b61049260115481565b61049260155481565b600b54610595906001600160a01b031681565b61049260145481565b61049260185481565b61049260165481565b6104b8610942366004613ec8565b6132df565b61049260055481565b6002546001600160a01b031633146109835760405162461bcd60e51b815260040161097a90613fb1565b60405180910390fd5b600d548110156109e85760405162461bcd60e51b815260206004820152602a60248201527f5f7072656d69756d5468726573686f6c6420657863656564732062696c6c50726044820152696963654365696c696e6760b01b606482015260840161097a565b6105dc811115610a465760405162461bcd60e51b8152602060048201526024808201527f5f7072656d69756d5468726573686f6c6420697320686967686572207468616e60448201526320312e3560e01b606482015260840161097a565b601c55565b6002546001600160a01b03163314610a755760405162461bcd60e51b815260040161097a90613fb1565b600a8110158015610a8857506127108111155b610ae55760405162461bcd60e51b815260206004820152602860248201527f5f6d6178537570706c79457870616e73696f6e50657263656e743a206f7574206044820152676f662072616e676560c01b606482015260840161097a565b601155565b5f80610af4612f43565b9050600c548111610b9557601b545f03610b10575050600c5490565b5f610b3882610b32670de0b6b3a7640000600c5461335590919063ffffffff16565b90613367565b90505f610b63620186a0610b32601b54610b5d600c548761337290919063ffffffff16565b90613355565b600c54909150610b73908261337d565b93505f601954118015610b87575060195484115b15610b925760195493505b50505b5090565b5f80610ba3612f43565b9050600d54811115610b95575f610bcc6064610b32601c54600c5461335590919063ffffffff16565b9050808210610c2c575f610bf8620186a0610b32601d54610b5d600c548861337290919063ffffffff16565b600c54909150610c08908261337d565b93505f601a54118015610c1c5750601a5484115b15610b9257601a54935050505090565b600c549250505090565b435f9081526020818152604080832032845290915290205460ff1615610c6e5760405162461bcd60e51b815260040161097a90613ff5565b435f9081526020818152604080832033845290915290205460ff1615610ca65760405162461bcd60e51b815260040161097a90613ff5565b600354421015610cc85760405162461bcd60e51b815260040161097a9061403b565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610d0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d339190614072565b6001600160a01b0316148015610dba57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610d8b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610daf9190614072565b6001600160a01b0316145b8015610e3757506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610e08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2c9190614072565b6001600160a01b0316145b8015610eb45750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610e85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea99190614072565b6001600160a01b0316145b610ed05760405162461bcd60e51b815260040161097a9061408d565b5f8211610f365760405162461bcd60e51b815260206004820152602e60248201527f54726561737572793a2063616e6e6f742072656465656d20626f6e647320776960448201526d1d1a081e995c9bc8185b5bdd5b9d60921b606482015260840161097a565b5f610f3f612f43565b9050818114610f905760405162461bcd60e51b815260206004820152601a60248201527f54726561737572793a2042494c4c207072696365206d6f766564000000000000604482015260640161097a565b600d548111610fb15760405162461bcd60e51b815260040161097a906140c4565b5f610fba610b99565b90505f811161100b5760405162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e6420726174650000000000604482015260640161097a565b5f611022670de0b6b3a7640000610b328785613355565b6007546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561106d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110919190614116565b10156110ed5760405162461bcd60e51b815260206004820152602560248201527f54726561737572793a20747265617375727920686173206e6f206d6f726520626044820152641d5919d95d60da1b606482015260840161097a565b6111056110fc600e5483613388565b600e5490613372565b600e5560085460405163079cc67960e41b81526001600160a01b03909116906379cc67909061113a903390899060040161412d565b5f604051808303815f87803b158015611151575f80fd5b505af1158015611163573d5f803e3d5ffd5b505060075461117f92506001600160a01b03169050338361339d565b6111876133f3565b604080518281526020810187905233917f51e0d16595cabc591e64da08e45bb223577e5b9a39cd947b4ddc3472b2dd8878910160405180910390a25050435f908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055505050565b6002546001600160a01b0316331461122b5760405162461bcd60e51b815260040161097a90613fb1565b62030d4081111561127e5760405162461bcd60e51b815260206004820152601d60248201527f5f646973636f756e7450657263656e74206973206f7665722032303025000000604482015260640161097a565b601b55565b6002546001600160a01b031633146112ad5760405162461bcd60e51b815260040161097a90613fb1565b6001600160a01b0386166112d35760405162461bcd60e51b815260040161097a90614146565b613a988511156112f55760405162461bcd60e51b815260040161097a90614164565b6001600160a01b03841661131b5760405162461bcd60e51b815260040161097a90614146565b610dac83111561133d5760405162461bcd60e51b815260040161097a90614164565b6001600160a01b0382166113635760405162461bcd60e51b815260040161097a90614146565b61157c8111156113855760405162461bcd60e51b815260040161097a90614164565b601f80546001600160a01b03199081166001600160a01b039889161790915560209590955560218054861694871694909417909355602291909155602380549093169316929092179055602455565b6113dc613457565b6113e5816134b1565b50565b6002546001600160a01b031633146114125760405162461bcd60e51b815260040161097a90613fb1565b61141a612729565b565b5f80611426612f43565b9050600c548111610b95575f61143a6131a1565b90505f611459620186a0610b326015548561335590919063ffffffff16565b90505f60085f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114d09190614116565b905080821115611511575f6114e58383613372565b90505f6114fe670de0b6b3a7640000610b328489613355565b905061150c60055482613388565b965050505b5050505090565b6002546001600160a01b031633146115425760405162461bcd60e51b815260040161097a90613fb1565b62030d408111156115955760405162461bcd60e51b815260206004820152601c60248201527f5f7072656d69756d50657263656e74206973206f766572203230302500000000604482015260640161097a565b601d55565b6002546001600160a01b031633146115c45760405162461bcd60e51b815260040161097a90613fb1565b620186a081101580156115da575062030d408111155b6116385760405162461bcd60e51b815260206004820152602960248201527f5f6d696e74696e67466163746f72466f72506179696e67446562743a206f7574604482015268206f662072616e676560b81b606482015260840161097a565b601e55565b6002546001600160a01b031633146116675760405162461bcd60e51b815260040161097a90613fb1565b6007546001600160a01b03908116908416036116ae5760405162461bcd60e51b815260040161097a90602080825260049082015263189a5b1b60e21b604082015260600190565b6008546001600160a01b03908116908416036116f55760405162461bcd60e51b815260040161097a90602080825260049082015263189bdb9960e21b604082015260600190565b6009546001600160a01b039081169084160361173b5760405162461bcd60e51b8152602060048201526005602482015264736861726560d81b604482015260640161097a565b61174f6001600160a01b038416828461339d565b505050565b435f9081526020818152604080832032845290915290205460ff161561178c5760405162461bcd60e51b815260040161097a90613ff5565b435f9081526020818152604080832033845290915290205460ff16156117c45760405162461bcd60e51b815260040161097a90613ff5565b6003544210156117e65760405162461bcd60e51b815260040161097a9061403b565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa15801561182d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118519190614072565b6001600160a01b03161480156118d857506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156118a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118cd9190614072565b6001600160a01b0316145b801561195557506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611926573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194a9190614072565b6001600160a01b0316145b80156119d25750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156119a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c79190614072565b6001600160a01b0316145b6119ee5760405162461bcd60e51b815260040161097a9061408d565b5f8211611a565760405162461bcd60e51b815260206004820152603060248201527f54726561737572793a2063616e6e6f7420707572636861736520626f6e64732060448201526f1dda5d1a081e995c9bc8185b5bdd5b9d60821b606482015260840161097a565b5f611a5f612f43565b9050818114611ab05760405162461bcd60e51b815260206004820152601a60248201527f54726561737572793a2042494c4c207072696365206d6f766564000000000000604482015260640161097a565b600c548110611ad15760405162461bcd60e51b815260040161097a906140c4565b600554831115611b365760405162461bcd60e51b815260206004820152602a60248201527f54726561737572793a206e6f7420656e6f75676820626f6e64206c65667420746044820152696f20707572636861736560b01b606482015260840161097a565b5f611b3f610aea565b90505f8111611b905760405162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e6420726174650000000000604482015260640161097a565b5f611ba7670de0b6b3a7640000610b328785613355565b90505f611bb26131a1565b90505f611c338360085f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2d9190614116565b9061337d565b9050611c51620186a0610b326015548561335590919063ffffffff16565b811115611c965760405162461bcd60e51b81526020600482015260136024820152726f766572206d6178206465627420726174696f60681b604482015260640161097a565b60075460405163079cc67960e41b81526001600160a01b03909116906379cc679090611cc89033908b9060040161412d565b5f604051808303815f87803b158015611cdf575f80fd5b505af1158015611cf1573d5f803e3d5ffd5b50506008546040516340c10f1960e01b81526001600160a01b0390911692506340c10f199150611d27903390879060040161412d565b6020604051808303815f875af1158015611d43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d67919061418a565b50600554611d759088613372565b600555611d806133f3565b604080518881526020810185905233917f73017f1b70789e2e66759eeb3c7ec11f59e6eedb55d921cfaec5410dd42a4799910160405180910390a25050435f908152602081815260408083203284529091528082208054600160ff19918216811790925533845291909220805490911690911790555050505050565b6002546001600160a01b03163314611e265760405162461bcd60e51b815260040161097a90613fb1565b6103e88110158015611e3b5750620186a08111155b611e575760405162461bcd60e51b815260040161097a90614164565b601555565b435f9081526020818152604080832032845290915290205460ff1615611e945760405162461bcd60e51b815260040161097a90613ff5565b435f9081526020818152604080832033845290915290205460ff1615611ecc5760405162461bcd60e51b815260040161097a90613ff5565b600354421015611eee5760405162461bcd60e51b815260040161097a9061403b565b611ef6613012565b421015611f455760405162461bcd60e51b815260206004820152601860248201527f54726561737572793a206e6f74206f70656e6564207965740000000000000000604482015260640161097a565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611f8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fb09190614072565b6001600160a01b031614801561203757506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015612008573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061202c9190614072565b6001600160a01b0316145b80156120b457506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015612085573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a99190614072565b6001600160a01b0316145b80156121315750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015612102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121269190614072565b6001600160a01b0316145b61214d5760405162461bcd60e51b815260040161097a9061408d565b6121556133f3565b61215d612f43565b601855600e545f90612177906121716131a1565b90613372565b905060165460045410156121ae576121a96121a4620186a0610b326017548561335590919063ffffffff16565b613574565b6123eb565b600d5460185411156123eb57600854604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015612201573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122259190614116565b90505f61223f600c5460185461337290919063ffffffff16565b90505f805f6122576509184e72a000610b5d88613958565b905080841115612265578093505b612281620186a0610b326012548861335590919063ffffffff16565b600e54106122a65761229f670de0b6b3a7640000610b328887613355565b9150612313565b5f6122bd670de0b6b3a7640000610b328988613355565b90506122db620186a0610b326013548461335590919063ffffffff16565b92506122e78184613372565b601e54909450156123115761230e620186a0610b32601e548761335590919063ffffffff16565b93505b505b81156123225761232282613574565b82156123e557600e54612335908461337d565b600e556007546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061236a903090879060040161412d565b6020604051808303815f875af1158015612386573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123aa919061418a565b5060408051428152602081018590527ff705142bf09f04297640495ddf7c59b7fd6f51894c5aea9602d631cf05f0efc2910160405180910390a15b50505050505b506004546123fa90600161337d565b600455600d54612408612f43565b1161242757612422620186a0610b32601454610b5d6131a1565b612429565b5f5b600555435f908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6002546001600160a01b031633146124905760405162461bcd60e51b815260040161097a90613fb1565b600c5481101580156124bc57506124b86064610b326078600c5461335590919063ffffffff16565b8111155b6124d85760405162461bcd60e51b815260040161097a90614164565b600d55565b6002546001600160a01b031633146125075760405162461bcd60e51b815260040161097a90613fb1565b600a5460405163b3ab15fb60e01b81526001600160a01b0383811660048301529091169063b3ab15fb906024015b5f604051808303815f87803b15801561254c575f80fd5b505af115801561255e573d5f803e3d5ffd5b5050505050565b61256d613457565b61141a5f6139c4565b5f80612580612f43565b9050600d54811115610b95576007546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa1580156125d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125f69190614116565b90505f612601610b99565b90508015610b925761261f81610b3284670de0b6b3a7640000613355565b935050505090565b6002546001600160a01b031633146126515760405162461bcd60e51b815260040161097a90613fb1565b600a54604051632ffaaa0960e01b815260048101849052602481018390526001600160a01b0390911690632ffaaa09906044015f604051808303815f87803b15801561269b575f80fd5b505af11580156126ad573d5f803e3d5ffd5b505050505050565b6002546001600160a01b031633146126df5760405162461bcd60e51b815260040161097a90613fb1565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60068181548110612710575f80fd5b5f918252602090912001546001600160a01b0316905081565b612731613457565b6002546040515f916001600160a01b0316907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600280546001600160a01b0319169055565b6002546001600160a01b031633146127a45760405162461bcd60e51b815260040161097a90613fb1565b6101f481101580156127b95750620186a08111155b6127d55760405162461bcd60e51b815260040161097a90614164565b601255565b6002546001600160a01b031633146128045760405162461bcd60e51b815260040161097a90613fb1565b60788211156128555760405162461bcd60e51b815260206004820152601e60248201527f5f626f6f74737472617045706f6368733a206f7574206f662072616e67650000604482015260640161097a565b6064811015801561286857506127108111155b6128cb5760405162461bcd60e51b815260206004820152602e60248201527f5f626f6f747374726170537570706c79457870616e73696f6e50657263656e7460448201526d3a206f7574206f662072616e676560901b606482015260840161097a565b601691909155601755565b6002545f906001600160a01b031633146129025760405162461bcd60e51b815260040161097a90613fb1565b60078360ff16106129255760405162461bcd60e51b815260040161097a906141a9565b60ff83161561296157600f61293b600185614206565b60ff168154811061294e5761294e61421f565b905f5260205f2001548211612961575f80fd5b60068360ff1610156129a057600f61297a846001614233565b60ff168154811061298d5761298d61421f565b905f5260205f20015482106129a0575f80fd5b81600f8460ff16815481106129b7576129b761421f565b5f918252602090912001555060015b92915050565b6002546001600160a01b031633146129f65760405162461bcd60e51b815260040161097a90613fb1565b600a54604051631515d6bd60e21b81526001600160a01b038581166004830152602482018590528381166044830152909116906354575af4906064015f604051808303815f87803b158015612a49575f80fd5b505af1158015612a5b573d5f803e3d5ffd5b50505050505050565b600254600160a01b900460ff1615612abe5760405162461bcd60e51b815260206004820152601d60248201527f54726561737572793a20616c726561647920696e697469616c697a6564000000604482015260640161097a565b6002546001600160a01b03163314612ae85760405162461bcd60e51b815260040161097a90613fb1565b600780546001600160a01b03199081166001600160a01b0389811691909117909255600880548216888416179055600980548216878416179055600b80548216868416179055600a80549091169184169190911790556003819055670de0b6b3a7640000600c819055612b6390606490610b32906065613355565b600d556040805160e0810182525f8152697f0e10af47c1c70000006020820152699ed194db19b238c000009181019190915269d3c21bcecceda1000000606082015269fe1c215e8f838e00000060808201526a013da329b633647180000060a08201526a01a784379d99db4200000060c0820152612be590600f906007613d74565b506040805160e081018252606e8152605a602082015260509181019190915260466060820152603c6080820152603260a0820152601460c0820152612c2e906010906007613dc8565b5060966011819055620186a06012556188b8601381905561271060145560155561044c601c5562011170601d55600c6016556017556007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612ca9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ccd9190614116565b600e556002805460ff60a01b1916600160a01b17905560405133907f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce7990612d179043815260200190565b60405180910390a2505050505050565b6002546001600160a01b03163314612d515760405162461bcd60e51b815260040161097a90613fb1565b62030d40811115612da45760405162461bcd60e51b815260206004820152601d60248201527f5f6d6178446973636f756e7452617465206973206f7665722032303025000000604482015260640161097a565b601955565b600f8181548110612db8575f80fd5b5f91825260209091200154905081565b60108181548110612db8575f80fd5b6002546001600160a01b03163314612e015760405162461bcd60e51b815260040161097a90613fb1565b62030d40811115612e545760405162461bcd60e51b815260206004820152601c60248201527f5f6d61785072656d69756d52617465206973206f766572203230302500000000604482015260640161097a565b601a55565b600b54600754604051630d01142560e31b81525f926001600160a01b0390811692636808a12892612e9a9290911690670de0b6b3a76400009060040161412d565b602060405180830381865afa925050508015612ed3575060408051601f3d908101601f19168201909252612ed091810190614116565b60015b612f3e5760405162461bcd60e51b815260206004820152603660248201527f54726561737572793a206661696c656420746f20636f6e73756c742042494c4c6044820152752070726963652066726f6d20746865206f7261636c6560501b606482015260840161097a565b919050565b600b54600754604051633ddac95360e01b81525f926001600160a01b0390811692633ddac95392612e9a9290911690670de0b6b3a76400009060040161412d565b6002546001600160a01b03163314612fae5760405162461bcd60e51b815260040161097a90613fb1565b6113e5816113d4565b6002546001600160a01b03163314612fe15760405162461bcd60e51b815260040161097a90613fb1565b600a546040516397ffe1d760e01b8152600481018390526001600160a01b03909116906397ffe1d790602401612535565b5f61303661302d61546060045461335590919063ffffffff16565b6003549061337d565b905090565b6002546001600160a01b031633146130655760405162461bcd60e51b815260040161097a90613fb1565b606481101580156130785750613a988111155b6130945760405162461bcd60e51b815260040161097a90614164565b601455565b6002545f906001600160a01b031633146130c55760405162461bcd60e51b815260040161097a90613fb1565b60078360ff16106130e85760405162461bcd60e51b815260040161097a906141a9565b600a82101580156130fb57506127108211155b61313e5760405162461bcd60e51b81526020600482015260146024820152735f76616c75653a206f7574206f662072616e676560601b604482015260640161097a565b8160108460ff16815481106129b7576129b761421f565b6002546001600160a01b0316331461317f5760405162461bcd60e51b815260040161097a90613fb1565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600754604080516318160ddd60e01b815290515f926001600160a01b031691839183916318160ddd9160048083019260209291908290030181865afa1580156131ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132109190614116565b90505f805b60065460ff821610156132d4576132c2846001600160a01b03166370a0823160068460ff168154811061324a5761324a61421f565b5f9182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa158015613297573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132bb9190614116565b839061337d565b91506132cd8161424c565b9050613215565b5061261f8282613372565b6132e7613457565b6001600160a01b03811661334c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097a565b6113e5816139c4565b5f613360828461426a565b9392505050565b5f6133608284614281565b5f61336082846142a0565b5f61336082846142b3565b5f8183106133965781613360565b5090919050565b61174f8363a9059cbb60e01b84846040516024016133bc92919061412d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a15565b600b5f9054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561343f575f80fd5b505af1925050508015613450575060015b1561141a57565b6001546001600160a01b0316331461141a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161097a565b6001600160a01b03811661351d5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b606482015260840161097a565b6040516001600160a01b038216905f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906135a6903090859060040161412d565b6020604051808303815f875af11580156135c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135e6919061418a565b506020545f90156136c05761360d620186a0610b326020548561335590919063ffffffff16565b600754601f5460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb92613645921690859060040161412d565b6020604051808303815f875af1158015613661573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613685919061418a565b5060408051428152602081018390527fcb3f34aaa3445b461e6da5492dc89e5c257a59fa598131f3b6bbc97a3638e409910160405180910390a15b6022545f9015613799576136e6620186a0610b326022548661335590919063ffffffff16565b60075460215460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb9261371e921690859060040161412d565b6020604051808303815f875af115801561373a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061375e919061418a565b5060408051428152602081018390527fdc8b715b18523e58b7fd0da53259dfa91efd91df4a854d94b136e3333a3b9395910160405180910390a15b6024545f9015613872576137bf620186a0610b326024548761335590919063ffffffff16565b60075460235460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926137f7921690859060040161412d565b6020604051808303815f875af1158015613813573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613837919061418a565b5060408051428152602081018390527f2dfe5937647c787f9c6bddefedb6b3273b627227b0493e9a83b5441fb11ee00c910160405180910390a15b6138828161217184818888613372565b600a546007549195506138a2916001600160a01b0390811691165f613ae8565b600a546007546138bf916001600160a01b03918216911686613ae8565b600a546040516397ffe1d760e01b8152600481018690526001600160a01b03909116906397ffe1d7906024015f604051808303815f87803b158015613902575f80fd5b505af1158015613914573d5f803e3d5ffd5b505060408051428152602081018890527fa72fa2f263b243b0f0e1fec5f3d49d33de573d15929b6b730c6b8ab3838c1c4d935001905060405180910390a150505050565b5f60065b600f8160ff16815481106139725761397261421f565b905f5260205f20015483106139aa5760108160ff16815481106139975761399761421f565b5f918252602090912001546011556139ba565b6139b3816142c6565b905061395c565b5050601154919050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f613a69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613bea9092919063ffffffff16565b905080515f1480613a89575080806020019051810190613a89919061418a565b61174f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161097a565b801580613b605750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613b3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b5e9190614116565b155b613bcb5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161097a565b61174f8363095ea7b360e01b84846040516024016133bc92919061412d565b6060613bf884845f85613c00565b949350505050565b606082471015613c615760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161097a565b5f80866001600160a01b03168587604051613c7c91906142e1565b5f6040518083038185875af1925050503d805f8114613cb6576040519150601f19603f3d011682016040523d82523d5f602084013e613cbb565b606091505b5091509150613ccc87838387613cd7565b979650505050505050565b60608315613d455782515f03613d3e576001600160a01b0385163b613d3e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161097a565b5081613bf8565b613bf88383815115613d5a5781518083602001fd5b8060405162461bcd60e51b815260040161097a91906142f7565b828054828255905f5260205f20908101928215613dbc579160200282015b82811115613dbc57825182906affffffffffffffffffffff16905591602001919060010190613d92565b50610b95929150613e06565b828054828255905f5260205f20908101928215613dbc579160200282015b82811115613dbc578251829060ff16905591602001919060010190613de6565b5b80821115610b95575f8155600101613e07565b5f60208284031215613e2a575f80fd5b5035919050565b5f8060408385031215613e42575f80fd5b50508035926020909101359150565b6001600160a01b03811681146113e5575f80fd5b5f805f805f8060c08789031215613e7a575f80fd5b8635613e8581613e51565b9550602087013594506040870135613e9c81613e51565b9350606087013592506080870135613eb381613e51565b9598949750929591949360a090920135925050565b5f60208284031215613ed8575f80fd5b813561336081613e51565b5f805f60608486031215613ef5575f80fd5b8335613f0081613e51565b9250602084013591506040840135613f1781613e51565b809150509250925092565b5f8060408385031215613f33575f80fd5b823560ff81168114613f43575f80fd5b946020939093013593505050565b5f805f805f8060c08789031215613f66575f80fd5b8635613f7181613e51565b95506020870135613f8181613e51565b94506040870135613f9181613e51565b93506060870135613fa181613e51565b92506080870135613eb381613e51565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b60208082526026908201527f436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756040820152653731ba34b7b760d11b606082015260800190565b60208082526019908201527f54726561737572793a206e6f7420737461727465642079657400000000000000604082015260600190565b5f60208284031215614082575f80fd5b815161336081613e51565b6020808252601e908201527f54726561737572793a206e656564206d6f7265207065726d697373696f6e0000604082015260600190565b60208082526032908201527f54726561737572793a2062696c6c5072696365206e6f7420656c696769626c6560408201527120666f7220626f6e6420707572636861736560701b606082015260800190565b5f60208284031215614126575f80fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252600490820152637a65726f60e01b604082015260600190565b6020808252600c908201526b6f7574206f662072616e676560a01b604082015260600190565b5f6020828403121561419a575f80fd5b81518015158114613360575f80fd5b60208082526029908201527f496e6465782068617320746f206265206c6f776572207468616e20636f756e74604082015268206f6620746965727360b81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b60ff82811682821603908111156129c6576129c66141f2565b634e487b7160e01b5f52603260045260245ffd5b60ff81811683821601908111156129c6576129c66141f2565b5f60ff821660ff8103614261576142616141f2565b60010192915050565b80820281158282048414176129c6576129c66141f2565b5f8261429b57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156129c6576129c66141f2565b808201808211156129c6576129c66141f2565b5f60ff8216806142d8576142d86141f2565b5f190192915050565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212205489d47ec4ab8e8a9a97029b7cc3a9b30cb2e012cbd9a3ed991b6f8dd4e6d3d664736f6c634300081a0033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610485575f3560e01c806378e9792511610258578063ab39e27a1161014b578063d4b14944116100ca578063db3caf9a1161008f578063db3caf9a14610906578063e90b245414610919578063edc9465e14610922578063f14698de1461092b578063f2fde38b14610934578063fcb6f00814610947575f80fd5b8063d4b14944146108c6578063d5d3b26c146108d9578063d69dbfd4146108ec578063d98f2495146108f4578063da3ed419146108fd575f80fd5b8063be266d5411610110578063be266d5414610886578063c5967c2614610899578063c8412d02146108a1578063c8f987f3146108aa578063cecce38e146108b3575f80fd5b8063ab39e27a14610850578063b3ab15fb14610858578063b4ae7e0f1461086b578063b4d1d79514610874578063b8a878f91461087d575f80fd5b806391bbfed5116101d7578063998200251161019c57806399820025146107fc578063a0487eea1461080f578063a204452b14610822578063a58c066a14610835578063a8d5fd651461083d575f80fd5b806391bbfed51461079d578063940e6064146107b0578063951357d4146107c357806395b6ef0c146107d657806398b762a1146107e9575f80fd5b80638a27f1031161021d5780638a27f103146107555780638c664db61461075d5780638d934f74146107705780638da5cb5b14610783578063900cf0cf14610794575f80fd5b806378e979251461071457806380ca12021461071d57806381d11eaf1461073057806382cad83814610739578063874106cc1461074c575f80fd5b80634390d2a81161037b57806359bf5d39116102fa5780636343ae1a116102bf5780636343ae1a146106c257806363f96cf4146106cb57806364c9ec6f146106de578063715018a6146106f157806372c054f9146106f9578063734f709614610701575f80fd5b806359bf5d39146106835780635a0fc79c1461068b5780635b75617914610694578063613b9c951461069c57806362ac58e4146106af575f80fd5b80635495699f116103405780635495699f1461063057806354f04a111461064357806355ebdeef14610656578063570ca7351461065f578063591663e114610670575f80fd5b80634390d2a8146105db5780634456eda2146105ee578063499f3f19146106015780634c109ce01461061457806354575af41461061d575f80fd5b806322f832cd116104075780632e9c7b65116103cc5780632e9c7b6514610579578063371e677a14610582578063392e53cd146105ad5780634013a08e146105bf57806340af7ba5146105c8575f80fd5b806322f832cd1461054457806329605e771461054d57806329ef1919146105605780632ab6f8db146105695780632bdbc47014610571575f80fd5b8063118ebbf91161044d578063118ebbf9146104dd578063154ec2db146104f0578063158ef93e146105035780631b0fb35f14610527578063200fea3b1461053a575f80fd5b806303be7e761461048957806304e5c7b1146104a55780630b5bcec7146104ba5780630cf60175146104cd5780630db7eb0b146104d5575b5f80fd5b61049260225481565b6040519081526020015b60405180910390f35b6104b86104b3366004613e1a565b610950565b005b6104b86104c8366004613e1a565b610a4b565b610492610aea565b610492610b99565b6104b86104eb366004613e31565b610c36565b6104b86104fe366004613e1a565b611201565b60025461051790600160a01b900460ff1681565b604051901515815260200161049c565b6104b8610535366004613e65565b611283565b610492620186a081565b61049260135481565b6104b861055b366004613ec8565b6113d4565b610492601b5481565b6104b86113e8565b61049261141c565b610492601a5481565b600754610595906001600160a01b031681565b6040516001600160a01b03909116815260200161049c565b600254600160a01b900460ff16610517565b610492601e5481565b6104b86105d6366004613e1a565b611518565b602154610595906001600160a01b031681565b6002546001600160a01b03163314610517565b6104b861060f366004613e1a565b61159a565b61049260245481565b6104b861062b366004613ee3565b61163d565b602354610595906001600160a01b031681565b6104b8610651366004613e31565b611754565b61049260205481565b6002546001600160a01b0316610595565b6104b861067e366004613e1a565b611dfc565b600e54610492565b610492600e5481565b6104b8611e5c565b6104b86106aa366004613e1a565b612466565b6104b86106bd366004613ec8565b6124dd565b610492600d5481565b600a54610595906001600160a01b031681565b600854610595906001600160a01b031681565b6104b8612565565b610492612576565b6104b861070f366004613e31565b612627565b61049260035481565b6104b861072b366004613ec8565b6126b5565b61049260125481565b610595610747366004613e1a565b612701565b61049260175481565b6104b8612729565b6104b861076b366004613e1a565b61277a565b601f54610595906001600160a01b031681565b6001546001600160a01b0316610595565b61049260045481565b6104b86107ab366004613e31565b6127da565b6105176107be366004613f22565b6128d6565b6104b86107d1366004613ee3565b6129cc565b6104b86107e4366004613f51565b612a64565b6104b86107f7366004613e1a565b612d27565b61049261080a366004613e1a565b612da9565b61049261081d366004613e1a565b612dc8565b6104b8610830366004613e1a565b612dd7565b610492612e59565b600954610595906001600160a01b031681565b610492612f43565b6104b8610866366004613ec8565b612f84565b610492600c5481565b61049261546081565b61049260195481565b6104b8610894366004613e1a565b612fb7565b610492613012565b610492601d5481565b610492601c5481565b6104b86108c1366004613e1a565b61303b565b6105176108d4366004613f22565b613099565b6104b86108e7366004613ec8565b613155565b6104926131a1565b61049260115481565b61049260155481565b600b54610595906001600160a01b031681565b61049260145481565b61049260185481565b61049260165481565b6104b8610942366004613ec8565b6132df565b61049260055481565b6002546001600160a01b031633146109835760405162461bcd60e51b815260040161097a90613fb1565b60405180910390fd5b600d548110156109e85760405162461bcd60e51b815260206004820152602a60248201527f5f7072656d69756d5468726573686f6c6420657863656564732062696c6c50726044820152696963654365696c696e6760b01b606482015260840161097a565b6105dc811115610a465760405162461bcd60e51b8152602060048201526024808201527f5f7072656d69756d5468726573686f6c6420697320686967686572207468616e60448201526320312e3560e01b606482015260840161097a565b601c55565b6002546001600160a01b03163314610a755760405162461bcd60e51b815260040161097a90613fb1565b600a8110158015610a8857506127108111155b610ae55760405162461bcd60e51b815260206004820152602860248201527f5f6d6178537570706c79457870616e73696f6e50657263656e743a206f7574206044820152676f662072616e676560c01b606482015260840161097a565b601155565b5f80610af4612f43565b9050600c548111610b9557601b545f03610b10575050600c5490565b5f610b3882610b32670de0b6b3a7640000600c5461335590919063ffffffff16565b90613367565b90505f610b63620186a0610b32601b54610b5d600c548761337290919063ffffffff16565b90613355565b600c54909150610b73908261337d565b93505f601954118015610b87575060195484115b15610b925760195493505b50505b5090565b5f80610ba3612f43565b9050600d54811115610b95575f610bcc6064610b32601c54600c5461335590919063ffffffff16565b9050808210610c2c575f610bf8620186a0610b32601d54610b5d600c548861337290919063ffffffff16565b600c54909150610c08908261337d565b93505f601a54118015610c1c5750601a5484115b15610b9257601a54935050505090565b600c549250505090565b435f9081526020818152604080832032845290915290205460ff1615610c6e5760405162461bcd60e51b815260040161097a90613ff5565b435f9081526020818152604080832033845290915290205460ff1615610ca65760405162461bcd60e51b815260040161097a90613ff5565b600354421015610cc85760405162461bcd60e51b815260040161097a9061403b565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610d0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d339190614072565b6001600160a01b0316148015610dba57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610d8b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610daf9190614072565b6001600160a01b0316145b8015610e3757506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610e08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2c9190614072565b6001600160a01b0316145b8015610eb45750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610e85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea99190614072565b6001600160a01b0316145b610ed05760405162461bcd60e51b815260040161097a9061408d565b5f8211610f365760405162461bcd60e51b815260206004820152602e60248201527f54726561737572793a2063616e6e6f742072656465656d20626f6e647320776960448201526d1d1a081e995c9bc8185b5bdd5b9d60921b606482015260840161097a565b5f610f3f612f43565b9050818114610f905760405162461bcd60e51b815260206004820152601a60248201527f54726561737572793a2042494c4c207072696365206d6f766564000000000000604482015260640161097a565b600d548111610fb15760405162461bcd60e51b815260040161097a906140c4565b5f610fba610b99565b90505f811161100b5760405162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e6420726174650000000000604482015260640161097a565b5f611022670de0b6b3a7640000610b328785613355565b6007546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561106d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110919190614116565b10156110ed5760405162461bcd60e51b815260206004820152602560248201527f54726561737572793a20747265617375727920686173206e6f206d6f726520626044820152641d5919d95d60da1b606482015260840161097a565b6111056110fc600e5483613388565b600e5490613372565b600e5560085460405163079cc67960e41b81526001600160a01b03909116906379cc67909061113a903390899060040161412d565b5f604051808303815f87803b158015611151575f80fd5b505af1158015611163573d5f803e3d5ffd5b505060075461117f92506001600160a01b03169050338361339d565b6111876133f3565b604080518281526020810187905233917f51e0d16595cabc591e64da08e45bb223577e5b9a39cd947b4ddc3472b2dd8878910160405180910390a25050435f908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055505050565b6002546001600160a01b0316331461122b5760405162461bcd60e51b815260040161097a90613fb1565b62030d4081111561127e5760405162461bcd60e51b815260206004820152601d60248201527f5f646973636f756e7450657263656e74206973206f7665722032303025000000604482015260640161097a565b601b55565b6002546001600160a01b031633146112ad5760405162461bcd60e51b815260040161097a90613fb1565b6001600160a01b0386166112d35760405162461bcd60e51b815260040161097a90614146565b613a988511156112f55760405162461bcd60e51b815260040161097a90614164565b6001600160a01b03841661131b5760405162461bcd60e51b815260040161097a90614146565b610dac83111561133d5760405162461bcd60e51b815260040161097a90614164565b6001600160a01b0382166113635760405162461bcd60e51b815260040161097a90614146565b61157c8111156113855760405162461bcd60e51b815260040161097a90614164565b601f80546001600160a01b03199081166001600160a01b039889161790915560209590955560218054861694871694909417909355602291909155602380549093169316929092179055602455565b6113dc613457565b6113e5816134b1565b50565b6002546001600160a01b031633146114125760405162461bcd60e51b815260040161097a90613fb1565b61141a612729565b565b5f80611426612f43565b9050600c548111610b95575f61143a6131a1565b90505f611459620186a0610b326015548561335590919063ffffffff16565b90505f60085f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114d09190614116565b905080821115611511575f6114e58383613372565b90505f6114fe670de0b6b3a7640000610b328489613355565b905061150c60055482613388565b965050505b5050505090565b6002546001600160a01b031633146115425760405162461bcd60e51b815260040161097a90613fb1565b62030d408111156115955760405162461bcd60e51b815260206004820152601c60248201527f5f7072656d69756d50657263656e74206973206f766572203230302500000000604482015260640161097a565b601d55565b6002546001600160a01b031633146115c45760405162461bcd60e51b815260040161097a90613fb1565b620186a081101580156115da575062030d408111155b6116385760405162461bcd60e51b815260206004820152602960248201527f5f6d696e74696e67466163746f72466f72506179696e67446562743a206f7574604482015268206f662072616e676560b81b606482015260840161097a565b601e55565b6002546001600160a01b031633146116675760405162461bcd60e51b815260040161097a90613fb1565b6007546001600160a01b03908116908416036116ae5760405162461bcd60e51b815260040161097a90602080825260049082015263189a5b1b60e21b604082015260600190565b6008546001600160a01b03908116908416036116f55760405162461bcd60e51b815260040161097a90602080825260049082015263189bdb9960e21b604082015260600190565b6009546001600160a01b039081169084160361173b5760405162461bcd60e51b8152602060048201526005602482015264736861726560d81b604482015260640161097a565b61174f6001600160a01b038416828461339d565b505050565b435f9081526020818152604080832032845290915290205460ff161561178c5760405162461bcd60e51b815260040161097a90613ff5565b435f9081526020818152604080832033845290915290205460ff16156117c45760405162461bcd60e51b815260040161097a90613ff5565b6003544210156117e65760405162461bcd60e51b815260040161097a9061403b565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa15801561182d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118519190614072565b6001600160a01b03161480156118d857506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156118a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118cd9190614072565b6001600160a01b0316145b801561195557506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611926573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194a9190614072565b6001600160a01b0316145b80156119d25750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156119a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c79190614072565b6001600160a01b0316145b6119ee5760405162461bcd60e51b815260040161097a9061408d565b5f8211611a565760405162461bcd60e51b815260206004820152603060248201527f54726561737572793a2063616e6e6f7420707572636861736520626f6e64732060448201526f1dda5d1a081e995c9bc8185b5bdd5b9d60821b606482015260840161097a565b5f611a5f612f43565b9050818114611ab05760405162461bcd60e51b815260206004820152601a60248201527f54726561737572793a2042494c4c207072696365206d6f766564000000000000604482015260640161097a565b600c548110611ad15760405162461bcd60e51b815260040161097a906140c4565b600554831115611b365760405162461bcd60e51b815260206004820152602a60248201527f54726561737572793a206e6f7420656e6f75676820626f6e64206c65667420746044820152696f20707572636861736560b01b606482015260840161097a565b5f611b3f610aea565b90505f8111611b905760405162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e6420726174650000000000604482015260640161097a565b5f611ba7670de0b6b3a7640000610b328785613355565b90505f611bb26131a1565b90505f611c338360085f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2d9190614116565b9061337d565b9050611c51620186a0610b326015548561335590919063ffffffff16565b811115611c965760405162461bcd60e51b81526020600482015260136024820152726f766572206d6178206465627420726174696f60681b604482015260640161097a565b60075460405163079cc67960e41b81526001600160a01b03909116906379cc679090611cc89033908b9060040161412d565b5f604051808303815f87803b158015611cdf575f80fd5b505af1158015611cf1573d5f803e3d5ffd5b50506008546040516340c10f1960e01b81526001600160a01b0390911692506340c10f199150611d27903390879060040161412d565b6020604051808303815f875af1158015611d43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d67919061418a565b50600554611d759088613372565b600555611d806133f3565b604080518881526020810185905233917f73017f1b70789e2e66759eeb3c7ec11f59e6eedb55d921cfaec5410dd42a4799910160405180910390a25050435f908152602081815260408083203284529091528082208054600160ff19918216811790925533845291909220805490911690911790555050505050565b6002546001600160a01b03163314611e265760405162461bcd60e51b815260040161097a90613fb1565b6103e88110158015611e3b5750620186a08111155b611e575760405162461bcd60e51b815260040161097a90614164565b601555565b435f9081526020818152604080832032845290915290205460ff1615611e945760405162461bcd60e51b815260040161097a90613ff5565b435f9081526020818152604080832033845290915290205460ff1615611ecc5760405162461bcd60e51b815260040161097a90613ff5565b600354421015611eee5760405162461bcd60e51b815260040161097a9061403b565b611ef6613012565b421015611f455760405162461bcd60e51b815260206004820152601860248201527f54726561737572793a206e6f74206f70656e6564207965740000000000000000604482015260640161097a565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611f8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fb09190614072565b6001600160a01b031614801561203757506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015612008573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061202c9190614072565b6001600160a01b0316145b80156120b457506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015612085573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a99190614072565b6001600160a01b0316145b80156121315750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015612102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121269190614072565b6001600160a01b0316145b61214d5760405162461bcd60e51b815260040161097a9061408d565b6121556133f3565b61215d612f43565b601855600e545f90612177906121716131a1565b90613372565b905060165460045410156121ae576121a96121a4620186a0610b326017548561335590919063ffffffff16565b613574565b6123eb565b600d5460185411156123eb57600854604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015612201573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122259190614116565b90505f61223f600c5460185461337290919063ffffffff16565b90505f805f6122576509184e72a000610b5d88613958565b905080841115612265578093505b612281620186a0610b326012548861335590919063ffffffff16565b600e54106122a65761229f670de0b6b3a7640000610b328887613355565b9150612313565b5f6122bd670de0b6b3a7640000610b328988613355565b90506122db620186a0610b326013548461335590919063ffffffff16565b92506122e78184613372565b601e54909450156123115761230e620186a0610b32601e548761335590919063ffffffff16565b93505b505b81156123225761232282613574565b82156123e557600e54612335908461337d565b600e556007546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061236a903090879060040161412d565b6020604051808303815f875af1158015612386573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123aa919061418a565b5060408051428152602081018590527ff705142bf09f04297640495ddf7c59b7fd6f51894c5aea9602d631cf05f0efc2910160405180910390a15b50505050505b506004546123fa90600161337d565b600455600d54612408612f43565b1161242757612422620186a0610b32601454610b5d6131a1565b612429565b5f5b600555435f908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6002546001600160a01b031633146124905760405162461bcd60e51b815260040161097a90613fb1565b600c5481101580156124bc57506124b86064610b326078600c5461335590919063ffffffff16565b8111155b6124d85760405162461bcd60e51b815260040161097a90614164565b600d55565b6002546001600160a01b031633146125075760405162461bcd60e51b815260040161097a90613fb1565b600a5460405163b3ab15fb60e01b81526001600160a01b0383811660048301529091169063b3ab15fb906024015b5f604051808303815f87803b15801561254c575f80fd5b505af115801561255e573d5f803e3d5ffd5b5050505050565b61256d613457565b61141a5f6139c4565b5f80612580612f43565b9050600d54811115610b95576007546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa1580156125d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125f69190614116565b90505f612601610b99565b90508015610b925761261f81610b3284670de0b6b3a7640000613355565b935050505090565b6002546001600160a01b031633146126515760405162461bcd60e51b815260040161097a90613fb1565b600a54604051632ffaaa0960e01b815260048101849052602481018390526001600160a01b0390911690632ffaaa09906044015f604051808303815f87803b15801561269b575f80fd5b505af11580156126ad573d5f803e3d5ffd5b505050505050565b6002546001600160a01b031633146126df5760405162461bcd60e51b815260040161097a90613fb1565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60068181548110612710575f80fd5b5f918252602090912001546001600160a01b0316905081565b612731613457565b6002546040515f916001600160a01b0316907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600280546001600160a01b0319169055565b6002546001600160a01b031633146127a45760405162461bcd60e51b815260040161097a90613fb1565b6101f481101580156127b95750620186a08111155b6127d55760405162461bcd60e51b815260040161097a90614164565b601255565b6002546001600160a01b031633146128045760405162461bcd60e51b815260040161097a90613fb1565b60788211156128555760405162461bcd60e51b815260206004820152601e60248201527f5f626f6f74737472617045706f6368733a206f7574206f662072616e67650000604482015260640161097a565b6064811015801561286857506127108111155b6128cb5760405162461bcd60e51b815260206004820152602e60248201527f5f626f6f747374726170537570706c79457870616e73696f6e50657263656e7460448201526d3a206f7574206f662072616e676560901b606482015260840161097a565b601691909155601755565b6002545f906001600160a01b031633146129025760405162461bcd60e51b815260040161097a90613fb1565b60078360ff16106129255760405162461bcd60e51b815260040161097a906141a9565b60ff83161561296157600f61293b600185614206565b60ff168154811061294e5761294e61421f565b905f5260205f2001548211612961575f80fd5b60068360ff1610156129a057600f61297a846001614233565b60ff168154811061298d5761298d61421f565b905f5260205f20015482106129a0575f80fd5b81600f8460ff16815481106129b7576129b761421f565b5f918252602090912001555060015b92915050565b6002546001600160a01b031633146129f65760405162461bcd60e51b815260040161097a90613fb1565b600a54604051631515d6bd60e21b81526001600160a01b038581166004830152602482018590528381166044830152909116906354575af4906064015f604051808303815f87803b158015612a49575f80fd5b505af1158015612a5b573d5f803e3d5ffd5b50505050505050565b600254600160a01b900460ff1615612abe5760405162461bcd60e51b815260206004820152601d60248201527f54726561737572793a20616c726561647920696e697469616c697a6564000000604482015260640161097a565b6002546001600160a01b03163314612ae85760405162461bcd60e51b815260040161097a90613fb1565b600780546001600160a01b03199081166001600160a01b0389811691909117909255600880548216888416179055600980548216878416179055600b80548216868416179055600a80549091169184169190911790556003819055670de0b6b3a7640000600c819055612b6390606490610b32906065613355565b600d556040805160e0810182525f8152697f0e10af47c1c70000006020820152699ed194db19b238c000009181019190915269d3c21bcecceda1000000606082015269fe1c215e8f838e00000060808201526a013da329b633647180000060a08201526a01a784379d99db4200000060c0820152612be590600f906007613d74565b506040805160e081018252606e8152605a602082015260509181019190915260466060820152603c6080820152603260a0820152601460c0820152612c2e906010906007613dc8565b5060966011819055620186a06012556188b8601381905561271060145560155561044c601c5562011170601d55600c6016556017556007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612ca9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ccd9190614116565b600e556002805460ff60a01b1916600160a01b17905560405133907f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce7990612d179043815260200190565b60405180910390a2505050505050565b6002546001600160a01b03163314612d515760405162461bcd60e51b815260040161097a90613fb1565b62030d40811115612da45760405162461bcd60e51b815260206004820152601d60248201527f5f6d6178446973636f756e7452617465206973206f7665722032303025000000604482015260640161097a565b601955565b600f8181548110612db8575f80fd5b5f91825260209091200154905081565b60108181548110612db8575f80fd5b6002546001600160a01b03163314612e015760405162461bcd60e51b815260040161097a90613fb1565b62030d40811115612e545760405162461bcd60e51b815260206004820152601c60248201527f5f6d61785072656d69756d52617465206973206f766572203230302500000000604482015260640161097a565b601a55565b600b54600754604051630d01142560e31b81525f926001600160a01b0390811692636808a12892612e9a9290911690670de0b6b3a76400009060040161412d565b602060405180830381865afa925050508015612ed3575060408051601f3d908101601f19168201909252612ed091810190614116565b60015b612f3e5760405162461bcd60e51b815260206004820152603660248201527f54726561737572793a206661696c656420746f20636f6e73756c742042494c4c6044820152752070726963652066726f6d20746865206f7261636c6560501b606482015260840161097a565b919050565b600b54600754604051633ddac95360e01b81525f926001600160a01b0390811692633ddac95392612e9a9290911690670de0b6b3a76400009060040161412d565b6002546001600160a01b03163314612fae5760405162461bcd60e51b815260040161097a90613fb1565b6113e5816113d4565b6002546001600160a01b03163314612fe15760405162461bcd60e51b815260040161097a90613fb1565b600a546040516397ffe1d760e01b8152600481018390526001600160a01b03909116906397ffe1d790602401612535565b5f61303661302d61546060045461335590919063ffffffff16565b6003549061337d565b905090565b6002546001600160a01b031633146130655760405162461bcd60e51b815260040161097a90613fb1565b606481101580156130785750613a988111155b6130945760405162461bcd60e51b815260040161097a90614164565b601455565b6002545f906001600160a01b031633146130c55760405162461bcd60e51b815260040161097a90613fb1565b60078360ff16106130e85760405162461bcd60e51b815260040161097a906141a9565b600a82101580156130fb57506127108211155b61313e5760405162461bcd60e51b81526020600482015260146024820152735f76616c75653a206f7574206f662072616e676560601b604482015260640161097a565b8160108460ff16815481106129b7576129b761421f565b6002546001600160a01b0316331461317f5760405162461bcd60e51b815260040161097a90613fb1565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600754604080516318160ddd60e01b815290515f926001600160a01b031691839183916318160ddd9160048083019260209291908290030181865afa1580156131ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132109190614116565b90505f805b60065460ff821610156132d4576132c2846001600160a01b03166370a0823160068460ff168154811061324a5761324a61421f565b5f9182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa158015613297573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132bb9190614116565b839061337d565b91506132cd8161424c565b9050613215565b5061261f8282613372565b6132e7613457565b6001600160a01b03811661334c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097a565b6113e5816139c4565b5f613360828461426a565b9392505050565b5f6133608284614281565b5f61336082846142a0565b5f61336082846142b3565b5f8183106133965781613360565b5090919050565b61174f8363a9059cbb60e01b84846040516024016133bc92919061412d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a15565b600b5f9054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561343f575f80fd5b505af1925050508015613450575060015b1561141a57565b6001546001600160a01b0316331461141a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161097a565b6001600160a01b03811661351d5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b606482015260840161097a565b6040516001600160a01b038216905f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906135a6903090859060040161412d565b6020604051808303815f875af11580156135c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135e6919061418a565b506020545f90156136c05761360d620186a0610b326020548561335590919063ffffffff16565b600754601f5460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb92613645921690859060040161412d565b6020604051808303815f875af1158015613661573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613685919061418a565b5060408051428152602081018390527fcb3f34aaa3445b461e6da5492dc89e5c257a59fa598131f3b6bbc97a3638e409910160405180910390a15b6022545f9015613799576136e6620186a0610b326022548661335590919063ffffffff16565b60075460215460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb9261371e921690859060040161412d565b6020604051808303815f875af115801561373a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061375e919061418a565b5060408051428152602081018390527fdc8b715b18523e58b7fd0da53259dfa91efd91df4a854d94b136e3333a3b9395910160405180910390a15b6024545f9015613872576137bf620186a0610b326024548761335590919063ffffffff16565b60075460235460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926137f7921690859060040161412d565b6020604051808303815f875af1158015613813573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613837919061418a565b5060408051428152602081018390527f2dfe5937647c787f9c6bddefedb6b3273b627227b0493e9a83b5441fb11ee00c910160405180910390a15b6138828161217184818888613372565b600a546007549195506138a2916001600160a01b0390811691165f613ae8565b600a546007546138bf916001600160a01b03918216911686613ae8565b600a546040516397ffe1d760e01b8152600481018690526001600160a01b03909116906397ffe1d7906024015f604051808303815f87803b158015613902575f80fd5b505af1158015613914573d5f803e3d5ffd5b505060408051428152602081018890527fa72fa2f263b243b0f0e1fec5f3d49d33de573d15929b6b730c6b8ab3838c1c4d935001905060405180910390a150505050565b5f60065b600f8160ff16815481106139725761397261421f565b905f5260205f20015483106139aa5760108160ff16815481106139975761399761421f565b5f918252602090912001546011556139ba565b6139b3816142c6565b905061395c565b5050601154919050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f613a69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613bea9092919063ffffffff16565b905080515f1480613a89575080806020019051810190613a89919061418a565b61174f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161097a565b801580613b605750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613b3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b5e9190614116565b155b613bcb5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161097a565b61174f8363095ea7b360e01b84846040516024016133bc92919061412d565b6060613bf884845f85613c00565b949350505050565b606082471015613c615760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161097a565b5f80866001600160a01b03168587604051613c7c91906142e1565b5f6040518083038185875af1925050503d805f8114613cb6576040519150601f19603f3d011682016040523d82523d5f602084013e613cbb565b606091505b5091509150613ccc87838387613cd7565b979650505050505050565b60608315613d455782515f03613d3e576001600160a01b0385163b613d3e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161097a565b5081613bf8565b613bf88383815115613d5a5781518083602001fd5b8060405162461bcd60e51b815260040161097a91906142f7565b828054828255905f5260205f20908101928215613dbc579160200282015b82811115613dbc57825182906affffffffffffffffffffff16905591602001919060010190613d92565b50610b95929150613e06565b828054828255905f5260205f20908101928215613dbc579160200282015b82811115613dbc578251829060ff16905591602001919060010190613de6565b5b80821115610b95575f8155600101613e07565b5f60208284031215613e2a575f80fd5b5035919050565b5f8060408385031215613e42575f80fd5b50508035926020909101359150565b6001600160a01b03811681146113e5575f80fd5b5f805f805f8060c08789031215613e7a575f80fd5b8635613e8581613e51565b9550602087013594506040870135613e9c81613e51565b9350606087013592506080870135613eb381613e51565b9598949750929591949360a090920135925050565b5f60208284031215613ed8575f80fd5b813561336081613e51565b5f805f60608486031215613ef5575f80fd5b8335613f0081613e51565b9250602084013591506040840135613f1781613e51565b809150509250925092565b5f8060408385031215613f33575f80fd5b823560ff81168114613f43575f80fd5b946020939093013593505050565b5f805f805f8060c08789031215613f66575f80fd5b8635613f7181613e51565b95506020870135613f8181613e51565b94506040870135613f9181613e51565b93506060870135613fa181613e51565b92506080870135613eb381613e51565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b60208082526026908201527f436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756040820152653731ba34b7b760d11b606082015260800190565b60208082526019908201527f54726561737572793a206e6f7420737461727465642079657400000000000000604082015260600190565b5f60208284031215614082575f80fd5b815161336081613e51565b6020808252601e908201527f54726561737572793a206e656564206d6f7265207065726d697373696f6e0000604082015260600190565b60208082526032908201527f54726561737572793a2062696c6c5072696365206e6f7420656c696769626c6560408201527120666f7220626f6e6420707572636861736560701b606082015260800190565b5f60208284031215614126575f80fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252600490820152637a65726f60e01b604082015260600190565b6020808252600c908201526b6f7574206f662072616e676560a01b604082015260600190565b5f6020828403121561419a575f80fd5b81518015158114613360575f80fd5b60208082526029908201527f496e6465782068617320746f206265206c6f776572207468616e20636f756e74604082015268206f6620746965727360b81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b60ff82811682821603908111156129c6576129c66141f2565b634e487b7160e01b5f52603260045260245ffd5b60ff81811683821601908111156129c6576129c66141f2565b5f60ff821660ff8103614261576142616141f2565b60010192915050565b80820281158282048414176129c6576129c66141f2565b5f8261429b57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156129c6576129c66141f2565b808201808211156129c6576129c66141f2565b5f60ff8216806142d8576142d86141f2565b5f190192915050565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212205489d47ec4ab8e8a9a97029b7cc3a9b30cb2e012cbd9a3ed991b6f8dd4e6d3d664736f6c634300081a0033
Deployed Bytecode Sourcemap
52933:23934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55111:35;;;;;;;;;160:25:1;;;148:2;133:18;55111:35:0;;;;;;;;67506:321;;;;;;:::i;:::-;;:::i;:::-;;63184;;;;;;:::i;:::-;;:::i;59154:731::-;;;:::i;59893:781::-;;;:::i;70349:1091::-;;;;;;:::i;:::-;;:::i;67290:208::-;;;;;;:::i;:::-;;:::i;53311:31::-;;;;;-1:-1:-1;;;53311:31:0;;;;;;;;;943:14:1;;936:22;918:41;;906:2;891:18;53311:31:0;778:187:1;65987:869:0;;;;;;:::i;:::-;;:::i;53183:46::-;;53223:6;53183:46;;54199:47;;;;;;51689:115;;;;;;:::i;:::-;;:::i;54749:30::-;;;;;;62585:88;;;:::i;57982:730::-;;;:::i;54689:29::-;;;;;;53755:19;;;;;-1:-1:-1;;;;;53755:19:0;;;;;;-1:-1:-1;;;;;2419:32:1;;;2401:51;;2389:2;2374:18;53755:19:0;2255:203:1;57004:89:0;57074:11;;-1:-1:-1;;;57074:11:0;;;;57004:89;;54860:41;;;;;;67835:202;;;;;;:::i;:::-;;:::i;55082:22::-;;;;;-1:-1:-1;;;;;55082:22:0;;;51581:100;51664:9;;-1:-1:-1;;;;;51664:9:0;682:10;51648:25;51581:100;;68045:339;;;;;;:::i;:::-;;:::i;55183:36::-;;;;;;75715:419;;;;;;:::i;:::-;;:::i;55153:23::-;;;;;-1:-1:-1;;;;;55153:23:0;;;69026:1315;;;;;;:::i;:::-;;:::i;54977:35::-;;;;;;51353:85;51421:9;;-1:-1:-1;;;;;51421:9:0;51353:85;;65129:264;;;;;;:::i;:::-;;:::i;57880:94::-;57950:16;;57880:94;;53987:31;;;;;;73266:2302;;;:::i;62903:273::-;;;;;;:::i;:::-;;:::i;76142:128::-;;;;;;:::i;:::-;;:::i;53947:31::-;;;;;;53836:22;;;;;-1:-1:-1;;;;;53836:22:0;;;53781:19;;;;;-1:-1:-1;;;;;53781:19:0;;;25471:103;;;:::i;58720:426::-;;;:::i;76278:198::-;;;;;;:::i;:::-;;:::i;53365:24::-;;;;;;62786:109;;;;;;:::i;:::-;;:::i;54152:40::-;;;;;;53585:137;;;;;;:::i;:::-;;:::i;54462:46::-;;;;;;52077:145;;;:::i;64508:301::-;;;;;;:::i;:::-;;:::i;54948:22::-;;;;;-1:-1:-1;;;;;54948:22:0;;;24830:87;24903:6;;-1:-1:-1;;;;;24903:6:0;24830:87;;53396:24;;;;;;65401:502;;;;;;:::i;:::-;;:::i;63593:492::-;;;;;;:::i;:::-;;:::i;76630:234::-;;;;;;:::i;:::-;;:::i;60728:1733::-;;;;;;:::i;:::-;;:::i;66864:208::-;;;;;;:::i;:::-;;:::i;54027:28::-;;;;;;:::i;:::-;;:::i;54062:34::-;;;;;;:::i;:::-;;:::i;67080:202::-;;;;;;:::i;:::-;;:::i;57556:301::-;;;:::i;53807:20::-;;;;;-1:-1:-1;;;;;53807:20:0;;;57252:296;;;:::i;62469:108::-;;;;;;:::i;:::-;;:::i;53913:27::-;;;;;;53136:40;;53169:7;53136:40;;54628:30;;;;;;76484:138;;;;;;:::i;:::-;;:::i;57115:114::-;;;:::i;54824:29::-;;;;;;54786:31;;;;;;64817:304;;;;;;:::i;:::-;;:::i;64093:407::-;;;;;;:::i;:::-;;:::i;62681:97::-;;;;;;:::i;:::-;;:::i;68552:466::-;;;:::i;54105:40::-;;;;;;54302:34;;;;;;53865:25;;;;;-1:-1:-1;;;;;53865:25:0;;;54253:42;;;;;;54584:37;;;;;;54425:30;;;;;;25729:201;;;;;;:::i;:::-;;:::i;53427:45::-;;;;;;67506:321;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;;;;;;;;;67624:16:::1;;67603:17;:37;;67595:92;;;::::0;-1:-1:-1;;;67595:92:0;;5444:2:1;67595:92:0::1;::::0;::::1;5426:21:1::0;5483:2;5463:18;;;5456:30;5522:34;5502:18;;;5495:62;-1:-1:-1;;;5573:18:1;;;5566:40;5623:19;;67595:92:0::1;5242:406:1::0;67595:92:0::1;67727:4;67706:17;:25;;67698:74;;;::::0;-1:-1:-1;;;67698:74:0;;5855:2:1;67698:74:0::1;::::0;::::1;5837:21:1::0;5894:2;5874:18;;;5867:30;5933:34;5913:18;;;5906:62;-1:-1:-1;;;5984:18:1;;;5977:34;6028:19;;67698:74:0::1;5653:400:1::0;67698:74:0::1;67783:16;:36:::0;67506:321::o;63184:::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;63330:2:::1;63300:26;:32;;:71;;;;;63366:5;63336:26;:35;;63300:71;63292:124;;;::::0;-1:-1:-1;;;63292:124:0;;6260:2:1;63292:124:0::1;::::0;::::1;6242:21:1::0;6299:2;6279:18;;;6272:30;6338:34;6318:18;;;6311:62;-1:-1:-1;;;6389:18:1;;;6382:38;6437:19;;63292:124:0::1;6058:404:1::0;63292:124:0::1;63443:25;:54:::0;63184:321::o;59154:731::-;59206:13;59232:18;59253:14;:12;:14::i;:::-;59232:35;;59296:12;;59282:10;:26;59278:600;;59329:15;;59348:1;59329:20;59325:542;;-1:-1:-1;;59410:12:0;;;59154:731::o;59325:542::-;59463:19;59485:38;59512:10;59485:22;59502:4;59485:12;;:16;;:22;;;;:::i;:::-;:26;;:38::i;:::-;59463:60;;59560:23;59586:69;53223:6;59586:50;59620:15;;59586:29;59602:12;;59586:11;:15;;:29;;;;:::i;:::-;:33;;:50::i;:69::-;59682:12;;59560:95;;-1:-1:-1;59682:33:0;;59560:95;59682:16;:33::i;:::-;59674:41;;59756:1;59738:15;;:19;:46;;;;;59769:15;;59761:5;:23;59738:46;59734:118;;;59817:15;;59809:23;;59734:118;59444:423;;59325:542;59221:664;59154:731;:::o;59893:781::-;59944:13;59970:18;59991:14;:12;:14::i;:::-;59970:35;;60033:16;;60020:10;:29;60016:651;;;60066:34;60103:43;60142:3;60103:34;60120:16;;60103:12;;:16;;:34;;;;:::i;:43::-;60066:80;;60179:26;60165:10;:40;60161:495;;60258:22;60283:67;53223:6;60283:48;60316:14;;60283:28;60298:12;;60283:10;:14;;:28;;;;:::i;:67::-;60377:12;;60258:92;;-1:-1:-1;60377:32:0;;60258:92;60377:16;:32::i;:::-;60369:40;;60449:1;60432:14;;:18;:44;;;;;60462:14;;60454:5;:22;60432:44;60428:115;;;60509:14;;60501:22;;60207:351;60051:616;59959:715;59893:781;:::o;60161:495::-;60628:12;;60620:20;;60051:616;59959:715;59893:781;:::o;70349:1091::-;52421:12;52389:4;52413:21;;;;;;;;;;;52435:9;52413:32;;;;;;;;;;52638:29;52630:80;;;;-1:-1:-1;;;52630:80:0;;;;;;;:::i;:::-;52554:12;52522:4;52546:21;;;;;;;;;;;52568:10;52546:33;;;;;;;;;;52729:29;52721:80;;;;-1:-1:-1;;;52721:80:0;;;;;;;:::i;:::-;56048:9:::1;;56029:15;:28;;56021:66;;;;-1:-1:-1::0;;;56021:66:0::1;;;;;;;:::i;:::-;56515:4:::2;::::0;56503:28:::2;::::0;;-1:-1:-1;;;56503:28:0;;;;56543:4:::2;::::0;-1:-1:-1;;;;;56515:4:0::2;::::0;56503:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;56515:4;56503:28:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56503:45:0::2;;:111;;;;-1:-1:-1::0;56581:4:0::2;::::0;56569:28:::2;::::0;;-1:-1:-1;;;56569:28:0;;;;56609:4:::2;::::0;-1:-1:-1;;;;;56581:4:0::2;::::0;56569:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;56581:4;56569:28:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56569:45:0::2;;56503:111;:178;;;;-1:-1:-1::0;56647:5:0::2;::::0;56635:29:::2;::::0;;-1:-1:-1;;;56635:29:0;;;;56676:4:::2;::::0;-1:-1:-1;;;;;56647:5:0::2;::::0;56635:27:::2;::::0;:29:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;56647:5;56635:29:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56635:46:0::2;;56503:178;:244;;;;-1:-1:-1::0;56711:7:0::2;::::0;56702:28:::2;::::0;;-1:-1:-1;;;56702:28:0;;;;56742:4:::2;::::0;-1:-1:-1;;;;;56711:7:0::2;::::0;56702:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;56711:7;56702:28:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56702:45:0::2;;56503:244;56477:328;;;;-1:-1:-1::0;;;56477:328:0::2;;;;;;;:::i;:::-;70496:1:::3;70482:11;:15;70474:74;;;::::0;-1:-1:-1;;;70474:74:0;;8045:2:1;70474:74:0::3;::::0;::::3;8027:21:1::0;8084:2;8064:18;;;8057:30;8123:34;8103:18;;;8096:62;-1:-1:-1;;;8174:18:1;;;8167:44;8228:19;;70474:74:0::3;7843:410:1::0;70474:74:0::3;70561:17;70581:14;:12;:14::i;:::-;70561:34;;70627:11;70614:9;:24;70606:63;;;::::0;-1:-1:-1;;;70606:63:0;;8460:2:1;70606:63:0::3;::::0;::::3;8442:21:1::0;8499:2;8479:18;;;8472:30;8538:28;8518:18;;;8511:56;8584:18;;70606:63:0::3;8258:350:1::0;70606:63:0::3;70714:16;;70702:9;:28;70680:145;;;;-1:-1:-1::0;;;70680:145:0::3;;;;;;;:::i;:::-;70838:13;70854:20;:18;:20::i;:::-;70838:36;;70901:1;70893:5;:9;70885:49;;;::::0;-1:-1:-1;;;70885:49:0;;9234:2:1;70885:49:0::3;::::0;::::3;9216:21:1::0;9273:2;9253:18;;;9246:30;9312:29;9292:18;;;9285:57;9359:18;;70885:49:0::3;9032:351:1::0;70885:49:0::3;70947:19;70969:32;70996:4;70969:22;:11:::0;70985:5;70969:15:::3;:22::i;:32::-;71027:4;::::0;71020:37:::3;::::0;-1:-1:-1;;;71020:37:0;;71051:4:::3;71020:37;::::0;::::3;2401:51:1::0;70947:54:0;;-1:-1:-1;70947:54:0;;-1:-1:-1;;;;;71027:4:0;;::::3;::::0;71020:22:::3;::::0;2374:18:1;;71020:37:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;71012:102;;;::::0;-1:-1:-1;;;71012:102:0;;9779:2:1;71012:102:0::3;::::0;::::3;9761:21:1::0;9818:2;9798:18;;;9791:30;9857:34;9837:18;;;9830:62;-1:-1:-1;;;9908:18:1;;;9901:35;9953:19;;71012:102:0::3;9577:401:1::0;71012:102:0::3;71146:61;71167:39;71176:16;;71194:11;71167:8;:39::i;:::-;71146:16;::::0;;:20:::3;:61::i;:::-;71127:16;:80:::0;71232:4:::3;::::0;71220:51:::3;::::0;-1:-1:-1;;;71220:51:0;;-1:-1:-1;;;;;71232:4:0;;::::3;::::0;71220:26:::3;::::0;:51:::3;::::0;71247:10:::3;::::0;71259:11;;71220:51:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;71289:4:0::3;::::0;71282:50:::3;::::0;-1:-1:-1;;;;;;71289:4:0::3;::::0;-1:-1:-1;71308:10:0::3;71320:11:::0;71282:25:::3;:50::i;:::-;71345:18;:16;:18::i;:::-;71381:51;::::0;;10436:25:1;;;10492:2;10477:18;;10470:34;;;71395:10:0::3;::::0;71381:51:::3;::::0;10409:18:1;71381:51:0::3;;;;;;;-1:-1:-1::0;;52836:12:0;52828:7;:21;;;;;;;;;;;52850:9;52828:32;;;;;;;;:39;;52863:4;-1:-1:-1;;52828:39:0;;;;;;;;52900:10;52878:33;;;;;;:40;;;;;;;;;;-1:-1:-1;;;70349:1091:0:o;67290:208::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;67405:6:::1;67385:16;:26;;67377:68;;;::::0;-1:-1:-1;;;67377:68:0;;10717:2:1;67377:68:0::1;::::0;::::1;10699:21:1::0;10756:2;10736:18;;;10729:30;10795:31;10775:18;;;10768:59;10844:18;;67377:68:0::1;10515:353:1::0;67377:68:0::1;67456:15;:34:::0;67290:208::o;65987:869::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66261:22:0;::::1;66253:39;;;;-1:-1:-1::0;;;66253:39:0::1;;;;;;;:::i;:::-;66336:5;66311:21;:30;;66303:55;;;;-1:-1:-1::0;;;66303:55:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66377:22:0;::::1;66369:39;;;;-1:-1:-1::0;;;66369:39:0::1;;;;;;;:::i;:::-;66452:4;66427:21;:29;;66419:54;;;;-1:-1:-1::0;;;66419:54:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66492:23:0;::::1;66484:40;;;;-1:-1:-1::0;;;66484:40:0::1;;;;;;;:::i;:::-;66569:4;66543:22;:30;;66535:55;;;;-1:-1:-1::0;;;66535:55:0::1;;;;;;;:::i;:::-;66603:7;:18:::0;;-1:-1:-1;;;;;;66603:18:0;;::::1;-1:-1:-1::0;;;;;66603:18:0;;::::1;;::::0;;;66632:20:::1;:44:::0;;;;66687:7:::1;:18:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;66716:20:::1;:44:::0;;;;66771:8:::1;:20:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;66802:21:::1;:46:::0;65987:869::o;51689:115::-;24716:13;:11;:13::i;:::-;51765:31:::1;51783:12;51765:17;:31::i;:::-;51689:115:::0;:::o;62585:88::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;62646:19:::1;:17;:19::i;:::-;62585:88::o:0;57982:730::-;58034:25;58072:18;58093:14;:12;:14::i;:::-;58072:35;;58136:12;;58122:10;:26;58118:587;;58165:19;58187:26;:24;:26::i;:::-;58165:48;;58228:22;58253:55;53223:6;58253:36;58269:19;;58253:11;:15;;:36;;;;:::i;:55::-;58228:80;;58323:19;58352:4;;;;;;;;;-1:-1:-1;;;;;58352:4:0;-1:-1:-1;;;;;58345:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58323:48;;58407:11;58390:14;:28;58386:308;;;58439:24;58466:31;:14;58485:11;58466:18;:31::i;:::-;58439:58;-1:-1:-1;58516:24:0;58543:42;58580:4;58543:32;58439:58;58564:10;58543:20;:32::i;:42::-;58516:69;;58624:54;58633:26;;58661:16;58624:8;:54::i;:::-;58604:74;;58420:274;;58386:308;58150:555;;;58061:651;57982:730;:::o;67835:202::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;67947:6:::1;67928:15;:25;;67920:66;;;::::0;-1:-1:-1;;;67920:66:0;;11748:2:1;67920:66:0::1;::::0;::::1;11730:21:1::0;11787:2;11767:18;;;11760:30;11826;11806:18;;;11799:58;11874:18;;67920:66:0::1;11546:352:1::0;67920:66:0::1;67997:14;:32:::0;67835:202::o;68045:339::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;53223:6:::1;68162:27;:44;;:85;;;;;68241:6;68210:27;:37;;68162:85;68154:139;;;::::0;-1:-1:-1;;;68154:139:0;;12105:2:1;68154:139:0::1;::::0;::::1;12087:21:1::0;12144:2;12124:18;;;12117:30;12183:34;12163:18;;;12156:62;-1:-1:-1;;;12234:18:1;;;12227:39;12283:19;;68154:139:0::1;11903:405:1::0;68154:139:0::1;68320:26;:56:::0;68045:339::o;75715:419::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;75946:4:::1;::::0;-1:-1:-1;;;;;75946:4:0;;::::1;75919:32:::0;;::::1;::::0;75911:49:::1;;;;-1:-1:-1::0;;;75911:49:0::1;;;;;;12515:2:1::0;12497:21;;;12554:1;12534:18;;;12527:29;-1:-1:-1;;;12587:2:1;12572:18;;12565:34;12631:2;12616:18;;12313:327;75911:49:0::1;76006:4;::::0;-1:-1:-1;;;;;76006:4:0;;::::1;75979:32:::0;;::::1;::::0;75971:49:::1;;;;-1:-1:-1::0;;;75971:49:0::1;;;;;;12847:2:1::0;12829:21;;;12886:1;12866:18;;;12859:29;-1:-1:-1;;;12919:2:1;12904:18;;12897:34;12963:2;12948:18;;12645:327;75971:49:0::1;76066:5;::::0;-1:-1:-1;;;;;76066:5:0;;::::1;76039:33:::0;;::::1;::::0;76031:51:::1;;;::::0;-1:-1:-1;;;76031:51:0;;13179:2:1;76031:51:0::1;::::0;::::1;13161:21:1::0;13218:1;13198:18;;;13191:29;-1:-1:-1;;;13236:18:1;;;13229:35;13281:18;;76031:51:0::1;12977:328:1::0;76031:51:0::1;76093:33;-1:-1:-1::0;;;;;76093:19:0;::::1;76113:3:::0;76118:7;76093:19:::1;:33::i;:::-;75715:419:::0;;;:::o;69026:1315::-;52421:12;52389:4;52413:21;;;;;;;;;;;52435:9;52413:32;;;;;;;;;;52638:29;52630:80;;;;-1:-1:-1;;;52630:80:0;;;;;;;:::i;:::-;52554:12;52522:4;52546:21;;;;;;;;;;;52568:10;52546:33;;;;;;;;;;52729:29;52721:80;;;;-1:-1:-1;;;52721:80:0;;;;;;;:::i;:::-;56048:9:::1;;56029:15;:28;;56021:66;;;;-1:-1:-1::0;;;56021:66:0::1;;;;;;;:::i;:::-;56515:4:::2;::::0;56503:28:::2;::::0;;-1:-1:-1;;;56503:28:0;;;;56543:4:::2;::::0;-1:-1:-1;;;;;56515:4:0::2;::::0;56503:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;56515:4;56503:28:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56503:45:0::2;;:111;;;;-1:-1:-1::0;56581:4:0::2;::::0;56569:28:::2;::::0;;-1:-1:-1;;;56569:28:0;;;;56609:4:::2;::::0;-1:-1:-1;;;;;56581:4:0::2;::::0;56569:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;56581:4;56569:28:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56569:45:0::2;;56503:111;:178;;;;-1:-1:-1::0;56647:5:0::2;::::0;56635:29:::2;::::0;;-1:-1:-1;;;56635:29:0;;;;56676:4:::2;::::0;-1:-1:-1;;;;;56647:5:0::2;::::0;56635:27:::2;::::0;:29:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;56647:5;56635:29:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56635:46:0::2;;56503:178;:244;;;;-1:-1:-1::0;56711:7:0::2;::::0;56702:28:::2;::::0;;-1:-1:-1;;;56702:28:0;;;;56742:4:::2;::::0;-1:-1:-1;;;;;56711:7:0::2;::::0;56702:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;56711:7;56702:28:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56702:45:0::2;;56503:244;56477:328;;;;-1:-1:-1::0;;;56477:328:0::2;;;;;;;:::i;:::-;69170:1:::3;69156:11;:15;69148:76;;;::::0;-1:-1:-1;;;69148:76:0;;13512:2:1;69148:76:0::3;::::0;::::3;13494:21:1::0;13551:2;13531:18;;;13524:30;13590:34;13570:18;;;13563:62;-1:-1:-1;;;13641:18:1;;;13634:46;13697:19;;69148:76:0::3;13310:412:1::0;69148:76:0::3;69237:17;69257:14;:12;:14::i;:::-;69237:34;;69303:11;69290:9;:24;69282:63;;;::::0;-1:-1:-1;;;69282:63:0;;8460:2:1;69282:63:0::3;::::0;::::3;8442:21:1::0;8499:2;8479:18;;;8472:30;8538:28;8518:18;;;8511:56;8584:18;;69282:63:0::3;8258:350:1::0;69282:63:0::3;69390:12;;69378:9;:24;69356:138;;;;-1:-1:-1::0;;;69356:138:0::3;;;;;;;:::i;:::-;69530:26;;69515:11;:41;;69507:96;;;::::0;-1:-1:-1;;;69507:96:0;;13929:2:1;69507:96:0::3;::::0;::::3;13911:21:1::0;13968:2;13948:18;;;13941:30;14007:34;13987:18;;;13980:62;-1:-1:-1;;;14058:18:1;;;14051:40;14108:19;;69507:96:0::3;13727:406:1::0;69507:96:0::3;69616:13;69632:21;:19;:21::i;:::-;69616:37;;69680:1;69672:5;:9;69664:49;;;::::0;-1:-1:-1;;;69664:49:0;;9234:2:1;69664:49:0::3;::::0;::::3;9216:21:1::0;9273:2;9253:18;;;9246:30;9312:29;9292:18;;;9285:57;9359:18;;69664:49:0::3;9032:351:1::0;69664:49:0::3;69726:19;69748:32;69775:4;69748:22;:11:::0;69764:5;69748:15:::3;:22::i;:32::-;69726:54;;69791:18;69812:26;:24;:26::i;:::-;69791:47;;69849:21;69873:43;69904:11;69880:4;;;;;;;;;-1:-1:-1::0;;;;;69880:4:0::3;-1:-1:-1::0;;;;;69873:24:0::3;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30:::0;::::3;:43::i;:::-;69849:67;;69952:54;53223:6;69952:35;69967:19;;69952:10;:14;;:35;;;;:::i;:54::-;69935:13;:71;;69927:103;;;::::0;-1:-1:-1;;;69927:103:0;;14340:2:1;69927:103:0::3;::::0;::::3;14322:21:1::0;14379:2;14359:18;;;14352:30;-1:-1:-1;;;14398:18:1;;;14391:49;14457:18;;69927:103:0::3;14138:343:1::0;69927:103:0::3;70055:4;::::0;70043:51:::3;::::0;-1:-1:-1;;;70043:51:0;;-1:-1:-1;;;;;70055:4:0;;::::3;::::0;70043:26:::3;::::0;:51:::3;::::0;70070:10:::3;::::0;70082:11;;70043:51:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;70117:4:0::3;::::0;70105:47:::3;::::0;-1:-1:-1;;;70105:47:0;;-1:-1:-1;;;;;70117:4:0;;::::3;::::0;-1:-1:-1;70105:22:0::3;::::0;-1:-1:-1;70105:47:0::3;::::0;70128:10:::3;::::0;70140:11;;70105:47:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;70194:26:0::3;::::0;:43:::3;::::0;70225:11;70194:30:::3;:43::i;:::-;70165:26;:72:::0;70248:18:::3;:16;:18::i;:::-;70284:49;::::0;;10436:25:1;;;10492:2;10477:18;;10470:34;;;70296:10:0::3;::::0;70284:49:::3;::::0;10409:18:1;70284:49:0::3;;;;;;;-1:-1:-1::0;;52836:12:0;52828:7;:21;;;;;;;;;;;52850:9;52828:32;;;;;;;;:39;;52863:4;-1:-1:-1;;52828:39:0;;;;;;;;52900:10;52878:33;;;;;;:40;;;;;;;;;;-1:-1:-1;;;;;69026:1315:0:o;65129:264::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;65256:4:::1;65232:20;:28;;:69;;;;;53223:6;65264:20;:37;;65232:69;65224:94;;;;-1:-1:-1::0;;;65224:94:0::1;;;;;;;:::i;:::-;65343:19;:42:::0;65129:264::o;73266:2302::-;52421:12;52389:4;52413:21;;;;;;;;;;;52435:9;52413:32;;;;;;;;;;52638:29;52630:80;;;;-1:-1:-1;;;52630:80:0;;;;;;;:::i;:::-;52554:12;52522:4;52546:21;;;;;;;;;;;52568:10;52546:33;;;;;;;;;;52729:29;52721:80;;;;-1:-1:-1;;;52721:80:0;;;;;;;:::i;:::-;56048:9:::1;;56029:15;:28;;56021:66;;;;-1:-1:-1::0;;;56021:66:0::1;;;;;;;:::i;:::-;56175:16:::2;:14;:16::i;:::-;56156:15;:35;;56148:72;;;::::0;-1:-1:-1;;;56148:72:0;;14970:2:1;56148:72:0::2;::::0;::::2;14952:21:1::0;15009:2;14989:18;;;14982:30;15048:26;15028:18;;;15021:54;15092:18;;56148:72:0::2;14768:348:1::0;56148:72:0::2;56515:4:::3;::::0;56503:28:::3;::::0;;-1:-1:-1;;;56503:28:0;;;;56543:4:::3;::::0;-1:-1:-1;;;;;56515:4:0::3;::::0;56503:26:::3;::::0;:28:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;56515:4;56503:28:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56503:45:0::3;;:111;;;;-1:-1:-1::0;56581:4:0::3;::::0;56569:28:::3;::::0;;-1:-1:-1;;;56569:28:0;;;;56609:4:::3;::::0;-1:-1:-1;;;;;56581:4:0::3;::::0;56569:26:::3;::::0;:28:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;56581:4;56569:28:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56569:45:0::3;;56503:111;:178;;;;-1:-1:-1::0;56647:5:0::3;::::0;56635:29:::3;::::0;;-1:-1:-1;;;56635:29:0;;;;56676:4:::3;::::0;-1:-1:-1;;;;;56647:5:0::3;::::0;56635:27:::3;::::0;:29:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;56647:5;56635:29:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56635:46:0::3;;56503:178;:244;;;;-1:-1:-1::0;56711:7:0::3;::::0;56702:28:::3;::::0;;-1:-1:-1;;;56702:28:0;;;;56742:4:::3;::::0;-1:-1:-1;;;;;56711:7:0::3;::::0;56702:26:::3;::::0;:28:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;56711:7;56702:28:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56702:45:0::3;;56503:244;56477:328;;;;-1:-1:-1::0;;;56477:328:0::3;;;;;;;:::i;:::-;73370:18:::4;:16;:18::i;:::-;73424:14;:12;:14::i;:::-;73399:22;:39:::0;73501:16:::4;::::0;73449:18:::4;::::0;73470:48:::4;::::0;:26:::4;:24;:26::i;:::-;:30:::0;::::4;:48::i;:::-;73449:69;;73541:15;;73533:5;;:23;73529:2032;;;73623:82;73638:66;53223:6;73638:47;73653:31;;73638:10;:14;;:47;;;;:::i;:66::-;73623:14;:82::i;:::-;73529:2032;;;73767:16;;73742:22;;:41;73738:1812;;;73928:4;::::0;73921:26:::4;::::0;;-1:-1:-1;;;73921:26:0;;;;73900:18:::4;::::0;-1:-1:-1;;;;;73928:4:0::4;::::0;73921:24:::4;::::0;:26:::4;::::0;;::::4;::::0;::::4;::::0;;;;;;;;73928:4;73921:26:::4;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73900:47;;73966:19;73988:40;74015:12;;73988:22;;:26;;:40;;;;:::i;:::-;73966:62;;74047:21;74087:24:::0;74130:12:::4;74145:57;74197:4;74145:47;74181:10;74145:35;:47::i;:57::-;74130:72;;74239:4;74225:11;:18;74221:85;;;74282:4;74268:18;;74221:85;74348:60;53223:6;74348:41;74363:25;;74348:10;:14;;:41;;;;:::i;:60::-;74328:16;;:80;74324:805;;74521:37;74553:4;74521:27;:10:::0;74536:11;74521:14:::4;:27::i;:37::-;74502:56;;74324:805;;;74676:20;74699:37;74731:4;74699:27;:10:::0;74714:11;74699:14:::4;:27::i;:37::-;74676:60;;74778:69;53223:6;74778:50;74795:32;;74778:12;:16;;:50;;;;:::i;:69::-;74759:88:::0;-1:-1:-1;74886:34:0::4;:12:::0;74759:88;74886:16:::4;:34::i;:::-;74947:26;::::0;74870:50;;-1:-1:-1;74947:30:0;74943:167:::4;;75022:64;53223:6;75022:45;75040:26;;75022:13;:17;;:45;;;;:::i;:64::-;75006:80;;74943:167;74584:545;74324:805;75151:20:::0;;75147:101:::4;;75196:32;75211:16;75196:14;:32::i;:::-;75270:17:::0;;75266:269:::4;;75331:16;::::0;:35:::4;::::0;75352:13;75331:20:::4;:35::i;:::-;75312:16;:54:::0;75401:4:::4;::::0;75389:52:::4;::::0;-1:-1:-1;;;75389:52:0;;-1:-1:-1;;;;;75401:4:0;;::::4;::::0;75389:22:::4;::::0;:52:::4;::::0;75420:4:::4;::::0;75427:13;;75389:52:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;75469:46:0::4;::::0;;75484:15:::4;10436:25:1::0;;10492:2;10477:18;;10470:34;;;75469:46:0::4;::::0;10409:18:1;75469:46:0::4;;;;;;;75266:269;73785:1765;;;;;73738:1812;-1:-1:-1::0;56255:5:0::2;::::0;:12:::2;::::0;56265:1:::2;56255:9;:12::i;:::-;56247:5;:20:::0;56325:16:::2;::::0;56308:14:::2;:12;:14::i;:::-;:33;56307:120;;56349:78;53223:6;56349:59;56380:27;;56349:26;:24;:26::i;:78::-;56307:120;;;56345:1;56307:120;56278:26;:149:::0;52836:12;52828:7;:21;;;;;;;;;;;52850:9;52828:32;;;;;;;;:39;;52863:4;-1:-1:-1;;52828:39:0;;;;;;;;52900:10;52878:33;;;;;;:40;;;;;;;;;;73266:2302::o;62903:273::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;63021:12:::1;;63000:17;:33;;:88;;;;;63058:30;63084:3;63058:21;63075:3;63058:12;;:16;;:21;;;;:::i;:30::-;63037:17;:51;;63000:88;62992:113;;;;-1:-1:-1::0;;;62992:113:0::1;;;;;;;:::i;:::-;63132:16;:36:::0;62903:273::o;76142:128::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;76231:7:::1;::::0;76222:40:::1;::::0;-1:-1:-1;;;76222:40:0;;-1:-1:-1;;;;;2419:32:1;;;76222:40:0::1;::::0;::::1;2401:51:1::0;76231:7:0;;::::1;::::0;76222:29:::1;::::0;2374:18:1;;76222:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;76142:128:::0;:::o;25471:103::-;24716:13;:11;:13::i;:::-;25536:30:::1;25563:1;25536:18;:30::i;58720:426::-:0;58771:24;58808:18;58829:14;:12;:14::i;:::-;58808:35;;58871:16;;58858:10;:29;58854:285;;;58932:4;;58925:37;;-1:-1:-1;;;58925:37:0;;58956:4;58925:37;;;2401:51:1;58904:18:0;;-1:-1:-1;;;;;58932:4:0;;58925:22;;2374:18:1;;58925:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58904:58;;58977:13;58993:20;:18;:20::i;:::-;58977:36;-1:-1:-1;59032:9:0;;59028:100;;59081:31;59106:5;59081:20;:10;59096:4;59081:14;:20::i;:31::-;59062:50;;58889:250;;58797:349;58720:426;:::o;76278:198::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;76406:7:::1;::::0;76397:71:::1;::::0;-1:-1:-1;;;76397:71:0;;::::1;::::0;::::1;10436:25:1::0;;;10477:18;;;10470:34;;;-1:-1:-1;;;;;76406:7:0;;::::1;::::0;76397:27:::1;::::0;10409:18:1;;76397:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;76278:198:::0;;:::o;62786:109::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;62863:10:::1;:24:::0;;-1:-1:-1;;;;;;62863:24:0::1;-1:-1:-1::0;;;;;62863:24:0;;;::::1;::::0;;;::::1;::::0;;62786:109::o;53585:137::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53585:137:0;;-1:-1:-1;53585:137:0;:::o;52077:145::-;24716:13;:11;:13::i;:::-;52159:9:::1;::::0;52139:42:::1;::::0;52178:1:::1;::::0;-1:-1:-1;;;;;52159:9:0::1;::::0;52139:42:::1;::::0;52178:1;;52139:42:::1;52192:9;:22:::0;;-1:-1:-1;;;;;;52192:22:0::1;::::0;;52077:145::o;64508:301::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;64653:3:::1;64623:26;:33;;:80;;;;;53223:6;64660:26;:43;;64623:80;64615:105;;;;-1:-1:-1::0;;;64615:105:0::1;;;;;;;:::i;:::-;64747:25;:54:::0;64508:301::o;65401:502::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;65552:3:::1;65532:16;:23;;65524:66;;;::::0;-1:-1:-1;;;65524:66:0;;15323:2:1;65524:66:0::1;::::0;::::1;15305:21:1::0;15362:2;15342:18;;;15335:30;15401:32;15381:18;;;15374:60;15451:18;;65524:66:0::1;15121:354:1::0;65524:66:0::1;65659:3;65623:32;:39;;:84;;;;;65702:5;65666:32;:41;;65623:84;65615:143;;;::::0;-1:-1:-1;;;65615:143:0;;15682:2:1;65615:143:0::1;::::0;::::1;15664:21:1::0;15721:2;15701:18;;;15694:30;15760:34;15740:18;;;15733:62;-1:-1:-1;;;15811:18:1;;;15804:44;15865:19;;65615:143:0::1;15480:410:1::0;65615:143:0::1;65784:15;:34:::0;;;;65829:31:::1;:66:::0;65401:502::o;63593:492::-;51489:9;;63683:4;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;63781:1:::1;63772:6;:10;;;63764:64;;;;-1:-1:-1::0;;;63764:64:0::1;;;;;;;:::i;:::-;63843:10;::::0;::::1;::::0;63839:84:::1;;63887:11;63899:10;63908:1;63899:6:::0;:10:::1;:::i;:::-;63887:23;;;;;;;;;;:::i;:::-;;;;;;;;;63878:6;:32;63870:41;;;::::0;::::1;;63946:1;63937:6;:10;;;63933:84;;;63981:11;63993:10;:6:::0;64002:1:::1;63993:10;:::i;:::-;63981:23;;;;;;;;;;:::i;:::-;;;;;;;;;63972:6;:32;63964:41;;;::::0;::::1;;64049:6;64027:11;64039:6;64027:19;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:28:::0;-1:-1:-1;64073:4:0::1;51564:1;63593:492:::0;;;;:::o;76630:234::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;76797:7:::1;::::0;76788:68:::1;::::0;-1:-1:-1;;;76788:68:0;;-1:-1:-1;;;;;17456:32:1;;;76788:68:0::1;::::0;::::1;17438:51:1::0;17505:18;;;17498:34;;;17568:32;;;17548:18;;;17541:60;76797:7:0;;::::1;::::0;76788:46:::1;::::0;17411:18:1;;76788:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;76630:234:::0;;;:::o;60728:1733::-;56879:11;;-1:-1:-1;;;56879:11:0;;;;56878:12;56870:54;;;;-1:-1:-1;;;56870:54:0;;17814:2:1;56870:54:0;;;17796:21:1;17853:2;17833:18;;;17826:30;17892:31;17872:18;;;17865:59;17941:18;;56870:54:0;17612:353:1;56870:54:0;51489:9:::1;::::0;-1:-1:-1;;;;;51489:9:0::1;51502:10;51489:23;51481:72;;;;-1:-1:-1::0;;;51481:72:0::1;;;;;;;:::i;:::-;60960:4:::2;:12:::0;;-1:-1:-1;;;;;;60960:12:0;;::::2;-1:-1:-1::0;;;;;60960:12:0;;::::2;::::0;;;::::2;::::0;;;60983:4:::2;:12:::0;;;::::2;::::0;;::::2;;::::0;;61006:5:::2;:14:::0;;;::::2;::::0;;::::2;;::::0;;61031:10:::2;:24:::0;;;::::2;::::0;;::::2;;::::0;;61066:7:::2;:18:::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;61095:9:::2;:22:::0;;;61145:8:::2;61130:12;:23:::0;;;61263:30:::2;::::0;61289:3:::2;::::0;61263:21:::2;::::0;61280:3:::2;61263:16;:21::i;:30::-;61244:16;:49:::0;61389:111:::2;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;61389:111:0;;61413:12:::2;61389:111;::::0;::::2;::::0;61427:12:::2;61389:111:::0;;;;;;;61441:13:::2;61389:111:::0;;;;61456:13:::2;61389:111:::0;;;;61471:13:::2;61389:111:::0;;;;61486:13:::2;61389:111:::0;;;;::::2;::::0;:11:::2;::::0;:111:::2;;:::i;:::-;-1:-1:-1::0;61511:49:0::2;::::0;;::::2;::::0;::::2;::::0;;61532:3:::2;61511:49:::0;;61537:2:::2;61511:49;::::0;::::2;::::0;61541:2:::2;61511:49:::0;;;;;;;61545:2:::2;61511:49:::0;;;;61549:2:::2;61511:49:::0;;;;61553:2:::2;61511:49:::0;;;;61557:2:::2;61511:49:::0;;;;::::2;::::0;:17:::2;::::0;:49:::2;;:::i;:::-;-1:-1:-1::0;61652:3:0::2;61624:25;:31:::0;;;61705:6:::2;61677:25;:34:::0;61800:5:::2;61765:32;:40:::0;;;61896:5:::2;61866:27;:35:::0;61978:19:::2;:27:::0;62076:4:::2;62057:16;:23:::0;62108:5:::2;62091:14;:22:::0;62192:2:::2;62174:15;:20:::0;62205:31:::2;:37:::0;-1:-1:-1;62339:4:0;62332:37:::2;::::0;-1:-1:-1;;;62332:37:0;;62363:4:::2;62332:37;::::0;::::2;2401:51:1::0;-1:-1:-1;;;;;62339:4:0;;::::2;::::0;62332:22:::2;::::0;2374:18:1;;62332:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62313:16;:56:::0;62382:11:::2;:18:::0;;-1:-1:-1;;;;62382:18:0::2;-1:-1:-1::0;;;62382:18:0::2;::::0;;62416:37:::2;::::0;62428:10:::2;::::0;62416:37:::2;::::0;::::2;::::0;62440:12:::2;160:25:1::0;;148:2;133:18;;14:177;62416:37:0::2;;;;;;;;60728:1733:::0;;;;;;:::o;66864:208::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;66979:6:::1;66959:16;:26;;66951:68;;;::::0;-1:-1:-1;;;66951:68:0;;18172:2:1;66951:68:0::1;::::0;::::1;18154:21:1::0;18211:2;18191:18;;;18184:30;18250:31;18230:18;;;18223:59;18299:18;;66951:68:0::1;17970:353:1::0;66951:68:0::1;67030:15;:34:::0;66864:208::o;54027:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54027:28:0;:::o;54062:34::-;;;;;;;;;;;;67080:202;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;67192:6:::1;67173:15;:25;;67165:66;;;::::0;-1:-1:-1;;;67165:66:0;;18530:2:1;67165:66:0::1;::::0;::::1;18512:21:1::0;18569:2;18549:18;;;18542:30;18608;18588:18;;;18581:58;18656:18;;67165:66:0::1;18328:352:1::0;67165:66:0::1;67242:14;:32:::0;67080:202::o;57556:301::-;57651:10;;57668:4;;57643:36;;-1:-1:-1;;;57643:36:0;;57608:18;;-1:-1:-1;;;;;57651:10:0;;;;57643:24;;:36;;57668:4;;;;57674;;57643:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;57643:36:0;;;;;;;;-1:-1:-1;;57643:36:0;;;;;;;;;;;;:::i;:::-;;;57639:211;;57774:64;;-1:-1:-1;;;57774:64:0;;19192:2:1;57774:64:0;;;19174:21:1;19231:2;19211:18;;;19204:30;19270:34;19250:18;;;19243:62;-1:-1:-1;;;19321:18:1;;;19314:52;19383:19;;57774:64:0;18990:418:1;57639:211:0;57734:5;57556:301;-1:-1:-1;57556:301:0:o;57252:296::-;57339:10;;57359:4;;57331:39;;-1:-1:-1;;;57331:39:0;;57297:17;;-1:-1:-1;;;;;57339:10:0;;;;57331:27;;:39;;57359:4;;;;57365;;57331:39;;;:::i;62469:108::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;62542:27:::1;62559:9;62542:16;:27::i;76484:138::-:0;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;76578:7:::1;::::0;76569:45:::1;::::0;-1:-1:-1;;;76569:45:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;76578:7:0;;::::1;::::0;76569:37:::1;::::0;133:18:1;;76569:45:0::1;14:177:1::0;57115:114:0;57162:7;57189:32;57203:17;53169:7;57203:5;;:9;;:17;;;;:::i;:::-;57189:9;;;:13;:32::i;:::-;57182:39;;57115:114;:::o;64817:304::-;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;64968:3:::1;64936:28;:35;;:76;;;;;65007:5;64975:28;:37;;64936:76;64928:101;;;;-1:-1:-1::0;;;64928:101:0::1;;;;;;;:::i;:::-;65055:27;:58:::0;64817:304::o;64093:407::-;51489:9;;64189:4;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;64287:1:::1;64278:6;:10;;;64270:64;;;;-1:-1:-1::0;;;64270:64:0::1;;;;;;;:::i;:::-;64363:2;64353:6;:12;;:31;;;;;64379:5;64369:6;:15;;64353:31;64345:64;;;::::0;-1:-1:-1;;;64345:64:0;;19615:2:1;64345:64:0::1;::::0;::::1;19597:21:1::0;19654:2;19634:18;;;19627:30;-1:-1:-1;;;19673:18:1;;;19666:50;19733:18;;64345:64:0::1;19413:344:1::0;64345:64:0::1;64464:6;64436:17;64454:6;64436:25;;;;;;;;;;:::i;62681:97::-:0;51489:9;;-1:-1:-1;;;;;51489:9:0;51502:10;51489:23;51481:72;;;;-1:-1:-1;;;51481:72:0;;;;;;;:::i;:::-;62752:7:::1;:18:::0;;-1:-1:-1;;;;;;62752:18:0::1;-1:-1:-1::0;;;;;62752:18:0;;;::::1;::::0;;;::::1;::::0;;62681:97::o;68552:466::-;68655:4;;68693:23;;;-1:-1:-1;;;68693:23:0;;;;68609:7;;-1:-1:-1;;;;;68655:4:0;;68609:7;;68655:4;;68693:21;;:23;;;;;;;;;;;;;;68655:4;68693:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68671:45;;68727:23;68770:13;68765:196;68799:23;:30;68789:40;;;;68765:196;;;68875:74;68895:9;-1:-1:-1;;;;;68895:19:0;;68915:23;68939:7;68915:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;68895:53;;;;;;-1:-1:-1;;;;;;68895:53:0;;;-1:-1:-1;;;;;68915:32:0;;;68895:53;;;2401:51:1;2374:18;;68895:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68875:15;;:19;:74::i;:::-;68857:92;-1:-1:-1;68831:9:0;;;:::i;:::-;;;68765:196;;;-1:-1:-1;68978:32:0;:11;68994:15;68978;:32::i;25729:201::-;24716:13;:11;:13::i;:::-;-1:-1:-1;;;;;25818:22:0;::::1;25810:73;;;::::0;-1:-1:-1;;;25810:73:0;;20144:2:1;25810:73:0::1;::::0;::::1;20126:21:1::0;20183:2;20163:18;;;20156:30;20222:34;20202:18;;;20195:62;-1:-1:-1;;;20273:18:1;;;20266:36;20319:19;;25810:73:0::1;19942:402:1::0;25810:73:0::1;25894:28;25913:8;25894:18;:28::i;17368:98::-:0;17426:7;17453:5;17457:1;17453;:5;:::i;:::-;17446:12;17368:98;-1:-1:-1;;;17368:98:0:o;17767:::-;17825:7;17852:5;17856:1;17852;:5;:::i;17011:98::-;17069:7;17096:5;17100:1;17096;:5;:::i;16630:98::-;16688:7;16715:5;16719:1;16715;:5;:::i;1405:106::-;1463:7;1494:1;1490;:5;:13;;1502:1;1490:13;;;-1:-1:-1;1498:1:0;;1405:106;-1:-1:-1;1405:106:0:o;42903:177::-;42986:86;43006:5;43036:23;;;43061:2;43065:5;43013:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;43013:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;43013:58:0;-1:-1:-1;;;;;;43013:58:0;;;;;;;;;;42986:19;:86::i;68445:99::-;68505:10;;;;;;;;;-1:-1:-1;;;;;68505:10:0;-1:-1:-1;;;;;68497:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68493:44;;;68445:99::o;24995:132::-;24903:6;;-1:-1:-1;;;;;24903:6:0;682:10;25059:23;25051:68;;;;-1:-1:-1;;;25051:68:0;;21209:2:1;25051:68:0;;;21191:21:1;;;21228:18;;;21221:30;21287:34;21267:18;;;21260:62;21339:18;;25051:68:0;21007:356:1;51812:257:0;-1:-1:-1;;;;;51889:26:0;;51881:84;;;;-1:-1:-1;;;51881:84:0;;21570:2:1;51881:84:0;;;21552:21:1;21609:2;21589:18;;;21582:30;21648:34;21628:18;;;21621:62;-1:-1:-1;;;21699:18:1;;;21692:43;21752:19;;51881:84:0;21368:409:1;51881:84:0;51981:45;;-1:-1:-1;;;;;51981:45:0;;;52009:1;;51981:45;;52009:1;;51981:45;52037:9;:24;;-1:-1:-1;;;;;;52037:24:0;-1:-1:-1;;;;;52037:24:0;;;;;;;;;;51812:257::o;71448:1424::-;71521:4;;71509:46;;-1:-1:-1;;;71509:46:0;;-1:-1:-1;;;;;71521:4:0;;;;71509:22;;:46;;71540:4;;71547:7;;71509:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;71615:20:0;;71568:28;;71615:24;71611:271;;71679:52;53223:6;71679:33;71691:20;;71679:7;:11;;:33;;;;:::i;:52::-;71753:4;;71768:7;;71746:52;;-1:-1:-1;;;71746:52:0;;71656:75;;-1:-1:-1;;;;;;71753:4:0;;;;71746:21;;:52;;71768:7;;71656:75;;71746:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;71818:52:0;;;71832:15;10436:25:1;;10492:2;10477:18;;10470:34;;;71818:52:0;;10409:18:1;71818:52:0;;;;;;;71611:271;71941:20;;71894:28;;71941:24;71937:271;;72005:52;53223:6;72005:33;72017:20;;72005:7;:11;;:33;;;;:::i;:52::-;72079:4;;72094:7;;72072:52;;-1:-1:-1;;;72072:52:0;;71982:75;;-1:-1:-1;;;;;;72079:4:0;;;;72072:21;;:52;;72094:7;;71982:75;;72072:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;72144:52:0;;;72158:15;10436:25:1;;10492:2;10477:18;;10470:34;;;72144:52:0;;10409:18:1;72144:52:0;;;;;;;71937:271;72268:21;;72220:29;;72268:25;72264:278;;72334:53;53223:6;72334:34;72346:21;;72334:7;:11;;:34;;;;:::i;:53::-;72409:4;;72424:8;;72402:54;;-1:-1:-1;;;72402:54:0;;72310:77;;-1:-1:-1;;;;;;72409:4:0;;;;72402:21;;:54;;72424:8;;72310:77;;72402:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;72476:54:0;;;72491:15;10436:25:1;;10492:2;10477:18;;10470:34;;;72476:54:0;;10409:18:1;72476:54:0;;;;;;;72264:278;72564:86;72628:21;72564:59;72602:20;72564:59;:7;72576:20;72564:11;:33::i;:86::-;72688:7;;72670:4;;72554:96;;-1:-1:-1;72663:36:0;;-1:-1:-1;;;;;72670:4:0;;;;72688:7;;72663:24;:36::i;:::-;72735:7;;72717:4;;72710:42;;-1:-1:-1;;;;;72717:4:0;;;;72735:7;72744;72710:24;:42::i;:::-;72772:7;;72763:46;;-1:-1:-1;;;72763:46:0;;;;;160:25:1;;;-1:-1:-1;;;;;72772:7:0;;;;72763:37;;133:18:1;;72763:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72825:39:0;;;72839:15;10436:25:1;;10492:2;10477:18;;10470:34;;;72825:39:0;;-1:-1:-1;10409:18:1;;-1:-1:-1;72825:39:0;;;;;;;71498:1374;;;71448:1424;:::o;72880:378::-;72964:7;73004:1;72984:224;73064:11;73076:6;73064:19;;;;;;;;;;:::i;:::-;;;;;;;;;73049:11;:34;73045:152;;73132:17;73150:6;73132:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;73104;:53;73176:5;;73045:152;73020:8;;;:::i;:::-;;;72984:224;;;-1:-1:-1;;73225:25:0;;;72880:378;-1:-1:-1;72880:378:0:o;26090:191::-;26183:6;;;-1:-1:-1;;;;;26200:17:0;;;-1:-1:-1;;;;;;26200:17:0;;;;;;;26233:40;;26183:6;;;26200:17;26183:6;;26233:40;;26164:16;;26233:40;26153:128;26090:191;:::o;47249:649::-;47673:23;47699:69;47727:4;47699:69;;;;;;;;;;;;;;;;;47707:5;-1:-1:-1;;;;;47699:27:0;;;:69;;;;;:::i;:::-;47673:95;;47787:10;:17;47808:1;47787:22;:56;;;;47824:10;47813:30;;;;;;;;;;;;:::i;:::-;47779:111;;;;-1:-1:-1;;;47779:111:0;;22167:2:1;47779:111:0;;;22149:21:1;22206:2;22186:18;;;22179:30;22245:34;22225:18;;;22218:62;-1:-1:-1;;;22296:18:1;;;22289:40;22346:19;;47779:111:0;21965:406:1;43799:582:0;44129:10;;;44128:62;;-1:-1:-1;44145:39:0;;-1:-1:-1;;;44145:39:0;;44169:4;44145:39;;;22550:51:1;-1:-1:-1;;;;;22637:32:1;;;22617:18;;;22610:60;44145:15:0;;;;;22523:18:1;;44145:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;44128:62;44106:166;;;;-1:-1:-1;;;44106:166:0;;22883:2:1;44106:166:0;;;22865:21:1;22922:2;22902:18;;;22895:30;22961:34;22941:18;;;22934:62;-1:-1:-1;;;23012:18:1;;;23005:52;23074:19;;44106:166:0;22681:418:1;44106:166:0;44283:90;44303:5;44333:22;;;44357:7;44366:5;44310:62;;;;;;;;;:::i;30363:229::-;30500:12;30532:52;30554:6;30562:4;30568:1;30571:12;30532:21;:52::i;:::-;30525:59;30363:229;-1:-1:-1;;;;30363:229:0:o;31449:455::-;31619:12;31677:5;31652:21;:30;;31644:81;;;;-1:-1:-1;;;31644:81:0;;23306:2:1;31644:81:0;;;23288:21:1;23345:2;23325:18;;;23318:30;23384:34;23364:18;;;23357:62;-1:-1:-1;;;23435:18:1;;;23428:36;23481:19;;31644:81:0;23104:402:1;31644:81:0;31737:12;31751:23;31778:6;-1:-1:-1;;;;;31778:11:0;31797:5;31804:4;31778:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31736:73;;;;31827:69;31854:6;31862:7;31871:10;31883:12;31827:26;:69::i;:::-;31820:76;31449:455;-1:-1:-1;;;;;;;31449:455:0:o;34022:644::-;34207:12;34236:7;34232:427;;;34264:10;:17;34285:1;34264:22;34260:290;;-1:-1:-1;;;;;27903:19:0;;;34474:60;;;;-1:-1:-1;;;34474:60:0;;24019:2:1;34474:60:0;;;24001:21:1;24058:2;24038:18;;;24031:30;24097:31;24077:18;;;24070:59;24146:18;;34474:60:0;23817:353:1;34474:60:0;-1:-1:-1;34571:10:0;34564:17;;34232:427;34614:33;34622:10;34634:12;35369:17;;:21;35365:388;;35601:10;35595:17;35658:15;35645:10;35641:2;35637:19;35630:44;35365:388;35728:12;35721:20;;-1:-1:-1;;;35721:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:226:1;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;369:23:1;;196:226;-1:-1:-1;196:226:1:o;427:346::-;495:6;503;556:2;544:9;535:7;531:23;527:32;524:52;;;572:1;569;562:12;524:52;-1:-1:-1;;617:23:1;;;737:2;722:18;;;709:32;;-1:-1:-1;427:346:1:o;970:131::-;-1:-1:-1;;;;;1045:31:1;;1035:42;;1025:70;;1091:1;1088;1081:12;1106:892;1210:6;1218;1226;1234;1242;1250;1303:3;1291:9;1282:7;1278:23;1274:33;1271:53;;;1320:1;1317;1310:12;1271:53;1359:9;1346:23;1378:31;1403:5;1378:31;:::i;:::-;1428:5;-1:-1:-1;1506:2:1;1491:18;;1478:32;;-1:-1:-1;1588:2:1;1573:18;;1560:32;1601:33;1560:32;1601:33;:::i;:::-;1653:7;-1:-1:-1;1733:2:1;1718:18;;1705:32;;-1:-1:-1;1815:3:1;1800:19;;1787:33;1829;1787;1829;:::i;:::-;1106:892;;;;-1:-1:-1;1106:892:1;;;;;1961:3;1946:19;;;1933:33;;-1:-1:-1;;1106:892:1:o;2003:247::-;2062:6;2115:2;2103:9;2094:7;2090:23;2086:32;2083:52;;;2131:1;2128;2121:12;2083:52;2170:9;2157:23;2189:31;2214:5;2189:31;:::i;2463:523::-;2555:6;2563;2571;2624:2;2612:9;2603:7;2599:23;2595:32;2592:52;;;2640:1;2637;2630:12;2592:52;2679:9;2666:23;2698:31;2723:5;2698:31;:::i;:::-;2748:5;-1:-1:-1;2826:2:1;2811:18;;2798:32;;-1:-1:-1;2908:2:1;2893:18;;2880:32;2921:33;2880:32;2921:33;:::i;:::-;2973:7;2963:17;;;2463:523;;;;;:::o;2991:389::-;3057:6;3065;3118:2;3106:9;3097:7;3093:23;3089:32;3086:52;;;3134:1;3131;3124:12;3086:52;3173:9;3160:23;3223:4;3216:5;3212:16;3205:5;3202:27;3192:55;;3243:1;3240;3233:12;3192:55;3266:5;3344:2;3329:18;;;;3316:32;;-1:-1:-1;;;2991:389:1:o;3898:934::-;4002:6;4010;4018;4026;4034;4042;4095:3;4083:9;4074:7;4070:23;4066:33;4063:53;;;4112:1;4109;4102:12;4063:53;4151:9;4138:23;4170:31;4195:5;4170:31;:::i;:::-;4220:5;-1:-1:-1;4277:2:1;4262:18;;4249:32;4290:33;4249:32;4290:33;:::i;:::-;4342:7;-1:-1:-1;4401:2:1;4386:18;;4373:32;4414:33;4373:32;4414:33;:::i;:::-;4466:7;-1:-1:-1;4525:2:1;4510:18;;4497:32;4538:33;4497:32;4538:33;:::i;:::-;4590:7;-1:-1:-1;4649:3:1;4634:19;;4621:33;4663;4621;4663;:::i;4837:400::-;5039:2;5021:21;;;5078:2;5058:18;;;5051:30;5117:34;5112:2;5097:18;;5090:62;-1:-1:-1;;;5183:2:1;5168:18;;5161:34;5227:3;5212:19;;4837:400::o;6467:402::-;6669:2;6651:21;;;6708:2;6688:18;;;6681:30;6747:34;6742:2;6727:18;;6720:62;-1:-1:-1;;;6813:2:1;6798:18;;6791:36;6859:3;6844:19;;6467:402::o;6874:349::-;7076:2;7058:21;;;7115:2;7095:18;;;7088:30;7154:27;7149:2;7134:18;;7127:55;7214:2;7199:18;;6874:349::o;7228:251::-;7298:6;7351:2;7339:9;7330:7;7326:23;7322:32;7319:52;;;7367:1;7364;7357:12;7319:52;7399:9;7393:16;7418:31;7443:5;7418:31;:::i;7484:354::-;7686:2;7668:21;;;7725:2;7705:18;;;7698:30;7764:32;7759:2;7744:18;;7737:60;7829:2;7814:18;;7484:354::o;8613:414::-;8815:2;8797:21;;;8854:2;8834:18;;;8827:30;8893:34;8888:2;8873:18;;8866:62;-1:-1:-1;;;8959:2:1;8944:18;;8937:48;9017:3;9002:19;;8613:414::o;9388:184::-;9458:6;9511:2;9499:9;9490:7;9486:23;9482:32;9479:52;;;9527:1;9524;9517:12;9479:52;-1:-1:-1;9550:16:1;;9388:184;-1:-1:-1;9388:184:1:o;9983:274::-;-1:-1:-1;;;;;10175:32:1;;;;10157:51;;10239:2;10224:18;;10217:34;10145:2;10130:18;;9983:274::o;10873:327::-;11075:2;11057:21;;;11114:1;11094:18;;;11087:29;-1:-1:-1;;;11147:2:1;11132:18;;11125:34;11191:2;11176:18;;10873:327::o;11205:336::-;11407:2;11389:21;;;11446:2;11426:18;;;11419:30;-1:-1:-1;;;11480:2:1;11465:18;;11458:42;11532:2;11517:18;;11205:336::o;14486:277::-;14553:6;14606:2;14594:9;14585:7;14581:23;14577:32;14574:52;;;14622:1;14619;14612:12;14574:52;14654:9;14648:16;14707:5;14700:13;14693:21;14686:5;14683:32;14673:60;;14729:1;14726;14719:12;16253:405;16455:2;16437:21;;;16494:2;16474:18;;;16467:30;16533:34;16528:2;16513:18;;16506:62;-1:-1:-1;;;16599:2:1;16584:18;;16577:39;16648:3;16633:19;;16253:405::o;16663:127::-;16724:10;16719:3;16715:20;16712:1;16705:31;16755:4;16752:1;16745:15;16779:4;16776:1;16769:15;16795:151;16885:4;16878:12;;;16864;;;16860:31;;16903:14;;16900:40;;;16920:18;;:::i;16951:127::-;17012:10;17007:3;17003:20;17000:1;16993:31;17043:4;17040:1;17033:15;17067:4;17064:1;17057:15;17083:148;17171:4;17150:12;;;17164;;;17146:31;;17189:13;;17186:39;;;17205:18;;:::i;19762:175::-;19799:3;19843:4;19836:5;19832:16;19872:4;19863:7;19860:17;19857:43;;19880:18;;:::i;:::-;19929:1;19916:15;;19762:175;-1:-1:-1;;19762:175:1:o;20349:168::-;20422:9;;;20453;;20470:15;;;20464:22;;20450:37;20440:71;;20491:18;;:::i;20522:217::-;20562:1;20588;20578:132;;20632:10;20627:3;20623:20;20620:1;20613:31;20667:4;20664:1;20657:15;20695:4;20692:1;20685:15;20578:132;-1:-1:-1;20724:9:1;;20522:217::o;20744:128::-;20811:9;;;20832:11;;;20829:37;;;20846:18;;:::i;20877:125::-;20942:9;;;20963:10;;;20960:36;;;20976:18;;:::i;21782:178::-;21819:3;21863:4;21856:5;21852:16;21887:7;21877:41;;21898:18;;:::i;:::-;-1:-1:-1;;21934:20:1;;21782:178;-1:-1:-1;;21782:178:1:o;23511:301::-;23640:3;23678:6;23672:13;23724:6;23717:4;23709:6;23705:17;23700:3;23694:37;23786:1;23750:16;;23775:13;;;-1:-1:-1;23750:16:1;23511:301;-1:-1:-1;23511:301:1:o;24175:418::-;24324:2;24313:9;24306:21;24287:4;24356:6;24350:13;24399:6;24394:2;24383:9;24379:18;24372:34;24458:6;24453:2;24445:6;24441:15;24436:2;24425:9;24421:18;24415:50;24514:1;24509:2;24500:6;24489:9;24485:22;24481:31;24474:42;24584:2;24577;24573:7;24568:2;24560:6;24556:15;24552:29;24541:9;24537:45;24533:54;24525:62;;;24175:418;;;;:::o
Swarm Source
ipfs://5489d47ec4ab8e8a9a97029b7cc3a9b30cb2e012cbd9a3ed991b6f8dd4e6d3d6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.