Source Code
Latest 25 from a total of 383 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Redeem | 13225996 | 1625 days ago | IN | 0 ETH | 0.00562752 | ||||
| Redeem | 13173731 | 1633 days ago | IN | 0 ETH | 0.00769072 | ||||
| Redeem | 13146141 | 1637 days ago | IN | 0 ETH | 0.00450569 | ||||
| Redeem | 13128084 | 1640 days ago | IN | 0 ETH | 0.00361458 | ||||
| Redeem | 13128084 | 1640 days ago | IN | 0 ETH | 0.00361458 | ||||
| Redeem | 13128080 | 1640 days ago | IN | 0 ETH | 0.00676726 | ||||
| Redeem | 13116715 | 1642 days ago | IN | 0 ETH | 0.00410911 | ||||
| Redeem | 13114165 | 1642 days ago | IN | 0 ETH | 0.00469276 | ||||
| Redeem | 13113720 | 1642 days ago | IN | 0 ETH | 0.00308712 | ||||
| Redeem | 13112302 | 1642 days ago | IN | 0 ETH | 0.00335912 | ||||
| Redeem | 13106561 | 1643 days ago | IN | 0 ETH | 0.00335135 | ||||
| Redeem | 13103767 | 1644 days ago | IN | 0 ETH | 0.00539489 | ||||
| Redeem | 13102619 | 1644 days ago | IN | 0 ETH | 0.00612578 | ||||
| Redeem | 13099286 | 1644 days ago | IN | 0 ETH | 0.00431397 | ||||
| Redeem | 13097010 | 1645 days ago | IN | 0 ETH | 0.00397594 | ||||
| Redeem | 13094385 | 1645 days ago | IN | 0 ETH | 0.00415476 | ||||
| Redeem | 13093455 | 1645 days ago | IN | 0 ETH | 0.00442689 | ||||
| Redeem | 13087295 | 1646 days ago | IN | 0 ETH | 0.00208212 | ||||
| Redeem | 13085949 | 1647 days ago | IN | 0 ETH | 0.00449921 | ||||
| Redeem | 13082296 | 1647 days ago | IN | 0 ETH | 0.00577737 | ||||
| Redeem | 13081756 | 1647 days ago | IN | 0 ETH | 0.00298125 | ||||
| Redeem | 13080472 | 1647 days ago | IN | 0 ETH | 0.00261011 | ||||
| Redeem | 13080435 | 1647 days ago | IN | 0 ETH | 0.00328516 | ||||
| Redeem | 13080369 | 1647 days ago | IN | 0 ETH | 0.00281191 | ||||
| Redeem | 13079927 | 1647 days ago | IN | 0 ETH | 0.00291283 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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
Contract ABI
API[{"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
6101406040523480156200001257600080fd5b50604051620045cb380380620045cb833981810160405260a08110156200003857600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200016757600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620001d957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200024b57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002bd57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561010081151560f81b81525050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c6141866200044560003980611ac0528061250b52806127f3525080611a9252806124da5280612b295250806122c3528061262652806127015250806118275280611e42528061211252806121c35250806109a75280611afc5280611bd55280611e7e528061208f52806120d65280612200528061254752806126a5525080610c0a52806122e5528061264c528061284a5280612bc65280612dc75280612eae528061304d52506141866000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b1461090f578063e0176de81461092d578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063cea55f5714610840578063d4d863ce1461085e578063d5025625146108ae578063d7969060146108ef57610211565b8063904b3ece116100f4578063904b3ece146106f357806398fabd3a14610711578063b4abccba14610745578063c5332b7c1461079f578063cd1234b3146107d357610211565b806377b81895146105f35780637927ebf814610627578063844b5c7c146106695780638dbdbe6d1461068757610211565b80632f3f470a116101a8578063507930ec11610177578063507930ec146104d55780635a96ac0a1461052d57806361d027b314610537578063715350081461056b578063759076e5146105d557610211565b80632f3f470a14610401578063451ee4a11461042157806346f68ee91461045d5780634cf088d9146104a157610211565b80631405ce27116101e45780631405ce27146102e05780631a3d0068146103145780631e321a0f146103625780631feed31f1461039d57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b6102e8610c08565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103606004803603608081101561032a57600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c2c565b005b61039b6004803603604081101561037857600080fd5b81019080803560ff16906020019092919080359060200190929190505050610d69565b005b6103eb600480360360408110156103b357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611012565b6040518082815260200191505060405180910390f35b61040961132a565b60405180821515815260200191505060405180910390f35b61042961133d565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61049f6004803603602081101561047357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061136e565b005b6104a9611573565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610517600480360360208110156104eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611599565b6040518082815260200191505060405180910390f35b61053561167f565b005b61053f611825565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105d3600480360360e081101561058157600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611849565b005b6105dd611a0a565b6040518082815260200191505060405180910390f35b6105fb611a2d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106536004803603602081101561063d57600080fd5b8101908080359060200190929190505050611a53565b6040518082815260200191505060405180910390f35b610671611a8e565b6040518082815260200191505060405180910390f35b6106dd6004803603606081101561069d57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ca4565b6040518082815260200191505060405180910390f35b6106fb6124d6565b6040518082815260200191505060405180910390f35b610719612624565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612648565b60405180821515815260200191505060405180910390f35b6107a76127f1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612815565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610848612845565b6040518082815260200191505060405180910390f35b6108ac6004803603604081101561087457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061293a565b005b6108b6612afd565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108f7612b27565b60405180821515815260200191505060405180910390f35b610917612b4b565b6040518082815260200191505060405180910390f35b610935612bb2565b6040518082815260200191505060405180910390f35b610953612c86565b6040518082815260200191505060405180910390f35b610971612ce2565b6040518082815260200191505060405180910390f35b61098f612ce8565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806109d583611599565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612cee90919063ffffffff16565b612d7490919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ced576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006003811115610e3757fe5b826003811115610e4357fe5b1415610eb357612710811015610ea4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140e16024913960400191505060405180910390fd5b8060046001018190555061100e565b60016003811115610ec057fe5b826003811115610ecc57fe5b1415610f3d57620186a0811115610f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141056022913960400191505060405180910390fd5b8060046003018190555061100d565b60026003811115610f4a57fe5b826003811115610f5657fe5b1415610fe257612710811115610fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b80600480018190555061100c565b600380811115610fee57fe5b826003811115610ffa57fe5b141561100b57806004600501819055505b5b5b5b5050565b600061101c613fd5565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061109b85611599565b9050612710811061117b57600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261117285858460000151612dbe565b92505050611324565b60006111a861271061119a848660000151612cee90919063ffffffff16565b612d7490919063ffffffff16565b905060405180608001604052806111cc83866000015161321590919063ffffffff16565b81526020016111fe6111eb86604001514361321590919063ffffffff16565b866020015161321590919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a261131e868683612dbe565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061402f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006115a3613fd5565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061163082604001514361321590919063ffffffff16565b905060008260200151905060008111156116725761166b8161165d61271085612cee90919063ffffffff16565b612d7490919063ffffffff16565b9350611677565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611725576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140556022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414611985576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b6000611a28611a17612c86565b60105461321590919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611a87662386f26fc10000611a79611a7485611a6f612b4b565b61325f565b613540565b612d7490919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000015611bcb57611bc46064611bb67f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b8101908080519060200190929190505050611ba8612b4b565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050611ca1565b611c9e6064611c907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3957600080fd5b505afa158015611c4d573d6000803e3d6000fd5b505050506040513d6020811015611c6357600080fd5b810190808051906020019092919050505060ff16600a0a611c82612b4b565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611d5061357c565b6004600501546010541115611dcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611dd7611a8e565b90506000611de36135a7565b905080851015611e3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806140be6023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d6ba0d897f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611eef57600080fd5b505afa158015611f03573d6000803e3d6000fd5b505050506040513d6020811015611f1957600080fd5b810190808051906020019092919050505090506000611f3782611a53565b905062989680811015611fb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b611fba612bb2565b81111561202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b600061205c61271061204e600480015485612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050600061208582612077858761321590919063ffffffff16565b61321590919063ffffffff16565b90506120d433308c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661362c909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561218557600080fd5b505af1158015612199573d6000803e3d6000fd5b505050506040513d60208110156121af57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561227a57600080fd5b505af115801561228e573d6000803e3d6000fd5b505050506040513d60208110156122a457600080fd5b8101908080519060200190929190505050506000821461232a576123297f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166136ed9092919063ffffffff16565b5b61233f8460105461378f90919063ffffffff16565b60108190555060405180608001604052806123a585600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461378f90919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856124426004600101544361378f90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a4612482612845565b61248a6135a7565b612492611a8e565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46124c6613817565b8296505050505050509392505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156126165761260f633b9aca006126017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125b057600080fd5b505afa1580156125c4573d6000803e3d6000fd5b505050506040513d60208110156125da57600080fd5b81019080805190602001909291905050506125f3612845565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050612621565b61261e612845565b90505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a357600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126fc57600080fd5b6127e87f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561278757600080fd5b505afa15801561279b573d6000803e3d6000fd5b505050506040513d60208110156127b157600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166136ed9092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128ae57600080fd5b505afa1580156128c2573d6000803e3d6000fd5b505050506040513d60208110156128d857600080fd5b81019080805190602001909291905050509050612934670de0b6b3a764000061292661292161291b633b9aca0061290d611a0a565b612cee90919063ffffffff16565b8561325f565b613540565b612d7490919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a3557600080fd5b8015612a9c576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612af9565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612b9762989680612b89633b9aca00612b7b612b67612845565b600460000154612cee90919063ffffffff16565b61378f90919063ffffffff16565b612d7490919063ffffffff16565b9050600460020154811015612baf5760046002015490505b90565b6000612c81620186a0612c736004600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2a57600080fd5b505afa158015612c3e573d6000803e3d6000fd5b505050506040513d6020811015612c5457600080fd5b8101908080519060200190929190505050612cee90919063ffffffff16565b612d7490919063ffffffff16565b905090565b600080612c9e6011544361321590919063ffffffff16565b9050612ccc600460010154612cbe83601054612cee90919063ffffffff16565b612d7490919063ffffffff16565b9150601054821115612cde5760105491505b5090565b60115481565b60105481565b600080831415612d015760009050612d6e565b6000828402905082848281612d1257fe5b0414612d69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061409d6021913960400191505060405180910390fd5b809150505b92915050565b6000612db683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061397d565b905092915050565b600082612e97577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612e5657600080fd5b505af1158015612e6a573d6000803e3d6000fd5b505050506040513d6020811015612e8057600080fd5b81019080805190602001909291905050505061320b565b600360149054906101000a900460ff161561304b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f5f57600080fd5b505af1158015612f73573d6000803e3d6000fd5b505050506040513d6020811015612f8957600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561302e57600080fd5b505af1158015613042573d6000803e3d6000fd5b5050505061320a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130fe57600080fd5b505af1158015613112573d6000803e3d6000fd5b505050506040513d602081101561312857600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156131cd57600080fd5b505af11580156131e1573d6000803e3d6000fd5b505050506040513d60208110156131f757600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061325783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a43565b905092915050565b613267613ffd565b600082116132c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140776026913960400191505060405180910390fd5b60008314156132fe57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250905061353a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161343757600082607060ff1685901b8161334b57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525091505061353a565b6000613453846e01000000000000000000000000000085613b03565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161357457fe5b049050919050565b613598613587612c86565b60105461321590919063ffffffff16565b60108190555043601181905550565b60006135f3629896806135e5633b9aca006135d76135c3612845565b600460000154612cee90919063ffffffff16565b61378f90919063ffffffff16565b612d7490919063ffffffff16565b905060046002015481101561360f576004600201549050613629565b6000600460020154146136285760006004600201819055505b5b90565b6136e7846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bc5565b50505050565b61378a8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bc5565b505050565b60008082840190508381101561380d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613836600a60030154600a6004015461378f90919063ffffffff16565b90506000600a600101541415801561384e5750804310155b1561397a5760006004600001549050600a60000160009054906101000a900460ff16156138bd57613892600a6001015460046000015461378f90919063ffffffff16565b600460000181905550600a60020154600460000154106138b8576000600a600101819055505b613901565b6138da600a6001015460046000015461321590919063ffffffff16565b600460000181905550600a6002015460046000015411613900576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613a29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139ee5780820151818401526020810190506139d3565b50505050905090810190601f168015613a1b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613a3557fe5b049050809150509392505050565b6000838311158290613af0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ab5578082015181840152602081019050613a9a565b50505050905090810190601f168015613ae25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613b128686613cb4565b9150915060008480613b2057fe5b868809905082811115613b34576001820391505b8083039250848210613bae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613bb9838387613d07565b93505050509392505050565b6060613c27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613da49092919063ffffffff16565b9050600081511115613caf57808060200190516020811015613c4857600080fd5b8101908080519060200190929190505050613cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614127602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613ce157fe5b84860990508385029250828103915082811015613cff576001820391505b509250929050565b6000808260000383169050808381613d1b57fe5b049250808581613d2757fe5b0494506001818260000381613d3857fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613db38484600085613dbc565b90509392505050565b6060613dc785613fc2565b613e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613e895780518252602082019150602081019050602083039250613e66565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613eeb576040519150601f19603f3d011682016040523d82523d6000602084013e613ef0565b606091505b50915091508115613f05578092505050613fba565b600081511115613f185780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f7f578082015181840152602081019050613f64565b50505050905090810190601f168015613fac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735061796f75742063616e6e6f742062652061626f7665203130302070657263656e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209ab6426bf765d6d6c89a0d5c120196f0672b57ead41214ec4fd4bf55fcf7f38164736f6c634300070500330000000000000000000000000dc5189ec8cde5732a01f0f592e927b3043705510000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc13000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b1461090f578063e0176de81461092d578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063cea55f5714610840578063d4d863ce1461085e578063d5025625146108ae578063d7969060146108ef57610211565b8063904b3ece116100f4578063904b3ece146106f357806398fabd3a14610711578063b4abccba14610745578063c5332b7c1461079f578063cd1234b3146107d357610211565b806377b81895146105f35780637927ebf814610627578063844b5c7c146106695780638dbdbe6d1461068757610211565b80632f3f470a116101a8578063507930ec11610177578063507930ec146104d55780635a96ac0a1461052d57806361d027b314610537578063715350081461056b578063759076e5146105d557610211565b80632f3f470a14610401578063451ee4a11461042157806346f68ee91461045d5780634cf088d9146104a157610211565b80631405ce27116101e45780631405ce27146102e05780631a3d0068146103145780631e321a0f146103625780631feed31f1461039d57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b6102e8610c08565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103606004803603608081101561032a57600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c2c565b005b61039b6004803603604081101561037857600080fd5b81019080803560ff16906020019092919080359060200190929190505050610d69565b005b6103eb600480360360408110156103b357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611012565b6040518082815260200191505060405180910390f35b61040961132a565b60405180821515815260200191505060405180910390f35b61042961133d565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61049f6004803603602081101561047357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061136e565b005b6104a9611573565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610517600480360360208110156104eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611599565b6040518082815260200191505060405180910390f35b61053561167f565b005b61053f611825565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105d3600480360360e081101561058157600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611849565b005b6105dd611a0a565b6040518082815260200191505060405180910390f35b6105fb611a2d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106536004803603602081101561063d57600080fd5b8101908080359060200190929190505050611a53565b6040518082815260200191505060405180910390f35b610671611a8e565b6040518082815260200191505060405180910390f35b6106dd6004803603606081101561069d57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ca4565b6040518082815260200191505060405180910390f35b6106fb6124d6565b6040518082815260200191505060405180910390f35b610719612624565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612648565b60405180821515815260200191505060405180910390f35b6107a76127f1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612815565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610848612845565b6040518082815260200191505060405180910390f35b6108ac6004803603604081101561087457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061293a565b005b6108b6612afd565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108f7612b27565b60405180821515815260200191505060405180910390f35b610917612b4b565b6040518082815260200191505060405180910390f35b610935612bb2565b6040518082815260200191505060405180910390f35b610953612c86565b6040518082815260200191505060405180910390f35b610971612ce2565b6040518082815260200191505060405180910390f35b61098f612ce8565b6040518082815260200191505060405180910390f35b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b6000806109d583611599565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612cee90919063ffffffff16565b612d7490919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055181565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ced576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006003811115610e3757fe5b826003811115610e4357fe5b1415610eb357612710811015610ea4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140e16024913960400191505060405180910390fd5b8060046001018190555061100e565b60016003811115610ec057fe5b826003811115610ecc57fe5b1415610f3d57620186a0811115610f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141056022913960400191505060405180910390fd5b8060046003018190555061100d565b60026003811115610f4a57fe5b826003811115610f5657fe5b1415610fe257612710811115610fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b80600480018190555061100c565b600380811115610fee57fe5b826003811115610ffa57fe5b141561100b57806004600501819055505b5b5b5b5050565b600061101c613fd5565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061109b85611599565b9050612710811061117b57600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261117285858460000151612dbe565b92505050611324565b60006111a861271061119a848660000151612cee90919063ffffffff16565b612d7490919063ffffffff16565b905060405180608001604052806111cc83866000015161321590919063ffffffff16565b81526020016111fe6111eb86604001514361321590919063ffffffff16565b866020015161321590919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a261131e868683612dbe565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061402f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006115a3613fd5565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061163082604001514361321590919063ffffffff16565b905060008260200151905060008111156116725761166b8161165d61271085612cee90919063ffffffff16565b612d7490919063ffffffff16565b9350611677565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611725576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140556022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc1381565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414611985576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b6000611a28611a17612c86565b60105461321590919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611a87662386f26fc10000611a79611a7485611a6f612b4b565b61325f565b613540565b612d7490919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000015611bcb57611bc46064611bb67f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b8101908080519060200190929190505050611ba8612b4b565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050611ca1565b611c9e6064611c907f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3957600080fd5b505afa158015611c4d573d6000803e3d6000fd5b505050506040513d6020811015611c6357600080fd5b810190808051906020019092919050505060ff16600a0a611c82612b4b565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611d5061357c565b6004600501546010541115611dcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611dd7611a8e565b90506000611de36135a7565b905080851015611e3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806140be6023913960400191505060405180910390fd5b60007f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc1373ffffffffffffffffffffffffffffffffffffffff1663d6ba0d897f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611eef57600080fd5b505afa158015611f03573d6000803e3d6000fd5b505050506040513d6020811015611f1957600080fd5b810190808051906020019092919050505090506000611f3782611a53565b905062989680811015611fb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b611fba612bb2565b81111561202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b600061205c61271061204e600480015485612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050600061208582612077858761321590919063ffffffff16565b61321590919063ffffffff16565b90506120d433308c7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff1661362c909392919063ffffffff16565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc138c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561218557600080fd5b505af1158015612199573d6000803e3d6000fd5b505050506040513d60208110156121af57600080fd5b8101908080519060200190929190505050507f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc1373ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561227a57600080fd5b505af115801561228e573d6000803e3d6000fd5b505050506040513d60208110156122a457600080fd5b8101908080519060200190929190505050506000821461232a576123297f000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d837f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff166136ed9092919063ffffffff16565b5b61233f8460105461378f90919063ffffffff16565b60108190555060405180608001604052806123a585600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461378f90919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856124426004600101544361378f90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a4612482612845565b61248a6135a7565b612492611a8e565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46124c6613817565b8296505050505050509392505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156126165761260f633b9aca006126017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125b057600080fd5b505afa1580156125c4573d6000803e3d6000fd5b505050506040513d60208110156125da57600080fd5b81019080805190602001909291905050506125f3612845565b612cee90919063ffffffff16565b612d7490919063ffffffff16565b9050612621565b61261e612845565b90505b90565b7f000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d81565b60007f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a357600080fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126fc57600080fd5b6127e87f000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561278757600080fd5b505afa15801561279b573d6000803e3d6000fd5b505050506040513d60208110156127b157600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166136ed9092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128ae57600080fd5b505afa1580156128c2573d6000803e3d6000fd5b505050506040513d60208110156128d857600080fd5b81019080805190602001909291905050509050612934670de0b6b3a764000061292661292161291b633b9aca0061290d611a0a565b612cee90919063ffffffff16565b8561325f565b613540565b612d7490919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a3557600080fd5b8015612a9c576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612af9565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612b9762989680612b89633b9aca00612b7b612b67612845565b600460000154612cee90919063ffffffff16565b61378f90919063ffffffff16565b612d7490919063ffffffff16565b9050600460020154811015612baf5760046002015490505b90565b6000612c81620186a0612c736004600301547f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2a57600080fd5b505afa158015612c3e573d6000803e3d6000fd5b505050506040513d6020811015612c5457600080fd5b8101908080519060200190929190505050612cee90919063ffffffff16565b612d7490919063ffffffff16565b905090565b600080612c9e6011544361321590919063ffffffff16565b9050612ccc600460010154612cbe83601054612cee90919063ffffffff16565b612d7490919063ffffffff16565b9150601054821115612cde5760105491505b5090565b60115481565b60105481565b600080831415612d015760009050612d6e565b6000828402905082848281612d1257fe5b0414612d69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061409d6021913960400191505060405180910390fd5b809150505b92915050565b6000612db683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061397d565b905092915050565b600082612e97577f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612e5657600080fd5b505af1158015612e6a573d6000803e3d6000fd5b505050506040513d6020811015612e8057600080fd5b81019080805190602001909291905050505061320b565b600360149054906101000a900460ff161561304b577f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f5f57600080fd5b505af1158015612f73573d6000803e3d6000fd5b505050506040513d6020811015612f8957600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561302e57600080fd5b505af1158015613042573d6000803e3d6000fd5b5050505061320a565b7f0000000000000000000000000dc5189ec8cde5732a01f0f592e927b30437055173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130fe57600080fd5b505af1158015613112573d6000803e3d6000fd5b505050506040513d602081101561312857600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156131cd57600080fd5b505af11580156131e1573d6000803e3d6000fd5b505050506040513d60208110156131f757600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061325783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a43565b905092915050565b613267613ffd565b600082116132c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140776026913960400191505060405180910390fd5b60008314156132fe57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250905061353a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161343757600082607060ff1685901b8161334b57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525091505061353a565b6000613453846e01000000000000000000000000000085613b03565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161357457fe5b049050919050565b613598613587612c86565b60105461321590919063ffffffff16565b60108190555043601181905550565b60006135f3629896806135e5633b9aca006135d76135c3612845565b600460000154612cee90919063ffffffff16565b61378f90919063ffffffff16565b612d7490919063ffffffff16565b905060046002015481101561360f576004600201549050613629565b6000600460020154146136285760006004600201819055505b5b90565b6136e7846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bc5565b50505050565b61378a8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bc5565b505050565b60008082840190508381101561380d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613836600a60030154600a6004015461378f90919063ffffffff16565b90506000600a600101541415801561384e5750804310155b1561397a5760006004600001549050600a60000160009054906101000a900460ff16156138bd57613892600a6001015460046000015461378f90919063ffffffff16565b600460000181905550600a60020154600460000154106138b8576000600a600101819055505b613901565b6138da600a6001015460046000015461321590919063ffffffff16565b600460000181905550600a6002015460046000015411613900576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613a29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139ee5780820151818401526020810190506139d3565b50505050905090810190601f168015613a1b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613a3557fe5b049050809150509392505050565b6000838311158290613af0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ab5578082015181840152602081019050613a9a565b50505050905090810190601f168015613ae25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613b128686613cb4565b9150915060008480613b2057fe5b868809905082811115613b34576001820391505b8083039250848210613bae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613bb9838387613d07565b93505050509392505050565b6060613c27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613da49092919063ffffffff16565b9050600081511115613caf57808060200190516020811015613c4857600080fd5b8101908080519060200190929190505050613cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614127602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613ce157fe5b84860990508385029250828103915082811015613cff576001820391505b509250929050565b6000808260000383169050808381613d1b57fe5b049250808581613d2757fe5b0494506001818260000381613d3857fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613db38484600085613dbc565b90509392505050565b6060613dc785613fc2565b613e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613e895780518252602082019150602081019050602083039250613e66565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613eeb576040519150601f19603f3d011682016040523d82523d6000602084013e613ef0565b606091505b50915091508115613f05578092505050613fba565b600081511115613f185780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f7f578082015181840152602081019050613f64565b50505050905090810190601f168015613fac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735061796f75742063616e6e6f742062652061626f7665203130302070657263656e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209ab6426bf765d6d6c89a0d5c120196f0672b57ead41214ec4fd4bf55fcf7f38164736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000dc5189ec8cde5732a01f0f592e927b3043705510000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc13000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _ASG (address): 0x0DC5189Ec8CDe5732a01F0F592e927B304370551
Arg [1] : _principle (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
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] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [2] : 0000000000000000000000009d5818af130705f95444d78a55b4f3d85cbfcc13
Arg [3] : 000000000000000000000000e3dfece2fc903a1280650c05ab471c0413607c1d
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
24385:17857:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25270:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41345:427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;886:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1109:154;;;:::i;:::-;;25200:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30226:365;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29253:777;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33686:1220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25800:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25885:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1271:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25669:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40719:454;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1610:218;;;:::i;:::-;;25340:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28291:683;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40069:105;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25722:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37620:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38781:351;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31253:2284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39643:327;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25417:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41950:289;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25588:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25951:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39254:268;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30724:310;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25830:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25489:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37927:270;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37356:135;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40276:282;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26127:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26042;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25270:34;;;:::o;41345:427::-;41441:22;41481:21;41505:28;41522:10;41505:16;:28::i;:::-;41481:52;;41544:14;41561:8;:20;41570:10;41561:20;;;;;;;;;;;;;;;:27;;;41544:44;;41622:5;41605:13;:22;41601:164;;41661:6;41644:23;;41601:164;;;41717:36;41747:5;41717:25;41728:13;41717:6;:10;;:25;;;;:::i;:::-;:29;;:36;;;;:::i;:::-;41700:53;;41601:164;41345:427;;;;;:::o;886:89::-;934:7;961:6;;;;;;;;;;;954:13;;886:89;:::o;1109:154::-;1034:10;1024:20;;:6;;;;;;;;;;:20;;;1016:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1222:1:::1;1190:35;;1206:6;::::0;::::1;;;;;;;;1190:35;;;;;;;;;;;;1253:1;1236:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1109:154::o:0;25200:28::-;;;:::o;30226:365::-;1034:10;1024:20;;:6;;;;;;;;;;:20;;;1016:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30406:177:::1;;;;;;;;30433:9;30406:177;;;;;;30463:10;30406:177;;;;30496:7;30406:177;;;;30526:7;30406:177;;;;30559:12;30406:177;;::::0;30393:10:::1;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30226:365:::0;;;;:::o;29253:777::-;1034:10;1024:20;;:6;;;;;;;;;;:20;;;1016:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29385:17:::1;29371:31;;;;;;;;:10;:31;;;;;;;;;29367:656;;;29455:5;29445:6;:15;;29437:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29536:6;29516:5;:17;;:26;;;;29367:656;;;29578:16;29564:30;;;;;;;;:10;:30;;;;;;;;;29560:463;;;29647:6;29637;:16;;29629:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29725:6;29707:5;:15;;:24;;;;29560:463;;;29767:13;29753:27;;;;;;;;:10;:27;;;;;;;;;29749:274;;;29833:5;29823:6;:15;;29815:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29898:6;29886:5;:9:::0;::::1;:18;;;;29749:274;;;29940:14;29926:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;29922:101;;;30005:6;29989:5;:13;;:22;;;;29922:101;29749:274;29560:463;29367:656;29253:777:::0;;:::o;33686:1220::-;33771:7;33796:16;;:::i;:::-;33815:8;:20;33824:10;33815:20;;;;;;;;;;;;;;;33796:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33846:21;33870:28;33887:10;33870:16;:28::i;:::-;33846:52;;33992:5;33975:13;:22;33971:928;;34053:8;:20;34062:10;34053:20;;;;;;;;;;;;;;;;34046:27;;;;;;;;;;;;;;;;;;;;;;;;;;34126:10;34113:40;;;34138:4;:11;;;34151:1;34113:40;;;;;;;;;;;;;;;;;;;;;;;;34193:44;34205:10;34217:6;34225:4;:11;;;34193;:44::i;:::-;34186:51;;;;;;33971:928;34367:14;34384:41;34419:5;34384:30;34400:13;34384:4;:11;;;:15;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;34367:58;;34508:235;;;;;;;;34540:23;34556:6;34540:4;:11;;;:15;;:23;;;;:::i;:::-;34508:235;;;;34591:50;34608:32;34625:4;:14;;;34608:12;:16;;:32;;;;:::i;:::-;34591:4;:12;;;:16;;:50;;;;:::i;:::-;34508:235;;;;34671:12;34508:235;;;;34713:4;:14;;;34508:235;;;34485:8;:20;34494:10;34485:20;;;;;;;;;;;;;;;:258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34778:10;34765:61;;;34790:6;34798:8;:20;34807:10;34798:20;;;;;;;;;;;;;;;:27;;;34765:61;;;;;;;;;;;;;;;;;;;;;;;;34848:39;34860:10;34872:6;34880;34848:11;:39::i;:::-;34841:46;;;;;33686:1220;;;;;:::o;25800:21::-;;;;;;;;;;;;;:::o;25885:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1271:331::-;1034:10;1024:20;;:6;;;;;;;;;;:20;;;1016:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1444:1:::1;1423:23;;:9;:23;;;;1401:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1552:9;1528:34;;1544:6;::::0;::::1;;;;;;;;1528:34;;;;;;;;;;;;1585:9;1573;;:21;;;;;;;;;;;;;;;;;;1271:331:::0;:::o;25669:22::-;;;;;;;;;;;;;:::o;40719:454::-;40813:22;40853:16;;:::i;:::-;40872:8;:20;40881:10;40872:20;;;;;;;;;;;;;;;40853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40903:23;40929:32;40946:4;:14;;;40929:12;:16;;:32;;;;:::i;:::-;40903:58;;40972:15;40990:4;:12;;;40972:30;;41029:1;41019:7;:11;41015:151;;;41064:39;41095:7;41064:26;41084:5;41064:15;:19;;:26;;;;:::i;:::-;:30;;:39;;;;:::i;:::-;41047:56;;41015:151;;;41153:1;41136:18;;41015:151;40719:454;;;;;;:::o;1610:218::-;1693:9;;;;;;;;;;;1679:23;;:10;:23;;;1671:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1781:9;;;;;;;;;;;1757:34;;1773:6;;;;;;;;;;1757:34;;;;;;;;;;;;1811:9;;;;;;;;;;;1802:6;;:18;;;;;;;;;;;;;;;;;;1610:218::o;25340:33::-;;;:::o;28291:683::-;1034:10;1024:20;;:6;;;;;;;;;;:20;;;1016:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28599:1:::1;28574:5;:21;;;:26;28566:71;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28656:240;;;;;;;;28694:16;28656:240;;;;28738:12;28656:240;;;;28779:13;28656:240;;;;28818:10;28656:240;;;;28848:4;28656:240;;;;28876:8;28656:240;;::::0;28648:5:::1;:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28919:12;28907:9;:24;;;;28954:12;28942:9;:24;;;;28291:683:::0;;;;;;;:::o;40069:105::-;40113:7;40140:26;40154:11;:9;:11::i;:::-;40140:9;;:13;;:26;;;;:::i;:::-;40133:33;;40069:105;:::o;25722:28::-;;;;;;;;;;;;;:::o;37620:204::-;37676:7;37716:100;37797:4;37716:58;:40;37736:6;37744:11;:9;:11::i;:::-;37716:19;:40::i;:::-;:56;:58::i;:::-;:62;;:100;;;;:::i;:::-;37696:120;;37620:204;;;:::o;38781:351::-;38828:14;38859:15;38855:270;;;38900:113;39009:3;38900:86;38950:14;38934:40;;;38975:9;38934:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38900:11;:9;:11::i;:::-;:33;;:86;;;;:::i;:::-;:108;;:113;;;;:::i;:::-;38891:122;;38855:270;;;39055:58;39109:3;39055:49;39082:9;39075:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39071:32;;:2;:32;39055:11;:9;:11::i;:::-;:15;;:49;;;;:::i;:::-;:53;;:58;;;;:::i;:::-;39046:67;;38855:270;38781:351;:::o;31253:2284::-;31378:7;31428:1;31406:24;;:10;:24;;;;31398:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31463:11;:9;:11::i;:::-;31506:5;:13;;;31493:9;;:26;;31485:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31557:18;31578:16;:14;:16::i;:::-;31557:37;;31628:19;31650:12;:10;:12::i;:::-;31628:34;;31710:11;31697:9;:24;;31675:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31820:13;31846:8;31836:28;;;31865:9;31876:7;31836:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31820:64;;31895:14;31912:16;31922:5;31912:9;:16::i;:::-;31895:33;;31991:8;31981:6;:18;;31973:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32094:11;:9;:11::i;:::-;32084:6;:21;;32076:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32220:11;32234:32;32260:5;32234:21;32245:5;:9;;;32234:6;:10;;:21;;;;:::i;:::-;:25;;:32;;;;:::i;:::-;32220:46;;32277:14;32294:26;32316:3;32294:17;32304:6;32294:5;:9;;:17;;;;:::i;:::-;:21;;:26;;;;:::i;:::-;32277:43;;32501:70;32536:10;32556:4;32563:7;32508:9;32501:34;;;;:70;;;;;;:::i;:::-;32589:9;32582:25;;;32616:8;32627:7;32582:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32656:8;32646:27;;;32674:7;32683:9;32694:6;32646:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32725:1;32718:3;:8;32714:117;;32785:34;32810:3;32815;32792;32785:24;;;;:34;;;;;:::i;:::-;32714:117;32891:20;32905:5;32891:9;;:13;;:20;;;;:::i;:::-;32879:9;:32;;;;32984:194;;;;;;;;33012:39;33044:6;33012:8;:20;33021:10;33012:20;;;;;;;;;;;;;;;:27;;;:31;;:39;;;;:::i;:::-;32984:194;;;;33075:5;:17;;;32984:194;;;;33118:12;32984:194;;;;33156:10;32984:194;;;32961:8;:20;32970:10;32961:20;;;;;;;;;;;;;;;:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33354:10;33304:35;33321:5;:17;;;33304:12;:16;;:35;;;;:::i;:::-;33283:6;33235:140;33261:7;33235:140;;;;;;;;;;;;;;;;;;33440:11;:9;:11::i;:::-;33426:12;:10;:12::i;:::-;33408:16;:14;:16::i;:::-;33391:61;;;;;;;;;;33465:8;:6;:8::i;:::-;33523:6;33516:13;;;;;;;;31253:2284;;;;;:::o;39643:327::-;39699:7;39723:15;39719:244;;;39779:121;39896:3;39779:90;39833:14;39817:40;;;39858:9;39817:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39779:11;:9;:11::i;:::-;:37;;:90;;;;:::i;:::-;:116;;:121;;;;:::i;:::-;39755:145;;;;39719:244;39940:11;:9;:11::i;:::-;39933:18;;39643:327;;:::o;25417:28::-;;;:::o;41950:289::-;42010:4;42045:3;42035:13;;:6;:13;;;;42027:22;;;;;;42078:9;42068:19;;:6;:19;;;;42060:28;;;;;;42099:110;42141:3;42166:6;42159:24;;;42192:4;42159:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42106:6;42099:27;;;;:110;;;;;:::i;:::-;42227:4;42220:11;;41950:289;;;:::o;25588:39::-;;;:::o;25951:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39254:268::-;39296:18;39327:14;39351:3;39344:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39327:42;;39393:121;39509:4;39393:97;:65;39427:22;39445:3;39427:13;:11;:13::i;:::-;:17;;:22;;;;:::i;:::-;39451:6;39393:33;:65::i;:::-;:95;:97::i;:::-;:115;;:121;;;;:::i;:::-;39380:134;;39254:268;;:::o;30724:310::-;1034:10;1024:20;;:6;;;;;;;;;;:20;;;1016:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30835:1:::1;30815:22;;:8;:22;;;;30807:31;;;::::0;::::1;;30853:7;30849:178;;;30889:4;30877:9;;:16;;;;;;;;;;;;;;;;;;30924:8;30908:13;;:24;;;;;;;;;;;;;;;;;;30849:178;;;30977:5;30965:9;;:17;;;;;;;;;;;;;;;;;;31007:8;30997:7;;:18;;;;;;;;;;;;;;;;;;30849:178;30724:310:::0;;:::o;25830:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25489:37::-;;;:::o;37927:270::-;37969:14;38005:87;38078:3;38005:54;38048:10;38005:38;38031:11;:9;:11::i;:::-;38005:5;:21;;;:25;;:38;;;;:::i;:::-;:42;;:54;;;;:::i;:::-;:58;;:87;;;;:::i;:::-;37996:96;;38116:5;:18;;;38107:6;:27;38103:87;;;38160:5;:18;;;38151:27;;38103:87;37927:270;:::o;37356:135::-;37398:7;37425:58;37476:6;37425:46;37455:5;:15;;;37432:3;37425:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:46;;;;:::i;:::-;:50;;:58;;;;:::i;:::-;37418:65;;37356:135;:::o;40276:282::-;40318:14;40345:23;40371:27;40388:9;;40371:12;:16;;:27;;;;:::i;:::-;40345:53;;40418;40453:5;:17;;;40418:30;40432:15;40418:9;;:13;;:30;;;;:::i;:::-;:34;;:53;;;;:::i;:::-;40409:62;;40495:9;;40486:6;:18;40482:69;;;40530:9;;40521:18;;40482:69;40276:282;;:::o;26127:24::-;;;;:::o;26042:::-;;;;:::o;2426:250::-;2484:7;2513:1;2508;:6;2504:47;;;2538:1;2531:8;;;;2504:47;2563:9;2579:1;2575;:5;2563:17;;2608:1;2603;2599;:5;;;;;;:10;2591:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2667:1;2660:8;;;2426:250;;;;;:::o;2684:132::-;2742:7;2769:39;2773:1;2776;2769:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2762:46;;2684:132;;;;:::o;35126:745::-;35249:7;35274:6;35269:570;;35351:3;35344:20;;;35365:10;35377:7;35344:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35269:570;;;35476:9;;;;;;;;;;;35472:356;;;35560:3;35553:19;;;35573:13;;;;;;;;;;;35588:7;35553:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35630:13;;;;;;;;;;;35615:35;;;35651:7;35660:10;35615:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35472:356;;;35719:3;35712:19;;;35732:7;;;;;;;;;;;35741;35712:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35777:7;;;;;;;;;;;35768:23;;;35792:7;35801:10;35768:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35472:356;35269:570;35856:7;35849:14;;35126:745;;;;;:::o;2048:136::-;2106:7;2133:43;2137:1;2140;2133:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2126:50;;2048:136;;;;:::o;22915:751::-;23023:16;;:::i;:::-;23079:1;23065:11;:15;23057:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23151:1;23138:9;:14;23134:50;;;23161:23;;;;;;;;23182:1;23161:23;;;;;23154:30;;;;23134:50;23222:2;23201:24;;:9;:24;23197:462;;23242:14;23287:11;22296:3;23260:23;;:9;:23;;23259:39;;;;;;23242:56;;23339:2;23321:21;;:6;:21;;23313:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23399:26;;;;;;;;23417:6;23399:26;;;;;23392:33;;;;;23197:462;23458:14;23475:45;23491:9;22338:31;23508:11;23475:15;:45::i;:::-;23458:62;;23561:2;23543:21;;:6;:21;;23535:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23621:26;;;;;;;;23639:6;23621:26;;;;;23614:33;;;22915:751;;;;;:::o;22734:173::-;22832:7;22883:16;22872:4;:7;;;22864:16;;:35;;;;;;22857:42;;22734:173;;;:::o;37095:122::-;37148:26;37162:11;:9;:11::i;:::-;37148:9;;:13;;:26;;;;:::i;:::-;37136:9;:38;;;;37197:12;37185:9;:24;;;;37095:122::o;38324:352::-;38364:14;38400:87;38473:3;38400:54;38443:10;38400:38;38426:11;:9;:11::i;:::-;38400:5;:21;;;:25;;:38;;;;:::i;:::-;:42;;:54;;;;:::i;:::-;:58;;:87;;;;:::i;:::-;38391:96;;38511:5;:18;;;38502:6;:27;38498:171;;;38555:5;:18;;;38546:27;;38498:171;;;38617:1;38595:5;:18;;;:23;38591:78;;38656:1;38635:5;:18;;:22;;;;38591:78;38498:171;38324:352;:::o;18782:285::-;18926:133;18960:5;19003:27;;;19032:4;19038:2;19042:5;18980:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18926:19;:133::i;:::-;18782:285;;;;:::o;18526:248::-;18643:123;18677:5;18720:23;;;18745:2;18749:5;18697:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18643:19;:123::i;:::-;18526:248;;;:::o;1859:181::-;1917:7;1937:9;1953:1;1949;:5;1937:17;;1978:1;1973;:6;;1965:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2031:1;2024:8;;;1859:181;;;;:::o;35963:1071::-;36001:22;36026:43;36051:10;:17;;;36026:10;:20;;;:24;;:43;;;;:::i;:::-;36001:68;;36103:1;36084:10;:15;;;:20;;:54;;;;;36124:14;36108:12;:30;;36084:54;36080:947;;;36155:15;36173:5;:21;;;36155:39;;36213:10;:14;;;;;;;;;;;;36209:564;;;36272:82;36320:10;:15;;;36272:5;:21;;;:25;;:82;;;;:::i;:::-;36248:5;:21;;:106;;;;36402:10;:17;;;36377:5;:21;;;:42;36373:110;;36462:1;36444:10;:15;;:19;;;;36373:110;36209:564;;;36547:82;36595:10;:15;;;36547:5;:21;;;:25;;:82;;;;:::i;:::-;36523:5;:21;;:106;;;;36677:10;:17;;;36652:5;:21;;;:42;36648:110;;36737:1;36719:10;:15;;:19;;;;36648:110;36209:564;36810:12;36787:10;:20;;:35;;;;36842:173;36886:7;36912:5;:21;;;36952:10;:15;;;36986:10;:14;;;;;;;;;;;;36842:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36080:947;;35963:1071;:::o;2824:223::-;2944:7;2976:1;2972;:5;2979:12;2964:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3003:9;3019:1;3015;:5;;;;;;3003:17;;3038:1;3031:8;;;2824:223;;;;;:::o;2192:226::-;2312:7;2345:1;2340;:6;;2348:12;2332:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2372:9;2388:1;2384;:5;2372:17;;2409:1;2402:8;;;2192:226;;;;;:::o;21772:347::-;21878:7;21899:9;21910;21923:13;21931:1;21934;21923:7;:13::i;:::-;21898:38;;;;21947:10;21973:1;21960:15;;;;;21970:1;21967;21960:15;21947:28;;21995:1;21990:2;:6;21986:18;;;22003:1;21998:6;;;;21986:18;22020:2;22015:7;;;;22045:1;22041;:5;22033:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22095:16;22103:1;22106;22109;22095:7;:16::i;:::-;22088:23;;;;;21772:347;;;;;:::o;20484:517::-;20565:23;20591:106;20633:4;20591:106;;;;;;;;;;;;;;;;;20599:5;20591:27;;;;:106;;;;;:::i;:::-;20565:132;;20732:1;20712:10;:17;:21;20708:286;;;20885:10;20874:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20848:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20708:286;20484:517;;;:::o;21032:242::-;21120:9;21131;21158:10;21192:2;21171:25;;;;;21181:1;21178;21171:25;21158:38;;21215:1;21211;:5;21207:9;;21236:1;21231:2;:6;21227:10;;21257:1;21252:2;:6;21248:18;;;21265:1;21260:6;;;;21248:18;21032:242;;;;;;:::o;21282:482::-;21388:7;21408:12;21428:1;21427:2;;21423:1;:6;21408:21;;21445:4;21440:9;;;;;;;;;21465:4;21460:9;;;;;;;;;21507:1;21500:4;21492;21491:5;;21490:14;;;;;;:18;21485:1;:24;21480:29;;;;21520:9;21532:1;21520:13;;21557:1;21553;:5;21549:1;:9;21544:14;;;;21582:1;21578;:5;21574:1;:9;21569:14;;;;21607:1;21603;:5;21599:1;:9;21594:14;;;;21632:1;21628;:5;21624:1;:9;21619:14;;;;21657:1;21653;:5;21649:1;:9;21644:14;;;;21682:1;21678;:5;21674:1;:9;21669:14;;;;21707:1;21703;:5;21699:1;:9;21694:14;;;;21732:1;21728;:5;21724:1;:9;21719:14;;;;21755:1;21751;:5;21744:12;;;;21282:482;;;;;:::o;4706:230::-;4843:12;4875:53;4898:6;4906:4;4912:1;4915:12;4875:22;:53::i;:::-;4868:60;;4706:230;;;;;:::o;5948:1044::-;6121:12;6154:18;6165:6;6154:10;:18::i;:::-;6146:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6280:12;6294:23;6321:6;:11;;6340:8;6364:4;6321:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6279:100;;;;6394:7;6390:595;;;6425:10;6418:17;;;;;;6390:595;6559:1;6539:10;:17;:21;6535:439;;;6802:10;6796:17;6863:15;6850:10;6846:2;6842:19;6835:44;6750:148;6945:12;6938:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5948:1044;;;;;;;:::o;3762:253::-;3822:4;3839:12;3963:7;3951:20;3943:28;;4006:1;3999:4;:8;3992:15;;;3762:253;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://9ab6426bf765d6d6c89a0d5c120196f0672b57ead41214ec4fd4bf55fcf7f381
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.