ETH Price: $3,265.27 (+2.97%)
Gas: 2 Gwei

Token

Black is Beautiful (BlackIsBeautiful)
 

Overview

Max Total Supply

1,000 BlackIsBeautiful

Holders

313

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 BlackIsBeautiful
0xe978cec616eea31263118d4256dbe1110d3ba106
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BlackIsBeautiful

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 2 of 15: BlackIsBeautiful.sol
// SPDX-License-Identifier: GPL-3.0

// HOFHOFHOFHOFHOFHOFHOFHOFHOFHOFHHOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHF        HOFHOFHOFHOF
// HOFHOFHOFHOF      HOF          HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF                   HOFHOFHOFHOF
// HOFHOFHOFHOF                   HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOFHOFHOFHOFHOFHOFHOFHHOFHOFHOFHOF

// -----------    House Of First   -----------
// ---   Black is Beautiful - Nick Davis   ---

pragma solidity ^0.8.10;
import "./ERC721Enum.sol";
import "./Ownable.sol";
import "./Strings.sol";
import "./ReentrancyGuard.sol";
import {MerkleProof} from "./MerkleProof.sol";

contract OwnableDelegateProxy {}

/**
 * used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users
 */
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract BlackIsBeautiful is ERC721Enum, Ownable, ReentrancyGuard {
    using Strings for uint256;
    using MerkleProof for bytes32[];
    string public baseURI;
    
    //sale settings
    uint256 public SALE_START_TIMESTAMP = 1659142800; // time when sale starts - NOT FINAL VALUE - TBC
    uint256 public SALE_END_TIMESTAMP = SALE_START_TIMESTAMP + (86400 * 10); // time when sale ends - NOT FINAL VALUE - TBC
    uint256 public price = 0.25 ether; // NOT FINAL VALUE - TBC
    uint256 public maxSupply = 1000; // max supply
    uint256 public reserved = 70; // 300 NFTs reserved for vault - NOT FINAL VALUE - TBC
    uint256 public maxPerTx = 2; // max per transaction - NOT FINAL VALUE - TBC
    uint256 public ambassadorAllowance = 2; // max per ambassador
    uint256 public allowancePerWallet = 2; // max mintable per wallet - NOT FINAL VALUE - TBC
    mapping(address => uint256) public purchases; // mapping of mints per address
    mapping(address => uint256) public ambassadorPurchases; // mapping of ambassador mints per address
    bool public signatureMode = false; // enable allowlist minting via signature
    bool public salePaused = false;
    bool public enableAmbassadorSale = false;
    bool public enableAllowlistSale = false;
    bool public enablePublicSale = false;

    // allowlist
    address public constant ALLOWLIST_SIGNER = 0x8430e0B7be3315735C303b82E4471D59AC152Aa5;
    
    string _name = "Black is Beautiful";
    string _symbol = "BlackIsBeautiful";
    string _initBaseURI = "https://houseoffirst.com:1335/blackisbeautiful/opensea/";

    bytes32 public merkleRoot;

    address public proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1; // OpenSea Mainnet Proxy Registry address
    
    constructor() ERC721P(_name, _symbol) {
        setBaseURI(_initBaseURI);
    }

    function _baseURI() internal view virtual returns (string memory) {
        return baseURI;
    }

    function getPurchases(address addr) external view returns (uint256) {
        return purchases[addr];
    }

    function getAmbassadorPurchases(address addr) external view returns (uint256) {
        return ambassadorPurchases[addr];
    }

    function getTotalPurchases(address addr) external view returns (uint256) {
        return purchases[addr] + ambassadorPurchases[addr];
    }
    
    function mintingHasStarted() public view returns (bool) {
        return block.timestamp > SALE_START_TIMESTAMP;
    }

    function mintingHasEnded() public view returns (bool) {
        return block.timestamp > SALE_END_TIMESTAMP;
    }

    function getMaxSupply() public view returns (uint256) {
        return maxSupply;
    }

    function getAvailableMaxSupply() public view returns (uint256) {
        return maxSupply - reserved;
    }

    function mintingIsActive() public view returns (bool) {
        bool timeOk = mintingHasStarted() && !mintingHasEnded();
        bool notSoldOut = _owners.length <= getAvailableMaxSupply();
        return timeOk && notSoldOut;
    }

    function getAllowancePerWallet() public view returns (uint256) {
        return allowancePerWallet;
    }
    
    function getNFTPrice() public view returns (uint256) {
        return price;
    }
    
    /* allowlist */
    function isAllowlisted(address user, bytes memory signature) public pure returns (bool) {
        bytes32 messageHash = keccak256(abi.encodePacked(user));
        bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash));
        return recoverSigner(ethSignedMessageHash, signature) == ALLOWLIST_SIGNER;
    }
    
    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) private pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }
    
    function splitSignature(bytes memory sig) private pure returns (bytes32 r, bytes32 s, uint8 v) {
        require(sig.length == 65, "invalid signature length");
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }
    }

    function _leaf(string memory allowance, string memory payload) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(payload, allowance));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) {
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }

    function getAllowance(string memory allowance, bytes32[] calldata proof) public view returns (string memory) {
        string memory payload = string(abi.encodePacked(msg.sender));
        require(_verify(_leaf(allowance, payload), proof), "Invalid Merkle Tree proof supplied.");
        return allowance;
    }

    /**
     * public mint nfts (no signature required)
     */
    function mintNFT(uint256 numberOfNfts) public payable nonReentrant {
        require(!salePaused && enablePublicSale, "Sale paused or public sale disabled");
        require(block.timestamp > SALE_START_TIMESTAMP, "Sale has not started");
        require(block.timestamp < SALE_END_TIMESTAMP, "Sale has ended");
        uint256 s = _owners.length;
        require(numberOfNfts > 0 && numberOfNfts <= maxPerTx, "Invalid numberOfNfts");
        require((s + numberOfNfts) <= (maxSupply - reserved), "Exceeds Max Supply");
        require(msg.value >= price * numberOfNfts, "Not Enough ETH");
        require(purchases[msg.sender] + numberOfNfts <= allowancePerWallet, "Exceeds Allocation");
        purchases[msg.sender] += numberOfNfts;
        for (uint256 i = 0; i < numberOfNfts; ++i) {
            _mint(msg.sender, s + i);
        }
        delete s;
    }

    /**
     * allowlist mint nfts (signature required)
     */
    function allowlistMintNFT(uint256 numberOfNfts, uint256 allowance, bytes32[] memory proof, bytes memory signature) public payable nonReentrant {
        require(!salePaused && enableAllowlistSale, "Sale Paused");
        require(block.timestamp > SALE_START_TIMESTAMP, "Sale has not started");
        require(block.timestamp < SALE_END_TIMESTAMP, "Sale has ended");
        require(msg.value >= price * numberOfNfts, "Not Enough ETH");
        if(signatureMode) {
            // use signature for allowlist validation
            allowance = allowancePerWallet;
            require(isAllowlisted(msg.sender, signature), "Address not allowlisted");
        }
        else {
            // use merkle tree for allowlist validation
            string memory payload = string(abi.encodePacked(msg.sender));
            require(_verify(_leaf(Strings.toString(allowance), payload), proof), "Address not allowlisted");
            delete payload;
        }
        uint256 s = _owners.length;
        require(numberOfNfts > 0 && numberOfNfts <= maxPerTx, "Invalid numberOfNfts");
        require((s + numberOfNfts) <= (maxSupply - reserved), "Exceeds Max Supply");
        require(purchases[msg.sender] + numberOfNfts <= allowance, "Exceeds Allocation");
        purchases[msg.sender] += numberOfNfts;
        for (uint256 i = 0; i < numberOfNfts; ++i) {
            _mint(msg.sender, s + i);
        }
        delete s;
    }

    /**
     * ambassador mint nfts (signature required)
     */
    function ambassadorMintNFT(uint256 numberOfNfts, bytes memory signature) public payable nonReentrant {
        require(!salePaused && enableAmbassadorSale, "Sale Paused");
        require(isAllowlisted(msg.sender, signature), "Address not allowlisted");
        uint256 s = _owners.length;
        require(numberOfNfts > 0 && numberOfNfts <= maxPerTx, "Invalid numberOfNfts");
        require((s + numberOfNfts) <= (maxSupply - reserved), "Exceeds Max Supply");
        require(ambassadorPurchases[msg.sender] + numberOfNfts <= ambassadorAllowance, "Exceeds Allocation");
        ambassadorPurchases[msg.sender] += numberOfNfts;
        for (uint256 i = 0; i < numberOfNfts; ++i) {
            _mint(msg.sender, s + i);
        }
        delete s;
    }

    /**
     * admin minting for reserved nfts (callable by Owner only)
     */
    function giftNFT(uint256[] calldata quantity, address[] calldata recipient) external onlyOwner {
        require(quantity.length == recipient.length, "Invalid quantities and recipients (length mismatch)");
        uint256 totalQuantity = 0;
        uint256 s = _owners.length;
        for (uint256 i = 0; i < quantity.length; ++i) {
            totalQuantity += quantity[i];
        }
        require(s + totalQuantity <= maxSupply, "Exceeds Max Supply");
        require(totalQuantity <= reserved, "Exceeds Max Reserved");
        // update remaining reserved count
        reserved -= totalQuantity;
        delete totalQuantity;
        for (uint256 i = 0; i < recipient.length; ++i) {
            for (uint256 j = 0; j < quantity[i]; ++j) {
                _mint(recipient[i], s++);
            }
        }
        delete s;
    }

    /**
     * admin minting for reserved nfts - sets purchases[recipient] (callable by Owner only)
     */
    function giftNFTPurchases(uint256[] calldata quantity, address[] calldata recipient) external onlyOwner {
        require(quantity.length == recipient.length, "Invalid quantities and recipients (length mismatch)");
        uint256 totalQuantity = 0;
        uint256 s = _owners.length;
        for (uint256 i = 0; i < quantity.length; ++i) {
            totalQuantity += quantity[i];
        }
        require(s + totalQuantity <= maxSupply, "Exceeds Max Supply");
        require(totalQuantity <= reserved, "Exceeds Max Reserved");
        // update remaining reserved count
        reserved -= totalQuantity;
        delete totalQuantity;
        for (uint256 i = 0; i < recipient.length; ++i) {
            purchases[recipient[i]] += quantity[i];
            for (uint256 j = 0; j < quantity[i]; ++j) {
                _mint(recipient[i], s++);
            }
        }
        delete s;
    }

    /**
     * admin ambassador minting for reserved nfts (callable by Owner only)
     */
    function airdropToAmbassador(uint256 quantity, address recipient) external onlyOwner {
        require(ambassadorPurchases[recipient] + quantity <= ambassadorAllowance, "Exceeds ambassador allowance");
        uint256 s = _owners.length;
        require(s + quantity <= maxSupply, "Exceeds Max Supply");
        require(quantity <= reserved, "Exceeds Max Reserved");
        // update remaining reserved count
        reserved -= quantity;
        ambassadorPurchases[recipient] += quantity;
        for (uint256 i = 0; i < quantity; ++i) {
            _mint(recipient, s++);
        }
        delete s;
    }
    
    function _mint(address to, uint256 tokenId) internal virtual override {
        _owners.push(to);
        emit Transfer(address(0), to, tokenId);
    }

    function batchTransferFrom(address _from, address _to, uint256[] memory _tokenIds) public {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            transferFrom(_from, _to, _tokenIds[i]);
        }
    }

    function multiTransfer(uint256[] calldata tokenIds, address[] calldata recipient) external onlyOwner {
        require(tokenIds.length == recipient.length, "Invalid tokenIds and recipients (length mismatch)");
        for (uint256 i = 0; i < recipient.length; ++i) {
            for (uint256 j = 0; j < tokenIds[i]; ++j) {
                transferFrom(msg.sender, recipient[i], tokenIds[i]);
            }
        }
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: Nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : "";
    }

    function setMerkleRoot(bytes32 root) public onlyOwner {
        merkleRoot = root;
    }

    function setPurchases(address _addr, uint256 _purchases) public onlyOwner {
        purchases[_addr] = _purchases;
    }

    function setAmbassadorPurchases(address _addr, uint256 _purchases) public onlyOwner {
        ambassadorPurchases[_addr] = _purchases;
    }

    function setPrice(uint256 _newPrice) public onlyOwner {
        price = _newPrice;
    }

    function setReserved(uint256 _reserved) public onlyOwner {
        reserved = _reserved;
    }

    function setMaxPerTx(uint256 _maxPerTx) public onlyOwner {
        maxPerTx = _maxPerTx;
    }

    function setAmbassadorAllowance(uint256 _newAllowance) public onlyOwner {
        ambassadorAllowance = _newAllowance;
    }

    function setAllowancePerWallet(uint256 _allowancePerWallet) public onlyOwner {
        allowancePerWallet = _allowancePerWallet;
    }

    function setMaxSupply(uint256 _newMaxSupply) public onlyOwner {
        maxSupply = _newMaxSupply;
    }

    /**
     * adjusts number of reserved nfts to psuedo limit supply (callable by Owner only)
     * example: if maxSupply = 10000 & supplyCap = 4000 then set reserved = 6000 (maxSupply - supplyCap)
     */
    function setSupplyCap(uint256 _supplyCap) public onlyOwner {
        require(_supplyCap <= maxSupply, "Supply cap exceeds max supply");
        reserved = maxSupply - _supplyCap;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setSalePaused(bool _salePaused) public onlyOwner {
        salePaused = _salePaused;
    }

    function setEnablePublicSale(bool _enablePublicSale) public onlyOwner {
        enablePublicSale = _enablePublicSale;
    }

    function setEnableAllowlistSale(bool _enableAllowlistSale) public onlyOwner {
        enableAllowlistSale = _enableAllowlistSale;
    }

    function setEnableAmbassadorSale(bool _enableAmbassadorSale) public onlyOwner {
        enableAmbassadorSale = _enableAmbassadorSale;
    }

    function setSignatureMode(bool _mode) public onlyOwner {
        signatureMode = _mode;
    }

    function setSaleStartTimestamp(uint256 _timestamp) public onlyOwner {
        SALE_START_TIMESTAMP = _timestamp;
    }

    function setSaleEndTimestamp(uint256 _timestamp) public onlyOwner {
        SALE_END_TIMESTAMP = _timestamp;
    }

    function setSaleStartEndTimestamp(uint256 _startTimestamp, uint256 _endTimestamp) public onlyOwner {
        setSaleStartTimestamp(_startTimestamp);
        setSaleEndTimestamp(_endTimestamp);
    }

    function setPhaseConfig(uint256 _startTimestamp, uint256 _endTimestamp, uint256 _maxPerTx, uint256 _allowancePerWallet, uint256 _supplyCap) public onlyOwner {
        setSaleStartEndTimestamp(_startTimestamp, _endTimestamp);
        setMaxPerTx(_maxPerTx);
        setAllowancePerWallet(_allowancePerWallet);
        setSupplyCap(_supplyCap);
    }

    function setFullPhaseConfig(uint256 _price, uint256 _allowancePerWallet, uint256 _maxPerTx, uint256 _supplyCap, uint256 _startTimestamp, uint256 _endTimestamp, bool _isPublic, bytes32 _merkleRoot) public onlyOwner {
        setPrice(_price);
        setAllowancePerWallet(_allowancePerWallet);
        setMaxPerTx(_maxPerTx);
        setSupplyCap(_supplyCap);
        setSaleStartEndTimestamp(_startTimestamp, _endTimestamp);
        setEnablePublicSale(_isPublic);
        setEnableAllowlistSale(!_isPublic);
        setMerkleRoot(_merkleRoot);
    }

    function getFullPhaseConfig() public view returns (uint256, uint256, uint256, uint256, uint256, uint256, bool, bytes32) {
        return (price, allowancePerWallet, maxPerTx, getAvailableMaxSupply(), SALE_START_TIMESTAMP, SALE_END_TIMESTAMP, enablePublicSale, merkleRoot);
    }

    // for transparency regarding ETH raised
    uint256 totalWithdrawn = 0;

    function getTotalWithdrawn() public view returns (uint256) {
        return totalWithdrawn;
    }

    function getTotalBalance() public view returns (uint256) {
        return address(this).balance;
    }

    function getTotalRaised() public view returns (uint256) {
        return getTotalWithdrawn() + getTotalBalance();
    }

    /**
     * withdraw ETH from the contract (callable by Owner only)
     */
    function withdraw() public payable onlyOwner {
        uint256 val = address(this).balance;
        (bool success, ) = payable(msg.sender).call{
            value: val
        }("");
        require(success);
        totalWithdrawn += val;
        delete val;
    }
    /**
     * whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator) override public view returns (bool) {
        // whitelist opensea proxy contract for easy trading
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }
}

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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 3 of 15: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 4 of 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 5 of 15: ERC721Enum.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.10;
import "./ERC721P.sol";
import "./IERC721Enumerable.sol";

abstract contract ERC721Enum is ERC721P, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165, ERC721P)
        returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256 tokenId)
    {
        require(index < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 count;
        for (uint256 i; i < _owners.length; ++i) {
            if (owner == _owners[i]) {
                if (count == index) return i;
                else ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }

    function tokensOfOwner(address owner)
        public
        view
        returns (uint256[] memory)
    {
        require(0 < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }

    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}

File 6 of 15: ERC721P.sol
// SPDX-License-Identifier: GPL-3.0

// Thank you to ToyBoogers & Pagzi Tech for the optimised ERC721
pragma solidity ^0.8.10;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

abstract contract ERC721P is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    
    function getOwners() external view returns (address[] memory) {
        return _owners;
    }

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

    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        uint256 count = 0;
        uint256 length = _owners.length;
        for (uint256 i = 0; i < length; ++i) {
            if (owner == _owners[i]) {
                ++count;
            }
        }
        delete length;
        return count;
    }

    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;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721P.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);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    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);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    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);
    }

    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"
        );
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721P.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    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"
        );
    }

    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);
        _owners.push(to);

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721P.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721P.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721P.ownerOf(tokenId), to, tokenId);
    }

    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;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 7 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 15: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 9 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 10 of 15: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 15: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 13 of 15: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 14 of 15: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // 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 15: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ALLOWLIST_SIGNER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_END_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"airdropToAmbassador","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowancePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"allowlistMintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ambassadorAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"ambassadorMintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ambassadorPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAllowlistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableAmbassadorSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"allowance","type":"string"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"getAllowance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllowancePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getAmbassadorPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFullPhaseConfig","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getTotalPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"giftNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"giftNFTPurchases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","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":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingHasEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingHasStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","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":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","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":"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":"salePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allowancePerWallet","type":"uint256"}],"name":"setAllowancePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAllowance","type":"uint256"}],"name":"setAmbassadorAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_purchases","type":"uint256"}],"name":"setAmbassadorPurchases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableAllowlistSale","type":"bool"}],"name":"setEnableAllowlistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableAmbassadorSale","type":"bool"}],"name":"setEnableAmbassadorSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enablePublicSale","type":"bool"}],"name":"setEnablePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_allowancePerWallet","type":"uint256"},{"internalType":"uint256","name":"_maxPerTx","type":"uint256"},{"internalType":"uint256","name":"_supplyCap","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"bool","name":"_isPublic","type":"bool"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setFullPhaseConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_maxPerTx","type":"uint256"},{"internalType":"uint256","name":"_allowancePerWallet","type":"uint256"},{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"name":"setPhaseConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_purchases","type":"uint256"}],"name":"setPurchases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserved","type":"uint256"}],"name":"setReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setSaleEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_salePaused","type":"bool"}],"name":"setSalePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"setSaleStartEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setSaleStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mode","type":"bool"}],"name":"setSignatureMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"name":"setSupplyCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signatureMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"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":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","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":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526362e4829060088190556200001d90620d2f00620004c0565b6009556703782dace9d90000600a556103e8600b556046600c556002600d819055600e819055600f556012805464ffffffffff191681556040805180820190915281815271109b1858dac81a5cc81099585d5d1a599d5b60721b60209091019081526200008e91601391906200041a565b506040805180820190915260108082526f109b1858dad25cd099585d5d1a599d5b60821b6020909201918252620000c8916014916200041a565b5060405180606001604052806037815260200162005ca1603791398051620000f9916015916020909101906200041a565b50601780546001600160a01b03191673a5409ec958c83c3f309868babaca7c86dcb077c117905560006018553480156200013257600080fd5b50601380546200014290620004e7565b80601f01602080910402602001604051908101604052809291908181526020018280546200017090620004e7565b8015620001c15780601f106200019557610100808354040283529160200191620001c1565b820191906000526020600020905b815481529060010190602001808311620001a357829003601f168201915b505050505060148054620001d590620004e7565b80601f01602080910402602001604051908101604052809291908181526020018280546200020390620004e7565b8015620002545780601f10620002285761010080835404028352916020019162000254565b820191906000526020600020905b8154815290600101906020018083116200023657829003601f168201915b505084516200026e9350600092506020860191506200041a565b508051620002849060019060208401906200041a565b505050620002a16200029b6200034c60201b60201c565b62000350565b600160065560158054620003469190620002bb90620004e7565b80601f0160208091040260200160405190810160405280929190818152602001828054620002e990620004e7565b80156200033a5780601f106200030e576101008083540402835291602001916200033a565b820191906000526020600020905b8154815290600101906020018083116200031c57829003601f168201915b5050620003a292505050565b62000524565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620004015760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620004169060079060208401906200041a565b5050565b8280546200042890620004e7565b90600052602060002090601f0160209004810192826200044c576000855562000497565b82601f106200046757805160ff191683800117855562000497565b8280016001018555821562000497579182015b82811115620004975782518255916020019190600101906200047a565b50620004a5929150620004a9565b5090565b5b80821115620004a55760008155600101620004aa565b60008219821115620004e257634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620004fc57607f821691505b602082108114156200051e57634e487b7160e01b600052602260045260246000fd5b50919050565b61576d80620005346000396000f3fe6080604052600436106105b55760003560e01c80637e79c723116102eb578063ad7c039e1161018f578063d45a0237116100e1578063f686788311610095578063fc8cc4591161006f578063fc8cc45914610ff8578063fe60d12c14611018578063ff8abd1f1461102e57600080fd5b8063f686788314610fb3578063f968adbe14610fcd578063fb107a4f14610fe357600080fd5b8063e985e9c5116100c6578063e985e9c514610f53578063f2fde38b14610f73578063f3993d1114610f9357600080fd5b8063d45a023714610f1d578063d5abeb0114610f3d57600080fd5b8063c215600d11610143578063c87b56dd1161011d578063c87b56dd14610eb9578063caca28ad14610ed9578063cd7c032614610ef057600080fd5b8063c215600d14610e59578063c29af27414610e79578063c6f6f21614610e9957600080fd5b8063b88d4fde11610174578063b88d4fde14610e04578063badf8ec414610e24578063c0d42d9614610e3957600080fd5b8063ad7c039e14610dc4578063b6a3f59a14610de457600080fd5b806392642744116102485780639ca1ac8f116101fc578063a0e67e2b116101d6578063a0e67e2b14610d55578063a22cb46514610d77578063a391f14d14610d9757600080fd5b80639ca1ac8f14610d0a5780639f55029314610d2a578063a035b1fe14610d3f57600080fd5b8063946807fd1161022d578063946807fd14610c9c57806395d89b4114610cb25780639c14727814610cc757600080fd5b80639264274414610c69578063928d63a414610c7c57600080fd5b806389404a791161029f5780638da5cb5b116102845780638da5cb5b14610bfe5780638f5bbf1d14610c2957806391b7f5ed14610c4957600080fd5b806389404a7914610bc95780638d92becd14610bde57600080fd5b8063842a77d3116102d0578063842a77d314610b5c5780638462151c14610b8957806384724c6014610bb657600080fd5b80637e79c72314610b1457806383fde87d14610b3c57600080fd5b80634728b9f41161045d5780635eb17006116103af578063704103c611610363578063715018a61161033d578063715018a614610aca5780637666de7614610adf5780637cb6475914610af457600080fd5b8063704103c614610a5457806370a0823114610a6757806370cd5a8014610a8757600080fd5b806366fddfa91161039457806366fddfa9146109ff5780636c0360eb14610a1f5780636f8b44b014610a3457600080fd5b80635eb170061461098d5780636352211e146109df57600080fd5b806350cee2271161041157806357591dfc116103eb57806357591dfc1461092e5780635ae1d8c81461094e5780635d08c1ae1461096e57600080fd5b806350cee227146108d757806354964d27146108f757806355f804b31461090e57600080fd5b80634be3ca0e116104425780634be3ca0e146108815780634c0f38c2146108a25780634f6ccce7146108b757600080fd5b80634728b9f41461084c578063472efe381461086157600080fd5b80632316b4da116105165780632f9eca87116104ca5780633db82fb5116104a45780633db82fb5146107f65780634210830d1461081657806342842e0e1461082c57600080fd5b80632f9eca87146107b8578063371e6f99146107d85780633ccfd60b146107ee57600080fd5b80632d6e71b6116104fb5780632d6e71b6146107625780632eb4a7ab146107825780632f745c591461079857600080fd5b80632316b4da1461072057806323b872dd1461074257600080fd5b806312b583491161056d5780631ddf3a37116105525780631ddf3a37146106ca578063219c4882146106ea578063222997991461070a57600080fd5b806312b583491461069857806318160ddd146106b557600080fd5b8063081812fc1161059e578063081812fc14610611578063095ea7b3146106565780630bcecf291461067857600080fd5b806301ffc9a7146105ba57806306fdde03146105ef575b600080fd5b3480156105c657600080fd5b506105da6105d5366004614c62565b61104e565b60405190151581526020015b60405180910390f35b3480156105fb57600080fd5b506106046110aa565b6040516105e69190614cf5565b34801561061d57600080fd5b5061063161062c366004614d08565b61113c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016105e6565b34801561066257600080fd5b50610676610671366004614d43565b6111e7565b005b34801561068457600080fd5b506012546105da9062010000900460ff1681565b3480156106a457600080fd5b50475b6040519081526020016105e6565b3480156106c157600080fd5b506002546106a7565b3480156106d657600080fd5b506106766106e5366004614d43565b611340565b3480156106f657600080fd5b50610676610705366004614d43565b6113d0565b34801561071657600080fd5b506106a7600f5481565b34801561072c57600080fd5b506012546105da90640100000000900460ff1681565b34801561074e57600080fd5b5061067661075d366004614d6f565b611460565b34801561076e57600080fd5b5061067661077d366004614d08565b6114e7565b34801561078e57600080fd5b506106a760165481565b3480156107a457600080fd5b506106a76107b3366004614d43565b611553565b3480156107c457600080fd5b506106766107d3366004614dfc565b61166f565b3480156107e457600080fd5b506106a7600e5481565b6106766117ea565b34801561080257600080fd5b50610676610811366004614d08565b6118c3565b34801561082257600080fd5b506106a760095481565b34801561083857600080fd5b50610676610847366004614d6f565b61192f565b34801561085857600080fd5b506105da61194a565b34801561086d57600080fd5b5061067661087c366004614e7d565b61198a565b34801561088d57600080fd5b506012546105da906301000000900460ff1681565b3480156108ae57600080fd5b50600b546106a7565b3480156108c357600080fd5b506106a76108d2366004614d08565b611a22565b3480156108e357600080fd5b506105da6108f2366004614fa4565b611a7f565b34801561090357600080fd5b5060085442116105da565b34801561091a57600080fd5b50610676610929366004614ff4565b611b51565b34801561093a57600080fd5b50610676610949366004614e7d565b611bcf565b34801561095a57600080fd5b50610676610969366004615029565b611c6e565b34801561097a57600080fd5b506012546105da90610100900460ff1681565b34801561099957600080fd5b506109a2611d29565b604080519889526020890197909752958701949094526060860192909252608085015260a0840152151560c083015260e0820152610100016105e6565b3480156109eb57600080fd5b506106316109fa366004614d08565b611d75565b348015610a0b57600080fd5b50610604610a1a36600461508f565b611e22565b348015610a2b57600080fd5b50610604611f34565b348015610a4057600080fd5b50610676610a4f366004614d08565b611fc2565b610676610a6236600461511c565b61202e565b348015610a7357600080fd5b506106a7610a823660046151ef565b61249a565b348015610a9357600080fd5b506106a7610aa23660046151ef565b73ffffffffffffffffffffffffffffffffffffffff1660009081526010602052604090205490565b348015610ad657600080fd5b50610676612599565b348015610aeb57600080fd5b506106a761260c565b348015610b0057600080fd5b50610676610b0f366004614d08565b612623565b348015610b2057600080fd5b50610631738430e0b7be3315735c303b82e4471d59ac152aa581565b348015610b4857600080fd5b50610676610b5736600461520c565b61268f565b348015610b6857600080fd5b506106a7610b773660046151ef565b60106020526000908152604090205481565b348015610b9557600080fd5b50610ba9610ba43660046151ef565b61271b565b6040516105e69190615247565b610676610bc436600461528b565b612815565b348015610bd557600080fd5b506018546106a7565b348015610bea57600080fd5b50610676610bf9366004614e7d565b612abc565b348015610c0a57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610631565b348015610c3557600080fd5b50610676610c443660046152bc565b612b5a565b348015610c5557600080fd5b50610676610c64366004614d08565b612d7b565b610676610c77366004614d08565b612de7565b348015610c8857600080fd5b50610676610c97366004614e7d565b61315e565b348015610ca857600080fd5b506106a760085481565b348015610cbe57600080fd5b506106046131fe565b348015610cd357600080fd5b506106a7610ce23660046151ef565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b348015610d1657600080fd5b50610676610d25366004614dfc565b61320d565b348015610d3657600080fd5b506106a761351e565b348015610d4b57600080fd5b506106a7600a5481565b348015610d6157600080fd5b50610d6a61352e565b6040516105e691906152ec565b348015610d8357600080fd5b50610676610d9236600461533a565b61359c565b348015610da357600080fd5b506106a7610db23660046151ef565b60116020526000908152604090205481565b348015610dd057600080fd5b50610676610ddf366004614d08565b613699565b348015610df057600080fd5b50610676610dff366004614d08565b613705565b348015610e1057600080fd5b50610676610e1f36600461536f565b6137d2565b348015610e3057600080fd5b50600f546106a7565b348015610e4557600080fd5b50610676610e543660046153cf565b61385a565b348015610e6557600080fd5b506106a7610e743660046151ef565b6138d3565b348015610e8557600080fd5b50610676610e94366004614dfc565b61390e565b348015610ea557600080fd5b50610676610eb4366004614d08565b613b5d565b348015610ec557600080fd5b50610604610ed4366004614d08565b613bc9565b348015610ee557600080fd5b5060095442116105da565b348015610efc57600080fd5b506017546106319073ffffffffffffffffffffffffffffffffffffffff1681565b348015610f2957600080fd5b50610676610f38366004614d08565b613ca2565b348015610f4957600080fd5b506106a7600b5481565b348015610f5f57600080fd5b506105da610f6e3660046153f1565b613d0e565b348015610f7f57600080fd5b50610676610f8e3660046151ef565b613e0f565b348015610f9f57600080fd5b50610676610fae36600461541f565b613f0b565b348015610fbf57600080fd5b506012546105da9060ff1681565b348015610fd957600080fd5b506106a7600d5481565b348015610fef57600080fd5b50600a546106a7565b34801561100457600080fd5b50610676611013366004614e7d565b613f4d565b34801561102457600080fd5b506106a7600c5481565b34801561103a57600080fd5b50610676611049366004614d08565b613fee565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806110a457506110a48261405a565b92915050565b6060600080546110b9906154d7565b80601f01602080910402602001604051908101604052809291908181526020018280546110e5906154d7565b80156111325780601f1061110757610100808354040283529160200191611132565b820191906000526020600020905b81548152906001019060200180831161111557829003601f168201915b5050505050905090565b60006111478261413d565b6111be5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006111f282611d75565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112965760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016111b5565b3373ffffffffffffffffffffffffffffffffffffffff821614806112bf57506112bf8133613d0e565b6113315760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016111b5565b61133b83836141a1565b505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146113a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260106020526040902055565b60055473ffffffffffffffffffffffffffffffffffffffff1633146114375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260116020526040902055565b61146a3382614241565b6114dc5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016111b5565b61133b838383614348565b60055473ffffffffffffffffffffffffffffffffffffffff16331461154e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600c55565b600061155e8361249a565b82106115ac5760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f620000000000000000000060448201526064016111b5565b6000805b60025481101561162657600281815481106115cd576115cd61552b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415611616578382141561160a5791506110a49050565b61161382615589565b91505b61161f81615589565b90506115b0565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f620000000000000000000060448201526064016111b5565b60055473ffffffffffffffffffffffffffffffffffffffff1633146116d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b82811461174b5760405162461bcd60e51b815260206004820152603160248201527f496e76616c696420746f6b656e49647320616e6420726563697069656e74732060448201527f286c656e677468206d69736d617463682900000000000000000000000000000060648201526084016111b5565b60005b818110156117e35760005b85858381811061176b5761176b61552b565b905060200201358110156117d2576117c23385858581811061178f5761178f61552b565b90506020020160208101906117a491906151ef565b8888868181106117b6576117b661552b565b90506020020135611460565b6117cb81615589565b9050611759565b506117dc81615589565b905061174e565b5050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146118515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b6040514790600090339083908381818185875af1925050503d8060008114611895576040519150601f19603f3d011682016040523d82523d6000602084013e61189a565b606091505b50509050806118a857600080fd5b81601860008282546118ba91906155c2565b90915550505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461192a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600855565b61133b838383604051806020016040528060008152506137d2565b600080611958600854421190565b801561196657506009544211155b9050600061197261260c565b600254111590508180156119835750805b9250505090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146119f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000611a2d60025490565b8210611a7b5760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f6200000000000000000060448201526064016111b5565b5090565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602080830191909152825180830360140181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401829052845180850390910181526090909301909352815191012060009190738430e0b7be3315735c303b82e4471d59ac152aa5611b318286614517565b73ffffffffffffffffffffffffffffffffffffffff161495945050505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611bb85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b8051611bcb906007906020840190614ba4565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611c365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b6012805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314611cd55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b611cde88612d7b565b611ce787613ca2565b611cf086613b5d565b611cf985613705565b611d03848461385a565b611d0c82613f4d565b611d16821561315e565b611d1f81612623565b5050505050505050565b600080600080600080600080600a54600f54600d54611d4661260c565b600854600954601254601654969f959e50939c50919a5098509650640100000000900460ff1694509092509050565b60008060028381548110611d8b57611d8b61552b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050806110a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016111b5565b6060600033604051602001611e62919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b6040516020818303038152906040529050611eb9611e8086836145b4565b8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145e792505050565b611f2b5760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960448201527f65642e000000000000000000000000000000000000000000000000000000000060648201526084016111b5565b50929392505050565b60078054611f41906154d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6d906154d7565b8015611fba5780601f10611f8f57610100808354040283529160200191611fba565b820191906000526020600020905b815481529060010190602001808311611f9d57829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff1633146120295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600b55565b600260065414156120815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016111b5565b6002600655601254610100900460ff161580156120a757506012546301000000900460ff165b6120f35760405162461bcd60e51b815260206004820152600b60248201527f53616c652050617573656400000000000000000000000000000000000000000060448201526064016111b5565b60085442116121445760405162461bcd60e51b815260206004820152601460248201527f53616c6520686173206e6f74207374617274656400000000000000000000000060448201526064016111b5565b60095442106121955760405162461bcd60e51b815260206004820152600e60248201527f53616c652068617320656e64656400000000000000000000000000000000000060448201526064016111b5565b83600a546121a391906155da565b3410156121f25760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420456e6f7567682045544800000000000000000000000000000000000060448201526064016111b5565b60125460ff161561225d57600f54925061220c3382611a7f565b6122585760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420616c6c6f776c697374656400000000000000000060448201526064016111b5565b612307565b604080513360601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208201528151601481830301815260349091019091526122b96122b36122ad866145f6565b836145b4565b846145e7565b6123055760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420616c6c6f776c697374656400000000000000000060448201526064016111b5565b505b600254841580159061231b5750600d548511155b6123675760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e66747300000000000000000000000060448201526064016111b5565b600c54600b546123779190615617565b61238186836155c2565b11156123cf5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b3360009081526010602052604090205484906123ec9087906155c2565b111561243a5760405162461bcd60e51b815260206004820152601260248201527f4578636565647320416c6c6f636174696f6e000000000000000000000000000060448201526064016111b5565b33600090815260106020526040812080548792906124599084906155c2565b90915550600090505b8581101561248d5761247d3361247883856155c2565b614728565b61248681615589565b9050612462565b5050600160065550505050565b600073ffffffffffffffffffffffffffffffffffffffff82166125255760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016111b5565b600254600090815b8181101561259057600281815481106125485761254861552b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff868116911614156125805761257d83615589565b92505b61258981615589565b905061252d565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146126005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b61260a60006147c9565b565b6000600c54600b5461261e9190615617565b905090565b60055473ffffffffffffffffffffffffffffffffffffffff16331461268a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b601655565b60055473ffffffffffffffffffffffffffffffffffffffff1633146126f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b612700858561385a565b61270983613b5d565b61271282613ca2565b6117e381613705565b60606127268261249a565b6000106127755760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f620000000000000000000060448201526064016111b5565b60006127808361249a565b905060008167ffffffffffffffff81111561279d5761279d614e98565b6040519080825280602002602001820160405280156127c6578160200160208202803683370190505b50905060005b8281101561280d576127de8582611553565b8282815181106127f0576127f061552b565b60209081029190910101528061280581615589565b9150506127cc565b509392505050565b600260065414156128685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016111b5565b6002600655601254610100900460ff1615801561288d575060125462010000900460ff165b6128d95760405162461bcd60e51b815260206004820152600b60248201527f53616c652050617573656400000000000000000000000000000000000000000060448201526064016111b5565b6128e33382611a7f565b61292f5760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420616c6c6f776c697374656400000000000000000060448201526064016111b5565b60025482158015906129435750600d548311155b61298f5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e66747300000000000000000000000060448201526064016111b5565b600c54600b5461299f9190615617565b6129a984836155c2565b11156129f75760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b600e5433600090815260116020526040902054612a159085906155c2565b1115612a635760405162461bcd60e51b815260206004820152601260248201527f4578636565647320416c6c6f636174696f6e000000000000000000000000000060448201526064016111b5565b3360009081526011602052604081208054859290612a829084906155c2565b90915550600090505b83811015612ab157612aa13361247883856155c2565b612aaa81615589565b9050612a8b565b505060016006555050565b60055473ffffffffffffffffffffffffffffffffffffffff163314612b235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b60128054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314612bc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600e5473ffffffffffffffffffffffffffffffffffffffff8216600090815260116020526040902054612bf59084906155c2565b1115612c435760405162461bcd60e51b815260206004820152601c60248201527f4578636565647320616d6261737361646f7220616c6c6f77616e63650000000060448201526064016111b5565b600254600b54612c5384836155c2565b1115612ca15760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b600c54831115612cf35760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d617820526573657276656400000000000000000000000060448201526064016111b5565b82600c6000828254612d059190615617565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526011602052604081208054859290612d3f9084906155c2565b90915550600090505b83811015612d7557612d658383612d5e81615589565b9450614728565b612d6e81615589565b9050612d48565b50505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314612de25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600a55565b60026006541415612e3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016111b5565b6002600655601254610100900460ff16158015612e615750601254640100000000900460ff165b612ed35760405162461bcd60e51b815260206004820152602360248201527f53616c6520706175736564206f72207075626c69632073616c6520646973616260448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016111b5565b6008544211612f245760405162461bcd60e51b815260206004820152601460248201527f53616c6520686173206e6f74207374617274656400000000000000000000000060448201526064016111b5565b6009544210612f755760405162461bcd60e51b815260206004820152600e60248201527f53616c652068617320656e64656400000000000000000000000000000000000060448201526064016111b5565b6002548115801590612f895750600d548211155b612fd55760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e66747300000000000000000000000060448201526064016111b5565b600c54600b54612fe59190615617565b612fef83836155c2565b111561303d5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b81600a5461304b91906155da565b34101561309a5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420456e6f7567682045544800000000000000000000000000000000000060448201526064016111b5565b600f54336000908152601060205260409020546130b89084906155c2565b11156131065760405162461bcd60e51b815260206004820152601260248201527f4578636565647320416c6c6f636174696f6e000000000000000000000000000060448201526064016111b5565b33600090815260106020526040812080548492906131259084906155c2565b90915550600090505b82811015613154576131443361247883856155c2565b61314d81615589565b905061312e565b5050600160065550565b60055473ffffffffffffffffffffffffffffffffffffffff1633146131c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b601280549115156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff909216919091179055565b6060600180546110b9906154d7565b60055473ffffffffffffffffffffffffffffffffffffffff1633146132745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b8281146132e95760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d61746368290000000000000000000000000060648201526084016111b5565b600254600090815b8581101561332f5786868281811061330b5761330b61552b565b905060200201358361331d91906155c2565b925061332881615589565b90506132f1565b50600b5461333d83836155c2565b111561338b5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b600c548211156133dd5760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d617820526573657276656400000000000000000000000060448201526064016111b5565b81600c60008282546133ef9190615617565b90915550600092508290505b83811015613515578686828181106134155761341561552b565b90506020020135601060008787858181106134325761343261552b565b905060200201602081019061344791906151ef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461349091906155c2565b90915550600090505b8787838181106134ab576134ab61552b565b90506020020135811015613504576134f48686848181106134ce576134ce61552b565b90506020020160208101906134e391906151ef565b846134ed81615589565b9550614728565b6134fd81615589565b9050613499565b5061350e81615589565b90506133fb565b50505050505050565b60004760185461261e91906155c2565b6060600280548060200260200160405190810160405280929190818152602001828054801561113257602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311613568575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff82163314156136025760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016111b5565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146137005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600955565b60055473ffffffffffffffffffffffffffffffffffffffff16331461376c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600b548111156137be5760405162461bcd60e51b815260206004820152601d60248201527f537570706c79206361702065786365656473206d617820737570706c7900000060448201526064016111b5565b80600b546137cc9190615617565b600c5550565b6137dc3383614241565b61384e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016111b5565b612d7584848484614840565b60055473ffffffffffffffffffffffffffffffffffffffff1633146138c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b6138ca826118c3565b611bcb81613699565b73ffffffffffffffffffffffffffffffffffffffff811660009081526011602090815260408083205460109092528220546110a491906155c2565b60055473ffffffffffffffffffffffffffffffffffffffff1633146139755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b8281146139ea5760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d61746368290000000000000000000000000060648201526084016111b5565b600254600090815b85811015613a3057868682818110613a0c57613a0c61552b565b9050602002013583613a1e91906155c2565b9250613a2981615589565b90506139f2565b50600b54613a3e83836155c2565b1115613a8c5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b600c54821115613ade5760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d617820526573657276656400000000000000000000000060448201526064016111b5565b81600c6000828254613af09190615617565b90915550600092508290505b838110156135155760005b878783818110613b1957613b1961552b565b90506020020135811015613b4c57613b3c8686848181106134ce576134ce61552b565b613b4581615589565b9050613b07565b50613b5681615589565b9050613afc565b60055473ffffffffffffffffffffffffffffffffffffffff163314613bc45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600d55565b6060613bd48261413d565b613c465760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560448201527f6e0000000000000000000000000000000000000000000000000000000000000060648201526084016111b5565b6000613c506148c9565b90506000815111613c705760405180602001604052806000815250613c9b565b80613c7a846145f6565b604051602001613c8b92919061562e565b6040516020818303038152906040525b9392505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314613d095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600f55565b6017546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015613d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613daa919061565d565b73ffffffffffffffffffffffffffffffffffffffff161415613dd05760019150506110a4565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314613e765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b73ffffffffffffffffffffffffffffffffffffffff8116613eff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016111b5565b613f08816147c9565b50565b60005b8151811015612d7557613f3b8484848481518110613f2e57613f2e61552b565b6020026020010151611460565b80613f4581615589565b915050613f0e565b60055473ffffffffffffffffffffffffffffffffffffffff163314613fb45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b60128054911515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff1633146140555760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600e55565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806140ed57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806110a457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146110a4565b600254600090821080156110a45750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106141775761417761552b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906141fb82611d75565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061424c8261413d565b6142be5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016111b5565b60006142c983611d75565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061433857508373ffffffffffffffffffffffffffffffffffffffff166143208461113c565b73ffffffffffffffffffffffffffffffffffffffff16145b80613e075750613e078185613d0e565b8273ffffffffffffffffffffffffffffffffffffffff1661436882611d75565b73ffffffffffffffffffffffffffffffffffffffff16146143f15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016111b5565b73ffffffffffffffffffffffffffffffffffffffff82166144795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016111b5565b6144846000826141a1565b81600282815481106144985761449861552b565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600080600080614526856148d8565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015614581573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b600081836040516020016145c992919061562e565b60405160208183030381529060405280519060200120905092915050565b6000613c9b826016548561494c565b60608161463657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115614660578061464a81615589565b91506146599050600a836156a9565b915061463a565b60008167ffffffffffffffff81111561467b5761467b614e98565b6040519080825280601f01601f1916602001820160405280156146a5576020820181803683370190505b5090505b8415613e07576146ba600183615617565b91506146c7600a866156bd565b6146d29060306155c2565b60f81b8183815181106146e7576146e761552b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350614721600a866156a9565b94506146a9565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61484b848484614348565b61485784848484614962565b612d755760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016111b5565b6060600780546110b9906154d7565b6000806000835160411461492e5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016111b5565b50505060208101516040820151606090920151909260009190911a90565b6000826149598584614b38565b14949350505050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15614b2d576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906149d99033908990889088906004016156d1565b6020604051808303816000875af1925050508015614a32575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252614a2f9181019061571a565b60015b614ae2573d808015614a60576040519150601f19603f3d011682016040523d82523d6000602084013e614a65565b606091505b508051614ada5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016111b5565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050613e07565b506001949350505050565b600081815b845181101561280d576000858281518110614b5a57614b5a61552b565b60200260200101519050808311614b805760008381526020829052604090209250614b91565b600081815260208490526040902092505b5080614b9c81615589565b915050614b3d565b828054614bb0906154d7565b90600052602060002090601f016020900481019282614bd25760008555614c18565b82601f10614beb57805160ff1916838001178555614c18565b82800160010185558215614c18579182015b82811115614c18578251825591602001919060010190614bfd565b50611a7b9291505b80821115611a7b5760008155600101614c20565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114613f0857600080fd5b600060208284031215614c7457600080fd5b8135613c9b81614c34565b60005b83811015614c9a578181015183820152602001614c82565b83811115612d755750506000910152565b60008151808452614cc3816020860160208601614c7f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613c9b6020830184614cab565b600060208284031215614d1a57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114613f0857600080fd5b60008060408385031215614d5657600080fd5b8235614d6181614d21565b946020939093013593505050565b600080600060608486031215614d8457600080fd5b8335614d8f81614d21565b92506020840135614d9f81614d21565b929592945050506040919091013590565b60008083601f840112614dc257600080fd5b50813567ffffffffffffffff811115614dda57600080fd5b6020830191508360208260051b8501011115614df557600080fd5b9250929050565b60008060008060408587031215614e1257600080fd5b843567ffffffffffffffff80821115614e2a57600080fd5b614e3688838901614db0565b90965094506020870135915080821115614e4f57600080fd5b50614e5c87828801614db0565b95989497509550505050565b80358015158114614e7857600080fd5b919050565b600060208284031215614e8f57600080fd5b613c9b82614e68565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614f0e57614f0e614e98565b604052919050565b600082601f830112614f2757600080fd5b813567ffffffffffffffff811115614f4157614f41614e98565b614f7260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614ec7565b818152846020838601011115614f8757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614fb757600080fd5b8235614fc281614d21565b9150602083013567ffffffffffffffff811115614fde57600080fd5b614fea85828601614f16565b9150509250929050565b60006020828403121561500657600080fd5b813567ffffffffffffffff81111561501d57600080fd5b613e0784828501614f16565b600080600080600080600080610100898b03121561504657600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925061507960c08a01614e68565b915060e089013590509295985092959890939650565b6000806000604084860312156150a457600080fd5b833567ffffffffffffffff808211156150bc57600080fd5b6150c887838801614f16565b945060208601359150808211156150de57600080fd5b506150eb86828701614db0565b9497909650939450505050565b600067ffffffffffffffff82111561511257615112614e98565b5060051b60200190565b6000806000806080858703121561513257600080fd5b843593506020808601359350604086013567ffffffffffffffff8082111561515957600080fd5b818801915088601f83011261516d57600080fd5b813561518061517b826150f8565b614ec7565b81815260059190911b8301840190848101908b83111561519f57600080fd5b938501935b828510156151bd578435825293850193908501906151a4565b9650505060608801359250808311156151d557600080fd5b50506151e387828801614f16565b91505092959194509250565b60006020828403121561520157600080fd5b8135613c9b81614d21565b600080600080600060a0868803121561522457600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6020808252825182820181905260009190848201906040850190845b8181101561527f57835183529284019291840191600101615263565b50909695505050505050565b6000806040838503121561529e57600080fd5b82359150602083013567ffffffffffffffff811115614fde57600080fd5b600080604083850312156152cf57600080fd5b8235915060208301356152e181614d21565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561527f57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101615308565b6000806040838503121561534d57600080fd5b823561535881614d21565b915061536660208401614e68565b90509250929050565b6000806000806080858703121561538557600080fd5b843561539081614d21565b935060208501356153a081614d21565b925060408501359150606085013567ffffffffffffffff8111156153c357600080fd5b6151e387828801614f16565b600080604083850312156153e257600080fd5b50508035926020909101359150565b6000806040838503121561540457600080fd5b823561540f81614d21565b915060208301356152e181614d21565b60008060006060848603121561543457600080fd5b833561543f81614d21565b925060208481013561545081614d21565b9250604085013567ffffffffffffffff81111561546c57600080fd5b8501601f8101871361547d57600080fd5b803561548b61517b826150f8565b81815260059190911b820183019083810190898311156154aa57600080fd5b928401925b828410156154c8578335825292840192908401906154af565b80955050505050509250925092565b600181811c908216806154eb57607f821691505b60208210811415615525577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155bb576155bb61555a565b5060010190565b600082198211156155d5576155d561555a565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156125761561261555a565b500290565b6000828210156156295761562961555a565b500390565b60008351615640818460208801614c7f565b835190830190615654818360208801614c7f565b01949350505050565b60006020828403121561566f57600080fd5b8151613c9b81614d21565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826156b8576156b861567a565b500490565b6000826156cc576156cc61567a565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526157106080830184614cab565b9695505050505050565b60006020828403121561572c57600080fd5b8151613c9b81614c3456fea2646970667358221220c2158246a318927a7f51ec3b42354ddc9a56b37820b9854fca80d804043d330564736f6c634300080a003368747470733a2f2f686f7573656f6666697273742e636f6d3a313333352f626c61636b697362656175746966756c2f6f70656e7365612f

Deployed Bytecode

0x6080604052600436106105b55760003560e01c80637e79c723116102eb578063ad7c039e1161018f578063d45a0237116100e1578063f686788311610095578063fc8cc4591161006f578063fc8cc45914610ff8578063fe60d12c14611018578063ff8abd1f1461102e57600080fd5b8063f686788314610fb3578063f968adbe14610fcd578063fb107a4f14610fe357600080fd5b8063e985e9c5116100c6578063e985e9c514610f53578063f2fde38b14610f73578063f3993d1114610f9357600080fd5b8063d45a023714610f1d578063d5abeb0114610f3d57600080fd5b8063c215600d11610143578063c87b56dd1161011d578063c87b56dd14610eb9578063caca28ad14610ed9578063cd7c032614610ef057600080fd5b8063c215600d14610e59578063c29af27414610e79578063c6f6f21614610e9957600080fd5b8063b88d4fde11610174578063b88d4fde14610e04578063badf8ec414610e24578063c0d42d9614610e3957600080fd5b8063ad7c039e14610dc4578063b6a3f59a14610de457600080fd5b806392642744116102485780639ca1ac8f116101fc578063a0e67e2b116101d6578063a0e67e2b14610d55578063a22cb46514610d77578063a391f14d14610d9757600080fd5b80639ca1ac8f14610d0a5780639f55029314610d2a578063a035b1fe14610d3f57600080fd5b8063946807fd1161022d578063946807fd14610c9c57806395d89b4114610cb25780639c14727814610cc757600080fd5b80639264274414610c69578063928d63a414610c7c57600080fd5b806389404a791161029f5780638da5cb5b116102845780638da5cb5b14610bfe5780638f5bbf1d14610c2957806391b7f5ed14610c4957600080fd5b806389404a7914610bc95780638d92becd14610bde57600080fd5b8063842a77d3116102d0578063842a77d314610b5c5780638462151c14610b8957806384724c6014610bb657600080fd5b80637e79c72314610b1457806383fde87d14610b3c57600080fd5b80634728b9f41161045d5780635eb17006116103af578063704103c611610363578063715018a61161033d578063715018a614610aca5780637666de7614610adf5780637cb6475914610af457600080fd5b8063704103c614610a5457806370a0823114610a6757806370cd5a8014610a8757600080fd5b806366fddfa91161039457806366fddfa9146109ff5780636c0360eb14610a1f5780636f8b44b014610a3457600080fd5b80635eb170061461098d5780636352211e146109df57600080fd5b806350cee2271161041157806357591dfc116103eb57806357591dfc1461092e5780635ae1d8c81461094e5780635d08c1ae1461096e57600080fd5b806350cee227146108d757806354964d27146108f757806355f804b31461090e57600080fd5b80634be3ca0e116104425780634be3ca0e146108815780634c0f38c2146108a25780634f6ccce7146108b757600080fd5b80634728b9f41461084c578063472efe381461086157600080fd5b80632316b4da116105165780632f9eca87116104ca5780633db82fb5116104a45780633db82fb5146107f65780634210830d1461081657806342842e0e1461082c57600080fd5b80632f9eca87146107b8578063371e6f99146107d85780633ccfd60b146107ee57600080fd5b80632d6e71b6116104fb5780632d6e71b6146107625780632eb4a7ab146107825780632f745c591461079857600080fd5b80632316b4da1461072057806323b872dd1461074257600080fd5b806312b583491161056d5780631ddf3a37116105525780631ddf3a37146106ca578063219c4882146106ea578063222997991461070a57600080fd5b806312b583491461069857806318160ddd146106b557600080fd5b8063081812fc1161059e578063081812fc14610611578063095ea7b3146106565780630bcecf291461067857600080fd5b806301ffc9a7146105ba57806306fdde03146105ef575b600080fd5b3480156105c657600080fd5b506105da6105d5366004614c62565b61104e565b60405190151581526020015b60405180910390f35b3480156105fb57600080fd5b506106046110aa565b6040516105e69190614cf5565b34801561061d57600080fd5b5061063161062c366004614d08565b61113c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016105e6565b34801561066257600080fd5b50610676610671366004614d43565b6111e7565b005b34801561068457600080fd5b506012546105da9062010000900460ff1681565b3480156106a457600080fd5b50475b6040519081526020016105e6565b3480156106c157600080fd5b506002546106a7565b3480156106d657600080fd5b506106766106e5366004614d43565b611340565b3480156106f657600080fd5b50610676610705366004614d43565b6113d0565b34801561071657600080fd5b506106a7600f5481565b34801561072c57600080fd5b506012546105da90640100000000900460ff1681565b34801561074e57600080fd5b5061067661075d366004614d6f565b611460565b34801561076e57600080fd5b5061067661077d366004614d08565b6114e7565b34801561078e57600080fd5b506106a760165481565b3480156107a457600080fd5b506106a76107b3366004614d43565b611553565b3480156107c457600080fd5b506106766107d3366004614dfc565b61166f565b3480156107e457600080fd5b506106a7600e5481565b6106766117ea565b34801561080257600080fd5b50610676610811366004614d08565b6118c3565b34801561082257600080fd5b506106a760095481565b34801561083857600080fd5b50610676610847366004614d6f565b61192f565b34801561085857600080fd5b506105da61194a565b34801561086d57600080fd5b5061067661087c366004614e7d565b61198a565b34801561088d57600080fd5b506012546105da906301000000900460ff1681565b3480156108ae57600080fd5b50600b546106a7565b3480156108c357600080fd5b506106a76108d2366004614d08565b611a22565b3480156108e357600080fd5b506105da6108f2366004614fa4565b611a7f565b34801561090357600080fd5b5060085442116105da565b34801561091a57600080fd5b50610676610929366004614ff4565b611b51565b34801561093a57600080fd5b50610676610949366004614e7d565b611bcf565b34801561095a57600080fd5b50610676610969366004615029565b611c6e565b34801561097a57600080fd5b506012546105da90610100900460ff1681565b34801561099957600080fd5b506109a2611d29565b604080519889526020890197909752958701949094526060860192909252608085015260a0840152151560c083015260e0820152610100016105e6565b3480156109eb57600080fd5b506106316109fa366004614d08565b611d75565b348015610a0b57600080fd5b50610604610a1a36600461508f565b611e22565b348015610a2b57600080fd5b50610604611f34565b348015610a4057600080fd5b50610676610a4f366004614d08565b611fc2565b610676610a6236600461511c565b61202e565b348015610a7357600080fd5b506106a7610a823660046151ef565b61249a565b348015610a9357600080fd5b506106a7610aa23660046151ef565b73ffffffffffffffffffffffffffffffffffffffff1660009081526010602052604090205490565b348015610ad657600080fd5b50610676612599565b348015610aeb57600080fd5b506106a761260c565b348015610b0057600080fd5b50610676610b0f366004614d08565b612623565b348015610b2057600080fd5b50610631738430e0b7be3315735c303b82e4471d59ac152aa581565b348015610b4857600080fd5b50610676610b5736600461520c565b61268f565b348015610b6857600080fd5b506106a7610b773660046151ef565b60106020526000908152604090205481565b348015610b9557600080fd5b50610ba9610ba43660046151ef565b61271b565b6040516105e69190615247565b610676610bc436600461528b565b612815565b348015610bd557600080fd5b506018546106a7565b348015610bea57600080fd5b50610676610bf9366004614e7d565b612abc565b348015610c0a57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610631565b348015610c3557600080fd5b50610676610c443660046152bc565b612b5a565b348015610c5557600080fd5b50610676610c64366004614d08565b612d7b565b610676610c77366004614d08565b612de7565b348015610c8857600080fd5b50610676610c97366004614e7d565b61315e565b348015610ca857600080fd5b506106a760085481565b348015610cbe57600080fd5b506106046131fe565b348015610cd357600080fd5b506106a7610ce23660046151ef565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b348015610d1657600080fd5b50610676610d25366004614dfc565b61320d565b348015610d3657600080fd5b506106a761351e565b348015610d4b57600080fd5b506106a7600a5481565b348015610d6157600080fd5b50610d6a61352e565b6040516105e691906152ec565b348015610d8357600080fd5b50610676610d9236600461533a565b61359c565b348015610da357600080fd5b506106a7610db23660046151ef565b60116020526000908152604090205481565b348015610dd057600080fd5b50610676610ddf366004614d08565b613699565b348015610df057600080fd5b50610676610dff366004614d08565b613705565b348015610e1057600080fd5b50610676610e1f36600461536f565b6137d2565b348015610e3057600080fd5b50600f546106a7565b348015610e4557600080fd5b50610676610e543660046153cf565b61385a565b348015610e6557600080fd5b506106a7610e743660046151ef565b6138d3565b348015610e8557600080fd5b50610676610e94366004614dfc565b61390e565b348015610ea557600080fd5b50610676610eb4366004614d08565b613b5d565b348015610ec557600080fd5b50610604610ed4366004614d08565b613bc9565b348015610ee557600080fd5b5060095442116105da565b348015610efc57600080fd5b506017546106319073ffffffffffffffffffffffffffffffffffffffff1681565b348015610f2957600080fd5b50610676610f38366004614d08565b613ca2565b348015610f4957600080fd5b506106a7600b5481565b348015610f5f57600080fd5b506105da610f6e3660046153f1565b613d0e565b348015610f7f57600080fd5b50610676610f8e3660046151ef565b613e0f565b348015610f9f57600080fd5b50610676610fae36600461541f565b613f0b565b348015610fbf57600080fd5b506012546105da9060ff1681565b348015610fd957600080fd5b506106a7600d5481565b348015610fef57600080fd5b50600a546106a7565b34801561100457600080fd5b50610676611013366004614e7d565b613f4d565b34801561102457600080fd5b506106a7600c5481565b34801561103a57600080fd5b50610676611049366004614d08565b613fee565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806110a457506110a48261405a565b92915050565b6060600080546110b9906154d7565b80601f01602080910402602001604051908101604052809291908181526020018280546110e5906154d7565b80156111325780601f1061110757610100808354040283529160200191611132565b820191906000526020600020905b81548152906001019060200180831161111557829003601f168201915b5050505050905090565b60006111478261413d565b6111be5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006111f282611d75565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112965760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016111b5565b3373ffffffffffffffffffffffffffffffffffffffff821614806112bf57506112bf8133613d0e565b6113315760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016111b5565b61133b83836141a1565b505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146113a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260106020526040902055565b60055473ffffffffffffffffffffffffffffffffffffffff1633146114375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260116020526040902055565b61146a3382614241565b6114dc5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016111b5565b61133b838383614348565b60055473ffffffffffffffffffffffffffffffffffffffff16331461154e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600c55565b600061155e8361249a565b82106115ac5760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f620000000000000000000060448201526064016111b5565b6000805b60025481101561162657600281815481106115cd576115cd61552b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415611616578382141561160a5791506110a49050565b61161382615589565b91505b61161f81615589565b90506115b0565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f620000000000000000000060448201526064016111b5565b60055473ffffffffffffffffffffffffffffffffffffffff1633146116d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b82811461174b5760405162461bcd60e51b815260206004820152603160248201527f496e76616c696420746f6b656e49647320616e6420726563697069656e74732060448201527f286c656e677468206d69736d617463682900000000000000000000000000000060648201526084016111b5565b60005b818110156117e35760005b85858381811061176b5761176b61552b565b905060200201358110156117d2576117c23385858581811061178f5761178f61552b565b90506020020160208101906117a491906151ef565b8888868181106117b6576117b661552b565b90506020020135611460565b6117cb81615589565b9050611759565b506117dc81615589565b905061174e565b5050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146118515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b6040514790600090339083908381818185875af1925050503d8060008114611895576040519150601f19603f3d011682016040523d82523d6000602084013e61189a565b606091505b50509050806118a857600080fd5b81601860008282546118ba91906155c2565b90915550505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461192a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600855565b61133b838383604051806020016040528060008152506137d2565b600080611958600854421190565b801561196657506009544211155b9050600061197261260c565b600254111590508180156119835750805b9250505090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146119f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000611a2d60025490565b8210611a7b5760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f6200000000000000000060448201526064016111b5565b5090565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602080830191909152825180830360140181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401829052845180850390910181526090909301909352815191012060009190738430e0b7be3315735c303b82e4471d59ac152aa5611b318286614517565b73ffffffffffffffffffffffffffffffffffffffff161495945050505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611bb85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b8051611bcb906007906020840190614ba4565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611c365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b6012805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314611cd55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b611cde88612d7b565b611ce787613ca2565b611cf086613b5d565b611cf985613705565b611d03848461385a565b611d0c82613f4d565b611d16821561315e565b611d1f81612623565b5050505050505050565b600080600080600080600080600a54600f54600d54611d4661260c565b600854600954601254601654969f959e50939c50919a5098509650640100000000900460ff1694509092509050565b60008060028381548110611d8b57611d8b61552b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050806110a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016111b5565b6060600033604051602001611e62919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b6040516020818303038152906040529050611eb9611e8086836145b4565b8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145e792505050565b611f2b5760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960448201527f65642e000000000000000000000000000000000000000000000000000000000060648201526084016111b5565b50929392505050565b60078054611f41906154d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6d906154d7565b8015611fba5780601f10611f8f57610100808354040283529160200191611fba565b820191906000526020600020905b815481529060010190602001808311611f9d57829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff1633146120295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600b55565b600260065414156120815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016111b5565b6002600655601254610100900460ff161580156120a757506012546301000000900460ff165b6120f35760405162461bcd60e51b815260206004820152600b60248201527f53616c652050617573656400000000000000000000000000000000000000000060448201526064016111b5565b60085442116121445760405162461bcd60e51b815260206004820152601460248201527f53616c6520686173206e6f74207374617274656400000000000000000000000060448201526064016111b5565b60095442106121955760405162461bcd60e51b815260206004820152600e60248201527f53616c652068617320656e64656400000000000000000000000000000000000060448201526064016111b5565b83600a546121a391906155da565b3410156121f25760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420456e6f7567682045544800000000000000000000000000000000000060448201526064016111b5565b60125460ff161561225d57600f54925061220c3382611a7f565b6122585760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420616c6c6f776c697374656400000000000000000060448201526064016111b5565b612307565b604080513360601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208201528151601481830301815260349091019091526122b96122b36122ad866145f6565b836145b4565b846145e7565b6123055760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420616c6c6f776c697374656400000000000000000060448201526064016111b5565b505b600254841580159061231b5750600d548511155b6123675760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e66747300000000000000000000000060448201526064016111b5565b600c54600b546123779190615617565b61238186836155c2565b11156123cf5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b3360009081526010602052604090205484906123ec9087906155c2565b111561243a5760405162461bcd60e51b815260206004820152601260248201527f4578636565647320416c6c6f636174696f6e000000000000000000000000000060448201526064016111b5565b33600090815260106020526040812080548792906124599084906155c2565b90915550600090505b8581101561248d5761247d3361247883856155c2565b614728565b61248681615589565b9050612462565b5050600160065550505050565b600073ffffffffffffffffffffffffffffffffffffffff82166125255760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016111b5565b600254600090815b8181101561259057600281815481106125485761254861552b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff868116911614156125805761257d83615589565b92505b61258981615589565b905061252d565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146126005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b61260a60006147c9565b565b6000600c54600b5461261e9190615617565b905090565b60055473ffffffffffffffffffffffffffffffffffffffff16331461268a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b601655565b60055473ffffffffffffffffffffffffffffffffffffffff1633146126f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b612700858561385a565b61270983613b5d565b61271282613ca2565b6117e381613705565b60606127268261249a565b6000106127755760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f620000000000000000000060448201526064016111b5565b60006127808361249a565b905060008167ffffffffffffffff81111561279d5761279d614e98565b6040519080825280602002602001820160405280156127c6578160200160208202803683370190505b50905060005b8281101561280d576127de8582611553565b8282815181106127f0576127f061552b565b60209081029190910101528061280581615589565b9150506127cc565b509392505050565b600260065414156128685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016111b5565b6002600655601254610100900460ff1615801561288d575060125462010000900460ff165b6128d95760405162461bcd60e51b815260206004820152600b60248201527f53616c652050617573656400000000000000000000000000000000000000000060448201526064016111b5565b6128e33382611a7f565b61292f5760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420616c6c6f776c697374656400000000000000000060448201526064016111b5565b60025482158015906129435750600d548311155b61298f5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e66747300000000000000000000000060448201526064016111b5565b600c54600b5461299f9190615617565b6129a984836155c2565b11156129f75760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b600e5433600090815260116020526040902054612a159085906155c2565b1115612a635760405162461bcd60e51b815260206004820152601260248201527f4578636565647320416c6c6f636174696f6e000000000000000000000000000060448201526064016111b5565b3360009081526011602052604081208054859290612a829084906155c2565b90915550600090505b83811015612ab157612aa13361247883856155c2565b612aaa81615589565b9050612a8b565b505060016006555050565b60055473ffffffffffffffffffffffffffffffffffffffff163314612b235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b60128054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314612bc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600e5473ffffffffffffffffffffffffffffffffffffffff8216600090815260116020526040902054612bf59084906155c2565b1115612c435760405162461bcd60e51b815260206004820152601c60248201527f4578636565647320616d6261737361646f7220616c6c6f77616e63650000000060448201526064016111b5565b600254600b54612c5384836155c2565b1115612ca15760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b600c54831115612cf35760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d617820526573657276656400000000000000000000000060448201526064016111b5565b82600c6000828254612d059190615617565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526011602052604081208054859290612d3f9084906155c2565b90915550600090505b83811015612d7557612d658383612d5e81615589565b9450614728565b612d6e81615589565b9050612d48565b50505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314612de25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600a55565b60026006541415612e3a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016111b5565b6002600655601254610100900460ff16158015612e615750601254640100000000900460ff165b612ed35760405162461bcd60e51b815260206004820152602360248201527f53616c6520706175736564206f72207075626c69632073616c6520646973616260448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016111b5565b6008544211612f245760405162461bcd60e51b815260206004820152601460248201527f53616c6520686173206e6f74207374617274656400000000000000000000000060448201526064016111b5565b6009544210612f755760405162461bcd60e51b815260206004820152600e60248201527f53616c652068617320656e64656400000000000000000000000000000000000060448201526064016111b5565b6002548115801590612f895750600d548211155b612fd55760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e66747300000000000000000000000060448201526064016111b5565b600c54600b54612fe59190615617565b612fef83836155c2565b111561303d5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b81600a5461304b91906155da565b34101561309a5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420456e6f7567682045544800000000000000000000000000000000000060448201526064016111b5565b600f54336000908152601060205260409020546130b89084906155c2565b11156131065760405162461bcd60e51b815260206004820152601260248201527f4578636565647320416c6c6f636174696f6e000000000000000000000000000060448201526064016111b5565b33600090815260106020526040812080548492906131259084906155c2565b90915550600090505b82811015613154576131443361247883856155c2565b61314d81615589565b905061312e565b5050600160065550565b60055473ffffffffffffffffffffffffffffffffffffffff1633146131c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b601280549115156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff909216919091179055565b6060600180546110b9906154d7565b60055473ffffffffffffffffffffffffffffffffffffffff1633146132745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b8281146132e95760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d61746368290000000000000000000000000060648201526084016111b5565b600254600090815b8581101561332f5786868281811061330b5761330b61552b565b905060200201358361331d91906155c2565b925061332881615589565b90506132f1565b50600b5461333d83836155c2565b111561338b5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b600c548211156133dd5760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d617820526573657276656400000000000000000000000060448201526064016111b5565b81600c60008282546133ef9190615617565b90915550600092508290505b83811015613515578686828181106134155761341561552b565b90506020020135601060008787858181106134325761343261552b565b905060200201602081019061344791906151ef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461349091906155c2565b90915550600090505b8787838181106134ab576134ab61552b565b90506020020135811015613504576134f48686848181106134ce576134ce61552b565b90506020020160208101906134e391906151ef565b846134ed81615589565b9550614728565b6134fd81615589565b9050613499565b5061350e81615589565b90506133fb565b50505050505050565b60004760185461261e91906155c2565b6060600280548060200260200160405190810160405280929190818152602001828054801561113257602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311613568575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff82163314156136025760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016111b5565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146137005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600955565b60055473ffffffffffffffffffffffffffffffffffffffff16331461376c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600b548111156137be5760405162461bcd60e51b815260206004820152601d60248201527f537570706c79206361702065786365656473206d617820737570706c7900000060448201526064016111b5565b80600b546137cc9190615617565b600c5550565b6137dc3383614241565b61384e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016111b5565b612d7584848484614840565b60055473ffffffffffffffffffffffffffffffffffffffff1633146138c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b6138ca826118c3565b611bcb81613699565b73ffffffffffffffffffffffffffffffffffffffff811660009081526011602090815260408083205460109092528220546110a491906155c2565b60055473ffffffffffffffffffffffffffffffffffffffff1633146139755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b8281146139ea5760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d61746368290000000000000000000000000060648201526084016111b5565b600254600090815b85811015613a3057868682818110613a0c57613a0c61552b565b9050602002013583613a1e91906155c2565b9250613a2981615589565b90506139f2565b50600b54613a3e83836155c2565b1115613a8c5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c79000000000000000000000000000060448201526064016111b5565b600c54821115613ade5760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d617820526573657276656400000000000000000000000060448201526064016111b5565b81600c6000828254613af09190615617565b90915550600092508290505b838110156135155760005b878783818110613b1957613b1961552b565b90506020020135811015613b4c57613b3c8686848181106134ce576134ce61552b565b613b4581615589565b9050613b07565b50613b5681615589565b9050613afc565b60055473ffffffffffffffffffffffffffffffffffffffff163314613bc45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600d55565b6060613bd48261413d565b613c465760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560448201527f6e0000000000000000000000000000000000000000000000000000000000000060648201526084016111b5565b6000613c506148c9565b90506000815111613c705760405180602001604052806000815250613c9b565b80613c7a846145f6565b604051602001613c8b92919061562e565b6040516020818303038152906040525b9392505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314613d095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600f55565b6017546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015613d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613daa919061565d565b73ffffffffffffffffffffffffffffffffffffffff161415613dd05760019150506110a4565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314613e765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b73ffffffffffffffffffffffffffffffffffffffff8116613eff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016111b5565b613f08816147c9565b50565b60005b8151811015612d7557613f3b8484848481518110613f2e57613f2e61552b565b6020026020010151611460565b80613f4581615589565b915050613f0e565b60055473ffffffffffffffffffffffffffffffffffffffff163314613fb45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b60128054911515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff1633146140555760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b600e55565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806140ed57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806110a457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146110a4565b600254600090821080156110a45750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106141775761417761552b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906141fb82611d75565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061424c8261413d565b6142be5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016111b5565b60006142c983611d75565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061433857508373ffffffffffffffffffffffffffffffffffffffff166143208461113c565b73ffffffffffffffffffffffffffffffffffffffff16145b80613e075750613e078185613d0e565b8273ffffffffffffffffffffffffffffffffffffffff1661436882611d75565b73ffffffffffffffffffffffffffffffffffffffff16146143f15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016111b5565b73ffffffffffffffffffffffffffffffffffffffff82166144795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016111b5565b6144846000826141a1565b81600282815481106144985761449861552b565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600080600080614526856148d8565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015614581573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b600081836040516020016145c992919061562e565b60405160208183030381529060405280519060200120905092915050565b6000613c9b826016548561494c565b60608161463657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115614660578061464a81615589565b91506146599050600a836156a9565b915061463a565b60008167ffffffffffffffff81111561467b5761467b614e98565b6040519080825280601f01601f1916602001820160405280156146a5576020820181803683370190505b5090505b8415613e07576146ba600183615617565b91506146c7600a866156bd565b6146d29060306155c2565b60f81b8183815181106146e7576146e761552b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350614721600a866156a9565b94506146a9565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61484b848484614348565b61485784848484614962565b612d755760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016111b5565b6060600780546110b9906154d7565b6000806000835160411461492e5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016111b5565b50505060208101516040820151606090920151909260009190911a90565b6000826149598584614b38565b14949350505050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15614b2d576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906149d99033908990889088906004016156d1565b6020604051808303816000875af1925050508015614a32575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252614a2f9181019061571a565b60015b614ae2573d808015614a60576040519150601f19603f3d011682016040523d82523d6000602084013e614a65565b606091505b508051614ada5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016111b5565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050613e07565b506001949350505050565b600081815b845181101561280d576000858281518110614b5a57614b5a61552b565b60200260200101519050808311614b805760008381526020829052604090209250614b91565b600081815260208490526040902092505b5080614b9c81615589565b915050614b3d565b828054614bb0906154d7565b90600052602060002090601f016020900481019282614bd25760008555614c18565b82601f10614beb57805160ff1916838001178555614c18565b82800160010185558215614c18579182015b82811115614c18578251825591602001919060010190614bfd565b50611a7b9291505b80821115611a7b5760008155600101614c20565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114613f0857600080fd5b600060208284031215614c7457600080fd5b8135613c9b81614c34565b60005b83811015614c9a578181015183820152602001614c82565b83811115612d755750506000910152565b60008151808452614cc3816020860160208601614c7f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613c9b6020830184614cab565b600060208284031215614d1a57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114613f0857600080fd5b60008060408385031215614d5657600080fd5b8235614d6181614d21565b946020939093013593505050565b600080600060608486031215614d8457600080fd5b8335614d8f81614d21565b92506020840135614d9f81614d21565b929592945050506040919091013590565b60008083601f840112614dc257600080fd5b50813567ffffffffffffffff811115614dda57600080fd5b6020830191508360208260051b8501011115614df557600080fd5b9250929050565b60008060008060408587031215614e1257600080fd5b843567ffffffffffffffff80821115614e2a57600080fd5b614e3688838901614db0565b90965094506020870135915080821115614e4f57600080fd5b50614e5c87828801614db0565b95989497509550505050565b80358015158114614e7857600080fd5b919050565b600060208284031215614e8f57600080fd5b613c9b82614e68565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614f0e57614f0e614e98565b604052919050565b600082601f830112614f2757600080fd5b813567ffffffffffffffff811115614f4157614f41614e98565b614f7260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614ec7565b818152846020838601011115614f8757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614fb757600080fd5b8235614fc281614d21565b9150602083013567ffffffffffffffff811115614fde57600080fd5b614fea85828601614f16565b9150509250929050565b60006020828403121561500657600080fd5b813567ffffffffffffffff81111561501d57600080fd5b613e0784828501614f16565b600080600080600080600080610100898b03121561504657600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925061507960c08a01614e68565b915060e089013590509295985092959890939650565b6000806000604084860312156150a457600080fd5b833567ffffffffffffffff808211156150bc57600080fd5b6150c887838801614f16565b945060208601359150808211156150de57600080fd5b506150eb86828701614db0565b9497909650939450505050565b600067ffffffffffffffff82111561511257615112614e98565b5060051b60200190565b6000806000806080858703121561513257600080fd5b843593506020808601359350604086013567ffffffffffffffff8082111561515957600080fd5b818801915088601f83011261516d57600080fd5b813561518061517b826150f8565b614ec7565b81815260059190911b8301840190848101908b83111561519f57600080fd5b938501935b828510156151bd578435825293850193908501906151a4565b9650505060608801359250808311156151d557600080fd5b50506151e387828801614f16565b91505092959194509250565b60006020828403121561520157600080fd5b8135613c9b81614d21565b600080600080600060a0868803121561522457600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6020808252825182820181905260009190848201906040850190845b8181101561527f57835183529284019291840191600101615263565b50909695505050505050565b6000806040838503121561529e57600080fd5b82359150602083013567ffffffffffffffff811115614fde57600080fd5b600080604083850312156152cf57600080fd5b8235915060208301356152e181614d21565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561527f57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101615308565b6000806040838503121561534d57600080fd5b823561535881614d21565b915061536660208401614e68565b90509250929050565b6000806000806080858703121561538557600080fd5b843561539081614d21565b935060208501356153a081614d21565b925060408501359150606085013567ffffffffffffffff8111156153c357600080fd5b6151e387828801614f16565b600080604083850312156153e257600080fd5b50508035926020909101359150565b6000806040838503121561540457600080fd5b823561540f81614d21565b915060208301356152e181614d21565b60008060006060848603121561543457600080fd5b833561543f81614d21565b925060208481013561545081614d21565b9250604085013567ffffffffffffffff81111561546c57600080fd5b8501601f8101871361547d57600080fd5b803561548b61517b826150f8565b81815260059190911b820183019083810190898311156154aa57600080fd5b928401925b828410156154c8578335825292840192908401906154af565b80955050505050509250925092565b600181811c908216806154eb57607f821691505b60208210811415615525577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155bb576155bb61555a565b5060010190565b600082198211156155d5576155d561555a565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156125761561261555a565b500290565b6000828210156156295761562961555a565b500390565b60008351615640818460208801614c7f565b835190830190615654818360208801614c7f565b01949350505050565b60006020828403121561566f57600080fd5b8151613c9b81614d21565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826156b8576156b861567a565b500490565b6000826156cc576156cc61567a565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526157106080830184614cab565b9695505050505050565b60006020828403121561572c57600080fd5b8151613c9b81614c3456fea2646970667358221220c2158246a318927a7f51ec3b42354ddc9a56b37820b9854fca80d804043d330564736f6c634300080a0033

Deployed Bytecode Sourcemap

1173:17340:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;191:301:4;;;;;;;;;;-1:-1:-1;191:301:4;;;;;:::i;:::-;;:::i;:::-;;;611:14:15;;604:22;586:41;;574:2;559:18;191:301:4;;;;;;;;2089:100:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2729:308::-;;;;;;;;;;-1:-1:-1;2729:308:5;;;;;:::i;:::-;;:::i;:::-;;;1809:42:15;1797:55;;;1779:74;;1767:2;1752:18;2729:308:5;1633:226:15;2309:412:5;;;;;;;;;;-1:-1:-1;2309:412:5;;;;;:::i;:::-;;:::i;:::-;;2356:40:1;;;;;;;;;;-1:-1:-1;2356:40:1;;;;;;;;;;;17412:104;;;;;;;;;;-1:-1:-1;17487:21:1;17412:104;;;2489:25:15;;;2477:2;2462:18;17412:104:1;2343:177:15;1470:110:4;;;;;;;;;;-1:-1:-1;1558:7:4;:14;1470:110;;13410:122:1;;;;;;;;;;-1:-1:-1;13410:122:1;;;;;:::i;:::-;;:::i;13540:142::-;;;;;;;;;;-1:-1:-1;13540:142:1;;;;;:::i;:::-;;:::i;1955:37::-;;;;;;;;;;;;;;;;2449:36;;;;;;;;;;-1:-1:-1;2449:36:1;;;;;;;;;;;3602:376:5;;;;;;;;;;-1:-1:-1;3602:376:5;;;;;:::i;:::-;;:::i;13788:96:1:-;;;;;;;;;;-1:-1:-1;13788:96:1;;;;;:::i;:::-;;:::i;2782:25::-;;;;;;;;;;;;;;;;500:504:4;;;;;;;;;;-1:-1:-1;500:504:4;;;;;:::i;:::-;;:::i;12529:428:1:-;;;;;;;;;;-1:-1:-1;12529:428:1;;;;;:::i;:::-;;:::i;1888:38::-;;;;;;;;;;;;;;;;17735:273;;;:::i;15546:120::-;;;;;;;;;;-1:-1:-1;15546:120:1;;;;;:::i;:::-;;:::i;1475:71::-;;;;;;;;;;;;;;;;3986:185:5;;;;;;;;;;-1:-1:-1;3986:185:5;;;;;:::i;:::-;;:::i;4021:236:1:-;;;;;;;;;;;;;:::i;15443:95::-;;;;;;;;;;-1:-1:-1;15443:95:1;;;;;:::i;:::-;;:::i;2403:39::-;;;;;;;;;;-1:-1:-1;2403:39:1;;;;;;;;;;;3807:89;;;;;;;;;;-1:-1:-1;3879:9:1;;3807:89;;1588:244:4;;;;;;;;;;-1:-1:-1;1588:244:4;;;;;:::i;:::-;;:::i;4501:364:1:-;;;;;;;;;;-1:-1:-1;4501:364:1;;;;;:::i;:::-;;:::i;3555:120::-;;;;;;;;;;-1:-1:-1;3647:20:1;;3629:15;:38;3555:120;;14795:104;;;;;;;;;;-1:-1:-1;14795:104:1;;;;;:::i;:::-;;:::i;15294:141::-;;;;;;;;;;-1:-1:-1;15294:141:1;;;;;:::i;:::-;;:::i;16368:560::-;;;;;;;;;;-1:-1:-1;16368:560:1;;;;;:::i;:::-;;:::i;2319:30::-;;;;;;;;;;-1:-1:-1;2319:30:1;;;;;;;;;;;16936:280;;;;;;;;;;;;;:::i;:::-;;;;7579:25:15;;;7635:2;7620:18;;7613:34;;;;7663:18;;;7656:34;;;;7721:2;7706:18;;7699:34;;;;7764:3;7749:19;;7742:35;7808:3;7793:19;;7786:35;7865:14;7858:22;7852:3;7837:19;;7830:51;7912:3;7897:19;;7890:35;7566:3;7551:19;16936:280:1;7242:689:15;1755:326:5;;;;;;;;;;-1:-1:-1;1755:326:5;;;;;:::i;:::-;;:::i;5803:315:1:-;;;;;;;;;;-1:-1:-1;5803:315:1;;;;;:::i;:::-;;:::i;1316:21::-;;;;;;;;;;;;;:::i;14274:106::-;;;;;;;;;;-1:-1:-1;14274:106:1;;;;;:::i;:::-;;:::i;7142:1445::-;;;;;;:::i;:::-;;:::i;1229:518:5:-;;;;;;;;;;-1:-1:-1;1229:518:5;;;;;:::i;:::-;;:::i;3147:109:1:-;;;;;;;;;;-1:-1:-1;3147:109:1;;;;;:::i;:::-;3233:15;;3206:7;3233:15;;;:9;:15;;;;;;;3147:109;1661:101:12;;;;;;;;;;;;;:::i;3904:109:1:-;;;;;;;;;;;;;:::i;13312:90::-;;;;;;;;;;-1:-1:-1;13312:90:1;;;;;:::i;:::-;;:::i;2512:85::-;;;;;;;;;;;;2555:42;2512:85;;16007:353;;;;;;;;;;-1:-1:-1;16007:353:1;;;;;:::i;:::-;;:::i;2050:44::-;;;;;;;;;;-1:-1:-1;2050:44:1;;;;;:::i;:::-;;;;;;;;;;;;;;1012:450:4;;;;;;;;;;-1:-1:-1;1012:450:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8663:765:1:-;;;;;;:::i;:::-;;:::i;17305:99::-;;;;;;;;;;-1:-1:-1;17382:14:1;;17305:99;;14907:101;;;;;;;;;;-1:-1:-1;14907:101:1;;;;;:::i;:::-;;:::i;1029:85:12:-;;;;;;;;;;-1:-1:-1;1101:6:12;;;;1029:85;;11506:621:1;;;;;;;;;;-1:-1:-1;11506:621:1;;;;;:::i;:::-;;:::i;13690:90::-;;;;;;;;;;-1:-1:-1;13690:90:1;;;;;:::i;:::-;;:::i;6193:874::-;;;;;;:::i;:::-;;:::i;15149:137::-;;;;;;;;;;-1:-1:-1;15149:137:1;;;;;:::i;:::-;;:::i;1371:48::-;;;;;;;;;;;;;;;;2197:104:5;;;;;;;;;;;;;:::i;3264:129:1:-;;;;;;;;;;-1:-1:-1;3264:129:1;;;;;:::i;:::-;3360:25;;3333:7;3360:25;;;:19;:25;;;;;;;3264:129;10490:914;;;;;;;;;;-1:-1:-1;10490:914:1;;;;;:::i;:::-;;:::i;17524:121::-;;;;;;;;;;;;;:::i;1600:33::-;;;;;;;;;;;;;;;;763:95:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3045:327::-;;;;;;;;;;-1:-1:-1;3045:327:5;;;;;:::i;:::-;;:::i;2133:54:1:-;;;;;;;;;;-1:-1:-1;2133:54:1;;;;;:::i;:::-;;;;;;;;;;;;;;15674:116;;;;;;;;;;-1:-1:-1;15674:116:1;;;;;:::i;:::-;;:::i;14600:187::-;;;;;;;;;;-1:-1:-1;14600:187:1;;;;;:::i;:::-;;:::i;4179:365:5:-;;;;;;;;;;-1:-1:-1;4179:365:5;;;;;:::i;:::-;;:::i;4265:107:1:-;;;;;;;;;;-1:-1:-1;4346:18:1;;4265:107;;15798:201;;;;;;;;;;-1:-1:-1;15798:201:1;;;;;:::i;:::-;;:::i;3401:142::-;;;;;;;;;;-1:-1:-1;3401:142:1;;;;;:::i;:::-;;:::i;9519:852::-;;;;;;;;;;-1:-1:-1;9519:852:1;;;;;:::i;:::-;;:::i;13892:96::-;;;;;;;;;;-1:-1:-1;13892:96:1;;;;;:::i;:::-;;:::i;12965:339::-;;;;;;;;;;-1:-1:-1;12965:339:1;;;;;:::i;:::-;;:::i;3683:116::-;;;;;;;;;;-1:-1:-1;3773:18:1;;3755:15;:36;3683:116;;2816:80;;;;;;;;;;-1:-1:-1;2816:80:1;;;;;;;;14130:136;;;;;;;;;;-1:-1:-1;14130:136:1;;;;;:::i;:::-;;:::i;1665:31::-;;;;;;;;;;;;;;;;18109:401;;;;;;;;;;-1:-1:-1;18109:401:1;;;;;:::i;:::-;;:::i;1911:198:12:-;;;;;;;;;;-1:-1:-1;1911:198:12;;;;;:::i;:::-;;:::i;12301:220:1:-;;;;;;;;;;-1:-1:-1;12301:220:1;;;;;:::i;:::-;;:::i;2237:33::-;;;;;;;;;;-1:-1:-1;2237:33:1;;;;;;;;1807:27;;;;;;;;;;;;;;;;4384:84;;;;;;;;;;-1:-1:-1;4455:5:1;;4384:84;;15016:125;;;;;;;;;;-1:-1:-1;15016:125:1;;;;;:::i;:::-;;:::i;1717:28::-;;;;;;;;;;;;;;;;13996:126;;;;;;;;;;-1:-1:-1;13996:126:1;;;;;:::i;:::-;;:::i;191:301:4:-;339:4;381:50;;;396:35;381:50;;:103;;;448:36;472:11;448:23;:36::i;:::-;361:123;191:301;-1:-1:-1;;191:301:4:o;2089:100:5:-;2143:13;2176:5;2169:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2089:100;:::o;2729:308::-;2850:7;2897:16;2905:7;2897;:16::i;:::-;2875:110;;;;-1:-1:-1;;;2875:110:5;;16422:2:15;2875:110:5;;;16404:21:15;16461:2;16441:18;;;16434:30;16500:34;16480:18;;;16473:62;16571:14;16551:18;;;16544:42;16603:19;;2875:110:5;;;;;;;;;-1:-1:-1;3005:24:5;;;;:15;:24;;;;;;;;;2729:308::o;2309:412::-;2390:13;2406:24;2422:7;2406:15;:24::i;:::-;2390:40;;2455:5;2449:11;;:2;:11;;;;2441:57;;;;-1:-1:-1;;;2441:57:5;;16835:2:15;2441:57:5;;;16817:21:15;16874:2;16854:18;;;16847:30;16913:34;16893:18;;;16886:62;16984:3;16964:18;;;16957:31;17005:19;;2441:57:5;16633:397:15;2441:57:5;719:10:2;2533:21:5;;;;;:62;;-1:-1:-1;2558:37:5;2575:5;719:10:2;18109:401:1;:::i;2558:37:5:-;2511:168;;;;-1:-1:-1;;;2511:168:5;;17237:2:15;2511:168:5;;;17219:21:15;17276:2;17256:18;;;17249:30;17315:34;17295:18;;;17288:62;17386:26;17366:18;;;17359:54;17430:19;;2511:168:5;17035:420:15;2511:168:5;2692:21;2701:2;2705:7;2692:8;:21::i;:::-;2379:342;2309:412;;:::o;13410:122:1:-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;13495:16:1::1;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;:29;13410:122::o;13540:142::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;13635:26:1::1;::::0;;::::1;;::::0;;;:19:::1;:26;::::0;;;;:39;13540:142::o;3602:376:5:-;3811:41;719:10:2;3844:7:5;3811:18;:41::i;:::-;3789:140;;;;-1:-1:-1;;;3789:140:5;;18023:2:15;3789:140:5;;;18005:21:15;18062:2;18042:18;;;18035:30;18101:34;18081:18;;;18074:62;18172:19;18152:18;;;18145:47;18209:19;;3789:140:5;17821:413:15;3789:140:5;3942:28;3952:4;3958:2;3962:7;3942:9;:28::i;13788:96:1:-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;13856:8:1::1;:20:::0;13788:96::o;500:504:4:-;625:15;674:24;692:5;674:17;:24::i;:::-;666:5;:32;658:67;;;;-1:-1:-1;;;658:67:4;;18441:2:15;658:67:4;;;18423:21:15;18480:2;18460:18;;;18453:30;18519:24;18499:18;;;18492:52;18561:18;;658:67:4;18239:346:15;658:67:4;736:13;765:9;760:186;780:7;:14;776:18;;760:186;;;829:7;837:1;829:10;;;;;;;;:::i;:::-;;;;;;;;;;;;820:19;;;829:10;;820:19;816:119;;;873:5;864;:14;860:59;;;887:1;-1:-1:-1;880:8:4;;-1:-1:-1;880:8:4;860:59;912:7;;;:::i;:::-;;;860:59;796:3;;;:::i;:::-;;;760:186;;;-1:-1:-1;956:40:4;;-1:-1:-1;;;956:40:4;;18441:2:15;956:40:4;;;18423:21:15;18480:2;18460:18;;;18453:30;18519:24;18499:18;;;18492:52;18561:18;;956:40:4;18239:346:15;12529:428:1;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;12649:35:1;;::::1;12641:97;;;::::0;-1:-1:-1;;;12641:97:1;;19370:2:15;12641:97:1::1;::::0;::::1;19352:21:15::0;19409:2;19389:18;;;19382:30;19448:34;19428:18;;;19421:62;19519:19;19499:18;;;19492:47;19556:19;;12641:97:1::1;19168:413:15::0;12641:97:1::1;12754:9;12749:201;12769:20:::0;;::::1;12749:201;;;12816:9;12811:128;12835:8;;12844:1;12835:11;;;;;;;:::i;:::-;;;;;;;12831:1;:15;12811:128;;;12872:51;12885:10;12897:9;;12907:1;12897:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12911:8;;12920:1;12911:11;;;;;;;:::i;:::-;;;;;;;12872:12;:51::i;:::-;12848:3;::::0;::::1;:::i;:::-;;;12811:128;;;-1:-1:-1::0;12791:3:1::1;::::0;::::1;:::i;:::-;;;12749:201;;;;12529:428:::0;;;;:::o;17735:273::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;17856:64:1::1;::::0;17805:21:::1;::::0;17791:11:::1;::::0;17864:10:::1;::::0;17805:21;;17791:11;17856:64;17791:11;17856:64;17805:21;17864:10;17856:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17837:83;;;17939:7;17931:16;;;::::0;::::1;;17976:3;17958:14;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;17735:273:1:o;15546:120::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;15625:20:1::1;:33:::0;15546:120::o;3986:185:5:-;4124:39;4141:4;4147:2;4151:7;4124:39;;;;;;;;;;;;:16;:39::i;4021:236:1:-;4069:4;4086:11;4100:19;3647:20;;3629:15;:38;;3555:120;4100:19;:41;;;;-1:-1:-1;3773:18:1;;3755:15;:36;4123:18;4100:41;4086:55;;4152:15;4188:23;:21;:23::i;:::-;4170:7;:14;:41;;;-1:-1:-1;4229:6:1;:20;;;;;4239:10;4229:20;4222:27;;;;4021:236;:::o;15443:95::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;15509:13:1::1;:21:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;15443:95::o;1588:244:4:-;1708:7;1749:24;1558:7;:14;;1470:110;1749:24;1741:5;:32;1733:68;;;;-1:-1:-1;;;1733:68:4;;20131:2:15;1733:68:4;;;20113:21:15;20170:2;20150:18;;;20143:30;20209:25;20189:18;;;20182:53;20252:18;;1733:68:4;19929:347:15;1733:68:4;-1:-1:-1;1819:5:4;1588:244::o;4501:364:1:-;4632:22;;;20443:66:15;20430:2;20426:15;;;20422:88;4632:22:1;;;;20410:101:15;;;;4632:22:1;;;;;;;;;20527:12:15;;;4632:22:1;;4622:33;;;;;;20792:66:15;4707:65:1;;;20780:79:15;20875:12;;;;20868:28;;;4707:65:1;;;;;;;;;;20912:12:15;;;;4707:65:1;;;4697:76;;;;;-1:-1:-1;;4622:33:1;2555:42;4791:46;4697:76;4827:9;4791:13;:46::i;:::-;:66;;;;4501:364;-1:-1:-1;;;;;4501:364:1:o;14795:104::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;14870:21:1;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;14795:104:::0;:::o;15294:141::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;15383:20:1::1;:44:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;15294:141::o;16368:560::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;16593:16:1::1;16602:6;16593:8;:16::i;:::-;16620:42;16642:19;16620:21;:42::i;:::-;16673:22;16685:9;16673:11;:22::i;:::-;16706:24;16719:10;16706:12;:24::i;:::-;16741:56;16766:15;16783:13;16741:24;:56::i;:::-;16808:30;16828:9;16808:19;:30::i;:::-;16849:34;16873:9;16872:10;16849:22;:34::i;:::-;16894:26;16908:11;16894:13;:26::i;:::-;16368:560:::0;;;;;;;;:::o;16936:280::-;16987:7;16996;17005;17014;17023;17032;17041:4;17047:7;17075:5;;17082:18;;17102:8;;17112:23;:21;:23::i;:::-;17137:20;;17159:18;;17179:16;;17197:10;;17067:141;;;;-1:-1:-1;17067:141:1;;-1:-1:-1;17067:141:1;;-1:-1:-1;17137:20:1;-1:-1:-1;17159:18:1;-1:-1:-1;17179:16:1;;;;;;-1:-1:-1;17197:10:1;;-1:-1:-1;17067:141:1;-1:-1:-1;16936:280:1:o;1755:326:5:-;1872:7;1897:13;1913:7;1921;1913:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;1962:19:5;1940:110;;;;-1:-1:-1;;;1940:110:5;;21137:2:15;1940:110:5;;;21119:21:15;21176:2;21156:18;;;21149:30;21215:34;21195:18;;;21188:62;21286:11;21266:18;;;21259:39;21315:19;;1940:110:5;20935:405:15;5803:315:1;5897:13;5923:21;5971:10;5954:28;;;;;;;20430:2:15;20426:15;;;;20443:66;20422:88;20410:101;;20536:2;20527:12;;20281:264;5954:28:1;;;;;;;;;;;;;5923:60;;6002:41;6010:25;6016:9;6027:7;6010:5;:25::i;:::-;6037:5;;6002:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6002:7:1;;-1:-1:-1;;;6002:41:1:i;:::-;5994:89;;;;-1:-1:-1;;;5994:89:1;;21547:2:15;5994:89:1;;;21529:21:15;21586:2;21566:18;;;21559:30;21625:34;21605:18;;;21598:62;21696:5;21676:18;;;21669:33;21719:19;;5994:89:1;21345:399:15;5994:89:1;-1:-1:-1;6101:9:1;;5803:315;-1:-1:-1;;;5803:315:1:o;1316:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14274:106::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;14347:9:1::1;:25:::0;14274:106::o;7142:1445::-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;21951:2:15;2317:63:13;;;21933:21:15;21990:2;21970:18;;;21963:30;22029:33;22009:18;;;22002:61;22080:18;;2317:63:13;21749:355:15;2317:63:13;1744:1;2455:7;:18;7305:10:1::1;::::0;::::1;::::0;::::1;;;7304:11;:34:::0;::::1;;;-1:-1:-1::0;7319:19:1::1;::::0;;;::::1;;;7304:34;7296:58;;;::::0;-1:-1:-1;;;7296:58:1;;22311:2:15;7296:58:1::1;::::0;::::1;22293:21:15::0;22350:2;22330:18;;;22323:30;22389:13;22369:18;;;22362:41;22420:18;;7296:58:1::1;22109:335:15::0;7296:58:1::1;7391:20;;7373:15;:38;7365:71;;;::::0;-1:-1:-1;;;7365:71:1;;22651:2:15;7365:71:1::1;::::0;::::1;22633:21:15::0;22690:2;22670:18;;;22663:30;22729:22;22709:18;;;22702:50;22769:18;;7365:71:1::1;22449:344:15::0;7365:71:1::1;7473:18;;7455:15;:36;7447:63;;;::::0;-1:-1:-1;;;7447:63:1;;23000:2:15;7447:63:1::1;::::0;::::1;22982:21:15::0;23039:2;23019:18;;;23012:30;23078:16;23058:18;;;23051:44;23112:18;;7447:63:1::1;22798:338:15::0;7447:63:1::1;7550:12;7542:5;;:20;;;;:::i;:::-;7529:9;:33;;7521:60;;;::::0;-1:-1:-1;;;7521:60:1;;23576:2:15;7521:60:1::1;::::0;::::1;23558:21:15::0;23615:2;23595:18;;;23588:30;23654:16;23634:18;;;23627:44;23688:18;;7521:60:1::1;23374:338:15::0;7521:60:1::1;7595:13;::::0;::::1;;7592:515;;;7692:18;;7680:30;;7733:36;7747:10;7759:9;7733:13;:36::i;:::-;7725:72;;;::::0;-1:-1:-1;;;7725:72:1;;23919:2:15;7725:72:1::1;::::0;::::1;23901:21:15::0;23958:2;23938:18;;;23931:30;23997:25;23977:18;;;23970:53;24040:18;;7725:72:1::1;23717:347:15::0;7725:72:1::1;7592:515;;;7927:28;::::0;;7944:10:::1;20430:2:15::0;20426:15;20443:66;20422:88;7927:28:1::1;::::0;::::1;20410:101:15::0;7927:28:1;;;;;;;;;20527:12:15;;;;7927:28:1;;;7979:59:::1;7987:43;7993:27;8010:9:::0;7993:16:::1;:27::i;:::-;8022:7;7987:5;:43::i;:::-;8032:5;7979:7;:59::i;:::-;7971:95;;;::::0;-1:-1:-1;;;7971:95:1;;23919:2:15;7971:95:1::1;::::0;::::1;23901:21:15::0;23958:2;23938:18;;;23931:30;23997:25;23977:18;;;23970:53;24040:18;;7971:95:1::1;23717:347:15::0;7971:95:1::1;-1:-1:-1::0;7592:515:1::1;8129:7;:14:::0;8162:16;;;;;:44:::1;;;8198:8;;8182:12;:24;;8162:44;8154:77;;;::::0;-1:-1:-1;;;8154:77:1;;24271:2:15;8154:77:1::1;::::0;::::1;24253:21:15::0;24310:2;24290:18;;;24283:30;24349:22;24329:18;;;24322:50;24389:18;;8154:77:1::1;24069:344:15::0;8154:77:1::1;8285:8;;8273:9;;:20;;;;:::i;:::-;8251:16;8255:12:::0;8251:1;:16:::1;:::i;:::-;8250:44;;8242:75;;;::::0;-1:-1:-1;;;8242:75:1;;24750:2:15;8242:75:1::1;::::0;::::1;24732:21:15::0;24789:2;24769:18;;;24762:30;24828:20;24808:18;;;24801:48;24866:18;;8242:75:1::1;24548:342:15::0;8242:75:1::1;8346:10;8336:21;::::0;;;:9:::1;:21;::::0;;;;;8376:9;;8336:36:::1;::::0;8360:12;;8336:36:::1;:::i;:::-;:49;;8328:80;;;::::0;-1:-1:-1;;;8328:80:1;;25097:2:15;8328:80:1::1;::::0;::::1;25079:21:15::0;25136:2;25116:18;;;25109:30;25175:20;25155:18;;;25148:48;25213:18;;8328:80:1::1;24895:342:15::0;8328:80:1::1;8429:10;8419:21;::::0;;;:9:::1;:21;::::0;;;;:37;;8444:12;;8419:21;:37:::1;::::0;8444:12;;8419:37:::1;:::i;:::-;::::0;;;-1:-1:-1;8472:9:1::1;::::0;-1:-1:-1;8467:94:1::1;8491:12;8487:1;:16;8467:94;;;8525:24;8531:10;8543:5;8547:1:::0;8543;:5:::1;:::i;:::-;8525;:24::i;:::-;8505:3;::::0;::::1;:::i;:::-;;;8467:94;;;-1:-1:-1::0;;1701:1:13;2628:7;:22;-1:-1:-1;;;;7142:1445:1:o;1229:518:5:-;1346:7;1393:19;;;1371:111;;;;-1:-1:-1;;;1371:111:5;;25444:2:15;1371:111:5;;;25426:21:15;25483:2;25463:18;;;25456:30;25522:34;25502:18;;;25495:62;25593:12;25573:18;;;25566:40;25623:19;;1371:111:5;25242:406:15;1371:111:5;1538:7;:14;1493:13;;;1563:130;1587:6;1583:1;:10;1563:130;;;1628:7;1636:1;1628:10;;;;;;;;:::i;:::-;;;;;;;;;;;;1619:19;;;1628:10;;1619:19;1615:67;;;1659:7;;;:::i;:::-;;;1615:67;1595:3;;;:::i;:::-;;;1563:130;;;-1:-1:-1;1734:5:5;;1229:518;-1:-1:-1;;;1229:518:5:o;1661:101:12:-;1101:6;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;3904:109:1:-;3958:7;3997:8;;3985:9;;:20;;;;:::i;:::-;3978:27;;3904:109;:::o;13312:90::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;13377:10:1::1;:17:::0;13312:90::o;16007:353::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;16175:56:1::1;16200:15;16217:13;16175:24;:56::i;:::-;16242:22;16254:9;16242:11;:22::i;:::-;16275:42;16297:19;16275:21;:42::i;:::-;16328:24;16341:10;16328:12;:24::i;1012:450:4:-:0;1098:16;1144:24;1162:5;1144:17;:24::i;:::-;1140:1;:28;1132:63;;;;-1:-1:-1;;;1132:63:4;;18441:2:15;1132:63:4;;;18423:21:15;18480:2;18460:18;;;18453:30;18519:24;18499:18;;;18492:52;18561:18;;1132:63:4;18239:346:15;1132:63:4;1206:18;1227:16;1237:5;1227:9;:16::i;:::-;1206:37;;1254:25;1296:10;1282:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1282:25:4;;1254:53;;1323:9;1318:111;1342:10;1338:1;:14;1318:111;;;1388:29;1408:5;1415:1;1388:19;:29::i;:::-;1374:8;1383:1;1374:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;1354:3;;;;:::i;:::-;;;;1318:111;;;-1:-1:-1;1446:8:4;1012:450;-1:-1:-1;;;1012:450:4:o;8663:765:1:-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;21951:2:15;2317:63:13;;;21933:21:15;21990:2;21970:18;;;21963:30;22029:33;22009:18;;;22002:61;22080:18;;2317:63:13;21749:355:15;2317:63:13;1744:1;2455:7;:18;8784:10:1::1;::::0;::::1;::::0;::::1;;;8783:11;:35:::0;::::1;;;-1:-1:-1::0;8798:20:1::1;::::0;;;::::1;;;8783:35;8775:59;;;::::0;-1:-1:-1;;;8775:59:1;;22311:2:15;8775:59:1::1;::::0;::::1;22293:21:15::0;22350:2;22330:18;;;22323:30;22389:13;22369:18;;;22362:41;22420:18;;8775:59:1::1;22109:335:15::0;8775:59:1::1;8853:36;8867:10;8879:9;8853:13;:36::i;:::-;8845:72;;;::::0;-1:-1:-1;;;8845:72:1;;23919:2:15;8845:72:1::1;::::0;::::1;23901:21:15::0;23958:2;23938:18;;;23931:30;23997:25;23977:18;;;23970:53;24040:18;;8845:72:1::1;23717:347:15::0;8845:72:1::1;8940:7;:14:::0;8973:16;;;;;:44:::1;;;9009:8;;8993:12;:24;;8973:44;8965:77;;;::::0;-1:-1:-1;;;8965:77:1;;24271:2:15;8965:77:1::1;::::0;::::1;24253:21:15::0;24310:2;24290:18;;;24283:30;24349:22;24329:18;;;24322:50;24389:18;;8965:77:1::1;24069:344:15::0;8965:77:1::1;9096:8;;9084:9;;:20;;;;:::i;:::-;9062:16;9066:12:::0;9062:1;:16:::1;:::i;:::-;9061:44;;9053:75;;;::::0;-1:-1:-1;;;9053:75:1;;24750:2:15;9053:75:1::1;::::0;::::1;24732:21:15::0;24789:2;24769:18;;;24762:30;24828:20;24808:18;;;24801:48;24866:18;;9053:75:1::1;24548:342:15::0;9053:75:1::1;9197:19;::::0;9167:10:::1;9147:31;::::0;;;:19:::1;:31;::::0;;;;;:46:::1;::::0;9181:12;;9147:46:::1;:::i;:::-;:69;;9139:100;;;::::0;-1:-1:-1;;;9139:100:1;;25097:2:15;9139:100:1::1;::::0;::::1;25079:21:15::0;25136:2;25116:18;;;25109:30;25175:20;25155:18;;;25148:48;25213:18;;9139:100:1::1;24895:342:15::0;9139:100:1::1;9270:10;9250:31;::::0;;;:19:::1;:31;::::0;;;;:47;;9285:12;;9250:31;:47:::1;::::0;9285:12;;9250:47:::1;:::i;:::-;::::0;;;-1:-1:-1;9313:9:1::1;::::0;-1:-1:-1;9308:94:1::1;9332:12;9328:1;:16;9308:94;;;9366:24;9372:10;9384:5;9388:1:::0;9384;:5:::1;:::i;9366:24::-;9346:3;::::0;::::1;:::i;:::-;;;9308:94;;;-1:-1:-1::0;;1701:1:13;2628:7;:22;-1:-1:-1;;8663:765:1:o;14907:101::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;14976:10:1::1;:24:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;14907:101::o;11506:621::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;11655:19:1::1;::::0;11610:30:::1;::::0;::::1;;::::0;;;:19:::1;:30;::::0;;;;;:41:::1;::::0;11643:8;;11610:41:::1;:::i;:::-;:64;;11602:105;;;::::0;-1:-1:-1;;;11602:105:1;;25855:2:15;11602:105:1::1;::::0;::::1;25837:21:15::0;25894:2;25874:18;;;25867:30;25933;25913:18;;;25906:58;25981:18;;11602:105:1::1;25653:352:15::0;11602:105:1::1;11730:7;:14:::0;11779:9:::1;::::0;11763:12:::1;11767:8:::0;11730:14;11763:12:::1;:::i;:::-;:25;;11755:56;;;::::0;-1:-1:-1;;;11755:56:1;;24750:2:15;11755:56:1::1;::::0;::::1;24732:21:15::0;24789:2;24769:18;;;24762:30;24828:20;24808:18;;;24801:48;24866:18;;11755:56:1::1;24548:342:15::0;11755:56:1::1;11842:8;;11830;:20;;11822:53;;;::::0;-1:-1:-1;;;11822:53:1;;26212:2:15;11822:53:1::1;::::0;::::1;26194:21:15::0;26251:2;26231:18;;;26224:30;26290:22;26270:18;;;26263:50;26330:18;;11822:53:1::1;26010:344:15::0;11822:53:1::1;11942:8;11930;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;11961:30:1::1;::::0;::::1;;::::0;;;:19:::1;:30;::::0;;;;:42;;11995:8;;11961:30;:42:::1;::::0;11995:8;;11961:42:::1;:::i;:::-;::::0;;;-1:-1:-1;12019:9:1::1;::::0;-1:-1:-1;12014:87:1::1;12038:8;12034:1;:12;12014:87;;;12068:21;12074:9:::0;12085:3;::::1;::::0;::::1;:::i;:::-;;;12068:5;:21::i;:::-;12048:3;::::0;::::1;:::i;:::-;;;12014:87;;;-1:-1:-1::0;;;;11506:621:1:o;13690:90::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;13755:5:1::1;:17:::0;13690:90::o;6193:874::-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;21951:2:15;2317:63:13;;;21933:21:15;21990:2;21970:18;;;21963:30;22029:33;22009:18;;;22002:61;22080:18;;2317:63:13;21749:355:15;2317:63:13;1744:1;2455:7;:18;6280:10:1::1;::::0;::::1;::::0;::::1;;;6279:11;:31:::0;::::1;;;-1:-1:-1::0;6294:16:1::1;::::0;;;::::1;;;6279:31;6271:79;;;::::0;-1:-1:-1;;;6271:79:1;;26561:2:15;6271:79:1::1;::::0;::::1;26543:21:15::0;26600:2;26580:18;;;26573:30;26639:34;26619:18;;;26612:62;26710:5;26690:18;;;26683:33;26733:19;;6271:79:1::1;26359:399:15::0;6271:79:1::1;6387:20;;6369:15;:38;6361:71;;;::::0;-1:-1:-1;;;6361:71:1;;22651:2:15;6361:71:1::1;::::0;::::1;22633:21:15::0;22690:2;22670:18;;;22663:30;22729:22;22709:18;;;22702:50;22769:18;;6361:71:1::1;22449:344:15::0;6361:71:1::1;6469:18;;6451:15;:36;6443:63;;;::::0;-1:-1:-1;;;6443:63:1;;23000:2:15;6443:63:1::1;::::0;::::1;22982:21:15::0;23039:2;23019:18;;;23012:30;23078:16;23058:18;;;23051:44;23112:18;;6443:63:1::1;22798:338:15::0;6443:63:1::1;6529:7;:14:::0;6562:16;;;;;:44:::1;;;6598:8;;6582:12;:24;;6562:44;6554:77;;;::::0;-1:-1:-1;;;6554:77:1;;24271:2:15;6554:77:1::1;::::0;::::1;24253:21:15::0;24310:2;24290:18;;;24283:30;24349:22;24329:18;;;24322:50;24389:18;;6554:77:1::1;24069:344:15::0;6554:77:1::1;6685:8;;6673:9;;:20;;;;:::i;:::-;6651:16;6655:12:::0;6651:1;:16:::1;:::i;:::-;6650:44;;6642:75;;;::::0;-1:-1:-1;;;6642:75:1;;24750:2:15;6642:75:1::1;::::0;::::1;24732:21:15::0;24789:2;24769:18;;;24762:30;24828:20;24808:18;;;24801:48;24866:18;;6642:75:1::1;24548:342:15::0;6642:75:1::1;6757:12;6749:5;;:20;;;;:::i;:::-;6736:9;:33;;6728:60;;;::::0;-1:-1:-1;;;6728:60:1;;23576:2:15;6728:60:1::1;::::0;::::1;23558:21:15::0;23615:2;23595:18;;;23588:30;23654:16;23634:18;;;23627:44;23688:18;;6728:60:1::1;23374:338:15::0;6728:60:1::1;6847:18;::::0;6817:10:::1;6807:21;::::0;;;:9:::1;:21;::::0;;;;;:36:::1;::::0;6831:12;;6807:36:::1;:::i;:::-;:58;;6799:89;;;::::0;-1:-1:-1;;;6799:89:1;;25097:2:15;6799:89:1::1;::::0;::::1;25079:21:15::0;25136:2;25116:18;;;25109:30;25175:20;25155:18;;;25148:48;25213:18;;6799:89:1::1;24895:342:15::0;6799:89:1::1;6909:10;6899:21;::::0;;;:9:::1;:21;::::0;;;;:37;;6924:12;;6899:21;:37:::1;::::0;6924:12;;6899:37:::1;:::i;:::-;::::0;;;-1:-1:-1;6952:9:1::1;::::0;-1:-1:-1;6947:94:1::1;6971:12;6967:1;:16;6947:94;;;7005:24;7011:10;7023:5;7027:1:::0;7023;:5:::1;:::i;7005:24::-;6985:3;::::0;::::1;:::i;:::-;;;6947:94;;;-1:-1:-1::0;;1701:1:13;2628:7;:22;-1:-1:-1;6193:874:1:o;15149:137::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;15236:19:1::1;:42:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;15149:137::o;2197:104:5:-;2253:13;2286:7;2279:14;;;;;:::i;10490:914:1:-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;10613:35:1;;::::1;10605:99;;;::::0;-1:-1:-1;;;10605:99:1;;26965:2:15;10605:99:1::1;::::0;::::1;26947:21:15::0;27004:2;26984:18;;;26977:30;27043:34;27023:18;;;27016:62;27114:21;27094:18;;;27087:49;27153:19;;10605:99:1::1;26763:415:15::0;10605:99:1::1;10763:7;:14:::0;10715:21:::1;::::0;;10788:101:::1;10808:19:::0;;::::1;10788:101;;;10866:8;;10875:1;10866:11;;;;;;;:::i;:::-;;;;;;;10849:28;;;;;:::i;:::-;::::0;-1:-1:-1;10829:3:1::1;::::0;::::1;:::i;:::-;;;10788:101;;;-1:-1:-1::0;10928:9:1::1;::::0;10907:17:::1;10911:13:::0;10907:1;:17:::1;:::i;:::-;:30;;10899:61;;;::::0;-1:-1:-1;;;10899:61:1;;24750:2:15;10899:61:1::1;::::0;::::1;24732:21:15::0;24789:2;24769:18;;;24762:30;24828:20;24808:18;;;24801:48;24866:18;;10899:61:1::1;24548:342:15::0;10899:61:1::1;10996:8;;10979:13;:25;;10971:58;;;::::0;-1:-1:-1;;;10971:58:1;;26212:2:15;10971:58:1::1;::::0;::::1;26194:21:15::0;26251:2;26231:18;;;26224:30;26290:22;26270:18;;;26263:50;26330:18;;10971:58:1::1;26010:344:15::0;10971:58:1::1;11096:13;11084:8;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;11120:20:1::1;::::0;-1:-1:-1;11120:20:1;;-1:-1:-1;11151:227:1::1;11171:20:::0;;::::1;11151:227;;;11240:8;;11249:1;11240:11;;;;;;;:::i;:::-;;;;;;;11213:9;:23;11223:9;;11233:1;11223:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;11213:23;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;11271:9:1::1;::::0;-1:-1:-1;11266:101:1::1;11290:8;;11299:1;11290:11;;;;;;;:::i;:::-;;;;;;;11286:1;:15;11266:101;;;11327:24;11333:9;;11343:1;11333:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;11347:3:::0;::::1;::::0;::::1;:::i;:::-;;;11327:5;:24::i;:::-;11303:3;::::0;::::1;:::i;:::-;;;11266:101;;;-1:-1:-1::0;11193:3:1::1;::::0;::::1;:::i;:::-;;;11151:227;;;-1:-1:-1::0;;;;;;;10490:914:1:o;17524:121::-;17571:7;17487:21;17382:14;;17598:39;;;;:::i;763:95:5:-;807:16;843:7;836:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;763:95;:::o;3045:327::-;3180:24;;;719:10:2;3180:24:5;;3172:62;;;;-1:-1:-1;;;3172:62:5;;27385:2:15;3172:62:5;;;27367:21:15;27424:2;27404:18;;;27397:30;27463:27;27443:18;;;27436:55;27508:18;;3172:62:5;27183:349:15;3172:62:5;719:10:2;3247:32:5;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;3316:48;;586:41:15;;;3247:42:5;;719:10:2;3316:48:5;;559:18:15;3316:48:5;;;;;;;3045:327;;:::o;15674:116:1:-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;15751:18:1::1;:31:::0;15674:116::o;14600:187::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;14692:9:1::1;;14678:10;:23;;14670:65;;;::::0;-1:-1:-1;;;14670:65:1;;27739:2:15;14670:65:1::1;::::0;::::1;27721:21:15::0;27778:2;27758:18;;;27751:30;27817:31;27797:18;;;27790:59;27866:18;;14670:65:1::1;27537:353:15::0;14670:65:1::1;14769:10;14757:9;;:22;;;;:::i;:::-;14746:8;:33:::0;-1:-1:-1;14600:187:1:o;4179:365:5:-;4368:41;719:10:2;4401:7:5;4368:18;:41::i;:::-;4346:140;;;;-1:-1:-1;;;4346:140:5;;18023:2:15;4346:140:5;;;18005:21:15;18062:2;18042:18;;;18035:30;18101:34;18081:18;;;18074:62;18172:19;18152:18;;;18145:47;18209:19;;4346:140:5;17821:413:15;4346:140:5;4497:39;4511:4;4517:2;4521:7;4530:5;4497:13;:39::i;15798:201:1:-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;15908:38:1::1;15930:15;15908:21;:38::i;:::-;15957:34;15977:13;15957:19;:34::i;3401:142::-:0;3510:25;;;3465:7;3510:25;;;:19;:25;;;;;;;;;3492:9;:15;;;;;;:43;;3510:25;3492:43;:::i;9519:852::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;9633:35:1;;::::1;9625:99;;;::::0;-1:-1:-1;;;9625:99:1;;26965:2:15;9625:99:1::1;::::0;::::1;26947:21:15::0;27004:2;26984:18;;;26977:30;27043:34;27023:18;;;27016:62;27114:21;27094:18;;;27087:49;27153:19;;9625:99:1::1;26763:415:15::0;9625:99:1::1;9783:7;:14:::0;9735:21:::1;::::0;;9808:101:::1;9828:19:::0;;::::1;9808:101;;;9886:8;;9895:1;9886:11;;;;;;;:::i;:::-;;;;;;;9869:28;;;;;:::i;:::-;::::0;-1:-1:-1;9849:3:1::1;::::0;::::1;:::i;:::-;;;9808:101;;;-1:-1:-1::0;9948:9:1::1;::::0;9927:17:::1;9931:13:::0;9927:1;:17:::1;:::i;:::-;:30;;9919:61;;;::::0;-1:-1:-1;;;9919:61:1;;24750:2:15;9919:61:1::1;::::0;::::1;24732:21:15::0;24789:2;24769:18;;;24762:30;24828:20;24808:18;;;24801:48;24866:18;;9919:61:1::1;24548:342:15::0;9919:61:1::1;10016:8;;9999:13;:25;;9991:58;;;::::0;-1:-1:-1;;;9991:58:1;;26212:2:15;9991:58:1::1;::::0;::::1;26194:21:15::0;26251:2;26231:18;;;26224:30;26290:22;26270:18;;;26263:50;26330:18;;9991:58:1::1;26010:344:15::0;9991:58:1::1;10116:13;10104:8;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;10140:20:1::1;::::0;-1:-1:-1;10140:20:1;;-1:-1:-1;10171:174:1::1;10191:20:::0;;::::1;10171:174;;;10238:9;10233:101;10257:8;;10266:1;10257:11;;;;;;;:::i;:::-;;;;;;;10253:1;:15;10233:101;;;10294:24;10300:9;;10310:1;10300:12;;;;;;;:::i;10294:24::-;10270:3;::::0;::::1;:::i;:::-;;;10233:101;;;-1:-1:-1::0;10213:3:1::1;::::0;::::1;:::i;:::-;;;10171:174;;13892:96:::0;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;13960:8:1::1;:20:::0;13892:96::o;12965:339::-;13038:13;13072:16;13080:7;13072;:16::i;:::-;13064:62;;;;-1:-1:-1;;;13064:62:1;;28097:2:15;13064:62:1;;;28079:21:15;28136:2;28116:18;;;28109:30;28175:34;28155:18;;;28148:62;28246:3;28226:18;;;28219:31;28267:19;;13064:62:1;27895:397:15;13064:62:1;13137:28;13168:10;:8;:10::i;:::-;13137:41;;13227:1;13202:14;13196:28;:32;:100;;;;;;;;;;;;;;;;;13255:14;13271:18;:7;:16;:18::i;:::-;13238:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13196:100;13189:107;12965:339;-1:-1:-1;;;12965:339:1:o;14130:136::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;14218:18:1::1;:40:::0;14130:136::o;18109:401::-;18321:20;;18365:28;;;;;18321:20;1797:55:15;;;18365:28:1;;;1779:74:15;18198:4:1;;18321:20;;;18357:49;;;;18321:20;;18365:21;;1752:18:15;;18365:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18357:49;;;18353:93;;;18430:4;18423:11;;;;;18353:93;3551:25:5;;;;3522:4;3551:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;18463:39:1;18456:46;18109:401;-1:-1:-1;;;;18109:401:1:o;1911:198:12:-;1101:6;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;1999:22:::1;::::0;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:12;;29258:2:15;1991:73:12::1;::::0;::::1;29240:21:15::0;29297:2;29277:18;;;29270:30;29336:34;29316:18;;;29309:62;29407:8;29387:18;;;29380:36;29433:19;;1991:73:12::1;29056:402:15::0;1991:73:12::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;12301:220:1:-;12407:9;12402:112;12426:9;:16;12422:1;:20;12402:112;;;12464:38;12477:5;12484:3;12489:9;12499:1;12489:12;;;;;;;;:::i;:::-;;;;;;;12464;:38::i;:::-;12444:3;;;;:::i;:::-;;;;12402:112;;15016:125;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;15097:16:1::1;:36:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;15016:125::o;13996:126::-;1101:6:12;;1241:23;1101:6;719:10:2;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;17662:2:15;1233:68:12;;;17644:21:15;;;17681:18;;;17674:30;17740:34;17720:18;;;17713:62;17792:18;;1233:68:12;17460:356:15;1233:68:12;14079:19:1::1;:35:::0;13996:126::o;866:355:5:-;1013:4;1055:40;;;1070:25;1055:40;;:105;;-1:-1:-1;1112:48:5;;;1127:33;1112:48;1055:105;:158;;;-1:-1:-1;952:25:3;937:40;;;;1177:36:5;829:155:3;4912::5;5011:7;:14;4977:4;;5001:24;;:58;;;;;5057:1;5029:30;;:7;5037;5029:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;:30;;4994:65;4912:155;-1:-1:-1;;4912:155:5:o;7240:175::-;7315:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;7369;7315;7369:15;:24::i;:::-;7360:47;;;;;;;;;;;;7240:175;;:::o;5075:453::-;5204:4;5248:16;5256:7;5248;:16::i;:::-;5226:110;;;;-1:-1:-1;;;5226:110:5;;29665:2:15;5226:110:5;;;29647:21:15;29704:2;29684:18;;;29677:30;29743:34;29723:18;;;29716:62;29814:14;29794:18;;;29787:42;29846:19;;5226:110:5;29463:408:15;5226:110:5;5347:13;5363:24;5379:7;5363:15;:24::i;:::-;5347:40;;5417:5;5406:16;;:7;:16;;;:64;;;;5463:7;5439:31;;:20;5451:7;5439:11;:20::i;:::-;:31;;;5406:64;:113;;;;5487:32;5504:5;5511:7;5487:16;:32::i;6678:554::-;6852:4;6824:32;;:24;6840:7;6824:15;:24::i;:::-;:32;;;6802:123;;;;-1:-1:-1;;;6802:123:5;;30078:2:15;6802:123:5;;;30060:21:15;30117:2;30097:18;;;30090:30;30156:34;30136:18;;;30129:62;30227:11;30207:18;;;30200:39;30256:19;;6802:123:5;29876:405:15;6802:123:5;6944:16;;;6936:65;;;;-1:-1:-1;;;6936:65:5;;30488:2:15;6936:65:5;;;30470:21:15;30527:2;30507:18;;;30500:30;30566:34;30546:18;;;30539:62;30637:6;30617:18;;;30610:34;30661:19;;6936:65:5;30286:400:15;6936:65:5;7118:29;7135:1;7139:7;7118:8;:29::i;:::-;7177:2;7158:7;7166;7158:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;;;;;;;7197:27;;7216:7;;7197:27;;;;;;;;;;7158:16;7197:27;6678:554;;;:::o;4877:248:1:-;4978:7;4999:9;5010;5021:7;5032:26;5047:10;5032:14;:26::i;:::-;5076:41;;;;;;;;;;;;30918:25:15;;;30991:4;30979:17;;30959:18;;;30952:45;;;;31013:18;;;31006:34;;;31056:18;;;31049:34;;;4998:60:1;;-1:-1:-1;4998:60:1;;-1:-1:-1;4998:60:1;-1:-1:-1;5076:41:1;;30890:19:15;;5076:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5076:41:1;;;;;;4877:248;-1:-1:-1;;;;;;;4877:248:1:o;5466:168::-;5552:7;5606;5615:9;5589:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5579:47;;;;;;5572:54;;5466:168;;;;:::o;5642:153::-;5720:4;5744:43;5763:5;5770:10;;5782:4;5744:18;:43::i;328:703:14:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:14;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:14;;-1:-1:-1;773:2:14;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:14;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:14;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:14;981:2;972:11;;:::i;:::-;;;844:150;;12139:154:1;12220:7;:16;;;;;;;-1:-1:-1;12220:16:1;;;;;;;;;;;;;;;;;;12252:33;;12277:7;;-1:-1:-1;12252:33:1;;-1:-1:-1;;12252:33:1;12139:154;;:::o;2263:187:12:-;2355:6;;;;2371:17;;;;;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;4552:352:5:-;4709:28;4719:4;4725:2;4729:7;4709:9;:28::i;:::-;4770:48;4793:4;4799:2;4803:7;4812:5;4770:22;:48::i;:::-;4748:148;;;;-1:-1:-1;;;4748:148:5;;31727:2:15;4748:148:5;;;31709:21:15;31766:2;31746:18;;;31739:30;31805:34;31785:18;;;31778:62;31876:20;31856:18;;;31849:48;31914:19;;4748:148:5;31525:414:15;3040:99:1;3091:13;3124:7;3117:14;;;;;:::i;5137:321::-;5201:9;5212;5223:7;5251:3;:10;5265:2;5251:16;5243:53;;;;-1:-1:-1;;;5243:53:1;;32146:2:15;5243:53:1;;;32128:21:15;32185:2;32165:18;;;32158:30;32224:26;32204:18;;;32197:54;32268:18;;5243:53:1;31944:348:15;5243:53:1;-1:-1:-1;;;5351:2:1;5342:12;;5336:19;5389:2;5380:12;;5374:19;5435:2;5426:12;;;5420:19;5336;;5417:1;5412:28;;;;;5137:321::o;862:184:11:-;983:4;1035;1006:25;1019:5;1026:4;1006:12;:25::i;:::-;:33;;862:184;-1:-1:-1;;;;862:184:11:o;7423:980:5:-;7578:4;7599:13;;;1087:20:0;1133:8;7595:801:5;;7652:175;;;;;:36;;;;;;:175;;719:10:2;;7746:4:5;;7773:7;;7803:5;;7652:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7652:175:5;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;7631:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8010:13:5;;8006:320;;8053:108;;-1:-1:-1;;;8053:108:5;;31727:2:15;8053:108:5;;;31709:21:15;31766:2;31746:18;;;31739:30;31805:34;31785:18;;;31778:62;31876:20;31856:18;;;31849:48;31914:19;;8053:108:5;31525:414:15;8006:320:5;8276:6;8270:13;8261:6;8257:2;8253:15;8246:38;7631:710;7891:51;;7901:41;7891:51;;-1:-1:-1;7884:58:5;;7595:801;-1:-1:-1;8380:4:5;7423:980;;;;;;:::o;1398:662:11:-;1481:7;1523:4;1481:7;1537:488;1561:5;:12;1557:1;:16;1537:488;;;1594:20;1617:5;1623:1;1617:8;;;;;;;;:::i;:::-;;;;;;;1594:31;;1659:12;1643;:28;1639:376;;2134:13;2182:15;;;2217:4;2210:15;;;2263:4;2247:21;;1769:57;;1639:376;;;2134:13;2182:15;;;2217:4;2210:15;;;2263:4;2247:21;;1943:57;;1639:376;-1:-1:-1;1575:3:11;;;;:::i;:::-;;;;1537:488;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:15;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:15;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:15:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:15;;1448:180;-1:-1:-1;1448:180:15:o;1864:154::-;1950:42;1943:5;1939:54;1932:5;1929:65;1919:93;;2008:1;2005;1998:12;2023:315;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:15:o;2525:456::-;2602:6;2610;2618;2671:2;2659:9;2650:7;2646:23;2642:32;2639:52;;;2687:1;2684;2677:12;2639:52;2726:9;2713:23;2745:31;2770:5;2745:31;:::i;:::-;2795:5;-1:-1:-1;2852:2:15;2837:18;;2824:32;2865:33;2824:32;2865:33;:::i;:::-;2525:456;;2917:7;;-1:-1:-1;;;2971:2:15;2956:18;;;;2943:32;;2525:456::o;3168:367::-;3231:8;3241:6;3295:3;3288:4;3280:6;3276:17;3272:27;3262:55;;3313:1;3310;3303:12;3262:55;-1:-1:-1;3336:20:15;;3379:18;3368:30;;3365:50;;;3411:1;3408;3401:12;3365:50;3448:4;3440:6;3436:17;3424:29;;3508:3;3501:4;3491:6;3488:1;3484:14;3476:6;3472:27;3468:38;3465:47;3462:67;;;3525:1;3522;3515:12;3462:67;3168:367;;;;;:::o;3540:773::-;3662:6;3670;3678;3686;3739:2;3727:9;3718:7;3714:23;3710:32;3707:52;;;3755:1;3752;3745:12;3707:52;3795:9;3782:23;3824:18;3865:2;3857:6;3854:14;3851:34;;;3881:1;3878;3871:12;3851:34;3920:70;3982:7;3973:6;3962:9;3958:22;3920:70;:::i;:::-;4009:8;;-1:-1:-1;3894:96:15;-1:-1:-1;4097:2:15;4082:18;;4069:32;;-1:-1:-1;4113:16:15;;;4110:36;;;4142:1;4139;4132:12;4110:36;;4181:72;4245:7;4234:8;4223:9;4219:24;4181:72;:::i;:::-;3540:773;;;;-1:-1:-1;4272:8:15;-1:-1:-1;;;;3540:773:15:o;4318:160::-;4383:20;;4439:13;;4432:21;4422:32;;4412:60;;4468:1;4465;4458:12;4412:60;4318:160;;;:::o;4483:180::-;4539:6;4592:2;4580:9;4571:7;4567:23;4563:32;4560:52;;;4608:1;4605;4598:12;4560:52;4631:26;4647:9;4631:26;:::i;4668:184::-;4720:77;4717:1;4710:88;4817:4;4814:1;4807:15;4841:4;4838:1;4831:15;4857:334;4928:2;4922:9;4984:2;4974:13;;4989:66;4970:86;4958:99;;5087:18;5072:34;;5108:22;;;5069:62;5066:88;;;5134:18;;:::i;:::-;5170:2;5163:22;4857:334;;-1:-1:-1;4857:334:15:o;5196:589::-;5238:5;5291:3;5284:4;5276:6;5272:17;5268:27;5258:55;;5309:1;5306;5299:12;5258:55;5345:6;5332:20;5371:18;5367:2;5364:26;5361:52;;;5393:18;;:::i;:::-;5437:114;5545:4;5476:66;5469:4;5465:2;5461:13;5457:86;5453:97;5437:114;:::i;:::-;5576:2;5567:7;5560:19;5622:3;5615:4;5610:2;5602:6;5598:15;5594:26;5591:35;5588:55;;;5639:1;5636;5629:12;5588:55;5704:2;5697:4;5689:6;5685:17;5678:4;5669:7;5665:18;5652:55;5752:1;5727:16;;;5745:4;5723:27;5716:38;;;;5731:7;5196:589;-1:-1:-1;;;5196:589:15:o;5790:455::-;5867:6;5875;5928:2;5916:9;5907:7;5903:23;5899:32;5896:52;;;5944:1;5941;5934:12;5896:52;5983:9;5970:23;6002:31;6027:5;6002:31;:::i;:::-;6052:5;-1:-1:-1;6108:2:15;6093:18;;6080:32;6135:18;6124:30;;6121:50;;;6167:1;6164;6157:12;6121:50;6190:49;6231:7;6222:6;6211:9;6207:22;6190:49;:::i;:::-;6180:59;;;5790:455;;;;;:::o;6250:321::-;6319:6;6372:2;6360:9;6351:7;6347:23;6343:32;6340:52;;;6388:1;6385;6378:12;6340:52;6428:9;6415:23;6461:18;6453:6;6450:30;6447:50;;;6493:1;6490;6483:12;6447:50;6516:49;6557:7;6548:6;6537:9;6533:22;6516:49;:::i;6576:661::-;6695:6;6703;6711;6719;6727;6735;6743;6751;6804:3;6792:9;6783:7;6779:23;6775:33;6772:53;;;6821:1;6818;6811:12;6772:53;6857:9;6844:23;6834:33;;6914:2;6903:9;6899:18;6886:32;6876:42;;6965:2;6954:9;6950:18;6937:32;6927:42;;7016:2;7005:9;7001:18;6988:32;6978:42;;7067:3;7056:9;7052:19;7039:33;7029:43;;7119:3;7108:9;7104:19;7091:33;7081:43;;7143:36;7174:3;7163:9;7159:19;7143:36;:::i;:::-;7133:46;;7226:3;7215:9;7211:19;7198:33;7188:43;;6576:661;;;;;;;;;;;:::o;7936:657::-;8041:6;8049;8057;8110:2;8098:9;8089:7;8085:23;8081:32;8078:52;;;8126:1;8123;8116:12;8078:52;8166:9;8153:23;8195:18;8236:2;8228:6;8225:14;8222:34;;;8252:1;8249;8242:12;8222:34;8275:49;8316:7;8307:6;8296:9;8292:22;8275:49;:::i;:::-;8265:59;;8377:2;8366:9;8362:18;8349:32;8333:48;;8406:2;8396:8;8393:16;8390:36;;;8422:1;8419;8412:12;8390:36;;8461:72;8525:7;8514:8;8503:9;8499:24;8461:72;:::i;:::-;7936:657;;8552:8;;-1:-1:-1;8435:98:15;;-1:-1:-1;;;;7936:657:15:o;8598:183::-;8658:4;8691:18;8683:6;8680:30;8677:56;;;8713:18;;:::i;:::-;-1:-1:-1;8758:1:15;8754:14;8770:4;8750:25;;8598:183::o;8786:1247::-;8906:6;8914;8922;8930;8983:3;8971:9;8962:7;8958:23;8954:33;8951:53;;;9000:1;8997;8990:12;8951:53;9036:9;9023:23;9013:33;;9065:2;9114;9103:9;9099:18;9086:32;9076:42;;9169:2;9158:9;9154:18;9141:32;9192:18;9233:2;9225:6;9222:14;9219:34;;;9249:1;9246;9239:12;9219:34;9287:6;9276:9;9272:22;9262:32;;9332:7;9325:4;9321:2;9317:13;9313:27;9303:55;;9354:1;9351;9344:12;9303:55;9390:2;9377:16;9413:60;9429:43;9469:2;9429:43;:::i;:::-;9413:60;:::i;:::-;9507:15;;;9589:1;9585:10;;;;9577:19;;9573:28;;;9538:12;;;;9613:19;;;9610:39;;;9645:1;9642;9635:12;9610:39;9669:11;;;;9689:142;9705:6;9700:3;9697:15;9689:142;;;9771:17;;9759:30;;9722:12;;;;9809;;;;9689:142;;;9850:5;-1:-1:-1;;;9908:2:15;9893:18;;9880:32;;-1:-1:-1;9924:16:15;;;9921:36;;;9953:1;9950;9943:12;9921:36;;;9976:51;10019:7;10008:8;9997:9;9993:24;9976:51;:::i;:::-;9966:61;;;8786:1247;;;;;;;:::o;10038:247::-;10097:6;10150:2;10138:9;10129:7;10125:23;10121:32;10118:52;;;10166:1;10163;10156:12;10118:52;10205:9;10192:23;10224:31;10249:5;10224:31;:::i;10475:454::-;10570:6;10578;10586;10594;10602;10655:3;10643:9;10634:7;10630:23;10626:33;10623:53;;;10672:1;10669;10662:12;10623:53;-1:-1:-1;;10695:23:15;;;10765:2;10750:18;;10737:32;;-1:-1:-1;10816:2:15;10801:18;;10788:32;;10867:2;10852:18;;10839:32;;-1:-1:-1;10918:3:15;10903:19;10890:33;;-1:-1:-1;10475:454:15;-1:-1:-1;10475:454:15:o;10934:632::-;11105:2;11157:21;;;11227:13;;11130:18;;;11249:22;;;11076:4;;11105:2;11328:15;;;;11302:2;11287:18;;;11076:4;11371:169;11385:6;11382:1;11379:13;11371:169;;;11446:13;;11434:26;;11515:15;;;;11480:12;;;;11407:1;11400:9;11371:169;;;-1:-1:-1;11557:3:15;;10934:632;-1:-1:-1;;;;;;10934:632:15:o;11571:388::-;11648:6;11656;11709:2;11697:9;11688:7;11684:23;11680:32;11677:52;;;11725:1;11722;11715:12;11677:52;11761:9;11748:23;11738:33;;11822:2;11811:9;11807:18;11794:32;11849:18;11841:6;11838:30;11835:50;;;11881:1;11878;11871:12;11964:315;12032:6;12040;12093:2;12081:9;12072:7;12068:23;12064:32;12061:52;;;12109:1;12106;12099:12;12061:52;12145:9;12132:23;12122:33;;12205:2;12194:9;12190:18;12177:32;12218:31;12243:5;12218:31;:::i;:::-;12268:5;12258:15;;;11964:315;;;;;:::o;12284:681::-;12455:2;12507:21;;;12577:13;;12480:18;;;12599:22;;;12426:4;;12455:2;12678:15;;;;12652:2;12637:18;;;12426:4;12721:218;12735:6;12732:1;12729:13;12721:218;;;12800:13;;12815:42;12796:62;12784:75;;12914:15;;;;12879:12;;;;12757:1;12750:9;12721:218;;12970:315;13035:6;13043;13096:2;13084:9;13075:7;13071:23;13067:32;13064:52;;;13112:1;13109;13102:12;13064:52;13151:9;13138:23;13170:31;13195:5;13170:31;:::i;:::-;13220:5;-1:-1:-1;13244:35:15;13275:2;13260:18;;13244:35;:::i;:::-;13234:45;;12970:315;;;;;:::o;13290:665::-;13385:6;13393;13401;13409;13462:3;13450:9;13441:7;13437:23;13433:33;13430:53;;;13479:1;13476;13469:12;13430:53;13518:9;13505:23;13537:31;13562:5;13537:31;:::i;:::-;13587:5;-1:-1:-1;13644:2:15;13629:18;;13616:32;13657:33;13616:32;13657:33;:::i;:::-;13709:7;-1:-1:-1;13763:2:15;13748:18;;13735:32;;-1:-1:-1;13818:2:15;13803:18;;13790:32;13845:18;13834:30;;13831:50;;;13877:1;13874;13867:12;13831:50;13900:49;13941:7;13932:6;13921:9;13917:22;13900:49;:::i;13960:248::-;14028:6;14036;14089:2;14077:9;14068:7;14064:23;14060:32;14057:52;;;14105:1;14102;14095:12;14057:52;-1:-1:-1;;14128:23:15;;;14198:2;14183:18;;;14170:32;;-1:-1:-1;13960:248:15:o;14213:388::-;14281:6;14289;14342:2;14330:9;14321:7;14317:23;14313:32;14310:52;;;14358:1;14355;14348:12;14310:52;14397:9;14384:23;14416:31;14441:5;14416:31;:::i;:::-;14466:5;-1:-1:-1;14523:2:15;14508:18;;14495:32;14536:33;14495:32;14536:33;:::i;14606:1167::-;14708:6;14716;14724;14777:2;14765:9;14756:7;14752:23;14748:32;14745:52;;;14793:1;14790;14783:12;14745:52;14832:9;14819:23;14851:31;14876:5;14851:31;:::i;:::-;14901:5;-1:-1:-1;14925:2:15;14964:18;;;14951:32;14992:33;14951:32;14992:33;:::i;:::-;15044:7;-1:-1:-1;15102:2:15;15087:18;;15074:32;15129:18;15118:30;;15115:50;;;15161:1;15158;15151:12;15115:50;15184:22;;15237:4;15229:13;;15225:27;-1:-1:-1;15215:55:15;;15266:1;15263;15256:12;15215:55;15302:2;15289:16;15325:60;15341:43;15381:2;15341:43;:::i;15325:60::-;15419:15;;;15501:1;15497:10;;;;15489:19;;15485:28;;;15450:12;;;;15525:19;;;15522:39;;;15557:1;15554;15547:12;15522:39;15581:11;;;;15601:142;15617:6;15612:3;15609:15;15601:142;;;15683:17;;15671:30;;15634:12;;;;15721;;;;15601:142;;;15762:5;15752:15;;;;;;;14606:1167;;;;;:::o;15778:437::-;15857:1;15853:12;;;;15900;;;15921:61;;15975:4;15967:6;15963:17;15953:27;;15921:61;16028:2;16020:6;16017:14;15997:18;15994:38;15991:218;;;16065:77;16062:1;16055:88;16166:4;16163:1;16156:15;16194:4;16191:1;16184:15;15991:218;;15778:437;;;:::o;18590:184::-;18642:77;18639:1;18632:88;18739:4;18736:1;18729:15;18763:4;18760:1;18753:15;18779:184;18831:77;18828:1;18821:88;18928:4;18925:1;18918:15;18952:4;18949:1;18942:15;18968:195;19007:3;19038:66;19031:5;19028:77;19025:103;;;19108:18;;:::i;:::-;-1:-1:-1;19155:1:15;19144:13;;18968:195::o;19796:128::-;19836:3;19867:1;19863:6;19860:1;19857:13;19854:39;;;19873:18;;:::i;:::-;-1:-1:-1;19909:9:15;;19796:128::o;23141:228::-;23181:7;23307:1;23239:66;23235:74;23232:1;23229:81;23224:1;23217:9;23210:17;23206:105;23203:131;;;23314:18;;:::i;:::-;-1:-1:-1;23354:9:15;;23141:228::o;24418:125::-;24458:4;24486:1;24483;24480:8;24477:34;;;24491:18;;:::i;:::-;-1:-1:-1;24528:9:15;;24418:125::o;28297:470::-;28476:3;28514:6;28508:13;28530:53;28576:6;28571:3;28564:4;28556:6;28552:17;28530:53;:::i;:::-;28646:13;;28605:16;;;;28668:57;28646:13;28605:16;28702:4;28690:17;;28668:57;:::i;:::-;28741:20;;28297:470;-1:-1:-1;;;;28297:470:15:o;28772:279::-;28870:6;28923:2;28911:9;28902:7;28898:23;28894:32;28891:52;;;28939:1;28936;28929:12;28891:52;28971:9;28965:16;28990:31;29015:5;28990:31;:::i;31094:184::-;31146:77;31143:1;31136:88;31243:4;31240:1;31233:15;31267:4;31264:1;31257:15;31283:120;31323:1;31349;31339:35;;31354:18;;:::i;:::-;-1:-1:-1;31388:9:15;;31283:120::o;31408:112::-;31440:1;31466;31456:35;;31471:18;;:::i;:::-;-1:-1:-1;31505:9:15;;31408:112::o;32297:512::-;32491:4;32520:42;32601:2;32593:6;32589:15;32578:9;32571:34;32653:2;32645:6;32641:15;32636:2;32625:9;32621:18;32614:43;;32693:6;32688:2;32677:9;32673:18;32666:34;32736:3;32731:2;32720:9;32716:18;32709:31;32757:46;32798:3;32787:9;32783:19;32775:6;32757:46;:::i;:::-;32749:54;32297:512;-1:-1:-1;;;;;;32297:512:15:o;32814:249::-;32883:6;32936:2;32924:9;32915:7;32911:23;32907:32;32904:52;;;32952:1;32949;32942:12;32904:52;32984:9;32978:16;33003:30;33027:5;33003:30;:::i

Swarm Source

ipfs://c2158246a318927a7f51ec3b42354ddc9a56b37820b9854fca80d804043d3305
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.