Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- OlympusTreasury
- Optimization enabled
- true
- Compiler version
- v0.7.5+commit.eb77ed08
- Optimization runs
- 200
- EVM Version
- istanbul
- Verified at
- 2026-03-30T12:00:25.131596Z
Constructor Arguments
00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d500000000000000000000000000000000000000000000000000000000000019c80000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a
Arg [0] (address) : 0x64aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5
Arg [1] (uint256) : 6600
Arg [2] (address) : 0x1c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a
Treasury_flat.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
// File: interfaces/IOlympusAuthority.sol
pragma solidity =0.7.5;
interface IOlympusAuthority {
/* ========== EVENTS ========== */
event GovernorPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event GuardianPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event PolicyPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event VaultPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event GovernorPulled(address indexed from, address indexed to);
event GuardianPulled(address indexed from, address indexed to);
event PolicyPulled(address indexed from, address indexed to);
event VaultPulled(address indexed from, address indexed to);
/* ========== VIEW ========== */
function governor() external view returns (address);
function guardian() external view returns (address);
function policy() external view returns (address);
function vault() external view returns (address);
}
// File: types/OlympusAccessControlled.sol
pragma solidity >=0.7.5;
abstract contract OlympusAccessControlled {
/* ========== EVENTS ========== */
event AuthorityUpdated(IOlympusAuthority indexed authority);
string UNAUTHORIZED = "UNAUTHORIZED"; // save gas
/* ========== STATE VARIABLES ========== */
IOlympusAuthority public authority;
/* ========== Constructor ========== */
constructor(IOlympusAuthority _authority) {
authority = _authority;
emit AuthorityUpdated(_authority);
}
/* ========== MODIFIERS ========== */
modifier onlyGovernor() {
require(msg.sender == authority.governor(), UNAUTHORIZED);
_;
}
modifier onlyGuardian() {
require(msg.sender == authority.guardian(), UNAUTHORIZED);
_;
}
modifier onlyPolicy() {
require(msg.sender == authority.policy(), UNAUTHORIZED);
_;
}
modifier onlyVault() {
require(msg.sender == authority.vault(), UNAUTHORIZED);
_;
}
/* ========== GOV ONLY ========== */
function setAuthority(IOlympusAuthority _newAuthority) external onlyGovernor {
authority = _newAuthority;
emit AuthorityUpdated(_newAuthority);
}
}
// File: interfaces/ITreasury.sol
pragma solidity >=0.7.5;
interface ITreasury {
function deposit(
uint256 _amount,
address _token,
uint256 _profit
) external returns (uint256);
function withdraw(uint256 _amount, address _token) external;
function tokenValue(address _token, uint256 _amount) external view returns (uint256 value_);
function mint(address _recipient, uint256 _amount) external;
function manage(address _token, uint256 _amount) external;
function incurDebt(uint256 amount_, address token_) external;
function repayDebtWithReserve(uint256 amount_, address token_) external;
function excessReserves() external view returns (uint256);
function baseSupply() external view returns (uint256);
}
// File: interfaces/IBondingCalculator.sol
pragma solidity >=0.7.5;
interface IBondingCalculator {
function markdown( address _LP ) external view returns ( uint );
function valuation( address pair_, uint amount_ ) external view returns ( uint _value );
}
// File: interfaces/IOwnable.sol
pragma solidity >=0.7.5;
interface IOwnable {
function owner() external view returns (address);
function renounceManagement() external;
function pushManagement( address newOwner_ ) external;
function pullManagement() external;
}
// File: interfaces/IERC20.sol
pragma solidity >=0.7.5;
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: interfaces/IsOHM.sol
pragma solidity >=0.7.5;
interface IsOHM is IERC20 {
function rebase( uint256 ohmProfit_, uint epoch_) external returns (uint256);
function circulatingSupply() external view returns (uint256);
function gonsForBalance( uint amount ) external view returns ( uint );
function balanceForGons( uint gons ) external view returns ( uint );
function index() external view returns ( uint );
function toG(uint amount) external view returns (uint);
function fromG(uint amount) external view returns (uint);
function changeDebt(
uint256 amount,
address debtor,
bool add
) external;
function debtBalances(address _address) external view returns (uint256);
}
// File: interfaces/IOHM.sol
pragma solidity >=0.7.5;
interface IOHM is IERC20 {
function mint(address account_, uint256 amount_) external;
function burn(uint256 amount) external;
function burnFrom(address account_, uint256 amount_) external;
}
// File: interfaces/IERC20Metadata.sol
pragma solidity >=0.7.5;
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
// File: libraries/SafeERC20.sol
pragma solidity >=0.7.5;
/// @notice Safe IERC20 and ETH transfer library that safely handles missing return values.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/libraries/TransferHelper.sol)
/// Taken from Solmate
library SafeERC20 {
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FROM_FAILED");
}
function safeTransfer(
IERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(IERC20.transfer.selector, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FAILED");
}
function safeApprove(
IERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(IERC20.approve.selector, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "APPROVE_FAILED");
}
function safeTransferETH(address to, uint256 amount) internal {
(bool success, ) = to.call{value: amount}(new bytes(0));
require(success, "ETH_TRANSFER_FAILED");
}
}
// File: libraries/SafeMath.sol
pragma solidity ^0.7.5;
// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
// Only used in the BondingCalculator.sol
function sqrrt(uint256 a) internal pure returns (uint c) {
if (a > 3) {
c = a;
uint b = add( div( a, 2), 1 );
while (b < c) {
c = b;
b = div( add( div( a, b ), b), 2 );
}
} else if (a != 0) {
c = 1;
}
}
}
// File: Treasury.sol
pragma solidity ^0.7.5;
contract OlympusTreasury is OlympusAccessControlled, ITreasury {
/* ========== DEPENDENCIES ========== */
using SafeMath for uint256;
using SafeERC20 for IERC20;
/* ========== EVENTS ========== */
event Deposit(address indexed token, uint256 amount, uint256 value);
event Withdrawal(address indexed token, uint256 amount, uint256 value);
event CreateDebt(address indexed debtor, address indexed token, uint256 amount, uint256 value);
event RepayDebt(address indexed debtor, address indexed token, uint256 amount, uint256 value);
event Managed(address indexed token, uint256 amount);
event ReservesAudited(uint256 indexed totalReserves);
event Minted(address indexed caller, address indexed recipient, uint256 amount);
event PermissionQueued(STATUS indexed status, address queued);
event Permissioned(address addr, STATUS indexed status, bool result);
/* ========== DATA STRUCTURES ========== */
enum STATUS {
RESERVEDEPOSITOR,
RESERVESPENDER,
RESERVETOKEN,
RESERVEMANAGER,
LIQUIDITYDEPOSITOR,
LIQUIDITYTOKEN,
LIQUIDITYMANAGER,
RESERVEDEBTOR,
REWARDMANAGER,
SOHM,
OHMDEBTOR
}
struct Queue {
STATUS managing;
address toPermit;
address calculator;
uint256 timelockEnd;
bool nullify;
bool executed;
}
/* ========== STATE VARIABLES ========== */
IOHM public immutable OHM;
IsOHM public sOHM;
mapping(STATUS => address[]) public registry;
mapping(STATUS => mapping(address => bool)) public permissions;
mapping(address => address) public bondCalculator;
mapping(address => uint256) public debtLimit;
uint256 public totalReserves;
uint256 public totalDebt;
uint256 public ohmDebt;
Queue[] public permissionQueue;
uint256 public immutable blocksNeededForQueue;
bool public timelockEnabled;
bool public initialized;
uint256 public onChainGovernanceTimelock;
string internal notAccepted = "Treasury: not accepted";
string internal notApproved = "Treasury: not approved";
string internal invalidToken = "Treasury: invalid token";
string internal insufficientReserves = "Treasury: insufficient reserves";
/* ========== CONSTRUCTOR ========== */
constructor(
address _ohm,
uint256 _timelock,
address _authority
) OlympusAccessControlled(IOlympusAuthority(_authority)) {
require(_ohm != address(0), "Zero address: OHM");
OHM = IOHM(_ohm);
timelockEnabled = false;
initialized = false;
blocksNeededForQueue = _timelock;
}
/* ========== MUTATIVE FUNCTIONS ========== */
/**
* @notice allow approved address to deposit an asset for OHM
* @param _amount uint256
* @param _token address
* @param _profit uint256
* @return send_ uint256
*/
function deposit(
uint256 _amount,
address _token,
uint256 _profit
) external override returns (uint256 send_) {
if (permissions[STATUS.RESERVETOKEN][_token]) {
require(permissions[STATUS.RESERVEDEPOSITOR][msg.sender], notApproved);
} else if (permissions[STATUS.LIQUIDITYTOKEN][_token]) {
require(permissions[STATUS.LIQUIDITYDEPOSITOR][msg.sender], notApproved);
} else {
revert(invalidToken);
}
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
uint256 value = tokenValue(_token, _amount);
// mint OHM needed and store amount of rewards for distribution
send_ = value.sub(_profit);
OHM.mint(msg.sender, send_);
totalReserves = totalReserves.add(value);
emit Deposit(_token, _amount, value);
}
/**
* @notice allow approved address to burn OHM for reserves
* @param _amount uint256
* @param _token address
*/
function withdraw(uint256 _amount, address _token) external override {
require(permissions[STATUS.RESERVETOKEN][_token], notAccepted); // Only reserves can be used for redemptions
require(permissions[STATUS.RESERVESPENDER][msg.sender], notApproved);
uint256 value = tokenValue(_token, _amount);
OHM.burnFrom(msg.sender, value);
totalReserves = totalReserves.sub(value);
IERC20(_token).safeTransfer(msg.sender, _amount);
emit Withdrawal(_token, _amount, value);
}
/**
* @notice allow approved address to withdraw assets
* @param _token address
* @param _amount uint256
*/
function manage(address _token, uint256 _amount) external override {
if (permissions[STATUS.LIQUIDITYTOKEN][_token]) {
require(permissions[STATUS.LIQUIDITYMANAGER][msg.sender], notApproved);
} else {
require(permissions[STATUS.RESERVEMANAGER][msg.sender], notApproved);
}
if (permissions[STATUS.RESERVETOKEN][_token] || permissions[STATUS.LIQUIDITYTOKEN][_token]) {
uint256 value = tokenValue(_token, _amount);
require(value <= excessReserves(), insufficientReserves);
totalReserves = totalReserves.sub(value);
}
IERC20(_token).safeTransfer(msg.sender, _amount);
emit Managed(_token, _amount);
}
/**
* @notice mint new OHM using excess reserves
* @param _recipient address
* @param _amount uint256
*/
function mint(address _recipient, uint256 _amount) external override {
require(permissions[STATUS.REWARDMANAGER][msg.sender], notApproved);
require(_amount <= excessReserves(), insufficientReserves);
OHM.mint(_recipient, _amount);
emit Minted(msg.sender, _recipient, _amount);
}
/**
* DEBT: The debt functions allow approved addresses to borrow treasury assets
* or OHM from the treasury, using sOHM as collateral. This might allow an
* sOHM holder to provide OHM liquidity without taking on the opportunity cost
* of unstaking, or alter their backing without imposing risk onto the treasury.
* Many of these use cases are yet to be defined, but they appear promising.
* However, we urge the community to think critically and move slowly upon
* proposals to acquire these permissions.
*/
/**
* @notice allow approved address to borrow reserves
* @param _amount uint256
* @param _token address
*/
function incurDebt(uint256 _amount, address _token) external override {
uint256 value;
if (_token == address(OHM)) {
require(permissions[STATUS.OHMDEBTOR][msg.sender], notApproved);
value = _amount;
} else {
require(permissions[STATUS.RESERVEDEBTOR][msg.sender], notApproved);
require(permissions[STATUS.RESERVETOKEN][_token], notAccepted);
value = tokenValue(_token, _amount);
}
require(value != 0, invalidToken);
sOHM.changeDebt(value, msg.sender, true);
require(sOHM.debtBalances(msg.sender) <= debtLimit[msg.sender], "Treasury: exceeds limit");
totalDebt = totalDebt.add(value);
if (_token == address(OHM)) {
OHM.mint(msg.sender, value);
ohmDebt = ohmDebt.add(value);
} else {
totalReserves = totalReserves.sub(value);
IERC20(_token).safeTransfer(msg.sender, _amount);
}
emit CreateDebt(msg.sender, _token, _amount, value);
}
/**
* @notice allow approved address to repay borrowed reserves with reserves
* @param _amount uint256
* @param _token address
*/
function repayDebtWithReserve(uint256 _amount, address _token) external override {
require(permissions[STATUS.RESERVEDEBTOR][msg.sender], notApproved);
require(permissions[STATUS.RESERVETOKEN][_token], notAccepted);
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
uint256 value = tokenValue(_token, _amount);
sOHM.changeDebt(value, msg.sender, false);
totalDebt = totalDebt.sub(value);
totalReserves = totalReserves.add(value);
emit RepayDebt(msg.sender, _token, _amount, value);
}
/**
* @notice allow approved address to repay borrowed reserves with OHM
* @param _amount uint256
*/
function repayDebtWithOHM(uint256 _amount) external {
require(permissions[STATUS.RESERVEDEBTOR][msg.sender] || permissions[STATUS.OHMDEBTOR][msg.sender], notApproved);
OHM.burnFrom(msg.sender, _amount);
sOHM.changeDebt(_amount, msg.sender, false);
totalDebt = totalDebt.sub(_amount);
ohmDebt = ohmDebt.sub(_amount);
emit RepayDebt(msg.sender, address(OHM), _amount, _amount);
}
/* ========== MANAGERIAL FUNCTIONS ========== */
/**
* @notice takes inventory of all tracked assets
* @notice always consolidate to recognized reserves before audit
*/
function auditReserves() external onlyGovernor {
uint256 reserves;
address[] memory reserveToken = registry[STATUS.RESERVETOKEN];
for (uint256 i = 0; i < reserveToken.length; i++) {
if (permissions[STATUS.RESERVETOKEN][reserveToken[i]]) {
reserves = reserves.add(tokenValue(reserveToken[i], IERC20(reserveToken[i]).balanceOf(address(this))));
}
}
address[] memory liquidityToken = registry[STATUS.LIQUIDITYTOKEN];
for (uint256 i = 0; i < liquidityToken.length; i++) {
if (permissions[STATUS.LIQUIDITYTOKEN][liquidityToken[i]]) {
reserves = reserves.add(tokenValue(liquidityToken[i], IERC20(liquidityToken[i]).balanceOf(address(this))));
}
}
totalReserves = reserves;
emit ReservesAudited(reserves);
}
/**
* @notice set max debt for address
* @param _address address
* @param _limit uint256
*/
function setDebtLimit(address _address, uint256 _limit) external onlyGovernor {
debtLimit[_address] = _limit;
}
/**
* @notice enable permission from queue
* @param _status STATUS
* @param _address address
* @param _calculator address
*/
function enable(
STATUS _status,
address _address,
address _calculator
) external onlyGovernor {
require(timelockEnabled == false, "Use queueTimelock");
if (_status == STATUS.SOHM) {
sOHM = IsOHM(_address);
} else {
permissions[_status][_address] = true;
if (_status == STATUS.LIQUIDITYTOKEN) {
bondCalculator[_address] = _calculator;
}
(bool registered, ) = indexInRegistry(_address, _status);
if (!registered) {
registry[_status].push(_address);
if (_status == STATUS.LIQUIDITYTOKEN || _status == STATUS.RESERVETOKEN) {
(bool reg, uint256 index) = indexInRegistry(_address, _status);
if (reg) {
delete registry[_status][index];
}
}
}
}
emit Permissioned(_address, _status, true);
}
/**
* @notice disable permission from address
* @param _status STATUS
* @param _toDisable address
*/
function disable(STATUS _status, address _toDisable) external {
require(msg.sender == authority.governor() || msg.sender == authority.guardian(), "Only governor or guardian");
permissions[_status][_toDisable] = false;
emit Permissioned(_toDisable, _status, false);
}
/**
* @notice check if registry contains address
* @return (bool, uint256)
*/
function indexInRegistry(address _address, STATUS _status) public view returns (bool, uint256) {
address[] memory entries = registry[_status];
for (uint256 i = 0; i < entries.length; i++) {
if (_address == entries[i]) {
return (true, i);
}
}
return (false, 0);
}
/* ========== TIMELOCKED FUNCTIONS ========== */
// functions are used prior to enabling on-chain governance
/**
* @notice queue address to receive permission
* @param _status STATUS
* @param _address address
* @param _calculator address
*/
function queueTimelock(
STATUS _status,
address _address,
address _calculator
) external onlyGovernor {
require(_address != address(0));
require(timelockEnabled == true, "Timelock is disabled, use enable");
uint256 timelock = block.number.add(blocksNeededForQueue);
if (_status == STATUS.RESERVEMANAGER || _status == STATUS.LIQUIDITYMANAGER) {
timelock = block.number.add(blocksNeededForQueue.mul(2));
}
permissionQueue.push(
Queue({managing: _status, toPermit: _address, calculator: _calculator, timelockEnd: timelock, nullify: false, executed: false})
);
emit PermissionQueued(_status, _address);
}
/**
* @notice enable queued permission
* @param _index uint256
*/
function execute(uint256 _index) external {
require(timelockEnabled == true, "Timelock is disabled, use enable");
Queue memory info = permissionQueue[_index];
require(!info.nullify, "Action has been nullified");
require(!info.executed, "Action has already been executed");
require(block.number >= info.timelockEnd, "Timelock not complete");
if (info.managing == STATUS.SOHM) {
// 9
sOHM = IsOHM(info.toPermit);
} else {
permissions[info.managing][info.toPermit] = true;
if (info.managing == STATUS.LIQUIDITYTOKEN) {
bondCalculator[info.toPermit] = info.calculator;
}
(bool registered, ) = indexInRegistry(info.toPermit, info.managing);
if (!registered) {
registry[info.managing].push(info.toPermit);
if (info.managing == STATUS.LIQUIDITYTOKEN) {
(bool reg, uint256 index) = indexInRegistry(info.toPermit, STATUS.RESERVETOKEN);
if (reg) {
delete registry[STATUS.RESERVETOKEN][index];
}
} else if (info.managing == STATUS.RESERVETOKEN) {
(bool reg, uint256 index) = indexInRegistry(info.toPermit, STATUS.LIQUIDITYTOKEN);
if (reg) {
delete registry[STATUS.LIQUIDITYTOKEN][index];
}
}
}
}
permissionQueue[_index].executed = true;
emit Permissioned(info.toPermit, info.managing, true);
}
/**
* @notice cancel timelocked action
* @param _index uint256
*/
function nullify(uint256 _index) external onlyGovernor {
permissionQueue[_index].nullify = true;
}
/**
* @notice disables timelocked functions
*/
function disableTimelock() external onlyGovernor {
require(timelockEnabled == true, "timelock already disabled");
if (onChainGovernanceTimelock != 0 && onChainGovernanceTimelock <= block.number) {
timelockEnabled = false;
} else {
onChainGovernanceTimelock = block.number.add(blocksNeededForQueue.mul(7)); // 7-day timelock
}
}
/**
* @notice enables timelocks after initilization
*/
function initialize() external onlyGovernor {
require(initialized == false, "Already initialized");
timelockEnabled = true;
initialized = true;
}
/* ========== VIEW FUNCTIONS ========== */
/**
* @notice returns excess reserves not backing tokens
* @return uint
*/
function excessReserves() public view override returns (uint256) {
return totalReserves.sub(OHM.totalSupply().sub(totalDebt));
}
/**
* @notice returns OHM valuation of asset
* @param _token address
* @param _amount uint256
* @return value_ uint256
*/
function tokenValue(address _token, uint256 _amount) public view override returns (uint256 value_) {
value_ = _amount.mul(10**IERC20Metadata(address(OHM)).decimals()).div(10**IERC20Metadata(_token).decimals());
if (permissions[STATUS.LIQUIDITYTOKEN][_token]) {
value_ = IBondingCalculator(bondCalculator[_token]).valuation(_token, _amount);
}
}
/**
* @notice returns supply metric that cannot be manipulated by debt
* @dev use this any time you need to query supply
* @return uint256
*/
function baseSupply() external view override returns (uint256) {
return OHM.totalSupply() - ohmDebt;
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"Treasury_flat.sol":"OlympusTreasury"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_ohm","internalType":"address"},{"type":"uint256","name":"_timelock","internalType":"uint256"},{"type":"address","name":"_authority","internalType":"address"}]},{"type":"event","name":"AuthorityUpdated","inputs":[{"type":"address","name":"authority","internalType":"contract IOlympusAuthority","indexed":true}],"anonymous":false},{"type":"event","name":"CreateDebt","inputs":[{"type":"address","name":"debtor","internalType":"address","indexed":true},{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Managed","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Minted","inputs":[{"type":"address","name":"caller","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"PermissionQueued","inputs":[{"type":"uint8","name":"status","internalType":"enum OlympusTreasury.STATUS","indexed":true},{"type":"address","name":"queued","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Permissioned","inputs":[{"type":"address","name":"addr","internalType":"address","indexed":false},{"type":"uint8","name":"status","internalType":"enum OlympusTreasury.STATUS","indexed":true},{"type":"bool","name":"result","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"RepayDebt","inputs":[{"type":"address","name":"debtor","internalType":"address","indexed":true},{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ReservesAudited","inputs":[{"type":"uint256","name":"totalReserves","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"Withdrawal","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IOHM"}],"name":"OHM","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"auditReserves","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IOlympusAuthority"}],"name":"authority","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"baseSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"blocksNeededForQueue","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"bondCalculator","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"debtLimit","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"send_","internalType":"uint256"}],"name":"deposit","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_profit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disable","inputs":[{"type":"uint8","name":"_status","internalType":"enum OlympusTreasury.STATUS"},{"type":"address","name":"_toDisable","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableTimelock","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enable","inputs":[{"type":"uint8","name":"_status","internalType":"enum OlympusTreasury.STATUS"},{"type":"address","name":"_address","internalType":"address"},{"type":"address","name":"_calculator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"excessReserves","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"execute","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"incurDebt","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"indexInRegistry","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"uint8","name":"_status","internalType":"enum OlympusTreasury.STATUS"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"initialized","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manage","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"nullify","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"ohmDebt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"onChainGovernanceTimelock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"managing","internalType":"enum OlympusTreasury.STATUS"},{"type":"address","name":"toPermit","internalType":"address"},{"type":"address","name":"calculator","internalType":"address"},{"type":"uint256","name":"timelockEnd","internalType":"uint256"},{"type":"bool","name":"nullify","internalType":"bool"},{"type":"bool","name":"executed","internalType":"bool"}],"name":"permissionQueue","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"permissions","inputs":[{"type":"uint8","name":"","internalType":"enum OlympusTreasury.STATUS"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"queueTimelock","inputs":[{"type":"uint8","name":"_status","internalType":"enum OlympusTreasury.STATUS"},{"type":"address","name":"_address","internalType":"address"},{"type":"address","name":"_calculator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"registry","inputs":[{"type":"uint8","name":"","internalType":"enum OlympusTreasury.STATUS"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"repayDebtWithOHM","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"repayDebtWithReserve","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IsOHM"}],"name":"sOHM","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAuthority","inputs":[{"type":"address","name":"_newAuthority","internalType":"contract IOlympusAuthority"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDebtLimit","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"uint256","name":"_limit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"timelockEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"value_","internalType":"uint256"}],"name":"tokenValue","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalDebt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalReserves","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"}]}]
Contract Creation Code
0x610100604052600c60c08190526b15539055551213d49256915160a21b60e090815262000030916000919062000255565b506040805180820190915260168082527f54726561737572793a206e6f742061636365707465640000000000000000000060209092019182526200007791600d9162000255565b506040805180820190915260168082527f54726561737572793a206e6f7420617070726f766564000000000000000000006020909201918252620000be91600e9162000255565b506040805180820190915260178082527f54726561737572793a20696e76616c696420746f6b656e00000000000000000060209092019182526200010591600f9162000255565b5060408051808201909152601f8082527f54726561737572793a20696e73756666696369656e742072657365727665730060209092019182526200014c9160109162000255565b503480156200015a57600080fd5b506040516200406638038062004066833981810160405260608110156200018057600080fd5b5080516020820151604092830151600180546001600160a01b0319166001600160a01b038316908117909155935192939192909182917f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a2506001600160a01b0383166200022d576040805162461bcd60e51b81526020600482015260116024820152705a65726f20616464726573733a204f484d60781b604482015290519081900360640190fd5b5060609190911b6001600160601b031916608052600b805461ffff1916905560a05262000301565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200028d5760008555620002d8565b82601f10620002a857805160ff1916838001178555620002d8565b82800160010185558215620002d8579182015b82811115620002d8578251825591602001919060010190620002bb565b50620002e6929150620002ea565b5090565b5b80821115620002e65760008155600101620002eb565b60805160601c60a051613cf86200036e6000398061158b52806115e3528061237f5280612a855250806108315280610be55280610d755280610e7e5280610ed352806112ab528061130a5280611c70528061250b52806127c4528061298b52806130b75250613cf86000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c80637d921af011610125578063b39df88e116100ad578063d796ffb81161007c578063d796ffb81461060a578063e4e33ef814610636578063f18217831461066d578063fc7b9c1814610699578063fe0d94c1146106a15761021b565b8063b39df88e146105c0578063bc157ac1146105c8578063bf7e214f146105fa578063d07f390f146106025761021b565b806393988b53116100f457806393988b53146105145780639edd8d431461055e578063a44b82871461058a578063a6c41fec146105b0578063b320f6a9146105b85761021b565b80637d921af0146104f45780638129fc1c146104fc578063860f5048146105045780638f840ddd1461050c5761021b565b80632b7ce500116101a8578063503edcf011610177578063503edcf0146103e5578063529918311461045c5780635619004b1461048b57806371a45c95146104b15780637a9e5e4b146104ce5761021b565b80632b7ce5001461037a578063330dd34514610382578063341f9688146103b157806340c10f19146103b95761021b565b806312422d23116101ef57806312422d23146102b157806315079925146102dd578063158ef93e146103015780631af4da701461031d5780631d6d5f05146103435761021b565b8062f714ce146102205780630b0eee301461024e5780630c3513a81461027a5780630f70431f14610294575b600080fd5b61024c6004803603604081101561023657600080fd5b50803590602001356001600160a01b03166106be565b005b61024c6004803603604081101561026457600080fd5b506001600160a01b03813516906020013561092b565b610282610bd8565b60408051918252519081900360200190f35b61024c600480360360208110156102aa57600080fd5b5035610c7c565b61024c600480360360408110156102c757600080fd5b50803590602001356001600160a01b0316610ecf565b6102e56113f0565b604080516001600160a01b039092168252519081900360200190f35b6103096113ff565b604080519115158252519081900360200190f35b6102e56004803603602081101561033357600080fd5b50356001600160a01b031661140d565b61024c6004803603606081101561035957600080fd5b5060ff813516906001600160a01b0360208201358116916040013516611428565b61024c611763565b6103096004803603604081101561039857600080fd5b50803560ff1690602001356001600160a01b0316611b3d565b610282611b5d565b61024c600480360360408110156103cf57600080fd5b506001600160a01b038135169060200135611b63565b610402600480360360208110156103fb57600080fd5b5035611d41565b6040518087600a81111561041257fe5b8152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183151581526020018215158152602001965050505050505060405180910390f35b61024c6004803603604081101561047257600080fd5b50803560ff1690602001356001600160a01b0316611d98565b610282600480360360208110156104a157600080fd5b50356001600160a01b0316611fa0565b61024c600480360360208110156104c757600080fd5b5035611fb2565b61024c600480360360208110156104e457600080fd5b50356001600160a01b03166120d2565b61024c612208565b61024c6123ab565b610282612504565b610282612594565b6105436004803603604081101561052a57600080fd5b5080356001600160a01b0316906020013560ff1661259a565b60408051921515835260208301919091528051918290030190f35b61024c6004803603604081101561057457600080fd5b506001600160a01b038135169060200135612682565b6102e5600480360360408110156105a057600080fd5b5060ff813516906020013561278a565b6102e56127c2565b6103096127e6565b6102826127ef565b610282600480360360608110156105de57600080fd5b508035906001600160a01b0360208201351690604001356127f5565b6102e5612a74565b610282612a83565b61024c6004803603604081101561062057600080fd5b50803590602001356001600160a01b0316612aa7565b61024c6004803603606081101561064c57600080fd5b5060ff813516906001600160a01b0360208201358116916040013516612cd2565b6102826004803603604081101561068357600080fd5b506001600160a01b038135169060200135613026565b610282613204565b61024c600480360360208110156106b757600080fd5b503561320a565b6001600160a01b0381166000908152600080516020613ca38339815191526020526040902054600d9060ff166107875760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b820191906000526020600020905b81548152906001019060200180831161075b57829003601f168201915b50509250505060405180910390fd5b503360009081527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056020526040902054600e9060ff166108205760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600061082d8284613026565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379cc679033836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156108a657600080fd5b505af11580156108ba573d6000803e3d6000fd5b50506007546108cc9250905082613713565b6007556108e36001600160a01b038316338561375c565b604080518481526020810183905281516001600160a01b038516927fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb928290030190a2505050565b6001600160a01b0382166000908152600080516020613c62833981519152602052604090205460ff16156109f7573360009081527fc59312466997bb42aaaf719ece141047820e6b34531e1670dc1852a453648f0f6020526040902054600e9060ff166109f15760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50610a91565b3360009081527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa06020526040902054600e9060ff16610a8f5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b505b6001600160a01b0382166000908152600080516020613ca3833981519152602052604090205460ff1680610aea57506001600160a01b0382166000908152600080516020613c62833981519152602052604090205460ff165b15610b81576000610afb8383613026565b9050610b05610bd8565b811115601090610b6e5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600754610b7c9082613713565b600755505b610b956001600160a01b038316338361375c565b6040805182815290516001600160a01b038416917fb4460e34f1e91c4fa28eb7fac4cbd88cf530ef54a67e1978cd5edd9f77033ead919081900360200190a25050565b6000610c77610c6e6008547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c3c57600080fd5b505afa158015610c50573d6000803e3d6000fd5b505050506040513d6020811015610c6657600080fd5b505190613713565b60075490613713565b905090565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e551602052604090205460ff1680610ce757503360009081527f5c6b02db8b672415ffad906d7ccee10bd53dbad7d0b29e2bc0e50c93d5f31093602052604090205460ff165b600e90610d4d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506040805163079cc67960e41b81523360048201526024810183905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916379cc679091604480830192600092919082900301818387803b158015610dbc57600080fd5b505af1158015610dd0573d6000803e3d6000fd5b50506002546040805163ae5c6cd360e01b81526004810186905233602482015260006044820181905291516001600160a01b03909316945063ae5c6cd393506064808201939182900301818387803b158015610e2b57600080fd5b505af1158015610e3f573d6000803e3d6000fd5b5050600854610e519250905082613713565b600855600954610e619082613713565b600955604080518281526020810183905281516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a350565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415610fac573360009081527f5c6b02db8b672415ffad906d7ccee10bd53dbad7d0b29e2bc0e50c93d5f310936020526040902054600e9060ff16610fa35760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b508290506110e2565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5516020526040902054600e9060ff166110445760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b0382166000908152600080516020613ca38339815191526020526040902054600d9060ff166110d45760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506110df8284613026565b90505b600f816111485760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506002546040805163ae5c6cd360e01b8152600481018490523360248201526001604482015290516001600160a01b039092169163ae5c6cd39160648082019260009290919082900301818387803b1580156111a357600080fd5b505af11580156111b7573d6000803e3d6000fd5b50503360008181526006602090815260409182902054600254835163313bc71360e21b8152600481019590955292519095506001600160a01b03909216935063c4ef1c4c9260248082019391829003018186803b15801561121757600080fd5b505afa15801561122b573d6000803e3d6000fd5b505050506040513d602081101561124157600080fd5b50511115611296576040805162461bcd60e51b815260206004820152601760248201527f54726561737572793a2065786365656473206c696d6974000000000000000000604482015290519081900360640190fd5b6008546112a390826138b8565b6008819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561137f57604080516340c10f1960e01b81523360048201526024810183905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916340c10f1991604480830192600092919082900301818387803b15801561135157600080fd5b505af1158015611365573d6000803e3d6000fd5b505060095461137792509050826138b8565b6009556113a3565b60075461138c9082613713565b6007556113a36001600160a01b038316338561375c565b604080518481526020810183905281516001600160a01b0385169233927f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d6929081900390910190a3505050565b6002546001600160a01b031681565b600b54610100900460ff1681565b6005602052600090815260409020546001600160a01b031681565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561147657600080fd5b505afa15801561148a573d6000803e3d6000fd5b505050506040513d60208110156114a057600080fd5b50516000906001600160a01b031633146115135760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b03821661152757600080fd5b600b5460ff161515600114611583576040805162461bcd60e51b815260206004820181905260248201527f54696d656c6f636b2069732064697361626c65642c2075736520656e61626c65604482015290519081900360640190fd5b60006115af437f00000000000000000000000000000000000000000000000000000000000000006138b8565b9050600384600a8111156115bf57fe5b14806115d65750600684600a8111156115d457fe5b145b15611613576116106116097f00000000000000000000000000000000000000000000000000000000000000006002613912565b43906138b8565b90505b600a6040518060c0016040528086600a81111561162c57fe5b81526001600160a01b0380871660208084019190915290861660408301526060820185905260006080830181905260a090920182905283546001818101865594835291208251600490920201805492939092839160ff199091169083600a81111561169357fe5b021790555060208201518154610100600160a81b0319166101006001600160a01b03928316810291909117835560408401516001840180546001600160a01b03191691909316179091556060830151600283015560808301516003909201805460a09094015160ff199094169215159290921761ff0019169215150291909117905583600a81111561172157fe5b604080516001600160a01b038616815290517fc822ff41836a6dc998393c71843db8adcbbf01721f41b32389f6838ecb1ea9c89181900360200190a250505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b157600080fd5b505afa1580156117c5573d6000803e3d6000fd5b505050506040513d60208110156117db57600080fd5b50516000906001600160a01b0316331461184e5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b5060026000908152600360209081527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d80546040805182850281018501909152818152606093909291908301828280156118d157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118b3575b5050505050905060005b81518110156119f8576002600090815260046020528251600080516020613ca3833981519152919084908490811061190f57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156119f0576119ed6119e683838151811061194d57fe5b602002602001015184848151811061196157fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156119b557600080fd5b505afa1580156119c9573d6000803e3d6000fd5b505050506040513d60208110156119df57600080fd5b5051613026565b84906138b8565b92505b6001016118db565b506005600052600360209081527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b4659422508054604080518285028101850190915281815260609390929190830182828015611a7957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a5b575b5050505050905060005b8151811015611b07576005600090815260046020528251600080516020613c628339815191529190849084908110611ab757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615611aff57611afc611af583838151811061194d57fe5b85906138b8565b93505b600101611a83565b50600783905560405183907fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446690600090a2505050565b600460209081526000928352604080842090915290825290205460ff1681565b60095481565b3360009081527f2645749a946633740611cfc8178319f0958659d6922e4bf7e3a08b44789f53a46020526040902054600e9060ff16611bfb5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50611c04610bd8565b811115601090611c6d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ce557600080fd5b505af1158015611cf9573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f09181900360200190a35050565b600a8181548110611d5157600080fd5b6000918252602090912060049091020180546001820154600283015460039093015460ff80841695506001600160a01b036101009485900481169593169382821692041686565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611de657600080fd5b505afa158015611dfa573d6000803e3d6000fd5b505050506040513d6020811015611e1057600080fd5b50516001600160a01b0316331480611ea95750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7157600080fd5b505afa158015611e85573d6000803e3d6000fd5b505050506040513d6020811015611e9b57600080fd5b50516001600160a01b031633145b611efa576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f72206f7220677561726469616e00000000000000604482015290519081900360640190fd5b60006004600084600a811115611f0c57fe5b600a811115611f1757fe5b8152602080820192909252604090810160009081206001600160a01b03861682529092529020805460ff191691151591909117905581600a811115611f5857fe5b604080516001600160a01b03841681526000602082015281517f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e1713929181900390910190a25050565b60066020526000908152604090205481565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561200057600080fd5b505afa158015612014573d6000803e3d6000fd5b505050506040513d602081101561202a57600080fd5b50516000906001600160a01b0316331461209d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600a82815481106120ad57fe5b60009182526020909120600490910201600301805460ff191691151591909117905550565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561212057600080fd5b505afa158015612134573d6000803e3d6000fd5b505050506040513d602081101561214a57600080fd5b50516000906001600160a01b031633146121bd5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600180546001600160a01b0319166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561225657600080fd5b505afa15801561226a573d6000803e3d6000fd5b505050506040513d602081101561228057600080fd5b50516000906001600160a01b031633146122f35760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b5460ff161515600114612350576040805162461bcd60e51b815260206004820152601960248201527f74696d656c6f636b20616c72656164792064697361626c656400000000000000604482015290519081900360640190fd5b600c5415801590612363575043600c5411155b1561237757600b805460ff191690556123a9565b6123a56116097f00000000000000000000000000000000000000000000000000000000000000006007613912565b600c555b565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156123f957600080fd5b505afa15801561240d573d6000803e3d6000fd5b505050506040513d602081101561242357600080fd5b50516000906001600160a01b031633146124965760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b54610100900460ff16156124ea576040805162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b600b805461ff001960ff1990911660011716610100179055565b60006009547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561256257600080fd5b505afa158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b505103905090565b60075481565b60008060606003600085600a8111156125af57fe5b600a8111156125ba57fe5b815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561261c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116125fe575b5050505050905060005b81518110156126715781818151811061263b57fe5b60200260200101516001600160a01b0316866001600160a01b031614156126695760019350915061267b9050565b600101612626565b5060008092509250505b9250929050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156126d057600080fd5b505afa1580156126e4573d6000803e3d6000fd5b505050506040513d60208110156126fa57600080fd5b50516000906001600160a01b0316331461276d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b03909116600090815260066020526040902055565b600360205281600052604060002081815481106127a657600080fd5b6000918252602090912001546001600160a01b03169150829050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b5460ff1681565b600c5481565b6001600160a01b0382166000908152600080516020613ca3833981519152602052604081205460ff16156128c15760046000805b600a81111561283457fe5b815260208082019290925260409081016000908120338252909252902054600e9060ff166128bb5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b5061295a565b6001600160a01b0383166000908152600080516020613c62833981519152602052604090205460ff16156128f9576004600081612829565b60405162461bcd60e51b8152602060048201908152600f8054600260001961010060018416150201909116046024840181905290928291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b61296f6001600160a01b03841633308761396b565b600061297b8486613026565b90506129878184613713565b91507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1933846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612a0057600080fd5b505af1158015612a14573d6000803e3d6000fd5b5050600754612a2692509050826138b8565b600755604080518681526020810183905281516001600160a01b038716927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15928290030190a2509392505050565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5516020526040902054600e9060ff16612b3f5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b0381166000908152600080516020613ca38339815191526020526040902054600d9060ff16612bcf5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50612be56001600160a01b03821633308561396b565b6000612bf18284613026565b6002546040805163ae5c6cd360e01b81526004810184905233602482015260006044820181905291519394506001600160a01b039092169263ae5c6cd392606480820193929182900301818387803b158015612c4c57600080fd5b505af1158015612c60573d6000803e3d6000fd5b5050600854612c729250905082613713565b600855600754612c8290826138b8565b600755604080518481526020810183905281516001600160a01b0385169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a3505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612d2057600080fd5b505afa158015612d34573d6000803e3d6000fd5b505050506040513d6020811015612d4a57600080fd5b50516000906001600160a01b03163314612dbd5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b5460ff1615612e0a576040805162461bcd60e51b815260206004820152601160248201527055736520717565756554696d656c6f636b60781b604482015290519081900360640190fd5b600983600a811115612e1857fe5b1415612e3e57600280546001600160a01b0319166001600160a01b038416179055612fd1565b60016004600085600a811115612e5057fe5b600a811115612e5b57fe5b8152602080820192909252604090810160009081206001600160a01b03871682529092529020805460ff1916911515919091179055600583600a811115612e9e57fe5b1415612ed3576001600160a01b03828116600090815260056020526040902080546001600160a01b0319169183169190911790555b6000612edf838561259a565b50905080612fcf576003600085600a811115612ef757fe5b600a811115612f0257fe5b8152602080820192909252604001600090812080546001810182559082529190200180546001600160a01b0319166001600160a01b038516179055600584600a811115612f4b57fe5b1480612f625750600284600a811115612f6057fe5b145b15612fcf57600080612f74858761259a565b915091508115612fcc576003600087600a811115612f8e57fe5b600a811115612f9957fe5b81526020019081526020016000208181548110612fb257fe5b600091825260209091200180546001600160a01b03191690555b50505b505b82600a811115612fdd57fe5b604080516001600160a01b03851681526001602082015281517f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e1713929181900390910190a2505050565b600061313d836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561306457600080fd5b505afa158015613078573d6000803e3d6000fd5b505050506040513d602081101561308e57600080fd5b50516040805163313ce56760e01b8152905160ff909216600a0a91613137916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163313ce56791600480820192602092909190829003018186803b1580156130fe57600080fd5b505afa158015613112573d6000803e3d6000fd5b505050506040513d602081101561312857600080fd5b5051859060ff16600a0a613912565b90613ad5565b6001600160a01b0384166000908152600080516020613c62833981519152602052604090205490915060ff16156131fe576001600160a01b03808416600081815260056020908152604091829020548251634249719f60e01b815260048101949094526024840187905291519190931692634249719f9260448082019391829003018186803b1580156131cf57600080fd5b505afa1580156131e3573d6000803e3d6000fd5b505050506040513d60208110156131f957600080fd5b505190505b92915050565b60085481565b600b5460ff161515600114613266576040805162461bcd60e51b815260206004820181905260248201527f54696d656c6f636b2069732064697361626c65642c2075736520656e61626c65604482015290519081900360640190fd5b61326e613c2a565b600a828154811061327b57fe5b600091825260209091206040805160c081019091526004909202018054829060ff16600a8111156132a857fe5b600a8111156132b357fe5b815281546001600160a01b03610100918290048116602084015260018401541660408301526002830154606083015260039092015460ff80821615156080808501919091529390910416151560a0909101528101519091501561335d576040805162461bcd60e51b815260206004820152601960248201527f416374696f6e20686173206265656e206e756c6c696669656400000000000000604482015290519081900360640190fd5b8060a00151156133b4576040805162461bcd60e51b815260206004820181905260248201527f416374696f6e2068617320616c7265616479206265656e206578656375746564604482015290519081900360640190fd5b8060600151431015613405576040805162461bcd60e51b815260206004820152601560248201527454696d656c6f636b206e6f7420636f6d706c65746560581b604482015290519081900360640190fd5b60098151600a81111561341457fe5b1415613443576020810151600280546001600160a01b0319166001600160a01b0390921691909117905561367b565b6001600460008360000151600a81111561345957fe5b600a81111561346457fe5b815260208082019290925260409081016000908120858401516001600160a01b031682529092529020805460ff191691151591909117905560058151600a8111156134ab57fe5b14156134ec576040818101516020808401516001600160a01b039081166000908152600590925292902080546001600160a01b031916929091169190911790555b60006135008260200151836000015161259a565b5090508061367957600360008360000151600a81111561351c57fe5b600a81111561352757fe5b81526020808201929092526040016000908120848301518154600181018355918352929091200180546001600160a01b0319166001600160a01b0390921691909117905560058251600a81111561357a57fe5b14156135f4576000806135928460200151600261259a565b9150915081156135ed57600260005260036020527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d8054829081106135d357fe5b600091825260209091200180546001600160a01b03191690555b5050613679565b60028251600a81111561360357fe5b14156136795760008061361b8460200151600561259a565b91509150811561367657600560005260036020527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b46594225080548290811061365c57fe5b600091825260209091200180546001600160a01b03191690555b50505b505b6001600a838154811061368a57fe5b6000918252602090912060036004909202010180549115156101000261ff00199092169190911790558051600a8111156136c057fe5b7f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e17138260200151600160405180836001600160a01b0316815260200182151581526020019250505060405180910390a25050565b600061375583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b17565b9392505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106137d95780518252601f1990920191602091820191016137ba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461383b576040519150601f19603f3d011682016040523d82523d6000602084013e613840565b606091505b509150915081801561386e57508051158061386e575080806020019051602081101561386b57600080fd5b50515b6138b1576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b600082820183811015613755576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613921575060006131fe565b8282028284828161392e57fe5b04146137555760405162461bcd60e51b8152600401808060200182810382526021815260200180613c826021913960400191505060405180910390fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106139f05780518252601f1990920191602091820191016139d1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a52576040519150601f19603f3d011682016040523d82523d6000602084013e613a57565b606091505b5091509150818015613a85575080511580613a855750808060200190516020811015613a8257600080fd5b50515b613acd576040805162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015290519081900360640190fd5b505050505050565b600061375583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bae565b60008184841115613ba65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b6b578181015183820152602001613b53565b50505050905090810190601f168015613b985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613bfd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b6b578181015183820152602001613b53565b506000838581613c0957fe5b049050838581613c1557fe5b06818502018514613c2257fe5b949350505050565b6040805160c08101909152806000815260006020820181905260408201819052606082018190526080820181905260a0909101529056fe04cde762ef08b6b6c5ded8e8c4c0b3f4e5c9ad7342c88fcc93681b4588b73f05536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7791da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7a264697066735822122066aa62093962779da8f389172be79978b48d4f17837919e8f4a03dd1d4274cc664736f6c6343000705003300000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d500000000000000000000000000000000000000000000000000000000000019c80000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061021b5760003560e01c80637d921af011610125578063b39df88e116100ad578063d796ffb81161007c578063d796ffb81461060a578063e4e33ef814610636578063f18217831461066d578063fc7b9c1814610699578063fe0d94c1146106a15761021b565b8063b39df88e146105c0578063bc157ac1146105c8578063bf7e214f146105fa578063d07f390f146106025761021b565b806393988b53116100f457806393988b53146105145780639edd8d431461055e578063a44b82871461058a578063a6c41fec146105b0578063b320f6a9146105b85761021b565b80637d921af0146104f45780638129fc1c146104fc578063860f5048146105045780638f840ddd1461050c5761021b565b80632b7ce500116101a8578063503edcf011610177578063503edcf0146103e5578063529918311461045c5780635619004b1461048b57806371a45c95146104b15780637a9e5e4b146104ce5761021b565b80632b7ce5001461037a578063330dd34514610382578063341f9688146103b157806340c10f19146103b95761021b565b806312422d23116101ef57806312422d23146102b157806315079925146102dd578063158ef93e146103015780631af4da701461031d5780631d6d5f05146103435761021b565b8062f714ce146102205780630b0eee301461024e5780630c3513a81461027a5780630f70431f14610294575b600080fd5b61024c6004803603604081101561023657600080fd5b50803590602001356001600160a01b03166106be565b005b61024c6004803603604081101561026457600080fd5b506001600160a01b03813516906020013561092b565b610282610bd8565b60408051918252519081900360200190f35b61024c600480360360208110156102aa57600080fd5b5035610c7c565b61024c600480360360408110156102c757600080fd5b50803590602001356001600160a01b0316610ecf565b6102e56113f0565b604080516001600160a01b039092168252519081900360200190f35b6103096113ff565b604080519115158252519081900360200190f35b6102e56004803603602081101561033357600080fd5b50356001600160a01b031661140d565b61024c6004803603606081101561035957600080fd5b5060ff813516906001600160a01b0360208201358116916040013516611428565b61024c611763565b6103096004803603604081101561039857600080fd5b50803560ff1690602001356001600160a01b0316611b3d565b610282611b5d565b61024c600480360360408110156103cf57600080fd5b506001600160a01b038135169060200135611b63565b610402600480360360208110156103fb57600080fd5b5035611d41565b6040518087600a81111561041257fe5b8152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183151581526020018215158152602001965050505050505060405180910390f35b61024c6004803603604081101561047257600080fd5b50803560ff1690602001356001600160a01b0316611d98565b610282600480360360208110156104a157600080fd5b50356001600160a01b0316611fa0565b61024c600480360360208110156104c757600080fd5b5035611fb2565b61024c600480360360208110156104e457600080fd5b50356001600160a01b03166120d2565b61024c612208565b61024c6123ab565b610282612504565b610282612594565b6105436004803603604081101561052a57600080fd5b5080356001600160a01b0316906020013560ff1661259a565b60408051921515835260208301919091528051918290030190f35b61024c6004803603604081101561057457600080fd5b506001600160a01b038135169060200135612682565b6102e5600480360360408110156105a057600080fd5b5060ff813516906020013561278a565b6102e56127c2565b6103096127e6565b6102826127ef565b610282600480360360608110156105de57600080fd5b508035906001600160a01b0360208201351690604001356127f5565b6102e5612a74565b610282612a83565b61024c6004803603604081101561062057600080fd5b50803590602001356001600160a01b0316612aa7565b61024c6004803603606081101561064c57600080fd5b5060ff813516906001600160a01b0360208201358116916040013516612cd2565b6102826004803603604081101561068357600080fd5b506001600160a01b038135169060200135613026565b610282613204565b61024c600480360360208110156106b757600080fd5b503561320a565b6001600160a01b0381166000908152600080516020613ca38339815191526020526040902054600d9060ff166107875760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b820191906000526020600020905b81548152906001019060200180831161075b57829003601f168201915b50509250505060405180910390fd5b503360009081527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056020526040902054600e9060ff166108205760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600061082d8284613026565b90507f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166379cc679033836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156108a657600080fd5b505af11580156108ba573d6000803e3d6000fd5b50506007546108cc9250905082613713565b6007556108e36001600160a01b038316338561375c565b604080518481526020810183905281516001600160a01b038516927fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb928290030190a2505050565b6001600160a01b0382166000908152600080516020613c62833981519152602052604090205460ff16156109f7573360009081527fc59312466997bb42aaaf719ece141047820e6b34531e1670dc1852a453648f0f6020526040902054600e9060ff166109f15760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50610a91565b3360009081527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa06020526040902054600e9060ff16610a8f5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b505b6001600160a01b0382166000908152600080516020613ca3833981519152602052604090205460ff1680610aea57506001600160a01b0382166000908152600080516020613c62833981519152602052604090205460ff165b15610b81576000610afb8383613026565b9050610b05610bd8565b811115601090610b6e5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600754610b7c9082613713565b600755505b610b956001600160a01b038316338361375c565b6040805182815290516001600160a01b038416917fb4460e34f1e91c4fa28eb7fac4cbd88cf530ef54a67e1978cd5edd9f77033ead919081900360200190a25050565b6000610c77610c6e6008547f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c3c57600080fd5b505afa158015610c50573d6000803e3d6000fd5b505050506040513d6020811015610c6657600080fd5b505190613713565b60075490613713565b905090565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e551602052604090205460ff1680610ce757503360009081527f5c6b02db8b672415ffad906d7ccee10bd53dbad7d0b29e2bc0e50c93d5f31093602052604090205460ff165b600e90610d4d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506040805163079cc67960e41b81523360048201526024810183905290516001600160a01b037f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d516916379cc679091604480830192600092919082900301818387803b158015610dbc57600080fd5b505af1158015610dd0573d6000803e3d6000fd5b50506002546040805163ae5c6cd360e01b81526004810186905233602482015260006044820181905291516001600160a01b03909316945063ae5c6cd393506064808201939182900301818387803b158015610e2b57600080fd5b505af1158015610e3f573d6000803e3d6000fd5b5050600854610e519250905082613713565b600855600954610e619082613713565b600955604080518281526020810183905281516001600160a01b037f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a350565b60007f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b0316826001600160a01b03161415610fac573360009081527f5c6b02db8b672415ffad906d7ccee10bd53dbad7d0b29e2bc0e50c93d5f310936020526040902054600e9060ff16610fa35760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b508290506110e2565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5516020526040902054600e9060ff166110445760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b0382166000908152600080516020613ca38339815191526020526040902054600d9060ff166110d45760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506110df8284613026565b90505b600f816111485760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506002546040805163ae5c6cd360e01b8152600481018490523360248201526001604482015290516001600160a01b039092169163ae5c6cd39160648082019260009290919082900301818387803b1580156111a357600080fd5b505af11580156111b7573d6000803e3d6000fd5b50503360008181526006602090815260409182902054600254835163313bc71360e21b8152600481019590955292519095506001600160a01b03909216935063c4ef1c4c9260248082019391829003018186803b15801561121757600080fd5b505afa15801561122b573d6000803e3d6000fd5b505050506040513d602081101561124157600080fd5b50511115611296576040805162461bcd60e51b815260206004820152601760248201527f54726561737572793a2065786365656473206c696d6974000000000000000000604482015290519081900360640190fd5b6008546112a390826138b8565b6008819055507f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b0316826001600160a01b0316141561137f57604080516340c10f1960e01b81523360048201526024810183905290516001600160a01b037f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d516916340c10f1991604480830192600092919082900301818387803b15801561135157600080fd5b505af1158015611365573d6000803e3d6000fd5b505060095461137792509050826138b8565b6009556113a3565b60075461138c9082613713565b6007556113a36001600160a01b038316338561375c565b604080518481526020810183905281516001600160a01b0385169233927f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d6929081900390910190a3505050565b6002546001600160a01b031681565b600b54610100900460ff1681565b6005602052600090815260409020546001600160a01b031681565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561147657600080fd5b505afa15801561148a573d6000803e3d6000fd5b505050506040513d60208110156114a057600080fd5b50516000906001600160a01b031633146115135760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b03821661152757600080fd5b600b5460ff161515600114611583576040805162461bcd60e51b815260206004820181905260248201527f54696d656c6f636b2069732064697361626c65642c2075736520656e61626c65604482015290519081900360640190fd5b60006115af437f00000000000000000000000000000000000000000000000000000000000019c86138b8565b9050600384600a8111156115bf57fe5b14806115d65750600684600a8111156115d457fe5b145b15611613576116106116097f00000000000000000000000000000000000000000000000000000000000019c86002613912565b43906138b8565b90505b600a6040518060c0016040528086600a81111561162c57fe5b81526001600160a01b0380871660208084019190915290861660408301526060820185905260006080830181905260a090920182905283546001818101865594835291208251600490920201805492939092839160ff199091169083600a81111561169357fe5b021790555060208201518154610100600160a81b0319166101006001600160a01b03928316810291909117835560408401516001840180546001600160a01b03191691909316179091556060830151600283015560808301516003909201805460a09094015160ff199094169215159290921761ff0019169215150291909117905583600a81111561172157fe5b604080516001600160a01b038616815290517fc822ff41836a6dc998393c71843db8adcbbf01721f41b32389f6838ecb1ea9c89181900360200190a250505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b157600080fd5b505afa1580156117c5573d6000803e3d6000fd5b505050506040513d60208110156117db57600080fd5b50516000906001600160a01b0316331461184e5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b5060026000908152600360209081527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d80546040805182850281018501909152818152606093909291908301828280156118d157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118b3575b5050505050905060005b81518110156119f8576002600090815260046020528251600080516020613ca3833981519152919084908490811061190f57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156119f0576119ed6119e683838151811061194d57fe5b602002602001015184848151811061196157fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156119b557600080fd5b505afa1580156119c9573d6000803e3d6000fd5b505050506040513d60208110156119df57600080fd5b5051613026565b84906138b8565b92505b6001016118db565b506005600052600360209081527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b4659422508054604080518285028101850190915281815260609390929190830182828015611a7957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a5b575b5050505050905060005b8151811015611b07576005600090815260046020528251600080516020613c628339815191529190849084908110611ab757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615611aff57611afc611af583838151811061194d57fe5b85906138b8565b93505b600101611a83565b50600783905560405183907fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446690600090a2505050565b600460209081526000928352604080842090915290825290205460ff1681565b60095481565b3360009081527f2645749a946633740611cfc8178319f0958659d6922e4bf7e3a08b44789f53a46020526040902054600e9060ff16611bfb5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50611c04610bd8565b811115601090611c6d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b507f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ce557600080fd5b505af1158015611cf9573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f09181900360200190a35050565b600a8181548110611d5157600080fd5b6000918252602090912060049091020180546001820154600283015460039093015460ff80841695506001600160a01b036101009485900481169593169382821692041686565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611de657600080fd5b505afa158015611dfa573d6000803e3d6000fd5b505050506040513d6020811015611e1057600080fd5b50516001600160a01b0316331480611ea95750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7157600080fd5b505afa158015611e85573d6000803e3d6000fd5b505050506040513d6020811015611e9b57600080fd5b50516001600160a01b031633145b611efa576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f72206f7220677561726469616e00000000000000604482015290519081900360640190fd5b60006004600084600a811115611f0c57fe5b600a811115611f1757fe5b8152602080820192909252604090810160009081206001600160a01b03861682529092529020805460ff191691151591909117905581600a811115611f5857fe5b604080516001600160a01b03841681526000602082015281517f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e1713929181900390910190a25050565b60066020526000908152604090205481565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561200057600080fd5b505afa158015612014573d6000803e3d6000fd5b505050506040513d602081101561202a57600080fd5b50516000906001600160a01b0316331461209d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600a82815481106120ad57fe5b60009182526020909120600490910201600301805460ff191691151591909117905550565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561212057600080fd5b505afa158015612134573d6000803e3d6000fd5b505050506040513d602081101561214a57600080fd5b50516000906001600160a01b031633146121bd5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600180546001600160a01b0319166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561225657600080fd5b505afa15801561226a573d6000803e3d6000fd5b505050506040513d602081101561228057600080fd5b50516000906001600160a01b031633146122f35760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b5460ff161515600114612350576040805162461bcd60e51b815260206004820152601960248201527f74696d656c6f636b20616c72656164792064697361626c656400000000000000604482015290519081900360640190fd5b600c5415801590612363575043600c5411155b1561237757600b805460ff191690556123a9565b6123a56116097f00000000000000000000000000000000000000000000000000000000000019c86007613912565b600c555b565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156123f957600080fd5b505afa15801561240d573d6000803e3d6000fd5b505050506040513d602081101561242357600080fd5b50516000906001600160a01b031633146124965760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b54610100900460ff16156124ea576040805162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b600b805461ff001960ff1990911660011716610100179055565b60006009547f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561256257600080fd5b505afa158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b505103905090565b60075481565b60008060606003600085600a8111156125af57fe5b600a8111156125ba57fe5b815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561261c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116125fe575b5050505050905060005b81518110156126715781818151811061263b57fe5b60200260200101516001600160a01b0316866001600160a01b031614156126695760019350915061267b9050565b600101612626565b5060008092509250505b9250929050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156126d057600080fd5b505afa1580156126e4573d6000803e3d6000fd5b505050506040513d60208110156126fa57600080fd5b50516000906001600160a01b0316331461276d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b03909116600090815260066020526040902055565b600360205281600052604060002081815481106127a657600080fd5b6000918252602090912001546001600160a01b03169150829050565b7f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d581565b600b5460ff1681565b600c5481565b6001600160a01b0382166000908152600080516020613ca3833981519152602052604081205460ff16156128c15760046000805b600a81111561283457fe5b815260208082019290925260409081016000908120338252909252902054600e9060ff166128bb5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b5061295a565b6001600160a01b0383166000908152600080516020613c62833981519152602052604090205460ff16156128f9576004600081612829565b60405162461bcd60e51b8152602060048201908152600f8054600260001961010060018416150201909116046024840181905290928291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b61296f6001600160a01b03841633308761396b565b600061297b8486613026565b90506129878184613713565b91507f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166340c10f1933846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612a0057600080fd5b505af1158015612a14573d6000803e3d6000fd5b5050600754612a2692509050826138b8565b600755604080518681526020810183905281516001600160a01b038716927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15928290030190a2509392505050565b6001546001600160a01b031681565b7f00000000000000000000000000000000000000000000000000000000000019c881565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5516020526040902054600e9060ff16612b3f5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b0381166000908152600080516020613ca38339815191526020526040902054600d9060ff16612bcf5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50612be56001600160a01b03821633308561396b565b6000612bf18284613026565b6002546040805163ae5c6cd360e01b81526004810184905233602482015260006044820181905291519394506001600160a01b039092169263ae5c6cd392606480820193929182900301818387803b158015612c4c57600080fd5b505af1158015612c60573d6000803e3d6000fd5b5050600854612c729250905082613713565b600855600754612c8290826138b8565b600755604080518481526020810183905281516001600160a01b0385169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a3505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612d2057600080fd5b505afa158015612d34573d6000803e3d6000fd5b505050506040513d6020811015612d4a57600080fd5b50516000906001600160a01b03163314612dbd5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b5460ff1615612e0a576040805162461bcd60e51b815260206004820152601160248201527055736520717565756554696d656c6f636b60781b604482015290519081900360640190fd5b600983600a811115612e1857fe5b1415612e3e57600280546001600160a01b0319166001600160a01b038416179055612fd1565b60016004600085600a811115612e5057fe5b600a811115612e5b57fe5b8152602080820192909252604090810160009081206001600160a01b03871682529092529020805460ff1916911515919091179055600583600a811115612e9e57fe5b1415612ed3576001600160a01b03828116600090815260056020526040902080546001600160a01b0319169183169190911790555b6000612edf838561259a565b50905080612fcf576003600085600a811115612ef757fe5b600a811115612f0257fe5b8152602080820192909252604001600090812080546001810182559082529190200180546001600160a01b0319166001600160a01b038516179055600584600a811115612f4b57fe5b1480612f625750600284600a811115612f6057fe5b145b15612fcf57600080612f74858761259a565b915091508115612fcc576003600087600a811115612f8e57fe5b600a811115612f9957fe5b81526020019081526020016000208181548110612fb257fe5b600091825260209091200180546001600160a01b03191690555b50505b505b82600a811115612fdd57fe5b604080516001600160a01b03851681526001602082015281517f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e1713929181900390910190a2505050565b600061313d836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561306457600080fd5b505afa158015613078573d6000803e3d6000fd5b505050506040513d602081101561308e57600080fd5b50516040805163313ce56760e01b8152905160ff909216600a0a91613137916001600160a01b037f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5169163313ce56791600480820192602092909190829003018186803b1580156130fe57600080fd5b505afa158015613112573d6000803e3d6000fd5b505050506040513d602081101561312857600080fd5b5051859060ff16600a0a613912565b90613ad5565b6001600160a01b0384166000908152600080516020613c62833981519152602052604090205490915060ff16156131fe576001600160a01b03808416600081815260056020908152604091829020548251634249719f60e01b815260048101949094526024840187905291519190931692634249719f9260448082019391829003018186803b1580156131cf57600080fd5b505afa1580156131e3573d6000803e3d6000fd5b505050506040513d60208110156131f957600080fd5b505190505b92915050565b60085481565b600b5460ff161515600114613266576040805162461bcd60e51b815260206004820181905260248201527f54696d656c6f636b2069732064697361626c65642c2075736520656e61626c65604482015290519081900360640190fd5b61326e613c2a565b600a828154811061327b57fe5b600091825260209091206040805160c081019091526004909202018054829060ff16600a8111156132a857fe5b600a8111156132b357fe5b815281546001600160a01b03610100918290048116602084015260018401541660408301526002830154606083015260039092015460ff80821615156080808501919091529390910416151560a0909101528101519091501561335d576040805162461bcd60e51b815260206004820152601960248201527f416374696f6e20686173206265656e206e756c6c696669656400000000000000604482015290519081900360640190fd5b8060a00151156133b4576040805162461bcd60e51b815260206004820181905260248201527f416374696f6e2068617320616c7265616479206265656e206578656375746564604482015290519081900360640190fd5b8060600151431015613405576040805162461bcd60e51b815260206004820152601560248201527454696d656c6f636b206e6f7420636f6d706c65746560581b604482015290519081900360640190fd5b60098151600a81111561341457fe5b1415613443576020810151600280546001600160a01b0319166001600160a01b0390921691909117905561367b565b6001600460008360000151600a81111561345957fe5b600a81111561346457fe5b815260208082019290925260409081016000908120858401516001600160a01b031682529092529020805460ff191691151591909117905560058151600a8111156134ab57fe5b14156134ec576040818101516020808401516001600160a01b039081166000908152600590925292902080546001600160a01b031916929091169190911790555b60006135008260200151836000015161259a565b5090508061367957600360008360000151600a81111561351c57fe5b600a81111561352757fe5b81526020808201929092526040016000908120848301518154600181018355918352929091200180546001600160a01b0319166001600160a01b0390921691909117905560058251600a81111561357a57fe5b14156135f4576000806135928460200151600261259a565b9150915081156135ed57600260005260036020527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d8054829081106135d357fe5b600091825260209091200180546001600160a01b03191690555b5050613679565b60028251600a81111561360357fe5b14156136795760008061361b8460200151600561259a565b91509150811561367657600560005260036020527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b46594225080548290811061365c57fe5b600091825260209091200180546001600160a01b03191690555b50505b505b6001600a838154811061368a57fe5b6000918252602090912060036004909202010180549115156101000261ff00199092169190911790558051600a8111156136c057fe5b7f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e17138260200151600160405180836001600160a01b0316815260200182151581526020019250505060405180910390a25050565b600061375583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b17565b9392505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106137d95780518252601f1990920191602091820191016137ba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461383b576040519150601f19603f3d011682016040523d82523d6000602084013e613840565b606091505b509150915081801561386e57508051158061386e575080806020019051602081101561386b57600080fd5b50515b6138b1576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b600082820183811015613755576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613921575060006131fe565b8282028284828161392e57fe5b04146137555760405162461bcd60e51b8152600401808060200182810382526021815260200180613c826021913960400191505060405180910390fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106139f05780518252601f1990920191602091820191016139d1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a52576040519150601f19603f3d011682016040523d82523d6000602084013e613a57565b606091505b5091509150818015613a85575080511580613a855750808060200190516020811015613a8257600080fd5b50515b613acd576040805162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015290519081900360640190fd5b505050505050565b600061375583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bae565b60008184841115613ba65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b6b578181015183820152602001613b53565b50505050905090810190601f168015613b985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613bfd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b6b578181015183820152602001613b53565b506000838581613c0957fe5b049050838581613c1557fe5b06818502018514613c2257fe5b949350505050565b6040805160c08101909152806000815260006020820181905260408201819052606082018190526080820181905260a0909101529056fe04cde762ef08b6b6c5ded8e8c4c0b3f4e5c9ad7342c88fcc93681b4588b73f05536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7791da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7a264697066735822122066aa62093962779da8f389172be79978b48d4f17837919e8f4a03dd1d4274cc664736f6c63430007050033