Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
|||
|---|---|---|---|---|---|---|---|---|
| Balance Of | 24560823 | 4 hrs ago | 0 ETH | |||||
| Transfer From | 24560823 | 4 hrs ago | 0 ETH | |||||
| Balance Of | 24560823 | 4 hrs ago | 0 ETH | |||||
| Approve | 24560821 | 4 hrs ago | 0 ETH | |||||
| Approve | 24560303 | 6 hrs ago | 0 ETH | |||||
| Balance Of | 24557491 | 15 hrs ago | 0 ETH | |||||
| Balance Of | 24557491 | 15 hrs ago | 0 ETH | |||||
| Transfer | 24557491 | 15 hrs ago | 0 ETH | |||||
| Balance Of | 24557491 | 15 hrs ago | 0 ETH | |||||
| Balance Of | 24557491 | 15 hrs ago | 0 ETH | |||||
| Transfer From | 24557491 | 15 hrs ago | 0 ETH | |||||
| Balance Of | 24554809 | 24 hrs ago | 0 ETH | |||||
| Transfer | 24554809 | 24 hrs ago | 0 ETH | |||||
| Balance Of | 24554809 | 24 hrs ago | 0 ETH | |||||
| Transfer | 24554809 | 24 hrs ago | 0 ETH | |||||
| Transfer | 24554809 | 24 hrs ago | 0 ETH | |||||
| Transfer From | 24554809 | 24 hrs ago | 0 ETH | |||||
| Approve | 24554806 | 24 hrs ago | 0 ETH | |||||
| Balance Of | 24554264 | 26 hrs ago | 0 ETH | |||||
| Transfer | 24554264 | 26 hrs ago | 0 ETH | |||||
| Balance Of | 24553627 | 28 hrs ago | 0 ETH | |||||
| Balance Of | 24553627 | 28 hrs ago | 0 ETH | |||||
| Transfer | 24553627 | 28 hrs ago | 0 ETH | |||||
| Balance Of | 24553627 | 28 hrs ago | 0 ETH | |||||
| Balance Of | 24553627 | 28 hrs ago | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract contains unverified libraries: CstLibrary
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
CardstackToken
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-09-10
*/
pragma solidity ^0.4.13;
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
// Gas optimization: this is cheaper than asserting 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (_a == 0) {
return 0;
}
c = _a * _b;
assert(c / _a == _b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
// assert(_b > 0); // Solidity automatically throws when dividing by 0
// uint256 c = _a / _b;
// assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
return _a / _b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
assert(_b <= _a);
return _a - _b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
c = _a + _b;
assert(c >= _a);
return c;
}
}
contract Initializable {
/**
* @dev Indicates if the contract has been initialized.
*/
bool public initialized;
/**
* @dev Modifier to use in the initialization function of a contract.
*/
modifier isInitializer() {
require(!initialized, "Contract instance has already been initialized");
_;
initialized = true;
}
}
contract Administratable {
using SafeMath for uint256;
// zOS requires that the variables are never removed nor order changed
// Since this is a parent contract, no new variables can be added here
address internal constant primaryInitializer = 0x0AEaF8c2Fe778797CD5464E7EB8351d28da2E823;
address internal constant stagingInitializer = 0x1E65F71b024937b988fdba09814d60049e0Fc59d;
address public owner;
bool public adminsInitialized;
address[] public adminsForIndex;
address[] public superAdminsForIndex;
mapping (address => bool) public admins;
mapping (address => bool) public superAdmins;
mapping (address => bool) private processedAdmin;
mapping (address => bool) private processedSuperAdmin;
event AddAdmin(address indexed admin);
event RemoveAdmin(address indexed admin);
event AddSuperAdmin(address indexed admin);
event RemoveSuperAdmin(address indexed admin);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
modifier onlyInitializers() {
require(msg.sender == primaryInitializer ||
msg.sender == stagingInitializer);
_;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
modifier onlyAdmins {
if (msg.sender != owner && !superAdmins[msg.sender] && !admins[msg.sender]) revert();
_;
}
modifier onlySuperAdmins {
if (msg.sender != owner && !superAdmins[msg.sender]) revert();
_;
}
constructor() public {
owner = msg.sender;
}
function addSuperAdmin(address admin) public onlySuperAdmins {
_addSuperAdmin(admin);
emit AddSuperAdmin(admin);
}
function removeSuperAdmin(address admin) public onlySuperAdmins {
require(admin != address(0));
superAdmins[admin] = false;
emit RemoveSuperAdmin(admin);
}
function addAdmin(address admin) public onlySuperAdmins {
require(admin != address(0));
admins[admin] = true;
if (!processedAdmin[admin]) {
adminsForIndex.push(admin);
processedAdmin[admin] = true;
}
emit AddAdmin(admin);
}
function removeAdmin(address admin) public onlySuperAdmins {
require(admin != address(0));
admins[admin] = false;
emit RemoveAdmin(admin);
}
function transferOwnership(address _newOwner) public onlyOwner {
require(_newOwner != address(0));
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
function totalSuperAdminsMapping() public view returns (uint256) {
return superAdminsForIndex.length;
}
function totalAdminsMapping() public view returns (uint256) {
return adminsForIndex.length;
}
// Accepting a function param to set initial owner/admins
// is a potential security vulnerability when using initialize
// pattern (which is just a public function). So we hard-code
// our initial admin addresses and use zOS to manage this list.
function initializeAdmins() internal {
require(!adminsInitialized, "Contract instance has already initialized the admins");
owner = primaryInitializer;
_addSuperAdmin(stagingInitializer);
adminsInitialized = true;
}
function _addSuperAdmin(address admin) internal {
require(admin != address(0));
superAdmins[admin] = true;
if (!processedSuperAdmin[admin]) {
superAdminsForIndex.push(admin);
processedSuperAdmin[admin] = true;
}
}
}
contract Configurable {
function configureFromStorage() public returns (bool);
}
library CstLibrary {
using SafeMath for uint256;
function getTokenName(address _storage) public view returns(bytes32) {
return ExternalStorage(_storage).getBytes32Value("cstTokenName");
}
function setTokenName(address _storage, bytes32 tokenName) public {
ExternalStorage(_storage).setBytes32Value("cstTokenName", tokenName);
}
function getTokenSymbol(address _storage) public view returns(bytes32) {
return ExternalStorage(_storage).getBytes32Value("cstTokenSymbol");
}
function setTokenSymbol(address _storage, bytes32 tokenName) public {
ExternalStorage(_storage).setBytes32Value("cstTokenSymbol", tokenName);
}
function getBuyPrice(address _storage) public view returns(uint256) {
return ExternalStorage(_storage).getUIntValue("cstBuyPrice");
}
function setBuyPrice(address _storage, uint256 value) public {
ExternalStorage(_storage).setUIntValue("cstBuyPrice", value);
}
function getCirculationCap(address _storage) public view returns(uint256) {
return ExternalStorage(_storage).getUIntValue("cstCirculationCap");
}
function setCirculationCap(address _storage, uint256 value) public {
ExternalStorage(_storage).setUIntValue("cstCirculationCap", value);
}
function getBalanceLimit(address _storage) public view returns(uint256) {
return ExternalStorage(_storage).getUIntValue("cstBalanceLimit");
}
function setBalanceLimit(address _storage, uint256 value) public {
ExternalStorage(_storage).setUIntValue("cstBalanceLimit", value);
}
function getFoundation(address _storage) public view returns(address) {
return ExternalStorage(_storage).getAddressValue("cstFoundation");
}
function setFoundation(address _storage, address value) public {
ExternalStorage(_storage).setAddressValue("cstFoundation", value);
}
function getAllowance(address _storage, address account, address spender) public view returns (uint256) {
return ExternalStorage(_storage).getMultiLedgerValue("cstAllowance", account, spender);
}
function setAllowance(address _storage, address account, address spender, uint256 allowance) public {
ExternalStorage(_storage).setMultiLedgerValue("cstAllowance", account, spender, allowance);
}
function getCustomBuyerLimit(address _storage, address buyer) public view returns (uint256) {
return ExternalStorage(_storage).getLedgerValue("cstCustomBuyerLimit", buyer);
}
function setCustomBuyerLimit(address _storage, address buyer, uint256 value) public {
ExternalStorage(_storage).setLedgerValue("cstCustomBuyerLimit", buyer, value);
}
function getCustomBuyerForIndex(address _storage, uint256 index) public view returns (address) {
return ExternalStorage(_storage).ledgerEntryForIndex(keccak256("cstCustomBuyerLimit"), index);
}
function getCustomBuyerMappingCount(address _storage) public view returns(uint256) {
return ExternalStorage(_storage).getLedgerCount("cstCustomBuyerLimit");
}
function getApprovedBuyer(address _storage, address buyer) public view returns (bool) {
return ExternalStorage(_storage).getBooleanMapValue("cstApprovedBuyer", buyer);
}
function setApprovedBuyer(address _storage, address buyer, bool value) public {
ExternalStorage(_storage).setBooleanMapValue("cstApprovedBuyer", buyer, value);
}
function getApprovedBuyerForIndex(address _storage, uint256 index) public view returns (address) {
return ExternalStorage(_storage).booleanMapEntryForIndex(keccak256("cstApprovedBuyer"), index);
}
function getApprovedBuyerMappingCount(address _storage) public view returns(uint256) {
return ExternalStorage(_storage).getBooleanMapCount("cstApprovedBuyer");
}
function getTotalUnvestedAndUnreleasedTokens(address _storage) public view returns(uint256) {
return ExternalStorage(_storage).getUIntValue("cstUnvestedAndUnreleasedTokens");
}
function setTotalUnvestedAndUnreleasedTokens(address _storage, uint256 value) public {
ExternalStorage(_storage).setUIntValue("cstUnvestedAndUnreleasedTokens", value);
}
function vestingMappingSize(address _storage) public view returns(uint256) {
return ExternalStorage(_storage).getLedgerCount("cstFullyVestedAmount");
}
function vestingBeneficiaryForIndex(address _storage, uint256 index) public view returns(address) {
return ExternalStorage(_storage).ledgerEntryForIndex(keccak256("cstFullyVestedAmount"), index);
}
function releasableAmount(address _storage, address beneficiary) public view returns (uint256) {
uint256 releasedAmount = getVestingReleasedAmount(_storage, beneficiary);
return vestedAvailableAmount(_storage, beneficiary).sub(releasedAmount);
}
function vestedAvailableAmount(address _storage, address beneficiary) public view returns (uint256) {
uint256 start = getVestingStart(_storage, beneficiary);
uint256 fullyVestedAmount = getFullyVestedAmount(_storage, beneficiary);
if (start == 0 || fullyVestedAmount == 0) {
return 0;
}
uint256 duration = getVestingDuration(_storage, beneficiary);
if (duration == 0) {
return 0;
}
uint256 cliff = getVestingCliff(_storage, beneficiary);
uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary);
if (now < cliff || (revokeDate > 0 && revokeDate < cliff)) {
return 0;
} else if (revokeDate > 0 && revokeDate > cliff) {
return fullyVestedAmount.mul(revokeDate.sub(start)).div(duration);
} else if (now >= start.add(duration)) {
return fullyVestedAmount;
} else {
return fullyVestedAmount.mul(now.sub(start)).div(duration);
}
}
function vestedAmount(address _storage, address beneficiary) public view returns (uint256) {
uint256 start = getVestingStart(_storage, beneficiary);
uint256 fullyVestedAmount = getFullyVestedAmount(_storage, beneficiary);
if (start == 0 || fullyVestedAmount == 0) {
return 0;
}
uint256 duration = getVestingDuration(_storage, beneficiary);
if (duration == 0) {
return 0;
}
uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary);
if (now <= start) {
return 0;
} else if (revokeDate > 0) {
return fullyVestedAmount.mul(revokeDate.sub(start)).div(duration);
} else if (now >= start.add(duration)) {
return fullyVestedAmount;
} else {
return fullyVestedAmount.mul(now.sub(start)).div(duration);
}
}
function canGrantVestedTokens(address _storage, address beneficiary) public view returns (bool) {
uint256 existingFullyVestedAmount = getFullyVestedAmount(_storage, beneficiary);
if (existingFullyVestedAmount == 0) {
return true;
}
uint256 existingVestedAmount = vestedAvailableAmount(_storage, beneficiary);
uint256 existingReleasedAmount = getVestingReleasedAmount(_storage, beneficiary);
uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary);
if (revokeDate > 0 ||
(existingVestedAmount == existingFullyVestedAmount &&
existingReleasedAmount == existingFullyVestedAmount)) {
return true;
}
return false;
}
function canRevokeVesting(address _storage, address beneficiary) public view returns (bool) {
bool isRevocable = getVestingRevocable(_storage, beneficiary);
uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary);
uint256 start = getVestingStart(_storage, beneficiary);
uint256 duration = getVestingDuration(_storage, beneficiary);
return start > 0 &&
isRevocable &&
revokeDate == 0 &&
now < start.add(duration);
}
function revokeVesting(address _storage, address beneficiary) public {
require(canRevokeVesting(_storage, beneficiary));
uint256 totalUnvestedAndUnreleasedAmount = getTotalUnvestedAndUnreleasedTokens(_storage);
uint256 unvestedAmount = getFullyVestedAmount(_storage, beneficiary).sub(vestedAvailableAmount(_storage, beneficiary));
setVestingRevokeDate(_storage, beneficiary, now);
setTotalUnvestedAndUnreleasedTokens(_storage, totalUnvestedAndUnreleasedAmount.sub(unvestedAmount));
}
function getVestingSchedule(address _storage, address _beneficiary) public
view returns (uint256 startDate,
uint256 cliffDate,
uint256 durationSec,
uint256 fullyVestedAmount,
uint256 releasedAmount,
uint256 revokeDate,
bool isRevocable) {
startDate = getVestingStart(_storage, _beneficiary);
cliffDate = getVestingCliff(_storage, _beneficiary);
durationSec = getVestingDuration(_storage, _beneficiary);
fullyVestedAmount = getFullyVestedAmount(_storage, _beneficiary);
releasedAmount = getVestingReleasedAmount(_storage, _beneficiary);
revokeDate = getVestingRevokeDate(_storage, _beneficiary);
isRevocable = getVestingRevocable(_storage, _beneficiary);
}
function setVestingSchedule(address _storage,
address beneficiary,
uint256 fullyVestedAmount,
uint256 startDate,
uint256 cliffDate,
uint256 duration,
bool isRevocable) public {
require(canGrantVestedTokens(_storage, beneficiary));
uint256 totalUnvestedAndUnreleasedAmount = getTotalUnvestedAndUnreleasedTokens(_storage);
setTotalUnvestedAndUnreleasedTokens(_storage, totalUnvestedAndUnreleasedAmount.add(fullyVestedAmount));
ExternalStorage(_storage).setLedgerValue("cstVestingStart", beneficiary, startDate);
ExternalStorage(_storage).setLedgerValue("cstVestingCliff", beneficiary, cliffDate);
ExternalStorage(_storage).setLedgerValue("cstVestingDuration", beneficiary, duration);
ExternalStorage(_storage).setLedgerValue("cstFullyVestedAmount", beneficiary, fullyVestedAmount);
ExternalStorage(_storage).setBooleanMapValue("cstVestingRevocable", beneficiary, isRevocable);
setVestingRevokeDate(_storage, beneficiary, 0);
setVestingReleasedAmount(_storage, beneficiary, 0);
}
function releaseVestedTokens(address _storage, address beneficiary) public {
uint256 unreleased = releasableAmount(_storage, beneficiary);
uint256 releasedAmount = getVestingReleasedAmount(_storage, beneficiary);
uint256 totalUnvestedAndUnreleasedAmount = getTotalUnvestedAndUnreleasedTokens(_storage);
releasedAmount = releasedAmount.add(unreleased);
setVestingReleasedAmount(_storage, beneficiary, releasedAmount);
setTotalUnvestedAndUnreleasedTokens(_storage, totalUnvestedAndUnreleasedAmount.sub(unreleased));
}
function getVestingStart(address _storage, address beneficiary) public view returns(uint256) {
return ExternalStorage(_storage).getLedgerValue("cstVestingStart", beneficiary);
}
function getVestingCliff(address _storage, address beneficiary) public view returns(uint256) {
return ExternalStorage(_storage).getLedgerValue("cstVestingCliff", beneficiary);
}
function getVestingDuration(address _storage, address beneficiary) public view returns(uint256) {
return ExternalStorage(_storage).getLedgerValue("cstVestingDuration", beneficiary);
}
function getFullyVestedAmount(address _storage, address beneficiary) public view returns(uint256) {
return ExternalStorage(_storage).getLedgerValue("cstFullyVestedAmount", beneficiary);
}
function getVestingRevocable(address _storage, address beneficiary) public view returns(bool) {
return ExternalStorage(_storage).getBooleanMapValue("cstVestingRevocable", beneficiary);
}
function setVestingReleasedAmount(address _storage, address beneficiary, uint256 value) public {
ExternalStorage(_storage).setLedgerValue("cstVestingReleasedAmount", beneficiary, value);
}
function getVestingReleasedAmount(address _storage, address beneficiary) public view returns(uint256) {
return ExternalStorage(_storage).getLedgerValue("cstVestingReleasedAmount", beneficiary);
}
function setVestingRevokeDate(address _storage, address beneficiary, uint256 value) public {
ExternalStorage(_storage).setLedgerValue("cstVestingRevokeDate", beneficiary, value);
}
function getVestingRevokeDate(address _storage, address beneficiary) public view returns(uint256) {
return ExternalStorage(_storage).getLedgerValue("cstVestingRevokeDate", beneficiary);
}
function getRewardsContractHash(address _storage) public view returns (bytes32) {
return ExternalStorage(_storage).getBytes32Value("cstRewardsContractHash");
}
function setRewardsContractHash(address _storage, bytes32 rewardsContractHash) public {
ExternalStorage(_storage).setBytes32Value("cstRewardsContractHash", rewardsContractHash);
}
}
contract Displayable {
function bytes32ToString(bytes32 x) public pure returns (string) {
bytes memory bytesString = new bytes(32);
uint256 charCount = 0;
for (uint256 j = 0; j < 32; j++) {
if (x[j] != 0) {
bytesString[charCount] = x[j];
charCount++;
}
}
bytes memory bytesStringTrimmed = new bytes(charCount);
for (j = 0; j < charCount; j++) {
bytesStringTrimmed[j] = bytesString[j];
}
return string(bytesStringTrimmed);
}
}
contract ERC20 {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
function totalSupply() public view returns (uint256);
function balanceOf(address account) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract ExternalStorage is Administratable {
using SafeMath for uint256;
mapping(bytes32 => address[]) public primaryLedgerEntryForIndex;
mapping(bytes32 => mapping(address => address[])) public secondaryLedgerEntryForIndex;
mapping(bytes32 => address[]) public ledgerEntryForIndex;
mapping(bytes32 => address[]) public booleanMapEntryForIndex;
mapping(bytes32 => mapping(address => mapping(address => uint256))) private MultiLedgerStorage;
mapping(bytes32 => mapping(address => bool)) private ledgerPrimaryEntries;
mapping(bytes32 => mapping(address => mapping(address => bool))) private ledgerSecondaryEntries;
mapping(bytes32 => mapping(address => uint256)) private LedgerStorage;
mapping(bytes32 => mapping(address => bool)) private ledgerAccounts;
mapping(bytes32 => mapping(address => bool)) private BooleanMapStorage;
mapping(bytes32 => mapping(address => bool)) private booleanMapAccounts;
mapping(bytes32 => uint256) private UIntStorage;
mapping(bytes32 => bytes32) private Bytes32Storage;
mapping(bytes32 => address) private AddressStorage;
mapping(bytes32 => bytes) private BytesStorage;
mapping(bytes32 => bool) private BooleanStorage;
mapping(bytes32 => int256) private IntStorage;
function getMultiLedgerValue(string record, address primaryAddress, address secondaryAddress) external view returns (uint256) {
return MultiLedgerStorage[keccak256(abi.encodePacked(record))][primaryAddress][secondaryAddress];
}
function primaryLedgerCount(string record) external view returns (uint256) {
return primaryLedgerEntryForIndex[keccak256(abi.encodePacked(record))].length;
}
function secondaryLedgerCount(string record, address primaryAddress) external view returns (uint256) {
return secondaryLedgerEntryForIndex[keccak256(abi.encodePacked(record))][primaryAddress].length;
}
function setMultiLedgerValue(string record, address primaryAddress, address secondaryAddress, uint256 value) external onlyAdmins {
bytes32 hash = keccak256(abi.encodePacked(record));
if (!ledgerSecondaryEntries[hash][primaryAddress][secondaryAddress]) {
secondaryLedgerEntryForIndex[hash][primaryAddress].push(secondaryAddress);
ledgerSecondaryEntries[hash][primaryAddress][secondaryAddress] = true;
if (!ledgerPrimaryEntries[hash][primaryAddress]) {
primaryLedgerEntryForIndex[hash].push(primaryAddress);
ledgerPrimaryEntries[hash][primaryAddress] = true;
}
}
MultiLedgerStorage[hash][primaryAddress][secondaryAddress] = value;
}
function getLedgerValue(string record, address _address) external view returns (uint256) {
return LedgerStorage[keccak256(abi.encodePacked(record))][_address];
}
function getLedgerCount(string record) external view returns (uint256) {
return ledgerEntryForIndex[keccak256(abi.encodePacked(record))].length;
}
function setLedgerValue(string record, address _address, uint256 value) external onlyAdmins {
bytes32 hash = keccak256(abi.encodePacked(record));
if (!ledgerAccounts[hash][_address]) {
ledgerEntryForIndex[hash].push(_address);
ledgerAccounts[hash][_address] = true;
}
LedgerStorage[hash][_address] = value;
}
function getBooleanMapValue(string record, address _address) external view returns (bool) {
return BooleanMapStorage[keccak256(abi.encodePacked(record))][_address];
}
function getBooleanMapCount(string record) external view returns (uint256) {
return booleanMapEntryForIndex[keccak256(abi.encodePacked(record))].length;
}
function setBooleanMapValue(string record, address _address, bool value) external onlyAdmins {
bytes32 hash = keccak256(abi.encodePacked(record));
if (!booleanMapAccounts[hash][_address]) {
booleanMapEntryForIndex[hash].push(_address);
booleanMapAccounts[hash][_address] = true;
}
BooleanMapStorage[hash][_address] = value;
}
function getUIntValue(string record) external view returns (uint256) {
return UIntStorage[keccak256(abi.encodePacked(record))];
}
function setUIntValue(string record, uint256 value) external onlyAdmins {
UIntStorage[keccak256(abi.encodePacked(record))] = value;
}
function getBytes32Value(string record) external view returns (bytes32) {
return Bytes32Storage[keccak256(abi.encodePacked(record))];
}
function setBytes32Value(string record, bytes32 value) external onlyAdmins {
Bytes32Storage[keccak256(abi.encodePacked(record))] = value;
}
function getAddressValue(string record) external view returns (address) {
return AddressStorage[keccak256(abi.encodePacked(record))];
}
function setAddressValue(string record, address value) external onlyAdmins {
AddressStorage[keccak256(abi.encodePacked(record))] = value;
}
function getBytesValue(string record) external view returns (bytes) {
return BytesStorage[keccak256(abi.encodePacked(record))];
}
function setBytesValue(string record, bytes value) external onlyAdmins {
BytesStorage[keccak256(abi.encodePacked(record))] = value;
}
function getBooleanValue(string record) external view returns (bool) {
return BooleanStorage[keccak256(abi.encodePacked(record))];
}
function setBooleanValue(string record, bool value) external onlyAdmins {
BooleanStorage[keccak256(abi.encodePacked(record))] = value;
}
function getIntValue(string record) external view returns (int256) {
return IntStorage[keccak256(abi.encodePacked(record))];
}
function setIntValue(string record, int256 value) external onlyAdmins {
IntStorage[keccak256(abi.encodePacked(record))] = value;
}
}
contract Freezable is Administratable {
using SafeMath for uint256;
// zOS requires that the variables are never removed nor order changed
// Since this is a parent contract, no new variables can be added here
bool public frozenToken;
// TODO move this into external storage
address[] public frozenAccountForIndex;
mapping (address => bool) public frozenAccount;
mapping (address => bool) private processedAccount;
event FrozenFunds(address indexed target, bool frozen);
event FrozenToken(bool frozen);
modifier unlessFrozen {
require(!frozenToken);
require(!frozenAccount[msg.sender]);
_;
}
function freezeAccount(address target, bool freeze) public onlySuperAdmins {
frozenAccount[target] = freeze;
if (!processedAccount[target]) {
frozenAccountForIndex.push(target);
processedAccount[target] = true;
}
emit FrozenFunds(target, freeze);
}
function freezeToken(bool freeze) public onlySuperAdmins {
frozenToken = freeze;
emit FrozenToken(frozenToken);
}
function totalFrozenAccountsMapping() public view returns(uint256) {
return frozenAccountForIndex.length;
}
}
contract IStorable {
function getLedgerNameHash() external view returns (bytes32);
function getStorageNameHash() external view returns (bytes32);
}
contract CardstackToken is ERC20,
Initializable,
Freezable,
Displayable,
Configurable,
IStorable {
using SafeMath for uint256;
using CstLibrary for address;
/* zOS requires that the variables are never removed nor order changed
/* BEGIN VARIABLES */
uint8 public constant decimals = 18;
string public constant version = "3";
uint256 public constant tokenMaxCap = 6000000000000000000000000000; // 6 billion * 10^18
ITokenLedger public tokenLedger;
string public storageName;
string public ledgerName;
address public externalStorage;
address public registry;
bool public haltPurchase;
uint256 public contributionMinimum;
/* END VARIABLES */
event Mint(uint256 amountMinted);
event Approval(address indexed _owner,
address indexed _spender,
uint256 _value);
event Transfer(address indexed _from,
address indexed _to,
uint256 _value);
event WhiteList(address indexed buyer, uint256 holdCap);
event RemoveWhitelistedBuyer(address indexed buyer);
event ConfigChanged(uint256 buyPrice, uint256 circulationCap, uint256 balanceLimit);
event VestedTokenGrant(address indexed beneficiary, uint256 startDate, uint256 cliffDate, uint256 durationSec, uint256 fullyVestedAmount, bool isRevocable);
event VestedTokenRevocation(address indexed beneficiary);
event VestedTokenRelease(address indexed beneficiary, uint256 amount);
event StorageUpdated(address storageAddress, address ledgerAddress);
event FoundationDeposit(uint256 amount);
event FoundationWithdraw(uint256 amount);
event PurchaseHalted();
event PurchaseResumed();
modifier onlyFoundation {
address foundation = externalStorage.getFoundation();
require(foundation != address(0));
if (msg.sender != owner && msg.sender != foundation) revert();
_;
}
modifier initStorage {
address ledgerAddress = Registry(registry).getStorage(ledgerName);
address storageAddress = Registry(registry).getStorage(storageName);
tokenLedger = ITokenLedger(ledgerAddress);
externalStorage = storageAddress;
_;
}
function buy() external payable unlessFrozen returns (uint256) {
require(!haltPurchase);
require(externalStorage.getApprovedBuyer(msg.sender));
uint256 _buyPriceTokensPerWei = externalStorage.getBuyPrice();
uint256 _circulationCap = externalStorage.getCirculationCap();
require(msg.value > 0);
require(_buyPriceTokensPerWei > 0);
require(_circulationCap > 0);
uint256 amount = msg.value.mul(_buyPriceTokensPerWei);
require(totalInCirculation().add(amount) <= _circulationCap);
require(amount <= tokensAvailable());
uint256 balanceLimit;
uint256 buyerBalance = tokenLedger.balanceOf(msg.sender);
uint256 customLimit = externalStorage.getCustomBuyerLimit(msg.sender);
require(contributionMinimum == 0 || buyerBalance.add(amount) >= contributionMinimum);
if (customLimit > 0) {
balanceLimit = customLimit;
} else {
balanceLimit = externalStorage.getBalanceLimit();
}
require(balanceLimit > 0 && balanceLimit >= buyerBalance.add(amount));
tokenLedger.debitAccount(msg.sender, amount);
emit Transfer(this, msg.sender, amount);
return amount;
}
function getLedgerNameHash() external view returns (bytes32) {
return keccak256(abi.encodePacked(ledgerName));
}
function getStorageNameHash() external view returns (bytes32) {
return keccak256(abi.encodePacked(storageName));
}
function initialize(address _registry, string _storageName, string _ledgerName) public onlyInitializers {
initializeAdmins();
_initialize(_registry, _storageName, _ledgerName);
}
function configure(bytes32 _tokenName,
bytes32 _tokenSymbol,
uint256 _buyPrice,
uint256 _circulationCap,
uint256 _balanceLimit,
address _foundation) public onlySuperAdmins initStorage returns (bool) {
uint256 __buyPrice = externalStorage.getBuyPrice();
if (__buyPrice > 0 && __buyPrice != _buyPrice) {
require(frozenToken);
}
externalStorage.setTokenName(_tokenName);
externalStorage.setTokenSymbol(_tokenSymbol);
externalStorage.setBuyPrice(_buyPrice);
externalStorage.setCirculationCap(_circulationCap);
externalStorage.setFoundation(_foundation);
externalStorage.setBalanceLimit(_balanceLimit);
emit ConfigChanged(_buyPrice, _circulationCap, _balanceLimit);
return true;
}
function configureFromStorage() public onlySuperAdmins initStorage returns (bool) {
freezeToken(true);
return true;
}
function updateStorage(string newStorageName, string newLedgerName) public onlySuperAdmins returns (bool) {
require(frozenToken);
storageName = newStorageName;
ledgerName = newLedgerName;
configureFromStorage();
address ledgerAddress = Registry(registry).getStorage(ledgerName);
address storageAddress = Registry(registry).getStorage(storageName);
emit StorageUpdated(storageAddress, ledgerAddress);
return true;
}
function transfer(address recipient, uint256 amount) public unlessFrozen returns (bool) {
require(!frozenAccount[recipient]);
tokenLedger.transfer(msg.sender, recipient, amount);
emit Transfer(msg.sender, recipient, amount);
return true;
}
function mintTokens(uint256 mintedAmount) public onlySuperAdmins returns (bool) {
require(mintedAmount.add(totalSupply()) <= tokenMaxCap);
require(mintedAmount > 0);
tokenLedger.mintTokens(mintedAmount);
emit Mint(mintedAmount);
emit Transfer(address(0), this, mintedAmount);
return true;
}
function grantTokens(address recipient, uint256 amount) public onlySuperAdmins returns (bool) {
require(haltPurchase);
require(!frozenAccount[recipient]);
uint256 _circulationCap = externalStorage.getCirculationCap();
require(totalInCirculation().add(amount) <= _circulationCap);
require(amount <= tokensAvailable()); // assert the granted tokens doesnt exceed the totalSupply minus the fully vested amount of vesting tokens
tokenLedger.debitAccount(recipient, amount);
emit Transfer(this, recipient, amount);
return true;
}
function setHaltPurchase(bool _haltPurchase) public onlySuperAdmins returns (bool) {
haltPurchase = _haltPurchase;
if (_haltPurchase) {
emit PurchaseHalted();
} else {
emit PurchaseResumed();
}
return true;
}
// intentionally allowing this to work when token is frozen as foundation is a form of a super admin
function foundationWithdraw(uint256 amount) public onlyFoundation returns (bool) {
/* UNTRUSTED */
msg.sender.transfer(amount);
emit FoundationWithdraw(amount);
return true;
}
function foundationDeposit() public payable unlessFrozen returns (bool) {
emit FoundationDeposit(msg.value);
return true;
}
function transferFrom(address from, address to, uint256 value) public unlessFrozen returns (bool) {
require(!frozenAccount[from]);
require(!frozenAccount[to]);
require(from != msg.sender);
uint256 allowanceValue = allowance(from, msg.sender);
require(allowanceValue >= value);
tokenLedger.transfer(from, to, value);
externalStorage.setAllowance(from, msg.sender, allowanceValue.sub(value));
emit Transfer(from, to, value);
return true;
}
/* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Please use `increaseApproval` or `decreaseApproval` instead.
*/
function approve(address spender, uint256 value) public unlessFrozen returns (bool) {
require(value == 0 || allowance(msg.sender, spender) == 0);
return _approve(spender, value);
}
function increaseApproval(address spender, uint256 addedValue) public unlessFrozen returns (bool) {
return _approve(spender, externalStorage.getAllowance(msg.sender, spender).add(addedValue));
}
function decreaseApproval(address spender, uint256 subtractedValue) public unlessFrozen returns (bool) {
uint256 oldValue = externalStorage.getAllowance(msg.sender, spender);
if (subtractedValue > oldValue) {
return _approve(spender, 0);
} else {
return _approve(spender, oldValue.sub(subtractedValue));
}
}
function grantVestedTokens(address beneficiary,
uint256 fullyVestedAmount,
uint256 startDate, // 0 indicates start "now"
uint256 cliffSec,
uint256 durationSec,
bool isRevocable) public onlySuperAdmins returns(bool) {
uint256 _circulationCap = externalStorage.getCirculationCap();
require(beneficiary != address(0));
require(!frozenAccount[beneficiary]);
require(durationSec >= cliffSec);
require(totalInCirculation().add(fullyVestedAmount) <= _circulationCap);
require(fullyVestedAmount <= tokensAvailable());
uint256 _startDate = startDate;
if (_startDate == 0) {
_startDate = now;
}
uint256 cliffDate = _startDate.add(cliffSec);
externalStorage.setVestingSchedule(beneficiary,
fullyVestedAmount,
_startDate,
cliffDate,
durationSec,
isRevocable);
emit VestedTokenGrant(beneficiary, _startDate, cliffDate, durationSec, fullyVestedAmount, isRevocable);
return true;
}
function revokeVesting(address beneficiary) public onlySuperAdmins returns (bool) {
require(beneficiary != address(0));
externalStorage.revokeVesting(beneficiary);
releaseVestedTokensForBeneficiary(beneficiary);
emit VestedTokenRevocation(beneficiary);
return true;
}
function releaseVestedTokens() public unlessFrozen returns (bool) {
return releaseVestedTokensForBeneficiary(msg.sender);
}
function releaseVestedTokensForBeneficiary(address beneficiary) public unlessFrozen returns (bool) {
require(beneficiary != address(0));
require(!frozenAccount[beneficiary]);
uint256 unreleased = releasableAmount(beneficiary);
if (unreleased == 0) { return true; }
externalStorage.releaseVestedTokens(beneficiary);
tokenLedger.debitAccount(beneficiary, unreleased);
emit Transfer(this, beneficiary, unreleased);
emit VestedTokenRelease(beneficiary, unreleased);
return true;
}
function setCustomBuyer(address buyer, uint256 balanceLimit) public onlySuperAdmins returns (bool) {
require(buyer != address(0));
externalStorage.setCustomBuyerLimit(buyer, balanceLimit);
addBuyer(buyer);
return true;
}
function setContributionMinimum(uint256 _contributionMinimum) public onlySuperAdmins returns (bool) {
contributionMinimum = _contributionMinimum;
return true;
}
function addBuyer(address buyer) public onlySuperAdmins returns (bool) {
require(buyer != address(0));
externalStorage.setApprovedBuyer(buyer, true);
uint256 balanceLimit = externalStorage.getCustomBuyerLimit(buyer);
if (balanceLimit == 0) {
balanceLimit = externalStorage.getBalanceLimit();
}
emit WhiteList(buyer, balanceLimit);
return true;
}
function removeBuyer(address buyer) public onlySuperAdmins returns (bool) {
require(buyer != address(0));
externalStorage.setApprovedBuyer(buyer, false);
emit RemoveWhitelistedBuyer(buyer);
return true;
}
function name() public view returns(string) {
return bytes32ToString(externalStorage.getTokenName());
}
function symbol() public view returns(string) {
return bytes32ToString(externalStorage.getTokenSymbol());
}
function totalInCirculation() public view returns(uint256) {
return tokenLedger.totalInCirculation().add(totalUnvestedAndUnreleasedTokens());
}
function cstBalanceLimit() public view returns(uint256) {
return externalStorage.getBalanceLimit();
}
function buyPrice() public view returns(uint256) {
return externalStorage.getBuyPrice();
}
function circulationCap() public view returns(uint256) {
return externalStorage.getCirculationCap();
}
// intentionally allowing this to be visible if upgraded so foundation can
// withdraw funds from contract that has a successor
function foundation() public view returns(address) {
return externalStorage.getFoundation();
}
function totalSupply() public view returns(uint256) {
return tokenLedger.totalTokens();
}
function tokensAvailable() public view returns(uint256) {
return totalSupply().sub(totalInCirculation());
}
function balanceOf(address account) public view returns (uint256) {
address thisAddress = this;
if (thisAddress == account) {
return tokensAvailable();
} else {
return tokenLedger.balanceOf(account);
}
}
function allowance(address _owner, address _spender) public view returns (uint256) {
return externalStorage.getAllowance(_owner, _spender);
}
function releasableAmount(address beneficiary) public view returns (uint256) {
return externalStorage.releasableAmount(beneficiary);
}
function totalUnvestedAndUnreleasedTokens() public view returns (uint256) {
return externalStorage.getTotalUnvestedAndUnreleasedTokens();
}
function vestingMappingSize() public view returns (uint256) {
return externalStorage.vestingMappingSize();
}
function vestingBeneficiaryForIndex(uint256 index) public view returns (address) {
return externalStorage.vestingBeneficiaryForIndex(index);
}
function vestingSchedule(address _beneficiary) public
view returns (uint256 startDate,
uint256 cliffDate,
uint256 durationSec,
uint256 fullyVestedAmount,
uint256 vestedAmount,
uint256 vestedAvailableAmount,
uint256 releasedAmount,
uint256 revokeDate,
bool isRevocable) {
(
startDate,
cliffDate,
durationSec,
fullyVestedAmount,
releasedAmount,
revokeDate,
isRevocable
) = externalStorage.getVestingSchedule(_beneficiary);
vestedAmount = externalStorage.vestedAmount(_beneficiary);
vestedAvailableAmount = externalStorage.vestedAvailableAmount(_beneficiary);
}
function totalCustomBuyersMapping() public view returns (uint256) {
return externalStorage.getCustomBuyerMappingCount();
}
function customBuyerLimit(address buyer) public view returns (uint256) {
return externalStorage.getCustomBuyerLimit(buyer);
}
function customBuyerForIndex(uint256 index) public view returns (address) {
return externalStorage.getCustomBuyerForIndex(index);
}
function totalBuyersMapping() public view returns (uint256) {
return externalStorage.getApprovedBuyerMappingCount();
}
function approvedBuyer(address buyer) public view returns (bool) {
return externalStorage.getApprovedBuyer(buyer);
}
function approvedBuyerForIndex(uint256 index) public view returns (address) {
return externalStorage.getApprovedBuyerForIndex(index);
}
function _initialize(address _registry, string _storageName, string _ledgerName) internal isInitializer {
require(_registry != address(0));
storageName = _storageName;
ledgerName = _ledgerName;
registry = _registry;
addSuperAdmin(registry);
emit Transfer(address(0), this, 0); // create ERC-20 signature for etherscan.io
}
function _approve(address spender, uint256 value) internal unlessFrozen returns(bool) {
require(spender != address(0));
require(!frozenAccount[spender]);
require(msg.sender != spender);
externalStorage.setAllowance(msg.sender, spender, value);
emit Approval(msg.sender, spender, value);
return true;
}
}
interface ITokenLedger {
function mintTokens(uint256 amount) external;
function transfer(address sender, address reciever, uint256 amount) external;
function creditAccount(address account, uint256 amount) external;
function debitAccount(address account, uint256 amount) external;
function addAdmin(address admin) external;
function removeAdmin(address admin) external;
function totalTokens() external view returns (uint256);
function totalInCirculation() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
}
contract CstLedger is ITokenLedger, Initializable, Administratable {
using SafeMath for uint256;
/* zOS requires that the variables are never removed nor order changed
/* BEGIN VARIABLES */
string public constant version = "2";
uint256 private _totalInCirculation; // warning this does not take into account unvested nor vested-unreleased tokens into consideration
uint256 private _totalTokens;
mapping (address => uint256) private _balanceOf;
mapping (address => bool) private accounts;
/* END VARIABLES */
function transfer(address sender, address recipient, uint256 amount) external onlyAdmins {
require(sender != address(0));
require(recipient != address(0));
require(_balanceOf[sender] >= amount);
_balanceOf[sender] = _balanceOf[sender].sub(amount);
_balanceOf[recipient] = _balanceOf[recipient].add(amount);
}
function creditAccount(address account, uint256 amount) external onlyAdmins { // remove tokens
require(account != address(0));
require(_balanceOf[account] >= amount);
_totalInCirculation = _totalInCirculation.sub(amount);
_balanceOf[account] = _balanceOf[account].sub(amount);
}
function debitAccount(address account, uint256 amount) external onlyAdmins { // add tokens
require(account != address(0));
_totalInCirculation = _totalInCirculation.add(amount);
_balanceOf[account] = _balanceOf[account].add(amount);
}
function totalTokens() external view returns (uint256) {
return _totalTokens;
}
function totalInCirculation() external view returns (uint256) {
return _totalInCirculation;
}
function balanceOf(address account) external view returns (uint256) {
return _balanceOf[account];
}
function mintTokens(uint256 amount) external onlyAdmins {
_totalTokens = _totalTokens.add(amount);
}
function initialize() public onlyInitializers isInitializer {
initializeAdmins();
}
}
contract Registry is Initializable, Administratable {
using SafeMath for uint256;
/* zOS requires that the variables are never removed nor order changed
/* BEGIN VARIABLES */
string public constant version = "2";
bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7;
bytes4 private constant ADDR_INTERFACE_ID = 0x3b3b57de;
bytes32 private constant BARE_DOMAIN_NAMEHASH = 0x794941fae74d6435d1b29ee1c08cc39941ba78470872e6afd0693c7eeb63025c; // namehash for "cardstack.eth"
mapping(bytes32 => address) public storageForHash;
mapping(bytes32 => address) public contractForHash;
mapping(bytes32 => bytes32) public hashForNamehash;
mapping(bytes32 => bytes32) public namehashForHash;
string[] public contractNameForIndex;
/* END VARIABLES */
event ContractRegistered(address indexed _contract, string _name, bytes32 namehash);
event StorageAdded(address indexed storageAddress, string name);
event StorageRemoved(address indexed storageAddress, string name);
event AddrChanged(bytes32 indexed node, address a);
function() public {
revert();
}
function setNamehash(string contractName, bytes32 namehash) external onlySuperAdmins returns (bool) {
require(namehash != 0x0);
bytes32 hash = keccak256(abi.encodePacked(contractName));
address contractAddress = contractForHash[hash];
require(contractAddress != 0x0);
require(hashForNamehash[namehash] == 0x0);
hashForNamehash[namehash] = hash;
namehashForHash[hash] = namehash;
emit AddrChanged(namehash, contractAddress);
}
function register(string name, address contractAddress, bytes32 namehash) external onlySuperAdmins returns (bool) {
bytes32 hash = keccak256(abi.encodePacked(name));
require(bytes(name).length > 0);
require(contractAddress != 0x0);
require(contractForHash[hash] == 0x0);
require(hashForNamehash[namehash] == 0x0);
contractNameForIndex.push(name);
contractForHash[hash] = contractAddress;
if (namehash != 0x0) {
hashForNamehash[namehash] = hash;
namehashForHash[hash] = namehash;
}
address storageAddress = storageForHash[IStorable(contractAddress).getStorageNameHash()];
address ledgerAddress = storageForHash[IStorable(contractAddress).getLedgerNameHash()];
if (storageAddress != 0x0) {
ExternalStorage(storageAddress).addAdmin(contractAddress);
}
if (ledgerAddress != 0x0) {
CstLedger(ledgerAddress).addAdmin(contractAddress);
}
Configurable(contractAddress).configureFromStorage();
emit ContractRegistered(contractAddress, name, namehash);
if (namehash != 0x0) {
emit AddrChanged(namehash, contractAddress);
}
return true;
}
function addStorage(string name, address storageAddress) external onlySuperAdmins {
require(storageAddress != address(0));
bytes32 hash = keccak256(abi.encodePacked(name));
storageForHash[hash] = storageAddress;
emit StorageAdded(storageAddress, name);
}
function initialize() public onlyInitializers isInitializer {
initializeAdmins();
}
function removeStorage(string name) public onlySuperAdmins {
address storageAddress = storageForHash[keccak256(abi.encodePacked(name))];
delete storageForHash[keccak256(abi.encodePacked(name))];
emit StorageRemoved(storageAddress, name);
}
function getStorage(string name) public view returns (address) {
return storageForHash[keccak256(abi.encodePacked(name))];
}
function addr(bytes32 node) public view returns (address) {
return contractForHash[hashForNamehash[node]];
}
function numContracts() public view returns(uint256) {
return contractNameForIndex.length;
}
function getContractHash(string name) public pure returns (bytes32) {
return keccak256(abi.encodePacked(name));
}
function supportsInterface(bytes4 interfaceId) public pure returns (bool) {
return interfaceId == ADDR_INTERFACE_ID ||
interfaceId == INTERFACE_META_ID;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[],"name":"totalAdminsMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"buyer","type":"address"}],"name":"customBuyerLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newStorageName","type":"string"},{"name":"newLedgerName","type":"string"}],"name":"updateStorage","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"beneficiary","type":"address"}],"name":"releasableAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"configureFromStorage","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vestingMappingSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalFrozenAccountsMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"adminsForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenLedger","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"revokeVesting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"foundation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"admins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"vestingBeneficiaryForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"removeSuperAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contributionMinimum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"releaseVestedTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"circulationCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalInCirculation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenName","type":"bytes32"},{"name":"_tokenSymbol","type":"bytes32"},{"name":"_buyPrice","type":"uint256"},{"name":"_circulationCap","type":"uint256"},{"name":"_balanceLimit","type":"uint256"},{"name":"_foundation","type":"address"}],"name":"configure","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensAvailable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_haltPurchase","type":"bool"}],"name":"setHaltPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"frozenToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"}],"name":"removeBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"addAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"freeze","type":"bool"}],"name":"freezeToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"frozenAccountForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cstBalanceLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"externalStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalUnvestedAndUnreleasedTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLedgerNameHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_registry","type":"address"},{"name":"_storageName","type":"string"},{"name":"_ledgerName","type":"string"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"bytes32"}],"name":"bytes32ToString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"mintedAmount","type":"uint256"}],"name":"mintTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getStorageNameHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"releaseVestedTokensForBeneficiary","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"foundationDeposit","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"totalBuyersMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buy","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSuperAdminsMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"superAdmins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"addSuperAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"frozenAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"customBuyerForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"}],"name":"addBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"buyer","type":"address"}],"name":"approvedBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"superAdminsForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"grantTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_contributionMinimum","type":"uint256"}],"name":"setContributionMinimum","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"foundationWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ledgerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"haltPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"storageName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"},{"name":"balanceLimit","type":"uint256"}],"name":"setCustomBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenMaxCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminsInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalCustomBuyersMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"target","type":"address"},{"name":"freeze","type":"bool"}],"name":"freezeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"approvedBuyerForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"fullyVestedAmount","type":"uint256"},{"name":"startDate","type":"uint256"},{"name":"cliffSec","type":"uint256"},{"name":"durationSec","type":"uint256"},{"name":"isRevocable","type":"bool"}],"name":"grantVestedTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"vestingSchedule","outputs":[{"name":"startDate","type":"uint256"},{"name":"cliffDate","type":"uint256"},{"name":"durationSec","type":"uint256"},{"name":"fullyVestedAmount","type":"uint256"},{"name":"vestedAmount","type":"uint256"},{"name":"vestedAvailableAmount","type":"uint256"},{"name":"releasedAmount","type":"uint256"},{"name":"revokeDate","type":"uint256"},{"name":"isRevocable","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amountMinted","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":false,"name":"holdCap","type":"uint256"}],"name":"WhiteList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"}],"name":"RemoveWhitelistedBuyer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"buyPrice","type":"uint256"},{"indexed":false,"name":"circulationCap","type":"uint256"},{"indexed":false,"name":"balanceLimit","type":"uint256"}],"name":"ConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"startDate","type":"uint256"},{"indexed":false,"name":"cliffDate","type":"uint256"},{"indexed":false,"name":"durationSec","type":"uint256"},{"indexed":false,"name":"fullyVestedAmount","type":"uint256"},{"indexed":false,"name":"isRevocable","type":"bool"}],"name":"VestedTokenGrant","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"}],"name":"VestedTokenRevocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"VestedTokenRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"storageAddress","type":"address"},{"indexed":false,"name":"ledgerAddress","type":"address"}],"name":"StorageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"FoundationDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"FoundationWithdraw","type":"event"},{"anonymous":false,"inputs":[],"name":"PurchaseHalted","type":"event"},{"anonymous":false,"inputs":[],"name":"PurchaseResumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"target","type":"address"},{"indexed":false,"name":"frozen","type":"bool"}],"name":"FrozenFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"frozen","type":"bool"}],"name":"FrozenToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"AddAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"RemoveAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"AddSuperAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"RemoveSuperAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]Contract Creation Code
608060405260008054610100330261010060a860020a03199091161790556154458061002c6000396000f3006080604052600436106103765763ffffffff60e060020a6000350416630489882e811461037b57806306fdde03146103a2578063095ea7b31461042c578063115f2be21461046457806313bac8f214610485578063158ef93e1461051c5780631726cbc8146105315780631785f53c1461055257806318160ddd146105755780631a841b1b1461058a578063222101d11461059f57806323b872dd146105b45780632b28d2d0146105de578063313ce567146105f3578063313f2a211461061e5780633886c957146106525780633b0da2601461066757806341fbb05014610688578063429b62e51461069d5780634610a448146106be5780634902e4aa146106d65780634f2d7ab5146106f757806354dd1da41461070c57806354fd4d501461072157806356597e65146107365780635cb0c16f1461074b5780635da01a5b1461076057806360659a921461079057806366188463146107a55780636a420bbc146107c95780636df006f3146107e35780636f75b00c146107f8578063704802751461081957806370a082311461083a578063771eee161461085b5780637b103999146108755780637db6cc1b1461088a578063820e79ed146108a25780638620410b146108b757806388d7cd97146108cc5780638da5cb5b146108e15780638df388c1146108f65780638f1d5f7e1461090b57806390657147146109205780639201de55146109c557806395d89b41146109dd57806397304ced146109f25780639860811114610a0a57806399817b4714610a1f5780639ae066b014610a40578063a4453a9614610a48578063a6f2ae3a14610a5d578063a9059cbb14610a65578063abf7b06314610a89578063ad25cb4214610a9e578063b3292ff014610abf578063b414d4b614610ae0578063b9447f7e14610b01578063bbf8980314610b19578063c3437e0614610b3a578063c389439814610b5b578063c94e643c14610b73578063cb0b7b0314610b97578063cedcd77014610baf578063cf1f3dd714610bc7578063d28dcdea14610bdc578063d73c277c14610bf1578063d73dd62314610c06578063da14c72314610c2a578063dd62ed3e14610c4e578063ddad3ca114610c75578063deca6e7614610c8a578063e01bc60b14610c9f578063e724529c14610cb4578063f2fde38b14610cda578063f69f8a5c14610cfb578063fc13566d14610d13578063ffff6b0414610d45575b600080fd5b34801561038757600080fd5b50610390610daf565b60408051918252519081900360200190f35b3480156103ae57600080fd5b506103b7610db6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f15781810151838201526020016103d9565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043857600080fd5b50610450600160a060020a0360043516602435610e69565b604080519115158252519081900360200190f35b34801561047057600080fd5b50610390600160a060020a0360043516610ecb565b34801561049157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261045094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610f7f9650505050505050565b34801561052857600080fd5b50610450611238565b34801561053d57600080fd5b50610390600160a060020a0360043516611241565b34801561055e57600080fd5b50610573600160a060020a03600435166112c3565b005b34801561058157600080fd5b5061039061135b565b34801561059657600080fd5b506104506113eb565b3480156105ab57600080fd5b50610390611662565b3480156105c057600080fd5b50610450600160a060020a03600435811690602435166044356116f0565b3480156105ea57600080fd5b50610390611915565b3480156105ff57600080fd5b5061060861191b565b6040805160ff9092168252519081900360200190f35b34801561062a57600080fd5b50610636600435611920565b60408051600160a060020a039092168252519081900360200190f35b34801561065e57600080fd5b50610636611948565b34801561067357600080fd5b50610450600160a060020a0360043516611957565b34801561069457600080fd5b50610636611a83565b3480156106a957600080fd5b50610450600160a060020a0360043516611afd565b3480156106ca57600080fd5b50610636600435611b12565b3480156106e257600080fd5b50610573600160a060020a0360043516611b93565b34801561070357600080fd5b50610390611c2b565b34801561071857600080fd5b50610450611c31565b34801561072d57600080fd5b506103b7611c6a565b34801561074257600080fd5b50610390611ca1565b34801561075757600080fd5b50610390611d05565b34801561076c57600080fd5b50610450600435602435604435606435608435600160a060020a0360a43516611d9d565b34801561079c57600080fd5b50610390612496565b3480156107b157600080fd5b50610450600160a060020a03600435166024356124b7565b3480156107d557600080fd5b5061045060043515156125d5565b3480156107ef57600080fd5b506104506126b4565b34801561080457600080fd5b50610450600160a060020a03600435166126bd565b34801561082557600080fd5b50610573600160a060020a03600435166127e6565b34801561084657600080fd5b50610390600160a060020a0360043516612911565b34801561086757600080fd5b5061057360043515156129d1565b34801561088157600080fd5b50610636612a57565b34801561089657600080fd5b50610636600435612a66565b3480156108ae57600080fd5b50610390612a74565b3480156108c357600080fd5b50610390612aee565b3480156108d857600080fd5b50610636612b68565b3480156108ed57600080fd5b50610636612b77565b34801561090257600080fd5b50610390612b8b565b34801561091757600080fd5b50610390612c05565b34801561092c57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610573958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612cdc9650505050505050565b3480156109d157600080fd5b506103b7600435612d34565b3480156109e957600080fd5b506103b7612ec9565b3480156109fe57600080fd5b50610450600435612f46565b348015610a1657600080fd5b5061039061309e565b348015610a2b57600080fd5b50610450600160a060020a03600435166130de565b6104506132f8565b348015610a5457600080fd5b50610390613361565b6103906133db565b348015610a7157600080fd5b50610450600160a060020a0360043516602435613997565b348015610a9557600080fd5b50610390613ab0565b348015610aaa57600080fd5b50610450600160a060020a0360043516613ab6565b348015610acb57600080fd5b50610573600160a060020a0360043516613acb565b348015610aec57600080fd5b50610450600160a060020a0360043516613b45565b348015610b0d57600080fd5b50610636600435613b5a565b348015610b2557600080fd5b50610450600160a060020a0360043516613bdb565b348015610b4657600080fd5b50610450600160a060020a0360043516613e6a565b348015610b6757600080fd5b50610636600435613eec565b348015610b7f57600080fd5b50610450600160a060020a0360043516602435613efa565b348015610ba357600080fd5b506104506004356140fe565b348015610bbb57600080fd5b50610450600435614142565b348015610bd357600080fd5b506103b761429d565b348015610be857600080fd5b5061045061432b565b348015610bfd57600080fd5b506103b761434c565b348015610c1257600080fd5b50610450600160a060020a03600435166024356143a7565b348015610c3657600080fd5b50610450600160a060020a036004351660243561447b565b348015610c5a57600080fd5b50610390600160a060020a036004358116906024351661457b565b348015610c8157600080fd5b50610390614638565b348015610c9657600080fd5b50610450614648565b348015610cab57600080fd5b5061039061466a565b348015610cc057600080fd5b50610573600160a060020a036004351660243515156146e4565b348015610ce657600080fd5b50610573600160a060020a036004351661480c565b348015610d0757600080fd5b506106366004356148b0565b348015610d1f57600080fd5b50610450600160a060020a036004351660243560443560643560843560a4351515614931565b348015610d5157600080fd5b50610d66600160a060020a0360043516614bbb565b60408051998a5260208a0198909852888801969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b6001545b90565b600e54604080517f6f0fccab000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b826191636f0fccab916024808301926020929190829003018186803b158015610e3357600080fd5b505af4158015610e47573d6000803e3d6000fd5b505050506040513d6020811015610e5d57600080fd5b5051612d34565b905090565b60075460009060ff1615610e7c57600080fd5b3360009081526009602052604090205460ff1615610e9957600080fd5b811580610ead5750610eab338461457b565b155b1515610eb857600080fd5b610ec28383614e6a565b90505b92915050565b600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b158015610f4d57600080fd5b505af4158015610f61573d6000803e3d6000fd5b505050506040513d6020811015610f7757600080fd5b505192915050565b60008054819081906101009004600160a060020a03163314801590610fb457503360009081526004602052604090205460ff16155b15610fbe57600080fd5b60075460ff161515610fcf57600080fd5b8451610fe290600c906020880190615361565b508351610ff690600d906020870190615361565b50610fff6113eb565b50600f5460405160e160020a6328cf2aed028152602060048201908152600d80546002600019600183161561010002019091160460248401819052600160a060020a039094169363519e55da939192918291604490910190849080156110a65780601f1061107b576101008083540402835291602001916110a6565b820191906000526020600020905b81548152906001019060200180831161108957829003601f168201915b505092505050602060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b505050506040513d60208110156110f057600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b505092505050602060405180830381600087803b1580156111b957600080fd5b505af11580156111cd573d6000803e3d6000fd5b505050506040513d60208110156111e357600080fd5b505160408051600160a060020a0380841682528516602082015281519293507f8e2c71dfeb156b7c7d03fa7cba1af111d058c575816f578cb3c2d8c6be99e0ca929081900390910190a1506001949350505050565b60005460ff1681565b600e54604080517f7243cfbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191637243cfbb91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a031633148015906112f357503360009081526004602052604090205460ff16155b156112fd57600080fd5b600160a060020a038116151561131257600080fd5b600160a060020a038116600081815260036020526040808220805460ff19169055517f753f40ca3312b2408759a67875b367955e7baa221daf08aa3d643d96202ac12b9190a250565b600b54604080517f7e1c0c090000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691637e1c0c0991600480830192602092919082900301818787803b1580156113ba57600080fd5b505af11580156113ce573d6000803e3d6000fd5b505050506040513d60208110156113e457600080fd5b5051905090565b600080546101009004600160a060020a0316331480159061141c57503360009081526004602052604090205460ff16155b1561142657600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da939290918291604490910190849080156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b505092505050602060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156115c45780601f10611599576101008083540402835291602001916115c4565b820191906000526020600020905b8154815290600101906020018083116115a757829003601f168201915b505092505050602060405180830381600087803b1580156115e457600080fd5b505af11580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805492841692909116919091179055905061165960016129d1565b60019250505090565b600e54604080517f0b96406a000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191630b96406a91602480820192602092909190829003018186803b1580156116dc57600080fd5b505af41580156113ce573d6000803e3d6000fd5b600754600090819060ff161561170557600080fd5b3360009081526009602052604090205460ff161561172257600080fd5b600160a060020a03851660009081526009602052604090205460ff161561174857600080fd5b600160a060020a03841660009081526009602052604090205460ff161561176e57600080fd5b600160a060020a03851633141561178457600080fd5b61178e853361457b565b90508281101561179d57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151919092169163beabacc891606480830192600092919082900301818387803b15801561181357600080fd5b505af1158015611827573d6000803e3d6000fd5b5050600e5473c0cc10d764f38245ca6b43aa1fe84c85002b8261925063a70703739150600160a060020a03168733611865868963ffffffff614fd716565b6040805160e060020a63ffffffff8816028152600160a060020a0395861660048201529385166024850152919093166044830152606482019290925290516084808301926000929190829003018186803b1580156118c257600080fd5b505af41580156118d6573d6000803e3d6000fd5b5050604080518681529051600160a060020a038089169450891692506000805160206153fa8339815191529181900360200190a3506001949350505050565b60085490565b601281565b600180548290811061192e57fe5b600091825260209091200154600160a060020a0316905081565b600b54600160a060020a031681565b600080546101009004600160a060020a0316331480159061198857503360009081526004602052604090205460ff16155b1561199257600080fd5b600160a060020a03821615156119a757600080fd5b600e54604080517f3613b781000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291841660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191633613b781916044808301926000929190829003018186803b158015611a2557600080fd5b505af4158015611a39573d6000803e3d6000fd5b50505050611a46826130de565b50604051600160a060020a038316907fe8a24516e1d3bae0c4742f4e5ded148733d2193d648d57d54bbec9c20e4b444990600090a2506001919050565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191639646824991602480820192602092909190829003018186803b1580156116dc57600080fd5b60036020526000908152604090205460ff1681565b600e54604080517f52bafbfa000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916352bafbfa91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a03163314801590611bc357503360009081526004602052604090205460ff16155b15611bcd57600080fd5b600160a060020a0381161515611be257600080fd5b600160a060020a038116600081815260046020526040808220805460ff19169055517f1aaaaf7609619e631f47eb3546f9fdd8c61b1af2175988a0ddb9a06680c3b9ed9190a250565b60105481565b60075460009060ff1615611c4457600080fd5b3360009081526009602052604090205460ff1615611c6157600080fd5b610e64336130de565b60408051808201909152600181527f3300000000000000000000000000000000000000000000000000000000000000602082015281565b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000610e64611d12612b8b565b600b60009054906101000a9004600160a060020a0316600160a060020a0316635cb0c16f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611d6557600080fd5b505af1158015611d79573d6000803e3d6000fd5b505050506040513d6020811015611d8f57600080fd5b50519063ffffffff614fe916565b6000805481906101009004600160a060020a03163314801590611dd057503360009081526004602052604090205460ff16155b15611dda57600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da93929091829160449091019084908015611e855780601f10611e5a57610100808354040283529160200191611e85565b820191906000526020600020905b815481529060010190602001808311611e6857829003601f168201915b505092505050602060405180830381600087803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b505050506040513d6020811015611ecf57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da9392829160449091019084908015611f785780601f10611f4d57610100808354040283529160200191611f78565b820191906000526020600020905b815481529060010190602001808311611f5b57829003601f168201915b505092505050602060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b505050506040513d6020811015611fc257600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805483851692169190911790819055604080517fcedc7277000000000000000000000000000000000000000000000000000000008152919092166004820152905191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b15801561207257600080fd5b505af4158015612086573d6000803e3d6000fd5b505050506040513d602081101561209c57600080fd5b505192506000831180156120b05750878314155b156120c65760075460ff1615156120c657600080fd5b600e54604080517f9c473bb2000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b826191639c473bb2916044808301926000929190829003018186803b15801561214357600080fd5b505af4158015612157573d6000803e3d6000fd5b5050600e54604080517fe6e623d5000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063e6e623d592506044808301926000929190829003018186803b1580156121d857600080fd5b505af41580156121ec573d6000803e3d6000fd5b5050600e54604080517f1112b124000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b82619350631112b12492506044808301926000929190829003018186803b15801561226d57600080fd5b505af4158015612281573d6000803e3d6000fd5b5050600e54604080517fcd54c54e000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018b90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063cd54c54e92506044808301926000929190829003018186803b15801561230257600080fd5b505af4158015612316573d6000803e3d6000fd5b5050600e54604080517f05bf779f000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291891660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826193506305bf779f92506044808301926000929190829003018186803b15801561239857600080fd5b505af41580156123ac573d6000803e3d6000fd5b5050600e54604080517fdbafdbb6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018a90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063dbafdbb692506044808301926000929190829003018186803b15801561242d57600080fd5b505af4158015612441573d6000803e3d6000fd5b5050604080518b8152602081018b90528082018a905290517f9d1a3ea811a60a1b2c08f8e30a09832514a3ec19ba354d73d8fe12ad66591cec9350908190036060019150a15060019998505050505050505050565b6000610e646124a3611d05565b6124ab61135b565b9063ffffffff614fd716565b600754600090819060ff16156124cc57600080fd5b3360009081526009602052604090205460ff16156124e957600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015233602482015291861660448301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b50519050808311156125b5576125ae846000614e6a565b91506125ce565b6125ae846125c9838663ffffffff614fd716565b614e6a565b5092915050565b600080546101009004600160a060020a0316331480159061260657503360009081526004602052604090205460ff16155b1561261057600080fd5b600f805483158015740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001990921691909117909155612682576040517ff5eced797ccd723743102a9d898a1372f6bd7a0206c4facf99081b9471f5727290600090a16126ac565b6040517fd20fe4b54e307993c74930d195aa389bf91e188918e31ad1da29aad5a748a4d390600090a15b506001919050565b60075460ff1681565b600080546101009004600160a060020a031633148015906126ee57503360009081526004602052604090205460ff16155b156126f857600080fd5b600160a060020a038216151561270d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529184166024830152600060448301819052905173c0cc10d764f38245ca6b43aa1fe84c85002b826192636ace6dc8926064808301939192829003018186803b15801561279257600080fd5b505af41580156127a6573d6000803e3d6000fd5b5050604051600160a060020a03851692507f434d4944e12211f9f671e6e354248816735c0452bc160d31e737245b3dcb45c39150600090a2506001919050565b6000546101009004600160a060020a0316331480159061281657503360009081526004602052604090205460ff16155b1561282057600080fd5b600160a060020a038116151561283557600080fd5b600160a060020a0381166000908152600360209081526040808320805460ff19166001179055600590915290205460ff1615156128da576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600560205260409020805460ff191690911790555b604051600160a060020a038216907fad6de4452a631e641cb59902236607946ce9272b9b981f2f80e8d129cb9084ba90600090a250565b600030600160a060020a0383168114156129345761292d612496565b91506129cb565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b505191505b50919050565b6000546101009004600160a060020a03163314801590612a0157503360009081526004602052604090205460ff16155b15612a0b57600080fd5b6007805460ff191682151517908190556040805160ff90921615158252517f1623ff1a4138a65cb1f44d1a94c034f7dd8c1e826fefb1f27f0898580601e68d916020908290030190a150565b600f54600160a060020a031681565b600880548290811061192e57fe5b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d91602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54600160a060020a031681565b6000546101009004600160a060020a031681565b600e54604080517feec5d076000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163eec5d07691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000600d6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b820191906000526020600020905b815481529060010190602001808311612c53575b50509150506040516020818303038152906040526040518082805190602001908083835b60208310612caa5780518252601f199092019160209182019101612c8b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b33730aeaf8c2fe778797cd5464e7eb8351d28da2e8231480612d11575033731e65f71b024937b988fdba09814d60049e0fc59d145b1515612d1c57600080fd5b612d24614ff6565b612d2f838383615132565b505050565b6040805160208082528183019092526060918291600091829184918082016104008038833901905050935060009250600091505b6020821015612e1857858260208110612d7d57fe5b1a60f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916600060f860020a02141515612e0d57858260208110612dc157fe5b1a60f860020a028484815181101515612dd657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201915b600190910190612d68565b826040519080825280601f01601f191660200182016040528015612e46578160200160208202803883390190505b509050600091505b82821015612ec0578382815181101515612e6457fe5b90602001015160f860020a900460f860020a028183815181101515612e8557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190612e4e565b95945050505050565b600e54604080517f81a73ad5000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b8261916381a73ad5916024808301926020929190829003018186803b158015610e3357600080fd5b600080546101009004600160a060020a03163314801590612f7757503360009081526004602052604090205460ff16155b15612f8157600080fd5b6b1363156bbee3016d70000000612fa6612f9961135b565b849063ffffffff614fe916565b1115612fb157600080fd5b60008211612fbe57600080fd5b600b54604080517f97304ced000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03909216916397304ced9160248082019260009290919082900301818387803b15801561302457600080fd5b505af1158015613038573d6000803e3d6000fd5b50506040805185815290517f07883703ed0e86588a40d76551c92f8a4b329e3bf19765e0e6749473c1a846659350908190036020019150a160408051838152905130916000916000805160206153fa8339815191529181900360200190a3506001919050565b6000600c6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b600754600090819060ff16156130f357600080fd5b3360009081526009602052604090205460ff161561311057600080fd5b600160a060020a038316151561312557600080fd5b600160a060020a03831660009081526009602052604090205460ff161561314b57600080fd5b61315483611241565b905080151561316657600191506129cb565b600e54604080517f4698da9d000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291851660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634698da9d916044808301926000929190829003018186803b1580156131e457600080fd5b505af41580156131f8573d6000803e3d6000fd5b5050600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152602482018790529151919092169350634cfe3e7f9250604480830192600092919082900301818387803b15801561326a57600080fd5b505af115801561327e573d6000803e3d6000fd5b5050604080518481529051600160a060020a03871693503092506000805160206153fa8339815191529181900360200190a3604080518281529051600160a060020a038516917f39dfd9c15a87979822cf6b236d0974075578d5b822244050f3c876a6cd1d2055919081900360200190a250600192915050565b60075460009060ff161561330b57600080fd5b3360009081526009602052604090205460ff161561332857600080fd5b6040805134815290517fdfcc97ccd559bb2bb289cefc32e1a1212d9bf091c06ffb121083134325afa3f89181900360200190a150600190565b600e54604080517f576f7e31000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163576f7e3191602480820192602092909190829003018186803b1580156116dc57600080fd5b60075460009081908190819081908190819060ff16156133fa57600080fd5b3360009081526009602052604090205460ff161561341757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161561343f57600080fd5b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c3916044808301926020929190829003018186803b1580156134bb57600080fd5b505af41580156134cf573d6000803e3d6000fd5b505050506040513d60208110156134e557600080fd5b505115156134f257600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc7277916024808301926020929190829003018186803b15801561356857600080fd5b505af415801561357c573d6000803e3d6000fd5b505050506040513d602081101561359257600080fd5b5051600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525191975073c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156135f857600080fd5b505af415801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b505194506000341161363357600080fd5b6000861161364057600080fd5b6000851161364d57600080fd5b61365d348763ffffffff61527816565b9350846136788561366c611d05565b9063ffffffff614fe916565b111561368357600080fd5b61368b612496565b84111561369757600080fd5b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b1580156136fd57600080fd5b505af1158015613711573d6000803e3d6000fd5b505050506040513d602081101561372757600080fd5b5051600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525191935073c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b1580156137a957600080fd5b505af41580156137bd573d6000803e3d6000fd5b505050506040513d60208110156137d357600080fd5b505160105490915015806137f857506010546137f5838663ffffffff614fe916565b10155b151561380357600080fd5b6000811115613814578092506138b9565b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b15801561388a57600080fd5b505af415801561389e573d6000803e3d6000fd5b505050506040513d60208110156138b457600080fd5b505192505b6000831180156138d857506138d4828563ffffffff614fe916565b8310155b15156138e357600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a0390921691634cfe3e7f9160448082019260009290919082900301818387803b15801561394f57600080fd5b505af1158015613963573d6000803e3d6000fd5b50506040805187815290513393503092506000805160206153fa8339815191529181900360200190a3509195945050505050565b60075460009060ff16156139aa57600080fd5b3360009081526009602052604090205460ff16156139c757600080fd5b600160a060020a03831660009081526009602052604090205460ff16156139ed57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038681166024830152604482018690529151919092169163beabacc891606480830192600092919082900301818387803b158015613a6157600080fd5b505af1158015613a75573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392506000805160206153fa8339815191529181900360200190a350600192915050565b60025490565b60046020526000908152604090205460ff1681565b6000546101009004600160a060020a03163314801590613afb57503360009081526004602052604090205460ff16155b15613b0557600080fd5b613b0e816152a1565b604051600160a060020a038216907ffba24c034afca607a35e1f221b154b3f8e1f88c7924c8a0a06755b70708c44d890600090a250565b60096020526000908152604090205460ff1681565b600e54604080517f58c6bce8000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916358c6bce891604480820192602092909190829003018186803b158015610f4d57600080fd5b6000805481906101009004600160a060020a03163314801590613c0e57503360009081526004602052604090205460ff16155b15613c1857600080fd5b600160a060020a0383161515613c2d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152600160448301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191636ace6dc8916064808301926000929190829003018186803b158015613cb257600080fd5b505af4158015613cc6573d6000803e3d6000fd5b5050600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291871660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063ddf9d61392506044808301926020929190829003018186803b158015613d4857600080fd5b505af4158015613d5c573d6000803e3d6000fd5b505050506040513d6020811015613d7257600080fd5b50519050801515613e2257600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b158015613df357600080fd5b505af4158015613e07573d6000803e3d6000fd5b505050506040513d6020811015613e1d57600080fd5b505190505b604080518281529051600160a060020a038516917fcb3de9106aa8cc3efea54defa4b3ec342e8ae23607fd0255b1dcee4813f9f4bc919081900360200190a250600192915050565b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c391604480820192602092909190829003018186803b158015610f4d57600080fd5b600280548290811061192e57fe5b6000805481906101009004600160a060020a03163314801590613f2d57503360009081526004602052604090205460ff16155b15613f3757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161515613f6057600080fd5b600160a060020a03841660009081526009602052604090205460ff1615613f8657600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b158015613fe657600080fd5b505af4158015613ffa573d6000803e3d6000fd5b505050506040513d602081101561401057600080fd5b50519050806140218461366c611d05565b111561402c57600080fd5b614034612496565b83111561404057600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820187905291519190921691634cfe3e7f91604480830192600092919082900301818387803b1580156140ae57600080fd5b505af11580156140c2573d6000803e3d6000fd5b5050604080518681529051600160a060020a03881693503092506000805160206153fa8339815191529181900360200190a35060019392505050565b600080546101009004600160a060020a0316331480159061412f57503360009081526004602052604090205460ff16155b1561413957600080fd5b50601055600190565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251600091829173c0cc10d764f38245ca6b43aa1fe84c85002b8261916396468249916024808301926020929190829003018186803b1580156141bd57600080fd5b505af41580156141d1573d6000803e3d6000fd5b505050506040513d60208110156141e757600080fd5b50519050600160a060020a038116151561420057600080fd5b6000546101009004600160a060020a03163314801590614229575033600160a060020a03821614155b1561423357600080fd5b604051339084156108fc029085906000818181858888f19350505050158015614260573d6000803e3d6000fd5b506040805184815290517f4938436c771c2d50d08d91b156ca4b3ab759fa99c83c50d541e72166d46f85e09181900360200190a150600192915050565b600d805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b820191906000526020600020905b81548152906001019060200180831161430657829003601f168201915b505050505081565b600f5474010000000000000000000000000000000000000000900460ff1681565b600c805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b60075460009060ff16156143ba57600080fd5b3360009081526009602052604090205460ff16156143d757600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152336024820152918516604483015251610ec29185916125c991869173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561446757600080fd5b505af4158015611d79573d6000803e3d6000fd5b600080546101009004600160a060020a031633148015906144ac57503360009081526004602052604090205460ff16155b156144b657600080fd5b600160a060020a03831615156144cb57600080fd5b600e54604080517f4989b0b6000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152604482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634989b0b6916064808301926000929190829003018186803b15801561455057600080fd5b505af4158015614564573d6000803e3d6000fd5b5050505061457183613bdb565b5060019392505050565b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015291831660448301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b4191606480820192602092909190829003018186803b15801561460557600080fd5b505af4158015614619573d6000803e3d6000fd5b505050506040513d602081101561462f57600080fd5b50519392505050565b6b1363156bbee3016d7000000081565b6000547501000000000000000000000000000000000000000000900460ff1681565b600e54604080517f27132be6000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916327132be691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000546101009004600160a060020a0316331480159061471457503360009081526004602052604090205460ff16155b1561471e57600080fd5b600160a060020a0382166000908152600960209081526040808320805460ff1916851515179055600a90915290205460ff1615156147c7576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385169081179091556000908152600a60205260409020805460ff191690911790555b6040805182151581529051600160a060020a038416917f48335238b4855f35377ed80f164e8c6f3c366e54ac00b96a6402d4a9814a03a5919081900360200190a25050565b6000546101009004600160a060020a0316331461482857600080fd5b600160a060020a038116151561483d57600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b600e54604080517fd97e38d6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163d97e38d691604480820192602092909190829003018186803b158015610f4d57600080fd5b600080548190819081906101009004600160a060020a0316331480159061496857503360009081526004602052604090205460ff16155b1561497257600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b1580156149d257600080fd5b505af41580156149e6573d6000803e3d6000fd5b505050506040513d60208110156149fc57600080fd5b50519250600160a060020a038a161515614a1557600080fd5b600160a060020a038a1660009081526009602052604090205460ff1615614a3b57600080fd5b86861015614a4857600080fd5b82614a558a61366c611d05565b1115614a6057600080fd5b614a68612496565b891115614a7457600080fd5b879150811515614a82574291505b614a92828863ffffffff614fe916565b600e54604080517fc4b9223f000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d166024830152604482018c9052606482018590526084820183905260a4820189905287151560c48301525191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163c4b9223f9160e480820192600092909190829003018186803b158015614b3857600080fd5b505af4158015614b4c573d6000803e3d6000fd5b505060408051858152602081018590528082018a9052606081018d905288151560808201529051600160a060020a038e1693507f9c30dc484837afde1ded2722ef11ba4a8f599b3cf3205def0b668e9f5e33c79f92509081900360a00190a25060019998505050505050505050565b600e54604080517fe16dd936000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152516000918291829182918291829182918291829173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e16dd9369160448082019260e092909190829003018186803b158015614c4d57600080fd5b505af4158015614c61573d6000803e3d6000fd5b505050506040513d60e0811015614c7757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809750819850829950839c50849d50859e50869f5050505050505050600e60009054906101000a9004600160a060020a0316600160a060020a031673c0cc10d764f38245ca6b43aa1fe84c85002b826163aa77f26c90918c6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b158015614d7e57600080fd5b505af4158015614d92573d6000803e3d6000fd5b505050506040513d6020811015614da857600080fd5b5051600e54604080517fbca9adef000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d1660248301525191965073c0cc10d764f38245ca6b43aa1fe84c85002b82619163bca9adef91604480820192602092909190829003018186803b158015614e2c57600080fd5b505af4158015614e40573d6000803e3d6000fd5b505050506040513d6020811015614e5657600080fd5b5051989a9799509597949693959193909250565b60075460009060ff1615614e7d57600080fd5b3360009081526009602052604090205460ff1615614e9a57600080fd5b600160a060020a0383161515614eaf57600080fd5b600160a060020a03831660009081526009602052604090205460ff1615614ed557600080fd5b33600160a060020a0384161415614eeb57600080fd5b600e54604080517fa7070373000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201523360248201529185166044830152606482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163a7070373916084808301926000929190829003018186803b158015614f7657600080fd5b505af4158015614f8a573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b600082821115614fe357fe5b50900390565b81810182811015610ec557fe5b6000547501000000000000000000000000000000000000000000900460ff16156150a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f436f6e747261637420696e7374616e63652068617320616c726561647920696e60448201527f697469616c697a6564207468652061646d696e73000000000000000000000000606482015290519081900360840190fd5b6000805474ffffffffffffffffffffffffffffffffffffffff001916740aeaf8c2fe778797cd5464e7eb8351d28da2e823001790556150f9731e65f71b024937b988fdba09814d60049e0fc59d6152a1565b6000805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b60005460ff16156151ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201527f656e20696e697469616c697a6564000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831615156151df57600080fd5b81516151f290600c906020850190615361565b50805161520690600d906020840190615361565b50600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03858116919091179182905561523f9116613acb565b60408051600080825291513092916000805160206153fa833981519152919081900360200190a350506000805460ff1916600117905550565b600082151561528957506000610ec5565b5081810281838281151561529957fe5b0414610ec557fe5b600160a060020a03811615156152b657600080fd5b600160a060020a0381166000908152600460209081526040808320805460ff19166001179055600690915290205460ff16151561535e576002805460018082019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600660205260409020805460ff191690911790555b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153a257805160ff19168380011785556153cf565b828001600101855582156153cf579182015b828111156153cf5782518255916020019190600101906153b4565b506153db9291506153df565b5090565b610db391905b808211156153db57600081556001016153e55600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582070319faccac26b10e15dad418173f3479c86b27fb8e7783f1d756049bb4ce0a70029
Deployed Bytecode
0x6080604052600436106103765763ffffffff60e060020a6000350416630489882e811461037b57806306fdde03146103a2578063095ea7b31461042c578063115f2be21461046457806313bac8f214610485578063158ef93e1461051c5780631726cbc8146105315780631785f53c1461055257806318160ddd146105755780631a841b1b1461058a578063222101d11461059f57806323b872dd146105b45780632b28d2d0146105de578063313ce567146105f3578063313f2a211461061e5780633886c957146106525780633b0da2601461066757806341fbb05014610688578063429b62e51461069d5780634610a448146106be5780634902e4aa146106d65780634f2d7ab5146106f757806354dd1da41461070c57806354fd4d501461072157806356597e65146107365780635cb0c16f1461074b5780635da01a5b1461076057806360659a921461079057806366188463146107a55780636a420bbc146107c95780636df006f3146107e35780636f75b00c146107f8578063704802751461081957806370a082311461083a578063771eee161461085b5780637b103999146108755780637db6cc1b1461088a578063820e79ed146108a25780638620410b146108b757806388d7cd97146108cc5780638da5cb5b146108e15780638df388c1146108f65780638f1d5f7e1461090b57806390657147146109205780639201de55146109c557806395d89b41146109dd57806397304ced146109f25780639860811114610a0a57806399817b4714610a1f5780639ae066b014610a40578063a4453a9614610a48578063a6f2ae3a14610a5d578063a9059cbb14610a65578063abf7b06314610a89578063ad25cb4214610a9e578063b3292ff014610abf578063b414d4b614610ae0578063b9447f7e14610b01578063bbf8980314610b19578063c3437e0614610b3a578063c389439814610b5b578063c94e643c14610b73578063cb0b7b0314610b97578063cedcd77014610baf578063cf1f3dd714610bc7578063d28dcdea14610bdc578063d73c277c14610bf1578063d73dd62314610c06578063da14c72314610c2a578063dd62ed3e14610c4e578063ddad3ca114610c75578063deca6e7614610c8a578063e01bc60b14610c9f578063e724529c14610cb4578063f2fde38b14610cda578063f69f8a5c14610cfb578063fc13566d14610d13578063ffff6b0414610d45575b600080fd5b34801561038757600080fd5b50610390610daf565b60408051918252519081900360200190f35b3480156103ae57600080fd5b506103b7610db6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f15781810151838201526020016103d9565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043857600080fd5b50610450600160a060020a0360043516602435610e69565b604080519115158252519081900360200190f35b34801561047057600080fd5b50610390600160a060020a0360043516610ecb565b34801561049157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261045094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610f7f9650505050505050565b34801561052857600080fd5b50610450611238565b34801561053d57600080fd5b50610390600160a060020a0360043516611241565b34801561055e57600080fd5b50610573600160a060020a03600435166112c3565b005b34801561058157600080fd5b5061039061135b565b34801561059657600080fd5b506104506113eb565b3480156105ab57600080fd5b50610390611662565b3480156105c057600080fd5b50610450600160a060020a03600435811690602435166044356116f0565b3480156105ea57600080fd5b50610390611915565b3480156105ff57600080fd5b5061060861191b565b6040805160ff9092168252519081900360200190f35b34801561062a57600080fd5b50610636600435611920565b60408051600160a060020a039092168252519081900360200190f35b34801561065e57600080fd5b50610636611948565b34801561067357600080fd5b50610450600160a060020a0360043516611957565b34801561069457600080fd5b50610636611a83565b3480156106a957600080fd5b50610450600160a060020a0360043516611afd565b3480156106ca57600080fd5b50610636600435611b12565b3480156106e257600080fd5b50610573600160a060020a0360043516611b93565b34801561070357600080fd5b50610390611c2b565b34801561071857600080fd5b50610450611c31565b34801561072d57600080fd5b506103b7611c6a565b34801561074257600080fd5b50610390611ca1565b34801561075757600080fd5b50610390611d05565b34801561076c57600080fd5b50610450600435602435604435606435608435600160a060020a0360a43516611d9d565b34801561079c57600080fd5b50610390612496565b3480156107b157600080fd5b50610450600160a060020a03600435166024356124b7565b3480156107d557600080fd5b5061045060043515156125d5565b3480156107ef57600080fd5b506104506126b4565b34801561080457600080fd5b50610450600160a060020a03600435166126bd565b34801561082557600080fd5b50610573600160a060020a03600435166127e6565b34801561084657600080fd5b50610390600160a060020a0360043516612911565b34801561086757600080fd5b5061057360043515156129d1565b34801561088157600080fd5b50610636612a57565b34801561089657600080fd5b50610636600435612a66565b3480156108ae57600080fd5b50610390612a74565b3480156108c357600080fd5b50610390612aee565b3480156108d857600080fd5b50610636612b68565b3480156108ed57600080fd5b50610636612b77565b34801561090257600080fd5b50610390612b8b565b34801561091757600080fd5b50610390612c05565b34801561092c57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610573958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612cdc9650505050505050565b3480156109d157600080fd5b506103b7600435612d34565b3480156109e957600080fd5b506103b7612ec9565b3480156109fe57600080fd5b50610450600435612f46565b348015610a1657600080fd5b5061039061309e565b348015610a2b57600080fd5b50610450600160a060020a03600435166130de565b6104506132f8565b348015610a5457600080fd5b50610390613361565b6103906133db565b348015610a7157600080fd5b50610450600160a060020a0360043516602435613997565b348015610a9557600080fd5b50610390613ab0565b348015610aaa57600080fd5b50610450600160a060020a0360043516613ab6565b348015610acb57600080fd5b50610573600160a060020a0360043516613acb565b348015610aec57600080fd5b50610450600160a060020a0360043516613b45565b348015610b0d57600080fd5b50610636600435613b5a565b348015610b2557600080fd5b50610450600160a060020a0360043516613bdb565b348015610b4657600080fd5b50610450600160a060020a0360043516613e6a565b348015610b6757600080fd5b50610636600435613eec565b348015610b7f57600080fd5b50610450600160a060020a0360043516602435613efa565b348015610ba357600080fd5b506104506004356140fe565b348015610bbb57600080fd5b50610450600435614142565b348015610bd357600080fd5b506103b761429d565b348015610be857600080fd5b5061045061432b565b348015610bfd57600080fd5b506103b761434c565b348015610c1257600080fd5b50610450600160a060020a03600435166024356143a7565b348015610c3657600080fd5b50610450600160a060020a036004351660243561447b565b348015610c5a57600080fd5b50610390600160a060020a036004358116906024351661457b565b348015610c8157600080fd5b50610390614638565b348015610c9657600080fd5b50610450614648565b348015610cab57600080fd5b5061039061466a565b348015610cc057600080fd5b50610573600160a060020a036004351660243515156146e4565b348015610ce657600080fd5b50610573600160a060020a036004351661480c565b348015610d0757600080fd5b506106366004356148b0565b348015610d1f57600080fd5b50610450600160a060020a036004351660243560443560643560843560a4351515614931565b348015610d5157600080fd5b50610d66600160a060020a0360043516614bbb565b60408051998a5260208a0198909852888801969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b6001545b90565b600e54604080517f6f0fccab000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b826191636f0fccab916024808301926020929190829003018186803b158015610e3357600080fd5b505af4158015610e47573d6000803e3d6000fd5b505050506040513d6020811015610e5d57600080fd5b5051612d34565b905090565b60075460009060ff1615610e7c57600080fd5b3360009081526009602052604090205460ff1615610e9957600080fd5b811580610ead5750610eab338461457b565b155b1515610eb857600080fd5b610ec28383614e6a565b90505b92915050565b600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b158015610f4d57600080fd5b505af4158015610f61573d6000803e3d6000fd5b505050506040513d6020811015610f7757600080fd5b505192915050565b60008054819081906101009004600160a060020a03163314801590610fb457503360009081526004602052604090205460ff16155b15610fbe57600080fd5b60075460ff161515610fcf57600080fd5b8451610fe290600c906020880190615361565b508351610ff690600d906020870190615361565b50610fff6113eb565b50600f5460405160e160020a6328cf2aed028152602060048201908152600d80546002600019600183161561010002019091160460248401819052600160a060020a039094169363519e55da939192918291604490910190849080156110a65780601f1061107b576101008083540402835291602001916110a6565b820191906000526020600020905b81548152906001019060200180831161108957829003601f168201915b505092505050602060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b505050506040513d60208110156110f057600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b505092505050602060405180830381600087803b1580156111b957600080fd5b505af11580156111cd573d6000803e3d6000fd5b505050506040513d60208110156111e357600080fd5b505160408051600160a060020a0380841682528516602082015281519293507f8e2c71dfeb156b7c7d03fa7cba1af111d058c575816f578cb3c2d8c6be99e0ca929081900390910190a1506001949350505050565b60005460ff1681565b600e54604080517f7243cfbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191637243cfbb91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a031633148015906112f357503360009081526004602052604090205460ff16155b156112fd57600080fd5b600160a060020a038116151561131257600080fd5b600160a060020a038116600081815260036020526040808220805460ff19169055517f753f40ca3312b2408759a67875b367955e7baa221daf08aa3d643d96202ac12b9190a250565b600b54604080517f7e1c0c090000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691637e1c0c0991600480830192602092919082900301818787803b1580156113ba57600080fd5b505af11580156113ce573d6000803e3d6000fd5b505050506040513d60208110156113e457600080fd5b5051905090565b600080546101009004600160a060020a0316331480159061141c57503360009081526004602052604090205460ff16155b1561142657600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da939290918291604490910190849080156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b505092505050602060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156115c45780601f10611599576101008083540402835291602001916115c4565b820191906000526020600020905b8154815290600101906020018083116115a757829003601f168201915b505092505050602060405180830381600087803b1580156115e457600080fd5b505af11580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805492841692909116919091179055905061165960016129d1565b60019250505090565b600e54604080517f0b96406a000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191630b96406a91602480820192602092909190829003018186803b1580156116dc57600080fd5b505af41580156113ce573d6000803e3d6000fd5b600754600090819060ff161561170557600080fd5b3360009081526009602052604090205460ff161561172257600080fd5b600160a060020a03851660009081526009602052604090205460ff161561174857600080fd5b600160a060020a03841660009081526009602052604090205460ff161561176e57600080fd5b600160a060020a03851633141561178457600080fd5b61178e853361457b565b90508281101561179d57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151919092169163beabacc891606480830192600092919082900301818387803b15801561181357600080fd5b505af1158015611827573d6000803e3d6000fd5b5050600e5473c0cc10d764f38245ca6b43aa1fe84c85002b8261925063a70703739150600160a060020a03168733611865868963ffffffff614fd716565b6040805160e060020a63ffffffff8816028152600160a060020a0395861660048201529385166024850152919093166044830152606482019290925290516084808301926000929190829003018186803b1580156118c257600080fd5b505af41580156118d6573d6000803e3d6000fd5b5050604080518681529051600160a060020a038089169450891692506000805160206153fa8339815191529181900360200190a3506001949350505050565b60085490565b601281565b600180548290811061192e57fe5b600091825260209091200154600160a060020a0316905081565b600b54600160a060020a031681565b600080546101009004600160a060020a0316331480159061198857503360009081526004602052604090205460ff16155b1561199257600080fd5b600160a060020a03821615156119a757600080fd5b600e54604080517f3613b781000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291841660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191633613b781916044808301926000929190829003018186803b158015611a2557600080fd5b505af4158015611a39573d6000803e3d6000fd5b50505050611a46826130de565b50604051600160a060020a038316907fe8a24516e1d3bae0c4742f4e5ded148733d2193d648d57d54bbec9c20e4b444990600090a2506001919050565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191639646824991602480820192602092909190829003018186803b1580156116dc57600080fd5b60036020526000908152604090205460ff1681565b600e54604080517f52bafbfa000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916352bafbfa91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a03163314801590611bc357503360009081526004602052604090205460ff16155b15611bcd57600080fd5b600160a060020a0381161515611be257600080fd5b600160a060020a038116600081815260046020526040808220805460ff19169055517f1aaaaf7609619e631f47eb3546f9fdd8c61b1af2175988a0ddb9a06680c3b9ed9190a250565b60105481565b60075460009060ff1615611c4457600080fd5b3360009081526009602052604090205460ff1615611c6157600080fd5b610e64336130de565b60408051808201909152600181527f3300000000000000000000000000000000000000000000000000000000000000602082015281565b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000610e64611d12612b8b565b600b60009054906101000a9004600160a060020a0316600160a060020a0316635cb0c16f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611d6557600080fd5b505af1158015611d79573d6000803e3d6000fd5b505050506040513d6020811015611d8f57600080fd5b50519063ffffffff614fe916565b6000805481906101009004600160a060020a03163314801590611dd057503360009081526004602052604090205460ff16155b15611dda57600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da93929091829160449091019084908015611e855780601f10611e5a57610100808354040283529160200191611e85565b820191906000526020600020905b815481529060010190602001808311611e6857829003601f168201915b505092505050602060405180830381600087803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b505050506040513d6020811015611ecf57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da9392829160449091019084908015611f785780601f10611f4d57610100808354040283529160200191611f78565b820191906000526020600020905b815481529060010190602001808311611f5b57829003601f168201915b505092505050602060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b505050506040513d6020811015611fc257600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805483851692169190911790819055604080517fcedc7277000000000000000000000000000000000000000000000000000000008152919092166004820152905191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b15801561207257600080fd5b505af4158015612086573d6000803e3d6000fd5b505050506040513d602081101561209c57600080fd5b505192506000831180156120b05750878314155b156120c65760075460ff1615156120c657600080fd5b600e54604080517f9c473bb2000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b826191639c473bb2916044808301926000929190829003018186803b15801561214357600080fd5b505af4158015612157573d6000803e3d6000fd5b5050600e54604080517fe6e623d5000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063e6e623d592506044808301926000929190829003018186803b1580156121d857600080fd5b505af41580156121ec573d6000803e3d6000fd5b5050600e54604080517f1112b124000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b82619350631112b12492506044808301926000929190829003018186803b15801561226d57600080fd5b505af4158015612281573d6000803e3d6000fd5b5050600e54604080517fcd54c54e000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018b90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063cd54c54e92506044808301926000929190829003018186803b15801561230257600080fd5b505af4158015612316573d6000803e3d6000fd5b5050600e54604080517f05bf779f000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291891660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826193506305bf779f92506044808301926000929190829003018186803b15801561239857600080fd5b505af41580156123ac573d6000803e3d6000fd5b5050600e54604080517fdbafdbb6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018a90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063dbafdbb692506044808301926000929190829003018186803b15801561242d57600080fd5b505af4158015612441573d6000803e3d6000fd5b5050604080518b8152602081018b90528082018a905290517f9d1a3ea811a60a1b2c08f8e30a09832514a3ec19ba354d73d8fe12ad66591cec9350908190036060019150a15060019998505050505050505050565b6000610e646124a3611d05565b6124ab61135b565b9063ffffffff614fd716565b600754600090819060ff16156124cc57600080fd5b3360009081526009602052604090205460ff16156124e957600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015233602482015291861660448301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b50519050808311156125b5576125ae846000614e6a565b91506125ce565b6125ae846125c9838663ffffffff614fd716565b614e6a565b5092915050565b600080546101009004600160a060020a0316331480159061260657503360009081526004602052604090205460ff16155b1561261057600080fd5b600f805483158015740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001990921691909117909155612682576040517ff5eced797ccd723743102a9d898a1372f6bd7a0206c4facf99081b9471f5727290600090a16126ac565b6040517fd20fe4b54e307993c74930d195aa389bf91e188918e31ad1da29aad5a748a4d390600090a15b506001919050565b60075460ff1681565b600080546101009004600160a060020a031633148015906126ee57503360009081526004602052604090205460ff16155b156126f857600080fd5b600160a060020a038216151561270d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529184166024830152600060448301819052905173c0cc10d764f38245ca6b43aa1fe84c85002b826192636ace6dc8926064808301939192829003018186803b15801561279257600080fd5b505af41580156127a6573d6000803e3d6000fd5b5050604051600160a060020a03851692507f434d4944e12211f9f671e6e354248816735c0452bc160d31e737245b3dcb45c39150600090a2506001919050565b6000546101009004600160a060020a0316331480159061281657503360009081526004602052604090205460ff16155b1561282057600080fd5b600160a060020a038116151561283557600080fd5b600160a060020a0381166000908152600360209081526040808320805460ff19166001179055600590915290205460ff1615156128da576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600560205260409020805460ff191690911790555b604051600160a060020a038216907fad6de4452a631e641cb59902236607946ce9272b9b981f2f80e8d129cb9084ba90600090a250565b600030600160a060020a0383168114156129345761292d612496565b91506129cb565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b505191505b50919050565b6000546101009004600160a060020a03163314801590612a0157503360009081526004602052604090205460ff16155b15612a0b57600080fd5b6007805460ff191682151517908190556040805160ff90921615158252517f1623ff1a4138a65cb1f44d1a94c034f7dd8c1e826fefb1f27f0898580601e68d916020908290030190a150565b600f54600160a060020a031681565b600880548290811061192e57fe5b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d91602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54600160a060020a031681565b6000546101009004600160a060020a031681565b600e54604080517feec5d076000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163eec5d07691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000600d6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b820191906000526020600020905b815481529060010190602001808311612c53575b50509150506040516020818303038152906040526040518082805190602001908083835b60208310612caa5780518252601f199092019160209182019101612c8b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b33730aeaf8c2fe778797cd5464e7eb8351d28da2e8231480612d11575033731e65f71b024937b988fdba09814d60049e0fc59d145b1515612d1c57600080fd5b612d24614ff6565b612d2f838383615132565b505050565b6040805160208082528183019092526060918291600091829184918082016104008038833901905050935060009250600091505b6020821015612e1857858260208110612d7d57fe5b1a60f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916600060f860020a02141515612e0d57858260208110612dc157fe5b1a60f860020a028484815181101515612dd657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201915b600190910190612d68565b826040519080825280601f01601f191660200182016040528015612e46578160200160208202803883390190505b509050600091505b82821015612ec0578382815181101515612e6457fe5b90602001015160f860020a900460f860020a028183815181101515612e8557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190612e4e565b95945050505050565b600e54604080517f81a73ad5000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b8261916381a73ad5916024808301926020929190829003018186803b158015610e3357600080fd5b600080546101009004600160a060020a03163314801590612f7757503360009081526004602052604090205460ff16155b15612f8157600080fd5b6b1363156bbee3016d70000000612fa6612f9961135b565b849063ffffffff614fe916565b1115612fb157600080fd5b60008211612fbe57600080fd5b600b54604080517f97304ced000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03909216916397304ced9160248082019260009290919082900301818387803b15801561302457600080fd5b505af1158015613038573d6000803e3d6000fd5b50506040805185815290517f07883703ed0e86588a40d76551c92f8a4b329e3bf19765e0e6749473c1a846659350908190036020019150a160408051838152905130916000916000805160206153fa8339815191529181900360200190a3506001919050565b6000600c6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b600754600090819060ff16156130f357600080fd5b3360009081526009602052604090205460ff161561311057600080fd5b600160a060020a038316151561312557600080fd5b600160a060020a03831660009081526009602052604090205460ff161561314b57600080fd5b61315483611241565b905080151561316657600191506129cb565b600e54604080517f4698da9d000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291851660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634698da9d916044808301926000929190829003018186803b1580156131e457600080fd5b505af41580156131f8573d6000803e3d6000fd5b5050600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152602482018790529151919092169350634cfe3e7f9250604480830192600092919082900301818387803b15801561326a57600080fd5b505af115801561327e573d6000803e3d6000fd5b5050604080518481529051600160a060020a03871693503092506000805160206153fa8339815191529181900360200190a3604080518281529051600160a060020a038516917f39dfd9c15a87979822cf6b236d0974075578d5b822244050f3c876a6cd1d2055919081900360200190a250600192915050565b60075460009060ff161561330b57600080fd5b3360009081526009602052604090205460ff161561332857600080fd5b6040805134815290517fdfcc97ccd559bb2bb289cefc32e1a1212d9bf091c06ffb121083134325afa3f89181900360200190a150600190565b600e54604080517f576f7e31000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163576f7e3191602480820192602092909190829003018186803b1580156116dc57600080fd5b60075460009081908190819081908190819060ff16156133fa57600080fd5b3360009081526009602052604090205460ff161561341757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161561343f57600080fd5b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c3916044808301926020929190829003018186803b1580156134bb57600080fd5b505af41580156134cf573d6000803e3d6000fd5b505050506040513d60208110156134e557600080fd5b505115156134f257600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc7277916024808301926020929190829003018186803b15801561356857600080fd5b505af415801561357c573d6000803e3d6000fd5b505050506040513d602081101561359257600080fd5b5051600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525191975073c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156135f857600080fd5b505af415801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b505194506000341161363357600080fd5b6000861161364057600080fd5b6000851161364d57600080fd5b61365d348763ffffffff61527816565b9350846136788561366c611d05565b9063ffffffff614fe916565b111561368357600080fd5b61368b612496565b84111561369757600080fd5b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b1580156136fd57600080fd5b505af1158015613711573d6000803e3d6000fd5b505050506040513d602081101561372757600080fd5b5051600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525191935073c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b1580156137a957600080fd5b505af41580156137bd573d6000803e3d6000fd5b505050506040513d60208110156137d357600080fd5b505160105490915015806137f857506010546137f5838663ffffffff614fe916565b10155b151561380357600080fd5b6000811115613814578092506138b9565b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b15801561388a57600080fd5b505af415801561389e573d6000803e3d6000fd5b505050506040513d60208110156138b457600080fd5b505192505b6000831180156138d857506138d4828563ffffffff614fe916565b8310155b15156138e357600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a0390921691634cfe3e7f9160448082019260009290919082900301818387803b15801561394f57600080fd5b505af1158015613963573d6000803e3d6000fd5b50506040805187815290513393503092506000805160206153fa8339815191529181900360200190a3509195945050505050565b60075460009060ff16156139aa57600080fd5b3360009081526009602052604090205460ff16156139c757600080fd5b600160a060020a03831660009081526009602052604090205460ff16156139ed57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038681166024830152604482018690529151919092169163beabacc891606480830192600092919082900301818387803b158015613a6157600080fd5b505af1158015613a75573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392506000805160206153fa8339815191529181900360200190a350600192915050565b60025490565b60046020526000908152604090205460ff1681565b6000546101009004600160a060020a03163314801590613afb57503360009081526004602052604090205460ff16155b15613b0557600080fd5b613b0e816152a1565b604051600160a060020a038216907ffba24c034afca607a35e1f221b154b3f8e1f88c7924c8a0a06755b70708c44d890600090a250565b60096020526000908152604090205460ff1681565b600e54604080517f58c6bce8000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916358c6bce891604480820192602092909190829003018186803b158015610f4d57600080fd5b6000805481906101009004600160a060020a03163314801590613c0e57503360009081526004602052604090205460ff16155b15613c1857600080fd5b600160a060020a0383161515613c2d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152600160448301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191636ace6dc8916064808301926000929190829003018186803b158015613cb257600080fd5b505af4158015613cc6573d6000803e3d6000fd5b5050600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291871660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063ddf9d61392506044808301926020929190829003018186803b158015613d4857600080fd5b505af4158015613d5c573d6000803e3d6000fd5b505050506040513d6020811015613d7257600080fd5b50519050801515613e2257600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b158015613df357600080fd5b505af4158015613e07573d6000803e3d6000fd5b505050506040513d6020811015613e1d57600080fd5b505190505b604080518281529051600160a060020a038516917fcb3de9106aa8cc3efea54defa4b3ec342e8ae23607fd0255b1dcee4813f9f4bc919081900360200190a250600192915050565b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c391604480820192602092909190829003018186803b158015610f4d57600080fd5b600280548290811061192e57fe5b6000805481906101009004600160a060020a03163314801590613f2d57503360009081526004602052604090205460ff16155b15613f3757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161515613f6057600080fd5b600160a060020a03841660009081526009602052604090205460ff1615613f8657600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b158015613fe657600080fd5b505af4158015613ffa573d6000803e3d6000fd5b505050506040513d602081101561401057600080fd5b50519050806140218461366c611d05565b111561402c57600080fd5b614034612496565b83111561404057600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820187905291519190921691634cfe3e7f91604480830192600092919082900301818387803b1580156140ae57600080fd5b505af11580156140c2573d6000803e3d6000fd5b5050604080518681529051600160a060020a03881693503092506000805160206153fa8339815191529181900360200190a35060019392505050565b600080546101009004600160a060020a0316331480159061412f57503360009081526004602052604090205460ff16155b1561413957600080fd5b50601055600190565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251600091829173c0cc10d764f38245ca6b43aa1fe84c85002b8261916396468249916024808301926020929190829003018186803b1580156141bd57600080fd5b505af41580156141d1573d6000803e3d6000fd5b505050506040513d60208110156141e757600080fd5b50519050600160a060020a038116151561420057600080fd5b6000546101009004600160a060020a03163314801590614229575033600160a060020a03821614155b1561423357600080fd5b604051339084156108fc029085906000818181858888f19350505050158015614260573d6000803e3d6000fd5b506040805184815290517f4938436c771c2d50d08d91b156ca4b3ab759fa99c83c50d541e72166d46f85e09181900360200190a150600192915050565b600d805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b820191906000526020600020905b81548152906001019060200180831161430657829003601f168201915b505050505081565b600f5474010000000000000000000000000000000000000000900460ff1681565b600c805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b60075460009060ff16156143ba57600080fd5b3360009081526009602052604090205460ff16156143d757600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152336024820152918516604483015251610ec29185916125c991869173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561446757600080fd5b505af4158015611d79573d6000803e3d6000fd5b600080546101009004600160a060020a031633148015906144ac57503360009081526004602052604090205460ff16155b156144b657600080fd5b600160a060020a03831615156144cb57600080fd5b600e54604080517f4989b0b6000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152604482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634989b0b6916064808301926000929190829003018186803b15801561455057600080fd5b505af4158015614564573d6000803e3d6000fd5b5050505061457183613bdb565b5060019392505050565b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015291831660448301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b4191606480820192602092909190829003018186803b15801561460557600080fd5b505af4158015614619573d6000803e3d6000fd5b505050506040513d602081101561462f57600080fd5b50519392505050565b6b1363156bbee3016d7000000081565b6000547501000000000000000000000000000000000000000000900460ff1681565b600e54604080517f27132be6000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916327132be691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000546101009004600160a060020a0316331480159061471457503360009081526004602052604090205460ff16155b1561471e57600080fd5b600160a060020a0382166000908152600960209081526040808320805460ff1916851515179055600a90915290205460ff1615156147c7576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385169081179091556000908152600a60205260409020805460ff191690911790555b6040805182151581529051600160a060020a038416917f48335238b4855f35377ed80f164e8c6f3c366e54ac00b96a6402d4a9814a03a5919081900360200190a25050565b6000546101009004600160a060020a0316331461482857600080fd5b600160a060020a038116151561483d57600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b600e54604080517fd97e38d6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163d97e38d691604480820192602092909190829003018186803b158015610f4d57600080fd5b600080548190819081906101009004600160a060020a0316331480159061496857503360009081526004602052604090205460ff16155b1561497257600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b1580156149d257600080fd5b505af41580156149e6573d6000803e3d6000fd5b505050506040513d60208110156149fc57600080fd5b50519250600160a060020a038a161515614a1557600080fd5b600160a060020a038a1660009081526009602052604090205460ff1615614a3b57600080fd5b86861015614a4857600080fd5b82614a558a61366c611d05565b1115614a6057600080fd5b614a68612496565b891115614a7457600080fd5b879150811515614a82574291505b614a92828863ffffffff614fe916565b600e54604080517fc4b9223f000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d166024830152604482018c9052606482018590526084820183905260a4820189905287151560c48301525191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163c4b9223f9160e480820192600092909190829003018186803b158015614b3857600080fd5b505af4158015614b4c573d6000803e3d6000fd5b505060408051858152602081018590528082018a9052606081018d905288151560808201529051600160a060020a038e1693507f9c30dc484837afde1ded2722ef11ba4a8f599b3cf3205def0b668e9f5e33c79f92509081900360a00190a25060019998505050505050505050565b600e54604080517fe16dd936000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152516000918291829182918291829182918291829173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e16dd9369160448082019260e092909190829003018186803b158015614c4d57600080fd5b505af4158015614c61573d6000803e3d6000fd5b505050506040513d60e0811015614c7757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809750819850829950839c50849d50859e50869f5050505050505050600e60009054906101000a9004600160a060020a0316600160a060020a031673c0cc10d764f38245ca6b43aa1fe84c85002b826163aa77f26c90918c6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b158015614d7e57600080fd5b505af4158015614d92573d6000803e3d6000fd5b505050506040513d6020811015614da857600080fd5b5051600e54604080517fbca9adef000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d1660248301525191965073c0cc10d764f38245ca6b43aa1fe84c85002b82619163bca9adef91604480820192602092909190829003018186803b158015614e2c57600080fd5b505af4158015614e40573d6000803e3d6000fd5b505050506040513d6020811015614e5657600080fd5b5051989a9799509597949693959193909250565b60075460009060ff1615614e7d57600080fd5b3360009081526009602052604090205460ff1615614e9a57600080fd5b600160a060020a0383161515614eaf57600080fd5b600160a060020a03831660009081526009602052604090205460ff1615614ed557600080fd5b33600160a060020a0384161415614eeb57600080fd5b600e54604080517fa7070373000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201523360248201529185166044830152606482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163a7070373916084808301926000929190829003018186803b158015614f7657600080fd5b505af4158015614f8a573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b600082821115614fe357fe5b50900390565b81810182811015610ec557fe5b6000547501000000000000000000000000000000000000000000900460ff16156150a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f436f6e747261637420696e7374616e63652068617320616c726561647920696e60448201527f697469616c697a6564207468652061646d696e73000000000000000000000000606482015290519081900360840190fd5b6000805474ffffffffffffffffffffffffffffffffffffffff001916740aeaf8c2fe778797cd5464e7eb8351d28da2e823001790556150f9731e65f71b024937b988fdba09814d60049e0fc59d6152a1565b6000805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b60005460ff16156151ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201527f656e20696e697469616c697a6564000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831615156151df57600080fd5b81516151f290600c906020850190615361565b50805161520690600d906020840190615361565b50600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03858116919091179182905561523f9116613acb565b60408051600080825291513092916000805160206153fa833981519152919081900360200190a350506000805460ff1916600117905550565b600082151561528957506000610ec5565b5081810281838281151561529957fe5b0414610ec557fe5b600160a060020a03811615156152b657600080fd5b600160a060020a0381166000908152600460209081526040808320805460ff19166001179055600690915290205460ff16151561535e576002805460018082019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600660205260409020805460ff191690911790555b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153a257805160ff19168380011785556153cf565b828001600101855582156153cf579182015b828111156153cf5782518255916020019190600101906153b4565b506153db9291506153df565b5090565b610db391905b808211156153db57600081556001016153e55600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582070319faccac26b10e15dad418173f3479c86b27fb8e7783f1d756049bb4ce0a70029
Swarm Source
bzzr://70319faccac26b10e15dad418173f3479c86b27fb8e7783f1d756049bb4ce0a7
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.