ETH Price: $3,272.29 (-4.05%)
Gas: 16 Gwei

C86 Cyborg (C86)
 

Overview

TokenID

4340

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Cyborg 86 is a collection of 8,600 Cyborg NFTs living on the Ethereum blockchain. C86 Cyborg are chillin in our entrepreneur Metaverse club.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Cyborg86

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 16: Cyborg86.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;

import "./ERC721.sol";
import "./Ownable.sol";
import "./PaymentSplitter.sol";
import "./ReentrancyGuard.sol";
import "./Strings.sol";


contract Cyborg86 is ERC721, Ownable, PaymentSplitter, ReentrancyGuard {
    using Strings for uint256;

    enum WorkflowStatus {
        Before,
        FirstSale,
        SecondSale,
        Sale,
        SoldOut,
        Reveal
    }

    struct GiveawayWallet {
        address recipient;
        bool eligible;
        uint[] claimableIds;
        bool minted;
    }

    string internal baseTokenURI;
    string internal unrevealedURI;
    string internal uriSuffix = ".json";

    uint nonce = 0;
    bool public firstSaleActive = false;
    bool public secondSaleActive = false;
    bool public saleActive = false;
    bool internal revealed = false;
    uint public totalSupply = 8600;
    uint public price = 0.25 ether;
    uint public whitelistPrice = 0.22 ether;
    uint public whitelist2Price = 0.25 ether;
    uint public maxMintPublic = 100;
    uint public maxMintFirst = 10;
    uint public maxMintSecond = 8;

    WorkflowStatus public workflow;

    address[] private _team = [0x486992EC99a2e81875E7feC7FAa170dEDF2497Dc, 0x9Fe16f720bF0447C9EcFeB6F1f6d7d5893996519];
    uint256[] private _teamShares = [2, 98];

    mapping(address => bool) public whitelist1Wallets;
    mapping(address => bool) public whitelist2Wallets;

    mapping(address => uint256) public mintPublicSale;
    mapping(address => uint256) public mintWhitelist1;
    mapping(address => uint256) public mintWhitelist2;

    GiveawayWallet[] public giveawayWallets;
    mapping(uint256 => bool) public reservedTokensGiveaway;

    event WorkflowStatusChange(WorkflowStatus previousStatus, WorkflowStatus newStatus);
    event Mint(address owner, uint qty);
    event MintFirstSale(address owner, uint qty);
    event MintSecondSale(address owner, uint qty);
    event Giveaway(address to, uint qty);
    event Withdraw(uint amount);


    constructor() ERC721("C86 Cyborg", "C86") PaymentSplitter(_team, _teamShares) {
        workflow = WorkflowStatus.Before;
    }

    function setPrice(uint newPrice) external onlyOwner {
        price = newPrice;
    }

    function setWhitelistPrice(uint newPrice) external onlyOwner {
        whitelistPrice = newPrice;
    }

    function setWhitelist2Price(uint newPrice) external onlyOwner {
        whitelist2Price = newPrice;
    }

    function setTotalSupply(uint newSupply) external onlyOwner {
        totalSupply = newSupply;
    }

    function setSaleActive(bool val) public onlyOwner {
        require(!firstSaleActive, "Cyborg86: First sale still running");
        require(!secondSaleActive, "Cyborg86: second sale still running");
        saleActive = val;
        workflow = WorkflowStatus.Sale;

        emit WorkflowStatusChange(WorkflowStatus.SecondSale, WorkflowStatus.Sale);
    }

    function setFirstSaleActive(bool val) public onlyOwner {
        require(!saleActive, "Cyborg86: Sale already running");
        require(!secondSaleActive, "Cyborg86: Second sale already running");
        firstSaleActive = val;
        workflow = WorkflowStatus.FirstSale;

        emit WorkflowStatusChange(WorkflowStatus.Before, WorkflowStatus.FirstSale);
    }

    function setSecondSaleActive(bool val) public onlyOwner {
        require(!firstSaleActive, "Cyborg86: First sale still running");
        require(!saleActive, "Cyborg86: Sale already running");
        secondSaleActive = val;
        workflow = WorkflowStatus.SecondSale;

        emit WorkflowStatusChange(WorkflowStatus.FirstSale, WorkflowStatus.SecondSale);
    }

    function addGiveawayWallet(address[] memory _a, uint[][] memory _ids) public onlyOwner {
        require(_a.length == _ids.length, "Cyborg86: Different parameters length");

        for(uint256 i; i < _a.length; i++) {
            GiveawayWallet memory wallet = GiveawayWallet(_a[i], true, _ids[i], false);
            giveawayWallets.push(wallet);
            for(uint256 j; j < _ids[i].length; j++) {
                reservedTokensGiveaway[_ids[i][j]] = true;
            }
        }
    }

    function removeAllGiveawayWallets() public onlyOwner {
        for(uint256 i = 0; i < giveawayWallets.length; i++) {
            for(uint256 j = 0; j < giveawayWallets[i].claimableIds.length; j++) {
                delete reservedTokensGiveaway[giveawayWallets[i].claimableIds[j]];
            }
        }
        delete giveawayWallets;
    }

    function addWalletsToFirstWhitelist(address[] memory _a) public onlyOwner {
        for(uint256 i; i < _a.length; i++){
            whitelist1Wallets[_a[i]] = true;
        }
    }

    function removeWalletsFromFirstWhitelist(address[] memory _a) public onlyOwner {
        for(uint256 i; i < _a.length; i++){
            whitelist1Wallets[_a[i]] = false;
        }
    }

    function addWalletsToSecondWhitelist(address[] memory _a) public onlyOwner {
        for(uint256 i; i < _a.length; i++){
            whitelist2Wallets[_a[i]] = true;
        }
    }

    function removeWalletsFromSecondWhitelist(address[] memory _a) public onlyOwner {
        for(uint256 i; i < _a.length; i++){
            whitelist2Wallets[_a[i]] = false;
        }
    }

    function setMaxPublicMint(uint newMax) external onlyOwner {
        maxMintPublic = newMax;
    }

    function setMaxFirstMint(uint newMax) external onlyOwner {
        maxMintFirst = newMax;
    }

    function setMaxSecondMint(uint newMax) external onlyOwner {
        maxMintSecond = newMax;
    }

    function getAssetsByOwner(address _owner) public view returns(uint[] memory) {
        uint[] memory result = new uint[](balanceOf(_owner));
        uint counter = 0;

        for (uint i = 1; i <= nonce; i++) {
            if (_exists(i)) {
                if (ownerOf(i) == _owner) {
                    result[counter] = i;
                    counter++;
                }
            }
        }
        return result;
    }

    function getMyAssets() external view returns(uint[] memory){
        return getAssetsByOwner(tx.origin);
    }

    function _baseURI() internal override view returns (string memory) {
        return baseTokenURI;
    }

    function getCountGiveawayWallet() public view returns(uint) {
       return giveawayWallets.length;
    }

    function getGiveawayWallet(address _a) public view returns(GiveawayWallet memory) {
        GiveawayWallet memory wallet;
        for (uint i = 0; i < giveawayWallets.length; i++) {
            if (giveawayWallets[i].recipient == _a) {
                wallet = giveawayWallets[i];
                break;
            }
        }

        return wallet;
    }

    function setGiveawayWalletMinted(address _a) private {
        for(uint i = 0; i < giveawayWallets.length; i++){
            if(giveawayWallets[i].recipient == _a) {
                giveawayWallets[i].minted = true;
            }
        }
    }

    function giveaway() external nonReentrant {
        GiveawayWallet memory wallet = getGiveawayWallet(msg.sender);
        require(wallet.eligible, "Cyborg86: Not eligible to giveaway");
        require(!wallet.minted, "Cyborg86: Already claimed");

        for(uint i = 0; i < wallet.claimableIds.length; i++){
            if (!_exists(wallet.claimableIds[i])) {
                _safeMint(msg.sender, wallet.claimableIds[i]);
            }
        }
        setGiveawayWalletMinted(msg.sender);
    }

    function getSumQtyReservedTokens(uint qty) internal view returns(uint) {
        uint count = 0;
        for(uint i = 1; i + count <= qty; i++) {
            if (reservedTokensGiveaway[nonce+i]) {
                count++;
            }
        }
        return count + qty;
    }

    function buy(uint qty) external payable nonReentrant {
        uint256 sumQtyReserved = getSumQtyReservedTokens(qty);
        require(saleActive || firstSaleActive || secondSaleActive , "TRANSACTION: No sale active");
        require(sumQtyReserved + nonce <= totalSupply, "SUPPLY: Value exceeds totalSupply");

        if (workflow == WorkflowStatus.FirstSale) {
            _mintFirstSale(qty);
        } else if (workflow == WorkflowStatus.SecondSale) {
            _mintSecondSale(qty);
        } else if (workflow == WorkflowStatus.Sale) {
            require(saleActive, "TRANSACTION: Sale is not active");
            require(msg.value == price * qty, "PAYMENT: invalid value");
            require(mintPublicSale[msg.sender] + qty <= maxMintPublic, "PUBLIC SALE: Max 100 mint");
            mintPublicSale[msg.sender] += qty;

            for(uint i = 0; i < qty; i++){
                nonce++;
                while(reservedTokensGiveaway[nonce] || _exists(nonce)) {
                    nonce++;
                }
                _safeMint(msg.sender, nonce);
            }
            emit Mint(msg.sender, qty);
        }
    }

    function _mintFirstSale(uint qty) private {
        require(msg.value == whitelistPrice * qty, "PAYMENT: invalid value");
        require(whitelist1Wallets[msg.sender], "FIRST SALE: Sender not allowed");
        require(mintWhitelist1[msg.sender] + qty <= maxMintFirst, "FIRST SALE: Max 10 mint");
        mintWhitelist1[msg.sender] += qty;

        for(uint i = 0; i < qty; i++){
            nonce++;
            while(reservedTokensGiveaway[nonce] || _exists(nonce)) {
                nonce++;
            }
            _safeMint(msg.sender, nonce);
        }
        emit MintFirstSale(msg.sender, qty);
    }

    function _mintSecondSale(uint qty) private {
        require(secondSaleActive, "TRANSACTION: Second sale is not active");
        require(msg.value == whitelist2Price * qty, "PAYMENT: invalid value");
        require(whitelist2Wallets[msg.sender], "SECOND SALE: Sender not allowed");
        require(mintWhitelist2[msg.sender] + qty <= maxMintSecond, "SECOND SALE: Max 8 mint");
        mintWhitelist2[msg.sender] += qty;

        for(uint i = 0; i < qty; i++){
            nonce++;
            while(reservedTokensGiveaway[nonce] || _exists(nonce)) {
                nonce++;
            }
            _safeMint(msg.sender, nonce);
        }
        emit MintSecondSale(msg.sender, qty);
    }

    /**
    @dev Base URI setter
     */
    function _setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseTokenURI = _newBaseURI;
    }

    function _setUnrevealedURI(string memory _newUnrevealedURI) public onlyOwner {
        unrevealedURI = _newUnrevealedURI;
    }

    function _setURISuffix(string memory _newUriSuffix) public onlyOwner {
        uriSuffix = _newUriSuffix;
    }

    function setRevealed(bool isRevealed) external onlyOwner {
        revealed = isRevealed;
        if (isRevealed) {
            emit WorkflowStatusChange(WorkflowStatus.SoldOut, WorkflowStatus.Reveal);
        }
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
              return bytes(unrevealedURI).length > 0
                ? string(abi.encodePacked(unrevealedURI, tokenId.toString(), uriSuffix))
                : "";
        }

        string memory base = _baseURI();
        return
            bytes(base).length > 0
                ? string(abi.encodePacked(base, tokenId.toString(), uriSuffix))
                : "";
    }
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 16: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 16: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 5 of 16: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 6 of 16: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 7 of 16: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 8 of 16: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 9 of 16: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 10 of 16: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 11 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 16: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 13 of 16: PaymentSplitter.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;

import "./SafeERC20.sol";
import "./Address.sol";
import "./Context.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

File 14 of 16: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 15 of 16: SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 16 of 16: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"Giveaway","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"MintFirstSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"MintSecondSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum Cyborg86.WorkflowStatus","name":"previousStatus","type":"uint8"},{"indexed":false,"internalType":"enum Cyborg86.WorkflowStatus","name":"newStatus","type":"uint8"}],"name":"WorkflowStatusChange","type":"event"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"_setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUriSuffix","type":"string"}],"name":"_setURISuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUnrevealedURI","type":"string"}],"name":"_setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_a","type":"address[]"},{"internalType":"uint256[][]","name":"_ids","type":"uint256[][]"}],"name":"addGiveawayWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_a","type":"address[]"}],"name":"addWalletsToFirstWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_a","type":"address[]"}],"name":"addWalletsToSecondWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"firstSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getAssetsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCountGiveawayWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_a","type":"address"}],"name":"getGiveawayWallet","outputs":[{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"eligible","type":"bool"},{"internalType":"uint256[]","name":"claimableIds","type":"uint256[]"},{"internalType":"bool","name":"minted","type":"bool"}],"internalType":"struct Cyborg86.GiveawayWallet","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMyAssets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"giveawayWallets","outputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"eligible","type":"bool"},{"internalType":"bool","name":"minted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintFirst","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintWhitelist1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintWhitelist2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeAllGiveawayWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_a","type":"address[]"}],"name":"removeWalletsFromFirstWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_a","type":"address[]"}],"name":"removeWalletsFromSecondWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reservedTokensGiveaway","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setFirstSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxFirstMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxSecondMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isRevealed","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setSecondSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWhitelist2Price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWhitelistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist1Wallets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelist2Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist2Wallets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"workflow","outputs":[{"internalType":"enum Cyborg86.WorkflowStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526005608081905264173539b7b760d91b60a0908152620000289160119190620005c3565b5060006012556013805463ffffffff191690556121986014556703782dace9d90000601581905567030d98d59a9600006016556017556064601855600a6019556008601a556040805180820190915273486992ec99a2e81875e7fec7faa170dedf2497dc8152739fe16f720bf0447c9ecfeb6f1f6d7d58939965196020820152620000b890601c90600262000652565b5060408051808201909152600280825260626020830152620000dd91601d91620006aa565b50348015620000eb57600080fd5b50601c8054806020026020016040519081016040528092919081815260200182805480156200014457602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000125575b5050505050601d8054806020026020016040519081016040528092919081815260200182805480156200019757602002820191906000526020600020905b81548152602001906001019080831162000182575b5050604080518082018252600a815269433836204379626f726760b01b602080830191825283518085019094526003845262219c1b60e91b908401528151919550919350620001eb925060009190620005c3565b50805162000201906001906020840190620005c3565b5050506200021e620002186200037f60201b60201c565b62000383565b8051825114620002905760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620002e35760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000287565b60005b82518110156200036757620003528382815181106200031557634e487b7160e01b600052603260045260246000fd5b60200260200101518383815181106200033e57634e487b7160e01b600052603260045260246000fd5b6020026020010151620003d560201b60201c565b806200035e816200075c565b915050620002e6565b50506001600e5550601b805460ff1916905562000790565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004425760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000287565b60008111620004945760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000287565b6001600160a01b03821660009081526009602052604090205415620005105760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000287565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03841690811790915560009081526009602052604090208190556007546200057a90829062000704565b600755604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b828054620005d1906200071f565b90600052602060002090601f016020900481019282620005f5576000855562000640565b82601f106200061057805160ff191683800117855562000640565b8280016001018555821562000640579182015b828111156200064057825182559160200191906001019062000623565b506200064e929150620006ed565b5090565b82805482825590600052602060002090810192821562000640579160200282015b828111156200064057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000673565b82805482825590600052602060002090810192821562000640579160200282015b8281111562000640578251829060ff16905591602001919060010190620006cb565b5b808211156200064e5760008155600101620006ee565b600082198211156200071a576200071a6200077a565b500190565b600181811c908216806200073457607f821691505b602082108114156200075657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200077357620007736200077a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6148b980620007a06000396000f3fe6080604052600436106103fe5760003560e01c80637a6eeb9311610213578063b88d4fde11610123578063e33b7de3116100ab578063f2fde38b1161007a578063f2fde38b14610d18578063f7ea7a3d14610d38578063f9850b7214610d58578063fc1a1c3614610d6d578063fe3eee2e14610d8357600080fd5b8063e33b7de314610c8f578063e59a5d6314610ca4578063e985e9c514610cb9578063ef9b63ba14610d0257600080fd5b8063d4377986116100f2578063d437798614610bd9578063d79779b214610bf9578063d96a094a14610c2f578063dab0271c14610c42578063e0a8085314610c6f57600080fd5b8063b88d4fde14610b33578063c87b56dd14610b53578063cd0f5e6d14610b73578063ce7c2ac214610ba357600080fd5b80639379956a116101a6578063a035b1fe11610175578063a035b1fe14610aaa578063a22cb46514610ac0578063a334412514610ae0578063aa9a508c14610b07578063b51f760d14610b1d57600080fd5b80639379956a14610a1357806395d89b4114610a3f5780639852595c14610a545780639b0702ee14610a8a57600080fd5b80638cb97186116101e25780638cb97186146109955780638da5cb5b146109b55780638dad238d146109d357806391b7f5ed146109f357600080fd5b80637a6eeb93146108f4578063841718a61461090e5780638ad8206c1461092e5780638b83209b1461097557600080fd5b80633fb3aac31161030e578063537e330d116102a157806368428a1b1161027057806368428a1b1461085f578063709548bd1461087f57806370a082311461089f578063715018a6146108bf578063717d57d3146108d457600080fd5b8063537e330d146107c2578063561f814a146107f25780635b57d4061461081f5780636352211e1461083f57600080fd5b806344ecd626116102dd57806344ecd6261461074d57806345bca29f1461076d57806347002d1d1461078d57806348b75044146107a257600080fd5b80633fb3aac3146106a7578063406072a9146106c757806342842e0e1461070d5780634348da161461072d57600080fd5b806318160ddd11610391578063270ab52c11610360578063270ab52c1461060f578063276f09341461062f5780632a0090df1461065c57806331b5b907146106725780633a98ef391461069257600080fd5b806318160ddd1461059957806319165587146105af57806323b872dd146105cf578063251e6ac2146105ef57600080fd5b80630bd32380116103cd5780630bd32380146104fd5780630cb9f5b91461052a578063129ccded1461054a5780631517f2ec1461057a57600080fd5b806301ffc9a71461044c57806306fdde0314610481578063081812fc146104a3578063095ea7b3146104db57600080fd5b36610447577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561045857600080fd5b5061046c610467366004614198565b610da2565b60405190151581526020015b60405180910390f35b34801561048d57600080fd5b50610496610df4565b604051610478919061445b565b3480156104af57600080fd5b506104c36104be366004614228565b610e86565b6040516001600160a01b039091168152602001610478565b3480156104e757600080fd5b506104fb6104f6366004613fd2565b610f13565b005b34801561050957600080fd5b5061051d610518366004613e94565b611029565b6040516104789190614649565b34801561053657600080fd5b506104fb6105453660046141e2565b6111a6565b34801561055657600080fd5b5061046c610565366004613e94565b601e6020526000908152604090205460ff1681565b34801561058657600080fd5b506023545b604051908152602001610478565b3480156105a557600080fd5b5061058b60145481565b3480156105bb57600080fd5b506104fb6105ca366004613e94565b6111e7565b3480156105db57600080fd5b506104fb6105ea366004613ee8565b611315565b3480156105fb57600080fd5b506104fb61060a366004614228565b611346565b34801561061b57600080fd5b506104fb61062a366004614228565b611375565b34801561063b57600080fd5b5061064f61064a366004613e94565b6113a4565b604051610478919061441f565b34801561066857600080fd5b5061058b60175481565b34801561067e57600080fd5b506104fb61068d3660046141e2565b611496565b34801561069e57600080fd5b5060075461058b565b3480156106b357600080fd5b506104fb6106c2366004613ffd565b6114d3565b3480156106d357600080fd5b5061058b6106e23660046141d0565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b34801561071957600080fd5b506104fb610728366004613ee8565b611573565b34801561073957600080fd5b506104fb610748366004614160565b61158e565b34801561075957600080fd5b506104fb610768366004614228565b611683565b34801561077957600080fd5b506104fb610788366004613ffd565b6116b2565b34801561079957600080fd5b5061064f611752565b3480156107ae57600080fd5b506104fb6107bd3660046141d0565b611762565b3480156107ce57600080fd5b5061046c6107dd366004613e94565b601f6020526000908152604090205460ff1681565b3480156107fe57600080fd5b5061058b61080d366004613e94565b60216020526000908152604090205481565b34801561082b57600080fd5b506104fb61083a366004614228565b61194a565b34801561084b57600080fd5b506104c361085a366004614228565b611979565b34801561086b57600080fd5b5060135461046c9062010000900460ff1681565b34801561088b57600080fd5b506104fb61089a3660046141e2565b6119f0565b3480156108ab57600080fd5b5061058b6108ba366004613e94565b611a2d565b3480156108cb57600080fd5b506104fb611ab4565b3480156108e057600080fd5b506104fb6108ef366004614228565b611aea565b34801561090057600080fd5b5060135461046c9060ff1681565b34801561091a57600080fd5b506104fb610929366004614160565b611b19565b34801561093a57600080fd5b5061094e610949366004614228565b611c10565b604080516001600160a01b0390941684529115156020840152151590820152606001610478565b34801561098157600080fd5b506104c3610990366004614228565b611c55565b3480156109a157600080fd5b506104fb6109b0366004613ffd565b611c93565b3480156109c157600080fd5b506006546001600160a01b03166104c3565b3480156109df57600080fd5b506104fb6109ee366004613ffd565b611d33565b3480156109ff57600080fd5b506104fb610a0e366004614228565b611dd3565b348015610a1f57600080fd5b5061058b610a2e366004613e94565b602080526000908152604090205481565b348015610a4b57600080fd5b50610496611e02565b348015610a6057600080fd5b5061058b610a6f366004613e94565b6001600160a01b03166000908152600a602052604090205490565b348015610a9657600080fd5b506104fb610aa5366004614030565b611e11565b348015610ab657600080fd5b5061058b60155481565b348015610acc57600080fd5b506104fb610adb366004613fa5565b6120bd565b348015610aec57600080fd5b50601b54610afa9060ff1681565b6040516104789190614432565b348015610b1357600080fd5b5061058b60195481565b348015610b2957600080fd5b5061058b601a5481565b348015610b3f57600080fd5b506104fb610b4e366004613f28565b6120c8565b348015610b5f57600080fd5b50610496610b6e366004614228565b612100565b348015610b7f57600080fd5b5061046c610b8e366004614228565b60246020526000908152604090205460ff1681565b348015610baf57600080fd5b5061058b610bbe366004613e94565b6001600160a01b031660009081526009602052604090205490565b348015610be557600080fd5b506104fb610bf4366004614160565b61223e565b348015610c0557600080fd5b5061058b610c14366004613e94565b6001600160a01b03166000908152600c602052604090205490565b6104fb610c3d366004614228565b612368565b348015610c4e57600080fd5b5061058b610c5d366004613e94565b60226020526000908152604090205481565b348015610c7b57600080fd5b506104fb610c8a366004614160565b612726565b348015610c9b57600080fd5b5060085461058b565b348015610cb057600080fd5b506104fb612796565b348015610cc557600080fd5b5061046c610cd4366004613eb0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610d0e57600080fd5b5061058b60185481565b348015610d2457600080fd5b506104fb610d33366004613e94565b6128b7565b348015610d4457600080fd5b506104fb610d53366004614228565b61294f565b348015610d6457600080fd5b506104fb61297e565b348015610d7957600080fd5b5061058b60165481565b348015610d8f57600080fd5b5060135461046c90610100900460ff1681565b60006001600160e01b031982166380ac58cd60e01b1480610dd357506001600160e01b03198216635b5e139f60e01b145b80610dee57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610e039061477e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2f9061477e565b8015610e7c5780601f10610e5157610100808354040283529160200191610e7c565b820191906000526020600020905b815481529060010190602001808311610e5f57829003601f168201915b5050505050905090565b6000610e9182612b32565b610ef75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610f1e82611979565b9050806001600160a01b0316836001600160a01b03161415610f8c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610eee565b336001600160a01b0382161480610fa85750610fa88133610cd4565b61101a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610eee565b6110248383612b4f565b505050565b60408051608080820183526000808352602080840182905260608486018190528085018390528551938401865282845290830182905293820184905292810183905290915b60235481101561119f57836001600160a01b0316602382815481106110a357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546001600160a01b0316141561118d57602381815481106110e457634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051608081018252600390930290910180546001600160a01b038116845260ff600160a01b90910416151583850152600181018054835181870281018701855281815294959294938601939283018282801561116c57602002820191906000526020600020905b815481526020019060010190808311611158575b50505091835250506002919091015460ff161515602090910152915061119f565b80611197816147b9565b91505061106e565b5092915050565b6006546001600160a01b031633146111d05760405162461bcd60e51b8152600401610eee90614581565b80516111e3906010906020840190613c78565b5050565b6001600160a01b03811660009081526009602052604090205461121c5760405162461bcd60e51b8152600401610eee906144f0565b600061122760085490565b61123190476146f0565b9050600061125e8383611259866001600160a01b03166000908152600a602052604090205490565b612bbd565b90508061127d5760405162461bcd60e51b8152600401610eee90614536565b6001600160a01b0383166000908152600a6020526040812080548392906112a59084906146f0565b9250508190555080600860008282546112be91906146f0565b909155506112ce90508382612c03565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b61131f3382612d1c565b61133b5760405162461bcd60e51b8152600401610eee906145b6565b611024838383612e05565b6006546001600160a01b031633146113705760405162461bcd60e51b8152600401610eee90614581565b601755565b6006546001600160a01b0316331461139f5760405162461bcd60e51b8152600401610eee90614581565b601855565b606060006113b183611a2d565b67ffffffffffffffff8111156113d757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611400578160200160208202803683370190505b509050600060015b601254811161148d5761141a81612b32565b1561147b57846001600160a01b031661143282611979565b6001600160a01b0316141561147b578083838151811061146257634e487b7160e01b600052603260045260246000fd5b602090810291909101015281611477816147b9565b9250505b80611485816147b9565b915050611408565b50909392505050565b6006546001600160a01b031633146114c05760405162461bcd60e51b8152600401610eee90614581565b80516111e390600f906020840190613c78565b6006546001600160a01b031633146114fd5760405162461bcd60e51b8152600401610eee90614581565b60005b81518110156111e3576000601e600084848151811061152f57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061156b816147b9565b915050611500565b611024838383604051806020016040528060008152506120c8565b6006546001600160a01b031633146115b85760405162461bcd60e51b8152600401610eee90614581565b60135460ff16156115db5760405162461bcd60e51b8152600401610eee90614607565b60135462010000900460ff16156116345760405162461bcd60e51b815260206004820152601e60248201527f4379626f726738363a2053616c6520616c72656164792072756e6e696e6700006044820152606401610eee565b6013805461ff00191661010083151502179055601b8054600260ff199091168117909155604051600080516020614864833981519152916116789160019190614440565b60405180910390a150565b6006546001600160a01b031633146116ad5760405162461bcd60e51b8152600401610eee90614581565b601a55565b6006546001600160a01b031633146116dc5760405162461bcd60e51b8152600401610eee90614581565b60005b81518110156111e3576001601e600084848151811061170e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061174a816147b9565b9150506116df565b606061175d326113a4565b905090565b6001600160a01b0381166000908152600960205260409020546117975760405162461bcd60e51b8152600401610eee906144f0565b6001600160a01b0382166000908152600c60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b1580156117ef57600080fd5b505afa158015611803573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118279190614240565b61183191906146f0565b9050600061186a838361125987876001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b9050806118895760405162461bcd60e51b8152600401610eee90614536565b6001600160a01b038085166000908152600d60209081526040808320938716835292905290812080548392906118c09084906146f0565b90915550506001600160a01b0384166000908152600c6020526040812080548392906118ed9084906146f0565b909155506118fe9050848483612fa1565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6006546001600160a01b031633146119745760405162461bcd60e51b8152600401610eee90614581565b601955565b6000818152600260205260408120546001600160a01b031680610dee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610eee565b6006546001600160a01b03163314611a1a5760405162461bcd60e51b8152600401610eee90614581565b80516111e3906011906020840190613c78565b60006001600160a01b038216611a985760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610eee565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314611ade5760405162461bcd60e51b8152600401610eee90614581565b611ae86000612ff3565b565b6006546001600160a01b03163314611b145760405162461bcd60e51b8152600401610eee90614581565b601655565b6006546001600160a01b03163314611b435760405162461bcd60e51b8152600401610eee90614581565b60135460ff1615611b665760405162461bcd60e51b8152600401610eee90614607565b601354610100900460ff1615611bca5760405162461bcd60e51b815260206004820152602360248201527f4379626f726738363a207365636f6e642073616c65207374696c6c2072756e6e604482015262696e6760e81b6064820152608401610eee565b6013805462ff000019166201000083151502179055601b8054600360ff199091168117909155604051600080516020614864833981519152916116789160029190614440565b60238181548110611c2057600080fd5b6000918252602090912060039091020180546002909101546001600160a01b038216925060ff600160a01b9092048216911683565b6000600b8281548110611c7857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6006546001600160a01b03163314611cbd5760405162461bcd60e51b8152600401610eee90614581565b60005b81518110156111e3576001601f6000848481518110611cef57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611d2b816147b9565b915050611cc0565b6006546001600160a01b03163314611d5d5760405162461bcd60e51b8152600401610eee90614581565b60005b81518110156111e3576000601f6000848481518110611d8f57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611dcb816147b9565b915050611d60565b6006546001600160a01b03163314611dfd5760405162461bcd60e51b8152600401610eee90614581565b601555565b606060018054610e039061477e565b6006546001600160a01b03163314611e3b5760405162461bcd60e51b8152600401610eee90614581565b8051825114611e9a5760405162461bcd60e51b815260206004820152602560248201527f4379626f726738363a20446966666572656e7420706172616d6574657273206c6044820152640cadccee8d60db1b6064820152608401610eee565b60005b82518110156110245760006040518060800160405280858481518110611ed357634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001600115158152602001848481518110611f1257634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182526000918101829052602380546001810182559252825160039092027fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f423081018054858401511515600160a01b026001600160a81b03199091166001600160a01b0390951694909417939093178355604084015180519495508594611fcc937fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f4231909301929190910190613cfc565b50606091909101516002909101805460ff191691151591909117905560005b83838151811061200b57634e487b7160e01b600052603260045260246000fd5b6020026020010151518110156120a85760016024600086868151811061204157634e487b7160e01b600052603260045260246000fd5b6020026020010151848151811061206857634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080806120a0906147b9565b915050611feb565b505080806120b5906147b9565b915050611e9d565b6111e3338383613045565b6120d23383612d1c565b6120ee5760405162461bcd60e51b8152600401610eee906145b6565b6120fa84848484613114565b50505050565b606061210b82612b32565b61216f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610eee565b6013546301000000900460ff166121df5760006010805461218f9061477e565b9050116121ab5760405180602001604052806000815250610dee565b60106121b683613147565b60116040516020016121ca939291906143c6565b60405160208183030381529060405292915050565b60006121e9613261565b905060008151116122095760405180602001604052806000815250612237565b8061221384613147565b601160405160200161222793929190614394565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146122685760405162461bcd60e51b8152600401610eee90614581565b60135462010000900460ff16156122c15760405162461bcd60e51b815260206004820152601e60248201527f4379626f726738363a2053616c6520616c72656164792072756e6e696e6700006044820152606401610eee565b601354610100900460ff16156123275760405162461bcd60e51b815260206004820152602560248201527f4379626f726738363a205365636f6e642073616c6520616c72656164792072756044820152646e6e696e6760d81b6064820152608401610eee565b6013805482151560ff1991821617909155601b8054600192168280021790555060008051602061486483398151915260006001604051611678929190614440565b6002600e5414156123bb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610eee565b6002600e5560006123cb82613270565b60135490915062010000900460ff16806123e7575060135460ff165b806123f95750601354610100900460ff165b6124455760405162461bcd60e51b815260206004820152601b60248201527f5452414e53414354494f4e3a204e6f2073616c652061637469766500000000006044820152606401610eee565b60145460125461245590836146f0565b11156124ad5760405162461bcd60e51b815260206004820152602160248201527f535550504c593a2056616c7565206578636565647320746f74616c537570706c6044820152607960f81b6064820152608401610eee565b6001601b5460ff1660058111156124d457634e487b7160e01b600052602160045260246000fd5b14156124e8576124e3826132dc565b61271d565b6002601b5460ff16600581111561250f57634e487b7160e01b600052602160045260246000fd5b141561251e576124e3826134b3565b6003601b5460ff16600581111561254557634e487b7160e01b600052602160045260246000fd5b141561271d5760135462010000900460ff166125a35760405162461bcd60e51b815260206004820152601f60248201527f5452414e53414354494f4e3a2053616c65206973206e6f7420616374697665006044820152606401610eee565b816015546125b1919061471c565b34146125cf5760405162461bcd60e51b8152600401610eee906144c0565b6018543360009081526020805260409020546125ec9084906146f0565b111561263a5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a204d617820313030206d696e74000000000000006044820152606401610eee565b336000908152602080526040812080548492906126589084906146f0565b90915550600090505b828110156126e25760128054906000612679836147b9565b91905055505b60125460009081526024602052604090205460ff16806126a557506126a5601254612b32565b156126c457601280549060006126ba836147b9565b919050555061267f565b6126d0336012546136f0565b806126da816147b9565b915050612661565b5060408051338152602081018490527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a15b50506001600e55565b6006546001600160a01b031633146127505760405162461bcd60e51b8152600401610eee90614581565b601380548215801563010000000263ff00000019909216919091179091556127935760008051602061486483398151915260046005604051611678929190614440565b50565b6006546001600160a01b031633146127c05760405162461bcd60e51b8152600401610eee90614581565b60005b6023548110156128aa5760005b602382815481106127f157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001018054905081101561289757602460006023848154811061283257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101838154811061286257634e487b7160e01b600052603260045260246000fd5b600091825260208083209091015483528201929092526040019020805460ff191690558061288f816147b9565b9150506127d0565b50806128a2816147b9565b9150506127c3565b50611ae860236000613d36565b6006546001600160a01b031633146128e15760405162461bcd60e51b8152600401610eee90614581565b6001600160a01b0381166129465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610eee565b61279381612ff3565b6006546001600160a01b031633146129795760405162461bcd60e51b8152600401610eee90614581565b601455565b6002600e5414156129d15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610eee565b6002600e5560006129e133611029565b90508060200151612a3f5760405162461bcd60e51b815260206004820152602260248201527f4379626f726738363a204e6f7420656c696769626c6520746f20676976656177604482015261617960f01b6064820152608401610eee565b806060015115612a915760405162461bcd60e51b815260206004820152601960248201527f4379626f726738363a20416c726561647920636c61696d6564000000000000006044820152606401610eee565b60005b816040015151811015612b2057612ad582604001518281518110612ac857634e487b7160e01b600052603260045260246000fd5b6020026020010151612b32565b612b0e57612b0e3383604001518381518110612b0157634e487b7160e01b600052603260045260246000fd5b60200260200101516136f0565b80612b18816147b9565b915050612a94565b50612b2a3361370a565b506001600e55565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b8482611979565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6007546001600160a01b03841660009081526009602052604081205490918391612be7908661471c565b612bf19190614708565b612bfb919061473b565b949350505050565b80471015612c535760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610eee565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ca0576040519150601f19603f3d011682016040523d82523d6000602084013e612ca5565b606091505b50509050806110245760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610eee565b6000612d2782612b32565b612d885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610eee565b6000612d9383611979565b9050806001600160a01b0316846001600160a01b03161480612dce5750836001600160a01b0316612dc384610e86565b6001600160a01b0316145b80612bfb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316612e1882611979565b6001600160a01b031614612e7c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610eee565b6001600160a01b038216612ede5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610eee565b612ee9600082612b4f565b6001600160a01b0383166000908152600360205260408120805460019290612f1290849061473b565b90915550506001600160a01b0382166000908152600360205260408120805460019290612f409084906146f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110249084906137ba565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156130a75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610eee565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61311f848484612e05565b61312b8484848461388c565b6120fa5760405162461bcd60e51b8152600401610eee9061446e565b60608161316b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613195578061317f816147b9565b915061318e9050600a83614708565b915061316f565b60008167ffffffffffffffff8111156131be57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131e8576020820181803683370190505b5090505b8415612bfb576131fd60018361473b565b915061320a600a866147d4565b6132159060306146f0565b60f81b81838151811061323857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061325a600a86614708565b94506131ec565b6060600f8054610e039061477e565b60008060015b8361328183836146f0565b116132d157602460008260125461329891906146f0565b815260208101919091526040016000205460ff16156132bf57816132bb816147b9565b9250505b806132c9816147b9565b915050613276565b5061223783826146f0565b806016546132ea919061471c565b34146133085760405162461bcd60e51b8152600401610eee906144c0565b336000908152601e602052604090205460ff166133675760405162461bcd60e51b815260206004820152601e60248201527f46495253542053414c453a2053656e646572206e6f7420616c6c6f77656400006044820152606401610eee565b601954336000908152602160205260409020546133859083906146f0565b11156133d35760405162461bcd60e51b815260206004820152601760248201527f46495253542053414c453a204d6178203130206d696e740000000000000000006044820152606401610eee565b33600090815260216020526040812080548392906133f29084906146f0565b90915550600090505b8181101561347c5760128054906000613413836147b9565b91905055505b60125460009081526024602052604090205460ff168061343f575061343f601254612b32565b1561345e5760128054906000613454836147b9565b9190505550613419565b61346a336012546136f0565b80613474816147b9565b9150506133fb565b5060408051338152602081018390527fdf182cea2eeae9d34424ffe270d46caa7b38aad55677dcaa2d03ef189dea58849101611678565b601354610100900460ff166135195760405162461bcd60e51b815260206004820152602660248201527f5452414e53414354494f4e3a205365636f6e642073616c65206973206e6f742060448201526561637469766560d01b6064820152608401610eee565b80601754613527919061471c565b34146135455760405162461bcd60e51b8152600401610eee906144c0565b336000908152601f602052604090205460ff166135a45760405162461bcd60e51b815260206004820152601f60248201527f5345434f4e442053414c453a2053656e646572206e6f7420616c6c6f776564006044820152606401610eee565b601a54336000908152602260205260409020546135c29083906146f0565b11156136105760405162461bcd60e51b815260206004820152601760248201527f5345434f4e442053414c453a204d61782038206d696e740000000000000000006044820152606401610eee565b336000908152602260205260408120805483929061362f9084906146f0565b90915550600090505b818110156136b95760128054906000613650836147b9565b91905055505b60125460009081526024602052604090205460ff168061367c575061367c601254612b32565b1561369b5760128054906000613691836147b9565b9190505550613656565b6136a7336012546136f0565b806136b1816147b9565b915050613638565b5060408051338152602081018390527fa1ea90aea1b080223d1e4ad0794ee81eb3ffedc9d22acf4d1c239570c933e0779101611678565b6111e3828260405180602001604052806000815250613999565b60005b6023548110156111e357816001600160a01b03166023828154811061374257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546001600160a01b031614156137a85760016023828154811061378557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201600201805460ff19169115159190911790555b806137b2816147b9565b91505061370d565b600061380f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139cc9092919063ffffffff16565b805190915015611024578080602001905181019061382d919061417c565b6110245760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610eee565b60006001600160a01b0384163b1561398e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906138d09033908990889088906004016143e2565b602060405180830381600087803b1580156138ea57600080fd5b505af192505050801561391a575060408051601f3d908101601f19168201909252613917918101906141b4565b60015b613974573d808015613948576040519150601f19603f3d011682016040523d82523d6000602084013e61394d565b606091505b50805161396c5760405162461bcd60e51b8152600401610eee9061446e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612bfb565b506001949350505050565b6139a383836139db565b6139b0600084848461388c565b6110245760405162461bcd60e51b8152600401610eee9061446e565b6060612bfb8484600085613b0e565b6001600160a01b038216613a315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610eee565b613a3a81612b32565b15613a875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610eee565b6001600160a01b0382166000908152600360205260408120805460019290613ab09084906146f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606082471015613b6f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610eee565b6001600160a01b0385163b613bc65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610eee565b600080866001600160a01b03168587604051613be29190614378565b60006040518083038185875af1925050503d8060008114613c1f576040519150601f19603f3d011682016040523d82523d6000602084013e613c24565b606091505b5091509150613c34828286613c3f565b979650505050505050565b60608315613c4e575081612237565b825115613c5e5782518084602001fd5b8160405162461bcd60e51b8152600401610eee919061445b565b828054613c849061477e565b90600052602060002090601f016020900481019282613ca65760008555613cec565b82601f10613cbf57805160ff1916838001178555613cec565b82800160010185558215613cec579182015b82811115613cec578251825591602001919060010190613cd1565b50613cf8929150613d57565b5090565b828054828255906000526020600020908101928215613cec5791602002820182811115613cec578251825591602001919060010190613cd1565b50805460008255600302906000526020600020908101906127939190613d6c565b5b80821115613cf85760008155600101613d58565b80821115613cf85780546001600160a81b03191681556000613d916001830182613da6565b5060028101805460ff19169055600301613d6c565b50805460008255906000526020600020908101906127939190613d57565b600067ffffffffffffffff831115613dde57613dde614814565b613df1601f8401601f191660200161469b565b9050828152838383011115613e0557600080fd5b828260208301376000602084830101529392505050565b600082601f830112613e2c578081fd5b81356020613e41613e3c836146cc565b61469b565b80838252828201915082860187848660051b8901011115613e60578586fd5b855b85811015613e87578135613e758161482a565b84529284019290840190600101613e62565b5090979650505050505050565b600060208284031215613ea5578081fd5b81356122378161482a565b60008060408385031215613ec2578081fd5b8235613ecd8161482a565b91506020830135613edd8161482a565b809150509250929050565b600080600060608486031215613efc578081fd5b8335613f078161482a565b92506020840135613f178161482a565b929592945050506040919091013590565b60008060008060808587031215613f3d578081fd5b8435613f488161482a565b93506020850135613f588161482a565b925060408501359150606085013567ffffffffffffffff811115613f7a578182fd5b8501601f81018713613f8a578182fd5b613f9987823560208401613dc4565b91505092959194509250565b60008060408385031215613fb7578182fd5b8235613fc28161482a565b91506020830135613edd8161483f565b60008060408385031215613fe4578182fd5b8235613fef8161482a565b946020939093013593505050565b60006020828403121561400e578081fd5b813567ffffffffffffffff811115614024578182fd5b612bfb84828501613e1c565b60008060408385031215614042578182fd5b67ffffffffffffffff8084351115614058578283fd5b6140658585358601613e1c565b9250602084013581811115614078578283fd5b8401601f81018613614088578283fd5b8035614096613e3c826146cc565b80828252602082019150602084018960208560051b87010111156140b8578687fd5b865b848110156141505786823511156140cf578788fd5b813586018b603f8201126140e1578889fd5b60208101356140f2613e3c826146cc565b80828252602082019150604084018f60408560051b8701011115614114578c8dfd5b8c94505b8385101561413757803583526001949094019360209283019201614118565b50875250506020948501949290920191506001016140ba565b5096999098509650505050505050565b600060208284031215614171578081fd5b81356122378161483f565b60006020828403121561418d578081fd5b81516122378161483f565b6000602082840312156141a9578081fd5b81356122378161484d565b6000602082840312156141c5578081fd5b81516122378161484d565b60008060408385031215613ec2578182fd5b6000602082840312156141f3578081fd5b813567ffffffffffffffff811115614209578182fd5b8201601f81018413614219578182fd5b612bfb84823560208401613dc4565b600060208284031215614239578081fd5b5035919050565b600060208284031215614251578081fd5b5051919050565b6000815180845260208085019450808401835b838110156142875781518752958201959082019060010161426b565b509495945050505050565b600081518084526142aa816020860160208601614752565b601f01601f19169290920160200192915050565b600681106142dc57634e487b7160e01b600052602160045260246000fd5b9052565b8054600090600181811c90808316806142fa57607f831692505b602080841082141561431a57634e487b7160e01b86526022600452602486fd5b81801561432e576001811461433f5761436c565b60ff1986168952848901965061436c565b60008881526020902060005b868110156143645781548b82015290850190830161434b565b505084890196505b50505050505092915050565b6000825161438a818460208701614752565b9190910192915050565b600084516143a6818460208901614752565b8451908301906143ba818360208901614752565b613c34818301866142e0565b60006143d282866142e0565b84516143ba818360208901614752565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061441590830184614292565b9695505050505050565b6020815260006122376020830184614258565b60208101610dee82846142be565b6040810161444e82856142be565b61223760208301846142be565b6020815260006122376020830184614292565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601690820152755041594d454e543a20696e76616c69642076616c756560501b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f4379626f726738363a2046697273742073616c65207374696c6c2072756e6e696040820152616e6760f01b606082015260800190565b6020815260018060a01b038251166020820152602082015115156040820152600060408301516080606084015261468360a0840182614258565b90506060840151151560808401528091505092915050565b604051601f8201601f1916810167ffffffffffffffff811182821017156146c4576146c4614814565b604052919050565b600067ffffffffffffffff8211156146e6576146e6614814565b5060051b60200190565b60008219821115614703576147036147e8565b500190565b600082614717576147176147fe565b500490565b6000816000190483118215151615614736576147366147e8565b500290565b60008282101561474d5761474d6147e8565b500390565b60005b8381101561476d578181015183820152602001614755565b838111156120fa5750506000910152565b600181811c9082168061479257607f821691505b602082108114156147b357634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156147cd576147cd6147e8565b5060010190565b6000826147e3576147e36147fe565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461279357600080fd5b801515811461279357600080fd5b6001600160e01b03198116811461279357600080fdfe0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3fa2646970667358221220b415b252eeeb16cae9723065cff696597edff6cd87b285b5db93fc41deb82b5f64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106103fe5760003560e01c80637a6eeb9311610213578063b88d4fde11610123578063e33b7de3116100ab578063f2fde38b1161007a578063f2fde38b14610d18578063f7ea7a3d14610d38578063f9850b7214610d58578063fc1a1c3614610d6d578063fe3eee2e14610d8357600080fd5b8063e33b7de314610c8f578063e59a5d6314610ca4578063e985e9c514610cb9578063ef9b63ba14610d0257600080fd5b8063d4377986116100f2578063d437798614610bd9578063d79779b214610bf9578063d96a094a14610c2f578063dab0271c14610c42578063e0a8085314610c6f57600080fd5b8063b88d4fde14610b33578063c87b56dd14610b53578063cd0f5e6d14610b73578063ce7c2ac214610ba357600080fd5b80639379956a116101a6578063a035b1fe11610175578063a035b1fe14610aaa578063a22cb46514610ac0578063a334412514610ae0578063aa9a508c14610b07578063b51f760d14610b1d57600080fd5b80639379956a14610a1357806395d89b4114610a3f5780639852595c14610a545780639b0702ee14610a8a57600080fd5b80638cb97186116101e25780638cb97186146109955780638da5cb5b146109b55780638dad238d146109d357806391b7f5ed146109f357600080fd5b80637a6eeb93146108f4578063841718a61461090e5780638ad8206c1461092e5780638b83209b1461097557600080fd5b80633fb3aac31161030e578063537e330d116102a157806368428a1b1161027057806368428a1b1461085f578063709548bd1461087f57806370a082311461089f578063715018a6146108bf578063717d57d3146108d457600080fd5b8063537e330d146107c2578063561f814a146107f25780635b57d4061461081f5780636352211e1461083f57600080fd5b806344ecd626116102dd57806344ecd6261461074d57806345bca29f1461076d57806347002d1d1461078d57806348b75044146107a257600080fd5b80633fb3aac3146106a7578063406072a9146106c757806342842e0e1461070d5780634348da161461072d57600080fd5b806318160ddd11610391578063270ab52c11610360578063270ab52c1461060f578063276f09341461062f5780632a0090df1461065c57806331b5b907146106725780633a98ef391461069257600080fd5b806318160ddd1461059957806319165587146105af57806323b872dd146105cf578063251e6ac2146105ef57600080fd5b80630bd32380116103cd5780630bd32380146104fd5780630cb9f5b91461052a578063129ccded1461054a5780631517f2ec1461057a57600080fd5b806301ffc9a71461044c57806306fdde0314610481578063081812fc146104a3578063095ea7b3146104db57600080fd5b36610447577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561045857600080fd5b5061046c610467366004614198565b610da2565b60405190151581526020015b60405180910390f35b34801561048d57600080fd5b50610496610df4565b604051610478919061445b565b3480156104af57600080fd5b506104c36104be366004614228565b610e86565b6040516001600160a01b039091168152602001610478565b3480156104e757600080fd5b506104fb6104f6366004613fd2565b610f13565b005b34801561050957600080fd5b5061051d610518366004613e94565b611029565b6040516104789190614649565b34801561053657600080fd5b506104fb6105453660046141e2565b6111a6565b34801561055657600080fd5b5061046c610565366004613e94565b601e6020526000908152604090205460ff1681565b34801561058657600080fd5b506023545b604051908152602001610478565b3480156105a557600080fd5b5061058b60145481565b3480156105bb57600080fd5b506104fb6105ca366004613e94565b6111e7565b3480156105db57600080fd5b506104fb6105ea366004613ee8565b611315565b3480156105fb57600080fd5b506104fb61060a366004614228565b611346565b34801561061b57600080fd5b506104fb61062a366004614228565b611375565b34801561063b57600080fd5b5061064f61064a366004613e94565b6113a4565b604051610478919061441f565b34801561066857600080fd5b5061058b60175481565b34801561067e57600080fd5b506104fb61068d3660046141e2565b611496565b34801561069e57600080fd5b5060075461058b565b3480156106b357600080fd5b506104fb6106c2366004613ffd565b6114d3565b3480156106d357600080fd5b5061058b6106e23660046141d0565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b34801561071957600080fd5b506104fb610728366004613ee8565b611573565b34801561073957600080fd5b506104fb610748366004614160565b61158e565b34801561075957600080fd5b506104fb610768366004614228565b611683565b34801561077957600080fd5b506104fb610788366004613ffd565b6116b2565b34801561079957600080fd5b5061064f611752565b3480156107ae57600080fd5b506104fb6107bd3660046141d0565b611762565b3480156107ce57600080fd5b5061046c6107dd366004613e94565b601f6020526000908152604090205460ff1681565b3480156107fe57600080fd5b5061058b61080d366004613e94565b60216020526000908152604090205481565b34801561082b57600080fd5b506104fb61083a366004614228565b61194a565b34801561084b57600080fd5b506104c361085a366004614228565b611979565b34801561086b57600080fd5b5060135461046c9062010000900460ff1681565b34801561088b57600080fd5b506104fb61089a3660046141e2565b6119f0565b3480156108ab57600080fd5b5061058b6108ba366004613e94565b611a2d565b3480156108cb57600080fd5b506104fb611ab4565b3480156108e057600080fd5b506104fb6108ef366004614228565b611aea565b34801561090057600080fd5b5060135461046c9060ff1681565b34801561091a57600080fd5b506104fb610929366004614160565b611b19565b34801561093a57600080fd5b5061094e610949366004614228565b611c10565b604080516001600160a01b0390941684529115156020840152151590820152606001610478565b34801561098157600080fd5b506104c3610990366004614228565b611c55565b3480156109a157600080fd5b506104fb6109b0366004613ffd565b611c93565b3480156109c157600080fd5b506006546001600160a01b03166104c3565b3480156109df57600080fd5b506104fb6109ee366004613ffd565b611d33565b3480156109ff57600080fd5b506104fb610a0e366004614228565b611dd3565b348015610a1f57600080fd5b5061058b610a2e366004613e94565b602080526000908152604090205481565b348015610a4b57600080fd5b50610496611e02565b348015610a6057600080fd5b5061058b610a6f366004613e94565b6001600160a01b03166000908152600a602052604090205490565b348015610a9657600080fd5b506104fb610aa5366004614030565b611e11565b348015610ab657600080fd5b5061058b60155481565b348015610acc57600080fd5b506104fb610adb366004613fa5565b6120bd565b348015610aec57600080fd5b50601b54610afa9060ff1681565b6040516104789190614432565b348015610b1357600080fd5b5061058b60195481565b348015610b2957600080fd5b5061058b601a5481565b348015610b3f57600080fd5b506104fb610b4e366004613f28565b6120c8565b348015610b5f57600080fd5b50610496610b6e366004614228565b612100565b348015610b7f57600080fd5b5061046c610b8e366004614228565b60246020526000908152604090205460ff1681565b348015610baf57600080fd5b5061058b610bbe366004613e94565b6001600160a01b031660009081526009602052604090205490565b348015610be557600080fd5b506104fb610bf4366004614160565b61223e565b348015610c0557600080fd5b5061058b610c14366004613e94565b6001600160a01b03166000908152600c602052604090205490565b6104fb610c3d366004614228565b612368565b348015610c4e57600080fd5b5061058b610c5d366004613e94565b60226020526000908152604090205481565b348015610c7b57600080fd5b506104fb610c8a366004614160565b612726565b348015610c9b57600080fd5b5060085461058b565b348015610cb057600080fd5b506104fb612796565b348015610cc557600080fd5b5061046c610cd4366004613eb0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610d0e57600080fd5b5061058b60185481565b348015610d2457600080fd5b506104fb610d33366004613e94565b6128b7565b348015610d4457600080fd5b506104fb610d53366004614228565b61294f565b348015610d6457600080fd5b506104fb61297e565b348015610d7957600080fd5b5061058b60165481565b348015610d8f57600080fd5b5060135461046c90610100900460ff1681565b60006001600160e01b031982166380ac58cd60e01b1480610dd357506001600160e01b03198216635b5e139f60e01b145b80610dee57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610e039061477e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2f9061477e565b8015610e7c5780601f10610e5157610100808354040283529160200191610e7c565b820191906000526020600020905b815481529060010190602001808311610e5f57829003601f168201915b5050505050905090565b6000610e9182612b32565b610ef75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610f1e82611979565b9050806001600160a01b0316836001600160a01b03161415610f8c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610eee565b336001600160a01b0382161480610fa85750610fa88133610cd4565b61101a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610eee565b6110248383612b4f565b505050565b60408051608080820183526000808352602080840182905260608486018190528085018390528551938401865282845290830182905293820184905292810183905290915b60235481101561119f57836001600160a01b0316602382815481106110a357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546001600160a01b0316141561118d57602381815481106110e457634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051608081018252600390930290910180546001600160a01b038116845260ff600160a01b90910416151583850152600181018054835181870281018701855281815294959294938601939283018282801561116c57602002820191906000526020600020905b815481526020019060010190808311611158575b50505091835250506002919091015460ff161515602090910152915061119f565b80611197816147b9565b91505061106e565b5092915050565b6006546001600160a01b031633146111d05760405162461bcd60e51b8152600401610eee90614581565b80516111e3906010906020840190613c78565b5050565b6001600160a01b03811660009081526009602052604090205461121c5760405162461bcd60e51b8152600401610eee906144f0565b600061122760085490565b61123190476146f0565b9050600061125e8383611259866001600160a01b03166000908152600a602052604090205490565b612bbd565b90508061127d5760405162461bcd60e51b8152600401610eee90614536565b6001600160a01b0383166000908152600a6020526040812080548392906112a59084906146f0565b9250508190555080600860008282546112be91906146f0565b909155506112ce90508382612c03565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b61131f3382612d1c565b61133b5760405162461bcd60e51b8152600401610eee906145b6565b611024838383612e05565b6006546001600160a01b031633146113705760405162461bcd60e51b8152600401610eee90614581565b601755565b6006546001600160a01b0316331461139f5760405162461bcd60e51b8152600401610eee90614581565b601855565b606060006113b183611a2d565b67ffffffffffffffff8111156113d757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611400578160200160208202803683370190505b509050600060015b601254811161148d5761141a81612b32565b1561147b57846001600160a01b031661143282611979565b6001600160a01b0316141561147b578083838151811061146257634e487b7160e01b600052603260045260246000fd5b602090810291909101015281611477816147b9565b9250505b80611485816147b9565b915050611408565b50909392505050565b6006546001600160a01b031633146114c05760405162461bcd60e51b8152600401610eee90614581565b80516111e390600f906020840190613c78565b6006546001600160a01b031633146114fd5760405162461bcd60e51b8152600401610eee90614581565b60005b81518110156111e3576000601e600084848151811061152f57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061156b816147b9565b915050611500565b611024838383604051806020016040528060008152506120c8565b6006546001600160a01b031633146115b85760405162461bcd60e51b8152600401610eee90614581565b60135460ff16156115db5760405162461bcd60e51b8152600401610eee90614607565b60135462010000900460ff16156116345760405162461bcd60e51b815260206004820152601e60248201527f4379626f726738363a2053616c6520616c72656164792072756e6e696e6700006044820152606401610eee565b6013805461ff00191661010083151502179055601b8054600260ff199091168117909155604051600080516020614864833981519152916116789160019190614440565b60405180910390a150565b6006546001600160a01b031633146116ad5760405162461bcd60e51b8152600401610eee90614581565b601a55565b6006546001600160a01b031633146116dc5760405162461bcd60e51b8152600401610eee90614581565b60005b81518110156111e3576001601e600084848151811061170e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061174a816147b9565b9150506116df565b606061175d326113a4565b905090565b6001600160a01b0381166000908152600960205260409020546117975760405162461bcd60e51b8152600401610eee906144f0565b6001600160a01b0382166000908152600c60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b1580156117ef57600080fd5b505afa158015611803573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118279190614240565b61183191906146f0565b9050600061186a838361125987876001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b9050806118895760405162461bcd60e51b8152600401610eee90614536565b6001600160a01b038085166000908152600d60209081526040808320938716835292905290812080548392906118c09084906146f0565b90915550506001600160a01b0384166000908152600c6020526040812080548392906118ed9084906146f0565b909155506118fe9050848483612fa1565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6006546001600160a01b031633146119745760405162461bcd60e51b8152600401610eee90614581565b601955565b6000818152600260205260408120546001600160a01b031680610dee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610eee565b6006546001600160a01b03163314611a1a5760405162461bcd60e51b8152600401610eee90614581565b80516111e3906011906020840190613c78565b60006001600160a01b038216611a985760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610eee565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314611ade5760405162461bcd60e51b8152600401610eee90614581565b611ae86000612ff3565b565b6006546001600160a01b03163314611b145760405162461bcd60e51b8152600401610eee90614581565b601655565b6006546001600160a01b03163314611b435760405162461bcd60e51b8152600401610eee90614581565b60135460ff1615611b665760405162461bcd60e51b8152600401610eee90614607565b601354610100900460ff1615611bca5760405162461bcd60e51b815260206004820152602360248201527f4379626f726738363a207365636f6e642073616c65207374696c6c2072756e6e604482015262696e6760e81b6064820152608401610eee565b6013805462ff000019166201000083151502179055601b8054600360ff199091168117909155604051600080516020614864833981519152916116789160029190614440565b60238181548110611c2057600080fd5b6000918252602090912060039091020180546002909101546001600160a01b038216925060ff600160a01b9092048216911683565b6000600b8281548110611c7857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6006546001600160a01b03163314611cbd5760405162461bcd60e51b8152600401610eee90614581565b60005b81518110156111e3576001601f6000848481518110611cef57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611d2b816147b9565b915050611cc0565b6006546001600160a01b03163314611d5d5760405162461bcd60e51b8152600401610eee90614581565b60005b81518110156111e3576000601f6000848481518110611d8f57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611dcb816147b9565b915050611d60565b6006546001600160a01b03163314611dfd5760405162461bcd60e51b8152600401610eee90614581565b601555565b606060018054610e039061477e565b6006546001600160a01b03163314611e3b5760405162461bcd60e51b8152600401610eee90614581565b8051825114611e9a5760405162461bcd60e51b815260206004820152602560248201527f4379626f726738363a20446966666572656e7420706172616d6574657273206c6044820152640cadccee8d60db1b6064820152608401610eee565b60005b82518110156110245760006040518060800160405280858481518110611ed357634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001600115158152602001848481518110611f1257634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182526000918101829052602380546001810182559252825160039092027fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f423081018054858401511515600160a01b026001600160a81b03199091166001600160a01b0390951694909417939093178355604084015180519495508594611fcc937fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f4231909301929190910190613cfc565b50606091909101516002909101805460ff191691151591909117905560005b83838151811061200b57634e487b7160e01b600052603260045260246000fd5b6020026020010151518110156120a85760016024600086868151811061204157634e487b7160e01b600052603260045260246000fd5b6020026020010151848151811061206857634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080806120a0906147b9565b915050611feb565b505080806120b5906147b9565b915050611e9d565b6111e3338383613045565b6120d23383612d1c565b6120ee5760405162461bcd60e51b8152600401610eee906145b6565b6120fa84848484613114565b50505050565b606061210b82612b32565b61216f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610eee565b6013546301000000900460ff166121df5760006010805461218f9061477e565b9050116121ab5760405180602001604052806000815250610dee565b60106121b683613147565b60116040516020016121ca939291906143c6565b60405160208183030381529060405292915050565b60006121e9613261565b905060008151116122095760405180602001604052806000815250612237565b8061221384613147565b601160405160200161222793929190614394565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146122685760405162461bcd60e51b8152600401610eee90614581565b60135462010000900460ff16156122c15760405162461bcd60e51b815260206004820152601e60248201527f4379626f726738363a2053616c6520616c72656164792072756e6e696e6700006044820152606401610eee565b601354610100900460ff16156123275760405162461bcd60e51b815260206004820152602560248201527f4379626f726738363a205365636f6e642073616c6520616c72656164792072756044820152646e6e696e6760d81b6064820152608401610eee565b6013805482151560ff1991821617909155601b8054600192168280021790555060008051602061486483398151915260006001604051611678929190614440565b6002600e5414156123bb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610eee565b6002600e5560006123cb82613270565b60135490915062010000900460ff16806123e7575060135460ff165b806123f95750601354610100900460ff165b6124455760405162461bcd60e51b815260206004820152601b60248201527f5452414e53414354494f4e3a204e6f2073616c652061637469766500000000006044820152606401610eee565b60145460125461245590836146f0565b11156124ad5760405162461bcd60e51b815260206004820152602160248201527f535550504c593a2056616c7565206578636565647320746f74616c537570706c6044820152607960f81b6064820152608401610eee565b6001601b5460ff1660058111156124d457634e487b7160e01b600052602160045260246000fd5b14156124e8576124e3826132dc565b61271d565b6002601b5460ff16600581111561250f57634e487b7160e01b600052602160045260246000fd5b141561251e576124e3826134b3565b6003601b5460ff16600581111561254557634e487b7160e01b600052602160045260246000fd5b141561271d5760135462010000900460ff166125a35760405162461bcd60e51b815260206004820152601f60248201527f5452414e53414354494f4e3a2053616c65206973206e6f7420616374697665006044820152606401610eee565b816015546125b1919061471c565b34146125cf5760405162461bcd60e51b8152600401610eee906144c0565b6018543360009081526020805260409020546125ec9084906146f0565b111561263a5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a204d617820313030206d696e74000000000000006044820152606401610eee565b336000908152602080526040812080548492906126589084906146f0565b90915550600090505b828110156126e25760128054906000612679836147b9565b91905055505b60125460009081526024602052604090205460ff16806126a557506126a5601254612b32565b156126c457601280549060006126ba836147b9565b919050555061267f565b6126d0336012546136f0565b806126da816147b9565b915050612661565b5060408051338152602081018490527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a15b50506001600e55565b6006546001600160a01b031633146127505760405162461bcd60e51b8152600401610eee90614581565b601380548215801563010000000263ff00000019909216919091179091556127935760008051602061486483398151915260046005604051611678929190614440565b50565b6006546001600160a01b031633146127c05760405162461bcd60e51b8152600401610eee90614581565b60005b6023548110156128aa5760005b602382815481106127f157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001018054905081101561289757602460006023848154811061283257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101838154811061286257634e487b7160e01b600052603260045260246000fd5b600091825260208083209091015483528201929092526040019020805460ff191690558061288f816147b9565b9150506127d0565b50806128a2816147b9565b9150506127c3565b50611ae860236000613d36565b6006546001600160a01b031633146128e15760405162461bcd60e51b8152600401610eee90614581565b6001600160a01b0381166129465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610eee565b61279381612ff3565b6006546001600160a01b031633146129795760405162461bcd60e51b8152600401610eee90614581565b601455565b6002600e5414156129d15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610eee565b6002600e5560006129e133611029565b90508060200151612a3f5760405162461bcd60e51b815260206004820152602260248201527f4379626f726738363a204e6f7420656c696769626c6520746f20676976656177604482015261617960f01b6064820152608401610eee565b806060015115612a915760405162461bcd60e51b815260206004820152601960248201527f4379626f726738363a20416c726561647920636c61696d6564000000000000006044820152606401610eee565b60005b816040015151811015612b2057612ad582604001518281518110612ac857634e487b7160e01b600052603260045260246000fd5b6020026020010151612b32565b612b0e57612b0e3383604001518381518110612b0157634e487b7160e01b600052603260045260246000fd5b60200260200101516136f0565b80612b18816147b9565b915050612a94565b50612b2a3361370a565b506001600e55565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b8482611979565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6007546001600160a01b03841660009081526009602052604081205490918391612be7908661471c565b612bf19190614708565b612bfb919061473b565b949350505050565b80471015612c535760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610eee565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ca0576040519150601f19603f3d011682016040523d82523d6000602084013e612ca5565b606091505b50509050806110245760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610eee565b6000612d2782612b32565b612d885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610eee565b6000612d9383611979565b9050806001600160a01b0316846001600160a01b03161480612dce5750836001600160a01b0316612dc384610e86565b6001600160a01b0316145b80612bfb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316612e1882611979565b6001600160a01b031614612e7c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610eee565b6001600160a01b038216612ede5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610eee565b612ee9600082612b4f565b6001600160a01b0383166000908152600360205260408120805460019290612f1290849061473b565b90915550506001600160a01b0382166000908152600360205260408120805460019290612f409084906146f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110249084906137ba565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156130a75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610eee565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61311f848484612e05565b61312b8484848461388c565b6120fa5760405162461bcd60e51b8152600401610eee9061446e565b60608161316b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613195578061317f816147b9565b915061318e9050600a83614708565b915061316f565b60008167ffffffffffffffff8111156131be57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131e8576020820181803683370190505b5090505b8415612bfb576131fd60018361473b565b915061320a600a866147d4565b6132159060306146f0565b60f81b81838151811061323857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061325a600a86614708565b94506131ec565b6060600f8054610e039061477e565b60008060015b8361328183836146f0565b116132d157602460008260125461329891906146f0565b815260208101919091526040016000205460ff16156132bf57816132bb816147b9565b9250505b806132c9816147b9565b915050613276565b5061223783826146f0565b806016546132ea919061471c565b34146133085760405162461bcd60e51b8152600401610eee906144c0565b336000908152601e602052604090205460ff166133675760405162461bcd60e51b815260206004820152601e60248201527f46495253542053414c453a2053656e646572206e6f7420616c6c6f77656400006044820152606401610eee565b601954336000908152602160205260409020546133859083906146f0565b11156133d35760405162461bcd60e51b815260206004820152601760248201527f46495253542053414c453a204d6178203130206d696e740000000000000000006044820152606401610eee565b33600090815260216020526040812080548392906133f29084906146f0565b90915550600090505b8181101561347c5760128054906000613413836147b9565b91905055505b60125460009081526024602052604090205460ff168061343f575061343f601254612b32565b1561345e5760128054906000613454836147b9565b9190505550613419565b61346a336012546136f0565b80613474816147b9565b9150506133fb565b5060408051338152602081018390527fdf182cea2eeae9d34424ffe270d46caa7b38aad55677dcaa2d03ef189dea58849101611678565b601354610100900460ff166135195760405162461bcd60e51b815260206004820152602660248201527f5452414e53414354494f4e3a205365636f6e642073616c65206973206e6f742060448201526561637469766560d01b6064820152608401610eee565b80601754613527919061471c565b34146135455760405162461bcd60e51b8152600401610eee906144c0565b336000908152601f602052604090205460ff166135a45760405162461bcd60e51b815260206004820152601f60248201527f5345434f4e442053414c453a2053656e646572206e6f7420616c6c6f776564006044820152606401610eee565b601a54336000908152602260205260409020546135c29083906146f0565b11156136105760405162461bcd60e51b815260206004820152601760248201527f5345434f4e442053414c453a204d61782038206d696e740000000000000000006044820152606401610eee565b336000908152602260205260408120805483929061362f9084906146f0565b90915550600090505b818110156136b95760128054906000613650836147b9565b91905055505b60125460009081526024602052604090205460ff168061367c575061367c601254612b32565b1561369b5760128054906000613691836147b9565b9190505550613656565b6136a7336012546136f0565b806136b1816147b9565b915050613638565b5060408051338152602081018390527fa1ea90aea1b080223d1e4ad0794ee81eb3ffedc9d22acf4d1c239570c933e0779101611678565b6111e3828260405180602001604052806000815250613999565b60005b6023548110156111e357816001600160a01b03166023828154811061374257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201546001600160a01b031614156137a85760016023828154811061378557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600390910201600201805460ff19169115159190911790555b806137b2816147b9565b91505061370d565b600061380f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139cc9092919063ffffffff16565b805190915015611024578080602001905181019061382d919061417c565b6110245760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610eee565b60006001600160a01b0384163b1561398e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906138d09033908990889088906004016143e2565b602060405180830381600087803b1580156138ea57600080fd5b505af192505050801561391a575060408051601f3d908101601f19168201909252613917918101906141b4565b60015b613974573d808015613948576040519150601f19603f3d011682016040523d82523d6000602084013e61394d565b606091505b50805161396c5760405162461bcd60e51b8152600401610eee9061446e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612bfb565b506001949350505050565b6139a383836139db565b6139b0600084848461388c565b6110245760405162461bcd60e51b8152600401610eee9061446e565b6060612bfb8484600085613b0e565b6001600160a01b038216613a315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610eee565b613a3a81612b32565b15613a875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610eee565b6001600160a01b0382166000908152600360205260408120805460019290613ab09084906146f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606082471015613b6f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610eee565b6001600160a01b0385163b613bc65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610eee565b600080866001600160a01b03168587604051613be29190614378565b60006040518083038185875af1925050503d8060008114613c1f576040519150601f19603f3d011682016040523d82523d6000602084013e613c24565b606091505b5091509150613c34828286613c3f565b979650505050505050565b60608315613c4e575081612237565b825115613c5e5782518084602001fd5b8160405162461bcd60e51b8152600401610eee919061445b565b828054613c849061477e565b90600052602060002090601f016020900481019282613ca65760008555613cec565b82601f10613cbf57805160ff1916838001178555613cec565b82800160010185558215613cec579182015b82811115613cec578251825591602001919060010190613cd1565b50613cf8929150613d57565b5090565b828054828255906000526020600020908101928215613cec5791602002820182811115613cec578251825591602001919060010190613cd1565b50805460008255600302906000526020600020908101906127939190613d6c565b5b80821115613cf85760008155600101613d58565b80821115613cf85780546001600160a81b03191681556000613d916001830182613da6565b5060028101805460ff19169055600301613d6c565b50805460008255906000526020600020908101906127939190613d57565b600067ffffffffffffffff831115613dde57613dde614814565b613df1601f8401601f191660200161469b565b9050828152838383011115613e0557600080fd5b828260208301376000602084830101529392505050565b600082601f830112613e2c578081fd5b81356020613e41613e3c836146cc565b61469b565b80838252828201915082860187848660051b8901011115613e60578586fd5b855b85811015613e87578135613e758161482a565b84529284019290840190600101613e62565b5090979650505050505050565b600060208284031215613ea5578081fd5b81356122378161482a565b60008060408385031215613ec2578081fd5b8235613ecd8161482a565b91506020830135613edd8161482a565b809150509250929050565b600080600060608486031215613efc578081fd5b8335613f078161482a565b92506020840135613f178161482a565b929592945050506040919091013590565b60008060008060808587031215613f3d578081fd5b8435613f488161482a565b93506020850135613f588161482a565b925060408501359150606085013567ffffffffffffffff811115613f7a578182fd5b8501601f81018713613f8a578182fd5b613f9987823560208401613dc4565b91505092959194509250565b60008060408385031215613fb7578182fd5b8235613fc28161482a565b91506020830135613edd8161483f565b60008060408385031215613fe4578182fd5b8235613fef8161482a565b946020939093013593505050565b60006020828403121561400e578081fd5b813567ffffffffffffffff811115614024578182fd5b612bfb84828501613e1c565b60008060408385031215614042578182fd5b67ffffffffffffffff8084351115614058578283fd5b6140658585358601613e1c565b9250602084013581811115614078578283fd5b8401601f81018613614088578283fd5b8035614096613e3c826146cc565b80828252602082019150602084018960208560051b87010111156140b8578687fd5b865b848110156141505786823511156140cf578788fd5b813586018b603f8201126140e1578889fd5b60208101356140f2613e3c826146cc565b80828252602082019150604084018f60408560051b8701011115614114578c8dfd5b8c94505b8385101561413757803583526001949094019360209283019201614118565b50875250506020948501949290920191506001016140ba565b5096999098509650505050505050565b600060208284031215614171578081fd5b81356122378161483f565b60006020828403121561418d578081fd5b81516122378161483f565b6000602082840312156141a9578081fd5b81356122378161484d565b6000602082840312156141c5578081fd5b81516122378161484d565b60008060408385031215613ec2578182fd5b6000602082840312156141f3578081fd5b813567ffffffffffffffff811115614209578182fd5b8201601f81018413614219578182fd5b612bfb84823560208401613dc4565b600060208284031215614239578081fd5b5035919050565b600060208284031215614251578081fd5b5051919050565b6000815180845260208085019450808401835b838110156142875781518752958201959082019060010161426b565b509495945050505050565b600081518084526142aa816020860160208601614752565b601f01601f19169290920160200192915050565b600681106142dc57634e487b7160e01b600052602160045260246000fd5b9052565b8054600090600181811c90808316806142fa57607f831692505b602080841082141561431a57634e487b7160e01b86526022600452602486fd5b81801561432e576001811461433f5761436c565b60ff1986168952848901965061436c565b60008881526020902060005b868110156143645781548b82015290850190830161434b565b505084890196505b50505050505092915050565b6000825161438a818460208701614752565b9190910192915050565b600084516143a6818460208901614752565b8451908301906143ba818360208901614752565b613c34818301866142e0565b60006143d282866142e0565b84516143ba818360208901614752565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061441590830184614292565b9695505050505050565b6020815260006122376020830184614258565b60208101610dee82846142be565b6040810161444e82856142be565b61223760208301846142be565b6020815260006122376020830184614292565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601690820152755041594d454e543a20696e76616c69642076616c756560501b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f4379626f726738363a2046697273742073616c65207374696c6c2072756e6e696040820152616e6760f01b606082015260800190565b6020815260018060a01b038251166020820152602082015115156040820152600060408301516080606084015261468360a0840182614258565b90506060840151151560808401528091505092915050565b604051601f8201601f1916810167ffffffffffffffff811182821017156146c4576146c4614814565b604052919050565b600067ffffffffffffffff8211156146e6576146e6614814565b5060051b60200190565b60008219821115614703576147036147e8565b500190565b600082614717576147176147fe565b500490565b6000816000190483118215151615614736576147366147e8565b500290565b60008282101561474d5761474d6147e8565b500390565b60005b8381101561476d578181015183820152602001614755565b838111156120fa5750506000910152565b600181811c9082168061479257607f821691505b602082108114156147b357634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156147cd576147cd6147e8565b5060010190565b6000826147e3576147e36147fe565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461279357600080fd5b801515811461279357600080fd5b6001600160e01b03198116811461279357600080fdfe0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3fa2646970667358221220b415b252eeeb16cae9723065cff696597edff6cd87b285b5db93fc41deb82b5f64736f6c63430008040033

Deployed Bytecode Sourcemap

205:11609:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3216:40:12;719:10:1;3216:40:12;;;-1:-1:-1;;;;;12967:32:16;;;12949:51;;3246:9:12;13031:2:16;13016:18;;13009:34;12922:18;3216:40:12;;;;;;;205:11609:3;;;;;1490:300:5;;;;;;;;;;-1:-1:-1;1490:300:5;;;;;:::i;:::-;;:::i;:::-;;;14627:14:16;;14620:22;14602:41;;14590:2;14575:18;1490:300:5;;;;;;;;2408:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12723:32:16;;;12705:51;;12693:2;12678:18;3919:217:5;12660:102:16;3457:401:5;;;;;;;;;;-1:-1:-1;3457:401:5;;;;;:::i;:::-;;:::i;:::-;;6558:367:3;;;;;;;;;;-1:-1:-1;6558:367:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10689:129::-;;;;;;;;;;-1:-1:-1;10689:129:3;;;;;:::i;:::-;;:::i;1384:49::-;;;;;;;;;;-1:-1:-1;1384:49:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;6443:107;;;;;;;;;;-1:-1:-1;6520:15:3;:22;6443:107;;;32119:25:16;;;32107:2;32092:18;6443:107:3;32074:76:16;897:30:3;;;;;;;;;;;;;;;;4944:553:12;;;;;;;;;;-1:-1:-1;4944:553:12;;;;;:::i;:::-;;:::i;4646:330:5:-;;;;;;;;;;-1:-1:-1;4646:330:5;;;;;:::i;:::-;;:::i;2438:107:3:-;;;;;;;;;;-1:-1:-1;2438:107:3;;;;;:::i;:::-;;:::i;5442:99::-;;;;;;;;;;-1:-1:-1;5442:99:3;;;;;:::i;:::-;;:::i;5761:441::-;;;;;;;;;;-1:-1:-1;5761:441:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1017:40::-;;;;;;;;;;;;;;;;10571:110;;;;;;;;;;-1:-1:-1;10571:110:3;;;;;:::i;:::-;;:::i;3341:89:12:-;;;;;;;;;;-1:-1:-1;3411:12:12;;3341:89;;4852:190:3;;;;;;;;;;-1:-1:-1;4852:190:3;;;;;:::i;:::-;;:::i;4433:133:12:-;;;;;;;;;;-1:-1:-1;4433:133:12;;;;;:::i;:::-;-1:-1:-1;;;;;4529:21:12;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;5042:179:5;;;;;;;;;;-1:-1:-1;5042:179:5;;;;;:::i;:::-;;:::i;3411:374:3:-;;;;;;;;;;-1:-1:-1;3411:374:3;;;;;:::i;:::-;;:::i;5654:99::-;;;;;;;;;;-1:-1:-1;5654:99:3;;;;;:::i;:::-;;:::i;4660:184::-;;;;;;;;;;-1:-1:-1;4660:184:3;;;;;:::i;:::-;;:::i;6210:112::-;;;;;;;;;;;;;:::i;5758:628:12:-;;;;;;;;;;-1:-1:-1;5758:628:12;;;;;:::i;:::-;;:::i;1440:49:3:-;;;;;;;;;;-1:-1:-1;1440:49:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;1554;;;;;;;;;;-1:-1:-1;1554:49:3;;;;;:::i;:::-;;;;;;;;;;;;;;5549:97;;;;;;;;;;-1:-1:-1;5549:97:3;;;;;:::i;:::-;;:::i;2111:235:5:-;;;;;;;;;;-1:-1:-1;2111:235:5;;;;;:::i;:::-;;:::i;823:30:3:-;;;;;;;;;;-1:-1:-1;823:30:3;;;;;;;;;;;10826:113;;;;;;;;;;-1:-1:-1;10826:113:3;;;;;:::i;:::-;;:::i;1849:205:5:-;;;;;;;;;;-1:-1:-1;1849:205:5;;;;;:::i;:::-;;:::i;1661:101:11:-;;;;;;;;;;;;;:::i;2325:105:3:-;;;;;;;;;;-1:-1:-1;2325:105:3;;;;;:::i;:::-;;:::i;738:35::-;;;;;;;;;;-1:-1:-1;738:35:3;;;;;;;;2662:362;;;;;;;;;;-1:-1:-1;2662:362:3;;;;;:::i;:::-;;:::i;1668:39::-;;;;;;;;;;-1:-1:-1;1668:39:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;13755:32:16;;;13737:51;;13831:14;;13824:22;13819:2;13804:18;;13797:50;13890:14;13883:22;13863:18;;;13856:50;13725:2;13710:18;1668:39:3;13692:220:16;4652:98:12;;;;;;;;;;-1:-1:-1;4652:98:12;;;;;:::i;:::-;;:::i;5050:185:3:-;;;;;;;;;;-1:-1:-1;5050:185:3;;;;;:::i;:::-;;:::i;1029:85:11:-;;;;;;;;;;-1:-1:-1;1101:6:11;;-1:-1:-1;;;;;1101:6:11;1029:85;;5243:191:3;;;;;;;;;;-1:-1:-1;5243:191:3;;;;;:::i;:::-;;:::i;2230:87::-;;;;;;;;;;-1:-1:-1;2230:87:3;;;;;:::i;:::-;;:::i;1498:49::-;;;;;;;;;;-1:-1:-1;1498:49:3;;;;;:::i;:::-;;;;;;;;;;;;;;2570:102:5;;;;;;;;;;;;;:::i;4163:107:12:-;;;;;;;;;;-1:-1:-1;4163:107:12;;;;;:::i;:::-;-1:-1:-1;;;;;4245:18:12;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;3793:501:3;;;;;;;;;;-1:-1:-1;3793:501:3;;;;;:::i;:::-;;:::i;934:30::-;;;;;;;;;;;;;;;;4203:153:5;;;;;;;;;;-1:-1:-1;4203:153:5;;;;;:::i;:::-;;:::i;1176:30:3:-;;;;;;;;;;-1:-1:-1;1176:30:3;;;;;;;;;;;;;;;:::i;1102:29::-;;;;;;;;;;;;;;;;1138;;;;;;;;;;;;;;;;5287:320:5;;;;;;;;;;-1:-1:-1;5287:320:5;;;;;:::i;:::-;;:::i;11177:634:3:-;;;;;;;;;;-1:-1:-1;11177:634:3;;;;;:::i;:::-;;:::i;1714:54::-;;;;;;;;;;-1:-1:-1;1714:54:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;3966:103:12;;;;;;;;;;-1:-1:-1;3966:103:12;;;;;:::i;:::-;-1:-1:-1;;;;;4046:16:12;4020:7;4046:16;;;:7;:16;;;;;;;3966:103;3032:371:3;;;;;;;;;;-1:-1:-1;3032:371:3;;;;;:::i;:::-;;:::i;3763:117:12:-;;;;;;;;;;-1:-1:-1;3763:117:12;;;;;:::i;:::-;-1:-1:-1;;;;;3847:26:12;3821:7;3847:26;;;:19;:26;;;;;;;3763:117;8006:1162:3;;;;;;:::i;:::-;;:::i;1610:49::-;;;;;;;;;;-1:-1:-1;1610:49:3;;;;;:::i;:::-;;;;;;;;;;;;;;10947:222;;;;;;;;;;-1:-1:-1;10947:222:3;;;;;:::i;:::-;;:::i;3519:93:12:-;;;;;;;;;;-1:-1:-1;3591:14:12;;3519:93;;4302:350:3;;;;;;;;;;;;;:::i;4422:162:5:-;;;;;;;;;;-1:-1:-1;4422:162:5;;;;;:::i;:::-;-1:-1:-1;;;;;4542:25:5;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4422:162;1064:31:3;;;;;;;;;;;;;;;;1911:198:11;;;;;;;;;;-1:-1:-1;1911:198:11;;;;;:::i;:::-;;:::i;2553:101:3:-;;;;;;;;;;-1:-1:-1;2553:101:3;;;;;:::i;:::-;;:::i;7192:511::-;;;;;;;;;;;;;:::i;971:39::-;;;;;;;;;;;;;;;;780:36;;;;;;;;;;-1:-1:-1;780:36:3;;;;;;;;;;;1490:300:5;1592:4;-1:-1:-1;;;;;;1627:40:5;;-1:-1:-1;;;1627:40:5;;:104;;-1:-1:-1;;;;;;;1683:48:5;;-1:-1:-1;;;1683:48:5;1627:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:4;;;1747:36:5;1608:175;1490:300;-1:-1:-1;;1490:300:5:o;2408:98::-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;-1:-1:-1;;;4014:73:5;;25308:2:16;4014:73:5;;;25290:21:16;25347:2;25327:18;;;25320:30;25386:34;25366:18;;;25359:62;-1:-1:-1;;;25437:18:16;;;25430:42;25489:19;;4014:73:5;;;;;;;;;-1:-1:-1;4105:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4105:24:5;;3919:217::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;-1:-1:-1;;;;;3594:11:5;:2;-1:-1:-1;;;;;3594:11:5;;;3586:57;;;;-1:-1:-1;;;3586:57:5;;26901:2:16;3586:57:5;;;26883:21:16;26940:2;26920:18;;;26913:30;26979:34;26959:18;;;26952:62;-1:-1:-1;;;27030:18:16;;;27023:31;27071:19;;3586:57:5;26873:223:16;3586:57:5;719:10:1;-1:-1:-1;;;;;3675:21:5;;;;:62;;-1:-1:-1;3700:37:5;3717:5;719:10:1;4422:162:5;:::i;3700:37::-;3654:165;;;;-1:-1:-1;;;3654:165:5;;22631:2:16;3654:165:5;;;22613:21:16;22670:2;22650:18;;;22643:30;22709:34;22689:18;;;22682:62;22780:26;22760:18;;;22753:54;22824:19;;3654:165:5;22603:246:16;3654:165:5;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3457:401;;;:::o;6558:367:3:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6690:202:3;6711:15;:22;6707:26;;6690:202;;;6791:2;-1:-1:-1;;;;;6759:34:3;:15;6775:1;6759:18;;;;;;-1:-1:-1;;;6759:18:3;;;;;;;;;;;;;;;;;;;;;;:28;-1:-1:-1;;;;;6759:28:3;:34;6755:126;;;6823:15;6839:1;6823:18;;;;;;-1:-1:-1;;;6823:18:3;;;;;;;;;;;;;;;;;;6814:27;;;;;;;;6823:18;;;;;;;6814:27;;-1:-1:-1;;;;;6814:27:3;;;;;-1:-1:-1;;;6814:27:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6823:18;;6814:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6814:27:3;;;-1:-1:-1;;6814:27:3;;;;;;;;;;;;;;;;-1:-1:-1;6860:5:3;;6755:126;6735:3;;;;:::i;:::-;;;;6690:202;;;-1:-1:-1;6911:6:3;6558:367;-1:-1:-1;;6558:367:3:o;10689:129::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;10777:33:3;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;:::-;;10689:129:::0;:::o;4944:553:12:-;-1:-1:-1;;;;;5019:16:12;;5038:1;5019:16;;;:7;:16;;;;;;5011:71;;;;-1:-1:-1;;;5011:71:12;;;;;;;:::i;:::-;5093:21;5141:15;3591:14;;;3519:93;5141:15;5117:39;;:21;:39;:::i;:::-;5093:63;;5166:15;5184:58;5200:7;5209:13;5224:17;5233:7;-1:-1:-1;;;;;4245:18:12;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;5224:17;5184:15;:58::i;:::-;5166:76;-1:-1:-1;5261:12:12;5253:68;;;;-1:-1:-1;;;5253:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;5332:18:12;;;;;;:9;:18;;;;;:29;;5354:7;;5332:18;:29;;5354:7;;5332:29;:::i;:::-;;;;;;;;5389:7;5371:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;5407:35:12;;-1:-1:-1;5425:7:12;5434;5407:17;:35::i;:::-;5457:33;;;-1:-1:-1;;;;;12967:32:16;;12949:51;;13031:2;13016:18;;13009:34;;;5457:33:12;;12922:18:16;5457:33:12;;;;;;;4944:553;;;:::o;4646:330:5:-;4835:41;719:10:1;4868:7:5;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:5;;;;;;;:::i;:::-;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;2438:107:3:-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;2511:15:3::1;:26:::0;2438:107::o;5442:99::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;5511:13:3::1;:22:::0;5442:99::o;5761:441::-;5823:13;5849:20;5883:17;5893:6;5883:9;:17::i;:::-;5872:29;;;;;;-1:-1:-1;;;5872:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5872:29:3;-1:-1:-1;5849:52:3;-1:-1:-1;5912:12:3;5955:1;5941:230;5963:5;;5958:1;:10;5941:230;;5994:10;6002:1;5994:7;:10::i;:::-;5990:170;;;6043:6;-1:-1:-1;;;;;6029:20:3;:10;6037:1;6029:7;:10::i;:::-;-1:-1:-1;;;;;6029:20:3;;6025:120;;;6092:1;6074:6;6081:7;6074:15;;;;;;-1:-1:-1;;;6074:15:3;;;;;;;;;;;;;;;;;;:19;6116:9;;;;:::i;:::-;;;;6025:120;5970:3;;;;:::i;:::-;;;;5941:230;;;-1:-1:-1;6188:6:3;;5761:441;-1:-1:-1;;;5761:441:3:o;10571:110::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;10647:26:3;;::::1;::::0;:12:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;4852:190::-:0;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;4946:9:3::1;4942:93;4961:2;:9;4957:1;:13;4942:93;;;5018:5;4991:17;:24;5009:2;5012:1;5009:5;;;;;;-1:-1:-1::0;;;5009:5:3::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;4991:24:3::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;4991:24:3;:32;;-1:-1:-1;;4991:32:3::1;::::0;::::1;;::::0;;;::::1;::::0;;4972:3;::::1;::::0;::::1;:::i;:::-;;;;4942:93;;5042:179:5::0;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;3411:374:3:-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;3487:15:3::1;::::0;::::1;;3486:16;3478:63;;;;-1:-1:-1::0;;;3478:63:3::1;;;;;;;:::i;:::-;3561:10;::::0;;;::::1;;;3560:11;3552:54;;;::::0;-1:-1:-1;;;3552:54:3;;18332:2:16;3552:54:3::1;::::0;::::1;18314:21:16::0;18371:2;18351:18;;;18344:30;18410:32;18390:18;;;18383:60;18460:18;;3552:54:3::1;18304:180:16::0;3552:54:3::1;3617:16;:22:::0;;-1:-1:-1;;3617:22:3::1;;::::0;::::1;;;;::::0;;3650:8:::1;:36:::0;;3661:25:::1;-1:-1:-1::0;;3650:36:3;;::::1;::::0;::::1;::::0;;;3704:73:::1;::::0;-1:-1:-1;;;;;;;;;;;3704:73:3;::::1;::::0;-1:-1:-1;;3661:25:3;3704:73:::1;:::i;:::-;;;;;;;;3411:374:::0;:::o;5654:99::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;5723:13:3::1;:22:::0;5654:99::o;4660:184::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;4749:9:3::1;4745:92;4764:2;:9;4760:1;:13;4745:92;;;4821:4;4794:17;:24;4812:2;4815:1;4812:5;;;;;;-1:-1:-1::0;;;4812:5:3::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;4794:24:3::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;4794:24:3;:31;;-1:-1:-1;;4794:31:3::1;::::0;::::1;;::::0;;;::::1;::::0;;4775:3;::::1;::::0;::::1;:::i;:::-;;;;4745:92;;6210:112:::0;6255:13;6287:27;6304:9;6287:16;:27::i;:::-;6280:34;;6210:112;:::o;5758:628:12:-;-1:-1:-1;;;;;5839:16:12;;5858:1;5839:16;;;:7;:16;;;;;;5831:71;;;;-1:-1:-1;;;5831:71:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;3847:26:12;;5913:21;3847:26;;;:19;:26;;;;;;5937:30;;-1:-1:-1;;;5937:30:12;;5961:4;5937:30;;;12705:51:16;-1:-1:-1;;;;;5937:15:12;;;;;12678:18:16;;5937:30:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;5913:77;;6000:15;6018:65;6034:7;6043:13;6058:24;6067:5;6074:7;-1:-1:-1;;;;;4529:21:12;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;6018:65;6000:83;-1:-1:-1;6102:12:12;6094:68;;;;-1:-1:-1;;;6094:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;6173:21:12;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;6207:7;;6173:21;:41;;6207:7;;6173:41;:::i;:::-;;;;-1:-1:-1;;;;;;;6224:26:12;;;;;;:19;:26;;;;;:37;;6254:7;;6224:26;:37;;6254:7;;6224:37;:::i;:::-;;;;-1:-1:-1;6272:47:12;;-1:-1:-1;6295:5:12;6302:7;6311;6272:22;:47::i;:::-;6334:45;;;-1:-1:-1;;;;;12967:32:16;;;12949:51;;13031:2;13016:18;;13009:34;;;6334:45:12;;;;;12922:18:16;6334:45:12;;;;;;;5758:628;;;;:::o;5549:97:3:-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;5617:12:3::1;:21:::0;5549:97::o;2111:235:5:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:5;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:5;;23821:2:16;2244:73:5;;;23803:21:16;23860:2;23840:18;;;23833:30;23899:34;23879:18;;;23872:62;-1:-1:-1;;;23950:18:16;;;23943:39;23999:19;;2244:73:5;23793:231:16;10826:113:3;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;10906:25:3;;::::1;::::0;:9:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;1849:205:5:-:0;1921:7;-1:-1:-1;;;;;1948:19:5;;1940:74;;;;-1:-1:-1;;;1940:74:5;;23410:2:16;1940:74:5;;;23392:21:16;23449:2;23429:18;;;23422:30;23488:34;23468:18;;;23461:62;-1:-1:-1;;;23539:18:16;;;23532:40;23589:19;;1940:74:5;23382:232:16;1940:74:5;-1:-1:-1;;;;;;2031:16:5;;;;;:9;:16;;;;;;;1849:205::o;1661:101:11:-;1101:6;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;2325:105:3:-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;2397:14:3::1;:25:::0;2325:105::o;2662:362::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;2732:15:3::1;::::0;::::1;;2731:16;2723:63;;;;-1:-1:-1::0;;;2723:63:3::1;;;;;;;:::i;:::-;2806:16;::::0;::::1;::::0;::::1;;;2805:17;2797:65;;;::::0;-1:-1:-1;;;2797:65:3;;15635:2:16;2797:65:3::1;::::0;::::1;15617:21:16::0;15674:2;15654:18;;;15647:30;15713:34;15693:18;;;15686:62;-1:-1:-1;;;15764:18:16;;;15757:33;15807:19;;2797:65:3::1;15607:225:16::0;2797:65:3::1;2873:10;:16:::0;;-1:-1:-1;;2873:16:3::1;::::0;;::::1;;;;::::0;;2900:8:::1;:30:::0;;2911:19:::1;-1:-1:-1::0;;2900:30:3;;::::1;::::0;::::1;::::0;;;2948:68:::1;::::0;-1:-1:-1;;;;;;;;;;;2948:68:3;::::1;::::0;2969:25:::1;::::0;2911:19;2948:68:::1;:::i;1668:39::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1668:39:3;;;-1:-1:-1;1668:39:3;-1:-1:-1;;;1668:39:3;;;;;;;;:::o;4652:98:12:-;4703:7;4729;4737:5;4729:14;;;;;;-1:-1:-1;;;4729:14:12;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4729:14:12;;4652:98;-1:-1:-1;;4652:98:12:o;5050:185:3:-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;5140:9:3::1;5136:92;5155:2;:9;5151:1;:13;5136:92;;;5212:4;5185:17;:24;5203:2;5206:1;5203:5;;;;;;-1:-1:-1::0;;;5203:5:3::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;5185:24:3::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;5185:24:3;:31;;-1:-1:-1;;5185:31:3::1;::::0;::::1;;::::0;;;::::1;::::0;;5166:3;::::1;::::0;::::1;:::i;:::-;;;;5136:92;;5243:191:::0;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;5338:9:3::1;5334:93;5353:2;:9;5349:1;:13;5334:93;;;5410:5;5383:17;:24;5401:2;5404:1;5401:5;;;;;;-1:-1:-1::0;;;5401:5:3::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;5383:24:3::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;5383:24:3;:32;;-1:-1:-1;;5383:32:3::1;::::0;::::1;;::::0;;;::::1;::::0;;5364:3;::::1;::::0;::::1;:::i;:::-;;;;5334:93;;2230:87:::0;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;2293:5:3::1;:16:::0;2230:87::o;2570:102:5:-;2626:13;2658:7;2651:14;;;;;:::i;3793:501:3:-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;3912:4:3::1;:11;3899:2;:9;:24;3891:74;;;::::0;-1:-1:-1;;;3891:74:3;;30010:2:16;3891:74:3::1;::::0;::::1;29992:21:16::0;30049:2;30029:18;;;30022:30;30088:34;30068:18;;;30061:62;-1:-1:-1;;;30139:18:16;;;30132:35;30184:19;;3891:74:3::1;29982:227:16::0;3891:74:3::1;3982:9;3978:309;3997:2;:9;3993:1;:13;3978:309;;;4028:28;4059:43;;;;;;;;4074:2;4077:1;4074:5;;;;;;-1:-1:-1::0;;;4074:5:3::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;4059:43:3::1;;;;;4081:4;4059:43;;;;;;4087:4;4092:1;4087:7;;;;;;-1:-1:-1::0;;;4087:7:3::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;4059:43;;4096:5:::1;4059:43:::0;;::::1;::::0;;;4117:15:::1;:28:::0;;4059:43;4117:28;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;;-1:-1:-1::0;;;4117:28:3::1;-1:-1:-1::0;;;;;;4117:28:3;;;-1:-1:-1;;;;;4117:28:3;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;4028:74;;-1:-1:-1;4028:74:3;;4117:28:::1;::::0;;;;;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4117:28:3::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;4117:28:3::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;4160:116:3::1;4179:4;4184:1;4179:7;;;;;;-1:-1:-1::0;;;4179:7:3::1;;;;;;;;;;;;;;;:14;4175:1;:18;4160:116;;;4256:4;4219:22;:34;4242:4;4247:1;4242:7;;;;;;-1:-1:-1::0;;;4242:7:3::1;;;;;;;;;;;;;;;4250:1;4242:10;;;;;;-1:-1:-1::0;;;4242:10:3::1;;;;;;;;;;;;;;;4219:34;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;4195:3;;;;;:::i;:::-;;;;4160:116;;;;3978:309;4008:3;;;;;:::i;:::-;;;;3978:309;;4203:153:5::0;4297:52;719:10:1;4330:8:5;4340;4297:18;:52::i;5287:320::-;5456:41;719:10:1;5489:7:5;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:5;;;;;;;:::i;:::-;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;11177:634:3:-;11250:13;11298:16;11306:7;11298;:16::i;:::-;11276:113;;;;-1:-1:-1;;;11276:113:3;;26485:2:16;11276:113:3;;;26467:21:16;26524:2;26504:18;;;26497:30;26563:34;26543:18;;;26536:62;-1:-1:-1;;;26614:18:16;;;26607:45;26669:19;;11276:113:3;26457:237:16;11276:113:3;11406:8;;;;;;;11402:202;;11479:1;11455:13;11449:27;;;;;:::i;:::-;;;:31;:143;;;;;;;;;;;;;;;;;11524:13;11539:18;:7;:16;:18::i;:::-;11559:9;11507:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11442:150;11177:634;-1:-1:-1;;11177:634:3:o;11402:202::-;11616:18;11637:10;:8;:10::i;:::-;11616:31;;11699:1;11684:4;11678:18;:22;:125;;;;;;;;;;;;;;;;;11744:4;11750:18;:7;:16;:18::i;:::-;11770:9;11727:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11678:125;11658:145;11177:634;-1:-1:-1;;;11177:634:3:o;3032:371::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;3107:10:3::1;::::0;;;::::1;;;3106:11;3098:54;;;::::0;-1:-1:-1;;;3098:54:3;;18332:2:16;3098:54:3::1;::::0;::::1;18314:21:16::0;18371:2;18351:18;;;18344:30;18410:32;18390:18;;;18383:60;18460:18;;3098:54:3::1;18304:180:16::0;3098:54:3::1;3172:16;::::0;::::1;::::0;::::1;;;3171:17;3163:67;;;::::0;-1:-1:-1;;;3163:67:3;;22225:2:16;3163:67:3::1;::::0;::::1;22207:21:16::0;22264:2;22244:18;;;22237:30;22303:34;22283:18;;;22276:62;-1:-1:-1;;;22354:18:16;;;22347:35;22399:19;;3163:67:3::1;22197:227:16::0;3163:67:3::1;3241:15;:21:::0;;;::::1;;-1:-1:-1::0;;3241:21:3;;::::1;;::::0;;;3273:8:::1;:35:::0;;3241:21;;3273:35:::1;3241:21:::0;;3273:35:::1;;;;;-1:-1:-1::0;;;;;;;;;;;3347:21:3::1;3370:24;3326:69;;;;;;;:::i;8006:1162::-:0;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;30827:2:16;2317:63:13;;;30809:21:16;30866:2;30846:18;;;30839:30;30905:33;30885:18;;;30878:61;30956:18;;2317:63:13;30799:181:16;2317:63:13;1744:1;2455:7;:18;8070:22:3::1;8095:28;8119:3:::0;8095:23:::1;:28::i;:::-;8142:10;::::0;8070:53;;-1:-1:-1;8142:10:3;;::::1;;;::::0;:29:::1;;-1:-1:-1::0;8156:15:3::1;::::0;::::1;;8142:29;:49;;;-1:-1:-1::0;8175:16:3::1;::::0;::::1;::::0;::::1;;;8142:49;8134:90;;;::::0;-1:-1:-1;;;8134:90:3;;24591:2:16;8134:90:3::1;::::0;::::1;24573:21:16::0;24630:2;24610:18;;;24603:30;24669:29;24649:18;;;24642:57;24716:18;;8134:90:3::1;24563:177:16::0;8134:90:3::1;8269:11;::::0;8260:5:::1;::::0;8243:22:::1;::::0;:14;:22:::1;:::i;:::-;:37;;8235:83;;;::::0;-1:-1:-1;;;8235:83:3;;27303:2:16;8235:83:3::1;::::0;::::1;27285:21:16::0;27342:2;27322:18;;;27315:30;27381:34;27361:18;;;27354:62;-1:-1:-1;;;27432:18:16;;;27425:31;27473:19;;8235:83:3::1;27275:223:16::0;8235:83:3::1;8347:24;8335:8;::::0;::::1;;:36;::::0;::::1;;;;-1:-1:-1::0;;;8335:36:3::1;;;;;;;;;;8331:830;;;8388:19;8403:3;8388:14;:19::i;:::-;8331:830;;;8441:25;8429:8;::::0;::::1;;:37;::::0;::::1;;;;-1:-1:-1::0;;;8429:37:3::1;;;;;;;;;;8425:736;;;8483:20;8499:3;8483:15;:20::i;8425:736::-;8537:19;8525:8;::::0;::::1;;:31;::::0;::::1;;;;-1:-1:-1::0;;;8525:31:3::1;;;;;;;;;;8521:640;;;8581:10;::::0;;;::::1;;;8573:54;;;::::0;-1:-1:-1;;;8573:54:3;;28123:2:16;8573:54:3::1;::::0;::::1;28105:21:16::0;28162:2;28142:18;;;28135:30;28201:33;28181:18;;;28174:61;28252:18;;8573:54:3::1;28095:181:16::0;8573:54:3::1;8671:3;8663:5;;:11;;;;:::i;:::-;8650:9;:24;8642:59;;;;-1:-1:-1::0;;;8642:59:3::1;;;;;;;:::i;:::-;8760:13;::::0;8739:10:::1;8724:26;::::0;;;:14:::1;:26:::0;;;;;;:32:::1;::::0;8753:3;;8724:32:::1;:::i;:::-;:49;;8716:87;;;::::0;-1:-1:-1;;;8716:87:3;;31187:2:16;8716:87:3::1;::::0;::::1;31169:21:16::0;31226:2;31206:18;;;31199:30;31265:27;31245:18;;;31238:55;31310:18;;8716:87:3::1;31159:175:16::0;8716:87:3::1;8833:10;8818:26;::::0;;;:14:::1;:26:::0;;;;;:33;;8848:3;;8818:26;:33:::1;::::0;8848:3;;8818:33:::1;:::i;:::-;::::0;;;-1:-1:-1;8872:6:3::1;::::0;-1:-1:-1;8868:241:3::1;8888:3;8884:1;:7;8868:241;;;8916:5;:7:::0;;;:5:::1;:7;::::0;::::1;:::i;:::-;;;;;;8942:105;8971:5;::::0;8948:29:::1;::::0;;;:22:::1;:29;::::0;;;;;::::1;;::::0;:47:::1;;;8981:14;8989:5;;8981:7;:14::i;:::-;8942:105;;;9020:5;:7:::0;;;:5:::1;:7;::::0;::::1;:::i;:::-;;;;;;8942:105;;;9065:28;9075:10;9087:5;;9065:9;:28::i;:::-;8893:3:::0;::::1;::::0;::::1;:::i;:::-;;;;8868:241;;;-1:-1:-1::0;9128:21:3::1;::::0;;9133:10:::1;12949:51:16::0;;13031:2;13016:18;;13009:34;;;9128:21:3::1;::::0;12922:18:16;9128:21:3::1;;;;;;;8521:640;-1:-1:-1::0;;1701:1:13;2628:7;:22;8006:1162:3:o;10947:222::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;11015:8:3::1;:21:::0;;;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;11015:21:3;;::::1;::::0;;;::::1;::::0;;;11047:115:::1;;-1:-1:-1::0;;;;;;;;;;;11104:22:3::1;11128:21;11083:67;;;;;;;:::i;11047:115::-;10947:222:::0;:::o;4302:350::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;4370:9:3::1;4366:246;4389:15;:22:::0;4385:26;::::1;4366:246;;;4437:9;4433:168;4456:15;4472:1;4456:18;;;;;;-1:-1:-1::0;;;4456:18:3::1;;;;;;;;;;;;;;;;;;;:31;;:38;;;;4452:1;:42;4433:168;;;4527:22;:58;4550:15;4566:1;4550:18;;;;;;-1:-1:-1::0;;;4550:18:3::1;;;;;;;;;;;;;;;;;;;:31;;4582:1;4550:34;;;;;;-1:-1:-1::0;;;4550:34:3::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;4527:58;;;::::1;::::0;;;;;;;;4520:65;;-1:-1:-1;;4520:65:3::1;::::0;;4496:3;::::1;::::0;::::1;:::i;:::-;;;;4433:168;;;-1:-1:-1::0;4413:3:3;::::1;::::0;::::1;:::i;:::-;;;;4366:246;;;-1:-1:-1::0;4622:22:3::1;4629:15;;4622:22;:::i;1911:198:11:-:0;1101:6;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:11;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:11;;16810:2:16;1991:73:11::1;::::0;::::1;16792:21:16::0;16849:2;16829:18;;;16822:30;16888:34;16868:18;;;16861:62;-1:-1:-1;;;16939:18:16;;;16932:36;16985:19;;1991:73:11::1;16782:228:16::0;1991:73:11::1;2074:28;2093:8;2074:18;:28::i;2553:101:3:-:0;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;2623:11:3::1;:23:::0;2553:101::o;7192:511::-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;30827:2:16;2317:63:13;;;30809:21:16;30866:2;30846:18;;;30839:30;30905:33;30885:18;;;30878:61;30956:18;;2317:63:13;30799:181:16;2317:63:13;1744:1;2455:7;:18;7245:28:3::1;7276:29;7294:10;7276:17;:29::i;:::-;7245:60;;7324:6;:15;;;7316:62;;;::::0;-1:-1:-1;;;7316:62:3;;26082:2:16;7316:62:3::1;::::0;::::1;26064:21:16::0;26121:2;26101:18;;;26094:30;26160:34;26140:18;;;26133:62;-1:-1:-1;;;26211:18:16;;;26204:32;26253:19;;7316:62:3::1;26054:224:16::0;7316:62:3::1;7398:6;:13;;;7397:14;7389:52;;;::::0;-1:-1:-1;;;7389:52:3;;23056:2:16;7389:52:3::1;::::0;::::1;23038:21:16::0;23095:2;23075:18;;;23068:30;23134:27;23114:18;;;23107:55;23179:18;;7389:52:3::1;23028:175:16::0;7389:52:3::1;7458:6;7454:196;7474:6;:19;;;:26;7470:1;:30;7454:196;;;7526:31;7534:6;:19;;;7554:1;7534:22;;;;;;-1:-1:-1::0;;;7534:22:3::1;;;;;;;;;;;;;;;7526:7;:31::i;:::-;7521:118;;7578:45;7588:10;7600:6;:19;;;7620:1;7600:22;;;;;;-1:-1:-1::0;;;7600:22:3::1;;;;;;;;;;;;;;;7578:9;:45::i;:::-;7502:3:::0;::::1;::::0;::::1;:::i;:::-;;;;7454:196;;;;7660:35;7684:10;7660:23;:35::i;:::-;-1:-1:-1::0;1701:1:13;2628:7;:22;7192:511:3:o;7079:125:5:-;7144:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:5;:30;;;7079:125::o;11088:171::-;11162:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11162:29:5;-1:-1:-1;;;;;11162:29:5;;;;;;;;:24;;11215:23;11162:24;11215:14;:23::i;:::-;-1:-1:-1;;;;;11206:46:5;;;;;;;;;;;11088:171;;:::o;6558:242:12:-;6763:12;;-1:-1:-1;;;;;6743:16:12;;6700:7;6743:16;;;:7;:16;;;;;;6700:7;;6778:15;;6727:32;;:13;:32;:::i;:::-;6726:49;;;;:::i;:::-;:67;;;;:::i;:::-;6719:74;6558:242;-1:-1:-1;;;;6558:242:12:o;2397:312:0:-;2511:6;2486:21;:31;;2478:73;;;;-1:-1:-1;;;2478:73:0;;20635:2:16;2478:73:0;;;20617:21:16;20674:2;20654:18;;;20647:30;20713:31;20693:18;;;20686:59;20762:18;;2478:73:0;20607:179:16;2478:73:0;2563:12;2581:9;-1:-1:-1;;;;;2581:14:0;2603:6;2581:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2562:52;;;2632:7;2624:78;;;;-1:-1:-1;;;2624:78:0;;20208:2:16;2624:78:0;;;20190:21:16;20247:2;20227:18;;;20220:30;20286:34;20266:18;;;20259:62;20357:28;20337:18;;;20330:56;20403:19;;2624:78:0;20180:248:16;7362:344:5;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;-1:-1:-1;;;7471:73:5;;21400:2:16;7471:73:5;;;21382:21:16;21439:2;21419:18;;;21412:30;21478:34;21458:18;;;21451:62;-1:-1:-1;;;21529:18:16;;;21522:42;21581:19;;7471:73:5;21372:234:16;7471:73:5;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;-1:-1:-1;;;;;7611:16:5;:7;-1:-1:-1;;;;;7611:16:5;;:51;;;;7655:7;-1:-1:-1;;;;;7631:31:5;:20;7643:7;7631:11;:20::i;:::-;-1:-1:-1;;;;;7631:31:5;;7611:51;:87;;;-1:-1:-1;;;;;;4542:25:5;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7603:96;7362:344;-1:-1:-1;;;;7362:344:5:o;10372:605::-;10526:4;-1:-1:-1;;;;;10499:31:5;:23;10514:7;10499:14;:23::i;:::-;-1:-1:-1;;;;;10499:31:5;;10491:81;;;;-1:-1:-1;;;10491:81:5;;17217:2:16;10491:81:5;;;17199:21:16;17256:2;17236:18;;;17229:30;17295:34;17275:18;;;17268:62;-1:-1:-1;;;17346:18:16;;;17339:35;17391:19;;10491:81:5;17189:227:16;10491:81:5;-1:-1:-1;;;;;10590:16:5;;10582:65;;;;-1:-1:-1;;;10582:65:5;;19449:2:16;10582:65:5;;;19431:21:16;19488:2;19468:18;;;19461:30;19527:34;19507:18;;;19500:62;-1:-1:-1;;;19578:18:16;;;19571:34;19622:19;;10582:65:5;19421:226:16;10582:65:5;10759:29;10776:1;10780:7;10759:8;:29::i;:::-;-1:-1:-1;;;;;10799:15:5;;;;;;:9;:15;;;;;:20;;10818:1;;10799:15;:20;;10818:1;;10799:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10829:13:5;;;;;;:9;:13;;;;;:18;;10846:1;;10829:13;:18;;10846:1;;10829:18;:::i;:::-;;;;-1:-1:-1;;10857:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10857:21:5;-1:-1:-1;;;;;10857:21:5;;;;;;;;;10894:27;;10857:16;;10894:27;;;;;;;3457:401;;;:::o;687:205:14:-;826:58;;;-1:-1:-1;;;;;12967:32:16;;826:58:14;;;12949:51:16;13016:18;;;;13009:34;;;826:58:14;;;;;;;;;;12922:18:16;;;;826:58:14;;;;;;;;-1:-1:-1;;;;;826:58:14;-1:-1:-1;;;826:58:14;;;799:86;;819:5;;799:19;:86::i;2263:187:11:-;2355:6;;;-1:-1:-1;;;;;2371:17:11;;;-1:-1:-1;;;;;;2371:17:11;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2263:187;;:::o;11394:307:5:-;11544:8;-1:-1:-1;;;;;11535:17:5;:5;-1:-1:-1;;;;;11535:17:5;;;11527:55;;;;-1:-1:-1;;;11527:55:5;;19854:2:16;11527:55:5;;;19836:21:16;19893:2;19873:18;;;19866:30;19932:27;19912:18;;;19905:55;19977:18;;11527:55:5;19826:175:16;11527:55:5;-1:-1:-1;;;;;11592:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11592:46:5;;;;;;;;;;11653:41;;14602::16;;;11653::5;;14575:18:16;11653:41:5;;;;;;;11394:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:5;;;;;;;:::i;328:703:15:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:15;;;;;;;;;;;;-1:-1:-1;;;627:10:15;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:15;;-1:-1:-1;773:2:15;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;-1:-1:-1;;;817:17:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:15;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:15;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;-1:-1:-1;;;902:14:15;;;;;;;;;;;;:56;-1:-1:-1;;;;;902:56:15;;;;;;;;-1:-1:-1;972:11:15;981:2;972:11;;:::i;:::-;;;844:150;;6330:105:3;6382:13;6415:12;6408:19;;;;;:::i;7711:287::-;7776:4;;7831:1;7818:144;7847:3;7834:9;7838:5;7834:1;:9;:::i;:::-;:16;7818:144;;7876:22;:31;7905:1;7899:5;;:7;;;;:::i;:::-;7876:31;;;;;;;;;;;-1:-1:-1;7876:31:3;;;;7872:79;;;7928:7;;;;:::i;:::-;;;;7872:79;7852:3;;;;:::i;:::-;;;;7818:144;;;-1:-1:-1;7979:11:3;7987:3;7979:5;:11;:::i;9176:626::-;9267:3;9250:14;;:20;;;;:::i;:::-;9237:9;:33;9229:68;;;;-1:-1:-1;;;9229:68:3;;;;;;;:::i;:::-;9334:10;9316:29;;;;:17;:29;;;;;;;;9308:72;;;;-1:-1:-1;;;9308:72:3;;28841:2:16;9308:72:3;;;28823:21:16;28880:2;28860:18;;;28853:30;28919:32;28899:18;;;28892:60;28969:18;;9308:72:3;28813:180:16;9308:72:3;9435:12;;9414:10;9399:26;;;;:14;:26;;;;;;:32;;9428:3;;9399:32;:::i;:::-;:48;;9391:84;;;;-1:-1:-1;;;9391:84:3;;17980:2:16;9391:84:3;;;17962:21:16;18019:2;17999:18;;;17992:30;18058:25;18038:18;;;18031:53;18101:18;;9391:84:3;17952:173:16;9391:84:3;9501:10;9486:26;;;;:14;:26;;;;;:33;;9516:3;;9486:26;:33;;9516:3;;9486:33;:::i;:::-;;;;-1:-1:-1;9536:6:3;;-1:-1:-1;9532:217:3;9552:3;9548:1;:7;9532:217;;;9576:5;:7;;;:5;:7;;;:::i;:::-;;;;;;9598:97;9627:5;;9604:29;;;;:22;:29;;;;;;;;;:47;;;9637:14;9645:5;;9637:7;:14::i;:::-;9598:97;;;9672:5;:7;;;:5;:7;;;:::i;:::-;;;;;;9598:97;;;9709:28;9719:10;9731:5;;9709:9;:28::i;:::-;9557:3;;;;:::i;:::-;;;;9532:217;;;-1:-1:-1;9764:30:3;;;9778:10;12949:51:16;;13031:2;13016:18;;13009:34;;;9764:30:3;;12922:18:16;9764:30:3;12904:145:16;9810:709:3;9872:16;;;;;;;9864:67;;;;-1:-1:-1;;;9864:67:3;;29200:2:16;9864:67:3;;;29182:21:16;29239:2;29219:18;;;29212:30;29278:34;29258:18;;;29251:62;-1:-1:-1;;;29329:18:16;;;29322:36;29375:19;;9864:67:3;29172:228:16;9864:67:3;9981:3;9963:15;;:21;;;;:::i;:::-;9950:9;:34;9942:69;;;;-1:-1:-1;;;9942:69:3;;;;;;;:::i;:::-;10048:10;10030:29;;;;:17;:29;;;;;;;;10022:73;;;;-1:-1:-1;;;10022:73:3;;24231:2:16;10022:73:3;;;24213:21:16;24270:2;24250:18;;;24243:30;24309:33;24289:18;;;24282:61;24360:18;;10022:73:3;24203:181:16;10022:73:3;10150:13;;10129:10;10114:26;;;;:14;:26;;;;;;:32;;10143:3;;10114:32;:::i;:::-;:49;;10106:85;;;;-1:-1:-1;;;10106:85:3;;16458:2:16;10106:85:3;;;16440:21:16;16497:2;16477:18;;;16470:30;16536:25;16516:18;;;16509:53;16579:18;;10106:85:3;16430:173:16;10106:85:3;10217:10;10202:26;;;;:14;:26;;;;;:33;;10232:3;;10202:26;:33;;10232:3;;10202:33;:::i;:::-;;;;-1:-1:-1;10252:6:3;;-1:-1:-1;10248:217:3;10268:3;10264:1;:7;10248:217;;;10292:5;:7;;;:5;:7;;;:::i;:::-;;;;;;10314:97;10343:5;;10320:29;;;;:22;:29;;;;;;;;;:47;;;10353:14;10361:5;;10353:7;:14::i;:::-;10314:97;;;10388:5;:7;;;:5;:7;;;:::i;:::-;;;;;;10314:97;;;10425:28;10435:10;10447:5;;10425:9;:28::i;:::-;10273:3;;;;:::i;:::-;;;;10248:217;;;-1:-1:-1;10480:31:3;;;10495:10;12949:51:16;;13031:2;13016:18;;13009:34;;;10480:31:3;;12922:18:16;10480:31:3;12904:145:16;8036:108:5;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;6933:251:3:-;7001:6;6997:180;7017:15;:22;7013:26;;6997:180;;;7095:2;-1:-1:-1;;;;;7063:34:3;:15;7079:1;7063:18;;;;;;-1:-1:-1;;;7063:18:3;;;;;;;;;;;;;;;;;;;;;;:28;-1:-1:-1;;;;;7063:28:3;:34;7060:106;;;7146:4;7118:15;7134:1;7118:18;;;;;;-1:-1:-1;;;7118:18:3;;;;;;;;;;;;;;;;;;;;;;:25;;:32;;-1:-1:-1;;7118:32:3;;;;;;;;;;7060:106;7041:3;;;;:::i;:::-;;;;6997:180;;3193:706:14;3612:23;3638:69;3666:4;3638:69;;;;;;;;;;;;;;;;;3646:5;-1:-1:-1;;;;;3638:27:14;;;:69;;;;;:::i;:::-;3721:17;;3612:95;;-1:-1:-1;3721:21:14;3717:176;;3816:10;3805:30;;;;;;;;;;;;:::i;:::-;3797:85;;;;-1:-1:-1;;;3797:85:14;;30416:2:16;3797:85:14;;;30398:21:16;30455:2;30435:18;;;30428:30;30494:34;30474:18;;;30467:62;-1:-1:-1;;;30545:18:16;;;30538:40;30595:19;;3797:85:14;30388:232:16;12254:778:5;12404:4;-1:-1:-1;;;;;12424:13:5;;1450:19:0;:23;12420:606:5;;12459:72;;-1:-1:-1;;;12459:72:5;;-1:-1:-1;;;;;12459:36:5;;;;;:72;;719:10:1;;12510:4:5;;12516:7;;12525:5;;12459:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12459:72:5;;;;;;;;-1:-1:-1;;12459:72:5;;;;;;;;;;;;:::i;:::-;;;12455:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12698:13:5;;12694:266;;12740:60;;-1:-1:-1;;;12740:60:5;;;;;;;:::i;12694:266::-;12912:6;12906:13;12897:6;12893:2;12889:15;12882:38;12455:519;-1:-1:-1;;;;;;12581:51:5;-1:-1:-1;;;12581:51:5;;-1:-1:-1;12574:58:5;;12420:606;-1:-1:-1;13011:4:5;12254:778;;;;;;:::o;8365:311::-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;-1:-1:-1;;;8518:151:5;;;;;;;:::i;3846:223:0:-;3979:12;4010:52;4032:6;4040:4;4046:1;4049:12;4010:21;:52::i;8998:427:5:-;-1:-1:-1;;;;;9077:16:5;;9069:61;;;;-1:-1:-1;;;9069:61:5;;24947:2:16;9069:61:5;;;24929:21:16;;;24966:18;;;24959:30;25025:34;25005:18;;;24998:62;25077:18;;9069:61:5;24919:182:16;9069:61:5;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;-1:-1:-1;;;9140:58:5;;17623:2:16;9140:58:5;;;17605:21:16;17662:2;17642:18;;;17635:30;17701;17681:18;;;17674:58;17749:18;;9140:58:5;17595:178:16;9140:58:5;-1:-1:-1;;;;;9265:13:5;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9293:21:5;-1:-1:-1;;;;;9293:21:5;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;10777::3::1;10689:129:::0;:::o;4933:499:0:-;5098:12;5155:5;5130:21;:30;;5122:81;;;;-1:-1:-1;;;5122:81:0;;20993:2:16;5122:81:0;;;20975:21:16;21032:2;21012:18;;;21005:30;21071:34;21051:18;;;21044:62;-1:-1:-1;;;21122:18:16;;;21115:36;21168:19;;5122:81:0;20965:228:16;5122:81:0;-1:-1:-1;;;;;1450:19:0;;;5213:60;;;;-1:-1:-1;;;5213:60:0;;28483:2:16;5213:60:0;;;28465:21:16;28522:2;28502:18;;;28495:30;28561:31;28541:18;;;28534:59;28610:18;;5213:60:0;28455:179:16;5213:60:0;5285:12;5299:23;5326:6;-1:-1:-1;;;;;5326:11:0;5345:5;5352:4;5326:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5284:73;;;;5374:51;5391:7;5400:10;5412:12;5374:16;:51::i;:::-;5367:58;4933:499;-1:-1:-1;;;;;;;4933:499:0:o;7546:692::-;7692:12;7720:7;7716:516;;;-1:-1:-1;7750:10:0;7743:17;;7716:516;7861:17;;:21;7857:365;;8055:10;8049:17;8115:15;8102:10;8098:2;8094:19;8087:44;8004:145;8194:12;8187:20;;-1:-1:-1;;;8187:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:406:16:-;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:16;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:768::-;479:5;532:3;525:4;517:6;513:17;509:27;499:2;;554:5;547;540:20;499:2;594:6;581:20;620:4;644:60;660:43;700:2;660:43;:::i;:::-;644:60;:::i;:::-;726:3;750:2;745:3;738:15;778:2;773:3;769:12;762:19;;813:2;805:6;801:15;865:3;860:2;854;851:1;847:10;839:6;835:23;831:32;828:41;825:2;;;886:5;879;872:20;825:2;912:5;926:238;940:2;937:1;934:9;926:238;;;1011:3;998:17;1028:31;1053:5;1028:31;:::i;:::-;1072:18;;1110:12;;;;1142;;;;958:1;951:9;926:238;;;-1:-1:-1;1182:5:16;;489:704;-1:-1:-1;;;;;;;489:704:16:o;1198:257::-;1257:6;1310:2;1298:9;1289:7;1285:23;1281:32;1278:2;;;1331:6;1323;1316:22;1278:2;1375:9;1362:23;1394:31;1419:5;1394:31;:::i;1730:398::-;1798:6;1806;1859:2;1847:9;1838:7;1834:23;1830:32;1827:2;;;1880:6;1872;1865:22;1827:2;1924:9;1911:23;1943:31;1968:5;1943:31;:::i;:::-;1993:5;-1:-1:-1;2050:2:16;2035:18;;2022:32;2063:33;2022:32;2063:33;:::i;:::-;2115:7;2105:17;;;1817:311;;;;;:::o;2133:466::-;2210:6;2218;2226;2279:2;2267:9;2258:7;2254:23;2250:32;2247:2;;;2300:6;2292;2285:22;2247:2;2344:9;2331:23;2363:31;2388:5;2363:31;:::i;:::-;2413:5;-1:-1:-1;2470:2:16;2455:18;;2442:32;2483:33;2442:32;2483:33;:::i;:::-;2237:362;;2535:7;;-1:-1:-1;;;2589:2:16;2574:18;;;;2561:32;;2237:362::o;2604:824::-;2699:6;2707;2715;2723;2776:3;2764:9;2755:7;2751:23;2747:33;2744:2;;;2798:6;2790;2783:22;2744:2;2842:9;2829:23;2861:31;2886:5;2861:31;:::i;:::-;2911:5;-1:-1:-1;2968:2:16;2953:18;;2940:32;2981:33;2940:32;2981:33;:::i;:::-;3033:7;-1:-1:-1;3087:2:16;3072:18;;3059:32;;-1:-1:-1;3142:2:16;3127:18;;3114:32;3169:18;3158:30;;3155:2;;;3206:6;3198;3191:22;3155:2;3234:22;;3287:4;3279:13;;3275:27;-1:-1:-1;3265:2:16;;3321:6;3313;3306:22;3265:2;3349:73;3414:7;3409:2;3396:16;3391:2;3387;3383:11;3349:73;:::i;:::-;3339:83;;;2734:694;;;;;;;:::o;3433:392::-;3498:6;3506;3559:2;3547:9;3538:7;3534:23;3530:32;3527:2;;;3580:6;3572;3565:22;3527:2;3624:9;3611:23;3643:31;3668:5;3643:31;:::i;:::-;3693:5;-1:-1:-1;3750:2:16;3735:18;;3722:32;3763:30;3722:32;3763:30;:::i;3830:325::-;3898:6;3906;3959:2;3947:9;3938:7;3934:23;3930:32;3927:2;;;3980:6;3972;3965:22;3927:2;4024:9;4011:23;4043:31;4068:5;4043:31;:::i;:::-;4093:5;4145:2;4130:18;;;;4117:32;;-1:-1:-1;;;3917:238:16:o;4160:368::-;4244:6;4297:2;4285:9;4276:7;4272:23;4268:32;4265:2;;;4318:6;4310;4303:22;4265:2;4363:9;4350:23;4396:18;4388:6;4385:30;4382:2;;;4433:6;4425;4418:22;4382:2;4461:61;4514:7;4505:6;4494:9;4490:22;4461:61;:::i;4533:1967::-;4676:6;4684;4737:2;4725:9;4716:7;4712:23;4708:32;4705:2;;;4758:6;4750;4743:22;4705:2;4786:18;4844:2;4832:9;4819:23;4816:31;4813:2;;;4865:6;4857;4850:22;4813:2;4893:78;4963:7;4950:9;4937:23;4926:9;4922:39;4893:78;:::i;:::-;4883:88;;5022:2;5011:9;5007:18;4994:32;5049:2;5041:6;5038:14;5035:2;;;5070:6;5062;5055:22;5035:2;5098:22;;5151:4;5143:13;;5139:27;-1:-1:-1;5129:2:16;;5185:6;5177;5170:22;5129:2;5226;5213:16;5249:60;5265:43;5305:2;5265:43;:::i;5249:60::-;5331:3;5355:2;5350:3;5343:15;5383:2;5378:3;5374:12;5367:19;;5414:2;5410;5406:11;5462:7;5457:2;5451;5448:1;5444:10;5440:2;5436:19;5432:28;5429:41;5426:2;;;5488:6;5480;5473:22;5426:2;5515:6;5530:940;5544:2;5541:1;5538:9;5530:940;;;5614:2;5608:3;5595:17;5592:25;5589:2;;;5635:6;5627;5620:22;5589:2;5688:3;5675:17;5671:2;5667:26;5733:7;5728:2;5724;5720:11;5716:25;5706:2;;5760:6;5752;5745:22;5706:2;5813;5809;5805:11;5792:25;5843:60;5859:43;5899:2;5859:43;:::i;5843:60::-;5929:5;5961:2;5954:5;5947:17;5997:2;5990:5;5986:14;5977:23;;6034:2;6030;6026:11;6086:7;6081:2;6075;6072:1;6068:10;6064:2;6060:19;6056:28;6053:41;6050:2;;;6112:6;6104;6097:22;6050:2;6145:6;6134:17;;6164:201;6180:2;6175:3;6172:11;6164:201;;;6251:19;;6237:34;;6202:1;6193:11;;;;;6308:2;6297:14;;;;6337;6164:201;;;-1:-1:-1;6378:18:16;;-1:-1:-1;;6425:2:16;6416:12;;;;6448;;;;;-1:-1:-1;5562:1:16;5555:9;5530:940;;;-1:-1:-1;4695:1805:16;;6489:5;;-1:-1:-1;4695:1805:16;-1:-1:-1;;;;;;;4695:1805:16:o;6505:251::-;6561:6;6614:2;6602:9;6593:7;6589:23;6585:32;6582:2;;;6635:6;6627;6620:22;6582:2;6679:9;6666:23;6698:28;6720:5;6698:28;:::i;6761:255::-;6828:6;6881:2;6869:9;6860:7;6856:23;6852:32;6849:2;;;6902:6;6894;6887:22;6849:2;6939:9;6933:16;6958:28;6980:5;6958:28;:::i;7021:255::-;7079:6;7132:2;7120:9;7111:7;7107:23;7103:32;7100:2;;;7153:6;7145;7138:22;7100:2;7197:9;7184:23;7216:30;7240:5;7216:30;:::i;7281:259::-;7350:6;7403:2;7391:9;7382:7;7378:23;7374:32;7371:2;;;7424:6;7416;7409:22;7371:2;7461:9;7455:16;7480:30;7504:5;7480:30;:::i;7822:413::-;7905:6;7913;7966:2;7954:9;7945:7;7941:23;7937:32;7934:2;;;7987:6;7979;7972:22;8240:480;8309:6;8362:2;8350:9;8341:7;8337:23;8333:32;8330:2;;;8383:6;8375;8368:22;8330:2;8428:9;8415:23;8461:18;8453:6;8450:30;8447:2;;;8498:6;8490;8483:22;8447:2;8526:22;;8579:4;8571:13;;8567:27;-1:-1:-1;8557:2:16;;8613:6;8605;8598:22;8557:2;8641:73;8706:7;8701:2;8688:16;8683:2;8679;8675:11;8641:73;:::i;8725:190::-;8784:6;8837:2;8825:9;8816:7;8812:23;8808:32;8805:2;;;8858:6;8850;8843:22;8805:2;-1:-1:-1;8886:23:16;;8795:120;-1:-1:-1;8795:120:16:o;8920:194::-;8990:6;9043:2;9031:9;9022:7;9018:23;9014:32;9011:2;;;9064:6;9056;9049:22;9011:2;-1:-1:-1;9092:16:16;;9001:113;-1:-1:-1;9001:113:16:o;9119:437::-;9172:3;9210:5;9204:12;9237:6;9232:3;9225:19;9263:4;9292:2;9287:3;9283:12;9276:19;;9329:2;9322:5;9318:14;9350:3;9362:169;9376:6;9373:1;9370:13;9362:169;;;9437:13;;9425:26;;9471:12;;;;9506:15;;;;9398:1;9391:9;9362:169;;;-1:-1:-1;9547:3:16;;9180:376;-1:-1:-1;;;;;9180:376:16:o;9561:257::-;9602:3;9640:5;9634:12;9667:6;9662:3;9655:19;9683:63;9739:6;9732:4;9727:3;9723:14;9716:4;9709:5;9705:16;9683:63;:::i;:::-;9800:2;9779:15;-1:-1:-1;;9775:29:16;9766:39;;;;9807:4;9762:50;;9610:208;-1:-1:-1;;9610:208:16:o;9823:242::-;9909:1;9902:5;9899:12;9889:2;;9954:10;9949:3;9945:20;9942:1;9935:31;9989:4;9986:1;9979:15;10017:4;10014:1;10007:15;9889:2;10041:18;;9879:186::o;10070:979::-;10155:12;;10120:3;;10212:1;10232:18;;;;10285;;;;10312:2;;10366:4;10358:6;10354:17;10344:27;;10312:2;10392;10440;10432:6;10429:14;10409:18;10406:38;10403:2;;;-1:-1:-1;;;10467:33:16;;10523:4;10520:1;10513:15;10553:4;10474:3;10541:17;10403:2;10584:18;10611:104;;;;10729:1;10724:319;;;;10577:466;;10611:104;-1:-1:-1;;10644:24:16;;10632:37;;10689:16;;;;-1:-1:-1;10611:104:16;;10724:319;32670:4;32689:17;;;32739:4;32723:21;;10818:1;10832:165;10846:6;10843:1;10840:13;10832:165;;;10924:14;;10911:11;;;10904:35;10967:16;;;;10861:10;;10832:165;;;10836:3;;11026:6;11021:3;11017:16;11010:23;;10577:466;;;;;;;10128:921;;;;:::o;11054:274::-;11183:3;11221:6;11215:13;11237:53;11283:6;11278:3;11271:4;11263:6;11259:17;11237:53;:::i;:::-;11306:16;;;;;11191:137;-1:-1:-1;;11191:137:16:o;11333:550::-;11557:3;11595:6;11589:13;11611:53;11657:6;11652:3;11645:4;11637:6;11633:17;11611:53;:::i;:::-;11727:13;;11686:16;;;;11749:57;11727:13;11686:16;11783:4;11771:17;;11749:57;:::i;:::-;11822:55;11867:8;11860:5;11856:20;11848:6;11822:55;:::i;11888:456::-;12109:3;12137:38;12171:3;12163:6;12137:38;:::i;:::-;12204:6;12198:13;12220:52;12265:6;12261:2;12254:4;12246:6;12242:17;12220:52;:::i;13054:488::-;-1:-1:-1;;;;;13323:15:16;;;13305:34;;13375:15;;13370:2;13355:18;;13348:43;13422:2;13407:18;;13400:34;;;13470:3;13465:2;13450:18;;13443:31;;;13248:4;;13491:45;;13516:19;;13508:6;13491:45;:::i;:::-;13483:53;13257:285;-1:-1:-1;;;;;;13257:285:16:o;14196:261::-;14375:2;14364:9;14357:21;14338:4;14395:56;14447:2;14436:9;14432:18;14424:6;14395:56;:::i;14654:217::-;14804:2;14789:18;;14816:49;14793:9;14847:6;14816:49;:::i;14876:328::-;15070:2;15055:18;;15082:49;15059:9;15113:6;15082:49;:::i;:::-;15140:58;15194:2;15183:9;15179:18;15171:6;15140:58;:::i;15209:219::-;15358:2;15347:9;15340:21;15321:4;15378:44;15418:2;15407:9;15403:18;15395:6;15378:44;:::i;15837:414::-;16039:2;16021:21;;;16078:2;16058:18;;;16051:30;16117:34;16112:2;16097:18;;16090:62;-1:-1:-1;;;16183:2:16;16168:18;;16161:48;16241:3;16226:19;;16011:240::o;18489:346::-;18691:2;18673:21;;;18730:2;18710:18;;;18703:30;-1:-1:-1;;;18764:2:16;18749:18;;18742:52;18826:2;18811:18;;18663:172::o;18840:402::-;19042:2;19024:21;;;19081:2;19061:18;;;19054:30;19120:34;19115:2;19100:18;;19093:62;-1:-1:-1;;;19186:2:16;19171:18;;19164:36;19232:3;19217:19;;19014:228::o;21611:407::-;21813:2;21795:21;;;21852:2;21832:18;;;21825:30;21891:34;21886:2;21871:18;;21864:62;-1:-1:-1;;;21957:2:16;21942:18;;21935:41;22008:3;21993:19;;21785:233::o;25519:356::-;25721:2;25703:21;;;25740:18;;;25733:30;25799:34;25794:2;25779:18;;25772:62;25866:2;25851:18;;25693:182::o;27503:413::-;27705:2;27687:21;;;27744:2;27724:18;;;27717:30;27783:34;27778:2;27763:18;;27756:62;-1:-1:-1;;;27849:2:16;27834:18;;27827:47;27906:3;27891:19;;27677:239::o;29405:398::-;29607:2;29589:21;;;29646:2;29626:18;;;29619:30;29685:34;29680:2;29665:18;;29658:62;-1:-1:-1;;;29751:2:16;29736:18;;29729:32;29793:3;29778:19;;29579:224::o;31339:629::-;31530:2;31519:9;31512:21;31605:1;31601;31596:3;31592:11;31588:19;31579:6;31573:13;31569:39;31564:2;31553:9;31549:18;31542:67;31677:2;31669:6;31665:15;31659:22;31652:30;31645:38;31640:2;31629:9;31625:18;31618:66;31493:4;31731:2;31723:6;31719:15;31713:22;31771:4;31766:2;31755:9;31751:18;31744:32;31799:63;31857:3;31846:9;31842:19;31828:12;31799:63;:::i;:::-;31785:77;;31932:2;31924:6;31920:15;31914:22;31907:30;31900:38;31893:4;31882:9;31878:20;31871:68;31956:6;31948:14;;;31502:466;;;;:::o;32155:275::-;32226:2;32220:9;32291:2;32272:13;;-1:-1:-1;;32268:27:16;32256:40;;32326:18;32311:34;;32347:22;;;32308:62;32305:2;;;32373:18;;:::i;:::-;32409:2;32402:22;32200:230;;-1:-1:-1;32200:230:16:o;32435:183::-;32495:4;32528:18;32520:6;32517:30;32514:2;;;32550:18;;:::i;:::-;-1:-1:-1;32595:1:16;32591:14;32607:4;32587:25;;32504:114::o;32755:128::-;32795:3;32826:1;32822:6;32819:1;32816:13;32813:2;;;32832:18;;:::i;:::-;-1:-1:-1;32868:9:16;;32803:80::o;32888:120::-;32928:1;32954;32944:2;;32959:18;;:::i;:::-;-1:-1:-1;32993:9:16;;32934:74::o;33013:168::-;33053:7;33119:1;33115;33111:6;33107:14;33104:1;33101:21;33096:1;33089:9;33082:17;33078:45;33075:2;;;33126:18;;:::i;:::-;-1:-1:-1;33166:9:16;;33065:116::o;33186:125::-;33226:4;33254:1;33251;33248:8;33245:2;;;33259:18;;:::i;:::-;-1:-1:-1;33296:9:16;;33235:76::o;33316:258::-;33388:1;33398:113;33412:6;33409:1;33406:13;33398:113;;;33488:11;;;33482:18;33469:11;;;33462:39;33434:2;33427:10;33398:113;;;33529:6;33526:1;33523:13;33520:2;;;-1:-1:-1;;33564:1:16;33546:16;;33539:27;33369:205::o;33579:380::-;33658:1;33654:12;;;;33701;;;33722:2;;33776:4;33768:6;33764:17;33754:27;;33722:2;33829;33821:6;33818:14;33798:18;33795:38;33792:2;;;33875:10;33870:3;33866:20;33863:1;33856:31;33910:4;33907:1;33900:15;33938:4;33935:1;33928:15;33792:2;;33634:325;;;:::o;33964:135::-;34003:3;-1:-1:-1;;34024:17:16;;34021:2;;;34044:18;;:::i;:::-;-1:-1:-1;34091:1:16;34080:13;;34011:88::o;34104:112::-;34136:1;34162;34152:2;;34167:18;;:::i;:::-;-1:-1:-1;34201:9:16;;34142:74::o;34221:127::-;34282:10;34277:3;34273:20;34270:1;34263:31;34313:4;34310:1;34303:15;34337:4;34334:1;34327:15;34353:127;34414:10;34409:3;34405:20;34402:1;34395:31;34445:4;34442:1;34435:15;34469:4;34466:1;34459:15;34485:127;34546:10;34541:3;34537:20;34534:1;34527:31;34577:4;34574:1;34567:15;34601:4;34598:1;34591:15;34617:131;-1:-1:-1;;;;;34692:31:16;;34682:42;;34672:2;;34738:1;34735;34728:12;34753:118;34839:5;34832:13;34825:21;34818:5;34815:32;34805:2;;34861:1;34858;34851:12;34876:131;-1:-1:-1;;;;;;34950:32:16;;34940:43;;34930:2;;34997:1;34994;34987:12

Swarm Source

ipfs://b415b252eeeb16cae9723065cff696597edff6cd87b285b5db93fc41deb82b5f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.