Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 11108890 | 1494 days ago | IN | 0 ETH | 0.21404772 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
sbVotes
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; import "./SafeMath.sol"; import "./sbControllerInterface.sol"; import "./sbGenericServicePoolInterface.sol"; import "./sbStrongValuePoolInterface.sol"; contract sbVotes { event DelegateChanged( address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); event DelegateVotesChanged( address indexed delegate, uint256 previousBalance, uint256 newBalance ); event Voted( address indexed voter, address community, address indexed service, uint256 amount, uint256 indexed day ); event VoteRecalled( address indexed voter, address community, address indexed service, uint256 amount, uint256 indexed day ); event ServiceDropped( address indexed voter, address community, address indexed service, uint256 indexed day ); event Claimed(address indexed service, uint256 amount, uint256 indexed day); event AddVotes(address indexed staker, uint256 amount); event SubVotes(address indexed staker, uint256 amount); using SafeMath for uint256; bool public initDone; address public admin; address public pendingAdmin; address public superAdmin; address public pendingSuperAdmin; sbControllerInterface public sbController; sbGenericServicePoolInterface public sbGenericServicePool; sbStrongValuePoolInterface public sbStrongValuePool; mapping(address => uint96) public balances; mapping(address => address) public delegates; mapping(address => mapping(uint32 => uint32)) public checkpointsFromBlock; mapping(address => mapping(uint32 => uint96)) public checkpointsVotes; mapping(address => uint32) public numCheckpoints; mapping(address => address[]) internal voterServicePools; mapping(address => mapping(address => address[])) internal voterServicePoolServices; mapping(address => mapping(address => mapping(address => uint256[]))) internal voterServicePoolServiceDays; mapping(address => mapping(address => mapping(address => uint256[]))) internal voterServicePoolServiceAmounts; mapping(address => mapping(address => mapping(address => uint256[]))) internal voterServicePoolServiceVoteSeconds; mapping(address => uint256) internal voterDayLastClaimedFor; mapping(address => uint256) internal voterVotesOut; mapping(address => mapping(address => uint256[])) internal serviceServicePoolDays; mapping(address => mapping(address => uint256[])) internal serviceServicePoolAmounts; mapping(address => mapping(address => uint256[])) internal serviceServicePoolVoteSeconds; mapping(address => mapping(address => uint256)) internal serviceServicePoolDayLastClaimedFor; mapping(address => uint256[]) internal servicePoolDays; mapping(address => uint256[]) internal servicePoolAmounts; mapping(address => uint256[]) internal servicePoolVoteSeconds; function init( address sbControllerAddress, address sbStrongValuePoolAddress, address adminAddress, address superAdminAddress ) public { require(!initDone, "init done"); sbController = sbControllerInterface(sbControllerAddress); sbStrongValuePool = sbStrongValuePoolInterface( sbStrongValuePoolAddress ); admin = adminAddress; superAdmin = superAdminAddress; initDone = true; } function updateVotes( address voter, uint256 rawAmount, bool adding ) external { require( msg.sender == address(sbStrongValuePool), "not sbStrongValuePool" ); uint96 amount = _safe96(rawAmount, "amount exceeds 96 bits"); if (adding) { _addVotes(voter, amount); } else { require(voter == delegates[voter], "must delegate to self"); require( _getAvailableServiceVotes(voter) >= amount, "must recall votes" ); _subVotes(voter, amount); } } function getCurrentProposalVotes(address account) external view returns (uint96) { return _getCurrentProposalVotes(account); } function getPriorProposalVotes(address account, uint256 blockNumber) external view returns (uint96) { require(blockNumber < block.number, "not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } if (checkpointsFromBlock[account][nCheckpoints - 1] <= blockNumber) { return checkpointsVotes[account][nCheckpoints - 1]; } if (checkpointsFromBlock[account][0] > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; uint32 fromBlock = checkpointsFromBlock[account][center]; uint96 votes = checkpointsVotes[account][center]; if (fromBlock == blockNumber) { return votes; } else if (fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpointsVotes[account][lower]; } function getServiceDayLastClaimedFor(address servicePool, address service) public view returns (uint256) { uint256 len = serviceServicePoolDays[service][servicePool].length; if (len != 0) { return serviceServicePoolDayLastClaimedFor[service][servicePool] == 0 ? serviceServicePoolDays[service][servicePool][0].sub(1) : serviceServicePoolDayLastClaimedFor[service][servicePool]; } return 0; } function getVoterDayLastClaimedFor(address voter) public view returns (uint256) { if (voterDayLastClaimedFor[voter] == 0) { uint256 firstDayVoted = _getVoterFirstDay(voter); if (firstDayVoted == 0) { return 0; } return firstDayVoted.sub(1); } return voterDayLastClaimedFor[voter]; } function recallAllVotes() public { require(voterVotesOut[msg.sender] > 0, "no votes out"); _recallAllVotes(msg.sender); } function delegate(address delegatee) public { _delegate(msg.sender, delegatee); } function getDelegate(address delegator) public view returns (address) { return delegates[delegator]; } function getAvailableServiceVotes(address account) public view returns (uint96) { return _getAvailableServiceVotes(account); } function getVoterServicePoolServices(address voter, address servicePool) public view returns (address[] memory) { require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); return voterServicePoolServices[voter][servicePool]; } function vote( address servicePool, address service, uint256 amount ) public { require(amount > 0, "1: zero"); require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); require( sbGenericServicePoolInterface(servicePool).isServiceAccepted( service ), "invalid service" ); require(sbStrongValuePool.serviceMinMined(service), "not min mined"); require( uint256(_getAvailableServiceVotes(msg.sender)) >= amount, "not enough votes" ); if (!_voterServicePoolServiceExists(msg.sender, servicePool, service)) { require( voterServicePoolServices[msg.sender][servicePool].length.add( 1 ) <= sbController.getVoteForServicesCount(), "1: too many" ); voterServicePoolServices[msg.sender][servicePool].push(service); } if (!_voterServicePoolExists(msg.sender, servicePool)) { require( voterServicePools[msg.sender].length.add(1) <= sbController.getVoteForServicePoolsCount(), "2: too many" ); voterServicePools[msg.sender].push(servicePool); } uint256 currentDay = _getCurrentDay(); _updateVoterServicePoolServiceData( msg.sender, servicePool, service, amount, true, currentDay ); _updateServiceServicePoolData( service, servicePool, amount, true, currentDay ); _updateServicePoolData(servicePool, amount, true, currentDay); voterVotesOut[msg.sender] = voterVotesOut[msg.sender].add(amount); emit Voted(msg.sender, servicePool, service, amount, currentDay); } function recallVote( address servicePool, address service, uint256 amount ) public { require(amount > 0, "zero"); require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); require( sbGenericServicePoolInterface(servicePool).isServiceAccepted( service ), "invalid service" ); require( _voterServicePoolServiceExists(msg.sender, servicePool, service), "not found" ); uint256 currentDay = _getCurrentDay(); (, uint256 votes, ) = _getVoterServicePoolServiceData( msg.sender, servicePool, service, currentDay ); require(votes >= amount, "not enough votes"); _updateVoterServicePoolServiceData( msg.sender, servicePool, service, amount, false, currentDay ); _updateServiceServicePoolData( service, servicePool, amount, false, currentDay ); _updateServicePoolData(servicePool, amount, false, currentDay); voterVotesOut[msg.sender] = voterVotesOut[msg.sender].sub(amount); emit VoteRecalled(msg.sender, servicePool, service, amount, currentDay); } function dropService(address servicePool, address service) public { require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); require( sbGenericServicePoolInterface(servicePool).isServiceAccepted( service ), "invalid service" ); require( _voterServicePoolExists(msg.sender, servicePool), "2: not found" ); require( _voterServicePoolServiceExists(msg.sender, servicePool, service), "1: not found" ); uint256 currentDay = _getCurrentDay(); (, uint256 votes, ) = _getVoterServicePoolServiceData( msg.sender, servicePool, service, currentDay ); _updateVoterServicePoolServiceData( msg.sender, servicePool, service, votes, false, currentDay ); _updateServiceServicePoolData( service, servicePool, votes, false, currentDay ); _updateServicePoolData(servicePool, votes, false, currentDay); voterVotesOut[msg.sender] = voterVotesOut[msg.sender].sub(votes); uint256 voterServicePoolServicesIndex = _findIndexOfAddress( voterServicePoolServices[msg.sender][servicePool], service ); _deleteArrayElement( voterServicePoolServicesIndex, voterServicePoolServices[msg.sender][servicePool] ); if (voterServicePoolServices[msg.sender][servicePool].length == 0) { uint256 voterServicePoolsIndex = _findIndexOfAddress( voterServicePools[msg.sender], servicePool ); _deleteArrayElement( voterServicePoolsIndex, voterServicePools[msg.sender] ); } emit ServiceDropped(msg.sender, servicePool, service, currentDay); } function serviceClaimAll(address servicePool) public { uint256 len = serviceServicePoolDays[msg.sender][servicePool].length; require(len != 0, "no votes"); require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); uint256 currentDay = _getCurrentDay(); uint256 dayLastClaimedFor = serviceServicePoolDayLastClaimedFor[msg .sender][servicePool] == 0 ? serviceServicePoolDays[msg.sender][servicePool][0].sub(1) : serviceServicePoolDayLastClaimedFor[msg.sender][servicePool]; uint256 vestingDays = sbController.getVoteReceiverVestingDays(); require( currentDay > dayLastClaimedFor.add(vestingDays), "already claimed" ); _serviceClaim( currentDay, servicePool, msg.sender, dayLastClaimedFor, vestingDays ); } function serviceClaimUpTo(address servicePool, uint256 day) public { uint256 len = serviceServicePoolDays[msg.sender][servicePool].length; require(len != 0, "no votes"); require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); require(day <= _getCurrentDay(), "invalid day"); uint256 dayLastClaimedFor = serviceServicePoolDayLastClaimedFor[msg .sender][servicePool] == 0 ? serviceServicePoolDays[msg.sender][servicePool][0].sub(1) : serviceServicePoolDayLastClaimedFor[msg.sender][servicePool]; uint256 vestingDays = sbController.getVoteReceiverVestingDays(); require(day > dayLastClaimedFor.add(vestingDays), "already claimed"); _serviceClaim( day, servicePool, msg.sender, dayLastClaimedFor, vestingDays ); } function voterClaimAll() public { uint256 dayLastClaimedFor; if (voterDayLastClaimedFor[msg.sender] == 0) { uint256 firstDayVoted = _getVoterFirstDay(msg.sender); require(firstDayVoted != 0, "no votes"); dayLastClaimedFor = firstDayVoted.sub(1); } else { dayLastClaimedFor = voterDayLastClaimedFor[msg.sender]; } uint256 currentDay = _getCurrentDay(); uint256 vestingDays = sbController.getVoteCasterVestingDays(); require( currentDay > dayLastClaimedFor.add(vestingDays), "already claimed" ); _voterClaim(currentDay, msg.sender, dayLastClaimedFor, vestingDays); } function voterClaimUpTo(uint256 day) public { uint256 dayLastClaimedFor; if (voterDayLastClaimedFor[msg.sender] == 0) { uint256 firstDayVoted = _getVoterFirstDay(msg.sender); require(firstDayVoted != 0, "no votes"); dayLastClaimedFor = firstDayVoted.sub(1); } else { dayLastClaimedFor = voterDayLastClaimedFor[msg.sender]; } require(day <= _getCurrentDay(), "invalid day"); uint256 vestingDays = sbController.getVoteCasterVestingDays(); require(day > dayLastClaimedFor.add(vestingDays), "already claimed"); _voterClaim(day, msg.sender, dayLastClaimedFor, vestingDays); } function getServiceRewardsDueAll(address servicePool, address service) public view returns (uint256) { uint256 len = serviceServicePoolDays[service][servicePool].length; if (len == 0) { return 0; } require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); uint256 currentDay = _getCurrentDay(); uint256 dayLastClaimedFor = serviceServicePoolDayLastClaimedFor[service][servicePool] == 0 ? serviceServicePoolDays[service][servicePool][0].sub(1) : serviceServicePoolDayLastClaimedFor[service][servicePool]; uint256 vestingDays = sbController.getVoteReceiverVestingDays(); if (!(currentDay > dayLastClaimedFor.add(vestingDays))) { return 0; } return _getServiceRewardsDue( currentDay, servicePool, service, dayLastClaimedFor, vestingDays ); } function getServiceRewardsDueUpTo( address servicePool, address service, uint256 day ) public view returns (uint256) { uint256 len = serviceServicePoolDays[service][servicePool].length; if (len == 0) { return 0; } require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); require(day <= _getCurrentDay(), "invalid day"); uint256 dayLastClaimedFor = serviceServicePoolDayLastClaimedFor[service][servicePool] == 0 ? serviceServicePoolDays[service][servicePool][0].sub(1) : serviceServicePoolDayLastClaimedFor[service][servicePool]; uint256 vestingDays = sbController.getVoteReceiverVestingDays(); if (!(day > dayLastClaimedFor.add(vestingDays))) { return 0; } return _getServiceRewardsDue( day, servicePool, service, dayLastClaimedFor, vestingDays ); } function getVoterRewardsDueAll(address voter) public view returns (uint256) { uint256 dayLastClaimedFor; if (voterDayLastClaimedFor[voter] == 0) { uint256 firstDayVoted = _getVoterFirstDay(voter); if (firstDayVoted == 0) { return 0; } dayLastClaimedFor = firstDayVoted.sub(1); } else { dayLastClaimedFor = voterDayLastClaimedFor[voter]; } uint256 currentDay = _getCurrentDay(); uint256 vestingDays = sbController.getVoteCasterVestingDays(); if (!(currentDay > dayLastClaimedFor.add(vestingDays))) { return 0; } return _getVoterRewardsDue( currentDay, voter, dayLastClaimedFor, vestingDays ); } function getVoterRewardsDueUpTo(uint256 day, address voter) public view returns (uint256) { uint256 dayLastClaimedFor; if (voterDayLastClaimedFor[voter] == 0) { uint256 firstDayVoted = _getVoterFirstDay(voter); if (firstDayVoted == 0) { return 0; } dayLastClaimedFor = firstDayVoted.sub(1); } else { dayLastClaimedFor = voterDayLastClaimedFor[voter]; } require(day <= _getCurrentDay(), "invalid day"); uint256 vestingDays = sbController.getVoteCasterVestingDays(); if (!(day > dayLastClaimedFor.add(vestingDays))) { return 0; } return _getVoterRewardsDue(day, voter, dayLastClaimedFor, vestingDays); } function getVoterServicePoolServiceData( address voter, address servicePool, address service, uint256 dayNumber ) public view returns ( uint256, uint256, uint256 ) { uint256 day = dayNumber == 0 ? _getCurrentDay() : dayNumber; require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); require( sbGenericServicePoolInterface(servicePool).isServiceAccepted( service ), "invalid service" ); if (!_voterServicePoolServiceExists(voter, servicePool, service)) { return (day, 0, 0); } require(day <= _getCurrentDay(), "invalid day"); return _getVoterServicePoolServiceData(voter, servicePool, service, day); } function getServiceServicePoolData( address service, address servicePool, uint256 dayNumber ) public view returns ( uint256, uint256, uint256 ) { uint256 day = dayNumber == 0 ? _getCurrentDay() : dayNumber; require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); require( sbGenericServicePoolInterface(servicePool).isServiceAccepted( service ), "invalid service" ); require(day <= _getCurrentDay(), "invalid day"); return _getServiceServicePoolData(service, servicePool, day); } function getServicePoolData(address servicePool, uint256 dayNumber) external view returns ( uint256, uint256, uint256 ) { uint256 day = dayNumber == 0 ? _getCurrentDay() : dayNumber; require( sbController.isServicePoolAccepted(servicePool), "invalid servicePool" ); require(day <= _getCurrentDay(), "invalid day"); return _getServicePoolData(servicePool, day); } function _getVoterServicePoolServiceData( address voter, address servicePool, address service, uint256 day ) internal view returns ( uint256, uint256, uint256 ) { uint256[] memory _Days = voterServicePoolServiceDays[voter][servicePool][service]; uint256[] memory _Amounts = voterServicePoolServiceAmounts[voter][servicePool][service]; uint256[] memory _UnitSeconds = voterServicePoolServiceVoteSeconds[voter][servicePool][service]; return _get(_Days, _Amounts, _UnitSeconds, day); } function _getServiceServicePoolData( address service, address servicePool, uint256 day ) internal view returns ( uint256, uint256, uint256 ) { uint256[] memory _Days = serviceServicePoolDays[service][servicePool]; uint256[] memory _Amounts = serviceServicePoolAmounts[service][servicePool]; uint256[] memory _UnitSeconds = serviceServicePoolVoteSeconds[service][servicePool]; return _get(_Days, _Amounts, _UnitSeconds, day); } function _getServicePoolData(address servicePool, uint256 day) internal view returns ( uint256, uint256, uint256 ) { uint256[] memory _Days = servicePoolDays[servicePool]; uint256[] memory _Amounts = servicePoolAmounts[servicePool]; uint256[] memory _UnitSeconds = servicePoolVoteSeconds[servicePool]; return _get(_Days, _Amounts, _UnitSeconds, day); } function _updateVoterServicePoolServiceData( address voter, address servicePool, address service, uint256 amount, bool adding, uint256 currentDay ) internal { uint256[] storage _Days = voterServicePoolServiceDays[voter][servicePool][service]; uint256[] storage _Amounts = voterServicePoolServiceAmounts[voter][servicePool][service]; uint256[] storage _UnitSeconds = voterServicePoolServiceVoteSeconds[voter][servicePool][service]; _update(_Days, _Amounts, _UnitSeconds, amount, adding, currentDay); } function _updateServiceServicePoolData( address service, address servicePool, uint256 amount, bool adding, uint256 currentDay ) internal { uint256[] storage _Days = serviceServicePoolDays[service][servicePool]; uint256[] storage _Amounts = serviceServicePoolAmounts[service][servicePool]; uint256[] storage _UnitSeconds = serviceServicePoolVoteSeconds[service][servicePool]; _update(_Days, _Amounts, _UnitSeconds, amount, adding, currentDay); } function _updateServicePoolData( address servicePool, uint256 amount, bool adding, uint256 currentDay ) internal { uint256[] storage _Days = servicePoolDays[servicePool]; uint256[] storage _Amounts = servicePoolAmounts[servicePool]; uint256[] storage _UnitSeconds = servicePoolVoteSeconds[servicePool]; _update(_Days, _Amounts, _UnitSeconds, amount, adding, currentDay); } function _get( uint256[] memory _Days, uint256[] memory _Amounts, uint256[] memory _UnitSeconds, uint256 day ) internal pure returns ( uint256, uint256, uint256 ) { uint256 len = _Days.length; if (len == 0) { return (day, 0, 0); } if (day < _Days[0]) { return (day, 0, 0); } uint256 lastIndex = len.sub(1); uint256 lastMinedDay = _Days[lastIndex]; if (day == lastMinedDay) { return (day, _Amounts[lastIndex], _UnitSeconds[lastIndex]); } else if (day > lastMinedDay) { return (day, _Amounts[lastIndex], _Amounts[lastIndex].mul(1 days)); } return _find(_Days, _Amounts, _UnitSeconds, day); } function _find( uint256[] memory _Days, uint256[] memory _Amounts, uint256[] memory _UnitSeconds, uint256 day ) internal pure returns ( uint256, uint256, uint256 ) { uint256 left = 0; uint256 right = _Days.length.sub(1); uint256 middle = right.add(left).div(2); while (left < right) { if (_Days[middle] == day) { return (day, _Amounts[middle], _UnitSeconds[middle]); } else if (_Days[middle] > day) { if (middle > 0 && _Days[middle.sub(1)] < day) { return ( day, _Amounts[middle.sub(1)], _Amounts[middle.sub(1)].mul(1 days) ); } if (middle == 0) { return (day, 0, 0); } right = middle.sub(1); } else if (_Days[middle] < day) { if ( middle < _Days.length.sub(1) && _Days[middle.add(1)] > day ) { return ( day, _Amounts[middle], _Amounts[middle].mul(1 days) ); } left = middle.add(1); } middle = right.add(left).div(2); } if (_Days[middle] != day) { return (day, 0, 0); } else { return (day, _Amounts[middle], _UnitSeconds[middle]); } } function _update( uint256[] storage _Days, uint256[] storage _Amounts, uint256[] storage _UnitSeconds, uint256 amount, bool adding, uint256 currentDay ) internal { uint256 len = _Days.length; uint256 secondsInADay = 1 days; uint256 secondsSinceStartOfDay = block.timestamp % secondsInADay; uint256 secondsUntilEndOfDay = secondsInADay.sub( secondsSinceStartOfDay ); if (len == 0) { if (adding) { _Days.push(currentDay); _Amounts.push(amount); _UnitSeconds.push(amount.mul(secondsUntilEndOfDay)); } else { require(false, "1: not enough mine"); } } else { uint256 lastIndex = len.sub(1); uint256 lastMinedDay = _Days[lastIndex]; uint256 lastMinedAmount = _Amounts[lastIndex]; uint256 lastUnitSeconds = _UnitSeconds[lastIndex]; uint256 newAmount; uint256 newUnitSeconds; if (lastMinedDay == currentDay) { if (adding) { newAmount = lastMinedAmount.add(amount); newUnitSeconds = lastUnitSeconds.add( amount.mul(secondsUntilEndOfDay) ); } else { require(lastMinedAmount >= amount, "2: not enough mine"); newAmount = lastMinedAmount.sub(amount); newUnitSeconds = lastUnitSeconds.sub( amount.mul(secondsUntilEndOfDay) ); } _Amounts[lastIndex] = newAmount; _UnitSeconds[lastIndex] = newUnitSeconds; } else { if (adding) { newAmount = lastMinedAmount.add(amount); newUnitSeconds = lastMinedAmount.mul(1 days).add( amount.mul(secondsUntilEndOfDay) ); } else { require(lastMinedAmount >= amount, "3: not enough mine"); newAmount = lastMinedAmount.sub(amount); newUnitSeconds = lastMinedAmount.mul(1 days).sub( amount.mul(secondsUntilEndOfDay) ); } _Days.push(currentDay); _Amounts.push(newAmount); _UnitSeconds.push(newUnitSeconds); } } } function _addVotes(address voter, uint96 amount) internal { require(voter != address(0), "zero address"); balances[voter] = _add96( balances[voter], amount, "vote amount overflows" ); _addDelegates(voter, amount); emit AddVotes(voter, amount); } function _subVotes(address voter, uint96 amount) internal { balances[voter] = _sub96( balances[voter], amount, "vote amount exceeds balance" ); _subtactDelegates(voter, amount); emit SubVotes(voter, amount); } function _addDelegates(address staker, uint96 amount) internal { if (delegates[staker] == address(0)) { delegates[staker] = staker; } address currentDelegate = delegates[staker]; _moveDelegates(address(0), currentDelegate, amount); } function _subtactDelegates(address staker, uint96 amount) internal { address currentDelegate = delegates[staker]; _moveDelegates(currentDelegate, address(0), amount); } function _delegate(address delegator, address delegatee) internal { address currentDelegate = delegates[delegator]; uint96 delegatorBalance = balances[delegator]; delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates( address srcRep, address dstRep, uint96 amount ) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { uint32 srcRepNum = numCheckpoints[srcRep]; uint96 srcRepOld = srcRepNum > 0 ? checkpointsVotes[srcRep][srcRepNum - 1] : 0; uint96 srcRepNew = _sub96( srcRepOld, amount, "vote amount underflows" ); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { uint32 dstRepNum = numCheckpoints[dstRep]; uint96 dstRepOld = dstRepNum > 0 ? checkpointsVotes[dstRep][dstRepNum - 1] : 0; uint96 dstRepNew = _add96( dstRepOld, amount, "vote amount overflows" ); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes ) internal { uint32 blockNumber = _safe32( block.number, "block number exceeds 32 bits" ); if ( nCheckpoints > 0 && checkpointsFromBlock[delegatee][nCheckpoints - 1] == blockNumber ) { checkpointsVotes[delegatee][nCheckpoints - 1] = newVotes; } else { checkpointsFromBlock[delegatee][nCheckpoints] = blockNumber; checkpointsVotes[delegatee][nCheckpoints] = newVotes; numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function _safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function _safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) { require(n < 2**96, errorMessage); return uint96(n); } function _add96( uint96 a, uint96 b, string memory errorMessage ) internal pure returns (uint96) { uint96 c = a + b; require(c >= a, errorMessage); return c; } function _sub96( uint96 a, uint96 b, string memory errorMessage ) internal pure returns (uint96) { require(b <= a, errorMessage); return a - b; } function _getCurrentProposalVotes(address account) internal view returns (uint96) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpointsVotes[account][nCheckpoints - 1] : 0; } function _getAvailableServiceVotes(address account) internal view returns (uint96) { uint96 proposalVotes = _getCurrentProposalVotes(account); return proposalVotes == 0 ? 0 : proposalVotes - _safe96( voterVotesOut[account], "voterVotesOut exceeds 96 bits" ); } function _voterServicePoolExists(address voter, address servicePool) internal view returns (bool) { for (uint256 i = 0; i < voterServicePools[voter].length; i++) { if (voterServicePools[voter][i] == servicePool) { return true; } } return false; } function _voterServicePoolServiceExists( address voter, address servicePool, address service ) internal view returns (bool) { for ( uint256 i = 0; i < voterServicePoolServices[voter][servicePool].length; i++ ) { if (voterServicePoolServices[voter][servicePool][i] == service) { return true; } } return false; } function _recallAllVotes(address voter) internal { uint256 currentDay = _getCurrentDay(); for (uint256 i = 0; i < voterServicePools[voter].length; i++) { address servicePool = voterServicePools[voter][i]; address[] memory services = voterServicePoolServices[voter][servicePool]; for (uint256 j = 0; j < services.length; j++) { address service = services[j]; (, uint256 amount, ) = _getVoterServicePoolServiceData( voter, servicePool, service, currentDay ); _updateVoterServicePoolServiceData( voter, servicePool, service, amount, false, currentDay ); _updateServiceServicePoolData( service, servicePool, amount, false, currentDay ); _updateServicePoolData(servicePool, amount, false, currentDay); voterVotesOut[voter] = voterVotesOut[voter].sub(amount); } } } function _serviceClaim( uint256 upToDay, address servicePool, address service, uint256 dayLastClaimedFor, uint256 vestingDays ) internal { uint256 rewards = _getServiceRewardsDue( upToDay, servicePool, service, dayLastClaimedFor, vestingDays ); require(rewards > 0, "no rewards"); serviceServicePoolDayLastClaimedFor[service][servicePool] = upToDay.sub( vestingDays ); sbController.requestRewards(service, rewards); emit Claimed(service, rewards, _getCurrentDay()); } function _getServiceRewardsDue( uint256 upToDay, address servicePool, address service, uint256 dayLastClaimedFor, uint256 vestingDays ) internal view returns (uint256) { uint256 rewards; for ( uint256 day = dayLastClaimedFor.add(1); day <= upToDay.sub(vestingDays); day++ ) { (, , uint256 servicePoolVoteSecondsForDay) = _getServicePoolData( servicePool, day ); if (servicePoolVoteSecondsForDay == 0) { continue; } (, , uint256 serviceVoteSecondsForDay) = _getServiceServicePoolData( service, servicePool, day ); uint256 availableRewards = sbController.getVoteReceiversRewards( day ); uint256 amount = availableRewards.mul(serviceVoteSecondsForDay).div( servicePoolVoteSecondsForDay ); rewards = rewards.add(amount); } return rewards; } function _voterClaim( uint256 upToDay, address voter, uint256 dayLastClaimedFor, uint256 vestingDays ) internal { uint256 rewards = _getVoterRewardsDue( upToDay, voter, dayLastClaimedFor, vestingDays ); require(rewards > 0, "no rewards"); voterDayLastClaimedFor[voter] = upToDay.sub(vestingDays); sbController.requestRewards(voter, rewards); emit Claimed(voter, rewards, _getCurrentDay()); } function _getVoterRewardsDue( uint256 upToDay, address voter, uint256 dayLastClaimedFor, uint256 vestingDays ) internal view returns (uint256) { uint256 rewards; address[] memory servicePools = voterServicePools[voter]; for ( uint256 day = dayLastClaimedFor.add(1); day <= upToDay.sub(vestingDays); day++ ) { for (uint256 i = 0; i < servicePools.length; i++) { address servicePool = servicePools[i]; ( , , uint256 servicePoolVoteSecondsForDay ) = _getServicePoolData(servicePool, day); if (servicePoolVoteSecondsForDay == 0) { continue; } address[] memory services = voterServicePoolServices[voter][servicePool]; uint256 voterServicePoolVoteSecondsForDay; for (uint256 j = 0; j < services.length; j++) { address service = services[j]; ( , , uint256 voterVoteSeconds ) = _getVoterServicePoolServiceData( voter, servicePool, service, day ); voterServicePoolVoteSecondsForDay = voterServicePoolVoteSecondsForDay .add(voterVoteSeconds); } uint256 availableRewards = sbController.getVoteCastersRewards( day ); uint256 amount = availableRewards .mul(voterServicePoolVoteSecondsForDay) .div(servicePoolVoteSecondsForDay); rewards = rewards.add(amount); } } return rewards; } function _getCurrentDay() internal view returns (uint256) { return block.timestamp.div(1 days).add(1); } function _deleteArrayElement(uint256 index, address[] storage array) internal { if (index == array.length.sub(1)) { array.pop(); } else { array[index] = array[array.length.sub(1)]; array.pop(); } } function _findIndexOfAddress(address[] memory array, address element) internal pure returns (uint256) { uint256 index; for (uint256 i = 0; i < array.length; i++) { if (array[i] == element) { index = i; } } return index; } function _getVoterFirstDay(address voter) internal view returns (uint256) { uint256 firstDay = 0; for (uint256 i = 0; i < voterServicePools[voter].length; i++) { address servicePool = voterServicePools[voter][i]; for ( uint256 j = 0; j < voterServicePoolServices[voter][servicePool].length; j++ ) { address service = voterServicePoolServices[voter][servicePool][j]; if ( voterServicePoolServiceDays[voter][servicePool][service] .length != 0 ) { if (firstDay == 0) { firstDay = voterServicePoolServiceDays[voter][servicePool][service][0]; } else if ( voterServicePoolServiceDays[voter][servicePool][service][0] < firstDay ) { firstDay = voterServicePoolServiceDays[voter][servicePool][service][0]; } } } } return firstDay; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface sbControllerInterface { function requestRewards(address miner, uint256 amount) external; function isValuePoolAccepted(address valuePool) external view returns (bool); function getValuePoolRewards(address valuePool, uint256 day) external view returns (uint256); function getValuePoolMiningFee(address valuePool) external returns (uint256, uint256); function getValuePoolUnminingFee(address valuePool) external returns (uint256, uint256); function getValuePoolClaimingFee(address valuePool) external returns (uint256, uint256); function isServicePoolAccepted(address servicePool) external view returns (bool); function getServicePoolRewards(address servicePool, uint256 day) external view returns (uint256); function getServicePoolClaimingFee(address servicePool) external returns (uint256, uint256); function getServicePoolRequestFeeInWei(address servicePool) external returns (uint256); function getVoteForServicePoolsCount() external view returns (uint256); function getVoteForServicesCount() external view returns (uint256); function getVoteCastersRewards(uint256 dayNumber) external view returns (uint256); function getVoteReceiversRewards(uint256 dayNumber) external view returns (uint256); function getMinerMinMineDays() external view returns (uint256); function getServiceMinMineDays() external view returns (uint256); function getMinerMinMineAmountInWei() external view returns (uint256); function getServiceMinMineAmountInWei() external view returns (uint256); function getValuePoolVestingDays(address valuePool) external view returns (uint256); function getServicePoolVestingDays(address poservicePoolol) external view returns (uint256); function getVoteCasterVestingDays() external view returns (uint256); function getVoteReceiverVestingDays() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface sbGenericServicePoolInterface { function isServiceAccepted(address service) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface sbStrongValuePoolInterface { function mineFor(address miner, uint256 amount) external; function getMinerMineData(address miner, uint256 day) external view returns ( uint256, uint256, uint256 ); function getMineData(uint256 day) external view returns ( uint256, uint256, uint256 ); function serviceMinMined(address miner) external view returns (bool); function minerMinMined(address miner) external view returns (bool); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"address","name":"community","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"ServiceDropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SubVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"address","name":"community","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"VoteRecalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"address","name":"community","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"Voted","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpointsFromBlock","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpointsVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"}],"name":"dropService","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAvailableServiceVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentProposalVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"getDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorProposalVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"}],"name":"getServiceDayLastClaimedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"uint256","name":"dayNumber","type":"uint256"}],"name":"getServicePoolData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"}],"name":"getServiceRewardsDueAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"day","type":"uint256"}],"name":"getServiceRewardsDueUpTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"uint256","name":"dayNumber","type":"uint256"}],"name":"getServiceServicePoolData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"getVoterDayLastClaimedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"getVoterRewardsDueAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getVoterRewardsDueUpTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"dayNumber","type":"uint256"}],"name":"getVoterServicePoolServiceData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"address","name":"servicePool","type":"address"}],"name":"getVoterServicePoolServices","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sbControllerAddress","type":"address"},{"internalType":"address","name":"sbStrongValuePoolAddress","type":"address"},{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"address","name":"superAdminAddress","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingSuperAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recallAllVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recallVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sbController","outputs":[{"internalType":"contract sbControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sbGenericServicePool","outputs":[{"internalType":"contract sbGenericServicePoolInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sbStrongValuePool","outputs":[{"internalType":"contract sbStrongValuePoolInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"}],"name":"serviceClaimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"uint256","name":"day","type":"uint256"}],"name":"serviceClaimUpTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"},{"internalType":"bool","name":"adding","type":"bool"}],"name":"updateVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voterClaimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"voterClaimUpTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061570b80620000216000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80636fcfff4511610130578063aa40f500116100b8578063ee3e7cd61161007c578063ee3e7cd61461079d578063efa5d431146107d9578063f0d78bf51461080f578063f851a44014610835578063fed0a20e1461083d57610232565b8063aa40f500146106f8578063ab15158a1461071e578063b46377a01461074c578063b5e3ee5014610754578063d32028301461077157610232565b8063879ed33e116100ff578063879ed33e1461060e5780638f288a0914610644578063916c435f146106725780639fb9ec111461069e578063a73e935a146106d257610232565b80636fcfff451461051857806371f7350f1461053e5780637dc8ff3f146105645780638285c7d8146105e257610232565b8063375b4cd4116101be578063544d856411610182578063544d856414610478578063587cde1e1461049e5780635c19a95c146104c457806365a4840d146104ea5780636a33bc13146104f257610232565b8063375b4cd41461039d5780633c77d503146103e857806348028d6314610432578063481e1c3e1461043a57806353bfcd1b1461044257610232565b80632678224711610205578063267822471461032957806327e235e31461033157806329575f6a146103575780632fa41caf1461035f578063360358be1461036757610232565b806306552ff314610237578063090dbba1146102775780630d65d00a146102b757806315ed0514146102db575b600080fd5b6102756004803603608081101561024d57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516610859565b005b6102a56004803603604081101561028d57600080fd5b506001600160a01b0381358116916020013516610903565b60408051918252519081900360200190f35b6102bf6109eb565b604080516001600160a01b039092168252519081900360200190f35b61030d600480360360408110156102f157600080fd5b5080356001600160a01b0316906020013563ffffffff166109fa565b604080516001600160601b039092168252519081900360200190f35b6102bf610a20565b61030d6004803603602081101561034757600080fd5b50356001600160a01b0316610a2f565b6102bf610a4a565b6102bf610a59565b6102756004803603606081101561037d57600080fd5b506001600160a01b03813581169160208101359091169060400135610a68565b6103cf600480360360408110156103b357600080fd5b5080356001600160a01b0316906020013563ffffffff16610d84565b6040805163ffffffff9092168252519081900360200190f35b610414600480360360408110156103fe57600080fd5b506001600160a01b038135169060200135610da7565b60408051938452602084019290925282820152519081900360600190f35b6102bf610edf565b6102bf610eee565b6102a56004803603606081101561045857600080fd5b506001600160a01b03813581169160208101359091169060400135610efd565b6102bf6004803603602081101561048e57600080fd5b50356001600160a01b0316611190565b6102bf600480360360208110156104b457600080fd5b50356001600160a01b03166111b1565b610275600480360360208110156104da57600080fd5b50356001600160a01b03166111cc565b6102756111d9565b6102a56004803603602081101561050857600080fd5b50356001600160a01b0316611346565b6103cf6004803603602081101561052e57600080fd5b50356001600160a01b03166113ae565b6102756004803603602081101561055457600080fd5b50356001600160a01b03166113c6565b6105926004803603604081101561057a57600080fd5b506001600160a01b038135811691602001351661166a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156105ce5781810151838201526020016105b6565b505050509050019250505060405180910390f35b610275600480360360408110156105f857600080fd5b506001600160a01b0381351690602001356117ba565b6104146004803603606081101561062457600080fd5b506001600160a01b03813581169160208101359091169060400135611a93565b6102756004803603604081101561065a57600080fd5b506001600160a01b0381358116916020013516611c8a565b61030d6004803603604081101561068857600080fd5b506001600160a01b0381351690602001356120c3565b610275600480360360608110156106b457600080fd5b506001600160a01b03813516906020810135906040013515156122da565b61030d600480360360208110156106e857600080fd5b50356001600160a01b031661245c565b61030d6004803603602081101561070e57600080fd5b50356001600160a01b0316612467565b6102a56004803603604081101561073457600080fd5b506001600160a01b0381358116916020013516612472565b6102756126c8565b6102756004803603602081101561076a57600080fd5b5035612723565b6102a56004803603604081101561078757600080fd5b50803590602001356001600160a01b03166128c9565b610414600480360360808110156107b357600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135612a2b565b610275600480360360608110156107ef57600080fd5b506001600160a01b03813581169160208101359091169060400135612c42565b6102a56004803603602081101561082557600080fd5b50356001600160a01b0316613218565b6102bf613334565b610845613348565b604080519115158252519081900360200190f35b60005460ff161561089d576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600480546001600160a01b03199081166001600160a01b039687161790915560068054821694861694909417909355600080546002805490951692861692909217909355610100600160a81b03191661010091909316029190911760ff19166001179055565b6001600160a01b03808216600090815260136020908152604080832093861683529290529081205480156109df576001600160a01b0380841660009081526016602090815260408083209388168352929052205415610987576001600160a01b038084166000908152601660209081526040808320938816835292905220546109d7565b6001600160a01b038084166000908152601360209081526040808320938816835292905290812080546109d792600192916109be57fe5b906000526020600020015461335190919063ffffffff16565b9150506109e5565b60009150505b92915050565b6004546001600160a01b031681565b600a6020908152600092835260408084209091529082529020546001600160601b031681565b6001546001600160a01b031681565b6007602052600090815260409020546001600160601b031681565b6002546001600160a01b031681565b6006546001600160a01b031681565b60008111610aa6576040805162461bcd60e51b815260206004808301919091526024820152637a65726f60e01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b0857600080fd5b505afa158015610b1c573d6000803e3d6000fd5b505050506040513d6020811015610b3257600080fd5b5051610b73576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b826001600160a01b031663c84ad2c7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610bc057600080fd5b505afa158015610bd4573d6000803e3d6000fd5b505050506040513d6020811015610bea57600080fd5b5051610c2f576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b610c3a338484613393565b610c77576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08199bdd5b9960ba1b604482015290519081900360640190fd5b6000610c81613432565b90506000610c9133868685613451565b5091505082811015610cdd576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f75676820766f74657360801b604482015290519081900360640190fd5b610cec338686866000876135f3565b610cfa848685600086613676565b610d0785846000856136db565b33600090815260126020526040902054610d219084613351565b336000818152601260209081526040918290209390935580516001600160a01b03898116825293810187905281518694891693927f1bf72c5c42c48c4dc9c15fe6c006bdaccffcb75f592ff06ab4f54bde7dc23d1f928290030190a45050505050565b600960209081526000928352604080842090915290825290205463ffffffff1681565b60008080808415610db85784610dc0565b610dc0613432565b6004805460408051630428867160e11b81526001600160a01b038b81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015610e1257600080fd5b505afa158015610e26573d6000803e3d6000fd5b505050506040513d6020811015610e3c57600080fd5b5051610e7d576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b610e85613432565b811115610ec7576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b610ed1868261371b565b935093509350509250925092565b6003546001600160a01b031681565b6005546001600160a01b031681565b6001600160a01b03808316600090815260136020908152604080832093871683529290529081205480610f34576000915050611189565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d6020811015610fc057600080fd5b5051611001576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b611009613432565b83111561104b576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6001600160a01b038085166000908152601660209081526040808320938916835292905290812054156110a3576001600160a01b038086166000908152601660209081526040808320938a16835292905220546110da565b6001600160a01b038086166000908152601360209081526040808320938a16835292905290812080546110da92600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d602081101561115657600080fd5b505190506111648282613878565b85116111765760009350505050611189565b61118385888885856138d2565b93505050505b9392505050565b6001600160a01b03808216600090815260086020526040902054165b919050565b6008602052600090815260409020546001600160a01b031681565b6111d633826139d6565b50565b3360009081526011602052604081205461124a5760006111f833613a5a565b905080611237576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b611242816001613351565b91505061125c565b50336000908152601160205260409020545b6000611266613432565b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b857600080fd5b505afa1580156112cc573d6000803e3d6000fd5b505050506040513d60208110156112e257600080fd5b505190506112f08382613878565b8211611335576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b61134182338584613c61565b505050565b6001600160a01b03811660009081526011602052604081205461139257600061136e83613a5a565b90508061137f5760009150506111ac565b61138a816001613351565b9150506111ac565b506001600160a01b031660009081526011602052604090205490565b600b6020526000908152604090205463ffffffff1681565b3360009081526013602090815260408083206001600160a01b038516845290915290205480611427576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561148957600080fd5b505afa15801561149d573d6000803e3d6000fd5b505050506040513d60208110156114b357600080fd5b50516114f4576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b60006114fe613432565b3360009081526016602090815260408083206001600160a01b03881684529091528120549192509015611554573360009081526016602090815260408083206001600160a01b0388168452909152902054611587565b3360009081526013602090815260408083206001600160a01b03881684529091528120805461158792600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115d957600080fd5b505afa1580156115ed573d6000803e3d6000fd5b505050506040513d602081101561160357600080fd5b505190506116118282613878565b8311611656576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6116638386338585613d89565b5050505050565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156116ce57600080fd5b505afa1580156116e2573d6000803e3d6000fd5b505050506040513d60208110156116f857600080fd5b5051611739576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6001600160a01b038084166000908152600d60209081526040808320938616835292815290829020805483518184028101840190945280845290918301828280156117ad57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161178f575b5050505050905092915050565b3360009081526013602090815260408083206001600160a01b03861684529091529020548061181b576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561187d57600080fd5b505afa158015611891573d6000803e3d6000fd5b505050506040513d60208110156118a757600080fd5b50516118e8576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6118f0613432565b821115611932576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b3360009081526016602090815260408083206001600160a01b038716845290915281205415611984573360009081526016602090815260408083206001600160a01b03881684529091529020546119b7565b3360009081526013602090815260408083206001600160a01b0388168452909152812080546119b792600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0957600080fd5b505afa158015611a1d573d6000803e3d6000fd5b505050506040513d6020811015611a3357600080fd5b50519050611a418282613878565b8411611a86576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6116638486338585613d89565b60008080808415611aa45784611aac565b611aac613432565b6004805460408051630428867160e11b81526001600160a01b038b81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015611afe57600080fd5b505afa158015611b12573d6000803e3d6000fd5b505050506040513d6020811015611b2857600080fd5b5051611b69576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b856001600160a01b031663c84ad2c7886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611bb657600080fd5b505afa158015611bca573d6000803e3d6000fd5b505050506040513d6020811015611be057600080fd5b5051611c25576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b611c2d613432565b811115611c6f576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b611c7a878783613ec0565b9350935093505093509350939050565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611cec57600080fd5b505afa158015611d00573d6000803e3d6000fd5b505050506040513d6020811015611d1657600080fd5b5051611d57576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b816001600160a01b031663c84ad2c7826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611da457600080fd5b505afa158015611db8573d6000803e3d6000fd5b505050506040513d6020811015611dce57600080fd5b5051611e13576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b611e1d3383614043565b611e5d576040805162461bcd60e51b815260206004820152600c60248201526b0c8e881b9bdd08199bdd5b9960a21b604482015290519081900360640190fd5b611e68338383613393565b611ea8576040805162461bcd60e51b815260206004820152600c60248201526b0c4e881b9bdd08199bdd5b9960a21b604482015290519081900360640190fd5b6000611eb2613432565b90506000611ec233858585613451565b50915050611ed5338585846000876135f3565b611ee3838583600086613676565b611ef084826000856136db565b33600090815260126020526040902054611f0a9082613351565b33600090815260126020908152604080832093909355600d81528282206001600160a01b0388168352815282822080548451818402810184019095528085529293611f95939092830182828015611f8a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611f6c575b5050505050856140c7565b336000908152600d602090815260408083206001600160a01b038a1684529091529020909150611fc6908290614117565b336000908152600d602090815260408083206001600160a01b038916845290915290205461207857336000908152600c6020908152604080832080548251818502810185019093528083526120599383018282801561204e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612030575b5050505050876140c7565b336000908152600c60205260409020909150612076908290614117565b505b604080516001600160a01b0387811682529151859287169133917f194c3721f48fdddc9ef3098668929b634be03db0fb5eead343224e62a343ba069181900360200190a45050505050565b600043821061210e576040805162461bcd60e51b81526020600482015260126024820152711b9bdd081e595d0819195d195c9b5a5b995960721b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205463ffffffff168061213c5760009150506109e5565b6001600160a01b038416600090815260096020908152604080832063ffffffff6000198601811685529252909120541683106121b1576001600160a01b0384166000908152600a602090815260408083206000199490940163ffffffff16835292905220546001600160601b031690506109e5565b6001600160a01b038416600090815260096020908152604080832083805290915290205463ffffffff168310156121ec5760009150506109e5565b600060001982015b8163ffffffff168163ffffffff16111561229d576001600160a01b0386166000818152600960209081526040808320600263ffffffff888803811691909104870380821680875292855283862054968652600a855283862092865291909352922054919216906001600160601b0316878214156122785795506109e5945050505050565b878263ffffffff16101561228e57829450612295565b6001830393505b5050506121f4565b506001600160a01b0385166000908152600a6020908152604080832063ffffffff909416835292905220546001600160601b031691505092915050565b6006546001600160a01b03163314612331576040805162461bcd60e51b81526020600482015260156024820152741b9bdd081cd894dd1c9bdb99d5985b1d59541bdbdb605a1b604482015290519081900360640190fd5b600061236b8360405180604001604052806016815260200175616d6f756e742065786365656473203936206269747360501b8152506141fe565b905081156123825761237d8482614298565b612456565b6001600160a01b03808516600081815260086020526040902054909116146123e9576040805162461bcd60e51b815260206004820152601560248201527436bab9ba103232b632b3b0ba32903a379039b2b63360591b604482015290519081900360640190fd5b806001600160601b03166123fc856143ce565b6001600160601b0316101561244c576040805162461bcd60e51b81526020600482015260116024820152706d75737420726563616c6c20766f74657360781b604482015290519081900360640190fd5b612456848261445f565b50505050565b60006109e5826143ce565b60006109e582614553565b6001600160a01b038082166000908152601360209081526040808320938616835292905290812054806124a95760009150506109e5565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561250b57600080fd5b505afa15801561251f573d6000803e3d6000fd5b505050506040513d602081101561253557600080fd5b5051612576576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6000612580613432565b6001600160a01b038086166000908152601660209081526040808320938a1683529290529081205491925090156125dc576001600160a01b038086166000908152601660209081526040808320938a1683529290522054612613565b6001600160a01b038086166000908152601360209081526040808320938a168352929052908120805461261392600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d602081101561268f57600080fd5b5051905061269d8282613878565b83116126b05760009450505050506109e5565b6126bd83888885856138d2565b979650505050505050565b33600090815260126020526040902054612718576040805162461bcd60e51b815260206004820152600c60248201526b1b9bc81d9bdd195cc81bdd5d60a21b604482015290519081900360640190fd5b612721336145bd565b565b3360009081526011602052604081205461279457600061274233613a5a565b905080612781576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b61278c816001613351565b9150506127a6565b50336000908152601160205260409020545b6127ae613432565b8211156127f0576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561284057600080fd5b505afa158015612854573d6000803e3d6000fd5b505050506040513d602081101561286a57600080fd5b505190506128788282613878565b83116128bd576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b61134183338484613c61565b6001600160a01b03811660009081526011602052604081205481906129185760006128f384613a5a565b905080612905576000925050506109e5565b612910816001613351565b915050612933565b506001600160a01b0382166000908152601160205260409020545b61293b613432565b84111561297d576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50519050612a058282613878565b8511612a16576000925050506109e5565b612a228585848461474f565b95945050505050565b60008080808415612a3c5784612a44565b612a44613432565b6004805460408051630428867160e11b81526001600160a01b038c81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015612a9657600080fd5b505afa158015612aaa573d6000803e3d6000fd5b505050506040513d6020811015612ac057600080fd5b5051612b01576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b866001600160a01b031663c84ad2c7876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612b4e57600080fd5b505afa158015612b62573d6000803e3d6000fd5b505050506040513d6020811015612b7857600080fd5b5051612bbd576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b612bc8888888613393565b612bda57925060009150819050612c38565b612be2613432565b811115612c24576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b612c3088888884613451565b935093509350505b9450945094915050565b60008111612c81576040805162461bcd60e51b8152602060048201526007602482015266313a207a65726f60c81b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612ce357600080fd5b505afa158015612cf7573d6000803e3d6000fd5b505050506040513d6020811015612d0d57600080fd5b5051612d4e576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b826001600160a01b031663c84ad2c7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d9b57600080fd5b505afa158015612daf573d6000803e3d6000fd5b505050506040513d6020811015612dc557600080fd5b5051612e0a576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b600654604080516376d53d6160e01b81526001600160a01b038581166004830152915191909216916376d53d61916024808301926020929190829003018186803b158015612e5757600080fd5b505afa158015612e6b573d6000803e3d6000fd5b505050506040513d6020811015612e8157600080fd5b5051612ec4576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081b5a5b881b5a5b9959609a1b604482015290519081900360640190fd5b80612ece336143ce565b6001600160601b03161015612f1d576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f75676820766f74657360801b604482015290519081900360640190fd5b612f28338484613393565b613055576004805460408051636031257f60e11b815290516001600160a01b039092169263c0624afe928282019260209290829003018186803b158015612f6e57600080fd5b505afa158015612f82573d6000803e3d6000fd5b505050506040513d6020811015612f9857600080fd5b5051336000908152600d602090815260408083206001600160a01b0388168452909152902054612fc9906001613878565b111561300a576040805162461bcd60e51b815260206004820152600b60248201526a313a20746f6f206d616e7960a81b604482015290519081900360640190fd5b336000908152600d602090815260408083206001600160a01b0387811685529083529083208054600181018255908452919092200180546001600160a01b0319169184169190911790555b61305f3384614043565b6131665760048054604080516311d9d79360e21b815290516001600160a01b03909216926347675e4c928282019260209290829003018186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60208110156130cf57600080fd5b5051336000908152600c60205260409020546130ec906001613878565b111561312d576040805162461bcd60e51b815260206004820152600b60248201526a323a20746f6f206d616e7960a81b604482015290519081900360640190fd5b336000908152600c602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790555b6000613170613432565b9050613181338585856001866135f3565b61318f838584600185613676565b61319c84836001846136db565b336000908152601260205260409020546131b69083613878565b336000818152601260209081526040918290209390935580516001600160a01b03888116825293810186905281518594881693927ffac22e5ca1ad9c0e062e405d23fa971f266026b08a9339450a055b848ba742a1928290030190a450505050565b6001600160a01b038116600090815260116020526040812054819061326757600061324284613a5a565b905080613254576000925050506111ac565b61325f816001613351565b915050613282565b506001600160a01b0382166000908152601160205260409020545b600061328c613432565b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132de57600080fd5b505afa1580156132f2573d6000803e3d6000fd5b505050506040513d602081101561330857600080fd5b505190506133168382613878565b821161332857600093505050506111ac565b612a228286858461474f565b60005461010090046001600160a01b031681565b60005460ff1681565b600061118983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506149ba565b6000805b6001600160a01b038086166000908152600d6020908152604080832093881683529290522054811015613427576001600160a01b038581166000908152600d6020908152604080832088851684529091529020805491851691839081106133fa57fe5b6000918252602090912001546001600160a01b0316141561341f576001915050611189565b600101613397565b506000949350505050565b600061344c60016134464262015180614a14565b90613878565b905090565b6001600160a01b038085166000908152600e60209081526040808320878516845282528083209386168352928152828220805484518184028101840190955280855292938493849360609391908301828280156134cd57602002820191906000526020600020905b8154815260200190600101908083116134b9575b5050506001600160a01b03808c166000908152600f602090815260408083208e851684528252808320938d168352928152908290208054835181840281018401909452808452959650606095929450925083018282801561354d57602002820191906000526020600020905b815481526020019060010190808311613539575b5050506001600160a01b03808d1660009081526010602090815260408083208f851684528252808320938e16835292815290829020805483518184028101840190945280845295965060609592945092508301828280156135cd57602002820191906000526020600020905b8154815260200190600101908083116135b9575b505050505090506135e08383838a614a56565b9550955095505050509450945094915050565b6001600160a01b038087166000818152600e602090815260408083208a8616808552908352818420958a16808552958352818420858552600f8452828520828652845282852087865284528285209585526010845282852091855290835281842095845294909152902061366b838383898989614b66565b505050505050505050565b6001600160a01b038086166000818152601360209081526040808320948916808452948252808320848452601483528184208685528352818420948452601583528184209584529490915290206136d1838383898989614b66565b5050505050505050565b6001600160a01b03841660009081526017602090815260408083206018835281842060199093529220613712838383898989614b66565b50505050505050565b6001600160a01b03821660009081526017602090815260408083208054825181850281018501909352808352849384936060939092909183018282801561378157602002820191906000526020600020905b81548152602001906001019080831161376d575b5050506001600160a01b038916600090815260186020908152604091829020805483518184028101840190945280845295965060609592945092508301828280156137eb57602002820191906000526020600020905b8154815260200190600101908083116137d7575b5050506001600160a01b038a166000908152601960209081526040918290208054835181840281018401909452808452959650606095929450925083018282801561385557602002820191906000526020600020905b815481526020019060010190808311613841575b505050505090506138688383838a614a56565b9550955095505050509250925092565b600082820183811015611189576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080806138e1856001613878565b90505b6138ee8885613351565b81116139cb576000613900888361371b565b925050508061390f57506139c3565b600061391c888a85613ec0565b60048054604080516319ce94a160e31b815292830189905251929550600094506001600160a01b0316925063ce74a508916024808301926020929190829003018186803b15801561396c57600080fd5b505afa158015613980573d6000803e3d6000fd5b505050506040513d602081101561399657600080fd5b5051905060006139b0846139aa8486614e97565b90614a14565b90506139bc8682613878565b9550505050505b6001016138e4565b509695505050505050565b6001600160a01b03808316600081815260086020818152604080842080546007845282862054949093528787166001600160a01b031984168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612456828483614ef0565b600080805b6001600160a01b0384166000908152600c6020526040902054811015613c5a576001600160a01b0384166000908152600c60205260408120805483908110613aa357fe5b60009182526020822001546001600160a01b031691505b6001600160a01b038087166000908152600d6020908152604080832093861683529290522054811015613c50576001600160a01b038087166000908152600d602090815260408083209386168352929052908120805483908110613b1a57fe5b60009182526020808320909101546001600160a01b038a81168452600e83526040808520888316865284528085209190921680855292529091205490915015613c475784613bb0576001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054909190613b9e57fe5b90600052602060002001549450613c47565b6001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054879290613bec57fe5b90600052602060002001541015613c47576001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054909190613c3957fe5b906000526020600020015494505b50600101613aba565b5050600101613a5f565b5092915050565b6000613c6f8585858561474f565b905060008111613cb3576040805162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b604482015290519081900360640190fd5b613cbd8583613351565b6001600160a01b0380861660008181526011602052604080822094909455600480548551635fe43d2360e11b815291820193909352602481018690529351919092169263bfc87a4692604480830193919282900301818387803b158015613d2357600080fd5b505af1158015613d37573d6000803e3d6000fd5b50505050613d43613432565b6040805183815290516001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a919081900360200190a35050505050565b6000613d9886868686866138d2565b905060008111613ddc576040805162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b604482015290519081900360640190fd5b613de68683613351565b6001600160a01b0380861660008181526016602090815260408083208b8616845290915280822094909455600480548551635fe43d2360e11b815291820193909352602481018690529351919092169263bfc87a4692604480830193919282900301818387803b158015613e5957600080fd5b505af1158015613e6d573d6000803e3d6000fd5b50505050613e79613432565b6040805183815290516001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a919081900360200190a3505050505050565b6001600160a01b038084166000908152601360209081526040808320938616835292815282822080548451818402810184019095528085529293849384936060939190830182828015613f3257602002820191906000526020600020905b815481526020019060010190808311613f1e575b5050506001600160a01b03808b166000908152601460209081526040808320938d1683529281529082902080548351818402810184019094528084529596506060959294509250830182828015613fa857602002820191906000526020600020905b815481526020019060010190808311613f94575b5050506001600160a01b03808c166000908152601560209081526040808320938e168352928152908290208054835181840281018401909452808452959650606095929450925083018282801561401e57602002820191906000526020600020905b81548152602001906001019080831161400a575b505050505090506140318383838a614a56565b95509550955050505093509350939050565b6000805b6001600160a01b0384166000908152600c60205260409020548110156140bd576001600160a01b038481166000908152600c602052604090208054918516918390811061409057fe5b6000918252602090912001546001600160a01b031614156140b55760019150506109e5565b600101614047565b5060009392505050565b60008060005b845181101561410f57836001600160a01b03168582815181106140ec57fe5b60200260200101516001600160a01b03161415614107578091505b6001016140cd565b509392505050565b8054614124906001613351565b82141561415c578080548061413557fe5b600082815260209020810160001990810180546001600160a01b03191690550190556141fa565b8054819061416b906001613351565b8154811061417557fe5b9060005260206000200160009054906101000a90046001600160a01b031681838154811061419f57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550808054806141d757fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b5050565b600081600160601b84106142905760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561425557818101518382015260200161423d565b50505050905090810190601f1680156142825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509192915050565b6001600160a01b0382166142e2576040805162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015290519081900360640190fd5b6001600160a01b0382166000908152600760209081526040918290205482518084019093526015835274766f746520616d6f756e74206f766572666c6f777360581b91830191909152614342916001600160601b039091169083906150a7565b6001600160a01b038316600090815260076020526040902080546001600160601b0319166001600160601b03929092169190911790556143828282615111565b604080516001600160601b038316815290516001600160a01b038416917fbb104626c67690cd9023bde19b0804077126d78eb9bc3eb35de512eda655a311919081900360200190a25050565b6000806143da83614553565b90506001600160601b038116156144565761444f60126000856001600160a01b03166001600160a01b03168152602001908152602001600020546040518060400160405280601d81526020017f766f746572566f7465734f7574206578636565647320393620626974730000008152506141fe565b8103611189565b60009392505050565b6001600160a01b038216600090815260076020908152604091829020548251808401909352601b83527f766f746520616d6f756e7420657863656564732062616c616e63650000000000918301919091526144c7916001600160601b03909116908390615183565b6001600160a01b038316600090815260076020526040902080546001600160601b0319166001600160601b039290921691909117905561450782826151e8565b604080516001600160601b038316815290516001600160a01b038416917f40b10d9892192657ad11f6c742381c432b492799468ace10b6ffb5842e34b024919081900360200190a25050565b6001600160a01b0381166000908152600b602052604081205463ffffffff168061457e576000611189565b6001600160a01b0383166000908152600a6020908152604080832063ffffffff60001986011684529091529020546001600160601b0316915050919050565b60006145c7613432565b905060005b6001600160a01b0383166000908152600c6020526040902054811015611341576001600160a01b0383166000908152600c6020526040812080548390811061461057fe5b60009182526020808320909101546001600160a01b038781168452600d8352604080852091909216808552908352928190208054825181850281018501909352808352939450606093919290919083018282801561469757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614679575b5050505050905060005b81518110156147445760008282815181106146b857fe5b6020026020010151905060006146d08886848a613451565b509150506146e38886848460008c6135f3565b6146f182868360008b613676565b6146fe858260008a6136db565b6001600160a01b0388166000908152601260205260409020546147219082613351565b6001600160a01b03891660009081526012602052604090205550506001016146a1565b5050506001016145cc565b6001600160a01b0383166000908152600c60209081526040808320805482518185028101850190935280835284936060939291908301828280156147bc57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161479e575b5050505050905060006147d960018761387890919063ffffffff16565b90505b6147e68886613351565b81116149ae5760005b82518110156149a557600083828151811061480657fe5b60200260200101519050600061481c828561371b565b925050508061482c57505061499d565b6001600160a01b03808b166000908152600d602090815260408083209386168352928152908290208054835181840281018401909452808452606093928301828280156148a257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614884575b50505050509050600080600090505b82518110156148fc5760008382815181106148c857fe5b6020026020010151905060006148e08f88848c613451565b92506148f0915085905082613878565b935050506001016148b1565b506004805460408051631900020960e21b8152928301899052516000926001600160a01b03909216916364000824916024808301926020929190829003018186803b15801561494a57600080fd5b505afa15801561495e573d6000803e3d6000fd5b505050506040513d602081101561497457600080fd5b505190506000614988856139aa8486614e97565b90506149948a82613878565b99505050505050505b6001016147ef565b506001016147dc565b50909695505050505050565b60008184841115614a0c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b505050900390565b600061118983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615212565b83516000908190819080614a74578460008093509350935050612c38565b87600081518110614a8157fe5b6020026020010151851015614aa0578460008093509350935050612c38565b6000614aad826001613351565b90506000898281518110614abd57fe5b6020026020010151905080871415614b065786898381518110614adc57fe5b6020026020010151898481518110614af057fe5b6020026020010151955095509550505050612c38565b80871115614b5a5786898381518110614b1b57fe5b6020026020010151614b4c620151808c8681518110614b3657fe5b6020026020010151614e9790919063ffffffff16565b955095509550505050612c38565b6135e08a8a8a8a615277565b855462015180428190066000614b7c8383613351565b905083614c21578515614bda57895460018181018c5560008c815260208082209093018890558b549182018c558b8152919091200187905587614bbf8883614e97565b81546001810183556000928352602090922090910155614c1c565b6040805162461bcd60e51b8152602060048201526012602482015271313a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614e8b565b6000614c2e856001613351565b905060008b8281548110614c3e57fe5b9060005260206000200154905060008b8381548110614c5957fe5b9060005260206000200154905060008b8481548110614c7457fe5b906000526020600020015490506000808a851415614d5f578b15614cb957614c9c848e613878565b9150614cb2614cab8e89614e97565b8490613878565b9050614d26565b8c841015614d03576040805162461bcd60e51b8152602060048201526012602482015271323a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614d0d848e613351565b9150614d23614d1c8e89614e97565b8490613351565b90505b818f8781548110614d3357fe5b9060005260206000200181905550808e8781548110614d4e57fe5b600091825260209091200155614e84565b8b15614d9257614d6f848e613878565b9150614d8b614d7e8e89614e97565b6134468662015180614e97565b9050614e0b565b8c841015614ddc576040805162461bcd60e51b8152602060048201526012602482015271333a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614de6848e613351565b9150614e08614df58e89614e97565b614e028662015180614e97565b90613351565b90505b8f8b90806001815401808255809150506001900390600052602060002001600090919091909150558e8290806001815401808255809150506001900390600052602060002001600090919091909150558d8190806001815401808255809150506001900390600052602060002001600090919091909150555b5050505050505b50505050505050505050565b600082614ea6575060006109e5565b82820282848281614eb357fe5b04146111895760405162461bcd60e51b81526004018080602001828103825260218152602001806156b56021913960400191505060405180910390fd5b816001600160a01b0316836001600160a01b031614158015614f1b57506000816001600160601b0316115b15611341576001600160a01b03831615614fe2576001600160a01b0383166000908152600b602052604081205463ffffffff169081614f5b576000614f93565b6001600160a01b0385166000908152600a6020908152604080832063ffffffff60001987011684529091529020546001600160601b03165b90506000614fd0828560405180604001604052806016815260200175766f746520616d6f756e7420756e646572666c6f777360501b815250615183565b9050614fde86848484615488565b5050505b6001600160a01b03821615611341576001600160a01b0382166000908152600b602052604081205463ffffffff16908161501d576000615055565b6001600160a01b0384166000908152600a6020908152604080832063ffffffff60001987011684529091529020546001600160601b03165b90506000615091828560405180604001604052806015815260200174766f746520616d6f756e74206f766572666c6f777360581b8152506150a7565b905061509f85848484615488565b505050505050565b6000838301826001600160601b0380871690831610156151085760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b50949350505050565b6001600160a01b038281166000908152600860205260409020541661515a576001600160a01b038216600081815260086020526040902080546001600160a01b03191690911790555b6001600160a01b0380831660009081526008602052604081205490911690611341908284614ef0565b6000836001600160601b0316836001600160601b031611158290614a0c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b6001600160a01b038083166000908152600860205260408120549091169061134190829084614ef0565b600081836152615760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b50600083858161526d57fe5b0495945050505050565b60008060008060009050600061529860018a5161335190919063ffffffff16565b905060006152ab60026139aa8486613878565b90505b8183101561544f57868a82815181106152c357fe5b602002602001015114156152f257868982815181106152de57fe5b6020026020010151898381518110614af057fe5b868a82815181106152ff57fe5b602002602001015111156153ac576000811180156153395750868a615325836001613351565b8151811061532f57fe5b6020026020010151105b1561538357868961534b836001613351565b8151811061535557fe5b6020026020010151614b4c620151808c61537960018761335190919063ffffffff16565b81518110614b3657fe5b8061539a5786600080955095509550505050612c38565b6153a5816001613351565b9150615439565b868a82815181106153b957fe5b602002602001015110156154395789516153d4906001613351565b811080156153fe5750868a6153ea836001613878565b815181106153f457fe5b6020026020010151115b1561542b578689828151811061541057fe5b6020026020010151614b4c620151808c8581518110614b3657fe5b615436816001613878565b92505b61544860026139aa8486613878565b90506152ae565b868a828151811061545c57fe5b60200260200101511461547b5786600080955095509550505050612c38565b868982815181106152de57fe5b60006154c9436040518060400160405280601c81526020017f626c6f636b206e756d626572206578636565647320333220626974730000000081525061563e565b905060008463ffffffff1611801561551257506001600160a01b038516600090815260096020908152604080832063ffffffff6000198901811685529252909120548282169116145b15615562576001600160a01b0385166000908152600a60209081526040808320600019880163ffffffff168452909152902080546001600160601b0319166001600160601b0384161790556155ea565b6001600160a01b038516600081815260096020908152604080832063ffffffff898116808652918452828520805463ffffffff1990811689841617909155868652600a855283862092865291845282852080546001600160601b0319166001600160601b038a16179055948452600b9092529091208054909116600187019092169190911790555b604080516001600160601b0380861682528416602082015281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008164010000000084106142905760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d56fe696e76616c69642073657276696365506f6f6c00000000000000000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a264697066735822122098179f4fe2fcb854dc6a1d380a76130dff5414b0d11407aa3f739a2b69783f3664736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c80636fcfff4511610130578063aa40f500116100b8578063ee3e7cd61161007c578063ee3e7cd61461079d578063efa5d431146107d9578063f0d78bf51461080f578063f851a44014610835578063fed0a20e1461083d57610232565b8063aa40f500146106f8578063ab15158a1461071e578063b46377a01461074c578063b5e3ee5014610754578063d32028301461077157610232565b8063879ed33e116100ff578063879ed33e1461060e5780638f288a0914610644578063916c435f146106725780639fb9ec111461069e578063a73e935a146106d257610232565b80636fcfff451461051857806371f7350f1461053e5780637dc8ff3f146105645780638285c7d8146105e257610232565b8063375b4cd4116101be578063544d856411610182578063544d856414610478578063587cde1e1461049e5780635c19a95c146104c457806365a4840d146104ea5780636a33bc13146104f257610232565b8063375b4cd41461039d5780633c77d503146103e857806348028d6314610432578063481e1c3e1461043a57806353bfcd1b1461044257610232565b80632678224711610205578063267822471461032957806327e235e31461033157806329575f6a146103575780632fa41caf1461035f578063360358be1461036757610232565b806306552ff314610237578063090dbba1146102775780630d65d00a146102b757806315ed0514146102db575b600080fd5b6102756004803603608081101561024d57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516610859565b005b6102a56004803603604081101561028d57600080fd5b506001600160a01b0381358116916020013516610903565b60408051918252519081900360200190f35b6102bf6109eb565b604080516001600160a01b039092168252519081900360200190f35b61030d600480360360408110156102f157600080fd5b5080356001600160a01b0316906020013563ffffffff166109fa565b604080516001600160601b039092168252519081900360200190f35b6102bf610a20565b61030d6004803603602081101561034757600080fd5b50356001600160a01b0316610a2f565b6102bf610a4a565b6102bf610a59565b6102756004803603606081101561037d57600080fd5b506001600160a01b03813581169160208101359091169060400135610a68565b6103cf600480360360408110156103b357600080fd5b5080356001600160a01b0316906020013563ffffffff16610d84565b6040805163ffffffff9092168252519081900360200190f35b610414600480360360408110156103fe57600080fd5b506001600160a01b038135169060200135610da7565b60408051938452602084019290925282820152519081900360600190f35b6102bf610edf565b6102bf610eee565b6102a56004803603606081101561045857600080fd5b506001600160a01b03813581169160208101359091169060400135610efd565b6102bf6004803603602081101561048e57600080fd5b50356001600160a01b0316611190565b6102bf600480360360208110156104b457600080fd5b50356001600160a01b03166111b1565b610275600480360360208110156104da57600080fd5b50356001600160a01b03166111cc565b6102756111d9565b6102a56004803603602081101561050857600080fd5b50356001600160a01b0316611346565b6103cf6004803603602081101561052e57600080fd5b50356001600160a01b03166113ae565b6102756004803603602081101561055457600080fd5b50356001600160a01b03166113c6565b6105926004803603604081101561057a57600080fd5b506001600160a01b038135811691602001351661166a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156105ce5781810151838201526020016105b6565b505050509050019250505060405180910390f35b610275600480360360408110156105f857600080fd5b506001600160a01b0381351690602001356117ba565b6104146004803603606081101561062457600080fd5b506001600160a01b03813581169160208101359091169060400135611a93565b6102756004803603604081101561065a57600080fd5b506001600160a01b0381358116916020013516611c8a565b61030d6004803603604081101561068857600080fd5b506001600160a01b0381351690602001356120c3565b610275600480360360608110156106b457600080fd5b506001600160a01b03813516906020810135906040013515156122da565b61030d600480360360208110156106e857600080fd5b50356001600160a01b031661245c565b61030d6004803603602081101561070e57600080fd5b50356001600160a01b0316612467565b6102a56004803603604081101561073457600080fd5b506001600160a01b0381358116916020013516612472565b6102756126c8565b6102756004803603602081101561076a57600080fd5b5035612723565b6102a56004803603604081101561078757600080fd5b50803590602001356001600160a01b03166128c9565b610414600480360360808110156107b357600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135612a2b565b610275600480360360608110156107ef57600080fd5b506001600160a01b03813581169160208101359091169060400135612c42565b6102a56004803603602081101561082557600080fd5b50356001600160a01b0316613218565b6102bf613334565b610845613348565b604080519115158252519081900360200190f35b60005460ff161561089d576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600480546001600160a01b03199081166001600160a01b039687161790915560068054821694861694909417909355600080546002805490951692861692909217909355610100600160a81b03191661010091909316029190911760ff19166001179055565b6001600160a01b03808216600090815260136020908152604080832093861683529290529081205480156109df576001600160a01b0380841660009081526016602090815260408083209388168352929052205415610987576001600160a01b038084166000908152601660209081526040808320938816835292905220546109d7565b6001600160a01b038084166000908152601360209081526040808320938816835292905290812080546109d792600192916109be57fe5b906000526020600020015461335190919063ffffffff16565b9150506109e5565b60009150505b92915050565b6004546001600160a01b031681565b600a6020908152600092835260408084209091529082529020546001600160601b031681565b6001546001600160a01b031681565b6007602052600090815260409020546001600160601b031681565b6002546001600160a01b031681565b6006546001600160a01b031681565b60008111610aa6576040805162461bcd60e51b815260206004808301919091526024820152637a65726f60e01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b0857600080fd5b505afa158015610b1c573d6000803e3d6000fd5b505050506040513d6020811015610b3257600080fd5b5051610b73576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b826001600160a01b031663c84ad2c7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610bc057600080fd5b505afa158015610bd4573d6000803e3d6000fd5b505050506040513d6020811015610bea57600080fd5b5051610c2f576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b610c3a338484613393565b610c77576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08199bdd5b9960ba1b604482015290519081900360640190fd5b6000610c81613432565b90506000610c9133868685613451565b5091505082811015610cdd576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f75676820766f74657360801b604482015290519081900360640190fd5b610cec338686866000876135f3565b610cfa848685600086613676565b610d0785846000856136db565b33600090815260126020526040902054610d219084613351565b336000818152601260209081526040918290209390935580516001600160a01b03898116825293810187905281518694891693927f1bf72c5c42c48c4dc9c15fe6c006bdaccffcb75f592ff06ab4f54bde7dc23d1f928290030190a45050505050565b600960209081526000928352604080842090915290825290205463ffffffff1681565b60008080808415610db85784610dc0565b610dc0613432565b6004805460408051630428867160e11b81526001600160a01b038b81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015610e1257600080fd5b505afa158015610e26573d6000803e3d6000fd5b505050506040513d6020811015610e3c57600080fd5b5051610e7d576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b610e85613432565b811115610ec7576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b610ed1868261371b565b935093509350509250925092565b6003546001600160a01b031681565b6005546001600160a01b031681565b6001600160a01b03808316600090815260136020908152604080832093871683529290529081205480610f34576000915050611189565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d6020811015610fc057600080fd5b5051611001576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b611009613432565b83111561104b576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6001600160a01b038085166000908152601660209081526040808320938916835292905290812054156110a3576001600160a01b038086166000908152601660209081526040808320938a16835292905220546110da565b6001600160a01b038086166000908152601360209081526040808320938a16835292905290812080546110da92600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d602081101561115657600080fd5b505190506111648282613878565b85116111765760009350505050611189565b61118385888885856138d2565b93505050505b9392505050565b6001600160a01b03808216600090815260086020526040902054165b919050565b6008602052600090815260409020546001600160a01b031681565b6111d633826139d6565b50565b3360009081526011602052604081205461124a5760006111f833613a5a565b905080611237576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b611242816001613351565b91505061125c565b50336000908152601160205260409020545b6000611266613432565b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b857600080fd5b505afa1580156112cc573d6000803e3d6000fd5b505050506040513d60208110156112e257600080fd5b505190506112f08382613878565b8211611335576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b61134182338584613c61565b505050565b6001600160a01b03811660009081526011602052604081205461139257600061136e83613a5a565b90508061137f5760009150506111ac565b61138a816001613351565b9150506111ac565b506001600160a01b031660009081526011602052604090205490565b600b6020526000908152604090205463ffffffff1681565b3360009081526013602090815260408083206001600160a01b038516845290915290205480611427576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561148957600080fd5b505afa15801561149d573d6000803e3d6000fd5b505050506040513d60208110156114b357600080fd5b50516114f4576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b60006114fe613432565b3360009081526016602090815260408083206001600160a01b03881684529091528120549192509015611554573360009081526016602090815260408083206001600160a01b0388168452909152902054611587565b3360009081526013602090815260408083206001600160a01b03881684529091528120805461158792600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115d957600080fd5b505afa1580156115ed573d6000803e3d6000fd5b505050506040513d602081101561160357600080fd5b505190506116118282613878565b8311611656576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6116638386338585613d89565b5050505050565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156116ce57600080fd5b505afa1580156116e2573d6000803e3d6000fd5b505050506040513d60208110156116f857600080fd5b5051611739576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6001600160a01b038084166000908152600d60209081526040808320938616835292815290829020805483518184028101840190945280845290918301828280156117ad57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161178f575b5050505050905092915050565b3360009081526013602090815260408083206001600160a01b03861684529091529020548061181b576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561187d57600080fd5b505afa158015611891573d6000803e3d6000fd5b505050506040513d60208110156118a757600080fd5b50516118e8576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6118f0613432565b821115611932576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b3360009081526016602090815260408083206001600160a01b038716845290915281205415611984573360009081526016602090815260408083206001600160a01b03881684529091529020546119b7565b3360009081526013602090815260408083206001600160a01b0388168452909152812080546119b792600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0957600080fd5b505afa158015611a1d573d6000803e3d6000fd5b505050506040513d6020811015611a3357600080fd5b50519050611a418282613878565b8411611a86576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6116638486338585613d89565b60008080808415611aa45784611aac565b611aac613432565b6004805460408051630428867160e11b81526001600160a01b038b81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015611afe57600080fd5b505afa158015611b12573d6000803e3d6000fd5b505050506040513d6020811015611b2857600080fd5b5051611b69576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b856001600160a01b031663c84ad2c7886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611bb657600080fd5b505afa158015611bca573d6000803e3d6000fd5b505050506040513d6020811015611be057600080fd5b5051611c25576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b611c2d613432565b811115611c6f576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b611c7a878783613ec0565b9350935093505093509350939050565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611cec57600080fd5b505afa158015611d00573d6000803e3d6000fd5b505050506040513d6020811015611d1657600080fd5b5051611d57576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b816001600160a01b031663c84ad2c7826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611da457600080fd5b505afa158015611db8573d6000803e3d6000fd5b505050506040513d6020811015611dce57600080fd5b5051611e13576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b611e1d3383614043565b611e5d576040805162461bcd60e51b815260206004820152600c60248201526b0c8e881b9bdd08199bdd5b9960a21b604482015290519081900360640190fd5b611e68338383613393565b611ea8576040805162461bcd60e51b815260206004820152600c60248201526b0c4e881b9bdd08199bdd5b9960a21b604482015290519081900360640190fd5b6000611eb2613432565b90506000611ec233858585613451565b50915050611ed5338585846000876135f3565b611ee3838583600086613676565b611ef084826000856136db565b33600090815260126020526040902054611f0a9082613351565b33600090815260126020908152604080832093909355600d81528282206001600160a01b0388168352815282822080548451818402810184019095528085529293611f95939092830182828015611f8a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611f6c575b5050505050856140c7565b336000908152600d602090815260408083206001600160a01b038a1684529091529020909150611fc6908290614117565b336000908152600d602090815260408083206001600160a01b038916845290915290205461207857336000908152600c6020908152604080832080548251818502810185019093528083526120599383018282801561204e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612030575b5050505050876140c7565b336000908152600c60205260409020909150612076908290614117565b505b604080516001600160a01b0387811682529151859287169133917f194c3721f48fdddc9ef3098668929b634be03db0fb5eead343224e62a343ba069181900360200190a45050505050565b600043821061210e576040805162461bcd60e51b81526020600482015260126024820152711b9bdd081e595d0819195d195c9b5a5b995960721b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205463ffffffff168061213c5760009150506109e5565b6001600160a01b038416600090815260096020908152604080832063ffffffff6000198601811685529252909120541683106121b1576001600160a01b0384166000908152600a602090815260408083206000199490940163ffffffff16835292905220546001600160601b031690506109e5565b6001600160a01b038416600090815260096020908152604080832083805290915290205463ffffffff168310156121ec5760009150506109e5565b600060001982015b8163ffffffff168163ffffffff16111561229d576001600160a01b0386166000818152600960209081526040808320600263ffffffff888803811691909104870380821680875292855283862054968652600a855283862092865291909352922054919216906001600160601b0316878214156122785795506109e5945050505050565b878263ffffffff16101561228e57829450612295565b6001830393505b5050506121f4565b506001600160a01b0385166000908152600a6020908152604080832063ffffffff909416835292905220546001600160601b031691505092915050565b6006546001600160a01b03163314612331576040805162461bcd60e51b81526020600482015260156024820152741b9bdd081cd894dd1c9bdb99d5985b1d59541bdbdb605a1b604482015290519081900360640190fd5b600061236b8360405180604001604052806016815260200175616d6f756e742065786365656473203936206269747360501b8152506141fe565b905081156123825761237d8482614298565b612456565b6001600160a01b03808516600081815260086020526040902054909116146123e9576040805162461bcd60e51b815260206004820152601560248201527436bab9ba103232b632b3b0ba32903a379039b2b63360591b604482015290519081900360640190fd5b806001600160601b03166123fc856143ce565b6001600160601b0316101561244c576040805162461bcd60e51b81526020600482015260116024820152706d75737420726563616c6c20766f74657360781b604482015290519081900360640190fd5b612456848261445f565b50505050565b60006109e5826143ce565b60006109e582614553565b6001600160a01b038082166000908152601360209081526040808320938616835292905290812054806124a95760009150506109e5565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561250b57600080fd5b505afa15801561251f573d6000803e3d6000fd5b505050506040513d602081101561253557600080fd5b5051612576576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6000612580613432565b6001600160a01b038086166000908152601660209081526040808320938a1683529290529081205491925090156125dc576001600160a01b038086166000908152601660209081526040808320938a1683529290522054612613565b6001600160a01b038086166000908152601360209081526040808320938a168352929052908120805461261392600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d602081101561268f57600080fd5b5051905061269d8282613878565b83116126b05760009450505050506109e5565b6126bd83888885856138d2565b979650505050505050565b33600090815260126020526040902054612718576040805162461bcd60e51b815260206004820152600c60248201526b1b9bc81d9bdd195cc81bdd5d60a21b604482015290519081900360640190fd5b612721336145bd565b565b3360009081526011602052604081205461279457600061274233613a5a565b905080612781576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b61278c816001613351565b9150506127a6565b50336000908152601160205260409020545b6127ae613432565b8211156127f0576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561284057600080fd5b505afa158015612854573d6000803e3d6000fd5b505050506040513d602081101561286a57600080fd5b505190506128788282613878565b83116128bd576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b61134183338484613c61565b6001600160a01b03811660009081526011602052604081205481906129185760006128f384613a5a565b905080612905576000925050506109e5565b612910816001613351565b915050612933565b506001600160a01b0382166000908152601160205260409020545b61293b613432565b84111561297d576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50519050612a058282613878565b8511612a16576000925050506109e5565b612a228585848461474f565b95945050505050565b60008080808415612a3c5784612a44565b612a44613432565b6004805460408051630428867160e11b81526001600160a01b038c81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015612a9657600080fd5b505afa158015612aaa573d6000803e3d6000fd5b505050506040513d6020811015612ac057600080fd5b5051612b01576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b866001600160a01b031663c84ad2c7876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612b4e57600080fd5b505afa158015612b62573d6000803e3d6000fd5b505050506040513d6020811015612b7857600080fd5b5051612bbd576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b612bc8888888613393565b612bda57925060009150819050612c38565b612be2613432565b811115612c24576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b612c3088888884613451565b935093509350505b9450945094915050565b60008111612c81576040805162461bcd60e51b8152602060048201526007602482015266313a207a65726f60c81b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612ce357600080fd5b505afa158015612cf7573d6000803e3d6000fd5b505050506040513d6020811015612d0d57600080fd5b5051612d4e576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b826001600160a01b031663c84ad2c7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d9b57600080fd5b505afa158015612daf573d6000803e3d6000fd5b505050506040513d6020811015612dc557600080fd5b5051612e0a576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b600654604080516376d53d6160e01b81526001600160a01b038581166004830152915191909216916376d53d61916024808301926020929190829003018186803b158015612e5757600080fd5b505afa158015612e6b573d6000803e3d6000fd5b505050506040513d6020811015612e8157600080fd5b5051612ec4576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081b5a5b881b5a5b9959609a1b604482015290519081900360640190fd5b80612ece336143ce565b6001600160601b03161015612f1d576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f75676820766f74657360801b604482015290519081900360640190fd5b612f28338484613393565b613055576004805460408051636031257f60e11b815290516001600160a01b039092169263c0624afe928282019260209290829003018186803b158015612f6e57600080fd5b505afa158015612f82573d6000803e3d6000fd5b505050506040513d6020811015612f9857600080fd5b5051336000908152600d602090815260408083206001600160a01b0388168452909152902054612fc9906001613878565b111561300a576040805162461bcd60e51b815260206004820152600b60248201526a313a20746f6f206d616e7960a81b604482015290519081900360640190fd5b336000908152600d602090815260408083206001600160a01b0387811685529083529083208054600181018255908452919092200180546001600160a01b0319169184169190911790555b61305f3384614043565b6131665760048054604080516311d9d79360e21b815290516001600160a01b03909216926347675e4c928282019260209290829003018186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60208110156130cf57600080fd5b5051336000908152600c60205260409020546130ec906001613878565b111561312d576040805162461bcd60e51b815260206004820152600b60248201526a323a20746f6f206d616e7960a81b604482015290519081900360640190fd5b336000908152600c602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790555b6000613170613432565b9050613181338585856001866135f3565b61318f838584600185613676565b61319c84836001846136db565b336000908152601260205260409020546131b69083613878565b336000818152601260209081526040918290209390935580516001600160a01b03888116825293810186905281518594881693927ffac22e5ca1ad9c0e062e405d23fa971f266026b08a9339450a055b848ba742a1928290030190a450505050565b6001600160a01b038116600090815260116020526040812054819061326757600061324284613a5a565b905080613254576000925050506111ac565b61325f816001613351565b915050613282565b506001600160a01b0382166000908152601160205260409020545b600061328c613432565b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132de57600080fd5b505afa1580156132f2573d6000803e3d6000fd5b505050506040513d602081101561330857600080fd5b505190506133168382613878565b821161332857600093505050506111ac565b612a228286858461474f565b60005461010090046001600160a01b031681565b60005460ff1681565b600061118983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506149ba565b6000805b6001600160a01b038086166000908152600d6020908152604080832093881683529290522054811015613427576001600160a01b038581166000908152600d6020908152604080832088851684529091529020805491851691839081106133fa57fe5b6000918252602090912001546001600160a01b0316141561341f576001915050611189565b600101613397565b506000949350505050565b600061344c60016134464262015180614a14565b90613878565b905090565b6001600160a01b038085166000908152600e60209081526040808320878516845282528083209386168352928152828220805484518184028101840190955280855292938493849360609391908301828280156134cd57602002820191906000526020600020905b8154815260200190600101908083116134b9575b5050506001600160a01b03808c166000908152600f602090815260408083208e851684528252808320938d168352928152908290208054835181840281018401909452808452959650606095929450925083018282801561354d57602002820191906000526020600020905b815481526020019060010190808311613539575b5050506001600160a01b03808d1660009081526010602090815260408083208f851684528252808320938e16835292815290829020805483518184028101840190945280845295965060609592945092508301828280156135cd57602002820191906000526020600020905b8154815260200190600101908083116135b9575b505050505090506135e08383838a614a56565b9550955095505050509450945094915050565b6001600160a01b038087166000818152600e602090815260408083208a8616808552908352818420958a16808552958352818420858552600f8452828520828652845282852087865284528285209585526010845282852091855290835281842095845294909152902061366b838383898989614b66565b505050505050505050565b6001600160a01b038086166000818152601360209081526040808320948916808452948252808320848452601483528184208685528352818420948452601583528184209584529490915290206136d1838383898989614b66565b5050505050505050565b6001600160a01b03841660009081526017602090815260408083206018835281842060199093529220613712838383898989614b66565b50505050505050565b6001600160a01b03821660009081526017602090815260408083208054825181850281018501909352808352849384936060939092909183018282801561378157602002820191906000526020600020905b81548152602001906001019080831161376d575b5050506001600160a01b038916600090815260186020908152604091829020805483518184028101840190945280845295965060609592945092508301828280156137eb57602002820191906000526020600020905b8154815260200190600101908083116137d7575b5050506001600160a01b038a166000908152601960209081526040918290208054835181840281018401909452808452959650606095929450925083018282801561385557602002820191906000526020600020905b815481526020019060010190808311613841575b505050505090506138688383838a614a56565b9550955095505050509250925092565b600082820183811015611189576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080806138e1856001613878565b90505b6138ee8885613351565b81116139cb576000613900888361371b565b925050508061390f57506139c3565b600061391c888a85613ec0565b60048054604080516319ce94a160e31b815292830189905251929550600094506001600160a01b0316925063ce74a508916024808301926020929190829003018186803b15801561396c57600080fd5b505afa158015613980573d6000803e3d6000fd5b505050506040513d602081101561399657600080fd5b5051905060006139b0846139aa8486614e97565b90614a14565b90506139bc8682613878565b9550505050505b6001016138e4565b509695505050505050565b6001600160a01b03808316600081815260086020818152604080842080546007845282862054949093528787166001600160a01b031984168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612456828483614ef0565b600080805b6001600160a01b0384166000908152600c6020526040902054811015613c5a576001600160a01b0384166000908152600c60205260408120805483908110613aa357fe5b60009182526020822001546001600160a01b031691505b6001600160a01b038087166000908152600d6020908152604080832093861683529290522054811015613c50576001600160a01b038087166000908152600d602090815260408083209386168352929052908120805483908110613b1a57fe5b60009182526020808320909101546001600160a01b038a81168452600e83526040808520888316865284528085209190921680855292529091205490915015613c475784613bb0576001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054909190613b9e57fe5b90600052602060002001549450613c47565b6001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054879290613bec57fe5b90600052602060002001541015613c47576001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054909190613c3957fe5b906000526020600020015494505b50600101613aba565b5050600101613a5f565b5092915050565b6000613c6f8585858561474f565b905060008111613cb3576040805162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b604482015290519081900360640190fd5b613cbd8583613351565b6001600160a01b0380861660008181526011602052604080822094909455600480548551635fe43d2360e11b815291820193909352602481018690529351919092169263bfc87a4692604480830193919282900301818387803b158015613d2357600080fd5b505af1158015613d37573d6000803e3d6000fd5b50505050613d43613432565b6040805183815290516001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a919081900360200190a35050505050565b6000613d9886868686866138d2565b905060008111613ddc576040805162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b604482015290519081900360640190fd5b613de68683613351565b6001600160a01b0380861660008181526016602090815260408083208b8616845290915280822094909455600480548551635fe43d2360e11b815291820193909352602481018690529351919092169263bfc87a4692604480830193919282900301818387803b158015613e5957600080fd5b505af1158015613e6d573d6000803e3d6000fd5b50505050613e79613432565b6040805183815290516001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a919081900360200190a3505050505050565b6001600160a01b038084166000908152601360209081526040808320938616835292815282822080548451818402810184019095528085529293849384936060939190830182828015613f3257602002820191906000526020600020905b815481526020019060010190808311613f1e575b5050506001600160a01b03808b166000908152601460209081526040808320938d1683529281529082902080548351818402810184019094528084529596506060959294509250830182828015613fa857602002820191906000526020600020905b815481526020019060010190808311613f94575b5050506001600160a01b03808c166000908152601560209081526040808320938e168352928152908290208054835181840281018401909452808452959650606095929450925083018282801561401e57602002820191906000526020600020905b81548152602001906001019080831161400a575b505050505090506140318383838a614a56565b95509550955050505093509350939050565b6000805b6001600160a01b0384166000908152600c60205260409020548110156140bd576001600160a01b038481166000908152600c602052604090208054918516918390811061409057fe5b6000918252602090912001546001600160a01b031614156140b55760019150506109e5565b600101614047565b5060009392505050565b60008060005b845181101561410f57836001600160a01b03168582815181106140ec57fe5b60200260200101516001600160a01b03161415614107578091505b6001016140cd565b509392505050565b8054614124906001613351565b82141561415c578080548061413557fe5b600082815260209020810160001990810180546001600160a01b03191690550190556141fa565b8054819061416b906001613351565b8154811061417557fe5b9060005260206000200160009054906101000a90046001600160a01b031681838154811061419f57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550808054806141d757fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b5050565b600081600160601b84106142905760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561425557818101518382015260200161423d565b50505050905090810190601f1680156142825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509192915050565b6001600160a01b0382166142e2576040805162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015290519081900360640190fd5b6001600160a01b0382166000908152600760209081526040918290205482518084019093526015835274766f746520616d6f756e74206f766572666c6f777360581b91830191909152614342916001600160601b039091169083906150a7565b6001600160a01b038316600090815260076020526040902080546001600160601b0319166001600160601b03929092169190911790556143828282615111565b604080516001600160601b038316815290516001600160a01b038416917fbb104626c67690cd9023bde19b0804077126d78eb9bc3eb35de512eda655a311919081900360200190a25050565b6000806143da83614553565b90506001600160601b038116156144565761444f60126000856001600160a01b03166001600160a01b03168152602001908152602001600020546040518060400160405280601d81526020017f766f746572566f7465734f7574206578636565647320393620626974730000008152506141fe565b8103611189565b60009392505050565b6001600160a01b038216600090815260076020908152604091829020548251808401909352601b83527f766f746520616d6f756e7420657863656564732062616c616e63650000000000918301919091526144c7916001600160601b03909116908390615183565b6001600160a01b038316600090815260076020526040902080546001600160601b0319166001600160601b039290921691909117905561450782826151e8565b604080516001600160601b038316815290516001600160a01b038416917f40b10d9892192657ad11f6c742381c432b492799468ace10b6ffb5842e34b024919081900360200190a25050565b6001600160a01b0381166000908152600b602052604081205463ffffffff168061457e576000611189565b6001600160a01b0383166000908152600a6020908152604080832063ffffffff60001986011684529091529020546001600160601b0316915050919050565b60006145c7613432565b905060005b6001600160a01b0383166000908152600c6020526040902054811015611341576001600160a01b0383166000908152600c6020526040812080548390811061461057fe5b60009182526020808320909101546001600160a01b038781168452600d8352604080852091909216808552908352928190208054825181850281018501909352808352939450606093919290919083018282801561469757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614679575b5050505050905060005b81518110156147445760008282815181106146b857fe5b6020026020010151905060006146d08886848a613451565b509150506146e38886848460008c6135f3565b6146f182868360008b613676565b6146fe858260008a6136db565b6001600160a01b0388166000908152601260205260409020546147219082613351565b6001600160a01b03891660009081526012602052604090205550506001016146a1565b5050506001016145cc565b6001600160a01b0383166000908152600c60209081526040808320805482518185028101850190935280835284936060939291908301828280156147bc57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161479e575b5050505050905060006147d960018761387890919063ffffffff16565b90505b6147e68886613351565b81116149ae5760005b82518110156149a557600083828151811061480657fe5b60200260200101519050600061481c828561371b565b925050508061482c57505061499d565b6001600160a01b03808b166000908152600d602090815260408083209386168352928152908290208054835181840281018401909452808452606093928301828280156148a257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614884575b50505050509050600080600090505b82518110156148fc5760008382815181106148c857fe5b6020026020010151905060006148e08f88848c613451565b92506148f0915085905082613878565b935050506001016148b1565b506004805460408051631900020960e21b8152928301899052516000926001600160a01b03909216916364000824916024808301926020929190829003018186803b15801561494a57600080fd5b505afa15801561495e573d6000803e3d6000fd5b505050506040513d602081101561497457600080fd5b505190506000614988856139aa8486614e97565b90506149948a82613878565b99505050505050505b6001016147ef565b506001016147dc565b50909695505050505050565b60008184841115614a0c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b505050900390565b600061118983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615212565b83516000908190819080614a74578460008093509350935050612c38565b87600081518110614a8157fe5b6020026020010151851015614aa0578460008093509350935050612c38565b6000614aad826001613351565b90506000898281518110614abd57fe5b6020026020010151905080871415614b065786898381518110614adc57fe5b6020026020010151898481518110614af057fe5b6020026020010151955095509550505050612c38565b80871115614b5a5786898381518110614b1b57fe5b6020026020010151614b4c620151808c8681518110614b3657fe5b6020026020010151614e9790919063ffffffff16565b955095509550505050612c38565b6135e08a8a8a8a615277565b855462015180428190066000614b7c8383613351565b905083614c21578515614bda57895460018181018c5560008c815260208082209093018890558b549182018c558b8152919091200187905587614bbf8883614e97565b81546001810183556000928352602090922090910155614c1c565b6040805162461bcd60e51b8152602060048201526012602482015271313a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614e8b565b6000614c2e856001613351565b905060008b8281548110614c3e57fe5b9060005260206000200154905060008b8381548110614c5957fe5b9060005260206000200154905060008b8481548110614c7457fe5b906000526020600020015490506000808a851415614d5f578b15614cb957614c9c848e613878565b9150614cb2614cab8e89614e97565b8490613878565b9050614d26565b8c841015614d03576040805162461bcd60e51b8152602060048201526012602482015271323a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614d0d848e613351565b9150614d23614d1c8e89614e97565b8490613351565b90505b818f8781548110614d3357fe5b9060005260206000200181905550808e8781548110614d4e57fe5b600091825260209091200155614e84565b8b15614d9257614d6f848e613878565b9150614d8b614d7e8e89614e97565b6134468662015180614e97565b9050614e0b565b8c841015614ddc576040805162461bcd60e51b8152602060048201526012602482015271333a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614de6848e613351565b9150614e08614df58e89614e97565b614e028662015180614e97565b90613351565b90505b8f8b90806001815401808255809150506001900390600052602060002001600090919091909150558e8290806001815401808255809150506001900390600052602060002001600090919091909150558d8190806001815401808255809150506001900390600052602060002001600090919091909150555b5050505050505b50505050505050505050565b600082614ea6575060006109e5565b82820282848281614eb357fe5b04146111895760405162461bcd60e51b81526004018080602001828103825260218152602001806156b56021913960400191505060405180910390fd5b816001600160a01b0316836001600160a01b031614158015614f1b57506000816001600160601b0316115b15611341576001600160a01b03831615614fe2576001600160a01b0383166000908152600b602052604081205463ffffffff169081614f5b576000614f93565b6001600160a01b0385166000908152600a6020908152604080832063ffffffff60001987011684529091529020546001600160601b03165b90506000614fd0828560405180604001604052806016815260200175766f746520616d6f756e7420756e646572666c6f777360501b815250615183565b9050614fde86848484615488565b5050505b6001600160a01b03821615611341576001600160a01b0382166000908152600b602052604081205463ffffffff16908161501d576000615055565b6001600160a01b0384166000908152600a6020908152604080832063ffffffff60001987011684529091529020546001600160601b03165b90506000615091828560405180604001604052806015815260200174766f746520616d6f756e74206f766572666c6f777360581b8152506150a7565b905061509f85848484615488565b505050505050565b6000838301826001600160601b0380871690831610156151085760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b50949350505050565b6001600160a01b038281166000908152600860205260409020541661515a576001600160a01b038216600081815260086020526040902080546001600160a01b03191690911790555b6001600160a01b0380831660009081526008602052604081205490911690611341908284614ef0565b6000836001600160601b0316836001600160601b031611158290614a0c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b6001600160a01b038083166000908152600860205260408120549091169061134190829084614ef0565b600081836152615760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b50600083858161526d57fe5b0495945050505050565b60008060008060009050600061529860018a5161335190919063ffffffff16565b905060006152ab60026139aa8486613878565b90505b8183101561544f57868a82815181106152c357fe5b602002602001015114156152f257868982815181106152de57fe5b6020026020010151898381518110614af057fe5b868a82815181106152ff57fe5b602002602001015111156153ac576000811180156153395750868a615325836001613351565b8151811061532f57fe5b6020026020010151105b1561538357868961534b836001613351565b8151811061535557fe5b6020026020010151614b4c620151808c61537960018761335190919063ffffffff16565b81518110614b3657fe5b8061539a5786600080955095509550505050612c38565b6153a5816001613351565b9150615439565b868a82815181106153b957fe5b602002602001015110156154395789516153d4906001613351565b811080156153fe5750868a6153ea836001613878565b815181106153f457fe5b6020026020010151115b1561542b578689828151811061541057fe5b6020026020010151614b4c620151808c8581518110614b3657fe5b615436816001613878565b92505b61544860026139aa8486613878565b90506152ae565b868a828151811061545c57fe5b60200260200101511461547b5786600080955095509550505050612c38565b868982815181106152de57fe5b60006154c9436040518060400160405280601c81526020017f626c6f636b206e756d626572206578636565647320333220626974730000000081525061563e565b905060008463ffffffff1611801561551257506001600160a01b038516600090815260096020908152604080832063ffffffff6000198901811685529252909120548282169116145b15615562576001600160a01b0385166000908152600a60209081526040808320600019880163ffffffff168452909152902080546001600160601b0319166001600160601b0384161790556155ea565b6001600160a01b038516600081815260096020908152604080832063ffffffff898116808652918452828520805463ffffffff1990811689841617909155868652600a855283862092865291845282852080546001600160601b0319166001600160601b038a16179055948452600b9092529091208054909116600187019092169190911790555b604080516001600160601b0380861682528416602082015281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008164010000000084106142905760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d56fe696e76616c69642073657276696365506f6f6c00000000000000000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a264697066735822122098179f4fe2fcb854dc6a1d380a76130dff5414b0d11407aa3f739a2b69783f3664736f6c634300060c0033
Deployed Bytecode Sourcemap
211:43623:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3112:485;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3112:485:4;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5561:523;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5561:523:4;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1392:41;;;:::i;:::-;;;;-1:-1:-1;;;;;1392:41:4;;;;;;;;;;;;;;1738:69;;;;;;;;;;;;;;;;-1:-1:-1;1738:69:4;;-1:-1:-1;;;;;1738:69:4;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1738:69:4;;;;;;;;;;;;;;1289:27;;;:::i;1560:42::-;;;;;;;;;;;;;;;;-1:-1:-1;1560:42:4;-1:-1:-1;;;;;1560:42:4;;:::i;1322:25::-;;;:::i;1502:51::-;;;:::i;9366:1420::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9366:1420:4;;;;;;;;;;;;;;;;;:::i;1659:73::-;;;;;;;;;;;;;;;;-1:-1:-1;1659:73:4;;-1:-1:-1;;;;;1659:73:4;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21717:502;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21717:502:4;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1353:32;;;:::i;1439:57::-;;;:::i;17283:1086::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17283:1086:4;;;;;;;;;;;;;;;;;:::i;6744:114::-;;;;;;;;;;;;;;;;-1:-1:-1;6744:114:4;-1:-1:-1;;;;;6744:114:4;;:::i;1608:44::-;;;;;;;;;;;;;;;;-1:-1:-1;1608:44:4;-1:-1:-1;;;;;1608:44:4;;:::i;6645:93::-;;;;;;;;;;;;;;;;-1:-1:-1;6645:93:4;-1:-1:-1;;;;;6645:93:4;;:::i;14793:712::-;;;:::i;6090:402::-;;;;;;;;;;;;;;;;-1:-1:-1;6090:402:4;-1:-1:-1;;;;;6090:402:4;;:::i;1813:48::-;;;;;;;;;;;;;;;;-1:-1:-1;1813:48:4;-1:-1:-1;;;;;1813:48:4;;:::i;12877:964::-;;;;;;;;;;;;;;;;-1:-1:-1;12877:964:4;-1:-1:-1;;;;;12877:964:4;;:::i;7036:331::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7036:331:4;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13847:940;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13847:940:4;;;;;;;;:::i;20970:741::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20970:741:4;;;;;;;;;;;;;;;;;:::i;10792:2079::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10792:2079:4;;;;;;;;;;:::i;4413:1142::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4413:1142:4;;;;;;;;:::i;3603:632::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3603:632:4;;;;;;;;;;;;;;;:::i;6864:166::-;;;;;;;;;;;;;;;;-1:-1:-1;6864:166:4;-1:-1:-1;;;;;6864:166:4;;:::i;4241:::-;;;;;;;;;;;;;;;;-1:-1:-1;4241:166:4;-1:-1:-1;;;;;4241:166:4;;:::i;16203:1074::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16203:1074:4;;;;;;;;;;:::i;6498:141::-;;;:::i;15511:686::-;;;;;;;;;;;;;;;;-1:-1:-1;15511:686:4;;:::i;19254:793::-;;;;;;;;;;;;;;;;-1:-1:-1;19254:793:4;;;;;;-1:-1:-1;;;;;19254:793:4;;:::i;20053:911::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20053:911:4;;;;;;;;;;;;;;;;;;;;;;:::i;7373:1987::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7373:1987:4;;;;;;;;;;;;;;;;;:::i;18375:873::-;;;;;;;;;;;;;;;;-1:-1:-1;18375:873:4;-1:-1:-1;;;;;18375:873:4;;:::i;1263:20::-;;;:::i;1237:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;3112:485;3302:8;;;;3301:9;3293:31;;;;;-1:-1:-1;;;3293:31:4;;;;;;;;;;;;-1:-1:-1;;;3293:31:4;;;;;;;;;;;;;;;3334:12;:57;;-1:-1:-1;;;;;;3334:57:4;;;-1:-1:-1;;;;;3334:57:4;;;;;;;3401:17;:94;;;;;;;;;;;;;;-1:-1:-1;3505:20:4;;3535:10;:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3505:20:4;3334:57;3505:20;;;;;;;;;-1:-1:-1;;3575:15:4;-1:-1:-1;3575:15:4;;;3112:485::o;5561:523::-;-1:-1:-1;;;;;5718:31:4;;;5681:7;5718:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:51;5783:8;;5779:281;;-1:-1:-1;;;;;5830:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;:62;:219;;-1:-1:-1;;;;;5992:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;5830:219;;;-1:-1:-1;;;;;5915:31:4;;;;;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:47;;:54;;5967:1;;5915:44;:47;;;;;;;;;;;;:51;;:54;;;;:::i;:::-;5807:242;;;;;5779:281;6076:1;6069:8;;;5561:523;;;;;:::o;1392:41::-;;;-1:-1:-1;;;;;1392:41:4;;:::o;1738:69::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1738:69:4;;:::o;1289:27::-;;;-1:-1:-1;;;;;1289:27:4;;:::o;1560:42::-;;;;;;;;;;;;-1:-1:-1;;;;;1560:42:4;;:::o;1322:25::-;;;-1:-1:-1;;;;;1322:25:4;;:::o;1502:51::-;;;-1:-1:-1;;;;;1502:51:4;;:::o;9366:1420::-;9504:1;9495:6;:10;9487:27;;;;;-1:-1:-1;;;9487:27:4;;;;;;;;;;;;;;;-1:-1:-1;;;9487:27:4;;;;;;;;;;;;;;;9545:12;;;;;;;;;-1:-1:-1;;;;;9545:12:4;-1:-1:-1;;;;;9545:34:4;;9580:11;9545:47;;;;;;;;;;;;;-1:-1:-1;;;;;9545:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9545:47:4;9524:113;;;;;-1:-1:-1;;;9524:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9524:113:4;;;;;;;;;;;;;;;9698:11;-1:-1:-1;;;;;9668:60:4;;9746:7;9668:99;;;;;;;;;;;;;-1:-1:-1;;;;;9668:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9668:99:4;9647:161;;;;;-1:-1:-1;;;9647:161:4;;;;;;;;;;;;-1:-1:-1;;;9647:161:4;;;;;;;;;;;;;;;9839:64;9870:10;9882:11;9895:7;9839:30;:64::i;:::-;9818:120;;;;;-1:-1:-1;;;9818:120:4;;;;;;;;;;;;-1:-1:-1;;;9818:120:4;;;;;;;;;;;;;;;9948:18;9969:16;:14;:16::i;:::-;9948:37;;9998:13;10017:135;10062:10;10086:11;10111:7;10132:10;10017:31;:135::i;:::-;9995:157;;;;10179:6;10170:5;:15;;10162:44;;;;;-1:-1:-1;;;10162:44:4;;;;;;;;;;;;-1:-1:-1;;;10162:44:4;;;;;;;;;;;;;;;10216:177;10264:10;10288:11;10313:7;10334:6;10354:5;10373:10;10216:34;:177::i;:::-;10403:148;10446:7;10467:11;10492:6;10512:5;10531:10;10403:29;:148::i;:::-;10561:62;10584:11;10597:6;10605:5;10612:10;10561:22;:62::i;:::-;10675:10;10661:25;;;;:13;:25;;;;;;:37;;10691:6;10661:29;:37::i;:::-;10647:10;10633:25;;;;:13;:25;;;;;;;;;:65;;;;10713:66;;-1:-1:-1;;;;;10713:66:4;;;;;;;;;;;;;10768:10;;10713:66;;;10647:10;10713:66;;;;;;;;9366:1420;;;;;:::o;1659:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21717:502::-;21845:7;;;;21933:14;;:45;;21969:9;21933:45;;;21950:16;:14;:16::i;:::-;22009:12;;;:47;;;-1:-1:-1;;;22009:47:4;;-1:-1:-1;;;;;22009:47:4;;;;;;;;;;;;21919:59;;-1:-1:-1;22009:12:4;;;:34;;:47;;;;;;;;;;;;;;;:12;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22009:47:4;21988:113;;;;;-1:-1:-1;;;21988:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21988:113:4;;;;;;;;;;;;;;;22126:16;:14;:16::i;:::-;22119:3;:23;;22111:47;;;;;-1:-1:-1;;;22111:47:4;;;;;;;;;;;;-1:-1:-1;;;22111:47:4;;;;;;;;;;;;;;;22175:37;22195:11;22208:3;22175:19;:37::i;:::-;22168:44;;;;;;;21717:502;;;;;:::o;1353:32::-;;;-1:-1:-1;;;;;1353:32:4;;:::o;1439:57::-;;;-1:-1:-1;;;;;1439:57:4;;:::o;17283:1086::-;-1:-1:-1;;;;;17452:31:4;;;17419:7;17452:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:51;17517:8;17513:47;;17548:1;17541:8;;;;;17513:47;17590:12;;;;;;;;;-1:-1:-1;;;;;17590:12:4;-1:-1:-1;;;;;17590:34:4;;17625:11;17590:47;;;;;;;;;;;;;-1:-1:-1;;;;;17590:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17590:47:4;17569:113;;;;;-1:-1:-1;;;17569:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17569:113:4;;;;;;;;;;;;;;;17707:16;:14;:16::i;:::-;17700:3;:23;;17692:47;;;;;-1:-1:-1;;;17692:47:4;;;;;;;;;;;;-1:-1:-1;;;17692:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;17792:44:4;;;17755:25;17792:44;;;:35;:44;;;;;;;;:57;;;;;;;;;;;;:62;:203;;-1:-1:-1;;;;;17938:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;17792:203;;;-1:-1:-1;;;;;17869:31:4;;;;;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:47;;:54;;17921:1;;17869:44;:47;;;:54;17755:240;;18005:19;18027:12;;;;;;;;;-1:-1:-1;;;;;18027:12:4;-1:-1:-1;;;;;18027:39:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18027:41:4;;-1:-1:-1;18090:34:4;:17;18027:41;18090:21;:34::i;:::-;18084:3;:40;18078:82;;18148:1;18141:8;;;;;;;18078:82;18188:174;18227:3;18248:11;18277:7;18302:17;18337:11;18188:21;:174::i;:::-;18169:193;;;;;17283:1086;;;;;;:::o;6744:114::-;-1:-1:-1;;;;;6831:20:4;;;6805:7;6831:20;;;:9;:20;;;;;;;6744:114;;;;:::o;1608:44::-;;;;;;;;;;;;-1:-1:-1;;;;;1608:44:4;;:::o;6645:93::-;6699:32;6709:10;6721:9;6699;:32::i;:::-;6645:93;:::o;14793:712::-;14897:10;14835:25;14874:34;;;:22;:34;;;;;;14870:315;;14929:21;14953:29;14971:10;14953:17;:29::i;:::-;14929:53;-1:-1:-1;15004:18:4;14996:39;;;;;-1:-1:-1;;;14996:39:4;;;;;;;;;;;;-1:-1:-1;;;14996:39:4;;;;;;;;;;;;;;;15069:20;:13;15087:1;15069:17;:20::i;:::-;15049:40;;14870:315;;;;-1:-1:-1;15163:10:4;15140:34;;;;:22;:34;;;;;;14870:315;15194:18;15215:16;:14;:16::i;:::-;15194:37;;15241:19;15263:12;;;;;;;;;-1:-1:-1;;;;;15263:12:4;-1:-1:-1;;;;;15263:37:4;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15263:39:4;;-1:-1:-1;15346:34:4;:17;15263:39;15346:21;:34::i;:::-;15333:10;:47;15312:109;;;;;-1:-1:-1;;;15312:109:4;;;;;;;;;;;;-1:-1:-1;;;15312:109:4;;;;;;;;;;;;;;;15431:67;15443:10;15455;15467:17;15486:11;15431;:67::i;:::-;14793:712;;;:::o;6090:402::-;-1:-1:-1;;;;;6212:29:4;;6185:7;6212:29;;;:22;:29;;;;;;6208:232;;6262:21;6286:24;6304:5;6286:17;:24::i;:::-;6262:48;-1:-1:-1;6328:18:4;6324:65;;6373:1;6366:8;;;;;6324:65;6409:20;:13;6427:1;6409:17;:20::i;:::-;6402:27;;;;;6208:232;-1:-1:-1;;;;;;6456:29:4;;;;;:22;:29;;;;;;;6090:402::o;1813:48::-;;;;;;;;;;;;;;;:::o;12877:964::-;12977:10;12940:11;12954:34;;;:22;:34;;;;;;;;-1:-1:-1;;;;;12954:47:4;;;;;;;;;:54;13026:8;13018:29;;;;;-1:-1:-1;;;13018:29:4;;;;;;;;;;;;-1:-1:-1;;;13018:29:4;;;;;;;;;;;;;;;13078:12;;;;;;;;;-1:-1:-1;;;;;13078:12:4;-1:-1:-1;;;;;13078:34:4;;13113:11;13078:47;;;;;;;;;;;;;-1:-1:-1;;;;;13078:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13078:47:4;13057:113;;;;;-1:-1:-1;;;13057:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13057:113:4;;;;;;;;;;;;;;;13180:18;13201:16;:14;:16::i;:::-;13291:23;13227:25;13255:60;;;:35;:60;;;;;;;;-1:-1:-1;;;;;13255:73:4;;;;;;;;;;13180:37;;-1:-1:-1;13227:25:4;13255:78;:225;;13456:10;13420:47;;;;:35;:47;;;;;;;;-1:-1:-1;;;;;13420:60:4;;;;;;;;;;13255:225;;;13371:10;13348:34;;;;:22;:34;;;;;;;;-1:-1:-1;;;;;13348:47:4;;;;;;;;;:50;;:57;;13403:1;;13348:47;:50;;;:57;13227:253;;13490:19;13512:12;;;;;;;;;-1:-1:-1;;;;;13512:12:4;-1:-1:-1;;;;;13512:39:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13512:41:4;;-1:-1:-1;13597:34:4;:17;13512:41;13597:21;:34::i;:::-;13584:10;:47;13563:109;;;;;-1:-1:-1;;;13563:109:4;;;;;;;;;;;;-1:-1:-1;;;13563:109:4;;;;;;;;;;;;;;;13682:152;13709:10;13733:11;13758:10;13782:17;13813:11;13682:13;:152::i;:::-;12877:964;;;;;:::o;7036:331::-;7154:16;7207:12;;;;;;;;;-1:-1:-1;;;;;7207:12:4;-1:-1:-1;;;;;7207:34:4;;7242:11;7207:47;;;;;;;;;;;;;-1:-1:-1;;;;;7207:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7207:47:4;7186:113;;;;;-1:-1:-1;;;7186:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7186:113:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;7316:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;;;;7309:51;;;;;;;;;;;;;;;;;7316:44;;7309:51;;7316:44;7309:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7309:51:4;;;;;;;;;;;;;;;;;;;;;;;7036:331;;;;:::o;13847:940::-;13961:10;13924:11;13938:34;;;:22;:34;;;;;;;;-1:-1:-1;;;;;13938:47:4;;;;;;;;;:54;14010:8;14002:29;;;;;-1:-1:-1;;;14002:29:4;;;;;;;;;;;;-1:-1:-1;;;14002:29:4;;;;;;;;;;;;;;;14062:12;;;;;;;;;-1:-1:-1;;;;;14062:12:4;-1:-1:-1;;;;;14062:34:4;;14097:11;14062:47;;;;;;;;;;;;;-1:-1:-1;;;;;14062:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14062:47:4;14041:113;;;;;-1:-1:-1;;;14041:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14041:113:4;;;;;;;;;;;;;;;14179:16;:14;:16::i;:::-;14172:3;:23;;14164:47;;;;;-1:-1:-1;;;14164:47:4;;;;;;;;;;;;-1:-1:-1;;;14164:47:4;;;;;;;;;;;;;;;14285:23;14221:25;14249:60;;;:35;:60;;;;;;;;-1:-1:-1;;;;;14249:73:4;;;;;;;;;;:78;:225;;14450:10;14414:47;;;;:35;:47;;;;;;;;-1:-1:-1;;;;;14414:60:4;;;;;;;;;;14249:225;;;14365:10;14342:34;;;;:22;:34;;;;;;;;-1:-1:-1;;;;;14342:47:4;;;;;;;;;:50;;:57;;14397:1;;14342:47;:50;;;:57;14221:253;;14484:19;14506:12;;;;;;;;;-1:-1:-1;;;;;14506:12:4;-1:-1:-1;;;;;14506:39:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14506:41:4;;-1:-1:-1;14571:34:4;:17;14506:41;14571:21;:34::i;:::-;14565:3;:40;14557:68;;;;;-1:-1:-1;;;14557:68:4;;;;;;;;;;;;-1:-1:-1;;;14557:68:4;;;;;;;;;;;;;;;14635:145;14662:3;14679:11;14704:10;14728:17;14759:11;14635:13;:145::i;20970:741::-;21150:7;;;;21238:14;;:45;;21274:9;21238:45;;;21255:16;:14;:16::i;:::-;21314:12;;;:47;;;-1:-1:-1;;;21314:47:4;;-1:-1:-1;;;;;21314:47:4;;;;;;;;;;;;21224:59;;-1:-1:-1;21314:12:4;;;:34;;:47;;;;;;;;;;;;;;;:12;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21314:47:4;21293:113;;;;;-1:-1:-1;;;21293:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21293:113:4;;;;;;;;;;;;;;;21467:11;-1:-1:-1;;;;;21437:60:4;;21515:7;21437:99;;;;;;;;;;;;;-1:-1:-1;;;;;21437:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21437:99:4;21416:161;;;;;-1:-1:-1;;;21416:161:4;;;;;;;;;;;;-1:-1:-1;;;21416:161:4;;;;;;;;;;;;;;;21602:16;:14;:16::i;:::-;21595:3;:23;;21587:47;;;;;-1:-1:-1;;;21587:47:4;;;;;;;;;;;;-1:-1:-1;;;21587:47:4;;;;;;;;;;;;;;;21651:53;21678:7;21687:11;21700:3;21651:26;:53::i;:::-;21644:60;;;;;;;20970:741;;;;;;;:::o;10792:2079::-;10889:12;;;;;;;;;-1:-1:-1;;;;;10889:12:4;-1:-1:-1;;;;;10889:34:4;;10924:11;10889:47;;;;;;;;;;;;;-1:-1:-1;;;;;10889:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10889:47:4;10868:113;;;;;-1:-1:-1;;;10868:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10868:113:4;;;;;;;;;;;;;;;11042:11;-1:-1:-1;;;;;11012:60:4;;11090:7;11012:99;;;;;;;;;;;;;-1:-1:-1;;;;;11012:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11012:99:4;10991:161;;;;;-1:-1:-1;;;10991:161:4;;;;;;;;;;;;-1:-1:-1;;;10991:161:4;;;;;;;;;;;;;;;11183:48;11207:10;11219:11;11183:23;:48::i;:::-;11162:107;;;;;-1:-1:-1;;;11162:107:4;;;;;;;;;;;;-1:-1:-1;;;11162:107:4;;;;;;;;;;;;;;;11300:64;11331:10;11343:11;11356:7;11300:30;:64::i;:::-;11279:123;;;;;-1:-1:-1;;;11279:123:4;;;;;;;;;;;;-1:-1:-1;;;11279:123:4;;;;;;;;;;;;;;;11412:18;11433:16;:14;:16::i;:::-;11412:37;;11462:13;11481:135;11526:10;11550:11;11575:7;11596:10;11481:31;:135::i;:::-;11459:157;;;;11626:176;11674:10;11698:11;11723:7;11744:5;11763;11782:10;11626:34;:176::i;:::-;11812:147;11855:7;11876:11;11901:5;11920;11939:10;11812:29;:147::i;:::-;11969:61;11992:11;12005:5;12012;12019:10;11969:22;:61::i;:::-;12082:10;12068:25;;;;:13;:25;;;;;;:36;;12098:5;12068:29;:36::i;:::-;12054:10;12040:25;;;;:13;:25;;;;;;;;:64;;;;12187:24;:36;;;;;-1:-1:-1;;;;;12187:49:4;;;;;;;;;12154:113;;;;;;;;;;;;;;;;;12040:25;;12154:113;;;;;;12187:49;12154:113;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12154:113:4;;;;;;;;;;;;;;;;;;;;;12250:7;12154:19;:113::i;:::-;12378:10;12353:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;12353:49:4;;;;;;;;;12114:153;;-1:-1:-1;12277:135:4;;12114:153;;12277:19;:135::i;:::-;12451:10;12426:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;12426:49:4;;;;;;;;;:56;12422:368;;12591:10;12503:30;12573:29;;;:17;:29;;;;;;;;12536:109;;;;;;;;;;;;;;;;;;;;;12573:29;12536:109;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12536:109:4;;;;;;;;;;;;;;;;;;;;;12620:11;12536:19;:109::i;:::-;12754:10;12736:29;;;;:17;:29;;;;;12503:142;;-1:-1:-1;12659:120:4;;12503:142;;12659:19;:120::i;:::-;12422:368;;12804:60;;;-1:-1:-1;;;;;12804:60:4;;;;;;;12853:10;;12804:60;;;12819:10;;12804:60;;;;;;;;;10792:2079;;;;;:::o;4413:1142::-;4529:6;4573:12;4559:11;:26;4551:57;;;;;-1:-1:-1;;;4551:57:4;;;;;;;;;;;;-1:-1:-1;;;4551:57:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4640:23:4;;4618:19;4640:23;;;:14;:23;;;;;;;;4677:17;4673:56;;4717:1;4710:8;;;;;4673:56;-1:-1:-1;;;;;4742:29:4;;;;;;:20;:29;;;;;;;;:47;-1:-1:-1;;4772:16:4;;4742:47;;;;;;;;;;;:62;-1:-1:-1;4738:143:4;;-1:-1:-1;;;;;4827:25:4;;;;;;:16;:25;;;;;;;;-1:-1:-1;;4853:16:4;;;;4827:43;;;;;;;;;-1:-1:-1;;;;;4827:43:4;;-1:-1:-1;4820:50:4;;4738:143;-1:-1:-1;;;;;4894:29:4;;;;;;:20;:29;;;;;;;;:32;;;;;;;;;;;:46;-1:-1:-1;4890:85:4;;;4963:1;4956:8;;;;;4890:85;4984:12;-1:-1:-1;;5025:16:4;;5051:449;5066:5;5058:13;;:5;:13;;;5051:449;;;-1:-1:-1;;;;;5163:29:4;;5087:13;5163:29;;;:20;:29;;;;;;;;5129:1;5111:19;5112:13;;;5111:19;;;;;;5103:27;;5163:37;;;;;;;;;;;;;5229:25;;;:16;:25;;;;;:33;;;;;;;;;;5103:27;;5163:37;;-1:-1:-1;;;;;5229:33:4;5280:24;;;5276:214;;;5331:5;-1:-1:-1;5324:12:4;;-1:-1:-1;;;;;5324:12:4;5276:214;5373:11;5361:9;:23;;;5357:133;;;5412:6;5404:14;;5357:133;;;5474:1;5465:6;:10;5457:18;;5357:133;5051:449;;;;;;-1:-1:-1;;;;;;5516:25:4;;;;;;:16;:25;;;;;;;;:32;;;;;;;;;;;-1:-1:-1;;;;;5516:32:4;;-1:-1:-1;;4413:1142:4;;;;:::o;3603:632::-;3763:17;;-1:-1:-1;;;;;3763:17:4;3741:10;:40;3720:108;;;;;-1:-1:-1;;;3720:108:4;;;;;;;;;;;;-1:-1:-1;;;3720:108:4;;;;;;;;;;;;;;;3838:13;3854:44;3862:9;3854:44;;;;;;;;;;;;;-1:-1:-1;;;3854:44:4;;;:7;:44::i;:::-;3838:60;;3912:6;3908:321;;;3934:24;3944:5;3951:6;3934:9;:24::i;:::-;3908:321;;;-1:-1:-1;;;;;4006:16:4;;;;;;;:9;:16;;;;;;;;;3997:25;3989:59;;;;;-1:-1:-1;;;3989:59:4;;;;;;;;;;;;-1:-1:-1;;;3989:59:4;;;;;;;;;;;;;;;4123:6;-1:-1:-1;;;;;4087:42:4;:32;4113:5;4087:25;:32::i;:::-;-1:-1:-1;;;;;4087:42:4;;;4062:118;;;;;-1:-1:-1;;;4062:118:4;;;;;;;;;;;;-1:-1:-1;;;4062:118:4;;;;;;;;;;;;;;;4194:24;4204:5;4211:6;4194:9;:24::i;:::-;3603:632;;;;:::o;6864:166::-;6960:6;6989:34;7015:7;6989:25;:34::i;4241:166::-;4338:6;4367:33;4392:7;4367:24;:33::i;16203:1074::-;-1:-1:-1;;;;;16356:31:4;;;16319:7;16356:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:51;16421:8;16417:47;;16452:1;16445:8;;;;;16417:47;16494:12;;;;;;;;;-1:-1:-1;;;;;16494:12:4;-1:-1:-1;;;;;16494:34:4;;16529:11;16494:47;;;;;;;;;;;;;-1:-1:-1;;;;;16494:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16494:47:4;16473:113;;;;;-1:-1:-1;;;16473:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16473:113:4;;;;;;;;;;;;;;;16596:18;16617:16;:14;:16::i;:::-;-1:-1:-1;;;;;16686:44:4;;;16649:25;16686:44;;;:35;:44;;;;;;;;:57;;;;;;;;;;;;16596:37;;-1:-1:-1;16649:25:4;16686:62;:203;;-1:-1:-1;;;;;16832:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;16686:203;;;-1:-1:-1;;;;;16763:31:4;;;;;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:47;;:54;;16815:1;;16763:44;:47;;;:54;16649:240;;16899:19;16921:12;;;;;;;;;-1:-1:-1;;;;;16921:12:4;-1:-1:-1;;;;;16921:39:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16921:41:4;;-1:-1:-1;16991:34:4;:17;16921:41;16991:21;:34::i;:::-;16978:10;:47;16972:89;;17049:1;17042:8;;;;;;;;16972:89;17089:181;17128:10;17156:11;17185:7;17210:17;17245:11;17089:21;:181::i;:::-;17070:200;16203:1074;-1:-1:-1;;;;;;;16203:1074:4:o;6498:141::-;6563:10;6577:1;6549:25;;;:13;:25;;;;;;6541:54;;;;;-1:-1:-1;;;6541:54:4;;;;;;;;;;;;-1:-1:-1;;;6541:54:4;;;;;;;;;;;;;;;6605:27;6621:10;6605:15;:27::i;:::-;6498:141::o;15511:686::-;15627:10;15565:25;15604:34;;;:22;:34;;;;;;15600:315;;15659:21;15683:29;15701:10;15683:17;:29::i;:::-;15659:53;-1:-1:-1;15734:18:4;15726:39;;;;;-1:-1:-1;;;15726:39:4;;;;;;;;;;;;-1:-1:-1;;;15726:39:4;;;;;;;;;;;;;;;15799:20;:13;15817:1;15799:17;:20::i;:::-;15779:40;;15600:315;;;;-1:-1:-1;15893:10:4;15870:34;;;;:22;:34;;;;;;15600:315;15939:16;:14;:16::i;:::-;15932:3;:23;;15924:47;;;;;-1:-1:-1;;;15924:47:4;;;;;;;;;;;;-1:-1:-1;;;15924:47:4;;;;;;;;;;;;;;;15981:19;16003:12;;;;;;;;;-1:-1:-1;;;;;16003:12:4;-1:-1:-1;;;;;16003:37:4;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16003:39:4;;-1:-1:-1;16066:34:4;:17;16003:39;16066:21;:34::i;:::-;16060:3;:40;16052:68;;;;;-1:-1:-1;;;16052:68:4;;;;;;;;;;;;-1:-1:-1;;;16052:68:4;;;;;;;;;;;;;;;16130:60;16142:3;16147:10;16159:17;16178:11;16130;:60::i;19254:793::-;-1:-1:-1;;;;;19421:29:4;;19359:7;19421:29;;;:22;:29;;;;;;19359:7;;19417:325;;19471:21;19495:24;19513:5;19495:17;:24::i;:::-;19471:48;-1:-1:-1;19537:18:4;19533:65;;19582:1;19575:8;;;;;;19533:65;19631:20;:13;19649:1;19631:17;:20::i;:::-;19611:40;;19417:325;;;;-1:-1:-1;;;;;;19702:29:4;;;;;;:22;:29;;;;;;19417:325;19766:16;:14;:16::i;:::-;19759:3;:23;;19751:47;;;;;-1:-1:-1;;;19751:47:4;;;;;;;;;;;;-1:-1:-1;;;19751:47:4;;;;;;;;;;;;;;;19808:19;19830:12;;;;;;;;;-1:-1:-1;;;;;19830:12:4;-1:-1:-1;;;;;19830:37:4;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19830:39:4;;-1:-1:-1;19891:34:4;:17;19830:39;19891:21;:34::i;:::-;19885:3;:40;19879:82;;19949:1;19942:8;;;;;;19879:82;19977:63;19997:3;20002:5;20009:17;20028:11;19977:19;:63::i;:::-;19970:70;19254:793;-1:-1:-1;;;;;19254:793:4:o;20053:911::-;20261:7;;;;20349:14;;:45;;20385:9;20349:45;;;20366:16;:14;:16::i;:::-;20425:12;;;:47;;;-1:-1:-1;;;20425:47:4;;-1:-1:-1;;;;;20425:47:4;;;;;;;;;;;;20335:59;;-1:-1:-1;20425:12:4;;;:34;;:47;;;;;;;;;;;;;;;:12;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20425:47:4;20404:113;;;;;-1:-1:-1;;;20404:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20404:113:4;;;;;;;;;;;;;;;20578:11;-1:-1:-1;;;;;20548:60:4;;20626:7;20548:99;;;;;;;;;;;;;-1:-1:-1;;;;;20548:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20548:99:4;20527:161;;;;;-1:-1:-1;;;20527:161:4;;;;;;;;;;;;-1:-1:-1;;;20527:161:4;;;;;;;;;;;;;;;20703:59;20734:5;20741:11;20754:7;20703:30;:59::i;:::-;20698:109;;20786:3;-1:-1:-1;20791:1:4;;-1:-1:-1;20791:1:4;;-1:-1:-1;20778:18:4;;20698:109;20831:16;:14;:16::i;:::-;20824:3;:23;;20816:47;;;;;-1:-1:-1;;;20816:47:4;;;;;;;;;;;;-1:-1:-1;;;20816:47:4;;;;;;;;;;;;;;;20892:65;20924:5;20931:11;20944:7;20953:3;20892:31;:65::i;:::-;20873:84;;;;;;;20053:911;;;;;;;;;:::o;7373:1987::-;7505:1;7496:6;:10;7488:30;;;;;-1:-1:-1;;;7488:30:4;;;;;;;;;;;;-1:-1:-1;;;7488:30:4;;;;;;;;;;;;;;;7549:12;;;;;;;;;-1:-1:-1;;;;;7549:12:4;-1:-1:-1;;;;;7549:34:4;;7584:11;7549:47;;;;;;;;;;;;;-1:-1:-1;;;;;7549:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7549:47:4;7528:113;;;;;-1:-1:-1;;;7528:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7528:113:4;;;;;;;;;;;;;;;7702:11;-1:-1:-1;;;;;7672:60:4;;7750:7;7672:99;;;;;;;;;;;;;-1:-1:-1;;;;;7672:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7672:99:4;7651:161;;;;;-1:-1:-1;;;7651:161:4;;;;;;;;;;;;-1:-1:-1;;;7651:161:4;;;;;;;;;;;;;;;7830:17;;:42;;;-1:-1:-1;;;7830:42:4;;-1:-1:-1;;;;;7830:42:4;;;;;;;;;:17;;;;;:33;;:42;;;;;;;;;;;;;;:17;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7830:42:4;7822:68;;;;;-1:-1:-1;;;7822:68:4;;;;;;;;;;;;-1:-1:-1;;;7822:68:4;;;;;;;;;;;;;;;7971:6;7929:37;7955:10;7929:25;:37::i;:::-;-1:-1:-1;;;;;7921:46:4;:56;;7900:119;;;;;-1:-1:-1;;;7900:119:4;;;;;;;;;;;;-1:-1:-1;;;7900:119:4;;;;;;;;;;;;;;;8034:64;8065:10;8077:11;8090:7;8034:30;:64::i;:::-;8029:386;;8244:12;;;:38;;;-1:-1:-1;;;8244:38:4;;;;-1:-1:-1;;;;;8244:12:4;;;;:36;;:38;;;;;;;;;;;;:12;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8244:38:4;8164:10;8139:36;;;;:24;8244:38;8139:36;;;;;;;-1:-1:-1;;;;;8139:49:4;;;;;;;;;:56;:101;;8221:1;8139:60;:101::i;:::-;:143;;8114:213;;;;;-1:-1:-1;;;8114:213:4;;;;;;;;;;;;-1:-1:-1;;;8114:213:4;;;;;;;;;;;;;;;8366:10;8341:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;8341:49:4;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8341:63:4;;;;;;;;;;8029:386;8429:48;8453:10;8465:11;8429:23;:48::i;:::-;8424:320;;8585:12;;;:42;;;-1:-1:-1;;;8585:42:4;;;;-1:-1:-1;;;;;8585:12:4;;;;:40;;:42;;;;;;;;;;;;:12;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8585:42:4;8536:10;8518:29;;;;:17;8585:42;8518:29;;;;:36;:43;;8559:1;8518:40;:43::i;:::-;:109;;8493:179;;;;;-1:-1:-1;;;8493:179:4;;;;;;;;;;;;-1:-1:-1;;;8493:179:4;;;;;;;;;;;;;;;8704:10;8686:29;;;;:17;:29;;;;;;;:47;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8686:47:4;-1:-1:-1;;;;;8686:47:4;;;;;8424:320;8753:18;8774:16;:14;:16::i;:::-;8753:37;;8800:176;8848:10;8872:11;8897:7;8918:6;8938:4;8956:10;8800:34;:176::i;:::-;8986:147;9029:7;9050:11;9075:6;9095:4;9113:10;8986:29;:147::i;:::-;9143:61;9166:11;9179:6;9187:4;9193:10;9143:22;:61::i;:::-;9256:10;9242:25;;;;:13;:25;;;;;;:37;;9272:6;9242:29;:37::i;:::-;9228:10;9214:25;;;;:13;:25;;;;;;;;;:65;;;;9294:59;;-1:-1:-1;;;;;9294:59:4;;;;;;;;;;;;;9342:10;;9294:59;;;9228:10;9294:59;;;;;;;;7373:1987;;;;:::o;18375:873::-;-1:-1:-1;;;;;18528:29:4;;18466:7;18528:29;;;:22;:29;;;;;;18466:7;;18524:325;;18578:21;18602:24;18620:5;18602:17;:24::i;:::-;18578:48;-1:-1:-1;18644:18:4;18640:65;;18689:1;18682:8;;;;;;18640:65;18738:20;:13;18756:1;18738:17;:20::i;:::-;18718:40;;18524:325;;;;-1:-1:-1;;;;;;18809:29:4;;;;;;:22;:29;;;;;;18524:325;18858:18;18879:16;:14;:16::i;:::-;18858:37;;18905:19;18927:12;;;;;;;;;-1:-1:-1;;;;;18927:12:4;-1:-1:-1;;;;;18927:37:4;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18927:39:4;;-1:-1:-1;18995:34:4;:17;18927:39;18995:21;:34::i;:::-;18982:10;:47;18976:89;;19053:1;19046:8;;;;;;;18976:89;19093:148;19130:10;19158:5;19181:17;19216:11;19093:19;:148::i;1263:20::-;;;;;;-1:-1:-1;;;;;1263:20:4;;:::o;1237:::-;;;;;;:::o;1321:134:0:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;35887:450:4:-;36033:4;;36049:260;-1:-1:-1;;;;;36098:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;:51;36094:55;;36049:260;;;-1:-1:-1;;;;;36195:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;;:47;;:58;;;;36240:1;;36195:47;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36195:47:4;:58;36191:108;;;36280:4;36273:11;;;;;36191:108;36163:3;;36049:260;;;-1:-1:-1;36325:5:4;;35887:450;-1:-1:-1;;;;35887:450:4:o;41939:116::-;41988:7;42014:34;42046:1;42014:27;:15;42034:6;42014:19;:27::i;:::-;:31;;:34::i;:::-;42007:41;;41939:116;:::o;22225:670::-;-1:-1:-1;;;;;22543:34:4;;;22430:7;22543:34;;;:27;:34;;;;;;;;:47;;;;;;;;;;:56;;;;;;;;;;;22509:90;;;;;;;;;;;;;;;;;22430:7;;;;;;22509:22;;22543:56;22509:90;;;22543:56;22509:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;22652:37:4;;;;;;;:30;:37;;;;;;;;:50;;;;;;;;;;:59;;;;;;;;;;;;22615:96;;;;;;;;;;;;;;;;;22509:90;;-1:-1:-1;22615:25:4;;:96;;-1:-1:-1;22652:59:4;-1:-1:-1;22615:96:4;;22652:59;22615:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;22768:41:4;;;;;;;:34;:41;;;;;;;;:54;;;;;;;;;;:63;;;;;;;;;;;;22727:104;;;;;;;;;;;;;;;;;22615:96;;-1:-1:-1;22727:29:4;;:104;;-1:-1:-1;22768:63:4;-1:-1:-1;22727:104:4;;22768:63;22727:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22848:40;22853:5;22860:8;22870:12;22884:3;22848:4;:40::i;:::-;22841:47;;;;;;;;;22225:670;;;;;;;;:::o;23965:632::-;-1:-1:-1;;;;;24224:34:4;;;24189:23;24224:34;;;:27;:34;;;;;;;;:47;;;;;;;;;;;;:56;;;;;;;;;;;;24334:37;;;:30;:37;;;;;:50;;;;;;;;:59;;;;;;;;24451:41;;;:34;:41;;;;;:54;;;;;;;;;:63;;;;;;;;;24524:66;24224:56;24334:59;24451:63;24563:6;24571;24579:10;24524:7;:66::i;:::-;23965:632;;;;;;;;;:::o;24603:554::-;-1:-1:-1;;;;;24820:31:4;;;24794:23;24820:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;;24918:34;;;:25;:34;;;;;:47;;;;;;;;25023:38;;;:29;:38;;;;;:51;;;;;;;;;25084:66;24820:44;24918:47;25023:51;25123:6;25131;25139:10;25084:7;:66::i;:::-;24603:554;;;;;;;;:::o;25163:444::-;-1:-1:-1;;;;;25348:28:4;;25322:23;25348:28;;;:15;:28;;;;;;;;25415:18;:31;;;;;25489:22;:35;;;;;25534:66;25348:28;25415:31;25489:35;25573:6;25581;25589:10;25534:7;:66::i;:::-;25163:444;;;;;;;:::o;23499:460::-;-1:-1:-1;;;;;23721:28:4;;23622:7;23721:28;;;:15;:28;;;;;;;;23696:53;;;;;;;;;;;;;;;;;23622:7;;;;23696:22;;:53;;23721:28;;23696:53;;23721:28;23696:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;23787:31:4;;;;;;:18;:31;;;;;;;;;23759:59;;;;;;;;;;;;;;;;;23696:53;;-1:-1:-1;23759:25:4;;:59;;-1:-1:-1;23787:31:4;-1:-1:-1;23759:59:4;;23787:31;23759:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;23860:35:4;;;;;;:22;:35;;;;;;;;;23828:67;;;;;;;;;;;;;;;;;23759:59;;-1:-1:-1;23828:29:4;;:67;;-1:-1:-1;23860:35:4;-1:-1:-1;23828:67:4;;23860:35;23828:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23912:40;23917:5;23924:8;23934:12;23948:3;23912:4;:40::i;:::-;23905:47;;;;;;;;;23499:460;;;;;:::o;874:176:0:-;932:7;963:5;;;986:6;;;;978:46;;;;;-1:-1:-1;;;978:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;38296:1120:4;38499:7;;;38575:24;:17;38597:1;38575:21;:24::i;:::-;38561:38;;38543:843;38620:24;:7;38632:11;38620;:24::i;:::-;38613:3;:31;38543:843;;38693:36;38733:83;38770:11;38799:3;38733:19;:83::i;:::-;38688:128;-1:-1:-1;;;38834:33:4;38830:80;;38887:8;;;38830:80;38928:32;38964:115;39008:7;39033:11;39062:3;38964:26;:115::i;:::-;39120:12;;;:71;;;-1:-1:-1;;;39120:71:4;;;;;;;;;38923:156;;-1:-1:-1;39093:24:4;;-1:-1:-1;;;;;;39120:12:4;;-1:-1:-1;39120:36:4;;:71;;;;;;;;;;;;;;:12;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39120:71:4;;-1:-1:-1;39205:14:4;39222:110;39290:28;39222:46;39120:71;39243:24;39222:20;:46::i;:::-;:50;;:110::i;:::-;39205:127;-1:-1:-1;39356:19:4;:7;39205:127;39356:11;:19::i;:::-;39346:29;;38543:843;;;;;38658:5;;38543:843;;;-1:-1:-1;39402:7:4;38296:1120;-1:-1:-1;;;;;;38296:1120:4:o;31706:365::-;-1:-1:-1;;;;;31808:20:4;;;31782:23;31808:20;;;:9;:20;;;;;;;;;;31864:8;:19;;;;;;31893:20;;;;:32;;;-1:-1:-1;;;;;;31893:32:4;;;;;;;31940:54;;31808:20;;;;;-1:-1:-1;;;;;31864:19:4;;;;31893:32;;31808:20;;;31940:54;;31782:23;31940:54;32004:60;32019:15;32036:9;32047:16;32004:14;:60::i;42671:1161::-;42736:7;;;42785:1016;-1:-1:-1;;;;;42809:24:4;;;;;;:17;:24;;;;;:31;42805:35;;42785:1016;;;-1:-1:-1;;;;;42883:24:4;;42861:19;42883:24;;;:17;:24;;;;;:27;;42908:1;;42883:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;42883:27:4;;-1:-1:-1;42924:867:4;-1:-1:-1;;;;;42981:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;:51;42977:55;;42924:867;;;-1:-1:-1;;;;;43126:31:4;;;43091:15;43126:31;;;:24;:31;;;;;;;;:44;;;;;;;;;;;:47;;43171:1;;43126:47;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43216:34:4;;;;;:27;:34;;;;;;:47;;;;;;;;;;43126;;;;43216:56;;;;;;;;:88;43126:47;;-1:-1:-1;43216:93:4;43191:586;;43354:13;43350:409;;-1:-1:-1;;;;;43406:34:4;;;;;;;:27;:34;;;;;;;;:47;;;;;;;;;;:56;;;;;;;;;;;:59;;:56;;:34;:59;;;;;;;;;;;;43395:70;;43350:409;;;-1:-1:-1;;;;;43523:34:4;;;;;;;:27;:34;;;;;;;;:47;;;;;;;;;;:56;;;;;;;;;;;:59;;43609:8;;43523:34;:59;;;;;;;;;;;;:94;43494:265;;;-1:-1:-1;;;;;43677:34:4;;;;;;;:27;:34;;;;;;;;:47;;;;;;;;;;:56;;;;;;;;;;;:59;;:56;;:34;:59;;;;;;;;;;;;43666:70;;43494:265;-1:-1:-1;43050:3:4;;42924:867;;;-1:-1:-1;;42842:3:4;;42785:1016;;;-1:-1:-1;43817:8:4;42671:1161;-1:-1:-1;;42671:1161:4:o;39422:527::-;39580:15;39598:125;39631:7;39652:5;39671:17;39702:11;39598:19;:125::i;:::-;39580:143;;39751:1;39741:7;:11;39733:34;;;;;-1:-1:-1;;;39733:34:4;;;;;;;;;;;;-1:-1:-1;;;39733:34:4;;;;;;;;;;;;;;;39809:24;:7;39821:11;39809;:24::i;:::-;-1:-1:-1;;;;;39777:29:4;;;;;;;:22;:29;;;;;;:56;;;;39843:12;;;:43;;-1:-1:-1;;;39843:43:4;;;;;;;;;;;;;;;;;:12;;;;;:27;;:43;;;;;39777:29;;39843:43;;;;;39777:29;39843:12;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39925:16;:14;:16::i;:::-;39901:41;;;;;;;;-1:-1:-1;;;;;39901:41:4;;;;;;;;;;;;;39422:527;;;;;:::o;37647:643::-;37838:15;37856:154;37891:7;37912:11;37937:7;37958:17;37989:11;37856:21;:154::i;:::-;37838:172;;38038:1;38028:7;:11;38020:34;;;;;-1:-1:-1;;;38020:34:4;;;;;;;;;;;;-1:-1:-1;;;38020:34:4;;;;;;;;;;;;;;;38124:46;:7;38149:11;38124;:46::i;:::-;-1:-1:-1;;;;;38064:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;;:106;;;;38180:12;;;:45;;-1:-1:-1;;;38180:45:4;;;;;;;;;;;;;;;;;:12;;;;;:27;;:45;;;;;38064:44;;38180:45;;;;;38064:44;38180:12;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38266:16;:14;:16::i;:::-;38240:43;;;;;;;;-1:-1:-1;;;;;38240:43:4;;;;;;;;;;;;;37647:643;;;;;;:::o;22901:592::-;-1:-1:-1;;;;;23177:31:4;;;23078:7;23177:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;23152:69;;;;;;;;;;;;;;;;;23078:7;;;;;;23152:22;;23177:44;23152:69;;;23177:44;23152:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;23274:34:4;;;;;;;:25;:34;;;;;;;;:47;;;;;;;;;;;;23237:84;;;;;;;;;;;;;;;;;23152:69;;-1:-1:-1;23237:25:4;;:84;;-1:-1:-1;23274:47:4;-1:-1:-1;23237:84:4;;23274:47;23237:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;23378:38:4;;;;;;;:29;:38;;;;;;;;:51;;;;;;;;;;;;23337:92;;;;;;;;;;;;;;;;;23237:84;;-1:-1:-1;23337:29:4;;:92;;-1:-1:-1;23378:51:4;-1:-1:-1;23337:92:4;;23378:51;23337:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23446:40;23451:5;23458:8;23468:12;23482:3;23446:4;:40::i;:::-;23439:47;;;;;;;;;22901:592;;;;;;;:::o;35539:342::-;35655:4;;35675:178;-1:-1:-1;;;;;35699:24:4;;;;;;:17;:24;;;;;:31;35695:35;;35675:178;;;-1:-1:-1;;;;;35755:24:4;;;;;;;:17;:24;;;;;:27;;:42;;;;35780:1;;35755:27;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35755:27:4;:42;35751:92;;;35824:4;35817:11;;;;;35751:92;35732:3;;35675:178;;;-1:-1:-1;35869:5:4;;35539:342;-1:-1:-1;;;35539:342:4:o;42340:325::-;42457:7;42480:13;42508:9;42503:134;42527:5;:12;42523:1;:16;42503:134;;;42576:7;-1:-1:-1;;;;;42564:19:4;:5;42570:1;42564:8;;;;;;;;;;;;;;-1:-1:-1;;;;;42564:19:4;;42560:67;;;42611:1;42603:9;;42560:67;42541:3;;42503:134;;;-1:-1:-1;42653:5:4;42340:325;-1:-1:-1;;;42340:325:4:o;42061:273::-;42174:12;;:19;;42191:1;42174:16;:19::i;:::-;42165:5;:28;42161:167;;;42209:5;:11;;;;;;;;;;;;;;;;-1:-1:-1;;42209:11:4;;;;;-1:-1:-1;;;;;;42209:11:4;;;;;;42161:167;;;42272:12;;42266:5;;42272:19;;42289:1;42272:16;:19::i;:::-;42266:26;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42266:26:4;42251:5;42257;42251:12;;;;;;;;;;;;;;;;:41;;;;;-1:-1:-1;;;;;42251:41:4;;;;;-1:-1:-1;;;;;42251:41:4;;;;;;42306:5;:11;;;;;;;;;;;;;;;;-1:-1:-1;;42306:11:4;;;;;-1:-1:-1;;;;;;42306:11:4;;;;;;42161:167;42061:273;;:::o;34204:190::-;34307:6;34348:12;-1:-1:-1;;;34337:9:4;;34329:32;;;;-1:-1:-1;;;34329:32:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34385:1:4;;34204:190;-1:-1:-1;;34204:190:4:o;30607:325::-;-1:-1:-1;;;;;30683:19:4;;30675:44;;;;;-1:-1:-1;;;30675:44:4;;;;;;;;;;;;-1:-1:-1;;;30675:44:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;30767:15:4;;;;;;:8;:15;;;;;;;;;;30747:102;;;;;;;;;;;-1:-1:-1;;;30747:102:4;;;;;;;;;-1:-1:-1;;;;;30767:15:4;;;;30796:6;;30747;:102::i;:::-;-1:-1:-1;;;;;30729:15:4;;;;;;:8;:15;;;;;:120;;-1:-1:-1;;;;;;30729:120:4;-1:-1:-1;;;;;30729:120:4;;;;;;;;;;30859:28;30729:15;30880:6;30859:13;:28::i;:::-;30902:23;;;-1:-1:-1;;;;;30902:23:4;;;;;;-1:-1:-1;;;;;30902:23:4;;;;;;;;;;;;;30607:325;;:::o;35093:440::-;35192:6;35214:20;35237:33;35262:7;35237:24;:33::i;:::-;35214:56;-1:-1:-1;;;;;;35299:18:4;;;:227;;35392:134;35425:13;:22;35439:7;-1:-1:-1;;;;;35425:22:4;-1:-1:-1;;;;;35425:22:4;;;;;;;;;;;;;35392:134;;;;;;;;;;;;;;;;;:7;:134::i;:::-;35356:13;:170;35299:227;;;35336:1;35280:246;35093:440;-1:-1:-1;;;35093:440:4:o;30938:281::-;-1:-1:-1;;;;;31044:15:4;;;;;;:8;:15;;;;;;;;;;31024:108;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31044:15:4;;;;31073:6;;31024;:108::i;:::-;-1:-1:-1;;;;;31006:15:4;;;;;;:8;:15;;;;;:126;;-1:-1:-1;;;;;;31006:126:4;-1:-1:-1;;;;;31006:126:4;;;;;;;;;;31142:32;31006:15;31167:6;31142:17;:32::i;:::-;31189:23;;;-1:-1:-1;;;;;31189:23:4;;;;;;-1:-1:-1;;;;;31189:23:4;;;;;;;;;;;;;30938:281;;:::o;34820:267::-;-1:-1:-1;;;;;34962:23:4;;34918:6;34962:23;;;:14;:23;;;;;;;;35014:16;:66;;35079:1;35014:66;;;-1:-1:-1;;;;;35033:25:4;;;;;;:16;:25;;;;;;;;:43;-1:-1:-1;;35059:16:4;;35033:43;;;;;;;;;-1:-1:-1;;;;;35033:43:4;34995:85;;;34820:267;;;:::o;36343:1298::-;36402:18;36423:16;:14;:16::i;:::-;36402:37;;36454:9;36449:1186;-1:-1:-1;;;;;36473:24:4;;;;;;:17;:24;;;;;:31;36469:35;;36449:1186;;;-1:-1:-1;;;;;36547:24:4;;36525:19;36547:24;;;:17;:24;;;;;:27;;36572:1;;36547:27;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36635:31:4;;;;;:24;:31;;;;;;36547:27;;;;36635:44;;;;;;;;;;36594:85;;;;;;;;;;;;;;;;;36547:27;;-1:-1:-1;36594:25:4;;:85;;36635:44;;36594:85;;;36635:44;36594:85;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36594:85:4;;;;;;;;;;;;;;;;;;;;;;;36698:9;36693:932;36717:8;:15;36713:1;:19;36693:932;;;36757:15;36775:8;36784:1;36775:11;;;;;;;;;;;;;;36757:29;;36807:14;36827:170;36880:5;36907:11;36940:7;36969:10;36827:31;:170::i;:::-;36804:193;;;;37015:228;37071:5;37098:11;37131:7;37160:6;37188:5;37215:10;37015:34;:228::i;:::-;37261:196;37312:7;37341:11;37374:6;37402:5;37429:10;37261:29;:196::i;:::-;37475:62;37498:11;37511:6;37519:5;37526:10;37475:22;:62::i;:::-;-1:-1:-1;;;;;37578:20:4;;;;;;:13;:20;;;;;;:32;;37603:6;37578:24;:32::i;:::-;-1:-1:-1;;;;;37555:20:4;;;;;;:13;:20;;;;;:55;-1:-1:-1;;36734:3:4;;36693:932;;;-1:-1:-1;;;36506:3:4;;36449:1186;;39955:1978;-1:-1:-1;;;;;40201:24:4;;40125:7;40201:24;;;:17;:24;;;;;;;;40169:56;;;;;;;;;;;;;;;;;40125:7;;40169:29;;:56;40201:24;40169:56;;;40201:24;40169:56;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40169:56:4;;;;;;;;;;;;;;;;;;;;;;;40253:11;40267:24;40289:1;40267:17;:21;;:24;;;;:::i;:::-;40253:38;;40235:1668;40312:24;:7;40324:11;40312;:24::i;:::-;40305:3;:31;40235:1668;;40385:9;40380:1513;40404:12;:19;40400:1;:23;40380:1513;;;40448:19;40470:12;40483:1;40470:15;;;;;;;;;;;;;;40448:37;;40569:36;40626:37;40646:11;40659:3;40626:19;:37::i;:::-;40503:160;-1:-1:-1;;;40685:33:4;40681:88;;40742:8;;;;40681:88;-1:-1:-1;;;;;40837:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;;;;40792:89;;;;;;;;;;;;;;;;;:25;;:89;;;40837:44;40792:89;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40792:89:4;;;;;;;;;;;;;;;;;;;;;;;40899:41;40963:9;40975:1;40963:13;;40958:586;40982:8;:15;40978:1;:19;40958:586;;;41026:15;41044:8;41053:1;41044:11;;;;;;;;;;;;;;41026:29;;41155:24;41204:183;41261:5;41292:11;41329:7;41362:3;41204:31;:183::i;:::-;41077:310;-1:-1:-1;41445:80:4;;-1:-1:-1;41445:33:4;;-1:-1:-1;41077:310:4;41445:62;:80::i;:::-;41409:116;-1:-1:-1;;;40999:3:4;;40958:586;;;-1:-1:-1;41588:12:4;;;:77;;;-1:-1:-1;;;41588:77:4;;;;;;;;;41561:24;;-1:-1:-1;;;;;41588:12:4;;;;:34;;:77;;;;;;;;;;;;;;:12;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41588:77:4;;-1:-1:-1;41683:14:4;41700:131;41802:28;41700:76;41588:77;41742:33;41700:41;:76::i;:131::-;41683:148;-1:-1:-1;41859:19:4;:7;41683:148;41859:11;:19::i;:::-;41849:29;;40380:1513;;;;;;;40425:3;;40380:1513;;;-1:-1:-1;40350:5:4;;40235:1668;;;-1:-1:-1;41919:7:4;;39955:1978;-1:-1:-1;;;;;;39955:1978:4:o;1746:187:0:-;1832:7;1867:12;1859:6;;;;1851:29;;;;-1:-1:-1;;;1851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1902:5:0;;;1746:187::o;3101:130::-;3159:7;3185:39;3189:1;3192;3185:39;;;;;;;;;;;;;;;;;:3;:39::i;25613:837:4:-;25908:12;;25820:7;;;;;;25934:8;25930:57;;25966:3;25971:1;25974;25958:18;;;;;;;;;25930:57;26006:5;26012:1;26006:8;;;;;;;;;;;;;;26000:3;:14;25996:63;;;26038:3;26043:1;26046;26030:18;;;;;;;;;25996:63;26068:17;26088:10;:3;26096:1;26088:7;:10::i;:::-;26068:30;;26108:20;26131:5;26137:9;26131:16;;;;;;;;;;;;;;26108:39;;26168:12;26161:3;:19;26157:229;;;26204:3;26209:8;26218:9;26209:19;;;;;;;;;;;;;;26230:12;26243:9;26230:23;;;;;;;;;;;;;;26196:58;;;;;;;;;;;26157:229;26281:12;26275:3;:18;26271:115;;;26317:3;26322:8;26331:9;26322:19;;;;;;;;;;;;;;26343:31;26367:6;26343:8;26352:9;26343:19;;;;;;;;;;;;;;:23;;:31;;;;:::i;:::-;26309:66;;;;;;;;;;;26271:115;26402:41;26408:5;26415:8;26425:12;26439:3;26402:5;:41::i;28080:2521::-;28318:12;;28364:6;28413:15;:31;;;28304:11;28485:63;28364:6;28413:31;28485:17;:63::i;:::-;28454:94;-1:-1:-1;28563:8:4;28559:2036;;28591:6;28587:250;;;28617:22;;;;;;;;-1:-1:-1;28617:22:4;;;;;;;;;;;;;28657:21;;;;;;;;;;;;;;;;;;28696:12;28714:32;28671:6;28725:20;28714:10;:32::i;:::-;28696:51;;;;;;;-1:-1:-1;28696:51:4;;;;;;;;;;;28587:250;;;28786:36;;;-1:-1:-1;;;28786:36:4;;;;;;;;;;;;-1:-1:-1;;;28786:36:4;;;;;;;;;;;;;;;28559:2036;;;28867:17;28887:10;:3;28895:1;28887:7;:10::i;:::-;28867:30;;28911:20;28934:5;28940:9;28934:16;;;;;;;;;;;;;;;;28911:39;;28964:23;28990:8;28999:9;28990:19;;;;;;;;;;;;;;;;28964:45;;29023:23;29049:12;29062:9;29049:23;;;;;;;;;;;;;;;;29023:49;;29087:17;29118:22;29175:10;29159:12;:26;29155:1430;;;29209:6;29205:532;;;29251:27;:15;29271:6;29251:19;:27::i;:::-;29239:39;-1:-1:-1;29317:99:4;29362:32;:6;29373:20;29362:10;:32::i;:::-;29317:15;;:19;:99::i;:::-;29300:116;;29205:532;;;29490:6;29471:15;:25;;29463:56;;;;;-1:-1:-1;;;29463:56:4;;;;;;;;;;;;-1:-1:-1;;;29463:56:4;;;;;;;;;;;;;;;29553:27;:15;29573:6;29553:19;:27::i;:::-;29541:39;-1:-1:-1;29619:99:4;29664:32;:6;29675:20;29664:10;:32::i;:::-;29619:15;;:19;:99::i;:::-;29602:116;;29205:532;29776:9;29754:8;29763:9;29754:19;;;;;;;;;;;;;;;:31;;;;29829:14;29803:12;29816:9;29803:23;;;;;;;;;;;;;;;;;:40;29155:1430;;;29886:6;29882:556;;;29928:27;:15;29948:6;29928:19;:27::i;:::-;29916:39;-1:-1:-1;29994:111:4;30051:32;:6;30062:20;30051:10;:32::i;:::-;29994:27;:15;30014:6;29994:19;:27::i;:111::-;29977:128;;29882:556;;;30179:6;30160:15;:25;;30152:56;;;;;-1:-1:-1;;;30152:56:4;;;;;;;;;;;;-1:-1:-1;;;30152:56:4;;;;;;;;;;;;;;;30242:27;:15;30262:6;30242:19;:27::i;:::-;30230:39;-1:-1:-1;30308:111:4;30365:32;:6;30376:20;30365:10;:32::i;:::-;30308:27;:15;30328:6;30308:19;:27::i;:::-;:31;;:111::i;:::-;30291:128;;29882:556;30455:5;30466:10;30455:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30495:8;30509:9;30495:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30537:12;30555:14;30537:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29155:1430;28559:2036;;;;;;;28080:2521;;;;;;;;;;:::o;2180:459:0:-;2238:7;2479:6;2475:45;;-1:-1:-1;2508:1:0;2501:8;;2475:45;2542:5;;;2546:1;2542;:5;:1;2565:5;;;;;:10;2557:56;;;;-1:-1:-1;;;2557:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32077:1152:4;32211:6;-1:-1:-1;;;;;32201:16:4;:6;-1:-1:-1;;;;;32201:16:4;;;:30;;;;;32230:1;32221:6;-1:-1:-1;;;;;32221:10:4;;32201:30;32197:1026;;;-1:-1:-1;;;;;32251:20:4;;;32247:477;;-1:-1:-1;;;;;32310:22:4;;32291:16;32310:22;;;:14;:22;;;;;;;;;32369:13;:99;;32467:1;32369:99;;;-1:-1:-1;;;;;32405:24:4;;;;;;:16;:24;;;;;;;;:39;-1:-1:-1;;32430:13:4;;32405:39;;;;;;;;;-1:-1:-1;;;;;32405:39:4;32369:99;32350:118;;32486:16;32505:129;32533:9;32564:6;32505:129;;;;;;;;;;;;;-1:-1:-1;;;32505:129:4;;;:6;:129::i;:::-;32486:148;;32652:57;32669:6;32677:9;32688;32699;32652:16;:57::i;:::-;32247:477;;;;-1:-1:-1;;;;;32741:20:4;;;32737:476;;-1:-1:-1;;;;;32800:22:4;;32781:16;32800:22;;;:14;:22;;;;;;;;;32859:13;:99;;32957:1;32859:99;;;-1:-1:-1;;;;;32895:24:4;;;;;;:16;:24;;;;;;;;:39;-1:-1:-1;;32920:13:4;;32895:39;;;;;;;;;-1:-1:-1;;;;;32895:39:4;32859:99;32840:118;;32976:16;32995:128;33023:9;33054:6;32995:128;;;;;;;;;;;;;-1:-1:-1;;;32995:128:4;;;:6;:128::i;:::-;32976:147;;33141:57;33158:6;33166:9;33177;33188;33141:16;:57::i;:::-;32737:476;;;32077:1152;;;:::o;34400:215::-;34517:6;34546:5;;;34577:12;-1:-1:-1;;;;;34569:6:4;;;;;;;;34561:29;;;;-1:-1:-1;;;34561:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34607:1:4;34400:215;-1:-1:-1;;;;34400:215:4:o;31225:281::-;-1:-1:-1;;;;;31302:17:4;;;31331:1;31302:17;;;:9;:17;;;;;;;31298:88;;-1:-1:-1;;;;;31349:17:4;;;;;;:9;:17;;;;;:26;;-1:-1:-1;;;;;;31349:26:4;;;;;;31298:88;-1:-1:-1;;;;;31421:17:4;;;31395:23;31421:17;;;:9;:17;;;;;;;;;;31448:51;;31421:17;31492:6;31448:14;:51::i;34621:193::-;34738:6;34769:1;-1:-1:-1;;;;;34764:6:4;:1;-1:-1:-1;;;;;34764:6:4;;;34772:12;34756:29;;;;;-1:-1:-1;;;34756:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31512:188;-1:-1:-1;;;;;31615:17:4;;;31589:23;31615:17;;;:9;:17;;;;;;;;;;31642:51;;31615:17;;31686:6;31642:14;:51::i;3713:272:0:-;3799:7;3833:12;3826:5;3818:28;;;;-1:-1:-1;;;3818:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3856:9;3872:1;3868;:5;;;;;;;3713:272;-1:-1:-1;;;;;3713:272:0:o;26456:1618:4:-;26664:7;26685;26706;26738:12;26753:1;26738:16;;26764:13;26780:19;26797:1;26780:5;:12;:16;;:19;;;;:::i;:::-;26764:35;-1:-1:-1;26809:14:4;26826:22;26846:1;26826:15;26764:35;26836:4;26826:9;:15::i;:22::-;26809:39;;26858:1049;26872:5;26865:4;:12;26858:1049;;;26914:3;26897:5;26903:6;26897:13;;;;;;;;;;;;;;:20;26893:959;;;26945:3;26950:8;26959:6;26950:16;;;;;;;;;;;;;;26968:12;26981:6;26968:20;;;;;;;26893:959;27030:3;27014:5;27020:6;27014:13;;;;;;;;;;;;;;:19;27010:842;;;27066:1;27057:6;:10;:40;;;;-1:-1:-1;27094:3:4;27071:5;27077:13;:6;27088:1;27077:10;:13::i;:::-;27071:20;;;;;;;;;;;;;;:26;27057:40;27053:255;;;27154:3;27183:8;27192:13;:6;27203:1;27192:10;:13::i;:::-;27183:23;;;;;;;;;;;;;;27232:35;27260:6;27232:8;27241:13;27252:1;27241:6;:10;;:13;;;;:::i;:::-;27232:23;;;;;;;27053:255;27329:11;27325:76;;27372:3;27377:1;27380;27364:18;;;;;;;;;;;27325:76;27426:13;:6;27437:1;27426:10;:13::i;:::-;27418:21;;27010:842;;;27480:3;27464:5;27470:6;27464:13;;;;;;;;;;;;;;:19;27460:392;;;27537:12;;:19;;27554:1;27537:16;:19::i;:::-;27528:6;:28;:58;;;;-1:-1:-1;27583:3:4;27560:5;27566:13;:6;27577:1;27566:10;:13::i;:::-;27560:20;;;;;;;;;;;;;;:26;27528:58;27503:297;;;27660:3;27689:8;27698:6;27689:16;;;;;;;;;;;;;;27731:28;27752:6;27731:8;27740:6;27731:16;;;;;;;27503:297;27824:13;:6;27835:1;27824:10;:13::i;:::-;27817:20;;27460:392;27874:22;27894:1;27874:15;:5;27884:4;27874:9;:15::i;:22::-;27865:31;;26858:1049;;;27937:3;27920:5;27926:6;27920:13;;;;;;;;;;;;;;:20;27916:152;;27964:3;27969:1;27972;27956:18;;;;;;;;;;;27916:152;28013:3;28018:8;28027:6;28018:16;;;;;;;33235:767;33392:18;33413:87;33434:12;33413:87;;;;;;;;;;;;;;;;;:7;:87::i;:::-;33392:108;;33542:1;33527:12;:16;;;:96;;;;-1:-1:-1;;;;;;33559:31:4;;;;;;:20;:31;;;;;;;;:64;-1:-1:-1;;33591:16:4;;33559:49;;;;;;;;;;:64;;;:49;;:64;33527:96;33510:419;;;-1:-1:-1;;;;;33648:27:4;;;;;;:16;:27;;;;;;;;-1:-1:-1;;33676:16:4;;33648:45;;;;;;;;;:56;;-1:-1:-1;;;;;;33648:56:4;-1:-1:-1;;;;;33648:56:4;;;;;33510:419;;;-1:-1:-1;;;;;33735:31:4;;;;;;:20;:31;;;;;;;;:45;;;;;;;;;;;;;:59;;-1:-1:-1;;33735:59:4;;;;;;;;;;33808:27;;;:16;:27;;;;;:41;;;;;;;;;:52;;-1:-1:-1;;;;;;33808:52:4;-1:-1:-1;;;;;33808:52:4;;;;;33874:25;;;:14;:25;;;;;;:44;;;;;-1:-1:-1;33902:16:4;;33874:44;;;;;;;;;33510:419;33944:51;;;-1:-1:-1;;;;;33944:51:4;;;;;;;;;;;;;-1:-1:-1;;;;;33944:51:4;;;;;;;;;;;33235:767;;;;;:::o;34008:190::-;34111:6;34152:12;34145:5;34141:9;;34133:32;;;;-1:-1:-1;;;34133:32:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://98179f4fe2fcb854dc6a1d380a76130dff5414b0d11407aa3f739a2b69783f36
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.