Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 262 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Offchain Vot... | 13242320 | 1308 days ago | IN | 0 ETH | 0.01273064 | ||||
Add Offchain Vot... | 13242307 | 1308 days ago | IN | 0 ETH | 0.01113931 | ||||
Vote | 13108244 | 1329 days ago | IN | 0 ETH | 0.01860796 | ||||
Vote | 13107410 | 1329 days ago | IN | 0 ETH | 0.00643238 | ||||
Vote | 13107016 | 1329 days ago | IN | 0 ETH | 0.00597292 | ||||
Vote | 13099950 | 1330 days ago | IN | 0 ETH | 0.00612608 | ||||
Vote | 13097781 | 1330 days ago | IN | 0 ETH | 0.0060495 | ||||
Vote | 13094569 | 1331 days ago | IN | 0 ETH | 0.00543689 | ||||
Vote | 13094427 | 1331 days ago | IN | 0 ETH | 0.00551347 | ||||
Vote | 13093339 | 1331 days ago | IN | 0 ETH | 0.00597292 | ||||
Vote | 13093221 | 1331 days ago | IN | 0 ETH | 0.00505401 | ||||
Vote | 13090530 | 1331 days ago | IN | 0 ETH | 0.00903596 | ||||
Vote | 13089645 | 1331 days ago | IN | 0 ETH | 0.00811705 | ||||
Vote | 13088703 | 1332 days ago | IN | 0 ETH | 0.00842468 | ||||
Vote | 13088655 | 1332 days ago | IN | 0 ETH | 0.00819363 | ||||
Vote | 13088123 | 1332 days ago | IN | 0 ETH | 0.00551347 | ||||
Vote | 13087816 | 1332 days ago | IN | 0 ETH | 0.0044414 | ||||
Vote | 13087215 | 1332 days ago | IN | 0 ETH | 0.00467113 | ||||
Vote | 13081608 | 1333 days ago | IN | 0 ETH | 0.00329328 | ||||
Vote | 13081044 | 1333 days ago | IN | 0 ETH | 0.00344646 | ||||
Vote | 13076588 | 1333 days ago | IN | 0 ETH | 0.0041351 | ||||
Vote | 13075961 | 1334 days ago | IN | 0 ETH | 0.00582068 | ||||
Vote | 13074722 | 1334 days ago | IN | 0 ETH | 0.00168493 | ||||
Vote | 13061285 | 1336 days ago | IN | 0 ETH | 0.00290988 | ||||
Vote | 13061139 | 1336 days ago | IN | 0 ETH | 0.00306304 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
VotingCenter
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-18 */ pragma solidity 0.4.26; /// @title uniquely identifies deployable (non-abstract) platform contract /// @notice cheap way of assigning implementations to knownInterfaces which represent system services /// unfortunatelly ERC165 does not include full public interface (ABI) and does not provide way to list implemented interfaces /// EIP820 still in the making /// @dev ids are generated as follows keccak256("neufund-platform:<contract name>") /// ids roughly correspond to ABIs contract IContractId { /// @param id defined as above /// @param version implementation version function contractId() public pure returns (bytes32 id, uint256 version); } /// @title access to snapshots of a token /// @notice allows to implement complex token holder rights like revenue disbursal or voting /// @notice snapshots are series of values with assigned ids. ids increase strictly. particular id mechanism is not assumed contract ITokenSnapshots { //////////////////////// // Public functions //////////////////////// /// @notice Total amount of tokens at a specific `snapshotId`. /// @param snapshotId of snapshot at which totalSupply is queried /// @return The total amount of tokens at `snapshotId` /// @dev reverts on snapshotIds greater than currentSnapshotId() /// @dev returns 0 for snapshotIds less than snapshotId of first value function totalSupplyAt(uint256 snapshotId) public constant returns(uint256); /// @dev Queries the balance of `owner` at a specific `snapshotId` /// @param owner The address from which the balance will be retrieved /// @param snapshotId of snapshot at which the balance is queried /// @return The balance at `snapshotId` function balanceOfAt(address owner, uint256 snapshotId) public constant returns (uint256); /// @notice upper bound of series of snapshotIds for which there's a value in series /// @return snapshotId function currentSnapshotId() public constant returns (uint256); } // standard methods of VotingCenter contract that governs voting procedures on the whole platform contract IVotingCenter is IContractId { /// @dev Creates a proposal, uniquely identifiable by its assigned proposalId /// @param proposalId unique identifier of the proposal, e.g. ipfs-hash of info /// @param token a token where balances give voting power to holders /// @param campaignDuration duration (s) in which proposal has to gather enough votes to be made public (see campaignQuorum) /// @param campaignQuorumFraction fraction (10**18 = 1) of token holders who have to support a proposal in order for it to be trigger an event /// @param votingPeriod total duration (s) in which the proposal can be voted on by tokenholders after it was created /// @param votingLegalRep a legal representative for the vote, which may provide off-chain voting results /// @param offchainVotePeriod duration (s) after voting is ended when voting legal rep may provide results /// @param totalVotingPower combined voting power of on-chain (token total supply) and held off-chain (ie. shares) expressed in tokens /// @param action initiator defined action code on which voting happens /// @param actionPayload initiator defined action payload on which voting happens function addProposal( bytes32 proposalId, ITokenSnapshots token, uint32 campaignDuration, uint256 campaignQuorumFraction, uint32 votingPeriod, address votingLegalRep, uint32 offchainVotePeriod, uint256 totalVotingPower, uint256 action, bytes actionPayload, bool enableObserver ) public; /// @dev increase the voting power on a given proposal by the token balance of the sender /// throws if proposal does not exist or the vote on it has ended already. Votes are final, /// changing the vote is not allowed /// @dev reverts if proposal does not exist /// @param proposalId of the proposal to be voted on /// @param voteInFavor if true, voting power goes for proposal, if false - against function vote(bytes32 proposalId, bool voteInFavor) public; /// @notice add off-chain votes, inFavor + against may not cross the offchainVotingPower, but may be less /// to reflect abstaining from vote /// @param inFavor voting power (expressed in tokens) being in favor of the proposal /// @param against voting power (expressed in tokens) being against the proposal /// @param documentUri official document with final voting results function addOffchainVote(bytes32 proposalId, uint256 inFavor, uint256 against, string documentUri) public; /// @notice Returns the current tally of a proposal. Only Final proposal have immutable tally /// @return the voting power on a finished proposal and the total voting power /// @dev please again note that VotingCenter does not say if voting passed in favor or against. it just carries on /// the voting and it's up to initiator to say what is the outcome, see IProposalObserver function tally(bytes32 proposalId) public constant returns( uint8 s, uint256 inFavor, uint256 against, uint256 offchainInFavor, uint256 offchainAgainst, uint256 tokenVotingPower, uint256 totalVotingPower, uint256 campaignQuorumTokenAmount, address initiator, bool hasObserverInterface ); /// @notice returns official document with off-chain vote result/statement /// @dev meaningful only in final state function offchainVoteDocumentUri(bytes32 proposalId) public constant returns (string); /// @notice obtains proposal after internal state is updated due to time /// @dev this is the getter you should use /// @dev reverts if proposal does not exist function timedProposal(bytes32 proposalId) public constant returns ( uint8 s, address token, uint256 snapshotId, address initiator, address votingLegalRep, uint256 campaignQuorumTokenAmount, uint256 offchainVotingPower, uint256 action, bytes actionPayload, bool enableObserver, uint32[5] deadlines ); /// @notice obtains proposal state without time transitions /// @dev used mostly to detect propositions requiring timed transitions /// @dev reverts if proposal does not exist function proposal(bytes32 proposalId) public constant returns ( uint8 s, address token, uint256 snapshotId, address initiator, address votingLegalRep, uint256 campaignQuorumTokenAmount, uint256 offchainVotingPower, uint256 action, bytes actionPayload, bool enableObserver, uint32[5] deadlines ); /// @notice tells if voter cast a for/against vote or abstained /// @dev reverts if proposal does not exist /// @return see TriState in VotingProposal function getVote(bytes32 proposalId, address voter) public constant returns (uint8); /// @notice tells if proposal with given id was opened function hasProposal(bytes32 proposalId) public constant returns (bool); /// @notice returns voting power for given proposal / voter /// @dev voters with zero voting power cannot participate in voting function getVotingPower(bytes32 proposalId, address voter) public constant returns (uint256); } contract IVotingController is IContractId { // token must be NEU or equity token // if initiator is not equity token then proposals start in campaign mode // if token is NEU then default values must apply function onAddProposal(bytes32 proposalId, address initiator, address token) public constant returns (bool); /// @notice check wether the disbursal controller may be changed function onChangeVotingController(address sender, IVotingController newController) public constant returns (bool); } library Math { //////////////////////// // Internal functions //////////////////////// // absolute difference: |v1 - v2| function absDiff(uint256 v1, uint256 v2) internal pure returns(uint256) { return v1 > v2 ? v1 - v2 : v2 - v1; } // divide v by d, round up if remainder is 0.5 or more function divRound(uint256 v, uint256 d) internal pure returns(uint256) { return add(v, d/2) / d; } // computes decimal decimalFraction 'frac' of 'amount' with maximum precision (multiplication first) // both amount and decimalFraction must have 18 decimals precision, frac 10**18 represents a whole (100% of) amount // mind loss of precision as decimal fractions do not have finite binary expansion // do not use instead of division function decimalFraction(uint256 amount, uint256 frac) internal pure returns(uint256) { // it's like 1 ether is 100% proportion return proportion(amount, frac, 10**18); } // computes part/total of amount with maximum precision (multiplication first) // part and total must have the same units function proportion(uint256 amount, uint256 part, uint256 total) internal pure returns(uint256) { return divRound(mul(amount, part), total); } // // Open Zeppelin Math library below // function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } } /// @notice should be implemented by all contracts that initate the voting center procedure /// must be implemented by all contracts that initate voting procedure AND request observer callbacks contract IVotingObserver { /// @notice if requested, voting center will pass state transitions of proposal to observer /// @dev refer to VotingProposal for state variable values function onProposalStateTransition( bytes32 proposalId, uint8 oldState, uint8 newState) public; /// @notice only observer may tell if vote was in favor or not, voting center only carries on voting procedure /// example is equity token controller as observer which will count outcome as passed depending on company bylaws /// @param votingCenter at which voting center to look for the results /// @param proposalId for which proposalId to deliver results /// @return true means inFavor, false means agains, revert means that procedure is not yet final or any other problem /// @dev please note the revert/false distinction above, do not returns false in case voting is unknown or not yet final function votingResult(address votingCenter, bytes32 proposalId) public constant returns (bool inFavor); } library VotingProposal { //////////////////////// // Constants //////////////////////// uint256 private constant STATES_COUNT = 5; //////////////////////// // Types //////////////////////// enum State { // Initial state where voting owner can build quorum for public visibility Campaigning, // has passed campaign-quorum in time, voting publicly announced Public, // reveal state where meta-transactions are gathered Reveal, // For votings that have off-chain counterpart, this is the time to upload the tally Tally, // Vote count will not change and tally is available, terminal state Final } // Łukasiewicz logic values for state of a vote of particular voter /// @dev note that Abstain is meaningful only in Final/Tally state enum TriState { Abstain, InFavor, Against } /// @dev note that voting power is always expressed in tokens of the associated snapshot token /// and reflect decimals of the token. voting power of 1 token with 18 decimals is Q18 struct Proposal { // voting power comes from here ITokenSnapshots token; // balances at this snapshot count uint256 snapshotId; // on-chain tally uint256 inFavor; uint256 against; // off-chain tally uint256 offchainInFavor; uint256 offchainAgainst; // quorum needed to reach public phase uint256 campaignQuorumTokenAmount; // off-chain voting power uint256 offchainVotingPower; // voting initiator IVotingObserver initiator; // voting legal representative address votingLegalRep; // proposal action as set by initiator uint256 action; // on chain proposal action payload bytes actionPayload; // off-chain official results string offchainVoteDocumentUri; // when states end, indexed by state, keep it word aligned uint32[STATES_COUNT] deadlines; // current state of the voting State state; // observer function requested to owner? bool observing; // you can vote only once mapping (address => TriState) hasVoted; } ///////////////////////// // Events //////////////////////// event LogProposalStateTransition( bytes32 indexed proposalId, address initiator, address votingLegalRep, address token, State oldState, State newState ); ///////////////////////// // Internal Lib Functions //////////////////////// function isVotingOpen(VotingProposal.Proposal storage p) internal constant returns (bool) { return p.state == State.Campaigning || p.state == State.Public; } function isRelayOpen(VotingProposal.Proposal storage p) internal constant returns (bool) { return isVotingOpen(p) || p.state == State.Reveal; } function initialize( Proposal storage p, bytes32 proposalId, ITokenSnapshots token, uint256 snapshotId, uint32 campaignDuration, uint256 campaignQuorumFraction, uint32 votingPeriod, address votingLegalRep, uint32 offchainVotePeriod, uint256 totalVotingPower, uint256 action, bool enableObserver ) internal { uint256 totalTokenVotes = token.totalSupplyAt(snapshotId); require(totalTokenVotes > 0, "NF_VC_EMPTY_TOKEN"); require(totalVotingPower == 0 || totalVotingPower >= totalTokenVotes, "NF_VC_TOTPOWER_LT_TOKEN"); // set initial deadlines uint32[STATES_COUNT] memory deadlines; uint32 t = uint32(now); deadlines[0] = t; deadlines[1] = t + campaignDuration; // no reveal now deadlines[2] = deadlines[3] = t + votingPeriod; // offchain voting deadline // if all voting power belongs to token holders then off-chain tally must be skipped deadlines[4] = deadlines[3] + (totalVotingPower == totalTokenVotes ? 0 : offchainVotePeriod); // can't use struct constructor because it goes through memory // p is already allocated storage slot p.token = token; p.snapshotId = snapshotId; p.observing = enableObserver; p.votingLegalRep = votingLegalRep; p.offchainVotingPower = totalVotingPower > 0 ? Math.sub(totalVotingPower, totalTokenVotes) : 0; // campaign must cross total voting power p.campaignQuorumTokenAmount = Math.decimalFraction(totalTokenVotes + p.offchainVotingPower, campaignQuorumFraction); require(p.campaignQuorumTokenAmount <= totalTokenVotes, "NF_VC_NO_CAMP_VOTING_POWER"); p.initiator = IVotingObserver(msg.sender); p.deadlines = deadlines; p.state = State.Campaigning; p.action = action; // advance campaigning state to public if quorum not specified // that will also emit event if such transition happen advanceLogicState(p, proposalId); } // @dev don't use `else if` and keep sorted by time and call `state()` // or else multiple transitions won't cascade properly. function advanceTimedState(Proposal storage p, bytes32 proposalId) internal { uint32 t = uint32(now); // campaign timeout to final if (p.state == State.Campaigning && t >= p.deadlines[uint32(State.Public)]) { transitionTo(p, proposalId, State.Final); } // other states go one by one, terminal state stops while(p.state != State.Final && t >= p.deadlines[uint32(p.state) + 1]) { transitionTo(p, proposalId, State(uint8(p.state) + 1)); } } // @notice transitions due to business logic // @dev called after logic function advanceLogicState(Proposal storage p, bytes32 proposalId) internal { // State state = p.state; // if crossed campaign quorum if (p.state == State.Campaigning && p.inFavor + p.against >= p.campaignQuorumTokenAmount) { // go to public state transitionTo(p, proposalId, State.Public); } // if off-chain tally done if (p.state == State.Tally && p.offchainAgainst + p.offchainInFavor > 0) { // finalize transitionTo(p, proposalId, State.Final); } } /// @notice executes transition state function function transitionTo(Proposal storage p, bytes32 proposalId, State newState) private { State oldState = p.state; // get deadline for old state and check the delta for other states uint32 delta; uint32 deadline = p.deadlines[uint256(oldState) + 1]; // if transition came before deadline, count time from timestamp, if after always count from deadline if (uint32(now) < deadline) { delta = deadline - uint32(now); } if (delta > 0) { // shift dealines for other states uint32[STATES_COUNT] memory newDeadlines = p.deadlines; for (uint256 ii = uint256(oldState) + 1; ii < STATES_COUNT; ii += 1) { newDeadlines[ii] -= delta; } p.deadlines = newDeadlines; } // write storage p.state = newState; // do not emit events and observer if campaigning failed if (oldState == State.Campaigning && newState == State.Final) { return; } emit LogProposalStateTransition(proposalId, p.initiator, p.votingLegalRep, p.token, oldState, newState); if (p.observing) { // call observer on best-effort. ignore errors bytes4 sel = p.initiator.onProposalStateTransition.selector; (address(p.initiator)).call( abi.encodeWithSelector(sel, proposalId, oldState, newState) ); } } } /// Contract to allow voting based on a snapshotable token (with relayed, batched voting) contract VotingCenter is IVotingCenter { using VotingProposal for VotingProposal.Proposal; ///////////////////////// // Modifiers //////////////////////// // @dev This modifier needs to be applied to all external non-constant functions. // this modifier goes _before_ other state modifiers like `onlyState`. // after function body execution state may transition again in `advanceLogicState` modifier withStateTransition(bytes32 proposalId) { VotingProposal.Proposal storage p = ensureExistingProposal(proposalId); // switch state due to time VotingProposal.advanceTimedState(p, proposalId); // execute function body _; // switch state due to business logic VotingProposal.advanceLogicState(p, proposalId); } // @dev This modifier needs to be applied to all external non-constant functions. // this modifier goes _before_ other state modifiers like `onlyState`. // note that this function actually modifies state so it will generate warnings // and is incompatible with STATICCALL modifier withTimedTransition(bytes32 proposalId) { VotingProposal.Proposal storage p = ensureExistingProposal(proposalId); // switch state due to time VotingProposal.advanceTimedState(p, proposalId); // execute function body _; } modifier withVotingOpen(bytes32 proposalId) { VotingProposal.Proposal storage p = _proposals[proposalId]; require(VotingProposal.isVotingOpen(p), "NV_VC_VOTING_CLOSED"); _; } modifier withRelayingOpen(bytes32 proposalId) { VotingProposal.Proposal storage p = _proposals[proposalId]; require(VotingProposal.isRelayOpen(p), "NV_VC_VOTING_CLOSED"); _; } modifier onlyTally(bytes32 proposalId) { VotingProposal.Proposal storage p = _proposals[proposalId]; require(p.state == VotingProposal.State.Tally, "NV_VC_NOT_TALLYING"); _; } ///////////////////////// // Mutable state //////////////////////// mapping (bytes32 => VotingProposal.Proposal) private _proposals; IVotingController private _votingController; ///////////////////////// // Events //////////////////////// // must be in sync with library event, events cannot be shared event LogProposalStateTransition( bytes32 indexed proposalId, address initiator, address votingLegalRep, address token, VotingProposal.State oldState, VotingProposal.State newState ); // logged when voter casts a vote event LogVoteCast( bytes32 indexed proposalId, address initiator, address token, address voter, bool voteInFavor, uint256 power ); // logged when proposal legal rep provides off-chain voting results event LogOffChainProposalResult( bytes32 indexed proposalId, address initiator, address token, address votingLegalRep, uint256 inFavor, uint256 against, string documentUri ); // logged when controller changed event LogChangeVotingController( address oldController, address newController, address by ); //////////////////////// // Constructor //////////////////////// constructor(IVotingController controller) public { _votingController = controller; } ///////////////////////// // Public functions //////////////////////// // // IVotingCenter implementation // function addProposal( bytes32 proposalId, ITokenSnapshots token, uint32 campaignDuration, uint256 campaignQuorumFraction, uint32 votingPeriod, address votingLegalRep, uint32 offchainVotePeriod, uint256 totalVotingPower, uint256 action, bytes actionPayload, bool enableObserver ) public { require(token != address(0)); VotingProposal.Proposal storage p = _proposals[proposalId]; require(p.token == address(0), "NF_VC_P_ID_NON_UNIQ"); // campaign duration must be less or eq total voting period require(campaignDuration <= votingPeriod, "NF_VC_CAMPAIGN_OVR_TOTAL"); require(campaignQuorumFraction <= 10**18, "NF_VC_INVALID_CAMPAIGN_Q"); require( campaignQuorumFraction == 0 && campaignDuration == 0 || campaignQuorumFraction > 0 && campaignDuration > 0, "NF_VC_CAMP_INCONSISTENT" ); require( offchainVotePeriod > 0 && totalVotingPower > 0 && votingLegalRep != address(0) || offchainVotePeriod == 0 && totalVotingPower == 0 && votingLegalRep == address(0), "NF_VC_TALLY_INCONSISTENT" ); // take sealed snapshot uint256 sId = token.currentSnapshotId() - 1; p.initialize( proposalId, token, sId, campaignDuration, campaignQuorumFraction, votingPeriod, votingLegalRep, offchainVotePeriod, totalVotingPower, action, enableObserver ); // we should do it in initialize bo stack is too small p.actionPayload = actionPayload; // call controller now when proposal is available via proposal method require(_votingController.onAddProposal(proposalId, msg.sender, token), "NF_VC_CTR_ADD_REJECTED"); } function vote(bytes32 proposalId, bool voteInFavor) public withStateTransition(proposalId) withVotingOpen(proposalId) { VotingProposal.Proposal storage p = _proposals[proposalId]; require(p.hasVoted[msg.sender] == VotingProposal.TriState.Abstain, "NF_VC_ALREADY_VOTED"); castVote(p, proposalId, voteInFavor, msg.sender); } function addOffchainVote(bytes32 proposalId, uint256 inFavor, uint256 against, string documentUri) public withStateTransition(proposalId) onlyTally(proposalId) { VotingProposal.Proposal storage p = _proposals[proposalId]; require(msg.sender == p.votingLegalRep, "NF_VC_ONLY_VOTING_LEGAL_REP"); // may not cross offchainVotingPower require(inFavor + against <= p.offchainVotingPower, "NF_VC_EXCEEDS_OFFLINE_V_POWER"); require(inFavor + against > 0, "NF_VC_NO_OFF_EMPTY_VOTE"); p.offchainInFavor = inFavor; p.offchainAgainst = against; p.offchainVoteDocumentUri = documentUri; emit LogOffChainProposalResult(proposalId, p.initiator, p.token, msg.sender, inFavor, against, documentUri); } function tally(bytes32 proposalId) public constant withTimedTransition(proposalId) returns( uint8 s, uint256 inFavor, uint256 against, uint256 offchainInFavor, uint256 offchainAgainst, uint256 tokenVotingPower, uint256 totalVotingPower, uint256 campaignQuorumTokenAmount, address initiator, bool hasObserverInterface ) { VotingProposal.Proposal storage p = ensureExistingProposal(proposalId); s = uint8(p.state); inFavor = p.inFavor; against = p.against; offchainInFavor = p.offchainInFavor; offchainAgainst = p.offchainAgainst; initiator = p.initiator; hasObserverInterface = p.observing; tokenVotingPower = p.token.totalSupplyAt(p.snapshotId); totalVotingPower = tokenVotingPower + p.offchainVotingPower; campaignQuorumTokenAmount = p.campaignQuorumTokenAmount; } function offchainVoteDocumentUri(bytes32 proposalId) public constant returns (string) { VotingProposal.Proposal storage p = ensureExistingProposal(proposalId); return p.offchainVoteDocumentUri; } function timedProposal(bytes32 proposalId) public withTimedTransition(proposalId) constant returns ( uint8 s, address token, uint256 snapshotId, address initiator, address votingLegalRep, uint256 campaignQuorumTokenAmount, uint256 offchainVotingPower, uint256 action, bytes actionPayload, bool enableObserver, uint32[5] deadlines ) { VotingProposal.Proposal storage p = ensureExistingProposal(proposalId); s = uint8(p.state); token = p.token; snapshotId = p.snapshotId; enableObserver = p.observing; campaignQuorumTokenAmount = p.campaignQuorumTokenAmount; initiator = p.initiator; votingLegalRep = p.votingLegalRep; offchainVotingPower = p.offchainVotingPower; deadlines = p.deadlines; action = p.action; actionPayload = p.actionPayload; } function proposal(bytes32 proposalId) public constant returns ( uint8 s, address token, uint256 snapshotId, address initiator, address votingLegalRep, uint256 campaignQuorumTokenAmount, uint256 offchainVotingPower, uint256 action, bytes actionPayload, bool enableObserver, uint32[5] deadlines ) { VotingProposal.Proposal storage p = ensureExistingProposal(proposalId); s = uint8(p.state); token = p.token; snapshotId = p.snapshotId; enableObserver = p.observing; campaignQuorumTokenAmount = p.campaignQuorumTokenAmount; initiator = p.initiator; votingLegalRep = p.votingLegalRep; offchainVotingPower = p.offchainVotingPower; deadlines = p.deadlines; action = p.action; actionPayload = p.actionPayload; } function getVote(bytes32 proposalId, address voter) public constant returns (uint8) { VotingProposal.Proposal storage p = ensureExistingProposal(proposalId); return uint8(p.hasVoted[voter]); } function hasProposal(bytes32 proposalId) public constant returns (bool) { VotingProposal.Proposal storage p = _proposals[proposalId]; return p.token != address(0); } function getVotingPower(bytes32 proposalId, address voter) public constant returns (uint256) { VotingProposal.Proposal storage p = ensureExistingProposal(proposalId); return p.token.balanceOfAt(voter, p.snapshotId); } // // IContractId Implementation // function contractId() public pure returns (bytes32 id, uint256 version) { return (0xbbf540c4111754f6dbce914d5e55e1c0cb26515adbc288b5ea8baa544adfbfa4, 0); } // // IVotingController hook // /// @notice get current controller function votingController() public constant returns (IVotingController) { return _votingController; } /// @notice update current controller function changeVotingController(IVotingController newController) public { require(_votingController.onChangeVotingController(msg.sender, newController), "NF_VC_CHANGING_CTR_REJECTED"); address oldController = address(_votingController); _votingController = newController; emit LogChangeVotingController(oldController, address(newController), msg.sender); } // // Other methods // /// @dev same as vote, only for a relayed vote. Will throw if provided signature (v,r,s) does not match /// the address of the voter /// @param voter address whose token balance should be used as voting power function relayedVote( bytes32 proposalId, bool voteInFavor, address voter, bytes32 r, bytes32 s, uint8 v ) public withStateTransition(proposalId) withRelayingOpen(proposalId) { // check that message signature matches the voter address assert(isValidSignature(proposalId, voteInFavor, voter, r, s, v)); // solium-enable indentation VotingProposal.Proposal storage p = _proposals[proposalId]; require(p.hasVoted[voter] == VotingProposal.TriState.Abstain, "NF_VC_ALREADY_VOTED"); castVote(p, proposalId, voteInFavor, voter); } // batches should be grouped by proposal, that allows to tally in place and write to storage once function batchRelayedVotes( bytes32 proposalId, bool[] votePreferences, bytes32[] r, bytes32[] s, uint8[] v ) public withStateTransition(proposalId) withRelayingOpen(proposalId) { assert( votePreferences.length == r.length && r.length == s.length && s.length == v.length ); relayBatchInternal( proposalId, votePreferences, r, s, v ); } function handleStateTransitions(bytes32 proposalId) public withTimedTransition(proposalId) {} // // Utility public functions // function isValidSignature( bytes32 proposalId, bool voteInFavor, address voter, bytes32 r, bytes32 s, uint8 v ) public constant returns (bool) { // solium-disable indentation return ecrecoverVoterAddress(proposalId, voteInFavor, r, s, v) == voter; } function ecrecoverVoterAddress( bytes32 proposalId, bool voteInFavor, bytes32 r, bytes32 s, uint8 v ) public constant returns (address) { // solium-disable indentation return ecrecover( keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(byte(0), address(this), proposalId, voteInFavor)))), v, r, s); } ///////////////////////// // Internal functions //////////////////////// function ensureExistingProposal(bytes32 proposalId) internal constant returns (VotingProposal.Proposal storage p) { p = _proposals[proposalId]; require(p.token != address(0), "NF_VC_PROP_NOT_EXIST"); return p; } ///////////////////////// // Private functions //////////////////////// /// @dev increase the votecount on a given proposal by the token balance of a given address, /// throws if proposal does not exist or the vote on it has ended already. Votes are final, /// changing the vote is not allowed /// @param p proposal storage pointer /// @param proposalId of the proposal to be voted on /// @param voteInFavor of the desired proposal /// @param voter address whose tokenBalance is to be used as voting-power function castVote(VotingProposal.Proposal storage p, bytes32 proposalId, bool voteInFavor, address voter) private { uint256 power = p.token.balanceOfAt(voter, p.snapshotId); if (voteInFavor) { p.inFavor = Math.add(p.inFavor, power); } else { p.against = Math.add(p.against, power); } markVoteCast(p, proposalId, voter, voteInFavor, power); } function relayBatchInternal( bytes32 proposalId, bool[] votePreferences, bytes32[] r, bytes32[] s, uint8[] v ) private { uint256 inFavor; uint256 against; VotingProposal.Proposal storage p = _proposals[proposalId]; for (uint256 i = 0; i < votePreferences.length; i++) { uint256 power = relayBatchElement( p, proposalId, votePreferences[i], r[i], s[i], v[i]); if (votePreferences[i]) { inFavor = Math.add(inFavor, power); } else { against = Math.add(against, power); } } // write votes to storage p.inFavor = Math.add(p.inFavor, inFavor); p.against = Math.add(p.against, against); } function relayBatchElement( VotingProposal.Proposal storage p, bytes32 proposalId, bool voteInFavor, bytes32 r, bytes32 s, uint8 v ) private returns (uint256 power) { // recover voter from signature, mangled data produces mangeld voter address, which will be // eliminated later address voter = ecrecoverVoterAddress( proposalId, voteInFavor, r, s, v ); // cast vote if not cast before if (p.hasVoted[voter] == VotingProposal.TriState.Abstain) { power = p.token.balanceOfAt(voter, p.snapshotId); // if not holding token, power is 0 markVoteCast(p, proposalId, voter, voteInFavor, power); } // returns voting power which is zero in case of failed vote } function markVoteCast(VotingProposal.Proposal storage p, bytes32 proposalId, address voter, bool voteInFavor, uint256 power) private { if (power > 0) { p.hasVoted[voter] = voteInFavor ? VotingProposal.TriState.InFavor : VotingProposal.TriState.Against; emit LogVoteCast(proposalId, p.initiator, p.token, voter, voteInFavor, power); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"proposalId","type":"bytes32"}],"name":"handleStateTransitions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"bytes32"},{"name":"voteInFavor","type":"bool"},{"name":"voter","type":"address"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"v","type":"uint8"}],"name":"relayedVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"bytes32"},{"name":"voteInFavor","type":"bool"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"v","type":"uint8"}],"name":"ecrecoverVoterAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"bytes32"},{"name":"token","type":"address"},{"name":"campaignDuration","type":"uint32"},{"name":"campaignQuorumFraction","type":"uint256"},{"name":"votingPeriod","type":"uint32"},{"name":"votingLegalRep","type":"address"},{"name":"offchainVotePeriod","type":"uint32"},{"name":"totalVotingPower","type":"uint256"},{"name":"action","type":"uint256"},{"name":"actionPayload","type":"bytes"},{"name":"enableObserver","type":"bool"}],"name":"addProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"votingController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"bytes32"}],"name":"offchainVoteDocumentUri","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"bytes32"},{"name":"voteInFavor","type":"bool"},{"name":"voter","type":"address"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"v","type":"uint8"}],"name":"isValidSignature","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"bytes32"}],"name":"timedProposal","outputs":[{"name":"s","type":"uint8"},{"name":"token","type":"address"},{"name":"snapshotId","type":"uint256"},{"name":"initiator","type":"address"},{"name":"votingLegalRep","type":"address"},{"name":"campaignQuorumTokenAmount","type":"uint256"},{"name":"offchainVotingPower","type":"uint256"},{"name":"action","type":"uint256"},{"name":"actionPayload","type":"bytes"},{"name":"enableObserver","type":"bool"},{"name":"deadlines","type":"uint32[5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"bytes32"}],"name":"proposal","outputs":[{"name":"s","type":"uint8"},{"name":"token","type":"address"},{"name":"snapshotId","type":"uint256"},{"name":"initiator","type":"address"},{"name":"votingLegalRep","type":"address"},{"name":"campaignQuorumTokenAmount","type":"uint256"},{"name":"offchainVotingPower","type":"uint256"},{"name":"action","type":"uint256"},{"name":"actionPayload","type":"bytes"},{"name":"enableObserver","type":"bool"},{"name":"deadlines","type":"uint32[5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"bytes32"},{"name":"inFavor","type":"uint256"},{"name":"against","type":"uint256"},{"name":"documentUri","type":"string"}],"name":"addOffchainVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractId","outputs":[{"name":"id","type":"bytes32"},{"name":"version","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"bytes32"},{"name":"votePreferences","type":"bool[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"},{"name":"v","type":"uint8[]"}],"name":"batchRelayedVotes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"bytes32"},{"name":"voteInFavor","type":"bool"}],"name":"vote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"bytes32"},{"name":"voter","type":"address"}],"name":"getVotingPower","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"bytes32"},{"name":"voter","type":"address"}],"name":"getVote","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newController","type":"address"}],"name":"changeVotingController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"bytes32"}],"name":"tally","outputs":[{"name":"s","type":"uint8"},{"name":"inFavor","type":"uint256"},{"name":"against","type":"uint256"},{"name":"offchainInFavor","type":"uint256"},{"name":"offchainAgainst","type":"uint256"},{"name":"tokenVotingPower","type":"uint256"},{"name":"totalVotingPower","type":"uint256"},{"name":"campaignQuorumTokenAmount","type":"uint256"},{"name":"initiator","type":"address"},{"name":"hasObserverInterface","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"bytes32"}],"name":"hasProposal","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"controller","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"proposalId","type":"bytes32"},{"indexed":false,"name":"initiator","type":"address"},{"indexed":false,"name":"votingLegalRep","type":"address"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"oldState","type":"uint8"},{"indexed":false,"name":"newState","type":"uint8"}],"name":"LogProposalStateTransition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"proposalId","type":"bytes32"},{"indexed":false,"name":"initiator","type":"address"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"voter","type":"address"},{"indexed":false,"name":"voteInFavor","type":"bool"},{"indexed":false,"name":"power","type":"uint256"}],"name":"LogVoteCast","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"proposalId","type":"bytes32"},{"indexed":false,"name":"initiator","type":"address"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"votingLegalRep","type":"address"},{"indexed":false,"name":"inFavor","type":"uint256"},{"indexed":false,"name":"against","type":"uint256"},{"indexed":false,"name":"documentUri","type":"string"}],"name":"LogOffChainProposalResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldController","type":"address"},{"indexed":false,"name":"newController","type":"address"},{"indexed":false,"name":"by","type":"address"}],"name":"LogChangeVotingController","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051602080612af2833981016040525160018054600160a060020a031916600160a060020a03909216919091179055612aa2806100506000396000f3006080604052600436106100e15763ffffffff60e060020a600035041662ac692881146100e657806317cd130d14610100578063264184571461013557806350bc5c091461017a578063517afbcf1461021857806358e8832c1461022d57806360e95a94146102ba5780636c60849f146103035780636da59041146104175780637ac131351461042f5780638291286c1461049257806387dfd908146104c05780639f2ce678146105c5578063a18e9dde146105e2578063b3e7c2bd14610618578063e5fb6fb014610652578063f6e22eb514610673578063fb1d1273146106ea575b600080fd5b3480156100f257600080fd5b506100fe600435610702565b005b34801561010c57600080fd5b506100fe6004356024351515600160a060020a036044351660643560843560ff60a4351661071f565b34801561014157600080fd5b5061015e600435602435151560443560643560ff6084351661086f565b60408051600160a060020a039092168252519081900360200190f35b34801561018657600080fd5b5060408051602060046101243581810135601f81018490048402850184019095528484526100fe9482359460248035600160a060020a039081169660443563ffffffff908116976064359760843583169760a4359095169660c4359093169560e43595610104359536956101449490930191908190840183828082843750949750505050913515159250610a33915050565b34801561022457600080fd5b5061015e610e76565b34801561023957600080fd5b50610245600435610e86565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c657600080fd5b506102ef6004356024351515600160a060020a036044351660643560843560ff60a43516610f2a565b604080519115158252519081900360200190f35b34801561030f57600080fd5b5061031b600435610f58565b6040805160ff8d168152600160a060020a03808d1660208301529181018b90528982166060820152908816608082015260a080820188905260c0820187905260e08201869052831515610120830152610100820190610140830190849080838360005b8381101561039657818101518382015260200161037e565b50505050905001828103825285818151815260200191508051906020019080838360005b838110156103d25781810151838201526020016103ba565b50505050905090810190601f1680156103ff5780820380516001836020036101000a031916815260200191505b509c5050505050505050505050505060405180910390f35b34801561042357600080fd5b5061031b60043561113d565b34801561043b57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526100fe94803594602480359560443595369560849493019181908401838280828437509497506113089650505050505050565b34801561049e57600080fd5b506104a761162c565b6040805192835260208301919091528051918290030190f35b3480156104cc57600080fd5b506040805160206004602480358281013584810280870186019097528086526100fe96843596369660449591949091019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506116539650505050505050565b3480156105d157600080fd5b506100fe600435602435151561171a565b3480156105ee57600080fd5b50610606600435600160a060020a0360243516611847565b60408051918252519081900360200190f35b34801561062457600080fd5b5061063c600435600160a060020a03602435166118fd565b6040805160ff9092168252519081900360200190f35b34801561065e57600080fd5b506100fe600160a060020a036004351661193d565b34801561067f57600080fd5b5061068b600435611aa5565b6040805160ff909b168b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e0850152600160a060020a0316610100840152151561012083015251908190036101400190f35b3480156106f657600080fd5b506102ef600435611bf2565b80600061070e82611c0f565b905061071a8183611c83565b505050565b600086600061072d82611c0f565b90506107398183611c83565b6000898152602081905260409020899061075281611d7f565b15156107a8576040805160e560020a62461bcd02815260206004820152601360248201527f4e565f56435f564f54494e475f434c4f53454400000000000000000000000000604482015290519081900360640190fd5b6107b68b8b8b8b8b8b610f2a565b15156107be57fe5b60008b81526020819052604081209550600160a060020a038a166000908152600f8701602052604090205460ff1660028111156107f757fe5b1461084c576040805160e560020a62461bcd02815260206004820152601360248201527f4e465f56435f414c52454144595f564f54454400000000000000000000000000604482015290519081900360640190fd5b610858858c8c8c611dae565b50506108648183611e92565b505050505050505050565b60408051600060208083018290526c0100000000000000000000000030026021840152603583018990528715157f010000000000000000000000000000000000000000000000000000000000000002605584015283516036818503018152605690930193849052825191936001939290918291908401908083835b602083106109095780518252601f1990920191602091820191016108ea565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f19457468657265756d205369676e6564204d6573736167653a0a33320000000083830152603c8084019190915284518084039091018152605c9092019384905281519195509293508392850191508083835b602083106109a25780518252601f199092019160209182019101610983565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008084528383018087529190915260ff8a1683860152606083018c9052608083018b9052935160a08084019750919550601f1981019492819003909101925090865af1158015610a1e573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600080600160a060020a038c161515610a4b57600080fd5b60008d81526020819052604090208054909250600160a060020a031615610abc576040805160e560020a62461bcd02815260206004820152601360248201527f4e465f56435f505f49445f4e4f4e5f554e495100000000000000000000000000604482015290519081900360640190fd5b63ffffffff808a16908c161115610b1d576040805160e560020a62461bcd02815260206004820152601860248201527f4e465f56435f43414d504149474e5f4f56525f544f54414c0000000000000000604482015290519081900360640190fd5b670de0b6b3a76400008a1115610b7d576040805160e560020a62461bcd02815260206004820152601860248201527f4e465f56435f494e56414c49445f43414d504149474e5f510000000000000000604482015290519081900360640190fd5b89158015610b8f575063ffffffff8b16155b80610bab575060008a118015610bab575060008b63ffffffff16115b1515610c01576040805160e560020a62461bcd02815260206004820152601760248201527f4e465f56435f43414d505f494e434f4e53495354454e54000000000000000000604482015290519081900360640190fd5b60008763ffffffff16118015610c175750600086115b8015610c2b5750600160a060020a03881615155b80610c56575063ffffffff8716158015610c43575085155b8015610c565750600160a060020a038816155b1515610cac576040805160e560020a62461bcd02815260206004820152601860248201527f4e465f56435f54414c4c595f494e434f4e53495354454e540000000000000000604482015290519081900360640190fd5b60018c600160a060020a031663970875ce6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cec57600080fd5b505af1158015610d00573d6000803e3d6000fd5b505050506040513d6020811015610d1657600080fd5b5051039050610d35828e8e848f8f8f8f8f8f8f8e63ffffffff611f1416565b8351610d4a90600b8401906020870190612906565b50600160009054906101000a9004600160a060020a0316600160a060020a031663b340e85a8e338f6040518463ffffffff1660e060020a02815260040180846000191660001916815260200183600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b158015610de557600080fd5b505af1158015610df9573d6000803e3d6000fd5b505050506040513d6020811015610e0f57600080fd5b50511515610e67576040805160e560020a62461bcd02815260206004820152601660248201527f4e465f56435f4354525f4144445f52454a454354454400000000000000000000604482015290519081900360640190fd5b50505050505050505050505050565b600154600160a060020a03165b90565b60606000610e9383611c0f565b600c81018054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152939450830182828015610f1d5780601f10610ef257610100808354040283529160200191610f1d565b820191906000526020600020905b815481529060010190602001808311610f0057829003601f168201915b5050505050915050919050565b600084600160a060020a0316610f43888887878761086f565b600160a060020a031614979650505050505050565b60008060008060008060008060606000610f70612984565b60008c6000610f7e82611c0f565b9050610f8a8183611c83565b610f938f611c0f565b600e81015490935060ff166004811115610fa957fe5b9d508260000160009054906101000a9004600160a060020a03169c5082600101549b5082600e0160019054906101000a900460ff169450826006015498508260080160009054906101000a9004600160a060020a03169a508260090160009054906101000a9004600160a060020a031699508260070154975082600d01600580602002604051908101604052809291908260058015611089576020028201916000905b82829054906101000a900463ffffffff1663ffffffff168152602001906004019060208260030104928301926001038202915080841161104c5790505b50505050600a850154600b8601805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152939c509498509193909250908301828280156111245780601f106110f957610100808354040283529160200191611124565b820191906000526020600020905b81548152906001019060200180831161110757829003601f168201915b5050505050955050505091939597999b90929496989a50565b60008060008060008060008060606000611155612984565b60006111608d611c0f565b600e81015490915060ff16600481111561117657fe5b9b508060000160009054906101000a9004600160a060020a03169a508060010154995080600e0160019054906101000a900460ff169250806006015496508060080160009054906101000a9004600160a060020a031698508060090160009054906101000a9004600160a060020a031697508060070154955080600d01600580602002604051908101604052809291908260058015611256576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116112195790505b50505050600a830154600b8401805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152939a509496509193909250908301828280156112f15780601f106112c6576101008083540402835291602001916112f1565b820191906000526020600020905b8154815290600101906020018083116112d457829003601f168201915b505050505093505091939597999b90929496989a50565b600084600061131682611c0f565b90506113228183611c83565b600087815260208190526040902087906003600e82015460ff16600481111561134757fe5b1461139c576040805160e560020a62461bcd02815260206004820152601260248201527f4e565f56435f4e4f545f54414c4c59494e470000000000000000000000000000604482015290519081900360640190fd5b60008981526020819052604090206009810154909550600160a060020a03163314611411576040805160e560020a62461bcd02815260206004820152601b60248201527f4e465f56435f4f4e4c595f564f54494e475f4c4547414c5f5245500000000000604482015290519081900360640190fd5b6007850154888801111561146f576040805160e560020a62461bcd02815260206004820152601d60248201527f4e465f56435f455843454544535f4f46464c494e455f565f504f574552000000604482015290519081900360640190fd5b6000888801116114c9576040805160e560020a62461bcd02815260206004820152601760248201527f4e465f56435f4e4f5f4f46465f454d5054595f564f5445000000000000000000604482015290519081900360640190fd5b600485018890556005850187905585516114ec90600c8701906020890190612906565b5088600019167f6d6aea577bb4a673761956e7a8a2b06318f0ea8276a6932690621e55f4bdab5a8660080160009054906101000a9004600160a060020a03168760000160009054906101000a9004600160a060020a0316338c8c8c6040518087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156115d85781810151838201526020016115c0565b50505050905090810190601f1680156116055780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a250506116238183611e92565b50505050505050565b7fbbf540c4111754f6dbce914d5e55e1c0cb26515adbc288b5ea8baa544adfbfa460009091565b84600061165f82611c0f565b905061166b8183611c83565b6000878152602081905260409020879061168481611d7f565b15156116da576040805160e560020a62461bcd02815260206004820152601360248201527f4e565f56435f564f54494e475f434c4f53454400000000000000000000000000604482015290519081900360640190fd5b865188511480156116ec575085518751145b80156116f9575084518651145b151561170157fe5b61170e8989898989612224565b50506116238183611e92565b600082600061172882611c0f565b90506117348183611c83565b6000858152602081905260409020859061174d81612328565b15156117a3576040805160e560020a62461bcd02815260206004820152601360248201527f4e565f56435f564f54494e475f434c4f53454400000000000000000000000000604482015290519081900360640190fd5b60008781526020819052604081209550336000908152600f8701602052604090205460ff1660028111156117d357fe5b14611828576040805160e560020a62461bcd02815260206004820152601360248201527f4e465f56435f414c52454144595f564f54454400000000000000000000000000604482015290519081900360640190fd5b61183485888833611dae565b50506118408183611e92565b5050505050565b60008061185384611c0f565b80546001820154604080517f4ee2cd7e000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015260248201939093529051939450911691634ee2cd7e916044808201926020929091908290030181600087803b1580156118c957600080fd5b505af11580156118dd573d6000803e3d6000fd5b505050506040513d60208110156118f357600080fd5b5051949350505050565b60008061190984611c0f565b600160a060020a0384166000908152600f8201602052604090205490915060ff16600281111561193557fe5b949350505050565b600154604080517fef7f5c23000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a0384811660248301529151600093929092169163ef7f5c239160448082019260209290919082900301818787803b1580156119ae57600080fd5b505af11580156119c2573d6000803e3d6000fd5b505050506040513d60208110156119d857600080fd5b50511515611a30576040805160e560020a62461bcd02815260206004820152601b60248201527f4e465f56435f4348414e47494e475f4354525f52454a45435445440000000000604482015290519081900360640190fd5b5060018054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff198316811790935560408051919092168082526020820193909352338183015290517feee43915f303cfa15a92ddcc186789e498099ff5a9570200987094fc3dd312239181900360600190a15050565b60008060008060008060008060008060008b6000611ac282611c0f565b9050611ace8183611c83565b611ad78e611c0f565b600e81015490935060ff166004811115611aed57fe5b9c5082600201549b5082600301549a5082600401549950826005015498508260080160009054906101000a9004600160a060020a0316945082600e0160019054906101000a900460ff1693508260000160009054906101000a9004600160a060020a0316600160a060020a031663981b24d084600101546040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b158015611b9d57600080fd5b505af1158015611bb1573d6000803e3d6000fd5b505050506040513d6020811015611bc757600080fd5b505160078401546006909401549d9f9c9e509a9c999b989a99928a0198929750939550919350915050565b600090815260208190526040902054600160a060020a0316151590565b60008181526020819052604090208054600160a060020a03161515611c7e576040805160e560020a62461bcd02815260206004820152601460248201527f4e465f56435f50524f505f4e4f545f4558495354000000000000000000000000604482015290519081900360640190fd5b919050565b426000600e84015460ff166004811115611c9957fe5b148015611cbc5750600d83015463ffffffff640100000000909104811690821610155b15611ccd57611ccd8383600461234c565b6004600e84015460ff166004811115611ce257fe5b14158015611d445750600e830154600d84019060ff166004811115611d0357fe5b60010163ffffffff16600581101515611d1857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168163ffffffff1610155b1561071a57600e830154611d7a908490849060ff166004811115611d6457fe5b60010160ff166004811115611d7557fe5b61234c565b611ccd565b6000611d8a82612328565b80611da8575060025b600e83015460ff166004811115611da657fe5b145b92915050565b83546001850154604080517f4ee2cd7e000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482019390935290516000939290921691634ee2cd7e9160448082019260209290919082900301818787803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b505050506040513d6020811015611e4f57600080fd5b505190508215611e7157611e678560020154826126bb565b6002860155611e85565b611e7f8560030154826126bb565b60038601555b61184085858486856126d1565b6000600e83015460ff166004811115611ea757fe5b148015611ec257508160060154826003015483600201540110155b15611ed357611ed38282600161234c565b6003600e83015460ff166004811115611ee857fe5b148015611eff575060008260040154836005015401115b15611f1057611f108282600461234c565b5050565b6000611f1e612984565b60008c600160a060020a031663981b24d08d6040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b158015611f6957600080fd5b505af1158015611f7d573d6000803e3d6000fd5b505050506040513d6020811015611f9357600080fd5b5051925060008311611fef576040805160e560020a62461bcd02815260206004820152601160248201527f4e465f56435f454d5054595f544f4b454e000000000000000000000000000000604482015290519081900360640190fd5b851580611ffc5750828610155b1515612052576040805160e560020a62461bcd02815260206004820152601760248201527f4e465f56435f544f54504f5745525f4c545f544f4b454e000000000000000000604482015290519081900360640190fd5b504263ffffffff81811683528b820181166020840152898201166060830181905260408301528583146120855786612088565b60005b826003602002015101826004602002019063ffffffff16908163ffffffff16815250508c8f60000160006101000a815481600160a060020a030219169083600160a060020a031602179055508b8f60010181905550838f600e0160016101000a81548160ff021916908315150217905550878f60090160006101000a815481600160a060020a030219169083600160a060020a031602179055506000861161213157600061213b565b61213b8684612788565b8f600701819055506121538f6007015484018b61279a565b8f60060181905550828f60060154111515156121b9576040805160e560020a62461bcd02815260206004820152601a60248201527f4e465f56435f4e4f5f43414d505f564f54494e475f504f574552000000000000604482015290519081900360640190fd5b338f60080160006101000a815481600160a060020a030219169083600160a060020a03160217905550818f600d019060056121f59291906129a3565b50600e8f01805460ff19169055600a8f018590556122138f8f611e92565b505050505050505050505050505050565b6000858152602081905260408120819081805b88518210156122f2576122aa838b8b8581518110151561225357fe5b906020019060200201518b8681518110151561226b57fe5b906020019060200201518b8781518110151561228357fe5b906020019060200201518b8881518110151561229b57fe5b906020019060200201516127af565b905088828151811015156122ba57fe5b90602001906020020151156122da576122d385826126bb565b94506122e7565b6122e484826126bb565b93505b600190910190612237565b6123008360020154866126bb565b6002840155600383015461231490856126bb565b836003018190555050505050505050505050565b600080600e83015460ff16600481111561233e57fe5b1480611da857506001611d93565b6000806000612359612984565b600e87015460ff169350600080600d890186600481111561237657fe5b6001016005811061238357fe5b600891828204019190066004029054906101000a900463ffffffff1693508363ffffffff164263ffffffff1610156123bb5742840394505b60008563ffffffff16111561247e576040805160a081019182905290600d8b0190600590826000855b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116123e45790505050505050925085600481111561243357fe5b60010191505b600582101561246d578483836005811061244f57fe5b6020020180519190910363ffffffff16905260019190910190612439565b61247c600d8a018460056129a3565b505b600e8901805488919060ff1916600183600481111561249957fe5b021790555060008660048111156124ac57fe5b1480156124c4575060048760048111156124c257fe5b145b156124ce57610864565b600889015460098a01548a5460408051600160a060020a0394851680825293851660208201819052929094169084018190528b937f1258a89b17795cbfc5dcd00373736bc91643360d51d6987542fcbe56204c0521939291908b908d906060810183600481111561253b57fe5b60ff16815260200182600481111561254f57fe5b60ff1681526020019550505050505060405180910390a2600e890154610100900460ff161561086457506008880154604051602481018981527f279fdfcf0000000000000000000000000000000000000000000000000000000092600160a060020a03169183918b918a918c916044018360048111156125cb57fe5b60ff1681526020018260048111156125df57fe5b60ff1681526040805180830381526020928301825291820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090981697909717875251815191969095508594509250905080838360005b8381101561266e578181015183820152602001612656565b50505050905090810190601f16801561269b5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af1505050505050505050505050565b6000828201838110156126ca57fe5b9392505050565b600081111561184057816126e65760026126e9565b60015b600160a060020a0384166000908152600f870160205260409020805460ff1916600183600281111561271757fe5b02179055506008850154855460408051600160a060020a039384168152918316602083015291851681830152831515606082015260808101839052905185917fc02362835e63428fa51482dfa6c83bdfd5b26d444a010b1c7ad55d5416f20844919081900360a00190a25050505050565b60008282111561279457fe5b50900390565b60006126ca8383670de0b6b3a76400006128ac565b6000806127bf878787878761086f565b90506000600160a060020a0382166000908152600f8a01602052604090205460ff1660028111156127ec57fe5b14156128a15787546001890154604080517f4ee2cd7e000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482019390935290519190921691634ee2cd7e9160448083019260209291908290030181600087803b15801561286657600080fd5b505af115801561287a573d6000803e3d6000fd5b505050506040513d602081101561289057600080fd5b505191506128a188888389866126d1565b509695505050505050565b60006119356128bb85856128c1565b836128e5565b60008282028315806128dd57508284828115156128da57fe5b04145b15156126ca57fe5b6000816128f584600283046126bb565b8115156128fe57fe5b049392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061294757805160ff1916838001178555612974565b82800160010185558215612974579182015b82811115612974578251825591602001919060010190612959565b50612980929150612a3b565b5090565b60a0604051908101604052806005906020820280388339509192915050565b600183019183908215612a2f5791602002820160005b838211156129fd57835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026129b9565b8015612a2d5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026129fd565b505b50612980929150612a55565b610e8391905b808211156129805760008155600101612a41565b610e8391905b8082111561298057805463ffffffff19168155600101612a5b5600a165627a7a72305820cc7171c5b324ce3ec1cb8f0a8e5306236b6990c6d46a48d73535e508b5f12ccd0029000000000000000000000000698ee61515a02f46124341e8ed25b1bb417db27c
Deployed Bytecode
0x6080604052600436106100e15763ffffffff60e060020a600035041662ac692881146100e657806317cd130d14610100578063264184571461013557806350bc5c091461017a578063517afbcf1461021857806358e8832c1461022d57806360e95a94146102ba5780636c60849f146103035780636da59041146104175780637ac131351461042f5780638291286c1461049257806387dfd908146104c05780639f2ce678146105c5578063a18e9dde146105e2578063b3e7c2bd14610618578063e5fb6fb014610652578063f6e22eb514610673578063fb1d1273146106ea575b600080fd5b3480156100f257600080fd5b506100fe600435610702565b005b34801561010c57600080fd5b506100fe6004356024351515600160a060020a036044351660643560843560ff60a4351661071f565b34801561014157600080fd5b5061015e600435602435151560443560643560ff6084351661086f565b60408051600160a060020a039092168252519081900360200190f35b34801561018657600080fd5b5060408051602060046101243581810135601f81018490048402850184019095528484526100fe9482359460248035600160a060020a039081169660443563ffffffff908116976064359760843583169760a4359095169660c4359093169560e43595610104359536956101449490930191908190840183828082843750949750505050913515159250610a33915050565b34801561022457600080fd5b5061015e610e76565b34801561023957600080fd5b50610245600435610e86565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027f578181015183820152602001610267565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c657600080fd5b506102ef6004356024351515600160a060020a036044351660643560843560ff60a43516610f2a565b604080519115158252519081900360200190f35b34801561030f57600080fd5b5061031b600435610f58565b6040805160ff8d168152600160a060020a03808d1660208301529181018b90528982166060820152908816608082015260a080820188905260c0820187905260e08201869052831515610120830152610100820190610140830190849080838360005b8381101561039657818101518382015260200161037e565b50505050905001828103825285818151815260200191508051906020019080838360005b838110156103d25781810151838201526020016103ba565b50505050905090810190601f1680156103ff5780820380516001836020036101000a031916815260200191505b509c5050505050505050505050505060405180910390f35b34801561042357600080fd5b5061031b60043561113d565b34801561043b57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526100fe94803594602480359560443595369560849493019181908401838280828437509497506113089650505050505050565b34801561049e57600080fd5b506104a761162c565b6040805192835260208301919091528051918290030190f35b3480156104cc57600080fd5b506040805160206004602480358281013584810280870186019097528086526100fe96843596369660449591949091019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506116539650505050505050565b3480156105d157600080fd5b506100fe600435602435151561171a565b3480156105ee57600080fd5b50610606600435600160a060020a0360243516611847565b60408051918252519081900360200190f35b34801561062457600080fd5b5061063c600435600160a060020a03602435166118fd565b6040805160ff9092168252519081900360200190f35b34801561065e57600080fd5b506100fe600160a060020a036004351661193d565b34801561067f57600080fd5b5061068b600435611aa5565b6040805160ff909b168b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e0850152600160a060020a0316610100840152151561012083015251908190036101400190f35b3480156106f657600080fd5b506102ef600435611bf2565b80600061070e82611c0f565b905061071a8183611c83565b505050565b600086600061072d82611c0f565b90506107398183611c83565b6000898152602081905260409020899061075281611d7f565b15156107a8576040805160e560020a62461bcd02815260206004820152601360248201527f4e565f56435f564f54494e475f434c4f53454400000000000000000000000000604482015290519081900360640190fd5b6107b68b8b8b8b8b8b610f2a565b15156107be57fe5b60008b81526020819052604081209550600160a060020a038a166000908152600f8701602052604090205460ff1660028111156107f757fe5b1461084c576040805160e560020a62461bcd02815260206004820152601360248201527f4e465f56435f414c52454144595f564f54454400000000000000000000000000604482015290519081900360640190fd5b610858858c8c8c611dae565b50506108648183611e92565b505050505050505050565b60408051600060208083018290526c0100000000000000000000000030026021840152603583018990528715157f010000000000000000000000000000000000000000000000000000000000000002605584015283516036818503018152605690930193849052825191936001939290918291908401908083835b602083106109095780518252601f1990920191602091820191016108ea565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f19457468657265756d205369676e6564204d6573736167653a0a33320000000083830152603c8084019190915284518084039091018152605c9092019384905281519195509293508392850191508083835b602083106109a25780518252601f199092019160209182019101610983565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008084528383018087529190915260ff8a1683860152606083018c9052608083018b9052935160a08084019750919550601f1981019492819003909101925090865af1158015610a1e573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600080600160a060020a038c161515610a4b57600080fd5b60008d81526020819052604090208054909250600160a060020a031615610abc576040805160e560020a62461bcd02815260206004820152601360248201527f4e465f56435f505f49445f4e4f4e5f554e495100000000000000000000000000604482015290519081900360640190fd5b63ffffffff808a16908c161115610b1d576040805160e560020a62461bcd02815260206004820152601860248201527f4e465f56435f43414d504149474e5f4f56525f544f54414c0000000000000000604482015290519081900360640190fd5b670de0b6b3a76400008a1115610b7d576040805160e560020a62461bcd02815260206004820152601860248201527f4e465f56435f494e56414c49445f43414d504149474e5f510000000000000000604482015290519081900360640190fd5b89158015610b8f575063ffffffff8b16155b80610bab575060008a118015610bab575060008b63ffffffff16115b1515610c01576040805160e560020a62461bcd02815260206004820152601760248201527f4e465f56435f43414d505f494e434f4e53495354454e54000000000000000000604482015290519081900360640190fd5b60008763ffffffff16118015610c175750600086115b8015610c2b5750600160a060020a03881615155b80610c56575063ffffffff8716158015610c43575085155b8015610c565750600160a060020a038816155b1515610cac576040805160e560020a62461bcd02815260206004820152601860248201527f4e465f56435f54414c4c595f494e434f4e53495354454e540000000000000000604482015290519081900360640190fd5b60018c600160a060020a031663970875ce6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cec57600080fd5b505af1158015610d00573d6000803e3d6000fd5b505050506040513d6020811015610d1657600080fd5b5051039050610d35828e8e848f8f8f8f8f8f8f8e63ffffffff611f1416565b8351610d4a90600b8401906020870190612906565b50600160009054906101000a9004600160a060020a0316600160a060020a031663b340e85a8e338f6040518463ffffffff1660e060020a02815260040180846000191660001916815260200183600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b158015610de557600080fd5b505af1158015610df9573d6000803e3d6000fd5b505050506040513d6020811015610e0f57600080fd5b50511515610e67576040805160e560020a62461bcd02815260206004820152601660248201527f4e465f56435f4354525f4144445f52454a454354454400000000000000000000604482015290519081900360640190fd5b50505050505050505050505050565b600154600160a060020a03165b90565b60606000610e9383611c0f565b600c81018054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152939450830182828015610f1d5780601f10610ef257610100808354040283529160200191610f1d565b820191906000526020600020905b815481529060010190602001808311610f0057829003601f168201915b5050505050915050919050565b600084600160a060020a0316610f43888887878761086f565b600160a060020a031614979650505050505050565b60008060008060008060008060606000610f70612984565b60008c6000610f7e82611c0f565b9050610f8a8183611c83565b610f938f611c0f565b600e81015490935060ff166004811115610fa957fe5b9d508260000160009054906101000a9004600160a060020a03169c5082600101549b5082600e0160019054906101000a900460ff169450826006015498508260080160009054906101000a9004600160a060020a03169a508260090160009054906101000a9004600160a060020a031699508260070154975082600d01600580602002604051908101604052809291908260058015611089576020028201916000905b82829054906101000a900463ffffffff1663ffffffff168152602001906004019060208260030104928301926001038202915080841161104c5790505b50505050600a850154600b8601805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152939c509498509193909250908301828280156111245780601f106110f957610100808354040283529160200191611124565b820191906000526020600020905b81548152906001019060200180831161110757829003601f168201915b5050505050955050505091939597999b90929496989a50565b60008060008060008060008060606000611155612984565b60006111608d611c0f565b600e81015490915060ff16600481111561117657fe5b9b508060000160009054906101000a9004600160a060020a03169a508060010154995080600e0160019054906101000a900460ff169250806006015496508060080160009054906101000a9004600160a060020a031698508060090160009054906101000a9004600160a060020a031697508060070154955080600d01600580602002604051908101604052809291908260058015611256576020028201916000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116112195790505b50505050600a830154600b8401805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152939a509496509193909250908301828280156112f15780601f106112c6576101008083540402835291602001916112f1565b820191906000526020600020905b8154815290600101906020018083116112d457829003601f168201915b505050505093505091939597999b90929496989a50565b600084600061131682611c0f565b90506113228183611c83565b600087815260208190526040902087906003600e82015460ff16600481111561134757fe5b1461139c576040805160e560020a62461bcd02815260206004820152601260248201527f4e565f56435f4e4f545f54414c4c59494e470000000000000000000000000000604482015290519081900360640190fd5b60008981526020819052604090206009810154909550600160a060020a03163314611411576040805160e560020a62461bcd02815260206004820152601b60248201527f4e465f56435f4f4e4c595f564f54494e475f4c4547414c5f5245500000000000604482015290519081900360640190fd5b6007850154888801111561146f576040805160e560020a62461bcd02815260206004820152601d60248201527f4e465f56435f455843454544535f4f46464c494e455f565f504f574552000000604482015290519081900360640190fd5b6000888801116114c9576040805160e560020a62461bcd02815260206004820152601760248201527f4e465f56435f4e4f5f4f46465f454d5054595f564f5445000000000000000000604482015290519081900360640190fd5b600485018890556005850187905585516114ec90600c8701906020890190612906565b5088600019167f6d6aea577bb4a673761956e7a8a2b06318f0ea8276a6932690621e55f4bdab5a8660080160009054906101000a9004600160a060020a03168760000160009054906101000a9004600160a060020a0316338c8c8c6040518087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156115d85781810151838201526020016115c0565b50505050905090810190601f1680156116055780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a250506116238183611e92565b50505050505050565b7fbbf540c4111754f6dbce914d5e55e1c0cb26515adbc288b5ea8baa544adfbfa460009091565b84600061165f82611c0f565b905061166b8183611c83565b6000878152602081905260409020879061168481611d7f565b15156116da576040805160e560020a62461bcd02815260206004820152601360248201527f4e565f56435f564f54494e475f434c4f53454400000000000000000000000000604482015290519081900360640190fd5b865188511480156116ec575085518751145b80156116f9575084518651145b151561170157fe5b61170e8989898989612224565b50506116238183611e92565b600082600061172882611c0f565b90506117348183611c83565b6000858152602081905260409020859061174d81612328565b15156117a3576040805160e560020a62461bcd02815260206004820152601360248201527f4e565f56435f564f54494e475f434c4f53454400000000000000000000000000604482015290519081900360640190fd5b60008781526020819052604081209550336000908152600f8701602052604090205460ff1660028111156117d357fe5b14611828576040805160e560020a62461bcd02815260206004820152601360248201527f4e465f56435f414c52454144595f564f54454400000000000000000000000000604482015290519081900360640190fd5b61183485888833611dae565b50506118408183611e92565b5050505050565b60008061185384611c0f565b80546001820154604080517f4ee2cd7e000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015260248201939093529051939450911691634ee2cd7e916044808201926020929091908290030181600087803b1580156118c957600080fd5b505af11580156118dd573d6000803e3d6000fd5b505050506040513d60208110156118f357600080fd5b5051949350505050565b60008061190984611c0f565b600160a060020a0384166000908152600f8201602052604090205490915060ff16600281111561193557fe5b949350505050565b600154604080517fef7f5c23000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a0384811660248301529151600093929092169163ef7f5c239160448082019260209290919082900301818787803b1580156119ae57600080fd5b505af11580156119c2573d6000803e3d6000fd5b505050506040513d60208110156119d857600080fd5b50511515611a30576040805160e560020a62461bcd02815260206004820152601b60248201527f4e465f56435f4348414e47494e475f4354525f52454a45435445440000000000604482015290519081900360640190fd5b5060018054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff198316811790935560408051919092168082526020820193909352338183015290517feee43915f303cfa15a92ddcc186789e498099ff5a9570200987094fc3dd312239181900360600190a15050565b60008060008060008060008060008060008b6000611ac282611c0f565b9050611ace8183611c83565b611ad78e611c0f565b600e81015490935060ff166004811115611aed57fe5b9c5082600201549b5082600301549a5082600401549950826005015498508260080160009054906101000a9004600160a060020a0316945082600e0160019054906101000a900460ff1693508260000160009054906101000a9004600160a060020a0316600160a060020a031663981b24d084600101546040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b158015611b9d57600080fd5b505af1158015611bb1573d6000803e3d6000fd5b505050506040513d6020811015611bc757600080fd5b505160078401546006909401549d9f9c9e509a9c999b989a99928a0198929750939550919350915050565b600090815260208190526040902054600160a060020a0316151590565b60008181526020819052604090208054600160a060020a03161515611c7e576040805160e560020a62461bcd02815260206004820152601460248201527f4e465f56435f50524f505f4e4f545f4558495354000000000000000000000000604482015290519081900360640190fd5b919050565b426000600e84015460ff166004811115611c9957fe5b148015611cbc5750600d83015463ffffffff640100000000909104811690821610155b15611ccd57611ccd8383600461234c565b6004600e84015460ff166004811115611ce257fe5b14158015611d445750600e830154600d84019060ff166004811115611d0357fe5b60010163ffffffff16600581101515611d1857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168163ffffffff1610155b1561071a57600e830154611d7a908490849060ff166004811115611d6457fe5b60010160ff166004811115611d7557fe5b61234c565b611ccd565b6000611d8a82612328565b80611da8575060025b600e83015460ff166004811115611da657fe5b145b92915050565b83546001850154604080517f4ee2cd7e000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482019390935290516000939290921691634ee2cd7e9160448082019260209290919082900301818787803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b505050506040513d6020811015611e4f57600080fd5b505190508215611e7157611e678560020154826126bb565b6002860155611e85565b611e7f8560030154826126bb565b60038601555b61184085858486856126d1565b6000600e83015460ff166004811115611ea757fe5b148015611ec257508160060154826003015483600201540110155b15611ed357611ed38282600161234c565b6003600e83015460ff166004811115611ee857fe5b148015611eff575060008260040154836005015401115b15611f1057611f108282600461234c565b5050565b6000611f1e612984565b60008c600160a060020a031663981b24d08d6040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b158015611f6957600080fd5b505af1158015611f7d573d6000803e3d6000fd5b505050506040513d6020811015611f9357600080fd5b5051925060008311611fef576040805160e560020a62461bcd02815260206004820152601160248201527f4e465f56435f454d5054595f544f4b454e000000000000000000000000000000604482015290519081900360640190fd5b851580611ffc5750828610155b1515612052576040805160e560020a62461bcd02815260206004820152601760248201527f4e465f56435f544f54504f5745525f4c545f544f4b454e000000000000000000604482015290519081900360640190fd5b504263ffffffff81811683528b820181166020840152898201166060830181905260408301528583146120855786612088565b60005b826003602002015101826004602002019063ffffffff16908163ffffffff16815250508c8f60000160006101000a815481600160a060020a030219169083600160a060020a031602179055508b8f60010181905550838f600e0160016101000a81548160ff021916908315150217905550878f60090160006101000a815481600160a060020a030219169083600160a060020a031602179055506000861161213157600061213b565b61213b8684612788565b8f600701819055506121538f6007015484018b61279a565b8f60060181905550828f60060154111515156121b9576040805160e560020a62461bcd02815260206004820152601a60248201527f4e465f56435f4e4f5f43414d505f564f54494e475f504f574552000000000000604482015290519081900360640190fd5b338f60080160006101000a815481600160a060020a030219169083600160a060020a03160217905550818f600d019060056121f59291906129a3565b50600e8f01805460ff19169055600a8f018590556122138f8f611e92565b505050505050505050505050505050565b6000858152602081905260408120819081805b88518210156122f2576122aa838b8b8581518110151561225357fe5b906020019060200201518b8681518110151561226b57fe5b906020019060200201518b8781518110151561228357fe5b906020019060200201518b8881518110151561229b57fe5b906020019060200201516127af565b905088828151811015156122ba57fe5b90602001906020020151156122da576122d385826126bb565b94506122e7565b6122e484826126bb565b93505b600190910190612237565b6123008360020154866126bb565b6002840155600383015461231490856126bb565b836003018190555050505050505050505050565b600080600e83015460ff16600481111561233e57fe5b1480611da857506001611d93565b6000806000612359612984565b600e87015460ff169350600080600d890186600481111561237657fe5b6001016005811061238357fe5b600891828204019190066004029054906101000a900463ffffffff1693508363ffffffff164263ffffffff1610156123bb5742840394505b60008563ffffffff16111561247e576040805160a081019182905290600d8b0190600590826000855b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116123e45790505050505050925085600481111561243357fe5b60010191505b600582101561246d578483836005811061244f57fe5b6020020180519190910363ffffffff16905260019190910190612439565b61247c600d8a018460056129a3565b505b600e8901805488919060ff1916600183600481111561249957fe5b021790555060008660048111156124ac57fe5b1480156124c4575060048760048111156124c257fe5b145b156124ce57610864565b600889015460098a01548a5460408051600160a060020a0394851680825293851660208201819052929094169084018190528b937f1258a89b17795cbfc5dcd00373736bc91643360d51d6987542fcbe56204c0521939291908b908d906060810183600481111561253b57fe5b60ff16815260200182600481111561254f57fe5b60ff1681526020019550505050505060405180910390a2600e890154610100900460ff161561086457506008880154604051602481018981527f279fdfcf0000000000000000000000000000000000000000000000000000000092600160a060020a03169183918b918a918c916044018360048111156125cb57fe5b60ff1681526020018260048111156125df57fe5b60ff1681526040805180830381526020928301825291820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090981697909717875251815191969095508594509250905080838360005b8381101561266e578181015183820152602001612656565b50505050905090810190601f16801561269b5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af1505050505050505050505050565b6000828201838110156126ca57fe5b9392505050565b600081111561184057816126e65760026126e9565b60015b600160a060020a0384166000908152600f870160205260409020805460ff1916600183600281111561271757fe5b02179055506008850154855460408051600160a060020a039384168152918316602083015291851681830152831515606082015260808101839052905185917fc02362835e63428fa51482dfa6c83bdfd5b26d444a010b1c7ad55d5416f20844919081900360a00190a25050505050565b60008282111561279457fe5b50900390565b60006126ca8383670de0b6b3a76400006128ac565b6000806127bf878787878761086f565b90506000600160a060020a0382166000908152600f8a01602052604090205460ff1660028111156127ec57fe5b14156128a15787546001890154604080517f4ee2cd7e000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482019390935290519190921691634ee2cd7e9160448083019260209291908290030181600087803b15801561286657600080fd5b505af115801561287a573d6000803e3d6000fd5b505050506040513d602081101561289057600080fd5b505191506128a188888389866126d1565b509695505050505050565b60006119356128bb85856128c1565b836128e5565b60008282028315806128dd57508284828115156128da57fe5b04145b15156126ca57fe5b6000816128f584600283046126bb565b8115156128fe57fe5b049392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061294757805160ff1916838001178555612974565b82800160010185558215612974579182015b82811115612974578251825591602001919060010190612959565b50612980929150612a3b565b5090565b60a0604051908101604052806005906020820280388339509192915050565b600183019183908215612a2f5791602002820160005b838211156129fd57835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026129b9565b8015612a2d5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026129fd565b505b50612980929150612a55565b610e8391905b808211156129805760008155600101612a41565b610e8391905b8082111561298057805463ffffffff19168155600101612a5b5600a165627a7a72305820cc7171c5b324ce3ec1cb8f0a8e5306236b6990c6d46a48d73535e508b5f12ccd0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000698ee61515a02f46124341e8ed25b1bb417db27c
-----Decoded View---------------
Arg [0] : controller (address): 0x698eE61515A02F46124341E8ED25B1BB417dB27c
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000698ee61515a02f46124341e8ed25b1bb417db27c
Deployed Bytecode Sourcemap
20705:18238:0:-;;;;;;;;;-1:-1:-1;;;20705:18238:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34327:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34327:116:0;;;;;;;33025:673;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33025:673:0;;;;;;;-1:-1:-1;;;;;33025:673:0;;;;;;;;;;;;;34873:506;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34873:506:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34873:506:0;;;;;;;;;;;;;;24428:1997;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24428:1997:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24428:1997:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24428:1997:0;;-1:-1:-1;;;;24428:1997:0;;;;;-1:-1:-1;24428:1997:0;;-1:-1:-1;;24428:1997:0;32143:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32143:147:0;;;;28701:250;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28701:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28701:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34502:363;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34502:363:0;;;;;;;-1:-1:-1;;;;;34502:363:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28959:1048;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28959:1048:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28959:1048:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28959:1048:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28959:1048:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30015:1006;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30015:1006:0;;;;;26827:807;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26827:807:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26827:807:0;;-1:-1:-1;26827:807:0;;-1:-1:-1;;;;;;;26827:807:0;31845:201;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31845:201:0;;;;;;;;;;;;;;;;;;;;;;;;;;;33809:510;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33809:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33809:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33809:510:0;;;;-1:-1:-1;33809:510:0;-1:-1:-1;33809:510:0;;-1:-1:-1;33809:510:0;;;;;;;;;-1:-1:-1;;33809:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33809:510:0;;;;-1:-1:-1;33809:510:0;-1:-1:-1;33809:510:0;;-1:-1:-1;33809:510:0;;;;;;;;;-1:-1:-1;;33809:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33809:510:0;;;;-1:-1:-1;33809:510:0;-1:-1:-1;33809:510:0;;-1:-1:-1;33809:510:0;;;;;;;;;-1:-1:-1;33809:510:0;;-1:-1:-1;33809:510:0;;-1:-1:-1;;;;;;;33809:510:0;26433:386;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26433:386:0;;;;;;;;;31512:272;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31512:272:0;;;-1:-1:-1;;;;;31512:272:0;;;;;;;;;;;;;;;;;;;;;31029:247;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31029:247:0;;;-1:-1:-1;;;;;31029:247:0;;;;;;;;;;;;;;;;;;;;;;;;32341:411;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32341:411:0;-1:-1:-1;;;;;32341:411:0;;;;;27642:1051;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27642:1051:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27642:1051:0;;;;;;;;;;;;;;;;;;;;31284:220;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31284:220:0;;;;;34327:116;34424:10;21891:33;21927:34;21950:10;21927:22;:34::i;:::-;21891:70;;22009:47;22042:1;22045:10;22009:32;:47::i;:::-;34327:116;;;:::o;33025:673::-;33483:33;33236:10;21204:33;21240:34;21263:10;21240:22;:34::i;:::-;21204:70;;21322:47;21355:1;21358:10;21322:32;:47::i;:::-;22389:33;22425:22;;;;;;;;;;33274:10;;22466:29;22425:22;22466:26;:29::i;:::-;22458:61;;;;;;;-1:-1:-1;;;;;22458:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33376:57;33393:10;33405:11;33418:5;33425:1;33428;33431;33376:16;:57::i;:::-;33369:65;;;;;;33519:10;:22;;;;;;;;;;;-1:-1:-1;;;;;;33560:17:0;;;;;;:10;;;:17;;;;;;;;:52;;;;;;;;;33552:84;;;;;-1:-1:-1;;;;;33552:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33647:43;33656:1;33659:10;33671:11;33684:5;33647:8;:43::i;:::-;21414:1;;21473:47;21506:1;21509:10;21473:32;:47::i;:::-;33025:673;;;;;;;;;:::o;34873:506::-;35280:65;;;35077:7;35280:65;;;;;;;;35314:4;35280:65;;;;;;;;;;;;;;35297:7;35280:65;;;;;;;22:32:-1;26:21;;;22:32;6:49;;35280:65:0;;;;;;;;35270:76;;35077:7;;35148:223;;35280:65;;;;;35270:76;;;;;35280:65;35270:76;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;35270:76:0;;;;;;;;;;;;35182:165;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;35182:165:0;;;;;;;;35172:176;;35182:165;;-1:-1:-1;35182:165:0;;-1:-1:-1;35182:165:0;;35172:176;;;-1:-1:-1;35172:176:0;35182:165;35172:176;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;35172:176:0;;;;;;;;;;;;-1:-1:-1;35148:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;;;35148:223:0;;;;;;;;;;;-1:-1:-1;35148:223:0;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;35148:223:0;;-1:-1:-1;;35148:223:0;;;34873:506;-1:-1:-1;;;;;;;34873:506:0:o;24428:1997::-;24882:33;;-1:-1:-1;;;;;24851:19:0;;;;24843:28;;;;;;24918:10;:22;;;;;;;;;;24961:7;;24918:22;;-1:-1:-1;;;;;;24961:7:0;:21;24953:53;;;;;-1:-1:-1;;;;;24953:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25094:32;;;;;;;;;25086:69;;;;;-1:-1:-1;;;;;25086:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25200:6;25174:32;;;25166:69;;;;;-1:-1:-1;;;;;25166:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25268:27;;:52;;;;-1:-1:-1;25299:21:0;;;;25268:52;:119;;;;25362:1;25337:22;:26;:50;;;;;25386:1;25367:16;:20;;;25337:50;25246:192;;;;;;;-1:-1:-1;;;;;25246:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25492:1;25471:18;:22;;;:46;;;;;25516:1;25497:16;:20;25471:46;:78;;;;-1:-1:-1;;;;;;25521:28:0;;;;25471:78;:175;;;-1:-1:-1;25566:23:0;;;;:48;;;;-1:-1:-1;25593:21:0;;25566:48;:80;;;;-1:-1:-1;;;;;;25618:28:0;;;25566:80;25449:249;;;;;;;-1:-1:-1;;;;;25449:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25786:1;25758:5;-1:-1:-1;;;;;25758:23:0;;:25;;;;;-1:-1:-1;;;25758:25:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25758:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25758:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25758:25:0;:29;;-1:-1:-1;25800:324:0;:1;25827:10;25852:5;25758:29;25890:16;25921:22;25958:12;25985:14;26014:18;26047:16;26078:6;26099:14;25800:324;:12;:324;:::i;:::-;26199:31;;;;:15;;;;:31;;;;;:::i;:::-;;26328:17;;;;;;;;;-1:-1:-1;;;;;26328:17:0;-1:-1:-1;;;;;26328:31:0;;26360:10;26372;26384:5;26328:62;;;;;-1:-1:-1;;;26328:62:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26328:62:0;-1:-1:-1;;;;;26328:62:0;;;;;;-1:-1:-1;;;;;26328:62:0;-1:-1:-1;;;;;26328:62:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26328:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26328:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26328:62:0;26320:97;;;;;;;-1:-1:-1;;;;;26320:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24428:1997;;;;;;;;;;;;;:::o;32143:147::-;32265:17;;-1:-1:-1;;;;;32265:17:0;32143:147;;:::o;28701:250::-;28806:6;28830:33;28866:34;28889:10;28866:22;:34::i;:::-;28918:25;;;28911:32;;;;;;;;-1:-1:-1;;28911:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28830:70;;-1:-1:-1;28911:32:0;;28918:25;28911:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28701:250;;;;:::o;34502:363::-;34725:4;34852:5;-1:-1:-1;;;;;34793:64:0;:55;34815:10;34827:11;34840:1;34843;34846;34793:21;:55::i;:::-;-1:-1:-1;;;;;34793:64:0;;;34502:363;-1:-1:-1;;;;;;;34502:363:0:o;28959:1048::-;29109:7;29131:13;29159:18;29192:17;29224:22;29261:33;29309:27;29351:14;29380:19;29414;29448;;:::i;:::-;29495:33;29047:10;21891:33;21927:34;21950:10;21927:22;:34::i;:::-;21891:70;;22009:47;22042:1;22045:10;22009:32;:47::i;:::-;29531:34;29554:10;29531:22;:34::i;:::-;29588:7;;;;29495:70;;-1:-1:-1;29588:7:0;;29582:14;;;;;;;;29578:18;;29615:1;:7;;;;;;;;;;-1:-1:-1;;;;;29615:7:0;29607:15;;29646:1;:12;;;29633:25;;29686:1;:11;;;;;;;;;;;;29669:28;;29736:1;:27;;;29708:55;;29786:1;:11;;;;;;;;;;-1:-1:-1;;;;;29786:11:0;29774:23;;29825:1;:16;;;;;;;;;;-1:-1:-1;;;;;29825:16:0;29808:33;;29874:1;:21;;;29852:43;;29918:1;:11;;29906:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;29949:8:0;;;;29984:15;;;29968:31;;;;;;;;;;;;;-1:-1:-1;;29968:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;29949:8;;-1:-1:-1;29906:23:0;;-1:-1:-1;29968:31:0;;29984:15;;-1:-1:-1;29968:31:0;;;29984:15;29968:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28959:1048;;;;;;;;;;;;;;;;:::o;30015:1006::-;30119:7;30141:13;30169:18;30202:17;30234:22;30271:33;30319:27;30361:14;30390:19;30424;30458;;:::i;:::-;30509:33;30545:34;30568:10;30545:22;:34::i;:::-;30602:7;;;;30509:70;;-1:-1:-1;30602:7:0;;30596:14;;;;;;;;30592:18;;30629:1;:7;;;;;;;;;;-1:-1:-1;;;;;30629:7:0;30621:15;;30660:1;:12;;;30647:25;;30700:1;:11;;;;;;;;;;;;30683:28;;30750:1;:27;;;30722:55;;30800:1;:11;;;;;;;;;;-1:-1:-1;;;;;30800:11:0;30788:23;;30839:1;:16;;;;;;;;;;-1:-1:-1;;;;;30839:16:0;30822:33;;30888:1;:21;;;30866:43;;30932:1;:11;;30920:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;30963:8:0;;;;30998:15;;;30982:31;;;;;;;;;;;;;-1:-1:-1;;30982:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;30963:8;;-1:-1:-1;30920:23:0;;-1:-1:-1;30982:31:0;;30998:15;;-1:-1:-1;30982:31:0;;;30998:15;30982:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30015:1006;;;;;;;;;;;;;;:::o;26827:807::-;27030:33;26971:10;21204:33;21240:34;21263:10;21240:22;:34::i;:::-;21204:70;;21322:47;21355:1;21358:10;21322:32;:47::i;:::-;22597:33;22633:22;;;;;;;;;;27002:10;;22685:26;22674:7;;;;;;:37;;;;;;;;;22666:68;;;;;-1:-1:-1;;;;;22666:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27066:10;:22;;;;;;;;;;27121:16;;;;27066:22;;-1:-1:-1;;;;;;27121:16:0;27107:10;:30;27099:70;;;;;-1:-1:-1;;;;;27099:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27255:21;;;;27234:17;;;:42;;27226:84;;;;;-1:-1:-1;;;;;27226:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27349:1;27329:17;;;:21;27321:57;;;;;-1:-1:-1;;;;;27321:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27391:17;;;:27;;;27429:17;;;:27;;;27467:39;;;;:25;;;;:39;;;;;:::i;:::-;;27550:10;27524:102;;;;27562:1;:11;;;;;;;;;;-1:-1:-1;;;;;27562:11:0;27575:1;:7;;;;;;;;;;-1:-1:-1;;;;;27575:7:0;27584:10;27596:7;27605;27614:11;27524:102;;;;-1:-1:-1;;;;;27524:102:0;-1:-1:-1;;;;;27524:102:0;;;;;;-1:-1:-1;;;;;27524:102:0;-1:-1:-1;;;;;27524:102:0;;;;;;-1:-1:-1;;;;;27524:102:0;-1:-1:-1;;;;;27524:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27524:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21414:1;;21473:47;21506:1;21509:10;21473:32;:47::i;:::-;26827:807;;;;;;;:::o;31845:201::-;31968:66;31915:10;31845:201;;:::o;33809:510::-;34014:10;21204:33;21240:34;21263:10;21240:22;:34::i;:::-;21204:70;;21322:47;21355:1;21358:10;21322:32;:47::i;:::-;22389:33;22425:22;;;;;;;;;;34052:10;;22466:29;22425:22;22466:26;:29::i;:::-;22458:61;;;;;;;-1:-1:-1;;;;;22458:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34127:1;:8;34101:15;:22;:34;:58;;;;;34151:1;:8;34139:1;:8;:20;34101:58;:82;;;;;34175:1;:8;34163:1;:8;:20;34101:82;34080:114;;;;;;34205:106;34238:10;34263:15;34293:1;34296;34299;34205:18;:106::i;:::-;21414:1;;21473:47;21506:1;21509:10;21473:32;:47::i;26433:386::-;26594:33;26530:10;21204:33;21240:34;21263:10;21240:22;:34::i;:::-;21204:70;;21322:47;21355:1;21358:10;21322:32;:47::i;:::-;22173:33;22209:22;;;;;;;;;;26566:10;;22250:30;22209:22;22250:27;:30::i;:::-;22242:62;;;;;;;-1:-1:-1;;;;;22242:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26630:10;:22;;;;;;;;;;;-1:-1:-1;26682:10:0;26671:22;;;;:10;;;:22;;;;;;;;:57;;;;;;;;;26663:89;;;;;-1:-1:-1;;;;;26663:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26763:48;26772:1;26775:10;26787:11;26800:10;26763:8;:48::i;:::-;21414:1;;21473:47;21506:1;21509:10;21473:32;:47::i;:::-;26433:386;;;;;:::o;31512:272::-;31623:7;31648:33;31684:34;31707:10;31684:22;:34::i;:::-;31736:7;;;31763:12;;;31736:40;;;;;;-1:-1:-1;;;;;31736:40:0;;;;;;;;;;;;;;;;31648:70;;-1:-1:-1;31736:7:0;;;:19;;:40;;;;;;;;;;;;;;;:7;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;31736:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31736:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31736:40:0;;31512:272;-1:-1:-1;;;;31512:272:0:o;31029:247::-;31133:5;31156:33;31192:34;31215:10;31192:22;:34::i;:::-;-1:-1:-1;;;;;31250:17:0;;;;;;:10;;;:17;;;;;;31156:70;;-1:-1:-1;31250:17:0;;31244:24;;;;;;;;31237:31;31029:247;-1:-1:-1;;;;31029:247:0:o;32341:411::-;32446:17;;:69;;;;;;32489:10;32446:69;;;;-1:-1:-1;;;;;32446:69:0;;;;;;;;;32558:21;;32446:17;;;;;:42;;:69;;;;;;;;;;;;;;;32558:21;32446:17;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;32446:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32446:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32446:69:0;32438:109;;;;;;;-1:-1:-1;;;;;32438:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32590:17:0;;;-1:-1:-1;;;;;32619:33:0;;;-1:-1:-1;;32619:33:0;;;;;;;32668:76;;;32590:17;;;;32668:76;;;;;;;;;;32733:10;32668:76;;;;;;;;;;;;;;;32341:411;;:::o;27642:1051::-;27783:7;27805:15;27835;27865:23;27903;27941:24;27980;28019:33;28067:17;28099:25;28152:33;27740:10;21891:33;21927:34;21950:10;21927:22;:34::i;:::-;21891:70;;22009:47;22042:1;22045:10;22009:32;:47::i;:::-;28188:34;28211:10;28188:22;:34::i;:::-;28245:7;;;;28152:70;;-1:-1:-1;28245:7:0;;28239:14;;;;;;;;28235:18;;28274:1;:9;;;28264:19;;28304:1;:9;;;28294:19;;28342:1;:17;;;28324:35;;28388:1;:17;;;28370:35;;28428:1;:11;;;;;;;;;;-1:-1:-1;;;;;28428:11:0;28416:23;;28473:1;:11;;;;;;;;;;;;28450:34;;28514:1;:7;;;;;;;;;;-1:-1:-1;;;;;28514:7:0;-1:-1:-1;;;;;28514:21:0;;28536:1;:12;;;28514:35;;;;;-1:-1:-1;;;28514:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28514:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28514:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28514:35:0;28598:21;;;;28658:27;;;;;27642:1051;;;;-1:-1:-1;27642:1051:0;;;;;;28514:35;28579:40;;;;28658:27;;-1:-1:-1;27642:1051:0;;-1:-1:-1;27642:1051:0;;-1:-1:-1;27642:1051:0;-1:-1:-1;;27642:1051:0:o;31284:220::-;31377:4;31435:22;;;;;;;;;;31475:7;-1:-1:-1;;;;;31475:7:0;:21;;;31284:220::o;35477:275::-;35583:33;35638:22;;;;;;;;;;35679:7;;-1:-1:-1;;;;;35679:7:0;:21;;35671:54;;;;;-1:-1:-1;;;;;35671:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35477:275;;;:::o;17821:545::-;17940:3;17922:8;17997:7;;;;;;:28;;;;;;;;;:70;;;;-1:-1:-1;18034:11:0;;;:33;;;;;;;;18029:38;;;;;17997:70;17993:143;;;18084:40;18097:1;18100:10;18112:11;18084:12;:40::i;:::-;18224:11;18213:7;;;;;;:22;;;;;;;;;;:63;;;;-1:-1:-1;18263:7:0;;;;18244:11;;;;18263:7;;18256:15;;;;;;;;18274:1;18256:19;18244:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18239:37;;:1;:37;;;;18213:63;18207:152;;;18333:7;;;;18293:54;;18306:1;;18309:10;;18333:7;;18327:14;;;;;;;;18344:1;18327:18;18321:25;;;;;;;;;;18293:12;:54::i;:::-;18207:152;;15308:189;15418:4;15447:15;15460:1;15447:12;:15::i;:::-;:42;;;-1:-1:-1;15477:12:0;15466:23;:7;;;;;;:23;;;;;;;;;15447:42;15440:49;15308:189;-1:-1:-1;;15308:189:0:o;36322:431::-;36477:7;;;36504:12;;;36477:40;;;;;;-1:-1:-1;;;;;36477:40:0;;;;;;;;;;;;;;;;36461:13;;36477:7;;;;;:19;;:40;;;;;;;;;;;;;;;36461:13;36477:7;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;36477:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36477:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36477:40:0;;-1:-1:-1;36528:153:0;;;;36572:26;36581:1;:9;;;36592:5;36572:8;:26::i;:::-;36560:9;;;:38;36528:153;;;36643:26;36652:1;:9;;;36663:5;36643:8;:26::i;:::-;36631:9;;;:38;36528:153;36691:54;36704:1;36707:10;36719:5;36726:11;36739:5;36691:12;:54::i;18456:586::-;18646:17;18635:7;;;;;;:28;;;;;;;;;:84;;;;;18692:1;:27;;;18679:1;:9;;;18667:1;:9;;;:21;:52;;18635:84;18631:193;;;18771:41;18784:1;18787:10;18799:12;18771;:41::i;:::-;18885:11;18874:7;;;;;;:22;;;;;;;;;:67;;;;;18940:1;18920;:17;;;18900:1;:17;;;:37;:41;18874:67;18870:165;;;18983:40;18996:1;18999:10;19011:11;18983:12;:40::i;:::-;18456:586;;:::o;15505:2167::-;15949:23;16220:37;;:::i;:::-;16268:8;15975:5;-1:-1:-1;;;;;15975:19:0;;15995:10;15975:31;;;;;-1:-1:-1;;;15975:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15975:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15975:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15975:31:0;;-1:-1:-1;16043:1:0;16025:19;;16017:49;;;;;-1:-1:-1;;;;;16017:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16085:21;;;:60;;;16130:15;16110:16;:35;;16085:60;16077:96;;;;;;;-1:-1:-1;;;;;16077:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16286:3:0;16301:16;;;;;;16343:20;;;16328:35;;16301:12;16328;;:35;16430:16;;;16415:31;:12;;;:31;;;16400:12;;;:46;16619:35;;;:60;;16661:18;16619:60;;;16657:1;16619:60;16603:9;16613:1;16603:12;;;;:77;16588:9;16598:1;16588:12;;;:92;;;;;;;;;;;16823:5;16813:1;:7;;;:15;;;;;-1:-1:-1;;;;;16813:15:0;;;;;-1:-1:-1;;;;;16813:15:0;;;;;;16854:10;16839:1;:12;;:25;;;;16889:14;16875:1;:11;;;:28;;;;;;;;;;;;;;;;;;16935:14;16916:1;:16;;;:33;;;;;-1:-1:-1;;;;;16916:33:0;;;;;-1:-1:-1;;;;;16916:33:0;;;;;;17003:1;16984:16;:20;:70;;17053:1;16984:70;;;17007:43;17016:16;17034:15;17007:8;:43::i;:::-;16960:1;:21;;:94;;;;17148:85;17187:1;:21;;;17169:15;:39;17210:22;17148:20;:85::i;:::-;17118:1;:27;;:115;;;;17283:15;17252:1;:27;;;:46;;17244:85;;;;;;;-1:-1:-1;;;;;17244:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17372:10;17342:1;:11;;;:41;;;;;-1:-1:-1;;;;;17342:41:0;;;;;-1:-1:-1;;;;;17342:41:0;;;;;;17408:9;17394:1;:11;;:23;;;;;;;:::i;:::-;-1:-1:-1;17428:7:0;;;:27;;-1:-1:-1;;17428:27:0;;;17466:8;;;:17;;;17632:32;17428:7;17653:10;17632:17;:32::i;:::-;15505:2167;;;;;;;;;;;;;;;:::o;36761:876::-;36955:15;37043:22;;;;;;;;;;36955:15;;;;37076:417;37100:15;:22;37096:1;:26;37076:417;;;37160:139;37196:1;37216:10;37245:15;37261:1;37245:18;;;;;;;;;;;;;;;;;;37282:1;37284;37282:4;;;;;;;;;;;;;;;;;;37288:1;37290;37288:4;;;;;;;;;;;;;;;;;;37294:1;37296;37294:4;;;;;;;;;;;;;;;;;;37160:17;:139::i;:::-;37144:155;;37318:15;37334:1;37318:18;;;;;;;;;;;;;;;;;;37314:168;;;37367:24;37376:7;37385:5;37367:8;:24::i;:::-;37357:34;;37314:168;;;37442:24;37451:7;37460:5;37442:8;:24::i;:::-;37432:34;;37314:168;37124:3;;;;;37076:417;;;37550:28;37559:1;:9;;;37570:7;37550:8;:28::i;:::-;37538:9;;;:40;37610:9;;;;37601:28;;37621:7;37601:8;:28::i;:::-;37589:1;:9;;:40;;;;36761:876;;;;;;;;;;:::o;15097:203::-;15208:4;;15237:7;;;;;;:28;;;;;;;;;:55;;;-1:-1:-1;15280:12:0;15269:23;;19102:1505;19213:14;19324:12;19347:15;19694:40;;:::i;:::-;19230:7;;;;;;;-1:-1:-1;19768:10:0;;19365:11;;;19230:7;19377:17;;;;;;;;19397:1;19377:21;19365:34;;;;;;;;;;;;;;;;;;;;;;;;;;;19347:52;;19539:8;19525:22;;19532:3;19525:22;;;19521:85;;;19590:3;19572:8;:22;19564:30;;19521:85;19628:1;19620:5;:9;;;19616:328;;;19694:54;;;;;;;;;;;19737:11;;;;19694:54;;19737:11;-1:-1:-1;19694:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19789:8;19781:17;;;;;;;;19801:1;19781:21;19768:34;;19763:129;12458:1;19804:2;:17;19763:129;;;19871:5;19851:12;19864:2;19851:16;;;;;;;;;;:25;;;;;;;;;;19829:1;19823:7;;;;;19763:129;;;19906:26;:11;;;19920:12;19906:26;;:::i;:::-;;19616:328;19980:7;;;:18;;19990:8;;19980:7;-1:-1:-1;;19980:18:0;;19990:8;19980:18;;;;;;;;;;;;-1:-1:-1;20093:17:0;20081:8;:29;;;;;;;;;:56;;;;-1:-1:-1;20126:11:0;20114:8;:23;;;;;;;;;20081:56;20077:95;;;20154:7;;20077:95;20228:11;;;;20241:16;;;;20259:7;;20189:98;;;-1:-1:-1;;;;;20228:11:0;;;20189:98;;;20241:16;;;20189:98;;;;;;20259:7;;;;20189:98;;;;;;20216:10;;20189:98;;20228:11;20241:16;20259:7;20268:8;;20278;;20189:98;;;20268:8;20189:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20302:11;;;;;;;;;20298:302;;;-1:-1:-1;20403:11:0;;;;20510:59;;;;;;;;20403:46;;-1:-1:-1;;;;;20403:11:0;;:46;;20538:10;;20550:8;;20560;;20510:59;;20550:8;20510:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;6:49;;20510:59:0;;;;;;25:18:-1;;;61:17;;20510:59:0;182:15:-1;20510:59:0;;;;179:29:-1;;;;160:49;;20464:124:0;;;20510:59;;20464:124;;-1:-1:-1;20464:124:0;;-1:-1:-1;25:18;-1:-1;20464:124:0;-1:-1:-1;20464:124:0;;25:18:-1;22:32;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20464:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19102:1505:0;;;;;;;;;:::o;10522:179::-;10607:7;10644:5;;;10667:6;;;;10660:14;;;;10692:1;10522:179;-1:-1:-1;;;10522:179:0:o;38542:398::-;38712:1;38704:5;:9;38700:233;;;38750:11;:79;;38798:31;38750:79;;;38764:31;38750:79;-1:-1:-1;;;;;38730:17:0;;;;;;:10;;;:17;;;;;:99;;-1:-1:-1;;38730:99:0;;;;;;;;;;;;;;;-1:-1:-1;38873:11:0;;;;38886:7;;38849:72;;;-1:-1:-1;;;;;38873:11:0;;;38849:72;;38886:7;;;38849:72;;;;;;;;;;;;;;;;;;;;;;;;;;38861:10;;38849:72;;;;;;;;;;38542:398;;;;;:::o;10359:155::-;10444:7;10476:6;;;;10469:14;;;;-1:-1:-1;10501:5:0;;;10359:155::o;9538:225::-;9642:7;9723:32;9734:6;9742:4;9748:6;9723:10;:32::i;37645:889::-;37872:13;38033;38049:105;38085:10;38110:11;38136:1;38139;38142;38049:21;:105::i;:::-;38033:121;-1:-1:-1;38231:31:0;-1:-1:-1;;;;;38210:17:0;;;;;;:10;;;:17;;;;;;;;:52;;;;;;;;;38206:251;;;38287:7;;;38314:12;;;38287:40;;;;;;-1:-1:-1;;;;;38287:40:0;;;;;;;;;;;;;;;;:7;;;;;:19;;:40;;;;;;;;;;;;;;:7;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;38287:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38287:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38287:40:0;;-1:-1:-1;38391:54:0;38404:1;38407:10;38419:5;38426:11;38287:40;38391:12;:54::i;:::-;37645:889;;;;;;;;;:::o;9903:188::-;10017:7;10049:34;10058:17;10062:6;10070:4;10058:3;:17::i;:::-;10077:5;10049:8;:34::i;10158:193::-;10243:7;10280:5;;;10303:6;;;:20;;;10322:1;10317;10313;:5;;;;;;;;:10;10303:20;10296:28;;;;;9032:144;9121:7;9167:1;9153:11;9157:1;9162;9167;9160:3;9153;:11::i;:::-;:15;;;;;;;;;9032:144;-1:-1:-1;;;9032:144:0:o;20705:18238::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20705:18238:0;;;-1:-1:-1;20705:18238:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;20705:18238:0;;;-1:-1:-1;;20705:18238:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20705:18238:0;;;-1:-1:-1;20705:18238:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20705:18238:0;;;;;;
Swarm Source
bzzr://cc7171c5b324ce3ec1cb8f0a8e5306236b6990c6d46a48d73535e508b5f12ccd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.