Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.551608397393162182 ETH
Eth Value
$1,387.24 (@ $2,514.91/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 803 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Enroll Referrer | 17801336 | 453 days ago | IN | 0 ETH | 0.00232775 | ||||
Buy Entry ETH | 17801208 | 453 days ago | IN | 0.003 ETH | 0.00435819 | ||||
Buy Entry Dust | 16728970 | 604 days ago | IN | 0.0025 ETH | 0.00507671 | ||||
Buy Entry Dust | 16723546 | 605 days ago | IN | 0.0025 ETH | 0.00252688 | ||||
Buy Entry Dust | 16723543 | 605 days ago | IN | 0.0025 ETH | 0.00319457 | ||||
Buy Entry ETH | 16717081 | 606 days ago | IN | 0.004 ETH | 0.00267436 | ||||
Buy Entry Dust | 16717064 | 606 days ago | IN | 0.0025 ETH | 0.00326717 | ||||
Buy Entry Dust | 16717058 | 606 days ago | IN | 0.0025 ETH | 0.00359889 | ||||
Buy Entry Dust | 16715466 | 606 days ago | IN | 0.0025 ETH | 0.00345766 | ||||
Buy Entry Dust | 16715461 | 606 days ago | IN | 0.0025 ETH | 0.00400686 | ||||
Buy Entry Dust | 16713315 | 606 days ago | IN | 0.0025 ETH | 0.00317704 | ||||
Buy Entry Dust | 16713307 | 606 days ago | IN | 0.0025 ETH | 0.00296387 | ||||
Buy Entry Dust | 16712357 | 606 days ago | IN | 0.0025 ETH | 0.00262071 | ||||
Buy Entry Dust | 16712350 | 606 days ago | IN | 0.0025 ETH | 0.00304858 | ||||
Buy Entry Dust | 16709183 | 607 days ago | IN | 0.0025 ETH | 0.00466549 | ||||
Buy Entry Dust | 16709157 | 607 days ago | IN | 0.0025 ETH | 0.00359555 | ||||
Buy Entry Dust | 16709084 | 607 days ago | IN | 0.0025 ETH | 0.00272321 | ||||
Buy Entry Dust | 16708569 | 607 days ago | IN | 0.0025 ETH | 0.00244305 | ||||
Buy Entry Dust | 16708566 | 607 days ago | IN | 0.0025 ETH | 0.00268025 | ||||
Buy Entry Dust | 16708565 | 607 days ago | IN | 0.0025 ETH | 0.00276076 | ||||
Buy Entry Dust | 16708562 | 607 days ago | IN | 0.0025 ETH | 0.00316772 | ||||
Buy Entry Dust | 16707201 | 607 days ago | IN | 0.0025 ETH | 0.00314946 | ||||
Buy Entry Dust | 16707197 | 607 days ago | IN | 0.0025 ETH | 0.00409197 | ||||
Buy Entry Dust | 16707189 | 607 days ago | IN | 0.0025 ETH | 0.00367006 | ||||
Buy Entry Dust | 16707181 | 607 days ago | IN | 0.0025 ETH | 0.00402015 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17801208 | 453 days ago | 0.003 ETH | ||||
16729779 | 604 days ago | 0.005 ETH | ||||
16729779 | 604 days ago | 0.00743978 ETH | ||||
16728970 | 604 days ago | 0.0025 ETH | ||||
16723546 | 605 days ago | 0.0025 ETH | ||||
16723543 | 605 days ago | 0.0025 ETH | ||||
16717081 | 606 days ago | 0.004 ETH | ||||
16717064 | 606 days ago | 0.0025 ETH | ||||
16717058 | 606 days ago | 0.0025 ETH | ||||
16715466 | 606 days ago | 0.0025 ETH | ||||
16715461 | 606 days ago | 0.0025 ETH | ||||
16714347 | 606 days ago | 0.005 ETH | ||||
16714347 | 606 days ago | 0.00930919 ETH | ||||
16713315 | 606 days ago | 0.0025 ETH | ||||
16713307 | 606 days ago | 0.0025 ETH | ||||
16712357 | 606 days ago | 0.0025 ETH | ||||
16712350 | 606 days ago | 0.0025 ETH | ||||
16709305 | 607 days ago | 0.005 ETH | ||||
16709305 | 607 days ago | 0.00635741 ETH | ||||
16709183 | 607 days ago | 0.0025 ETH | ||||
16709157 | 607 days ago | 0.0025 ETH | ||||
16709084 | 607 days ago | 0.0025 ETH | ||||
16708569 | 607 days ago | 0.0025 ETH | ||||
16708566 | 607 days ago | 0.0025 ETH | ||||
16708565 | 607 days ago | 0.0025 ETH |
Loading...
Loading
Contract Name:
SweepersCompetitionVault
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol'; import '@openzeppelin/contracts/token/ERC1155/IERC1155.sol'; import '@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol'; import '@openzeppelin/contracts/utils/math/Math.sol'; import './external/gelato/OpsReady.sol'; import './interfaces/IDust.sol'; import './interfaces/IRandomizer.sol'; contract SweepersCompetitionVault is ReentrancyGuard, Ownable, IERC721Receiver, IERC1155Receiver, OpsReady { IDust public DUST; IRandomizer public randomizer; address payable public sweepersTreasury; address payable public sweepersBuyer; address payable public legacyTreasury; address payable public Dev; address payable public VRF; uint256 public DevFee = 0.0025 ether; uint256 public VRFCost = .005 ether; uint256 public SettlementCost = .02 ether; uint256 public gasLimit = 60 gwei; uint16 public sweepersCut = 8500; uint16 public legacyCut = 500; uint16 public devCut = 1000; // The competition info struct Comp { // The Token ID for the listed NFT uint256 tokenId; // The Contract Address for the listed NFT address contractAddress; // The NFT Contract Type bool is1155; // The entry limit per wallet uint32 entryLimit; // The number of entries received uint32 numberEntries; // The raffle entry method restrictions bool onlyDust; bool onlyEth; // The statuses of the competition bool blind; bool revealed; bool settled; bool failed; string hiddenImage; string openseaSlug; } Comp[] public comps; struct CompETHPrices { uint8 id; uint32 numEntries; uint256 price; } struct CompDustPrices { uint8 id; uint32 numEntries; uint256 price; } mapping(uint256 => CompETHPrices[5]) public ethPrices; mapping(uint256 => CompDustPrices[5]) public dustPrices; struct CompTargetParams { uint256 minimumETH; uint256 maximumETH; uint32 startTime; uint32 endTime; uint32 entryCap; bool useETHParams; bool useTimeParams; bool useEntryParams; } mapping(uint256 => CompTargetParams) public targetParams; struct CompDistributions { uint256 treasury; uint256 legacy; uint256 dev; } mapping(uint256 => CompDistributions) public distributions; mapping(uint256 => uint256) public cancelDate; uint256 public refundPeriod = 30 days; mapping(uint256 => uint256) public ethCollected; mapping(uint256 => uint256) public dustCollected; mapping(uint256 => uint256) public ethDistributed; struct Entries { address entrant; uint32 entryLength; } mapping(uint256 => Entries[]) public entries; struct UserEntries { uint32 numberEntries; uint256 ethSpent; uint256 dustSpent; bool claimed; } mapping(bytes32 => UserEntries) public userData; mapping(uint256 => bool) public winnerRequested; mapping(uint256 => address) public compWinner; mapping(uint256 => bytes32) public pickWinnerTaskId; struct Referrer { bool isValidReferrer; uint256 referralCount; uint256 referralCredits; address referrerAddress; } mapping(bytes32 => Referrer) public referrer; mapping(address => bytes32) public referrerId; mapping(bytes32 => mapping(address => uint256)) public referralExpiration; mapping(address => bool) public hasBonused; uint256 public earningRate = 10; uint32 public referreeBonus = 1; uint256 public referralPeriod = 30 days; modifier onlySweepersTreasury() { require(msg.sender == sweepersTreasury || msg.sender == owner() || msg.sender == sweepersBuyer, "Sender not allowed"); _; } modifier onlyRandomizer() { require(msg.sender == address(randomizer), "Sender not allowed"); _; } event CompCreated(uint256 indexed CompId, uint32 startTime, uint32 endTime, address indexed NFTContract, uint256 indexed TokenId, uint32 entryLimit, uint32 entryCap, bool BlindComp); event CompSettled(uint256 indexed CompId, address indexed NFTProjectAddress, uint256 tokenID, address winner, uint256 winningEntryID); event CompFailed(uint256 indexed CompId, address indexed NFTProjectAddress, uint256 tokenID); event CompCanceled(uint256 indexed CompId, address indexed NFTProjectAddress, uint256 tokenID); event EntryReceived(uint256 indexed CompId, address sender, uint256 entriesBought, uint256 currentEntryLength, uint256 compPriceId, bool withETH, uint256 timeStamp); event RefundClaimed(uint256 indexed CompId, uint256 ethRefunded, uint256 dustRefunded, address Entrant); event Received(address indexed From, uint256 Amount); constructor( address _dust, address payable _ops, IRandomizer _randomizer, address payable _vrf, address payable _legacy, address payable _treasury, address payable _buyer ) OpsReady(_ops) { DUST = IDust(_dust); Dev = payable(msg.sender); randomizer = _randomizer; VRF = _vrf; legacyTreasury = _legacy; sweepersTreasury = _treasury; sweepersBuyer = _buyer; } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } function onERC1155Received( address, address, uint256, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC1155Receiver.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] calldata, uint256[] calldata, bytes calldata ) external pure returns (bytes4) { return IERC1155Receiver.onERC1155BatchReceived.selector; } function supportsInterface(bytes4 interfaceID) external pure returns (bool) { return interfaceID == this.supportsInterface.selector; } function setDust(address _dust) external onlyOwner { DUST = IDust(_dust); } function setDev(address _dev, uint256 _devFee) external onlyOwner { Dev = payable(_dev); DevFee = _devFee; } function setDistribution(uint16 _sweepersCut, uint16 _legacyCut, uint16 _devCut) external onlyOwner { require(_sweepersCut + _legacyCut + _devCut == 10000); sweepersCut = _sweepersCut; legacyCut = _legacyCut; devCut = _devCut; } function setRefundPeriod(uint256 _period) external onlyOwner { refundPeriod = _period; } function setReferralParams(uint256 _rate, uint16 _bonus, uint256 _period) external onlyOwner { earningRate = _rate; referreeBonus = _bonus; referralPeriod = _period; } function updateSweepersTreasury(address payable _treasury) external onlyOwner { sweepersTreasury = _treasury; } function updateSweepersBuyer(address payable _buyer) external onlyOwner { sweepersBuyer = _buyer; } function updateLegacyTreasury(address payable _treasury) external onlyOwner { legacyTreasury = _treasury; } function updateSettlementParams( IRandomizer _randomizer, address payable _vrf, uint256 _vrfCost, uint256 _settlementCost, uint256 _gasLimit ) external onlyOwner { randomizer = _randomizer; VRF = _vrf; VRFCost = _vrfCost; SettlementCost = _settlementCost; gasLimit = _gasLimit; } function createComp( address _nftContract, uint256 _tokenId, bool _is1155, bool _blind, uint32 _startTime, uint32 _endTime, uint16 _entryCap, uint16 _entryLimit, uint256 _minETH, uint256 _maxETH, CompDustPrices[] calldata _dustPrices, CompETHPrices[] calldata _ethPrices, bool _onlyDust, bool _onlyEth, bool _ethParams, bool _timeParams, bool _entryParams, string calldata _hiddenImage, string calldata _slug ) external payable onlySweepersTreasury returns (uint256) { require(msg.value == VRFCost + SettlementCost); require(_ethParams || _timeParams || _entryParams); require(_blind ? _tokenId == 0 : _tokenId != 0); Comp memory _comp = Comp({ tokenId : _tokenId, contractAddress : _nftContract, is1155 : _is1155, entryLimit : _entryLimit, numberEntries : 0, onlyDust : _onlyDust, onlyEth : _onlyEth, blind : _blind, revealed : _blind ? false : true, settled : false, failed : false, hiddenImage : _blind ? _hiddenImage : 'null', openseaSlug : _slug }); comps.push(_comp); if(!_onlyDust) { require(_ethPrices.length > 0, "No prices"); for (uint256 i = 0; i < _ethPrices.length; i++) { require(_ethPrices[i].numEntries > 0, "numEntries is 0"); CompETHPrices memory p = CompETHPrices({ id: uint8(i), numEntries: _ethPrices[i].numEntries, price: _ethPrices[i].price }); ethPrices[comps.length - 1][i] = p; } } if(!_onlyEth) { require(_dustPrices.length > 0, "No prices"); for (uint256 i = 0; i < _dustPrices.length; i++) { require(_dustPrices[i].numEntries > 0, "numEntries is 0"); CompDustPrices memory d = CompDustPrices({ id: uint8(i), numEntries: _dustPrices[i].numEntries, price: _dustPrices[i].price }); dustPrices[comps.length - 1][i] = d; } } targetParams[comps.length - 1] = CompTargetParams({ minimumETH : _minETH, maximumETH : _maxETH, startTime : _startTime, endTime : _endTime, entryCap : _entryCap, useETHParams : _ethParams, useTimeParams : _timeParams, useEntryParams : _entryParams }); if(!_blind) { if(_is1155) { IERC1155(_nftContract).safeTransferFrom(msg.sender, address(this), _tokenId, 1, ""); } else { IERC721(_nftContract).safeTransferFrom(msg.sender, address(this), _tokenId); } } startPickWinnerTask(comps.length - 1); emit CompCreated(comps.length - 1, _startTime, _endTime, _nftContract, _tokenId, _entryLimit, _entryCap, _blind); return comps.length - 1; } function updateBlindComp(uint32 _id, uint256 _tokenId) external onlySweepersTreasury { require(comps[_id].tokenId == 0, "Comp already updated"); require(_tokenId != 0); comps[_id].tokenId = _tokenId; if(comps[_id].is1155) { IERC1155(comps[_id].contractAddress).safeTransferFrom(msg.sender, address(this), _tokenId, 1, ""); } else { IERC721(comps[_id].contractAddress).safeTransferFrom(msg.sender, address(this), _tokenId); } } function updateBlindComp1155(uint256 _id, bool _is1155) external onlySweepersTreasury { comps[_id].is1155 = _is1155; } function updateBlindImage(uint256 _id, string calldata _hiddenImage) external onlySweepersTreasury { comps[_id].hiddenImage = _hiddenImage; } function updateOpenseaSlug(uint256 _id, string calldata _slug) external onlySweepersTreasury { comps[_id].openseaSlug = _slug; } function updateCompEndTime(uint256 _id, uint32 _endTime) external onlySweepersTreasury { targetParams[_id].endTime = _endTime; } function emergencyCancelComp(uint32 _id) external payable onlySweepersTreasury { require(compStatus(_id) == 1 || compStatus(_id) == 0, 'Can only cancel active comps'); require(msg.value == ethDistributed[_id], 'Must send back enough ETH to cover refunds'); _cancelComp(_id); } function _cancelComp(uint32 _id) private { comps[_id].failed = true; cancelDate[_id] = block.timestamp; stopTask(pickWinnerTaskId[_id]); if (comps[_id].tokenId != 0) { if(comps[_id].is1155) { IERC1155(comps[_id].contractAddress).safeTransferFrom(address(this), Dev, comps[_id].tokenId, 1, ""); } else { IERC721(comps[_id].contractAddress).safeTransferFrom(address(this), Dev, comps[_id].tokenId); } } delete distributions[_id]; delete ethDistributed[_id]; emit CompCanceled(_id, address(comps[_id].contractAddress), comps[_id].tokenId); } function claimRefund(uint256 _id) external nonReentrant { require(compStatus(_id) == 4, "not failed"); require( block.timestamp <= cancelDate[_id] + refundPeriod, "claim time expired" ); UserEntries storage claimData = userData[ keccak256(abi.encode(msg.sender, _id)) ]; require(claimData.claimed == false, "already refunded"); ethCollected[_id] -= claimData.ethSpent; dustCollected[_id] -= claimData.dustSpent; claimData.claimed = true; if(claimData.ethSpent > 0) { (bool sentETH, ) = msg.sender.call{value: claimData.ethSpent}(""); require(sentETH, "Fail send refund"); } if(claimData.dustSpent > 0) { DUST.mint(msg.sender, claimData.dustSpent); } emit RefundClaimed(_id, claimData.ethSpent, claimData.dustSpent, msg.sender); } function emergencyRescueNFT(address _nft, uint256 _tokenId, bool _is1155) external onlySweepersTreasury { if(_is1155) { IERC1155(_nft).safeTransferFrom(address(this), Dev, _tokenId, 1, ""); } else { IERC721(_nft).safeTransferFrom(address(this), Dev, _tokenId); } } function emergencyRescueETH(uint256 amount) external onlySweepersTreasury { (bool sent,) = Dev.call{value: amount}(""); require(sent); } /** * @notice Buy a competition entry using DUST. */ function buyEntryDust(uint256 _id, uint256 _priceId, bytes32 _referrer, uint16 _redeemEntries) external payable nonReentrant { require(compStatus(_id) == 1, 'Comp is not Active'); require(!comps[_id].onlyEth, 'Comp is restricted to only ETH'); CompDustPrices memory priceStruct = getDustPriceStructForId(_id, _priceId); require(msg.value == DevFee, 'Fee not covered'); bytes32 hash = keccak256(abi.encode(msg.sender, _id)); require(userData[hash].numberEntries + priceStruct.numEntries + _redeemEntries <= comps[_id].entryLimit, "Bought too many entries"); if(targetParams[_id].useEntryParams) require(comps[_id].numberEntries + priceStruct.numEntries + _redeemEntries <= targetParams[_id].entryCap, "Not enough entries remaining"); uint32 _numEntries = priceStruct.numEntries; if(_redeemEntries > 0) { bytes32 _ref = referrerId[msg.sender]; require(referrer[_ref].referralCredits >= _redeemEntries * 1000, 'Not enough credits available'); referrer[_ref].referralCredits -= (_redeemEntries * 1000); _numEntries += _redeemEntries; } if(referrer[_referrer].isValidReferrer) { if(referralExpiration[_referrer][msg.sender] == 0) { referralExpiration[_referrer][msg.sender] = block.timestamp + referralPeriod; } if(block.timestamp < referralExpiration[_referrer][msg.sender]) { referrer[_referrer].referralCount += priceStruct.numEntries; referrer[_referrer].referralCredits += (priceStruct.numEntries) * 1000 / earningRate; if(!hasBonused[msg.sender]) { _numEntries += referreeBonus; hasBonused[msg.sender] = true; } } } Entries memory entryBought = Entries({ entrant: msg.sender, entryLength: comps[_id].numberEntries + _numEntries }); entries[_id].push(entryBought); dustCollected[_id] += priceStruct.price; comps[_id].numberEntries += _numEntries; userData[hash].numberEntries += _numEntries; userData[hash].dustSpent += priceStruct.price; DUST.burnFrom(msg.sender, priceStruct.price); (bool sent,) = Dev.call{value: DevFee}(""); require(sent); emit EntryReceived( _id, msg.sender, priceStruct.numEntries, _numEntries, _priceId, false, block.timestamp ); } /** * @notice Buy a competition entry using ETH. */ function buyEntryETH(uint32 _id, uint256 _priceId, bytes32 _referrer, uint16 _redeemEntries) external payable nonReentrant { require(compStatus(_id) == 1, 'Comp is not Active'); require(!comps[_id].onlyDust, 'Comp is restricted to only DUST'); CompETHPrices memory priceStruct = getEthPriceStructForId(_id, _priceId); require(msg.value == priceStruct.price, 'msg.value must be equal to the price'); bytes32 hash = keccak256(abi.encode(msg.sender, _id)); require(userData[hash].numberEntries + priceStruct.numEntries + _redeemEntries <= comps[_id].entryLimit, "Bought too many entries"); if(targetParams[_id].useEntryParams) require(comps[_id].numberEntries + priceStruct.numEntries + _redeemEntries <= targetParams[_id].entryCap, "Not enough entries remaining"); uint32 _numEntries = priceStruct.numEntries; if(_redeemEntries > 0) { bytes32 _ref = referrerId[msg.sender]; require(referrer[_ref].referralCredits >= _redeemEntries * 1000, 'Not enough credits available'); referrer[_ref].referralCredits -= (_redeemEntries * 1000); _numEntries += _redeemEntries; } if(referrer[_referrer].isValidReferrer) { if(referralExpiration[_referrer][msg.sender] == 0) { referralExpiration[_referrer][msg.sender] = block.timestamp + referralPeriod; } if(block.timestamp < referralExpiration[_referrer][msg.sender]) { referrer[_referrer].referralCount += priceStruct.numEntries; referrer[_referrer].referralCredits += (priceStruct.numEntries) * 1000 / earningRate; if(!hasBonused[msg.sender]) { _numEntries += referreeBonus; hasBonused[msg.sender] = true; } } } // add the entry to the entries array Entries memory entryBought = Entries({ entrant: msg.sender, entryLength: comps[_id].numberEntries + _numEntries }); entries[_id].push(entryBought); comps[_id].numberEntries += _numEntries; userData[hash].numberEntries += _numEntries; userData[hash].ethSpent += priceStruct.price; if(targetParams[_id].useETHParams) { if(ethCollected[_id] < targetParams[_id].minimumETH) { (bool sent,) = sweepersBuyer.call{value: msg.value}(""); require(sent); ethDistributed[_id] += msg.value * (10000 - sweepersCut) / 10000; } else if(ethDistributed[_id] > 0) { uint256 adjuster = msg.value * (sweepersCut) / 10000; if(ethDistributed[_id] > adjuster) { ethDistributed[_id] -= adjuster; } else { distributions[_id].treasury += adjuster - ethDistributed[_id]; ethDistributed[_id] = 0; } } else { distributions[_id].treasury += msg.value * sweepersCut / 10000; } } else { distributions[_id].treasury += msg.value * sweepersCut / 10000; } distributions[_id].legacy += msg.value * legacyCut / 10000; distributions[_id].dev += msg.value * devCut / 10000; ethCollected[_id] += priceStruct.price; emit EntryReceived( _id, msg.sender, _numEntries, comps[_id].numberEntries, _priceId, true, block.timestamp ); } function enrollReferrer(string calldata referralCode) external nonReentrant { require(referrerId[msg.sender] == 0, 'User already enrolled'); bytes32 bytesCode = bytes32(bytes(referralCode)); require(referrer[bytesCode].referralCount == 0 && !referrer[bytesCode].isValidReferrer && bytesCode != 0, 'referralCode already exists'); referrerId[msg.sender] = bytesCode; referrer[bytesCode].isValidReferrer = true; referrer[bytesCode].referrerAddress = msg.sender; } function removeReferrer(bytes32 _referrerId, address _referrer) external onlySweepersTreasury { delete referrer[_referrerId]; delete referrerId[_referrer]; } function suspendReferrer(bytes32 _referrer) external onlySweepersTreasury { referrer[_referrer].isValidReferrer = false; } function getEthPriceStructForId(uint256 _idRaffle, uint256 _id) internal view returns (CompETHPrices memory) { if (ethPrices[_idRaffle][_id].id == _id) { return ethPrices[_idRaffle][_id]; } return CompETHPrices({id: 0, numEntries: 0, price: 0}); } function getDustPriceStructForId(uint256 _idRaffle, uint256 _id) internal view returns (CompDustPrices memory) { if (dustPrices[_idRaffle][_id].id == _id) { return dustPrices[_idRaffle][_id]; } return CompDustPrices({id: 0, numEntries: 0, price: 0}); } function startPickWinnerTask(uint256 _id) internal { pickWinnerTaskId[_id] = IOps(ops).createTaskNoPrepayment( address(this), this._pickCompWinner.selector, address(this), abi.encodeWithSelector(this.canPickChecker.selector, _id), ETH ); } function canPickChecker(uint256 _id) external view returns (bool canExec, bytes memory execPayload) { canExec = (compStatus(_id) == 2 && !winnerRequested[_id] && comps[_id].tokenId != 0); execPayload = abi.encodeWithSelector( this._pickCompWinner.selector, _id ); } function pickCompWinner(uint256 _id) public { require(compStatus(_id) == 2, 'cant be settled now'); require(comps[_id].tokenId != 0, 'update comp tokenID'); if(comps[_id].numberEntries > 0) { randomizer.requestRandomWords(_id); winnerRequested[_id] = true; (bool sent,) = VRF.call{value: VRFCost}(""); require(sent); } else { winnerRequested[_id] = true; _closeComp(_id); } } function _pickCompWinner(uint256 _id) external onlyOps { require(tx.gasprice < gasLimit, 'cant be settled now'); (uint256 fee, address feeToken) = IOps(ops).getFeeDetails(); _transfer(fee, feeToken); pickCompWinner(_id); stopTask(pickWinnerTaskId[_id]); } function earlyCloseConp(uint256 _id) external onlySweepersTreasury { require(targetParams[_id].useETHParams, 'Can only close with ETH params'); require(ethCollected[_id] >= targetParams[_id].minimumETH && ethDistributed[_id] == 0, 'Can not close with current funding'); require(comps[_id].tokenId != 0, 'Update comp tokenID'); randomizer.requestRandomWords(_id); winnerRequested[_id] = true; (bool sent,) = VRF.call{value: VRFCost}(""); require(sent); } /** * @notice Settle a competition, finalizing the bid and transferring the NFT to the winner. * @dev If there are no entries, the competition is failed and can be relisted. */ function settleComp(uint256 _id) external { uint256 seed = randomizer.getRandomWord(); _settleComp(_id, seed); } function autoSettleComp(uint256 _id, uint256 seed) external onlyRandomizer { _settleComp(_id, seed); } function _settleComp(uint256 _id, uint256 seed) internal { require(compStatus(_id) == 6, 'cant be settled now'); require(comps[_id].numberEntries > 0, 'comp has no entries'); comps[_id].settled = true; uint256 entryIndex = seed % comps[_id].numberEntries + 1; uint256 winnerIndex = findWinner(entries[_id], entryIndex); address _compWinner = entries[_id][winnerIndex].entrant; compWinner[_id] = _compWinner; if(comps[_id].is1155) { IERC1155(comps[_id].contractAddress).safeTransferFrom(address(this), _compWinner, comps[_id].tokenId, 1, ""); } else { IERC721(comps[_id].contractAddress).safeTransferFrom(address(this), _compWinner, comps[_id].tokenId); } if(comps[_id].blind) { comps[_id].revealed = true; } if(distributions[_id].treasury > 0) { (bool sent1,) = sweepersTreasury.call{value: distributions[_id].treasury}(""); require(sent1); } if(distributions[_id].legacy > 0) { (bool sent2,) = legacyTreasury.call{value: distributions[_id].legacy}(""); require(sent2); } if(distributions[_id].dev > 0) { (bool sent3,) = Dev.call{value: distributions[_id].dev}(""); require(sent3); } emit CompSettled(_id, address(comps[_id].contractAddress), comps[_id].tokenId, _compWinner, entryIndex); } function _closeComp(uint256 _id) internal { require(compStatus(_id) == 2, 'cant be settled now'); require(comps[_id].numberEntries == 0, 'comp has entries'); comps[_id].settled = true; uint256 entryIndex; address _compWinner; comps[_id].failed = true; if (comps[_id].tokenId != 0) { if(comps[_id].is1155) { IERC1155(comps[_id].contractAddress).safeTransferFrom(address(this), Dev, comps[_id].tokenId, 1, ""); } else { IERC721(comps[_id].contractAddress).safeTransferFrom(address(this), Dev, comps[_id].tokenId); } } emit CompFailed(_id, address(comps[_id].contractAddress), comps[_id].tokenId); emit CompSettled(_id, address(comps[_id].contractAddress), comps[_id].tokenId, _compWinner, entryIndex); } function findWinner(Entries[] storage _array, uint256 entryIndex) internal pure returns (uint256) { Entries[] memory array = _array; if (array.length == 0) { return 0; } uint256 low = 0; uint256 high = array.length; while (low < high) { uint256 mid = Math.average(low, high); // Note that mid will always be strictly less than high (i.e. it will be a valid array index) // because Math.average rounds down (it does integer division with truncation). if (array[mid].entryLength > entryIndex) { high = mid; } else { low = mid + 1; } } // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. if (low > 0 && array[low - 1].entryLength == entryIndex) { return low - 1; } else { return low; } } function compStatus(uint256 _id) public view returns (uint8) { if (winnerRequested[_id] && !comps[_id].settled) { return 6; // AWAITING SETTLEMENT - Winner selected and awaiting settlement } if (comps[_id].failed) { return 4; // FAILED - not sold by end time } if (comps[_id].settled) { return 3; // SUCCESS - Entrant won } if(targetParams[_id].useTimeParams) { if (block.timestamp >= targetParams[_id].endTime && comps[_id].tokenId == 0) { return 5; // AWAITING TOKENID - Comp finished } if (block.timestamp >= targetParams[_id].endTime || comps[_id].numberEntries == targetParams[_id].entryCap) { return 2; // AWAITING WINNER SELECTION - Comp finished } if (block.timestamp <= targetParams[_id].endTime && block.timestamp >= targetParams[_id].startTime) { return 1; // ACTIVE - entries enabled } } else if(targetParams[_id].useETHParams) { if (ethCollected[_id] >= targetParams[_id].maximumETH && comps[_id].tokenId == 0) { return 5; // AWAITING TOKENID - Comp finished } if (ethCollected[_id] >= targetParams[_id].maximumETH) { return 2; // AWAITING WINNER SELECTION - Comp finished } if (ethCollected[_id] < targetParams[_id].maximumETH && block.timestamp >= targetParams[_id].startTime) { return 1; // ACTIVE - entries enabled } } else if(targetParams[_id].useEntryParams) { if (comps[_id].numberEntries >= targetParams[_id].entryCap && comps[_id].tokenId == 0) { return 5; // AWAITING TOKENID - Comp finished } if (comps[_id].numberEntries >= targetParams[_id].entryCap) { return 2; // AWAITING WINNER SELECTION - Comp finished } if (comps[_id].numberEntries < targetParams[_id].entryCap && block.timestamp >= targetParams[_id].startTime) { return 1; // ACTIVE - entries enabled } } return 0; // QUEUED - awaiting start time } function getEntries(uint256 _id) external view returns (Entries[] memory) { return entries[_id]; } function getUserData(uint256 _id, address _entrant) external view returns (UserEntries memory) { return userData[keccak256(abi.encode(_entrant, _id))]; } function getCompsLength() external view returns (uint256) { return comps.length; } function getReferrerData(address _referrer) external view returns(bool isReferrer, bytes32 code, uint256 numReferrals, uint256 numCredits) { code = referrerId[_referrer]; if(code == 0) { return (false, 0x0, 0, 0); } else { isReferrer = referrer[code].isValidReferrer; numReferrals = referrer[code].referralCount; numCredits = referrer[code].referralCredits; } } function stopTask(bytes32 taskId) internal { IOps(ops).cancelTask(taskId); } function manualStopTask(bytes32 taskId) external onlySweepersTreasury { stopTask(taskId); } receive() external payable { emit Received(msg.sender, msg.value); } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IRandomizer { function getRandomWord() external returns (uint256); function requestRandomWords(uint256 _id) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.6; interface IDust { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address from, address to, uint256 amount ) external returns (bool); function burn(uint256 _amount) external; function burnFrom(address _from, uint256 _amount) external; function mint(address _to, uint256 _amount) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.12; import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; interface IOps { function gelato() external view returns (address payable); function createTaskNoPrepayment(address _execAddress, bytes4 _execSelector, address _resolverAddress, bytes calldata _resolverData, address _feeToken) external returns (bytes32 task); function getFeeDetails() external view returns (uint256, address); function cancelTask(bytes32 task) external; } abstract contract OpsReady { address public immutable ops; address payable public immutable gelato; address public constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; modifier onlyOps() { require(msg.sender == ops, "OpsReady: onlyOps"); _; } constructor(address _ops) { ops = _ops; gelato = IOps(_ops).gelato(); } function _transfer(uint256 _amount, address _paymentToken) internal { if (_paymentToken == ETH) { (bool success, ) = gelato.call{value: _amount}(""); require(success, "_transfer: ETH transfer failed"); } else { SafeERC20.safeTransfer(IERC20(_paymentToken), gelato, _amount); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
{ "optimizer": { "enabled": true, "runs": 999 }, "viaIR": true, "evmVersion": "london", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_dust","type":"address"},{"internalType":"address payable","name":"_ops","type":"address"},{"internalType":"contract IRandomizer","name":"_randomizer","type":"address"},{"internalType":"address payable","name":"_vrf","type":"address"},{"internalType":"address payable","name":"_legacy","type":"address"},{"internalType":"address payable","name":"_treasury","type":"address"},{"internalType":"address payable","name":"_buyer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"CompId","type":"uint256"},{"indexed":true,"internalType":"address","name":"NFTProjectAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"CompCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"CompId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"startTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"endTime","type":"uint32"},{"indexed":true,"internalType":"address","name":"NFTContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"TokenId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"entryLimit","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"entryCap","type":"uint32"},{"indexed":false,"internalType":"bool","name":"BlindComp","type":"bool"}],"name":"CompCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"CompId","type":"uint256"},{"indexed":true,"internalType":"address","name":"NFTProjectAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"CompFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"CompId","type":"uint256"},{"indexed":true,"internalType":"address","name":"NFTProjectAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"winningEntryID","type":"uint256"}],"name":"CompSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"CompId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"entriesBought","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentEntryLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"compPriceId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withETH","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"EntryReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"From","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"CompId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethRefunded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dustRefunded","type":"uint256"},{"indexed":false,"internalType":"address","name":"Entrant","type":"address"}],"name":"RefundClaimed","type":"event"},{"inputs":[],"name":"DUST","outputs":[{"internalType":"contract IDust","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Dev","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SettlementCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VRF","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VRFCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"_pickCompWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"autoSettleComp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_priceId","type":"uint256"},{"internalType":"bytes32","name":"_referrer","type":"bytes32"},{"internalType":"uint16","name":"_redeemEntries","type":"uint16"}],"name":"buyEntryDust","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_id","type":"uint32"},{"internalType":"uint256","name":"_priceId","type":"uint256"},{"internalType":"bytes32","name":"_referrer","type":"bytes32"},{"internalType":"uint16","name":"_redeemEntries","type":"uint16"}],"name":"buyEntryETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"canPickChecker","outputs":[{"internalType":"bool","name":"canExec","type":"bool"},{"internalType":"bytes","name":"execPayload","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cancelDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"claimRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"compStatus","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"compWinner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"comps","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bool","name":"is1155","type":"bool"},{"internalType":"uint32","name":"entryLimit","type":"uint32"},{"internalType":"uint32","name":"numberEntries","type":"uint32"},{"internalType":"bool","name":"onlyDust","type":"bool"},{"internalType":"bool","name":"onlyEth","type":"bool"},{"internalType":"bool","name":"blind","type":"bool"},{"internalType":"bool","name":"revealed","type":"bool"},{"internalType":"bool","name":"settled","type":"bool"},{"internalType":"bool","name":"failed","type":"bool"},{"internalType":"string","name":"hiddenImage","type":"string"},{"internalType":"string","name":"openseaSlug","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_is1155","type":"bool"},{"internalType":"bool","name":"_blind","type":"bool"},{"internalType":"uint32","name":"_startTime","type":"uint32"},{"internalType":"uint32","name":"_endTime","type":"uint32"},{"internalType":"uint16","name":"_entryCap","type":"uint16"},{"internalType":"uint16","name":"_entryLimit","type":"uint16"},{"internalType":"uint256","name":"_minETH","type":"uint256"},{"internalType":"uint256","name":"_maxETH","type":"uint256"},{"components":[{"internalType":"uint8","name":"id","type":"uint8"},{"internalType":"uint32","name":"numEntries","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct SweepersCompetitionVault.CompDustPrices[]","name":"_dustPrices","type":"tuple[]"},{"components":[{"internalType":"uint8","name":"id","type":"uint8"},{"internalType":"uint32","name":"numEntries","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct SweepersCompetitionVault.CompETHPrices[]","name":"_ethPrices","type":"tuple[]"},{"internalType":"bool","name":"_onlyDust","type":"bool"},{"internalType":"bool","name":"_onlyEth","type":"bool"},{"internalType":"bool","name":"_ethParams","type":"bool"},{"internalType":"bool","name":"_timeParams","type":"bool"},{"internalType":"bool","name":"_entryParams","type":"bool"},{"internalType":"string","name":"_hiddenImage","type":"string"},{"internalType":"string","name":"_slug","type":"string"}],"name":"createComp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"devCut","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"distributions","outputs":[{"internalType":"uint256","name":"treasury","type":"uint256"},{"internalType":"uint256","name":"legacy","type":"uint256"},{"internalType":"uint256","name":"dev","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dustCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"dustPrices","outputs":[{"internalType":"uint8","name":"id","type":"uint8"},{"internalType":"uint32","name":"numEntries","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"earlyCloseConp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earningRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_id","type":"uint32"}],"name":"emergencyCancelComp","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyRescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_is1155","type":"bool"}],"name":"emergencyRescueNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"referralCode","type":"string"}],"name":"enrollReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"entries","outputs":[{"internalType":"address","name":"entrant","type":"address"},{"internalType":"uint32","name":"entryLength","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ethCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ethDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ethPrices","outputs":[{"internalType":"uint8","name":"id","type":"uint8"},{"internalType":"uint32","name":"numEntries","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gelato","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCompsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getEntries","outputs":[{"components":[{"internalType":"address","name":"entrant","type":"address"},{"internalType":"uint32","name":"entryLength","type":"uint32"}],"internalType":"struct SweepersCompetitionVault.Entries[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"getReferrerData","outputs":[{"internalType":"bool","name":"isReferrer","type":"bool"},{"internalType":"bytes32","name":"code","type":"bytes32"},{"internalType":"uint256","name":"numReferrals","type":"uint256"},{"internalType":"uint256","name":"numCredits","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_entrant","type":"address"}],"name":"getUserData","outputs":[{"components":[{"internalType":"uint32","name":"numberEntries","type":"uint32"},{"internalType":"uint256","name":"ethSpent","type":"uint256"},{"internalType":"uint256","name":"dustSpent","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"internalType":"struct SweepersCompetitionVault.UserEntries","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasBonused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyCut","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyTreasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"taskId","type":"bytes32"}],"name":"manualStopTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"ops","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"pickCompWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pickWinnerTaskId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomizer","outputs":[{"internalType":"contract IRandomizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"referralExpiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referreeBonus","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"referrer","outputs":[{"internalType":"bool","name":"isValidReferrer","type":"bool"},{"internalType":"uint256","name":"referralCount","type":"uint256"},{"internalType":"uint256","name":"referralCredits","type":"uint256"},{"internalType":"address","name":"referrerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrerId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_referrerId","type":"bytes32"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"removeReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dev","type":"address"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"setDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sweepersCut","type":"uint16"},{"internalType":"uint16","name":"_legacyCut","type":"uint16"},{"internalType":"uint16","name":"_devCut","type":"uint16"}],"name":"setDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dust","type":"address"}],"name":"setDust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"uint16","name":"_bonus","type":"uint16"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setReferralParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setRefundPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"settleComp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_referrer","type":"bytes32"}],"name":"suspendReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sweepersBuyer","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweepersCut","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweepersTreasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"targetParams","outputs":[{"internalType":"uint256","name":"minimumETH","type":"uint256"},{"internalType":"uint256","name":"maximumETH","type":"uint256"},{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint32","name":"entryCap","type":"uint32"},{"internalType":"bool","name":"useETHParams","type":"bool"},{"internalType":"bool","name":"useTimeParams","type":"bool"},{"internalType":"bool","name":"useEntryParams","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_id","type":"uint32"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"updateBlindComp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_is1155","type":"bool"}],"name":"updateBlindComp1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_hiddenImage","type":"string"}],"name":"updateBlindImage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint32","name":"_endTime","type":"uint32"}],"name":"updateCompEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_treasury","type":"address"}],"name":"updateLegacyTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_slug","type":"string"}],"name":"updateOpenseaSlug","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IRandomizer","name":"_randomizer","type":"address"},{"internalType":"address payable","name":"_vrf","type":"address"},{"internalType":"uint256","name":"_vrfCost","type":"uint256"},{"internalType":"uint256","name":"_settlementCost","type":"uint256"},{"internalType":"uint256","name":"_gasLimit","type":"uint256"}],"name":"updateSettlementParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_buyer","type":"address"}],"name":"updateSweepersBuyer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_treasury","type":"address"}],"name":"updateSweepersTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"userData","outputs":[{"internalType":"uint32","name":"numberEntries","type":"uint32"},{"internalType":"uint256","name":"ethSpent","type":"uint256"},{"internalType":"uint256","name":"dustSpent","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"winnerRequested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c08060405234620002765760e0816200627080380380916200002382856200027b565b833981010312620002765780516001600160a01b03808216929183900362000276576200005360208301620002b5565b60408301519282841680940362000276576200007260608201620002b5565b6200008060808301620002b5565b90846200009e60c06200009660a08701620002b5565b9501620002b5565b941695600097600189558860207f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060048a6001549c60018060a01b03199d8e339082161760015560405196879586943393169180a3608081905263573ea57560e01b82525afa9081156200026b578a899a9b9998999262000210575b50509186949391859360a0526608e1bc9bf040006009556611c37937e08000600a5566470de4df820000600b55640df8475800600c556503e801f4213465ffffffffffff19600d541617600d5562278d0080601455600a602155600163ffffffff1960225416176022556023558a6002541617600255338a600754161760075589600354161760035516876008541617600855168560065416176006551683600454161760045516906005541617600555604051615fa59081620002cb82396080518181816107f7015281816129f4015281816142230152615e50015260a051818181613bc9015281816142c201526143910152f35b9150919293949596506020823d821162000262575b8162000234602093836200027b565b810103126200025f57509287959492869492620002528694620002b5565b919381939596506200011a565b80fd5b3d915062000225565b6040513d8c823e3d90fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200029f57604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620002765756fe61010080604052600436101561004a575b50361561001c57600080fd5b6040513481527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460203392a2005b600060a05260003560e01c90816301e51ae8146147265750806301ffc9a7146146bb57806306efcb3f1461468d57806307717c95146145ef57806308f09a89146145cf5780630a21b1ac146145aa5780630d6f0d061461458a5780630de63a6e146145535780630f736d3b14614202578063150b7a021461419357806317b937e614614131578063215b788a146140f05780632bc1c52314613f6e5780632f3203fb14613f405780632fd8d08814613eff5780633074e1f314613ed95780633273425714613df75780633b7cb63314613dce578063413c027a14613d7057806341d1649914613ccd5780634487d3df14613c885780634ae1b26314613c165780634e0cd79914613bed578063573ea57514613ba75780635997ed4c14613b875780635b7baf641461387a5780635c7a6c181461384c5780635d966466146130e15780636368706e146130b857806365157dec14613077578063666e9a4f1461303657806368f5c0a51461300357806370a24fdc14612fe3578063715018a614612f8257806371df3afb14612f62578063727f0c2f1461228757806379ae5c261461221c57806381a3142d146121f35780638322fff2146121c2578063839e90dc146120e657806383e3a0d614611fcf5780638da5cb5b14611fa65780638dd2141514611f735780638e14968f14611e2e5780638e77fa291461180f578063973e1e43146117e85780639c286837146117c2578063a126285b14611799578063a2096fbc1461176b578063a63cd956146115cf578063a6a3b5b4146115af578063b1972df114611572578063b337ab061461133d578063b459160f1461131d578063b64d30bb14611148578063b6dbfca0146110b0578063b733cd4614611083578063b9d96b6b14611043578063bafbd66f14611002578063bb9c806314610fde578063bba2110314610f54578063bc197c8114610eb0578063c85582a014610e49578063cbf891fe14610aa5578063d1b27c3814610a89578063d1bb06e414610a60578063d3549ebd146109a4578063d564b55d1461092e578063d78b1af51461089e578063d9b80cae14610862578063da45a9cd1461081b578063e70abe92146107d5578063e8f83a431461074a578063ea67460b146106ef578063f10fb584146106c6578063f23a6e6114610657578063f2fde38b1461057b578063f40e834814610536578063f68016b714610513578063f9f2df95146104c8578063fd4db4ef1461049a5763fe78ff8a146103e25738610010565b3461047f57602036600319011261047f57600460206001600160a01b0360035416604051928380927fa75454f400000000000000000000000000000000000000000000000000000000825260a051905af1801561048d5760a05190610454575b61044e906004356155e2565b60a05180f35b506020813d8211610485575b8161046d602093836149c2565b8101031261047f5761044e9051610442565b60a05180fd5b3d9150610460565b6040513d60a051823e3d90fd5b3461047f57602036600319011261047f5760043560a0515260176020526020604060a0512054604051908152f35b3461047f57604036600319011261047f576104e16147a0565b60043560a05152601f6020526001600160a01b03604060a0512091166000526020526020604060002054604051908152f35b3461047f5760a05180600319360112610533576020600c54604051908152f35b80fd5b3461047f57606036600319011261047f5761ffff61055261484c565b61055a614abb565b6004356021551663ffffffff19602254161760225560443560235560a05180f35b3461047f57602036600319011261047f5761059461478a565b61059c614abb565b6001600160a01b038091169081156105ed57600154826001600160a01b0319821617600155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a360a05180f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b3461047f5760a036600319011261047f5761067061478a565b506106796147a0565b5060843567ffffffffffffffff811161047f5761069a9036906004016147b6565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b3461047f5760a051806003193601126105335760206001600160a01b0360035416604051908152f35b3461047f57602036600319011261047f5760043560a0515260196020526080604060a0512063ffffffff8154169060018101549060ff6003600283015492015416916040519384526020840152604083015215156060820152f35b3461047f57606036600319011261047f5761ffff6004358181168082036107d05761077361484c565b916044359380851685036107d05761079a856107958661271095610795614abb565b614b13565b160361047f5763ffff00009065ffff00000000600d549460201b169365ffffffffffff1916179160101b161717600d5560a05180f35b600080fd5b3461047f5760a051806003193601126105335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461047f57604036600319011261047f576001600160a01b0361083c61478a565b610844614abb565b166001600160a01b0319600754161760075560243560095560a05180f35b3461047f57602036600319011261047f576001600160a01b0361088361478a565b1660a05152601e6020526020604060a0512054604051908152f35b3461047f57604036600319011261047f5760243580151581036107d05761044e906108e66001600160a01b038060045416331490811561091f575b8115610911575b50614b3f565b60016108f36004356148e5565b50019060ff60a01b1960ff60a01b835492151560a01b169116179055565b9050600554163314846108e0565b809150600154163314906108d9565b3461047f57602036600319011261047f576001600160a01b03806004541633148015610997575b801561098a575b61096590614b3f565b60a0518080809360043590600754165af161097e614d66565b501561047f5760a05180f35b506005548116331461095c565b5080600154163314610955565b3461047f5760208060031936011261047f5760043560a0515260188152604060a051209081546109d38161595b565b90828201809460a0515260a05184812090915b838310610a445785858860405191838301908484525180915260408301919360a0515b828110610a165784840385f35b855180516001600160a01b0316855282015163ffffffff168483015294810194604090930192600101610a09565b6001868192610a5285615983565b8152019201920191906109e6565b3461047f5760a051806003193601126105335760206001600160a01b0360065416604051908152f35b3461047f57602036600319011261047f5761044e60043561517e565b60208060031936011261047f57610aba614828565b906001600160a01b0390816004541633148015610e3c575b8015610e2f575b610ae290614b3f565b63ffffffff83169160018060ff610af886615aed565b16148015610e1c575b15610dd8578360a0515260178352604060a05120543403610d6e576002610b27866148e5565b50016201000062ff0000198254161790558360a0515260138352610b59604060a0514282822055601c86522054615e46565b610b62856148e5565b5054610bd8575b7f0b8df12448798f258ff0be8ba1fda71c37732daafff3a76064a29d11b2c795b29291610bc9918560a05152601284526000604060a05182600283832082815582878201550155601787522055610bbf876148e5565b50015416946148e5565b5054604051908152a360a05180f35b60ff81610be4876148e5565b50015460a01c1615610cbc578181610bfb876148e5565b500154168260075416610c0d876148e5565b5054823b1561047f57604051637921219560e11b815260a080513060048401526001600160a01b0394909416602483015260448201929092526001606482015260848101829052600060a482015290519092839160c4918391905af1801561048d57610ca7575b507f0b8df12448798f258ff0be8ba1fda71c37732daafff3a76064a29d11b2c795b29291610bc9915b9150919250610b69565b610cb090614976565b60a0518015610c745780fd5b8181610cc7876148e5565b500154168260075416610cd9876148e5565b5054823b1561047f57604051632142170760e11b815260a0513060048301526001600160a01b0390931660248201526044810191909152918290818060648101039160a051905af1801561048d57610d59575b507f0b8df12448798f258ff0be8ba1fda71c37732daafff3a76064a29d11b2c795b29291610bc991610c9d565b610d6290614976565b60a0518015610d2c5780fd5b6084836040519062461bcd60e51b82526004820152602a60248201527f4d7573742073656e64206261636b20656e6f7567682045544820746f20636f7660448201527f657220726566756e6473000000000000000000000000000000000000000000006064820152fd5b6064836040519062461bcd60e51b82526004820152601c60248201527f43616e206f6e6c792063616e63656c2061637469766520636f6d7073000000006044820152fd5b5060ff610e2885615aed565b1615610b01565b5060055482163314610ad9565b5081600154163314610ad2565b3461047f57610e57366147e4565b9060a05152600f60205260a05190604082206005821015610eac57610e7c92506148d1565b5080546001909101546040805160ff8416815260089390931c63ffffffff166020840152820152606090f35b0390f35b8280fd5b3461047f5760a036600319011261047f57610ec961478a565b50610ed26147a0565b5067ffffffffffffffff60443581811161047f57610ef4903690600401614a8a565b505060643581811161047f57610f0e903690600401614a8a565b505060843590811161047f57610f289036906004016147b6565b505060206040517fbc197c81000000000000000000000000000000000000000000000000000000008152f35b3461047f57602036600319011261047f5760043560a051526011602052610100604060a0512060ff8154916002600182015491015490604051938452602084015263ffffffff8082166040850152808260201c1660608501528160401c166080840152818160601c16151560a0840152818160681c16151560c084015260701c16151560e0820152f35b3461047f5760a0518060031936011261053357602061ffff600d5416604051908152f35b3461047f57602036600319011261047f576001600160a01b0361102361478a565b61102b614abb565b166001600160a01b0319600654161760065560a05180f35b3461047f57602036600319011261047f576001600160a01b0361106461478a565b1660a0515260208052602060ff604060a0512054166040519015158152f35b3461047f5761044e611094366147e4565b906110ab6001600160a01b03600354163314614b3f565b6155e2565b3461047f57604036600319011261047f576110c96147a0565b6001600160a01b0380600454163314801561113b575b801561112e575b6110ef90614b3f565b60043560a05152601d60205260a051918260036040822082815560006001820155600060028201550155169052601e60205260a0516000604082205580f35b50600554811633146110e6565b50806001541633146110df565b3461047f57604036600319011261047f57611161614828565b602435906001600160a01b0390816004541633148015611310575b8015611303575b61118c90614b3f565b611195816148e5565b50546112bf57821561047f5780836111ae6001936148e5565b505560ff826111bc836148e5565b50015460a01c161561124e576111d1906148e5565b5001541690813b1561047f57604051637921219560e11b815260a080513360048401523060248401526044830193909352600160648301526084820152600060a4820152918290818060c481015b039160a051905af1801561048d57611239575b5060a05180f35b61124290614976565b60a05180156112325780fd5b611257906148e5565b5001541690813b1561047f57604051632142170760e11b815260a05133600483015230602483015260448201929092529182908180606481015b039160a051905af1801561048d576112aa575b5061044e565b6112b390614976565b60a05180156112a45780fd5b606460405162461bcd60e51b815260206004820152601460248201527f436f6d7020616c726561647920757064617465640000000000000000000000006044820152fd5b5060055482163314611183565b508160015416331461117c565b3461047f5760a05180600319360112610533576020600b54604051908152f35b3461047f5760208060031936011261047f57600435906001600160a01b0390816004541633148015611565575b8015611558575b61137a90614b3f565b8260a051526011815260ff6002604060a05120015460601c1615611514578260a051526015815260a051604081205460118352604082205411159081611503575b5015611499576113ca836148e5565b505415611455578160035416803b1561047f5760405190632f215ddf60e21b82528460048301528160248160a05180945af1801561048d57611439575b50601a919260a051525260a0518080809360408220600160ff1982541617905560085416600a54905af161097e614d66565b61144290614976565b60a05192836114515792611407565b8380fd5b6064906040519062461bcd60e51b82526004820152601360248201527f55706461746520636f6d7020746f6b656e4944000000000000000000000000006044820152fd5b6084906040519062461bcd60e51b82526004820152602260248201527f43616e206e6f7420636c6f736520776974682063757272656e742066756e646960448201527f6e670000000000000000000000000000000000000000000000000000000000006064820152fd5b6040915060178352205415846113bb565b6064906040519062461bcd60e51b82526004820152601e60248201527f43616e206f6e6c7920636c6f736520776974682045544820706172616d7300006044820152fd5b5060055482163314611371565b508160015416331461136a565b3461047f57602036600319011261047f57608061159561159061478a565b615df7565b916040519315158452602084015260408301526060820152f35b3461047f5760a05180600319360112610533576020601454604051908152f35b3461047f57602036600319011261047f57600435600e5481101561047f57600590600e60005202807fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0154610ea87fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe83015461175c7fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff850154946116bf7fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c4016116b87fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40084016149e4565b92016149e4565b9260405196879687526001600160a01b038216602088015260ff91828160a01c161515604089015263ffffffff808260a81c1660608a01528160c81c166080890152828160e81c16151560a0890152828160f01c16151560c089015260f81c151560e08801528181161515610100880152818160081c16151561012088015260101c1615156101408601526101a08061016087015285019061474a565b9083820361018085015261474a565b3461047f57602036600319011261047f5760043560a05152601c6020526020604060a0512054604051908152f35b3461047f5760a051806003193601126105335760206001600160a01b0360085416604051908152f35b3461047f5760a05180600319360112610533576020600d5461ffff60405191831c168152f35b3461047f5760a0518060031936011261053357602061ffff600d5460101c16604051908152f35b608036600319011261047f5761182361483b565b61182b614d96565b611844600160ff61183d600435615aed565b1614614deb565b60ff60016118536004356148e5565b50015460f01c16611dea5761186c6024356004356150df565b6009543403611da657604080513360208201908152600435928201929092526118a281606081015b03601f1981018352826149c2565b5190208060a0515260196020526119046118e16118d663ffffffff604060a05120541663ffffffff60208701511690614e36565b61ffff861690614e36565b63ffffffff8060016118f46004356148e5565b50015460a81c1691161115614e4e565b60043560a05152601160205260ff6002604060a05120015460701c16611d3a575b63ffffffff6020830151169261ffff8116611cbf575b5060443560a05152601d60205260a05160ff604082205416611b86575b506119b061197e8463ffffffff60016119726004356148e5565b50015460c81c16614e36565b63ffffffff604051916119908361498a565b33835216602082015260043560a051526018602052604060a05120614f7f565b6040820190815160043560a0515260166020526119d4604060a05120918254614b8a565b9055611a3360016119e66004356148e5565b50016119fc8663ffffffff835460c81c16614e36565b7fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff60c81b83549260c81b169116179055565b8060a051526019602052604060a05120805463ffffffff611a5687828416614e36565b169063ffffffff191617905581519060a051526019602052611a826002604060a0512001918254614b8a565b90556001600160a01b039081600254169051813b1561047f576040517f79cc679000000000000000000000000000000000000000000000000000000000815260a08051336004840152602483019390935251909283916044918391905af1801561048d57611b71575b506007541660a05180808093600954905af1611b05614d66565b501561047f5763ffffffff60208192015116916040519233845260208401521660408201526024356060820152600060808201524260a08201527f6eb35d7bc0df1598449265e661b60df86ce76054b7d69d2286d87494ac2ab4bb60c060043592a260a0516001815580f35b611b7a90614976565b60a0518015611aeb5780fd5b604090601f602052203360005260205260406000205415611c8f575b60443560a05152601f60205260a05160408120336000526020526040600020544210156119585763ffffffff602084015116906044359052601d602052611bf36001604060a0512001918254614b8a565b9055611c1a611c0b63ffffffff602085015116614f46565b63ffffffff6021549116614f5f565b60443560a05152601d602052611c3a6002604060a0512001918254614b8a565b90553360a051526020805260ff604060a05120541615611c5b575b83611958565b91611c6f9063ffffffff6022541690614e36565b913360a0515260208052604060a05120600160ff19825416179055611c55565b611c9b60235442614b8a565b60443560a05152601f602052604060a0512033600052602052604060002055611ba2565b9261ffff611d3392943360a05152601e60205260a0516040812054809152601d602052611d016002604060a05120015484611cf985614ee4565b161115614efb565b82611d0b83614ee4565b169060a05152601d602052611d2a6002604060a0512001918254614d04565b90551690614e36565b918361193b565b611da1611d7863ffffffff6001611d526004356148e5565b50015460c81c16611d7361ffff87169163ffffffff60208801511690614e36565b614e36565b60043560a05152601160205263ffffffff806002604060a05120015460401c1691161115614e99565b611925565b606460405162461bcd60e51b815260206004820152600f60248201527f466565206e6f7420636f766572656400000000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601e60248201527f436f6d70206973207265737472696374656420746f206f6e6c792045544800006044820152fd5b3461047f57611e716003611e413661489d565b9291611e6c6001600160a01b0395929580600454163314908115611f64575b8115611f565750614b3f565b6148e5565b50019067ffffffffffffffff8111611f3e57611e9781611e918454614920565b84614bea565b60a051601f8211600114611ed65781929360a05192611ecb575b50508160011b916000199060031b1c191617905560a05180f35b013590508380611eb1565b601f1982169383825260a05191602080842093905b878210611f26575050836001959610611f0c575b505050811b01905561044e565b0135600019600384901b60f8161c19169055838080611eff565b80600184968294958701358155019501920190611eeb565b634e487b7160e01b60a051526041600452602460a051fd5b9050600554163314876108e0565b80915060015416331490611e60565b3461047f57611f81366147e4565b9060a05152601060205260a05190604082206005821015610eac57610e7c92506148d1565b3461047f5760a051806003193601126105335760206001600160a01b0360015416604051908152f35b3461047f57606036600319011261047f57611fe861478a565b602435611ff361485d565b6001600160a01b039283918260045416331480156120d9575b80156120cc575b61201c90614b3f565b156120825716916007541690823b1561047f57604051637921219560e11b815260a080513060048401526001600160a01b0390941660248301526044820192909252600160648201526084810191909152600060a4820152918290818060c4810161121f565b16916007541690823b1561047f57604051632142170760e11b815260a0513060048301526001600160a01b0390931660248201526044810191909152918290818060648101611291565b5060055483163314612013565b508260015416331461200c565b3461047f5761212260046120f93661489d565b9291611e6c6001600160a01b03959295808554163314908115611f64578115611f565750614b3f565b50019067ffffffffffffffff8111611f3e5761214281611e918454614920565b60a051601f82116001146121755781929360a05192611ecb5750508160011b916000199060031b1c191617905560a05180f35b601f1982169383825260a05191602080842093905b8782106121aa575050836001959610611f0c57505050811b01905561044e565b8060018496829495870135815501950192019061218a565b3461047f5760a0518060031936011261053357602060405173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8152f35b3461047f5760a051806003193601126105335760206001600160a01b0360055416604051908152f35b3461047f5760a036600319011261047f576004356001600160a01b0380821680920361047f5761224a6147a0565b612252614abb565b6001600160a01b03199283600354161760035516906008541617600855604435600a55606435600b55608435600c5560a05180f35b61026036600319011261047f5761229c61478a565b60e0526122a761485d565b6064351515606435036107d05760843563ffffffff811681036107d05760a4359163ffffffff831683036107d05761ffff806080528060c4351660c435036107d05760e435908160c0528116036107d0576101443567ffffffffffffffff811161047f5761231990369060040161486c565b67ffffffffffffffff610164351161047f5761233b366101643560040161486c565b90610184359182151583036107d0576101a4359283151584036107d0576101c43515156101c435036107d0576101e43515156101e435036107d05761020435151561020435036107d05767ffffffffffffffff610224351161047f576123a736610224356004016147b6565b9067ffffffffffffffff610244351161047f576123ca36610244356004016147b6565b926001600160a01b036004541633148015612f4e575b8015612f35575b6123f090614b3f565b6123ff600a54600b5490614b8a565b340361047f576101c4358015612f2b575b8015612f21575b1561047f5760a0519260643515612f1757602435155b156114515760643515612f0f57835b5060643515612ed157612450913691614bb3565b925b60405193846101a081011067ffffffffffffffff6101a087011117612c32576124f0936101a0860160405260243586526001600160a01b0360e0511660208701528c1515604087015260805160c05116606087015260a051608087015286151560a087015289151560c0870152606435151560e0870152151561010086015260a05161012086015260a0516101408601526101608501523691614bb3565b610180820152600e5468010000000000000000811015611f3e5780600161251a9201600e556148e5565b919091612eba5780518255600182016001600160a01b036020830151166001600160a01b031982541617815561256d60408301511515829060ff60a01b1960ff60a01b835492151560a01b169116179055565b6060820151815460808401517fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff90911660a89290921b78ffffffff000000000000000000000000000000000000000000169190911760c89190911b63ffffffff60c81b1617815560a0820151151581547eff00000000000000000000000000000000000000000000000000000000000060c0850151151560f01b16907cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7dff00000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000060e0880151151560f81b169460e81b16911617171790556101008101511515600283015461ff00610120840151151560081b169060ff62ff0000610140860151151560101b1693169062ffffff1916171717600283015561016081015190815167ffffffffffffffff8111611f3e576126f0816126e76003870154614920565b60038701614bea565b60a051602090601f8311600114612e43575081906101809460a05192612e38575b50508160011b916000199060031b1c19161760038401555b0151805167ffffffffffffffff8111611f3e576127568161274d6004860154614920565b60048601614bea565b60a051602090601f8311600114612dc85750819060049360a05192612dbd575b50508160011b916000199060031b1c1916179101555b15612d0f575b505015612c48575b5050604051908161010081011067ffffffffffffffff61010084011117612c3257610100820160405261010435825261012435602083015263ffffffff8316604083015263ffffffff8416606083015260805160c4351660808301526101c435151560a08301526101e435151560c083015261020435151560e0830152600e5480600019810111612b0d576000190160a05152601160205260a051916002604084208251815560208301516001820155019063ffffffff60408201511663ffffffff1983541617825561289463ffffffff606083015116839067ffffffff0000000082549160201b169067ffffffff000000001916179055565b60808101519082546cff00000000000000000000000060a0830151151560601b16906bffffffff00000000000000006eff000000000000000000000000000060e06dff0000000000000000000000000060c0870151151560681b16950151151560701b169460401b16906effffffffffffff0000000000000000191617171717905560643515612b25575b5050600e549081600019810111612b0d576129c89160206040517f07717c9500000000000000000000000000000000000000000000000000000000828201526000198301602482015260248152612975816149a6565b6040519485917fb9f45adb000000000000000000000000000000000000000000000000000000008352306004840152630f736d3b60e01b602484015230604484015260a0606484015260a483019061474a565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6084830152818060a0519203916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af192831561048d5760a05193612ad9575b506000190160a05152601c60205260a051916040832055600e54916000198301928311612ac3575063ffffffff6020938160405193168352168382015260805160c05116604082015260805160c4351660608201526064351515608082015260243590827fa925e3e1c3b2bb604e7317ae84b89954a653edc5b3bddb74ce5b0138c20f570360a06001600160a01b0360e0511693a4604051908152f35b634e487b7160e01b90526011600452602460a051fd5b9092506020813d602011612b05575b81612af5602093836149c2565b8101031261047f57519184612a26565b3d9150612ae8565b634e487b7160e01b60a051526011600452602460a051fd5b15612bba57506001600160a01b0360e051163b1561047f57604051637921219560e11b815260a08051336004840152306024808501919091523560448401526001606484015260848301829052600060a4840152905160e051839160c4918391906001600160a01b03165af1801561048d57612ba5575b505b828061291f565b612bae90614976565b60a0518015612b9c5780fd5b6001600160a01b0360e051163b156105335750604051632142170760e11b815260a05133600483015230602480840191909152356044830152818060648101038160a0516001600160a01b0360e051165af1801561048d57612c1d575b50612b9e565b612c2690614976565b60a0518015612c175780fd5b634e487b7160e01b600052604160045260246000fd5b612c53811515614c3e565b60a0515b818110612c64575061279a565b612c8a63ffffffff612c826020612c7c858789614c98565b01614ca8565b161515614cb9565b612c9a6020612c7c838587614c98565b906040612ca8828587614c98565b013563ffffffff60405193612cbc856149a6565b60ff841685521660208401526040830152600e5480600019810111612b0d57612d0a92612d05916000190160a051526010602052612cff83604060a051206148d1565b90614d11565b614c89565b612c57565b612d1a811515614c3e565b60a0515b818110612d2b5750612792565b612d4363ffffffff612c826020612c7c858789614c98565b612d536020612c7c838587614c98565b906040612d61828587614c98565b013563ffffffff60405193612d75856149a6565b60ff841685521660208401526040830152600e5480600019810111612b0d57612db892612d05916000190160a05152600f602052612cff83604060a051206148d1565b612d1e565b015190508d80612776565b60048501905260a051602081209293905b601f1985168110612e205750918391600193600495601f19811610612e07575b505050811b0191015561278c565b015160001960f88460031b161c191690558d8080612df9565b91926020600181928685015181550194019201612dd9565b015190508e80612711565b6003869593949501905260a0519160208320925b601f1985168110612ea257509183916001936101809695601f19811610612e89575b505050811b016003840155612729565b015160001960f88460031b161c191690558e8080612e79565b91926020600181928685015181550194019201612e57565b634e487b7160e01b60a05152602460a05180600452fd5b5050604051612edf8161498a565b600481527f6e756c6c00000000000000000000000000000000000000000000000000000000602082015292612452565b60019361243c565b602435151561242d565b5061020435612417565b506101e435612410565b506123f06001600160a01b0360055416331490506123e7565b506001600160a01b036001541633146123e0565b3461047f5760a05180600319360112610533576020602354604051908152f35b3461047f5760a0518060031936011261053357612f9d614abb565b60006001600160a01b036001546001600160a01b03198116600155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360a05180f35b3461047f5760a05180600319360112610533576020600a54604051908152f35b3461047f57602036600319011261047f5760043560a05152601a602052602060ff604060a0512054166040519015158152f35b3461047f57602036600319011261047f576001600160a01b0361305761478a565b61305f614abb565b166001600160a01b0319600254161760025560a05180f35b3461047f57602036600319011261047f576001600160a01b0361309861478a565b6130a0614abb565b166001600160a01b0319600454161760045560a05180f35b3461047f57602036600319011261047f5760206130d6600435615aed565b60ff60405191168152f35b608036600319011261047f576130f5614828565b6130fd61483b565b90613106614d96565b61311c600160ff61183d63ffffffff8516615aed565b60ff6001613129836148e5565b50015460e81c166138085761314660243563ffffffff8316615071565b6040810151340361379f5760408051336020820190815263ffffffff8516928201929092526131788160608101611894565b5190208060a0515260196020526131c86131b76131ac63ffffffff604060a05120541663ffffffff60208701511690614e36565b61ffff871690614e36565b63ffffffff8060016118f4886148e5565b63ffffffff831660a05152601160205260ff6002604060a05120015460701c16613736575b63ffffffff6020830151169361ffff81166136f5575b506044358060a05152601d60205260a05160ff6040822054166135d3575b505061327061323a8563ffffffff6001611972886148e5565b63ffffffff6040519161324c8361498a565b33835216602082015263ffffffff851660a051526018602052604060a05120614f7f565b61327e60016119e6856148e5565b8060a051526019602052604060a05120805463ffffffff6132a187828416614e36565b169063ffffffff191617905560408201519060a0515260196020526132d06001604060a0512001918254614b8a565b905563ffffffff821660a05152601160205260ff6002604060a05120015460601c166000146135945763ffffffff821660a05152601560205260a0516040812054601160205260408220541160001461348f575060a051808080346001600160a01b03600554165af1613341614d66565b501561047f5761ffff600d54166127109081039261ffff8411612b0d57604060c09363ffffffff9361339861ffff7f6eb35d7bc0df1598449265e661b60df86ce76054b7d69d2286d87494ac2ab4bb98163461500f565b0484841660a0515260176020526133b58360a05120918254614b8a565b90555b612710806133cf61ffff600d5460101c163461500f565b0485851660a0515260126020526133ef60018560a0512001918254614b8a565b905561340461ffff600d5460201c163461500f565b0484841660a05152601260205261342460028460a0512001918254614b8a565b9055015182821660a051526015602052613445604060a05120918254614b8a565b9055816001613453836148e5565b50015460c81c16826040519633885216602087015260408601526024356060860152600160808601524260a08601521692a260a0516001815580f35b7f6eb35d7bc0df1598449265e661b60df86ce76054b7d69d2286d87494ac2ab4bb92604060c0938163ffffffff94601760205220541515600014613564576127106134e061ffff600d54163461500f565b0484841660a05152601760205260a051818482205411600014613521575084841660a05152601760205261351a8360a05120918254614d04565b90556133b8565b8390205461352e91614d04565b84841660a05152601260205261354a8360a05120918254614b8a565b905583831660a05152601760205260a051828120556133b8565b61271061357761ffff600d54163461500f565b0484841660a05152601260205261351a8360a05120918254614b8a565b63ffffffff7f6eb35d7bc0df1598449265e661b60df86ce76054b7d69d2286d87494ac2ab4bb92604060c09361271061357761ffff600d54163461500f565b604090601f6020522033600052602052604060002054156136c7575b8060a05152601f60205260a0516040812033600052602052604060002054421015613221578163ffffffff6020860151169152601d60205261363b6001604060a0512001918254614b8a565b9055613653611c0b63ffffffff602086015116614f46565b9060a05152601d6020526136716002604060a0512001918254614b8a565b90553360a051526020805260ff604060a05120541615613693575b8480613221565b926136a79063ffffffff6022541690614e36565b923360a0515260208052604060a05120600160ff1982541617905561368c565b6136d360235442614b8a565b8160a05152601f602052604060a05120336000526020526040600020556135ef565b9361ffff61372f92953360a05152601e60205260a0516040812054809152601d602052611d016002604060a05120015484611cf985614ee4565b9284613203565b61379a61376d63ffffffff600161374c876148e5565b50015460c81c16611d7361ffff88169163ffffffff60208801511690614e36565b63ffffffff851660a05152601160205263ffffffff806002604060a05120015460401c1691161115614e99565b6131ed565b608460405162461bcd60e51b8152602060048201526024808201527f6d73672e76616c7565206d75737420626520657175616c20746f20746865207060448201527f72696365000000000000000000000000000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152601f60248201527f436f6d70206973207265737472696374656420746f206f6e6c792044555354006044820152fd5b3461047f57602036600319011261047f5760043560a0515260156020526020604060a0512054604051908152f35b3461047f5760208060031936011261047f5760043590613898614d96565b600460ff6138a584615aed565b1603613b43578160a05152601381526138c7604060a051205460145490614b8a565b4211613aff57604080513383820190815260208101859052916138ed9082908401611894565b51902060a0515260198152604060a0512090600382019160ff835416613abb576002600182019182548660a0515260158552613930604060a05120918254614d04565b9055019283548560a0515260168452613950604060a05120918254614d04565b9055805460ff19166001179055805480613a59575b508254806139b3575b50916060917f2551b91c11f1d3d4411df969d26e06f415cad35942a7dcbc5cdfec12751e8a0c9354915490604051928352820152336040820152a260a0516001815580f35b9290916001600160a01b036002541693843b1561047f576040517f40c10f1900000000000000000000000000000000000000000000000000000000815260a08051336004840152602483019390935251909586916044918391905af192831561048d577f2551b91c11f1d3d4411df969d26e06f415cad35942a7dcbc5cdfec12751e8a0c94606094613a4a575b509193509161396e565b613a5390614976565b86613a40565b60a05180808093335af1613a6b614d66565b5015613a775784613965565b6064826040519062461bcd60e51b82526004820152601060248201527f4661696c2073656e6420726566756e64000000000000000000000000000000006044820152fd5b6064826040519062461bcd60e51b82526004820152601060248201527f616c726561647920726566756e646564000000000000000000000000000000006044820152fd5b6064906040519062461bcd60e51b82526004820152601260248201527f636c61696d2074696d65206578706972656400000000000000000000000000006044820152fd5b6064906040519062461bcd60e51b82526004820152600a60248201527f6e6f74206661696c6564000000000000000000000000000000000000000000006044820152fd5b3461047f5760a05180600319360112610533576020600954604051908152f35b3461047f5760a051806003193601126105335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461047f5760a051806003193601126105335760206001600160a01b0360025416604051908152f35b3461047f57602036600319011261047f57613c4d6001600160a01b0380600454163314908115613c79575b8115613c6b5750614b3f565b60043560a05152601d60205260a0516040812060ff19815416905580f35b9050600554163314826108e0565b80915060015416331490613c41565b3461047f57602036600319011261047f5760043560a0515260126020526060604060a05120805490600260018201549101549060405192835260208301526040820152f35b3461047f57604036600319011261047f5760243563ffffffff8116810361047f57613d146001600160a01b0380600454163314908115613d61575b8115613d535750614b3f565b60043560a051526011602052613d5060a05191600260408420019067ffffffff0000000082549160201b169067ffffffff000000001916179055565b80f35b9050600554163314836108e0565b80915060015416331490613d08565b3461047f57602036600319011261047f5760043560a05152601d6020526080604060a0512060ff815416906001810154906001600160a01b036003600283015492015416916040519315158452602084015260408301526060820152f35b3461047f5760a051806003193601126105335760206001600160a01b0360045416604051908152f35b3461047f57604036600319011261047f57613e106147a0565b604051613e1c8161495a565b60a051815260a051602082015260a0516040820152606060a051910152604051613e688161189460208201946004359086602090939291936001600160a01b0360408201951681520152565b51902060a0515260196020526080604060a05120604051613e888161495a565b63ffffffff82541691828252600181015460208301908152606060ff600360028501549460408701958652015416930192151583526040519384525160208401525160408301525115156060820152f35b3461047f5760a0518060031936011261053357602063ffffffff60225416604051908152f35b3461047f57602036600319011261047f57613f356001600160a01b0380600454163314908115613c79578115613c6b5750614b3f565b61044e600435615e46565b3461047f57602036600319011261047f5760043560a0515260136020526020604060a0512054604051908152f35b3461047f5760208060031936011261047f5760043567ffffffffffffffff811161047f57613fa09036906004016147b6565b9190613faa614d96565b3360a05152601e8252604060a05120546140ac5760a051903592828110614098575b50829052601d815260a0516001604082200154159081614087575b508061407e575b1561403a57601d913360a05152601e825260a051816040822055525260a05160408120600160ff1982541617905560036040822001336001600160a01b03198254161790556001815580f35b6064906040519062461bcd60e51b82526004820152601b60248201527f726566657272616c436f646520616c72656164792065786973747300000000006044820152fd5b50811515613fee565b60ff91506040902054161583613fe7565b60001990830360031b1b9092169183613fcc565b6064826040519062461bcd60e51b82526004820152601560248201527f5573657220616c726561647920656e726f6c6c656400000000000000000000006044820152fd5b3461047f57602036600319011261047f576001600160a01b0361411161478a565b614119614abb565b166001600160a01b0319600554161760055560a05180f35b3461047f5761413f366147e4565b9060a05152601860205260a0516040812090815483101561053357610ea861416784846147fa565b5054604080516001600160a01b038316815260a09290921c63ffffffff16602083015290918291820190565b3461047f57608036600319011261047f576141ac61478a565b506141b56147a0565b5060643567ffffffffffffffff811161047f576141d69036906004016147b6565b505060206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b3461047f5760208060031936011261047f57600435906001600160a01b03807f00000000000000000000000000000000000000000000000000000000000000001680330361450f5790604060049261425d600c543a10615133565b8151938480927fb810c6360000000000000000000000000000000000000000000000000000000082525afa801561048d5760a0519283916144cc575b50811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8103614357575060a05180809381937f0000000000000000000000000000000000000000000000000000000000000000165af16142ec614d66565b501561431357601c915b6142ff8161517e565b60a051525261044e604060a0512054615e46565b6064906040519062461bcd60e51b82526004820152601e60248201527f5f7472616e736665723a20455448207472616e73666572206661696c656400006044820152fd5b6143d0916143de61442d94604051948591888301947fa9059cbb0000000000000000000000000000000000000000000000000000000086527f00000000000000000000000000000000000000000000000000000000000000001660248401602090939291936001600160a01b0360408201951681520152565b03601f1981018552846149c2565b604051926143eb8461498a565b8584527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648685015260a051918291519082855af1614427614d66565b91615ed3565b80518061443f575b5050601c916142f6565b8183918101031261047f5781015180159081150361047f57614462578280614435565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9250506040823d604011614507575b816144e8604093836149c2565b8101031261047f5782825192015191818316830361047f579181614299565b3d91506144db565b6064836040519062461bcd60e51b82526004820152601160248201527f4f707352656164793a206f6e6c794f70730000000000000000000000000000006044820152fd5b3461047f57602036600319011261047f5760043560a05152601b60205260206001600160a01b03604060a051205416604051908152f35b3461047f5760a05180600319360112610533576020600e54604051908152f35b3461047f57602036600319011261047f576145c3614abb565b60043560145560a05180f35b3461047f5760a05180600319360112610533576020602154604051908152f35b3461047f57602036600319011261047f57600435600260ff61461083615aed565b161480614672575b8061465f575b60405191630f736d3b60e01b6020840152602483015260248252614641826149a6565b610ea86040519283921515835260406020840152604083019061474a565b50614669816148e5565b5054151561461e565b508060a05152601a60205260ff604060a05120541615614618565b3461047f57602036600319011261047f5760043560a0515260166020526020604060a0512054604051908152f35b3461047f57602036600319011261047f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361047f576020907f01ffc9a70000000000000000000000000000000000000000000000000000000060405191148152f35b346107d05760003660031901126107d0576020906001600160a01b03600754168152f35b919082519283825260005b848110614776575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201614755565b600435906001600160a01b03821682036107d057565b602435906001600160a01b03821682036107d057565b9181601f840112156107d05782359167ffffffffffffffff83116107d057602083818601950101116107d057565b60409060031901126107d0576004359060243590565b80548210156148125760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b6004359063ffffffff821682036107d057565b6064359061ffff821682036107d057565b6024359061ffff821682036107d057565b6044359081151582036107d057565b9181601f840112156107d05782359167ffffffffffffffff83116107d057602080850194606085020101116107d057565b9060406003198301126107d057600435916024359067ffffffffffffffff82116107d0576148cd916004016147b6565b9091565b9060058110156148125760011b0190600090565b600e5481101561481257600590600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b90600182811c92168015614950575b602083101461493a57565b634e487b7160e01b600052602260045260246000fd5b91607f169161492f565b6080810190811067ffffffffffffffff821117612c3257604052565b67ffffffffffffffff8111612c3257604052565b6040810190811067ffffffffffffffff821117612c3257604052565b6060810190811067ffffffffffffffff821117612c3257604052565b90601f8019910116810190811067ffffffffffffffff821117612c3257604052565b90604051918260008254926149f884614920565b908184526001948581169081600014614a675750600114614a24575b5050614a22925003836149c2565b565b9093915060005260209081600020936000915b818310614a4f575050614a2293508201013880614a14565b85548884018501529485019487945091830191614a37565b915050614a2294506020925060ff191682840152151560051b8201013880614a14565b9181601f840112156107d05782359167ffffffffffffffff83116107d0576020808501948460051b0101116107d057565b6001600160a01b03600154163303614acf57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b91909161ffff80809416911601918211614b2957565b634e487b7160e01b600052601160045260246000fd5b15614b4657565b606460405162461bcd60e51b815260206004820152601260248201527f53656e646572206e6f7420616c6c6f77656400000000000000000000000000006044820152fd5b91908201809211614b2957565b67ffffffffffffffff8111612c3257601f01601f191660200190565b929192614bbf82614b97565b91614bcd60405193846149c2565b8294818452818301116107d0578281602093846000960137010152565b90601f8111614bf857505050565b600091825260208220906020601f850160051c83019410614c34575b601f0160051c01915b828110614c2957505050565b818155600101614c1d565b9092508290614c14565b15614c4557565b606460405162461bcd60e51b815260206004820152600960248201527f4e6f2070726963657300000000000000000000000000000000000000000000006044820152fd5b6000198114614b295760010190565b9190811015614812576060020190565b3563ffffffff811681036107d05790565b15614cc057565b606460405162461bcd60e51b815260206004820152600f60248201527f6e756d456e7472696573206973203000000000000000000000000000000000006044820152fd5b91908203918211614b2957565b9190614d505760408160ff60019351168454908060ff19831617865564ffffffff00602084015160081b169164ffffffffff1916171784550151910155565b634e487b7160e01b600052600060045260246000fd5b3d15614d91573d90614d7782614b97565b91614d8560405193846149c2565b82523d6000602084013e565b606090565b600260005414614da7576002600055565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b15614df257565b606460405162461bcd60e51b815260206004820152601260248201527f436f6d70206973206e6f742041637469766500000000000000000000000000006044820152fd5b91909163ffffffff80809416911601918211614b2957565b15614e5557565b606460405162461bcd60e51b815260206004820152601760248201527f426f7567687420746f6f206d616e7920656e74726965730000000000000000006044820152fd5b15614ea057565b606460405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820656e74726965732072656d61696e696e67000000006044820152fd5b906103e861ffff80931602918216918203614b2957565b15614f0257565b606460405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768206372656469747320617661696c61626c65000000006044820152fd5b906103e863ffffffff80931602918216918203614b2957565b8115614f69570490565b634e487b7160e01b600052601260045260246000fd5b805468010000000000000000811015612c3257614fa1916001820181556147fa565b919091614d50576001600160a01b038151167fffffffffffffffff00000000000000000000000000000000000000000000000077ffffffff00000000000000000000000000000000000000006020855494846001600160a01b03198716178755015160a01b16921617179055565b81810292918115918404141715614b2957565b6040519061502f826149a6565b60006040838281528260208201520152565b9060405161504e816149a6565b60406001829463ffffffff815460ff8116865260081c1660208501520154910152565b9061507a615022565b50600091808352600f6020528160ff61509682604087206148d1565b505416146150be575050604051906150ad826149a6565b808252806020830152604082015290565b906040836150d6936150dc9552600f602052206148d1565b50615041565b90565b906150e8615022565b5060009180835260106020528160ff61510482604087206148d1565b5054161461511b575050604051906150ad826149a6565b906040836150d6936150dc95526010602052206148d1565b1561513a57565b606460405162461bcd60e51b815260206004820152601360248201527f63616e7420626520736574746c6564206e6f77000000000000000000000000006044820152fd5b615195600260ff61518e84615aed565b1614615133565b61519e816148e5565b5054906000911561559e576151b2816148e5565b5060019081015463ffffffff9060c81c81161561526d57506001600160a01b03918260035416803b1561526957848091602460405180948193632f215ddf60e21b83528760048401525af1801561525e579085939291615244575b508293839283928352601a602052604083209060ff1982541617905560085416600a54905af161523b614d66565b50156105335750565b6152519093919293614976565b611451579083913861520d565b6040513d87823e3d90fd5b8480fd5b828452601a6020526040808520805460ff1916841790559190615296600260ff61518e87615aed565b816152a0856148e5565b50015460c81c1661555b5760026152b6846148e5565b5001805461ff00191661010017905560026152d0846148e5565b5001805462ff00001916620100001790556152ea836148e5565b505461538f575b7f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b09181606092615320866148e5565b506001600160a01b03928391015416867f4e62c365b3ffd9d3b267ad690927202784fc948df3e8920f060e9db522556471602061535c836148e5565b50548751908152a361536d866148e5565b500154169461537b856148e5565b5054918051928352816020840152820152a3565b60ff8161539b856148e5565b50015460a01c161561548557806153b1846148e5565b5001546007546001600160a01b0390811691166153cd856148e5565b505491813b15615481578451637921219560e11b81523060048201526001600160a01b0391909116602482015260448101929092526001606483015260a06084830152600060a48301528590829060c490829084905af1801561547757908591615463575b50507f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b0916060915b915091506152f1565b61546c90614976565b611451578338615432565b83513d87823e3d90fd5b8680fd5b8061548f846148e5565b5001546007546001600160a01b0390811691166154ab856148e5565b505491813b15615481578451632142170760e11b81523060048201526001600160a01b03919091166024820152604481019290925285908290606490829084905af1801561547757615523575b507f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b09160609161545a565b91606091946155527f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b094614976565b949150916154f8565b6064825162461bcd60e51b815260206004820152601060248201527f636f6d702068617320656e7472696573000000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601360248201527f75706461746520636f6d7020746f6b656e4944000000000000000000000000006044820152fd5b6155f2600660ff61518e84615aed565b6155fb816148e5565b506001809101549260009363ffffffff809160c81c1615615917576002615621856148e5565b5001805461ff0019166101001790558261563a856148e5565b50015460c81c1690811561590357068181018091116158ef578284526020916018835260409061567e61566f848489206159c2565b868852601886528388206147fa565b50906001600160a01b038092541696868152601b8652838120886001600160a01b031982541617905560ff826156b3896148e5565b50015460a01c16156158775782826156ca896148e5565b500154166156d7886148e5565b505490803b15610eac578551637921219560e11b81523060048201526001600160a01b038b16602482015260448101929092526001606483015260a06084830152600060a48301528290829060c490829084905af1801561586d57908291615859575b50505b81615747886148e5565b50015460f81c61583d575b868152601286528381205461581d575b868152601286528184822001546157fb575b86815260128652600284822001546157d8575b5091606093917f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b095936157b9886148e5565b50015416966157c7876148e5565b5054938251948552840152820152a3565b80808080866007541660028983200154905af16157f3614d66565b506157875780fd5b808080808660065416868983200154905af1615815614d66565b506157745780fd5b80808080866004541688822054905af1615835614d66565b506157625780fd5b6002615848886148e5565b5001805460ff191683179055615752565b61586290614976565b61053357803861573a565b85513d84823e3d90fd5b8282615882896148e5565b5001541661588f886148e5565b505490803b15610eac578551632142170760e11b81523060048201526001600160a01b038b166024820152604481019290925282908290606490829084905af1801561586d576158e0575b5061573d565b6158e990614976565b386158da565b602484634e487b7160e01b81526011600452fd5b602485634e487b7160e01b81526012600452fd5b606460405162461bcd60e51b815260206004820152601360248201527f636f6d7020686173206e6f20656e7472696573000000000000000000000000006044820152fd5b9067ffffffffffffffff8211612c32576040519161597f60208260051b01846149c2565b8252565b906040516159908161498a565b91546001600160a01b038116835260a01c63ffffffff166020830152565b80518210156148125760209160051b010190565b80546159cd8161595b565b928391602080950160009485528585208686925b848410615acf5750505050508151938415615ac75783945b808610615a7f57508415159283615a3d575b505050600014615a39576000198201918211615a25575090565b80634e487b7160e01b602492526011600452fd5b5090565b91925090600019850190858211615a6b5763ffffffff9291615a5e916159ae565b5101511614388080615a0b565b602485634e487b7160e01b81526011600452fd5b600190615a92818818831c828916614b8a565b918463ffffffff85615aa4868a6159ae565b510151161115615ab55750506159f9565b9096508101809111615a6b57946159f9565b505050905090565b6001918291615add85615983565b81520192019201919087906159e1565b600090808252602090601a825260ff60409281848620541680615ddd575b615dd357615b18836148e5565b50918060028094015460101c16615dc8578083615b34866148e5565b50015460081c16615dbd578386526011908183528084878920015460681c16600014615c28575083865280825263ffffffff9384848789200154841c1642101580615c16575b615c0a5780875281835284848789200154841c16421091821592615bdd575b5050615bd557838520820154901c82164211159283615bc3575b505050615bbd5790565b50600190565b84200154164210159050388080615bb3565b509250505090565b909150846001615bec846148e5565b50015460c81c16918752825283838688200154861c16143880615b99565b50505050505050600590565b50615c20816148e5565b505415615b7a565b80848789979495969720015460601c16600014615cd85750808652601583528486205482845260018688200154111580615cc6575b615cbb5785526015825283852054818352600185872001541115615cb3576015825283852054915260018385200154119182615c9d575b5050615bbd5790565b63ffffffff925083200154164210153880615c94565b505091505090565b505050505050600590565b50615cd0816148e5565b505415615c5d565b84868896959694939420015460701c16615cf5575b505050505090565b6001615d00836148e5565b5001549382875281815263ffffffff94858086898b200154891c169160c81c16101580615dab575b615c0a57846001615d38856148e5565b50015460c81c168388528282528585888a200154881c161115615da157846001615d61856148e5565b50015460c81c169287525282828587200154851c16119283615d8f575b505050615bbd573880808080615ced565b84200154164210159050388080615d7e565b5050509250505090565b50615db5836148e5565b505415615d28565b505050505050600390565b505050505050600490565b5050505050600690565b50816002615dea856148e5565b50015460081c1615615b0b565b906001600160a01b03600092168252601e60205260408220548015600014615e2157508180918190565b9091818152601d60205260ff6040822054169260026040600181852001549320015490565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690813b156107d0576000916024839260405194859384927fee8ca3b500000000000000000000000000000000000000000000000000000000845260048401525af18015615ec757615ebe5750565b614a2290614976565b6040513d6000823e3d90fd5b91929015615f345750815115615ee7575090565b3b15615ef05790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015615f475750805190602001fd5b615f6b9060405191829162461bcd60e51b835260206004840152602483019061474a565b0390fdfea2646970667358221220faa33b7a2bc03c99559eda5c4e9d0cdd591fb171befeb930b38945087479b6bf64736f6c6343000811003300000000000000000000000068baba24ee60933c6e22ea7701d9771285dde27a000000000000000000000000b3f5503f93d5ef84b06993a1975b9d21b962892f0000000000000000000000006118b56a6566dbd17b0f1c6ac9d3bdba11fbc8bf000000000000000000000000f9439027c8a21e1375ccdff31c46ca21f8603305000000000000000000000000a7ae8e1fdbb98d29be76f08dbeac46ea3f544855000000000000000000000000811074e281d86f862dc84e7df80ed38aa22aa23d000000000000000000000000f803b11bcff23d9ed1df84ee897beef26df9acdd
Deployed Bytecode
0x61010080604052600436101561004a575b50361561001c57600080fd5b6040513481527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460203392a2005b600060a05260003560e01c90816301e51ae8146147265750806301ffc9a7146146bb57806306efcb3f1461468d57806307717c95146145ef57806308f09a89146145cf5780630a21b1ac146145aa5780630d6f0d061461458a5780630de63a6e146145535780630f736d3b14614202578063150b7a021461419357806317b937e614614131578063215b788a146140f05780632bc1c52314613f6e5780632f3203fb14613f405780632fd8d08814613eff5780633074e1f314613ed95780633273425714613df75780633b7cb63314613dce578063413c027a14613d7057806341d1649914613ccd5780634487d3df14613c885780634ae1b26314613c165780634e0cd79914613bed578063573ea57514613ba75780635997ed4c14613b875780635b7baf641461387a5780635c7a6c181461384c5780635d966466146130e15780636368706e146130b857806365157dec14613077578063666e9a4f1461303657806368f5c0a51461300357806370a24fdc14612fe3578063715018a614612f8257806371df3afb14612f62578063727f0c2f1461228757806379ae5c261461221c57806381a3142d146121f35780638322fff2146121c2578063839e90dc146120e657806383e3a0d614611fcf5780638da5cb5b14611fa65780638dd2141514611f735780638e14968f14611e2e5780638e77fa291461180f578063973e1e43146117e85780639c286837146117c2578063a126285b14611799578063a2096fbc1461176b578063a63cd956146115cf578063a6a3b5b4146115af578063b1972df114611572578063b337ab061461133d578063b459160f1461131d578063b64d30bb14611148578063b6dbfca0146110b0578063b733cd4614611083578063b9d96b6b14611043578063bafbd66f14611002578063bb9c806314610fde578063bba2110314610f54578063bc197c8114610eb0578063c85582a014610e49578063cbf891fe14610aa5578063d1b27c3814610a89578063d1bb06e414610a60578063d3549ebd146109a4578063d564b55d1461092e578063d78b1af51461089e578063d9b80cae14610862578063da45a9cd1461081b578063e70abe92146107d5578063e8f83a431461074a578063ea67460b146106ef578063f10fb584146106c6578063f23a6e6114610657578063f2fde38b1461057b578063f40e834814610536578063f68016b714610513578063f9f2df95146104c8578063fd4db4ef1461049a5763fe78ff8a146103e25738610010565b3461047f57602036600319011261047f57600460206001600160a01b0360035416604051928380927fa75454f400000000000000000000000000000000000000000000000000000000825260a051905af1801561048d5760a05190610454575b61044e906004356155e2565b60a05180f35b506020813d8211610485575b8161046d602093836149c2565b8101031261047f5761044e9051610442565b60a05180fd5b3d9150610460565b6040513d60a051823e3d90fd5b3461047f57602036600319011261047f5760043560a0515260176020526020604060a0512054604051908152f35b3461047f57604036600319011261047f576104e16147a0565b60043560a05152601f6020526001600160a01b03604060a0512091166000526020526020604060002054604051908152f35b3461047f5760a05180600319360112610533576020600c54604051908152f35b80fd5b3461047f57606036600319011261047f5761ffff61055261484c565b61055a614abb565b6004356021551663ffffffff19602254161760225560443560235560a05180f35b3461047f57602036600319011261047f5761059461478a565b61059c614abb565b6001600160a01b038091169081156105ed57600154826001600160a01b0319821617600155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a360a05180f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b3461047f5760a036600319011261047f5761067061478a565b506106796147a0565b5060843567ffffffffffffffff811161047f5761069a9036906004016147b6565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b3461047f5760a051806003193601126105335760206001600160a01b0360035416604051908152f35b3461047f57602036600319011261047f5760043560a0515260196020526080604060a0512063ffffffff8154169060018101549060ff6003600283015492015416916040519384526020840152604083015215156060820152f35b3461047f57606036600319011261047f5761ffff6004358181168082036107d05761077361484c565b916044359380851685036107d05761079a856107958661271095610795614abb565b614b13565b160361047f5763ffff00009065ffff00000000600d549460201b169365ffffffffffff1916179160101b161717600d5560a05180f35b600080fd5b3461047f5760a051806003193601126105335760206040516001600160a01b037f000000000000000000000000b3f5503f93d5ef84b06993a1975b9d21b962892f168152f35b3461047f57604036600319011261047f576001600160a01b0361083c61478a565b610844614abb565b166001600160a01b0319600754161760075560243560095560a05180f35b3461047f57602036600319011261047f576001600160a01b0361088361478a565b1660a05152601e6020526020604060a0512054604051908152f35b3461047f57604036600319011261047f5760243580151581036107d05761044e906108e66001600160a01b038060045416331490811561091f575b8115610911575b50614b3f565b60016108f36004356148e5565b50019060ff60a01b1960ff60a01b835492151560a01b169116179055565b9050600554163314846108e0565b809150600154163314906108d9565b3461047f57602036600319011261047f576001600160a01b03806004541633148015610997575b801561098a575b61096590614b3f565b60a0518080809360043590600754165af161097e614d66565b501561047f5760a05180f35b506005548116331461095c565b5080600154163314610955565b3461047f5760208060031936011261047f5760043560a0515260188152604060a051209081546109d38161595b565b90828201809460a0515260a05184812090915b838310610a445785858860405191838301908484525180915260408301919360a0515b828110610a165784840385f35b855180516001600160a01b0316855282015163ffffffff168483015294810194604090930192600101610a09565b6001868192610a5285615983565b8152019201920191906109e6565b3461047f5760a051806003193601126105335760206001600160a01b0360065416604051908152f35b3461047f57602036600319011261047f5761044e60043561517e565b60208060031936011261047f57610aba614828565b906001600160a01b0390816004541633148015610e3c575b8015610e2f575b610ae290614b3f565b63ffffffff83169160018060ff610af886615aed565b16148015610e1c575b15610dd8578360a0515260178352604060a05120543403610d6e576002610b27866148e5565b50016201000062ff0000198254161790558360a0515260138352610b59604060a0514282822055601c86522054615e46565b610b62856148e5565b5054610bd8575b7f0b8df12448798f258ff0be8ba1fda71c37732daafff3a76064a29d11b2c795b29291610bc9918560a05152601284526000604060a05182600283832082815582878201550155601787522055610bbf876148e5565b50015416946148e5565b5054604051908152a360a05180f35b60ff81610be4876148e5565b50015460a01c1615610cbc578181610bfb876148e5565b500154168260075416610c0d876148e5565b5054823b1561047f57604051637921219560e11b815260a080513060048401526001600160a01b0394909416602483015260448201929092526001606482015260848101829052600060a482015290519092839160c4918391905af1801561048d57610ca7575b507f0b8df12448798f258ff0be8ba1fda71c37732daafff3a76064a29d11b2c795b29291610bc9915b9150919250610b69565b610cb090614976565b60a0518015610c745780fd5b8181610cc7876148e5565b500154168260075416610cd9876148e5565b5054823b1561047f57604051632142170760e11b815260a0513060048301526001600160a01b0390931660248201526044810191909152918290818060648101039160a051905af1801561048d57610d59575b507f0b8df12448798f258ff0be8ba1fda71c37732daafff3a76064a29d11b2c795b29291610bc991610c9d565b610d6290614976565b60a0518015610d2c5780fd5b6084836040519062461bcd60e51b82526004820152602a60248201527f4d7573742073656e64206261636b20656e6f7567682045544820746f20636f7660448201527f657220726566756e6473000000000000000000000000000000000000000000006064820152fd5b6064836040519062461bcd60e51b82526004820152601c60248201527f43616e206f6e6c792063616e63656c2061637469766520636f6d7073000000006044820152fd5b5060ff610e2885615aed565b1615610b01565b5060055482163314610ad9565b5081600154163314610ad2565b3461047f57610e57366147e4565b9060a05152600f60205260a05190604082206005821015610eac57610e7c92506148d1565b5080546001909101546040805160ff8416815260089390931c63ffffffff166020840152820152606090f35b0390f35b8280fd5b3461047f5760a036600319011261047f57610ec961478a565b50610ed26147a0565b5067ffffffffffffffff60443581811161047f57610ef4903690600401614a8a565b505060643581811161047f57610f0e903690600401614a8a565b505060843590811161047f57610f289036906004016147b6565b505060206040517fbc197c81000000000000000000000000000000000000000000000000000000008152f35b3461047f57602036600319011261047f5760043560a051526011602052610100604060a0512060ff8154916002600182015491015490604051938452602084015263ffffffff8082166040850152808260201c1660608501528160401c166080840152818160601c16151560a0840152818160681c16151560c084015260701c16151560e0820152f35b3461047f5760a0518060031936011261053357602061ffff600d5416604051908152f35b3461047f57602036600319011261047f576001600160a01b0361102361478a565b61102b614abb565b166001600160a01b0319600654161760065560a05180f35b3461047f57602036600319011261047f576001600160a01b0361106461478a565b1660a0515260208052602060ff604060a0512054166040519015158152f35b3461047f5761044e611094366147e4565b906110ab6001600160a01b03600354163314614b3f565b6155e2565b3461047f57604036600319011261047f576110c96147a0565b6001600160a01b0380600454163314801561113b575b801561112e575b6110ef90614b3f565b60043560a05152601d60205260a051918260036040822082815560006001820155600060028201550155169052601e60205260a0516000604082205580f35b50600554811633146110e6565b50806001541633146110df565b3461047f57604036600319011261047f57611161614828565b602435906001600160a01b0390816004541633148015611310575b8015611303575b61118c90614b3f565b611195816148e5565b50546112bf57821561047f5780836111ae6001936148e5565b505560ff826111bc836148e5565b50015460a01c161561124e576111d1906148e5565b5001541690813b1561047f57604051637921219560e11b815260a080513360048401523060248401526044830193909352600160648301526084820152600060a4820152918290818060c481015b039160a051905af1801561048d57611239575b5060a05180f35b61124290614976565b60a05180156112325780fd5b611257906148e5565b5001541690813b1561047f57604051632142170760e11b815260a05133600483015230602483015260448201929092529182908180606481015b039160a051905af1801561048d576112aa575b5061044e565b6112b390614976565b60a05180156112a45780fd5b606460405162461bcd60e51b815260206004820152601460248201527f436f6d7020616c726561647920757064617465640000000000000000000000006044820152fd5b5060055482163314611183565b508160015416331461117c565b3461047f5760a05180600319360112610533576020600b54604051908152f35b3461047f5760208060031936011261047f57600435906001600160a01b0390816004541633148015611565575b8015611558575b61137a90614b3f565b8260a051526011815260ff6002604060a05120015460601c1615611514578260a051526015815260a051604081205460118352604082205411159081611503575b5015611499576113ca836148e5565b505415611455578160035416803b1561047f5760405190632f215ddf60e21b82528460048301528160248160a05180945af1801561048d57611439575b50601a919260a051525260a0518080809360408220600160ff1982541617905560085416600a54905af161097e614d66565b61144290614976565b60a05192836114515792611407565b8380fd5b6064906040519062461bcd60e51b82526004820152601360248201527f55706461746520636f6d7020746f6b656e4944000000000000000000000000006044820152fd5b6084906040519062461bcd60e51b82526004820152602260248201527f43616e206e6f7420636c6f736520776974682063757272656e742066756e646960448201527f6e670000000000000000000000000000000000000000000000000000000000006064820152fd5b6040915060178352205415846113bb565b6064906040519062461bcd60e51b82526004820152601e60248201527f43616e206f6e6c7920636c6f736520776974682045544820706172616d7300006044820152fd5b5060055482163314611371565b508160015416331461136a565b3461047f57602036600319011261047f57608061159561159061478a565b615df7565b916040519315158452602084015260408301526060820152f35b3461047f5760a05180600319360112610533576020601454604051908152f35b3461047f57602036600319011261047f57600435600e5481101561047f57600590600e60005202807fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0154610ea87fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe83015461175c7fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff850154946116bf7fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c4016116b87fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40084016149e4565b92016149e4565b9260405196879687526001600160a01b038216602088015260ff91828160a01c161515604089015263ffffffff808260a81c1660608a01528160c81c166080890152828160e81c16151560a0890152828160f01c16151560c089015260f81c151560e08801528181161515610100880152818160081c16151561012088015260101c1615156101408601526101a08061016087015285019061474a565b9083820361018085015261474a565b3461047f57602036600319011261047f5760043560a05152601c6020526020604060a0512054604051908152f35b3461047f5760a051806003193601126105335760206001600160a01b0360085416604051908152f35b3461047f5760a05180600319360112610533576020600d5461ffff60405191831c168152f35b3461047f5760a0518060031936011261053357602061ffff600d5460101c16604051908152f35b608036600319011261047f5761182361483b565b61182b614d96565b611844600160ff61183d600435615aed565b1614614deb565b60ff60016118536004356148e5565b50015460f01c16611dea5761186c6024356004356150df565b6009543403611da657604080513360208201908152600435928201929092526118a281606081015b03601f1981018352826149c2565b5190208060a0515260196020526119046118e16118d663ffffffff604060a05120541663ffffffff60208701511690614e36565b61ffff861690614e36565b63ffffffff8060016118f46004356148e5565b50015460a81c1691161115614e4e565b60043560a05152601160205260ff6002604060a05120015460701c16611d3a575b63ffffffff6020830151169261ffff8116611cbf575b5060443560a05152601d60205260a05160ff604082205416611b86575b506119b061197e8463ffffffff60016119726004356148e5565b50015460c81c16614e36565b63ffffffff604051916119908361498a565b33835216602082015260043560a051526018602052604060a05120614f7f565b6040820190815160043560a0515260166020526119d4604060a05120918254614b8a565b9055611a3360016119e66004356148e5565b50016119fc8663ffffffff835460c81c16614e36565b7fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff60c81b83549260c81b169116179055565b8060a051526019602052604060a05120805463ffffffff611a5687828416614e36565b169063ffffffff191617905581519060a051526019602052611a826002604060a0512001918254614b8a565b90556001600160a01b039081600254169051813b1561047f576040517f79cc679000000000000000000000000000000000000000000000000000000000815260a08051336004840152602483019390935251909283916044918391905af1801561048d57611b71575b506007541660a05180808093600954905af1611b05614d66565b501561047f5763ffffffff60208192015116916040519233845260208401521660408201526024356060820152600060808201524260a08201527f6eb35d7bc0df1598449265e661b60df86ce76054b7d69d2286d87494ac2ab4bb60c060043592a260a0516001815580f35b611b7a90614976565b60a0518015611aeb5780fd5b604090601f602052203360005260205260406000205415611c8f575b60443560a05152601f60205260a05160408120336000526020526040600020544210156119585763ffffffff602084015116906044359052601d602052611bf36001604060a0512001918254614b8a565b9055611c1a611c0b63ffffffff602085015116614f46565b63ffffffff6021549116614f5f565b60443560a05152601d602052611c3a6002604060a0512001918254614b8a565b90553360a051526020805260ff604060a05120541615611c5b575b83611958565b91611c6f9063ffffffff6022541690614e36565b913360a0515260208052604060a05120600160ff19825416179055611c55565b611c9b60235442614b8a565b60443560a05152601f602052604060a0512033600052602052604060002055611ba2565b9261ffff611d3392943360a05152601e60205260a0516040812054809152601d602052611d016002604060a05120015484611cf985614ee4565b161115614efb565b82611d0b83614ee4565b169060a05152601d602052611d2a6002604060a0512001918254614d04565b90551690614e36565b918361193b565b611da1611d7863ffffffff6001611d526004356148e5565b50015460c81c16611d7361ffff87169163ffffffff60208801511690614e36565b614e36565b60043560a05152601160205263ffffffff806002604060a05120015460401c1691161115614e99565b611925565b606460405162461bcd60e51b815260206004820152600f60248201527f466565206e6f7420636f766572656400000000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601e60248201527f436f6d70206973207265737472696374656420746f206f6e6c792045544800006044820152fd5b3461047f57611e716003611e413661489d565b9291611e6c6001600160a01b0395929580600454163314908115611f64575b8115611f565750614b3f565b6148e5565b50019067ffffffffffffffff8111611f3e57611e9781611e918454614920565b84614bea565b60a051601f8211600114611ed65781929360a05192611ecb575b50508160011b916000199060031b1c191617905560a05180f35b013590508380611eb1565b601f1982169383825260a05191602080842093905b878210611f26575050836001959610611f0c575b505050811b01905561044e565b0135600019600384901b60f8161c19169055838080611eff565b80600184968294958701358155019501920190611eeb565b634e487b7160e01b60a051526041600452602460a051fd5b9050600554163314876108e0565b80915060015416331490611e60565b3461047f57611f81366147e4565b9060a05152601060205260a05190604082206005821015610eac57610e7c92506148d1565b3461047f5760a051806003193601126105335760206001600160a01b0360015416604051908152f35b3461047f57606036600319011261047f57611fe861478a565b602435611ff361485d565b6001600160a01b039283918260045416331480156120d9575b80156120cc575b61201c90614b3f565b156120825716916007541690823b1561047f57604051637921219560e11b815260a080513060048401526001600160a01b0390941660248301526044820192909252600160648201526084810191909152600060a4820152918290818060c4810161121f565b16916007541690823b1561047f57604051632142170760e11b815260a0513060048301526001600160a01b0390931660248201526044810191909152918290818060648101611291565b5060055483163314612013565b508260015416331461200c565b3461047f5761212260046120f93661489d565b9291611e6c6001600160a01b03959295808554163314908115611f64578115611f565750614b3f565b50019067ffffffffffffffff8111611f3e5761214281611e918454614920565b60a051601f82116001146121755781929360a05192611ecb5750508160011b916000199060031b1c191617905560a05180f35b601f1982169383825260a05191602080842093905b8782106121aa575050836001959610611f0c57505050811b01905561044e565b8060018496829495870135815501950192019061218a565b3461047f5760a0518060031936011261053357602060405173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8152f35b3461047f5760a051806003193601126105335760206001600160a01b0360055416604051908152f35b3461047f5760a036600319011261047f576004356001600160a01b0380821680920361047f5761224a6147a0565b612252614abb565b6001600160a01b03199283600354161760035516906008541617600855604435600a55606435600b55608435600c5560a05180f35b61026036600319011261047f5761229c61478a565b60e0526122a761485d565b6064351515606435036107d05760843563ffffffff811681036107d05760a4359163ffffffff831683036107d05761ffff806080528060c4351660c435036107d05760e435908160c0528116036107d0576101443567ffffffffffffffff811161047f5761231990369060040161486c565b67ffffffffffffffff610164351161047f5761233b366101643560040161486c565b90610184359182151583036107d0576101a4359283151584036107d0576101c43515156101c435036107d0576101e43515156101e435036107d05761020435151561020435036107d05767ffffffffffffffff610224351161047f576123a736610224356004016147b6565b9067ffffffffffffffff610244351161047f576123ca36610244356004016147b6565b926001600160a01b036004541633148015612f4e575b8015612f35575b6123f090614b3f565b6123ff600a54600b5490614b8a565b340361047f576101c4358015612f2b575b8015612f21575b1561047f5760a0519260643515612f1757602435155b156114515760643515612f0f57835b5060643515612ed157612450913691614bb3565b925b60405193846101a081011067ffffffffffffffff6101a087011117612c32576124f0936101a0860160405260243586526001600160a01b0360e0511660208701528c1515604087015260805160c05116606087015260a051608087015286151560a087015289151560c0870152606435151560e0870152151561010086015260a05161012086015260a0516101408601526101608501523691614bb3565b610180820152600e5468010000000000000000811015611f3e5780600161251a9201600e556148e5565b919091612eba5780518255600182016001600160a01b036020830151166001600160a01b031982541617815561256d60408301511515829060ff60a01b1960ff60a01b835492151560a01b169116179055565b6060820151815460808401517fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff90911660a89290921b78ffffffff000000000000000000000000000000000000000000169190911760c89190911b63ffffffff60c81b1617815560a0820151151581547eff00000000000000000000000000000000000000000000000000000000000060c0850151151560f01b16907cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7dff00000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000060e0880151151560f81b169460e81b16911617171790556101008101511515600283015461ff00610120840151151560081b169060ff62ff0000610140860151151560101b1693169062ffffff1916171717600283015561016081015190815167ffffffffffffffff8111611f3e576126f0816126e76003870154614920565b60038701614bea565b60a051602090601f8311600114612e43575081906101809460a05192612e38575b50508160011b916000199060031b1c19161760038401555b0151805167ffffffffffffffff8111611f3e576127568161274d6004860154614920565b60048601614bea565b60a051602090601f8311600114612dc85750819060049360a05192612dbd575b50508160011b916000199060031b1c1916179101555b15612d0f575b505015612c48575b5050604051908161010081011067ffffffffffffffff61010084011117612c3257610100820160405261010435825261012435602083015263ffffffff8316604083015263ffffffff8416606083015260805160c4351660808301526101c435151560a08301526101e435151560c083015261020435151560e0830152600e5480600019810111612b0d576000190160a05152601160205260a051916002604084208251815560208301516001820155019063ffffffff60408201511663ffffffff1983541617825561289463ffffffff606083015116839067ffffffff0000000082549160201b169067ffffffff000000001916179055565b60808101519082546cff00000000000000000000000060a0830151151560601b16906bffffffff00000000000000006eff000000000000000000000000000060e06dff0000000000000000000000000060c0870151151560681b16950151151560701b169460401b16906effffffffffffff0000000000000000191617171717905560643515612b25575b5050600e549081600019810111612b0d576129c89160206040517f07717c9500000000000000000000000000000000000000000000000000000000828201526000198301602482015260248152612975816149a6565b6040519485917fb9f45adb000000000000000000000000000000000000000000000000000000008352306004840152630f736d3b60e01b602484015230604484015260a0606484015260a483019061474a565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6084830152818060a0519203916001600160a01b037f000000000000000000000000b3f5503f93d5ef84b06993a1975b9d21b962892f165af192831561048d5760a05193612ad9575b506000190160a05152601c60205260a051916040832055600e54916000198301928311612ac3575063ffffffff6020938160405193168352168382015260805160c05116604082015260805160c4351660608201526064351515608082015260243590827fa925e3e1c3b2bb604e7317ae84b89954a653edc5b3bddb74ce5b0138c20f570360a06001600160a01b0360e0511693a4604051908152f35b634e487b7160e01b90526011600452602460a051fd5b9092506020813d602011612b05575b81612af5602093836149c2565b8101031261047f57519184612a26565b3d9150612ae8565b634e487b7160e01b60a051526011600452602460a051fd5b15612bba57506001600160a01b0360e051163b1561047f57604051637921219560e11b815260a08051336004840152306024808501919091523560448401526001606484015260848301829052600060a4840152905160e051839160c4918391906001600160a01b03165af1801561048d57612ba5575b505b828061291f565b612bae90614976565b60a0518015612b9c5780fd5b6001600160a01b0360e051163b156105335750604051632142170760e11b815260a05133600483015230602480840191909152356044830152818060648101038160a0516001600160a01b0360e051165af1801561048d57612c1d575b50612b9e565b612c2690614976565b60a0518015612c175780fd5b634e487b7160e01b600052604160045260246000fd5b612c53811515614c3e565b60a0515b818110612c64575061279a565b612c8a63ffffffff612c826020612c7c858789614c98565b01614ca8565b161515614cb9565b612c9a6020612c7c838587614c98565b906040612ca8828587614c98565b013563ffffffff60405193612cbc856149a6565b60ff841685521660208401526040830152600e5480600019810111612b0d57612d0a92612d05916000190160a051526010602052612cff83604060a051206148d1565b90614d11565b614c89565b612c57565b612d1a811515614c3e565b60a0515b818110612d2b5750612792565b612d4363ffffffff612c826020612c7c858789614c98565b612d536020612c7c838587614c98565b906040612d61828587614c98565b013563ffffffff60405193612d75856149a6565b60ff841685521660208401526040830152600e5480600019810111612b0d57612db892612d05916000190160a05152600f602052612cff83604060a051206148d1565b612d1e565b015190508d80612776565b60048501905260a051602081209293905b601f1985168110612e205750918391600193600495601f19811610612e07575b505050811b0191015561278c565b015160001960f88460031b161c191690558d8080612df9565b91926020600181928685015181550194019201612dd9565b015190508e80612711565b6003869593949501905260a0519160208320925b601f1985168110612ea257509183916001936101809695601f19811610612e89575b505050811b016003840155612729565b015160001960f88460031b161c191690558e8080612e79565b91926020600181928685015181550194019201612e57565b634e487b7160e01b60a05152602460a05180600452fd5b5050604051612edf8161498a565b600481527f6e756c6c00000000000000000000000000000000000000000000000000000000602082015292612452565b60019361243c565b602435151561242d565b5061020435612417565b506101e435612410565b506123f06001600160a01b0360055416331490506123e7565b506001600160a01b036001541633146123e0565b3461047f5760a05180600319360112610533576020602354604051908152f35b3461047f5760a0518060031936011261053357612f9d614abb565b60006001600160a01b036001546001600160a01b03198116600155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360a05180f35b3461047f5760a05180600319360112610533576020600a54604051908152f35b3461047f57602036600319011261047f5760043560a05152601a602052602060ff604060a0512054166040519015158152f35b3461047f57602036600319011261047f576001600160a01b0361305761478a565b61305f614abb565b166001600160a01b0319600254161760025560a05180f35b3461047f57602036600319011261047f576001600160a01b0361309861478a565b6130a0614abb565b166001600160a01b0319600454161760045560a05180f35b3461047f57602036600319011261047f5760206130d6600435615aed565b60ff60405191168152f35b608036600319011261047f576130f5614828565b6130fd61483b565b90613106614d96565b61311c600160ff61183d63ffffffff8516615aed565b60ff6001613129836148e5565b50015460e81c166138085761314660243563ffffffff8316615071565b6040810151340361379f5760408051336020820190815263ffffffff8516928201929092526131788160608101611894565b5190208060a0515260196020526131c86131b76131ac63ffffffff604060a05120541663ffffffff60208701511690614e36565b61ffff871690614e36565b63ffffffff8060016118f4886148e5565b63ffffffff831660a05152601160205260ff6002604060a05120015460701c16613736575b63ffffffff6020830151169361ffff81166136f5575b506044358060a05152601d60205260a05160ff6040822054166135d3575b505061327061323a8563ffffffff6001611972886148e5565b63ffffffff6040519161324c8361498a565b33835216602082015263ffffffff851660a051526018602052604060a05120614f7f565b61327e60016119e6856148e5565b8060a051526019602052604060a05120805463ffffffff6132a187828416614e36565b169063ffffffff191617905560408201519060a0515260196020526132d06001604060a0512001918254614b8a565b905563ffffffff821660a05152601160205260ff6002604060a05120015460601c166000146135945763ffffffff821660a05152601560205260a0516040812054601160205260408220541160001461348f575060a051808080346001600160a01b03600554165af1613341614d66565b501561047f5761ffff600d54166127109081039261ffff8411612b0d57604060c09363ffffffff9361339861ffff7f6eb35d7bc0df1598449265e661b60df86ce76054b7d69d2286d87494ac2ab4bb98163461500f565b0484841660a0515260176020526133b58360a05120918254614b8a565b90555b612710806133cf61ffff600d5460101c163461500f565b0485851660a0515260126020526133ef60018560a0512001918254614b8a565b905561340461ffff600d5460201c163461500f565b0484841660a05152601260205261342460028460a0512001918254614b8a565b9055015182821660a051526015602052613445604060a05120918254614b8a565b9055816001613453836148e5565b50015460c81c16826040519633885216602087015260408601526024356060860152600160808601524260a08601521692a260a0516001815580f35b7f6eb35d7bc0df1598449265e661b60df86ce76054b7d69d2286d87494ac2ab4bb92604060c0938163ffffffff94601760205220541515600014613564576127106134e061ffff600d54163461500f565b0484841660a05152601760205260a051818482205411600014613521575084841660a05152601760205261351a8360a05120918254614d04565b90556133b8565b8390205461352e91614d04565b84841660a05152601260205261354a8360a05120918254614b8a565b905583831660a05152601760205260a051828120556133b8565b61271061357761ffff600d54163461500f565b0484841660a05152601260205261351a8360a05120918254614b8a565b63ffffffff7f6eb35d7bc0df1598449265e661b60df86ce76054b7d69d2286d87494ac2ab4bb92604060c09361271061357761ffff600d54163461500f565b604090601f6020522033600052602052604060002054156136c7575b8060a05152601f60205260a0516040812033600052602052604060002054421015613221578163ffffffff6020860151169152601d60205261363b6001604060a0512001918254614b8a565b9055613653611c0b63ffffffff602086015116614f46565b9060a05152601d6020526136716002604060a0512001918254614b8a565b90553360a051526020805260ff604060a05120541615613693575b8480613221565b926136a79063ffffffff6022541690614e36565b923360a0515260208052604060a05120600160ff1982541617905561368c565b6136d360235442614b8a565b8160a05152601f602052604060a05120336000526020526040600020556135ef565b9361ffff61372f92953360a05152601e60205260a0516040812054809152601d602052611d016002604060a05120015484611cf985614ee4565b9284613203565b61379a61376d63ffffffff600161374c876148e5565b50015460c81c16611d7361ffff88169163ffffffff60208801511690614e36565b63ffffffff851660a05152601160205263ffffffff806002604060a05120015460401c1691161115614e99565b6131ed565b608460405162461bcd60e51b8152602060048201526024808201527f6d73672e76616c7565206d75737420626520657175616c20746f20746865207060448201527f72696365000000000000000000000000000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152601f60248201527f436f6d70206973207265737472696374656420746f206f6e6c792044555354006044820152fd5b3461047f57602036600319011261047f5760043560a0515260156020526020604060a0512054604051908152f35b3461047f5760208060031936011261047f5760043590613898614d96565b600460ff6138a584615aed565b1603613b43578160a05152601381526138c7604060a051205460145490614b8a565b4211613aff57604080513383820190815260208101859052916138ed9082908401611894565b51902060a0515260198152604060a0512090600382019160ff835416613abb576002600182019182548660a0515260158552613930604060a05120918254614d04565b9055019283548560a0515260168452613950604060a05120918254614d04565b9055805460ff19166001179055805480613a59575b508254806139b3575b50916060917f2551b91c11f1d3d4411df969d26e06f415cad35942a7dcbc5cdfec12751e8a0c9354915490604051928352820152336040820152a260a0516001815580f35b9290916001600160a01b036002541693843b1561047f576040517f40c10f1900000000000000000000000000000000000000000000000000000000815260a08051336004840152602483019390935251909586916044918391905af192831561048d577f2551b91c11f1d3d4411df969d26e06f415cad35942a7dcbc5cdfec12751e8a0c94606094613a4a575b509193509161396e565b613a5390614976565b86613a40565b60a05180808093335af1613a6b614d66565b5015613a775784613965565b6064826040519062461bcd60e51b82526004820152601060248201527f4661696c2073656e6420726566756e64000000000000000000000000000000006044820152fd5b6064826040519062461bcd60e51b82526004820152601060248201527f616c726561647920726566756e646564000000000000000000000000000000006044820152fd5b6064906040519062461bcd60e51b82526004820152601260248201527f636c61696d2074696d65206578706972656400000000000000000000000000006044820152fd5b6064906040519062461bcd60e51b82526004820152600a60248201527f6e6f74206661696c6564000000000000000000000000000000000000000000006044820152fd5b3461047f5760a05180600319360112610533576020600954604051908152f35b3461047f5760a051806003193601126105335760206040516001600160a01b037f0000000000000000000000003caca7b48d0573d793d3b0279b5f0029180e83b6168152f35b3461047f5760a051806003193601126105335760206001600160a01b0360025416604051908152f35b3461047f57602036600319011261047f57613c4d6001600160a01b0380600454163314908115613c79575b8115613c6b5750614b3f565b60043560a05152601d60205260a0516040812060ff19815416905580f35b9050600554163314826108e0565b80915060015416331490613c41565b3461047f57602036600319011261047f5760043560a0515260126020526060604060a05120805490600260018201549101549060405192835260208301526040820152f35b3461047f57604036600319011261047f5760243563ffffffff8116810361047f57613d146001600160a01b0380600454163314908115613d61575b8115613d535750614b3f565b60043560a051526011602052613d5060a05191600260408420019067ffffffff0000000082549160201b169067ffffffff000000001916179055565b80f35b9050600554163314836108e0565b80915060015416331490613d08565b3461047f57602036600319011261047f5760043560a05152601d6020526080604060a0512060ff815416906001810154906001600160a01b036003600283015492015416916040519315158452602084015260408301526060820152f35b3461047f5760a051806003193601126105335760206001600160a01b0360045416604051908152f35b3461047f57604036600319011261047f57613e106147a0565b604051613e1c8161495a565b60a051815260a051602082015260a0516040820152606060a051910152604051613e688161189460208201946004359086602090939291936001600160a01b0360408201951681520152565b51902060a0515260196020526080604060a05120604051613e888161495a565b63ffffffff82541691828252600181015460208301908152606060ff600360028501549460408701958652015416930192151583526040519384525160208401525160408301525115156060820152f35b3461047f5760a0518060031936011261053357602063ffffffff60225416604051908152f35b3461047f57602036600319011261047f57613f356001600160a01b0380600454163314908115613c79578115613c6b5750614b3f565b61044e600435615e46565b3461047f57602036600319011261047f5760043560a0515260136020526020604060a0512054604051908152f35b3461047f5760208060031936011261047f5760043567ffffffffffffffff811161047f57613fa09036906004016147b6565b9190613faa614d96565b3360a05152601e8252604060a05120546140ac5760a051903592828110614098575b50829052601d815260a0516001604082200154159081614087575b508061407e575b1561403a57601d913360a05152601e825260a051816040822055525260a05160408120600160ff1982541617905560036040822001336001600160a01b03198254161790556001815580f35b6064906040519062461bcd60e51b82526004820152601b60248201527f726566657272616c436f646520616c72656164792065786973747300000000006044820152fd5b50811515613fee565b60ff91506040902054161583613fe7565b60001990830360031b1b9092169183613fcc565b6064826040519062461bcd60e51b82526004820152601560248201527f5573657220616c726561647920656e726f6c6c656400000000000000000000006044820152fd5b3461047f57602036600319011261047f576001600160a01b0361411161478a565b614119614abb565b166001600160a01b0319600554161760055560a05180f35b3461047f5761413f366147e4565b9060a05152601860205260a0516040812090815483101561053357610ea861416784846147fa565b5054604080516001600160a01b038316815260a09290921c63ffffffff16602083015290918291820190565b3461047f57608036600319011261047f576141ac61478a565b506141b56147a0565b5060643567ffffffffffffffff811161047f576141d69036906004016147b6565b505060206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b3461047f5760208060031936011261047f57600435906001600160a01b03807f000000000000000000000000b3f5503f93d5ef84b06993a1975b9d21b962892f1680330361450f5790604060049261425d600c543a10615133565b8151938480927fb810c6360000000000000000000000000000000000000000000000000000000082525afa801561048d5760a0519283916144cc575b50811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8103614357575060a05180809381937f0000000000000000000000003caca7b48d0573d793d3b0279b5f0029180e83b6165af16142ec614d66565b501561431357601c915b6142ff8161517e565b60a051525261044e604060a0512054615e46565b6064906040519062461bcd60e51b82526004820152601e60248201527f5f7472616e736665723a20455448207472616e73666572206661696c656400006044820152fd5b6143d0916143de61442d94604051948591888301947fa9059cbb0000000000000000000000000000000000000000000000000000000086527f0000000000000000000000003caca7b48d0573d793d3b0279b5f0029180e83b61660248401602090939291936001600160a01b0360408201951681520152565b03601f1981018552846149c2565b604051926143eb8461498a565b8584527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648685015260a051918291519082855af1614427614d66565b91615ed3565b80518061443f575b5050601c916142f6565b8183918101031261047f5781015180159081150361047f57614462578280614435565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9250506040823d604011614507575b816144e8604093836149c2565b8101031261047f5782825192015191818316830361047f579181614299565b3d91506144db565b6064836040519062461bcd60e51b82526004820152601160248201527f4f707352656164793a206f6e6c794f70730000000000000000000000000000006044820152fd5b3461047f57602036600319011261047f5760043560a05152601b60205260206001600160a01b03604060a051205416604051908152f35b3461047f5760a05180600319360112610533576020600e54604051908152f35b3461047f57602036600319011261047f576145c3614abb565b60043560145560a05180f35b3461047f5760a05180600319360112610533576020602154604051908152f35b3461047f57602036600319011261047f57600435600260ff61461083615aed565b161480614672575b8061465f575b60405191630f736d3b60e01b6020840152602483015260248252614641826149a6565b610ea86040519283921515835260406020840152604083019061474a565b50614669816148e5565b5054151561461e565b508060a05152601a60205260ff604060a05120541615614618565b3461047f57602036600319011261047f5760043560a0515260166020526020604060a0512054604051908152f35b3461047f57602036600319011261047f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361047f576020907f01ffc9a70000000000000000000000000000000000000000000000000000000060405191148152f35b346107d05760003660031901126107d0576020906001600160a01b03600754168152f35b919082519283825260005b848110614776575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201614755565b600435906001600160a01b03821682036107d057565b602435906001600160a01b03821682036107d057565b9181601f840112156107d05782359167ffffffffffffffff83116107d057602083818601950101116107d057565b60409060031901126107d0576004359060243590565b80548210156148125760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b6004359063ffffffff821682036107d057565b6064359061ffff821682036107d057565b6024359061ffff821682036107d057565b6044359081151582036107d057565b9181601f840112156107d05782359167ffffffffffffffff83116107d057602080850194606085020101116107d057565b9060406003198301126107d057600435916024359067ffffffffffffffff82116107d0576148cd916004016147b6565b9091565b9060058110156148125760011b0190600090565b600e5481101561481257600590600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b90600182811c92168015614950575b602083101461493a57565b634e487b7160e01b600052602260045260246000fd5b91607f169161492f565b6080810190811067ffffffffffffffff821117612c3257604052565b67ffffffffffffffff8111612c3257604052565b6040810190811067ffffffffffffffff821117612c3257604052565b6060810190811067ffffffffffffffff821117612c3257604052565b90601f8019910116810190811067ffffffffffffffff821117612c3257604052565b90604051918260008254926149f884614920565b908184526001948581169081600014614a675750600114614a24575b5050614a22925003836149c2565b565b9093915060005260209081600020936000915b818310614a4f575050614a2293508201013880614a14565b85548884018501529485019487945091830191614a37565b915050614a2294506020925060ff191682840152151560051b8201013880614a14565b9181601f840112156107d05782359167ffffffffffffffff83116107d0576020808501948460051b0101116107d057565b6001600160a01b03600154163303614acf57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b91909161ffff80809416911601918211614b2957565b634e487b7160e01b600052601160045260246000fd5b15614b4657565b606460405162461bcd60e51b815260206004820152601260248201527f53656e646572206e6f7420616c6c6f77656400000000000000000000000000006044820152fd5b91908201809211614b2957565b67ffffffffffffffff8111612c3257601f01601f191660200190565b929192614bbf82614b97565b91614bcd60405193846149c2565b8294818452818301116107d0578281602093846000960137010152565b90601f8111614bf857505050565b600091825260208220906020601f850160051c83019410614c34575b601f0160051c01915b828110614c2957505050565b818155600101614c1d565b9092508290614c14565b15614c4557565b606460405162461bcd60e51b815260206004820152600960248201527f4e6f2070726963657300000000000000000000000000000000000000000000006044820152fd5b6000198114614b295760010190565b9190811015614812576060020190565b3563ffffffff811681036107d05790565b15614cc057565b606460405162461bcd60e51b815260206004820152600f60248201527f6e756d456e7472696573206973203000000000000000000000000000000000006044820152fd5b91908203918211614b2957565b9190614d505760408160ff60019351168454908060ff19831617865564ffffffff00602084015160081b169164ffffffffff1916171784550151910155565b634e487b7160e01b600052600060045260246000fd5b3d15614d91573d90614d7782614b97565b91614d8560405193846149c2565b82523d6000602084013e565b606090565b600260005414614da7576002600055565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b15614df257565b606460405162461bcd60e51b815260206004820152601260248201527f436f6d70206973206e6f742041637469766500000000000000000000000000006044820152fd5b91909163ffffffff80809416911601918211614b2957565b15614e5557565b606460405162461bcd60e51b815260206004820152601760248201527f426f7567687420746f6f206d616e7920656e74726965730000000000000000006044820152fd5b15614ea057565b606460405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820656e74726965732072656d61696e696e67000000006044820152fd5b906103e861ffff80931602918216918203614b2957565b15614f0257565b606460405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768206372656469747320617661696c61626c65000000006044820152fd5b906103e863ffffffff80931602918216918203614b2957565b8115614f69570490565b634e487b7160e01b600052601260045260246000fd5b805468010000000000000000811015612c3257614fa1916001820181556147fa565b919091614d50576001600160a01b038151167fffffffffffffffff00000000000000000000000000000000000000000000000077ffffffff00000000000000000000000000000000000000006020855494846001600160a01b03198716178755015160a01b16921617179055565b81810292918115918404141715614b2957565b6040519061502f826149a6565b60006040838281528260208201520152565b9060405161504e816149a6565b60406001829463ffffffff815460ff8116865260081c1660208501520154910152565b9061507a615022565b50600091808352600f6020528160ff61509682604087206148d1565b505416146150be575050604051906150ad826149a6565b808252806020830152604082015290565b906040836150d6936150dc9552600f602052206148d1565b50615041565b90565b906150e8615022565b5060009180835260106020528160ff61510482604087206148d1565b5054161461511b575050604051906150ad826149a6565b906040836150d6936150dc95526010602052206148d1565b1561513a57565b606460405162461bcd60e51b815260206004820152601360248201527f63616e7420626520736574746c6564206e6f77000000000000000000000000006044820152fd5b615195600260ff61518e84615aed565b1614615133565b61519e816148e5565b5054906000911561559e576151b2816148e5565b5060019081015463ffffffff9060c81c81161561526d57506001600160a01b03918260035416803b1561526957848091602460405180948193632f215ddf60e21b83528760048401525af1801561525e579085939291615244575b508293839283928352601a602052604083209060ff1982541617905560085416600a54905af161523b614d66565b50156105335750565b6152519093919293614976565b611451579083913861520d565b6040513d87823e3d90fd5b8480fd5b828452601a6020526040808520805460ff1916841790559190615296600260ff61518e87615aed565b816152a0856148e5565b50015460c81c1661555b5760026152b6846148e5565b5001805461ff00191661010017905560026152d0846148e5565b5001805462ff00001916620100001790556152ea836148e5565b505461538f575b7f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b09181606092615320866148e5565b506001600160a01b03928391015416867f4e62c365b3ffd9d3b267ad690927202784fc948df3e8920f060e9db522556471602061535c836148e5565b50548751908152a361536d866148e5565b500154169461537b856148e5565b5054918051928352816020840152820152a3565b60ff8161539b856148e5565b50015460a01c161561548557806153b1846148e5565b5001546007546001600160a01b0390811691166153cd856148e5565b505491813b15615481578451637921219560e11b81523060048201526001600160a01b0391909116602482015260448101929092526001606483015260a06084830152600060a48301528590829060c490829084905af1801561547757908591615463575b50507f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b0916060915b915091506152f1565b61546c90614976565b611451578338615432565b83513d87823e3d90fd5b8680fd5b8061548f846148e5565b5001546007546001600160a01b0390811691166154ab856148e5565b505491813b15615481578451632142170760e11b81523060048201526001600160a01b03919091166024820152604481019290925285908290606490829084905af1801561547757615523575b507f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b09160609161545a565b91606091946155527f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b094614976565b949150916154f8565b6064825162461bcd60e51b815260206004820152601060248201527f636f6d702068617320656e7472696573000000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601360248201527f75706461746520636f6d7020746f6b656e4944000000000000000000000000006044820152fd5b6155f2600660ff61518e84615aed565b6155fb816148e5565b506001809101549260009363ffffffff809160c81c1615615917576002615621856148e5565b5001805461ff0019166101001790558261563a856148e5565b50015460c81c1690811561590357068181018091116158ef578284526020916018835260409061567e61566f848489206159c2565b868852601886528388206147fa565b50906001600160a01b038092541696868152601b8652838120886001600160a01b031982541617905560ff826156b3896148e5565b50015460a01c16156158775782826156ca896148e5565b500154166156d7886148e5565b505490803b15610eac578551637921219560e11b81523060048201526001600160a01b038b16602482015260448101929092526001606483015260a06084830152600060a48301528290829060c490829084905af1801561586d57908291615859575b50505b81615747886148e5565b50015460f81c61583d575b868152601286528381205461581d575b868152601286528184822001546157fb575b86815260128652600284822001546157d8575b5091606093917f3be67b2f7a0ed2dae12f874ad3eb7201a9160a795f4514f8810ddee277eba8b095936157b9886148e5565b50015416966157c7876148e5565b5054938251948552840152820152a3565b80808080866007541660028983200154905af16157f3614d66565b506157875780fd5b808080808660065416868983200154905af1615815614d66565b506157745780fd5b80808080866004541688822054905af1615835614d66565b506157625780fd5b6002615848886148e5565b5001805460ff191683179055615752565b61586290614976565b61053357803861573a565b85513d84823e3d90fd5b8282615882896148e5565b5001541661588f886148e5565b505490803b15610eac578551632142170760e11b81523060048201526001600160a01b038b166024820152604481019290925282908290606490829084905af1801561586d576158e0575b5061573d565b6158e990614976565b386158da565b602484634e487b7160e01b81526011600452fd5b602485634e487b7160e01b81526012600452fd5b606460405162461bcd60e51b815260206004820152601360248201527f636f6d7020686173206e6f20656e7472696573000000000000000000000000006044820152fd5b9067ffffffffffffffff8211612c32576040519161597f60208260051b01846149c2565b8252565b906040516159908161498a565b91546001600160a01b038116835260a01c63ffffffff166020830152565b80518210156148125760209160051b010190565b80546159cd8161595b565b928391602080950160009485528585208686925b848410615acf5750505050508151938415615ac75783945b808610615a7f57508415159283615a3d575b505050600014615a39576000198201918211615a25575090565b80634e487b7160e01b602492526011600452fd5b5090565b91925090600019850190858211615a6b5763ffffffff9291615a5e916159ae565b5101511614388080615a0b565b602485634e487b7160e01b81526011600452fd5b600190615a92818818831c828916614b8a565b918463ffffffff85615aa4868a6159ae565b510151161115615ab55750506159f9565b9096508101809111615a6b57946159f9565b505050905090565b6001918291615add85615983565b81520192019201919087906159e1565b600090808252602090601a825260ff60409281848620541680615ddd575b615dd357615b18836148e5565b50918060028094015460101c16615dc8578083615b34866148e5565b50015460081c16615dbd578386526011908183528084878920015460681c16600014615c28575083865280825263ffffffff9384848789200154841c1642101580615c16575b615c0a5780875281835284848789200154841c16421091821592615bdd575b5050615bd557838520820154901c82164211159283615bc3575b505050615bbd5790565b50600190565b84200154164210159050388080615bb3565b509250505090565b909150846001615bec846148e5565b50015460c81c16918752825283838688200154861c16143880615b99565b50505050505050600590565b50615c20816148e5565b505415615b7a565b80848789979495969720015460601c16600014615cd85750808652601583528486205482845260018688200154111580615cc6575b615cbb5785526015825283852054818352600185872001541115615cb3576015825283852054915260018385200154119182615c9d575b5050615bbd5790565b63ffffffff925083200154164210153880615c94565b505091505090565b505050505050600590565b50615cd0816148e5565b505415615c5d565b84868896959694939420015460701c16615cf5575b505050505090565b6001615d00836148e5565b5001549382875281815263ffffffff94858086898b200154891c169160c81c16101580615dab575b615c0a57846001615d38856148e5565b50015460c81c168388528282528585888a200154881c161115615da157846001615d61856148e5565b50015460c81c169287525282828587200154851c16119283615d8f575b505050615bbd573880808080615ced565b84200154164210159050388080615d7e565b5050509250505090565b50615db5836148e5565b505415615d28565b505050505050600390565b505050505050600490565b5050505050600690565b50816002615dea856148e5565b50015460081c1615615b0b565b906001600160a01b03600092168252601e60205260408220548015600014615e2157508180918190565b9091818152601d60205260ff6040822054169260026040600181852001549320015490565b6001600160a01b037f000000000000000000000000b3f5503f93d5ef84b06993a1975b9d21b962892f1690813b156107d0576000916024839260405194859384927fee8ca3b500000000000000000000000000000000000000000000000000000000845260048401525af18015615ec757615ebe5750565b614a2290614976565b6040513d6000823e3d90fd5b91929015615f345750815115615ee7575090565b3b15615ef05790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015615f475750805190602001fd5b615f6b9060405191829162461bcd60e51b835260206004840152602483019061474a565b0390fdfea2646970667358221220faa33b7a2bc03c99559eda5c4e9d0cdd591fb171befeb930b38945087479b6bf64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000068baba24ee60933c6e22ea7701d9771285dde27a000000000000000000000000b3f5503f93d5ef84b06993a1975b9d21b962892f0000000000000000000000006118b56a6566dbd17b0f1c6ac9d3bdba11fbc8bf000000000000000000000000f9439027c8a21e1375ccdff31c46ca21f8603305000000000000000000000000a7ae8e1fdbb98d29be76f08dbeac46ea3f544855000000000000000000000000811074e281d86f862dc84e7df80ed38aa22aa23d000000000000000000000000f803b11bcff23d9ed1df84ee897beef26df9acdd
-----Decoded View---------------
Arg [0] : _dust (address): 0x68bABA24ee60933c6E22Ea7701D9771285DDE27a
Arg [1] : _ops (address): 0xB3f5503f93d5Ef84b06993a1975B9D21B962892F
Arg [2] : _randomizer (address): 0x6118b56a6566DBd17B0F1C6aC9d3bDBA11fbC8bf
Arg [3] : _vrf (address): 0xF9439027c8A21E1375CCDFf31c46ca21f8603305
Arg [4] : _legacy (address): 0xA7Ae8E1fDBB98d29bE76F08dBEac46EA3F544855
Arg [5] : _treasury (address): 0x811074e281d86f862dC84e7df80Ed38aA22aa23D
Arg [6] : _buyer (address): 0xF803B11bcfF23D9Ed1dF84ee897beEF26DF9ACdd
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000068baba24ee60933c6e22ea7701d9771285dde27a
Arg [1] : 000000000000000000000000b3f5503f93d5ef84b06993a1975b9d21b962892f
Arg [2] : 0000000000000000000000006118b56a6566dbd17b0f1c6ac9d3bdba11fbc8bf
Arg [3] : 000000000000000000000000f9439027c8a21e1375ccdff31c46ca21f8603305
Arg [4] : 000000000000000000000000a7ae8e1fdbb98d29be76f08dbeac46ea3f544855
Arg [5] : 000000000000000000000000811074e281d86f862dc84e7df80ed38aa22aa23d
Arg [6] : 000000000000000000000000f803b11bcff23d9ed1df84ee897beef26df9acdd
Deployed Bytecode Sourcemap
621:31183:14:-:0;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;31785:9;621:31183;;31764:31;621:31183;31773:10;31764:31;;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;24942:26;;;;621:31183;24942:26;;621:31183;;24942:26;;;;;;;621:31183;24942:26;;;;621:31183;24995:4;621:31183;;;24995:4;:::i;:::-;621:31183;;;;24942:26;;621:31183;24942:26;;;;;;;;;621:31183;24942:26;;;:::i;:::-;;;621:31183;;;;24995:4;621:31183;;24942:26;;621:31183;;;;;24942:26;;;-1:-1:-1;24942:26:14;;;621:31183;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;2987:49;621:31183;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;;;;;;3781:73;621:31183;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1118:33;621:31183;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;621:31183:14;;7258:19;621:31183;;;;7287:22;621:31183;;;7287:22;621:31183;;;7319:24;621:31183;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;621:31183:14;;;2169:22:0;;;621:31183:14;;2525:6:0;621:31183:14;;-1:-1:-1;;;;;;621:31183:14;;;2525:6:0;621:31183:14;;2573:40:0;621:31183:14;2573:40:0;;621:31183:14;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;6081:43;621:31183;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;3310:47;621:31183;;;;;;;;;;;3310:47;621:31183;3310:47;;621:31183;3310:47;621:31183;;3310:47;;;621:31183;3310:47;;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;6895:35;1063:62:0;6895:25:14;1063:62:0;6934:5:14;1063:62:0;;;:::i;:::-;6895:25:14;:::i;:35::-;621:31183;6895:44;621:31183;;;;;6950:26;621:31183;;;;;;;;;;;;;;;;6950:26;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;590:28:15;621:31183:14;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;-1:-1:-1;;;;;621:31183:14;;:::i;:::-;1063:62:0;;:::i;:::-;621:31183:14;-1:-1:-1;;;;;;6719:19:14;621:31183;;;6719:19;621:31183;;;6748:16;621:31183;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;-1:-1:-1;;;;;621:31183:14;;:::i;:::-;;;;;3730:45;621:31183;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;;;;;11956:27;621:31183;4070:117;-1:-1:-1;;;;;621:31183:14;;;;4078:10;:30;:55;;;;;621:31183;4078:86;;;;621:31183;4070:117;;:::i;:::-;621:31183;11956:10;621:31183;;11956:10;:::i;:::-;:17;;621:31183;-1:-1:-1;;;;;;;621:31183:14;;;;;;;;;;;;;;4078:86;621:31183;;4151:13;621:31183;;4078:10;4137:27;4078:86;;;:55;621:31183;;;;;;4078:10;4112:21;4078:55;;;621:31183;;;;;;-1:-1:-1;;621:31183:14;;;;-1:-1:-1;;;;;621:31183:14;;;;4078:10;:30;:55;;;;621:31183;4078:86;;;;621:31183;4070:117;;;:::i;:::-;621:31183;;;;;;;;;14769:3;621:31183;;14769:27;;;;:::i;:::-;;621:31183;;;;;;;4078:86;-1:-1:-1;4151:13:14;621:31183;;;4078:10;4137:27;4078:86;;:55;621:31183;;;;;4078:10;4112:21;4078:55;;621:31183;;;;;;;;;;;;;;;;;;30772:7;621:31183;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;880:37:14;621:31183;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;;;;621:31183:14;;;;;4078:10;:30;:55;;;;621:31183;4078:86;;;;621:31183;4070:117;;;:::i;:::-;621:31183;;;12563:1;;12544:15;621:31183;12544:15;;;:::i;:::-;621:31183;12544:20;:44;;;;621:31183;;;;;;;;12652:14;621:31183;;;;;;;12639:9;:32;621:31183;;12808:17;:10;;;:::i;:::-;:17;;621:31183;;;;;;;;;;;;;12842:10;621:31183;;12895:21;621:31183;;;12860:15;621:31183;;;;12895:16;621:31183;;;;12895:21;:::i;:::-;12932:10;;;:::i;:::-;621:31183;;12928:339;;621:31183;13352:74;621:31183;;13407:10;621:31183;;;;;13283:13;621:31183;;;;;;;12808:17;621:31183;;;;;;;;;;;;;12652:14;621:31183;;;;13378:10;;;:::i;:::-;:26;;621:31183;;13407:10;;:::i;:::-;621:31183;;;;;;;13352:74;621:31183;;;;12928:339;621:31183;12974:10;;;;:::i;:::-;-1:-1:-1;12974:17:14;621:31183;;;;;;;13020:10;;;;;:::i;:::-;:26;;621:31183;;;13080:3;621:31183;;13085:10;;;:::i;:::-;621:31183;;13011:100;;;;;621:31183;;-1:-1:-1;;;13011:100:14;;621:31183;;;13073:4;621:31183;13011:100;;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;14550:1;621:31183;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;;13011:100;;;;;;;;12971:286;;13352:74;12971:286;;13407:10;12971:286;;12928:339;;;;;;;13011:100;;;;:::i;:::-;621:31183;;;;13011:100;621:31183;;;12971:286;13158:10;;;;;:::i;:::-;:26;;621:31183;;;13218:3;621:31183;;13223:10;;;:::i;:::-;621:31183;;13150:92;;;;;621:31183;;-1:-1:-1;;;13150:92:14;;621:31183;;13211:4;621:31183;13150:92;;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;13150:92;621:31183;;;13150:92;;;;;;;;;12971:286;;13352:74;12971:286;;13407:10;12971:286;;;13150:92;;;;:::i;:::-;621:31183;;;;13150:92;621:31183;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;12544:44;12568:15;621:31183;12568:15;;;:::i;:::-;621:31183;12568:20;12544:44;;4078:86;-1:-1:-1;4151:13:14;621:31183;;;4078:10;4137:27;4078:86;;:55;621:31183;;1273:6:0;621:31183:14;;4078:10;4112:21;4078:55;;621:31183;;;;;;;:::i;:::-;;;;;2176:53;621:31183;;;;;;;;;2176:53;;;;;;;;;:::i;:::-;-1:-1:-1;621:31183:14;;2176:53;;;;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2176:53;;;;621:31183;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;6337:48;621:31183;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;2549:56;621:31183;;;;;;;;;;2549:56;;621:31183;2549:56;;621:31183;2549:56;;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1158:32;621:31183;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;-1:-1:-1;;;;;621:31183:14;;:::i;:::-;1063:62:0;;:::i;:::-;621:31183:14;-1:-1:-1;;;;;;7688:26:14;621:31183;;;7688:26;621:31183;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;-1:-1:-1;;;;;621:31183:14;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;25115:4;621:31183;;;:::i;:::-;;4247:64;-1:-1:-1;;;;;4277:10:14;621:31183;;4255:10;:33;4247:64;:::i;:::-;25115:4;:::i;621:31183::-;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;-1:-1:-1;;;;;621:31183:14;;;;4078:10;:30;:55;;;;621:31183;4078:86;;;;621:31183;4070:117;;;:::i;:::-;621:31183;;;;;21796:8;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;21834:10;621:31183;;;;;;;;;;;4078:86;-1:-1:-1;4151:13:14;621:31183;;;4078:10;4137:27;4078:86;;:55;621:31183;;;;;4078:10;4112:21;4078:55;;621:31183;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;621:31183:14;;;;;4078:10;:30;:55;;;;621:31183;4078:86;;;;621:31183;4070:117;;;:::i;:::-;11455:10;;;:::i;:::-;621:31183;;;;11521:13;;621:31183;;11545:10;;;621:31183;11545:10;;:::i;:::-;621:31183;;;11587:10;;;;:::i;:::-;-1:-1:-1;11587:17:14;621:31183;;;;;;;11629:10;;;:::i;:::-;:26;;621:31183;;11620:97;;;;;;621:31183;;-1:-1:-1;;;11620:97:14;;621:31183;;;4078:10;621:31183;11620:97;;621:31183;11694:4;621:31183;;;;;;;;;;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;11620:97;;621:31183;;;11620:97;;;;;;;;;11584:264;;621:31183;;;;11620:97;;;;:::i;:::-;621:31183;;;;11620:97;621:31183;;;11584:264;11756:10;;;:::i;:::-;:26;;621:31183;;11748:89;;;;;;621:31183;;-1:-1:-1;;;11748:89:14;;621:31183;;4078:10;621:31183;11748:89;;621:31183;11821:4;621:31183;;;;;;;;;;;;;;;;;;;11748:89;;621:31183;;;11748:89;;;;;;;;;11584:264;;;;11748:89;;;;:::i;:::-;621:31183;;;;11748:89;621:31183;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;4078:86;-1:-1:-1;4151:13:14;621:31183;;;4078:10;4137:27;4078:86;;:55;621:31183;;;;;4078:10;4112:21;4078:55;;621:31183;;;;;;;;;;;;;;;1071:41;621:31183;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;4078:10;:30;:55;;;;621:31183;4078:86;;;;621:31183;4070:117;;;:::i;:::-;621:31183;;;;24240:12;621:31183;;;24240:30;621:31183;;;;24240:30;621:31183;;;;;;;;;;;24323:12;621:31183;;;;;;;;24240:12;621:31183;;;;;;-1:-1:-1;24323:49:14;:77;;;;621:31183;;;;;24457:10;;;:::i;:::-;621:31183;;24457:23;621:31183;;;;;;24515:34;;;;;621:31183;;24515:34;-1:-1:-1;;;24515:34:14;;;621:31183;24515:34;;621:31183;;;;;;24515:34;;;;;;;;;;621:31183;;24559:15;621:31183;;;;;;;;;;;;;;;;;;;;;;;;24611:3;621:31183;;24627:7;621:31183;24611:28;;;;;:::i;24515:34::-;;;;:::i;:::-;621:31183;;;;;;24515:34;;;621:31183;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;24323:77;621:31183;;;24376:14;621:31183;;;;24376:24;24323:77;;;621:31183;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;4078:86;-1:-1:-1;4151:13:14;621:31183;;;4078:10;4137:27;4078:86;;:55;621:31183;;;;;4078:10;4112:21;4078:55;;621:31183;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2836:37;621:31183;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;1947:19;621:31183;1947:19;;;;;621:31183;;1947:19;621:31183;;;;;;;;1947:19;;;621:31183;;1947:19;;;621:31183;1947:19;;;;;;;;:::i;:::-;;;;:::i;:::-;621:31183;;;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;3467:51;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;956:26:14;621:31183;;;;;;;;;;;;;;;;;;;;;;;1231:27;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;1196:29;621:31183;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;2227:103:1;;:::i;:::-;15034:51:14;621:31183;;15042:15;621:31183;;15042:15;:::i;:::-;621:31183;15042:20;15034:51;:::i;:::-;621:31183;;15104:10;621:31183;;15104:10;:::i;:::-;:18;;621:31183;;;;;;15204:38;621:31183;;;;15204:38;:::i;:::-;15273:6;621:31183;15260:9;:19;621:31183;;;;;15354:10;621:31183;15343:27;;621:31183;;;;;;;;;;;;15343:27;621:31183;;;;15343:27;;902:58:6;;15343:27:14;;;;;;:::i;:::-;621:31183;15333:38;;621:31183;;;;15389:8;621:31183;;15381:131;15389:70;:53;621:31183;;;;;;;;;15420:22;;621:31183;;15389:53;;:::i;:::-;621:31183;;;15389:70;;:::i;:::-;621:31183;;;15463:10;621:31183;;15463:10;:::i;:::-;:21;;621:31183;;;;;;15389:95;;15381:131;:::i;:::-;621:31183;;;;;15526:12;621:31183;;;15526:32;621:31183;;;;15526:32;621:31183;;;;15523:174;;621:31183;;;15420:22;;621:31183;;;;;;15762:309;;621:31183;;;;;;;16084:8;621:31183;;;;;;;;;;16081:660;;621:31183;;16907:30;16848:38;621:31183;;;16848:10;621:31183;;16848:10;:::i;:::-;:24;;621:31183;;;;16848:38;:::i;:::-;621:31183;;;;;;;:::i;:::-;15354:10;621:31183;;;;16780:117;;621:31183;;;;;;16907:7;621:31183;;;;;;16907:30;:::i;:::-;621:31183;16972:17;;621:31183;;;;;;;;16950:13;621:31183;;16950:39;621:31183;;;;;;;16950:39;:::i;:::-;621:31183;;16999:39;621:31183;16999:10;621:31183;;16999:10;:::i;:::-;:24;;:39;621:31183;;;;;;;16999:39;:::i;:::-;621:31183;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;16999:39;621:31183;;;;15389:8;621:31183;;;;;;;;;17049:43;621:31183;;;;17049:43;:::i;:::-;621:31183;;;;;;;;;;;;;;15389:8;621:31183;;17102:45;15526:32;621:31183;;;;17102:24;621:31183;;;17102:45;:::i;:::-;621:31183;;-1:-1:-1;;;;;621:31183:14;;15526:32;621:31183;;;;17158:44;;;;;621:31183;;;17158:44;;621:31183;;;15354:10;621:31183;17158:44;;621:31183;;;;;;;;;;;;;;;;;;17158:44;;;;;;;;621:31183;;17236:3;621:31183;;;;;;;;15273:6;621:31183;17236:27;;;;;:::i;:::-;;621:31183;;;;;15420:22;;;621:31183;;;;;15354:10;;621:31183;;;;;;;;;;;;;;;;;;;;;;17472:15;621:31183;;;;17302:195;621:31183;;;17302:195;;621:31183;;;;;;;17158:44;;;;:::i;:::-;621:31183;;;;17158:44;621:31183;;;16081:660;621:31183;;902:58:6;621:31183:14;;;15354:10;621:31183;;;;;;;;16138:46;16135:160;;16081:660;621:31183;;;;;902:58:6;621:31183:14;;;;;;;15354:10;621:31183;;;;;;;;16311:15;:59;16308:423;16081:660;16308:423;621:31183;;15420:22;;621:31183;;;;;;;16084:8;621:31183;;16390:59;621:31183;;;;;16390:33;621:31183;;;16390:59;:::i;:::-;621:31183;;16506:45;:31;621:31183;;15420:22;;621:31183;;16506:31;:::i;:::-;621:31183;16540:11;621:31183;;;16506:45;:::i;:::-;621:31183;;;;;16084:8;621:31183;;16467:84;15526:32;621:31183;;;;16467:35;621:31183;;;16467:84;:::i;:::-;621:31183;;15354:10;621:31183;;;;;;;;;;;;;16572:23;16569:148;;16308:423;;16081:660;;16569:148;621:31183;16619:28;621:31183;;16634:13;621:31183;;16619:28;;:::i;:::-;15354:10;;621:31183;;;;;;;;;;;;;;;;;;;16569:148;;16135:160;16248:32;16266:14;621:31183;16248:15;:32;:::i;:::-;621:31183;;;;;902:58:6;621:31183:14;;;;;;15354:10;621:31183;;;;;;;;16135:160;;15762:309;15354:10;621:31183;16031:29;15354:10;;;621:31183;;;15814:10;621:31183;;;;;;;;;;;15858:8;621:31183;;15850:96;15526:32;621:31183;;;;15858:30;621:31183;15892:21;;;;:::i;:::-;621:31183;-1:-1:-1;15858:55:14;15850:96;:::i;:::-;15995:21;;;;:::i;:::-;621:31183;;;;;15858:8;621:31183;;15960:57;15526:32;621:31183;;;;15960:30;621:31183;;;15960:57;:::i;:::-;621:31183;;;16031:29;;:::i;:::-;15762:309;;;;15523:174;15560:137;15568:66;621:31183;;15568:10;621:31183;;15568:10;:::i;:::-;:24;;621:31183;;;;15568:49;621:31183;;;15420:22;621:31183;;15420:22;;621:31183;;15568:49;;:::i;:::-;:66;:::i;:::-;621:31183;;;;;15526:12;621:31183;;;;15526:32;621:31183;;;;15638:26;621:31183;;;;;;15568:96;;15560:137;:::i;:::-;15523:174;;621:31183;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;12105:10;:22;621:31183;;;:::i;:::-;;;4070:117;-1:-1:-1;;;;;621:31183:14;;;;;;;4078:10;:30;:55;;;;;621:31183;4078:86;;;;4070:117;;:::i;:::-;12105:10;:::i;:::-;:22;;621:31183;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;12105:22;621:31183;;;;;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;902:58:6;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12105:22:14;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;4078:86;621:31183;;4151:13;621:31183;;4078:10;4137:27;4078:86;;;:55;621:31183;;;1273:6:0;621:31183:14;;4078:10;4112:21;4078:55;;;621:31183;;;;;;;:::i;:::-;;;;;2235:55;621:31183;;;;;;;;;2235:55;;;;;;;;;:::i;621:31183::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1273:6:0;621:31183:14;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;;;;;:::i;:::-;-1:-1:-1;;;;;621:31183:14;;;;;;;4078:10;:30;:55;;;;621:31183;4078:86;;;;621:31183;4070:117;;;:::i;:::-;14462:196;;;621:31183;;14535:3;621:31183;;14488:68;;;;;;621:31183;;-1:-1:-1;;;14488:68:14;;621:31183;;;14528:4;621:31183;14488:68;;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;14550:1;621:31183;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;14488:68;621:31183;14462:196;621:31183;;14633:3;621:31183;;14587:60;;;;;;621:31183;;-1:-1:-1;;;14587:60:14;;621:31183;;14626:4;621:31183;14587:60;;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;14587:60;621:31183;4078:86;-1:-1:-1;4151:13:14;621:31183;;;4078:10;4137:27;4078:86;;:55;621:31183;;;;;4078:10;4112:21;4078:55;;621:31183;;;;12258:10;621:31183;;;;:::i;:::-;;;4070:117;-1:-1:-1;;;;;621:31183:14;;;;;;;4078:10;:30;:55;;;;;:86;;;;4070:117;;:::i;12258:10::-;:22;;621:31183;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;902:58:6;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;699:42:15;621:31183:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;838:36:14;621:31183;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;;621:31183:14;;;;;;;;;;7982:10;621:31183;;;7982:10;621:31183;;;8002:18;621:31183;;;8030:32;621:31183;;;8072:20;621:31183;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;;;;621:31183:14;;;4078:10;:30;:55;;;;621:31183;4078:86;;;;621:31183;4070:117;;;:::i;:::-;8765:24;:7;621:31183;8775:14;621:31183;8765:24;;:::i;:::-;8752:9;:37;621:31183;;;;;;8808:25;;621:31183;8808:41;;;;621:31183;;;;;8868:38;;621:31183;;;;;;;8877:13;8868:38;621:31183;;;;;;;;9237:21;;-1:-1:-1;621:31183:14;;;;;;;;;;:::i;:::-;9343:30;;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;621:31183:14;;;;8938:479;;621:31183;;;;;8938:479;;621:31183;;;;;;;8938:479;;621:31183;;;;8938:479;;621:31183;;;;;8938:479;;621:31183;;;;;8938:479;;621:31183;;;;;;8938:479;;621:31183;;;;8938:479;;621:31183;;;;8938:479;;621:31183;;;;8938:479;;621:31183;;8938:479;;621:31183;;;;:::i;:::-;;8938:479;;621:31183;9428:5;621:31183;;;;;;;;;;;;9428:5;621:31183;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;621:31183:14;8938:479;;621:31183;;-1:-1:-1;;;;;;621:31183:14;;;;;;;;8938:479;;621:31183;;;;;-1:-1:-1;;;;;;;621:31183:14;;;;;;;;;;;;;;;;8938:479;;621:31183;;;;8938:479;;621:31183;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;8938:479;;621:31183;;;;;;;8938:479;;621:31183;;;;;;8938:479;621:31183;;;;8938:479;;621:31183;;;;;;;;;;;;;;;;;;8938:479;;621:31183;;;;;;;;;8938:479;;621:31183;;;;;;8938:479;621:31183;;;8938:479;;621:31183;;;;;;;;;;;;;;;;;;;;8938:479;;621:31183;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8938:479;621:31183;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9456:504;;621:31183;;;;9970:511;;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10524:322;;621:31183;;;;;10524:322;;621:31183;;;;;10524:322;;621:31183;;;;;;;10524:322;;621:31183;;;;;;10524:322;;621:31183;;;;;;10524:322;;621:31183;;;;;;10524:322;;621:31183;9428:5;621:31183;;;;;;;;;;;;;;;10491:12;621:31183;;;;;;;;;;;;;;10524:322;;621:31183;;;;;;10524:322;621:31183;;10524:322;;621:31183;;;;;;;;;;;;;10524:322;;621:31183;;;;;;;;;;;;;;;;;;;;;10524:322;;621:31183;;;;;;10524:322;;621:31183;;;;;;10524:322;621:31183;;;;;10524:322;;621:31183;;;;;;10524:322;;621:31183;;;;;;;;;;;;;;;;;;;;;;;10857:278;;621:31183;;;9428:5;621:31183;;;;;;;;;;;;;;;;22884:57;;;;621:31183;;;;;22884:57;;621:31183;;22884:57;;;;;:::i;:::-;621:31183;;22740:228;;;621:31183;22740:228;;22794:4;621:31183;22740:228;;621:31183;-1:-1:-1;;;621:31183:14;;;;22794:4;621:31183;;;;;;;;;;;;;;:::i;:::-;699:42:15;621:31183:14;;;;;;;;22740:228;;22745:3;-1:-1:-1;;;;;22745:3:14;621:31183;22740:228;;;;;;;621:31183;22740:228;;;;621:31183;;;;;;;;22716:16;621:31183;;;;;;;;;9428:5;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11198:107;621:31183;-1:-1:-1;;;;;621:31183:14;;;11198:107;;621:31183;;;;;;;-1:-1:-1;;;621:31183:14;;10491:12;621:31183;;;;;;22740:228;;;;621:31183;22740:228;;621:31183;22740:228;;;;;;621:31183;22740:228;;;:::i;:::-;;;621:31183;;;;;22740:228;;;;;;;-1:-1:-1;22740:228:14;;621:31183;-1:-1:-1;;;621:31183:14;;;10491:12;621:31183;;;;;;10857:278;10883:242;;;621:31183;-1:-1:-1;;;;;621:31183:14;;;10913:83;;;;621:31183;;-1:-1:-1;;;10913:83:14;;621:31183;;;4078:10;621:31183;10913:83;;621:31183;10973:4;621:31183;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;;-1:-1:-1;;;;;621:31183:14;10913:83;;;;;;;;10883:242;;;10857:278;;;;10913:83;;;;:::i;:::-;621:31183;;;;10913:83;621:31183;;;10883:242;-1:-1:-1;;;;;621:31183:14;;;11035:75;;;;-1:-1:-1;621:31183:14;;-1:-1:-1;;;11035:75:14;;621:31183;;4078:10;621:31183;11035:75;;621:31183;11094:4;621:31183;;;;;;;;;;;;;;;;;;11035:75;621:31183;;;-1:-1:-1;;;;;621:31183:14;;;11035:75;;;;;;;;10883:242;;;;11035:75;;;;:::i;:::-;621:31183;;;;11035:75;621:31183;;;;-1:-1:-1;;;621:31183:14;;;;;;;;9970:511;9998:44;10006:22;;;9998:44;:::i;:::-;621:31183;10062:13;10077:22;;;;;;9970:511;;;10101:3;10124:57;621:31183;10132:25;621:31183;10132:14;;;;;:::i;:::-;:25;;:::i;:::-;621:31183;10132:29;;10124:57;:::i;:::-;10309:25;621:31183;10309:14;;;;;:::i;:25::-;10363:14;621:31183;10363:14;;;;;:::i;:::-;:20;621:31183;;;;;;;;:::i;:::-;;;;;;;;10226:176;;621:31183;;10226:176;;621:31183;9428:5;621:31183;;;;;;;;;10101:3;621:31183;10421:35;621:31183;;;;;;;;;;10421:31;621:31183;;;;;10421:31;:::i;:::-;:35;;:::i;:::-;10101:3;:::i;:::-;10062:13;;9456:504;9485:43;9493:21;;;9485:43;:::i;:::-;621:31183;9548:13;9563:21;;;;;;9456:504;;;9586:3;9609:56;621:31183;9617:24;621:31183;9617:13;;;;;:::i;9609:56::-;9791:24;621:31183;9791:13;;;;;:::i;:24::-;9844:13;621:31183;9844:13;;;;;:::i;:::-;:19;621:31183;;;;;;;;:::i;:::-;;;;;;;;9709:173;;621:31183;;9709:173;;621:31183;9428:5;621:31183;;;;;;;;;9586:3;621:31183;9901:34;621:31183;;;;;;;9901:9;621:31183;;9901:30;621:31183;;;;;9901:30;:::i;9586:3::-;9548:13;;621:31183;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;902:58:6;;;;621:31183:14;902:58:6;621:31183:14;902:58:6;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;902:58:6;;;;621:31183:14;902:58:6;621:31183:14;902:58:6;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;9343:30;621:31183;;;;;;;:::i;:::-;;;;;;;;;9343:30;;;9237:21;621:31183;9237:21;;;8868:38;621:31183;;8893:13;;8868:38;;8808:41;621:31183;;;8808:41;;:25;621:31183;;;8808:25;;4078:86;621:31183;4070:117;-1:-1:-1;;;;;4151:13:14;621:31183;;4078:10;4137:27;4078:86;;;;:55;621:31183;-1:-1:-1;;;;;621:31183:14;;;4078:10;4112:21;4078:55;;621:31183;;;;;;;;;;;;;;;3982:39;621:31183;;;;;;;;;;;;;;;;;;;;;1063:62:0;;:::i;:::-;621:31183:14;-1:-1:-1;;;;;2525:6:0;621:31183:14;-1:-1:-1;;;;;;621:31183:14;;2525:6:0;621:31183:14;;2573:40:0;;;;621:31183:14;;;;;;;;;;;;;;;;;;;1030:35;621:31183;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;3363:47;621:31183;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;-1:-1:-1;;;;;621:31183:14;;:::i;:::-;1063:62:0;;:::i;:::-;621:31183:14;-1:-1:-1;;;;;;6611:19:14;621:31183;;;6611:19;621:31183;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;-1:-1:-1;;;;;621:31183:14;;:::i;:::-;1063:62:0;;:::i;:::-;621:31183:14;-1:-1:-1;;;;;;621:31183:14;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;;;:::i;:::-;2227:103:1;;;:::i;:::-;17709:51:14;621:31183;;17717:15;621:31183;;;17717:15;:::i;17709:51::-;621:31183;;17779:10;;;:::i;:::-;:19;;621:31183;;;;;;17880:37;621:31183;;;;;17880:37;:::i;:::-;621:31183;17948:17;;621:31183;17935:9;:30;621:31183;;;;;18061:10;621:31183;18050:27;;621:31183;;;;;;;;;;;;;18050:27;621:31183;;;;18050:27;621:31183;18050:27;621:31183;18040:38;;621:31183;;;;18096:8;621:31183;;18088:131;18096:70;:53;621:31183;;;;;;;;;18127:22;;621:31183;;18096:53;;:::i;:::-;621:31183;;;18096:70;;:::i;:::-;621:31183;18170:10;621:31183;18170:10;;;:::i;18088:131::-;621:31183;;;;;;18232:12;621:31183;;;18232:32;621:31183;;;;18232:32;621:31183;;;;18229:174;;621:31183;;;18127:22;;621:31183;;;;;;18468:309;;621:31183;;;;;;;;18790:8;621:31183;;;;;;;;;;18787:660;;621:31183;19600:10;;19659:30;19600:38;:10;621:31183;;19600:10;;;:::i;:38::-;621:31183;;;;;;;:::i;:::-;18061:10;621:31183;;;;19532:117;;621:31183;;;;;;;19659:7;621:31183;;;;;;19659:30;:::i;:::-;19702:39;621:31183;19702:10;;;:::i;:39::-;621:31183;;;;18096:8;621:31183;;;;;;;;;19752:43;621:31183;;;;19752:43;:::i;:::-;621:31183;;;;;;;;;17948:17;;621:31183;;;;;18096:8;621:31183;;19805:44;621:31183;;;;;19805:23;621:31183;;;19805:44;:::i;:::-;621:31183;;;;;;;;18232:12;621:31183;;;18232:32;621:31183;;;;19863:30;621:31183;;;;19860:903;621:31183;;;;;;;;;19912:12;621:31183;;;;;;;;18232:12;621:31183;;;;;;-1:-1:-1;19909:751:14;621:31183;;;;;;17935:9;;;;-1:-1:-1;;;;;19995:13:14;621:31183;;19995:40;;;;:::i;:::-;;621:31183;;;;20128:11;621:31183;;20120:5;621:31183;;;;;;;;;;;;;;20107:33;621:31183;20957:196;621:31183;;17935:9;20107:33;:::i;:::-;621:31183;;;;;;;20084:14;621:31183;;20084:64;621:31183;;;;;;;20084:64;:::i;:::-;621:31183;;19909:751;20825:5;621:31183;20801:21;621:31183;20813:9;621:31183;;;;17935:9;20801:21;:::i;:::-;621:31183;;;;;;;20772:13;621:31183;;20772:58;621:31183;;;;;20772:25;621:31183;;;20772:58;:::i;:::-;621:31183;;20866:18;621:31183;20813:9;621:31183;;;;17935:9;20866:18;:::i;:::-;621:31183;;;;;;;20772:13;621:31183;;20840:52;18232:32;621:31183;;;;20840:22;621:31183;;;20840:52;:::i;:::-;621:31183;;17948:17;621:31183;;;;;;;20903:12;621:31183;;20903:38;621:31183;;;;;;;20903:38;:::i;:::-;621:31183;;21050:10;621:31183;21050:10;;;:::i;:::-;:24;;621:31183;;;;;;;18061:10;;621:31183;;;;;;;;;;;;;;;;;;;;;;21128:15;621:31183;;;;;20957:196;;621:31183;;;;;;;19909:751;20957:196;621:31183;;;;;;;20172:14;621:31183;;;;20172:23;;20169:491;621:31183;;;20262:5;20234:25;621:31183;20247:11;621:31183;;17935:9;20234:25;:::i;:::-;621:31183;;;;;;;20172:14;621:31183;;;;;;;;;20288:30;20285:260;20288:30;;;621:31183;;;;;;;20172:14;621:31183;;20342:31;621:31183;;;;;;;20342:31;:::i;:::-;621:31183;;19909:751;;20285:260;621:31183;;;;20451:30;;;:::i;:::-;621:31183;;;;;;20420:13;621:31183;;20420:61;621:31183;;;;;;;20420:61;:::i;:::-;621:31183;;;;;;;;20172:14;621:31183;;;;;;;;19909:751;;20169:491;20640:5;20614:23;621:31183;20626:11;621:31183;;17935:9;20614:23;:::i;:::-;621:31183;;;;;;;20583:13;621:31183;;20583:62;621:31183;;;;;;;20583:62;:::i;19860:903::-;621:31183;20957:196;621:31183;;;;20747:5;20721:23;621:31183;20733:11;621:31183;;17935:9;20721:23;:::i;18787:660::-;621:31183;;902:58:6;621:31183:14;;;18061:10;621:31183;;;;;;;;18844:46;18841:160;;18787:660;621:31183;;;;902:58:6;621:31183:14;;;;;;;18061:10;621:31183;;;;;;;;19017:15;:59;19014:423;18787:660;19014:423;18127:22;621:31183;;18127:22;;621:31183;;;;18790:8;621:31183;;19096:59;621:31183;;;;;19096:33;621:31183;;;19096:59;:::i;:::-;621:31183;;19212:45;:31;621:31183;;18127:22;;621:31183;;19212:31;:::i;:45::-;621:31183;;;;18790:8;621:31183;;19173:84;18232:32;621:31183;;;;19173:35;621:31183;;;19173:84;:::i;:::-;621:31183;;18061:10;621:31183;;;;;;;;;;;;;19278:23;19275:148;;19014:423;;;18787:660;;19275:148;621:31183;19325:28;621:31183;;19340:13;621:31183;;19325:28;;:::i;:::-;18061:10;;621:31183;;;;;;;;;;;;;;;;;;;19275:148;;18841:160;18954:32;18972:14;621:31183;18954:15;:32;:::i;:::-;621:31183;;;;902:58:6;621:31183:14;;;;;;18061:10;621:31183;;;;;;;;18841:160;;18468:309;18061:10;621:31183;18737:29;18061:10;;;621:31183;;;18520:10;621:31183;;;;;;;;;;;18564:8;621:31183;;18556:96;18232:32;621:31183;;;;18564:30;621:31183;18598:21;;;;:::i;18737:29::-;18468:309;;;;18229:174;18266:137;18274:66;621:31183;;18274:10;;;:::i;:::-;:24;;621:31183;;;;18274:49;621:31183;;;18127:22;621:31183;;18127:22;;621:31183;;18274:49;;:::i;:66::-;621:31183;;;;;;18232:12;621:31183;;;;18232:32;621:31183;;;;18344:26;621:31183;;;;;;18274:96;;18266:137;:::i;:::-;18229:174;;621:31183;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;2880:47;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2227:103:1;;;:::i;:::-;621:31183:14;;13513:15;;;:::i;:::-;621:31183;13513:20;621:31183;;;;;;13598:10;621:31183;;13598:30;621:31183;;;;;13616:12;621:31183;13598:30;;:::i;:::-;13579:15;:49;621:31183;;;;;13758:10;13747:27;;;621:31183;;;;;;;;;13747:27;;;621:31183;;;;13747:27;621:31183;13747:27;621:31183;13737:38;;621:31183;;;13715:8;621:31183;;;;;;13804:17;621:31183;13804:17;;621:31183;;;;;;;13933:19;621:31183;13883:18;;621:31183;;;;;;;13862:12;621:31183;;13862:39;621:31183;;;;;;;13862:39;:::i;:::-;621:31183;;13933:19;621:31183;;;;;;;13911:13;621:31183;;13911:41;621:31183;;;;;;;13911:41;:::i;:::-;621:31183;;;;-1:-1:-1;;621:31183:14;;;;;;;;13997:167;;621:31183;;;;14177:23;14174:75;;621:31183;;;;;14264:71;621:31183;;;;;;;;;;;;;13758:10;621:31183;;;;14264:71;621:31183;;;;;;;14174:75;621:31183;;;-1:-1:-1;;;;;13933:19:14;621:31183;;14204:42;;;;;;621:31183;;;14204:42;;621:31183;;;13758:10;621:31183;14204:42;;621:31183;;;;;;;;;;;;;;;;;;14204:42;;;;;;;14264:71;14204:42;621:31183;14204:42;;;14174:75;;;;;;;;14204:42;;;;:::i;:::-;;;;13997:167;621:31183;;13758:10;;;;;14057:46;;;;:::i;:::-;;621:31183;;;13997:167;;;621:31183;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;988:36;621:31183;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;624:39:15;621:31183:14;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;735:17:14;621:31183;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;4070:117;-1:-1:-1;;;;;621:31183:14;;;;4078:10;:30;:55;;;;;621:31183;4078:86;;;;4070:117;;:::i;:::-;621:31183;;;;;21952:8;621:31183;;;;;;;;;;;;;;;;4078:86;621:31183;;4151:13;621:31183;;4078:10;4137:27;4078:86;;;:55;621:31183;;;;;;4078:10;4112:21;4078:55;;;621:31183;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;2720:58;621:31183;;;;;;;;;2720:58;;621:31183;2720:58;;621:31183;2720:58;;621:31183;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;;;;;4070:117;-1:-1:-1;;;;;621:31183:14;;;;4078:10;:30;:55;;;;;621:31183;4078:86;;;;4070:117;;:::i;:::-;621:31183;;;;;12398:12;621:31183;;12398:36;621:31183;;;12398:25;621:31183;;;12398:25;621:31183;;;;;;;;;;;;;;;;12398:36;621:31183;;4078:86;621:31183;;4151:13;621:31183;;4078:10;4137:27;4078:86;;;:55;621:31183;;;;;;4078:10;4112:21;4078:55;;;621:31183;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;3680:44;621:31183;;;;;;;;;;;3680:44;621:31183;3680:44;;621:31183;3680:44;-1:-1:-1;;;;;621:31183:14;3680:44;;;621:31183;3680:44;;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;30928:25;;;621:31183;30928:25;;621:31183;;;30928:25;;621:31183;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;30928:25;621:31183;30918:36;;621:31183;;;30909:8;621:31183;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3945:31;621:31183;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;4070:117;-1:-1:-1;;;;;621:31183:14;;;;4078:10;:30;:55;;;;;:86;;;;4070:117;;:::i;:::-;31702:6;621:31183;;31702:6;:::i;621:31183::-;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;2785:45;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2227:103:1;;;;:::i;:::-;21271:10:14;621:31183;;;21260:10;621:31183;;;;;;;;;;;;;;;;;;;;;;;;21390:8;621:31183;;;;21390:33;621:31183;;;21390:33;621:31183;21390:38;:78;;;;621:31183;21390:96;;;;621:31183;;;;21390:8;21271:10;;621:31183;;;21260:10;621:31183;;;;;;;;;;;;;;;;21390:33;621:31183;;;;;;;;;;;;21624:35;21271:10;-1:-1:-1;;;;;;621:31183:14;;;;;;21390:33;621:31183;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;21390:96;21472:14;;;;21390:96;;:78;621:31183;;;;;;;;21432:36;21390:78;;;621:31183;-1:-1:-1;;621:31183:14;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;-1:-1:-1;;;;;621:31183:14;;:::i;:::-;1063:62:0;;:::i;:::-;621:31183:14;-1:-1:-1;;;;;;7567:22:14;621:31183;;;7567:22;621:31183;;;;;;;;;;;;:::i;:::-;;;;;3123:44;621:31183;;;;;;;;;;3123:44;;;;;621:31183;3123:44;;;;:::i;:::-;-1:-1:-1;621:31183:14;;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;5845:41;621:31183;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;799:3:15;;621:31183:14;785:10:15;;:17;621:31183:14;;;;;;23913:54;23935:8;621:31183;23921:11;:22;23913:54;:::i;:::-;621:31183;;24011:25;;;;621:31183;24011:25;;;;;;;;621:31183;;;;24011:25;;;621:31183;-1:-1:-1;621:31183:14;;699:42:15;1027:20;;699:42;;621:31183:14;;;1082:6:15;;;;;;621:31183:14;1082:31:15;;;;:::i;:::-;;621:31183:14;;;24120:16;1023:258:15;;24096:3:14;;;:::i;:::-;621:31183;;;;24120:21;621:31183;;;;;24120:21;:::i;621:31183::-;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;1023:258:15;902:58:6;621:31183:14;902:58:6;5330:69:10;621:31183:14;;;902:58:6;;;;;;;621:31183:14;902:58:6;;1254:6:15;621:31183:14;902:58:6;;;621:31183:14;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;902:58:6;;;;;;;;;;:::i;:::-;621:31183:14;;;;;;:::i;:::-;;;;;;;;;;;5282:31:10;;;;;;;;;;;:::i;:::-;5330:69;;:::i;:::-;621:31183:14;;4275:21:6;4271:176;;1023:258:15;;;24120:16:14;1023:258:15;;;4271:176:6;4359:30;;;;;621:31183:14;;;;4359:30:6;;621:31183:14;;;;;;;;;;;4271:176:6;;;;621:31183:14;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;902:58:6;621:31183:14;;;;;;;;;;;;;;24011:25;;;;621:31183;24011:25;;621:31183;24011:25;;;;;;621:31183;24011:25;;;:::i;:::-;;;621:31183;;;;;;;;;;;;;;;;;;24011:25;;;;;;;-1:-1:-1;24011:25:14;;621:31183;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;3416:45;621:31183;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;31043:5;621:31183;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;1063:62:0;;:::i;:::-;621:31183:14;;7120:22;621:31183;;;;;;;;;;;;;;;;;;;;3908:31;621:31183;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;23150:1;621:31183;23131:15;;;:::i;:::-;621:31183;23131:20;:45;;;621:31183;23131:72;;;621:31183;;;23237:92;-1:-1:-1;;;621:31183:14;23237:92;;;;;;621:31183;23237:92;;;;;;:::i;:::-;621:31183;;;;;;;;;;;;;;;;;;;;:::i;23131:72::-;23180:10;;;;:::i;:::-;621:31183;;23180:23;;23131:72;;:45;621:31183;;;;;23156:15;621:31183;;;;;;;;;23155:21;23131:45;;621:31183;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;2933:48;621:31183;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;;;;;;;;;;;;;6491:46;;621:31183;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;-1:-1:-1;;;;;924:26:14;621:31183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;902:58:6;;;621:31183:14;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;621:31183:14;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;621:31183:14;;-1:-1:-1;621:31183:14;;;-1:-1:-1;621:31183:14;:::o;:::-;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;621:31183:14;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;23180:5;621:31183;;;;;;;;23180:5;-1:-1:-1;621:31183:14;;;;;-1:-1:-1;621:31183:14;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;902:58:6;;;621:31183:14;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;621:31183:14;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;-1:-1:-1;621:31183:14;;;;-1:-1:-1;621:31183:14;;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1359:130:0:-;-1:-1:-1;;;;;1273:6:0;621:31183:14;;719:10:11;1422:23:0;621:31183:14;;1359:130:0:o;621:31183:14:-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;902:58:6;621:31183:14;-1:-1:-1;;621:31183:14;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;621:31183:14;;;;:::o;:::-;;;:::o;2336:287:1:-;1759:1;2468:7;621:31183:14;2468:19:1;1759:1;;;2468:7;621:31183:14;2336:287:1:o;1759:1::-;;621:31183:14;;-1:-1:-1;;;1759:1:1;;;;;;;;;;;621:31183:14;1759:1:1;621:31183:14;;;1759:1:1;;621:31183:14;;;;:::o;:::-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;-1:-1:-1;;;;;;621:31183:14;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;-1:-1:-1;621:31183:14;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22008:315::-;;621:31183;;:::i;:::-;;-1:-1:-1;621:31183:14;;;;22159:9;621:31183;;;;22159:25;621:31183;;;;22159:25;:::i;:::-;621:31183;;;22159:35;22155:98;;621:31183;;;;;;;;:::i;:::-;;;;22269:47;621:31183;22269:47;;621:31183;;22269:47;;621:31183;22008:315;:::o;22155:98::-;621:31183;;;22217:25;621:31183;;;;22159:9;621:31183;;;22217:25;:::i;:::-;621:31183;;:::i;:::-;22210:32;:::o;22329:320::-;;621:31183;;:::i;:::-;;-1:-1:-1;621:31183:14;;;;22482:10;621:31183;;;;22482:26;621:31183;;;;22482:26;:::i;:::-;621:31183;;;22482:36;22478:100;;621:31183;;;;;;;;:::i;22478:100::-;621:31183;;;22541:26;621:31183;;;;22482:10;621:31183;;;22541:26;:::i;621:31183::-;;;;:::o;:::-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;23342:500;23396:52;23423:1;621:31183;23404:15;;;:::i;:::-;621:31183;23404:20;23396:52;:::i;:::-;23466:10;;;:::i;:::-;621:31183;;;-1:-1:-1;23466:23:14;;621:31183;;23535:10;;;:::i;:::-;-1:-1:-1;23535:24:14;;;;621:31183;;;;;;;23535:28;621:31183;;;-1:-1:-1;;;;;621:31183:14;;23579:10;621:31183;;23579:34;;;;;621:31183;;;;;;23579:34;;;;-1:-1:-1;;;23579:34:14;;;;;;621:31183;23579:34;;;;;;;;;;;;;23532:304;621:31183;;;;;;;;;23627:15;621:31183;;;;;;;;;;;;;;23683:3;621:31183;;23699:7;621:31183;23683:28;;;;;:::i;:::-;;621:31183;;;23532:304;23342:500::o;23579:34::-;;;;;;;;:::i;:::-;621:31183;;23579:34;;;;;;;621:31183;;;;;;;;;23579:34;621:31183;;;23532:304;621:31183;;;23769:15;621:31183;;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;26650:52;23423:1;621:31183;26658:15;621:31183;26658:15;:::i;26650:52::-;26720:10;;;;:::i;:::-;:24;;621:31183;;;;;;23423:1;26781:10;;;:::i;:::-;-1:-1:-1;26781:18:14;621:31183;;-1:-1:-1;;621:31183:14;;;;;23423:1;26874:10;;;:::i;:::-;-1:-1:-1;26874:17:14;621:31183;;-1:-1:-1;;621:31183:14;;;;;26912:10;;;:::i;:::-;621:31183;;26908:339;;23532:304;27357:98;27285:10;;621:31183;27285:10;;;;:::i;:::-;621:31183;-1:-1:-1;;;;;27285:26:14;;;;621:31183;;27314:10;27261:72;621:31183;27314:10;;;:::i;:::-;621:31183;;;;;;;27261:72;27382:10;;;:::i;:::-;:26;;621:31183;;27411:10;;;;:::i;:::-;621:31183;;;;;;;;;;;;;;;;27357:98;23342:500::o;26908:339::-;621:31183;26954:10;;;;:::i;:::-;-1:-1:-1;26954:17:14;621:31183;;;;;;;27000:10;;;;:::i;:::-;-1:-1:-1;27000:26:14;621:31183;27060:3;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;27065:10;;;:::i;:::-;621:31183;;26991:100;;;;;;621:31183;;-1:-1:-1;;;26991:100:14;;27053:4;26991:100;;;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;26991:100;;;;;;;;;;;26951:286;;;27357:98;26951:286;621:31183;26951:286;;26908:339;;;;;;26991:100;;;;:::i;:::-;621:31183;;26991:100;;;;;621:31183;;;;;;;;;26991:100;621:31183;;;26951:286;27138:10;;;;:::i;:::-;-1:-1:-1;27138:26:14;621:31183;27198:3;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;27203:10;;;:::i;:::-;621:31183;;27130:92;;;;;;621:31183;;-1:-1:-1;;;27130:92:14;;27191:4;27130:92;;;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;27130:92;;;;;;;;26951:286;;27357:98;26951:286;621:31183;26951:286;;;27130:92;;621:31183;27130:92;;;27357:98;27130:92;;:::i;:::-;;;;;;;621:31183;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;25133:1459;25200:52;25227:1;621:31183;25208:15;;;:::i;25200:52::-;25270:10;;;:::i;:::-;:24;;;;;621:31183;;-1:-1:-1;621:31183:14;;;;;;;25270:28;621:31183;;25333:18;:10;;;:::i;:::-;-1:-1:-1;25333:18:14;621:31183;;-1:-1:-1;;621:31183:14;;;;;25396:10;;;;:::i;:::-;:24;;621:31183;;;;;;;;;;;;;;;;;;;;;;;25467:7;621:31183;;;;25524:25;25456:36;621:31183;;;;25456:36;:::i;:::-;621:31183;;;25467:7;621:31183;;;;;25524:25;:::i;:::-;621:31183;;-1:-1:-1;;;;;621:31183:14;;;;;;;;25567:10;621:31183;;;;;;-1:-1:-1;;;;;;621:31183:14;;;;;;;25610:10;;;;:::i;:::-;-1:-1:-1;25610:17:14;621:31183;;;;;;;25652:10;;;;;:::i;:::-;:26;;621:31183;;25725:10;;;:::i;:::-;621:31183;;25643:108;;;;;;621:31183;;-1:-1:-1;;;25643:108:14;;25705:4;25643:108;;;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;25643:108;;;;;;;;;;;25607:286;;;;25906:10;;;;:::i;:::-;:16;;621:31183;;;25903:72;;25607:286;621:31183;;;25988:13;621:31183;;;;;;25985:166;;25607:286;621:31183;;;25988:13;621:31183;;;;;;26163:25;621:31183;26160:160;;25607:286;621:31183;;;25988:13;621:31183;;25333:18;621:31183;;;26332:22;621:31183;26329:143;;25607:286;26512:10;;621:31183;26512:10;;26487:98;26512:10;;;;;:::i;:::-;:26;;621:31183;;26541:10;;;;:::i;:::-;621:31183;;;;;;;;;;;;;;26487:98;25133:1459::o;26329:143::-;621:31183;;;;;26390:3;621:31183;;25333:18;621:31183;;;26406:22;621:31183;26390:43;;;;;:::i;:::-;;26329:143;621:31183;;;26160:160;621:31183;;;;;25227:1;621:31183;;;;;;26251:25;621:31183;26224:57;;;;;:::i;:::-;;26160:160;621:31183;;;25985:166;621:31183;;;;;26051:16;621:31183;;;;;;26051:61;;;;;:::i;:::-;;25985:166;621:31183;;;25903:72;25333:18;25938:10;;;:::i;:::-;-1:-1:-1;25938:19:14;621:31183;;-1:-1:-1;;621:31183:14;;;;;25903:72;;25643:108;;;;:::i;:::-;621:31183;;25643:108;;;;;621:31183;;;;;;;;;25607:286;25790:10;;;;;:::i;:::-;:26;;621:31183;;25863:10;;;:::i;:::-;621:31183;;25782:100;;;;;;621:31183;;-1:-1:-1;;;25782:100:14;;25843:4;25782:100;;;621:31183;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;25782:100;;;;;;;;25607:286;;;;25782:100;;;;:::i;:::-;;;;621:31183;;;-1:-1:-1;;;621:31183:14;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;621:31183:14;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;27468:972::-;621:31183;;;;;:::i;:::-;;;;;;;;-1:-1:-1;621:31183:14;;;;;;;;;;;;;;;;;;;;;;27630:17;;;27626:56;;27692:15;27717:27;27762:10;;;;;;28301:7;;;;:51;;;;27755:429;28297:137;;;;;;;-1:-1:-1;;621:31183:14;;;;;;;28368:14;;:::o;621:31183::-;;-1:-1:-1;;;621:31183:14;;;;;;;28297:137;28413:10;;:::o;28301:51::-;621:31183;;-1:-1:-1;621:31183:14;-1:-1:-1;;621:31183:14;;;;;;;;;28312:14;;;;;:::i;:::-;;:26;621:31183;;28312:40;28301:51;;;;;621:31183;;;-1:-1:-1;;;621:31183:14;;;;;;27755:429;621:31183;941:5:13;930:21;941:5;;;621:31183:14;;931:5:13;;;930:21;:::i;:::-;28042:10:14;;621:31183;28042:10;;;;;:::i;:::-;;:22;621:31183;;28042:35;;;;28097:10;;27755:429;;28038:136;621:31183;;;;;;;;;;28038:136;27755:429;;27626:56;27663:8;;;;;;:::o;621:31183::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;28446:2229;-1:-1:-1;621:31183:14;;;;;;28521:15;621:31183;;;;;;;;;;;28521:43;;;28446:2229;28517:151;;28681:10;;;:::i;:::-;:17;;;;;;;621:31183;;;;28677:89;;28779:10;;;;;:::i;:::-;:18;;621:31183;;;;28775:83;;621:31183;;;28870:12;621:31183;;;;;;;;;28870:31;621:31183;;;;28867:1752;621:31183;;;;;;;;;;;;;;;;;28944:25;621:31183;;;;28925:15;:44;;:71;;;28867:1752;28921:154;;621:31183;;;;;;;;;;;29111:25;621:31183;;;;28925:15;29092:44;;;;:102;;;28867:1752;29088:194;;;;621:31183;;;29318:25;;621:31183;;;;;28925:15;29299:44;;;;:94;;28867:1752;29295:169;;;;;28446:2229;:::o;29295:169::-;29413:8;29420:1;29413:8;:::o;29299:94::-;621:31183;;29366:27;621:31183;;28925:15;29347:46;;;-1:-1:-1;29299:94:14;;;;;29088:194;29214:8;;;;;;:::o;29092:102::-;29140:10;;;;:24;:10;;;:::i;:::-;:24;;621:31183;;;;;;;;;;;;;;29168:26;621:31183;;;;29140:54;29092:102;;;;28921:154;29016:8;;;;;;;29023:1;29016:8;:::o;28925:71::-;28973:10;;;;:::i;:::-;621:31183;;28973:23;28925:71;;28867:1752;621:31183;;;;;;;;;;29483:30;621:31183;;;;29480:1139;621:31183;;;;;;;29533:12;621:31183;;;;;;;;;29554:28;621:31183;;;29554:28;621:31183;-1:-1:-1;29533:49:14;:76;;;29480:1139;29529:159;;621:31183;;29533:12;621:31183;;;;;;;;;29554:28;621:31183;;;29726:28;621:31183;-1:-1:-1;29705:49:14;29701:141;;29533:12;621:31183;;;;;;;;29554:28;621:31183;;;29879:28;621:31183;-1:-1:-1;29859:98:14;;;;29480:1139;29855:173;;;;28446:2229;:::o;29859:98::-;621:31183;;;;;29930:27;621:31183;;29911:15;:46;;29859:98;;;;29701:141;29774:8;;;;;;:::o;29529:159::-;29629:8;;;;;;29636:1;29629:8;:::o;29533:76::-;29586:10;;;;:::i;:::-;621:31183;;29586:23;29533:76;;29480:1139;621:31183;;;;;;;;;;30047:32;621:31183;;;;30044:575;;29480:1139;;;;;;22210:32;:::o;30044:575::-;30099:24;:10;;;:::i;:::-;:24;;621:31183;;;;;;;;;;;;;;;;30127:26;621:31183;;;;;;;;30099:54;;:81;;;30044:575;30095:164;;30276:10;30099:24;30276:10;;;:::i;:::-;:24;;621:31183;;;;;;;;;;;;;;;30304:26;621:31183;;;;-1:-1:-1;30276:54:14;30272:146;;30435:10;30099:24;30435:10;;;:::i;:::-;:24;;621:31183;;;;;;;;;;;;;30462:26;621:31183;;;;-1:-1:-1;30435:103:14;;;;30044:575;30431:178;;;;;30044:575;;;;;;;30435:103;621:31183;;30511:27;621:31183;;30492:15;:46;;;-1:-1:-1;30435:103:14;;;;;30272:146;30350:8;;;;;;;;:::o;30099:81::-;30157:10;;;;:::i;:::-;621:31183;;30157:23;30099:81;;28775:83;28813:8;;;;;;28820:1;28813:8;:::o;28677:89::-;28714:8;;;;;;28721:1;28714:8;:::o;28517:151::-;28580:8;;;;;28587:1;28580:8;:::o;28521:43::-;28546:10;;:18;:10;;;:::i;:::-;:18;;621:31183;;;;28545:19;28521:43;;31068:445;;-1:-1:-1;;;;;;621:31183:14;;;;31224:10;621:31183;;;;;;31258:9;;31255:252;31258:9;;;31283:25;;;;;;:::o;31255:252::-;621:31183;;;;;31352:8;621:31183;;;;;;;;;31466:30;621:31183;31411:28;621:31183;;;31411:28;621:31183;;;31466:30;621:31183;31255:252;31068:445::o;31519:88::-;-1:-1:-1;;;;;31577:3:14;621:31183;31572:28;;;;;;;621:31183;;;;;;31572:28;;;;;621:31183;31572:28;;;;;621:31183;31572:28;;;;;;;;31519:88;:::o;31572:28::-;;;;:::i;:::-;621:31183;;;31572:28;621:31183;;;;;7466:628:10;;;;7670:418;;;621:31183:14;;;7701:22:10;7697:286;;7996:17;;:::o;7697:286::-;1465:19;:23;621:31183:14;;7996:17:10;:::o;621:31183:14:-;;;;-1:-1:-1;;;621:31183:14;;;;;;;;;;;;;;;;;;7670:418:10;621:31183:14;;;;-1:-1:-1;8775:21:10;:17;;8947:142;;;;;;;8771:379;621:31183:14;;;;9119:20:10;;;-1:-1:-1;;;9119:20:10;;621:31183:14;9119:20:10;;;621:31183:14;;;;;;:::i;:::-;9119:20:10;;
Swarm Source
ipfs://faa33b7a2bc03c99559eda5c4e9d0cdd591fb171befeb930b38945087479b6bf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,513.9 | 0.5516 | $1,386.69 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.