Contract 0x98af019cdf16990130cba555861046b02e9898cc

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xededd796b816aff2b57c21812e160ef6aac08935db59e22511a75e106083c39cSet Whitelist Ph...21824502022-07-11 14:00:48508 days 2 hrs ago0xa6cc9397d29b631b69782e5f7fb9801224c8fa90 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00004139
0x31d818c8c562713d45d669e5c6f3f4eb7b733ebb6791f7304218895810fe093aBuy Plots21821952022-07-11 12:58:24508 days 3 hrs ago0x91ddbcc1839f8b167988fc49a15431b5931e3d47 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.000693945
0xb90abdba068a7386f8a3e89cf96419ba76f79d0af47443d90b4c72605a55e929Buy Plots21821702022-07-11 12:50:48508 days 3 hrs ago0x91ddbcc1839f8b167988fc49a15431b5931e3d47 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.000693945
0x746f2bd9d203f4045fa69877d5edb0a305bb98be3bcf4eff93b1073beb40129dBuy Plots21820102022-07-11 12:09:54508 days 3 hrs ago0xa6922b28f5fa7997a095bee1bf14287792ff1aaa IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00034163
0x682e70f9614431522e15e57a4d065cca8fde9ce3e947e5d8bed2e4cb548df82bSmart Buy With C...21820012022-07-11 12:08:06508 days 3 hrs ago0xa6922b28f5fa7997a095bee1bf14287792ff1aaa IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.0002568125
0x9ec43dc18d246ee8b79d9b7f595afc936a5eae7e005aa59364c79c396bbe4788Smart Buy With C...21812102022-07-11 8:56:00508 days 7 hrs ago0xa13d406bad76577f21196cd78b593cb708233b32 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.0002574075
0x4da9d784ca61b3f8c5cdf100bd7c53eb4110885bdbb5f28965e499ec22340c7fSmart Buy With C...21811722022-07-11 8:46:12508 days 7 hrs ago0xfbea1b97406c6945d07f50f588e54144ea8b684f IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.000083063
0x74be9cde3ba0cefed921847a8a866108eb7e65d16f6474579e9eee851131d140Smart Buy With C...21811532022-07-11 8:41:54508 days 7 hrs ago0xfbea1b97406c6945d07f50f588e54144ea8b684f IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.000102963
0xdc8b59029cbd9280a5293ba91c0e5a0200a5699f817e870156177560db10acebSmart Buy With C...21811362022-07-11 8:38:30508 days 7 hrs ago0xa13d406bad76577f21196cd78b593cb708233b32 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.0002574075
0xd41a798eb580569c7e5ceeab28018ee236e9ac23f6c52f6aa8f965429233dc1bSmart Buy With C...21811242022-07-11 8:35:06508 days 7 hrs ago0xfbea1b97406c6945d07f50f588e54144ea8b684f IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.000146400515
0x411149a5abb19a4e739a1228bf7eceaeda405f58290ad4071225b852b47f3636Smart Buy With C...21811192022-07-11 8:33:48508 days 7 hrs ago0xfbea1b97406c6945d07f50f588e54144ea8b684f IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.000122268562
0x1f3e712f2f5dba42414faf825ef67c0813e8cd9574ec63cd73613e72cd8dd4bdBuy Plots21811152022-07-11 8:32:54508 days 7 hrs ago0xfbea1b97406c6945d07f50f588e54144ea8b684f IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00029977325
0x1a5d921aad62745eba0c7964621f2cdfc36d5df2a6988659c16114d5f5f82c6dSmart Buy With C...21811152022-07-11 8:32:54508 days 7 hrs ago0xa13d406bad76577f21196cd78b593cb708233b32 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.0002574075
0xd2bdfeac242cc57271f4aec842cd0d595188ac0688f76220d9baeeee3ec6c8f5Smart Buy With C...21810882022-07-11 8:26:30508 days 7 hrs ago0xc0d6dad3fd7cad33a284f981071f37e58daa0b65 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.0002574075
0xfb5bd69c3c3e22e8060a28606be76145a4c8035385f30114bfa542039374138eSmart Buy With C...21810782022-07-11 8:24:06508 days 7 hrs ago0xc0d6dad3fd7cad33a284f981071f37e58daa0b65 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.0002574075
0xc371c9b466221a8b1bf9e3c7ef42ab2f3c0d71f0fa83c734567743f25b3521a7Buy Plots21810462022-07-11 8:16:30508 days 7 hrs ago0xc0d6dad3fd7cad33a284f981071f37e58daa0b65 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00034163
0xf00389922fe62604bdbe918bab3dba9d7b5256a8b40d344e9b1517d029c24051Buy Plots21809012022-07-11 7:42:06508 days 8 hrs ago0xc0d6dad3fd7cad33a284f981071f37e58daa0b65 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.0005895175
0x84aefc4ce64571957b738e850198347de81f5118213cd7fb6b516b59aafdf3fbSmart Buy With C...21808412022-07-11 7:27:54508 days 8 hrs ago0x0fd3acc9da536cc43c140c435a394f50bad7af93 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.000327775
0x452aced9252c199d29e92bffc534fc24edc2b1763de9f77d9250cf3d0589e382Buy Plots21801822022-07-11 4:44:24508 days 11 hrs ago0x189c415968ea2f62f6430d5050df872221633340 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00055203
0x0a1ad1f1032a34a222496e8678f87e6e93b1d85813b16640b849df0fbde3be34Buy Plots21801752022-07-11 4:42:54508 days 11 hrs ago0x189c415968ea2f62f6430d5050df872221633340 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00055203
0x5f9cf24bda9b8b3c10a95a60562091e03080ec382810094b210180ea82709e71Buy Plots21797592022-07-11 3:01:54508 days 13 hrs ago0xcf2ae27d8bb86b9a457789ff3fd9a5cc016fa044 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00034163
0x68f8453adaab4625c6b67de51de71b32a52cbb8ad29bfff7c53c466f3925816fBuy Plots21788992022-07-10 23:27:30508 days 16 hrs ago0x2594bcad3314cac904a79d2a607276910f2b3893 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00034163
0x27ede8b3fb183ca959bbbcab202ab84477dcd56aeed8eae0cc9870277df08a28Buy Plots21786412022-07-10 22:25:06508 days 17 hrs ago0x69353fe5d5681cb29b09c61feabbcf60ed705fc7 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00034163
0x03ff2b9c637bd451aab8721536d7a344b4750de0d03d6363ee543378fbcc4556Buy Plots21786322022-07-10 22:22:36508 days 17 hrs ago0x69353fe5d5681cb29b09c61feabbcf60ed705fc7 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00039138
0xcafdfc92b19243e052cc58db2f51463791d1caeaca7d67cabd2a0d4285ff1a60Buy Plots21785162022-07-10 21:55:18508 days 18 hrs ago0xd9492bf2d64e2a989f738778cea2f8b87fa78b78 IN  0x98af019cdf16990130cba555861046b02e9898cc0 MOVR0.00034163
[ Download CSV Export 
Parent Txn Hash Block From To Value
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LandSaleMarket

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity Multiple files format)

File 1 of 7: LandSaleMarket.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

import "./LandSale.sol";
import "./IERC20.sol";

contract LandSaleMarket is LandSale {

    event PlotListed(uint256 indexed plotId, address indexed seller, uint256 price);
    event PlotPriceChanged(uint256 indexed plotId, address indexed seller, uint256 oldPrice, uint256 newPrice);
    event PlotDelisted(uint256 indexed plotId, address indexed seller);
    event PlotPurchased(uint256 indexed plotId, address indexed seller, address indexed buyer, uint256 price);
    event OfferMade(uint256 indexed plotId, address indexed buyer, uint256 price);
    event OfferCancelled(uint256 indexed plotId, address indexed buyer, uint256 price);
    event EscrowReturned(address indexed buyer, uint256 value);
    event PlotTransferred(uint256 indexed plotIds, address indexed oldOwner, address indexed newOwner);

    struct Listing {
        uint256 price;
        uint256 timestamp;
    }

    struct Offer {
        address buyer;
        uint256 price;
        uint256 timestamp;
        bool cancelled;
    }

    bool private _pausedSales;
    bool private _pausedTransfers;
    uint256 private _creatorFee;

    mapping(uint256 => Listing) private _listings;
    mapping(uint256 => Offer[]) private _offers;
    mapping(address => uint256) private _claimableEscrow;

    constructor(uint256 commonPrice, uint256 rarePrice, uint256 epicPrice, uint256 creatorFee)
        LandSale(commonPrice, rarePrice, epicPrice)
    {
        _creatorFee = creatorFee;
        _pausedSales = true;
        _pausedTransfers = true;
    }

    modifier notPaused () {
        require(!_pausedSales, "Sales are paused");
        _;
    }

    // Setings
    function setPausedSales(bool paused) external onlyOwnerOrAdmin {
        _pausedSales = paused;
    }
    function setPausedTransfers(bool paused) external onlyOwnerOrAdmin {
        _pausedTransfers = paused;
    }

    function setCreatorFee(uint256 creatorFee) external onlyOwnerOrAdmin {
        _creatorFee = creatorFee;
    }

    function getPausedSales() external view returns (bool) {
        return _pausedSales;
    }

    function getPausedTransfers() external view returns (bool) {
        return _pausedTransfers;
    }

    function getCreatorFee() external view returns (uint256) {
        return _creatorFee;
    }

    // List - Buy - Offer

    function list(uint256 plotId, uint256 price) external onlyPlotOwner(plotId) notPaused {
        require(price > 0, "Price must be greater than 0");
        require(getPlotRarity(plotId) != Rarity.Harb, "Cannot list Harberger land");
        _listings[plotId] = Listing(price, block.timestamp);

        emit PlotListed(plotId, msg.sender, price);
    }

    function changePrice(uint256 plotId, uint256 newPrice) external onlyPlotOwner(plotId) {
        require(newPrice > 0, "Price must be greater than 0");
        uint oldPrice = _listings[plotId].price;
        require(oldPrice > 0, "Not listed");
        _listings[plotId].price = newPrice;

        emit PlotPriceChanged(plotId, msg.sender, oldPrice, newPrice);
    }

    function delist(uint256 plotId) external onlyPlotOwner(plotId) {
        _delist(plotId, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        emit PlotDelisted(plotId, msg.sender);
    }

    function _delist(uint256 plotId, uint256 doNotReturnIndex) private {
        delete _listings[plotId];
        Offer[] memory offers = _offers[plotId];
        uint numOffers = offers.length;
        for (uint i; i<numOffers;) {
            if (!offers[i].cancelled && i != doNotReturnIndex) {
                _claimableEscrow[offers[i].buyer] += offers[i].price;
            }
            unchecked { ++i; }
        }
        delete _offers[plotId];
    }

    function buy(uint256 plotId, uint256 price) external notPaused {
        Listing memory listing = _listings[plotId];
        require(listing.price > 0, "Not listed");
        IERC20 rmrkToken = IERC20(xcRMRK);
        require(rmrkToken.allowance(msg.sender, address(this)) >= listing.price, "Not enough allowance");
        require(price == listing.price, "Price does not match");

        _delist(plotId, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        address previousOwner = getPlotOwner(plotId);
        setPlotOwner(msg.sender, plotId);
        (uint pay, uint fee) = _getPayAndFee(listing.price);
        rmrkToken.transferFrom(msg.sender, previousOwner, pay);
        rmrkToken.transferFrom(msg.sender, beneficiary, fee);

        emit PlotPurchased(plotId, previousOwner, msg.sender, price);
    }

    function makeOffer(uint256 plotId, uint256 price) external notPaused {
        require(price > 0, "Price must be higher than 0");
        address plotOwner = getPlotOwner(plotId);
        require(plotOwner != msg.sender, "User is land owner");
        require(plotOwner != address(0), "Plot not sellable"); //
        require(getPlotRarity(plotId) != Rarity.Harb, "Cannot offer on Harberger land");

        uint listingPrice = _listings[plotId].price;
        // This check only applies if listed:
        if (listingPrice > 0) {
            require(price < listingPrice, "Offer over listed price");
        }

        IERC20 rmrkToken = IERC20(xcRMRK);
        require(rmrkToken.allowance(msg.sender, address(this)) >= price, "Not enough allowance");

        Offer memory offer = Offer(msg.sender, price, block.timestamp, false);
        _offers[plotId].push(offer);
        rmrkToken.transferFrom(msg.sender, address(this), price);

        emit OfferMade(plotId, msg.sender, price);
    }

    function cancelOffer(uint256 plotId, uint256 offerIndex) external {
        require(offerIndex < _offers[plotId].length, "Offer index out of range");
        Offer memory offer = _offers[plotId][offerIndex];
        require(msg.sender == offer.buyer, "User is not offer owner");
        require(!offer.cancelled, "Offer already cancelled");

        _claimableEscrow[offer.buyer] += offer.price;
        _offers[plotId][offerIndex].cancelled = true;

        emit OfferCancelled(plotId, msg.sender, offer.price);
    }

    function getOffers(uint256 plotId) external view returns(Offer[] memory) {
        return _offers[plotId];
    }

    function acceptOffer(uint256 plotId, uint256 offerIndex, uint256 price) external onlyPlotOwner(plotId) notPaused {
        require(offerIndex < _offers[plotId].length, "Offer index out of range");
        Offer memory offer = _offers[plotId][offerIndex];
        require(!offer.cancelled, "Offer already cancelled");
        require(offer.price == price, "Price does not match");

        _delist(plotId, offerIndex);
        setPlotOwner(offer.buyer, plotId);

        IERC20 rmrkToken = IERC20(xcRMRK);
        (uint pay, uint fee) = _getPayAndFee(offer.price);
        rmrkToken.transfer(msg.sender, pay);
        rmrkToken.transfer(beneficiary, fee);
        emit PlotPurchased(plotId, msg.sender, offer.buyer, price);
    }

    function returnEscrowed() external {
        uint256 returnValue = _claimableEscrow[msg.sender];
        require(returnValue > 0, "No escrow to return");
        IERC20(xcRMRK).transfer(msg.sender, returnValue);

        emit EscrowReturned(msg.sender, returnValue);
    }

    // Transfer

    function transfer(uint plotId, address newOwner) external onlyPlotOwner(plotId) {
        require(newOwner != msg.sender, "Cannot transfer to self");
        require(!_pausedTransfers, "Transfers are paused");
        require(_listings[plotId].price == 0, "Cannot transfer listed plot");
        require(getPlotRarity(plotId) != Rarity.Harb, "Cannot transfer Harberger land");

        setPlotOwner(newOwner, plotId);
        emit PlotTransferred(plotId, msg.sender, newOwner);
    }

    // Utilities
    function getIsListed(uint256 plotId) external view returns (bool) {
        return _listings[plotId].price > 0; 
    }

    function getListedInfo(uint256 plotId) external view returns (uint256, uint256) {
        Listing memory listing = _listings[plotId];
        require(listing.price > 0, "Not listed");
        return (listing.price, listing.timestamp);
    }

    function getListedPrice(uint256 plotId) external view returns (uint256) {
        uint256 price = _listings[plotId].price;
        require(price > 0, "Not listed");
        return price;
    }

    function getCurrentBid(uint256 plotId) external view returns (uint256) {
        Offer[] memory offers = _offers[plotId];
        uint numOffers = offers.length;
        uint currentBid = 0;
        for (uint i; i<numOffers;) {
            if (!offers[i].cancelled && offers[i].price > currentBid) {
                currentBid = offers[i].price;
            }
            unchecked { ++i; }
        }
        return currentBid;
    }

    function getClaimableEscrow() external view returns (uint256) {
        return _claimableEscrow[msg.sender];
    }

    function _getPayAndFee(uint256 price) private view returns (uint256, uint256) {
        uint256 fee = uint256(price * _creatorFee) / _PRICE_PRECISION;
        uint256 pay = uint256(price - fee);
        return (pay, fee);
    }

}

File 2 of 7: AdminAccessible.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

contract AdminAccesible {
    address private _owner;
    // int as value is cheaper than boolean:
    mapping(address => uint) private _admins;

    modifier onlyOwner {
        require(msg.sender == _owner, "User is not owner.");
        _;
    }

    modifier onlyOwnerOrAdmin {
        require(msg.sender == _owner || isAdmin(msg.sender), "User is not owner or admin.");
        _;
    }

    constructor () {
        _owner = msg.sender;
    }

    function addAdmin(address admin) external onlyOwner {
        require(admin != address(0), "Admin cannot be the zero address");
        _admins[admin] = 1;
    }

    function revokeAdmin(address admin) external onlyOwner {
        delete _admins[admin];
    }

    function isAdmin(address admin) public view returns (bool) {
        return _admins[admin] == 1;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Owner cannot be the zero address");
        _owner = newOwner;
    }

    function getOwner() external view returns(address) {
        return _owner;
    }
}

File 3 of 7: IERC20.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

interface IERC20 {
    function transfer(
        address to,
        uint256 amount
    ) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);
}

File 4 of 7: LandSale.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

import "./UserData.sol";
import "./Plots.sol";
import "./IERC20.sol";

contract LandSale is Plots {

    event PlotsBought(uint256[] plotIds, address indexed buyer, address indexed referrer, bool indexed boughtWithCredits);

    // All discounts should be in terms of x / 1_000_000
    uint256 internal constant _PRICE_PRECISION = 1_000_000;
    uint256 internal constant _MAX_DISCOUNT = 500_000; // 50%
    uint256 internal constant _REFERRER_FEE = 50_000; // 5%
    uint256 private constant _LERP_PRECISION = 10_000;
    uint256 private constant _MIN_MASS_FOR_BIOME_DISCOUNT = 40;

    uint256 private immutable _commonPrice;
    uint256 private immutable _rarePrice;
    uint256 private immutable _epicPrice;

    uint256 private constant _XCRMRK_DECIMALS = 1*10**10;

    address internal xcRMRK;
    address internal beneficiary;
    address private _userDataAddress;

    uint256 private _whiteListPhase;
    uint256 private _dutchStart;
    uint256 private _dutchDuration;
    uint256 private _dutchMinMultiplier = 100_000;
    bool private _referralIsActive;
    uint256 private _referralMinCommonPlots; // Or equivalent in XCRMRK

    uint256 private _soldWithCredits;
    uint256 private _soldWithxcRMRK;

    mapping(address => uint) private _approvedReferrers;

    modifier checkWhitelist {
        UserData(_userDataAddress).checkWhitelist(msg.sender, _whiteListPhase);
        _;
    }

    constructor(uint256 commonPrice_, uint256 rarePrice_, uint256 epicPrice_) {
        require(commonPrice_ > _XCRMRK_DECIMALS, "Common price must be > 1 xcRMRK");
        require(rarePrice_ > _XCRMRK_DECIMALS, "Rare price must be > 1 xcRMRK");
        require(epicPrice_ > _XCRMRK_DECIMALS, "Epic price must be > 1 xcRMRK");
        _commonPrice = commonPrice_;
        _rarePrice = rarePrice_;
        _epicPrice = epicPrice_;
        _referralIsActive = true;
        _referralMinCommonPlots = 10;
    }

    function getPricesPerRarity() external view returns (uint256, uint256, uint256) {
        return (_commonPrice, _rarePrice, _epicPrice);
    }

    function getReferralIsActive() external view returns (bool) {
        return _referralIsActive;
    }

    function setReferralIsActive(bool isActive) external onlyOwnerOrAdmin {
        _referralIsActive = isActive;
    }

    function getReferralMinCommonPlots() external view returns (uint256) {
        return _referralMinCommonPlots;
    }

    function setReferralMinCommonPlots(uint256 minCommonPlots) external onlyOwnerOrAdmin {
        _referralMinCommonPlots = minCommonPlots;
    }

    function addReferrer(address referrer) external onlyOwnerOrAdmin {
        require(referrer != address(0), "Referrer cannot be the 0 address");
        _approvedReferrers[referrer] = 1;
    }

    function removeReferrer(address referrer) external onlyOwnerOrAdmin {
        delete _approvedReferrers[referrer];
    }

    function isReferrer(address referrer) external view returns (bool) {
        return _approvedReferrers[referrer] == 1;
    }

    function getNumPlotsSold() external view returns (uint256, uint256) {
        return (_soldWithxcRMRK, _soldWithCredits);
    }

    function buyPlots(
        uint256[] calldata plotIds,
        uint256[] calldata singleDiscountIndexes,
        uint256[] calldata multiDiscountIndexes,
        address referrer
    ) external checkWhitelist {
        _buyPlots(plotIds, singleDiscountIndexes, multiDiscountIndexes, referrer);
    }

    function _buyPlots(
        uint256[] calldata plotIds,
        uint256[] calldata singleDiscountIndexes,
        uint256[] calldata multiDiscountIndexes,
        address referrer
    ) internal {
        require(plotIds.length > 0, "No plots to buy");
        uint256 price = _getPurchasePrice(plotIds, singleDiscountIndexes, multiDiscountIndexes);
        UserData(_userDataAddress).spendDiscounts(msg.sender, singleDiscountIndexes, multiDiscountIndexes);
        bool success;
        if (_referrerApplies(referrer)) {
            (uint pay, uint fee) = _getPayAndReferrerFee(price);
            success = IERC20(xcRMRK).transferFrom(msg.sender, referrer, fee);
            if (success) {
                success = IERC20(xcRMRK).transferFrom(msg.sender, beneficiary, pay);
            }
        }
        else {
            referrer = address(0);
            success = IERC20(xcRMRK).transferFrom(msg.sender, beneficiary, price);
        }

        require(success, "Landsale: TransferFrom failure");

        _processPlotBuy(plotIds, referrer, false);
    }

    function _referrerApplies(address referrer) internal view returns (bool) {
        if (referrer == address(0) || referrer == msg.sender || !_referralIsActive) {
            return false;
        }
        if (_approvedReferrers[referrer] == 1) {
            return true;
        }
        (uint256 numCommon, uint256 numRare, uint256 numEpic, , ) = countPlotRarities(_allOwnedPlots[referrer]);
        return numCommon + numRare * 3 + numEpic * 5 >= _referralMinCommonPlots;

    }

    function _getPayAndReferrerFee(uint256 price) private pure returns (uint256, uint256) {
        uint256 fee = uint256(price * _REFERRER_FEE) / _PRICE_PRECISION;
        uint256 pay = uint256(price - fee);
        return (pay, fee);
    }

    function buyWithCredits(uint256[] calldata plotIds, Rarity creditRarity) external checkWhitelist {
        uint numPlots = plotIds.length;
        require(numPlots > 0, "No plots to buy");
        uint256 userAvailableCredits = UserData(_userDataAddress).getUserCreditsForRarity(msg.sender, creditRarity);
        require(userAvailableCredits >= numPlots, "Not enough credits in account");

        (uint256 numCommon, uint256 numRare, uint256 numEpic, uint256 numHarb, uint256 numPremium) = countPlotRarities(plotIds);
        // There are no Harb credits, but Harb can be bought with premium.
        numPremium += numHarb;
        numHarb = 0;

        if (creditRarity == Rarity.Common) {
            require(numCommon == numPlots, "Only common lands");
            UserData(_userDataAddress).spendCredits(msg.sender, numPlots, 0, 0, 0);
            _processPlotBuy(plotIds, address(0), true);
        }

        else if (creditRarity == Rarity.Rare) {
            require(numCommon + numRare == numPlots, "Only common or rare lands");
            UserData(_userDataAddress).spendCredits(msg.sender, 0, numPlots, 0, 0);
            _processPlotBuy(plotIds, address(0), true);
        }

        else if (creditRarity == Rarity.Epic) {
            require(numCommon + numRare + numEpic == numPlots, "Only common, rare or epic lands");
            UserData(_userDataAddress).spendCredits(msg.sender, 0, 0, numPlots, 0);
            _processPlotBuy(plotIds, address(0), true);
        }

        else {
            // These conditions could only break if the in chain plot data was corrupted:
            require(
                creditRarity == Rarity.Premium
                && numCommon + numRare + numEpic + numPremium == numPlots,
                "Unexpected credit rarity"
            );
            UserData(_userDataAddress).spendCredits(msg.sender, 0, 0, 0, numPlots);
            _processPlotBuy(plotIds, address(0), true);
        }
    }

    function _processPlotBuy(uint256[] memory plotIds, address referrer, bool boughtWithCredits) private {
        uint256 numPlots = plotIds.length;
        for(uint i; i<numPlots;) {
            uint256 plotId = plotIds[i];
            require(getPlotAvailability(plotId), "RMRK Landsale: Plot unavailable");
            setPlotOwner(msg.sender, plotId);
            unchecked { ++i; }
        }

        if (boughtWithCredits) {
            _soldWithCredits += plotIds.length;
        }
        else {
            _soldWithxcRMRK += plotIds.length;
        }

        emit PlotsBought(plotIds, msg.sender, referrer, boughtWithCredits);
    }

    function smartBuyWithCredits(
        uint256[] calldata plotIds,
        uint256 commonCredits,
        uint256 rareCredits,
        uint256 epicCredits,
        uint256 premiumCredits
    ) external checkWhitelist {
        _smartBuyWithCredits(plotIds, commonCredits, rareCredits, epicCredits, premiumCredits);
    }

    function _smartBuyWithCredits(
        uint256[] calldata plotIds,
        uint256 commonCredits,
        uint256 rareCredits,
        uint256 epicCredits,
        uint256 premiumCredits
    ) internal {
        require(plotIds.length > 0, "No plots to buy");
        (uint256 numCommon, uint256 numRare, uint256 numEpic, uint256 numHarb, uint256 numPremium) = countPlotRarities(plotIds);

        // There are no Harb credits, but Harb can be bought with premium.
        numPremium += numHarb;
        numHarb = 0;

        // Pass missing to the next tier, order is critical
        if(numCommon > commonCredits) {
            numRare += (numCommon - commonCredits);
            numCommon -= (numCommon - commonCredits);
        }

        // Pass missing to the next tier, order is critical
        if(numRare > rareCredits) {
            numEpic += (numRare - rareCredits);
            numRare -= (numRare - rareCredits);
        }

        // Pass missing to the next tier, order is critical
        if(numEpic > epicCredits) {
            numPremium += (numEpic - epicCredits);
            numEpic -= (numEpic - epicCredits);
        }

        require(
            commonCredits >= numCommon && rareCredits >= numRare && epicCredits >= numEpic && premiumCredits >= numPremium,
            "Not enough credits set"
        );

        UserData(_userDataAddress).spendCredits(msg.sender, numCommon, numRare, numEpic, numPremium);
        _processPlotBuy(plotIds, address(0), true);
    }

    function mixBuy(
        uint256[] calldata xcRmrkPlotIds,
        uint256[] calldata singleDiscountIndexes,
        uint256[] calldata multiDiscountIndexes,
        address referrer,
        uint256[] calldata creditsPlotIds,
        UserCredits calldata userCredits
    ) external checkWhitelist {
        _smartBuyWithCredits(creditsPlotIds, userCredits.commonCredits, userCredits.rareCredits, userCredits.epicCredits, userCredits.premiumCredits);
        _buyPlots(xcRmrkPlotIds, singleDiscountIndexes, multiDiscountIndexes, referrer);
    }

    function getPurchasePrice(uint256[] memory plotIds, uint256[] calldata singleDiscountIndexes, uint256[] calldata multiDiscountIndexes) external view returns (uint) {
        return _getPurchasePrice(plotIds, singleDiscountIndexes, multiDiscountIndexes);
    }

    function _getPurchasePrice(uint256[] memory plotIds, uint256[] calldata singleDiscountIndexes, uint256[] calldata multiDiscountIndexes) private view returns (uint) {
        uint numPlots = plotIds.length;
        require(singleDiscountIndexes.length == 0 || numPlots == 1, "Use single discounts with 1 plot");

        uint256 price = 0;
        // We load all discounts into a single array for simplicity
        UserData.Discount[] memory discounts = UserData(_userDataAddress).loadDiscounts(msg.sender, singleDiscountIndexes, multiDiscountIndexes);

        for (uint i; i<numPlots;) {
            PlotData memory plotData = getPlotData(plotIds[i]);
            uint256 plotPrice = _getPriceWithDiscount(plotData, discounts);
            price += plotPrice;

            unchecked { ++i; }
        }

        if (_isDutchPhase()) {
            price = _getDutchPrice(price);
        }

        return price;
    }

    function _getPriceWithDiscount(PlotData memory plotData, UserData.Discount[] memory discounts) private view returns (uint) {
        uint256 initPrice;
        uint256 discountSum;

        if (plotData.rarity == Rarity.Common) {
            initPrice = _commonPrice;
        }

        else if (plotData.rarity == Rarity.Rare) {
            initPrice = _rarePrice;
        }

        else if (plotData.rarity == Rarity.Epic) {
            initPrice = _epicPrice;
        }

        else {
            revert("Bad land rarity");
        }

        uint numDiscounts = discounts.length;
        // This should be the common case
        if (numDiscounts == 0){
            return initPrice;
        }
        UserData.Discount memory discount;

        for (uint i; i < numDiscounts;) {
            discount = discounts[i];
            if (discount.forAll) {
                discountSum += discount.discount;
            }
            else if (plotData.cyber > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forCyberBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.steampunk > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forSteampunkBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.wind > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forWindBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.volcano > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forVolcanoBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.fire > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forFireBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.water > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forWaterBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.necro > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forNecroBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.mecha > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forMechaBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.dragon > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forDragonBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.meadow > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forMeadowBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.isIsland == 1 && discount.forIsland) {
                discountSum += discount.discount;
            }
            else if (plotData.isShore == 1 && discount.forShore) {
                discountSum += discount.discount;
            }
            else if (plotData.isMountainFoot == 1 && discount.forMountainFoot) {
                discountSum += discount.discount;
            }
            unchecked { ++i; }
        }

        if (discountSum > _MAX_DISCOUNT) {
            discountSum = _MAX_DISCOUNT;
        }
        return (initPrice * (_PRICE_PRECISION - discountSum)) / _PRICE_PRECISION;
    }

    function setxcRMRK(address newAddress) external onlyOwnerOrAdmin {
        xcRMRK = newAddress;
    }

    function setUserDataAddress(address newAddress) external onlyOwnerOrAdmin {
        _userDataAddress = newAddress;
    }

    function setBeneficiary(address newAddress) external onlyOwnerOrAdmin {
        beneficiary = newAddress;
    }

    function setDutchConfig(uint256 start, uint256 duration, uint256 multiplier) external onlyOwnerOrAdmin {
        require(multiplier < 1_000_000, "Value over precision");
        _dutchStart = start;
        _dutchDuration = duration;
        _dutchMinMultiplier = multiplier;
    }

    function _isDutchPhase() private view returns(bool) {
        return _whiteListPhase == 5;
    }

    function getXcRMRK() external view returns(address) {
        return xcRMRK;
    }

    function getUserDataAddress() external view returns(address) {
        return _userDataAddress;
    }

    function getBeneficiary() external view returns(address) {
        return beneficiary;
    }

    function getWhiteListPhase() external view returns(uint256) {
        return _whiteListPhase;
    }

    function getDutchStart() external view returns(uint256) {
        return _dutchStart;
    }

    function getDutchDuration() external view returns(uint256) {
        return _dutchDuration;
    }

    function getDutchMinMultiplier() external view returns(uint256) {
        return _dutchMinMultiplier;
    }

    // White list:
    function setWhitelistPhase(uint256 phaseId) external onlyOwnerOrAdmin {
        require(phaseId <= 5, "Bad phase id");
        _whiteListPhase = phaseId;
    }

    function getDutchPrice(uint256 price) external view returns(uint) {
        return _getDutchPrice(price);
    }

    function _getDutchPrice(uint256 price) private view returns(uint) {
        //Clamp to prevent underflow on currentElapsedRatio calculation
        // elapsed must be between 0 and _dutchDuration:
        uint256 elapsed = _clampUpper(_getTimeElapsed(), _dutchDuration);
        // currentElapsedRatio is between 0 (beginning of auction) to _LERP_PRECISION (end of auction)
        uint256 currentElapsedRatio = _LERP_PRECISION - (_dutchDuration - elapsed) * _LERP_PRECISION / _dutchDuration;
        // _PRICE_PRECISION is 100%
        uint256 currentPriceMultipler = _lerp(_PRICE_PRECISION, _dutchMinMultiplier, currentElapsedRatio);
        uint256 adjustedPrice = currentPriceMultipler * price / _PRICE_PRECISION;
        return adjustedPrice;
    }

    function _getTimeElapsed() private view returns(uint) {
        return _dutchStart < block.timestamp ? (block.timestamp - _dutchStart) : 0 ;
    }

    //Linear interpellation. Position has precision of _LERP_PRECISION
    function _lerp(uint256 val0, uint256 val1, uint256 position) private pure returns(uint256) {
        uint256 res = ((((_LERP_PRECISION - position) * val0) + (position * val1)) / _LERP_PRECISION);
        return res;
    }

    function _clampUpper(uint256 value, uint256 clamp) private pure returns(uint) {
        if (value < clamp){
            return value;
        }
        else {
            return clamp;
        }
    }

}

File 5 of 7: LandSaleCore.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;


contract LandSaleCore {

    enum Rarity { None, Common, Rare, Epic, Harb, Premium }
    enum Entropy { None, Seldom, Infrequent, Uncommon, Common, Frequent, Constant }

    struct UserCredits {
        uint256 commonCredits;
        uint256 rareCredits;
        uint256 epicCredits;
        uint256 premiumCredits;
    }
}

File 6 of 7: Plots.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

import "./AdminAccessible.sol";
import "./LandSaleCore.sol";


contract Plots is AdminAccesible, LandSaleCore {

    event PlotResourceSet(uint256 indexed plotId, string buyer);

    struct PlotData {
        uint8 cyber;
        uint8 steampunk;
        uint8 wind;
        uint8 volcano;
        uint8 fire;
        uint8 water;
        uint8 necro;
        uint8 mecha;
        uint8 dragon;
        uint8 meadow;
        uint8 isShore; // 0 = no, 1 = yes
        uint8 isIsland; // 0 = mainland, 1 = island
        uint8 isMountainFoot; // 0 = no, 1 = yes
        Rarity rarity;
        Entropy entropy;
    }

    struct OwnedPlotRarities {
        uint32 common;
        uint32 rare;
        uint32 epic;
        uint32 harb;
        uint32 premium;
    }

    mapping(uint256 => PlotData) private _plotData;
    mapping(uint256 => address) private _plotOwners;
    mapping(uint256 => string) private _plotImg;
    mapping(address => uint256[]) internal _allOwnedPlots;
    bool private _plotDataLock;

    modifier onlyPlotOwner (uint256 plotId) {
        require(msg.sender == _plotOwners[plotId], "User is not land owner");
        _;
    }

    function getPlotOwner(uint256 plotId) public view returns (address) {
        return _plotOwners[plotId];
    }

    function setPlotDataLock(bool state) external onlyOwner onlyOwnerOrAdmin {
        _plotDataLock = state;
    }

    function getPlotDataLock() external view returns (bool) {
        return _plotDataLock;
    }

    function getPlotData(uint256 plotId) public view returns(PlotData memory) {
        return _plotData[plotId];
    }

    function getPlotRarity(uint256 plotId) internal view returns(Rarity) {
        return _plotData[plotId].rarity;
    }

    //Expects all arrays to be identical size.
    function setPlotDataMulti(uint256[] calldata plotIds, PlotData[] calldata plotsData) external onlyOwnerOrAdmin {
        require(!_plotDataLock, "Plot data setter is locked.");
        uint256 len = plotIds.length;
        require(len==plotsData.length, "Arrays must have the same length");
        for(uint i; i<len;) {
            uint256 plotId = plotIds[i];
            _plotData[plotId] = plotsData[i];
            unchecked { ++i; }
        }
    }

    function setPlotData(uint256 plotId, PlotData calldata plotData) external onlyOwnerOrAdmin {
        require(!_plotDataLock, "Plot data setter is locked.");
        _plotData[plotId] = plotData;
    }

    function countPlotRarities(uint256[] memory plotIds) internal view returns (uint, uint, uint, uint, uint) {

        uint256 commons;
        uint256 rares;
        uint256 epics;
        uint256 harbs;
        uint256 premium;

        uint256 len = plotIds.length;

        for(uint i; i<len;) {
            uint256 plotId = plotIds[i];

            if (_plotData[plotId].rarity == Rarity.Common) {
                commons +=1;
            }
            else if (_plotData[plotId].rarity == Rarity.Rare) {
                rares +=1;
            }
            else if (_plotData[plotId].rarity == Rarity.Epic) {
                epics +=1;
            }
            else if (_plotData[plotId].rarity == Rarity.Harb) {
                harbs +=1;
            }
            else {
                // This condition should be unreachable
                require(_plotData[plotId].rarity == Rarity.Premium, "Bad land rarity");
                premium +=1;
            }

            unchecked { ++i; }
        }

        return (commons, rares, epics, harbs, premium);
    }

    function getOwnedPlotRarities(address user) external view returns(OwnedPlotRarities memory ownedPlotRarities) {
        (uint256 numCommon, uint256 numRare, uint256 numEpic, uint256 numHarb, uint256 numPremium) = countPlotRarities(_allOwnedPlots[user]);

        ownedPlotRarities = OwnedPlotRarities({
            common: uint32(numCommon),
            rare: uint32(numRare),
            epic: uint32(numEpic),
            harb: uint32(numHarb),
            premium: uint32(numPremium)
        });
    }

    function getPlotAvailability(uint256 plotId) public view returns(bool) {
        require(_plotData[plotId].rarity != Rarity.None, "Plot not initialized");
        return _plotOwners[plotId] == address(0);
    }

    function getPlotOwners(uint256[] memory plotIds) external view returns(address[] memory) {
        uint256 numPlots = plotIds.length;
        address[] memory owners = new address[](numPlots);

        for(uint i; i<numPlots;) {
            uint256 plotId = plotIds[i];
            owners[i] = _plotOwners[plotId];
            unchecked { ++i; }
        }

        return owners;
    }

    function getOwnedPlots(address user) external view returns(uint256[] memory) {
        return _allOwnedPlots[user];
    }

    function setPlotOwner(address user, uint256 plotId) internal {
        address oldOwner = _plotOwners[plotId];
        _plotOwners[plotId] = user;
        _allOwnedPlots[user].push(plotId);

        // Remove plot from old owner
        if (oldOwner != address(0)) {
            uint256[] memory oldOwnerPlots = _allOwnedPlots[oldOwner];
            uint256 len = oldOwnerPlots.length;
            uint256 oldIndex = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
            for(uint i; i<len;) {
                if (oldOwnerPlots[i] == plotId) {
                    oldIndex = i;
                    break;
                }
                unchecked { ++i; }
            }
            // This condition should be unreachable
            require(oldIndex != 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Plot not found in old owner");
            // No need to swap if we're removing the last element
            if (oldIndex != len-1) {
                _allOwnedPlots[oldOwner][oldIndex] = _allOwnedPlots[oldOwner][len-1];
            }
            _allOwnedPlots[oldOwner].pop();
        }
    }

    function setPlotResource(uint256 plotId, string memory imgData) external onlyPlotOwner(plotId) {
        _plotImg[plotId] = imgData;
        emit PlotResourceSet(plotId, imgData);
    }

    function getPlotResource(uint256 plotId) external view returns(string memory) {
        return _plotImg[plotId];
    }

    function getPlotResourceBatch(uint256[] memory plotIds) external view returns(string[] memory) {
        uint256 numPlots = plotIds.length;
        string[] memory resources = new string[](numPlots);

        for(uint i; i<numPlots;) {
            uint256 plotId = plotIds[i];
            resources[i] = _plotImg[plotId];
            unchecked { ++i; }
        }

        return resources;
    }
}

File 7 of 7: UserData.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

import "./AdminAccessible.sol";
import "./LandSaleCore.sol";


contract UserData is AdminAccesible, LandSaleCore {

    event CreditsSpent(address indexed user, uint common, uint rare, uint epic, uint premium);
    event DiscountsSpent(address indexed user, uint256[] singleDiscountIndexes, uint256[] multiDiscountIndexes);

    struct UserWhiteList {
        bool phase1;
        bool phase2;
        bool phase3;
    }

    struct Discount {
        uint128 discount;
        bool forCyberBiome;
        bool forSteampunkBiome;
        bool forWindBiome;
        bool forVolcanoBiome;
        bool forFireBiome;
        bool forWaterBiome;
        bool forNecroBiome;
        bool forMechaBiome;
        bool forDragonBiome;
        bool forMeadowBiome;
        bool forShore;
        bool forIsland;
        bool forMountainFoot;
        bool forAll;
    }

    struct UserDiscounts {
        Discount[] single;
        Discount[] multi;
    }

    //getter composition
    struct UserDataIntake {
        uint256 commonCredits;
        uint256 rareCredits;
        uint256 epicCredits;
        uint256 premiumCredits;
        Discount[] singleDiscounts;
        Discount[] multiDiscounts;
        bool whiteListPhase1;
        bool whiteListPhase2;
        bool whiteListPhase3;
    }

    // Credits
    mapping(address => mapping(Rarity => uint256)) private _userCredits;
    // Whitelist
    address private _landSaleAddress;
    uint256 private _lastUpdate;
    mapping(address => UserWhiteList) private _userWL;
    // Discounts
    mapping(address => Discount[]) private _userDiscountsSingle;
    mapping(address => Discount[]) private _userDiscountsMulti;

    modifier onlyLandsale {
        require(_landSaleAddress == msg.sender, "Forbidden");
        _;
    }

    function checkWhitelist(address user, uint256 whiteListPhase) external view {
        if (whiteListPhase == 0) {
            revert("Sale not open");
        }
        else if (whiteListPhase == 1) {
            require(
                _userWL[user].phase1,
                "Kokopelli: Not whitelisted"
                );
        }
        else if (whiteListPhase == 2) {
            require(
                _userWL[user].phase1 ||
                _userWL[user].phase2,
                "Kanaria: Not whitelisted"
                );
        }
        else if (whiteListPhase == 3) {
            require(
                _userWL[user].phase1 ||
                _userWL[user].phase2 ||
                _userWL[user].phase3,
                "WL: Not whitelisted");
        }
        // 4 is public, 5 is dutch, they require no whitelist
    }


    // LandSale
    function setLandSaleAddress(address landSaleAddress) external onlyOwnerOrAdmin {
        _landSaleAddress = landSaleAddress;
    }

    function getLandSaleAddress() external view returns(address) {
        return _landSaleAddress;
    }

    // Credits
    function setUserCredits(address user, uint256 commonCredits, uint256 rareCredits, uint256 epicCredits, uint256 premiumCredits) external onlyOwnerOrAdmin {
        _setUserCredits(user, commonCredits, rareCredits, epicCredits, premiumCredits);
        _setLastUpdate();
    }

    function setUserCreditsBatch(
        address[] calldata users,
        uint256[] calldata commonCredits,
        uint256[] calldata rareCredits,
        uint256[] calldata epicCredits,
        uint256[] calldata premiumCredits
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == commonCredits.length && numUsers == rareCredits.length && numUsers == epicCredits.length && numUsers == premiumCredits.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _setUserCredits(users[i], commonCredits[i], rareCredits[i], epicCredits[i], premiumCredits[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function _setUserCredits(address user, uint256 commonCredits, uint256 rareCredits, uint256 epicCredits, uint256 premiumCredits) private {
        _userCredits[user][Rarity.Common] = commonCredits;
        _userCredits[user][Rarity.Rare] = rareCredits;
        _userCredits[user][Rarity.Epic] = epicCredits;
        _userCredits[user][Rarity.Premium] = premiumCredits;
    }

    function addUserCredits(address user, uint256 commonCredits, uint256 rareCredits, uint256 epicCredits, uint256 premiumCredits) external onlyOwnerOrAdmin {
        _addUserCredits(user, commonCredits, rareCredits, epicCredits, premiumCredits);
        _setLastUpdate();
    }

    function addUserCreditsBatch(
        address[] calldata users,
        uint256[] calldata commonCredits,
        uint256[] calldata rareCredits,
        uint256[] calldata epicCredits,
        uint256[] calldata premiumCredits
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == commonCredits.length && numUsers == rareCredits.length && numUsers == epicCredits.length && numUsers == premiumCredits.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _addUserCredits(users[i], commonCredits[i], rareCredits[i], epicCredits[i], premiumCredits[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function _addUserCredits(address user, uint256 commonCredits, uint256 rareCredits, uint256 epicCredits, uint256 premiumCredits) internal {
        _userCredits[user][Rarity.Common] += commonCredits;
        _userCredits[user][Rarity.Rare] += rareCredits;
        _userCredits[user][Rarity.Epic] += epicCredits;
        _userCredits[user][Rarity.Premium] += premiumCredits;
    }

    function removeAllUserCredits(address user) external onlyOwnerOrAdmin {
        delete _userCredits[user][Rarity.Common];
        delete _userCredits[user][Rarity.Rare];
        delete _userCredits[user][Rarity.Epic];
        delete _userCredits[user][Rarity.Premium];
    }

    function getUserCreditData(address user) external view returns (UserCredits memory userCreditData) {
        userCreditData = UserCredits ({
            commonCredits: _userCredits[user][Rarity.Common],
            rareCredits: _userCredits[user][Rarity.Rare],
            epicCredits: _userCredits[user][Rarity.Epic],
            premiumCredits: _userCredits[user][Rarity.Premium]
        });
    }

    function getUserCreditsForRarity(address user, Rarity rarity) external view returns (uint256) {
        return _userCredits[user][rarity];
    }

    function spendCredits(address user, uint common, uint rare, uint epic, uint premium) external onlyLandsale {
        require(_userCredits[user][Rarity.Common] >= common, "Not enough common credits");
        require(_userCredits[user][Rarity.Rare] >= rare, "Not enough rare credits");
        require(_userCredits[user][Rarity.Epic] >= epic, "Not enough epic credits");
        require(_userCredits[user][Rarity.Premium] >= premium, "Not enough premium credits");

        _userCredits[user][Rarity.Common] -= common;
        _userCredits[user][Rarity.Rare] -= rare;
        _userCredits[user][Rarity.Epic] -= epic;
        _userCredits[user][Rarity.Premium] -= premium;
        emit CreditsSpent(user, common, rare, epic, premium);
    }

    function setUserWhitelist(address user, bool phase1, bool phase2, bool phase3) external onlyOwnerOrAdmin {
        _setUserWhitelist(user, phase1, phase2, phase3);
        _setLastUpdate();
    }

    function setUserWhitelistBatch(
        address[] calldata users,
        bool[] calldata phase1,
        bool[] calldata phase2,
        bool[] calldata phase3
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == phase1.length && numUsers == phase2.length && numUsers == phase3.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _setUserWhitelist(users[i], phase1[i], phase2[i], phase3[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    // Specific function to save gas since we expect to call this more.
    function setUserWhitelistBatchPhass3( address[] calldata users, bool[] calldata phase3) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == phase3.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _userWL[users[i]].phase3 = phase3[i];
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function _setUserWhitelist(address user, bool phase1, bool phase2, bool phase3) private {
        _userWL[user] = UserWhiteList ({
            phase1: phase1,
            phase2: phase2,
            phase3: phase3
        });
    }

    function removeUserWhitelist(address user) external onlyOwnerOrAdmin {
        delete _userWL[user];
    }

    function getUserWhitelistStatus(address user) external view returns(UserWhiteList memory userWhitelistData) {
        userWhitelistData = _userWL[user];
    }

    // Discounts
    function setUserDiscounts(address user, Discount[] calldata singleDiscounts, Discount[] calldata multiDiscounts) external onlyOwnerOrAdmin {
        _setUserDiscounts(user, singleDiscounts, multiDiscounts);
        _setLastUpdate();
    }

    function setUserDiscountsBatch(
        address[] calldata users,
        Discount[][] calldata singleDiscounts,
        Discount[][] calldata multiDiscounts
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == singleDiscounts.length && numUsers == multiDiscounts.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _setUserDiscounts(users[i], singleDiscounts[i], multiDiscounts[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function _setUserDiscounts(address user, Discount[] calldata singleDiscounts, Discount[] calldata multiDiscounts) private {
        delete _userDiscountsSingle[user];
        delete _userDiscountsMulti[user];

        _addUserDiscounts(_userDiscountsSingle[user], singleDiscounts);
        _addUserDiscounts(_userDiscountsMulti[user], multiDiscounts);
    }

    function _addUserDiscounts(Discount[] storage localDiscounts, Discount[] calldata newDiscounts) internal {
        uint numDiscounts = newDiscounts.length;
        for(uint i; i<numDiscounts;) {
            localDiscounts.push(newDiscounts[i]);
            unchecked { ++i; }
        }
    }

    function addUserDiscounts(address user, Discount[] calldata singleDiscounts, Discount[] calldata multiDiscounts) external onlyOwnerOrAdmin {
        _addUserDiscounts(_userDiscountsSingle[user], singleDiscounts);
        _addUserDiscounts(_userDiscountsMulti[user], multiDiscounts);
        _setLastUpdate();
    }

    function addUserDiscountsBatch(
        address[] calldata users,
        Discount[][] calldata singleDiscounts,
        Discount[][] calldata multiDiscounts
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == singleDiscounts.length && numUsers == multiDiscounts.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            address user = users[i];
            _addUserDiscounts(_userDiscountsSingle[user], singleDiscounts[i]);
            _addUserDiscounts(_userDiscountsMulti[user], multiDiscounts[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function removeAllUserDiscoutns(address user) external onlyOwnerOrAdmin {
        delete _userDiscountsSingle[user];
        delete _userDiscountsMulti[user];
    }

    function getUserDiscountData(address user) external view returns (UserDiscounts memory userDiscountData) {
        userDiscountData = UserDiscounts ({
            single: _userDiscountsSingle[user],
            multi: _userDiscountsMulti[user]
        });
    }

    function loadDiscounts(address user, uint256[] calldata singleDiscountIndexes, uint256[] calldata multiDiscountIndexes) external view returns (Discount[] memory) {
        uint numSingleDiscounts = singleDiscountIndexes.length;
        uint numMultiDiscounts = multiDiscountIndexes.length;

        Discount[] memory discounts = new Discount[](numSingleDiscounts + numMultiDiscounts);

        if (numSingleDiscounts > 0) {
            for (uint i; i<numSingleDiscounts;) {
                require(singleDiscountIndexes[i] < _userDiscountsSingle[user].length, "Bad single discount index");
                discounts[i] = _userDiscountsSingle[user][singleDiscountIndexes[i]];
                unchecked { ++i; }
            }
        }

        if (numMultiDiscounts > 0) {
            for (uint i; i<numMultiDiscounts;) {
                require(multiDiscountIndexes[i] < _userDiscountsMulti[user].length, "Bad multi discount index");
                // Mind to start from after the last index for single discounts
                discounts[numSingleDiscounts + i] = _userDiscountsMulti[user][multiDiscountIndexes[i]];
                unchecked { ++i; }
            }
        }
        return discounts;
    }

    function spendDiscounts(address user, uint256[] calldata singleDiscountIndexes, uint256[] calldata multiDiscountIndexes) external onlyLandsale {
        _removeDiscountsByIndex(_userDiscountsSingle[user], singleDiscountIndexes);
        _removeDiscountsByIndex(_userDiscountsMulti[user], multiDiscountIndexes);
        if (singleDiscountIndexes.length > 0 || multiDiscountIndexes.length > 0) {
            emit DiscountsSpent(user, singleDiscountIndexes, multiDiscountIndexes);
        }
    }

    function _removeDiscountsByIndex(Discount[] storage array, uint256[] calldata indexes) internal {
        uint numDiscounts = indexes.length;
        if (numDiscounts == 0) {
            return;
        }
        // Since we move the last element to a lower position on deletion
        // We may save gas by deleting higher indexes first, so we go last to first
        // and enforce order using lastIndex variable.
        uint lastIndex = indexes[numDiscounts - 1];
        for (uint i; i<numDiscounts;) {
            uint index = indexes[numDiscounts - i - 1];
            uint arrayLen = array.length;
            require(index <= lastIndex, "Discount indexes must be ordered");
            // This condition should be unreachable, since discounts were already loaded.
            require(index < arrayLen, "Bad array index");
            if (index != arrayLen - 1) {
                array[index] = array[arrayLen - 1];
            }
            array.pop();
            lastIndex = index;
            unchecked { ++i; }
        }
    }

    // All in one
    function getUserData(address user) external view returns (UserDataIntake memory userData) {
        UserWhiteList memory userWhitelist = _userWL[user];

        userData = UserDataIntake ({
            commonCredits: _userCredits[user][Rarity.Common],
            rareCredits: _userCredits[user][Rarity.Rare],
            epicCredits: _userCredits[user][Rarity.Epic],
            premiumCredits: _userCredits[user][Rarity.Premium],
            singleDiscounts: _userDiscountsSingle[user],
            multiDiscounts: _userDiscountsMulti[user],
            whiteListPhase1: userWhitelist.phase1,
            whiteListPhase2: userWhitelist.phase2,
            whiteListPhase3: userWhitelist.phase3
        });
    }

    function setUserData(address user, UserDataIntake calldata intakeData) external onlyOwnerOrAdmin {
        _setUserWhitelist(user, intakeData.whiteListPhase1, intakeData.whiteListPhase2, intakeData.whiteListPhase3);
        _setUserCredits(user, intakeData.commonCredits, intakeData.rareCredits, intakeData.epicCredits, intakeData.premiumCredits);
        _setUserDiscounts(user, intakeData.singleDiscounts, intakeData.multiDiscounts);
        _setLastUpdate();
    }

    function setUserDataBatch(address[] calldata users, UserDataIntake[] calldata intakeData) external onlyOwnerOrAdmin {
        uint256 len = users.length;
        require(len == intakeData.length, "Arrays must have the same length");

        for(uint i; i<len;) {
            _setUserWhitelist(users[i], intakeData[i].whiteListPhase1, intakeData[i].whiteListPhase2, intakeData[i].whiteListPhase3);
            _setUserCredits(users[i], intakeData[i].commonCredits, intakeData[i].rareCredits, intakeData[i].epicCredits, intakeData[i].premiumCredits);
            _setUserDiscounts(users[i], intakeData[i].singleDiscounts, intakeData[i].multiDiscounts);

            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    // Last Update

    function _setLastUpdate() private {
        _lastUpdate = block.timestamp;
    }

    function getLastUpdate() external view returns (uint256) {
        return _lastUpdate;
    }

}

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"commonPrice","type":"uint256"},{"internalType":"uint256","name":"rarePrice","type":"uint256"},{"internalType":"uint256","name":"epicPrice","type":"uint256"},{"internalType":"uint256","name":"creatorFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"EscrowReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"OfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"}],"name":"PlotDelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PlotListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PlotPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PlotPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":false,"internalType":"string","name":"buyer","type":"string"}],"name":"PlotResourceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotIds","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"PlotTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":true,"internalType":"bool","name":"boughtWithCredits","type":"bool"}],"name":"PlotsBought","type":"event"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"offerIndex","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"acceptOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"addReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"internalType":"uint256[]","name":"singleDiscountIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"multiDiscountIndexes","type":"uint256[]"},{"internalType":"address","name":"referrer","type":"address"}],"name":"buyPlots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"internalType":"enum LandSaleCore.Rarity","name":"creditRarity","type":"uint8"}],"name":"buyWithCredits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"offerIndex","type":"uint256"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"delist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimableEscrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCreatorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getCurrentBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDutchDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDutchMinMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"getDutchPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDutchStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getIsListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getListedInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getListedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumPlotsSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getOffers","outputs":[{"components":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"cancelled","type":"bool"}],"internalType":"struct LandSaleMarket.Offer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getOwnedPlotRarities","outputs":[{"components":[{"internalType":"uint32","name":"common","type":"uint32"},{"internalType":"uint32","name":"rare","type":"uint32"},{"internalType":"uint32","name":"epic","type":"uint32"},{"internalType":"uint32","name":"harb","type":"uint32"},{"internalType":"uint32","name":"premium","type":"uint32"}],"internalType":"struct Plots.OwnedPlotRarities","name":"ownedPlotRarities","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getOwnedPlots","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPausedSales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPausedTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getPlotAvailability","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getPlotData","outputs":[{"components":[{"internalType":"uint8","name":"cyber","type":"uint8"},{"internalType":"uint8","name":"steampunk","type":"uint8"},{"internalType":"uint8","name":"wind","type":"uint8"},{"internalType":"uint8","name":"volcano","type":"uint8"},{"internalType":"uint8","name":"fire","type":"uint8"},{"internalType":"uint8","name":"water","type":"uint8"},{"internalType":"uint8","name":"necro","type":"uint8"},{"internalType":"uint8","name":"mecha","type":"uint8"},{"internalType":"uint8","name":"dragon","type":"uint8"},{"internalType":"uint8","name":"meadow","type":"uint8"},{"internalType":"uint8","name":"isShore","type":"uint8"},{"internalType":"uint8","name":"isIsland","type":"uint8"},{"internalType":"uint8","name":"isMountainFoot","type":"uint8"},{"internalType":"enum LandSaleCore.Rarity","name":"rarity","type":"uint8"},{"internalType":"enum LandSaleCore.Entropy","name":"entropy","type":"uint8"}],"internalType":"struct Plots.PlotData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlotDataLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getPlotOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"}],"name":"getPlotOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getPlotResource","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"}],"name":"getPlotResourceBatch","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricesPerRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"internalType":"uint256[]","name":"singleDiscountIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"multiDiscountIndexes","type":"uint256[]"}],"name":"getPurchasePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferralIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferralMinCommonPlots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUserDataAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhiteListPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getXcRMRK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"isReferrer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"list","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"xcRmrkPlotIds","type":"uint256[]"},{"internalType":"uint256[]","name":"singleDiscountIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"multiDiscountIndexes","type":"uint256[]"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256[]","name":"creditsPlotIds","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"commonCredits","type":"uint256"},{"internalType":"uint256","name":"rareCredits","type":"uint256"},{"internalType":"uint256","name":"epicCredits","type":"uint256"},{"internalType":"uint256","name":"premiumCredits","type":"uint256"}],"internalType":"struct LandSaleCore.UserCredits","name":"userCredits","type":"tuple"}],"name":"mixBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"removeReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"returnEscrowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"creatorFee","type":"uint256"}],"name":"setCreatorFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"setDutchConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setPausedSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setPausedTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"components":[{"internalType":"uint8","name":"cyber","type":"uint8"},{"internalType":"uint8","name":"steampunk","type":"uint8"},{"internalType":"uint8","name":"wind","type":"uint8"},{"internalType":"uint8","name":"volcano","type":"uint8"},{"internalType":"uint8","name":"fire","type":"uint8"},{"internalType":"uint8","name":"water","type":"uint8"},{"internalType":"uint8","name":"necro","type":"uint8"},{"internalType":"uint8","name":"mecha","type":"uint8"},{"internalType":"uint8","name":"dragon","type":"uint8"},{"internalType":"uint8","name":"meadow","type":"uint8"},{"internalType":"uint8","name":"isShore","type":"uint8"},{"internalType":"uint8","name":"isIsland","type":"uint8"},{"internalType":"uint8","name":"isMountainFoot","type":"uint8"},{"internalType":"enum LandSaleCore.Rarity","name":"rarity","type":"uint8"},{"internalType":"enum LandSaleCore.Entropy","name":"entropy","type":"uint8"}],"internalType":"struct Plots.PlotData","name":"plotData","type":"tuple"}],"name":"setPlotData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPlotDataLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"components":[{"internalType":"uint8","name":"cyber","type":"uint8"},{"internalType":"uint8","name":"steampunk","type":"uint8"},{"internalType":"uint8","name":"wind","type":"uint8"},{"internalType":"uint8","name":"volcano","type":"uint8"},{"internalType":"uint8","name":"fire","type":"uint8"},{"internalType":"uint8","name":"water","type":"uint8"},{"internalType":"uint8","name":"necro","type":"uint8"},{"internalType":"uint8","name":"mecha","type":"uint8"},{"internalType":"uint8","name":"dragon","type":"uint8"},{"internalType":"uint8","name":"meadow","type":"uint8"},{"internalType":"uint8","name":"isShore","type":"uint8"},{"internalType":"uint8","name":"isIsland","type":"uint8"},{"internalType":"uint8","name":"isMountainFoot","type":"uint8"},{"internalType":"enum LandSaleCore.Rarity","name":"rarity","type":"uint8"},{"internalType":"enum LandSaleCore.Entropy","name":"entropy","type":"uint8"}],"internalType":"struct Plots.PlotData[]","name":"plotsData","type":"tuple[]"}],"name":"setPlotDataMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"string","name":"imgData","type":"string"}],"name":"setPlotResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setReferralIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minCommonPlots","type":"uint256"}],"name":"setReferralMinCommonPlots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUserDataAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"phaseId","type":"uint256"}],"name":"setWhitelistPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setxcRMRK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"internalType":"uint256","name":"commonCredits","type":"uint256"},{"internalType":"uint256","name":"rareCredits","type":"uint256"},{"internalType":"uint256","name":"epicCredits","type":"uint256"},{"internalType":"uint256","name":"premiumCredits","type":"uint256"}],"name":"smartBuyWithCredits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052620186a0600c553480156200001857600080fd5b5060405162005eb538038062005eb58339810160408190526200003b9162000191565b600080546001600160a01b031916331790558383836402540be4008311620000aa5760405162461bcd60e51b815260206004820152601f60248201527f436f6d6d6f6e207072696365206d757374206265203e2031207863524d524b0060448201526064015b60405180910390fd5b6402540be4008211620001005760405162461bcd60e51b815260206004820152601d60248201527f52617265207072696365206d757374206265203e2031207863524d524b0000006044820152606401620000a1565b6402540be4008111620001565760405162461bcd60e51b815260206004820152601d60248201527f45706963207072696365206d757374206265203e2031207863524d524b0000006044820152606401620000a1565b60809290925260a05260c052600d805460ff19166001179055600a600e5560135550506012805461010161ffff1990911617905550620001c8565b60008060008060808587031215620001a857600080fd5b505082516020840151604085015160609095015191969095509092509050565b60805160a05160c051615ca86200020d6000396000818161043a015261452701526000818161041401526144e10152600081816103f1015261449b0152615ca86000f3fe608060405234801561001057600080fd5b50600436106103e65760003560e01c8063877850ef1161020a578063c1744fd811610125578063dfa49e6f116100b8578063f2b0a55d11610087578063f2b0a55d14610984578063f2fde38b146109a4578063f38ced47146109b7578063f48dab70146109c2578063fefa9bb1146109d557600080fd5b8063dfa49e6f1461092b578063e5e06d451461094b578063e63c88dc1461095e578063f0b3300f1461097157600080fd5b8063d64d6968116100f4578063d64d6968146108c6578063d6febde8146108f2578063da4e364f14610905578063dd9e9dc81461091857600080fd5b8063c1744fd814610839578063d21c694814610898578063d3a8c4ec146108a0578063d45557cc146108b357600080fd5b8063a1f45dd61161019d578063b7760c8f1161016c578063b7760c8f146107e4578063bc138fe0146107f7578063be08002514610813578063c0ea1f111461082657600080fd5b8063a1f45dd614610782578063a718d525146107ab578063b3de019c146107be578063b6733440146107d157600080fd5b806393c533f2116101d957806393c533f214610729578063964bc33f1461073c578063992274b11461074f578063a11b6fbb1461076257600080fd5b8063877850ef146106d05780638927e627146106e3578063893d20e8146107035780638a3866aa1461071457600080fd5b80633db7a49f116103055780635a5b0f56116102985780637048027511610267578063704802751461067357806379bd6cf9146106865780637a00e2e314610697578063864ca485146106aa5780638708c55e146106bd57600080fd5b80635a5b0f56146106355780635c09d6281461063d5780635f53e07714610650578063635335231461066357600080fd5b806347831ac0116102d457806347831ac0146105f657806350fd7367146105fe578063549458d414610611578063565a2e2c1461062457600080fd5b80633db7a49f146105b05780633e104219146105bb57806342434134146105db578063450d996a146105e357600080fd5b80631c31f7101161037d57806326394dbd1161034c57806326394dbd146105585780632a46841f146105825780632c92f9bc1461058a5780632d3456701461059d57600080fd5b80631c31f710146105145780631da66c27146105275780631e4a81161461053257806324d7806c1461054557600080fd5b80630dd16fd5116103b95780630dd16fd51461049c5780630e15166e146104af578063142a6fca146104c2578063194a9716146104e257600080fd5b8063012a5331146103eb57806301d3f03b1461046d578063024463c11461047f57806305b7cdd314610487575b600080fd5b604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526060015b60405180910390f35b600a545b604051908152602001610464565b600c54610471565b61049a610495366004614ab9565b6109e8565b005b61049a6104aa366004614adb565b610ddb565b61049a6104bd366004614b02565b610e19565b6104d56104d0366004614adb565b610e65565b6040516104649190614b6c565b6105046104f0366004614adb565b600090815260146020526040902054151590565b6040519015158152602001610464565b61049a610522366004614b9b565b610f07565b60125460ff16610504565b61049a610540366004614c0e565b610f62565b610504610553366004614b9b565b6114b8565b60065461010090046001600160a01b03165b6040516001600160a01b039091168152602001610464565b61049a6114d7565b61049a610598366004614c64565b6115dc565b61049a6105ab366004614b9b565b61166c565b60065460ff16610504565b6105ce6105c9366004614b9b565b6116b0565b6040516104649190614c90565b600e54610471565b61049a6105f1366004614cd4565b61171b565b600954610471565b61049a61060c366004614ab9565b611799565b61049a61061f366004614b9b565b61192b565b6007546001600160a01b031661056a565b601354610471565b61049a61064b366004614b9b565b61198c565b61049a61065e366004614b02565b6119e7565b601254610100900460ff16610504565b61049a610681366004614b9b565b611a3a565b6008546001600160a01b031661056a565b61049a6106a5366004614b9b565b611ad7565b61049a6106b8366004614adb565b611b2a565b61049a6106cb366004614b02565b611b68565b61049a6106de366004614adb565b611bde565b6106f66106f1366004614e7b565b611c5c565b6040516104649190614eb7565b6000546001600160a01b031661056a565b33600090815260166020526040902054610471565b610471610737366004614f19565b611da4565b61049a61074a366004614adb565b611dbd565b61049a61075d366004614fad565b611e32565b610775610770366004614e7b565b611eae565b604051610464919061500e565b61056a610790366004614adb565b6000908152600360205260409020546001600160a01b031690565b61049a6107b936600461504f565b611f7c565b61049a6107cc366004614ab9565b612011565b61049a6107df3660046150ed565b61211a565b61049a6107f2366004615187565b612261565b601054600f545b60408051928352602083019190915201610464565b61049a610821366004614b02565b61245c565b610504610834366004614adb565b6124a8565b61084c610847366004614b9b565b612536565b6040516104649190815163ffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b600b54610471565b6104716108ae366004614adb565b612612565b61049a6108c1366004614ab9565b612623565b6105046108d4366004614b9b565b6001600160a01b031660009081526011602052604090205460011490565b61049a610900366004614ab9565b612849565b610471610913366004614adb565b612b40565b61049a6109263660046151cb565b612c61565b61093e610939366004614adb565b612cf4565b60405161046491906152b4565b6107fe610959366004614adb565b612d96565b61049a61096c366004614c64565b612df1565b61049a61097f366004615323565b613132565b610997610992366004614adb565b6131de565b6040516104649190615397565b61049a6109b2366004614b9b565b6133b8565b600d5460ff16610504565b6104716109d0366004614adb565b61345a565b61049a6109e3366004614b9b565b613486565b60125460ff1615610a145760405162461bcd60e51b8152600401610a0b906154ae565b60405180910390fd5b60008111610a645760405162461bcd60e51b815260206004820152601b60248201527f5072696365206d75737420626520686967686572207468616e203000000000006044820152606401610a0b565b6000828152600360205260409020546001600160a01b0316338103610ac05760405162461bcd60e51b81526020600482015260126024820152712ab9b2b91034b9903630b7321037bbb732b960711b6044820152606401610a0b565b6001600160a01b038116610b0a5760405162461bcd60e51b8152602060048201526011602482015270506c6f74206e6f742073656c6c61626c6560781b6044820152606401610a0b565b6004600084815260026020526040902054600160681b900460ff166005811115610b3657610b3661535d565b03610b835760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206f66666572206f6e20486172626572676572206c616e6400006044820152606401610a0b565b6000838152601460205260409020548015610be757808310610be75760405162461bcd60e51b815260206004820152601760248201527f4f66666572206f766572206c69737465642070726963650000000000000000006044820152606401610a0b565b600654604051636eb1769f60e11b81523360048201523060248201526101009091046001600160a01b0316908490829063dd62ed3e90604401602060405180830381865afa158015610c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6191906154d8565b1015610ca65760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f75676820616c6c6f77616e636560601b6044820152606401610a0b565b60408051608081018252338082526020808301888152428486019081526000606086018181528c825260158552878220805460018082018355918452959092208751600496870290910180546001600160a01b0319166001600160a01b039283161781559451928501929092559151600284015590516003909201805460ff19169215159290921790915593516323b872dd60e01b815292938516926323b872dd92610d5892909130918b91016154f1565b6020604051808303816000875af1158015610d77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9b9190615520565b50604051858152339087907fbdf1e76c2ba2a5c85b93bf78678a4a3b06d63b18422612dac8d7d5249ed467149060200160405180910390a3505050505050565b6000546001600160a01b0316331480610df85750610df8336114b8565b610e145760405162461bcd60e51b8152600401610a0b9061553d565b601355565b6000546001600160a01b0316331480610e365750610e36336114b8565b610e525760405162461bcd60e51b8152600401610a0b9061553d565b6012805460ff1916911515919091179055565b6000818152600460205260409020805460609190610e8290615574565b80601f0160208091040260200160405190810160405280929190818152602001828054610eae90615574565b8015610efb5780601f10610ed057610100808354040283529160200191610efb565b820191906000526020600020905b815481529060010190602001808311610ede57829003601f168201915b50505050509050919050565b6000546001600160a01b0316331480610f245750610f24336114b8565b610f405760405162461bcd60e51b8152600401610a0b9061553d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600854600954604051636844038560e11b815233600482015260248101919091526001600160a01b039091169063d088070a9060440160006040518083038186803b158015610fb057600080fd5b505afa158015610fc4573d6000803e3d6000fd5b50849250505080610fe75760405162461bcd60e51b8152600401610a0b906155a8565b600854604051637bfb039f60e11b81526000916001600160a01b03169063f7f6073e9061101a90339087906004016155d1565b602060405180830381865afa158015611037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105b91906154d8565b9050818110156110ad5760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f756768206372656469747320696e206163636f756e740000006044820152606401610a0b565b60008060008060006110f18a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061353292505050565b9450945094509450945081816111079190615604565b60009250905060018860058111156111215761112161535d565b03611218578685146111695760405162461bcd60e51b81526020600482015260116024820152704f6e6c7920636f6d6d6f6e206c616e647360781b6044820152606401610a0b565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed906111a29033908b906000908190819060040161561c565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b505050506112138a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509250600191506137229050565b6114ac565b600288600581111561122c5761122c61535d565b036112c2578661123c8587615604565b146112895760405162461bcd60e51b815260206004820152601960248201527f4f6e6c7920636f6d6d6f6e206f722072617265206c616e6473000000000000006044820152606401610a0b565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed906111a29033906000908c908290819060040161561c565b60038860058111156112d6576112d661535d565b036113775786836112e78688615604565b6112f19190615604565b1461133e5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636f6d6d6f6e2c2072617265206f722065706963206c616e6473006044820152606401610a0b565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed906111a290339060009081908d90829060040161561c565b600588600581111561138b5761138b61535d565b1480156113b657508681846113a08789615604565b6113aa9190615604565b6113b49190615604565b145b6114025760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564206372656469742072617269747900000000000000006044820152606401610a0b565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed9061143b903390600090819081908e9060040161561c565b600060405180830381600087803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b505050506114ac8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509250600191506137229050565b50505050505050505050565b6001600160a01b03166000908152600160208190526040909120541490565b336000908152601660205260409020548061152a5760405162461bcd60e51b815260206004820152601360248201527227379032b9b1b937bb903a37903932ba3ab93760691b6044820152606401610a0b565b60065460405163a9059cbb60e01b8152336004820152602481018390526101009091046001600160a01b03169063a9059cbb906044016020604051808303816000875af115801561157f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a39190615520565b5060405181815233907fbf1a0ef092ef679427b427c6a95d51133522541e667b737b795a77f2b61c240d9060200160405180910390a250565b6000546001600160a01b03163314806115f957506115f9336114b8565b6116155760405162461bcd60e51b8152600401610a0b9061553d565b620f4240811061165e5760405162461bcd60e51b81526020600482015260146024820152732b30b63ab29037bb32b910383932b1b4b9b4b7b760611b6044820152606401610a0b565b600a92909255600b55600c55565b6000546001600160a01b031633146116965760405162461bcd60e51b8152600401610a0b9061564a565b6001600160a01b0316600090815260016020526040812055565b6001600160a01b038116600090815260056020908152604091829020805483518184028101840190945280845260609392830182828015610efb57602002820191906000526020600020905b8154815260200190600101908083116116fc5750505050509050919050565b600854600954604051636844038560e11b815233600482015260248101919091526001600160a01b039091169063d088070a9060440160006040518083038186803b15801561176957600080fd5b505afa15801561177d573d6000803e3d6000fd5b5050505061179087878787878787613847565b50505050505050565b60008281526003602052604090205482906001600160a01b031633146117d15760405162461bcd60e51b8152600401610a0b90615676565b60125460ff16156117f45760405162461bcd60e51b8152600401610a0b906154ae565b600082116118445760405162461bcd60e51b815260206004820152601c60248201527f5072696365206d7573742062652067726561746572207468616e2030000000006044820152606401610a0b565b6004600084815260026020526040902054600160681b900460ff1660058111156118705761187061535d565b036118bd5760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206c69737420486172626572676572206c616e640000000000006044820152606401610a0b565b60408051808201825283815242602080830191825260008781526014909152839020915182555160019091015551339084907f7f5dd6779248014167a5e507bf4a6edb7c0985fd0eb2fe89412fe3783a4b13309061191e9086815260200190565b60405180910390a3505050565b6000546001600160a01b03163314806119485750611948336114b8565b6119645760405162461bcd60e51b8152600401610a0b9061553d565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b03163314806119a957506119a9336114b8565b6119c55760405162461bcd60e51b8152600401610a0b9061553d565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480611a045750611a04336114b8565b611a205760405162461bcd60e51b8152600401610a0b9061553d565b601280549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314611a645760405162461bcd60e51b8152600401610a0b9061564a565b6001600160a01b038116611aba5760405162461bcd60e51b815260206004820181905260248201527f41646d696e2063616e6e6f7420626520746865207a65726f20616464726573736044820152606401610a0b565b6001600160a01b0316600090815260016020819052604090912055565b6000546001600160a01b0316331480611af45750611af4336114b8565b611b105760405162461bcd60e51b8152600401610a0b9061553d565b6001600160a01b0316600090815260116020526040812055565b6000546001600160a01b0316331480611b475750611b47336114b8565b611b635760405162461bcd60e51b8152600401610a0b9061553d565b600e55565b6000546001600160a01b03163314611b925760405162461bcd60e51b8152600401610a0b9061564a565b6000546001600160a01b0316331480611baf5750611baf336114b8565b611bcb5760405162461bcd60e51b8152600401610a0b9061553d565b6006805460ff1916911515919091179055565b6000546001600160a01b0316331480611bfb5750611bfb336114b8565b611c175760405162461bcd60e51b8152600401610a0b9061553d565b6005811115611c575760405162461bcd60e51b815260206004820152600c60248201526b109859081c1a185cd9481a5960a21b6044820152606401610a0b565b600955565b80516060906000816001600160401b03811115611c7b57611c7b614d7e565b604051908082528060200260200182016040528015611cae57816020015b6060815260200190600190039081611c995790505b50905060005b82811015611d9c576000858281518110611cd057611cd06156a6565b60200260200101519050600460008281526020019081526020016000208054611cf890615574565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2490615574565b8015611d715780601f10611d4657610100808354040283529160200191611d71565b820191906000526020600020905b815481529060010190602001808311611d5457829003601f168201915b5050505050838381518110611d8857611d886156a6565b602090810291909101015250600101611cb4565b509392505050565b6000611db38686868686613b60565b9695505050505050565b60008181526003602052604090205481906001600160a01b03163314611df55760405162461bcd60e51b8152600401610a0b90615676565b611e0182600019613cbd565b604051339083907f731e216f3c5263def1695d416b13f97a35d25331ad11ccb640d803ebd105f4e890600090a35050565b600854600954604051636844038560e11b815233600482015260248101919091526001600160a01b039091169063d088070a9060440160006040518083038186803b158015611e8057600080fd5b505afa158015611e94573d6000803e3d6000fd5b50505050611ea6868686868686613e35565b505050505050565b80516060906000816001600160401b03811115611ecd57611ecd614d7e565b604051908082528060200260200182016040528015611ef6578160200160208202803683370190505b50905060005b82811015611d9c576000858281518110611f1857611f186156a6565b602002602001015190506003600082815260200190815260200160002060009054906101000a90046001600160a01b0316838381518110611f5b57611f5b6156a6565b6001600160a01b039092166020928302919091019091015250600101611efc565b60008281526003602052604090205482906001600160a01b03163314611fb45760405162461bcd60e51b8152600401610a0b90615676565b60008381526004602090815260409091208351611fd3928501906149c3565b50827f98a3c3986b7677c879cb2d25ed860fa739755d655ee07fd9582d82a343200874836040516120049190614b6c565b60405180910390a2505050565b60008281526003602052604090205482906001600160a01b031633146120495760405162461bcd60e51b8152600401610a0b90615676565b600082116120995760405162461bcd60e51b815260206004820152601c60248201527f5072696365206d7573742062652067726561746572207468616e2030000000006044820152606401610a0b565b600083815260146020526040902054806120c55760405162461bcd60e51b8152600401610a0b906156bc565b6000848152601460209081526040918290208590558151838152908101859052339186917fe4e96eded0c1652afb311b4f5a4d768a48f1544ae888996bedc732c85778061e910160405180910390a350505050565b6000546001600160a01b03163314806121375750612137336114b8565b6121535760405162461bcd60e51b8152600401610a0b9061553d565b60065460ff16156121a65760405162461bcd60e51b815260206004820152601b60248201527f506c6f74206461746120736574746572206973206c6f636b65642e00000000006044820152606401610a0b565b828181146121f65760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e6774686044820152606401610a0b565b60005b81811015611ea6576000868683818110612215576122156156a6565b905060200201359050848483818110612230576122306156a6565b90506101e00201600260008381526020019081526020016000208181612256919061576b565b5050506001016121f9565b60008281526003602052604090205482906001600160a01b031633146122995760405162461bcd60e51b8152600401610a0b90615676565b336001600160a01b038316036122f15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610a0b565b601254610100900460ff16156123405760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8185c99481c185d5cd95960621b6044820152606401610a0b565b6000838152601460205260409020541561239c5760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74207472616e73666572206c697374656420706c6f7400000000006044820152606401610a0b565b6004600084815260026020526040902054600160681b900460ff1660058111156123c8576123c861535d565b036124155760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74207472616e7366657220486172626572676572206c616e6400006044820152606401610a0b565b61241f8284614074565b6040516001600160a01b03831690339085907f370ed8b5aeb5adcdf0f4852ad764fd28ca4cc2a9d744446d05da996594ea6aa490600090a4505050565b6000546001600160a01b03163314806124795750612479336114b8565b6124955760405162461bcd60e51b8152600401610a0b9061553d565b600d805460ff1916911515919091179055565b600080600083815260026020526040902054600160681b900460ff1660058111156124d5576124d561535d565b036125195760405162461bcd60e51b8152602060048201526014602482015273141b1bdd081b9bdd081a5b9a5d1a585b1a5e995960621b6044820152606401610a0b565b506000908152600360205260409020546001600160a01b03161590565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b0382166000908152600560209081526040808320805482518185028101850190935280835284938493849384936125d2938301828280156125c857602002820191906000526020600020905b8154815260200190600101908083116125b4575b5050505050613532565b6040805160a08101825263ffffffff9687168152948616602086015292851692840192909252831660608301529091166080820152979650505050505050565b600061261d82614299565b92915050565b600082815260156020526040902054811061267b5760405162461bcd60e51b81526020600482015260186024820152774f6666657220696e646578206f7574206f662072616e676560401b6044820152606401610a0b565b600082815260156020526040812080548390811061269b5761269b6156a6565b600091825260209182902060408051608081018252600490930290910180546001600160a01b03168084526001820154948401949094526002810154918301919091526003015460ff16151560608201529150331461273c5760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f74206f66666572206f776e65720000000000000000006044820152606401610a0b565b8060600151156127885760405162461bcd60e51b815260206004820152601760248201527613d999995c88185b1c9958591e4818d85b98d95b1b1959604a1b6044820152606401610a0b565b60208082015182516001600160a01b031660009081526016909252604082208054919290916127b8908490615604565b90915550506000838152601560205260409020805460019190849081106127e1576127e16156a6565b906000526020600020906004020160030160006101000a81548160ff021916908315150217905550336001600160a01b0316837fe2dc0bfd2fc658db980184c3f7c091c2f886874e896043b562d5099c8d95b1dd836020015160405161191e91815260200190565b60125460ff161561286c5760405162461bcd60e51b8152600401610a0b906154ae565b60008281526014602090815260409182902082518084019093528054808452600190910154918301919091526128b45760405162461bcd60e51b8152600401610a0b906156bc565b6006548151604051636eb1769f60e11b81523360048201523060248201526101009092046001600160a01b031691829063dd62ed3e90604401602060405180830381865afa15801561290a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292e91906154d8565b10156129735760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f75676820616c6c6f77616e636560601b6044820152606401610a0b565b815183146129ba5760405162461bcd60e51b81526020600482015260146024820152730a0e4d2c6ca40c8decae640dcdee840dac2e8c6d60631b6044820152606401610a0b565b6129c684600019613cbd565b6000848152600360205260409020546001600160a01b03166129e83386614074565b6000806129f88560000151614315565b6040516323b872dd60e01b815291935091506001600160a01b038516906323b872dd90612a2d903390879087906004016154f1565b6020604051808303816000875af1158015612a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a709190615520565b506007546040516323b872dd60e01b81526001600160a01b03808716926323b872dd92612aa5923392169086906004016154f1565b6020604051808303816000875af1158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae89190615520565b50336001600160a01b0316836001600160a01b0316887f78e40a3f168941f73efe6fbf315c11eca5de75a6575fd334ffa4f1801a05322389604051612b2f91815260200190565b60405180910390a450505050505050565b600081815260156020908152604080832080548251818502810185019093528083528493849084015b82821015612bcb576000848152602090819020604080516080810182526004860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003015460ff16151560608301529083529092019101612b69565b5050505090506000815190506000805b82811015612c5857838181518110612bf557612bf56156a6565b602002602001015160600151158015612c2a575081848281518110612c1c57612c1c6156a6565b602002602001015160200151115b15612c5057838181518110612c4157612c416156a6565b60200260200101516020015191505b600101612bdb565b50949350505050565b600854600954604051636844038560e11b815233600482015260248101919091526001600160a01b039091169063d088070a9060440160006040518083038186803b158015612caf57600080fd5b505afa158015612cc3573d6000803e3d6000fd5b50505050612ce583838360000135846020013585604001358660600135613e35565b6114ac8a8a8a8a8a8a8a613847565b606060156000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015612d8b576000848152602090819020604080516080810182526004860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003015460ff16151560608301529083529092019101612d29565b505050509050919050565b600081815260146020908152604080832081518083019092528054808352600190910154928201929092528291612ddf5760405162461bcd60e51b8152600401610a0b906156bc565b80516020909101519094909350915050565b60008381526003602052604090205483906001600160a01b03163314612e295760405162461bcd60e51b8152600401610a0b90615676565b60125460ff1615612e4c5760405162461bcd60e51b8152600401610a0b906154ae565b6000848152601560205260409020548310612ea45760405162461bcd60e51b81526020600482015260186024820152774f6666657220696e646578206f7574206f662072616e676560401b6044820152606401610a0b565b6000848152601560205260408120805485908110612ec457612ec46156a6565b600091825260209182902060408051608081018252600490930290910180546001600160a01b0316835260018101549383019390935260028301549082015260039091015460ff161580156060830152909150612f5d5760405162461bcd60e51b815260206004820152601760248201527613d999995c88185b1c9958591e4818d85b98d95b1b1959604a1b6044820152606401610a0b565b82816020015114612fa75760405162461bcd60e51b81526020600482015260146024820152730a0e4d2c6ca40c8decae640dcdee840dac2e8c6d60631b6044820152606401610a0b565b612fb18585613cbd565b8051612fbd9086614074565b6000600660019054906101000a90046001600160a01b03169050600080612fe78460200151614315565b60405163a9059cbb60e01b81523360048201526024810183905291935091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d9190615520565b5060075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529084169063a9059cbb906044016020604051808303816000875af11580156130b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d59190615520565b5083600001516001600160a01b0316336001600160a01b0316897f78e40a3f168941f73efe6fbf315c11eca5de75a6575fd334ffa4f1801a0532238960405161312091815260200190565b60405180910390a45050505050505050565b6000546001600160a01b031633148061314f575061314f336114b8565b61316b5760405162461bcd60e51b8152600401610a0b9061553d565b60065460ff16156131be5760405162461bcd60e51b815260206004820152601b60248201527f506c6f74206461746120736574746572206973206c6f636b65642e00000000006044820152606401610a0b565b600082815260026020526040902081906131d8828261576b565b50505050565b61325c604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081018290526101808101829052906101a082019081526020016000905290565b60008281526002602090815260409182902082516101e081018452815460ff80821683526101008083048216958401959095526201000082048116958301959095526301000000810485166060830152640100000000810485166080830152650100000000008104851660a083015266010000000000008104851660c08301526701000000000000008104851660e0830152680100000000000000008104851693820193909352690100000000000000000083048416610120820152600160501b83048416610140820152600160581b83048416610160820152600160601b830484166101808201529290916101a0840191600160681b9091041660058111156133685761336861535d565b60058111156133795761337961535d565b81528154602090910190600160701b900460ff16600681111561339e5761339e61535d565b60068111156133af576133af61535d565b90525092915050565b6000546001600160a01b031633146133e25760405162461bcd60e51b8152600401610a0b9061564a565b6001600160a01b0381166134385760405162461bcd60e51b815260206004820181905260248201527f4f776e65722063616e6e6f7420626520746865207a65726f20616464726573736044820152606401610a0b565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152601460205260408120548061261d5760405162461bcd60e51b8152600401610a0b906156bc565b6000546001600160a01b03163314806134a357506134a3336114b8565b6134bf5760405162461bcd60e51b8152600401610a0b9061553d565b6001600160a01b0381166135155760405162461bcd60e51b815260206004820181905260248201527f52656665727265722063616e6e6f7420626520746865203020616464726573736044820152606401610a0b565b6001600160a01b0316600090815260116020526040902060019055565b60008060008060008060008060008060008b51905060005b8181101561370f5760008d8281518110613566576135666156a6565b60200260200101519050600160058111156135835761358361535d565b600082815260026020526040902054600160681b900460ff1660058111156135ad576135ad61535d565b036135c4576135bd600189615604565b9750613706565b6002600082815260026020526040902054600160681b900460ff1660058111156135f0576135f061535d565b0361360757613600600188615604565b9650613706565b6003600082815260026020526040902054600160681b900460ff1660058111156136335761363361535d565b0361364a57613643600187615604565b9550613706565b6004600082815260026020526040902054600160681b900460ff1660058111156136765761367661535d565b0361368d57613686600186615604565b9450613706565b6005600082815260026020526040902054600160681b900460ff1660058111156136b9576136b961535d565b146136f85760405162461bcd60e51b815260206004820152600f60248201526e426164206c616e642072617269747960881b6044820152606401610a0b565b613703600185615604565b93505b5060010161354a565b50949b939a509198509650945092505050565b825160005b818110156137b5576000858281518110613743576137436156a6565b60200260200101519050613756816124a8565b6137a25760405162461bcd60e51b815260206004820152601f60248201527f524d524b204c616e6473616c653a20506c6f7420756e617661696c61626c65006044820152606401610a0b565b6137ac3382614074565b50600101613727565b5081156137da578351600f60008282546137cf9190615604565b909155506137f39050565b8351601060008282546137ed9190615604565b90915550505b811515836001600160a01b0316336001600160a01b03167f8ab30b0cba3d3325d957c283bcd2f5ac70efe38245303058259d4c9dbb7d4321876040516138399190614c90565b60405180910390a450505050565b856138645760405162461bcd60e51b8152600401610a0b906155a8565b60006138a88888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925089915088905087613b60565b6008546040516329523dbb60e11b81529192506001600160a01b0316906352a47b76906138e19033908a908a908a908a90600401615a0f565b600060405180830381600087803b1580156138fb57600080fd5b505af115801561390f573d6000803e3d6000fd5b50505050600061391e8361434f565b15613a425760008061392f84614463565b6006546040516323b872dd60e01b815292945090925061010090046001600160a01b0316906323b872dd9061396c903390899086906004016154f1565b6020604051808303816000875af115801561398b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139af9190615520565b92508215613a3b576006546007546040516323b872dd60e01b81526101009092046001600160a01b03908116926323b872dd926139f592339291169087906004016154f1565b6020604051808303816000875af1158015613a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a389190615520565b92505b5050613aca565b6006546007546040516323b872dd60e01b8152600095506101009092046001600160a01b03908116926323b872dd92613a8492339291169087906004016154f1565b6020604051808303816000875af1158015613aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac79190615520565b90505b80613b175760405162461bcd60e51b815260206004820152601e60248201527f4c616e6473616c653a205472616e7366657246726f6d206661696c75726500006044820152606401610a0b565b613b55898980806020026020016040519081016040528093929190818152602001838360200280828437600092018290525088935091506137229050565b505050505050505050565b8451600090841580613b725750806001145b613bbe5760405162461bcd60e51b815260206004820181905260248201527f5573652073696e676c6520646973636f756e74732077697468203120706c6f746044820152606401610a0b565b6008546040516315b6e8ab60e01b815260009182916001600160a01b03909116906315b6e8ab90613bfb9033908c908c908c908c90600401615a0f565b600060405180830381865afa158015613c18573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c409190810190615a6a565b905060005b83811015613c9a576000613c718b8381518110613c6457613c646156a6565b60200260200101516131de565b90506000613c7f8285614477565b9050613c8b8186615604565b94508260010192505050613c45565b50600954600503613cb157613cae82614299565b91505b50979650505050505050565b60008281526014602090815260408083208381556001018390556015825280832080548251818502810185019093528083529192909190849084015b82821015613d5b576000848152602090819020604080516080810182526004860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003015460ff16151560608301529083529092019101613cf9565b5050825192935060009150505b81811015613e1d57828181518110613d8257613d826156a6565b602002602001015160600151158015613d9b5750838114155b15613e1557828181518110613db257613db26156a6565b60200260200101516020015160166000858481518110613dd457613dd46156a6565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000206000828254613e0f9190615604565b90915550505b600101613d68565b5060008481526015602052604081206131d891614a47565b84613e525760405162461bcd60e51b8152600401610a0b906155a8565b6000806000806000613e968b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061353292505050565b945094509450945094508181613eac9190615604565b90506000915088851115613ee757613ec48986615c04565b613ece9085615604565b9350613eda8986615c04565b613ee49086615c04565b94505b87841115613f1c57613ef98885615c04565b613f039084615604565b9250613f0f8885615c04565b613f199085615c04565b93505b86831115613f5157613f2e8784615c04565b613f389082615604565b9050613f448784615c04565b613f4e9084615c04565b92505b848910158015613f615750838810155b8015613f6d5750828710155b8015613f795750808610155b613fbe5760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da0818dc99591a5d1cc81cd95d60521b6044820152606401610a0b565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed90613ff6903390899089908990889060040161561c565b600060405180830381600087803b15801561401057600080fd5b505af1158015614024573d6000803e3d6000fd5b505050506140678b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509250600191506137229050565b5050505050505050505050565b600081815260036020908152604080832080546001600160a01b038781166001600160a01b03198316811790935591855260058452918420805460018101825590855292909320909101839055168015614294576001600160a01b03811660009081526005602090815260408083208054825181850281018501909352808352919290919083018282801561412857602002820191906000526020600020905b815481526020019060010190808311614114575b50508351939450600019925060009150505b828110156141725785848281518110614155576141556156a6565b60200260200101510361416a57809150614172565b60010161413a565b5080196141c15760405162461bcd60e51b815260206004820152601b60248201527f506c6f74206e6f7420666f756e6420696e206f6c64206f776e657200000000006044820152606401610a0b565b6141cc600183615c04565b8114614253576001600160a01b03841660009081526005602052604090206141f5600184615c04565b81548110614205576142056156a6565b906000526020600020015460056000866001600160a01b03166001600160a01b031681526020019081526020016000208281548110614246576142466156a6565b6000918252602090912001555b6001600160a01b038416600090815260056020526040902080548061427a5761427a615c1b565b600190038181906000526020600020016000905590555050505b505050565b6000806142af6142a7614942565b600b54614965565b600b549091506000906127106142c58483615c04565b6142cf9190615c31565b6142d99190615c50565b6142e590612710615c04565b905060006142f9620f4240600c548461497d565b90506000620f424061430b8784615c31565b611db39190615c50565b6000806000620f42406013548561432c9190615c31565b6143369190615c50565b905060006143448286615c04565b959194509092505050565b60006001600160a01b038216158061436f57506001600160a01b03821633145b8061437d5750600d5460ff16155b1561438a57506000919050565b6001600160a01b0382166000908152601160205260409020546001036143b257506001919050565b6001600160a01b038216600090815260056020908152604080832080548251818502810185019093528083528493849361442193909290918301828280156125c857602002820191906000526020600020908154815260200190600101908083116125b4575050505050613532565b5050925092509250600e548160056144399190615c31565b614444846003615c31565b61444e9086615604565b6144589190615604565b101595945050505050565b60008080620f424061432c61c35086615c31565b600080806001856101a0015160058111156144945761449461535d565b036144c1577f00000000000000000000000000000000000000000000000000000000000000009150614587565b6002856101a0015160058111156144da576144da61535d565b03614507577f00000000000000000000000000000000000000000000000000000000000000009150614587565b6003856101a0015160058111156145205761452061535d565b0361454d577f00000000000000000000000000000000000000000000000000000000000000009150614587565b60405162461bcd60e51b815260206004820152600f60248201526e426164206c616e642072617269747960881b6044820152606401610a0b565b8351600081900361459d5782935050505061261d565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c08101829052905b8281101561490257868181518110614631576146316156a6565b60200260200101519150816101c001511561466257815161465b906001600160801b031685615604565b93506148fa565b6028886000015160ff1611801561467a575081602001515b1561469457815161465b906001600160801b031685615604565b6028886020015160ff161180156146ac575081604001515b156146c657815161465b906001600160801b031685615604565b6028886040015160ff161180156146de575081606001515b156146f857815161465b906001600160801b031685615604565b6028886060015160ff16118015614710575081608001515b1561472a57815161465b906001600160801b031685615604565b6028886080015160ff1611801561474257508160a001515b1561475c57815161465b906001600160801b031685615604565b60288860a0015160ff1611801561477457508160c001515b1561478e57815161465b906001600160801b031685615604565b60288860c0015160ff161180156147a657508160e001515b156147c057815161465b906001600160801b031685615604565b60288860e0015160ff161180156147d957508161010001515b156147f357815161465b906001600160801b031685615604565b602888610100015160ff1611801561480d57508161012001515b1561482757815161465b906001600160801b031685615604565b602888610120015160ff1611801561484157508161014001515b1561485b57815161465b906001600160801b031685615604565b87610160015160ff16600114801561487557508161018001515b1561488f57815161465b906001600160801b031685615604565b87610140015160ff1660011480156148a957508161016001515b156148c357815161465b906001600160801b031685615604565b87610180015160ff1660011480156148dd5750816101a001515b156148fa5781516148f7906001600160801b031685615604565b93505b600101614617565b506207a120831115614915576207a12092505b620f42406149238482615c04565b61492d9086615c31565b6149379190615c50565b979650505050505050565b600042600a54106149535750600090565b600a546149609042615c04565b905090565b60008183101561497657508161261d565b508061261d565b60008061271061498d8585615c31565b8661499a86612710615c04565b6149a49190615c31565b6149ae9190615604565b6149b89190615c50565b9150505b9392505050565b8280546149cf90615574565b90600052602060002090601f0160209004810192826149f15760008555614a37565b82601f10614a0a57805160ff1916838001178555614a37565b82800160010185558215614a37579182015b82811115614a37578251825591602001919060010190614a1c565b50614a43929150614a6b565b5090565b5080546000825560040290600052602060002090810190614a689190614a80565b50565b5b80821115614a435760008155600101614a6c565b5b80821115614a435780546001600160a01b0319168155600060018201819055600282015560038101805460ff19169055600401614a81565b60008060408385031215614acc57600080fd5b50508035926020909101359150565b600060208284031215614aed57600080fd5b5035919050565b8015158114614a6857600080fd5b600060208284031215614b1457600080fd5b81356149bc81614af4565b6000815180845260005b81811015614b4557602081850181015186830182015201614b29565b81811115614b57576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006149bc6020830184614b1f565b80356001600160a01b0381168114614b9657600080fd5b919050565b600060208284031215614bad57600080fd5b6149bc82614b7f565b60008083601f840112614bc857600080fd5b5081356001600160401b03811115614bdf57600080fd5b6020830191508360208260051b8501011115614bfa57600080fd5b9250929050565b60068110614a6857600080fd5b600080600060408486031215614c2357600080fd5b83356001600160401b03811115614c3957600080fd5b614c4586828701614bb6565b9094509250506020840135614c5981614c01565b809150509250925092565b600080600060608486031215614c7957600080fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b81811015614cc857835183529284019291840191600101614cac565b50909695505050505050565b60008060008060008060006080888a031215614cef57600080fd5b87356001600160401b0380821115614d0657600080fd5b614d128b838c01614bb6565b909950975060208a0135915080821115614d2b57600080fd5b614d378b838c01614bb6565b909750955060408a0135915080821115614d5057600080fd5b50614d5d8a828b01614bb6565b9094509250614d70905060608901614b7f565b905092959891949750929550565b634e487b7160e01b600052604160045260246000fd5b6040516101e081016001600160401b0381118282101715614db757614db7614d7e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614de557614de5614d7e565b604052919050565b60006001600160401b03821115614e0657614e06614d7e565b5060051b60200190565b600082601f830112614e2157600080fd5b81356020614e36614e3183614ded565b614dbd565b82815260059290921b84018101918181019086841115614e5557600080fd5b8286015b84811015614e705780358352918301918301614e59565b509695505050505050565b600060208284031215614e8d57600080fd5b81356001600160401b03811115614ea357600080fd5b614eaf84828501614e10565b949350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015614f0c57603f19888603018452614efa858351614b1f565b94509285019290850190600101614ede565b5092979650505050505050565b600080600080600060608688031215614f3157600080fd5b85356001600160401b0380821115614f4857600080fd5b614f5489838a01614e10565b96506020880135915080821115614f6a57600080fd5b614f7689838a01614bb6565b90965094506040880135915080821115614f8f57600080fd5b50614f9c88828901614bb6565b969995985093965092949392505050565b60008060008060008060a08789031215614fc657600080fd5b86356001600160401b03811115614fdc57600080fd5b614fe889828a01614bb6565b909a90995060208901359860408101359850606081013597506080013595509350505050565b6020808252825182820181905260009190848201906040850190845b81811015614cc85783516001600160a01b03168352928401929184019160010161502a565b6000806040838503121561506257600080fd5b823591506020808401356001600160401b038082111561508157600080fd5b818601915086601f83011261509557600080fd5b8135818111156150a7576150a7614d7e565b6150b9601f8201601f19168501614dbd565b915080825287848285010111156150cf57600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806000806040858703121561510357600080fd5b84356001600160401b038082111561511a57600080fd5b61512688838901614bb6565b9096509450602087013591508082111561513f57600080fd5b818701915087601f83011261515357600080fd5b81358181111561516257600080fd5b8860206101e08302850101111561517857600080fd5b95989497505060200194505050565b6000806040838503121561519a57600080fd5b823591506151aa60208401614b7f565b90509250929050565b6000608082840312156151c557600080fd5b50919050565b6000806000806000806000806000806101208b8d0312156151eb57600080fd5b8a356001600160401b038082111561520257600080fd5b61520e8e838f01614bb6565b909c509a5060208d013591508082111561522757600080fd5b6152338e838f01614bb6565b909a50985060408d013591508082111561524c57600080fd5b6152588e838f01614bb6565b909850965086915061526c60608e01614b7f565b955060808d013591508082111561528257600080fd5b5061528f8d828e01614bb6565b90945092506152a390508c60a08d016151b3565b90509295989b9194979a5092959850565b602080825282518282018190526000919060409081850190868401855b8281101561531657815180516001600160a01b0316855286810151878601528581015186860152606090810151151590850152608090930192908501906001016152d1565b5091979650505050505050565b60008082840361020081121561533857600080fd5b833592506101e0601f198201121561534f57600080fd5b506020830190509250929050565b634e487b7160e01b600052602160045260246000fd5b600681106153835761538361535d565b9052565b600781106153835761538361535d565b815160ff1681526101e0810160208301516153b7602084018260ff169052565b5060408301516153cc604084018260ff169052565b5060608301516153e1606084018260ff169052565b5060808301516153f6608084018260ff169052565b5060a083015161540b60a084018260ff169052565b5060c083015161542060c084018260ff169052565b5060e083015161543560e084018260ff169052565b506101008381015160ff9081169184019190915261012080850151821690840152610140808501518216908401526101608085015182169084015261018080850151909116908301526101a08084015161549182850182615373565b50506101c0808401516154a682850182615387565b505092915050565b60208082526010908201526f14d85b195cc8185c99481c185d5cd95960821b604082015260600190565b6000602082840312156154ea57600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b8051614b9681614af4565b60006020828403121561553257600080fd5b81516149bc81614af4565b6020808252601b908201527f55736572206973206e6f74206f776e6572206f722061646d696e2e0000000000604082015260600190565b600181811c9082168061558857607f821691505b6020821081036151c557634e487b7160e01b600052602260045260246000fd5b6020808252600f908201526e4e6f20706c6f747320746f2062757960881b604082015260600190565b6001600160a01b0383168152604081016149bc6020830184615373565b634e487b7160e01b600052601160045260246000fd5b60008219821115615617576156176155ee565b500190565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b6020808252601290820152712ab9b2b91034b9903737ba1037bbb732b91760711b604082015260600190565b6020808252601690820152752ab9b2b91034b9903737ba103630b7321037bbb732b960511b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6020808252600a9082015269139bdd081b1a5cdd195960b21b604082015260600190565b6000813560ff8116811461261d57600080fd5b6000813561261d81614c01565b600682106157105761571061535d565b805460ff60681b191660689290921b60ff60681b16919091179055565b600081356007811061261d57600080fd5b6007821061574e5761574e61535d565b805460ff60701b191660709290921b60ff60701b16919091179055565b615788615777836156e0565b825460ff191660ff91909116178255565b6157ad615797602084016156e0565b825461ff00191660089190911b61ff0016178255565b6157d46157bc604084016156e0565b825462ff0000191660109190911b62ff000016178255565b6157fd6157e3606084016156e0565b825463ff000000191660189190911b63ff00000016178255565b61582861580c608084016156e0565b825464ff00000000191660209190911b64ff0000000016178255565b61585561583760a084016156e0565b825465ff0000000000191660289190911b65ff000000000016178255565b61588461586460c084016156e0565b825466ff000000000000191660309190911b66ff00000000000016178255565b6158b561589360e084016156e0565b825467ff00000000000000191660389190911b67ff0000000000000016178255565b6158e96158c561010084016156e0565b825468ff0000000000000000191660409190911b68ff000000000000000016178255565b61591f6158f961012084016156e0565b825469ff000000000000000000191660489190911b69ff00000000000000000016178255565b61594d61592f61014084016156e0565b82805460ff60501b191660509290921b60ff60501b16919091179055565b61597b61595d61016084016156e0565b82805460ff60581b191660589290921b60ff60581b16919091179055565b6159a961598b61018084016156e0565b82805460ff60601b191660609290921b60ff60601b16919091179055565b6159bf6159b96101a084016156f3565b82615700565b6159d56159cf6101c0840161572d565b8261573e565b5050565b81835260006001600160fb1b038311156159f257600080fd5b8260051b8083602087013760009401602001938452509192915050565b6001600160a01b0386168152606060208201819052600090615a3490830186886159d9565b8281036040840152615a478185876159d9565b98975050505050505050565b80516001600160801b0381168114614b9657600080fd5b60006020808385031215615a7d57600080fd5b82516001600160401b03811115615a9357600080fd5b8301601f81018513615aa457600080fd5b8051615ab2614e3182614ded565b8181526101e09182028301840191848201919088841115615ad257600080fd5b938501935b83851015613cb15780858a031215615aef5760008081fd5b615af7614d94565b615b0086615a53565b8152615b0d878701615515565b878201526040615b1e818801615515565b908201526060615b2f878201615515565b908201526080615b40878201615515565b9082015260a0615b51878201615515565b9082015260c0615b62878201615515565b9082015260e0615b73878201615515565b90820152610100615b85878201615515565b90820152610120615b97878201615515565b90820152610140615ba9878201615515565b90820152610160615bbb878201615515565b90820152610180615bcd878201615515565b908201526101a0615bdf878201615515565b908201526101c0615bf1878201615515565b9082015283529384019391850191615ad7565b600082821015615c1657615c166155ee565b500390565b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615615c4b57615c4b6155ee565b500290565b600082615c6d57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220f97f949cc6fedde5d9324c2689c16fb55fa6d9c5b5cd43255fefddfb519f0aad64736f6c634300080d0033000000000000000000000000000000000000000000000000000000746a5288000000000000000000000000000000000000000000000000000000015d3ef7980000000000000000000000000000000000000000000000000000000246139ca800000000000000000000000000000000000000000000000000000000000000c350

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000746a5288000000000000000000000000000000000000000000000000000000015d3ef7980000000000000000000000000000000000000000000000000000000246139ca800000000000000000000000000000000000000000000000000000000000000c350

-----Decoded View---------------
Arg [0] : commonPrice (uint256): 500000000000
Arg [1] : rarePrice (uint256): 1500000000000
Arg [2] : epicPrice (uint256): 2500000000000
Arg [3] : creatorFee (uint256): 50000

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000746a528800
Arg [1] : 0000000000000000000000000000000000000000000000000000015d3ef79800
Arg [2] : 00000000000000000000000000000000000000000000000000000246139ca800
Arg [3] : 000000000000000000000000000000000000000000000000000000000000c350


Deployed ByteCode Sourcemap

113:9037:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1979:142:2;;;;2077:12;216:25:7;;2091:10:2;272:2:7;257:18;;250:34;2103:10:2;300:18:7;;;293:34;;;;204:2;189:18;1979:142:2;;;;;;;;15788:91;15861:11;;15788:91;;;484:25:7;;;472:2;457:18;15788:91:2;338:177:7;15988:107:2;16069:19;;15988:107;;4617:993:4;;;;;;:::i;:::-;;:::i;:::-;;1926:110;;;;;;:::i;:::-;;:::i;1705:101::-;;;;;;:::i;:::-;;:::i;6168:118:5:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7793::4:-;;;;;;:::i;:::-;7853:4;7876:17;;;:9;:17;;;;;:23;:27;;;7793:118;;;;2194:14:7;;2187:22;2169:41;;2157:2;2142:18;7793:118:4;2029:187:7;14884:111:2;;;;;;:::i;:::-;;:::i;2042:91:4:-;2114:12;;;;2042:91;;5314:1950:2;;;;;;:::i;:::-;;:::i;784:102:0:-;;;;;;:::i;:::-;;:::i;15390:82:2:-;15459:6;;;;;-1:-1:-1;;;;;15459:6:2;15390:82;;;-1:-1:-1;;;;;3828:32:7;;;3810:51;;3798:2;3783:18;15390:82:2;3664:203:7;6992:272:4;;;:::i;15001:281:2:-;;;;;;:::i;:::-;;:::i;685:93:0:-;;;;;;:::i;:::-;;:::i;1453::5:-;1526:13;;;;1453:93;;4701:121;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2355:116:2:-;2441:23;;2355:116;;3211:299;;;;;;:::i;:::-;;:::i;15683:99::-;15760:15;;15683:99;;2369:352:4;;;;;;:::i;:::-;;:::i;14651:101:2:-;;;;;;:::i;:::-;;:::i;15585:92::-;15659:11;;-1:-1:-1;;;;;15659:11:2;15585:92;;2244::4;2318:11;;2244:92;;14758:120:2;;;;;;:::i;:::-;;:::i;1811:109:4:-;;;;;;:::i;:::-;;:::i;2139:99::-;2215:16;;;;;;;2139:99;;518:161:0;;;;;;:::i;:::-;;:::i;15478:101:2:-;15556:16;;-1:-1:-1;;;;;15556:16:2;15478:101;;2822:120;;;;;;:::i;:::-;;:::i;2477:142::-;;;;;;:::i;:::-;;:::i;1336:111:5:-;;;;;;:::i;:::-;;:::i;16120:159:2:-;;;;;;:::i;:::-;;:::i;6292:395:5:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1073:81:0:-;1115:7;1141:6;-1:-1:-1;;;;;1141:6:0;1073:81;;8800:114:4;8896:10;8853:7;8879:28;;;:16;:28;;;;;;8800:114;;10291:259:2;;;;;;:::i;:::-;;:::i;3099:210:4:-;;;;;;:::i;:::-;;:::i;7916:319:2:-;;;;;;:::i;:::-;;:::i;4310:385:5:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1219:111::-;;;;;;:::i;:::-;1278:7;1304:19;;;:11;:19;;;;;;-1:-1:-1;;;;;1304:19:5;;1219:111;5977:185;;;;;;:::i;:::-;;:::i;2727:366:4:-;;;;;;:::i;:::-;;:::i;1843:454:5:-;;;;;;:::i;:::-;;:::i;7287:483:4:-;;;;;;:::i;:::-;;:::i;3078:127:2:-;3164:15;;3181:16;;3078:127;;;;13307:25:7;;;13363:2;13348:18;;13341:34;;;;13280:18;3078:127:2;13133:248:7;2234:115:2;;;;;;:::i;:::-;;:::i;4094:210:5:-;;;;;;:::i;:::-;;:::i;3584:504::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;13654:13:7;;13613:10;13650:22;;;13632:41;;13733:4;13721:17;;;13715:24;13711:33;;13689:20;;;13682:63;13805:4;13793:17;;;13787:24;13783:33;;13761:20;;;13754:63;13877:4;13865:17;;;13859:24;13855:33;;13833:20;;;13826:63;13949:4;13937:17;;;13931:24;13927:33;13905:20;;;13898:63;;;;13590:3;13575:19;;13386:581;15885:97:2;15961:14;;15885:97;;16285:111;;;;;;:::i;:::-;;:::i;5616:518:4:-;;;;;;:::i;:::-;;:::i;2948:124:2:-;;;;;;:::i;:::-;-1:-1:-1;;;;;3032:28:2;3009:4;3032:28;;;:18;:28;;;;;;3064:1;3032:33;;2948:124;3777:834:4;;;;;;:::i;:::-;;:::i;8361:433::-;;;;;;:::i;:::-;;:::i;9740:545:2:-;;;;;;:::i;:::-;;:::i;6140:112:4:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7917:240::-;;;;;;:::i;:::-;;:::i;6258:728::-;;;;;;:::i;:::-;;:::i;2303:200:5:-;;;;;;:::i;:::-;;:::i;1552:115::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;892:175:0:-;;;;;;:::i;:::-;;:::i;2127:101:2:-;2204:17;;;;2127:101;;8163:192:4;;;;;;:::i;:::-;;:::i;2625:191:2:-;;;;;;:::i;:::-;;:::i;4617:993:4:-;1633:12;;;;1632:13;1624:42;;;;-1:-1:-1;;;1624:42:4;;;;;;;:::i;:::-;;;;;;;;;4712:1:::1;4704:5;:9;4696:49;;;::::0;-1:-1:-1;;;4696:49:4;;20178:2:7;4696:49:4::1;::::0;::::1;20160:21:7::0;20217:2;20197:18;;;20190:30;20256:29;20236:18;;;20229:57;20303:18;;4696:49:4::1;19976:351:7::0;4696:49:4::1;4755:17;1304:19:5::0;;;:11;:19;;;;;;-1:-1:-1;;;;;1304:19:5;4826:10:4::1;4813:23:::0;;4805:54:::1;;;::::0;-1:-1:-1;;;4805:54:4;;20534:2:7;4805:54:4::1;::::0;::::1;20516:21:7::0;20573:2;20553:18;;;20546:30;-1:-1:-1;;;20592:18:7;;;20585:48;20650:18;;4805:54:4::1;20332:342:7::0;4805:54:4::1;-1:-1:-1::0;;;;;4877:23:4;::::1;4869:53;;;::::0;-1:-1:-1;;;4869:53:4;;20881:2:7;4869:53:4::1;::::0;::::1;20863:21:7::0;20920:2;20900:18;;;20893:30;-1:-1:-1;;;20939:18:7;;;20932:47;20996:18;;4869:53:4::1;20679:341:7::0;4869:53:4::1;4968:11;1734:6:5::0;1759:17;;;:9;:17;;;;;:24;-1:-1:-1;;;1759:24:5;;;;4943:36:4::1;;;;;;;;:::i;:::-;::::0;4935:79:::1;;;::::0;-1:-1:-1;;;4935:79:4;;21227:2:7;4935:79:4::1;::::0;::::1;21209:21:7::0;21266:2;21246:18;;;21239:30;21305:32;21285:18;;;21278:60;21355:18;;4935:79:4::1;21025:354:7::0;4935:79:4::1;5025:17;5045::::0;;;:9:::1;:17;::::0;;;;:23;5128:16;;5124:103:::1;;5176:12;5168:5;:20;5160:56;;;::::0;-1:-1:-1;;;5160:56:4;;21586:2:7;5160:56:4::1;::::0;::::1;21568:21:7::0;21625:2;21605:18;;;21598:30;21664:25;21644:18;;;21637:53;21707:18;;5160:56:4::1;21384:347:7::0;5160:56:4::1;5263:6;::::0;5288:46:::1;::::0;-1:-1:-1;;;5288:46:4;;5308:10:::1;5288:46;::::0;::::1;21948:34:7::0;5328:4:4::1;21998:18:7::0;;;21991:43;5263:6:4::1;::::0;;::::1;-1:-1:-1::0;;;;;5263:6:4::1;::::0;5338:5;;5263:6;;5288:19:::1;::::0;21883:18:7;;5288:46:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;5280:88;;;::::0;-1:-1:-1;;;5280:88:4;;22436:2:7;5280:88:4::1;::::0;::::1;22418:21:7::0;22475:2;22455:18;;;22448:30;-1:-1:-1;;;22494:18:7;;;22487:50;22554:18;;5280:88:4::1;22234:344:7::0;5280:88:4::1;5400:48;::::0;;::::1;::::0;::::1;::::0;;5406:10:::1;5400:48:::0;;;::::1;::::0;;::::1;::::0;;;5425:15:::1;5400:48:::0;;;;;;-1:-1:-1;5400:48:4;;;;;;5458:15;;;:7:::1;:15:::0;;;;;:27;;5400:48;5458:27;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;5458:27:4::1;-1:-1:-1::0;;;;;5458:27:4;;::::1;;::::0;;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;5458:27:4::1;::::0;::::1;;::::0;;;::::1;::::0;;;5495:56;;-1:-1:-1;;;5495:56:4;;5400:48;;5495:22;::::1;::::0;::::1;::::0;:56:::1;::::0;5406:10;;5538:4:::1;::::0;5400:48;;5495:56:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;5567:36:4::1;::::0;484:25:7;;;5585:10:4::1;::::0;5577:6;;5567:36:::1;::::0;472:2:7;457:18;5567:36:4::1;;;;;;;4686:924;;;;4617:993:::0;;:::o;1926:110::-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;2005:11:4::1;:24:::0;1926:110::o;1705:101::-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;1778:12:4::1;:21:::0;;-1:-1:-1;;1778:21:4::1;::::0;::::1;;::::0;;;::::1;::::0;;1705:101::o;6168:118:5:-;6263:16;;;;:8;:16;;;;;6256:23;;6231:13;;6263:16;6256:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6168:118;;;:::o;14884:111:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;14964:11:2::1;:24:::0;;-1:-1:-1;;;;;;14964:24:2::1;-1:-1:-1::0;;;;;14964:24:2;;;::::1;::::0;;;::::1;::::0;;14884:111::o;5314:1950::-;1385:16;;1430:15;;1376:70;;-1:-1:-1;;;1376:70:2;;1418:10;1376:70;;;24265:51:7;24332:18;;;24325:34;;;;-1:-1:-1;;;;;1385:16:2;;;;1376:41;;24238:18:7;;1376:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5437:7:2;;-1:-1:-1;;;5469:12:2;5461:40:::1;;;;-1:-1:-1::0;;;5461:40:2::1;;;;;;;:::i;:::-;5551:16;::::0;5542:76:::1;::::0;-1:-1:-1;;;5542:76:2;;5511:28:::1;::::0;-1:-1:-1;;;;;5551:16:2::1;::::0;5542:50:::1;::::0;:76:::1;::::0;5593:10:::1;::::0;5605:12;;5542:76:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5511:107;;5660:8;5636:20;:32;;5628:74;;;::::0;-1:-1:-1;;;5628:74:2;;25220:2:7;5628:74:2::1;::::0;::::1;25202:21:7::0;25259:2;25239:18;;;25232:30;25298:31;25278:18;;;25271:59;25347:18;;5628:74:2::1;25018:353:7::0;5628:74:2::1;5714:17;5733:15:::0;5750::::1;5767::::0;5784:18:::1;5806:26;5824:7;;5806:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;5806:17:2::1;::::0;-1:-1:-1;;;5806:26:2:i:1;:::-;5713:119;;;;;;;;;;5931:7;5917:21;;;;;:::i;:::-;5958:1;::::0;-1:-1:-1;5917:21:2;-1:-1:-1;5990:13:2::1;5974:12;:29;;;;;;;;:::i;:::-;::::0;5970:1288:::1;;6040:8;6027:9;:21;6019:51;;;::::0;-1:-1:-1;;;6019:51:2;;25843:2:7;6019:51:2::1;::::0;::::1;25825:21:7::0;25882:2;25862:18;;;25855:30;-1:-1:-1;;;25901:18:7;;;25894:47;25958:18;;6019:51:2::1;25641:341:7::0;6019:51:2::1;6093:16;::::0;6084:70:::1;::::0;-1:-1:-1;;;6084:70:2;;-1:-1:-1;;;;;6093:16:2;;::::1;::::0;6084:39:::1;::::0;:70:::1;::::0;6124:10:::1;::::0;6136:8;;6093:16:::1;::::0;;;;;6084:70:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;6168:42;6184:7;;6168:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;6168:42:2;-1:-1:-1;6205:4:2::1;::::0;-1:-1:-1;6168:15:2::1;::::0;-1:-1:-1;6168:42:2:i:1;:::-;5970:1288;;;6256:11;6240:12;:27;;;;;;;;:::i;:::-;::::0;6236:1022:::1;;6314:8:::0;6291:19:::1;6303:7:::0;6291:9;:19:::1;:::i;:::-;:31;6283:69;;;::::0;-1:-1:-1;;;6283:69:2;;26707:2:7;6283:69:2::1;::::0;::::1;26689:21:7::0;26746:2;26726:18;;;26719:30;26785:27;26765:18;;;26758:55;26830:18;;6283:69:2::1;26505:349:7::0;6283:69:2::1;6375:16;::::0;6366:70:::1;::::0;-1:-1:-1;;;6366:70:2;;-1:-1:-1;;;;;6375:16:2;;::::1;::::0;6366:39:::1;::::0;:70:::1;::::0;6406:10:::1;::::0;6375:16:::1;::::0;6421:8;;6375:16;;;;6366:70:::1;;;:::i;6236:1022::-;6538:11;6522:12;:27;;;;;;;;:::i;:::-;::::0;6518:740:::1;;6606:8:::0;6595:7;6573:19:::1;6585:7:::0;6573:9;:19:::1;:::i;:::-;:29;;;;:::i;:::-;:41;6565:85;;;::::0;-1:-1:-1;;;6565:85:2;;27579:2:7;6565:85:2::1;::::0;::::1;27561:21:7::0;27618:2;27598:18;;;27591:30;27657:33;27637:18;;;27630:61;27708:18;;6565:85:2::1;27377:355:7::0;6565:85:2::1;6673:16;::::0;6664:70:::1;::::0;-1:-1:-1;;;6664:70:2;;-1:-1:-1;;;;;6673:16:2;;::::1;::::0;6664:39:::1;::::0;:70:::1;::::0;6704:10:::1;::::0;6673:16:::1;::::0;;;6722:8;;6673:16;;6664:70:::1;;;:::i;6518:740::-;6961:14;6945:12;:30;;;;;;;;:::i;:::-;;:104;;;;-1:-1:-1::0;7041:8:2;7027:10;7017:7;6995:19:::1;7007:7:::0;6995:9;:19:::1;:::i;:::-;:29;;;;:::i;:::-;:42;;;;:::i;:::-;:54;6945:104;6920:187;;;::::0;-1:-1:-1;;;6920:187:2;;28457:2:7;6920:187:2::1;::::0;::::1;28439:21:7::0;28496:2;28476:18;;;28469:30;28535:26;28515:18;;;28508:54;28579:18;;6920:187:2::1;28255:348:7::0;6920:187:2::1;7130:16;::::0;7121:70:::1;::::0;-1:-1:-1;;;7121:70:2;;-1:-1:-1;;;;;7130:16:2;;::::1;::::0;7121:39:::1;::::0;:70:::1;::::0;7161:10:::1;::::0;7130:16:::1;::::0;;;;;7182:8;;7121:70:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7205:42;7221:7;;7205:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;7205:42:2;-1:-1:-1;7242:4:2::1;::::0;-1:-1:-1;7205:15:2::1;::::0;-1:-1:-1;7205:42:2:i:1;:::-;5411:1853;;;;;;;5314:1950:::0;;;:::o;784:102:0:-;-1:-1:-1;;;;;860:14:0;837:4;860:14;;;:7;:14;;;;;;;;;:19;;784:102::o;6992:272:4:-;7076:10;7037:19;7059:28;;;:16;:28;;;;;;7105:15;7097:47;;;;-1:-1:-1;;;7097:47:4;;29328:2:7;7097:47:4;;;29310:21:7;29367:2;29347:18;;;29340:30;-1:-1:-1;;;29386:18:7;;;29379:49;29445:18;;7097:47:4;29126:343:7;7097:47:4;7161:6;;7154:48;;-1:-1:-1;;;7154:48:4;;7178:10;7154:48;;;24265:51:7;24332:18;;;24325:34;;;7161:6:4;;;;-1:-1:-1;;;;;7161:6:4;;7154:23;;24238:18:7;;7154:48:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;7218:39:4;;484:25:7;;;7233:10:4;;7218:39;;472:2:7;457:18;7218:39:4;;;;;;;7027:237;6992:272::o;15001:281:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;15135:9:2::1;15122:10;:22;15114:55;;;::::0;-1:-1:-1;;;15114:55:2;;29676:2:7;15114:55:2::1;::::0;::::1;29658:21:7::0;29715:2;29695:18;;;29688:30;-1:-1:-1;;;29734:18:7;;;29727:50;29794:18;;15114:55:2::1;29474:344:7::0;15114:55:2::1;15179:11;:19:::0;;;;15208:14:::1;:25:::0;15243:19:::1;:32:::0;15001:281::o;685:93:0:-;265:6;;-1:-1:-1;;;;;265:6:0;251:10;:20;243:51;;;;-1:-1:-1;;;243:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;757:14:0::1;;::::0;;;:7:::1;:14;::::0;;;;750:21;685:93::o;4701:121:5:-;-1:-1:-1;;;;;4795:20:5;;;;;;:14;:20;;;;;;;;;4788:27;;;;;;;;;;;;;;;;;4760:16;;4788:27;;;4795:20;4788:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4701:121;;;:::o;3211:299:2:-;1385:16;;1430:15;;1376:70;;-1:-1:-1;;;1376:70:2;;1418:10;1376:70;;;24265:51:7;24332:18;;;24325:34;;;;-1:-1:-1;;;;;1385:16:2;;;;1376:41;;24238:18:7;;1376:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3430:73:::1;3440:7;;3449:21;;3472:20;;3494:8;3430:9;:73::i;:::-;3211:299:::0;;;;;;;:::o;2369:352:4:-;1149:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1149:19:5;1135:10;:33;1127:68;;;;-1:-1:-1;;;1127:68:5;;;;;;;:::i;:::-;1633:12:4::1;::::0;::::1;;1632:13;1624:42;;;;-1:-1:-1::0;;;1624:42:4::1;;;;;;;:::i;:::-;2481:1:::2;2473:5;:9;2465:50;;;::::0;-1:-1:-1;;;2465:50:4;;30723:2:7;2465:50:4::2;::::0;::::2;30705:21:7::0;30762:2;30742:18;;;30735:30;30801;30781:18;;;30774:58;30849:18;;2465:50:4::2;30521:352:7::0;2465:50:4::2;2558:11;1734:6:5::0;1759:17;;;:9;:17;;;;;:24;-1:-1:-1;;;1759:24:5;;;;2533:36:4::2;;;;;;;;:::i;:::-;::::0;2525:75:::2;;;::::0;-1:-1:-1;;;2525:75:4;;31080:2:7;2525:75:4::2;::::0;::::2;31062:21:7::0;31119:2;31099:18;;;31092:30;31158:28;31138:18;;;31131:56;31204:18;;2525:75:4::2;30878:350:7::0;2525:75:4::2;2630:31;::::0;;;;::::2;::::0;;;;;2645:15:::2;2630:31;::::0;;::::2;::::0;;;-1:-1:-1;2610:17:4;;;:9:::2;:17:::0;;;;;;:51;;;;;::::2;::::0;;::::2;::::0;2677:37;2696:10:::2;::::0;2620:6;;2677:37:::2;::::0;::::2;::::0;2638:5;484:25:7;;472:2;457:18;;338:177;2677:37:4::2;;;;;;;;2369:352:::0;;;:::o;14651:101:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;14726:6:2::1;:19:::0;;-1:-1:-1;;;;;14726:19:2;;::::1;;;-1:-1:-1::0;;;;;;14726:19:2;;::::1;::::0;;;::::1;::::0;;14651:101::o;14758:120::-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;14842:16:2::1;:29:::0;;-1:-1:-1;;;;;;14842:29:2::1;-1:-1:-1::0;;;;;14842:29:2;;;::::1;::::0;;;::::1;::::0;;14758:120::o;1811:109:4:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;1888:16:4::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;1888:25:4;;::::1;::::0;;;::::1;::::0;;1811:109::o;518:161:0:-;265:6;;-1:-1:-1;;;;;265:6:0;251:10;:20;243:51;;;;-1:-1:-1;;;243:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;588:19:0;::::1;580:64;;;::::0;-1:-1:-1;;;580:64:0;;31435:2:7;580:64:0::1;::::0;::::1;31417:21:7::0;;;31454:18;;;31447:30;31513:34;31493:18;;;31486:62;31565:18;;580:64:0::1;31233:356:7::0;580:64:0::1;-1:-1:-1::0;;;;;654:14:0::1;;::::0;;;671:1:::1;654:14;::::0;;;;;;;:18;518:161::o;2822:120:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2907:28:2::1;;::::0;;;:18:::1;:28;::::0;;;;2900:35;2822:120::o;2477:142::-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;2572:23:2::1;:40:::0;2477:142::o;1336:111:5:-;265:6:0;;-1:-1:-1;;;;;265:6:0;251:10;:20;243:51;;;;-1:-1:-1;;;243:51:0;;;;;;;:::i;:::-;376:6:::1;::::0;-1:-1:-1;;;;;376:6:0::1;362:10;:20;::::0;:43:::1;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1::0;;;354:83:0::1;;;;;;;:::i;:::-;1419:13:5::2;:21:::0;;-1:-1:-1;;1419:21:5::2;::::0;::::2;;::::0;;;::::2;::::0;;1336:111::o;16120:159:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;16219:1:2::1;16208:7;:12;;16200:37;;;::::0;-1:-1:-1;;;16200:37:2;;31796:2:7;16200:37:2::1;::::0;::::1;31778:21:7::0;31835:2;31815:18;;;31808:30;-1:-1:-1;;;31854:18:7;;;31847:42;31906:18;;16200:37:2::1;31594:336:7::0;16200:37:2::1;16247:15;:25:::0;16120:159::o;6292:395:5:-;6416:14;;6370:15;;6397:16;6416:14;-1:-1:-1;;;;;6468:22:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6440:50;;6505:6;6501:153;6515:8;6513:1;:10;6501:153;;;6540:14;6557:7;6565:1;6557:10;;;;;;;;:::i;:::-;;;;;;;6540:27;;6596:8;:16;6605:6;6596:16;;;;;;;;;;;6581:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;6591:1;6581:12;;;;;;;;:::i;:::-;;;;;;;;;;:31;-1:-1:-1;6638:3:5;;6501:153;;;-1:-1:-1;6671:9:5;6292:395;-1:-1:-1;;;6292:395:5:o;10291:259:2:-;10449:4;10472:71;10490:7;10499:21;;10522:20;;10472:17;:71::i;:::-;10465:78;10291:259;-1:-1:-1;;;;;;10291:259:2:o;3099:210:4:-;1149:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1149:19:5;1135:10;:33;1127:68;;;;-1:-1:-1;;;1127:68:5;;;;;;;:::i;:::-;3172:83:4::1;3180:6;-1:-1:-1::0;;3172:7:4::1;:83::i;:::-;3270:32;::::0;3291:10:::1;::::0;3283:6;;3270:32:::1;::::0;;;::::1;3099:210:::0;;:::o;7916:319:2:-;1385:16;;1430:15;;1376:70;;-1:-1:-1;;;1376:70:2;;1418:10;1376:70;;;24265:51:7;24332:18;;;24325:34;;;;-1:-1:-1;;;;;1385:16:2;;;;1376:41;;24238:18:7;;1376:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8142:86:::1;8163:7;;8172:13;8187:11;8200;8213:14;8142:20;:86::i;:::-;7916:319:::0;;;;;;:::o;4310:385:5:-;4428:14;;4381:16;;4409;4428:14;-1:-1:-1;;;;;4478:23:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4478:23:5;;4452:49;;4516:6;4512:153;4526:8;4524:1;:10;4512:153;;;4551:14;4568:7;4576:1;4568:10;;;;;;;;:::i;:::-;;;;;;;4551:27;;4604:11;:19;4616:6;4604:19;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4604:19:5;4592:6;4599:1;4592:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4592:31:5;;;:9;;;;;;;;;;;:31;-1:-1:-1;4649:3:5;;4512:153;;5977:185;1149:19;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1149:19:5;1135:10;:33;1127:68;;;;-1:-1:-1;;;1127:68:5;;;;;;;:::i;:::-;6082:16:::1;::::0;;;:8:::1;:16;::::0;;;;;;;:26;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;6139:6;6123:32;6147:7;6123:32;;;;;;:::i;:::-;;;;;;;;5977:185:::0;;;:::o;2727:366:4:-;1149:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1149:19:5;1135:10;:33;1127:68;;;;-1:-1:-1;;;1127:68:5;;;;;;;:::i;:::-;2842:1:4::1;2831:8;:12;2823:53;;;::::0;-1:-1:-1;;;2823:53:4;;30723:2:7;2823:53:4::1;::::0;::::1;30705:21:7::0;30762:2;30742:18;;;30735:30;30801;30781:18;;;30774:58;30849:18;;2823:53:4::1;30521:352:7::0;2823:53:4::1;2886:13;2902:17:::0;;;:9:::1;:17;::::0;;;;:23;2943:12;2935:35:::1;;;;-1:-1:-1::0;;;2935:35:4::1;;;;;;;:::i;:::-;2980:17;::::0;;;:9:::1;:17;::::0;;;;;;;;:34;;;3030:56;;13307:25:7;;;13348:18;;;13341:34;;;3055:10:4::1;::::0;2980:17;;3030:56:::1;::::0;13280:18:7;3030:56:4::1;;;;;;;2813:280;2727:366:::0;;;:::o;1843:454:5:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;1973:13:5::1;::::0;::::1;;1972:14;1964:54;;;::::0;-1:-1:-1;;;1964:54:5;;32608:2:7;1964:54:5::1;::::0;::::1;32590:21:7::0;32647:2;32627:18;;;32620:30;32686:29;32666:18;;;32659:57;32733:18;;1964:54:5::1;32406:351:7::0;1964:54:5::1;2042:7:::0;2074:21;;::::1;2066:66;;;::::0;-1:-1:-1;;;2066:66:5;;32964:2:7;2066:66:5::1;::::0;::::1;32946:21:7::0;;;32983:18;;;32976:30;33042:34;33022:18;;;33015:62;33094:18;;2066:66:5::1;32762:356:7::0;2066:66:5::1;2146:6;2142:149;2156:3;2154:1;:5;2142:149;;;2176:14;2193:7;;2201:1;2193:10;;;;;;;:::i;:::-;;;;;;;2176:27;;2237:9;;2247:1;2237:12;;;;;;;:::i;:::-;;;;;;2217:9;:17;2227:6;2217:17;;;;;;;;;;;:32;;;;;;:::i;:::-;-1:-1:-1::0;;;2275:3:5::1;;2142:149;;7287:483:4::0;1149:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1149:19:5;1135:10;:33;1127:68;;;;-1:-1:-1;;;1127:68:5;;;;;;;:::i;:::-;7397:10:4::1;-1:-1:-1::0;;;;;7385:22:4;::::1;::::0;7377:58:::1;;;::::0;-1:-1:-1;;;7377:58:4;;38791:2:7;7377:58:4::1;::::0;::::1;38773:21:7::0;38830:2;38810:18;;;38803:30;38869:25;38849:18;;;38842:53;38912:18;;7377:58:4::1;38589:347:7::0;7377:58:4::1;7454:16;::::0;::::1;::::0;::::1;;;7453:17;7445:50;;;::::0;-1:-1:-1;;;7445:50:4;;39143:2:7;7445:50:4::1;::::0;::::1;39125:21:7::0;39182:2;39162:18;;;39155:30;-1:-1:-1;;;39201:18:7;;;39194:50;39261:18;;7445:50:4::1;38941:344:7::0;7445:50:4::1;7513:17;::::0;;;:9:::1;:17;::::0;;;;:23;:28;7505:68:::1;;;::::0;-1:-1:-1;;;7505:68:4;;39492:2:7;7505:68:4::1;::::0;::::1;39474:21:7::0;39531:2;39511:18;;;39504:30;39570:29;39550:18;;;39543:57;39617:18;;7505:68:4::1;39290:351:7::0;7505:68:4::1;7616:11;1734:6:5::0;1759:17;;;:9;:17;;;;;:24;-1:-1:-1;;;1759:24:5;;;;7591:36:4::1;;;;;;;;:::i;:::-;::::0;7583:79:::1;;;::::0;-1:-1:-1;;;7583:79:4;;39848:2:7;7583:79:4::1;::::0;::::1;39830:21:7::0;39887:2;39867:18;;;39860:30;39926:32;39906:18;;;39899:60;39976:18;;7583:79:4::1;39646:354:7::0;7583:79:4::1;7673:30;7686:8;7696:6;7673:12;:30::i;:::-;7718:45;::::0;-1:-1:-1;;;;;7718:45:4;::::1;::::0;7742:10:::1;::::0;7734:6;;7718:45:::1;::::0;;;::::1;7287:483:::0;;;:::o;2234:115:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;2314:17:2::1;:28:::0;;-1:-1:-1;;2314:28:2::1;::::0;::::1;;::::0;;;::::1;::::0;;2234:115::o;4094:210:5:-;4159:4;;4183:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;4183:24:5;;;;:39;;;;;;;;:::i;:::-;;4175:72;;;;-1:-1:-1;;;4175:72:5;;40207:2:7;4175:72:5;;;40189:21:7;40246:2;40226:18;;;40219:30;-1:-1:-1;;;40265:18:7;;;40258:50;40325:18;;4175:72:5;40005:344:7;4175:72:5;-1:-1:-1;4295:1:5;4264:19;;;:11;:19;;;;;;-1:-1:-1;;;;;4264:19:5;:33;;4094:210::o;3584:504::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3815:20:5;;3705:17;3815:20;;;:14;:20;;;;;;;;3797:39;;;;;;;;;;;;;;;;;3705:17;;;;;;;;3797:39;;;;3815:20;3797:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:39::i;:::-;3867:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;3584:504:5:o;16285:111:2:-;16345:4;16368:21;16383:5;16368:14;:21::i;:::-;16361:28;16285:111;-1:-1:-1;;16285:111:2:o;5616:518:4:-;5713:15;;;;:7;:15;;;;;:22;5700:35;;5692:72;;;;-1:-1:-1;;;5692:72:4;;40556:2:7;5692:72:4;;;40538:21:7;40595:2;40575:18;;;40568:30;-1:-1:-1;;;40614:18:7;;;40607:54;40678:18;;5692:72:4;40354:348:7;5692:72:4;5774:18;5795:15;;;:7;:15;;;;;:27;;5811:10;;5795:27;;;;;;:::i;:::-;;;;;;;;;;5774:48;;;;;;;;5795:27;;;;;;;5774:48;;-1:-1:-1;;;;;5774:48:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5840:10:4;:25;5832:61;;;;-1:-1:-1;;;5832:61:4;;40909:2:7;5832:61:4;;;40891:21:7;40948:2;40928:18;;;40921:30;40987:25;40967:18;;;40960:53;41030:18;;5832:61:4;40707:347:7;5832:61:4;5912:5;:15;;;5911:16;5903:52;;;;-1:-1:-1;;;5903:52:4;;41261:2:7;5903:52:4;;;41243:21:7;41300:2;41280:18;;;41273:30;-1:-1:-1;;;41319:18:7;;;41312:53;41382:18;;5903:52:4;41059:347:7;5903:52:4;5999:11;;;;;5983;;-1:-1:-1;;;;;5966:29:4;;;;;:16;:29;;;;;;:44;;5999:11;;5966:29;;:44;;5999:11;;5966:44;:::i;:::-;;;;-1:-1:-1;;6020:15:4;;;;:7;:15;;;;;:27;;6060:4;;6020:15;6036:10;;6020:27;;;;;;:::i;:::-;;;;;;;;;;;:37;;;:44;;;;;;;;;;;;;;;;;;6103:10;-1:-1:-1;;;;;6080:47:4;6095:6;6080:47;6115:5;:11;;;6080:47;;;;484:25:7;;472:2;457:18;;338:177;3777:834:4;1633:12;;;;1632:13;1624:42;;;;-1:-1:-1;;;1624:42:4;;;;;;;:::i;:::-;3850:22:::1;3875:17:::0;;;:9:::1;:17;::::0;;;;;;;;3850:42;;;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;3902:40:::1;;;;-1:-1:-1::0;;;3902:40:4::1;;;;;;;:::i;:::-;3978:6;::::0;4053:13;;4003:46:::1;::::0;-1:-1:-1;;;4003:46:4;;4023:10:::1;4003:46;::::0;::::1;21948:34:7::0;4043:4:4::1;21998:18:7::0;;;21991:43;3978:6:4::1;::::0;;::::1;-1:-1:-1::0;;;;;3978:6:4::1;::::0;;;4003:19:::1;::::0;21883:18:7;;4003:46:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;3995:96;;;::::0;-1:-1:-1;;;3995:96:4;;22436:2:7;3995:96:4::1;::::0;::::1;22418:21:7::0;22475:2;22455:18;;;22448:30;-1:-1:-1;;;22494:18:7;;;22487:50;22554:18;;3995:96:4::1;22234:344:7::0;3995:96:4::1;4118:13:::0;;4109:22;::::1;4101:55;;;::::0;-1:-1:-1;;;4101:55:4;;41613:2:7;4101:55:4::1;::::0;::::1;41595:21:7::0;41652:2;41632:18;;;41625:30;-1:-1:-1;;;41671:18:7;;;41664:50;41731:18;;4101:55:4::1;41411:344:7::0;4101:55:4::1;4167:83;4175:6;-1:-1:-1::0;;4167:7:4::1;:83::i;:::-;4260:21;1304:19:5::0;;;:11;:19;;;;;;-1:-1:-1;;;;;1304:19:5;4314:32:4::1;4327:10;1304:19:5::0;4314:12:4::1;:32::i;:::-;4357:8;4367::::0;4379:28:::1;4393:7;:13;;;4379;:28::i;:::-;4417:54;::::0;-1:-1:-1;;;4417:54:4;;4356:51;;-1:-1:-1;4356:51:4;-1:-1:-1;;;;;;4417:22:4;::::1;::::0;::::1;::::0;:54:::1;::::0;4440:10:::1;::::0;4452:13;;4356:51;;4417:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;4516:11:4::1;::::0;4481:52:::1;::::0;-1:-1:-1;;;4481:52:4;;-1:-1:-1;;;;;4481:22:4;;::::1;::::0;::::1;::::0;:52:::1;::::0;4504:10:::1;::::0;4516:11:::1;::::0;4529:3;;4481:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4586:10;-1:-1:-1::0;;;;;4549:55:4::1;4571:13;-1:-1:-1::0;;;;;4549:55:4::1;4563:6;4549:55;4598:5;4549:55;;;;484:25:7::0;;472:2;457:18;;338:177;4549:55:4::1;;;;;;;;3840:771;;;;;3777:834:::0;;:::o;8361:433::-;8423:7;8466:15;;;:7;:15;;;;;;;;8442:39;;;;;;;;;;;;;;;;;8423:7;;;;8442:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8442:39:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8491:14;8508:6;:13;8491:30;;8531:15;8565:6;8560:201;8575:9;8573:1;:11;8560:201;;;8606:6;8613:1;8606:9;;;;;;;;:::i;:::-;;;;;;;:19;;;8605:20;:52;;;;;8647:10;8629:6;8636:1;8629:9;;;;;;;;:::i;:::-;;;;;;;:15;;;:28;8605:52;8601:119;;;8690:6;8697:1;8690:9;;;;;;;;:::i;:::-;;;;;;;:15;;;8677:28;;8601:119;8745:3;;8560:201;;;-1:-1:-1;8777:10:4;8361:433;-1:-1:-1;;;;8361:433:4:o;9740:545:2:-;1385:16;;1430:15;;1376:70;;-1:-1:-1;;;1376:70:2;;1418:10;1376:70;;;24265:51:7;24332:18;;;24325:34;;;;-1:-1:-1;;;;;1385:16:2;;;;1376:41;;24238:18:7;;1376:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10048:141:::1;10069:14;;10085:11;:25;;;10112:11;:23;;;10137:11;:23;;;10162:11;:26;;;10048:20;:141::i;:::-;10199:79;10209:13;;10224:21;;10247:20;;10269:8;10199:9;:79::i;6140:112:4:-:0;6197:14;6230:7;:15;6238:6;6230:15;;;;;;;;;;;6223:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6223:22:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6140:112;;;:::o;7917:240::-;7979:7;8032:17;;;:9;:17;;;;;;;;8007:42;;;;;;;;;;;;;;;;;;;;;;;;;7979:7;;8059:40;;;;-1:-1:-1;;;8059:40:4;;;;;;;:::i;:::-;8117:13;;8132:17;;;;;8117:13;;8132:17;;-1:-1:-1;7917:240:4;-1:-1:-1;;7917:240:4:o;6258:728::-;1149:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1149:19:5;1135:10;:33;1127:68;;;;-1:-1:-1;;;1127:68:5;;;;;;;:::i;:::-;1633:12:4::1;::::0;::::1;;1632:13;1624:42;;;;-1:-1:-1::0;;;1624:42:4::1;;;;;;;:::i;:::-;6402:15:::2;::::0;;;:7:::2;:15;::::0;;;;:22;6389:35;::::2;6381:72;;;::::0;-1:-1:-1;;;6381:72:4;;40556:2:7;6381:72:4::2;::::0;::::2;40538:21:7::0;40595:2;40575:18;;;40568:30;-1:-1:-1;;;40614:18:7;;;40607:54;40678:18;;6381:72:4::2;40354:348:7::0;6381:72:4::2;6463:18;6484:15:::0;;;:7:::2;:15;::::0;;;;:27;;6500:10;;6484:27;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;6463:48:::2;::::0;;::::2;::::0;::::2;::::0;;6484:27:::2;::::0;;::::2;::::0;;::::2;6463:48:::0;;-1:-1:-1;;;;;6463:48:4::2;::::0;;;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;::::2;;;::::0;::::2;::::0;;;;;;-1:-1:-1;6521:52:4::2;;;::::0;-1:-1:-1;;;6521:52:4;;41261:2:7;6521:52:4::2;::::0;::::2;41243:21:7::0;41300:2;41280:18;;;41273:30;-1:-1:-1;;;41319:18:7;;;41312:53;41382:18;;6521:52:4::2;41059:347:7::0;6521:52:4::2;6606:5;6591;:11;;;:20;6583:53;;;::::0;-1:-1:-1;;;6583:53:4;;41613:2:7;6583:53:4::2;::::0;::::2;41595:21:7::0;41652:2;41632:18;;;41625:30;-1:-1:-1;;;41671:18:7;;;41664:50;41731:18;;6583:53:4::2;41411:344:7::0;6583:53:4::2;6647:27;6655:6;6663:10;6647:7;:27::i;:::-;6697:11:::0;;6684:33:::2;::::0;6710:6;6684:12:::2;:33::i;:::-;6728:16;6754:6;;;;;;;;;-1:-1:-1::0;;;;;6754:6:4::2;6728:33;;6772:8;6782::::0;6794:26:::2;6808:5;:11;;;6794:13;:26::i;:::-;6830:35;::::0;-1:-1:-1;;;6830:35:4;;6849:10:::2;6830:35;::::0;::::2;24265:51:7::0;24332:18;;;24325:34;;;6771:49:4;;-1:-1:-1;6771:49:4;-1:-1:-1;;;;;;6830:18:4;::::2;::::0;::::2;::::0;24238::7;;6830:35:4::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;6894:11:4::2;::::0;6875:36:::2;::::0;-1:-1:-1;;;6875:36:4;;-1:-1:-1;;;;;6894:11:4;;::::2;6875:36;::::0;::::2;24265:51:7::0;24332:18;;;24325:34;;;6875:18:4;;::::2;::::0;::::2;::::0;24238::7;;6875:36:4::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6960:5;:11;;;-1:-1:-1::0;;;;;6926:53:4::2;6948:10;-1:-1:-1::0;;;;;6926:53:4::2;6940:6;6926:53;6973:5;6926:53;;;;484:25:7::0;;472:2;457:18;;338:177;6926:53:4::2;;;;;;;;6371:615;;;;6258:728:::0;;;;:::o;2303:200:5:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;2413:13:5::1;::::0;::::1;;2412:14;2404:54;;;::::0;-1:-1:-1;;;2404:54:5;;32608:2:7;2404:54:5::1;::::0;::::1;32590:21:7::0;32647:2;32627:18;;;32620:30;32686:29;32666:18;;;32659:57;32733:18;;2404:54:5::1;32406:351:7::0;2404:54:5::1;2468:17;::::0;;;:9:::1;:17;::::0;;;;2488:8;;2468:28:::1;2488:8:::0;2468:17;:28:::1;:::i;:::-;-1:-1:-1::0;;;;2303:200:5:o;1552:115::-;1609:15;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1609:15:5;1643:17;;;;:9;:17;;;;;;;;;1636:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1636:24:5;;;;;;;;-1:-1:-1;;;1636:24:5;;;;;;;;-1:-1:-1;;;1636:24:5;;;;;;;;;1643:17;;1636:24;;;;-1:-1:-1;;;1636:24:5;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;1636:24:5;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;1636:24:5;1552:115;-1:-1:-1;;1552:115:5:o;892:175:0:-;265:6;;-1:-1:-1;;;;;265:6:0;251:10;:20;243:51;;;;-1:-1:-1;;;243:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;974:22:0;::::1;966:67;;;::::0;-1:-1:-1;;;966:67:0;;41962:2:7;966:67:0::1;::::0;::::1;41944:21:7::0;;;41981:18;;;41974:30;42040:34;42020:18;;;42013:62;42092:18;;966:67:0::1;41760:356:7::0;966:67:0::1;1043:6;:17:::0;;-1:-1:-1;;;;;;1043:17:0::1;-1:-1:-1::0;;;;;1043:17:0;;;::::1;::::0;;;::::1;::::0;;892:175::o;8163:192:4:-;8226:7;8261:17;;;:9;:17;;;;;:23;8302:9;8294:32;;;;-1:-1:-1;;;8294:32:4;;;;;;;:::i;2625:191:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2708:22:2;::::1;2700:67;;;::::0;-1:-1:-1;;;2700:67:2;;42323:2:7;2700:67:2::1;::::0;::::1;42305:21:7::0;;;42342:18;;;42335:30;42401:34;42381:18;;;42374:62;42453:18;;2700:67:2::1;42121:356:7::0;2700:67:2::1;-1:-1:-1::0;;;;;2777:28:2::1;;::::0;;;:18:::1;:28;::::0;;;;2808:1:::1;2777:32:::0;;2625:191::o;2509:1069:5:-;2585:4;2591;2597;2603;2609;2626:15;2651:13;2674;2697;2720:15;2746:11;2760:7;:14;2746:28;;2789:6;2785:730;2799:3;2797:1;:5;2785:730;;;2819:14;2836:7;2844:1;2836:10;;;;;;;;:::i;:::-;;;;;;;2819:27;;2893:13;2865:41;;;;;;;;:::i;:::-;:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;2865:24:5;;;;:41;;;;;;;;:::i;:::-;;2861:612;;2926:11;2936:1;2926:11;;:::i;:::-;;;2861:612;;;3002:11;2974:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;2974:24:5;;;;:39;;;;;;;;:::i;:::-;;2970:503;;3033:9;3041:1;3033:9;;:::i;:::-;;;2970:503;;;3107:11;3079:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;3079:24:5;;;;:39;;;;;;;;:::i;:::-;;3075:398;;3138:9;3146:1;3138:9;;:::i;:::-;;;3075:398;;;3212:11;3184:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;3184:24:5;;;;:39;;;;;;;;:::i;:::-;;3180:293;;3243:9;3251:1;3243:9;;:::i;:::-;;;3180:293;;;3395:14;3367:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;3367:24:5;;;;:42;;;;;;;;:::i;:::-;;3359:70;;;;-1:-1:-1;;;3359:70:5;;42684:2:7;3359:70:5;;;42666:21:7;42723:2;42703:18;;;42696:30;-1:-1:-1;;;42742:18:7;;;42735:45;42797:18;;3359:70:5;42482:339:7;3359:70:5;3447:11;3457:1;3447:11;;:::i;:::-;;;3180:293;-1:-1:-1;3499:3:5;;2785:730;;;-1:-1:-1;3533:7:5;;3542:5;;-1:-1:-1;3549:5:5;;-1:-1:-1;3549:5:5;-1:-1:-1;3542:5:5;-1:-1:-1;2509:1069:5;-1:-1:-1;;;2509:1069:5:o;7270:640:2:-;7400:14;;7381:16;7424:239;7438:8;7436:1;:10;7424:239;;;7463:14;7480:7;7488:1;7480:10;;;;;;;;:::i;:::-;;;;;;;7463:27;;7512;7532:6;7512:19;:27::i;:::-;7504:71;;;;-1:-1:-1;;;7504:71:2;;43028:2:7;7504:71:2;;;43010:21:7;43067:2;43047:18;;;43040:30;43106:33;43086:18;;;43079:61;43157:18;;7504:71:2;42826:355:7;7504:71:2;7589:32;7602:10;7614:6;7589:12;:32::i;:::-;-1:-1:-1;7647:3:2;;7424:239;;;;7677:17;7673:154;;;7730:7;:14;7710:16;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;7673:154:2;;-1:-1:-1;7673:154:2;;7802:7;:14;7783:15;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;7673:154:2;7885:17;7842:61;;7875:8;-1:-1:-1;;;;;7842:61:2;7863:10;-1:-1:-1;;;;;7842:61:2;;7854:7;7842:61;;;;;;:::i;:::-;;;;;;;;7371:539;7270:640;;;:::o;3516:1062::-;3729:18;3721:46;;;;-1:-1:-1;;;3721:46:2;;;;;;;:::i;:::-;3777:13;3793:71;3811:7;;3793:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3820:21:2;;-1:-1:-1;3820:21:2;;-1:-1:-1;3843:20:2;;-1:-1:-1;3843:20:2;3793:17;:71::i;:::-;3883:16;;3874:98;;-1:-1:-1;;;3874:98:2;;3777:87;;-1:-1:-1;;;;;;3883:16:2;;3874:41;;:98;;3916:10;;3928:21;;;;3951:20;;;;3874:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3982:12;4008:26;4025:8;4008:16;:26::i;:::-;4004:455;;;4051:8;4061;4073:28;4095:5;4073:21;:28::i;:::-;4132:6;;4125:54;;-1:-1:-1;;;4125:54:2;;4050:51;;-1:-1:-1;4050:51:2;;-1:-1:-1;4132:6:2;;;-1:-1:-1;;;;;4132:6:2;;4125:27;;:54;;4153:10;;4165:8;;4050:51;;4125:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4115:64;;4197:7;4193:113;;;4241:6;;4274:11;;4234:57;;-1:-1:-1;;;4234:57:2;;4241:6;;;;-1:-1:-1;;;;;4241:6:2;;;;4234:27;;:57;;4262:10;;4274:11;;;4287:3;;4234:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4224:67;;4193:113;4036:280;;4004:455;;;4396:6;;4429:11;;4389:59;;-1:-1:-1;;;4389:59:2;;4363:1;;-1:-1:-1;4396:6:2;;;;-1:-1:-1;;;;;4396:6:2;;;;4389:27;;:59;;4417:10;;4429:11;;;4442:5;;4389:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4379:69;;4004:455;4477:7;4469:50;;;;-1:-1:-1;;;4469:50:2;;44368:2:7;4469:50:2;;;44350:21:7;44407:2;44387:18;;;44380:30;44446:32;44426:18;;;44419:60;44496:18;;4469:50:2;44166:354:7;4469:50:2;4530:41;4546:7;;4530:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4555:8:2;;-1:-1:-1;4530:41:2;-1:-1:-1;4530:15:2;;-1:-1:-1;4530:41:2:i;:::-;3711:867;;3516:1062;;;;;;;:::o;10556:917::-;10746:14;;10714:4;;10778:33;;;:50;;;10815:8;10827:1;10815:13;10778:50;10770:95;;;;-1:-1:-1;;;10770:95:2;;44727:2:7;10770:95:2;;;44709:21:7;;;44746:18;;;44739:30;44805:34;44785:18;;;44778:62;44857:18;;10770:95:2;44525:356:7;10770:95:2;11019:16;;11010:97;;-1:-1:-1;;;11010:97:2;;10876:13;;;;-1:-1:-1;;;;;11019:16:2;;;;11010:40;;:97;;11051:10;;11063:21;;;;11086:20;;;;11010:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11010:97:2;;;;;;;;;;;;:::i;:::-;10971:136;;11123:6;11118:241;11133:8;11131:1;:10;11118:241;;;11158:24;11185:23;11197:7;11205:1;11197:10;;;;;;;;:::i;:::-;;;;;;;11185:11;:23::i;:::-;11158:50;;11222:17;11242:42;11264:8;11274:9;11242:21;:42::i;:::-;11222:62;-1:-1:-1;11298:18:2;11222:62;11298:18;;:::i;:::-;;;11343:3;;;;;11144:215;;11118:241;;;-1:-1:-1;15357:15:2;;15376:1;15357:20;11369:75;;11412:21;11427:5;11412:14;:21::i;:::-;11404:29;;11369:75;-1:-1:-1;11461:5:2;10556:917;-1:-1:-1;;;;;;;10556:917:2:o;3315:456:4:-;3399:17;;;;:9;:17;;;;;;;;3392:24;;;;;;;;3450:7;:15;;;;;3426:39;;;;;;;;;;;;;;;;;;;3450:15;;3426:39;3399:17;;3426:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3426:39:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3492:13:4;;3426:39;;-1:-1:-1;3475:14:4;;-1:-1:-1;;3515:218:4;3530:9;3528:1;:11;3515:218;;;3561:6;3568:1;3561:9;;;;;;;;:::i;:::-;;;;;;;:19;;;3560:20;:45;;;;;3589:16;3584:1;:21;;3560:45;3556:136;;;3662:6;3669:1;3662:9;;;;;;;;:::i;:::-;;;;;;;:15;;;3625:16;:33;3642:6;3649:1;3642:9;;;;;;;;:::i;:::-;;;;;;;:15;;;-1:-1:-1;;;;;3625:33:4;-1:-1:-1;;;;;3625:33:4;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;3556:136:4;3717:3;;3515:218;;;-1:-1:-1;3749:15:4;;;;:7;:15;;;;;3742:22;;;:::i;8241:1493:2:-;8461:18;8453:46;;;;-1:-1:-1;;;8453:46:2;;;;;;;:::i;:::-;8510:17;8529:15;8546;8563;8580:18;8602:26;8620:7;;8602:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8602:17:2;;-1:-1:-1;;;8602:26:2:i;:::-;8509:119;;;;;;;;;;8728:7;8714:21;;;;;:::i;:::-;;;8755:1;8745:11;;8842:13;8830:9;:25;8827:147;;;8883:25;8895:13;8883:9;:25;:::i;:::-;8871:38;;;;:::i;:::-;;-1:-1:-1;8937:25:2;8949:13;8937:9;:25;:::i;:::-;8923:40;;;;:::i;:::-;;;8827:147;9057:11;9047:7;:21;9044:133;;;9096:21;9106:11;9096:7;:21;:::i;:::-;9084:34;;;;:::i;:::-;;-1:-1:-1;9144:21:2;9154:11;9144:7;:21;:::i;:::-;9132:34;;;;:::i;:::-;;;9044:133;9260:11;9250:7;:21;9247:136;;;9302:21;9312:11;9302:7;:21;:::i;:::-;9287:37;;;;:::i;:::-;;-1:-1:-1;9350:21:2;9360:11;9350:7;:21;:::i;:::-;9338:34;;;;:::i;:::-;;;9247:136;9431:9;9414:13;:26;;:52;;;;;9459:7;9444:11;:22;;9414:52;:78;;;;;9485:7;9470:11;:22;;9414:78;:110;;;;;9514:10;9496:14;:28;;9414:110;9393:179;;;;-1:-1:-1;;;9393:179:2;;48028:2:7;9393:179:2;;;48010:21:7;48067:2;48047:18;;;48040:30;-1:-1:-1;;;48086:18:7;;;48079:52;48148:18;;9393:179:2;47826:346:7;9393:179:2;9592:16;;9583:92;;-1:-1:-1;;;9583:92:2;;-1:-1:-1;;;;;9592:16:2;;;;9583:39;;:92;;9623:10;;9635:9;;9646:7;;9655;;9664:10;;9583:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9685:42;9701:7;;9685:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9685:42:2;-1:-1:-1;9722:4:2;;-1:-1:-1;9685:15:2;;-1:-1:-1;9685:42:2:i;:::-;8443:1291;;;;;8241:1493;;;;;;:::o;4828:1143:5:-;4899:16;4918:19;;;:11;:19;;;;;;;;;;-1:-1:-1;;;;;4947:26:5;;;-1:-1:-1;;;;;;4947:26:5;;;;;;;4983:20;;;:14;:20;;;;;:33;;4918:19;4983:33;;;;;;;;;;;;;;;;;4918:19;5069:22;;5065:900;;-1:-1:-1;;;;;5140:24:5;;5107:30;5140:24;;;:14;:24;;;;;;;;5107:57;;;;;;;;;;;;;;;;;;;5140:24;;5107:57;;;5140:24;5107:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5192:20:5;;5107:57;;-1:-1:-1;;;5245:66:5;-1:-1:-1;5178:11:5;;-1:-1:-1;;5325:199:5;5339:3;5337:1;:5;5325:199;;;5387:6;5367:13;5381:1;5367:16;;;;;;;;:::i;:::-;;;;;;;:26;5363:112;;5428:1;5417:12;;5451:5;;5363:112;5504:3;;5325:199;;;-1:-1:-1;5597:78:5;;5589:118;;;;-1:-1:-1;;;5589:118:5;;48873:2:7;5589:118:5;;;48855:21:7;48912:2;48892:18;;;48885:30;48951:29;48931:18;;;48924:57;48998:18;;5589:118:5;48671:351:7;5589:118:5;5803:5;5807:1;5803:3;:5;:::i;:::-;5791:8;:17;5787:124;;-1:-1:-1;;;;;5865:24:5;;;;;;:14;:24;;;;;5890:5;5894:1;5890:3;:5;:::i;:::-;5865:31;;;;;;;;:::i;:::-;;;;;;;;;5828:14;:24;5843:8;-1:-1:-1;;;;;5828:24:5;-1:-1:-1;;;;;5828:24:5;;;;;;;;;;;;5853:8;5828:34;;;;;;;;:::i;:::-;;;;;;;;;;:68;5787:124;-1:-1:-1;;;;;5924:24:5;;;;;;:14;:24;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5093:872;;;5065:900;4889:1082;4828:1143;;:::o;16402:753:2:-;16462:4;16607:15;16625:46;16637:17;:15;:17::i;:::-;16656:14;;16625:11;:46::i;:::-;16879:14;;16607:64;;-1:-1:-1;16784:27:2;;575:6;16833:24;16607:64;16879:14;16833:24;:::i;:::-;16832:44;;;;:::i;:::-;:61;;;;:::i;:::-;16814:79;;575:6;16814:79;:::i;:::-;16784:109;;16939:29;16971:65;395:9;16995:19;;17016;16971:5;:65::i;:::-;16939:97;-1:-1:-1;17046:21:2;395:9;17070:29;17094:5;16939:97;17070:29;:::i;:::-;:48;;;;:::i;8920:227:4:-;8980:7;8989;9008:11;395:9:2;9038:11:4;;9030:5;:19;;;;:::i;:::-;9022:47;;;;:::i;:::-;9008:61;-1:-1:-1;9079:11:4;9101;9008:61;9101:5;:11;:::i;:::-;9079:34;9136:3;;-1:-1:-1;8920:227:4;;-1:-1:-1;;;8920:227:4:o;4584:481:2:-;4651:4;-1:-1:-1;;;;;4671:22:2;;;;:48;;-1:-1:-1;;;;;;4697:22:2;;4709:10;4697:22;4671:48;:70;;;-1:-1:-1;4724:17:2;;;;4723:18;4671:70;4667:113;;;-1:-1:-1;4764:5:2;;4584:481;-1:-1:-1;4584:481:2:o;4667:113::-;-1:-1:-1;;;;;4793:28:2;;;;;;:18;:28;;;;;;4825:1;4793:33;4789:75;;-1:-1:-1;4849:4:2;;4584:481;-1:-1:-1;4584:481:2:o;4789:75::-;-1:-1:-1;;;;;4951:24:2;;4874:17;4951:24;;;:14;:24;;;;;;;;4933:43;;;;;;;;;;;;;;;;;4874:17;;;;4933:43;;;;4951:24;;4933:43;;4951:24;4933:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:43::i;:::-;4873:103;;;;;;;;5034:23;;5019:7;5029:1;5019:11;;;;:::i;:::-;5005;:7;5015:1;5005:11;:::i;:::-;4993:23;;:9;:23;:::i;:::-;:37;;;;:::i;:::-;:64;;;4584:481;-1:-1:-1;;;;;4584:481:2:o;5071:237::-;5139:7;;;395:9;5189:21;514:6;5189:5;:21;:::i;11479:3166::-;11596:4;;;11692:13;11673:8;:15;;;:32;;;;;;;;:::i;:::-;;11669:348;;11733:12;11721:24;;11669:348;;;11794:11;11775:8;:15;;;:30;;;;;;;;:::i;:::-;;11771:246;;11833:10;11821:22;;11771:246;;;11892:11;11873:8;:15;;;:30;;;;;;;;:::i;:::-;;11869:148;;11931:10;11919:22;;11869:148;;;11981:25;;-1:-1:-1;;;11981:25:2;;42684:2:7;11981:25:2;;;42666:21:7;42723:2;42703:18;;;42696:30;-1:-1:-1;;;42742:18:7;;;42735:45;42797:18;;11981:25:2;42482:339:7;11869:148:2;12047:16;;12027:17;12119;;;12115:63;;12158:9;12151:16;;;;;;;12115:63;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12231:2231:2;12248:12;12244:1;:16;12231:2231;;;12288:9;12298:1;12288:12;;;;;;;;:::i;:::-;;;;;;;12277:23;;12318:8;:15;;;12314:2107;;;12368:17;;12353:32;;-1:-1:-1;;;;;12353:32:2;;;:::i;:::-;;;12314:2107;;;643:2;12422:8;:14;;;:45;;;:71;;;;;12471:8;:22;;;12422:71;12418:2003;;;12528:17;;12513:32;;-1:-1:-1;;;;;12513:32:2;;;:::i;12418:2003::-;643:2;12582:8;:18;;;:49;;;:79;;;;;12635:8;:26;;;12582:79;12578:1843;;;12696:17;;12681:32;;-1:-1:-1;;;;;12681:32:2;;;:::i;12578:1843::-;643:2;12750:8;:13;;;:44;;;:69;;;;;12798:8;:21;;;12750:69;12746:1675;;;12854:17;;12839:32;;-1:-1:-1;;;;;12839:32:2;;;:::i;12746:1675::-;643:2;12908:8;:16;;;:47;;;:75;;;;;12959:8;:24;;;12908:75;12904:1517;;;13018:17;;13003:32;;-1:-1:-1;;;;;13003:32:2;;;:::i;12904:1517::-;643:2;13072:8;:13;;;:44;;;:69;;;;;13120:8;:21;;;13072:69;13068:1353;;;13176:17;;13161:32;;-1:-1:-1;;;;;13161:32:2;;;:::i;13068:1353::-;643:2;13230:8;:14;;;:45;;;:71;;;;;13279:8;:22;;;13230:71;13226:1195;;;13336:17;;13321:32;;-1:-1:-1;;;;;13321:32:2;;;:::i;13226:1195::-;643:2;13390:8;:14;;;:45;;;:71;;;;;13439:8;:22;;;13390:71;13386:1035;;;13496:17;;13481:32;;-1:-1:-1;;;;;13481:32:2;;;:::i;13386:1035::-;643:2;13550:8;:14;;;:45;;;:71;;;;;13599:8;:22;;;13550:71;13546:875;;;13656:17;;13641:32;;-1:-1:-1;;;;;13641:32:2;;;:::i;13546:875::-;643:2;13710:8;:15;;;:46;;;:73;;;;;13760:8;:23;;;13710:73;13706:715;;;13818:17;;13803:32;;-1:-1:-1;;;;;13803:32:2;;;:::i;13706:715::-;643:2;13872:8;:15;;;:46;;;:73;;;;;13922:8;:23;;;13872:73;13868:553;;;13980:17;;13965:32;;-1:-1:-1;;;;;13965:32:2;;;:::i;13868:553::-;14034:8;:17;;;:22;;14055:1;14034:22;:44;;;;;14060:8;:18;;;14034:44;14030:391;;;14113:17;;14098:32;;-1:-1:-1;;;;;14098:32:2;;;:::i;14030:391::-;14167:8;:16;;;:21;;14187:1;14167:21;:42;;;;;14192:8;:17;;;14167:42;14163:258;;;14244:17;;14229:32;;-1:-1:-1;;;;;14229:32:2;;;:::i;14163:258::-;14298:8;:23;;;:28;;14325:1;14298:28;:56;;;;;14330:8;:24;;;14298:56;14294:127;;;14389:17;;14374:32;;-1:-1:-1;;;;;14374:32:2;;;:::i;:::-;;;14294:127;14446:3;;12231:2231;;;;452:7;14476:11;:27;14472:85;;;452:7;14519:27;;14472:85;395:9;14587:30;14606:11;395:9;14587:30;:::i;:::-;14574:44;;:9;:44;:::i;:::-;14573:65;;;;:::i;:::-;14566:72;11479:3166;-1:-1:-1;;;;;;;11479:3166:2:o;17161:146::-;17209:4;17246:15;17232:11;;:29;:67;;-1:-1:-1;17298:1:2;;17161:146::o;17232:67::-;17283:11;;17265:29;;:15;:29;:::i;:::-;17225:74;;17161:146;:::o;17611:200::-;17683:4;17711:5;17703;:13;17699:106;;;-1:-1:-1;17738:5:2;17731:12;;17699:106;-1:-1:-1;17789:5:2;17782:12;;17384:221;17466:7;;575:6;17542:15;17553:4;17542:8;:15;:::i;:::-;17533:4;17503:26;17521:8;575:6;17503:26;:::i;:::-;17502:35;;;;:::i;:::-;17501:57;;;;:::i;:::-;17500:77;;;;:::i;:::-;17485:93;-1:-1:-1;;17384:221:2;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;520:248:7;588:6;596;649:2;637:9;628:7;624:23;620:32;617:52;;;665:1;662;655:12;617:52;-1:-1:-1;;688:23:7;;;758:2;743:18;;;730:32;;-1:-1:-1;520:248:7:o;773:180::-;832:6;885:2;873:9;864:7;860:23;856:32;853:52;;;901:1;898;891:12;853:52;-1:-1:-1;924:23:7;;773:180;-1:-1:-1;773:180:7:o;958:118::-;1044:5;1037:13;1030:21;1023:5;1020:32;1010:60;;1066:1;1063;1056:12;1081:241;1137:6;1190:2;1178:9;1169:7;1165:23;1161:32;1158:52;;;1206:1;1203;1196:12;1158:52;1245:9;1232:23;1264:28;1286:5;1264:28;:::i;1327:472::-;1369:3;1407:5;1401:12;1434:6;1429:3;1422:19;1459:1;1469:162;1483:6;1480:1;1477:13;1469:162;;;1545:4;1601:13;;;1597:22;;1591:29;1573:11;;;1569:20;;1562:59;1498:12;1469:162;;;1649:6;1646:1;1643:13;1640:87;;;1715:1;1708:4;1699:6;1694:3;1690:16;1686:27;1679:38;1640:87;-1:-1:-1;1781:2:7;1760:15;-1:-1:-1;;1756:29:7;1747:39;;;;1788:4;1743:50;;1327:472;-1:-1:-1;;1327:472:7:o;1804:220::-;1953:2;1942:9;1935:21;1916:4;1973:45;2014:2;2003:9;1999:18;1991:6;1973:45;:::i;2221:173::-;2289:20;;-1:-1:-1;;;;;2338:31:7;;2328:42;;2318:70;;2384:1;2381;2374:12;2318:70;2221:173;;;:::o;2399:186::-;2458:6;2511:2;2499:9;2490:7;2486:23;2482:32;2479:52;;;2527:1;2524;2517:12;2479:52;2550:29;2569:9;2550:29;:::i;2590:367::-;2653:8;2663:6;2717:3;2710:4;2702:6;2698:17;2694:27;2684:55;;2735:1;2732;2725:12;2684:55;-1:-1:-1;2758:20:7;;-1:-1:-1;;;;;2790:30:7;;2787:50;;;2833:1;2830;2823:12;2787:50;2870:4;2862:6;2858:17;2846:29;;2930:3;2923:4;2913:6;2910:1;2906:14;2898:6;2894:27;2890:38;2887:47;2884:67;;;2947:1;2944;2937:12;2884:67;2590:367;;;;;:::o;2962:105::-;3041:1;3034:5;3031:12;3021:40;;3057:1;3054;3047:12;3072:587;3178:6;3186;3194;3247:2;3235:9;3226:7;3222:23;3218:32;3215:52;;;3263:1;3260;3253:12;3215:52;3303:9;3290:23;-1:-1:-1;;;;;3328:6:7;3325:30;3322:50;;;3368:1;3365;3358:12;3322:50;3407:70;3469:7;3460:6;3449:9;3445:22;3407:70;:::i;:::-;3496:8;;-1:-1:-1;3381:96:7;-1:-1:-1;;3581:2:7;3566:18;;3553:32;3594:35;3553:32;3594:35;:::i;:::-;3648:5;3638:15;;;3072:587;;;;;:::o;3872:316::-;3949:6;3957;3965;4018:2;4006:9;3997:7;3993:23;3989:32;3986:52;;;4034:1;4031;4024:12;3986:52;-1:-1:-1;;4057:23:7;;;4127:2;4112:18;;4099:32;;-1:-1:-1;4178:2:7;4163:18;;;4150:32;;3872:316;-1:-1:-1;3872:316:7:o;4193:632::-;4364:2;4416:21;;;4486:13;;4389:18;;;4508:22;;;4335:4;;4364:2;4587:15;;;;4561:2;4546:18;;;4335:4;4630:169;4644:6;4641:1;4638:13;4630:169;;;4705:13;;4693:26;;4774:15;;;;4739:12;;;;4666:1;4659:9;4630:169;;;-1:-1:-1;4816:3:7;;4193:632;-1:-1:-1;;;;;;4193:632:7:o;4830:1163::-;4997:6;5005;5013;5021;5029;5037;5045;5098:3;5086:9;5077:7;5073:23;5069:33;5066:53;;;5115:1;5112;5105:12;5066:53;5155:9;5142:23;-1:-1:-1;;;;;5225:2:7;5217:6;5214:14;5211:34;;;5241:1;5238;5231:12;5211:34;5280:70;5342:7;5333:6;5322:9;5318:22;5280:70;:::i;:::-;5369:8;;-1:-1:-1;5254:96:7;-1:-1:-1;5457:2:7;5442:18;;5429:32;;-1:-1:-1;5473:16:7;;;5470:36;;;5502:1;5499;5492:12;5470:36;5541:72;5605:7;5594:8;5583:9;5579:24;5541:72;:::i;:::-;5632:8;;-1:-1:-1;5515:98:7;-1:-1:-1;5720:2:7;5705:18;;5692:32;;-1:-1:-1;5736:16:7;;;5733:36;;;5765:1;5762;5755:12;5733:36;;5804:72;5868:7;5857:8;5846:9;5842:24;5804:72;:::i;:::-;5895:8;;-1:-1:-1;5778:98:7;-1:-1:-1;5949:38:7;;-1:-1:-1;5983:2:7;5968:18;;5949:38;:::i;:::-;5939:48;;4830:1163;;;;;;;;;;:::o;5998:127::-;6059:10;6054:3;6050:20;6047:1;6040:31;6090:4;6087:1;6080:15;6114:4;6111:1;6104:15;6130:255;6202:2;6196:9;6244:6;6232:19;;-1:-1:-1;;;;;6266:34:7;;6302:22;;;6263:62;6260:88;;;6328:18;;:::i;:::-;6364:2;6357:22;6130:255;:::o;6390:275::-;6461:2;6455:9;6526:2;6507:13;;-1:-1:-1;;6503:27:7;6491:40;;-1:-1:-1;;;;;6546:34:7;;6582:22;;;6543:62;6540:88;;;6608:18;;:::i;:::-;6644:2;6637:22;6390:275;;-1:-1:-1;6390:275:7:o;6670:183::-;6730:4;-1:-1:-1;;;;;6755:6:7;6752:30;6749:56;;;6785:18;;:::i;:::-;-1:-1:-1;6830:1:7;6826:14;6842:4;6822:25;;6670:183::o;6858:662::-;6912:5;6965:3;6958:4;6950:6;6946:17;6942:27;6932:55;;6983:1;6980;6973:12;6932:55;7019:6;7006:20;7045:4;7069:60;7085:43;7125:2;7085:43;:::i;:::-;7069:60;:::i;:::-;7163:15;;;7249:1;7245:10;;;;7233:23;;7229:32;;;7194:12;;;;7273:15;;;7270:35;;;7301:1;7298;7291:12;7270:35;7337:2;7329:6;7325:15;7349:142;7365:6;7360:3;7357:15;7349:142;;;7431:17;;7419:30;;7469:12;;;;7382;;7349:142;;;-1:-1:-1;7509:5:7;6858:662;-1:-1:-1;;;;;;6858:662:7:o;7525:348::-;7609:6;7662:2;7650:9;7641:7;7637:23;7633:32;7630:52;;;7678:1;7675;7668:12;7630:52;7718:9;7705:23;-1:-1:-1;;;;;7743:6:7;7740:30;7737:50;;;7783:1;7780;7773:12;7737:50;7806:61;7859:7;7850:6;7839:9;7835:22;7806:61;:::i;:::-;7796:71;7525:348;-1:-1:-1;;;;7525:348:7:o;7878:803::-;8040:4;8069:2;8109;8098:9;8094:18;8139:2;8128:9;8121:21;8162:6;8197;8191:13;8228:6;8220;8213:22;8266:2;8255:9;8251:18;8244:25;;8328:2;8318:6;8315:1;8311:14;8300:9;8296:30;8292:39;8278:53;;8366:2;8358:6;8354:15;8387:1;8397:255;8411:6;8408:1;8405:13;8397:255;;;8504:2;8500:7;8488:9;8480:6;8476:22;8472:36;8467:3;8460:49;8532:40;8565:6;8556;8550:13;8532:40;:::i;:::-;8522:50;-1:-1:-1;8630:12:7;;;;8595:15;;;;8433:1;8426:9;8397:255;;;-1:-1:-1;8669:6:7;;7878:803;-1:-1:-1;;;;;;;7878:803:7:o;8686:999::-;8842:6;8850;8858;8866;8874;8927:2;8915:9;8906:7;8902:23;8898:32;8895:52;;;8943:1;8940;8933:12;8895:52;8983:9;8970:23;-1:-1:-1;;;;;9053:2:7;9045:6;9042:14;9039:34;;;9069:1;9066;9059:12;9039:34;9092:61;9145:7;9136:6;9125:9;9121:22;9092:61;:::i;:::-;9082:71;;9206:2;9195:9;9191:18;9178:32;9162:48;;9235:2;9225:8;9222:16;9219:36;;;9251:1;9248;9241:12;9219:36;9290:72;9354:7;9343:8;9332:9;9328:24;9290:72;:::i;:::-;9381:8;;-1:-1:-1;9264:98:7;-1:-1:-1;9469:2:7;9454:18;;9441:32;;-1:-1:-1;9485:16:7;;;9482:36;;;9514:1;9511;9504:12;9482:36;;9553:72;9617:7;9606:8;9595:9;9591:24;9553:72;:::i;:::-;8686:999;;;;-1:-1:-1;8686:999:7;;-1:-1:-1;9644:8:7;;9527:98;8686:999;-1:-1:-1;;;8686:999:7:o;9690:711::-;9812:6;9820;9828;9836;9844;9852;9905:3;9893:9;9884:7;9880:23;9876:33;9873:53;;;9922:1;9919;9912:12;9873:53;9962:9;9949:23;-1:-1:-1;;;;;9987:6:7;9984:30;9981:50;;;10027:1;10024;10017:12;9981:50;10066:70;10128:7;10119:6;10108:9;10104:22;10066:70;:::i;:::-;10155:8;;10040:96;;-1:-1:-1;10237:2:7;10222:18;;10209:32;;10288:2;10273:18;;10260:32;;-1:-1:-1;10339:2:7;10324:18;;10311:32;;-1:-1:-1;10390:3:7;10375:19;10362:33;;-1:-1:-1;9690:711:7;-1:-1:-1;;;;9690:711:7:o;10406:658::-;10577:2;10629:21;;;10699:13;;10602:18;;;10721:22;;;10548:4;;10577:2;10800:15;;;;10774:2;10759:18;;;10548:4;10843:195;10857:6;10854:1;10851:13;10843:195;;;10922:13;;-1:-1:-1;;;;;10918:39:7;10906:52;;11013:15;;;;10978:12;;;;10954:1;10872:9;10843:195;;11069:832;11147:6;11155;11208:2;11196:9;11187:7;11183:23;11179:32;11176:52;;;11224:1;11221;11214:12;11176:52;11260:9;11247:23;11237:33;;11289:2;11342;11331:9;11327:18;11314:32;-1:-1:-1;;;;;11406:2:7;11398:6;11395:14;11392:34;;;11422:1;11419;11412:12;11392:34;11460:6;11449:9;11445:22;11435:32;;11505:7;11498:4;11494:2;11490:13;11486:27;11476:55;;11527:1;11524;11517:12;11476:55;11563:2;11550:16;11585:2;11581;11578:10;11575:36;;;11591:18;;:::i;:::-;11633:53;11676:2;11657:13;;-1:-1:-1;;11653:27:7;11649:36;;11633:53;:::i;:::-;11620:66;;11709:2;11702:5;11695:17;11749:7;11744:2;11739;11735;11731:11;11727:20;11724:33;11721:53;;;11770:1;11767;11760:12;11721:53;11825:2;11820;11816;11812:11;11807:2;11800:5;11796:14;11783:45;11869:1;11864:2;11859;11852:5;11848:14;11844:23;11837:34;;11890:5;11880:15;;;;;11069:832;;;;;:::o;11906:963::-;12056:6;12064;12072;12080;12133:2;12121:9;12112:7;12108:23;12104:32;12101:52;;;12149:1;12146;12139:12;12101:52;12189:9;12176:23;-1:-1:-1;;;;;12259:2:7;12251:6;12248:14;12245:34;;;12275:1;12272;12265:12;12245:34;12314:70;12376:7;12367:6;12356:9;12352:22;12314:70;:::i;:::-;12403:8;;-1:-1:-1;12288:96:7;-1:-1:-1;12491:2:7;12476:18;;12463:32;;-1:-1:-1;12507:16:7;;;12504:36;;;12536:1;12533;12526:12;12504:36;12574:8;12563:9;12559:24;12549:34;;12621:7;12614:4;12610:2;12606:13;12602:27;12592:55;;12643:1;12640;12633:12;12592:55;12683:2;12670:16;12709:2;12701:6;12698:14;12695:34;;;12725:1;12722;12715:12;12695:34;12783:7;12778:2;12768:6;12760;12756:19;12752:2;12748:28;12744:37;12741:50;12738:70;;;12804:1;12801;12794:12;12738:70;11906:963;;;;-1:-1:-1;;12835:2:7;12827:11;;-1:-1:-1;;;11906:963:7:o;12874:254::-;12942:6;12950;13003:2;12991:9;12982:7;12978:23;12974:32;12971:52;;;13019:1;13016;13009:12;12971:52;13055:9;13042:23;13032:33;;13084:38;13118:2;13107:9;13103:18;13084:38;:::i;:::-;13074:48;;12874:254;;;;;:::o;13972:160::-;14036:5;14081:3;14072:6;14067:3;14063:16;14059:26;14056:46;;;14098:1;14095;14088:12;14056:46;-1:-1:-1;14120:6:7;13972:160;-1:-1:-1;13972:160:7:o;14137:1614::-;14380:6;14388;14396;14404;14412;14420;14428;14436;14444;14452;14505:3;14493:9;14484:7;14480:23;14476:33;14473:53;;;14522:1;14519;14512:12;14473:53;14562:9;14549:23;-1:-1:-1;;;;;14632:2:7;14624:6;14621:14;14618:34;;;14648:1;14645;14638:12;14618:34;14687:70;14749:7;14740:6;14729:9;14725:22;14687:70;:::i;:::-;14776:8;;-1:-1:-1;14661:96:7;-1:-1:-1;14864:2:7;14849:18;;14836:32;;-1:-1:-1;14880:16:7;;;14877:36;;;14909:1;14906;14899:12;14877:36;14948:72;15012:7;15001:8;14990:9;14986:24;14948:72;:::i;:::-;15039:8;;-1:-1:-1;14922:98:7;-1:-1:-1;15127:2:7;15112:18;;15099:32;;-1:-1:-1;15143:16:7;;;15140:36;;;15172:1;15169;15162:12;15140:36;15211:72;15275:7;15264:8;15253:9;15249:24;15211:72;:::i;:::-;15302:8;;-1:-1:-1;15185:98:7;-1:-1:-1;15185:98:7;;-1:-1:-1;15356:38:7;15390:2;15375:18;;15356:38;:::i;:::-;15346:48;;15447:3;15436:9;15432:19;15419:33;15403:49;;15477:2;15467:8;15464:16;15461:36;;;15493:1;15490;15483:12;15461:36;;15532:72;15596:7;15585:8;15574:9;15570:24;15532:72;:::i;:::-;15623:8;;-1:-1:-1;15506:98:7;-1:-1:-1;15677:68:7;;-1:-1:-1;15737:7:7;15731:3;15716:19;;15677:68;:::i;:::-;15667:78;;14137:1614;;;;;;;;;;;;;:::o;15756:961::-;15973:2;16025:21;;;16095:13;;15998:18;;;16117:22;;;15944:4;;15973:2;16158;;16176:18;;;;16217:15;;;15944:4;16260:431;16274:6;16271:1;16268:13;16260:431;;;16333:13;;16375:9;;-1:-1:-1;;;;;16371:35:7;16359:48;;16447:11;;;16441:18;16427:12;;;16420:40;16500:11;;;16494:18;16480:12;;;16473:40;16536:4;16594:11;;;16588:18;16581:26;16574:34;16560:12;;;16553:56;16638:4;16629:14;;;;16666:15;;;;16403:1;16289:9;16260:431;;;-1:-1:-1;16708:3:7;;15756:961;-1:-1:-1;;;;;;;15756:961:7:o;16722:339::-;16818:6;16826;16870:9;16861:7;16857:23;16900:3;16896:2;16892:12;16889:32;;;16917:1;16914;16907:12;16889:32;16940:23;;;-1:-1:-1;16997:3:7;-1:-1:-1;;16979:16:7;;16975:26;16972:46;;;17014:1;17011;17004:12;16972:46;;17052:2;17041:9;17037:18;17027:28;;16722:339;;;;;:::o;17146:127::-;17207:10;17202:3;17198:20;17195:1;17188:31;17238:4;17235:1;17228:15;17262:4;17259:1;17252:15;17278:137;17356:1;17349:5;17346:12;17336:46;;17362:18;;:::i;:::-;17391;;17278:137::o;17420:138::-;17499:1;17492:5;17489:12;17479:46;;17505:18;;:::i;17563:2063::-;17779:13;;17133:4;17122:16;17110:29;;17749:3;17734:19;;17851:4;17843:6;17839:17;17833:24;17866:52;17912:4;17901:9;17897:20;17883:12;17133:4;17122:16;17110:29;;17066:75;17866:52;;17967:4;17959:6;17955:17;17949:24;17982:54;18030:4;18019:9;18015:20;17999:14;17133:4;17122:16;17110:29;;17066:75;17982:54;;18085:4;18077:6;18073:17;18067:24;18100:54;18148:4;18137:9;18133:20;18117:14;17133:4;17122:16;17110:29;;17066:75;18100:54;;18203:4;18195:6;18191:17;18185:24;18218:54;18266:4;18255:9;18251:20;18235:14;17133:4;17122:16;17110:29;;17066:75;18218:54;;18321:4;18313:6;18309:17;18303:24;18336:54;18384:4;18373:9;18369:20;18353:14;17133:4;17122:16;17110:29;;17066:75;18336:54;;18439:4;18431:6;18427:17;18421:24;18454:54;18502:4;18491:9;18487:20;18471:14;17133:4;17122:16;17110:29;;17066:75;18454:54;;18557:4;18549:6;18545:17;18539:24;18572:54;18620:4;18609:9;18605:20;18589:14;17133:4;17122:16;17110:29;;17066:75;18572:54;-1:-1:-1;18645:6:7;18688:15;;;18682:22;17133:4;17122:16;;;18746:18;;;17110:29;;;;18784:6;18827:15;;;18821:22;17122:16;;18885:18;;;17110:29;18923:6;18966:15;;;18960:22;17122:16;;19024:18;;;17110:29;19062:6;19106:15;;;19100:22;17122:16;;19165:18;;;17110:29;19203:6;19247:15;;;19241:22;17122:16;;;19306:18;;;17110:29;19344:6;19388:15;;;19382:22;19413:59;19453:18;;;19382:22;19413:59;:::i;:::-;;;19491:6;19547:2;19539:6;19535:15;19529:22;19560:60;19616:2;19605:9;19601:18;19584:15;19560:60;:::i;:::-;;;17563:2063;;;;:::o;19631:340::-;19833:2;19815:21;;;19872:2;19852:18;;;19845:30;-1:-1:-1;;;19906:2:7;19891:18;;19884:46;19962:2;19947:18;;19631:340::o;22045:184::-;22115:6;22168:2;22156:9;22147:7;22143:23;22139:32;22136:52;;;22184:1;22181;22174:12;22136:52;-1:-1:-1;22207:16:7;;22045:184;-1:-1:-1;22045:184:7:o;22583:375::-;-1:-1:-1;;;;;22841:15:7;;;22823:34;;22893:15;;;;22888:2;22873:18;;22866:43;22940:2;22925:18;;22918:34;;;;22773:2;22758:18;;22583:375::o;22963:132::-;23039:13;;23061:28;23039:13;23061:28;:::i;23100:245::-;23167:6;23220:2;23208:9;23199:7;23195:23;23191:32;23188:52;;;23236:1;23233;23226:12;23188:52;23268:9;23262:16;23287:28;23309:5;23287:28;:::i;23350:351::-;23552:2;23534:21;;;23591:2;23571:18;;;23564:30;23630:29;23625:2;23610:18;;23603:57;23692:2;23677:18;;23350:351::o;23706:380::-;23785:1;23781:12;;;;23828;;;23849:61;;23903:4;23895:6;23891:17;23881:27;;23849:61;23956:2;23948:6;23945:14;23925:18;23922:38;23919:161;;24002:10;23997:3;23993:20;23990:1;23983:31;24037:4;24034:1;24027:15;24065:4;24062:1;24055:15;24370:339;24572:2;24554:21;;;24611:2;24591:18;;;24584:30;-1:-1:-1;;;24645:2:7;24630:18;;24623:45;24700:2;24685:18;;24370:339::o;24714:299::-;-1:-1:-1;;;;;24915:32:7;;24897:51;;24885:2;24870:18;;24957:50;25003:2;24988:18;;24980:6;24957:50;:::i;25376:127::-;25437:10;25432:3;25428:20;25425:1;25418:31;25468:4;25465:1;25458:15;25492:4;25489:1;25482:15;25508:128;25548:3;25579:1;25575:6;25572:1;25569:13;25566:39;;;25585:18;;:::i;:::-;-1:-1:-1;25621:9:7;;25508:128::o;25987:513::-;-1:-1:-1;;;;;26288:32:7;;;;26270:51;;26352:2;26337:18;;26330:34;;;;26395:2;26380:18;;26373:34;;;;26438:2;26423:18;;26416:34;26481:3;26466:19;;26459:35;26257:3;26242:19;;25987:513::o;29823:342::-;30025:2;30007:21;;;30064:2;30044:18;;;30037:30;-1:-1:-1;;;30098:2:7;30083:18;;30076:48;30156:2;30141:18;;29823:342::o;30170:346::-;30372:2;30354:21;;;30411:2;30391:18;;;30384:30;-1:-1:-1;;;30445:2:7;30430:18;;30423:52;30507:2;30492:18;;30170:346::o;31935:127::-;31996:10;31991:3;31987:20;31984:1;31977:31;32027:4;32024:1;32017:15;32051:4;32048:1;32041:15;32067:334;32269:2;32251:21;;;32308:2;32288:18;;;32281:30;-1:-1:-1;;;32342:2:7;32327:18;;32320:40;32392:2;32377:18;;32067:334::o;33123:198::-;33166:11;33218:3;33205:17;33262:4;33255:5;33251:16;33244:5;33241:27;33231:55;;33282:1;33279;33272:12;35939:184;35988:11;36040:3;36027:17;36053:35;36082:5;36053:35;:::i;36128:265::-;36240:1;36233:5;36230:12;36220:46;;36246:18;;:::i;:::-;36285:11;;-1:-1:-1;;;;36321:27:7;36375:3;36354:15;;;;-1:-1:-1;;;36350:35:7;36318:68;;;;36305:82;;36128:265::o;36398:190::-;36448:11;36500:3;36487:17;36533:1;36526:5;36523:12;36513:40;;36549:1;36546;36539:12;36593:267;36707:1;36700:5;36697:12;36687:46;;36713:18;;:::i;:::-;36752:11;;-1:-1:-1;;;;36788:27:7;36842:3;36821:15;;;;-1:-1:-1;;;36817:35:7;36785:68;;;;36772:82;;36593:267::o;36865:1719::-;37004:85;37056:32;37082:5;37056:32;:::i;:::-;33428:11;;-1:-1:-1;;33424:26:7;33463:4;33452:16;;;;33421:48;33408:62;;33326:150;37004:85;37098:94;37150:41;37187:2;37180:5;37176:14;37150:41;:::i;:::-;33573:11;;-1:-1:-1;;33609:19:7;33638:1;33634:13;;;;33649:5;33630:25;33606:50;33593:64;;33481:182;37098:94;37201;37253:41;37290:2;37283:5;37279:14;37253:41;:::i;:::-;33760:11;;-1:-1:-1;;33796:22:7;33828:2;33824:14;;;;33840:8;33820:29;33793:57;33780:71;;33668:189;37201:94;37304:92;37354:41;37391:2;37384:5;37380:14;37354:41;:::i;:::-;33952:11;;-1:-1:-1;;33988:24:7;34022:2;34018:14;;;;34034:10;34014:31;33985:61;33972:75;;33862:191;37304:92;37405:95;37457:42;37494:3;37487:5;37483:15;37457:42;:::i;:::-;34150:11;;-1:-1:-1;;34186:26:7;34222:2;34218:14;;;;34234:12;34214:33;34183:65;34170:79;;34058:197;37405:95;37509;37561:42;37598:3;37591:5;37587:15;37561:42;:::i;:::-;34352:11;;-1:-1:-1;;34388:28:7;34426:2;34422:14;;;;34438;34418:35;34385:69;34372:83;;34260:201;37509:95;37613;37665:42;37702:3;37695:5;37691:15;37665:42;:::i;:::-;34558:11;;-1:-1:-1;;34594:30:7;34634:2;34630:14;;;;34646:16;34626:37;34591:73;34578:87;;34466:205;37613:95;37717;37769:42;37806:3;37799:5;37795:15;37769:42;:::i;:::-;34768:11;;-1:-1:-1;;34804:32:7;34846:2;34842:14;;;;34858:18;34838:39;34801:77;34788:91;;34676:209;37717:95;37821;37873:42;37910:3;37903:5;37899:15;37873:42;:::i;:::-;34982:11;;-1:-1:-1;;35018:34:7;35062:2;35058:14;;;;35074:20;35054:41;35015:81;35002:95;;34890:213;37821:95;37925;37977:42;38014:3;38007:5;38003:15;37977:42;:::i;:::-;35200:11;;-1:-1:-1;;35236:36:7;35282:2;35278:14;;;;35294:22;35274:43;35233:85;35220:99;;35108:217;37925:95;38029:96;38082:42;38119:3;38112:5;38108:15;38082:42;:::i;:::-;38076:4;35423:11;;-1:-1:-1;;;;35459:26:7;35511:2;35491:14;;;;-1:-1:-1;;;35487:33:7;35456:65;;;;35443:79;;35330:198;38029:96;38134;38187:42;38224:3;38217:5;38213:15;38187:42;:::i;:::-;38181:4;35626:11;;-1:-1:-1;;;;35662:26:7;35714:2;35694:14;;;;-1:-1:-1;;;35690:33:7;35659:65;;;;35646:79;;35533:198;38134:96;38239;38292:42;38329:3;38322:5;38318:15;38292:42;:::i;:::-;38286:4;35829:11;;-1:-1:-1;;;;35865:26:7;35917:2;35897:14;;;;-1:-1:-1;;;35893:33:7;35862:65;;;;35849:79;;35736:198;38239:96;38344:111;38406:48;38449:3;38442:5;38438:15;38406:48;:::i;:::-;38400:4;38344:111;:::i;:::-;38464:114;38528:49;38572:3;38565:5;38561:15;38528:49;:::i;:::-;38522:4;38464:114;:::i;:::-;;;36865:1719::o;43186:354::-;43274:19;;;43256:3;-1:-1:-1;;;;;43305:31:7;;43302:51;;;43349:1;43346;43339:12;43302:51;43385:6;43382:1;43378:14;43437:8;43430:5;43423:4;43418:3;43414:14;43401:45;43514:1;43469:18;;43489:4;43465:29;43503:13;;;-1:-1:-1;43465:29:7;;43186:354;-1:-1:-1;;43186:354:7:o;43545:616::-;-1:-1:-1;;;;;43850:32:7;;43832:51;;43919:2;43914;43899:18;;43892:30;;;-1:-1:-1;;43945:73:7;;43999:18;;43991:6;43983;43945:73;:::i;:::-;44066:9;44058:6;44054:22;44049:2;44038:9;44034:18;44027:50;44094:61;44148:6;44140;44132;44094:61;:::i;:::-;44086:69;43545:616;-1:-1:-1;;;;;;;;43545:616:7:o;44886:192::-;44965:13;;-1:-1:-1;;;;;45007:46:7;;44997:57;;44987:85;;45068:1;45065;45058:12;45083:2608;45204:6;45235:2;45278;45266:9;45257:7;45253:23;45249:32;45246:52;;;45294:1;45291;45284:12;45246:52;45327:9;45321:16;-1:-1:-1;;;;;45352:6:7;45349:30;45346:50;;;45392:1;45389;45382:12;45346:50;45415:22;;45468:4;45460:13;;45456:27;-1:-1:-1;45446:55:7;;45497:1;45494;45487:12;45446:55;45526:2;45520:9;45549:60;45565:43;45605:2;45565:43;:::i;45549:60::-;45643:15;;;45705:6;45746:11;;;45738:20;;45734:29;;;45674:12;;;;45631:3;45775:19;;;45772:39;;;45807:1;45804;45797:12;45772:39;45831:11;;;;45851:1810;45867:6;45862:3;45859:15;45851:1810;;;45947:2;45941:3;45932:7;45928:17;45924:26;45921:116;;;45991:1;46020:2;46016;46009:14;45921:116;46063:22;;:::i;:::-;46112:34;46142:3;46112:34;:::i;:::-;46105:5;46098:49;46183:40;46219:2;46214:3;46210:12;46183:40;:::i;:::-;46178:2;46171:5;46167:14;46160:64;46247:2;46285:40;46321:2;46316:3;46312:12;46285:40;:::i;:::-;46269:14;;;46262:64;46349:2;46387:40;46414:12;;;46387:40;:::i;:::-;46371:14;;;46364:64;46451:3;46490:40;46517:12;;;46490:40;:::i;:::-;46474:14;;;46467:64;46554:3;46593:40;46620:12;;;46593:40;:::i;:::-;46577:14;;;46570:64;46658:3;46698:41;46725:13;;;46698:41;:::i;:::-;46681:15;;;46674:66;46764:3;46804:41;46831:13;;;46804:41;:::i;:::-;46787:15;;;46780:66;46870:3;46910:41;46937:13;;;46910:41;:::i;:::-;46893:15;;;46886:66;46976:3;47016:41;47043:13;;;47016:41;:::i;:::-;46999:15;;;46992:66;47082:3;47122:41;47149:13;;;47122:41;:::i;:::-;47105:15;;;47098:66;47188:3;47228:41;47255:13;;;47228:41;:::i;:::-;47211:15;;;47204:66;47294:3;47334:41;47361:13;;;47334:41;:::i;:::-;47317:15;;;47310:66;47400:3;47440:41;47467:13;;;47440:41;:::i;:::-;47423:15;;;47416:66;47506:3;47546:41;47573:13;;;47546:41;:::i;:::-;47529:15;;;47522:66;47601:18;;45884:12;;;;47639;;;;45851:1810;;47696:125;47736:4;47764:1;47761;47758:8;47755:34;;;47769:18;;:::i;:::-;-1:-1:-1;47806:9:7;;47696:125::o;49027:127::-;49088:10;49083:3;49079:20;49076:1;49069:31;49119:4;49116:1;49109:15;49143:4;49140:1;49133:15;49159:168;49199:7;49265:1;49261;49257:6;49253:14;49250:1;49247:21;49242:1;49235:9;49228:17;49224:45;49221:71;;;49272:18;;:::i;:::-;-1:-1:-1;49312:9:7;;49159:168::o;49332:217::-;49372:1;49398;49388:132;;49442:10;49437:3;49433:20;49430:1;49423:31;49477:4;49474:1;49467:15;49505:4;49502:1;49495:15;49388:132;-1:-1:-1;49534:9:7;;49332:217::o

Swarm Source

ipfs://f97f949cc6fedde5d9324c2689c16fb55fa6d9c5b5cd43255fefddfb519f0aad
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.