ETH Price: $2,514.91 (-1.41%)

Contract

0x619F793e2d7e077986D06630c11C6C0563Eb28e6
 

Overview

ETH Balance

0.551608397393162182 ETH

Eth Value

$1,387.24 (@ $2,514.91/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Enroll Referrer178013362023-07-29 21:19:47453 days ago1690665587IN
0x619F793e...563Eb28e6
0 ETH0.0023277524.8598535
Buy Entry ETH178012082023-07-29 20:53:59453 days ago1690664039IN
0x619F793e...563Eb28e6
0.003 ETH0.0043581926.43637808
Buy Entry Dust167289702023-02-28 20:15:59604 days ago1677615359IN
0x619F793e...563Eb28e6
0.0025 ETH0.0050767136.8789177
Buy Entry Dust167235462023-02-28 1:58:35605 days ago1677549515IN
0x619F793e...563Eb28e6
0.0025 ETH0.0025268818.35615038
Buy Entry Dust167235432023-02-28 1:57:59605 days ago1677549479IN
0x619F793e...563Eb28e6
0.0025 ETH0.0031945718.58834399
Buy Entry ETH167170812023-02-27 4:13:23606 days ago1677471203IN
0x619F793e...563Eb28e6
0.004 ETH0.0026743620.07612834
Buy Entry Dust167170642023-02-27 4:09:59606 days ago1677470999IN
0x619F793e...563Eb28e6
0.0025 ETH0.0032671720.67321045
Buy Entry Dust167170582023-02-27 4:08:47606 days ago1677470927IN
0x619F793e...563Eb28e6
0.0025 ETH0.0035988920.02724826
Buy Entry Dust167154662023-02-26 22:46:35606 days ago1677451595IN
0x619F793e...563Eb28e6
0.0025 ETH0.0034576625.11762117
Buy Entry Dust167154612023-02-26 22:45:35606 days ago1677451535IN
0x619F793e...563Eb28e6
0.0025 ETH0.0040068623.31485565
Buy Entry Dust167133152023-02-26 15:31:47606 days ago1677425507IN
0x619F793e...563Eb28e6
0.0025 ETH0.0031770423.07907712
Buy Entry Dust167133072023-02-26 15:30:11606 days ago1677425411IN
0x619F793e...563Eb28e6
0.0025 ETH0.0029638721.53057546
Buy Entry Dust167123572023-02-26 12:17:59606 days ago1677413879IN
0x619F793e...563Eb28e6
0.0025 ETH0.0026207119.03773333
Buy Entry Dust167123502023-02-26 12:16:35606 days ago1677413795IN
0x619F793e...563Eb28e6
0.0025 ETH0.0030485817.73885687
Buy Entry Dust167091832023-02-26 1:35:59607 days ago1677375359IN
0x619F793e...563Eb28e6
0.0025 ETH0.0046654918.02356631
Buy Entry Dust167091572023-02-26 1:30:47607 days ago1677375047IN
0x619F793e...563Eb28e6
0.0025 ETH0.0035955520.00866188
Buy Entry Dust167090842023-02-26 1:16:11607 days ago1677374171IN
0x619F793e...563Eb28e6
0.0025 ETH0.0027232119.78234911
Buy Entry Dust167085692023-02-25 23:31:35607 days ago1677367895IN
0x619F793e...563Eb28e6
0.0025 ETH0.0024430517.74715313
Buy Entry Dust167085662023-02-25 23:30:59607 days ago1677367859IN
0x619F793e...563Eb28e6
0.0025 ETH0.0026802519.47026113
Buy Entry Dust167085652023-02-25 23:30:47607 days ago1677367847IN
0x619F793e...563Eb28e6
0.0025 ETH0.0027607620.05510007
Buy Entry Dust167085622023-02-25 23:30:11607 days ago1677367811IN
0x619F793e...563Eb28e6
0.0025 ETH0.0031677218.43211393
Buy Entry Dust167072012023-02-25 18:54:35607 days ago1677351275IN
0x619F793e...563Eb28e6
0.0025 ETH0.0031494620.32250888
Buy Entry Dust167071972023-02-25 18:53:47607 days ago1677351227IN
0x619F793e...563Eb28e6
0.0025 ETH0.0040919721.63072451
Buy Entry Dust167071892023-02-25 18:52:11607 days ago1677351131IN
0x619F793e...563Eb28e6
0.0025 ETH0.0036700621.35507664
Buy Entry Dust167071812023-02-25 18:50:35607 days ago1677351035IN
0x619F793e...563Eb28e6
0.0025 ETH0.0040201521.25111566
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
178012082023-07-29 20:53:59453 days ago1690664039
0x619F793e...563Eb28e6
0.003 ETH
167297792023-02-28 23:00:35604 days ago1677625235
0x619F793e...563Eb28e6
0.005 ETH
167297792023-02-28 23:00:35604 days ago1677625235
0x619F793e...563Eb28e6
0.00743978 ETH
167289702023-02-28 20:15:59604 days ago1677615359
0x619F793e...563Eb28e6
0.0025 ETH
167235462023-02-28 1:58:35605 days ago1677549515
0x619F793e...563Eb28e6
0.0025 ETH
167235432023-02-28 1:57:59605 days ago1677549479
0x619F793e...563Eb28e6
0.0025 ETH
167170812023-02-27 4:13:23606 days ago1677471203
0x619F793e...563Eb28e6
0.004 ETH
167170642023-02-27 4:09:59606 days ago1677470999
0x619F793e...563Eb28e6
0.0025 ETH
167170582023-02-27 4:08:47606 days ago1677470927
0x619F793e...563Eb28e6
0.0025 ETH
167154662023-02-26 22:46:35606 days ago1677451595
0x619F793e...563Eb28e6
0.0025 ETH
167154612023-02-26 22:45:35606 days ago1677451535
0x619F793e...563Eb28e6
0.0025 ETH
167143472023-02-26 19:00:23606 days ago1677438023
0x619F793e...563Eb28e6
0.005 ETH
167143472023-02-26 19:00:23606 days ago1677438023
0x619F793e...563Eb28e6
0.00930919 ETH
167133152023-02-26 15:31:47606 days ago1677425507
0x619F793e...563Eb28e6
0.0025 ETH
167133072023-02-26 15:30:11606 days ago1677425411
0x619F793e...563Eb28e6
0.0025 ETH
167123572023-02-26 12:17:59606 days ago1677413879
0x619F793e...563Eb28e6
0.0025 ETH
167123502023-02-26 12:16:35606 days ago1677413795
0x619F793e...563Eb28e6
0.0025 ETH
167093052023-02-26 2:00:35607 days ago1677376835
0x619F793e...563Eb28e6
0.005 ETH
167093052023-02-26 2:00:35607 days ago1677376835
0x619F793e...563Eb28e6
0.00635741 ETH
167091832023-02-26 1:35:59607 days ago1677375359
0x619F793e...563Eb28e6
0.0025 ETH
167091572023-02-26 1:30:47607 days ago1677375047
0x619F793e...563Eb28e6
0.0025 ETH
167090842023-02-26 1:16:11607 days ago1677374171
0x619F793e...563Eb28e6
0.0025 ETH
167085692023-02-25 23:31:35607 days ago1677367895
0x619F793e...563Eb28e6
0.0025 ETH
167085662023-02-25 23:30:59607 days ago1677367859
0x619F793e...563Eb28e6
0.0025 ETH
167085652023-02-25 23:30:47607 days ago1677367847
0x619F793e...563Eb28e6
0.0025 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SweepersCompetitionVault

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 999 runs

Other Settings:
default evmVersion, MIT license
File 1 of 18 : SweepersCompetitionVaultV2.sol
// 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);
    }
}

File 2 of 18 : IRandomizer.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

interface IRandomizer {
    
    function getRandomWord() external returns (uint256);
    function requestRandomWords(uint256 _id) external;
    
}

File 3 of 18 : IDust.sol
// 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;
}

File 4 of 18 : OpsReady.sol
// 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);
        }
    }
}

File 5 of 18 : Math.sol
// 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);
        }
    }
}

File 6 of 18 : IERC1155Receiver.sol
// 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);
}

File 7 of 18 : IERC1155.sol
// 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;
}

File 8 of 18 : IERC721Enumerable.sol
// 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);
}

File 9 of 18 : IERC721Receiver.sol
// 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);
}

File 10 of 18 : Ownable.sol
// 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);
    }
}

File 11 of 18 : ReentrancyGuard.sol
// 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;
    }
}

File 12 of 18 : SafeERC20.sol
// 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");
        }
    }
}

File 13 of 18 : IERC721.sol
// 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);
}

File 14 of 18 : IERC165.sol
// 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);
}

File 15 of 18 : Context.sol
// 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;
    }
}

File 16 of 18 : Address.sol
// 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);
        }
    }
}

File 17 of 18 : draft-IERC20Permit.sol
// 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);
}

File 18 of 18 : IERC20.sol
// 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999
  },
  "viaIR": true,
  "evmVersion": "london",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.