Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,092 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Accept Admin | 16397670 | 664 days ago | IN | 0 ETH | 0.00043541 | ||||
Transfer Admin | 12252084 | 1301 days ago | IN | 0 ETH | 0.01720476 | ||||
Withdraw Payment | 12086766 | 1327 days ago | IN | 0 ETH | 0.00492629 | ||||
Withdraw Payment | 12059208 | 1331 days ago | IN | 0 ETH | 0.00730099 | ||||
Withdraw Payment | 11532815 | 1412 days ago | IN | 0 ETH | 0.00316125 | ||||
Withdraw Payment | 11512657 | 1415 days ago | IN | 0 ETH | 0.0112902 | ||||
Withdraw Payment | 11499764 | 1417 days ago | IN | 0 ETH | 0.0018817 | ||||
Withdraw Payment | 11470342 | 1422 days ago | IN | 0 ETH | 0.0075268 | ||||
Withdraw Payment | 11422812 | 1429 days ago | IN | 0 ETH | 0.00124192 | ||||
Withdraw Funds | 11413206 | 1430 days ago | IN | 0 ETH | 0.00186381 | ||||
Withdraw Payment | 11331108 | 1443 days ago | IN | 0 ETH | 0.00124192 | ||||
Withdraw Payment | 11278277 | 1451 days ago | IN | 0 ETH | 0.00124192 | ||||
Withdraw Payment | 11195810 | 1464 days ago | IN | 0 ETH | 0.00124192 | ||||
Withdraw Payment | 11017967 | 1491 days ago | IN | 0 ETH | 0.00169353 | ||||
Withdraw Payment | 10990950 | 1495 days ago | IN | 0 ETH | 0.00406447 | ||||
Withdraw Payment | 10631884 | 1551 days ago | IN | 0 ETH | 0.00628454 | ||||
Withdraw Payment | 10627229 | 1551 days ago | IN | 0 ETH | 0.00599698 | ||||
Withdraw Payment | 10568240 | 1560 days ago | IN | 0 ETH | 0.00528824 | ||||
Withdraw Payment | 10544630 | 1564 days ago | IN | 0 ETH | 0.00354367 | ||||
Withdraw Payment | 10543144 | 1564 days ago | IN | 0 ETH | 0.00763252 | ||||
Update Future Ro... | 10542767 | 1564 days ago | IN | 0 ETH | 0.00600628 | ||||
Submit | 10542509 | 1564 days ago | IN | 0 ETH | 0.01484119 | ||||
Submit | 10542508 | 1564 days ago | IN | 0 ETH | 0.0139942 | ||||
Submit | 10542508 | 1564 days ago | IN | 0 ETH | 0.01326083 | ||||
Submit | 10542508 | 1564 days ago | IN | 0 ETH | 0.01321965 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AccessControlledAggregator
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-25 */ pragma solidity 0.6.6; interface AccessControllerInterface { function hasAccess(address user, bytes calldata data) external view returns (bool); } /** * @title The Owned contract * @notice A contract with helpers for basic contract ownership. */ contract Owned { address payable public owner; address private pendingOwner; event OwnershipTransferRequested( address indexed from, address indexed to ); event OwnershipTransferred( address indexed from, address indexed to ); constructor() public { owner = msg.sender; } /** * @dev Allows an owner to begin transferring ownership to a new address, * pending. */ function transferOwnership(address _to) external onlyOwner() { pendingOwner = _to; emit OwnershipTransferRequested(owner, _to); } /** * @dev Allows an ownership transfer to be completed by the recipient. */ function acceptOwnership() external { require(msg.sender == pendingOwner, "Must be proposed owner"); address oldOwner = owner; owner = msg.sender; pendingOwner = address(0); emit OwnershipTransferred(oldOwner, msg.sender); } /** * @dev Reverts if called by anyone other than the contract owner. */ modifier onlyOwner() { require(msg.sender == owner, "Only callable by owner"); _; } } interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function getRoundData(uint256 _roundId) external view returns ( uint256 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint256 answeredInRound ); function latestRoundData() external view returns ( uint256 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint256 answeredInRound ); function version() external view returns (uint256); } interface AggregatorInterface { function latestAnswer() external view returns (int256); function latestTimestamp() external view returns (uint256); function latestRound() external view returns (uint256); function getAnswer(uint256 roundId) external view returns (int256); function getTimestamp(uint256 roundId) external view returns (uint256); event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); } interface LinkTokenInterface { function allowance(address owner, address spender) external view returns (uint256 remaining); function approve(address spender, uint256 value) external returns (bool success); function balanceOf(address owner) external view returns (uint256 balance); function decimals() external view returns (uint8 decimalPlaces); function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); function increaseApproval(address spender, uint256 subtractedValue) external; function name() external view returns (string memory tokenName); function symbol() external view returns (string memory tokenSymbol); function totalSupply() external view returns (uint256 totalTokensIssued); function transfer(address to, uint256 value) external returns (bool success); function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success); function transferFrom(address from, address to, uint256 value) external returns (bool success); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } library SignedSafeMath { int256 constant private _INT256_MIN = -2**255; /** * @dev Multiplies two signed integers, reverts on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Subtracts two signed integers, reverts on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Adds two signed integers, reverts on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } /** * @notice Computes average of two signed integers, ensuring that the computation * doesn't overflow. * @dev If the result is not an integer, it is rounded towards zero. For example, * avg(-3, -4) = -3 */ function avg(int256 _a, int256 _b) internal pure returns (int256) { if ((_a < 0 && _b > 0) || (_a > 0 && _b < 0)) { return add(_a, _b) / 2; } int256 remainder = (_a % 2 + _b % 2) / 2; return add(add(_a / 2, _b / 2), remainder); } } library Median { using SignedSafeMath for int256; int256 constant INT_MAX = 2**255-1; /** * @notice Returns the sorted middle, or the average of the two middle indexed items if the * array has an even number of elements. * @dev The list passed as an argument isn't modified. * @dev This algorithm has expected runtime O(n), but for adversarially chosen inputs * the runtime is O(n^2). * @param list The list of elements to compare */ function calculate(int256[] memory list) internal pure returns (int256) { return calculateInplace(copy(list)); } /** * @notice See documentation for function calculate. * @dev The list passed as an argument may be permuted. */ function calculateInplace(int256[] memory list) internal pure returns (int256) { require(0 < list.length, "list must not be empty"); uint256 len = list.length; uint256 middleIndex = len / 2; if (len % 2 == 0) { int256 median1; int256 median2; (median1, median2) = quickselectTwo(list, 0, len - 1, middleIndex - 1, middleIndex); return SignedSafeMath.avg(median1, median2); } else { return quickselect(list, 0, len - 1, middleIndex); } } /** * @notice Maximum length of list that shortSelectTwo can handle */ uint256 constant SHORTSELECTTWO_MAX_LENGTH = 7; /** * @notice Select the k1-th and k2-th element from list of length at most 7 * @dev Uses an optimal sorting network */ function shortSelectTwo( int256[] memory list, uint256 lo, uint256 hi, uint256 k1, uint256 k2 ) private pure returns (int256 k1th, int256 k2th) { // Uses an optimal sorting network (https://en.wikipedia.org/wiki/Sorting_network) // for lists of length 7. Network layout is taken from // http://jgamble.ripco.net/cgi-bin/nw.cgi?inputs=7&algorithm=hibbard&output=svg uint256 len = hi + 1 - lo; int256 x0 = list[lo + 0]; int256 x1 = 1 < len ? list[lo + 1] : INT_MAX; int256 x2 = 2 < len ? list[lo + 2] : INT_MAX; int256 x3 = 3 < len ? list[lo + 3] : INT_MAX; int256 x4 = 4 < len ? list[lo + 4] : INT_MAX; int256 x5 = 5 < len ? list[lo + 5] : INT_MAX; int256 x6 = 6 < len ? list[lo + 6] : INT_MAX; if (x0 > x1) {(x0, x1) = (x1, x0);} if (x2 > x3) {(x2, x3) = (x3, x2);} if (x4 > x5) {(x4, x5) = (x5, x4);} if (x0 > x2) {(x0, x2) = (x2, x0);} if (x1 > x3) {(x1, x3) = (x3, x1);} if (x4 > x6) {(x4, x6) = (x6, x4);} if (x1 > x2) {(x1, x2) = (x2, x1);} if (x5 > x6) {(x5, x6) = (x6, x5);} if (x0 > x4) {(x0, x4) = (x4, x0);} if (x1 > x5) {(x1, x5) = (x5, x1);} if (x2 > x6) {(x2, x6) = (x6, x2);} if (x1 > x4) {(x1, x4) = (x4, x1);} if (x3 > x6) {(x3, x6) = (x6, x3);} if (x2 > x4) {(x2, x4) = (x4, x2);} if (x3 > x5) {(x3, x5) = (x5, x3);} if (x3 > x4) {(x3, x4) = (x4, x3);} uint256 index1 = k1 - lo; if (index1 == 0) {k1th = x0;} else if (index1 == 1) {k1th = x1;} else if (index1 == 2) {k1th = x2;} else if (index1 == 3) {k1th = x3;} else if (index1 == 4) {k1th = x4;} else if (index1 == 5) {k1th = x5;} else if (index1 == 6) {k1th = x6;} else {revert("k1 out of bounds");} uint256 index2 = k2 - lo; if (k1 == k2) {return (k1th, k1th);} else if (index2 == 0) {return (k1th, x0);} else if (index2 == 1) {return (k1th, x1);} else if (index2 == 2) {return (k1th, x2);} else if (index2 == 3) {return (k1th, x3);} else if (index2 == 4) {return (k1th, x4);} else if (index2 == 5) {return (k1th, x5);} else if (index2 == 6) {return (k1th, x6);} else {revert("k2 out of bounds");} } /** * @notice Selects the k-th ranked element from list, looking only at indices between lo and hi * (inclusive). Modifies list in-place. */ function quickselect(int256[] memory list, uint256 lo, uint256 hi, uint256 k) private pure returns (int256 kth) { require(lo <= k); require(k <= hi); while (lo < hi) { if (hi - lo < SHORTSELECTTWO_MAX_LENGTH) { int256 ignore; (kth, ignore) = shortSelectTwo(list, lo, hi, k, k); return kth; } uint256 pivotIndex = partition(list, lo, hi); if (k <= pivotIndex) { // since pivotIndex < (original hi passed to partition), // termination is guaranteed in this case hi = pivotIndex; } else { // since (original lo passed to partition) <= pivotIndex, // termination is guaranteed in this case lo = pivotIndex + 1; } } return list[lo]; } /** * @notice Selects the k1-th and k2-th ranked elements from list, looking only at indices between * lo and hi (inclusive). Modifies list in-place. */ function quickselectTwo( int256[] memory list, uint256 lo, uint256 hi, uint256 k1, uint256 k2 ) internal // for testing pure returns (int256 k1th, int256 k2th) { require(k1 < k2); require(lo <= k1 && k1 <= hi); require(lo <= k2 && k2 <= hi); while (true) { if (hi - lo < SHORTSELECTTWO_MAX_LENGTH) { return shortSelectTwo(list, lo, hi, k1, k2); } uint256 pivotIdx = partition(list, lo, hi); if (k2 <= pivotIdx) { hi = pivotIdx; } else if (pivotIdx < k1) { lo = pivotIdx + 1; } else { assert(k1 <= pivotIdx && pivotIdx < k2); k1th = quickselect(list, lo, pivotIdx, k1); k2th = quickselect(list, pivotIdx + 1, hi, k2); return (k1th, k2th); } } } /** * @notice Partitions list in-place using Hoare's partitioning scheme. * Only elements of list between indices lo and hi (inclusive) will be modified. * Returns an index i, such that: * - lo <= i < hi * - forall j in [lo, i]. list[j] <= list[i] * - forall j in [i, hi]. list[i] <= list[j] */ function partition(int256[] memory list, uint256 lo, uint256 hi) private pure returns (uint256) { // We don't care about overflow of the addition, because it would require a list // larger than any feasible computer's memory. int256 pivot = list[(lo + hi) / 2]; lo -= 1; // this can underflow. that's intentional. hi += 1; while (true) { do { lo += 1; } while (list[lo] < pivot); do { hi -= 1; } while (list[hi] > pivot); if (lo < hi) { (list[lo], list[hi]) = (list[hi], list[lo]); } else { // Let orig_lo and orig_hi be the original values of lo and hi passed to partition. // Then, hi < orig_hi, because hi decreases *strictly* monotonically // in each loop iteration and // - either list[orig_hi] > pivot, in which case the first loop iteration // will achieve hi < orig_hi; // - or list[orig_hi] <= pivot, in which case at least two loop iterations are // needed: // - lo will have to stop at least once in the interval // [orig_lo, (orig_lo + orig_hi)/2] // - (orig_lo + orig_hi)/2 < orig_hi return hi; } } } /** * @notice Makes an in-memory copy of the array passed in * @param list Reference to the array to be copied */ function copy(int256[] memory list) private pure returns(int256[] memory) { int256[] memory list2 = new int256[](list.length); for (uint256 i = 0; i < list.length; i++) { list2[i] = list[i]; } return list2; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * This library is a version of Open Zeppelin's SafeMath, modified to support * unsigned 128 bit integers. */ library SafeMath128 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint128 a, uint128 b) internal pure returns (uint128) { uint128 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint128 a, uint128 b) internal pure returns (uint128) { require(b <= a, "SafeMath: subtraction overflow"); uint128 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint128 a, uint128 b) internal pure returns (uint128) { // 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-solidity/pull/522 if (a == 0) { return 0; } uint128 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint128 a, uint128 b) internal pure returns (uint128) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint128 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint128 a, uint128 b) internal pure returns (uint128) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * This library is a version of Open Zeppelin's SafeMath, modified to support * unsigned 64 bit integers. */ library SafeMath64 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint64 a, uint64 b) internal pure returns (uint64) { uint64 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint64 a, uint64 b) internal pure returns (uint64) { require(b <= a, "SafeMath: subtraction overflow"); uint64 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint64 a, uint64 b) internal pure returns (uint64) { // 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-solidity/pull/522 if (a == 0) { return 0; } uint64 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint64 a, uint64 b) internal pure returns (uint64) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint64 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint64 a, uint64 b) internal pure returns (uint64) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * This library is a version of Open Zeppelin's SafeMath, modified to support * unsigned 32 bit integers. */ library SafeMath32 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint32 a, uint32 b) internal pure returns (uint32) { uint32 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint32 a, uint32 b) internal pure returns (uint32) { require(b <= a, "SafeMath: subtraction overflow"); uint32 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint32 a, uint32 b) internal pure returns (uint32) { // 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-solidity/pull/522 if (a == 0) { return 0; } uint32 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint32 a, uint32 b) internal pure returns (uint32) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint32 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint32 a, uint32 b) internal pure returns (uint32) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @title The Prepaid Aggregator contract * @notice Node handles aggregating data pushed in from off-chain, and unlocks * payment for oracles as they report. Oracles' submissions are gathered in * rounds, with each round aggregating the submissions for each oracle into a * single answer. The latest aggregated answer is exposed as well as historical * answers and their updated at timestamp. */ contract FluxAggregator is AggregatorInterface, AggregatorV3Interface, Owned { using SafeMath for uint256; using SafeMath128 for uint128; using SafeMath64 for uint64; using SafeMath32 for uint32; struct Round { int256 answer; uint64 startedAt; uint64 updatedAt; uint32 answeredInRound; RoundDetails details; } struct RoundDetails { int256[] submissions; uint32 maxSubmissions; uint32 minSubmissions; uint32 timeout; uint128 paymentAmount; } struct OracleStatus { uint128 withdrawable; uint32 startingRound; uint32 endingRound; uint32 lastReportedRound; uint32 lastStartedRound; int256 latestSubmission; uint16 index; address admin; address pendingAdmin; } struct Requester { bool authorized; uint32 delay; uint32 lastStartedRound; } LinkTokenInterface public linkToken; uint128 public allocatedFunds; uint128 public availableFunds; // Round related params uint128 public paymentAmount; uint32 public maxSubmissionCount; uint32 public minSubmissionCount; uint32 public restartDelay; uint32 public timeout; uint8 public override decimals; string public override description; int256 immutable public minSubmissionValue; int256 immutable public maxSubmissionValue; uint256 constant public override version = 3; /** * @notice To ensure owner isn't withdrawing required funds as oracles are * submitting updates, we enforce that the contract maintains a minimum * reserve of RESERVE_ROUNDS * oracleCount() LINK earmarked for payment to * oracles. (Of course, this doesn't prevent the contract from running out of * funds without the owner's intervention.) */ uint256 constant private RESERVE_ROUNDS = 2; uint256 constant private MAX_ORACLE_COUNT = 77; uint32 constant private ROUND_MAX = 2**32-1; uint32 private reportingRoundId; uint32 internal latestRoundId; mapping(address => OracleStatus) private oracles; mapping(uint32 => Round) internal rounds; mapping(address => Requester) internal requesters; address[] private oracleAddresses; event AvailableFundsUpdated( uint256 indexed amount ); event RoundDetailsUpdated( uint128 indexed paymentAmount, uint32 indexed minSubmissionCount, uint32 indexed maxSubmissionCount, uint32 restartDelay, uint32 timeout // measured in seconds ); event OraclePermissionsUpdated( address indexed oracle, bool indexed whitelisted ); event OracleAdminUpdated( address indexed oracle, address indexed newAdmin ); event OracleAdminUpdateRequested( address indexed oracle, address admin, address newAdmin ); event SubmissionReceived( int256 indexed submission, uint32 indexed round, address indexed oracle ); event RequesterPermissionsSet( address indexed requester, bool authorized, uint32 delay ); /** * @notice Deploy with the address of the LINK token and initial payment amount * @dev Sets the LinkToken address and amount of LINK paid * @param _link The address of the LINK token * @param _paymentAmount The amount paid of LINK paid to each oracle per submission, in wei (units of 10⁻¹⁸ LINK) * @param _timeout is the number of seconds after the previous round that are * allowed to lapse before allowing an oracle to skip an unfinished round */ constructor( address _link, uint128 _paymentAmount, uint32 _timeout, int256 _minSubmissionValue, int256 _maxSubmissionValue, uint8 _decimals, string memory _description ) public { linkToken = LinkTokenInterface(_link); paymentAmount = _paymentAmount; timeout = _timeout; minSubmissionValue = _minSubmissionValue; maxSubmissionValue = _maxSubmissionValue; decimals = _decimals; description = _description; rounds[0].updatedAt = uint64(block.timestamp.sub(uint256(_timeout))); } /** * @notice called by oracles when they have witnessed a need to update * @param _roundId is the ID of the round this submission pertains to * @param _submission is the updated data that the oracle is submitting */ function submit(uint256 _roundId, int256 _submission) external { bytes memory error = validateOracleRound(msg.sender, uint32(_roundId)); require(_submission >= minSubmissionValue, "value below minSubmissionValue"); require(_submission <= maxSubmissionValue, "value above maxSubmissionValue"); require(error.length == 0, string(error)); oracleInitializeNewRound(uint32(_roundId)); recordSubmission(_submission, uint32(_roundId)); updateRoundAnswer(uint32(_roundId)); payOracle(uint32(_roundId)); deleteRoundDetails(uint32(_roundId)); } /** * @notice called by the owner to add new Oracles and update the round * related parameters * @param _oracles is the list of addresses of the new Oracles being added * @param _admins is the admin addresses of the new respective _oracles list. * Only this address is allowed to access the respective oracle's funds. * @param _minSubmissions is the new minimum submission count for each round * @param _maxSubmissions is the new maximum submission count for each round * @param _restartDelay is the number of rounds an Oracle has to wait before * they can initiate a round */ function addOracles( address[] calldata _oracles, address[] calldata _admins, uint32 _minSubmissions, uint32 _maxSubmissions, uint32 _restartDelay ) external onlyOwner() { require(_oracles.length == _admins.length, "need same oracle and admin count"); require(uint256(oracleCount()).add(_oracles.length) <= MAX_ORACLE_COUNT, "max oracles allowed"); for (uint256 i = 0; i < _oracles.length; i++) { addOracle(_oracles[i], _admins[i]); } updateFutureRounds(paymentAmount, _minSubmissions, _maxSubmissions, _restartDelay, timeout); } /** * @notice called by the owner to remove Oracles and update the round * related parameters * @param _oracles is the address of the Oracles being removed * @param _minSubmissions is the new minimum submission count for each round * @param _maxSubmissions is the new maximum submission count for each round * @param _restartDelay is the number of rounds an Oracle has to wait before * they can initiate a round */ function removeOracles( address[] calldata _oracles, uint32 _minSubmissions, uint32 _maxSubmissions, uint32 _restartDelay ) external onlyOwner() { for (uint256 i = 0; i < _oracles.length; i++) { removeOracle(_oracles[i]); } updateFutureRounds(paymentAmount, _minSubmissions, _maxSubmissions, _restartDelay, timeout); } /** * @notice update the round and payment related parameters for subsequent * rounds * @param _paymentAmount is the payment amount for subsequent rounds * @param _minSubmissions is the new minimum submission count for each round * @param _maxSubmissions is the new maximum submission count for each round * @param _restartDelay is the number of rounds an Oracle has to wait before * they can initiate a round */ function updateFutureRounds( uint128 _paymentAmount, uint32 _minSubmissions, uint32 _maxSubmissions, uint32 _restartDelay, uint32 _timeout ) public onlyOwner() { uint32 oracleNum = oracleCount(); // Save on storage reads require(_maxSubmissions >= _minSubmissions, "max must equal/exceed min"); require(oracleNum >= _maxSubmissions, "max cannot exceed total"); require(oracleNum == 0 || oracleNum > _restartDelay, "delay cannot exceed total"); require(availableFunds >= requiredReserve(_paymentAmount), "insufficient funds for payment"); if (oracleCount() > 0) { require(_minSubmissions > 0, "min must be greater than 0"); } paymentAmount = _paymentAmount; minSubmissionCount = _minSubmissions; maxSubmissionCount = _maxSubmissions; restartDelay = _restartDelay; timeout = _timeout; emit RoundDetailsUpdated( paymentAmount, _minSubmissions, _maxSubmissions, _restartDelay, _timeout ); } /** * @notice recalculate the amount of LINK available for payouts */ function updateAvailableFunds() public { uint128 pastAvailableFunds = availableFunds; uint256 available = linkToken.balanceOf(address(this)).sub(allocatedFunds); availableFunds = uint128(available); if (pastAvailableFunds != available) { emit AvailableFundsUpdated(available); } } /** * @notice returns the number of oracles */ function oracleCount() public view returns (uint32) { return uint32(oracleAddresses.length); } /** * @notice returns an array of addresses containing the oracles on contract */ function getOracles() external view returns (address[] memory) { return oracleAddresses; } /** * @notice get the most recently reported answer * @dev deprecated. Use latestRoundData instead. */ function latestAnswer() public view virtual override returns (int256) { return rounds[latestRoundId].answer; } /** * @notice get the most recent updated at timestamp * @dev deprecated. Use latestRoundData instead. */ function latestTimestamp() public view virtual override returns (uint256) { return rounds[latestRoundId].updatedAt; } /** * @notice get the ID of the last updated round * @dev deprecated. Use latestRoundData instead. */ function latestRound() public view override returns (uint256) { return latestRoundId; } /** * @notice get the ID of the round most recently reported on */ function reportingRound() external view returns (uint256) { return reportingRoundId; } /** * @notice get past rounds answers * @param _roundId the round number to retrieve the answer for * @dev deprecated. Use getRoundData instead. */ function getAnswer(uint256 _roundId) public view virtual override returns (int256) { return rounds[uint32(_roundId)].answer; } /** * @notice get timestamp when an answer was last updated * @param _roundId the round number to retrieve the updated timestamp for * @dev deprecated. Use getRoundData instead. */ function getTimestamp(uint256 _roundId) public view virtual override returns (uint256) { return rounds[uint32(_roundId)].updatedAt; } /** * @notice get data about a round. Consumers are encouraged to check * that they're receiving fresh data by inspecting the updatedAt and * answeredInRound return values. * @param _roundId the round ID to retrieve the round data for * @return roundId is the round ID for which data was retrieved * @return answer is the answer for the given round * @return startedAt is the timestamp when the round was started. This is 0 * if the round hasn't been started yet. * @return updatedAt is the timestamp when the round last was updated (i.e. * answer was last computed) * @return answeredInRound is the round ID of the round in which the answer * was computed. answeredInRound may be smaller than roundId when the round * timed out. answerInRound is equal to roundId when the round didn't time out * and was completed regularly. * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received * maxSubmissions) answer and updatedAt may change between queries. */ function getRoundData(uint256 _roundId) public view virtual override returns ( uint256 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint256 answeredInRound ) { Round memory r = rounds[uint32(_roundId)]; return ( _roundId, r.answer, r.startedAt, r.updatedAt, r.answeredInRound ); } /** * @notice get data about the latest round. Consumers are encouraged to check * that they're receiving fresh data by inspecting the updatedAt and * answeredInRound return values. Consumers are encouraged to * use this more fully featured method over the "legacy" getAnswer/ * latestAnswer/getTimestamp/latestTimestamp functions. * @return roundId is the round ID for which data was retrieved * @return answer is the answer for the given round * @return startedAt is the timestamp when the round was started. This is 0 * if the round hasn't been started yet. * @return updatedAt is the timestamp when the round last was updated (i.e. * answer was last computed) * @return answeredInRound is the round ID of the round in which the answer * was computed. answeredInRound may be smaller than roundId when the round * timed out. answerInRound is equal to roundId when the round didn't time out * and was completed regularly. * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received * maxSubmissions) answer and updatedAt may change between queries. */ function latestRoundData() public view virtual override returns ( uint256 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint256 answeredInRound ) { return getRoundData(latestRoundId); } /** * @notice query the available amount of LINK for an oracle to withdraw */ function withdrawablePayment(address _oracle) external view returns (uint256) { return oracles[_oracle].withdrawable; } /** * @notice transfers the oracle's LINK to another address. Can only be called * by the oracle's admin. * @param _oracle is the oracle whose LINK is transferred * @param _recipient is the address to send the LINK to * @param _amount is the amount of LINK to send */ function withdrawPayment(address _oracle, address _recipient, uint256 _amount) external { require(oracles[_oracle].admin == msg.sender, "only callable by admin"); // Safe to downcast _amount because the total amount of LINK is less than 2^128. uint128 amount = uint128(_amount); uint128 available = oracles[_oracle].withdrawable; require(available >= amount, "insufficient withdrawable funds"); oracles[_oracle].withdrawable = available.sub(amount); allocatedFunds = allocatedFunds.sub(amount); assert(linkToken.transfer(_recipient, uint256(amount))); } /** * @notice transfers the owner's LINK to another address * @param _recipient is the address to send the LINK to * @param _amount is the amount of LINK to send */ function withdrawFunds(address _recipient, uint256 _amount) external onlyOwner() { require(uint256(availableFunds).sub(requiredReserve(paymentAmount)) >= _amount, "insufficient reserve funds"); require(linkToken.transfer(_recipient, _amount), "token transfer failed"); updateAvailableFunds(); } /** * @notice get the latest submission for any oracle * @param _oracle is the address to lookup the latest submission for */ function latestSubmission(address _oracle) external view returns (int256, uint256) { return (oracles[_oracle].latestSubmission, oracles[_oracle].lastReportedRound); } /** * @notice get the admin address of an oracle * @param _oracle is the address of the oracle whose admin is being queried */ function getAdmin(address _oracle) external view returns (address) { return oracles[_oracle].admin; } /** * @notice transfer the admin address for an oracle * @param _oracle is the address of the oracle whose admin is being transfered * @param _newAdmin is the new admin address */ function transferAdmin(address _oracle, address _newAdmin) external { require(oracles[_oracle].admin == msg.sender, "only callable by admin"); oracles[_oracle].pendingAdmin = _newAdmin; emit OracleAdminUpdateRequested(_oracle, msg.sender, _newAdmin); } /** * @notice accept the admin address transfer for an oracle * @param _oracle is the address of the oracle whose admin is being transfered */ function acceptAdmin(address _oracle) external { require(oracles[_oracle].pendingAdmin == msg.sender, "only callable by pending admin"); oracles[_oracle].pendingAdmin = address(0); oracles[_oracle].admin = msg.sender; emit OracleAdminUpdated(_oracle, msg.sender); } /** * @notice allows non-oracles to request a new round */ function requestNewRound() external { require(requesters[msg.sender].authorized, "not authorized requester"); uint32 current = reportingRoundId; require(rounds[current].updatedAt > 0 || timedOut(current), "prev round must be supersedable"); requesterInitializeNewRound(current.add(1)); } /** * @notice allows the owner to specify new non-oracles to start new rounds * @param _requester is the address to set permissions for * @param _authorized is a boolean specifying whether they can start new rounds or not * @param _delay is the number of rounds the requester must wait before starting another round */ function setRequesterPermissions(address _requester, bool _authorized, uint32 _delay) external onlyOwner() { if (requesters[_requester].authorized == _authorized) return; if (_authorized) { requesters[_requester].authorized = _authorized; requesters[_requester].delay = _delay; } else { delete requesters[_requester]; } emit RequesterPermissionsSet(_requester, _authorized, _delay); } /** * @notice called through LINK's transferAndCall to update available funds * in the same transaction as the funds were transfered to the aggregator * @param _data is mostly ignored. It is checked for length, to be sure * nothing strange is passed in. */ function onTokenTransfer(address, uint256, bytes calldata _data) external { require(_data.length == 0, "transfer doesn't accept calldata"); updateAvailableFunds(); } /** * @notice a method to provide all current info oracles need. Intended only * only to be callable by oracles. Not for use by contracts to read state. * @param _oracle the address to look up information for. */ function oracleRoundState(address _oracle, uint32 _queriedRoundId) external view returns ( bool _eligibleToSubmit, uint32 _roundId, int256 _latestSubmission, uint64 _startedAt, uint64 _timeout, uint128 _availableFunds, uint32 _oracleCount, uint128 _paymentAmount ) { require(msg.sender == tx.origin, "off-chain reading only"); if (_queriedRoundId > 0) { Round storage round = rounds[_queriedRoundId]; return ( eligibleForSpecificRound(_oracle, _queriedRoundId), _queriedRoundId, oracles[_oracle].latestSubmission, round.startedAt, round.details.timeout, availableFunds, oracleCount(), (round.startedAt > 0 ? round.details.paymentAmount : paymentAmount) ); } else { return oracleRoundStateSuggestRound(_oracle); } } function eligibleForSpecificRound(address _oracle, uint32 _queriedRoundId) private view returns (bool _eligible) { if (rounds[_queriedRoundId].startedAt > 0) { return acceptingSubmissions(_queriedRoundId) && validateOracleRound(_oracle, _queriedRoundId).length == 0; } else { return delayed(_oracle, _queriedRoundId) && validateOracleRound(_oracle, _queriedRoundId).length == 0; } } function oracleRoundStateSuggestRound(address _oracle) private view returns ( bool _eligibleToSubmit, uint32 _roundId, int256 _latestSubmission, uint64 _startedAt, uint64 _timeout, uint128 _availableFunds, uint32 _oracleCount, uint128 _paymentAmount ) { Round storage round = rounds[0]; OracleStatus storage oracle = oracles[_oracle]; bool shouldSupersede = oracle.lastReportedRound == reportingRoundId || !acceptingSubmissions(reportingRoundId); // Instead of nudging oracles to submit to the next round, the inclusion of // the shouldSupersede bool in the if condition pushes them towards // submitting in a currently open round. if (supersedable(reportingRoundId) && shouldSupersede) { _roundId = reportingRoundId.add(1); round = rounds[_roundId]; _paymentAmount = paymentAmount; _eligibleToSubmit = delayed(_oracle, _roundId); } else { _roundId = reportingRoundId; round = rounds[_roundId]; _paymentAmount = round.details.paymentAmount; _eligibleToSubmit = acceptingSubmissions(_roundId); } if (validateOracleRound(_oracle, _roundId).length != 0) { _eligibleToSubmit = false; } return ( _eligibleToSubmit, _roundId, oracle.latestSubmission, round.startedAt, round.details.timeout, availableFunds, oracleCount(), _paymentAmount ); } /** * Private */ function initializeNewRound(uint32 _roundId) private { updateTimedOutRoundInfo(_roundId.sub(1)); reportingRoundId = _roundId; rounds[_roundId].details.maxSubmissions = maxSubmissionCount; rounds[_roundId].details.minSubmissions = minSubmissionCount; rounds[_roundId].details.paymentAmount = paymentAmount; rounds[_roundId].details.timeout = timeout; rounds[_roundId].startedAt = uint64(block.timestamp); emit NewRound(_roundId, msg.sender, rounds[_roundId].startedAt); } function oracleInitializeNewRound(uint32 _roundId) private { if (!newRound(_roundId)) return; uint256 lastStarted = oracles[msg.sender].lastStartedRound; // cache storage reads if (_roundId <= lastStarted + restartDelay && lastStarted != 0) return; initializeNewRound(_roundId); oracles[msg.sender].lastStartedRound = _roundId; } function requesterInitializeNewRound(uint32 _roundId) private { if (!newRound(_roundId)) return; uint256 lastStarted = requesters[msg.sender].lastStartedRound; // cache storage reads require(_roundId > lastStarted + requesters[msg.sender].delay || lastStarted == 0, "must delay requests"); initializeNewRound(_roundId); requesters[msg.sender].lastStartedRound = _roundId; } function updateTimedOutRoundInfo(uint32 _roundId) private { if (!timedOut(_roundId)) return; uint32 prevId = _roundId.sub(1); rounds[_roundId].answer = rounds[prevId].answer; rounds[_roundId].answeredInRound = rounds[prevId].answeredInRound; rounds[_roundId].updatedAt = uint64(block.timestamp); delete rounds[_roundId].details; } function updateRoundAnswer(uint32 _roundId) private { if (rounds[_roundId].details.submissions.length < rounds[_roundId].details.minSubmissions) return; int256 newAnswer = Median.calculateInplace(rounds[_roundId].details.submissions); rounds[_roundId].answer = newAnswer; rounds[_roundId].updatedAt = uint64(block.timestamp); rounds[_roundId].answeredInRound = _roundId; latestRoundId = _roundId; emit AnswerUpdated(newAnswer, _roundId, now); } function payOracle(uint32 _roundId) private { uint128 payment = rounds[_roundId].details.paymentAmount; uint128 available = availableFunds.sub(payment); availableFunds = available; allocatedFunds = allocatedFunds.add(payment); oracles[msg.sender].withdrawable = oracles[msg.sender].withdrawable.add(payment); emit AvailableFundsUpdated(available); } function recordSubmission(int256 _submission, uint32 _roundId) private { require(acceptingSubmissions(_roundId), "round not accepting submissions"); rounds[_roundId].details.submissions.push(_submission); oracles[msg.sender].lastReportedRound = _roundId; oracles[msg.sender].latestSubmission = _submission; emit SubmissionReceived(_submission, _roundId, msg.sender); } function deleteRoundDetails(uint32 _roundId) private { if (rounds[_roundId].details.submissions.length < rounds[_roundId].details.maxSubmissions) return; delete rounds[_roundId].details; } function timedOut(uint32 _roundId) private view returns (bool) { uint64 startedAt = rounds[_roundId].startedAt; uint32 roundTimeout = rounds[_roundId].details.timeout; return startedAt > 0 && roundTimeout > 0 && startedAt.add(roundTimeout) < block.timestamp; } function getStartingRound(address _oracle) private view returns (uint32) { uint32 currentRound = reportingRoundId; if (currentRound != 0 && currentRound == oracles[_oracle].endingRound) { return currentRound; } return currentRound.add(1); } function previousAndCurrentUnanswered(uint32 _roundId, uint32 _rrId) private view returns (bool) { return _roundId.add(1) == _rrId && rounds[_rrId].updatedAt == 0; } function requiredReserve(uint256 payment) private view returns (uint256) { return payment.mul(oracleCount()).mul(RESERVE_ROUNDS); } function addOracle( address _oracle, address _admin ) private { require(!oracleEnabled(_oracle), "oracle already enabled"); require(_admin != address(0), "cannot set admin to 0"); require(oracles[_oracle].admin == address(0) || oracles[_oracle].admin == _admin, "owner cannot overwrite admin"); oracles[_oracle].startingRound = getStartingRound(_oracle); oracles[_oracle].endingRound = ROUND_MAX; oracles[_oracle].index = uint16(oracleAddresses.length); oracleAddresses.push(_oracle); oracles[_oracle].admin = _admin; emit OraclePermissionsUpdated(_oracle, true); emit OracleAdminUpdated(_oracle, _admin); } function removeOracle( address _oracle ) private { require(oracleEnabled(_oracle), "oracle not enabled"); oracles[_oracle].endingRound = reportingRoundId.add(1); address tail = oracleAddresses[oracleCount().sub(1)]; uint16 index = oracles[_oracle].index; oracles[tail].index = index; delete oracles[_oracle].index; oracleAddresses[index] = tail; oracleAddresses.pop(); emit OraclePermissionsUpdated(_oracle, false); } function validateOracleRound(address _oracle, uint32 _roundId) private view returns (bytes memory) { // cache storage reads uint32 startingRound = oracles[_oracle].startingRound; uint32 rrId = reportingRoundId; if (startingRound == 0) return "not enabled oracle"; if (startingRound > _roundId) return "not yet enabled oracle"; if (oracles[_oracle].endingRound < _roundId) return "no longer allowed oracle"; if (oracles[_oracle].lastReportedRound >= _roundId) return "cannot report on previous rounds"; if (_roundId != rrId && _roundId != rrId.add(1) && !previousAndCurrentUnanswered(_roundId, rrId)) return "invalid round to report"; if (_roundId != 1 && !supersedable(_roundId.sub(1))) return "previous round not supersedable"; } function supersedable(uint32 _roundId) private view returns (bool) { return rounds[_roundId].updatedAt > 0 || timedOut(_roundId); } function oracleEnabled(address _oracle) private view returns (bool) { return oracles[_oracle].endingRound == ROUND_MAX; } function acceptingSubmissions(uint32 _roundId) private view returns (bool) { return rounds[_roundId].details.maxSubmissions != 0; } function delayed(address _oracle, uint32 _roundId) private view returns (bool) { uint256 lastStarted = oracles[_oracle].lastStartedRound; return _roundId > lastStarted + restartDelay || lastStarted == 0; } function newRound(uint32 _roundId) private view returns (bool) { return _roundId == reportingRoundId.add(1); } } /** * @title SimpleAccessControl * @notice Allows the owner to set access for addresses */ contract SimpleAccessControl is AccessControllerInterface, Owned { bool public checkEnabled; mapping(address => bool) internal accessList; event AddedAccess(address user); event RemovedAccess(address user); event CheckAccessEnabled(); event CheckAccessDisabled(); constructor() public { checkEnabled = true; } /** * @notice Returns the access of an address * @param _user The address to query */ function hasAccess( address _user, bytes memory ) public view override returns (bool) { return accessList[_user] || !checkEnabled || _user == tx.origin; } /** * @notice Adds an address to the access list * @param _user The address to add */ function addAccess(address _user) external onlyOwner() { accessList[_user] = true; emit AddedAccess(_user); } /** * @notice Removes an address from the access list * @param _user The address to remove */ function removeAccess(address _user) external onlyOwner() { delete accessList[_user]; emit RemovedAccess(_user); } /** * @notice makes the access check enforced */ function enableAccessCheck() external onlyOwner() { checkEnabled = true; emit CheckAccessEnabled(); } /** * @notice makes the access check unenforced */ function disableAccessCheck() external onlyOwner() { checkEnabled = false; emit CheckAccessDisabled(); } /** * @dev reverts if the caller does not have access * @dev WARNING: This modifier should only be used on view methods */ modifier checkAccess() { require(hasAccess(msg.sender, msg.data), "No access"); _; } } /** * @title AccessControlled FluxAggregator contract * @notice This contract requires addresses to be added to a controller * in order to read the answers stored in the FluxAggregator contract */ contract AccessControlledAggregator is FluxAggregator, SimpleAccessControl { constructor( address _link, uint128 _paymentAmount, uint32 _timeout, int256 _minSubmissionValue, int256 _maxSubmissionValue, uint8 _decimals, string memory _description ) public FluxAggregator( _link, _paymentAmount, _timeout, _minSubmissionValue, _maxSubmissionValue, _decimals, _description ){} /** * @notice get the most recently reported answer * @dev overridden funcion to add the checkAccess() modifier * @dev deprecated. Use latestRoundData instead. */ function latestAnswer() public view override checkAccess() returns (int256) { return super.latestAnswer(); } /** * @notice get the most recent updated at timestamp * @dev overridden funcion to add the checkAccess() modifier * @dev deprecated. Use latestRoundData instead. */ function latestTimestamp() public view override checkAccess() returns (uint256) { return super.latestTimestamp(); } /** * @notice get past rounds answers * @dev overridden funcion to add the checkAccess() modifier * @param _roundId the round number to retrieve the answer for * @dev deprecated. Use getRoundData instead. */ function getAnswer(uint256 _roundId) public view override checkAccess() returns (int256) { return super.getAnswer(_roundId); } /** * @notice get timestamp when an answer was last updated * @dev overridden funcion to add the checkAccess() modifier * @param _roundId the round number to retrieve the updated timestamp for * @dev deprecated. Use getRoundData instead. */ function getTimestamp(uint256 _roundId) public view override checkAccess() returns (uint256) { return super.getTimestamp(_roundId); } /** * @notice get data about a round. Consumers are encouraged to check * that they're receiving fresh data by inspecting the updatedAt and * answeredInRound return values. * @param _roundId the round ID to retrieve the round data for * @return roundId is the round ID for which data was retrieved * @return answer is the answer for the given round * @return startedAt is the timestamp when the round was started. This is 0 * if the round hasn't been started yet. * @return updatedAt is the timestamp when the round last was updated (i.e. * answer was last computed) * @return answeredInRound is the round ID of the round in which the answer * was computed. answeredInRound may be smaller than roundId when the round * timed out. answerInRound is equal to roundId when the round didn't time out * and was completed regularly. * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received * maxSubmissions) answer and updatedAt may change between queries. */ function getRoundData(uint256 _roundId) public view override checkAccess() returns ( uint256 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint256 answeredInRound ) { return super.getRoundData(_roundId); } /** * @notice get data about the latest round. Consumers are encouraged to check * that they're receiving fresh data by inspecting the updatedAt and * answeredInRound return values. Consumers are encouraged to * use this more fully featured method over the "legacy" getAnswer/ * latestAnswer/getTimestamp/latestTimestamp functions. Consumers are * encouraged to check that they're receiving fresh data by inspecting the * updatedAt and answeredInRound return values. * @return roundId is the round ID for which data was retrieved * @return answer is the answer for the given round * @return startedAt is the timestamp when the round was started. This is 0 * if the round hasn't been started yet. * @return updatedAt is the timestamp when the round last was updated (i.e. * answer was last computed) * @return answeredInRound is the round ID of the round in which the answer * was computed. answeredInRound may be smaller than roundId when the round * timed out. answerInRound is equal to roundId when the round didn't time out * and was completed regularly. * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received * maxSubmissions) answer and updatedAt may change between queries. */ function latestRoundData() public view override checkAccess() returns ( uint256 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint256 answeredInRound ) { return super.latestRoundData(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_link","type":"address"},{"internalType":"uint128","name":"_paymentAmount","type":"uint128"},{"internalType":"uint32","name":"_timeout","type":"uint32"},{"internalType":"int256","name":"_minSubmissionValue","type":"int256"},{"internalType":"int256","name":"_maxSubmissionValue","type":"int256"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"string","name":"_description","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"AddedAccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AvailableFundsUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"CheckAccessDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"CheckAccessEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"OracleAdminUpdateRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"OracleAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":true,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"OraclePermissionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"RemovedAccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"},{"indexed":false,"internalType":"uint32","name":"delay","type":"uint32"}],"name":"RequesterPermissionsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint128","name":"paymentAmount","type":"uint128"},{"indexed":true,"internalType":"uint32","name":"minSubmissionCount","type":"uint32"},{"indexed":true,"internalType":"uint32","name":"maxSubmissionCount","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"restartDelay","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"timeout","type":"uint32"}],"name":"RoundDetailsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"submission","type":"int256"},{"indexed":true,"internalType":"uint32","name":"round","type":"uint32"},{"indexed":true,"internalType":"address","name":"oracle","type":"address"}],"name":"SubmissionReceived","type":"event"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_oracles","type":"address[]"},{"internalType":"address[]","name":"_admins","type":"address[]"},{"internalType":"uint32","name":"_minSubmissions","type":"uint32"},{"internalType":"uint32","name":"_maxSubmissions","type":"uint32"},{"internalType":"uint32","name":"_restartDelay","type":"uint32"}],"name":"addOracles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocatedFunds","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableFunds","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAccessCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAccessCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOracles","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getRoundData","outputs":[{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint256","name":"answeredInRound","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"hasAccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint256","name":"answeredInRound","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"latestSubmission","outputs":[{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkToken","outputs":[{"internalType":"contract LinkTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSubmissionCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSubmissionValue","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSubmissionCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSubmissionValue","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"oracleCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"uint32","name":"_queriedRoundId","type":"uint32"}],"name":"oracleRoundState","outputs":[{"internalType":"bool","name":"_eligibleToSubmit","type":"bool"},{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_latestSubmission","type":"int256"},{"internalType":"uint64","name":"_startedAt","type":"uint64"},{"internalType":"uint64","name":"_timeout","type":"uint64"},{"internalType":"uint128","name":"_availableFunds","type":"uint128"},{"internalType":"uint32","name":"_oracleCount","type":"uint32"},{"internalType":"uint128","name":"_paymentAmount","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_oracles","type":"address[]"},{"internalType":"uint32","name":"_minSubmissions","type":"uint32"},{"internalType":"uint32","name":"_maxSubmissions","type":"uint32"},{"internalType":"uint32","name":"_restartDelay","type":"uint32"}],"name":"removeOracles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportingRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestNewRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartDelay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_requester","type":"address"},{"internalType":"bool","name":"_authorized","type":"bool"},{"internalType":"uint32","name":"_delay","type":"uint32"}],"name":"setRequesterPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"},{"internalType":"int256","name":"_submission","type":"int256"}],"name":"submit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeout","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateAvailableFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_paymentAmount","type":"uint128"},{"internalType":"uint32","name":"_minSubmissions","type":"uint32"},{"internalType":"uint32","name":"_maxSubmissions","type":"uint32"},{"internalType":"uint32","name":"_restartDelay","type":"uint32"},{"internalType":"uint32","name":"_timeout","type":"uint32"}],"name":"updateFutureRounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"withdrawablePayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162004aa838038062004aa8833981810160405260e08110156200003757600080fd5b815160208301516040808501516060860151608087015160a088015160c089018051955197999698949793969295919483019291846401000000008211156200007f57600080fd5b9083019060208201858111156200009557600080fd5b8251640100000000811182820188101715620000b057600080fd5b82525081516020918201929091019080838360005b83811015620000df578181015183820152602001620000c5565b50505050905090810190601f1680156200010d5780820380516001836020036101000a031916815260200191505b50604052505060008054336001600160a01b031991821617909155600280549091166001600160a01b038a1617905550600480546001600160801b0319166001600160801b038816176001600160e01b0316600160e01b63ffffffff881602179055608084905260a08390526005805460ff191660ff841617905580518790879087908790879087908790620001ab906006906020840190620002a4565b50620001cc8563ffffffff16426200024660201b62002f791790919060201c565b6000805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c80546001600160401b03929092166801000000000000000002600160401b600160801b03199092169190911790555050600c805460ff1916600117905550620003499a5050505050505050505050565b6000828211156200029e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002e757805160ff191683800117855562000317565b8280016001018555821562000317579182015b8281111562000317578251825591602001919060010190620002fa565b506200032592915062000329565b5090565b6200034691905b8082111562000325576000815560010162000330565b90565b60805160a0516147316200037760003980610c7e5280610ee8525080610c0952806119b752506147316000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806379ba509711610167578063bb07bacd116100ce578063dc7f012411610087578063dc7f0124146109c6578063e2e40317146109ce578063e9ee6eeb146109f4578063ebf8571c14610a22578063f2fde38b14610aa8578063feaf968c14610ace576102a0565b8063bb07bacd1461086d578063bbf0b7e9146108ac578063c107532914610982578063c35905c6146109ae578063c9374500146109b6578063d4cc54e4146109be576102a0565b80638da5cb5b116101205780638da5cb5b1461077a57806398e5b12a14610782578063a118f2491461078a578063a4c0ed36146107b0578063b5ab58dc14610833578063b633620c14610850576102a0565b806379ba50971461069e5780637c2b0b21146106a65780638038e4a1146106ae5780638205bf6a146106b65780638823da6c146106be57806388aa80e7146106e4576102a0565b806350d25bcd1161020b57806364efb22b116101c457806364efb22b1461051b578063668a0f02146105415780636b14daf8146105495780636fb4bb4e1461061157806370dea79a146106195780637284e41614610621576102a0565b806350d25bcd146104b157806354fd4d50146104b957806357970e93146104c157806358609e44146104e5578063613d8fcc146104ed578063628806ef146104f5576102a0565b8063357ebb021161025d578063357ebb021461038c57806338aa4c72146103ad5780633d3d7714146103f757806340884c521461042d57806346fcff4c146104855780634f8fc3b5146104a9576102a0565b80630720da52146102a55780630a756983146102ed578063202ee0ed146102f757806320ed02751461031a57806323ca290314610354578063313ce5671461036e575b600080fd5b6102c2600480360360208110156102bb57600080fd5b5035610ad6565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102f5610b77565b005b6102f56004803603604081101561030d57600080fd5b5080359060200135610bf9565b6102f56004803603606081101561033057600080fd5b5080356001600160a01b03169060208101351515906040013563ffffffff16610db2565b61035c610ee6565b60408051918252519081900360200190f35b610376610f0a565b6040805160ff9092168252519081900360200190f35b610394610f13565b6040805163ffffffff9092168252519081900360200190f35b6102f5600480360360a08110156103c357600080fd5b506001600160801b038135169063ffffffff6020820135811691604081013582169160608201358116916080013516610f26565b6102f56004803603606081101561040d57600080fd5b506001600160a01b038135811691602081013590911690604001356112d0565b6104356114c3565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610471578181015183820152602001610459565b505050509050019250505060405180910390f35b61048d611526565b604080516001600160801b039092168252519081900360200190f35b6102f561153c565b61035c611636565b61035c6116c3565b6104c96116c8565b604080516001600160a01b039092168252519081900360200190f35b6103946116d7565b6103946116ea565b6102f56004803603602081101561050b57600080fd5b50356001600160a01b03166116f0565b6104c96004803603602081101561053157600080fd5b50356001600160a01b03166117d6565b61035c611800565b6105fd6004803603604081101561055f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561058957600080fd5b82018360208201111561059b57600080fd5b803590602001918460018302840111600160201b831117156105bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611813945050505050565b604080519115158252519081900360200190f35b61035c611859565b610394611865565b610629611878565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561066357818101518382015260200161064b565b50505050905090810190601f1680156106905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f5611906565b61035c6119b5565b6102f56119d9565b61035c611a5e565b6102f5600480360360208110156106d457600080fd5b50356001600160a01b0316611ae6565b610716600480360360408110156106fa57600080fd5b5080356001600160a01b0316906020013563ffffffff16611b8b565b60408051981515895263ffffffff97881660208a0152888101969096526001600160401b0394851660608901529290931660808701526001600160801b0390811660a08701529190931660c08501529190911660e083015251908190036101000190f35b6104c9611ce8565b6102f5611cf7565b6102f5600480360360208110156107a057600080fd5b50356001600160a01b0316611e08565b6102f5600480360360608110156107c657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156107f557600080fd5b82018360208201111561080757600080fd5b803590602001918460018302840111600160201b8311171561082857600080fd5b509092509050611eb0565b61035c6004803603602081101561084957600080fd5b5035611f11565b61035c6004803603602081101561086657600080fd5b5035611f9a565b6108936004803603602081101561088357600080fd5b50356001600160a01b0316612023565b6040805192835260208301919091528051918290030190f35b6102f5600480360360a08110156108c257600080fd5b810190602081018135600160201b8111156108dc57600080fd5b8201836020820111156108ee57600080fd5b803590602001918460208302840111600160201b8311171561090f57600080fd5b919390929091602081019035600160201b81111561092c57600080fd5b82018360208201111561093e57600080fd5b803590602001918460208302840111600160201b8311171561095f57600080fd5b919350915063ffffffff8135811691602081013582169160409091013516612054565b6102f56004803603604081101561099857600080fd5b506001600160a01b0381351690602001356121e7565b61048d61238e565b61039461239d565b61048d6123b0565b6105fd6123bf565b61035c600480360360208110156109e457600080fd5b50356001600160a01b03166123c8565b6102f560048036036040811015610a0a57600080fd5b506001600160a01b03813581169160200135166123ec565b6102f560048036036080811015610a3857600080fd5b810190602081018135600160201b811115610a5257600080fd5b820183602082011115610a6457600080fd5b803590602001918460208302840111600160201b83111715610a8557600080fd5b919350915063ffffffff81358116916020810135821691604090910135166124cf565b6102f560048036036020811015610abe57600080fd5b50356001600160a01b031661257e565b6102c261261c565b6000806000806000610b1f336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b610b5c576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b610b65866126bb565b939a9299509097509550909350915050565b6000546001600160a01b03163314610bc4576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600c805460ff191690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a1565b6060610c05338461280c565b90507f0000000000000000000000000000000000000000000000000000000000000000821215610c7c576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652062656c6f77206d696e5375626d697373696f6e56616c75650000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000821315610cf1576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652061626f7665206d61785375626d697373696f6e56616c75650000604482015290519081900360640190fd5b8051819015610d7e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d43578181015183820152602001610d2b565b50505050905090810190601f168015610d705780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610d8883612aae565b610d928284612b43565b610d9b83612c1f565b610da483612d6e565b610dad83612e71565b505050565b6000546001600160a01b03163314610dff576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1615158215151415610e2b57610dad565b8115610e6e576001600160a01b0383166000908152600a60205260409020805460ff19168315151764ffffffff00191661010063ffffffff841602179055610e97565b6001600160a01b0383166000908152600a60205260409020805468ffffffffffffffffff191690555b60408051831515815263ffffffff8316602082015281516001600160a01b038616927fc3df5a754e002718f2e10804b99e6605e7c701d95cec9552c7680ca2b6f2820a928290030190a2505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60055460ff1681565b600454600160c01b900463ffffffff1681565b6000546001600160a01b03163314610f73576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6000610f7d6116ea565b90508463ffffffff168463ffffffff161015610fe0576040805162461bcd60e51b815260206004820152601960248201527f6d6178206d75737420657175616c2f657863656564206d696e00000000000000604482015290519081900360640190fd5b8363ffffffff168163ffffffff161015611041576040805162461bcd60e51b815260206004820152601760248201527f6d61782063616e6e6f742065786365656420746f74616c000000000000000000604482015290519081900360640190fd5b63ffffffff8116158061105f57508263ffffffff168163ffffffff16115b6110b0576040805162461bcd60e51b815260206004820152601960248201527f64656c61792063616e6e6f742065786365656420746f74616c00000000000000604482015290519081900360640190fd5b6110c2866001600160801b0316612ed7565b600354600160801b90046001600160801b03161015611128576040805162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e742066756e647320666f72207061796d656e740000604482015290519081900360640190fd5b60006111326116ea565b63ffffffff1611156111995760008563ffffffff1611611199576040805162461bcd60e51b815260206004820152601a60248201527f6d696e206d7573742062652067726561746572207468616e2030000000000000604482015290519081900360640190fd5b85600460006101000a8154816001600160801b0302191690836001600160801b0316021790555084600460146101000a81548163ffffffff021916908363ffffffff16021790555083600460106101000a81548163ffffffff021916908363ffffffff16021790555082600460186101000a81548163ffffffff021916908363ffffffff160217905550816004601c6101000a81548163ffffffff021916908363ffffffff1602179055508363ffffffff168563ffffffff16600460009054906101000a90046001600160801b03166001600160801b03167f56800c9d1ed723511246614d15e58cfcde15b6a33c245b5c961b689c1890fd8f8686604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a4505050505050565b6001600160a01b03838116600090815260086020526040902060020154620100009004163314611340576040805162461bcd60e51b815260206004820152601660248201527537b7363c9031b0b63630b1363290313c9030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b03831660009081526008602052604090205481906001600160801b039081169082168110156113bd576040805162461bcd60e51b815260206004820152601f60248201527f696e73756666696369656e7420776974686472617761626c652066756e647300604482015290519081900360640190fd5b6113d66001600160801b0382168363ffffffff612f0a16565b6001600160a01b038616600090815260086020526040902080546001600160801b0319166001600160801b03928316179055600354611416911683612f0a565b600380546001600160801b0319166001600160801b039283161790556002546040805163a9059cbb60e01b81526001600160a01b03888116600483015293861660248201529051929091169163a9059cbb916044808201926020929091908290030181600087803b15801561148a57600080fd5b505af115801561149e573d6000803e3d6000fd5b505050506040513d60208110156114b457600080fd5b50516114bc57fe5b5050505050565b6060600b80548060200260200160405190810160405280929190818152602001828054801561151b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114fd575b505050505090505b90565b600354600160801b90046001600160801b031681565b600354600254604080516370a0823160e01b815230600482015290516001600160801b03600160801b85048116946000946115df9492909116926001600160a01b03909116916370a08231916024808301926020929190829003018186803b1580156115a757600080fd5b505afa1580156115bb573d6000803e3d6000fd5b505050506040513d60208110156115d157600080fd5b50519063ffffffff612f7916565b600380546001600160801b03908116600160801b8483160217909155909150821681146116325760405181907ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f90600090a25b5050565b6000611679336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b6116b6576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6116be612fd0565b905090565b600381565b6002546001600160a01b031681565b600454600160801b900463ffffffff1681565b600b5490565b6001600160a01b03818116600090815260086020526040902060030154163314611761576040805162461bcd60e51b815260206004820152601e60248201527f6f6e6c792063616c6c61626c652062792070656e64696e672061646d696e0000604482015290519081900360640190fd5b6001600160a01b0381166000818152600860205260408082206003810180546001600160a01b0319169055600201805462010000600160b01b031916336201000081029190911790915590519092917f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90491a350565b6001600160a01b03808216600090815260086020526040902060020154620100009004165b919050565b600754600160201b900463ffffffff1690565b6001600160a01b0382166000908152600d602052604081205460ff168061183d5750600c5460ff16155b8061185057506001600160a01b03831632145b90505b92915050565b60075463ffffffff1690565b600454600160e01b900463ffffffff1681565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156118fe5780601f106118d3576101008083540402835291602001916118fe565b820191906000526020600020905b8154815290600101906020018083116118e157829003601f168201915b505050505081565b6001546001600160a01b0316331461195e576040805162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015290519081900360640190fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314611a26576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600c805460ff191660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6000611aa1336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b611ade576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6116be612ff2565b6000546001600160a01b03163314611b33576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff19169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a150565b600080808080808080333214611be1576040805162461bcd60e51b81526020600482015260166024820152756f66662d636861696e2072656164696e67206f6e6c7960501b604482015290519081900360640190fd5b63ffffffff891615611cc15763ffffffff89166000908152600960205260409020611c0c8b8b613027565b6001600160a01b038c1660009081526008602052604090206001908101549083015460038085015490548e93926001600160401b031691600160401b900463ffffffff1690600160801b90046001600160801b0316611c696116ea565b60018801546001600160401b0316611c8c576004546001600160801b0316611ca2565b6003880154600160601b90046001600160801b03165b8363ffffffff1693509850985098509850985098509850985050611cdb565b611cca8a61307c565b975097509750975097509750975097505b9295985092959890939650565b6000546001600160a01b031681565b336000908152600a602052604090205460ff16611d5b576040805162461bcd60e51b815260206004820152601860248201527f6e6f7420617574686f72697a6564207265717565737465720000000000000000604482015290519081900360640190fd5b60075463ffffffff16600081815260096020526040902060010154600160401b90046001600160401b0316151580611d975750611d9781613238565b611de8576040805162461bcd60e51b815260206004820152601f60248201527f7072657620726f756e64206d75737420626520737570657273656461626c6500604482015290519081900360640190fd5b611e05611e0063ffffffff808416906001906132bb16565b61330c565b50565b6000546001600160a01b03163314611e55576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff19166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b8015611f03576040805162461bcd60e51b815260206004820181905260248201527f7472616e7366657220646f65736e2774206163636570742063616c6c64617461604482015290519081900360640190fd5b611f0b61153c565b50505050565b6000611f54336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b611f91576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611853826133da565b6000611fdd336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b61201a576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611853826133f2565b6001600160a01b03166000908152600860205260409020600181015490549091600160c01b90910463ffffffff1690565b6000546001600160a01b031633146120a1576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b8584146120f5576040805162461bcd60e51b815260206004820181905260248201527f6e6565642073616d65206f7261636c6520616e642061646d696e20636f756e74604482015290519081900360640190fd5b604d612117876121036116ea565b63ffffffff1661341d90919063ffffffff16565b1115612160576040805162461bcd60e51b81526020600482015260136024820152721b585e081bdc9858db195cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60005b868110156121b3576121ab88888381811061217a57fe5b905060200201356001600160a01b031687878481811061219657fe5b905060200201356001600160a01b0316613465565b600101612163565b506004546121de906001600160801b03811690859085908590600160e01b900463ffffffff16610f26565b50505050505050565b6000546001600160a01b03163314612234576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b60045481906122689061224f906001600160801b0316612ed7565b600354600160801b90046001600160801b031690612f79565b10156122bb576040805162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e7420726573657276652066756e6473000000000000604482015290519081900360640190fd5b6002546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b505050506040513d602081101561233b57600080fd5b5051612386576040805162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015290519081900360640190fd5b61163261153c565b6004546001600160801b031681565b600454600160a01b900463ffffffff1681565b6003546001600160801b031681565b600c5460ff1681565b6001600160a01b03166000908152600860205260409020546001600160801b031690565b6001600160a01b0382811660009081526008602052604090206002015462010000900416331461245c576040805162461bcd60e51b815260206004820152601660248201527537b7363c9031b0b63630b1363290313c9030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b0382811660008181526008602090815260409182902060030180546001600160a01b0319169486169485179055815133815290810193909352805191927fb79bf2e89c2d70dde91d2991fb1ea69b7e478061ad7c04ed5b02b96bc52b8104929081900390910190a25050565b6000546001600160a01b0316331461251c576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b60005b848110156125535761254b86868381811061253657fe5b905060200201356001600160a01b03166136f5565b60010161251f565b506004546114bc906001600160801b03811690859085908590600160e01b900463ffffffff16610f26565b6000546001600160a01b031633146125cb576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000806000806000612665336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b6126a2576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6126aa6138ce565b945094509450945094509091929394565b60008060008060006126cb6145c3565b63ffffffff808816600090815260096020908152604091829020825160a080820185528254825260018301546001600160401b0380821684870152600160401b82041683870152600160801b90049095166060820152835160028301805460c09581028301860190965295810185815291959294608087019491939284929091849184018282801561277c57602002820191906000526020600020905b815481526020019060010190808311612768575b50505091835250506001919091015463ffffffff808216602080850191909152600160201b83048216604080860191909152600160401b84048316606080870191909152600160601b9094046001600160801b031660809095019490945293909452855192860151918601519501519b9c919b6001600160401b039182169b509416985092169550909350505050565b6001600160a01b03821660009081526008602052604090205460075460609163ffffffff600160801b909104811691168161287557604051806040016040528060128152602001716e6f7420656e61626c6564206f7261636c6560701b81525092505050611853565b8363ffffffff168263ffffffff1611156128c157604051806040016040528060168152602001756e6f742079657420656e61626c6564206f7261636c6560501b81525092505050611853565b6001600160a01b03851660009081526008602052604090205463ffffffff808616600160a01b909204161015612930576040518060400160405280601881526020017f6e6f206c6f6e67657220616c6c6f776564206f7261636c65000000000000000081525092505050611853565b6001600160a01b03851660009081526008602052604090205463ffffffff808616600160c01b909204161061299e576040518060400160405280602081526020017f63616e6e6f74207265706f7274206f6e2070726576696f757320726f756e647381525092505050611853565b8063ffffffff168463ffffffff16141580156129da57506129ca63ffffffff808316906001906132bb16565b63ffffffff168463ffffffff1614155b80156129ed57506129eb84826138f7565b155b15612a31576040518060400160405280601781526020017f696e76616c696420726f756e6420746f207265706f727400000000000000000081525092505050611853565b8363ffffffff16600114158015612a625750612a60612a5b63ffffffff8087169060019061395716565b6139ba565b155b15612aa6576040518060400160405280601f81526020017f70726576696f757320726f756e64206e6f7420737570657273656461626c650081525092505050611853565b505092915050565b612ab7816139f4565b612ac057611e05565b3360009081526008602052604090205460045463ffffffff600160e01b909204821691600160c01b9091048116820190831611801590612aff57508015155b15612b0a5750611e05565b612b1382613a25565b50336000908152600860205260409020805463ffffffff8316600160e01b026001600160e01b0390911617905550565b612b4c81613b6a565b612b9d576040805162461bcd60e51b815260206004820152601f60248201527f726f756e64206e6f7420616363657074696e67207375626d697373696f6e7300604482015290519081900360640190fd5b63ffffffff8116600081815260096020908152604080832060020180546001808201835591855283852001879055338085526008909352818420805463ffffffff60c01b1916600160c01b8702178155018690555190929185917f92e98423f8adac6e64d0608e519fd1cefb861498385c6dee70d58fc926ddc68c9190a45050565b63ffffffff80821660009081526009602052604090206003810154600290910154600160201b9091049091161115612c5657611e05565b63ffffffff811660009081526009602090815260408083206002018054825181850281018501909352808352612cbf93830182828015612cb557602002820191906000526020600020905b815481526020019060010190808311612ca1575b5050505050613b8a565b63ffffffff8316600081815260096020908152604091829020848155600101805467ffffffffffffffff60401b1916600160401b426001600160401b038116919091029190911763ffffffff60801b1916600160801b8602179091556007805467ffffffff000000001916600160201b860217905582519081529151939450919284927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f928290030190a35050565b63ffffffff808216600090815260096020526040812060039081015490546001600160801b03600160601b909204821693612db792600160801b909204909116908490612f0a16565b600380546001600160801b03908116600160801b848316021791829055919250612de2911683613c33565b600380546001600160801b0319166001600160801b0392831617905533600090815260086020526040902054612e19911683613c33565b3360009081526008602052604080822080546001600160801b0319166001600160801b0394851617905551918316917ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f9190a2505050565b63ffffffff8082166000908152600960205260409020600381015460029091015491161115612e9f57611e05565b63ffffffff8116600090815260096020526040812060020190612ec2828261460f565b5060010180546001600160e01b031916905550565b60006118536002612efe612ee96116ea565b63ffffffff1685613c8790919063ffffffff16565b9063ffffffff613c8716565b6000826001600160801b0316826001600160801b03161115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082821115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b600754600160201b900463ffffffff1660009081526009602052604090205490565b600754600160201b900463ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031690565b63ffffffff81166000908152600960205260408120600101546001600160401b0316156130725761305782613b6a565b801561306b5750613068838361280c565b51155b9050611853565b6130578383613ce0565b6001600160a01b0381166000908152600860205260408120600754815483928392839283928392839283927fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b929091849163ffffffff908116600160c01b9092041614806130f957506007546130f79063ffffffff16613b6a565b155b60075490915061310e9063ffffffff166139ba565b80156131175750805b15613170576007546131359063ffffffff908116906001906132bb16565b63ffffffff81166000908152600960205260409020600454919b506001600160801b03909116945092506131698c8b613ce0565b9a506131b0565b60075463ffffffff1660008181526009602052604090206003810154919b50600160601b9091046001600160801b0316945092506131ad8a613b6a565b9a505b6131ba8c8b61280c565b51156131c55760009a505b6001828101549084015460038086015490548e938e9390926001600160401b0390911691600160401b90910463ffffffff1690600160801b90046001600160801b03166132106116ea565b8a8363ffffffff1693509a509a509a509a509a509a509a509a50505050919395975091939597565b63ffffffff8082166000908152600960205260408120600181015460039091015491926001600160401b0390911691600160401b9004168115801590613284575060008163ffffffff16115b80156132b35750426132a86001600160401b03841663ffffffff80851690613d2a16565b6001600160401b0316105b949350505050565b600082820163ffffffff8085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b613315816139f4565b61331e57611e05565b336000908152600a602052604090205463ffffffff6501000000000082048116916101009004811682019083161180613355575080155b61339c576040805162461bcd60e51b81526020600482015260136024820152726d7573742064656c617920726571756573747360681b604482015290519081900360640190fd5b6133a582613a25565b50336000908152600a60205260409020805463ffffffff8316650100000000000268ffffffff00000000001990911617905550565b63ffffffff1660009081526009602052604090205490565b63ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031690565b600082820183811015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b61346e82613d7e565b156134b9576040805162461bcd60e51b81526020600482015260166024820152751bdc9858db1948185b1c9958591e48195b98589b195960521b604482015290519081900360640190fd5b6001600160a01b03811661350c576040805162461bcd60e51b8152602060048201526015602482015274063616e6e6f74207365742061646d696e20746f203605c1b604482015290519081900360640190fd5b6001600160a01b0382811660009081526008602052604090206002015462010000900416158061356157506001600160a01b038281166000908152600860205260409020600201546201000090048116908216145b6135b2576040805162461bcd60e51b815260206004820152601c60248201527f6f776e65722063616e6e6f74206f76657277726974652061646d696e00000000604482015290519081900360640190fd5b6135bb82613da9565b6001600160a01b03808416600081815260086020526040808220805463ffffffff60a01b1963ffffffff97909716600160801b0263ffffffff60801b19909116179590951663ffffffff60a01b178555600b80546002909601805461ffff90971661ffff19909716969096178655805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916851790558383528554948716620100000262010000600160b01b0319909516949094179094559251919290917f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e9190a3806001600160a01b0316826001600160a01b03167f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90460405160405180910390a35050565b6136fe81613d7e565b613744576040805162461bcd60e51b81526020600482015260126024820152711bdc9858db19481b9bdd08195b98589b195960721b604482015290519081900360640190fd5b60075461375d9063ffffffff908116906001906132bb16565b6001600160a01b0382166000908152600860205260408120805463ffffffff93909316600160a01b0263ffffffff60a01b1990931692909217909155600b6137bc60016137a86116ea565b63ffffffff1661395790919063ffffffff16565b63ffffffff16815481106137cc57fe5b6000918252602080832091909101546001600160a01b0385811680855260089093526040808520600290810180549390941680875291862001805461ffff90931661ffff199384168117909155939094528154169055600b805492935090918391908390811061383857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b80548061387157fe5b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b038516907f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e908390a3505050565b60008060008060006126aa600760049054906101000a900463ffffffff1663ffffffff16610ad6565b60008163ffffffff1661391a60018563ffffffff166132bb90919063ffffffff16565b63ffffffff1614801561185057505063ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031615919050565b60008263ffffffff168263ffffffff161115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b63ffffffff8116600090815260096020526040812060010154600160401b90046001600160401b0316151580611853575061185382613238565b600754600090613a109063ffffffff908116906001906132bb16565b63ffffffff168263ffffffff16149050919050565b613a42613a3d63ffffffff8084169060019061395716565b613e13565b6007805463ffffffff1990811663ffffffff84811691821790935560048054600083815260096020908152604091829020600381018054600160801b90950489169490971693909317808755845467ffffffff0000000019909116600160a01b9091048816600160201b021780875584546fffffffffffffffffffffffffffffffff60601b199091166001600160801b03909116600160601b021780875593546bffffffff000000000000000019909416600160e01b909404909616600160401b0292909217909355600192909201805467ffffffffffffffff1916426001600160401b0390811691909117918290558351911681529151339391927f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac6027192908290030190a350565b63ffffffff90811660009081526009602052604090206003015416151590565b60008151600010613bdb576040805162461bcd60e51b81526020600482015260166024820152756c697374206d757374206e6f7420626520656d70747960501b604482015290519081900360640190fd5b81516002810460018216613c1a57600080613c00866000600187036001870387613ed1565b9092509050613c0f8282613faf565b9450505050506117fb565b613c2a846000600185038461401d565b925050506117fb565b60008282016001600160801b038085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b600082613c9657506000611853565b82820282848281613ca357fe5b04146118505760405162461bcd60e51b81526004018080602001828103825260218152602001806146bb6021913960400191505060405180910390fd5b6001600160a01b03821660009081526008602052604081205460045463ffffffff600160e01b909204821691600160c01b9091048116820190841611806132b35750159392505050565b60008282016001600160401b038085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b6001600160a01b031660009081526008602052604090205463ffffffff600160a01b90910481161490565b60075460009063ffffffff168015801590613deb57506001600160a01b03831660009081526008602052604090205463ffffffff828116600160a01b90920416145b15613df75790506117fb565b613e0c63ffffffff808316906001906132bb16565b9392505050565b613e1c81613238565b613e2557611e05565b6000613e3c63ffffffff8084169060019061395716565b63ffffffff81811660009081526009602052604080822080548785168452918320918255600190810154908201805463ffffffff60801b1916600160801b928390049095169091029390931767ffffffffffffffff60401b1916600160401b426001600160401b0316021790925591925060020190613ebb828261460f565b5060010180546001600160e01b03191690555050565b600080828410613ee057600080fd5b838611158015613ef05750848411155b613ef957600080fd5b828611158015613f095750848311155b613f1257600080fd5b60078686031015613f3357613f2a87878787876140ae565b91509150613fa5565b6000613f40888888614481565b9050808411613f5157809550613f9f565b84811015613f6457806001019650613f9f565b808511158015613f7357508381105b613f7957fe5b613f858888838861401d565b9250613f968882600101888761401d565b9150613fa59050565b50613f12565b9550959350505050565b60008083128015613fc05750600082135b80613fd65750600083138015613fd65750600082125b15613ff6576002613fe7848461455e565b81613fee57fe5b059050611853565b60006002808507818507010590506132b3614017600286056002860561455e565b8261455e565b60008184111561402c57600080fd5b8282111561403957600080fd5b82841015614090576007848403101561406557600061405b86868686876140ae565b5091506132b39050565b6000614072868686614481565b90508083116140835780935061408a565b8060010194505b50614039565b84848151811061409c57fe5b60200260200101519050949350505050565b6000806000868660010103905060008888600001815181106140cc57fe5b602002602001015190506000826001106140ed576001600160ff1b03614105565b8989600101815181106140fc57fe5b60200260200101515b905060008360021061411e576001600160ff1b03614136565b8a8a6002018151811061412d57fe5b60200260200101515b905060008460031061414f576001600160ff1b03614167565b8b8b6003018151811061415e57fe5b60200260200101515b9050600085600410614180576001600160ff1b03614198565b8c8c6004018151811061418f57fe5b60200260200101515b90506000866005106141b1576001600160ff1b036141c9565b8d8d600501815181106141c057fe5b60200260200101515b90506000876006106141e2576001600160ff1b036141fa565b8e8e600601815181106141f157fe5b60200260200101515b905085871315614208579495945b83851315614214579293925b81831315614220579091905b8487131561422c579395935b83861315614238579294925b8083131561424257915b8486131561424e579394935b8082131561425857905b82871315614264579195915b81861315614270579094905b8085131561427a57935b82861315614286579194915b8084131561429057925b8285131561429c579193915b818413156142a8579092905b828413156142b4579192915b8d8c03806142c457879a5061436a565b80600114156142d557869a5061436a565b80600214156142e657859a5061436a565b80600314156142f757849a5061436a565b806004141561430857839a5061436a565b806005141561431957829a5061436a565b806006141561432a57819a5061436a565b6040805162461bcd60e51b815260206004820152601060248201526f6b31206f7574206f6620626f756e647360801b604482015290519081900360640190fd5b8e8c038d8d141561438857508a9950613fa598505050505050505050565b8061439f5750969850613fa5975050505050505050565b80600114156143ba5750959850613fa5975050505050505050565b80600214156143d55750949850613fa5975050505050505050565b80600314156143f05750939850613fa5975050505050505050565b806004141561440b5750929850613fa5975050505050505050565b80600514156144265750919850613fa5975050505050505050565b80600614156144415750909850613fa5975050505050505050565b6040805162461bcd60e51b815260206004820152601060248201526f6b32206f7574206f6620626f756e647360801b604482015290519081900360640190fd5b600080846002858501048151811061449557fe5b602002602001015190506001840393506001830192505b600184019350808585815181106144bf57fe5b6020026020010151126144ac575b600183039250808584815181106144e057fe5b6020026020010151136144cd57828410156145505784838151811061450157fe5b602002602001015185858151811061451557fe5b602002602001015186868151811061452957fe5b6020026020010187868151811061453c57fe5b602090810291909101019190915252614559565b82915050613e0c565b6144ac565b60008282018183128015906145735750838112155b80614588575060008312801561458857508381125b6118505760405162461bcd60e51b815260040180806020018281038252602181526020018061467a6021913960400191505060405180910390fd5b6040518060a001604052806000815260200160006001600160401b0316815260200160006001600160401b03168152602001600063ffffffff16815260200161460a61462d565b905290565b5080546000825590600052602060002090810190611e05919061465b565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915290565b61152391905b808211156146755760008155600101614661565b509056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77536166654d6174683a206164646974696f6e206f766572666c6f770000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c792063616c6c61626c65206279206f776e657200000000000000000000a2646970667358221220fee95a6f210e458d4885d51dc069e62dac9ef4de46bcde85ea7ce9998f05608864736f6c63430006060033000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c224e323235202f204a5059220000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c806379ba509711610167578063bb07bacd116100ce578063dc7f012411610087578063dc7f0124146109c6578063e2e40317146109ce578063e9ee6eeb146109f4578063ebf8571c14610a22578063f2fde38b14610aa8578063feaf968c14610ace576102a0565b8063bb07bacd1461086d578063bbf0b7e9146108ac578063c107532914610982578063c35905c6146109ae578063c9374500146109b6578063d4cc54e4146109be576102a0565b80638da5cb5b116101205780638da5cb5b1461077a57806398e5b12a14610782578063a118f2491461078a578063a4c0ed36146107b0578063b5ab58dc14610833578063b633620c14610850576102a0565b806379ba50971461069e5780637c2b0b21146106a65780638038e4a1146106ae5780638205bf6a146106b65780638823da6c146106be57806388aa80e7146106e4576102a0565b806350d25bcd1161020b57806364efb22b116101c457806364efb22b1461051b578063668a0f02146105415780636b14daf8146105495780636fb4bb4e1461061157806370dea79a146106195780637284e41614610621576102a0565b806350d25bcd146104b157806354fd4d50146104b957806357970e93146104c157806358609e44146104e5578063613d8fcc146104ed578063628806ef146104f5576102a0565b8063357ebb021161025d578063357ebb021461038c57806338aa4c72146103ad5780633d3d7714146103f757806340884c521461042d57806346fcff4c146104855780634f8fc3b5146104a9576102a0565b80630720da52146102a55780630a756983146102ed578063202ee0ed146102f757806320ed02751461031a57806323ca290314610354578063313ce5671461036e575b600080fd5b6102c2600480360360208110156102bb57600080fd5b5035610ad6565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102f5610b77565b005b6102f56004803603604081101561030d57600080fd5b5080359060200135610bf9565b6102f56004803603606081101561033057600080fd5b5080356001600160a01b03169060208101351515906040013563ffffffff16610db2565b61035c610ee6565b60408051918252519081900360200190f35b610376610f0a565b6040805160ff9092168252519081900360200190f35b610394610f13565b6040805163ffffffff9092168252519081900360200190f35b6102f5600480360360a08110156103c357600080fd5b506001600160801b038135169063ffffffff6020820135811691604081013582169160608201358116916080013516610f26565b6102f56004803603606081101561040d57600080fd5b506001600160a01b038135811691602081013590911690604001356112d0565b6104356114c3565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610471578181015183820152602001610459565b505050509050019250505060405180910390f35b61048d611526565b604080516001600160801b039092168252519081900360200190f35b6102f561153c565b61035c611636565b61035c6116c3565b6104c96116c8565b604080516001600160a01b039092168252519081900360200190f35b6103946116d7565b6103946116ea565b6102f56004803603602081101561050b57600080fd5b50356001600160a01b03166116f0565b6104c96004803603602081101561053157600080fd5b50356001600160a01b03166117d6565b61035c611800565b6105fd6004803603604081101561055f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561058957600080fd5b82018360208201111561059b57600080fd5b803590602001918460018302840111600160201b831117156105bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611813945050505050565b604080519115158252519081900360200190f35b61035c611859565b610394611865565b610629611878565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561066357818101518382015260200161064b565b50505050905090810190601f1680156106905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f5611906565b61035c6119b5565b6102f56119d9565b61035c611a5e565b6102f5600480360360208110156106d457600080fd5b50356001600160a01b0316611ae6565b610716600480360360408110156106fa57600080fd5b5080356001600160a01b0316906020013563ffffffff16611b8b565b60408051981515895263ffffffff97881660208a0152888101969096526001600160401b0394851660608901529290931660808701526001600160801b0390811660a08701529190931660c08501529190911660e083015251908190036101000190f35b6104c9611ce8565b6102f5611cf7565b6102f5600480360360208110156107a057600080fd5b50356001600160a01b0316611e08565b6102f5600480360360608110156107c657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156107f557600080fd5b82018360208201111561080757600080fd5b803590602001918460018302840111600160201b8311171561082857600080fd5b509092509050611eb0565b61035c6004803603602081101561084957600080fd5b5035611f11565b61035c6004803603602081101561086657600080fd5b5035611f9a565b6108936004803603602081101561088357600080fd5b50356001600160a01b0316612023565b6040805192835260208301919091528051918290030190f35b6102f5600480360360a08110156108c257600080fd5b810190602081018135600160201b8111156108dc57600080fd5b8201836020820111156108ee57600080fd5b803590602001918460208302840111600160201b8311171561090f57600080fd5b919390929091602081019035600160201b81111561092c57600080fd5b82018360208201111561093e57600080fd5b803590602001918460208302840111600160201b8311171561095f57600080fd5b919350915063ffffffff8135811691602081013582169160409091013516612054565b6102f56004803603604081101561099857600080fd5b506001600160a01b0381351690602001356121e7565b61048d61238e565b61039461239d565b61048d6123b0565b6105fd6123bf565b61035c600480360360208110156109e457600080fd5b50356001600160a01b03166123c8565b6102f560048036036040811015610a0a57600080fd5b506001600160a01b03813581169160200135166123ec565b6102f560048036036080811015610a3857600080fd5b810190602081018135600160201b811115610a5257600080fd5b820183602082011115610a6457600080fd5b803590602001918460208302840111600160201b83111715610a8557600080fd5b919350915063ffffffff81358116916020810135821691604090910135166124cf565b6102f560048036036020811015610abe57600080fd5b50356001600160a01b031661257e565b6102c261261c565b6000806000806000610b1f336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b610b5c576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b610b65866126bb565b939a9299509097509550909350915050565b6000546001600160a01b03163314610bc4576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600c805460ff191690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a1565b6060610c05338461280c565b90507f000000000000000000000000000000000000000000000000000000174876e800821215610c7c576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652062656c6f77206d696e5375626d697373696f6e56616c75650000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000005af3107a4000821315610cf1576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652061626f7665206d61785375626d697373696f6e56616c75650000604482015290519081900360640190fd5b8051819015610d7e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d43578181015183820152602001610d2b565b50505050905090810190601f168015610d705780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610d8883612aae565b610d928284612b43565b610d9b83612c1f565b610da483612d6e565b610dad83612e71565b505050565b6000546001600160a01b03163314610dff576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1615158215151415610e2b57610dad565b8115610e6e576001600160a01b0383166000908152600a60205260409020805460ff19168315151764ffffffff00191661010063ffffffff841602179055610e97565b6001600160a01b0383166000908152600a60205260409020805468ffffffffffffffffff191690555b60408051831515815263ffffffff8316602082015281516001600160a01b038616927fc3df5a754e002718f2e10804b99e6605e7c701d95cec9552c7680ca2b6f2820a928290030190a2505050565b7f00000000000000000000000000000000000000000000000000005af3107a400081565b60055460ff1681565b600454600160c01b900463ffffffff1681565b6000546001600160a01b03163314610f73576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6000610f7d6116ea565b90508463ffffffff168463ffffffff161015610fe0576040805162461bcd60e51b815260206004820152601960248201527f6d6178206d75737420657175616c2f657863656564206d696e00000000000000604482015290519081900360640190fd5b8363ffffffff168163ffffffff161015611041576040805162461bcd60e51b815260206004820152601760248201527f6d61782063616e6e6f742065786365656420746f74616c000000000000000000604482015290519081900360640190fd5b63ffffffff8116158061105f57508263ffffffff168163ffffffff16115b6110b0576040805162461bcd60e51b815260206004820152601960248201527f64656c61792063616e6e6f742065786365656420746f74616c00000000000000604482015290519081900360640190fd5b6110c2866001600160801b0316612ed7565b600354600160801b90046001600160801b03161015611128576040805162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e742066756e647320666f72207061796d656e740000604482015290519081900360640190fd5b60006111326116ea565b63ffffffff1611156111995760008563ffffffff1611611199576040805162461bcd60e51b815260206004820152601a60248201527f6d696e206d7573742062652067726561746572207468616e2030000000000000604482015290519081900360640190fd5b85600460006101000a8154816001600160801b0302191690836001600160801b0316021790555084600460146101000a81548163ffffffff021916908363ffffffff16021790555083600460106101000a81548163ffffffff021916908363ffffffff16021790555082600460186101000a81548163ffffffff021916908363ffffffff160217905550816004601c6101000a81548163ffffffff021916908363ffffffff1602179055508363ffffffff168563ffffffff16600460009054906101000a90046001600160801b03166001600160801b03167f56800c9d1ed723511246614d15e58cfcde15b6a33c245b5c961b689c1890fd8f8686604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a4505050505050565b6001600160a01b03838116600090815260086020526040902060020154620100009004163314611340576040805162461bcd60e51b815260206004820152601660248201527537b7363c9031b0b63630b1363290313c9030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b03831660009081526008602052604090205481906001600160801b039081169082168110156113bd576040805162461bcd60e51b815260206004820152601f60248201527f696e73756666696369656e7420776974686472617761626c652066756e647300604482015290519081900360640190fd5b6113d66001600160801b0382168363ffffffff612f0a16565b6001600160a01b038616600090815260086020526040902080546001600160801b0319166001600160801b03928316179055600354611416911683612f0a565b600380546001600160801b0319166001600160801b039283161790556002546040805163a9059cbb60e01b81526001600160a01b03888116600483015293861660248201529051929091169163a9059cbb916044808201926020929091908290030181600087803b15801561148a57600080fd5b505af115801561149e573d6000803e3d6000fd5b505050506040513d60208110156114b457600080fd5b50516114bc57fe5b5050505050565b6060600b80548060200260200160405190810160405280929190818152602001828054801561151b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114fd575b505050505090505b90565b600354600160801b90046001600160801b031681565b600354600254604080516370a0823160e01b815230600482015290516001600160801b03600160801b85048116946000946115df9492909116926001600160a01b03909116916370a08231916024808301926020929190829003018186803b1580156115a757600080fd5b505afa1580156115bb573d6000803e3d6000fd5b505050506040513d60208110156115d157600080fd5b50519063ffffffff612f7916565b600380546001600160801b03908116600160801b8483160217909155909150821681146116325760405181907ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f90600090a25b5050565b6000611679336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b6116b6576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6116be612fd0565b905090565b600381565b6002546001600160a01b031681565b600454600160801b900463ffffffff1681565b600b5490565b6001600160a01b03818116600090815260086020526040902060030154163314611761576040805162461bcd60e51b815260206004820152601e60248201527f6f6e6c792063616c6c61626c652062792070656e64696e672061646d696e0000604482015290519081900360640190fd5b6001600160a01b0381166000818152600860205260408082206003810180546001600160a01b0319169055600201805462010000600160b01b031916336201000081029190911790915590519092917f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90491a350565b6001600160a01b03808216600090815260086020526040902060020154620100009004165b919050565b600754600160201b900463ffffffff1690565b6001600160a01b0382166000908152600d602052604081205460ff168061183d5750600c5460ff16155b8061185057506001600160a01b03831632145b90505b92915050565b60075463ffffffff1690565b600454600160e01b900463ffffffff1681565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156118fe5780601f106118d3576101008083540402835291602001916118fe565b820191906000526020600020905b8154815290600101906020018083116118e157829003601f168201915b505050505081565b6001546001600160a01b0316331461195e576040805162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015290519081900360640190fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b7f000000000000000000000000000000000000000000000000000000174876e80081565b6000546001600160a01b03163314611a26576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600c805460ff191660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6000611aa1336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b611ade576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6116be612ff2565b6000546001600160a01b03163314611b33576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff19169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a150565b600080808080808080333214611be1576040805162461bcd60e51b81526020600482015260166024820152756f66662d636861696e2072656164696e67206f6e6c7960501b604482015290519081900360640190fd5b63ffffffff891615611cc15763ffffffff89166000908152600960205260409020611c0c8b8b613027565b6001600160a01b038c1660009081526008602052604090206001908101549083015460038085015490548e93926001600160401b031691600160401b900463ffffffff1690600160801b90046001600160801b0316611c696116ea565b60018801546001600160401b0316611c8c576004546001600160801b0316611ca2565b6003880154600160601b90046001600160801b03165b8363ffffffff1693509850985098509850985098509850985050611cdb565b611cca8a61307c565b975097509750975097509750975097505b9295985092959890939650565b6000546001600160a01b031681565b336000908152600a602052604090205460ff16611d5b576040805162461bcd60e51b815260206004820152601860248201527f6e6f7420617574686f72697a6564207265717565737465720000000000000000604482015290519081900360640190fd5b60075463ffffffff16600081815260096020526040902060010154600160401b90046001600160401b0316151580611d975750611d9781613238565b611de8576040805162461bcd60e51b815260206004820152601f60248201527f7072657620726f756e64206d75737420626520737570657273656461626c6500604482015290519081900360640190fd5b611e05611e0063ffffffff808416906001906132bb16565b61330c565b50565b6000546001600160a01b03163314611e55576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff19166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b8015611f03576040805162461bcd60e51b815260206004820181905260248201527f7472616e7366657220646f65736e2774206163636570742063616c6c64617461604482015290519081900360640190fd5b611f0b61153c565b50505050565b6000611f54336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b611f91576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611853826133da565b6000611fdd336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b61201a576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611853826133f2565b6001600160a01b03166000908152600860205260409020600181015490549091600160c01b90910463ffffffff1690565b6000546001600160a01b031633146120a1576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b8584146120f5576040805162461bcd60e51b815260206004820181905260248201527f6e6565642073616d65206f7261636c6520616e642061646d696e20636f756e74604482015290519081900360640190fd5b604d612117876121036116ea565b63ffffffff1661341d90919063ffffffff16565b1115612160576040805162461bcd60e51b81526020600482015260136024820152721b585e081bdc9858db195cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60005b868110156121b3576121ab88888381811061217a57fe5b905060200201356001600160a01b031687878481811061219657fe5b905060200201356001600160a01b0316613465565b600101612163565b506004546121de906001600160801b03811690859085908590600160e01b900463ffffffff16610f26565b50505050505050565b6000546001600160a01b03163314612234576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b60045481906122689061224f906001600160801b0316612ed7565b600354600160801b90046001600160801b031690612f79565b10156122bb576040805162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e7420726573657276652066756e6473000000000000604482015290519081900360640190fd5b6002546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b505050506040513d602081101561233b57600080fd5b5051612386576040805162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015290519081900360640190fd5b61163261153c565b6004546001600160801b031681565b600454600160a01b900463ffffffff1681565b6003546001600160801b031681565b600c5460ff1681565b6001600160a01b03166000908152600860205260409020546001600160801b031690565b6001600160a01b0382811660009081526008602052604090206002015462010000900416331461245c576040805162461bcd60e51b815260206004820152601660248201527537b7363c9031b0b63630b1363290313c9030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b0382811660008181526008602090815260409182902060030180546001600160a01b0319169486169485179055815133815290810193909352805191927fb79bf2e89c2d70dde91d2991fb1ea69b7e478061ad7c04ed5b02b96bc52b8104929081900390910190a25050565b6000546001600160a01b0316331461251c576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b60005b848110156125535761254b86868381811061253657fe5b905060200201356001600160a01b03166136f5565b60010161251f565b506004546114bc906001600160801b03811690859085908590600160e01b900463ffffffff16610f26565b6000546001600160a01b031633146125cb576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000806000806000612665336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b6126a2576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6126aa6138ce565b945094509450945094509091929394565b60008060008060006126cb6145c3565b63ffffffff808816600090815260096020908152604091829020825160a080820185528254825260018301546001600160401b0380821684870152600160401b82041683870152600160801b90049095166060820152835160028301805460c09581028301860190965295810185815291959294608087019491939284929091849184018282801561277c57602002820191906000526020600020905b815481526020019060010190808311612768575b50505091835250506001919091015463ffffffff808216602080850191909152600160201b83048216604080860191909152600160401b84048316606080870191909152600160601b9094046001600160801b031660809095019490945293909452855192860151918601519501519b9c919b6001600160401b039182169b509416985092169550909350505050565b6001600160a01b03821660009081526008602052604090205460075460609163ffffffff600160801b909104811691168161287557604051806040016040528060128152602001716e6f7420656e61626c6564206f7261636c6560701b81525092505050611853565b8363ffffffff168263ffffffff1611156128c157604051806040016040528060168152602001756e6f742079657420656e61626c6564206f7261636c6560501b81525092505050611853565b6001600160a01b03851660009081526008602052604090205463ffffffff808616600160a01b909204161015612930576040518060400160405280601881526020017f6e6f206c6f6e67657220616c6c6f776564206f7261636c65000000000000000081525092505050611853565b6001600160a01b03851660009081526008602052604090205463ffffffff808616600160c01b909204161061299e576040518060400160405280602081526020017f63616e6e6f74207265706f7274206f6e2070726576696f757320726f756e647381525092505050611853565b8063ffffffff168463ffffffff16141580156129da57506129ca63ffffffff808316906001906132bb16565b63ffffffff168463ffffffff1614155b80156129ed57506129eb84826138f7565b155b15612a31576040518060400160405280601781526020017f696e76616c696420726f756e6420746f207265706f727400000000000000000081525092505050611853565b8363ffffffff16600114158015612a625750612a60612a5b63ffffffff8087169060019061395716565b6139ba565b155b15612aa6576040518060400160405280601f81526020017f70726576696f757320726f756e64206e6f7420737570657273656461626c650081525092505050611853565b505092915050565b612ab7816139f4565b612ac057611e05565b3360009081526008602052604090205460045463ffffffff600160e01b909204821691600160c01b9091048116820190831611801590612aff57508015155b15612b0a5750611e05565b612b1382613a25565b50336000908152600860205260409020805463ffffffff8316600160e01b026001600160e01b0390911617905550565b612b4c81613b6a565b612b9d576040805162461bcd60e51b815260206004820152601f60248201527f726f756e64206e6f7420616363657074696e67207375626d697373696f6e7300604482015290519081900360640190fd5b63ffffffff8116600081815260096020908152604080832060020180546001808201835591855283852001879055338085526008909352818420805463ffffffff60c01b1916600160c01b8702178155018690555190929185917f92e98423f8adac6e64d0608e519fd1cefb861498385c6dee70d58fc926ddc68c9190a45050565b63ffffffff80821660009081526009602052604090206003810154600290910154600160201b9091049091161115612c5657611e05565b63ffffffff811660009081526009602090815260408083206002018054825181850281018501909352808352612cbf93830182828015612cb557602002820191906000526020600020905b815481526020019060010190808311612ca1575b5050505050613b8a565b63ffffffff8316600081815260096020908152604091829020848155600101805467ffffffffffffffff60401b1916600160401b426001600160401b038116919091029190911763ffffffff60801b1916600160801b8602179091556007805467ffffffff000000001916600160201b860217905582519081529151939450919284927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f928290030190a35050565b63ffffffff808216600090815260096020526040812060039081015490546001600160801b03600160601b909204821693612db792600160801b909204909116908490612f0a16565b600380546001600160801b03908116600160801b848316021791829055919250612de2911683613c33565b600380546001600160801b0319166001600160801b0392831617905533600090815260086020526040902054612e19911683613c33565b3360009081526008602052604080822080546001600160801b0319166001600160801b0394851617905551918316917ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f9190a2505050565b63ffffffff8082166000908152600960205260409020600381015460029091015491161115612e9f57611e05565b63ffffffff8116600090815260096020526040812060020190612ec2828261460f565b5060010180546001600160e01b031916905550565b60006118536002612efe612ee96116ea565b63ffffffff1685613c8790919063ffffffff16565b9063ffffffff613c8716565b6000826001600160801b0316826001600160801b03161115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082821115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b600754600160201b900463ffffffff1660009081526009602052604090205490565b600754600160201b900463ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031690565b63ffffffff81166000908152600960205260408120600101546001600160401b0316156130725761305782613b6a565b801561306b5750613068838361280c565b51155b9050611853565b6130578383613ce0565b6001600160a01b0381166000908152600860205260408120600754815483928392839283928392839283927fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b929091849163ffffffff908116600160c01b9092041614806130f957506007546130f79063ffffffff16613b6a565b155b60075490915061310e9063ffffffff166139ba565b80156131175750805b15613170576007546131359063ffffffff908116906001906132bb16565b63ffffffff81166000908152600960205260409020600454919b506001600160801b03909116945092506131698c8b613ce0565b9a506131b0565b60075463ffffffff1660008181526009602052604090206003810154919b50600160601b9091046001600160801b0316945092506131ad8a613b6a565b9a505b6131ba8c8b61280c565b51156131c55760009a505b6001828101549084015460038086015490548e938e9390926001600160401b0390911691600160401b90910463ffffffff1690600160801b90046001600160801b03166132106116ea565b8a8363ffffffff1693509a509a509a509a509a509a509a509a50505050919395975091939597565b63ffffffff8082166000908152600960205260408120600181015460039091015491926001600160401b0390911691600160401b9004168115801590613284575060008163ffffffff16115b80156132b35750426132a86001600160401b03841663ffffffff80851690613d2a16565b6001600160401b0316105b949350505050565b600082820163ffffffff8085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b613315816139f4565b61331e57611e05565b336000908152600a602052604090205463ffffffff6501000000000082048116916101009004811682019083161180613355575080155b61339c576040805162461bcd60e51b81526020600482015260136024820152726d7573742064656c617920726571756573747360681b604482015290519081900360640190fd5b6133a582613a25565b50336000908152600a60205260409020805463ffffffff8316650100000000000268ffffffff00000000001990911617905550565b63ffffffff1660009081526009602052604090205490565b63ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031690565b600082820183811015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b61346e82613d7e565b156134b9576040805162461bcd60e51b81526020600482015260166024820152751bdc9858db1948185b1c9958591e48195b98589b195960521b604482015290519081900360640190fd5b6001600160a01b03811661350c576040805162461bcd60e51b8152602060048201526015602482015274063616e6e6f74207365742061646d696e20746f203605c1b604482015290519081900360640190fd5b6001600160a01b0382811660009081526008602052604090206002015462010000900416158061356157506001600160a01b038281166000908152600860205260409020600201546201000090048116908216145b6135b2576040805162461bcd60e51b815260206004820152601c60248201527f6f776e65722063616e6e6f74206f76657277726974652061646d696e00000000604482015290519081900360640190fd5b6135bb82613da9565b6001600160a01b03808416600081815260086020526040808220805463ffffffff60a01b1963ffffffff97909716600160801b0263ffffffff60801b19909116179590951663ffffffff60a01b178555600b80546002909601805461ffff90971661ffff19909716969096178655805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916851790558383528554948716620100000262010000600160b01b0319909516949094179094559251919290917f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e9190a3806001600160a01b0316826001600160a01b03167f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90460405160405180910390a35050565b6136fe81613d7e565b613744576040805162461bcd60e51b81526020600482015260126024820152711bdc9858db19481b9bdd08195b98589b195960721b604482015290519081900360640190fd5b60075461375d9063ffffffff908116906001906132bb16565b6001600160a01b0382166000908152600860205260408120805463ffffffff93909316600160a01b0263ffffffff60a01b1990931692909217909155600b6137bc60016137a86116ea565b63ffffffff1661395790919063ffffffff16565b63ffffffff16815481106137cc57fe5b6000918252602080832091909101546001600160a01b0385811680855260089093526040808520600290810180549390941680875291862001805461ffff90931661ffff199384168117909155939094528154169055600b805492935090918391908390811061383857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b80548061387157fe5b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b038516907f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e908390a3505050565b60008060008060006126aa600760049054906101000a900463ffffffff1663ffffffff16610ad6565b60008163ffffffff1661391a60018563ffffffff166132bb90919063ffffffff16565b63ffffffff1614801561185057505063ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031615919050565b60008263ffffffff168263ffffffff161115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b63ffffffff8116600090815260096020526040812060010154600160401b90046001600160401b0316151580611853575061185382613238565b600754600090613a109063ffffffff908116906001906132bb16565b63ffffffff168263ffffffff16149050919050565b613a42613a3d63ffffffff8084169060019061395716565b613e13565b6007805463ffffffff1990811663ffffffff84811691821790935560048054600083815260096020908152604091829020600381018054600160801b90950489169490971693909317808755845467ffffffff0000000019909116600160a01b9091048816600160201b021780875584546fffffffffffffffffffffffffffffffff60601b199091166001600160801b03909116600160601b021780875593546bffffffff000000000000000019909416600160e01b909404909616600160401b0292909217909355600192909201805467ffffffffffffffff1916426001600160401b0390811691909117918290558351911681529151339391927f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac6027192908290030190a350565b63ffffffff90811660009081526009602052604090206003015416151590565b60008151600010613bdb576040805162461bcd60e51b81526020600482015260166024820152756c697374206d757374206e6f7420626520656d70747960501b604482015290519081900360640190fd5b81516002810460018216613c1a57600080613c00866000600187036001870387613ed1565b9092509050613c0f8282613faf565b9450505050506117fb565b613c2a846000600185038461401d565b925050506117fb565b60008282016001600160801b038085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b600082613c9657506000611853565b82820282848281613ca357fe5b04146118505760405162461bcd60e51b81526004018080602001828103825260218152602001806146bb6021913960400191505060405180910390fd5b6001600160a01b03821660009081526008602052604081205460045463ffffffff600160e01b909204821691600160c01b9091048116820190841611806132b35750159392505050565b60008282016001600160401b038085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b6001600160a01b031660009081526008602052604090205463ffffffff600160a01b90910481161490565b60075460009063ffffffff168015801590613deb57506001600160a01b03831660009081526008602052604090205463ffffffff828116600160a01b90920416145b15613df75790506117fb565b613e0c63ffffffff808316906001906132bb16565b9392505050565b613e1c81613238565b613e2557611e05565b6000613e3c63ffffffff8084169060019061395716565b63ffffffff81811660009081526009602052604080822080548785168452918320918255600190810154908201805463ffffffff60801b1916600160801b928390049095169091029390931767ffffffffffffffff60401b1916600160401b426001600160401b0316021790925591925060020190613ebb828261460f565b5060010180546001600160e01b03191690555050565b600080828410613ee057600080fd5b838611158015613ef05750848411155b613ef957600080fd5b828611158015613f095750848311155b613f1257600080fd5b60078686031015613f3357613f2a87878787876140ae565b91509150613fa5565b6000613f40888888614481565b9050808411613f5157809550613f9f565b84811015613f6457806001019650613f9f565b808511158015613f7357508381105b613f7957fe5b613f858888838861401d565b9250613f968882600101888761401d565b9150613fa59050565b50613f12565b9550959350505050565b60008083128015613fc05750600082135b80613fd65750600083138015613fd65750600082125b15613ff6576002613fe7848461455e565b81613fee57fe5b059050611853565b60006002808507818507010590506132b3614017600286056002860561455e565b8261455e565b60008184111561402c57600080fd5b8282111561403957600080fd5b82841015614090576007848403101561406557600061405b86868686876140ae565b5091506132b39050565b6000614072868686614481565b90508083116140835780935061408a565b8060010194505b50614039565b84848151811061409c57fe5b60200260200101519050949350505050565b6000806000868660010103905060008888600001815181106140cc57fe5b602002602001015190506000826001106140ed576001600160ff1b03614105565b8989600101815181106140fc57fe5b60200260200101515b905060008360021061411e576001600160ff1b03614136565b8a8a6002018151811061412d57fe5b60200260200101515b905060008460031061414f576001600160ff1b03614167565b8b8b6003018151811061415e57fe5b60200260200101515b9050600085600410614180576001600160ff1b03614198565b8c8c6004018151811061418f57fe5b60200260200101515b90506000866005106141b1576001600160ff1b036141c9565b8d8d600501815181106141c057fe5b60200260200101515b90506000876006106141e2576001600160ff1b036141fa565b8e8e600601815181106141f157fe5b60200260200101515b905085871315614208579495945b83851315614214579293925b81831315614220579091905b8487131561422c579395935b83861315614238579294925b8083131561424257915b8486131561424e579394935b8082131561425857905b82871315614264579195915b81861315614270579094905b8085131561427a57935b82861315614286579194915b8084131561429057925b8285131561429c579193915b818413156142a8579092905b828413156142b4579192915b8d8c03806142c457879a5061436a565b80600114156142d557869a5061436a565b80600214156142e657859a5061436a565b80600314156142f757849a5061436a565b806004141561430857839a5061436a565b806005141561431957829a5061436a565b806006141561432a57819a5061436a565b6040805162461bcd60e51b815260206004820152601060248201526f6b31206f7574206f6620626f756e647360801b604482015290519081900360640190fd5b8e8c038d8d141561438857508a9950613fa598505050505050505050565b8061439f5750969850613fa5975050505050505050565b80600114156143ba5750959850613fa5975050505050505050565b80600214156143d55750949850613fa5975050505050505050565b80600314156143f05750939850613fa5975050505050505050565b806004141561440b5750929850613fa5975050505050505050565b80600514156144265750919850613fa5975050505050505050565b80600614156144415750909850613fa5975050505050505050565b6040805162461bcd60e51b815260206004820152601060248201526f6b32206f7574206f6620626f756e647360801b604482015290519081900360640190fd5b600080846002858501048151811061449557fe5b602002602001015190506001840393506001830192505b600184019350808585815181106144bf57fe5b6020026020010151126144ac575b600183039250808584815181106144e057fe5b6020026020010151136144cd57828410156145505784838151811061450157fe5b602002602001015185858151811061451557fe5b602002602001015186868151811061452957fe5b6020026020010187868151811061453c57fe5b602090810291909101019190915252614559565b82915050613e0c565b6144ac565b60008282018183128015906145735750838112155b80614588575060008312801561458857508381125b6118505760405162461bcd60e51b815260040180806020018281038252602181526020018061467a6021913960400191505060405180910390fd5b6040518060a001604052806000815260200160006001600160401b0316815260200160006001600160401b03168152602001600063ffffffff16815260200161460a61462d565b905290565b5080546000825590600052602060002090810190611e05919061465b565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915290565b61152391905b808211156146755760008155600101614661565b509056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77536166654d6174683a206164646974696f6e206f766572666c6f770000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c792063616c6c61626c65206279206f776e657200000000000000000000a2646970667358221220fee95a6f210e458d4885d51dc069e62dac9ef4de46bcde85ea7ce9998f05608864736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c224e323235202f204a5059220000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _link (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [1] : _paymentAmount (uint128): 0
Arg [2] : _timeout (uint32): 600
Arg [3] : _minSubmissionValue (int256): 100000000000
Arg [4] : _maxSubmissionValue (int256): 100000000000000
Arg [5] : _decimals (uint8): 8
Arg [6] : _description (string): "N225 / JPY"
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [3] : 000000000000000000000000000000000000000000000000000000174876e800
Arg [4] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [8] : 224e323235202f204a5059220000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
59180:4893:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59180:4893:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;62198:297:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62198:297:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58592:132;;;:::i;:::-;;32435:592;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32435:592:0;;;;;;;:::i;45949:450::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45949:450:0;;-1:-1:-1;;;;;45949:450:0;;;;;;;;;;;;;;;:::i;29433:42::-;;;:::i;:::-;;;;;;;;;;;;;;;;29310:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29253:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35553:1046;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;35553:1046:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42517:610::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;42517:610:0;;;;;;;;;;;;;;;;;:::i;37278:98::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37278:98:0;;;;;;;;;;;;;;;;;29083:29;;;:::i;:::-;;;;-1:-1:-1;;;;;29083:29:0;;;;;;;;;;;;;;36686:327;;;:::i;59822:144::-;;;:::i;29482:44::-;;;:::i;29009:35::-;;;:::i;:::-;;;;-1:-1:-1;;;;;29009:35:0;;;;;;;;;;;;;;29179:32;;;:::i;37077:102::-;;;:::i;44905:298::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44905:298:0;-1:-1:-1;;;;;44905:298:0;;:::i;44129:127::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44129:127:0;-1:-1:-1;;;;;44129:127:0;;:::i;38049:118::-;;;:::i;57634:198::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;57634:198:0;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;57634:198:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;57634:198:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;57634:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;57634:198:0;;-1:-1:-1;57634:198:0;;-1:-1:-1;;;;;57634:198:0:i;:::-;;;;;;;;;;;;;;;;;;38251:112;;;:::i;29284:21::-;;;:::i;29345:34::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29345:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;954:264;;;:::i;29386:42::-;;;:::i;58395:129::-;;;:::i;60157:151::-;;;:::i;58189:140::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58189:140:0;-1:-1:-1;;;;;58189:140:0;;:::i;47109:918::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47109:918:0;;-1:-1:-1;;;;;47109:918:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47109:918:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47109:918:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;287:28;;;:::i;45279:322::-;;;:::i;57939:135::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57939:135:0;-1:-1:-1;;;;;57939:135:0;;:::i;46685:186::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;46685:186:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;46685:186:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;46685:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;46685:186:0;;-1:-1:-1;46685:186:0;-1:-1:-1;46685:186:0;:::i;60545:162::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60545:162:0;;:::i;60977:169::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60977:169:0;;:::i;43789:192::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43789:192:0;-1:-1:-1;;;;;43789:192:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33653:609;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33653:609:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33653:609:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33653:609:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33653:609:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33653:609:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33653:609:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33653:609:0;;-1:-1:-1;33653:609:0;-1:-1:-1;33653:609:0;;;;;;;;;;;;;;;;;;;;:::i;43317:325::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;43317:325:0;;;;;;;;:::i;29146:28::-;;;:::i;29216:32::-;;;:::i;29049:29::-;;;:::i;57247:24::-;;;:::i;42071:145::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42071:145:0;-1:-1:-1;;;;;42071:145:0;;:::i;44461:280::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;44461:280:0;;;;;;;;;;:::i;34718:381::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34718:381:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34718:381:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34718:381:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34718:381:0;;-1:-1:-1;34718:381:0;-1:-1:-1;34718:381:0;;;;;;;;;;;;;;;;;;;;:::i;703:157::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;703:157:0;-1:-1:-1;;;;;703:157:0;;:::i;63791:279::-;;;:::i;62198:297::-;62315:15;62339:13;62361:17;62387;62413:23;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;62461:28:::1;62480:8;62461:18;:28::i;:::-;62454:35:::0;;;;-1:-1:-1;62454:35:0;;-1:-1:-1;62454:35:0;-1:-1:-1;62454:35:0;;-1:-1:-1;62198:297:0;-1:-1:-1;;62198:297:0:o;58592:132::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;58663:12:::1;:20:::0;;-1:-1:-1;;58663:20:0::1;::::0;;58697:21:::1;::::0;::::1;::::0;58678:5:::1;::::0;58697:21:::1;58592:132::o:0;32435:592::-;32513:18;32534:49;32554:10;32573:8;32534:19;:49::i;:::-;32513:70;;32613:18;32598:11;:33;;32590:76;;;;;-1:-1:-1;;;32590:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32696:18;32681:11;:33;;32673:76;;;;;-1:-1:-1;;;32673:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32764:12;;:5;;:17;32756:41;;;;-1:-1:-1;;;32756:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32756:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32806:42;32838:8;32806:24;:42::i;:::-;32855:47;32872:11;32892:8;32855:16;:47::i;:::-;32909:35;32934:8;32909:17;:35::i;:::-;32951:27;32968:8;32951:9;:27::i;:::-;32985:36;33011:8;32985:18;:36::i;:::-;32435:592;;;:::o;45949:450::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46080:22:0;::::1;;::::0;;;:10:::1;:22;::::0;;;;:33;::::1;;:48;;::::0;::::1;;;46076:61;;;46130:7;;46076:61;46149:11;46145:179;;;-1:-1:-1::0;;;;;46171:22:0;::::1;;::::0;;;:10:::1;:22;::::0;;;;:47;;-1:-1:-1;;46171:47:0::1;::::0;::::1;;;-1:-1:-1::0;;46227:37:0::1;46171:47;46227:37;::::0;::::1;;;::::0;;46145:179:::1;;;-1:-1:-1::0;;;;;46294:22:0;::::1;;::::0;;;:10:::1;:22;::::0;;;;46287:29;;-1:-1:-1;;46287:29:0;;;46145:179:::1;46337:56;::::0;;;::::1;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;;;46337:56:0;::::1;::::0;::::1;::::0;;;;;;::::1;45949:450:::0;;;:::o;29433:42::-;;;:::o;29310:30::-;;;;;;:::o;29253:26::-;;;-1:-1:-1;;;29253:26:0;;;;;:::o;35553:1046::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;35761:16:::1;35780:13;:11;:13::i;:::-;35761:32;;35852:15;35833:34;;:15;:34;;;;35825:72;;;::::0;;-1:-1:-1;;;35825:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35925:15;35912:28;;:9;:28;;;;35904:64;;;::::0;;-1:-1:-1;;;35904:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35983:14;::::0;::::1;::::0;;:43:::1;;;36013:13;36001:25;;:9;:25;;;35983:43;35975:81;;;::::0;;-1:-1:-1;;;35975:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36089:31;36105:14;-1:-1:-1::0;;;;;36089:31:0::1;:15;:31::i;:::-;36071:14;::::0;-1:-1:-1;;;36071:14:0;::::1;-1:-1:-1::0;;;;;36071:14:0::1;:49;;36063:92;;;::::0;;-1:-1:-1;;;36063:92:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36182:1;36166:13;:11;:13::i;:::-;:17;;;36162:98;;;36220:1;36202:15;:19;;;36194:58;;;::::0;;-1:-1:-1;;;36194:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36284:14;36268:13;;:30;;;;;-1:-1:-1::0;;;;;36268:30:0::1;;;;;-1:-1:-1::0;;;;;36268:30:0::1;;;;;;36326:15;36305:18;;:36;;;;;;;;;;;;;;;;;;36369:15;36348:18;;:36;;;;;;;;;;;;;;;;;;36406:13;36391:12;;:28;;;;;;;;;;;;;;;;;;36436:8;36426:7;;:18;;;;;;;;;;;;;;;;;;36532:15;36458:135;;36508:15;36458:135;;36486:13;;;;;;;;;-1:-1:-1::0;;;;;36486:13:0::1;-1:-1:-1::0;;;;;36458:135:0::1;;36556:13;36578:8;36458:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1397:1;35553:1046:::0;;;;;:::o;42517:610::-;-1:-1:-1;;;;;42628:16:0;;;;;;;:7;:16;;;;;:22;;;;;;;42654:10;42628:36;42620:71;;;;;-1:-1:-1;;;42620:71:0;;;;;;;;;;;;-1:-1:-1;;;42620:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42846:16:0;;42786:14;42846:16;;;:7;:16;;;;;:29;42811:7;;-1:-1:-1;;;;;42846:29:0;;;;42890:19;;;;;42882:63;;;;;-1:-1:-1;;;42882:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42986:21;-1:-1:-1;;;;;42986:13:0;;43000:6;42986:21;:13;:21;:::i;:::-;-1:-1:-1;;;;;42954:16:0;;;;;;:7;:16;;;;;:53;;-1:-1:-1;;;;;;42954:53:0;-1:-1:-1;;;;;42954:53:0;;;;;;43031:14;;:26;;:14;43050:6;43031:18;:26::i;:::-;43014:14;:43;;-1:-1:-1;;;;;;43014:43:0;-1:-1:-1;;;;;43014:43:0;;;;;;43073:9;;:47;;;-1:-1:-1;;;43073:47:0;;-1:-1:-1;;;;;43073:47:0;;;;;;;43104:15;;;43073:47;;;;;;:9;;;;;:18;;:47;;;;;;;;;;;;;;;-1:-1:-1;43073:9:0;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;43073:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43073:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43073:47:0;43066:55;;;;42517:610;;;;;:::o;37278:98::-;37323:16;37355:15;37348:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37348:22:0;;;;;;;;;;;;;;;;;;;;;;;37278:98;;:::o;29083:29::-;;;-1:-1:-1;;;29083:29:0;;-1:-1:-1;;;;;29083:29:0;;:::o;36686:327::-;36769:14;;36812:9;;:34;;;-1:-1:-1;;;36812:34:0;;36840:4;36812:34;;;;;;-1:-1:-1;;;;;;;;36769:14:0;;;;;36740:26;;36812:54;;36851:14;;;;;-1:-1:-1;;;;;36812:9:0;;;;:19;;:34;;;;;;;;;;;;;;:9;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;36812:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36812:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36812:34:0;;:54;:38;:54;:::i;:::-;36873:14;:35;;-1:-1:-1;;;;;36873:35:0;;;-1:-1:-1;;;36873:35:0;;;;;;;;;;-1:-1:-1;36921:31:0;;;;36917:91;;36968:32;;36990:9;;36968:32;;;;;36917:91;36686:327;;:::o;59822:144::-;59915:6;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;59940:20:::1;:18;:20::i;:::-;59933:27;;59822:144:::0;:::o;29482:44::-;29525:1;29482:44;:::o;29009:35::-;;;-1:-1:-1;;;;;29009:35:0;;:::o;29179:32::-;;;-1:-1:-1;;;29179:32:0;;;;;:::o;37077:102::-;37150:15;:22;37077:102;:::o;44905:298::-;-1:-1:-1;;;;;44975:16:0;;;;;;;:7;:16;;;;;:29;;;;45008:10;44975:43;44967:86;;;;;-1:-1:-1;;;44967:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45060:16:0;;45100:1;45060:16;;;:7;:16;;;;;;:29;;;:42;;-1:-1:-1;;;;;;45060:42:0;;;45109:22;;:35;;-1:-1:-1;;;;;;45109:35:0;45134:10;45109:35;;;;;;;;;;45158:39;;45134:10;;45060:16;45158:39;;;44905:298;:::o;44129:127::-;-1:-1:-1;;;;;44228:16:0;;;44202:7;44228:16;;;:7;:16;;;;;:22;;;;;;;44129:127;;;;:::o;38049:118::-;38148:13;;-1:-1:-1;;;38148:13:0;;;;;38049:118::o;57634:198::-;-1:-1:-1;;;;;57770:17:0;;57747:4;57770:17;;;:10;:17;;;;;;;;;:34;;-1:-1:-1;57792:12:0;;;;57791:13;57770:34;:56;;;-1:-1:-1;;;;;;57808:18:0;;57817:9;57808:18;57770:56;57763:63;;57634:198;;;;;:::o;38251:112::-;38341:16;;;;38251:112;:::o;29284:21::-;;;-1:-1:-1;;;29284:21:0;;;;;:::o;29345:34::-;;;;;;;;;;;;;;;-1:-1:-1;;29345:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;954:264::-;1027:12;;-1:-1:-1;;;;;1027:12:0;1013:10;:26;1005:61;;;;;-1:-1:-1;;;1005:61:0;;;;;;;;;;;;-1:-1:-1;;;1005:61:0;;;;;;;;;;;;;;;1075:16;1094:5;;1114:10;-1:-1:-1;;;;;;1106:18:0;;;;;;;-1:-1:-1;1131:25:0;;;;;;;1170:42;;-1:-1:-1;;;;;1094:5:0;;;;1114:10;;1094:5;;1170:42;;;954:264;:::o;29386:42::-;;;:::o;58395:129::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;58465:12:::1;:19:::0;;-1:-1:-1;;58465:19:0::1;58480:4;58465:19;::::0;;58498:20:::1;::::0;::::1;::::0;58465:12:::1;::::0;58498:20:::1;58395:129::o:0;60157:151::-;60253:7;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;60279:23:::1;:21;:23::i;58189:140::-:0;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;58274:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;58267:24;;-1:-1:-1;;58267:24:0::1;::::0;;58303:20;;;;;;;::::1;::::0;;;;;;;;::::1;58189:140:::0;:::o;47109:918::-;47222:22;;;;;;;;47468:10;47482:9;47468:23;47460:58;;;;;-1:-1:-1;;;47460:58:0;;;;;;;;;;;;-1:-1:-1;;;47460:58:0;;;;;;;;;;;;;;;47531:19;;;;47527:495;;47583:23;;;47561:19;47583:23;;;:6;:23;;;;;47633:50;47658:7;47590:15;47633:24;:50::i;:::-;-1:-1:-1;;;;;47720:16:0;;;;;;:7;:16;;;;;:33;;;;;47764:15;;;;47790:21;;;;;47822:14;;47694:15;;47720:33;-1:-1:-1;;;;;47764:15:0;;-1:-1:-1;;;47790:21:0;;;;;-1:-1:-1;;;47822:14:0;;-1:-1:-1;;;;;47822:14:0;47847:13;:11;:13::i;:::-;47872:15;;;;-1:-1:-1;;;;;47872:15:0;:65;;47924:13;;-1:-1:-1;;;;;47924:13:0;47872:65;;;47894:27;;;;-1:-1:-1;;;47894:27:0;;-1:-1:-1;;;;;47894:27:0;47872:65;47615:332;;;;;;;;;;;;;;;;;;;;;;;;47527:495;47977:37;48006:7;47977:28;:37::i;:::-;47970:44;;;;;;;;;;;;;;;;47527:495;47109:918;;;;;;;;;;;:::o;287:28::-;;;-1:-1:-1;;;;;287:28:0;;:::o;45279:322::-;45349:10;45338:22;;;;:10;:22;;;;;:33;;;45330:70;;;;;-1:-1:-1;;;45330:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45426:16;;;;45409:14;45457:15;;;:6;:15;;;;;45426:16;45457:25;;-1:-1:-1;;;45457:25:0;;-1:-1:-1;;;;;45457:25:0;:29;;;:50;;;45490:17;45499:7;45490:8;:17::i;:::-;45449:94;;;;;-1:-1:-1;;;45449:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45552:43;45580:14;:11;;;;;45592:1;;45580:11;:14;:::i;:::-;45552:27;:43::i;:::-;45279:322;:::o;57939:135::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;58014:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:24;;-1:-1:-1;;58014:24:0::1;58034:4;58014:24;::::0;;58050:18;;;;;;;::::1;::::0;;;;;;;;::::1;57939:135:::0;:::o;46685:186::-;46782:17;;46774:62;;;;;-1:-1:-1;;;46774:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46843:22;:20;:22::i;:::-;46685:186;;;;:::o;60545:162::-;60651:6;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;60676:25:::1;60692:8;60676:15;:25::i;60977:169::-:0;61086:7;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;61112:28:::1;61131:8;61112:18;:28::i;43789:192::-:0;-1:-1:-1;;;;;43905:16:0;43870:6;43905:16;;;:7;:16;;;;;:33;;;;43940:34;;43905:33;;-1:-1:-1;;;43940:34:0;;;;;;43789:192::o;33653:609::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;33879:33;;::::1;33871:78;;;::::0;;-1:-1:-1;;;33871:78:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29998:2;33964:43;33991:8:::0;33972:13:::1;:11;:13::i;:::-;33964:22;;:26;;:43;;;;:::i;:::-;:63;;33956:95;;;::::0;;-1:-1:-1;;;33956:95:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33956:95:0;;;;;;;;;;;;;::::1;;34065:9;34060:97;34080:19:::0;;::::1;34060:97;;;34115:34;34125:8;;34134:1;34125:11;;;;;;;;;;;;;-1:-1:-1::0;;;;;34125:11:0::1;34138:7;;34146:1;34138:10;;;;;;;;;;;;;-1:-1:-1::0;;;;;34138:10:0::1;34115:9;:34::i;:::-;34101:3;;34060:97;;;-1:-1:-1::0;34184:13:0::1;::::0;34165:91:::1;::::0;-1:-1:-1;;;;;34184:13:0;::::1;::::0;34199:15;;34216;;34233:13;;-1:-1:-1;;;34248:7:0;::::1;;;34165:18;:91::i;:::-;33653:609:::0;;;;;;;:::o;43317:325::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;43470:13:::1;::::0;43489:7;;43426:59:::1;::::0;43454:30:::1;::::0;-1:-1:-1;;;;;43470:13:0::1;43454:15;:30::i;:::-;43434:14;::::0;-1:-1:-1;;;43434:14:0;::::1;-1:-1:-1::0;;;;;43434:14:0::1;::::0;43426:27:::1;:59::i;:::-;:70;;43418:109;;;::::0;;-1:-1:-1;;;43418:109:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43542:9;::::0;:39:::1;::::0;;-1:-1:-1;;;43542:39:0;;-1:-1:-1;;;;;43542:39:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:9;;;::::1;::::0;:18:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;:9:::1;::::0;:39;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;43542:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43542:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;43542:39:0;43534:73:::1;;;::::0;;-1:-1:-1;;;43534:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43534:73:0;;;;;;;;;;;;;::::1;;43614:22;:20;:22::i;29146:28::-:0;;;-1:-1:-1;;;;;29146:28:0;;:::o;29216:32::-;;;-1:-1:-1;;;29216:32:0;;;;;:::o;29049:29::-;;;-1:-1:-1;;;;;29049:29:0;;:::o;57247:24::-;;;;;;:::o;42071:145::-;-1:-1:-1;;;;;42181:16:0;42155:7;42181:16;;;:7;:16;;;;;:29;-1:-1:-1;;;;;42181:29:0;;42071:145::o;44461:280::-;-1:-1:-1;;;;;44552:16:0;;;;;;;:7;:16;;;;;:22;;;;;;;44578:10;44552:36;44544:71;;;;;-1:-1:-1;;;44544:71:0;;;;;;;;;;;;-1:-1:-1;;;44544:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44622:16:0;;;;;;;:7;:16;;;;;;;;;:29;;:41;;-1:-1:-1;;;;;;44622:41:0;;;;;;;;;44677:58;;44713:10;44677:58;;;;;;;;;;;44622:16;;44677:58;;;;;;;;;;;44461:280;;:::o;34718:381::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;34911:9:::1;34906:88;34926:19:::0;;::::1;34906:88;;;34961:25;34974:8;;34983:1;34974:11;;;;;;;;;;;;;-1:-1:-1::0;;;;;34974:11:0::1;34961:12;:25::i;:::-;34947:3;;34906:88;;;-1:-1:-1::0;35021:13:0::1;::::0;35002:91:::1;::::0;-1:-1:-1;;;;;35021:13:0;::::1;::::0;35036:15;;35053;;35070:13;;-1:-1:-1;;;35085:7:0;::::1;;;35002:18;:91::i;703:157::-:0;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;784:12:::1;:18:::0;;-1:-1:-1;;;;;;784:18:0::1;-1:-1:-1::0;;;;;784:18:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;843:5:0;;816:38:::1;::::0;784:18;;843:5:::1;::::0;816:38:::1;::::0;-1:-1:-1;816:38:0::1;703:157:::0;:::o;63791:279::-;63895:15;63919:13;63941:17;63967;63993:23;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;64041:23:::1;:21;:23::i;:::-;64034:30;;;;;;;;;;63791:279:::0;;;;;:::o;40125:418::-;40236:15;40260:13;40282:17;40308;40334:23;40375:14;;:::i;:::-;40392:24;;;;;;;;:6;:24;;;;;;;;;40375:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40375:41:0;;;;;;;-1:-1:-1;;;40375:41:0;;;;;;;-1:-1:-1;;;40375:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40392:24;;40375:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40375:41:0;;;-1:-1:-1;;40375:41:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40375:41:0;;;;;;;;;;;;-1:-1:-1;;;40375:41:0;;;;;;;;;;;;-1:-1:-1;;;40375:41:0;;;-1:-1:-1;;;;;40375:41:0;;;;;;;;;;;;;40456:8;;40473:11;;;;40493;;;;40513:17;;;40439:8;;40456;;-1:-1:-1;;;;;40423:114:0;;;;-1:-1:-1;40423:114:0;;;-1:-1:-1;40423:114:0;;;-1:-1:-1;40125:418:0;;-1:-1:-1;;;;40125:418:0:o;55397:798::-;-1:-1:-1;;;;;55572:16:0;;55549:20;55572:16;;;:7;:16;;;;;:30;55623:16;;55497:12;;55572:30;-1:-1:-1;;;55572:30:0;;;;;;55623:16;55652:18;55648:51;;55672:27;;;;;;;;;;;;;-1:-1:-1;;;55672:27:0;;;;;;;;;55648:51;55726:8;55710:24;;:13;:24;;;55706:61;;;55736:31;;;;;;;;;;;;;-1:-1:-1;;;55736:31:0;;;;;;;;;55706:61;-1:-1:-1;;;;;55778:16:0;;;;;;:7;:16;;;;;:28;:39;;;;-1:-1:-1;;;55778:28:0;;;;:39;55774:78;;;55819:33;;;;;;;;;;;;;;;;;;;;;;;55774:78;-1:-1:-1;;;;;55863:16:0;;;;;;:7;:16;;;;;:34;:46;;;;-1:-1:-1;;;55863:34:0;;;;:46;55859:93;;55911:41;;;;;;;;;;;;;;;;;;;;;;;55859:93;55975:4;55963:16;;:8;:16;;;;:43;;;;-1:-1:-1;55995:11:0;:8;;;;;56004:1;;55995:8;:11;:::i;:::-;55983:23;;:8;:23;;;;55963:43;:92;;;;;56011:44;56040:8;56050:4;56011:28;:44::i;:::-;56010:45;55963:92;55959:130;;;56057:32;;;;;;;;;;;;;;;;;;;;;;;55959:130;56100:8;:13;;56112:1;56100:13;;:47;;;;-1:-1:-1;56118:29:0;56131:15;:12;;;;;56144:1;;56131:12;:15;:::i;:::-;56118:12;:29::i;:::-;56117:30;56100:47;56096:93;;;56149:40;;;;;;;;;;;;;;;;;;;;;;;56096:93;55397:798;;;;;;:::o;50551:369::-;50630:18;50639:8;50630;:18::i;:::-;50625:32;;50650:7;;50625:32;50693:10;50663:19;50685;;;:7;:19;;;;;:36;50781:12;;50685:36;-1:-1:-1;;;50685:36:0;;;;;;-1:-1:-1;;;50781:12:0;;;;;50767:26;;50755:38;;;;;;;:58;;-1:-1:-1;50797:16:0;;;50755:58;50751:71;;;50815:7;;;50751:71;50830:28;50849:8;50830:18;:28::i;:::-;-1:-1:-1;50875:10:0;50867:19;;;;:7;:19;;;;;:47;;;;;-1:-1:-1;;;50867:47:0;-1:-1:-1;;;;;50867:47:0;;;;;;50551:369;:::o;52626:408::-;52720:30;52741:8;52720:20;:30::i;:::-;52712:74;;;;;-1:-1:-1;;;52712:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52795:16;;;;;;;:6;:16;;;;;;;;:24;;27:10:-1;;39:1;23:18;;;45:23;;52795:54:0;;;;;;;;;;52864:10;52856:19;;;:7;:19;;;;;;:48;;-1:-1:-1;;;;52856:48:0;-1:-1:-1;;;52856:48:0;;;;;52911:36;:50;;;52975:53;52864:10;;52795:16;:54;;52975:53;;52795:16;52975:53;52626:408;;:::o;51726:494::-;51843:16;;;;;;;;:6;:16;;;;;:39;;;;:24;;;;51797:43;-1:-1:-1;;;51843:39:0;;;;;;-1:-1:-1;51793:98:0;;;51884:7;;51793:98;51942:16;;;51899;51942;;;:6;:16;;;;;;;;:24;;51918:61;;;;;;;;;;;;;;;;;;;;;51942:24;51918:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:61::i;:::-;51986:16;;;;;;;:6;:16;;;;;;;;;:35;;;52028:26;;:52;;-1:-1:-1;;;;52028:52:0;-1:-1:-1;;;52064:15:0;-1:-1:-1;;;;;52028:52:0;;;;;;;;;;-1:-1:-1;;;;52087:43:0;-1:-1:-1;;;52087:43:0;;;;;;52137:13;:24;;-1:-1:-1;;52137:24:0;-1:-1:-1;;;52137:24:0;;;;;52175:39;;;;;;;51986:35;;-1:-1:-1;51986:16:0;;:35;;52175:39;;;;;;;;51726:494;;:::o;52226:394::-;52303:16;;;;52285:15;52303:16;;;:6;:16;;;;;:38;;;;;52368:14;;-1:-1:-1;;;;;;;;52303:38:0;;;;;;52368:27;;-1:-1:-1;;;52368:14:0;;;;;;;52303:38;;52368:18;:27;:::i;:::-;52404:14;:26;;-1:-1:-1;;;;;52404:26:0;;;-1:-1:-1;;;52404:26:0;;;;;;;;;;;-1:-1:-1;52454:27:0;;:14;52473:7;52454:18;:27::i;:::-;52437:14;:44;;-1:-1:-1;;;;;;52437:44:0;-1:-1:-1;;;;;52437:44:0;;;;;;52531:10;-1:-1:-1;52523:19:0;;;:7;:19;;;;;:32;:45;;:32;52560:7;52523:36;:45::i;:::-;52496:10;52488:19;;;;:7;:19;;;;;;:80;;-1:-1:-1;;;;;;52488:80:0;-1:-1:-1;;;;;52488:80:0;;;;;;52582:32;;;;;;;52488:19;52582:32;52226:394;;;:::o;53040:211::-;53158:16;;;;;;;;:6;:16;;;;;:39;;;;:24;;;;53112:43;53158:39;;-1:-1:-1;53108:98:0;;;53199:7;;53108:98;53221:16;;;;;;;:6;:16;;;;;:24;;;53214:31;53221:24;:16;53214:31;:::i;:::-;-1:-1:-1;53214:31:0;;;;-1:-1:-1;;;;;;53214:31:0;;;53040:211;:::o;54050:157::-;54129:7;54155:46;29948:1;54155:26;54167:13;:11;:13::i;:::-;54155:26;;:7;:11;;:26;;;;:::i;:::-;:30;:46;:30;:46;:::i;18403:170::-;18461:7;18490:1;-1:-1:-1;;;;;18485:6:0;:1;-1:-1:-1;;;;;18485:6:0;;;18477:49;;;;;-1:-1:-1;;;18477:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18545:5:0;;;18403:170::o;4922:::-;4980:7;5009:1;5004;:6;;4996:49;;;;;-1:-1:-1;;;4996:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37500:146;37619:13;;-1:-1:-1;;;37619:13:0;;;;37587:6;37612:21;;;:6;:21;;;;;:28;;37500:146::o;37773:153::-;37896:13;;-1:-1:-1;;;37896:13:0;;;;37863:7;37889:21;;;:6;:21;;;;;:31;;;-1:-1:-1;;;37889:31:0;;-1:-1:-1;;;;;37889:31:0;;37773:153::o;48033:432::-;48175:23;;;48145:14;48175:23;;;:6;:23;;;;;:33;;;-1:-1:-1;;;;;48175:33:0;:37;48171:289;;48230:37;48251:15;48230:20;:37::i;:::-;:98;;;;;48271:45;48291:7;48300:15;48271:19;:45::i;:::-;:52;:57;48230:98;48223:105;;;;48171:289;48358:33;48366:7;48375:15;48358:7;:33::i;48471:1511::-;-1:-1:-1;;;;;48877:16:0;;48571:22;48877:16;;;:7;48831:9;48877:16;48831:9;48877:16;;48953;;48925:24;;48571:22;;;;;;;;;;;;;;48831:9;;48877:16;;48571:22;;48831:9;48953:16;;;-1:-1:-1;;;48925:24:0;;;;:44;;:87;;-1:-1:-1;48995:16:0;;48974:38;;48995:16;;48974:20;:38::i;:::-;48973:39;48925:87;49236:16;;48902:110;;-1:-1:-1;49223:30:0;;49236:16;;49223:12;:30::i;:::-;:49;;;;;49257:15;49223:49;49219:432;;;49294:16;;:23;;:16;;;;;49315:1;;49294:20;:23;:::i;:::-;49334:16;;;;;;;:6;:16;;;;;49378:13;;49283:34;;-1:-1:-1;;;;;;49378:13:0;;;;-1:-1:-1;49334:16:0;-1:-1:-1;49420:26:0;49428:7;49283:34;49420:7;:26::i;:::-;49400:46;;49219:432;;;49480:16;;;;;49513;;;:6;:16;;;;;49557:27;;;;49480:16;;-1:-1:-1;;;;49557:27:0;;;-1:-1:-1;;;;;49557:27:0;;-1:-1:-1;49513:16:0;-1:-1:-1;49613:30:0;49480:16;49613:20;:30::i;:::-;49593:50;;49219:432;49663:38;49683:7;49692:8;49663:19;:38::i;:::-;:45;:50;49659:98;;49744:5;49724:25;;49659:98;49824:23;;;;;49856:15;;;;49880:21;;;;;49910:14;;49781:17;;49807:8;;49824:23;;-1:-1:-1;;;;;49856:15:0;;;;-1:-1:-1;;;49880:21:0;;;;;;-1:-1:-1;;;49910:14:0;;-1:-1:-1;;;;;49910:14:0;49933:13;:11;:13::i;:::-;49955:14;49765:211;;;;;;;;;;;;;;;;;;;;;;;;48471:1511;;;;;;;;;:::o;53257:296::-;53364:16;;;;53329:4;53364:16;;;:6;:16;;;;;:26;;;;53419:32;;;;;53329:4;;-1:-1:-1;;;;;53364:26:0;;;;-1:-1:-1;;;53419:32:0;;;53465:13;;;;;:33;;;53497:1;53482:12;:16;;;53465:33;:82;;;;-1:-1:-1;53532:15:0;53502:27;-1:-1:-1;;;;;53502:13:0;;:27;;;;;:13;:27;:::i;:::-;-1:-1:-1;;;;;53502:45:0;;53465:82;53458:89;53257:296;-1:-1:-1;;;;53257:296:0:o;25084:163::-;25140:6;25166:5;;;25186:6;;;;;;;;;25178:46;;;;;-1:-1:-1;;;25178:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25178:46:0;;;;;;;;;;;;;;50926:413;51008:18;51017:8;51008;:18::i;:::-;51003:32;;51028:7;;51003:32;51074:10;51041:19;51063:22;;;:10;:22;;;;;:39;;;;;;;;;51165:28;;;;51151:42;;51140:53;;;;;:73;;-1:-1:-1;51197:16:0;;51140:73;51132:105;;;;;-1:-1:-1;;;51132:105:0;;;;;;;;;;;;-1:-1:-1;;;51132:105:0;;;;;;;;;;;;;;;51246:28;51265:8;51246:18;:28::i;:::-;-1:-1:-1;51294:10:0;51283:22;;;;:10;:22;;;;;:50;;;;;;;-1:-1:-1;;51283:50:0;;;;;;50926:413;:::o;38536:162::-;38661:24;;38636:6;38661:24;;;:6;:24;;;;;:31;;38536:162::o;38904:169::-;39033:24;;39007:7;39033:24;;;:6;:24;;;;;:34;;;-1:-1:-1;;;39033:34:0;;-1:-1:-1;;;;;39033:34:0;;38904:169::o;4492:167::-;4550:7;4578:5;;;4598:6;;;;4590:46;;;;;-1:-1:-1;;;4590:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4590:46:0;;;;;;;;;;;;;;54213:687;54312:22;54326:7;54312:13;:22::i;:::-;54311:23;54303:58;;;;;-1:-1:-1;;;54303:58:0;;;;;;;;;;;;-1:-1:-1;;;54303:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54378:20:0;;54370:54;;;;;-1:-1:-1;;;54370:54:0;;;;;;;;;;;;-1:-1:-1;;;54370:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54439:16:0;;;54473:1;54439:16;;;:7;:16;;;;;:22;;;;;;;:36;;:72;;-1:-1:-1;;;;;;54479:16:0;;;;;;;:7;:16;;;;;:22;;;;;;;;:32;;;;54439:72;54431:113;;;;;-1:-1:-1;;;54431:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54586:25;54603:7;54586:16;:25::i;:::-;-1:-1:-1;;;;;54553:16:0;;;;;;;:7;:16;;;;;;:58;;-1:-1:-1;;;;54553:58:0;;;;;-1:-1:-1;;;54553:58:0;-1:-1:-1;;;;54553:58:0;;;;54618:40;;;;-1:-1:-1;;;54618:40:0;;;54697:15;:22;;54665;;;;:55;;;;;;-1:-1:-1;;54665:55:0;;;;;;;;;27:10:-1;;-1:-1;23:18;;;45:23;;;54727:29:0;;;;-1:-1:-1;;;;;;54727:29:0;;;;;54763:16;;;:31;;;;;;;-1:-1:-1;;;;;;54763:31:0;;;;;;;;;;54808:39;;-1:-1:-1;;54553:16:0;;54808:39;;54553:16;54808:39;54887:6;-1:-1:-1;;;;;54859:35:0;54878:7;-1:-1:-1;;;;;54859:35:0;;;;;;;;;;;54213:687;;:::o;54906:485::-;54986:22;55000:7;54986:13;:22::i;:::-;54978:53;;;;;-1:-1:-1;;;54978:53:0;;;;;;;;;;;;-1:-1:-1;;;54978:53:0;;;;;;;;;;;;;;;55071:16;;:23;;:16;;;;;55092:1;;55071:20;:23;:::i;:::-;-1:-1:-1;;;;;55040:16:0;;;;;;:7;:16;;;;;:54;;;;;;;-1:-1:-1;;;55040:54:0;-1:-1:-1;;;;55040:54:0;;;;;;;;;;55116:15;55132:20;-1:-1:-1;55132:13:0;:11;:13::i;:::-;:17;;;;:20;;;;:::i;:::-;55116:37;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55175:16:0;;;;;;:7;:16;;;;;;;:22;;;;;;55116:37;;;;55204:13;;;;;;:19;:27;;55175:22;;;;-1:-1:-1;;55204:27:0;;;;;;;;55245:16;;;;55238:29;;;;;55274:15;:22;;55116:37;;-1:-1:-1;55175:22:0;;55116:37;;55274:15;55175:22;;55274;;;;;;;;;;;;;;:29;;;;;-1:-1:-1;;;;;55274:29:0;;;;;-1:-1:-1;;;;;55274:29:0;;;;;;55310:15;:21;;;;;;;;;;;;;;;;-1:-1:-1;;55310:21:0;;;;;-1:-1:-1;;;;;;55310:21:0;;;;;;;;;55345:40;;-1:-1:-1;;;;;55345:40:0;;;;;55310:21;;55345:40;54906:485;;;:::o;41697:277::-;41795:15;41819:13;41841:17;41867;41893:23;41941:27;41954:13;;;;;;;;;;;41941:27;;:12;:27::i;53853:191::-;53959:4;54001:5;53982:24;;:15;53995:1;53982:8;:12;;;;:15;;;;:::i;:::-;:24;;;:56;;;;-1:-1:-1;;54010:13:0;;;;;;:6;:13;;;;;:23;;;-1:-1:-1;;;54010:23:0;;-1:-1:-1;;;;;54010:23:0;:28;;53853:191;-1:-1:-1;53853:191:0:o;25510:166::-;25566:6;25594:1;25589:6;;:1;:6;;;;25581:49;;;;;-1:-1:-1;;;25581:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;56201:157;56300:16;;;56277:4;56300:16;;;:6;:16;;;;;:26;;;-1:-1:-1;;;56300:26:0;;-1:-1:-1;;;;;56300:26:0;:30;;;:52;;;56334:18;56343:8;56334;:18::i;56922:136::-;57029:16;;56994:4;;57029:23;;:16;;;;;57050:1;;57029:20;:23;:::i;:::-;57017:35;;:8;:35;;;57010:42;;56922:136;;;:::o;50020:525::-;50088:40;50112:15;:12;;;;;50125:1;;50112:12;:15;:::i;:::-;50088:23;:40::i;:::-;50137:16;:27;;-1:-1:-1;;50137:27:0;;;;;;;;;;;;;50213:18;;;-1:-1:-1;50171:16:0;;;:6;:16;;;;;;;;;:39;;;:60;;-1:-1:-1;;;50213:18:0;;;;;50171:60;;;;;;;;;;;50280:18;;-1:-1:-1;;50238:60:0;;;-1:-1:-1;;;50280:18:0;;;;;-1:-1:-1;;;50238:60:0;;;;;50346:13;;-1:-1:-1;;;;50305:54:0;;;-1:-1:-1;;;;;50346:13:0;;;-1:-1:-1;;;50305:54:0;;;;;50401:7;;-1:-1:-1;;50366:42:0;;;-1:-1:-1;;;50401:7:0;;;;;;-1:-1:-1;;;50366:42:0;;;;;;;;-1:-1:-1;50415:26:0;;;;:52;;-1:-1:-1;;50415:52:0;50451:15;-1:-1:-1;;;;;50415:52:0;;;;;;;;;;;50481:58;;50512:26;;50481:58;;;;50500:10;;50137:27;;50481:58;;;;;;;;;50020:525;:::o;56517:157::-;56624:16;;;;56601:4;56624:16;;;:6;:16;;;;;:39;;;;:44;;;56517:157::o;10022:522::-;10108:6;10138:4;:11;10134:1;:15;10126:50;;;;;-1:-1:-1;;;10126:50:0;;;;;;;;;;;;-1:-1:-1;;;10126:50:0;;;;;;;;;;;;;;;10197:11;;10243:1;10237:7;;10255;;;10251:288;;10278:14;10301;10345:62;10360:4;10366:1;10375;10369:3;:7;10392:1;10378:11;:15;10395:11;10345:14;:62::i;:::-;10324:83;;-1:-1:-1;10324:83:0;-1:-1:-1;10423:36:0;10324:83;;10423:18;:36::i;:::-;10416:43;;;;;;;;10251:288;10489:42;10501:4;10507:1;10516;10510:3;:7;10519:11;10489;:42::i;:::-;10482:49;;;;;;17973:167;18031:7;18059:5;;;-1:-1:-1;;;;;18079:6:0;;;;;;;;18071:46;;;;;-1:-1:-1;;;18071:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18071:46:0;;;;;;;;;;;;;;5331:430;5389:7;5617:6;5613:37;;-1:-1:-1;5641:1:0;5634:8;;5613:37;5670:5;;;5674:1;5670;:5;:1;5690:5;;;;;:10;5682:56;;;;-1:-1:-1;;;5682:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56680:236;-1:-1:-1;;;;;56806:16:0;;56768:4;56806:16;;;:7;:16;;;;;:33;56878:12;;56806:33;-1:-1:-1;;;56806:33:0;;;;;;-1:-1:-1;;;56878:12:0;;;;;56864:26;;56853:37;;;;;:57;;-1:-1:-1;56894:16:0;;56846:64;-1:-1:-1;;;56680:236:0:o;21538:163::-;21594:6;21620:5;;;-1:-1:-1;;;;;21640:6:0;;;;;;;;21632:46;;;;;-1:-1:-1;;;21632:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21632:46:0;;;;;;;;;;;;;;56364:147;-1:-1:-1;;;;;56464:16:0;56441:4;56464:16;;;:7;:16;;;;;:28;30041:7;-1:-1:-1;;;56464:28:0;;;;;:41;;56364:147::o;53559:288::-;53679:16;;53639:6;;53679:16;;53706:17;;;;;:65;;-1:-1:-1;;;;;;53743:16:0;;;;;;:7;:16;;;;;:28;;53727:44;;;-1:-1:-1;;;53743:28:0;;;;53727:44;53706:65;53702:107;;;53789:12;-1:-1:-1;53782:19:0;;53702:107;53822:19;:16;;;;;53839:1;;53822:16;:19;:::i;:::-;53815:26;53559:288;-1:-1:-1;;;53559:288:0:o;51345:375::-;51423:18;51432:8;51423;:18::i;:::-;51418:32;;51443:7;;51418:32;51458:13;51474:15;:12;;;;;51487:1;;51474:12;:15;:::i;:::-;51522:14;;;;;;;;:6;:14;;;;;;:21;;51496:16;;;;;;;;:47;;;51585:30;;;;;51550:32;;;:65;;-1:-1:-1;;;;51550:65:0;-1:-1:-1;;;51585:30:0;;;;;;;51550:65;;;;;;;-1:-1:-1;;;;51622:52:0;-1:-1:-1;;;51658:15:0;-1:-1:-1;;;;;51622:52:0;;;;;;51522:14;;-1:-1:-1;51690:24:0;;;51683:31;51690:24;51522:14;51683:31;:::i;:::-;-1:-1:-1;51683:31:0;;;;-1:-1:-1;;;;;;51683:31:0;;;-1:-1:-1;51345:375:0;:::o;14213:831::-;14390:11;14403;14439:2;14434;:7;14426:16;;12:1:-1;9;2:12;14426:16:0;14463:2;14457;:8;;:20;;;;;14475:2;14469;:8;;14457:20;14449:29;;12:1:-1;9;2:12;14449:29:0;14499:2;14493;:8;;:20;;;;;14511:2;14505;:8;;14493:20;14485:29;;12:1:-1;9;2:12;14485:29:0;10677:1;14554:2;14549;:7;:35;14545:105;;;14604:36;14619:4;14625:2;14629;14633;14637;14604:14;:36::i;:::-;14597:43;;;;;;14545:105;14658:16;14677:23;14687:4;14693:2;14697;14677:9;:23::i;:::-;14658:42;;14719:8;14713:2;:14;14709:323;;14745:8;14740:13;;14709:323;;;14784:2;14773:8;:13;14769:263;;;14804:8;14815:1;14804:12;14799:17;;14769:263;;;14856:8;14850:2;:14;;:31;;;;;14879:2;14868:8;:13;14850:31;14843:39;;;;14900:35;14912:4;14918:2;14922:8;14932:2;14900:11;:35::i;:::-;14893:42;;14953:39;14965:4;14971:8;14982:1;14971:12;14985:2;14989;14953:11;:39::i;:::-;14946:46;-1:-1:-1;15003:19:0;;-1:-1:-1;15003:19:0;14769:263;14523:516;;;;14213:831;;;;;;;;:::o;8985:277::-;9058:6;9086:1;9081:2;:6;:16;;;;;9096:1;9091:2;:6;9081:16;9080:40;;;;9108:1;9103:2;:6;:16;;;;;9118:1;9113:2;:6;9103:16;9076:85;;;9152:1;9138:11;9142:2;9146;9138:3;:11::i;:::-;:15;;;;;;9131:22;;;;9076:85;9167:16;9206:1;9187:6;;;9196;;;9187:15;9186:21;;-1:-1:-1;9221:35:0;9225:19;9234:1;9229:2;:6;9242:1;9237:2;:6;9225:3;:19::i;:::-;9246:9;9221:3;:35::i;13241:798::-;13356:10;13392:1;13386:2;:7;;13378:16;;12:1:-1;9;2:12;13378:16:0;13414:2;13409:1;:7;;13401:16;;12:1:-1;9;2:12;13401:16:0;13436:2;13431;:7;13424:588;;;10677:1;13458:2;13453;:7;:35;13449:157;;;13501:13;13541:34;13556:4;13562:2;13566;13570:1;13573;13541:14;:34::i;:::-;-1:-1:-1;13525:50:0;-1:-1:-1;13586:10:0;;-1:-1:-1;13586:10:0;13449:157;13614:18;13635:23;13645:4;13651:2;13655;13635:9;:23::i;:::-;13614:44;;13676:10;13671:1;:15;13667:338;;13821:10;13816:15;;13667:338;;;13981:10;13994:1;13981:14;13976:19;;13667:338;13424:588;;;;14025:4;14030:2;14025:8;;;;;;;;;;;;;;14018:15;;13241:798;;;;;;:::o;10821:2258::-;10982:11;10995;11254;11277:2;11268;11273:1;11268:6;:11;11254:25;;11286:9;11298:4;11303:2;11308:1;11303:6;11298:12;;;;;;;;;;;;;;11286:24;;11317:9;11333:3;11329:1;:7;:32;;-1:-1:-1;;;;;11329:32:0;;;11339:4;11344:2;11349:1;11344:6;11339:12;;;;;;;;;;;;;;11329:32;11317:44;;11368:9;11384:3;11380:1;:7;:32;;-1:-1:-1;;;;;11380:32:0;;;11390:4;11395:2;11400:1;11395:6;11390:12;;;;;;;;;;;;;;11380:32;11368:44;;11419:9;11435:3;11431:1;:7;:32;;-1:-1:-1;;;;;11431:32:0;;;11441:4;11446:2;11451:1;11446:6;11441:12;;;;;;;;;;;;;;11431:32;11419:44;;11470:9;11486:3;11482:1;:7;:32;;-1:-1:-1;;;;;11482:32:0;;;11492:4;11497:2;11502:1;11497:6;11492:12;;;;;;;;;;;;;;11482:32;11470:44;;11521:9;11537:3;11533:1;:7;:32;;-1:-1:-1;;;;;11533:32:0;;;11543:4;11548:2;11553:1;11548:6;11543:12;;;;;;;;;;;;;;11533:32;11521:44;;11572:9;11588:3;11584:1;:7;:32;;-1:-1:-1;;;;;11584:32:0;;;11594:4;11599:2;11604:1;11599:6;11594:12;;;;;;;;;;;;;;11584:32;11572:44;;11634:2;11629;:7;11625:35;;;11651:2;;11655;11625:35;11675:2;11670;:7;11666:35;;;11692:2;;11696;11666:35;11716:2;11711;:7;11707:35;;;11733:2;;11737;11707:35;11757:2;11752;:7;11748:35;;;11774:2;;11778;11748:35;11798:2;11793;:7;11789:35;;;11815:2;;11819;11789:35;11839:2;11834;:7;11830:35;;;11856:2;11830:35;11880:2;11875;:7;11871:35;;;11897:2;;11901;11871:35;11921:2;11916;:7;11912:35;;;11938:2;11912:35;11962:2;11957;:7;11953:35;;;11979:2;;11983;11953:35;12003:2;11998;:7;11994:35;;;12020:2;;12024;11994:35;12044:2;12039;:7;12035:35;;;12061:2;12035:35;12085:2;12080;:7;12076:35;;;12102:2;;12106;12076:35;12126:2;12121;:7;12117:35;;;12143:2;12117:35;12167:2;12162;:7;12158:35;;;12184:2;;12188;12158:35;12208:2;12203;:7;12199:35;;;12225:2;;12229;12199:35;12249:2;12244;:7;12240:35;;;12266:2;;12270;12240:35;12300:7;;;12318:11;12314:309;;12339:2;12332:9;;12314:309;;;12358:6;12368:1;12358:11;12354:269;;;12379:2;12372:9;;12354:269;;;12398:6;12408:1;12398:11;12394:229;;;12419:2;12412:9;;12394:229;;;12438:6;12448:1;12438:11;12434:189;;;12459:2;12452:9;;12434:189;;;12478:6;12488:1;12478:11;12474:149;;;12499:2;12492:9;;12474:149;;;12518:6;12528:1;12518:11;12514:109;;;12539:2;12532:9;;12514:109;;;12558:6;12568:1;12558:11;12554:69;;;12579:2;12572:9;;12554:69;;;12595:26;;;-1:-1:-1;;;12595:26:0;;;;;;;;;;;;-1:-1:-1;;;12595:26:0;;;;;;;;;;;;;;12554:69;12648:7;;;12666:8;;;12662:412;;;-1:-1:-1;12685:4:0;;-1:-1:-1;12677:19:0;;-1:-1:-1;;;;;;;;;12677:19:0;12662:412;12713:11;12709:365;;-1:-1:-1;12741:2:0;;-1:-1:-1;12727:17:0;;-1:-1:-1;;;;;;;;12727:17:0;12709:365;12761:6;12771:1;12761:11;12757:317;;;-1:-1:-1;12789:2:0;;-1:-1:-1;12775:17:0;;-1:-1:-1;;;;;;;;12775:17:0;12757:317;12809:6;12819:1;12809:11;12805:269;;;-1:-1:-1;12837:2:0;;-1:-1:-1;12823:17:0;;-1:-1:-1;;;;;;;;12823:17:0;12805:269;12857:6;12867:1;12857:11;12853:221;;;-1:-1:-1;12885:2:0;;-1:-1:-1;12871:17:0;;-1:-1:-1;;;;;;;;12871:17:0;12853:221;12905:6;12915:1;12905:11;12901:173;;;-1:-1:-1;12933:2:0;;-1:-1:-1;12919:17:0;;-1:-1:-1;;;;;;;;12919:17:0;12901:173;12953:6;12963:1;12953:11;12949:125;;;-1:-1:-1;12981:2:0;;-1:-1:-1;12967:17:0;;-1:-1:-1;;;;;;;;12967:17:0;12949:125;13001:6;13011:1;13001:11;12997:77;;;-1:-1:-1;13029:2:0;;-1:-1:-1;13015:17:0;;-1:-1:-1;;;;;;;;13015:17:0;12997:77;13046:26;;;-1:-1:-1;;;13046:26:0;;;;;;;;;;;;-1:-1:-1;;;13046:26:0;;;;;;;;;;;;;;15376:1256;15478:7;;15650:4;15667:1;15656:7;;;15655:13;15650:19;;;;;;;;;;;;;;15635:34;;15682:1;15676:7;;;;15739:1;15733:7;;;;15747:880;15789:1;15783:7;;;;15819:5;15808:4;15813:2;15808:8;;;;;;;;;;;;;;:16;15769:57;;15834;15854:1;15848:7;;;;15884:5;15873:4;15878:2;15873:8;;;;;;;;;;;;;;:16;15834:57;;15908:2;15903;:7;15899:721;;;15947:4;15952:2;15947:8;;;;;;;;;;;;;;15957:4;15962:2;15957:8;;;;;;;;;;;;;;15924:4;15929:2;15924:8;;;;;;;;;;;;;15934:4;15939:2;15934:8;;;;;;;;;;;;;;;;;15923:43;;;;;15899:721;;;16608:2;16601:9;;;;;15899:721;15747:880;;8547:201;8603:6;8629:5;;;8650:6;;;;;;:16;;;8665:1;8660;:6;;8650:16;8649:38;;;;8676:1;8672;:5;:14;;;;;8685:1;8681;:5;8672:14;8641:84;;;;-1:-1:-1;;;8641:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59180:4893;;;;;;;;;;;;;;;-1:-1:-1;;;;;59180:4893:0;;;;;;-1:-1:-1;;;;;59180:4893:0;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;59180:4893:0;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://fee95a6f210e458d4885d51dc069e62dac9ef4de46bcde85ea7ce9998f056088
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.