ETH Price: $3,273.25 (-1.31%)

Contract

0xf89cfa360a2b883D7325D94eEeA89C2B7079c1a3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...205216732024-08-13 19:03:59131 days ago1723575839IN
Nifty Sax Spheres: NSS Token
0 ETH0.000132392.83858545
Set Approval For...202017702024-06-30 3:19:11175 days ago1719717551IN
Nifty Sax Spheres: NSS Token
0 ETH0.00007141.52851462
Set Approval For...194452682024-03-16 5:03:23281 days ago1710565403IN
Nifty Sax Spheres: NSS Token
0 ETH0.0013784729.55508882
Set Approval For...184255872023-10-25 6:51:59424 days ago1698216719IN
Nifty Sax Spheres: NSS Token
0 ETH0.0006507713.95283834
Safe Transfer Fr...184255532023-10-25 6:45:11424 days ago1698216311IN
Nifty Sax Spheres: NSS Token
0 ETH0.0024883228.32666192
Set Approval For...180142502023-08-28 16:11:47482 days ago1693239107IN
Nifty Sax Spheres: NSS Token
0 ETH0.0023428250.23108615
Set Approval For...169772502023-04-04 18:20:35628 days ago1680632435IN
Nifty Sax Spheres: NSS Token
0 ETH0.0006652126.90013379
Set Approval For...168792732023-03-21 23:28:47641 days ago1679441327IN
Nifty Sax Spheres: NSS Token
0 ETH0.0006749914.47207943
Set Approval For...167037652023-02-25 7:16:47666 days ago1677309407IN
Nifty Sax Spheres: NSS Token
0 ETH0.0009423320.20405239
Transfer From167037252023-02-25 7:08:47666 days ago1677308927IN
Nifty Sax Spheres: NSS Token
0 ETH0.0016701919.65971864
Set Approval For...166330882023-02-15 8:55:23676 days ago1676451323IN
Nifty Sax Spheres: NSS Token
0 ETH0.0010754423.05789234
Set Approval For...166324392023-02-15 6:44:47676 days ago1676443487IN
Nifty Sax Spheres: NSS Token
0 ETH0.0010753423.05572956
Set Approval For...166241212023-02-14 2:49:59677 days ago1676342999IN
Nifty Sax Spheres: NSS Token
0 ETH0.0007071715.16210045
Safe Transfer Fr...165670362023-02-06 3:23:47685 days ago1675653827IN
Nifty Sax Spheres: NSS Token
0 ETH0.0015602716.99497338
Safe Transfer Fr...165660892023-02-06 0:13:23685 days ago1675642403IN
Nifty Sax Spheres: NSS Token
0 ETH0.0017848620.05561733
Set Approval For...164899242023-01-26 8:54:35696 days ago1674723275IN
Nifty Sax Spheres: NSS Token
0 ETH0.0007921316.98370199
Safe Transfer Fr...164630282023-01-22 14:45:59700 days ago1674398759IN
Nifty Sax Spheres: NSS Token
0 ETH0.0012812914.5734071
Set Approval For...163736542023-01-10 3:15:47712 days ago1673320547IN
Nifty Sax Spheres: NSS Token
0 ETH0.000457218.42589062
Set Approval For...163415912023-01-05 15:49:47717 days ago1672933787IN
Nifty Sax Spheres: NSS Token
0 ETH0.001066222.85976316
Transfer From163415062023-01-05 15:32:47717 days ago1672932767IN
Nifty Sax Spheres: NSS Token
0 ETH0.0020928224.63456243
Set Approval For...162414482022-12-22 16:30:23731 days ago1671726623IN
Nifty Sax Spheres: NSS Token
0 ETH0.0007965617.07871102
Set Approval For...161857552022-12-14 21:55:11738 days ago1671054911IN
Nifty Sax Spheres: NSS Token
0 ETH0.0006576514.1003143
Safe Transfer Fr...160998232022-12-02 21:31:23751 days ago1670016683IN
Nifty Sax Spheres: NSS Token
0 ETH0.0010921512.45448833
Safe Transfer Fr...160836352022-11-30 15:16:23753 days ago1669821383IN
Nifty Sax Spheres: NSS Token
0 ETH0.0013184714.99631338
Safe Transfer Fr...160835762022-11-30 15:04:35753 days ago1669820675IN
Nifty Sax Spheres: NSS Token
0 ETH0.0013951715.38098127
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
132642432021-09-20 18:27:401189 days ago1632162460
Nifty Sax Spheres: NSS Token
9.79 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NiftySaxSpheres

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 15: spheres.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Burnable.sol";
import "./Ownable.sol";
import "./Counters.sol";

contract NiftySaxSpheres is ERC721, ERC721Enumerable, ERC721Burnable, Ownable {
    uint256 public constant STANDARD_PRICE = 30000000000000000; // 0.03 ETH
    uint256 public constant DISCOUNT_PRICE = 20000000000000000; // 0.02 ETH
    uint256 public MAX_SUPPLY = 385;
    uint8 public salePhase = 0; // 0 = inactive, 1 = mint-pass sale, 2 = public sale
    string public PROVENANCE = "94f2a98eb86261417f0b1c891c9bcf0b2720b8c67270b589262783051a6d8511";
    
    string private _baseURIextended;
    mapping(address => bool) private mintPassAddresses;
    mapping(address => uint256) private referrals;

    constructor() ERC721("Nifty Sax Spheres", "NSS") {
        // list of pre-sale mints
        _safeMint(0x274a434F95CfE49702df41022F2Fdb629267F3C8, totalSupply());
        _safeMint(0x37A25c28c01A1f935bF71B898657BE91f47e66e0, totalSupply());
        _safeMint(0xdecBB1759c9550A0D2a9e501626e39B3cDa2EAED, totalSupply());
        _safeMint(0xCC0960243d099BCaE96c0D1AEACDdA01434d2ebc, totalSupply());
        _safeMint(0x5b34f08E224E9218cD2c15109660Bcc4a01c5eEb, totalSupply());
        _safeMint(0x5bc49bAC20D2db1D3C051f1dF6F7b7E250Ac907B, totalSupply());
        _safeMint(0x79fF435184674986312275a031999D689be9d104, totalSupply());
        _safeMint(0xc8c759157121080f3aAB6D0d5c2fa8573c134262, totalSupply());
        _safeMint(0x48CD130949880D951C3846F653DdCbDd28a7A6f1, totalSupply());
        _safeMint(0x48CD130949880D951C3846F653DdCbDd28a7A6f1, totalSupply());

        
        // list of mint-pass mintPassAddresses
        mintPassAddresses[0x14D673b98fCeB1D50ce48341Ea11f32a5250D4C0] = true;
        mintPassAddresses[0xa2E67BfC520f8586f7f1170b1eb52741904697D5] = true;
        mintPassAddresses[0xFc5236d8C803A3ef420eCbA50A91c6354fc22137] = true;
        mintPassAddresses[0xdecBB1759c9550A0D2a9e501626e39B3cDa2EAED] = true;
        mintPassAddresses[0x11a22b262e505d355F975e1E48A365b5D4811Ae0] = true;
        mintPassAddresses[0xdB5dFa23a9b606a918Af7f2a710e69E25Af47251] = true;
        mintPassAddresses[0x0d3b60DE0FdF7Ac4c1400C3C7B412dc75B4B342D] = true;
        mintPassAddresses[0x0090DdE383865bC21a72639313975CDB67D2D612] = true;
        mintPassAddresses[0x74648Ba6f408a1dECfDe319CEf04f1B332949B38] = true;
        mintPassAddresses[0x55CF11743818B5f0B5440b6E85A003C604d1AF01] = true;
        mintPassAddresses[0xB95f01cb0c887Eae5ABD551bD63B642b9F5C4949] = true;
        mintPassAddresses[0x891Ae4Cd23EE4936A689F5Dd1D32d4cBE77a2dE4] = true;
        mintPassAddresses[0xa3991B76c7282db0652f45C7Ed080CF00fC3147A] = true;
        mintPassAddresses[0x92E8443Db866C722276B0aA93734770a2dE79CEB] = true;
        mintPassAddresses[0xff2450085510b5Eb86c7f9451d5FBc0cA5a793AA] = true;
        mintPassAddresses[0x11a9583750806c3f521254c8E930991cd6139B30] = true;
        mintPassAddresses[0x58F579b62f86d27b931Aa08C332368b880d118E4] = true;
        mintPassAddresses[0xF6f7048A2Ec27fdA605C2a1f61eba95465a78D87] = true;
    }
    
    function changeSalePhase(uint8 phase) public onlyOwner {
        salePhase = phase;
    }
    
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
    
    function reserveTokens(uint numberOfTokens) public onlyOwner {
        require((totalSupply() + numberOfTokens) <= MAX_SUPPLY, "Mint would exceed max supply of tokens");
        uint supply = totalSupply();
        uint i;
        for (i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }
    
    function claimFreeMint() public {
        require(referrals[msg.sender] > 4, "You don't have enough referrals yet");
        require(salePhase > 0, "Sale is not active at the moment");
        require((totalSupply() + 1) <= MAX_SUPPLY, "Mint would exceed max supply of tokens");
        referrals[msg.sender] -= 5;
        _safeMint(msg.sender, totalSupply());
    }
    
    function getReferrals() public view returns(uint256) {
        return referrals[msg.sender];
    }
    
    function mintSphere(uint numberOfTokens, address referrer) public payable {
        require(referrer != msg.sender, "Referrer cannot be the same as sender");
        mintSphere(numberOfTokens);
        referrals[referrer] += numberOfTokens;
    }
    
    function mintSphere(uint numberOfTokens) public payable {
        require(salePhase > 0, "Sale is not active at the moment");
        require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0");
        require((totalSupply() + numberOfTokens) <= MAX_SUPPLY, "Purchase would exceed max supply of tokens");
        require(calculateMintCost(numberOfTokens) == msg.value, "Sent ether value is incorrect");
        if (salePhase == 1) {
            require(mintPassAddresses[msg.sender] == true, "Address is not authorised for the mint-pass sale");
        }
        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply());
        }
    }
    
    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
    
    function calculateMintCost(uint numberOfTokens) internal pure returns(uint) {
        uint cost = 0;
        for (uint i = 0; i < numberOfTokens; i++) {
            if (i < 4) {
                cost += STANDARD_PRICE;
            } else {
                cost += DISCOUNT_PRICE;
            }
        }
        return cost;
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

File 2 of 15: Address.sol
// SPDX-License-Identifier: MIT

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

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: Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

File 5 of 15: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 6 of 15: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 7 of 15: ERC721Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

File 8 of 15: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 9 of 15: IERC165.sol
// SPDX-License-Identifier: MIT

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 10 of 15: IERC721.sol
// SPDX-License-Identifier: MIT

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 11 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

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 12 of 15: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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 13 of 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 14 of 15: Ownable.sol
// SPDX-License-Identifier: MIT

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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT

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":"DISCOUNT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STANDARD_PRICE","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"phase","type":"uint8"}],"name":"changeSalePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferrals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"mintSphere","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintSphere","outputs":[],"stateMutability":"payable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","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":"salePhase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","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":"","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":[],"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":"nonpayable","type":"function"}]

6080604052610181600b556000600c60006101000a81548160ff021916908360ff1602179055506040518060600160405280604081526020016200649860409139600d908051906020019062000057929190620015b5565b503480156200006557600080fd5b506040518060400160405280601181526020017f4e696674792053617820537068657265730000000000000000000000000000008152506040518060400160405280600381526020017f4e535300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ea929190620015b5565b50806001908051906020019062000103929190620015b5565b505050620001266200011a62000ad560201b60201c565b62000add60201b60201c565b6200015b73274a434f95cfe49702df41022f2fdb629267f3c86200014f62000ba360201b60201c565b62000bb060201b60201c565b620001907337a25c28c01a1f935bf71b898657be91f47e66e06200018462000ba360201b60201c565b62000bb060201b60201c565b620001c573decbb1759c9550a0d2a9e501626e39b3cda2eaed620001b962000ba360201b60201c565b62000bb060201b60201c565b620001fa73cc0960243d099bcae96c0d1aeacdda01434d2ebc620001ee62000ba360201b60201c565b62000bb060201b60201c565b6200022f735b34f08e224e9218cd2c15109660bcc4a01c5eeb6200022362000ba360201b60201c565b62000bb060201b60201c565b62000264735bc49bac20d2db1d3c051f1df6f7b7e250ac907b6200025862000ba360201b60201c565b62000bb060201b60201c565b620002997379ff435184674986312275a031999d689be9d1046200028d62000ba360201b60201c565b62000bb060201b60201c565b620002ce73c8c759157121080f3aab6d0d5c2fa8573c134262620002c262000ba360201b60201c565b62000bb060201b60201c565b620003037348cd130949880d951c3846f653ddcbdd28a7a6f1620002f762000ba360201b60201c565b62000bb060201b60201c565b620003387348cd130949880d951c3846f653ddcbdd28a7a6f16200032c62000ba360201b60201c565b62000bb060201b60201c565b6001600f60007314d673b98fceb1d50ce48341ea11f32a5250d4c073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073a2e67bfc520f8586f7f1170b1eb52741904697d573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073fc5236d8c803a3ef420ecba50a91c6354fc2213773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073decbb1759c9550a0d2a9e501626e39b3cda2eaed73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60007311a22b262e505d355f975e1e48a365b5d4811ae073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073db5dfa23a9b606a918af7f2a710e69e25af4725173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000730d3b60de0fdf7ac4c1400c3c7b412dc75b4b342d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60007290dde383865bc21a72639313975cdb67d2d61273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60007374648ba6f408a1decfde319cef04f1b332949b3873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60007355cf11743818b5f0b5440b6e85a003c604d1af0173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073b95f01cb0c887eae5abd551bd63b642b9f5c494973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073891ae4cd23ee4936a689f5dd1d32d4cbe77a2de473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073a3991b76c7282db0652f45c7ed080cf00fc3147a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60007392e8443db866c722276b0aa93734770a2de79ceb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073ff2450085510b5eb86c7f9451d5fbc0ca5a793aa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60007311a9583750806c3f521254c8e930991cd6139b3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60007358f579b62f86d27b931aa08c332368b880d118e473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073f6f7048a2ec27fda605c2a1f61eba95465a78d8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062001c00565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600880549050905090565b62000bd282826040518060200160405280600081525062000bd660201b60201c565b5050565b62000be8838362000c4460201b60201c565b62000bfd600084848462000e2a60201b60201c565b62000c3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c369062001801565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cae9062001867565b60405180910390fd5b62000cc88162000fe460201b60201c565b1562000d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d029062001823565b60405180910390fd5b62000d1f600083836200105060201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000d719190620018b6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600062000e588473ffffffffffffffffffffffffffffffffffffffff166200106d60201b62001b401760201c565b1562000fd7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000e8a62000ad560201b60201c565b8786866040518563ffffffff1660e01b815260040162000eae9493929190620017ad565b602060405180830381600087803b15801562000ec957600080fd5b505af192505050801562000efd57506040513d601f19601f8201168201806040525081019062000efa91906200167c565b60015b62000f86573d806000811462000f30576040519150601f19603f3d011682016040523d82523d6000602084013e62000f35565b606091505b5060008151141562000f7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f759062001801565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000fdc565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620010688383836200108060201b62001b531760201c565b505050565b600080823b905060008111915050919050565b62001098838383620011c760201b62001c671760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620010e557620010df81620011cc60201b60201c565b6200112d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146200112c576200112b83826200121560201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200117a5762001174816200139260201b60201c565b620011c2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620011c157620011c082826200146e60201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016200122f84620014fa60201b620011a21760201c565b6200123b919062001913565b905060006007600084815260200190815260200160002054905081811462001321576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050620013a8919062001913565b9050600060096000848152602001908152602001600020549050600060088381548110620013db57620013da62001ab1565b5b9060005260206000200154905080600883815481106200140057620013ff62001ab1565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062001452576200145162001a82565b5b6001900381819060005260206000200160009055905550505050565b60006200148683620014fa60201b620011a21760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200156e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620015659062001845565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b828054620015c390620019ee565b90600052602060002090601f016020900481019282620015e7576000855562001633565b82601f106200160257805160ff191683800117855562001633565b8280016001018555821562001633579182015b828111156200163257825182559160200191906001019062001615565b5b50905062001642919062001646565b5090565b5b808211156200166157600081600090555060010162001647565b5090565b600081519050620016768162001be6565b92915050565b60006020828403121562001695576200169462001ae0565b5b6000620016a58482850162001665565b91505092915050565b620016b9816200194e565b82525050565b6000620016cc8262001889565b620016d8818562001894565b9350620016ea818560208601620019b8565b620016f58162001ae5565b840191505092915050565b60006200170f603283620018a5565b91506200171c8262001af6565b604082019050919050565b600062001736601c83620018a5565b9150620017438262001b45565b602082019050919050565b60006200175d602a83620018a5565b91506200176a8262001b6e565b604082019050919050565b600062001784602083620018a5565b9150620017918262001bbd565b602082019050919050565b620017a781620019ae565b82525050565b6000608082019050620017c46000830187620016ae565b620017d36020830186620016ae565b620017e260408301856200179c565b8181036060830152620017f68184620016bf565b905095945050505050565b600060208201905081810360008301526200181c8162001700565b9050919050565b600060208201905081810360008301526200183e8162001727565b9050919050565b6000602082019050818103600083015262001860816200174e565b9050919050565b60006020820190508181036000830152620018828162001775565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620018c382620019ae565b9150620018d083620019ae565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001908576200190762001a24565b5b828201905092915050565b60006200192082620019ae565b91506200192d83620019ae565b92508282101562001943576200194262001a24565b5b828203905092915050565b60006200195b826200198e565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620019d8578082015181840152602081019050620019bb565b83811115620019e8576000848401525b50505050565b6000600282049050600182168062001a0757607f821691505b6020821081141562001a1e5762001a1d62001a53565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62001bf18162001962565b811462001bfd57600080fd5b50565b6148888062001c106000396000f3fe6080604052600436106101ee5760003560e01c8063618934d91161010d57806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd146106a9578063d031370b146106e6578063e4f2487a1461070f578063e985e9c51461073a578063f2fde38b14610777576101ee565b806395d89b4114610601578063a22cb4651461062c578063a2a376cd14610655578063b88d4fde14610680576101ee565b806370a08231116100dc57806370a0823114610566578063715018a6146105a35780638b32edc2146105ba5780638da5cb5b146105d6576101ee565b8063618934d9146104b75780636352211e146104d35780636373a6b11461051057806369f66cb71461053b576101ee565b806323b872dd1161018557806342842e0e1161015457806342842e0e146103ff57806342966c68146104285780634f6ccce71461045157806355f804b31461048e576101ee565b806323b872dd146103575780632f745c591461038057806332cb6b0c146103bd5780633ccfd60b146103e8576101ee565b80630930887d116101c15780630930887d146102c3578063095ea7b3146102da5780630d050d751461030357806318160ddd1461032c576101ee565b806301ffc9a7146101f3578063057707a01461023057806306fdde031461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906131df565b6107a0565b6040516102279190613837565b60405180910390f35b34801561023c57600080fd5b506102456107b2565b6040516102529190613bd4565b60405180910390f35b34801561026757600080fd5b506102706107bd565b60405161027d9190613852565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190613282565b61084f565b6040516102ba91906137d0565b60405180910390f35b3480156102cf57600080fd5b506102d86108d4565b005b3480156102e657600080fd5b5061030160048036038101906102fc919061319f565b610a6d565b005b34801561030f57600080fd5b5061032a600480360381019061032591906132ef565b610b85565b005b34801561033857600080fd5b50610341610c1f565b60405161034e9190613bd4565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613089565b610c2c565b005b34801561038c57600080fd5b506103a760048036038101906103a2919061319f565b610c8c565b6040516103b49190613bd4565b60405180910390f35b3480156103c957600080fd5b506103d2610d31565b6040516103df9190613bd4565b60405180910390f35b3480156103f457600080fd5b506103fd610d37565b005b34801561040b57600080fd5b5061042660048036038101906104219190613089565b610e02565b005b34801561043457600080fd5b5061044f600480360381019061044a9190613282565b610e22565b005b34801561045d57600080fd5b5061047860048036038101906104739190613282565b610e7e565b6040516104859190613bd4565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190613239565b610eef565b005b6104d160048036038101906104cc91906132af565b610f85565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613282565b611057565b60405161050791906137d0565b60405180910390f35b34801561051c57600080fd5b50610525611109565b6040516105329190613852565b60405180910390f35b34801561054757600080fd5b50610550611197565b60405161055d9190613bd4565b60405180910390f35b34801561057257600080fd5b5061058d6004803603810190610588919061301c565b6111a2565b60405161059a9190613bd4565b60405180910390f35b3480156105af57600080fd5b506105b861125a565b005b6105d460048036038101906105cf9190613282565b6112e2565b005b3480156105e257600080fd5b506105eb6114fd565b6040516105f891906137d0565b60405180910390f35b34801561060d57600080fd5b50610616611527565b6040516106239190613852565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e919061315f565b6115b9565b005b34801561066157600080fd5b5061066a61173a565b6040516106779190613bd4565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a291906130dc565b611781565b005b3480156106b557600080fd5b506106d060048036038101906106cb9190613282565b6117e3565b6040516106dd9190613852565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190613282565b61188a565b005b34801561071b57600080fd5b506107246119a1565b6040516107319190613bef565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613049565b6119b4565b60405161076e9190613837565b60405180910390f35b34801561078357600080fd5b5061079e6004803603810190610799919061301c565b611a48565b005b60006107ab82611c6c565b9050919050565b66470de4df82000081565b6060600080546107cc90613e52565b80601f01602080910402602001604051908101604052809291908181526020018280546107f890613e52565b80156108455780601f1061081a57610100808354040283529160200191610845565b820191906000526020600020905b81548152906001019060200180831161082857829003601f168201915b5050505050905090565b600061085a82611ce6565b610899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089090613a74565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6004601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d906139f4565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff16116109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a290613b94565b60405180910390fd5b600b5460016109b8610c1f565b6109c29190613cd4565b1115610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90613bb4565b60405180910390fd5b6005601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a539190613d5b565b92505081905550610a6b33610a66610c1f565b611d52565b565b6000610a7882611057565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613af4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b08611d70565b73ffffffffffffffffffffffffffffffffffffffff161480610b375750610b3681610b31611d70565b6119b4565b5b610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90613994565b60405180910390fd5b610b808383611d78565b505050565b610b8d611d70565b73ffffffffffffffffffffffffffffffffffffffff16610bab6114fd565b73ffffffffffffffffffffffffffffffffffffffff1614610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890613a94565b60405180910390fd5b80600c60006101000a81548160ff021916908360ff16021790555050565b6000600880549050905090565b610c3d610c37611d70565b82611e31565b610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390613b14565b60405180910390fd5b610c87838383611f0f565b505050565b6000610c97836111a2565b8210610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf906138b4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610d3f611d70565b73ffffffffffffffffffffffffffffffffffffffff16610d5d6114fd565b73ffffffffffffffffffffffffffffffffffffffff1614610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90613a94565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610dfe573d6000803e3d6000fd5b5050565b610e1d83838360405180602001604052806000815250611781565b505050565b610e33610e2d611d70565b82611e31565b610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6990613b74565b60405180910390fd5b610e7b8161216b565b50565b6000610e88610c1f565b8210610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090613b34565b60405180910390fd5b60088281548110610edd57610edc613feb565b5b90600052602060002001549050919050565b610ef7611d70565b73ffffffffffffffffffffffffffffffffffffffff16610f156114fd565b73ffffffffffffffffffffffffffffffffffffffff1614610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6290613a94565b60405180910390fd5b80600e9080519060200190610f81929190612e1b565b5050565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90613b54565b60405180910390fd5b610ffd826112e2565b81601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461104c9190613cd4565b925050819055505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f7906139d4565b60405180910390fd5b80915050919050565b600d805461111690613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461114290613e52565b801561118f5780601f106111645761010080835404028352916020019161118f565b820191906000526020600020905b81548152906001019060200180831161117257829003601f168201915b505050505081565b666a94d74f43000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a906139b4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611262611d70565b73ffffffffffffffffffffffffffffffffffffffff166112806114fd565b73ffffffffffffffffffffffffffffffffffffffff16146112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90613a94565b60405180910390fd5b6112e0600061227c565b565b6000600c60009054906101000a900460ff1660ff1611611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90613b94565b60405180910390fd5b6000811161137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190613894565b60405180910390fd5b600b5481611386610c1f565b6113909190613cd4565b11156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613a14565b60405180910390fd5b346113db82612342565b1461141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290613a34565b60405180910390fd5b6001600c60009054906101000a900460ff1660ff1614156114ca5760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090613874565b60405180910390fd5b5b60005b818110156114f9576114e6336114e1610c1f565b611d52565b80806114f190613eb5565b9150506114cd565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461153690613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461156290613e52565b80156115af5780601f10611584576101008083540402835291602001916115af565b820191906000526020600020905b81548152906001019060200180831161159257829003601f168201915b5050505050905090565b6115c1611d70565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162690613954565b60405180910390fd5b806005600061163c611d70565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e9611d70565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172e9190613837565b60405180910390a35050565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b61179261178c611d70565b83611e31565b6117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613b14565b60405180910390fd5b6117dd848484846123aa565b50505050565b60606117ee82611ce6565b61182d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182490613ad4565b60405180910390fd5b6000611837612406565b905060008151116118575760405180602001604052806000815250611882565b8061186184612498565b6040516020016118729291906137ac565b6040516020818303038152906040525b915050919050565b611892611d70565b73ffffffffffffffffffffffffffffffffffffffff166118b06114fd565b73ffffffffffffffffffffffffffffffffffffffff1614611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd90613a94565b60405180910390fd5b600b5481611912610c1f565b61191c9190613cd4565b111561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490613bb4565b60405180910390fd5b6000611967610c1f565b905060005b8281101561199c576119893382846119849190613cd4565b611d52565b808061199490613eb5565b91505061196c565b505050565b600c60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a50611d70565b73ffffffffffffffffffffffffffffffffffffffff16611a6e6114fd565b73ffffffffffffffffffffffffffffffffffffffff1614611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90613a94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b906138f4565b60405180910390fd5b611b3d8161227c565b50565b600080823b905060008111915050919050565b611b5e838383611c67565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ba157611b9c816125f9565b611be0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611bdf57611bde8382612642565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c2357611c1e816127af565b611c62565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611c6157611c608282612880565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cdf5750611cde826128ff565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611d6c8282604051806020016040528060008152506129e1565b5050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611deb83611057565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e3c82611ce6565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290613974565b60405180910390fd5b6000611e8683611057565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ef557508373ffffffffffffffffffffffffffffffffffffffff16611edd8461084f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f065750611f0581856119b4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2f82611057565b73ffffffffffffffffffffffffffffffffffffffff1614611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c90613ab4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90613934565b60405180910390fd5b612000838383612a3c565b61200b600082611d78565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461205b9190613d5b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b29190613cd4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061217682611057565b905061218481600084612a3c565b61218f600083611d78565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121df9190613d5b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806000905060005b838110156123a057600481101561237757666a94d74f430000826123709190613cd4565b915061238d565b66470de4df8200008261238a9190613cd4565b91505b808061239890613eb5565b91505061234c565b5080915050919050565b6123b5848484611f0f565b6123c184848484612a4c565b612400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f7906138d4565b60405180910390fd5b50505050565b6060600e805461241590613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461244190613e52565b801561248e5780601f106124635761010080835404028352916020019161248e565b820191906000526020600020905b81548152906001019060200180831161247157829003601f168201915b5050505050905090565b606060008214156124e0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f4565b600082905060005b600082146125125780806124fb90613eb5565b915050600a8261250b9190613d2a565b91506124e8565b60008167ffffffffffffffff81111561252e5761252d61401a565b5b6040519080825280601f01601f1916602001820160405280156125605781602001600182028036833780820191505090505b5090505b600085146125ed576001826125799190613d5b565b9150600a856125889190613efe565b60306125949190613cd4565b60f81b8183815181106125aa576125a9613feb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125e69190613d2a565b9450612564565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161264f846111a2565b6126599190613d5b565b905060006007600084815260200190815260200160002054905081811461273e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127c39190613d5b565b90506000600960008481526020019081526020016000205490506000600883815481106127f3576127f2613feb565b5b90600052602060002001549050806008838154811061281557612814613feb565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061286457612863613fbc565b5b6001900381819060005260206000200160009055905550505050565b600061288b836111a2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ca57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129da57506129d982612be3565b5b9050919050565b6129eb8383612c4d565b6129f86000848484612a4c565b612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e906138d4565b60405180910390fd5b505050565b612a47838383611b53565b505050565b6000612a6d8473ffffffffffffffffffffffffffffffffffffffff16611b40565b15612bd6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a96611d70565b8786866040518563ffffffff1660e01b8152600401612ab894939291906137eb565b602060405180830381600087803b158015612ad257600080fd5b505af1925050508015612b0357506040513d601f19601f82011682018060405250810190612b00919061320c565b60015b612b86573d8060008114612b33576040519150601f19603f3d011682016040523d82523d6000602084013e612b38565b606091505b50600081511415612b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b75906138d4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bdb565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb490613a54565b60405180910390fd5b612cc681611ce6565b15612d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfd90613914565b60405180910390fd5b612d1260008383612a3c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d629190613cd4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e2790613e52565b90600052602060002090601f016020900481019282612e495760008555612e90565b82601f10612e6257805160ff1916838001178555612e90565b82800160010185558215612e90579182015b82811115612e8f578251825591602001919060010190612e74565b5b509050612e9d9190612ea1565b5090565b5b80821115612eba576000816000905550600101612ea2565b5090565b6000612ed1612ecc84613c2f565b613c0a565b905082815260208101848484011115612eed57612eec61404e565b5b612ef8848285613e10565b509392505050565b6000612f13612f0e84613c60565b613c0a565b905082815260208101848484011115612f2f57612f2e61404e565b5b612f3a848285613e10565b509392505050565b600081359050612f51816147df565b92915050565b600081359050612f66816147f6565b92915050565b600081359050612f7b8161480d565b92915050565b600081519050612f908161480d565b92915050565b600082601f830112612fab57612faa614049565b5b8135612fbb848260208601612ebe565b91505092915050565b600082601f830112612fd957612fd8614049565b5b8135612fe9848260208601612f00565b91505092915050565b60008135905061300181614824565b92915050565b6000813590506130168161483b565b92915050565b60006020828403121561303257613031614058565b5b600061304084828501612f42565b91505092915050565b600080604083850312156130605761305f614058565b5b600061306e85828601612f42565b925050602061307f85828601612f42565b9150509250929050565b6000806000606084860312156130a2576130a1614058565b5b60006130b086828701612f42565b93505060206130c186828701612f42565b92505060406130d286828701612ff2565b9150509250925092565b600080600080608085870312156130f6576130f5614058565b5b600061310487828801612f42565b945050602061311587828801612f42565b935050604061312687828801612ff2565b925050606085013567ffffffffffffffff81111561314757613146614053565b5b61315387828801612f96565b91505092959194509250565b6000806040838503121561317657613175614058565b5b600061318485828601612f42565b925050602061319585828601612f57565b9150509250929050565b600080604083850312156131b6576131b5614058565b5b60006131c485828601612f42565b92505060206131d585828601612ff2565b9150509250929050565b6000602082840312156131f5576131f4614058565b5b600061320384828501612f6c565b91505092915050565b60006020828403121561322257613221614058565b5b600061323084828501612f81565b91505092915050565b60006020828403121561324f5761324e614058565b5b600082013567ffffffffffffffff81111561326d5761326c614053565b5b61327984828501612fc4565b91505092915050565b60006020828403121561329857613297614058565b5b60006132a684828501612ff2565b91505092915050565b600080604083850312156132c6576132c5614058565b5b60006132d485828601612ff2565b92505060206132e585828601612f42565b9150509250929050565b60006020828403121561330557613304614058565b5b600061331384828501613007565b91505092915050565b61332581613d8f565b82525050565b61333481613da1565b82525050565b600061334582613c91565b61334f8185613ca7565b935061335f818560208601613e1f565b6133688161405d565b840191505092915050565b600061337e82613c9c565b6133888185613cb8565b9350613398818560208601613e1f565b6133a18161405d565b840191505092915050565b60006133b782613c9c565b6133c18185613cc9565b93506133d1818560208601613e1f565b80840191505092915050565b60006133ea603083613cb8565b91506133f58261406e565b604082019050919050565b600061340d603383613cb8565b9150613418826140bd565b604082019050919050565b6000613430602b83613cb8565b915061343b8261410c565b604082019050919050565b6000613453603283613cb8565b915061345e8261415b565b604082019050919050565b6000613476602683613cb8565b9150613481826141aa565b604082019050919050565b6000613499601c83613cb8565b91506134a4826141f9565b602082019050919050565b60006134bc602483613cb8565b91506134c782614222565b604082019050919050565b60006134df601983613cb8565b91506134ea82614271565b602082019050919050565b6000613502602c83613cb8565b915061350d8261429a565b604082019050919050565b6000613525603883613cb8565b9150613530826142e9565b604082019050919050565b6000613548602a83613cb8565b915061355382614338565b604082019050919050565b600061356b602983613cb8565b915061357682614387565b604082019050919050565b600061358e602383613cb8565b9150613599826143d6565b604082019050919050565b60006135b1602a83613cb8565b91506135bc82614425565b604082019050919050565b60006135d4601d83613cb8565b91506135df82614474565b602082019050919050565b60006135f7602083613cb8565b91506136028261449d565b602082019050919050565b600061361a602c83613cb8565b9150613625826144c6565b604082019050919050565b600061363d602083613cb8565b915061364882614515565b602082019050919050565b6000613660602983613cb8565b915061366b8261453e565b604082019050919050565b6000613683602f83613cb8565b915061368e8261458d565b604082019050919050565b60006136a6602183613cb8565b91506136b1826145dc565b604082019050919050565b60006136c9603183613cb8565b91506136d48261462b565b604082019050919050565b60006136ec602c83613cb8565b91506136f78261467a565b604082019050919050565b600061370f602583613cb8565b915061371a826146c9565b604082019050919050565b6000613732603083613cb8565b915061373d82614718565b604082019050919050565b6000613755602083613cb8565b915061376082614767565b602082019050919050565b6000613778602683613cb8565b915061378382614790565b604082019050919050565b61379781613df9565b82525050565b6137a681613e03565b82525050565b60006137b882856133ac565b91506137c482846133ac565b91508190509392505050565b60006020820190506137e5600083018461331c565b92915050565b6000608082019050613800600083018761331c565b61380d602083018661331c565b61381a604083018561378e565b818103606083015261382c818461333a565b905095945050505050565b600060208201905061384c600083018461332b565b92915050565b6000602082019050818103600083015261386c8184613373565b905092915050565b6000602082019050818103600083015261388d816133dd565b9050919050565b600060208201905081810360008301526138ad81613400565b9050919050565b600060208201905081810360008301526138cd81613423565b9050919050565b600060208201905081810360008301526138ed81613446565b9050919050565b6000602082019050818103600083015261390d81613469565b9050919050565b6000602082019050818103600083015261392d8161348c565b9050919050565b6000602082019050818103600083015261394d816134af565b9050919050565b6000602082019050818103600083015261396d816134d2565b9050919050565b6000602082019050818103600083015261398d816134f5565b9050919050565b600060208201905081810360008301526139ad81613518565b9050919050565b600060208201905081810360008301526139cd8161353b565b9050919050565b600060208201905081810360008301526139ed8161355e565b9050919050565b60006020820190508181036000830152613a0d81613581565b9050919050565b60006020820190508181036000830152613a2d816135a4565b9050919050565b60006020820190508181036000830152613a4d816135c7565b9050919050565b60006020820190508181036000830152613a6d816135ea565b9050919050565b60006020820190508181036000830152613a8d8161360d565b9050919050565b60006020820190508181036000830152613aad81613630565b9050919050565b60006020820190508181036000830152613acd81613653565b9050919050565b60006020820190508181036000830152613aed81613676565b9050919050565b60006020820190508181036000830152613b0d81613699565b9050919050565b60006020820190508181036000830152613b2d816136bc565b9050919050565b60006020820190508181036000830152613b4d816136df565b9050919050565b60006020820190508181036000830152613b6d81613702565b9050919050565b60006020820190508181036000830152613b8d81613725565b9050919050565b60006020820190508181036000830152613bad81613748565b9050919050565b60006020820190508181036000830152613bcd8161376b565b9050919050565b6000602082019050613be9600083018461378e565b92915050565b6000602082019050613c04600083018461379d565b92915050565b6000613c14613c25565b9050613c208282613e84565b919050565b6000604051905090565b600067ffffffffffffffff821115613c4a57613c4961401a565b5b613c538261405d565b9050602081019050919050565b600067ffffffffffffffff821115613c7b57613c7a61401a565b5b613c848261405d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cdf82613df9565b9150613cea83613df9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1f57613d1e613f2f565b5b828201905092915050565b6000613d3582613df9565b9150613d4083613df9565b925082613d5057613d4f613f5e565b5b828204905092915050565b6000613d6682613df9565b9150613d7183613df9565b925082821015613d8457613d83613f2f565b5b828203905092915050565b6000613d9a82613dd9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613e3d578082015181840152602081019050613e22565b83811115613e4c576000848401525b50505050565b60006002820490506001821680613e6a57607f821691505b60208210811415613e7e57613e7d613f8d565b5b50919050565b613e8d8261405d565b810181811067ffffffffffffffff82111715613eac57613eab61401a565b5b80604052505050565b6000613ec082613df9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ef357613ef2613f2f565b5b600182019050919050565b6000613f0982613df9565b9150613f1483613df9565b925082613f2457613f23613f5e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f41646472657373206973206e6f7420617574686f726973656420666f7220746860008201527f65206d696e742d706173732073616c6500000000000000000000000000000000602082015250565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f7520646f6e2774206861766520656e6f75676820726566657272616c732060008201527f7965740000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f52656665727265722063616e6e6f74206265207468652073616d65206173207360008201527f656e646572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b7f4d696e7420776f756c6420657863656564206d617820737570706c79206f662060008201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b6147e881613d8f565b81146147f357600080fd5b50565b6147ff81613da1565b811461480a57600080fd5b50565b61481681613dad565b811461482157600080fd5b50565b61482d81613df9565b811461483857600080fd5b50565b61484481613e03565b811461484f57600080fd5b5056fea26469706673582212209cb22c04534aa8e426085baa80d1316c53a4befe55b0fafd80bbff9704d286cc64736f6c6343000807003339346632613938656238363236313431376630623163383931633962636630623237323062386336373237306235383932363237383330353161366438353131

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c8063618934d91161010d57806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd146106a9578063d031370b146106e6578063e4f2487a1461070f578063e985e9c51461073a578063f2fde38b14610777576101ee565b806395d89b4114610601578063a22cb4651461062c578063a2a376cd14610655578063b88d4fde14610680576101ee565b806370a08231116100dc57806370a0823114610566578063715018a6146105a35780638b32edc2146105ba5780638da5cb5b146105d6576101ee565b8063618934d9146104b75780636352211e146104d35780636373a6b11461051057806369f66cb71461053b576101ee565b806323b872dd1161018557806342842e0e1161015457806342842e0e146103ff57806342966c68146104285780634f6ccce71461045157806355f804b31461048e576101ee565b806323b872dd146103575780632f745c591461038057806332cb6b0c146103bd5780633ccfd60b146103e8576101ee565b80630930887d116101c15780630930887d146102c3578063095ea7b3146102da5780630d050d751461030357806318160ddd1461032c576101ee565b806301ffc9a7146101f3578063057707a01461023057806306fdde031461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906131df565b6107a0565b6040516102279190613837565b60405180910390f35b34801561023c57600080fd5b506102456107b2565b6040516102529190613bd4565b60405180910390f35b34801561026757600080fd5b506102706107bd565b60405161027d9190613852565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190613282565b61084f565b6040516102ba91906137d0565b60405180910390f35b3480156102cf57600080fd5b506102d86108d4565b005b3480156102e657600080fd5b5061030160048036038101906102fc919061319f565b610a6d565b005b34801561030f57600080fd5b5061032a600480360381019061032591906132ef565b610b85565b005b34801561033857600080fd5b50610341610c1f565b60405161034e9190613bd4565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613089565b610c2c565b005b34801561038c57600080fd5b506103a760048036038101906103a2919061319f565b610c8c565b6040516103b49190613bd4565b60405180910390f35b3480156103c957600080fd5b506103d2610d31565b6040516103df9190613bd4565b60405180910390f35b3480156103f457600080fd5b506103fd610d37565b005b34801561040b57600080fd5b5061042660048036038101906104219190613089565b610e02565b005b34801561043457600080fd5b5061044f600480360381019061044a9190613282565b610e22565b005b34801561045d57600080fd5b5061047860048036038101906104739190613282565b610e7e565b6040516104859190613bd4565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190613239565b610eef565b005b6104d160048036038101906104cc91906132af565b610f85565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613282565b611057565b60405161050791906137d0565b60405180910390f35b34801561051c57600080fd5b50610525611109565b6040516105329190613852565b60405180910390f35b34801561054757600080fd5b50610550611197565b60405161055d9190613bd4565b60405180910390f35b34801561057257600080fd5b5061058d6004803603810190610588919061301c565b6111a2565b60405161059a9190613bd4565b60405180910390f35b3480156105af57600080fd5b506105b861125a565b005b6105d460048036038101906105cf9190613282565b6112e2565b005b3480156105e257600080fd5b506105eb6114fd565b6040516105f891906137d0565b60405180910390f35b34801561060d57600080fd5b50610616611527565b6040516106239190613852565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e919061315f565b6115b9565b005b34801561066157600080fd5b5061066a61173a565b6040516106779190613bd4565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a291906130dc565b611781565b005b3480156106b557600080fd5b506106d060048036038101906106cb9190613282565b6117e3565b6040516106dd9190613852565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190613282565b61188a565b005b34801561071b57600080fd5b506107246119a1565b6040516107319190613bef565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613049565b6119b4565b60405161076e9190613837565b60405180910390f35b34801561078357600080fd5b5061079e6004803603810190610799919061301c565b611a48565b005b60006107ab82611c6c565b9050919050565b66470de4df82000081565b6060600080546107cc90613e52565b80601f01602080910402602001604051908101604052809291908181526020018280546107f890613e52565b80156108455780601f1061081a57610100808354040283529160200191610845565b820191906000526020600020905b81548152906001019060200180831161082857829003601f168201915b5050505050905090565b600061085a82611ce6565b610899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089090613a74565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6004601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d906139f4565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff16116109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a290613b94565b60405180910390fd5b600b5460016109b8610c1f565b6109c29190613cd4565b1115610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90613bb4565b60405180910390fd5b6005601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a539190613d5b565b92505081905550610a6b33610a66610c1f565b611d52565b565b6000610a7882611057565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613af4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b08611d70565b73ffffffffffffffffffffffffffffffffffffffff161480610b375750610b3681610b31611d70565b6119b4565b5b610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90613994565b60405180910390fd5b610b808383611d78565b505050565b610b8d611d70565b73ffffffffffffffffffffffffffffffffffffffff16610bab6114fd565b73ffffffffffffffffffffffffffffffffffffffff1614610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890613a94565b60405180910390fd5b80600c60006101000a81548160ff021916908360ff16021790555050565b6000600880549050905090565b610c3d610c37611d70565b82611e31565b610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390613b14565b60405180910390fd5b610c87838383611f0f565b505050565b6000610c97836111a2565b8210610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf906138b4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610d3f611d70565b73ffffffffffffffffffffffffffffffffffffffff16610d5d6114fd565b73ffffffffffffffffffffffffffffffffffffffff1614610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90613a94565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610dfe573d6000803e3d6000fd5b5050565b610e1d83838360405180602001604052806000815250611781565b505050565b610e33610e2d611d70565b82611e31565b610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6990613b74565b60405180910390fd5b610e7b8161216b565b50565b6000610e88610c1f565b8210610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090613b34565b60405180910390fd5b60088281548110610edd57610edc613feb565b5b90600052602060002001549050919050565b610ef7611d70565b73ffffffffffffffffffffffffffffffffffffffff16610f156114fd565b73ffffffffffffffffffffffffffffffffffffffff1614610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6290613a94565b60405180910390fd5b80600e9080519060200190610f81929190612e1b565b5050565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90613b54565b60405180910390fd5b610ffd826112e2565b81601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461104c9190613cd4565b925050819055505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f7906139d4565b60405180910390fd5b80915050919050565b600d805461111690613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461114290613e52565b801561118f5780601f106111645761010080835404028352916020019161118f565b820191906000526020600020905b81548152906001019060200180831161117257829003601f168201915b505050505081565b666a94d74f43000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a906139b4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611262611d70565b73ffffffffffffffffffffffffffffffffffffffff166112806114fd565b73ffffffffffffffffffffffffffffffffffffffff16146112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90613a94565b60405180910390fd5b6112e0600061227c565b565b6000600c60009054906101000a900460ff1660ff1611611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90613b94565b60405180910390fd5b6000811161137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190613894565b60405180910390fd5b600b5481611386610c1f565b6113909190613cd4565b11156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613a14565b60405180910390fd5b346113db82612342565b1461141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290613a34565b60405180910390fd5b6001600c60009054906101000a900460ff1660ff1614156114ca5760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090613874565b60405180910390fd5b5b60005b818110156114f9576114e6336114e1610c1f565b611d52565b80806114f190613eb5565b9150506114cd565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461153690613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461156290613e52565b80156115af5780601f10611584576101008083540402835291602001916115af565b820191906000526020600020905b81548152906001019060200180831161159257829003601f168201915b5050505050905090565b6115c1611d70565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162690613954565b60405180910390fd5b806005600061163c611d70565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e9611d70565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172e9190613837565b60405180910390a35050565b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b61179261178c611d70565b83611e31565b6117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613b14565b60405180910390fd5b6117dd848484846123aa565b50505050565b60606117ee82611ce6565b61182d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182490613ad4565b60405180910390fd5b6000611837612406565b905060008151116118575760405180602001604052806000815250611882565b8061186184612498565b6040516020016118729291906137ac565b6040516020818303038152906040525b915050919050565b611892611d70565b73ffffffffffffffffffffffffffffffffffffffff166118b06114fd565b73ffffffffffffffffffffffffffffffffffffffff1614611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd90613a94565b60405180910390fd5b600b5481611912610c1f565b61191c9190613cd4565b111561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490613bb4565b60405180910390fd5b6000611967610c1f565b905060005b8281101561199c576119893382846119849190613cd4565b611d52565b808061199490613eb5565b91505061196c565b505050565b600c60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a50611d70565b73ffffffffffffffffffffffffffffffffffffffff16611a6e6114fd565b73ffffffffffffffffffffffffffffffffffffffff1614611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90613a94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b906138f4565b60405180910390fd5b611b3d8161227c565b50565b600080823b905060008111915050919050565b611b5e838383611c67565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ba157611b9c816125f9565b611be0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611bdf57611bde8382612642565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c2357611c1e816127af565b611c62565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611c6157611c608282612880565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cdf5750611cde826128ff565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611d6c8282604051806020016040528060008152506129e1565b5050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611deb83611057565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e3c82611ce6565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290613974565b60405180910390fd5b6000611e8683611057565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ef557508373ffffffffffffffffffffffffffffffffffffffff16611edd8461084f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f065750611f0581856119b4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2f82611057565b73ffffffffffffffffffffffffffffffffffffffff1614611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c90613ab4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90613934565b60405180910390fd5b612000838383612a3c565b61200b600082611d78565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461205b9190613d5b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b29190613cd4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061217682611057565b905061218481600084612a3c565b61218f600083611d78565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121df9190613d5b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806000905060005b838110156123a057600481101561237757666a94d74f430000826123709190613cd4565b915061238d565b66470de4df8200008261238a9190613cd4565b91505b808061239890613eb5565b91505061234c565b5080915050919050565b6123b5848484611f0f565b6123c184848484612a4c565b612400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f7906138d4565b60405180910390fd5b50505050565b6060600e805461241590613e52565b80601f016020809104026020016040519081016040528092919081815260200182805461244190613e52565b801561248e5780601f106124635761010080835404028352916020019161248e565b820191906000526020600020905b81548152906001019060200180831161247157829003601f168201915b5050505050905090565b606060008214156124e0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f4565b600082905060005b600082146125125780806124fb90613eb5565b915050600a8261250b9190613d2a565b91506124e8565b60008167ffffffffffffffff81111561252e5761252d61401a565b5b6040519080825280601f01601f1916602001820160405280156125605781602001600182028036833780820191505090505b5090505b600085146125ed576001826125799190613d5b565b9150600a856125889190613efe565b60306125949190613cd4565b60f81b8183815181106125aa576125a9613feb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125e69190613d2a565b9450612564565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161264f846111a2565b6126599190613d5b565b905060006007600084815260200190815260200160002054905081811461273e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127c39190613d5b565b90506000600960008481526020019081526020016000205490506000600883815481106127f3576127f2613feb565b5b90600052602060002001549050806008838154811061281557612814613feb565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061286457612863613fbc565b5b6001900381819060005260206000200160009055905550505050565b600061288b836111a2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ca57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129da57506129d982612be3565b5b9050919050565b6129eb8383612c4d565b6129f86000848484612a4c565b612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e906138d4565b60405180910390fd5b505050565b612a47838383611b53565b505050565b6000612a6d8473ffffffffffffffffffffffffffffffffffffffff16611b40565b15612bd6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a96611d70565b8786866040518563ffffffff1660e01b8152600401612ab894939291906137eb565b602060405180830381600087803b158015612ad257600080fd5b505af1925050508015612b0357506040513d601f19601f82011682018060405250810190612b00919061320c565b60015b612b86573d8060008114612b33576040519150601f19603f3d011682016040523d82523d6000602084013e612b38565b606091505b50600081511415612b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b75906138d4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bdb565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb490613a54565b60405180910390fd5b612cc681611ce6565b15612d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfd90613914565b60405180910390fd5b612d1260008383612a3c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d629190613cd4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e2790613e52565b90600052602060002090601f016020900481019282612e495760008555612e90565b82601f10612e6257805160ff1916838001178555612e90565b82800160010185558215612e90579182015b82811115612e8f578251825591602001919060010190612e74565b5b509050612e9d9190612ea1565b5090565b5b80821115612eba576000816000905550600101612ea2565b5090565b6000612ed1612ecc84613c2f565b613c0a565b905082815260208101848484011115612eed57612eec61404e565b5b612ef8848285613e10565b509392505050565b6000612f13612f0e84613c60565b613c0a565b905082815260208101848484011115612f2f57612f2e61404e565b5b612f3a848285613e10565b509392505050565b600081359050612f51816147df565b92915050565b600081359050612f66816147f6565b92915050565b600081359050612f7b8161480d565b92915050565b600081519050612f908161480d565b92915050565b600082601f830112612fab57612faa614049565b5b8135612fbb848260208601612ebe565b91505092915050565b600082601f830112612fd957612fd8614049565b5b8135612fe9848260208601612f00565b91505092915050565b60008135905061300181614824565b92915050565b6000813590506130168161483b565b92915050565b60006020828403121561303257613031614058565b5b600061304084828501612f42565b91505092915050565b600080604083850312156130605761305f614058565b5b600061306e85828601612f42565b925050602061307f85828601612f42565b9150509250929050565b6000806000606084860312156130a2576130a1614058565b5b60006130b086828701612f42565b93505060206130c186828701612f42565b92505060406130d286828701612ff2565b9150509250925092565b600080600080608085870312156130f6576130f5614058565b5b600061310487828801612f42565b945050602061311587828801612f42565b935050604061312687828801612ff2565b925050606085013567ffffffffffffffff81111561314757613146614053565b5b61315387828801612f96565b91505092959194509250565b6000806040838503121561317657613175614058565b5b600061318485828601612f42565b925050602061319585828601612f57565b9150509250929050565b600080604083850312156131b6576131b5614058565b5b60006131c485828601612f42565b92505060206131d585828601612ff2565b9150509250929050565b6000602082840312156131f5576131f4614058565b5b600061320384828501612f6c565b91505092915050565b60006020828403121561322257613221614058565b5b600061323084828501612f81565b91505092915050565b60006020828403121561324f5761324e614058565b5b600082013567ffffffffffffffff81111561326d5761326c614053565b5b61327984828501612fc4565b91505092915050565b60006020828403121561329857613297614058565b5b60006132a684828501612ff2565b91505092915050565b600080604083850312156132c6576132c5614058565b5b60006132d485828601612ff2565b92505060206132e585828601612f42565b9150509250929050565b60006020828403121561330557613304614058565b5b600061331384828501613007565b91505092915050565b61332581613d8f565b82525050565b61333481613da1565b82525050565b600061334582613c91565b61334f8185613ca7565b935061335f818560208601613e1f565b6133688161405d565b840191505092915050565b600061337e82613c9c565b6133888185613cb8565b9350613398818560208601613e1f565b6133a18161405d565b840191505092915050565b60006133b782613c9c565b6133c18185613cc9565b93506133d1818560208601613e1f565b80840191505092915050565b60006133ea603083613cb8565b91506133f58261406e565b604082019050919050565b600061340d603383613cb8565b9150613418826140bd565b604082019050919050565b6000613430602b83613cb8565b915061343b8261410c565b604082019050919050565b6000613453603283613cb8565b915061345e8261415b565b604082019050919050565b6000613476602683613cb8565b9150613481826141aa565b604082019050919050565b6000613499601c83613cb8565b91506134a4826141f9565b602082019050919050565b60006134bc602483613cb8565b91506134c782614222565b604082019050919050565b60006134df601983613cb8565b91506134ea82614271565b602082019050919050565b6000613502602c83613cb8565b915061350d8261429a565b604082019050919050565b6000613525603883613cb8565b9150613530826142e9565b604082019050919050565b6000613548602a83613cb8565b915061355382614338565b604082019050919050565b600061356b602983613cb8565b915061357682614387565b604082019050919050565b600061358e602383613cb8565b9150613599826143d6565b604082019050919050565b60006135b1602a83613cb8565b91506135bc82614425565b604082019050919050565b60006135d4601d83613cb8565b91506135df82614474565b602082019050919050565b60006135f7602083613cb8565b91506136028261449d565b602082019050919050565b600061361a602c83613cb8565b9150613625826144c6565b604082019050919050565b600061363d602083613cb8565b915061364882614515565b602082019050919050565b6000613660602983613cb8565b915061366b8261453e565b604082019050919050565b6000613683602f83613cb8565b915061368e8261458d565b604082019050919050565b60006136a6602183613cb8565b91506136b1826145dc565b604082019050919050565b60006136c9603183613cb8565b91506136d48261462b565b604082019050919050565b60006136ec602c83613cb8565b91506136f78261467a565b604082019050919050565b600061370f602583613cb8565b915061371a826146c9565b604082019050919050565b6000613732603083613cb8565b915061373d82614718565b604082019050919050565b6000613755602083613cb8565b915061376082614767565b602082019050919050565b6000613778602683613cb8565b915061378382614790565b604082019050919050565b61379781613df9565b82525050565b6137a681613e03565b82525050565b60006137b882856133ac565b91506137c482846133ac565b91508190509392505050565b60006020820190506137e5600083018461331c565b92915050565b6000608082019050613800600083018761331c565b61380d602083018661331c565b61381a604083018561378e565b818103606083015261382c818461333a565b905095945050505050565b600060208201905061384c600083018461332b565b92915050565b6000602082019050818103600083015261386c8184613373565b905092915050565b6000602082019050818103600083015261388d816133dd565b9050919050565b600060208201905081810360008301526138ad81613400565b9050919050565b600060208201905081810360008301526138cd81613423565b9050919050565b600060208201905081810360008301526138ed81613446565b9050919050565b6000602082019050818103600083015261390d81613469565b9050919050565b6000602082019050818103600083015261392d8161348c565b9050919050565b6000602082019050818103600083015261394d816134af565b9050919050565b6000602082019050818103600083015261396d816134d2565b9050919050565b6000602082019050818103600083015261398d816134f5565b9050919050565b600060208201905081810360008301526139ad81613518565b9050919050565b600060208201905081810360008301526139cd8161353b565b9050919050565b600060208201905081810360008301526139ed8161355e565b9050919050565b60006020820190508181036000830152613a0d81613581565b9050919050565b60006020820190508181036000830152613a2d816135a4565b9050919050565b60006020820190508181036000830152613a4d816135c7565b9050919050565b60006020820190508181036000830152613a6d816135ea565b9050919050565b60006020820190508181036000830152613a8d8161360d565b9050919050565b60006020820190508181036000830152613aad81613630565b9050919050565b60006020820190508181036000830152613acd81613653565b9050919050565b60006020820190508181036000830152613aed81613676565b9050919050565b60006020820190508181036000830152613b0d81613699565b9050919050565b60006020820190508181036000830152613b2d816136bc565b9050919050565b60006020820190508181036000830152613b4d816136df565b9050919050565b60006020820190508181036000830152613b6d81613702565b9050919050565b60006020820190508181036000830152613b8d81613725565b9050919050565b60006020820190508181036000830152613bad81613748565b9050919050565b60006020820190508181036000830152613bcd8161376b565b9050919050565b6000602082019050613be9600083018461378e565b92915050565b6000602082019050613c04600083018461379d565b92915050565b6000613c14613c25565b9050613c208282613e84565b919050565b6000604051905090565b600067ffffffffffffffff821115613c4a57613c4961401a565b5b613c538261405d565b9050602081019050919050565b600067ffffffffffffffff821115613c7b57613c7a61401a565b5b613c848261405d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cdf82613df9565b9150613cea83613df9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1f57613d1e613f2f565b5b828201905092915050565b6000613d3582613df9565b9150613d4083613df9565b925082613d5057613d4f613f5e565b5b828204905092915050565b6000613d6682613df9565b9150613d7183613df9565b925082821015613d8457613d83613f2f565b5b828203905092915050565b6000613d9a82613dd9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613e3d578082015181840152602081019050613e22565b83811115613e4c576000848401525b50505050565b60006002820490506001821680613e6a57607f821691505b60208210811415613e7e57613e7d613f8d565b5b50919050565b613e8d8261405d565b810181811067ffffffffffffffff82111715613eac57613eab61401a565b5b80604052505050565b6000613ec082613df9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ef357613ef2613f2f565b5b600182019050919050565b6000613f0982613df9565b9150613f1483613df9565b925082613f2457613f23613f5e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f41646472657373206973206e6f7420617574686f726973656420666f7220746860008201527f65206d696e742d706173732073616c6500000000000000000000000000000000602082015250565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f7520646f6e2774206861766520656e6f75676820726566657272616c732060008201527f7965740000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f52656665727265722063616e6e6f74206265207468652073616d65206173207360008201527f656e646572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b7f4d696e7420776f756c6420657863656564206d617820737570706c79206f662060008201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b6147e881613d8f565b81146147f357600080fd5b50565b6147ff81613da1565b811461480a57600080fd5b50565b61481681613dad565b811461482157600080fd5b50565b61482d81613df9565b811461483857600080fd5b50565b61484481613e03565b811461484f57600080fd5b5056fea26469706673582212209cb22c04534aa8e426085baa80d1316c53a4befe55b0fafd80bbff9704d286cc64736f6c63430008070033

Deployed Bytecode Sourcemap

203:6169:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6157:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;365:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2349:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3860:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3803:372:14;;;;;;;;;;;;;:::i;:::-;;3398:401:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3197:91:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1534:111:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4724:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1210:253:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;442:31:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3300:140;;;;;;;;;;;;;:::i;:::-;;5120:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;437:241:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1717:230:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5280:111:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4299:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2052:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;566:93:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;288:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1790:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:12;;;;;;;;;;;;;:::i;:::-;;4561:707:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;966:85:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2511:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4144:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4187:100:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5365:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2679:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3452:339:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;480:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4500:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6157:212:14;6296:4;6325:36;6349:11;6325:23;:36::i;:::-;6318:43;;6157:212;;;:::o;365:58::-;406:17;365:58;:::o;2349:98:4:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4046:15;:24;4062:7;4046:24;;;;;;;;;;;;;;;;;;;;;4039:31;;3860:217;;;:::o;3803:372:14:-;3878:1;3854:9;:21;3864:10;3854:21;;;;;;;;;;;;;;;;:25;3846:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3950:1;3938:9;;;;;;;;;;;:13;;;3930:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;4030:10;;4024:1;4008:13;:11;:13::i;:::-;:17;;;;:::i;:::-;4007:33;;3999:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;4119:1;4094:9;:21;4104:10;4094:21;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;4131:36;4141:10;4153:13;:11;:13::i;:::-;4131:9;:36::i;:::-;3803:372::o;3398:401:4:-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;3535:11;;:2;:11;;;;3527:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3632:5;3616:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;:::-;3641:16;:37::i;:::-;3616:62;3595:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3468:331;3398:401;;:::o;3197:91:14:-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3275:5:14::1;3263:9;;:17;;;;;;;;;;;;;;;;;;3197:91:::0;:::o;1534:111:6:-;1595:7;1621:10;:17;;;;1614:24;;1534:111;:::o;4724:330:4:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;:::-;4724:330;;;:::o;1210:253:6:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:12;:19;1443:5;1430:19;;;;;;;;;;;;;;;:26;1450:5;1430:26;;;;;;;;;;;;1423:33;;1210:253;;;;:::o;442:31:14:-;;;;:::o;3300:140::-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3348:12:14::1;3363:21;3348:36;;3403:10;3395:28;;:37;3424:7;3395:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3337:103;3300:140::o:0;5120:179:4:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;:::-;5120:179;;;:::o;437:241:5:-;553:41;572:12;:10;:12::i;:::-;586:7;553:18;:41::i;:::-;545:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;657:14;663:7;657:5;:14::i;:::-;437:241;:::o;1717:230:6:-;1792:7;1827:30;:28;:30::i;:::-;1819:5;:38;1811:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1923:10;1934:5;1923:17;;;;;;;;:::i;:::-;;;;;;;;;;1916:24;;1717:230;;;:::o;5280:111:14:-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5375:8:14::1;5356:16;:27;;;;;;;;;;;;:::i;:::-;;5280:111:::0;:::o;4299:250::-;4404:10;4392:22;;:8;:22;;;;4384:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4467:26;4478:14;4467:10;:26::i;:::-;4527:14;4504:9;:19;4514:8;4504:19;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;4299:250;;:::o;2052:235:4:-;2124:7;2143:13;2159:7;:16;2167:7;2159:16;;;;;;;;;;;;;;;;;;;;;2143:32;;2210:1;2193:19;;:5;:19;;;;2185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:5;2268:12;;;2052:235;;;:::o;566:93:14:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;288:58::-;329:17;288:58;:::o;1790:205:4:-;1862:7;1906:1;1889:19;;:5;:19;;;;1881:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1972:9;:16;1982:5;1972:16;;;;;;;;;;;;;;;;1965:23;;1790:205;;;:::o;1598:92:12:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;4561:707:14:-;4648:1;4636:9;;;;;;;;;;;:13;;;4628:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;4722:1;4705:14;:18;4697:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;4834:10;;4815:14;4799:13;:11;:13::i;:::-;:30;;;;:::i;:::-;4798:46;;4790:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;4947:9;4910:33;4928:14;4910:17;:33::i;:::-;:46;4902:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;5018:1;5005:9;;;;;;;;;;;:14;;;5001:145;;;5077:4;5044:37;;:17;:29;5062:10;5044:29;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;5036:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;5001:145;5161:6;5156:105;5177:14;5173:1;:18;5156:105;;;5213:36;5223:10;5235:13;:11;:13::i;:::-;5213:9;:36::i;:::-;5193:3;;;;;:::i;:::-;;;;5156:105;;;;4561:707;:::o;966:85:12:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;2511:102:4:-;2567:13;2599:7;2592:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:102;:::o;4144:290::-;4258:12;:10;:12::i;:::-;4246:24;;:8;:24;;;;4238:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;4311:32;;;;;;;;;;;;;;;:42;4344:8;4311:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4408:8;4379:48;;4394:12;:10;:12::i;:::-;4379:48;;;4418:8;4379:48;;;;;;:::i;:::-;;;;;;;;4144:290;;:::o;4187:100:14:-;4231:7;4258:9;:21;4268:10;4258:21;;;;;;;;;;;;;;;;4251:28;;4187:100;:::o;5365:320:4:-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;2679:329::-;2752:13;2785:16;2793:7;2785;:16::i;:::-;2777:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2864:21;2888:10;:8;:10::i;:::-;2864:34;;2939:1;2921:7;2915:21;:25;:86;;;;;;;;;;;;;;;;;2967:7;2976:18;:7;:16;:18::i;:::-;2950:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2915:86;2908:93;;;2679:329;;;:::o;3452:339:14:-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3568:10:14::1;;3549:14;3533:13;:11;:13::i;:::-;:30;;;;:::i;:::-;3532:46;;3524:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;3632:11;3646:13;:11;:13::i;:::-;3632:27;;3670:6;3687:97;3703:14;3699:1;:18;3687:97;;;3739:33;3749:10;3770:1;3761:6;:10;;;;:::i;:::-;3739:9;:33::i;:::-;3719:3;;;;;:::i;:::-;;;;3687:97;;;3513:278;;3452:339:::0;:::o;480:26::-;;;;;;;;;;;;;:::o;4500:162:4:-;4597:4;4620:18;:25;4639:5;4620:25;;;;;;;;;;;;;;;:35;4646:8;4620:35;;;;;;;;;;;;;;;;;;;;;;;;;4613:42;;4500:162;;;;:::o;1839:189:12:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;2543:572:6:-;2682:45;2709:4;2715:2;2719:7;2682:26;:45::i;:::-;2758:1;2742:18;;:4;:18;;;2738:183;;;2776:40;2808:7;2776:31;:40::i;:::-;2738:183;;;2845:2;2837:10;;:4;:10;;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;2833:88;2738:183;2948:1;2934:16;;:2;:16;;;2930:179;;;2966:45;3003:7;2966:36;:45::i;:::-;2930:179;;;3038:4;3032:10;;:2;:10;;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;:::-;3028:81;2930:179;2543:572;;;:::o;13066:122:4:-;;;;:::o;909:222:6:-;1011:4;1049:35;1034:50;;;:11;:50;;;;:90;;;;1088:36;1112:11;1088:23;:36::i;:::-;1034:90;1027:97;;909:222;;;:::o;7157:125:4:-;7222:4;7273:1;7245:30;;:7;:16;7253:7;7245:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7238:37;;7157:125;;;:::o;8114:108::-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;:::-;8114:108;;:::o;587:96:1:-;640:7;666:10;659:17;;587:96;:::o;11008:171:4:-;11109:2;11082:15;:24;11098:7;11082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11164:7;11160:2;11126:46;;11135:23;11150:7;11135:14;:23::i;:::-;11126:46;;;;;;;;;;;;11008:171;;:::o;7440:344::-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;7689:16;;:7;:16;;;:51;;;;7733:7;7709:31;;:20;7721:7;7709:11;:20::i;:::-;:31;;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;:::-;7689:87;7681:96;;;7440:344;;;;:::o;10337:560::-;10491:4;10464:31;;:23;10479:7;10464:14;:23::i;:::-;:31;;;10456:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10573:1;10559:16;;:2;:16;;;;10551:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;10787:1;10768:9;:15;10778:4;10768:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10815:1;10798:9;:13;10808:2;10798:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10845:2;10826:7;:16;10834:7;10826:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10882:7;10878:2;10863:27;;10872:4;10863:27;;;;;;;;;;;;10337:560;;;:::o;9665:348::-;9724:13;9740:23;9755:7;9740:14;:23::i;:::-;9724:39;;9774:48;9795:5;9810:1;9814:7;9774:20;:48::i;:::-;9860:29;9877:1;9881:7;9860:8;:29::i;:::-;9920:1;9900:9;:16;9910:5;9900:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9938:7;:16;9946:7;9938:16;;;;;;;;;;;;9931:23;;;;;;;;;;;9998:7;9994:1;9970:36;;9979:5;9970:36;;;;;;;;;;;;9714:299;9665:348;:::o;2034:169:12:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2079:124;2034:169;:::o;5528:339:14:-;5598:4;5615:9;5627:1;5615:13;;5644:6;5639:199;5660:14;5656:1;:18;5639:199;;;5704:1;5700;:5;5696:131;;;329:17;5726:22;;;;;:::i;:::-;;;5696:131;;;406:17;5789:22;;;;;:::i;:::-;;;5696:131;5676:3;;;;;:::i;:::-;;;;5639:199;;;;5855:4;5848:11;;;5528:339;;;:::o;6547:307:4:-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6547:307;;;;:::o;5399:117:14:-;5459:13;5492:16;5485:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5399:117;:::o;275:703:13:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;3821:161:6:-;3924:10;:17;;;;3897:15;:24;3913:7;3897:24;;;;;;;;;;;:44;;;;3951:10;3967:7;3951:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3821:161;:::o;4599:970::-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4861:51;;4922:18;4943:17;:26;4961:7;4943:26;;;;;;;;;;;;4922:47;;5087:14;5073:10;:28;5069:323;;5117:19;5139:12;:18;5152:4;5139:18;;;;;;;;;;;;;;;:34;5158:14;5139:34;;;;;;;;;;;;5117:56;;5221:11;5188:12;:18;5201:4;5188:18;;;;;;;;;;;;;;;:30;5207:10;5188:30;;;;;;;;;;;:44;;;;5337:10;5304:17;:30;5322:11;5304:30;;;;;;;;;;;:43;;;;5103:289;5069:323;5485:17;:26;5503:7;5485:26;;;;;;;;;;;5478:33;;;5528:12;:18;5541:4;5528:18;;;;;;;;;;;;;;;:34;5547:14;5528:34;;;;;;;;;;;5521:41;;;4680:889;;4599:970;;:::o;5857:1061::-;6106:22;6151:1;6131:10;:17;;;;:21;;;;:::i;:::-;6106:46;;6162:18;6183:15;:24;6199:7;6183:24;;;;;;;;;;;;6162:45;;6529:19;6551:10;6562:14;6551:26;;;;;;;;:::i;:::-;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6723:10;6692:15;:28;6708:11;6692:28;;;;;;;;;;;:41;;;;6861:15;:24;6877:7;6861:24;;;;;;;;;;;6854:31;;;6895:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5928:990;;;5857:1061;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;3493:37;;3567:7;3540:12;:16;3553:2;3540:16;;;;;;;;;;;;;;;:24;3557:6;3540:24;;;;;;;;;;;:34;;;;3613:6;3584:17;:26;3602:7;3584:26;;;;;;;;;;;:35;;;;3483:143;3409:217;;:::o;1431:300:4:-;1533:4;1583:25;1568:40;;;:11;:40;;;;:104;;;;1639:33;1624:48;;;:11;:48;;;;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;:::-;1568:156;1549:175;;1431:300;;;:::o;8443:311::-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8443:311;;;:::o;5945:204:14:-;6096:45;6123:4;6129:2;6133:7;6096:26;:45::i;:::-;5945:204;;;:::o;11732:778:4:-;11882:4;11902:15;:2;:13;;;:15::i;:::-;11898:606;;;11953:2;11937:36;;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11933:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12193:1;12176:6;:13;:18;12172:266;;;12218:60;;;;;;;;;;:::i;:::-;;;;;;;;12172:266;12390:6;12384:13;12375:6;12371:2;12367:15;12360:38;11933:519;12069:41;;;12059:51;;;:6;:51;;;;12052:58;;;;;11898:606;12489:4;12482:11;;11732:778;;;;;;;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;9076:372:4:-;9169:1;9155:16;;:2;:16;;;;9147:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;9360:1;9343:9;:13;9353:2;9343:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9390:2;9371:7;:16;9379:7;9371:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9433:7;9429:2;9408:33;;9425:1;9408:33;;;;;;;;;;;;9076:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:15:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:135::-;2321:5;2359:6;2346:20;2337:29;;2375:31;2400:5;2375:31;:::i;:::-;2277:135;;;;:::o;2418:329::-;2477:6;2526:2;2514:9;2505:7;2501:23;2497:32;2494:119;;;2532:79;;:::i;:::-;2494:119;2652:1;2677:53;2722:7;2713:6;2702:9;2698:22;2677:53;:::i;:::-;2667:63;;2623:117;2418:329;;;;:::o;2753:474::-;2821:6;2829;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;3131:2;3157:53;3202:7;3193:6;3182:9;3178:22;3157:53;:::i;:::-;3147:63;;3102:118;2753:474;;;;;:::o;3233:619::-;3310:6;3318;3326;3375:2;3363:9;3354:7;3350:23;3346:32;3343:119;;;3381:79;;:::i;:::-;3343:119;3501:1;3526:53;3571:7;3562:6;3551:9;3547:22;3526:53;:::i;:::-;3516:63;;3472:117;3628:2;3654:53;3699:7;3690:6;3679:9;3675:22;3654:53;:::i;:::-;3644:63;;3599:118;3756:2;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;:::i;:::-;3772:63;;3727:118;3233:619;;;;;:::o;3858:943::-;3953:6;3961;3969;3977;4026:3;4014:9;4005:7;4001:23;3997:33;3994:120;;;4033:79;;:::i;:::-;3994:120;4153:1;4178:53;4223:7;4214:6;4203:9;4199:22;4178:53;:::i;:::-;4168:63;;4124:117;4280:2;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4251:118;4408:2;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;:::i;:::-;4424:63;;4379:118;4564:2;4553:9;4549:18;4536:32;4595:18;4587:6;4584:30;4581:117;;;4617:79;;:::i;:::-;4581:117;4722:62;4776:7;4767:6;4756:9;4752:22;4722:62;:::i;:::-;4712:72;;4507:287;3858:943;;;;;;;:::o;4807:468::-;4872:6;4880;4929:2;4917:9;4908:7;4904:23;4900:32;4897:119;;;4935:79;;:::i;:::-;4897:119;5055:1;5080:53;5125:7;5116:6;5105:9;5101:22;5080:53;:::i;:::-;5070:63;;5026:117;5182:2;5208:50;5250:7;5241:6;5230:9;5226:22;5208:50;:::i;:::-;5198:60;;5153:115;4807:468;;;;;:::o;5281:474::-;5349:6;5357;5406:2;5394:9;5385:7;5381:23;5377:32;5374:119;;;5412:79;;:::i;:::-;5374:119;5532:1;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5503:117;5659:2;5685:53;5730:7;5721:6;5710:9;5706:22;5685:53;:::i;:::-;5675:63;;5630:118;5281:474;;;;;:::o;5761:327::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:52;6063:7;6054:6;6043:9;6039:22;6019:52;:::i;:::-;6009:62;;5965:116;5761:327;;;;:::o;6094:349::-;6163:6;6212:2;6200:9;6191:7;6187:23;6183:32;6180:119;;;6218:79;;:::i;:::-;6180:119;6338:1;6363:63;6418:7;6409:6;6398:9;6394:22;6363:63;:::i;:::-;6353:73;;6309:127;6094:349;;;;:::o;6449:509::-;6518:6;6567:2;6555:9;6546:7;6542:23;6538:32;6535:119;;;6573:79;;:::i;:::-;6535:119;6721:1;6710:9;6706:17;6693:31;6751:18;6743:6;6740:30;6737:117;;;6773:79;;:::i;:::-;6737:117;6878:63;6933:7;6924:6;6913:9;6909:22;6878:63;:::i;:::-;6868:73;;6664:287;6449:509;;;;:::o;6964:329::-;7023:6;7072:2;7060:9;7051:7;7047:23;7043:32;7040:119;;;7078:79;;:::i;:::-;7040:119;7198:1;7223:53;7268:7;7259:6;7248:9;7244:22;7223:53;:::i;:::-;7213:63;;7169:117;6964:329;;;;:::o;7299:474::-;7367:6;7375;7424:2;7412:9;7403:7;7399:23;7395:32;7392:119;;;7430:79;;:::i;:::-;7392:119;7550:1;7575:53;7620:7;7611:6;7600:9;7596:22;7575:53;:::i;:::-;7565:63;;7521:117;7677:2;7703:53;7748:7;7739:6;7728:9;7724:22;7703:53;:::i;:::-;7693:63;;7648:118;7299:474;;;;;:::o;7779:325::-;7836:6;7885:2;7873:9;7864:7;7860:23;7856:32;7853:119;;;7891:79;;:::i;:::-;7853:119;8011:1;8036:51;8079:7;8070:6;8059:9;8055:22;8036:51;:::i;:::-;8026:61;;7982:115;7779:325;;;;:::o;8110:118::-;8197:24;8215:5;8197:24;:::i;:::-;8192:3;8185:37;8110:118;;:::o;8234:109::-;8315:21;8330:5;8315:21;:::i;:::-;8310:3;8303:34;8234:109;;:::o;8349:360::-;8435:3;8463:38;8495:5;8463:38;:::i;:::-;8517:70;8580:6;8575:3;8517:70;:::i;:::-;8510:77;;8596:52;8641:6;8636:3;8629:4;8622:5;8618:16;8596:52;:::i;:::-;8673:29;8695:6;8673:29;:::i;:::-;8668:3;8664:39;8657:46;;8439:270;8349:360;;;;:::o;8715:364::-;8803:3;8831:39;8864:5;8831:39;:::i;:::-;8886:71;8950:6;8945:3;8886:71;:::i;:::-;8879:78;;8966:52;9011:6;9006:3;8999:4;8992:5;8988:16;8966:52;:::i;:::-;9043:29;9065:6;9043:29;:::i;:::-;9038:3;9034:39;9027:46;;8807:272;8715:364;;;;:::o;9085:377::-;9191:3;9219:39;9252:5;9219:39;:::i;:::-;9274:89;9356:6;9351:3;9274:89;:::i;:::-;9267:96;;9372:52;9417:6;9412:3;9405:4;9398:5;9394:16;9372:52;:::i;:::-;9449:6;9444:3;9440:16;9433:23;;9195:267;9085:377;;;;:::o;9468:366::-;9610:3;9631:67;9695:2;9690:3;9631:67;:::i;:::-;9624:74;;9707:93;9796:3;9707:93;:::i;:::-;9825:2;9820:3;9816:12;9809:19;;9468:366;;;:::o;9840:::-;9982:3;10003:67;10067:2;10062:3;10003:67;:::i;:::-;9996:74;;10079:93;10168:3;10079:93;:::i;:::-;10197:2;10192:3;10188:12;10181:19;;9840:366;;;:::o;10212:::-;10354:3;10375:67;10439:2;10434:3;10375:67;:::i;:::-;10368:74;;10451:93;10540:3;10451:93;:::i;:::-;10569:2;10564:3;10560:12;10553:19;;10212:366;;;:::o;10584:::-;10726:3;10747:67;10811:2;10806:3;10747:67;:::i;:::-;10740:74;;10823:93;10912:3;10823:93;:::i;:::-;10941:2;10936:3;10932:12;10925:19;;10584:366;;;:::o;10956:::-;11098:3;11119:67;11183:2;11178:3;11119:67;:::i;:::-;11112:74;;11195:93;11284:3;11195:93;:::i;:::-;11313:2;11308:3;11304:12;11297:19;;10956:366;;;:::o;11328:::-;11470:3;11491:67;11555:2;11550:3;11491:67;:::i;:::-;11484:74;;11567:93;11656:3;11567:93;:::i;:::-;11685:2;11680:3;11676:12;11669:19;;11328:366;;;:::o;11700:::-;11842:3;11863:67;11927:2;11922:3;11863:67;:::i;:::-;11856:74;;11939:93;12028:3;11939:93;:::i;:::-;12057:2;12052:3;12048:12;12041:19;;11700:366;;;:::o;12072:::-;12214:3;12235:67;12299:2;12294:3;12235:67;:::i;:::-;12228:74;;12311:93;12400:3;12311:93;:::i;:::-;12429:2;12424:3;12420:12;12413:19;;12072:366;;;:::o;12444:::-;12586:3;12607:67;12671:2;12666:3;12607:67;:::i;:::-;12600:74;;12683:93;12772:3;12683:93;:::i;:::-;12801:2;12796:3;12792:12;12785:19;;12444:366;;;:::o;12816:::-;12958:3;12979:67;13043:2;13038:3;12979:67;:::i;:::-;12972:74;;13055:93;13144:3;13055:93;:::i;:::-;13173:2;13168:3;13164:12;13157:19;;12816:366;;;:::o;13188:::-;13330:3;13351:67;13415:2;13410:3;13351:67;:::i;:::-;13344:74;;13427:93;13516:3;13427:93;:::i;:::-;13545:2;13540:3;13536:12;13529:19;;13188:366;;;:::o;13560:::-;13702:3;13723:67;13787:2;13782:3;13723:67;:::i;:::-;13716:74;;13799:93;13888:3;13799:93;:::i;:::-;13917:2;13912:3;13908:12;13901:19;;13560:366;;;:::o;13932:::-;14074:3;14095:67;14159:2;14154:3;14095:67;:::i;:::-;14088:74;;14171:93;14260:3;14171:93;:::i;:::-;14289:2;14284:3;14280:12;14273:19;;13932:366;;;:::o;14304:::-;14446:3;14467:67;14531:2;14526:3;14467:67;:::i;:::-;14460:74;;14543:93;14632:3;14543:93;:::i;:::-;14661:2;14656:3;14652:12;14645:19;;14304:366;;;:::o;14676:::-;14818:3;14839:67;14903:2;14898:3;14839:67;:::i;:::-;14832:74;;14915:93;15004:3;14915:93;:::i;:::-;15033:2;15028:3;15024:12;15017:19;;14676:366;;;:::o;15048:::-;15190:3;15211:67;15275:2;15270:3;15211:67;:::i;:::-;15204:74;;15287:93;15376:3;15287:93;:::i;:::-;15405:2;15400:3;15396:12;15389:19;;15048:366;;;:::o;15420:::-;15562:3;15583:67;15647:2;15642:3;15583:67;:::i;:::-;15576:74;;15659:93;15748:3;15659:93;:::i;:::-;15777:2;15772:3;15768:12;15761:19;;15420:366;;;:::o;15792:::-;15934:3;15955:67;16019:2;16014:3;15955:67;:::i;:::-;15948:74;;16031:93;16120:3;16031:93;:::i;:::-;16149:2;16144:3;16140:12;16133:19;;15792:366;;;:::o;16164:::-;16306:3;16327:67;16391:2;16386:3;16327:67;:::i;:::-;16320:74;;16403:93;16492:3;16403:93;:::i;:::-;16521:2;16516:3;16512:12;16505:19;;16164:366;;;:::o;16536:::-;16678:3;16699:67;16763:2;16758:3;16699:67;:::i;:::-;16692:74;;16775:93;16864:3;16775:93;:::i;:::-;16893:2;16888:3;16884:12;16877:19;;16536:366;;;:::o;16908:::-;17050:3;17071:67;17135:2;17130:3;17071:67;:::i;:::-;17064:74;;17147:93;17236:3;17147:93;:::i;:::-;17265:2;17260:3;17256:12;17249:19;;16908:366;;;:::o;17280:::-;17422:3;17443:67;17507:2;17502:3;17443:67;:::i;:::-;17436:74;;17519:93;17608:3;17519:93;:::i;:::-;17637:2;17632:3;17628:12;17621:19;;17280:366;;;:::o;17652:::-;17794:3;17815:67;17879:2;17874:3;17815:67;:::i;:::-;17808:74;;17891:93;17980:3;17891:93;:::i;:::-;18009:2;18004:3;18000:12;17993:19;;17652:366;;;:::o;18024:::-;18166:3;18187:67;18251:2;18246:3;18187:67;:::i;:::-;18180:74;;18263:93;18352:3;18263:93;:::i;:::-;18381:2;18376:3;18372:12;18365:19;;18024:366;;;:::o;18396:::-;18538:3;18559:67;18623:2;18618:3;18559:67;:::i;:::-;18552:74;;18635:93;18724:3;18635:93;:::i;:::-;18753:2;18748:3;18744:12;18737:19;;18396:366;;;:::o;18768:::-;18910:3;18931:67;18995:2;18990:3;18931:67;:::i;:::-;18924:74;;19007:93;19096:3;19007:93;:::i;:::-;19125:2;19120:3;19116:12;19109:19;;18768:366;;;:::o;19140:::-;19282:3;19303:67;19367:2;19362:3;19303:67;:::i;:::-;19296:74;;19379:93;19468:3;19379:93;:::i;:::-;19497:2;19492:3;19488:12;19481:19;;19140:366;;;:::o;19512:118::-;19599:24;19617:5;19599:24;:::i;:::-;19594:3;19587:37;19512:118;;:::o;19636:112::-;19719:22;19735:5;19719:22;:::i;:::-;19714:3;19707:35;19636:112;;:::o;19754:435::-;19934:3;19956:95;20047:3;20038:6;19956:95;:::i;:::-;19949:102;;20068:95;20159:3;20150:6;20068:95;:::i;:::-;20061:102;;20180:3;20173:10;;19754:435;;;;;:::o;20195:222::-;20288:4;20326:2;20315:9;20311:18;20303:26;;20339:71;20407:1;20396:9;20392:17;20383:6;20339:71;:::i;:::-;20195:222;;;;:::o;20423:640::-;20618:4;20656:3;20645:9;20641:19;20633:27;;20670:71;20738:1;20727:9;20723:17;20714:6;20670:71;:::i;:::-;20751:72;20819:2;20808:9;20804:18;20795:6;20751:72;:::i;:::-;20833;20901:2;20890:9;20886:18;20877:6;20833:72;:::i;:::-;20952:9;20946:4;20942:20;20937:2;20926:9;20922:18;20915:48;20980:76;21051:4;21042:6;20980:76;:::i;:::-;20972:84;;20423:640;;;;;;;:::o;21069:210::-;21156:4;21194:2;21183:9;21179:18;21171:26;;21207:65;21269:1;21258:9;21254:17;21245:6;21207:65;:::i;:::-;21069:210;;;;:::o;21285:313::-;21398:4;21436:2;21425:9;21421:18;21413:26;;21485:9;21479:4;21475:20;21471:1;21460:9;21456:17;21449:47;21513:78;21586:4;21577:6;21513:78;:::i;:::-;21505:86;;21285:313;;;;:::o;21604:419::-;21770:4;21808:2;21797:9;21793:18;21785:26;;21857:9;21851:4;21847:20;21843:1;21832:9;21828:17;21821:47;21885:131;22011:4;21885:131;:::i;:::-;21877:139;;21604:419;;;:::o;22029:::-;22195:4;22233:2;22222:9;22218:18;22210:26;;22282:9;22276:4;22272:20;22268:1;22257:9;22253:17;22246:47;22310:131;22436:4;22310:131;:::i;:::-;22302:139;;22029:419;;;:::o;22454:::-;22620:4;22658:2;22647:9;22643:18;22635:26;;22707:9;22701:4;22697:20;22693:1;22682:9;22678:17;22671:47;22735:131;22861:4;22735:131;:::i;:::-;22727:139;;22454:419;;;:::o;22879:::-;23045:4;23083:2;23072:9;23068:18;23060:26;;23132:9;23126:4;23122:20;23118:1;23107:9;23103:17;23096:47;23160:131;23286:4;23160:131;:::i;:::-;23152:139;;22879:419;;;:::o;23304:::-;23470:4;23508:2;23497:9;23493:18;23485:26;;23557:9;23551:4;23547:20;23543:1;23532:9;23528:17;23521:47;23585:131;23711:4;23585:131;:::i;:::-;23577:139;;23304:419;;;:::o;23729:::-;23895:4;23933:2;23922:9;23918:18;23910:26;;23982:9;23976:4;23972:20;23968:1;23957:9;23953:17;23946:47;24010:131;24136:4;24010:131;:::i;:::-;24002:139;;23729:419;;;:::o;24154:::-;24320:4;24358:2;24347:9;24343:18;24335:26;;24407:9;24401:4;24397:20;24393:1;24382:9;24378:17;24371:47;24435:131;24561:4;24435:131;:::i;:::-;24427:139;;24154:419;;;:::o;24579:::-;24745:4;24783:2;24772:9;24768:18;24760:26;;24832:9;24826:4;24822:20;24818:1;24807:9;24803:17;24796:47;24860:131;24986:4;24860:131;:::i;:::-;24852:139;;24579:419;;;:::o;25004:::-;25170:4;25208:2;25197:9;25193:18;25185:26;;25257:9;25251:4;25247:20;25243:1;25232:9;25228:17;25221:47;25285:131;25411:4;25285:131;:::i;:::-;25277:139;;25004:419;;;:::o;25429:::-;25595:4;25633:2;25622:9;25618:18;25610:26;;25682:9;25676:4;25672:20;25668:1;25657:9;25653:17;25646:47;25710:131;25836:4;25710:131;:::i;:::-;25702:139;;25429:419;;;:::o;25854:::-;26020:4;26058:2;26047:9;26043:18;26035:26;;26107:9;26101:4;26097:20;26093:1;26082:9;26078:17;26071:47;26135:131;26261:4;26135:131;:::i;:::-;26127:139;;25854:419;;;:::o;26279:::-;26445:4;26483:2;26472:9;26468:18;26460:26;;26532:9;26526:4;26522:20;26518:1;26507:9;26503:17;26496:47;26560:131;26686:4;26560:131;:::i;:::-;26552:139;;26279:419;;;:::o;26704:::-;26870:4;26908:2;26897:9;26893:18;26885:26;;26957:9;26951:4;26947:20;26943:1;26932:9;26928:17;26921:47;26985:131;27111:4;26985:131;:::i;:::-;26977:139;;26704:419;;;:::o;27129:::-;27295:4;27333:2;27322:9;27318:18;27310:26;;27382:9;27376:4;27372:20;27368:1;27357:9;27353:17;27346:47;27410:131;27536:4;27410:131;:::i;:::-;27402:139;;27129:419;;;:::o;27554:::-;27720:4;27758:2;27747:9;27743:18;27735:26;;27807:9;27801:4;27797:20;27793:1;27782:9;27778:17;27771:47;27835:131;27961:4;27835:131;:::i;:::-;27827:139;;27554:419;;;:::o;27979:::-;28145:4;28183:2;28172:9;28168:18;28160:26;;28232:9;28226:4;28222:20;28218:1;28207:9;28203:17;28196:47;28260:131;28386:4;28260:131;:::i;:::-;28252:139;;27979:419;;;:::o;28404:::-;28570:4;28608:2;28597:9;28593:18;28585:26;;28657:9;28651:4;28647:20;28643:1;28632:9;28628:17;28621:47;28685:131;28811:4;28685:131;:::i;:::-;28677:139;;28404:419;;;:::o;28829:::-;28995:4;29033:2;29022:9;29018:18;29010:26;;29082:9;29076:4;29072:20;29068:1;29057:9;29053:17;29046:47;29110:131;29236:4;29110:131;:::i;:::-;29102:139;;28829:419;;;:::o;29254:::-;29420:4;29458:2;29447:9;29443:18;29435:26;;29507:9;29501:4;29497:20;29493:1;29482:9;29478:17;29471:47;29535:131;29661:4;29535:131;:::i;:::-;29527:139;;29254:419;;;:::o;29679:::-;29845:4;29883:2;29872:9;29868:18;29860:26;;29932:9;29926:4;29922:20;29918:1;29907:9;29903:17;29896:47;29960:131;30086:4;29960:131;:::i;:::-;29952:139;;29679:419;;;:::o;30104:::-;30270:4;30308:2;30297:9;30293:18;30285:26;;30357:9;30351:4;30347:20;30343:1;30332:9;30328:17;30321:47;30385:131;30511:4;30385:131;:::i;:::-;30377:139;;30104:419;;;:::o;30529:::-;30695:4;30733:2;30722:9;30718:18;30710:26;;30782:9;30776:4;30772:20;30768:1;30757:9;30753:17;30746:47;30810:131;30936:4;30810:131;:::i;:::-;30802:139;;30529:419;;;:::o;30954:::-;31120:4;31158:2;31147:9;31143:18;31135:26;;31207:9;31201:4;31197:20;31193:1;31182:9;31178:17;31171:47;31235:131;31361:4;31235:131;:::i;:::-;31227:139;;30954:419;;;:::o;31379:::-;31545:4;31583:2;31572:9;31568:18;31560:26;;31632:9;31626:4;31622:20;31618:1;31607:9;31603:17;31596:47;31660:131;31786:4;31660:131;:::i;:::-;31652:139;;31379:419;;;:::o;31804:::-;31970:4;32008:2;31997:9;31993:18;31985:26;;32057:9;32051:4;32047:20;32043:1;32032:9;32028:17;32021:47;32085:131;32211:4;32085:131;:::i;:::-;32077:139;;31804:419;;;:::o;32229:::-;32395:4;32433:2;32422:9;32418:18;32410:26;;32482:9;32476:4;32472:20;32468:1;32457:9;32453:17;32446:47;32510:131;32636:4;32510:131;:::i;:::-;32502:139;;32229:419;;;:::o;32654:::-;32820:4;32858:2;32847:9;32843:18;32835:26;;32907:9;32901:4;32897:20;32893:1;32882:9;32878:17;32871:47;32935:131;33061:4;32935:131;:::i;:::-;32927:139;;32654:419;;;:::o;33079:222::-;33172:4;33210:2;33199:9;33195:18;33187:26;;33223:71;33291:1;33280:9;33276:17;33267:6;33223:71;:::i;:::-;33079:222;;;;:::o;33307:214::-;33396:4;33434:2;33423:9;33419:18;33411:26;;33447:67;33511:1;33500:9;33496:17;33487:6;33447:67;:::i;:::-;33307:214;;;;:::o;33527:129::-;33561:6;33588:20;;:::i;:::-;33578:30;;33617:33;33645:4;33637:6;33617:33;:::i;:::-;33527:129;;;:::o;33662:75::-;33695:6;33728:2;33722:9;33712:19;;33662:75;:::o;33743:307::-;33804:4;33894:18;33886:6;33883:30;33880:56;;;33916:18;;:::i;:::-;33880:56;33954:29;33976:6;33954:29;:::i;:::-;33946:37;;34038:4;34032;34028:15;34020:23;;33743:307;;;:::o;34056:308::-;34118:4;34208:18;34200:6;34197:30;34194:56;;;34230:18;;:::i;:::-;34194:56;34268:29;34290:6;34268:29;:::i;:::-;34260:37;;34352:4;34346;34342:15;34334:23;;34056:308;;;:::o;34370:98::-;34421:6;34455:5;34449:12;34439:22;;34370:98;;;:::o;34474:99::-;34526:6;34560:5;34554:12;34544:22;;34474:99;;;:::o;34579:168::-;34662:11;34696:6;34691:3;34684:19;34736:4;34731:3;34727:14;34712:29;;34579:168;;;;:::o;34753:169::-;34837:11;34871:6;34866:3;34859:19;34911:4;34906:3;34902:14;34887:29;;34753:169;;;;:::o;34928:148::-;35030:11;35067:3;35052:18;;34928:148;;;;:::o;35082:305::-;35122:3;35141:20;35159:1;35141:20;:::i;:::-;35136:25;;35175:20;35193:1;35175:20;:::i;:::-;35170:25;;35329:1;35261:66;35257:74;35254:1;35251:81;35248:107;;;35335:18;;:::i;:::-;35248:107;35379:1;35376;35372:9;35365:16;;35082:305;;;;:::o;35393:185::-;35433:1;35450:20;35468:1;35450:20;:::i;:::-;35445:25;;35484:20;35502:1;35484:20;:::i;:::-;35479:25;;35523:1;35513:35;;35528:18;;:::i;:::-;35513:35;35570:1;35567;35563:9;35558:14;;35393:185;;;;:::o;35584:191::-;35624:4;35644:20;35662:1;35644:20;:::i;:::-;35639:25;;35678:20;35696:1;35678:20;:::i;:::-;35673:25;;35717:1;35714;35711:8;35708:34;;;35722:18;;:::i;:::-;35708:34;35767:1;35764;35760:9;35752:17;;35584:191;;;;:::o;35781:96::-;35818:7;35847:24;35865:5;35847:24;:::i;:::-;35836:35;;35781:96;;;:::o;35883:90::-;35917:7;35960:5;35953:13;35946:21;35935:32;;35883:90;;;:::o;35979:149::-;36015:7;36055:66;36048:5;36044:78;36033:89;;35979:149;;;:::o;36134:126::-;36171:7;36211:42;36204:5;36200:54;36189:65;;36134:126;;;:::o;36266:77::-;36303:7;36332:5;36321:16;;36266:77;;;:::o;36349:86::-;36384:7;36424:4;36417:5;36413:16;36402:27;;36349:86;;;:::o;36441:154::-;36525:6;36520:3;36515;36502:30;36587:1;36578:6;36573:3;36569:16;36562:27;36441:154;;;:::o;36601:307::-;36669:1;36679:113;36693:6;36690:1;36687:13;36679:113;;;36778:1;36773:3;36769:11;36763:18;36759:1;36754:3;36750:11;36743:39;36715:2;36712:1;36708:10;36703:15;;36679:113;;;36810:6;36807:1;36804:13;36801:101;;;36890:1;36881:6;36876:3;36872:16;36865:27;36801:101;36650:258;36601:307;;;:::o;36914:320::-;36958:6;36995:1;36989:4;36985:12;36975:22;;37042:1;37036:4;37032:12;37063:18;37053:81;;37119:4;37111:6;37107:17;37097:27;;37053:81;37181:2;37173:6;37170:14;37150:18;37147:38;37144:84;;;37200:18;;:::i;:::-;37144:84;36965:269;36914:320;;;:::o;37240:281::-;37323:27;37345:4;37323:27;:::i;:::-;37315:6;37311:40;37453:6;37441:10;37438:22;37417:18;37405:10;37402:34;37399:62;37396:88;;;37464:18;;:::i;:::-;37396:88;37504:10;37500:2;37493:22;37283:238;37240:281;;:::o;37527:233::-;37566:3;37589:24;37607:5;37589:24;:::i;:::-;37580:33;;37635:66;37628:5;37625:77;37622:103;;;37705:18;;:::i;:::-;37622:103;37752:1;37745:5;37741:13;37734:20;;37527:233;;;:::o;37766:176::-;37798:1;37815:20;37833:1;37815:20;:::i;:::-;37810:25;;37849:20;37867:1;37849:20;:::i;:::-;37844:25;;37888:1;37878:35;;37893:18;;:::i;:::-;37878:35;37934:1;37931;37927:9;37922:14;;37766:176;;;;:::o;37948:180::-;37996:77;37993:1;37986:88;38093:4;38090:1;38083:15;38117:4;38114:1;38107:15;38134:180;38182:77;38179:1;38172:88;38279:4;38276:1;38269:15;38303:4;38300:1;38293:15;38320:180;38368:77;38365:1;38358:88;38465:4;38462:1;38455:15;38489:4;38486:1;38479:15;38506:180;38554:77;38551:1;38544:88;38651:4;38648:1;38641:15;38675:4;38672:1;38665:15;38692:180;38740:77;38737:1;38730:88;38837:4;38834:1;38827:15;38861:4;38858:1;38851:15;38878:180;38926:77;38923:1;38916:88;39023:4;39020:1;39013:15;39047:4;39044:1;39037:15;39064:117;39173:1;39170;39163:12;39187:117;39296:1;39293;39286:12;39310:117;39419:1;39416;39409:12;39433:117;39542:1;39539;39532:12;39556:102;39597:6;39648:2;39644:7;39639:2;39632:5;39628:14;39624:28;39614:38;;39556:102;;;:::o;39664:235::-;39804:34;39800:1;39792:6;39788:14;39781:58;39873:18;39868:2;39860:6;39856:15;39849:43;39664:235;:::o;39905:238::-;40045:34;40041:1;40033:6;40029:14;40022:58;40114:21;40109:2;40101:6;40097:15;40090:46;39905:238;:::o;40149:230::-;40289:34;40285:1;40277:6;40273:14;40266:58;40358:13;40353:2;40345:6;40341:15;40334:38;40149:230;:::o;40385:237::-;40525:34;40521:1;40513:6;40509:14;40502:58;40594:20;40589:2;40581:6;40577:15;40570:45;40385:237;:::o;40628:225::-;40768:34;40764:1;40756:6;40752:14;40745:58;40837:8;40832:2;40824:6;40820:15;40813:33;40628:225;:::o;40859:178::-;40999:30;40995:1;40987:6;40983:14;40976:54;40859:178;:::o;41043:223::-;41183:34;41179:1;41171:6;41167:14;41160:58;41252:6;41247:2;41239:6;41235:15;41228:31;41043:223;:::o;41272:175::-;41412:27;41408:1;41400:6;41396:14;41389:51;41272:175;:::o;41453:231::-;41593:34;41589:1;41581:6;41577:14;41570:58;41662:14;41657:2;41649:6;41645:15;41638:39;41453:231;:::o;41690:243::-;41830:34;41826:1;41818:6;41814:14;41807:58;41899:26;41894:2;41886:6;41882:15;41875:51;41690:243;:::o;41939:229::-;42079:34;42075:1;42067:6;42063:14;42056:58;42148:12;42143:2;42135:6;42131:15;42124:37;41939:229;:::o;42174:228::-;42314:34;42310:1;42302:6;42298:14;42291:58;42383:11;42378:2;42370:6;42366:15;42359:36;42174:228;:::o;42408:222::-;42548:34;42544:1;42536:6;42532:14;42525:58;42617:5;42612:2;42604:6;42600:15;42593:30;42408:222;:::o;42636:229::-;42776:34;42772:1;42764:6;42760:14;42753:58;42845:12;42840:2;42832:6;42828:15;42821:37;42636:229;:::o;42871:179::-;43011:31;43007:1;42999:6;42995:14;42988:55;42871:179;:::o;43056:182::-;43196:34;43192:1;43184:6;43180:14;43173:58;43056:182;:::o;43244:231::-;43384:34;43380:1;43372:6;43368:14;43361:58;43453:14;43448:2;43440:6;43436:15;43429:39;43244:231;:::o;43481:182::-;43621:34;43617:1;43609:6;43605:14;43598:58;43481:182;:::o;43669:228::-;43809:34;43805:1;43797:6;43793:14;43786:58;43878:11;43873:2;43865:6;43861:15;43854:36;43669:228;:::o;43903:234::-;44043:34;44039:1;44031:6;44027:14;44020:58;44112:17;44107:2;44099:6;44095:15;44088:42;43903:234;:::o;44143:220::-;44283:34;44279:1;44271:6;44267:14;44260:58;44352:3;44347:2;44339:6;44335:15;44328:28;44143:220;:::o;44369:236::-;44509:34;44505:1;44497:6;44493:14;44486:58;44578:19;44573:2;44565:6;44561:15;44554:44;44369:236;:::o;44611:231::-;44751:34;44747:1;44739:6;44735:14;44728:58;44820:14;44815:2;44807:6;44803:15;44796:39;44611:231;:::o;44848:224::-;44988:34;44984:1;44976:6;44972:14;44965:58;45057:7;45052:2;45044:6;45040:15;45033:32;44848:224;:::o;45078:235::-;45218:34;45214:1;45206:6;45202:14;45195:58;45287:18;45282:2;45274:6;45270:15;45263:43;45078:235;:::o;45319:182::-;45459:34;45455:1;45447:6;45443:14;45436:58;45319:182;:::o;45507:225::-;45647:34;45643:1;45635:6;45631:14;45624:58;45716:8;45711:2;45703:6;45699:15;45692:33;45507:225;:::o;45738:122::-;45811:24;45829:5;45811:24;:::i;:::-;45804:5;45801:35;45791:63;;45850:1;45847;45840:12;45791:63;45738:122;:::o;45866:116::-;45936:21;45951:5;45936:21;:::i;:::-;45929:5;45926:32;45916:60;;45972:1;45969;45962:12;45916:60;45866:116;:::o;45988:120::-;46060:23;46077:5;46060:23;:::i;:::-;46053:5;46050:34;46040:62;;46098:1;46095;46088:12;46040:62;45988:120;:::o;46114:122::-;46187:24;46205:5;46187:24;:::i;:::-;46180:5;46177:35;46167:63;;46226:1;46223;46216:12;46167:63;46114:122;:::o;46242:118::-;46313:22;46329:5;46313:22;:::i;:::-;46306:5;46303:33;46293:61;;46350:1;46347;46340:12;46293:61;46242:118;:::o

Swarm Source

ipfs://9cb22c04534aa8e426085baa80d1316c53a4befe55b0fafd80bbff9704d286cc

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

A collection of meditative, solo saxophone music. Expressed in 55 unique, audio-reactive tokens.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.