More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 385 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 13251926 | 1040 days ago | IN | 0 ETH | 0.00491205 | ||||
Redeem | 13146127 | 1056 days ago | IN | 0 ETH | 0.00397618 | ||||
Redeem | 13128052 | 1059 days ago | IN | 0 ETH | 0.00388806 | ||||
Redeem | 13128020 | 1059 days ago | IN | 0 ETH | 0.00649607 | ||||
Redeem | 13122635 | 1060 days ago | IN | 0 ETH | 0.00463799 | ||||
Redeem | 13116037 | 1061 days ago | IN | 0 ETH | 0.00470435 | ||||
Redeem | 13114239 | 1061 days ago | IN | 0 ETH | 0.00315303 | ||||
Redeem | 13113720 | 1061 days ago | IN | 0 ETH | 0.00245622 | ||||
Redeem | 13111468 | 1061 days ago | IN | 0 ETH | 0.00470331 | ||||
Redeem | 13106799 | 1062 days ago | IN | 0 ETH | 0.00331147 | ||||
Redeem | 13105250 | 1062 days ago | IN | 0 ETH | 0.00266295 | ||||
Redeem | 13102794 | 1063 days ago | IN | 0 ETH | 0.0041298 | ||||
Redeem | 13102740 | 1063 days ago | IN | 0 ETH | 0.00476268 | ||||
Redeem | 13102640 | 1063 days ago | IN | 0 ETH | 0.00665737 | ||||
Redeem | 13101987 | 1063 days ago | IN | 0 ETH | 0.00836737 | ||||
Redeem | 13100845 | 1063 days ago | IN | 0 ETH | 0.00421298 | ||||
Redeem | 13097054 | 1064 days ago | IN | 0 ETH | 0.00839103 | ||||
Redeem | 13092062 | 1064 days ago | IN | 0 ETH | 0.00612571 | ||||
Redeem | 13087973 | 1065 days ago | IN | 0 ETH | 0.00419647 | ||||
Redeem | 13087738 | 1065 days ago | IN | 0 ETH | 0.00418995 | ||||
Redeem | 13082432 | 1066 days ago | IN | 0 ETH | 0.0164891 | ||||
Redeem | 13081109 | 1066 days ago | IN | 0 ETH | 0.00208995 | ||||
Redeem | 13079364 | 1066 days ago | IN | 0 ETH | 0.00300075 | ||||
Redeem | 13079006 | 1066 days ago | IN | 0 ETH | 0.00368057 | ||||
Redeem | 13078932 | 1066 days ago | IN | 0 ETH | 0.00188427 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AsgardBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-14 */ /** *Submitted for verification at Etherscan.io on 2021-06-18 */ /** *Submitted for verification at Etherscan.io on 2021-06-16 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IOwnable { function policy() external view returns (address); function renounceManagement() external; function pushManagement(address newOwner_) external; function pullManagement() external; } contract Ownable is IOwnable { address internal _owner; address internal _newOwner; event OwnershipPushed( address indexed previousOwner, address indexed newOwner ); event OwnershipPulled( address indexed previousOwner, address indexed newOwner ); constructor() { _owner = msg.sender; emit OwnershipPushed(address(0), _owner); } function policy() public view override returns (address) { return _owner; } modifier onlyPolicy() { require(_owner == msg.sender, "Ownable: caller is not the owner"); _; } function renounceManagement() public virtual override onlyPolicy { emit OwnershipPushed(_owner, address(0)); _owner = address(0); } function pushManagement(address newOwner_) public virtual override onlyPolicy { require( newOwner_ != address(0), "Ownable: new owner is the zero address" ); emit OwnershipPushed(_owner, newOwner_); _newOwner = newOwner_; } function pullManagement() public virtual override { require(msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled(_owner, _newOwner); _owner = _newOwner; } } 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; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function sqrrt(uint256 a) internal pure returns (uint256 c) { if (a > 3) { c = a; uint256 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; } } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}( data ); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function addressToString(address _address) internal pure returns (string memory) { bytes32 _bytes = bytes32(uint256(_address)); bytes memory HEX = "0123456789abcdef"; bytes memory _addr = new bytes(42); _addr[0] = "0"; _addr[1] = "x"; for (uint256 i = 0; i < 20; i++) { _addr[2 + i * 2] = HEX[uint8(_bytes[i + 12] >> 4)]; _addr[3 + i * 2] = HEX[uint8(_bytes[i + 12] & 0x0f)]; } return string(_addr); } } interface IERC20 { function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); } abstract contract ERC20 is IERC20 { using SafeMath for uint256; // TODO comment actual hash value. bytes32 private constant ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256("ERC20Token"); mapping(address => uint256) internal _balances; mapping(address => mapping(address => uint256)) internal _allowances; uint256 internal _totalSupply; string internal _name; string internal _symbol; uint8 internal _decimals; constructor( string memory name_, string memory symbol_, uint8 decimals_ ) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, msg.sender, _allowances[sender][msg.sender].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( msg.sender, spender, _allowances[msg.sender][spender].add(addedValue) ); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve( msg.sender, spender, _allowances[msg.sender][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account_, uint256 ammount_) internal virtual { require(account_ != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(this), account_, ammount_); _totalSupply = _totalSupply.add(ammount_); _balances[account_] = _balances[account_].add(ammount_); emit Transfer(address(this), account_, ammount_); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual {} } interface IERC2612Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); } library Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } abstract contract ERC20Permit is ERC20, IERC2612Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public DOMAIN_SEPARATOR; constructor() { uint256 chainID; assembly { chainID := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes(name())), keccak256(bytes("1")), // Version chainID, address(this) ) ); } function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "Permit: expired deadline"); bytes32 hashStruct = keccak256( abi.encode( PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline ) ); bytes32 _hash = keccak256( abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct) ); address signer = ecrecover(_hash, v, r, s); require( signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature" ); _nonces[owner].increment(); _approve(owner, spender, amount); } function nonces(address owner) public view override returns (uint256) { return _nonces[owner].current(); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & -d; d /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; require(h < d, "FullMath::mulDiv: overflow"); return fullDiv(l, h, d); } } library FixedPoint { struct uq112x112 { uint224 _x; } struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = 0x10000000000000000000000000000; uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } function decode112with18(uq112x112 memory self) internal pure returns (uint256) { return uint256(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, "FixedPoint::fraction: division by zero"); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), "FixedPoint::fraction: overflow"); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), "FixedPoint::fraction: overflow"); return uq112x112(uint224(result)); } } } interface ITreasury { function deposit( uint256 _amount, address _token, uint256 _profit ) external returns (bool); function valueOf_(address _token, uint256 _amount) external view returns (uint256 value_); } interface IBondCalculator { function valuation(address _LP, uint256 _amount) external view returns (uint256); function markdown(address _LP) external view returns (uint256); } interface IStaking { function stake(uint256 _amount, address _recipient) external returns (bool); } interface IStakingHelper { function stake(uint256 _amount, address _recipient) external; } contract AsgardBondDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint256; /* ======== EVENTS ======== */ event BondCreated( uint256 deposit, uint256 indexed payout, uint256 indexed expires, uint256 indexed priceInUSD ); event BondRedeemed( address indexed recipient, uint256 payout, uint256 remaining ); event BondPriceChanged( uint256 indexed priceInUSD, uint256 indexed internalPrice, uint256 indexed debtRatio ); event ControlVariableAdjustment( uint256 initialBCV, uint256 newBCV, uint256 adjustment, bool addition ); /* ======== STATE VARIABLES ======== */ address public immutable ASG; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints ASG when receives principle address public immutable DAO; // receives profit share from bond bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different address public immutable bondCalculator; // calculates value of LP tokens address public staking; // to auto-stake payout address public stakingHelper; // to stake and claim if no staking warmup bool public useHelper; Terms public terms; // stores terms for new bonds Adjust public adjustment; // stores adjustment to BCV data mapping(address => Bond) public bondInfo; // stores bond information for depositors uint256 public totalDebt; // total value of outstanding bonds; used for pricing uint256 public lastDecay; // reference block for debt decay /* ======== STRUCTS ======== */ // Info for creating new bonds struct Terms { uint256 controlVariable; // scaling variable for price uint256 vestingTerm; // in blocks uint256 minimumPrice; // vs principle value uint256 maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint256 fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) uint256 maxDebt; // 9 decimal debt ratio, max % total supply created as debt } // Info for bond holder struct Bond { uint256 payout; // ASG remaining to be paid uint256 vesting; // Blocks left to vest uint256 lastBlock; // Last interaction uint256 pricePaid; // In DAI, for front end viewing } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint256 rate; // increment uint256 target; // BCV when adjustment finished uint256 buffer; // minimum length (in blocks) between adjustments uint256 lastBlock; // block when last adjustment made } /* ======== INITIALIZATION ======== */ constructor( address _ASG, address _principle, address _treasury, address _DAO, address _bondCalculator ) { require(_ASG != address(0)); ASG = _ASG; require(_principle != address(0)); principle = _principle; require(_treasury != address(0)); treasury = _treasury; require(_DAO != address(0)); DAO = _DAO; // bondCalculator should be address(0) if not LP bond bondCalculator = _bondCalculator; isLiquidityBond = (_bondCalculator != address(0)); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm uint * @param _minimumPrice uint * @param _maxPayout uint * @param _fee uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBondTerms( uint256 _controlVariable, uint256 _vestingTerm, uint256 _minimumPrice, uint256 _maxPayout, uint256 _fee, uint256 _maxDebt, uint256 _initialDebt ) external onlyPolicy { require(terms.controlVariable == 0, "Bonds must be initialized from 0"); terms = Terms({ controlVariable: _controlVariable, vestingTerm: _vestingTerm, minimumPrice: _minimumPrice, maxPayout: _maxPayout, fee: _fee, maxDebt: _maxDebt }); totalDebt = _initialDebt; lastDecay = block.number; } /* ======== POLICY FUNCTIONS ======== */ enum PARAMETER { VESTING, PAYOUT, FEE, DEBT } /** * @notice set parameters for new bonds * @param _parameter PARAMETER * @param _input uint */ function setBondTerms(PARAMETER _parameter, uint256 _input) external onlyPolicy { if (_parameter == PARAMETER.VESTING) { // 0 require(_input >= 10000, "Vesting must be longer than 36 hours"); terms.vestingTerm = _input; } else if (_parameter == PARAMETER.PAYOUT) { // 1 require(_input <= 100000, "Payout cannot be above 100 percent"); terms.maxPayout = _input; } else if (_parameter == PARAMETER.FEE) { // 2 require(_input <= 10000, "DAO fee cannot exceed payout"); terms.fee = _input; } else if (_parameter == PARAMETER.DEBT) { // 3 terms.maxDebt = _input; } } /** * @notice set control variable adjustment * @param _addition bool * @param _increment uint * @param _target uint * @param _buffer uint */ function setAdjustment( bool _addition, uint256 _increment, uint256 _target, uint256 _buffer ) external onlyPolicy { adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastBlock: block.number }); } /** * @notice set contract for auto stake * @param _staking address * @param _helper bool */ function setStaking(address _staking, bool _helper) external onlyPolicy { require(_staking != address(0)); if (_helper) { useHelper = true; stakingHelper = _staking; } else { useHelper = false; staking = _staking; } } /* ======== USER FUNCTIONS ======== */ /** * @notice deposit bond * @param _amount uint * @param _maxPrice uint * @param _depositor address * @return uint */ function deposit( uint256 _amount, uint256 _maxPrice, address _depositor ) external returns (uint256) { require(_depositor != address(0), "Invalid address"); decayDebt(); require(totalDebt <= terms.maxDebt, "Max capacity reached"); uint256 priceInUSD = bondPriceInUSD(); // Stored in bond info uint256 nativePrice = _bondPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint256 value = ITreasury(treasury).valueOf_(principle, _amount); uint256 payout = payoutFor(value); // payout to bonder is computed require(payout >= 10000000, "Bond too small"); // must be > 0.01 ASG ( underflow protection ) require(payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage // profits are calculated uint256 fee = payout.mul(terms.fee).div(10000); uint256 profit = value.sub(payout).sub(fee); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) ASG */ IERC20(principle).safeTransferFrom(msg.sender, address(this), _amount); IERC20(principle).approve(address(treasury), _amount); ITreasury(treasury).deposit(_amount, principle, profit); if (fee != 0) { // fee is transferred to dao IERC20(ASG).safeTransfer(DAO, fee); } // total debt is increased totalDebt = totalDebt.add(value); // depositor info is stored bondInfo[_depositor] = Bond({ payout: bondInfo[_depositor].payout.add(payout), vesting: terms.vestingTerm, lastBlock: block.number, pricePaid: priceInUSD }); // indexed events are emitted emit BondCreated( _amount, payout, block.number.add(terms.vestingTerm), priceInUSD ); emit BondPriceChanged(bondPriceInUSD(), _bondPrice(), debtRatio()); adjust(); // control variable is adjusted return payout; } /** * @notice redeem bond for user * @param _recipient address * @param _stake bool * @return uint */ function redeem(address _recipient, bool _stake) external returns (uint256) { Bond memory info = bondInfo[_recipient]; uint256 percentVested = percentVestedFor(_recipient); // (blocks since last interaction / vesting term remaining) if (percentVested >= 10000) { // if fully vested delete bondInfo[_recipient]; // delete user info emit BondRedeemed(_recipient, info.payout, 0); // emit bond data return stakeOrSend(_recipient, _stake, info.payout); // pay user everything due } else { // if unfinished // calculate payout vested uint256 payout = info.payout.mul(percentVested).div(10000); // store updated deposit info bondInfo[_recipient] = Bond({ payout: info.payout.sub(payout), vesting: info.vesting.sub(block.number.sub(info.lastBlock)), lastBlock: block.number, pricePaid: info.pricePaid }); emit BondRedeemed(_recipient, payout, bondInfo[_recipient].payout); return stakeOrSend(_recipient, _stake, payout); } } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice allow user to stake payout automatically * @param _stake bool * @param _amount uint * @return uint */ function stakeOrSend( address _recipient, bool _stake, uint256 _amount ) internal returns (uint256) { if (!_stake) { // if user does not want to stake IERC20(ASG).transfer(_recipient, _amount); // send payout } else { // if user wants to stake if (useHelper) { // use if staking warmup is 0 IERC20(ASG).approve(stakingHelper, _amount); IStakingHelper(stakingHelper).stake(_amount, _recipient); } else { IERC20(ASG).approve(staking, _amount); IStaking(staking).stake(_amount, _recipient); } } return _amount; } /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint256 blockCanAdjust = adjustment.lastBlock.add(adjustment.buffer); if (adjustment.rate != 0 && block.number >= blockCanAdjust) { uint256 initial = terms.controlVariable; if (adjustment.add) { terms.controlVariable = terms.controlVariable.add( adjustment.rate ); if (terms.controlVariable >= adjustment.target) { adjustment.rate = 0; } } else { terms.controlVariable = terms.controlVariable.sub( adjustment.rate ); if (terms.controlVariable <= adjustment.target) { adjustment.rate = 0; } } adjustment.lastBlock = block.number; emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add ); } } /** * @notice reduce total debt */ function decayDebt() internal { totalDebt = totalDebt.sub(debtDecay()); lastDecay = block.number; } /* ======== VIEW FUNCTIONS ======== */ /** * @notice determine maximum bond size * @return uint */ function maxPayout() public view returns (uint256) { return IERC20(ASG).totalSupply().mul(terms.maxPayout).div(100000); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor(uint256 _value) public view returns (uint256) { return FixedPoint.fraction(_value, bondPrice()).decode112with18().div( 1e16 ); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns (uint256 price_) { price_ = terms.controlVariable.mul(debtRatio()).add(1000000000).div( 1e7 ); if (price_ < terms.minimumPrice) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns (uint256 price_) { price_ = terms.controlVariable.mul(debtRatio()).add(1000000000).div( 1e7 ); if (price_ < terms.minimumPrice) { price_ = terms.minimumPrice; } else if (terms.minimumPrice != 0) { terms.minimumPrice = 0; } } /** * @notice converts bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns (uint256 price_) { if (isLiquidityBond) { price_ = bondPrice() .mul(IBondCalculator(bondCalculator).markdown(principle)) .div(100); } else { price_ = bondPrice().mul(10**IERC20(principle).decimals()).div(100); } } /** * @notice calculate current ratio of debt to ASG supply * @return debtRatio_ uint */ function debtRatio() public view returns (uint256 debtRatio_) { uint256 supply = IERC20(ASG).totalSupply(); debtRatio_ = FixedPoint .fraction(currentDebt().mul(1e9), supply) .decode112with18() .div(1e18); } /** * @notice debt ratio in same terms for reserve or liquidity bonds * @return uint */ function standardizedDebtRatio() external view returns (uint256) { if (isLiquidityBond) { return debtRatio() .mul(IBondCalculator(bondCalculator).markdown(principle)) .div(1e9); } else { return debtRatio(); } } /** * @notice calculate debt factoring in decay * @return uint */ function currentDebt() public view returns (uint256) { return totalDebt.sub(debtDecay()); } /** * @notice amount to decay total debt by * @return decay_ uint */ function debtDecay() public view returns (uint256 decay_) { uint256 blocksSinceLast = block.number.sub(lastDecay); decay_ = totalDebt.mul(blocksSinceLast).div(terms.vestingTerm); if (decay_ > totalDebt) { decay_ = totalDebt; } } /** * @notice calculate how far into vesting a depositor is * @param _depositor address * @return percentVested_ uint */ function percentVestedFor(address _depositor) public view returns (uint256 percentVested_) { Bond memory bond = bondInfo[_depositor]; uint256 blocksSinceLast = block.number.sub(bond.lastBlock); uint256 vesting = bond.vesting; if (vesting > 0) { percentVested_ = blocksSinceLast.mul(10000).div(vesting); } else { percentVested_ = 0; } } /** * @notice calculate amount of ASG available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor(address _depositor) external view returns (uint256 pendingPayout_) { uint256 percentVested = percentVestedFor(_depositor); uint256 payout = bondInfo[_depositor].payout; if (percentVested >= 10000) { pendingPayout_ = payout; } else { pendingPayout_ = payout.mul(percentVested).div(10000); } } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or ASG) to the DAO * @return bool */ function recoverLostToken(address _token) external returns (bool) { require(_token != ASG); require(_token != principle); IERC20(_token).safeTransfer( DAO, IERC20(_token).balanceOf(address(this)) ); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_ASG","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"ASG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum AsgardBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b50604051620045cb380380620045cb833981810160405260a08110156200003857600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200016757600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620001d957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200024b57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002bd57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561010081151560f81b81525050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c6141866200044560003980611ac0528061250b52806127f3525080611a9252806124da5280612b295250806122c3528061262652806127015250806118275280611e42528061211252806121c35250806109a75280611afc5280611bd55280611e7e528061208f52806120d65280612200528061254752806126a5525080610c0a52806122e5528061264c528061284a5280612bc65280612dc75280612eae528061304d52506141866000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b1461090f578063e0176de81461092d578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063cea55f5714610840578063d4d863ce1461085e578063d5025625146108ae578063d7969060146108ef57610211565b8063904b3ece116100f4578063904b3ece146106f357806398fabd3a14610711578063b4abccba14610745578063c5332b7c1461079f578063cd1234b3146107d357610211565b806377b81895146105f35780637927ebf814610627578063844b5c7c146106695780638dbdbe6d1461068757610211565b80632f3f470a116101a8578063507930ec11610177578063507930ec146104d55780635a96ac0a1461052d57806361d027b314610537578063715350081461056b578063759076e5146105d557610211565b80632f3f470a14610401578063451ee4a11461042157806346f68ee91461045d5780634cf088d9146104a157610211565b80631405ce27116101e45780631405ce27146102e05780631a3d0068146103145780631e321a0f146103625780631feed31f1461039d57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b6102e8610c08565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103606004803603608081101561032a57600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c2c565b005b61039b6004803603604081101561037857600080fd5b81019080803560ff16906020019092919080359060200190929190505050610d69565b005b6103eb600480360360408110156103b357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611012565b6040518082815260200191505060405180910390f35b61040961132a565b60405180821515815260200191505060405180910390f35b61042961133d565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61049f6004803603602081101561047357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061136e565b005b6104a9611573565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610517600480360360208110156104eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611599565b6040518082815260200191505060405180910390f35b61053561167f565b005b61053f611825565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105d3600480360360e081101561058157600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611849565b005b6105dd611a0a565b6040518082815260200191505060405180910390f35b6105fb611a2d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106536004803603602081101561063d57600080fd5b8101908080359060200190929190505050611a53565b6040518082815260200191505060405180910390f35b610671611a8e565b6040518082815260200191505060405180910390f35b6106dd6004803603606081101561069d57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ca4565b6040518082815260200191505060405180910390f35b6106fb6124d6565b6040518082815260200191505060405180910390f35b610719612624565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612648565b60405180821515815260200191505060405180910390f35b6107a76127f1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612815565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610848612845565b6040518082815260200191505060405180910390f35b6108ac6004803603604081101561087457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061293a565b005b6108b6612afd565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108f7612b27565b60405180821515815260200191505060405180910390f35b610917612b4b565b6040518082815260200191505060405180910390f35b610935612bb2565b6040518082815260200191505060405180910390f35b610953612c86565b6040518082815260200191505060405180910390f35b610971612ce2565b6040518082815260200191505060405180910390f35b61098f612ce8565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806109d583611599565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612cee90919063ffffffff16565b612d7490919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ced576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006003811115610e3757fe5b826003811115610e4357fe5b1415610eb357612710811015610ea4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140e16024913960400191505060405180910390fd5b8060046001018190555061100e565b60016003811115610ec057fe5b826003811115610ecc57fe5b1415610f3d57620186a0811115610f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141056022913960400191505060405180910390fd5b8060046003018190555061100d565b60026003811115610f4a57fe5b826003811115610f5657fe5b1415610fe257612710811115610fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b80600480018190555061100c565b600380811115610fee57fe5b826003811115610ffa57fe5b141561100b57806004600501819055505b5b5b5b5050565b600061101c613fd5565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061109b85611599565b9050612710811061117b57600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261117285858460000151612dbe565b92505050611324565b60006111a861271061119a848660000151612cee90919063ffffffff16565b612d7490919063ffffffff16565b905060405180608001604052806111cc83866000015161321590919063ffffffff16565b81526020016111fe6111eb86604001514361321590919063ffffffff16565b866020015161321590919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a261131e868683612dbe565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061402f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006115a3613fd5565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061163082604001514361321590919063ffffffff16565b905060008260200151905060008111156116725761166b8161165d61271085612cee90919063ffffffff16565b612d7490919063ffffffff16565b9350611677565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611725576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140556022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414611985576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b6000611a28611a17612c86565b60105461321590919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611a87662386f26fc10000611a79611a7485611a6f612b4b565b61325f565b613540565b612d7490919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000015611bcb57611bc46064611bb67f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b8101908080519060200190929190505050611ba8612b4b565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050611ca1565b611c9e6064611c907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3957600080fd5b505afa158015611c4d573d6000803e3d6000fd5b505050506040513d6020811015611c6357600080fd5b810190808051906020019092919050505060ff16600a0a611c82612b4b565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611d5061357c565b6004600501546010541115611dcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611dd7611a8e565b90506000611de36135a7565b905080851015611e3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806140be6023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d6ba0d897f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611eef57600080fd5b505afa158015611f03573d6000803e3d6000fd5b505050506040513d6020811015611f1957600080fd5b810190808051906020019092919050505090506000611f3782611a53565b905062989680811015611fb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b611fba612bb2565b81111561202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b600061205c61271061204e600480015485612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050600061208582612077858761321590919063ffffffff16565b61321590919063ffffffff16565b90506120d433308c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661362c909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561218557600080fd5b505af1158015612199573d6000803e3d6000fd5b505050506040513d60208110156121af57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561227a57600080fd5b505af115801561228e573d6000803e3d6000fd5b505050506040513d60208110156122a457600080fd5b8101908080519060200190929190505050506000821461232a576123297f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166136ed9092919063ffffffff16565b5b61233f8460105461378f90919063ffffffff16565b60108190555060405180608001604052806123a585600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461378f90919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856124426004600101544361378f90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a4612482612845565b61248a6135a7565b612492611a8e565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46124c6613817565b8296505050505050509392505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156126165761260f633b9aca006126017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125b057600080fd5b505afa1580156125c4573d6000803e3d6000fd5b505050506040513d60208110156125da57600080fd5b81019080805190602001909291905050506125f3612845565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050612621565b61261e612845565b90505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a357600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126fc57600080fd5b6127e87f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561278757600080fd5b505afa15801561279b573d6000803e3d6000fd5b505050506040513d60208110156127b157600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166136ed9092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128ae57600080fd5b505afa1580156128c2573d6000803e3d6000fd5b505050506040513d60208110156128d857600080fd5b81019080805190602001909291905050509050612934670de0b6b3a764000061292661292161291b633b9aca0061290d611a0a565b612cee90919063ffffffff16565b8561325f565b613540565b612d7490919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a3557600080fd5b8015612a9c576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612af9565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612b9762989680612b89633b9aca00612b7b612b67612845565b600460000154612cee90919063ffffffff16565b61378f90919063ffffffff16565b612d7490919063ffffffff16565b9050600460020154811015612baf5760046002015490505b90565b6000612c81620186a0612c736004600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2a57600080fd5b505afa158015612c3e573d6000803e3d6000fd5b505050506040513d6020811015612c5457600080fd5b8101908080519060200190929190505050612cee90919063ffffffff16565b612d7490919063ffffffff16565b905090565b600080612c9e6011544361321590919063ffffffff16565b9050612ccc600460010154612cbe83601054612cee90919063ffffffff16565b612d7490919063ffffffff16565b9150601054821115612cde5760105491505b5090565b60115481565b60105481565b600080831415612d015760009050612d6e565b6000828402905082848281612d1257fe5b0414612d69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061409d6021913960400191505060405180910390fd5b809150505b92915050565b6000612db683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061397d565b905092915050565b600082612e97577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612e5657600080fd5b505af1158015612e6a573d6000803e3d6000fd5b505050506040513d6020811015612e8057600080fd5b81019080805190602001909291905050505061320b565b600360149054906101000a900460ff161561304b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f5f57600080fd5b505af1158015612f73573d6000803e3d6000fd5b505050506040513d6020811015612f8957600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561302e57600080fd5b505af1158015613042573d6000803e3d6000fd5b5050505061320a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130fe57600080fd5b505af1158015613112573d6000803e3d6000fd5b505050506040513d602081101561312857600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156131cd57600080fd5b505af11580156131e1573d6000803e3d6000fd5b505050506040513d60208110156131f757600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061325783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a43565b905092915050565b613267613ffd565b600082116132c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140776026913960400191505060405180910390fd5b60008314156132fe57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250905061353a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161343757600082607060ff1685901b8161334b57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525091505061353a565b6000613453846e01000000000000000000000000000085613b03565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161357457fe5b049050919050565b613598613587612c86565b60105461321590919063ffffffff16565b60108190555043601181905550565b60006135f3629896806135e5633b9aca006135d76135c3612845565b600460000154612cee90919063ffffffff16565b61378f90919063ffffffff16565b612d7490919063ffffffff16565b905060046002015481101561360f576004600201549050613629565b6000600460020154146136285760006004600201819055505b5b90565b6136e7846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bc5565b50505050565b61378a8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bc5565b505050565b60008082840190508381101561380d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613836600a60030154600a6004015461378f90919063ffffffff16565b90506000600a600101541415801561384e5750804310155b1561397a5760006004600001549050600a60000160009054906101000a900460ff16156138bd57613892600a6001015460046000015461378f90919063ffffffff16565b600460000181905550600a60020154600460000154106138b8576000600a600101819055505b613901565b6138da600a6001015460046000015461321590919063ffffffff16565b600460000181905550600a6002015460046000015411613900576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613a29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139ee5780820151818401526020810190506139d3565b50505050905090810190601f168015613a1b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613a3557fe5b049050809150509392505050565b6000838311158290613af0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ab5578082015181840152602081019050613a9a565b50505050905090810190601f168015613ae25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613b128686613cb4565b9150915060008480613b2057fe5b868809905082811115613b34576001820391505b8083039250848210613bae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613bb9838387613d07565b93505050509392505050565b6060613c27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613da49092919063ffffffff16565b9050600081511115613caf57808060200190516020811015613c4857600080fd5b8101908080519060200190929190505050613cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614127602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613ce157fe5b84860990508385029250828103915082811015613cff576001820391505b509250929050565b6000808260000383169050808381613d1b57fe5b049250808581613d2757fe5b0494506001818260000381613d3857fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613db38484600085613dbc565b90509392505050565b6060613dc785613fc2565b613e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613e895780518252602082019150602081019050602083039250613e66565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613eeb576040519150601f19603f3d011682016040523d82523d6000602084013e613ef0565b606091505b50915091508115613f05578092505050613fba565b600081511115613f185780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f7f578082015181840152602081019050613f64565b50505050905090810190601f168015613fac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735061796f75742063616e6e6f742062652061626f7665203130302070657263656e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209ab6426bf765d6d6c89a0d5c120196f0672b57ead41214ec4fd4bf55fcf7f38164736f6c634300070500330000000000000000000000000dc5189ec8cde5732a01f0f592e927b304370551000000000000000000000000853d955acef822db058eb8505911ed77f175b99e0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc13000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b1461090f578063e0176de81461092d578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063cea55f5714610840578063d4d863ce1461085e578063d5025625146108ae578063d7969060146108ef57610211565b8063904b3ece116100f4578063904b3ece146106f357806398fabd3a14610711578063b4abccba14610745578063c5332b7c1461079f578063cd1234b3146107d357610211565b806377b81895146105f35780637927ebf814610627578063844b5c7c146106695780638dbdbe6d1461068757610211565b80632f3f470a116101a8578063507930ec11610177578063507930ec146104d55780635a96ac0a1461052d57806361d027b314610537578063715350081461056b578063759076e5146105d557610211565b80632f3f470a14610401578063451ee4a11461042157806346f68ee91461045d5780634cf088d9146104a157610211565b80631405ce27116101e45780631405ce27146102e05780631a3d0068146103145780631e321a0f146103625780631feed31f1461039d57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b6102e8610c08565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103606004803603608081101561032a57600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c2c565b005b61039b6004803603604081101561037857600080fd5b81019080803560ff16906020019092919080359060200190929190505050610d69565b005b6103eb600480360360408110156103b357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611012565b6040518082815260200191505060405180910390f35b61040961132a565b60405180821515815260200191505060405180910390f35b61042961133d565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61049f6004803603602081101561047357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061136e565b005b6104a9611573565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610517600480360360208110156104eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611599565b6040518082815260200191505060405180910390f35b61053561167f565b005b61053f611825565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105d3600480360360e081101561058157600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611849565b005b6105dd611a0a565b6040518082815260200191505060405180910390f35b6105fb611a2d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106536004803603602081101561063d57600080fd5b8101908080359060200190929190505050611a53565b6040518082815260200191505060405180910390f35b610671611a8e565b6040518082815260200191505060405180910390f35b6106dd6004803603606081101561069d57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ca4565b6040518082815260200191505060405180910390f35b6106fb6124d6565b6040518082815260200191505060405180910390f35b610719612624565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612648565b60405180821515815260200191505060405180910390f35b6107a76127f1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612815565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610848612845565b6040518082815260200191505060405180910390f35b6108ac6004803603604081101561087457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061293a565b005b6108b6612afd565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108f7612b27565b60405180821515815260200191505060405180910390f35b610917612b4b565b6040518082815260200191505060405180910390f35b610935612bb2565b6040518082815260200191505060405180910390f35b610953612c86565b6040518082815260200191505060405180910390f35b610971612ce2565b6040518082815260200191505060405180910390f35b61098f612ce8565b6040518082815260200191505060405180910390f35b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e81565b6000806109d583611599565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612cee90919063ffffffff16565b612d7490919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055181565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ced576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006003811115610e3757fe5b826003811115610e4357fe5b1415610eb357612710811015610ea4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140e16024913960400191505060405180910390fd5b8060046001018190555061100e565b60016003811115610ec057fe5b826003811115610ecc57fe5b1415610f3d57620186a0811115610f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141056022913960400191505060405180910390fd5b8060046003018190555061100d565b60026003811115610f4a57fe5b826003811115610f5657fe5b1415610fe257612710811115610fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b80600480018190555061100c565b600380811115610fee57fe5b826003811115610ffa57fe5b141561100b57806004600501819055505b5b5b5b5050565b600061101c613fd5565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061109b85611599565b9050612710811061117b57600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261117285858460000151612dbe565b92505050611324565b60006111a861271061119a848660000151612cee90919063ffffffff16565b612d7490919063ffffffff16565b905060405180608001604052806111cc83866000015161321590919063ffffffff16565b81526020016111fe6111eb86604001514361321590919063ffffffff16565b866020015161321590919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a261131e868683612dbe565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061402f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006115a3613fd5565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061163082604001514361321590919063ffffffff16565b905060008260200151905060008111156116725761166b8161165d61271085612cee90919063ffffffff16565b612d7490919063ffffffff16565b9350611677565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611725576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140556022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc1381565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414611985576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b6000611a28611a17612c86565b60105461321590919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611a87662386f26fc10000611a79611a7485611a6f612b4b565b61325f565b613540565b612d7490919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000015611bcb57611bc46064611bb67f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b8101908080519060200190929190505050611ba8612b4b565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050611ca1565b611c9e6064611c907f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3957600080fd5b505afa158015611c4d573d6000803e3d6000fd5b505050506040513d6020811015611c6357600080fd5b810190808051906020019092919050505060ff16600a0a611c82612b4b565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611d5061357c565b6004600501546010541115611dcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611dd7611a8e565b90506000611de36135a7565b905080851015611e3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806140be6023913960400191505060405180910390fd5b60007f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc1373ffffffffffffffffffffffffffffffffffffffff1663d6ba0d897f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611eef57600080fd5b505afa158015611f03573d6000803e3d6000fd5b505050506040513d6020811015611f1957600080fd5b810190808051906020019092919050505090506000611f3782611a53565b905062989680811015611fb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b611fba612bb2565b81111561202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b600061205c61271061204e600480015485612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050600061208582612077858761321590919063ffffffff16565b61321590919063ffffffff16565b90506120d433308c7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff1661362c909392919063ffffffff16565b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc138c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561218557600080fd5b505af1158015612199573d6000803e3d6000fd5b505050506040513d60208110156121af57600080fd5b8101908080519060200190929190505050507f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc1373ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561227a57600080fd5b505af115801561228e573d6000803e3d6000fd5b505050506040513d60208110156122a457600080fd5b8101908080519060200190929190505050506000821461232a576123297f000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d837f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff166136ed9092919063ffffffff16565b5b61233f8460105461378f90919063ffffffff16565b60108190555060405180608001604052806123a585600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461378f90919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856124426004600101544361378f90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a4612482612845565b61248a6135a7565b612492611a8e565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46124c6613817565b8296505050505050509392505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156126165761260f633b9aca006126017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125b057600080fd5b505afa1580156125c4573d6000803e3d6000fd5b505050506040513d60208110156125da57600080fd5b81019080805190602001909291905050506125f3612845565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050612621565b61261e612845565b90505b90565b7f000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d81565b60007f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a357600080fd5b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126fc57600080fd5b6127e87f000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561278757600080fd5b505afa15801561279b573d6000803e3d6000fd5b505050506040513d60208110156127b157600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166136ed9092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128ae57600080fd5b505afa1580156128c2573d6000803e3d6000fd5b505050506040513d60208110156128d857600080fd5b81019080805190602001909291905050509050612934670de0b6b3a764000061292661292161291b633b9aca0061290d611a0a565b612cee90919063ffffffff16565b8561325f565b613540565b612d7490919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a3557600080fd5b8015612a9c576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612af9565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612b9762989680612b89633b9aca00612b7b612b67612845565b600460000154612cee90919063ffffffff16565b61378f90919063ffffffff16565b612d7490919063ffffffff16565b9050600460020154811015612baf5760046002015490505b90565b6000612c81620186a0612c736004600301547f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2a57600080fd5b505afa158015612c3e573d6000803e3d6000fd5b505050506040513d6020811015612c5457600080fd5b8101908080519060200190929190505050612cee90919063ffffffff16565b612d7490919063ffffffff16565b905090565b600080612c9e6011544361321590919063ffffffff16565b9050612ccc600460010154612cbe83601054612cee90919063ffffffff16565b612d7490919063ffffffff16565b9150601054821115612cde5760105491505b5090565b60115481565b60105481565b600080831415612d015760009050612d6e565b6000828402905082848281612d1257fe5b0414612d69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061409d6021913960400191505060405180910390fd5b809150505b92915050565b6000612db683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061397d565b905092915050565b600082612e97577f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612e5657600080fd5b505af1158015612e6a573d6000803e3d6000fd5b505050506040513d6020811015612e8057600080fd5b81019080805190602001909291905050505061320b565b600360149054906101000a900460ff161561304b577f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f5f57600080fd5b505af1158015612f73573d6000803e3d6000fd5b505050506040513d6020811015612f8957600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561302e57600080fd5b505af1158015613042573d6000803e3d6000fd5b5050505061320a565b7f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130fe57600080fd5b505af1158015613112573d6000803e3d6000fd5b505050506040513d602081101561312857600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156131cd57600080fd5b505af11580156131e1573d6000803e3d6000fd5b505050506040513d60208110156131f757600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061325783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a43565b905092915050565b613267613ffd565b600082116132c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140776026913960400191505060405180910390fd5b60008314156132fe57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250905061353a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161343757600082607060ff1685901b8161334b57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525091505061353a565b6000613453846e01000000000000000000000000000085613b03565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161357457fe5b049050919050565b613598613587612c86565b60105461321590919063ffffffff16565b60108190555043601181905550565b60006135f3629896806135e5633b9aca006135d76135c3612845565b600460000154612cee90919063ffffffff16565b61378f90919063ffffffff16565b612d7490919063ffffffff16565b905060046002015481101561360f576004600201549050613629565b6000600460020154146136285760006004600201819055505b5b90565b6136e7846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bc5565b50505050565b61378a8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bc5565b505050565b60008082840190508381101561380d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613836600a60030154600a6004015461378f90919063ffffffff16565b90506000600a600101541415801561384e5750804310155b1561397a5760006004600001549050600a60000160009054906101000a900460ff16156138bd57613892600a6001015460046000015461378f90919063ffffffff16565b600460000181905550600a60020154600460000154106138b8576000600a600101819055505b613901565b6138da600a6001015460046000015461321590919063ffffffff16565b600460000181905550600a6002015460046000015411613900576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613a29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139ee5780820151818401526020810190506139d3565b50505050905090810190601f168015613a1b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613a3557fe5b049050809150509392505050565b6000838311158290613af0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ab5578082015181840152602081019050613a9a565b50505050905090810190601f168015613ae25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613b128686613cb4565b9150915060008480613b2057fe5b868809905082811115613b34576001820391505b8083039250848210613bae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613bb9838387613d07565b93505050509392505050565b6060613c27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613da49092919063ffffffff16565b9050600081511115613caf57808060200190516020811015613c4857600080fd5b8101908080519060200190929190505050613cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614127602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613ce157fe5b84860990508385029250828103915082811015613cff576001820391505b509250929050565b6000808260000383169050808381613d1b57fe5b049250808581613d2757fe5b0494506001818260000381613d3857fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613db38484600085613dbc565b90509392505050565b6060613dc785613fc2565b613e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613e895780518252602082019150602081019050602083039250613e66565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613eeb576040519150601f19603f3d011682016040523d82523d6000602084013e613ef0565b606091505b50915091508115613f05578092505050613fba565b600081511115613f185780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f7f578082015181840152602081019050613f64565b50505050905090810190601f168015613fac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735061796f75742063616e6e6f742062652061626f7665203130302070657263656e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209ab6426bf765d6d6c89a0d5c120196f0672b57ead41214ec4fd4bf55fcf7f38164736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000dc5189ec8cde5732a01f0f592e927b304370551000000000000000000000000853d955acef822db058eb8505911ed77f175b99e0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc13000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _ASG (address): 0x0DC5189Ec8CDe5732a01F0F592e927B304370551
Arg [1] : _principle (address): 0x853d955aCEf822Db058eb8505911ED77F175b99e
Arg [2] : _treasury (address): 0x9D5818af130705F95444d78A55B4F3d85cBfCC13
Arg [3] : _DAO (address): 0xe3DFEcE2Fc903A1280650c05AB471c0413607C1D
Arg [4] : _bondCalculator (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000dc5189ec8cde5732a01f0f592e927b304370551
Arg [1] : 000000000000000000000000853d955acef822db058eb8505911ed77f175b99e
Arg [2] : 0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc13
Arg [3] : 000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
24383:17857:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25268:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41343:427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;884:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1107:154;;;:::i;:::-;;25198:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30224:365;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29251:777;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33684:1220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25798:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25883:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1269:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25667:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40717:454;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1608:218;;;:::i;:::-;;25338:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28289:683;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40067:105;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25720:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37618:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38779:351;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31251:2284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39641:327;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25415:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41948:289;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25586:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25949:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39252:268;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30722:310;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25828:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25487:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37925:270;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37354:135;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40274:282;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26125:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26040;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25268:34;;;:::o;41343:427::-;41439:22;41479:21;41503:28;41520:10;41503:16;:28::i;:::-;41479:52;;41542:14;41559:8;:20;41568:10;41559:20;;;;;;;;;;;;;;;:27;;;41542:44;;41620:5;41603:13;:22;41599:164;;41659:6;41642:23;;41599:164;;;41715:36;41745:5;41715:25;41726:13;41715:6;:10;;:25;;;;:::i;:::-;:29;;:36;;;;:::i;:::-;41698:53;;41599:164;41343:427;;;;;:::o;884:89::-;932:7;959:6;;;;;;;;;;;952:13;;884:89;:::o;1107:154::-;1032:10;1022:20;;:6;;;;;;;;;;:20;;;1014:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1220:1:::1;1188:35;;1204:6;::::0;::::1;;;;;;;;1188:35;;;;;;;;;;;;1251:1;1234:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1107:154::o:0;25198:28::-;;;:::o;30224:365::-;1032:10;1022:20;;:6;;;;;;;;;;:20;;;1014:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30404:177:::1;;;;;;;;30431:9;30404:177;;;;;;30461:10;30404:177;;;;30494:7;30404:177;;;;30524:7;30404:177;;;;30557:12;30404:177;;::::0;30391:10:::1;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30224:365:::0;;;;:::o;29251:777::-;1032:10;1022:20;;:6;;;;;;;;;;:20;;;1014:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29383:17:::1;29369:31;;;;;;;;:10;:31;;;;;;;;;29365:656;;;29453:5;29443:6;:15;;29435:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29534:6;29514:5;:17;;:26;;;;29365:656;;;29576:16;29562:30;;;;;;;;:10;:30;;;;;;;;;29558:463;;;29645:6;29635;:16;;29627:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29723:6;29705:5;:15;;:24;;;;29558:463;;;29765:13;29751:27;;;;;;;;:10;:27;;;;;;;;;29747:274;;;29831:5;29821:6;:15;;29813:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29896:6;29884:5;:9:::0;::::1;:18;;;;29747:274;;;29938:14;29924:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;29920:101;;;30003:6;29987:5;:13;;:22;;;;29920:101;29747:274;29558:463;29365:656;29251:777:::0;;:::o;33684:1220::-;33769:7;33794:16;;:::i;:::-;33813:8;:20;33822:10;33813:20;;;;;;;;;;;;;;;33794:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33844:21;33868:28;33885:10;33868:16;:28::i;:::-;33844:52;;33990:5;33973:13;:22;33969:928;;34051:8;:20;34060:10;34051:20;;;;;;;;;;;;;;;;34044:27;;;;;;;;;;;;;;;;;;;;;;;;;;34124:10;34111:40;;;34136:4;:11;;;34149:1;34111:40;;;;;;;;;;;;;;;;;;;;;;;;34191:44;34203:10;34215:6;34223:4;:11;;;34191;:44::i;:::-;34184:51;;;;;;33969:928;34365:14;34382:41;34417:5;34382:30;34398:13;34382:4;:11;;;:15;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;34365:58;;34506:235;;;;;;;;34538:23;34554:6;34538:4;:11;;;:15;;:23;;;;:::i;:::-;34506:235;;;;34589:50;34606:32;34623:4;:14;;;34606:12;:16;;:32;;;;:::i;:::-;34589:4;:12;;;:16;;:50;;;;:::i;:::-;34506:235;;;;34669:12;34506:235;;;;34711:4;:14;;;34506:235;;;34483:8;:20;34492:10;34483:20;;;;;;;;;;;;;;;:258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34776:10;34763:61;;;34788:6;34796:8;:20;34805:10;34796:20;;;;;;;;;;;;;;;:27;;;34763:61;;;;;;;;;;;;;;;;;;;;;;;;34846:39;34858:10;34870:6;34878;34846:11;:39::i;:::-;34839:46;;;;;33684:1220;;;;;:::o;25798:21::-;;;;;;;;;;;;;:::o;25883:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1269:331::-;1032:10;1022:20;;:6;;;;;;;;;;:20;;;1014:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1442:1:::1;1421:23;;:9;:23;;;;1399:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1550:9;1526:34;;1542:6;::::0;::::1;;;;;;;;1526:34;;;;;;;;;;;;1583:9;1571;;:21;;;;;;;;;;;;;;;;;;1269:331:::0;:::o;25667:22::-;;;;;;;;;;;;;:::o;40717:454::-;40811:22;40851:16;;:::i;:::-;40870:8;:20;40879:10;40870:20;;;;;;;;;;;;;;;40851:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40901:23;40927:32;40944:4;:14;;;40927:12;:16;;:32;;;;:::i;:::-;40901:58;;40970:15;40988:4;:12;;;40970:30;;41027:1;41017:7;:11;41013:151;;;41062:39;41093:7;41062:26;41082:5;41062:15;:19;;:26;;;;:::i;:::-;:30;;:39;;;;:::i;:::-;41045:56;;41013:151;;;41151:1;41134:18;;41013:151;40717:454;;;;;;:::o;1608:218::-;1691:9;;;;;;;;;;;1677:23;;:10;:23;;;1669:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1779:9;;;;;;;;;;;1755:34;;1771:6;;;;;;;;;;1755:34;;;;;;;;;;;;1809:9;;;;;;;;;;;1800:6;;:18;;;;;;;;;;;;;;;;;;1608:218::o;25338:33::-;;;:::o;28289:683::-;1032:10;1022:20;;:6;;;;;;;;;;:20;;;1014:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28597:1:::1;28572:5;:21;;;:26;28564:71;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28654:240;;;;;;;;28692:16;28654:240;;;;28736:12;28654:240;;;;28777:13;28654:240;;;;28816:10;28654:240;;;;28846:4;28654:240;;;;28874:8;28654:240;;::::0;28646:5:::1;:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28917:12;28905:9;:24;;;;28952:12;28940:9;:24;;;;28289:683:::0;;;;;;;:::o;40067:105::-;40111:7;40138:26;40152:11;:9;:11::i;:::-;40138:9;;:13;;:26;;;;:::i;:::-;40131:33;;40067:105;:::o;25720:28::-;;;;;;;;;;;;;:::o;37618:204::-;37674:7;37714:100;37795:4;37714:58;:40;37734:6;37742:11;:9;:11::i;:::-;37714:19;:40::i;:::-;:56;:58::i;:::-;:62;;:100;;;;:::i;:::-;37694:120;;37618:204;;;:::o;38779:351::-;38826:14;38857:15;38853:270;;;38898:113;39007:3;38898:86;38948:14;38932:40;;;38973:9;38932:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38898:11;:9;:11::i;:::-;:33;;:86;;;;:::i;:::-;:108;;:113;;;;:::i;:::-;38889:122;;38853:270;;;39053:58;39107:3;39053:49;39080:9;39073:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39069:32;;:2;:32;39053:11;:9;:11::i;:::-;:15;;:49;;;;:::i;:::-;:53;;:58;;;;:::i;:::-;39044:67;;38853:270;38779:351;:::o;31251:2284::-;31376:7;31426:1;31404:24;;:10;:24;;;;31396:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31461:11;:9;:11::i;:::-;31504:5;:13;;;31491:9;;:26;;31483:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31555:18;31576:16;:14;:16::i;:::-;31555:37;;31626:19;31648:12;:10;:12::i;:::-;31626:34;;31708:11;31695:9;:24;;31673:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31818:13;31844:8;31834:28;;;31863:9;31874:7;31834:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31818:64;;31893:14;31910:16;31920:5;31910:9;:16::i;:::-;31893:33;;31989:8;31979:6;:18;;31971:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32092:11;:9;:11::i;:::-;32082:6;:21;;32074:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32218:11;32232:32;32258:5;32232:21;32243:5;:9;;;32232:6;:10;;:21;;;;:::i;:::-;:25;;:32;;;;:::i;:::-;32218:46;;32275:14;32292:26;32314:3;32292:17;32302:6;32292:5;:9;;:17;;;;:::i;:::-;:21;;:26;;;;:::i;:::-;32275:43;;32499:70;32534:10;32554:4;32561:7;32506:9;32499:34;;;;:70;;;;;;:::i;:::-;32587:9;32580:25;;;32614:8;32625:7;32580:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32654:8;32644:27;;;32672:7;32681:9;32692:6;32644:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32723:1;32716:3;:8;32712:117;;32783:34;32808:3;32813;32790;32783:24;;;;:34;;;;;:::i;:::-;32712:117;32889:20;32903:5;32889:9;;:13;;:20;;;;:::i;:::-;32877:9;:32;;;;32982:194;;;;;;;;33010:39;33042:6;33010:8;:20;33019:10;33010:20;;;;;;;;;;;;;;;:27;;;:31;;:39;;;;:::i;:::-;32982:194;;;;33073:5;:17;;;32982:194;;;;33116:12;32982:194;;;;33154:10;32982:194;;;32959:8;:20;32968:10;32959:20;;;;;;;;;;;;;;;:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33352:10;33302:35;33319:5;:17;;;33302:12;:16;;:35;;;;:::i;:::-;33281:6;33233:140;33259:7;33233:140;;;;;;;;;;;;;;;;;;33438:11;:9;:11::i;:::-;33424:12;:10;:12::i;:::-;33406:16;:14;:16::i;:::-;33389:61;;;;;;;;;;33463:8;:6;:8::i;:::-;33521:6;33514:13;;;;;;;;31251:2284;;;;;:::o;39641:327::-;39697:7;39721:15;39717:244;;;39777:121;39894:3;39777:90;39831:14;39815:40;;;39856:9;39815:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39777:11;:9;:11::i;:::-;:37;;:90;;;;:::i;:::-;:116;;:121;;;;:::i;:::-;39753:145;;;;39717:244;39938:11;:9;:11::i;:::-;39931:18;;39641:327;;:::o;25415:28::-;;;:::o;41948:289::-;42008:4;42043:3;42033:13;;:6;:13;;;;42025:22;;;;;;42076:9;42066:19;;:6;:19;;;;42058:28;;;;;;42097:110;42139:3;42164:6;42157:24;;;42190:4;42157:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42104:6;42097:27;;;;:110;;;;;:::i;:::-;42225:4;42218:11;;41948:289;;;:::o;25586:39::-;;;:::o;25949:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39252:268::-;39294:18;39325:14;39349:3;39342:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39325:42;;39391:121;39507:4;39391:97;:65;39425:22;39443:3;39425:13;:11;:13::i;:::-;:17;;:22;;;;:::i;:::-;39449:6;39391:33;:65::i;:::-;:95;:97::i;:::-;:115;;:121;;;;:::i;:::-;39378:134;;39252:268;;:::o;30722:310::-;1032:10;1022:20;;:6;;;;;;;;;;:20;;;1014:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30833:1:::1;30813:22;;:8;:22;;;;30805:31;;;::::0;::::1;;30851:7;30847:178;;;30887:4;30875:9;;:16;;;;;;;;;;;;;;;;;;30922:8;30906:13;;:24;;;;;;;;;;;;;;;;;;30847:178;;;30975:5;30963:9;;:17;;;;;;;;;;;;;;;;;;31005:8;30995:7;;:18;;;;;;;;;;;;;;;;;;30847:178;30722:310:::0;;:::o;25828:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25487:37::-;;;:::o;37925:270::-;37967:14;38003:87;38076:3;38003:54;38046:10;38003:38;38029:11;:9;:11::i;:::-;38003:5;:21;;;:25;;:38;;;;:::i;:::-;:42;;:54;;;;:::i;:::-;:58;;:87;;;;:::i;:::-;37994:96;;38114:5;:18;;;38105:6;:27;38101:87;;;38158:5;:18;;;38149:27;;38101:87;37925:270;:::o;37354:135::-;37396:7;37423:58;37474:6;37423:46;37453:5;:15;;;37430:3;37423:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:46;;;;:::i;:::-;:50;;:58;;;;:::i;:::-;37416:65;;37354:135;:::o;40274:282::-;40316:14;40343:23;40369:27;40386:9;;40369:12;:16;;:27;;;;:::i;:::-;40343:53;;40416;40451:5;:17;;;40416:30;40430:15;40416:9;;:13;;:30;;;;:::i;:::-;:34;;:53;;;;:::i;:::-;40407:62;;40493:9;;40484:6;:18;40480:69;;;40528:9;;40519:18;;40480:69;40274:282;;:::o;26125:24::-;;;;:::o;26040:::-;;;;:::o;2424:250::-;2482:7;2511:1;2506;:6;2502:47;;;2536:1;2529:8;;;;2502:47;2561:9;2577:1;2573;:5;2561:17;;2606:1;2601;2597;:5;;;;;;:10;2589:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2665:1;2658:8;;;2424:250;;;;;:::o;2682:132::-;2740:7;2767:39;2771:1;2774;2767:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2760:46;;2682:132;;;;:::o;35124:745::-;35247:7;35272:6;35267:570;;35349:3;35342:20;;;35363:10;35375:7;35342:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35267:570;;;35474:9;;;;;;;;;;;35470:356;;;35558:3;35551:19;;;35571:13;;;;;;;;;;;35586:7;35551:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35628:13;;;;;;;;;;;35613:35;;;35649:7;35658:10;35613:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35470:356;;;35717:3;35710:19;;;35730:7;;;;;;;;;;;35739;35710:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35775:7;;;;;;;;;;;35766:23;;;35790:7;35799:10;35766:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35470:356;35267:570;35854:7;35847:14;;35124:745;;;;;:::o;2046:136::-;2104:7;2131:43;2135:1;2138;2131:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2124:50;;2046:136;;;;:::o;22913:751::-;23021:16;;:::i;:::-;23077:1;23063:11;:15;23055:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23149:1;23136:9;:14;23132:50;;;23159:23;;;;;;;;23180:1;23159:23;;;;;23152:30;;;;23132:50;23220:2;23199:24;;:9;:24;23195:462;;23240:14;23285:11;22294:3;23258:23;;:9;:23;;23257:39;;;;;;23240:56;;23337:2;23319:21;;:6;:21;;23311:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23397:26;;;;;;;;23415:6;23397:26;;;;;23390:33;;;;;23195:462;23456:14;23473:45;23489:9;22336:31;23506:11;23473:15;:45::i;:::-;23456:62;;23559:2;23541:21;;:6;:21;;23533:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23619:26;;;;;;;;23637:6;23619:26;;;;;23612:33;;;22913:751;;;;;:::o;22732:173::-;22830:7;22881:16;22870:4;:7;;;22862:16;;:35;;;;;;22855:42;;22732:173;;;:::o;37093:122::-;37146:26;37160:11;:9;:11::i;:::-;37146:9;;:13;;:26;;;;:::i;:::-;37134:9;:38;;;;37195:12;37183:9;:24;;;;37093:122::o;38322:352::-;38362:14;38398:87;38471:3;38398:54;38441:10;38398:38;38424:11;:9;:11::i;:::-;38398:5;:21;;;:25;;:38;;;;:::i;:::-;:42;;:54;;;;:::i;:::-;:58;;:87;;;;:::i;:::-;38389:96;;38509:5;:18;;;38500:6;:27;38496:171;;;38553:5;:18;;;38544:27;;38496:171;;;38615:1;38593:5;:18;;;:23;38589:78;;38654:1;38633:5;:18;;:22;;;;38589:78;38496:171;38322:352;:::o;18780:285::-;18924:133;18958:5;19001:27;;;19030:4;19036:2;19040:5;18978:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:19;:133::i;:::-;18780:285;;;;:::o;18524:248::-;18641:123;18675:5;18718:23;;;18743:2;18747:5;18695:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18641:19;:123::i;:::-;18524:248;;;:::o;1857:181::-;1915:7;1935:9;1951:1;1947;:5;1935:17;;1976:1;1971;:6;;1963:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2029:1;2022:8;;;1857:181;;;;:::o;35961:1071::-;35999:22;36024:43;36049:10;:17;;;36024:10;:20;;;:24;;:43;;;;:::i;:::-;35999:68;;36101:1;36082:10;:15;;;:20;;:54;;;;;36122:14;36106:12;:30;;36082:54;36078:947;;;36153:15;36171:5;:21;;;36153:39;;36211:10;:14;;;;;;;;;;;;36207:564;;;36270:82;36318:10;:15;;;36270:5;:21;;;:25;;:82;;;;:::i;:::-;36246:5;:21;;:106;;;;36400:10;:17;;;36375:5;:21;;;:42;36371:110;;36460:1;36442:10;:15;;:19;;;;36371:110;36207:564;;;36545:82;36593:10;:15;;;36545:5;:21;;;:25;;:82;;;;:::i;:::-;36521:5;:21;;:106;;;;36675:10;:17;;;36650:5;:21;;;:42;36646:110;;36735:1;36717:10;:15;;:19;;;;36646:110;36207:564;36808:12;36785:10;:20;;:35;;;;36840:173;36884:7;36910:5;:21;;;36950:10;:15;;;36984:10;:14;;;;;;;;;;;;36840:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36078:947;;35961:1071;:::o;2822:223::-;2942:7;2974:1;2970;:5;2977:12;2962:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3001:9;3017:1;3013;:5;;;;;;3001:17;;3036:1;3029:8;;;2822:223;;;;;:::o;2190:226::-;2310:7;2343:1;2338;:6;;2346:12;2330:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2370:9;2386:1;2382;:5;2370:17;;2407:1;2400:8;;;2190:226;;;;;:::o;21770:347::-;21876:7;21897:9;21908;21921:13;21929:1;21932;21921:7;:13::i;:::-;21896:38;;;;21945:10;21971:1;21958:15;;;;;21968:1;21965;21958:15;21945:28;;21993:1;21988:2;:6;21984:18;;;22001:1;21996:6;;;;21984:18;22018:2;22013:7;;;;22043:1;22039;:5;22031:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22093:16;22101:1;22104;22107;22093:7;:16::i;:::-;22086:23;;;;;21770:347;;;;;:::o;20482:517::-;20563:23;20589:106;20631:4;20589:106;;;;;;;;;;;;;;;;;20597:5;20589:27;;;;:106;;;;;:::i;:::-;20563:132;;20730:1;20710:10;:17;:21;20706:286;;;20883:10;20872:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20846:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20706:286;20482:517;;;:::o;21030:242::-;21118:9;21129;21156:10;21190:2;21169:25;;;;;21179:1;21176;21169:25;21156:38;;21213:1;21209;:5;21205:9;;21234:1;21229:2;:6;21225:10;;21255:1;21250:2;:6;21246:18;;;21263:1;21258:6;;;;21246:18;21030:242;;;;;;:::o;21280:482::-;21386:7;21406:12;21426:1;21425:2;;21421:1;:6;21406:21;;21443:4;21438:9;;;;;;;;;21463:4;21458:9;;;;;;;;;21505:1;21498:4;21490;21489:5;;21488:14;;;;;;:18;21483:1;:24;21478:29;;;;21518:9;21530:1;21518:13;;21555:1;21551;:5;21547:1;:9;21542:14;;;;21580:1;21576;:5;21572:1;:9;21567:14;;;;21605:1;21601;:5;21597:1;:9;21592:14;;;;21630:1;21626;:5;21622:1;:9;21617:14;;;;21655:1;21651;:5;21647:1;:9;21642:14;;;;21680:1;21676;:5;21672:1;:9;21667:14;;;;21705:1;21701;:5;21697:1;:9;21692:14;;;;21730:1;21726;:5;21722:1;:9;21717:14;;;;21753:1;21749;:5;21742:12;;;;21280:482;;;;;:::o;4704:230::-;4841:12;4873:53;4896:6;4904:4;4910:1;4913:12;4873:22;:53::i;:::-;4866:60;;4704:230;;;;;:::o;5946:1044::-;6119:12;6152:18;6163:6;6152:10;:18::i;:::-;6144:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6278:12;6292:23;6319:6;:11;;6338:8;6362:4;6319:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6277:100;;;;6392:7;6388:595;;;6423:10;6416:17;;;;;;6388:595;6557:1;6537:10;:17;:21;6533:439;;;6800:10;6794:17;6861:15;6848:10;6844:2;6840:19;6833:44;6748:148;6943:12;6936:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5946:1044;;;;;;;:::o;3760:253::-;3820:4;3837:12;3961:7;3949:20;3941:28;;4004:1;3997:4;:8;3990:15;;;3760:253;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://9ab6426bf765d6d6c89a0d5c120196f0672b57ead41214ec4fd4bf55fcf7f381
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.